diff --git a/.gitignore b/.gitignore index 496ee2ca..aedc6a2e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.DS_Store \ No newline at end of file +.DS_Store +makefile diff --git a/amd/build/analytic_button.min.js b/amd/build/analytic_button.min.js index c2653a79..85e52b3f 100644 --- a/amd/build/analytic_button.min.js +++ b/amd/build/analytic_button.min.js @@ -6,6 +6,6 @@ * @copyright 2024 CTI * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -define("tiny_cursive/analytic_button",["core/str"],(function(Str){return function(userid){let questionid=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const anchor=document.createElement("a");anchor.href="#",anchor.id="analytics"+userid+questionid,anchor.classList.add("d-inline-flex","align-items-center","text-white","tiny_cursive-analytics-btn");const svgNS="http://www.w3.org/2000/svg",svg=document.createElementNS(svgNS,"svg");svg.setAttribute("xmlns",svgNS),svg.setAttribute("width","16"),svg.setAttribute("height","16"),svg.setAttribute("viewBox","0 0 20 20"),svg.setAttribute("fill","none");const path=document.createElementNS(svgNS,"path");path.setAttribute("d","M5.32742 16.3022L5.32725 16.3024L3.64053 17.9889C3.64052 17.9889 3.64051 17.9889 3.6405 17.9889C3.19086 18.4385 2.46114 18.4388 2.01139 17.989C2.01129 17.9889 2.01119 17.9888 2.01109 17.9887M5.32742 16.3022L2.3648 16.7132C2.11023 16.9677 2.11023 17.381 2.3648 17.6353L2.01109 17.9887M5.32742 16.3022C5.77683 15.8524 5.77683 15.1228 5.32742 14.673L5.32712 14.6727C4.87733 14.2233 4.14771 14.2233 3.69792 14.6727L3.69775 14.6729L2.01124 16.3596L2.35764 16.706L2.01122 16.3596M5.32742 16.3022L2.01122 16.3596M2.01109 17.9887C1.56129 17.539 1.5616 16.8093 2.01122 16.3596M2.01109 17.9887L2.01122 16.3596M6.79811 12.9869L7.12112 12.664L6.82863 12.3132C5.86305 11.155 5.28263 9.66711 5.28263 8.04356C5.28263 4.36035 8.27335 1.36963 11.9566 1.36963C15.6398 1.36963 18.6305 4.36035 18.6305 8.04356C18.6305 11.7268 15.6398 14.7175 11.9566 14.7175C10.333 14.7175 8.84512 14.1371 7.68695 13.1715L7.33612 12.879L7.01318 13.202L5.9247 14.2907L5.67485 14.5406L5.82702 14.8595C6.08573 15.4018 5.9897 16.0703 5.54234 16.5176L3.85581 18.2042C3.28735 18.7726 2.36419 18.7726 1.79601 18.2042L1.79591 18.2041C1.22756 17.6359 1.22749 16.7128 1.79596 16.1443L1.4424 15.7908L1.79596 16.1443L3.48248 14.4578C3.92985 14.0104 4.59836 13.9144 5.14058 14.1731L5.45951 14.3253L5.70941 14.0754L6.79811 12.9869ZM13.9964 7.09277L14.85 6.23921H13.6429H13.2609C13.1771 6.23921 13.1087 6.1709 13.1087 6.08704C13.1087 6.00318 13.1771 5.93486 13.2609 5.93486H15.2174C15.3015 5.93486 15.3696 6.00296 15.3696 6.08704V8.04356C15.3696 8.12742 15.3013 8.19574 15.2174 8.19574C15.1336 8.19574 15.0653 8.12742 15.0653 8.04356V7.66161V6.45459L14.2117 7.30803L12.0641 9.45543L12.0639 9.4556C12.0047 9.51492 11.9085 9.51492 11.8492 9.4556L11.849 9.45541L11.0057 8.61236L10.6522 8.25892L10.2987 8.61238L8.80325 10.1076L8.80307 10.1078C8.74402 10.1669 8.64735 10.1669 8.5883 10.1078L8.588 10.1075C8.5289 10.0484 8.5289 9.95176 8.588 9.89271L8.58815 9.89256L10.5447 7.93603L10.5448 7.93588C10.6041 7.87656 10.7003 7.87656 10.7596 7.93588L10.7598 7.93607L11.6031 8.77912L11.9566 9.13258L12.3101 8.77907L13.9964 7.09277ZM18.3261 8.04356C18.3261 4.52785 15.4723 1.67398 11.9566 1.67398C8.44085 1.67398 5.58698 4.52785 5.58698 8.04356C5.58698 11.5593 8.44085 14.4131 11.9566 14.4131C15.4723 14.4131 18.3261 11.5593 18.3261 8.04356Z"),path.setAttribute("fill","#306BB2"),path.setAttribute("stroke","#306BB2"),svg.appendChild(path);const icon=document.createElement("i");icon.appendChild(svg),icon.classList.add("tiny_cursive-analytics-icon");const textNode=document.createElement("span");return Str.get_string("analytics","tiny_cursive").then((analyticsString=>(textNode.textContent=analyticsString,!0))).catch((error=>{window.console.error("Error fetching string:",error)})),anchor.appendChild(icon),anchor.appendChild(textNode),anchor}})); +define("tiny_cursive/analytic_button",["core/str"],(function(Str){return function(effort,userid){let questionid=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";const anchor=document.createElement("a");anchor.href="#",anchor.id="analytics"+userid+questionid,anchor.classList.add("d-inline-flex","justify-content-center","text-decoration-none");const button=document.createElement("div");button.className="tiny_cursive-analytics-button";const left=document.createElement("div");left.className="tiny_cursive-analytics-left";const icon=document.createElement("img");icon.src=M.util.image_url("chart-column","tiny_cursive"),icon.alt="Analytics Icon",icon.className="tiny_cursive-analytics-bar-icon";const label=document.createElement("span");if(label.className="tiny_cursive-analytics-label",label.textContent="Analytics",Str.get_string("analytics","tiny_cursive").then((analyticsString=>(label.textContent=analyticsString,analyticsString))).catch((error=>{window.console.error("Error fetching string:",error)})),left.appendChild(icon),left.appendChild(label),button.appendChild(left),effort){const right=document.createElement("div");right.className="tiny_cursive-analytics-right",right.textContent=effort+"%",right.title="Effort",effort<90&&(right.style.backgroundColor="#EAB308"),button.appendChild(right)}return anchor.appendChild(button),anchor}})); //# sourceMappingURL=analytic_button.min.js.map \ No newline at end of file diff --git a/amd/build/analytic_button.min.js.map b/amd/build/analytic_button.min.js.map index c3bc0e9e..36c975cc 100644 --- a/amd/build/analytic_button.min.js.map +++ b/amd/build/analytic_button.min.js.map @@ -1 +1 @@ -{"version":3,"file":"analytic_button.min.js","sources":["../src/analytic_button.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module that creates an analytics button with an icon and text.\n * The button displays analytics information for a specific user and question.\n *\n * @module tiny_cursive/analytic_button\n * @copyright 2024 CTI \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine([\"core/str\"], function(Str) {\n const analyticButton = (userid, questionid = \"\") => {\n const anchor = document.createElement(\"a\");\n anchor.href = \"#\";\n anchor.id = \"analytics\" + userid + questionid;\n anchor.classList.add(\n \"d-inline-flex\",\n \"align-items-center\",\n \"text-white\",\n \"tiny_cursive-analytics-btn\"\n );\n\n // Define the SVG element\n const svgNS = \"http://www.w3.org/2000/svg\";\n const svg = document.createElementNS(svgNS, \"svg\");\n svg.setAttribute(\"xmlns\", svgNS);\n svg.setAttribute(\"width\", \"16\");\n svg.setAttribute(\"height\", \"16\");\n svg.setAttribute(\"viewBox\", \"0 0 20 20\");\n svg.setAttribute(\"fill\", \"none\");\n\n // Create the path element\n const path = document.createElementNS(svgNS, \"path\");\n path.setAttribute(\n \"d\",\n \"M5.32742 16.3022L5.32725 16.3024L3.64053 17.9889C3.64052 17.9889 3.64051 17.9889\" +\n \" 3.6405 17.9889C3.19086 18.4385 2.46114 18.4388 2.01139 17.989C2.01129 17.9889 2.01119 17.9888 2.01109\" +\n \" 17.9887M5.32742 16.3022L2.3648 16.7132C2.11023 16.9677 2.11023 17.381 2.3648 17.6353L2.01109 17.9887M5.32742\" +\n \" 16.3022C5.77683 15.8524 5.77683 15.1228 5.32742 14.673L5.32712 14.6727C4.87733 14.2233 4.14771 14.2233\" +\n \" 3.69792 14.6727L3.69775 14.6729L2.01124 16.3596L2.35764 16.706L2.01122 16.3596M5.32742 16.3022L2.01122\" +\n \" 16.3596M2.01109 17.9887C1.56129 17.539 1.5616 16.8093 2.01122 16.3596M2.01109 17.9887L2.01122 16.3596M6.79811\" +\n \" 12.9869L7.12112 12.664L6.82863 12.3132C5.86305 11.155 5.28263 9.66711 5.28263 8.04356C5.28263 4.36035 8.27335\" +\n \" 1.36963 11.9566 1.36963C15.6398 1.36963 18.6305 4.36035 18.6305 8.04356C18.6305 11.7268 15.6398 14.7175 11.9566\" +\n \" 14.7175C10.333 14.7175 8.84512 14.1371 7.68695 13.1715L7.33612 12.879L7.01318 13.202L5.9247 14.2907L5.67485\" +\n \" 14.5406L5.82702 14.8595C6.08573 15.4018 5.9897 16.0703 5.54234 16.5176L3.85581 18.2042C3.28735 18.7726 2.36419\" +\n \" 18.7726 1.79601 18.2042L1.79591 18.2041C1.22756 17.6359 1.22749 16.7128 1.79596 16.1443L1.4424 15.7908L1.79596\" +\n \" 16.1443L3.48248 14.4578C3.92985 14.0104 4.59836 13.9144 5.14058 14.1731L5.45951 14.3253L5.70941 14.0754L6.79811\" +\n \" 12.9869ZM13.9964 7.09277L14.85 6.23921H13.6429H13.2609C13.1771 6.23921 13.1087 6.1709 13.1087 6.08704C13.1087\" +\n \" 6.00318 13.1771 5.93486 13.2609 5.93486H15.2174C15.3015 5.93486 15.3696 6.00296 15.3696 6.08704V8.04356C15.3696\" +\n \" 8.12742 15.3013 8.19574 15.2174 8.19574C15.1336 8.19574 15.0653 8.12742 15.0653 8.04356V7.66161V6.45459L14.2117\" +\n \" 7.30803L12.0641 9.45543L12.0639 9.4556C12.0047 9.51492 11.9085 9.51492 11.8492 \" +\n \"9.4556L11.849 9.45541L11.0057 8.61236L10.6522\" +\n \" 8.25892L10.2987 8.61238L8.80325 10.1076L8.80307 10.1078C8.74402 10.1669 \" +\n \"8.64735 10.1669 8.5883 10.1078L8.588 10.1075C8.5289\" +\n \" 10.0484 8.5289 9.95176 8.588 9.89271L8.58815 9.89256L10.5447 7.93603L10.\" +\n \"5448 7.93588C10.6041 7.87656 10.7003 7.87656\" +\n \" 10.7596 7.93588L10.7598 7.93607L11.6031 8.77912L11.9566 9.13258L12.3101 \" +\n \"8.77907L13.9964 7.09277ZM18.3261 8.04356C18.3261\" +\n \" 4.52785 15.4723 1.67398 11.9566 1.67398C8.44085 1.67398 5.58698 4.52785 \" +\n \"5.58698 8.04356C5.58698 11.5593 8.44085 14.4131\" +\n \" 11.9566 14.4131C15.4723 14.4131 18.3261 11.5593 18.3261 8.04356Z\"\n );\n path.setAttribute(\"fill\", \"#306BB2\");\n path.setAttribute(\"stroke\", \"#306BB2\");\n\n // Append the path to the SVG.\n svg.appendChild(path);\n\n const icon = document.createElement(\"i\");\n icon.appendChild(svg);\n icon.classList.add(\"tiny_cursive-analytics-icon\");\n\n const textNode = document.createElement(\"span\");\n Str.get_string(\"analytics\", \"tiny_cursive\")\n .then((analyticsString) => {\n textNode.textContent = analyticsString;\n return true;\n })\n .catch((error) => {\n window.console.error(\"Error fetching string:\", error);\n });\n\n anchor.appendChild(icon);\n anchor.appendChild(textNode);\n\n return anchor;\n };\n\n return analyticButton;\n});\n"],"names":["define","Str","userid","questionid","anchor","document","createElement","href","id","classList","add","svgNS","svg","createElementNS","setAttribute","path","appendChild","icon","textNode","get_string","then","analyticsString","textContent","catch","error","window","console"],"mappings":";;;;;;;;AAwBAA,sCAAO,CAAC,aAAa,SAASC,YACL,SAACC,YAAQC,kEAAa,SACrCC,OAASC,SAASC,cAAc,KACtCF,OAAOG,KAAO,IACdH,OAAOI,GAAK,YAAcN,OAASC,WACnCC,OAAOK,UAAUC,IACf,gBACA,qBACA,aACA,oCAIIC,MAAQ,6BACRC,IAAMP,SAASQ,gBAAgBF,MAAO,OAC5CC,IAAIE,aAAa,QAASH,OAC1BC,IAAIE,aAAa,QAAS,MAC1BF,IAAIE,aAAa,SAAU,MAC3BF,IAAIE,aAAa,UAAW,aAC5BF,IAAIE,aAAa,OAAQ,cAGnBC,KAAOV,SAASQ,gBAAgBF,MAAO,QAC7CI,KAAKD,aACH,IACA,yuEA2BFC,KAAKD,aAAa,OAAQ,WAC1BC,KAAKD,aAAa,SAAU,WAG5BF,IAAII,YAAYD,YAEVE,KAAOZ,SAASC,cAAc,KACpCW,KAAKD,YAAYJ,KACjBK,KAAKR,UAAUC,IAAI,qCAEbQ,SAAWb,SAASC,cAAc,eACxCL,IAAIkB,WAAW,YAAa,gBACzBC,MAAMC,kBACLH,SAASI,YAAcD,iBAChB,KAERE,OAAOC,QACNC,OAAOC,QAAQF,MAAM,yBAA0BA,UAGnDpB,OAAOY,YAAYC,MACnBb,OAAOY,YAAYE,UAEZd"} \ No newline at end of file +{"version":3,"file":"analytic_button.min.js","sources":["../src/analytic_button.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module that creates an analytics button with an icon and text.\n * The button displays analytics information for a specific user and question.\n *\n * @module tiny_cursive/analytic_button\n * @copyright 2024 CTI \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine([\"core/str\"], function(Str) {\n const analyticButton = (effort, userid, questionid = \"\") => {\n const anchor = document.createElement(\"a\");\n anchor.href = \"#\";\n anchor.id = \"analytics\" + userid + questionid;\n anchor.classList.add(\n \"d-inline-flex\",\n \"justify-content-center\",\n 'text-decoration-none'\n );\n\n const button = document.createElement('div');\n button.className = 'tiny_cursive-analytics-button';\n\n // Left side (icon + label)\n const left = document.createElement('div');\n left.className = 'tiny_cursive-analytics-left';\n\n const icon = document.createElement('img');\n icon.src = M.util.image_url('chart-column', 'tiny_cursive');\n icon.alt = 'Analytics Icon';\n icon.className = 'tiny_cursive-analytics-bar-icon';\n\n const label = document.createElement('span');\n label.className = 'tiny_cursive-analytics-label';\n label.textContent = 'Analytics';\n Str.get_string(\"analytics\", \"tiny_cursive\")\n .then((analyticsString) => {\n label.textContent = analyticsString;\n return analyticsString;\n })\n .catch((error) => {\n window.console.error(\"Error fetching string:\", error);\n });\n\n left.appendChild(icon);\n left.appendChild(label);\n button.appendChild(left);\n\n if (effort) {\n const right = document.createElement('div');\n right.className = 'tiny_cursive-analytics-right';\n right.textContent = effort + \"%\";\n right.title = \"Effort\";\n\n if (effort < 90) {\n right.style.backgroundColor = '#EAB308';\n }\n\n button.appendChild(right);\n }\n // Compose full button\n anchor.appendChild(button);\n\n return anchor;\n };\n\n return analyticButton;\n});\n"],"names":["define","Str","effort","userid","questionid","anchor","document","createElement","href","id","classList","add","button","className","left","icon","src","M","util","image_url","alt","label","textContent","get_string","then","analyticsString","catch","error","window","console","appendChild","right","title","style","backgroundColor"],"mappings":";;;;;;;;AAwBAA,sCAAO,CAAC,aAAa,SAASC,YACL,SAACC,OAAQC,YAAQC,kEAAa,SAC7CC,OAASC,SAASC,cAAc,KACtCF,OAAOG,KAAO,IACdH,OAAOI,GAAK,YAAcN,OAASC,WACnCC,OAAOK,UAAUC,IACf,gBACA,yBACA,8BAGIC,OAASN,SAASC,cAAc,OACtCK,OAAOC,UAAY,sCAGbC,KAAOR,SAASC,cAAc,OACpCO,KAAKD,UAAY,oCAEXE,KAAOT,SAASC,cAAc,OACpCQ,KAAKC,IAAMC,EAAEC,KAAKC,UAAU,eAAgB,gBAC5CJ,KAAKK,IAAM,iBACXL,KAAKF,UAAY,wCAEXQ,MAAQf,SAASC,cAAc,WACrCc,MAAMR,UAAY,+BAClBQ,MAAMC,YAAc,YACpBrB,IAAIsB,WAAW,YAAa,gBACzBC,MAAMC,kBACLJ,MAAMC,YAAcG,gBACbA,mBAERC,OAAOC,QACNC,OAAOC,QAAQF,MAAM,yBAA0BA,UAGnDb,KAAKgB,YAAYf,MACjBD,KAAKgB,YAAYT,OACjBT,OAAOkB,YAAYhB,MAEfZ,OAAQ,OACJ6B,MAAQzB,SAASC,cAAc,OACrCwB,MAAMlB,UAAY,+BAClBkB,MAAMT,YAAcpB,OAAS,IAC7B6B,MAAMC,MAAQ,SAEV9B,OAAS,KACX6B,MAAME,MAAMC,gBAAkB,WAGhCtB,OAAOkB,YAAYC,cAGrB1B,OAAOyB,YAAYlB,QAEZP"} \ No newline at end of file diff --git a/amd/build/analytic_events.min.js b/amd/build/analytic_events.min.js index ab6b73d0..7a33c868 100644 --- a/amd/build/analytic_events.min.js +++ b/amd/build/analytic_events.min.js @@ -1,4 +1,4 @@ -define("tiny_cursive/analytic_events",["exports","./analytic_modal","core/ajax","jquery","core/str","core/chartjs"],(function(_exports,_analytic_modal,_ajax,_jquery,_str,_chartjs){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +define("tiny_cursive/analytic_events",["exports","./analytic_modal","core/ajax","jquery","core/str","core/templates"],(function(_exports,_analytic_modal,_ajax,_jquery,_str,_templates){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} /** * Module for handling analytics events in the Tiny Cursive plugin. * Provides functionality for displaying analytics data, replaying writing, @@ -7,6 +7,6 @@ define("tiny_cursive/analytic_events",["exports","./analytic_modal","core/ajax", * @module tiny_cursive/analytic_events * @copyright 2024 CTI * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_analytic_modal=_interopRequireDefault(_analytic_modal),_jquery=_interopRequireDefault(_jquery),_chartjs=_interopRequireDefault(_chartjs);return _exports.default=class{createModal(userid,context){let questionid=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",authIcon=arguments.length>3?arguments[3]:void 0;(0,_jquery.default)("#analytics"+userid+questionid).on("click",(function(e){e.preventDefault(),_analytic_modal.default.create({templateContext:context}).then((modal=>((0,_jquery.default)("#content"+userid+" .tiny_cursive_table tbody tr:first-child td:nth-child(2)").html(authIcon),modal.show(),!0))).catch((error=>{window.console.error("Failed to create modal:",error)}))}))}analytics(userid,templates,context){let questionid=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",replayInstances=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,authIcon=arguments.length>5?arguments[5]:void 0;(0,_jquery.default)("body").on("click","#analytic"+userid+questionid,(function(e){(0,_jquery.default)("#rep"+userid+questionid).prop("disabled",!1),(0,_jquery.default)("#quality"+userid+questionid).prop("disabled",!1),e.preventDefault(),(0,_jquery.default)("#content"+userid).html((0,_jquery.default)("
").addClass("d-flex justify-content-center my-5").append((0,_jquery.default)("
").addClass("tiny_cursive-loader"))),replayInstances&&replayInstances[userid]&&replayInstances[userid].stopReplay(),(0,_jquery.default)(".tiny_cursive-nav-tab").find(".active").removeClass("active"),(0,_jquery.default)(this).addClass("active"),templates.render("tiny_cursive/analytics_table",context).then((function(html){return(0,_jquery.default)("#content"+userid).html(html),(0,_jquery.default)("#content"+userid+" .tiny_cursive_table tbody tr:first-child td:nth-child(2)").html(authIcon),!0})).fail((function(error){window.console.error("Failed to render template:",error)}))}))}checkDiff(userid,fileid){let questionid=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",replayInstances=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;const nodata=document.createElement("p");nodata.classList.add("tiny_cursive_nopayload","bg-light"),(0,_str.get_string)("nopaylod","tiny_cursive").then((str=>(nodata.textContent=str,!0))).catch((error=>window.console.log(error))),(0,_jquery.default)("body").on("click","#diff"+userid+questionid,(function(e){if((0,_jquery.default)("#rep"+userid+questionid).prop("disabled",!1),(0,_jquery.default)("#quality"+userid+questionid).prop("disabled",!1),e.preventDefault(),(0,_jquery.default)("#content"+userid).html((0,_jquery.default)("
").addClass("d-flex justify-content-center my-5").append((0,_jquery.default)("
").addClass("tiny_cursive-loader"))),(0,_jquery.default)(".tiny_cursive-nav-tab").find(".active").removeClass("active"),(0,_jquery.default)(this).addClass("active"),replayInstances&&replayInstances[userid]&&replayInstances[userid].stopReplay(),!fileid)throw(0,_jquery.default)("#content"+userid).html(nodata),new Error("Missing file id or Difference Content not received yet");(0,_ajax.call)([{methodname:"cursive_get_writing_differences",args:{fileid:fileid}}])[0].done((response=>{let responsedata=JSON.parse(response.data);if(responsedata){let submittedText=atob(responsedata.submitted_text);(0,_str.get_strings)([{key:"original_text",component:"tiny_cursive"},{key:"editspastesai",component:"tiny_cursive"}]).done((strings=>{const originalTextString=strings[0],editsPastesAIString=strings[1],commentBox=(0,_jquery.default)('
');var pasteCountDiv=(0,_jquery.default)("
");(0,_str.get_string)("pastecount","tiny_cursive").then((str=>(pasteCountDiv.append("
"+str+" : "+responsedata.commentscount+"
"),!0))).catch((error=>window.console.log(error)));var commentsDiv=(0,_jquery.default)('
');(0,_str.get_string)("comments","tiny_cursive").then((str=>(commentsDiv.append(""+str+""),!0))).catch((error=>window.console.error(error)));var commentsList=(0,_jquery.default)("
");let comments=responsedata.comments;for(let index in comments){var commentDiv=(0,_jquery.default)('
').text(comments[index].usercomment);commentsList.append(commentDiv)}commentBox.append(pasteCountDiv).append(commentsDiv).append(commentsList);const $legend=(0,_jquery.default)('
'),$attributedItem=(0,_jquery.default)("
",{class:"tiny_cursive-legend-item"}),$attributedBox=(0,_jquery.default)("
",{class:"tiny_cursive-box attributed"}),$attributedText=(0,_jquery.default)("").text(originalTextString);$attributedItem.append($attributedBox).append($attributedText);const $unattributedItem=(0,_jquery.default)("
",{class:"tiny_cursive-legend-item"}),$unattributedBox=(0,_jquery.default)("
",{class:"tiny_cursive-box tiny_cursive_added"}),$unattributedText=(0,_jquery.default)("").text(editsPastesAIString);$unattributedItem.append($unattributedBox).append($unattributedText),$legend.append($attributedItem).append($unattributedItem);let contents=(0,_jquery.default)("
").addClass("tiny_cursive-comparison-content"),textBlock2=(0,_jquery.default)("
").addClass("tiny_cursive-text-block").append((0,_jquery.default)("
").attr("id","tiny_cursive-reconstructed_text").html(JSON.parse(submittedText)));contents.append(commentBox,$legend,textBlock2),(0,_jquery.default)("#content"+userid).html(contents)})).fail((error=>{window.console.error("Failed to load language strings:",error),(0,_jquery.default)("#content"+userid).html(nodata)}))}else(0,_jquery.default)("#content"+userid).html(nodata)})).fail((error=>{throw(0,_jquery.default)("#content"+userid).html(nodata),new Error("Error loading JSON file: "+error.message)}))}))}replyWriting(userid,filepath){let questionid=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",replayInstances=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;(0,_jquery.default)("body").on("click","#rep"+userid+questionid,(function(e){(0,_jquery.default)(this).prop("disabled",!0),(0,_jquery.default)("#quality"+userid+questionid).prop("disabled",!1),e.preventDefault(),(0,_jquery.default)("#content"+userid).html((0,_jquery.default)("
").addClass("d-flex justify-content-center my-5").append((0,_jquery.default)("
").addClass("tiny_cursive-loader"))),(0,_jquery.default)(".tiny_cursive-nav-tab").find(".active").removeClass("active"),(0,_jquery.default)(this).addClass("active"),replayInstances&&replayInstances[userid]&&replayInstances[userid].stopReplay(),questionid?video_playback(userid,filepath,questionid):video_playback(userid,filepath)}))}quality(userid,templates,context){let questionid=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",replayInstances=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,cmid=arguments.length>5?arguments[5]:void 0,metricsData="";const nodata=document.createElement("p");nodata.classList.add("text-center","p-5","bg-light","rounded","m-5","text-primary"),nodata.style.verticalAlign="middle",nodata.style.textTransform="uppercase",nodata.style.fontWeight="500",(0,_str.get_string)("nopaylod","tiny_cursive").then((str=>(nodata.textContent=str,!0))).catch((error=>window.console.error(error))),(0,_jquery.default)("body").on("click","#quality"+userid+questionid,(function(e){var _context$tabledata$fi;(0,_jquery.default)(this).prop("disabled",!0),(0,_jquery.default)("#rep"+userid+questionid).prop("disabled",!1),e.preventDefault(),(0,_jquery.default)(".tiny_cursive-nav-tab").find(".active").removeClass("active"),(0,_jquery.default)(this).addClass("active");let res=(0,_ajax.call)([{methodname:"cursive_get_quality_metrics",args:{file_id:null!==(_context$tabledata$fi=context.tabledata.file_id)&&void 0!==_context$tabledata$fi?_context$tabledata$fi:userid,cmid:cmid}}]);const content=document.getElementById("content"+userid);if(content){content.innerHTML="";const loaderDiv=document.createElement("div");loaderDiv.className="d-flex justify-content-center my-5";const loader=document.createElement("div");loader.className="tiny_cursive-loader",loaderDiv.appendChild(loader),content.appendChild(loaderDiv)}replayInstances&&replayInstances[userid]&&replayInstances[userid].stopReplay(),templates.render("tiny_cursive/quality_chart",context).then((function(html){const content=document.getElementById("content"+userid);return res[0].done((response=>{if(response.status){if(metricsData=response.data,metricsData.quality_access){content&&(content.innerHTML=html),metricsData||(0,_jquery.default)("#content"+userid).html(nodata);var originalData=[metricsData.word_len_mean,metricsData.edits,metricsData.p_burst_mean,metricsData.q_count,metricsData.sentence_count,metricsData.verbosity,metricsData.word_count,metricsData.sent_word_count_mean];Promise.all([(0,_str.get_string)("word_len_mean","tiny_cursive"),(0,_str.get_string)("edits","tiny_cursive"),(0,_str.get_string)("p_burst_mean","tiny_cursive"),(0,_str.get_string)("q_count","tiny_cursive"),(0,_str.get_string)("sentence_count","tiny_cursive"),(0,_str.get_string)("verbosity","tiny_cursive"),(0,_str.get_string)("word_count","tiny_cursive"),(0,_str.get_string)("sent_word_count_mean","tiny_cursive"),(0,_str.get_string)("average","tiny_cursive")]).then((_ref=>{let[wordLength,edits,pBurstMean,qCount,sentenceCount,verbosity,wordCount,sentWordCountMean,average]=_ref,chartvas=document.querySelector("#chart"+userid);const data={labels:[[wordLength,edits,pBurstMean,qCount,sentenceCount,verbosity,wordCount,sentWordCountMean]],datasets:[{data:originalData.map((d=>d>100?100:d<-100?-100:d)),backgroundColor:function(context){const value=context.raw;return value>0&&value<100?"#43BB97":value<0?"#AAAAAA":"#00432F"},barPercentage:.75}]},drawPercentage={id:"drawPercentage",afterDraw:chart=>{const{ctx:ctx,data:data}=chart;let value;ctx.save(),chart.getDatasetMeta(0).data.forEach(((dataPoint,index)=>{value=parseInt(data.datasets[0].data[index]),value||(value=0),value=originalData[index],ctx.font="bold 14px sans-serif",value>50&&value<=100?(ctx.fillStyle="white",ctx.textAlign="right",ctx.fillText(value+"%",dataPoint.x-5,dataPoint.y+5)):value<=10&&value>0?(ctx.fillStyle="#43bb97",ctx.textAlign="left",value>=1?ctx.fillText("0"+value+"%",dataPoint.x+5,dataPoint.y+5):ctx.fillText(value+"%",dataPoint.x+5,dataPoint.y+5)):0==value||null==value||(value>100?(ctx.fillStyle="white",ctx.textAlign="right",ctx.fillText(value+"%",dataPoint.x-5,dataPoint.y+5)):value<-50&&value>=-100||value<-100?(ctx.fillStyle="white",ctx.textAlign="left",ctx.fillText(value+"%",dataPoint.x+5,dataPoint.y+5)):value>-50&&value<0?(ctx.fillStyle="grey",ctx.textAlign="right",ctx.fillText(value+"%",dataPoint.x-5,dataPoint.y+5)):(ctx.fillStyle="#43bb97",ctx.textAlign="left",ctx.fillText(value+"%",dataPoint.x+5,dataPoint.y+5)))}))}};return new _chartjs.default(chartvas,{type:"bar",data:data,options:{responsive:!1,maintainAspectRatio:!1,indexAxis:"y",elements:{bar:{borderRadius:16,borderWidth:0,zIndex:1}},scales:{x:{beginAtZero:!0,min:-100,max:100,ticks:{callback:function(value){return-100===value||100===value?value+"%":0===value?average:""},display:!0,font:function(context){return context&&context.tick&&0===context.tick.value?{weight:"bold",size:14,color:"black"}:{weight:"bold",size:13,color:"black"}},color:"black"},grid:{display:!0,color:function(context){return 0===context.tick.value?"black":"#eaeaea"},tickLength:0},position:"top"},y:{beginAtZero:!0,ticks:{display:!0,align:"center",crossAlign:"far",font:{size:18},tickLength:100,color:"black"},grid:{display:!0,tickLength:1e3}}},plugins:{legend:{display:!1},title:{display:!1},tooltip:{yAlign:"bottom",xAlign:"center",callbacks:{label:function(context){return originalData[context.dataIndex]}}}}},plugins:[{id:"chartAreaBg",beforeDraw:chart=>{const{ctx:ctx,scales:{x:x,y:y}}=chart;ctx.save();const segmentPixel=y.getPixelForValue(y.ticks[0].value)-y.getPixelForValue(y.ticks[1].value),doubleSegment=y.ticks[2].value-y.ticks[0].value;let tickArray=[];for(let i=0;i<=y.max;i+=doubleSegment)i!==y.max&&tickArray.push(i);tickArray.forEach((tick=>{ctx.fillStyle="rgba(0, 0, 0, 0.02)",ctx.fillRect(0,y.getPixelForValue(tick)+80,x.width+x.width+21,segmentPixel)}))}},drawPercentage]})})).catch((error=>{window.console.log(error)}))}else templates.render("tiny_cursive/upgrade_to_pro",[]).then((function(html){return(0,_jquery.default)("#content"+userid).html(html),!0})).fail((function(error){window.console.error(error)}))}})).fail((error=>{throw(0,_jquery.default)("#content"+userid).html(nodata),new Error("Error: no data received yet",error)})),!0})).catch((function(error){window.console.error("Failed to render template:",error)})),document.querySelectorAll(".tiny_cursive-nav-tab .active").forEach((el=>el.classList.remove("active"))),e.target.classList.add("active")}))}formatedTime(data){if(data.total_time_seconds){let totalTimeSeconds=data.total_time_seconds,hours=Math.floor(totalTimeSeconds/3600).toString().padStart(2,0),minutes=Math.floor(totalTimeSeconds%3600/60).toString().padStart(2,0),seconds=(totalTimeSeconds%60).toString().padStart(2,0);return"".concat(hours,"h ").concat(minutes,"m ").concat(seconds,"s")}return"0h 0m 0s"}authorshipStatus(firstFile,score,scoreSetting){var icon="fa fa-circle-o",color="font-size:32px;color:black";return score=parseFloat(score),firstFile?(icon="fa fa-solid fa-info-circle",color="font-size:32px;color:#000000"):score>=scoreSetting?(icon="fa fa-check-circle",color="font-size:32px;color:green"):score").addClass(icon).attr("style",color)}},_exports.default})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_analytic_modal=_interopRequireDefault(_analytic_modal),_jquery=_interopRequireDefault(_jquery),_templates=_interopRequireDefault(_templates);return _exports.default=class{constructor(){(0,_str.get_string)("notenoughtinfo","tiny_cursive").then((str=>(localStorage.setItem("notenoughtinfo",str),str))).catch((error=>window.console.log(error)))}createModal(userid,context){let questionid=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",replayInstances=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,authIcon=arguments.length>4?arguments[4]:void 0;const self=this;(0,_jquery.default)("#analytics"+userid+questionid).on("click",(function(e){e.preventDefault();const isReplayButton=(0,_jquery.default)(this).find(".tiny_cursive-replay-button").length>0;_analytic_modal.default.create({templateContext:context}).then((modal=>{(0,_jquery.default)("#content"+userid+" .tiny_cursive_table tbody tr:first-child td:nth-child(2)").html(authIcon),modal.show(),isReplayButton&&setTimeout((()=>{(0,_jquery.default)(".tiny_cursive-nav-tab").find(".active").removeClass("active");const replayTab=(0,_jquery.default)("#rep"+userid+questionid);replayTab.length&&(replayTab.trigger("click"),replayTab.addClass("active"))}),50);let moreBtn=(0,_jquery.default)("body #more"+userid+questionid);return moreBtn.length>0&&((0,_jquery.default)(".tiny_cursive-nav-tab").find(".active").removeClass("active"),(0,_jquery.default)("#analytic"+userid+questionid).prop("disabled",!0),(0,_jquery.default)("#diff"+userid+questionid).prop("disabled",!0),(0,_jquery.default)("#analytic"+userid+questionid).css({"background-color":"rgba(168, 168, 168, 0.133)",cursor:"not-allowed"}),(0,_jquery.default)("#diff"+userid+questionid).css({"background-color":"rgba(168, 168, 168, 0.133)",cursor:"not-allowed"}),moreBtn.on("click",(function(e){e.preventDefault(),self.learnMore((0,_jquery.default)(this),context,userid,questionid,replayInstances)}))),!0})).catch((error=>{window.console.error("Failed to create modal:",error)}))}))}analytics(userid,templates,context){let questionid=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",replayInstances=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,authIcon=arguments.length>5?arguments[5]:void 0;(0,_jquery.default)("body").on("click","#analytic"+userid+questionid,(function(e){(0,_jquery.default)("#rep"+userid+questionid).prop("disabled",!1),(0,_jquery.default)("#quality"+userid+questionid).prop("disabled",!1),(0,_jquery.default)("#content"+userid).attr("data-label","analytics"),(0,_jquery.default)("#player_"+userid+questionid).css({display:"none"}),(0,_jquery.default)("#content"+userid).removeClass("tiny_cursive_outputElement").addClass("tiny_cursive").attr("data-label","analytics"),e.preventDefault(),(0,_jquery.default)("#content"+userid).html((0,_jquery.default)("
").addClass("d-flex justify-content-center my-5").append((0,_jquery.default)("
").addClass("tiny_cursive-loader"))),replayInstances&&replayInstances[userid]&&replayInstances[userid].stopReplay(),(0,_jquery.default)(".tiny_cursive-nav-tab").find(".active").removeClass("active"),(0,_jquery.default)(this).addClass("active"),templates.render("tiny_cursive/analytics_table",context).then((function(html){return(0,_jquery.default)("#content"+userid).html(html),(0,_jquery.default)("#content"+userid+" .tiny_cursive_table tbody tr:first-child td:nth-child(2)").html(authIcon),!0})).fail((function(error){window.console.error("Failed to render template:",error)}))}))}checkDiff(userid,fileid){let questionid=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",replayInstances=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;const nodata=document.createElement("p");nodata.classList.add("tiny_cursive_nopayload","bg-light"),(0,_str.get_string)("nopaylod","tiny_cursive").then((str=>(nodata.textContent=str,!0))).catch((error=>window.console.log(error))),(0,_jquery.default)("body").on("click","#diff"+userid+questionid,(function(e){if((0,_jquery.default)("#rep"+userid+questionid).prop("disabled",!1),(0,_jquery.default)("#quality"+userid+questionid).prop("disabled",!1),(0,_jquery.default)("#content"+userid).attr("data-label","diff"),(0,_jquery.default)("#player_"+userid+questionid).css({display:"none"}),(0,_jquery.default)("#content"+userid).removeClass("tiny_cursive_outputElement").addClass("tiny_cursive").attr("data-label","diff"),e.preventDefault(),(0,_jquery.default)("#content"+userid).html((0,_jquery.default)("
").addClass("d-flex justify-content-center my-5").append((0,_jquery.default)("
").addClass("tiny_cursive-loader"))),(0,_jquery.default)(".tiny_cursive-nav-tab").find(".active").removeClass("active"),(0,_jquery.default)(this).addClass("active"),replayInstances&&replayInstances[userid]&&replayInstances[userid].stopReplay(),!fileid)throw(0,_jquery.default)("#content"+userid).html(nodata),new Error("Missing file id or Difference Content not received yet");(0,_ajax.call)([{methodname:"cursive_get_writing_differences",args:{fileid:fileid}}])[0].done((response=>{let responsedata=JSON.parse(response.data);if(responsedata){let submittedText=atob(responsedata.submitted_text);(0,_str.get_strings)([{key:"original_text",component:"tiny_cursive"},{key:"editspastesai",component:"tiny_cursive"}]).done((strings=>{const originalTextString=strings[0],editsPastesAIString=strings[1],commentBox=(0,_jquery.default)('
');var pasteCountDiv=(0,_jquery.default)("
");(0,_str.get_string)("pastecount","tiny_cursive").then((str=>(pasteCountDiv.append("
"+str+" : "+responsedata.commentscount+"
"),!0))).catch((error=>window.console.log(error)));var commentsDiv=(0,_jquery.default)('
');(0,_str.get_string)("comments","tiny_cursive").then((str=>(commentsDiv.append(""+str+""),!0))).catch((error=>window.console.error(error)));var commentsList=(0,_jquery.default)("
");let comments=responsedata.comments;for(let index in comments){var commentDiv=(0,_jquery.default)('
').text(comments[index].usercomment);commentsList.append(commentDiv)}commentBox.append(pasteCountDiv).append(commentsDiv).append(commentsList);const $legend=(0,_jquery.default)('
'),$attributedItem=(0,_jquery.default)("
",{class:"tiny_cursive-legend-item"}),$attributedBox=(0,_jquery.default)("
",{class:"tiny_cursive-box attributed"}),$attributedText=(0,_jquery.default)("").text(originalTextString);$attributedItem.append($attributedBox).append($attributedText);const $unattributedItem=(0,_jquery.default)("
",{class:"tiny_cursive-legend-item"}),$unattributedBox=(0,_jquery.default)("
",{class:"tiny_cursive-box tiny_cursive_added"}),$unattributedText=(0,_jquery.default)("").text(editsPastesAIString);$unattributedItem.append($unattributedBox).append($unattributedText),$legend.append($attributedItem).append($unattributedItem);let contents=(0,_jquery.default)("
").addClass("tiny_cursive-comparison-content"),textBlock2=(0,_jquery.default)("
").addClass("tiny_cursive-text-block").append((0,_jquery.default)("
").attr("id","tiny_cursive-reconstructed_text").html(JSON.parse(submittedText)));contents.append(commentBox,$legend,textBlock2),(0,_jquery.default)("#content"+userid).html(contents)})).fail((error=>{window.console.error("Failed to load language strings:",error),(0,_jquery.default)("#content"+userid).html(nodata)}))}else(0,_jquery.default)("#content"+userid).html(nodata)})).fail((error=>{throw(0,_jquery.default)("#content"+userid).html(nodata),new Error("Error loading JSON file: "+error.message)}))}))}replyWriting(userid,filepath){let questionid=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",replayInstances=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;(0,_jquery.default)("body").on("click","#rep"+userid+questionid,(function(e){filepath&&((0,_jquery.default)("#replayControls_"+userid+questionid).removeClass("d-none"),(0,_jquery.default)("#content"+userid).addClass("tiny_cursive_outputElement")),(0,_jquery.default)(this).prop("disabled",!0),(0,_jquery.default)("#quality"+userid+questionid).prop("disabled",!1),(0,_jquery.default)("#content"+userid).attr("data-label","replay"),(0,_jquery.default)("#player_"+userid+questionid).css({display:"block","padding-right":"8px"}),e.preventDefault(),(0,_jquery.default)("#content"+userid).html((0,_jquery.default)("
").addClass("d-flex justify-content-center my-5").append((0,_jquery.default)("
").addClass("tiny_cursive-loader"))),(0,_jquery.default)(".tiny_cursive-nav-tab").find(".active").removeClass("active"),(0,_jquery.default)(this).addClass("active"),replayInstances&&replayInstances[userid]&&replayInstances[userid].stopReplay(),questionid?video_playback(userid,filepath,questionid):video_playback(userid,filepath)}))}learnMore(moreBtn,context,userid,questionid,replayInstances){(0,_jquery.default)(".tiny_cursive-nav-tab").find(".active").removeClass("active"),moreBtn.addClass("active"),(0,_jquery.default)("#rep"+userid+questionid).prop("disabled",!1),replayInstances&&replayInstances[userid]&&replayInstances[userid].stopReplay(),(0,_jquery.default)("#content"+userid+questionid).removeClass("tiny_cursive_outputElement"),(0,_jquery.default)("#replayControls_"+userid+questionid).addClass("d-none"),_templates.default.render("tiny_cursive/learn_more",context).then((function(html){return(0,_jquery.default)("#content"+userid+questionid).html(html),!0})).fail((function(error){window.console.error("Failed to render template:",error)}))}formatedTime(data){if(data.total_time_seconds){let totalTimeSeconds=data.total_time_seconds;return`${Math.floor(totalTimeSeconds/3600).toString().padStart(2,0)}h ${Math.floor(totalTimeSeconds%3600/60).toString().padStart(2,0)}m ${(totalTimeSeconds%60).toString().padStart(2,0)}s`}return"0h 0m 0s"}authorshipStatus(firstFile,score,scoreSetting){var icon="fa fa-circle-o",color="font-size:32px;color:black";return score=parseFloat(score),firstFile?(icon="fa fa-solid fa-info-circle",color="font-size:32px;color:#000000"):score>=scoreSetting&&(icon="fa fa-check-circle",color="font-size:32px;color:green"),score").addClass(icon).attr("style",color).attr("title",localStorage.getItem("notenoughtinfo"))):(0,_jquery.default)("").addClass(icon).attr("style",color)}},_exports.default})); //# sourceMappingURL=analytic_events.min.js.map \ No newline at end of file diff --git a/amd/build/analytic_events.min.js.map b/amd/build/analytic_events.min.js.map index 92457136..321173da 100644 --- a/amd/build/analytic_events.min.js.map +++ b/amd/build/analytic_events.min.js.map @@ -1 +1 @@ -{"version":3,"file":"analytic_events.min.js","sources":["../src/analytic_events.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module for handling analytics events in the Tiny Cursive plugin.\n * Provides functionality for displaying analytics data, replaying writing,\n * checking differences and showing quality metrics.\n *\n * @module tiny_cursive/analytic_events\n * @copyright 2024 CTI \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport myModal from \"./analytic_modal\";\nimport {call as getContent} from \"core/ajax\";\nimport $ from 'jquery';\nimport {get_string as getString} from 'core/str';\nimport {get_strings as getStrings} from 'core/str';\nimport Chart from 'core/chartjs';\n\nexport default class AnalyticEvents {\n\n createModal(userid, context, questionid = '', authIcon) {\n $('#analytics' + userid + questionid).on('click', function(e) {\n e.preventDefault();\n\n // Create Moodle modal\n myModal.create({templateContext: context}).then(modal => {\n $('#content' + userid + ' .tiny_cursive_table tbody tr:first-child td:nth-child(2)').html(authIcon);\n modal.show();\n return true;\n }).catch(error => {\n window.console.error(\"Failed to create modal:\", error);\n });\n });\n }\n\n analytics(userid, templates, context, questionid = '', replayInstances = null, authIcon) {\n $('body').on('click', '#analytic' + userid + questionid, function(e) {\n $('#rep' + userid + questionid).prop('disabled', false);\n $('#quality' + userid + questionid).prop('disabled', false);\n e.preventDefault();\n $('#content' + userid).html($('
').addClass('d-flex justify-content-center my-5')\n .append($('
').addClass('tiny_cursive-loader')));\n if (replayInstances && replayInstances[userid]) {\n replayInstances[userid].stopReplay();\n }\n $('.tiny_cursive-nav-tab').find('.active').removeClass('active');\n $(this).addClass('active'); // Add 'active' class to the clicked element\n\n templates.render('tiny_cursive/analytics_table', context).then(function(html) {\n $('#content' + userid).html(html);\n $('#content' + userid + ' .tiny_cursive_table tbody tr:first-child td:nth-child(2)').html(authIcon);\n return true;\n }).fail(function(error) {\n window.console.error(\"Failed to render template:\", error);\n });\n });\n }\n\n checkDiff(userid, fileid, questionid = '', replayInstances = null) {\n const nodata = document.createElement('p');\n nodata.classList.add('tiny_cursive_nopayload', 'bg-light');\n getString('nopaylod', 'tiny_cursive').then(str => {\n nodata.textContent = str;\n return true;\n }).catch(error => window.console.log(error));\n $('body').on('click', '#diff' + userid + questionid, function(e) {\n $('#rep' + userid + questionid).prop('disabled', false);\n $('#quality' + userid + questionid).prop('disabled', false);\n e.preventDefault();\n $('#content' + userid).html($('
').addClass('d-flex justify-content-center my-5')\n .append($('
').addClass('tiny_cursive-loader')));\n $('.tiny_cursive-nav-tab').find('.active').removeClass('active');\n $(this).addClass('active');\n if (replayInstances && replayInstances[userid]) {\n replayInstances[userid].stopReplay();\n }\n if (!fileid) {\n $('#content' + userid).html(nodata);\n throw new Error('Missing file id or Difference Content not received yet');\n }\n getContent([{\n methodname: 'cursive_get_writing_differences',\n args: {fileid: fileid},\n }])[0].done(response => {\n let responsedata = JSON.parse(response.data);\n if (responsedata) {\n let submittedText = atob(responsedata.submitted_text);\n\n // Fetch the dynamic strings.\n getStrings([\n {key: 'original_text', component: 'tiny_cursive'},\n {key: 'editspastesai', component: 'tiny_cursive'}\n ]).done(strings => {\n const originalTextString = strings[0];\n const editsPastesAIString = strings[1];\n\n const commentBox = $('
');\n var pasteCountDiv = $('
');\n getString('pastecount', 'tiny_cursive').then(str => {\n pasteCountDiv.append('
' + str + ' : ' + responsedata.commentscount + '
');\n return true;\n }).catch(error => window.console.log(error));\n\n var commentsDiv = $('
');\n getString('comments', 'tiny_cursive').then(str => {\n commentsDiv.append('' + str + '');\n return true;\n }).catch(error => window.console.error(error));\n\n var commentsList = $('
');\n\n let comments = responsedata.comments;\n for (let index in comments) {\n var commentDiv = $('
').text(comments[index].usercomment);\n commentsList.append(commentDiv);\n }\n commentBox.append(pasteCountDiv).append(commentsDiv).append(commentsList);\n\n const $legend = $('
');\n\n // Create the first legend item\n const $attributedItem = $('
', {\"class\": \"tiny_cursive-legend-item\"});\n const $attributedBox = $('
', {\"class\": \"tiny_cursive-box attributed\"});\n const $attributedText = $('').text(originalTextString);\n $attributedItem.append($attributedBox).append($attributedText);\n\n // Create the second legend item\n const $unattributedItem = $('
', {\"class\": 'tiny_cursive-legend-item'});\n const $unattributedBox = $('
', {\"class\": 'tiny_cursive-box tiny_cursive_added'});\n const $unattributedText = $('').text(editsPastesAIString);\n $unattributedItem.append($unattributedBox).append($unattributedText);\n\n // Append the legend items to the legend container.\n $legend.append($attributedItem).append($unattributedItem);\n\n let contents = $('
').addClass('tiny_cursive-comparison-content');\n let textBlock2 = $('
').addClass('tiny_cursive-text-block').append(\n $('
').attr('id', 'tiny_cursive-reconstructed_text').html(JSON.parse(submittedText))\n );\n\n contents.append(commentBox, $legend, textBlock2);\n $('#content' + userid).html(contents); // Update content.\n }).fail(error => {\n window.console.error(\"Failed to load language strings:\", error);\n $('#content' + userid).html(nodata);\n });\n } else {\n $('#content' + userid).html(nodata);\n }\n }).fail(error => {\n $('#content' + userid).html(nodata);\n throw new Error('Error loading JSON file: ' + error.message);\n });\n });\n }\n\n replyWriting(userid, filepath, questionid = '', replayInstances = null) {\n $('body').on('click', '#rep' + userid + questionid, function(e) {\n $(this).prop('disabled', true);\n $('#quality' + userid + questionid).prop('disabled', false);\n e.preventDefault();\n $('#content' + userid).html($('
').addClass('d-flex justify-content-center my-5')\n .append($('
').addClass('tiny_cursive-loader')));\n $('.tiny_cursive-nav-tab').find('.active').removeClass('active');\n $(this).addClass('active'); // Add 'active' class to the clicked element\n if (replayInstances && replayInstances[userid]) {\n replayInstances[userid].stopReplay();\n }\n if (questionid) {\n // eslint-disable-next-line\n video_playback(userid, filepath, questionid);\n } else {\n // eslint-disable-next-line\n video_playback(userid, filepath);\n }\n });\n }\n\n quality(userid, templates, context, questionid = '', replayInstances = null, cmid) {\n let metricsData = '';\n const nodata = document.createElement('p');\n nodata.classList.add('text-center', 'p-5', 'bg-light', 'rounded', 'm-5', 'text-primary');\n nodata.style.verticalAlign = 'middle';\n nodata.style.textTransform = 'uppercase';\n nodata.style.fontWeight = '500';\n getString('nopaylod', 'tiny_cursive').then(str => {\n nodata.textContent = str;\n return true;\n }).catch(error => window.console.error(error));\n\n $('body').on('click', '#quality' + userid + questionid, function(e) {\n\n $(this).prop('disabled', true);\n $('#rep' + userid + questionid).prop('disabled', false);\n e.preventDefault();\n $('.tiny_cursive-nav-tab').find('.active').removeClass('active');\n $(this).addClass('active'); // Add 'active' class to the clicked element\n\n let res = getContent([{\n methodname: 'cursive_get_quality_metrics',\n args: {\"file_id\": context.tabledata.file_id ?? userid, cmid: cmid},\n }]);\n\n const content = document.getElementById('content' + userid);\n if (content) {\n content.innerHTML = '';\n const loaderDiv = document.createElement('div');\n loaderDiv.className = 'd-flex justify-content-center my-5';\n const loader = document.createElement('div');\n loader.className = 'tiny_cursive-loader';\n loaderDiv.appendChild(loader);\n content.appendChild(loaderDiv);\n }\n\n if (replayInstances && replayInstances[userid]) {\n replayInstances[userid].stopReplay();\n }\n\n templates.render('tiny_cursive/quality_chart', context).then(function(html) {\n const content = document.getElementById('content' + userid);\n\n res[0].done(response => {\n if (response.status) {\n metricsData = response.data;\n let proUser = metricsData.quality_access;\n\n if (!proUser) {\n // eslint-disable-next-line promise/no-nesting\n templates.render('tiny_cursive/upgrade_to_pro', []).then(function(html) {\n $('#content' + userid).html(html);\n return true;\n }).fail(function(error) {\n window.console.error(error);\n });\n } else {\n\n if (content) {\n content.innerHTML = html;\n }\n if (!metricsData) {\n $('#content' + userid).html(nodata);\n }\n // MetricsData.p_burst_cnt,'P-burst Count', metricsData.total_active_time, 'Total Active Time',\n var originalData = [\n metricsData.word_len_mean, metricsData.edits, metricsData.p_burst_mean,\n metricsData.q_count, metricsData.sentence_count,\n metricsData.verbosity, metricsData.word_count, metricsData.sent_word_count_mean\n ];\n\n // eslint-disable-next-line promise/no-nesting\n Promise.all([\n getString('word_len_mean', 'tiny_cursive'),\n getString('edits', 'tiny_cursive'),\n getString('p_burst_mean', 'tiny_cursive'),\n getString('q_count', 'tiny_cursive'),\n getString('sentence_count', 'tiny_cursive'),\n getString('verbosity', 'tiny_cursive'),\n getString('word_count', 'tiny_cursive'),\n getString('sent_word_count_mean', 'tiny_cursive'),\n getString('average', 'tiny_cursive'),\n ]).then(([wordLength, edits, pBurstMean, qCount, sentenceCount, verbosity, wordCount,\n sentWordCountMean, average]) => {\n let chartvas = document.querySelector('#chart' + userid);\n let levels = [wordLength, edits, pBurstMean, qCount, sentenceCount, verbosity, wordCount,\n sentWordCountMean];\n\n const data = {\n labels: [\n levels\n ],\n datasets: [{\n data: originalData.map(d => {\n if (d > 100) {\n return 100;\n } else if (d < -100) {\n return -100;\n } else {\n return d;\n }\n }),\n backgroundColor: function(context) {\n // Apply green or gray depending on value.\n const value = context.raw;\n\n if (value > 0 && value < 100) {\n return '#43BB97';\n } else if (value < 0) {\n return '#AAAAAA';\n } else {\n return '#00432F'; // Green for positive, gray for negative.\n }\n\n },\n barPercentage: 0.75,\n }]\n };\n\n const drawPercentage = {\n id: 'drawPercentage',\n afterDraw: (chart) => {\n const {ctx, data} = chart;\n ctx.save();\n let value;\n chart.getDatasetMeta(0).data.forEach((dataPoint, index) => {\n value = parseInt(data.datasets[0].data[index]);\n if (!value) {\n value = 0;\n }\n value = originalData[index];\n\n ctx.font = \"bold 14px sans-serif\";\n\n if (value > 50 && value <= 100) {\n ctx.fillStyle = 'white';\n ctx.textAlign = 'right';\n ctx.fillText(value + '%', dataPoint.x - 5, dataPoint.y + 5);\n } else if (value <= 10 && value > 0) {\n ctx.fillStyle = '#43bb97';\n ctx.textAlign = 'left';\n if (value >= 1) {\n ctx.fillText('0' + value + '%', dataPoint.x + 5, dataPoint.y + 5);\n } else {\n ctx.fillText(value + '%', dataPoint.x + 5, dataPoint.y + 5);\n }\n // eslint-disable-next-line no-empty\n } else if (value == 0 || value == undefined) {\n } else if (value > 100) {\n ctx.fillStyle = 'white';\n ctx.textAlign = 'right';\n ctx.fillText(value + '%', dataPoint.x - 5, dataPoint.y + 5);\n } else if (value < -50 && value >= -100) {\n ctx.fillStyle = 'white';\n ctx.textAlign = 'left';\n ctx.fillText(value + '%', dataPoint.x + 5, dataPoint.y + 5);\n } else if (value < -100) {\n ctx.fillStyle = 'white';\n ctx.textAlign = 'left';\n ctx.fillText(value + '%', dataPoint.x + 5, dataPoint.y + 5);\n } else if (value > -50 && value < 0) {\n ctx.fillStyle = 'grey';\n ctx.textAlign = 'right';\n ctx.fillText(value + '%', dataPoint.x - 5, dataPoint.y + 5);\n } else {\n ctx.fillStyle = '#43bb97';\n ctx.textAlign = 'left';\n ctx.fillText(value + '%', dataPoint.x + 5, dataPoint.y + 5);\n }\n\n });\n }\n };\n\n const chartAreaBg = {\n id: 'chartAreaBg',\n beforeDraw: (chart) => {\n const {ctx, scales: {x, y}} = chart;\n ctx.save();\n\n const segmentPixel = y.getPixelForValue(y.ticks[0].value) -\n y.getPixelForValue(y.ticks[1].value);\n const doubleSegment = y.ticks[2].value - y.ticks[0].value;\n let tickArray = [];\n\n // Generate tick values.\n for (let i = 0; i <= y.max; i += doubleSegment) {\n if (i !== y.max) {\n tickArray.push(i);\n }\n }\n\n // Draw the background rectangles for each tick.\n tickArray.forEach(tick => {\n ctx.fillStyle = 'rgba(0, 0, 0, 0.02)';\n ctx.fillRect(0, y.getPixelForValue(tick) + 80, x.width + x.width + 21, segmentPixel);\n });\n }\n };\n\n\n return new Chart(chartvas, {\n type: 'bar',\n data: data,\n options: {\n responsive: false,\n maintainAspectRatio: false,\n indexAxis: 'y',\n elements: {\n bar: {\n borderRadius: 16,\n borderWidth: 0,\n zIndex: 1,\n }\n },\n scales: {\n x: {\n beginAtZero: true,\n min: -100,\n max: 100,\n ticks: {\n callback: function(value) {\n if (value === -100 || value === 100) {\n return value + '%';\n } else if (value === 0) {\n return average;\n }\n return '';\n },\n display: true,\n font: function(context) {\n if (context && context.tick && context.tick.value === 0) {\n return {\n weight: 'bold',\n size: 14,\n color: 'black'\n };\n }\n return {\n weight: 'bold',\n size: 13,\n color: 'black'\n };\n },\n color: 'black',\n\n },\n grid: {\n display: true,\n color: function(context) {\n return context.tick.value === 0 ? 'black' : '#eaeaea';\n },\n tickLength: 0,\n },\n position: 'top'\n\n },\n y: {\n beginAtZero: true,\n ticks: {\n display: true,\n align: 'center',\n\n crossAlign: 'far',\n font: {\n size: 18,\n },\n tickLength: 100,\n color: 'black',\n },\n grid: {\n display: true,\n tickLength: 1000,\n },\n\n }\n },\n plugins: {\n legend: {\n display: false,\n },\n title: {\n display: false,\n },\n tooltip: {\n yAlign: 'bottom',\n xAlign: 'center',\n callbacks: {\n label: function(context) {\n const originalValue = originalData[context.dataIndex];\n return originalValue; // Show the original value.\n },\n },\n },\n }\n },\n plugins: [chartAreaBg, drawPercentage]\n });\n }).catch(error => {\n window.console.log(error);\n });\n\n }\n }\n }).fail(error => {\n $('#content' + userid).html(nodata);\n throw new Error('Error: no data received yet', error);\n });\n return true;\n }).catch(function(error) {\n window.console.error(\"Failed to render template:\", error);\n });\n\n document.querySelectorAll('.tiny_cursive-nav-tab .active').forEach(el => el.classList.remove('active'));\n e.target.classList.add('active');\n });\n }\n\n formatedTime(data) {\n if (data.total_time_seconds) {\n let totalTimeSeconds = data.total_time_seconds;\n let hours = Math.floor(totalTimeSeconds / 3600).toString().padStart(2, 0);\n let minutes = Math.floor((totalTimeSeconds % 3600) / 60).toString().padStart(2, 0);\n let seconds = (totalTimeSeconds % 60).toString().padStart(2, 0);\n return `${hours}h ${minutes}m ${seconds}s`;\n } else {\n return \"0h 0m 0s\";\n }\n }\n\n authorshipStatus(firstFile, score, scoreSetting) {\n var icon = 'fa fa-circle-o';\n var color = 'font-size:32px;color:black';\n score = parseFloat(score);\n\n if (firstFile) {\n icon = 'fa fa-solid fa-info-circle';\n color = 'font-size:32px;color:#000000';\n } else if (score >= scoreSetting) {\n icon = 'fa fa-check-circle';\n color = 'font-size:32px;color:green';\n } else if (score < scoreSetting) {\n icon = 'fa fa-question-circle';\n color = 'font-size:32px;color:#A9A9A9';\n }\n\n return $('').addClass(icon).attr('style', color);\n }\n}\n"],"names":["createModal","userid","context","questionid","authIcon","on","e","preventDefault","create","templateContext","then","modal","html","show","catch","error","window","console","analytics","templates","replayInstances","prop","addClass","append","stopReplay","find","removeClass","this","render","fail","checkDiff","fileid","nodata","document","createElement","classList","add","str","textContent","log","Error","methodname","args","done","response","responsedata","JSON","parse","data","submittedText","atob","submitted_text","key","component","strings","originalTextString","editsPastesAIString","commentBox","pasteCountDiv","commentscount","commentsDiv","commentsList","comments","index","commentDiv","text","usercomment","$legend","$attributedItem","$attributedBox","$attributedText","$unattributedItem","$unattributedBox","$unattributedText","contents","textBlock2","attr","message","replyWriting","filepath","video_playback","quality","cmid","metricsData","style","verticalAlign","textTransform","fontWeight","res","tabledata","file_id","content","getElementById","innerHTML","loaderDiv","className","loader","appendChild","status","quality_access","originalData","word_len_mean","edits","p_burst_mean","q_count","sentence_count","verbosity","word_count","sent_word_count_mean","Promise","all","_ref","wordLength","pBurstMean","qCount","sentenceCount","wordCount","sentWordCountMean","average","chartvas","querySelector","labels","datasets","map","d","backgroundColor","value","raw","barPercentage","drawPercentage","id","afterDraw","chart","ctx","save","getDatasetMeta","forEach","dataPoint","parseInt","font","fillStyle","textAlign","fillText","x","y","undefined","Chart","type","options","responsive","maintainAspectRatio","indexAxis","elements","bar","borderRadius","borderWidth","zIndex","scales","beginAtZero","min","max","ticks","callback","display","tick","weight","size","color","grid","tickLength","position","align","crossAlign","plugins","legend","title","tooltip","yAlign","xAlign","callbacks","label","dataIndex","beforeDraw","segmentPixel","getPixelForValue","doubleSegment","tickArray","i","push","fillRect","width","querySelectorAll","el","remove","target","formatedTime","total_time_seconds","totalTimeSeconds","hours","Math","floor","toString","padStart","minutes","seconds","authorshipStatus","firstFile","score","scoreSetting","icon","parseFloat"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"analytic_events.min.js","sources":["../src/analytic_events.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module for handling analytics events in the Tiny Cursive plugin.\n * Provides functionality for displaying analytics data, replaying writing,\n * checking differences and showing quality metrics.\n *\n * @module tiny_cursive/analytic_events\n * @copyright 2024 CTI \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport myModal from \"./analytic_modal\";\nimport {call as getContent} from \"core/ajax\";\nimport $ from 'jquery';\nimport {get_string as getString} from 'core/str';\nimport {get_strings as getStrings} from 'core/str';\nimport template from 'core/templates';\n\nexport default class AnalyticEvents {\n\n constructor() {\n getString('notenoughtinfo', 'tiny_cursive').then(str => {\n localStorage.setItem('notenoughtinfo', str);\n return str;\n }).catch(error => window.console.log(error));\n }\n\n createModal(userid, context, questionid = '', replayInstances = null, authIcon) {\n const self = this;\n $('#analytics' + userid + questionid).on('click', function(e) {\n e.preventDefault();\n\n const isReplayButton = $(this).find('.tiny_cursive-replay-button').length > 0;\n // Create Moodle modal\n myModal.create({templateContext: context}).then(modal => {\n $('#content' + userid + ' .tiny_cursive_table tbody tr:first-child td:nth-child(2)').html(authIcon);\n modal.show();\n\n if (isReplayButton) {\n setTimeout(() => {\n $('.tiny_cursive-nav-tab').find('.active').removeClass('active');\n\n const replayTab = $('#rep' + userid + questionid);\n if (replayTab.length) {\n replayTab.trigger('click');\n replayTab.addClass('active');\n }\n }, 50);\n }\n\n let moreBtn = $('body #more' + userid + questionid);\n if (moreBtn.length > 0) {\n $('.tiny_cursive-nav-tab').find('.active').removeClass('active');\n $('#analytic' + userid + questionid).prop('disabled', true);\n $('#diff' + userid + questionid).prop('disabled', true);\n $('#analytic' + userid + questionid).css({\n 'background-color': 'rgba(168, 168, 168, 0.133)',\n 'cursor': 'not-allowed'\n });\n $('#diff' + userid + questionid).css({\n 'background-color': 'rgba(168, 168, 168, 0.133)',\n 'cursor': 'not-allowed'\n });\n moreBtn.on('click', function(e) {\n e.preventDefault();\n self.learnMore($(this), context, userid, questionid, replayInstances);\n });\n }\n\n return true;\n }).catch(error => {\n window.console.error(\"Failed to create modal:\", error);\n });\n\n });\n }\n\n analytics(userid, templates, context, questionid = '', replayInstances = null, authIcon) {\n\n $('body').on('click', '#analytic' + userid + questionid, function(e) {\n $('#rep' + userid + questionid).prop('disabled', false);\n $('#quality' + userid + questionid).prop('disabled', false);\n $('#content' + userid).attr('data-label', 'analytics');\n $('#player_' + userid + questionid).css({'display': 'none'});\n $('#content' + userid).removeClass('tiny_cursive_outputElement')\n .addClass('tiny_cursive').attr('data-label', 'analytics');\n e.preventDefault();\n $('#content' + userid).html($('
').addClass('d-flex justify-content-center my-5')\n .append($('
').addClass('tiny_cursive-loader')));\n if (replayInstances && replayInstances[userid]) {\n replayInstances[userid].stopReplay();\n }\n $('.tiny_cursive-nav-tab').find('.active').removeClass('active');\n $(this).addClass('active'); // Add 'active' class to the clicked element\n\n templates.render('tiny_cursive/analytics_table', context).then(function(html) {\n $('#content' + userid).html(html);\n $('#content' + userid + ' .tiny_cursive_table tbody tr:first-child td:nth-child(2)').html(authIcon);\n return true;\n }).fail(function(error) {\n window.console.error(\"Failed to render template:\", error);\n });\n });\n }\n\n checkDiff(userid, fileid, questionid = '', replayInstances = null) {\n const nodata = document.createElement('p');\n nodata.classList.add('tiny_cursive_nopayload', 'bg-light');\n getString('nopaylod', 'tiny_cursive').then(str => {\n nodata.textContent = str;\n return true;\n }).catch(error => window.console.log(error));\n $('body').on('click', '#diff' + userid + questionid, function(e) {\n $('#rep' + userid + questionid).prop('disabled', false);\n $('#quality' + userid + questionid).prop('disabled', false);\n $('#content' + userid).attr('data-label', 'diff');\n $('#player_' + userid + questionid).css({\n 'display': 'none'\n });\n $('#content' + userid).removeClass('tiny_cursive_outputElement').addClass('tiny_cursive').attr('data-label', 'diff');\n e.preventDefault();\n $('#content' + userid).html($('
').addClass('d-flex justify-content-center my-5')\n .append($('
').addClass('tiny_cursive-loader')));\n $('.tiny_cursive-nav-tab').find('.active').removeClass('active');\n $(this).addClass('active');\n if (replayInstances && replayInstances[userid]) {\n replayInstances[userid].stopReplay();\n }\n if (!fileid) {\n $('#content' + userid).html(nodata);\n throw new Error('Missing file id or Difference Content not received yet');\n }\n getContent([{\n methodname: 'cursive_get_writing_differences',\n args: {fileid: fileid},\n }])[0].done(response => {\n let responsedata = JSON.parse(response.data);\n if (responsedata) {\n let submittedText = atob(responsedata.submitted_text);\n\n // Fetch the dynamic strings.\n getStrings([\n {key: 'original_text', component: 'tiny_cursive'},\n {key: 'editspastesai', component: 'tiny_cursive'}\n ]).done(strings => {\n const originalTextString = strings[0];\n const editsPastesAIString = strings[1];\n\n const commentBox = $('
');\n var pasteCountDiv = $('
');\n getString('pastecount', 'tiny_cursive').then(str => {\n pasteCountDiv.append('
' + str + ' : ' + responsedata.commentscount + '
');\n return true;\n }).catch(error => window.console.log(error));\n\n var commentsDiv = $('
');\n getString('comments', 'tiny_cursive').then(str => {\n commentsDiv.append('' + str + '');\n return true;\n }).catch(error => window.console.error(error));\n\n var commentsList = $('
');\n\n let comments = responsedata.comments;\n for (let index in comments) {\n var commentDiv = $(`
`).text(comments[index].usercomment);\n commentsList.append(commentDiv);\n }\n commentBox.append(pasteCountDiv).append(commentsDiv).append(commentsList);\n\n const $legend = $('
');\n\n // Create the first legend item\n const $attributedItem = $('
', {\"class\": \"tiny_cursive-legend-item\"});\n const $attributedBox = $('
', {\"class\": \"tiny_cursive-box attributed\"});\n const $attributedText = $('').text(originalTextString);\n $attributedItem.append($attributedBox).append($attributedText);\n\n // Create the second legend item\n const $unattributedItem = $('
', {\"class\": 'tiny_cursive-legend-item'});\n const $unattributedBox = $('
', {\"class\": 'tiny_cursive-box tiny_cursive_added'});\n const $unattributedText = $('').text(editsPastesAIString);\n $unattributedItem.append($unattributedBox).append($unattributedText);\n\n // Append the legend items to the legend container.\n $legend.append($attributedItem).append($unattributedItem);\n\n let contents = $('
').addClass('tiny_cursive-comparison-content');\n let textBlock2 = $('
').addClass('tiny_cursive-text-block').append(\n $('
').attr('id', 'tiny_cursive-reconstructed_text').html(JSON.parse(submittedText))\n );\n\n contents.append(commentBox, $legend, textBlock2);\n $('#content' + userid).html(contents); // Update content.\n }).fail(error => {\n window.console.error(\"Failed to load language strings:\", error);\n $('#content' + userid).html(nodata);\n });\n } else {\n $('#content' + userid).html(nodata);\n }\n }).fail(error => {\n $('#content' + userid).html(nodata);\n throw new Error('Error loading JSON file: ' + error.message);\n });\n });\n }\n\n replyWriting(userid, filepath, questionid = '', replayInstances = null) {\n $('body').on('click', '#rep' + userid + questionid, function(e) {\n\n if (filepath) {\n $('#replayControls_' + userid + questionid).removeClass('d-none');\n $('#content' + userid).addClass('tiny_cursive_outputElement');\n }\n\n $(this).prop('disabled', true);\n $('#quality' + userid + questionid).prop('disabled', false);\n $('#content' + userid).attr('data-label', 'replay');\n $('#player_' + userid + questionid).css({\n 'display': 'block',\n 'padding-right': '8px'\n });\n e.preventDefault();\n $('#content' + userid).html($('
').addClass('d-flex justify-content-center my-5')\n .append($('
').addClass('tiny_cursive-loader')));\n $('.tiny_cursive-nav-tab').find('.active').removeClass('active');\n $(this).addClass('active'); // Add 'active' class to the clicked element\n if (replayInstances && replayInstances[userid]) {\n replayInstances[userid].stopReplay();\n }\n if (questionid) {\n // eslint-disable-next-line\n video_playback(userid, filepath, questionid);\n } else {\n // eslint-disable-next-line\n video_playback(userid, filepath);\n }\n });\n }\n\n learnMore(moreBtn, context, userid, questionid, replayInstances) {\n $('.tiny_cursive-nav-tab').find('.active').removeClass('active');\n moreBtn.addClass('active');\n $('#rep' + userid + questionid).prop('disabled', false);\n if (replayInstances && replayInstances[userid]) {\n replayInstances[userid].stopReplay();\n }\n $('#content' + userid + questionid).removeClass('tiny_cursive_outputElement');\n $('#replayControls_' + userid + questionid).addClass('d-none');\n template.render('tiny_cursive/learn_more', context).then(function(html) {\n $('#content' + userid + questionid).html(html);\n return true;\n }).fail(function(error) {\n window.console.error(\"Failed to render template:\", error);\n });\n }\n\n formatedTime(data) {\n if (data.total_time_seconds) {\n let totalTimeSeconds = data.total_time_seconds;\n let hours = Math.floor(totalTimeSeconds / 3600).toString().padStart(2, 0);\n let minutes = Math.floor((totalTimeSeconds % 3600) / 60).toString().padStart(2, 0);\n let seconds = (totalTimeSeconds % 60).toString().padStart(2, 0);\n return `${hours}h ${minutes}m ${seconds}s`;\n } else {\n return \"0h 0m 0s\";\n }\n }\n\n authorshipStatus(firstFile, score, scoreSetting) {\n var icon = 'fa fa-circle-o';\n var color = 'font-size:32px;color:black';\n score = parseFloat(score);\n\n if (firstFile) {\n icon = 'fa fa-solid fa-info-circle';\n color = 'font-size:32px;color:#000000';\n } else if (score >= scoreSetting) {\n icon = 'fa fa-check-circle';\n color = 'font-size:32px;color:green';\n }\n if (score < scoreSetting) {\n icon = 'fa fa-question-circle';\n color = 'font-size:32px;color:#A9A9A9';\n return $('').addClass(icon).attr('style', color).attr('title', localStorage.getItem('notenoughtinfo'));\n } else {\n return $('').addClass(icon).attr('style', color);\n }\n\n }\n}\n"],"names":["constructor","then","str","localStorage","setItem","catch","error","window","console","log","createModal","userid","context","questionid","replayInstances","authIcon","self","this","on","e","preventDefault","isReplayButton","find","length","create","templateContext","modal","html","show","setTimeout","removeClass","replayTab","trigger","addClass","moreBtn","prop","css","learnMore","analytics","templates","attr","append","stopReplay","render","fail","checkDiff","fileid","nodata","document","createElement","classList","add","textContent","Error","methodname","args","done","response","responsedata","JSON","parse","data","submittedText","atob","submitted_text","key","component","strings","originalTextString","editsPastesAIString","commentBox","pasteCountDiv","commentscount","commentsDiv","commentsList","comments","index","commentDiv","text","usercomment","$legend","$attributedItem","$attributedBox","$attributedText","$unattributedItem","$unattributedBox","$unattributedText","contents","textBlock2","message","replyWriting","filepath","video_playback","formatedTime","total_time_seconds","totalTimeSeconds","Math","floor","toString","padStart","authorshipStatus","firstFile","score","scoreSetting","icon","color","parseFloat","getItem"],"mappings":"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"} \ No newline at end of file diff --git a/amd/build/analytic_modal.min.js b/amd/build/analytic_modal.min.js index c92c7cce..b0b20b2d 100644 --- a/amd/build/analytic_modal.min.js +++ b/amd/build/analytic_modal.min.js @@ -1,3 +1,10 @@ -define("tiny_cursive/analytic_modal",["exports","core/modal","jquery"],(function(_exports,_modal,_jquery){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _defineProperty(obj,key,value){return key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,obj}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_modal=_interopRequireDefault(_modal),_jquery=_interopRequireDefault(_jquery);class MyModal extends _modal.default{configure(modalConfig){modalConfig.show=!0,modalConfig.removeOnClose=!0,modalConfig.backdrop=!0,super.configure(modalConfig)}show(){super.show();const root=this.getRoot();root.find(".modal-header").remove(),root.find(".modal-content").css({"border-radius":"30px"}).addClass("shadow-none border-none"),root.find(".modal-body").css({padding:"0","border-radius":"30px"}),root.find(".modal-dialog").css({"max-width":"800px","background-color":"transparent"}),root.find("#analytic-close").on("click",(()=>{this.destroy()})),root.on("click",(e=>{(0,_jquery.default)(e.target).hasClass("modal")&&this.destroy()}))}}return _exports.default=MyModal,_defineProperty(MyModal,"TYPE","tiny_cursive/analytics_modal"),_defineProperty(MyModal,"TEMPLATE","tiny_cursive/analytics_modal"),_exports.default})); +define("tiny_cursive/analytic_modal",["exports","core/modal","jquery"],(function(_exports,_modal,_jquery){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +/** + * This module defines a custom modal for analytics. + * + * @module tiny_cursive/analytic_modal + * @copyright 2024 CTI + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_modal=_interopRequireDefault(_modal),_jquery=_interopRequireDefault(_jquery);class MyModal extends _modal.default{static TYPE="tiny_cursive/analytics_modal";static TEMPLATE="tiny_cursive/analytics_modal";configure(modalConfig){modalConfig.show=!0,modalConfig.removeOnClose=!0,modalConfig.backdrop=!0,super.configure(modalConfig)}show(){super.show();const root=this.getRoot();root.find(".modal-header").remove(),root.find(".modal-content").css({"border-radius":"30px"}).addClass("shadow-none border-none"),root.find(".modal-body").css({padding:"0","border-radius":"30px",overflow:"auto","scrollbar-width":"none"}),root.find(".modal-dialog").css({"max-width":"800px","background-color":"transparent"}),root.find("#analytic-close").on("click",(()=>{this.destroy()})),root.on("click",(e=>{(0,_jquery.default)(e.target).hasClass("modal")&&this.destroy()}))}}return _exports.default=MyModal,_exports.default})); //# sourceMappingURL=analytic_modal.min.js.map \ No newline at end of file diff --git a/amd/build/analytic_modal.min.js.map b/amd/build/analytic_modal.min.js.map index 50db093c..068d5e6b 100644 --- a/amd/build/analytic_modal.min.js.map +++ b/amd/build/analytic_modal.min.js.map @@ -1 +1 @@ -{"version":3,"file":"analytic_modal.min.js","sources":["../src/analytic_modal.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module defines a custom modal for analytics.\n *\n * @module tiny_cursive/analytic_modal\n * @copyright 2024 CTI \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Modal from 'core/modal';\nimport $ from 'jquery';\nexport default class MyModal extends Modal {\n static TYPE = \"tiny_cursive/analytics_modal\";\n static TEMPLATE = \"tiny_cursive/analytics_modal\";\n\n configure(modalConfig) {\n // Show this modal on instantiation.\n modalConfig.show = true;\n\n // Remove from the DOM on close.\n modalConfig.removeOnClose = true;\n modalConfig.backdrop = true;\n\n // Call the parent configure method.\n super.configure(modalConfig);\n }\n\n // Override the parent show method to add custom behavior.\n show() {\n super.show();\n\n const root = this.getRoot();\n\n\n // Hide the default modal header.\n root.find('.modal-header').remove();\n\n root.find('.modal-content').css({\n 'border-radius': '30px'\n }).addClass('shadow-none border-none');\n // Remove padding from the modal content.\n root.find('.modal-body').css({\n 'padding': '0',\n 'border-radius': '30px'\n });\n root.find('.modal-dialog').css({\n 'max-width': '800px',\n 'background-color': 'transparent'\n });\n\n // Ensure modal closes on 'analytic-close' button click.\n root.find('#analytic-close').on('click', () => {\n this.destroy();\n });\n\n // Ensure modal closes on backdrop click.\n root.on('click', (e) => {\n if ($(e.target).hasClass('modal')) {\n this.destroy();\n }\n });\n }\n}\n"],"names":["MyModal","Modal","configure","modalConfig","show","removeOnClose","backdrop","root","this","getRoot","find","remove","css","addClass","on","destroy","e","target","hasClass"],"mappings":"ogBAyBqBA,gBAAgBC,eAIjCC,UAAUC,aAENA,YAAYC,MAAO,EAGnBD,YAAYE,eAAgB,EAC5BF,YAAYG,UAAW,QAGjBJ,UAAUC,aAIpBC,aACUA,aAEAG,KAAOC,KAAKC,UAIlBF,KAAKG,KAAK,iBAAiBC,SAE3BJ,KAAKG,KAAK,kBAAkBE,IAAI,iBACX,SAClBC,SAAS,2BAEZN,KAAKG,KAAK,eAAeE,IAAI,SACd,oBACM,SAErBL,KAAKG,KAAK,iBAAiBE,IAAI,aACd,2BACO,gBAIxBL,KAAKG,KAAK,mBAAmBI,GAAG,SAAS,UAChCC,aAITR,KAAKO,GAAG,SAAUE,KACV,mBAAEA,EAAEC,QAAQC,SAAS,eAChBH,8DA/CAf,eACH,gDADGA,mBAEC"} \ No newline at end of file +{"version":3,"file":"analytic_modal.min.js","sources":["../src/analytic_modal.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module defines a custom modal for analytics.\n *\n * @module tiny_cursive/analytic_modal\n * @copyright 2024 CTI \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Modal from 'core/modal';\nimport $ from 'jquery';\nexport default class MyModal extends Modal {\n static TYPE = \"tiny_cursive/analytics_modal\";\n static TEMPLATE = \"tiny_cursive/analytics_modal\";\n\n configure(modalConfig) {\n // Show this modal on instantiation.\n modalConfig.show = true;\n\n // Remove from the DOM on close.\n modalConfig.removeOnClose = true;\n modalConfig.backdrop = true;\n\n // Call the parent configure method.\n super.configure(modalConfig);\n }\n\n // Override the parent show method to add custom behavior.\n show() {\n super.show();\n\n const root = this.getRoot();\n\n\n // Hide the default modal header.\n root.find('.modal-header').remove();\n\n root.find('.modal-content').css({\n 'border-radius': '30px'\n }).addClass('shadow-none border-none');\n // Remove padding from the modal content.\n root.find('.modal-body').css({\n 'padding': '0',\n 'border-radius': '30px',\n 'overflow': 'auto',\n 'scrollbar-width': 'none'\n });\n root.find('.modal-dialog').css({\n 'max-width': '800px',\n 'background-color': 'transparent'\n });\n\n // Ensure modal closes on 'analytic-close' button click.\n root.find('#analytic-close').on('click', () => {\n this.destroy();\n });\n\n // Ensure modal closes on backdrop click.\n root.on('click', (e) => {\n if ($(e.target).hasClass('modal')) {\n this.destroy();\n }\n });\n }\n}\n"],"names":["MyModal","Modal","configure","modalConfig","show","removeOnClose","backdrop","root","this","getRoot","find","remove","css","addClass","on","destroy","e","target","hasClass"],"mappings":";;;;;;;yKAyBqBA,gBAAgBC,2BACnB,+CACI,+BAElBC,UAAUC,aAENA,YAAYC,MAAO,EAGnBD,YAAYE,eAAgB,EAC5BF,YAAYG,UAAW,QAGjBJ,UAAUC,aAIpBC,aACUA,aAEAG,KAAOC,KAAKC,UAIlBF,KAAKG,KAAK,iBAAiBC,SAE3BJ,KAAKG,KAAK,kBAAkBE,IAAI,iBACX,SAClBC,SAAS,2BAEZN,KAAKG,KAAK,eAAeE,IAAI,SACd,oBACM,gBACL,yBACO,SAEvBL,KAAKG,KAAK,iBAAiBE,IAAI,aACd,2BACO,gBAIxBL,KAAKG,KAAK,mBAAmBI,GAAG,SAAS,UAChCC,aAITR,KAAKO,GAAG,SAAUE,KACV,mBAAEA,EAAEC,QAAQC,SAAS,eAChBH"} \ No newline at end of file diff --git a/amd/build/append_fourm_post.min.js b/amd/build/append_fourm_post.min.js index 47afd0e7..ea245724 100644 --- a/amd/build/append_fourm_post.min.js +++ b/amd/build/append_fourm_post.min.js @@ -1,3 +1,3 @@ -define("tiny_cursive/append_fourm_post",["jquery","core/ajax","core/str","core/templates","./replay","./analytic_button","./analytic_events"],(function($,AJAX,str,templates,Replay,analyticButton,AnalyticEvents){const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new Replay("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else templates.render("tiny_cursive/no_submission").then((html=>($("#content"+mid).html(html),!0))).catch((e=>window.console.error(e)));return!1};var usersTable={init:function(scoreSetting,showcomment){str.get_strings([{key:"field_require",component:"tiny_cursive"}]).done((function(){usersTable.getToken(scoreSetting,showcomment)}))},getToken:function(scoreSetting,showcomment){$("#page-mod-forum-discuss").find("article").get().forEach((function(entry){var replyButton=$('a[data-region="post-action"][title="Reply"]');replyButton.length>0&&replyButton.on("click",(function(event){event.preventDefault();var url=$(this).attr("href");window.location.href=url}));var ids=$("#"+entry.id).data("post-id"),cmid=M.cfg.contextInstanceId;let args={id:ids,modulename:"forum",cmid:cmid},com=AJAX.call([{methodname:"cursive_get_forum_comment_link",args:args}]);return com[0].done((function(json){var data=JSON.parse(json),filepath="";if(data.data.filename&&(filepath=data.data.filename),filepath){let analyticButtonDiv=document.createElement("div");analyticButtonDiv.append(analyticButton(ids)),analyticButtonDiv.classList.add("text-center","my-3"),analyticButtonDiv.dataset.region="analytic-div"+ids,"comments"!=data.usercomment&&parseInt(showcomment)&&str.get_string("refer","tiny_cursive").then((str=>{let comments="";return data.usercomment.forEach((element=>{comments+='
'+element.usercomment+"
"})),$("#"+entry.id).find("#post-content-"+ids).prepend($("
").addClass("tiny_cursive-quiz-references rounded mb-2").append(comments)).prepend($("

").append(str)),comments})).catch((error=>{window.console.error(error)})),$("#"+entry.id).find("#post-content-"+ids).prepend(analyticButtonDiv);let myEvents=new AnalyticEvents;var context={tabledata:data.data,formattime:myEvents.formatedTime(data.data),page:scoreSetting,userid:ids};let authIcon=myEvents.authorshipStatus(data.data.first_file,data.data.score,scoreSetting);myEvents.createModal(ids,context,"",authIcon),myEvents.analytics(ids,templates,context,"",replayInstances,authIcon),myEvents.checkDiff(ids,data.data.file_id,"",replayInstances),myEvents.replyWriting(ids,filepath,"",replayInstances),myEvents.quality(ids,templates,context,"",replayInstances,cmid)}})),com.usercomment}))}};return usersTable})); +define("tiny_cursive/append_fourm_post",["jquery","core/ajax","core/str","core/templates","./replay","./analytic_button","./replay_button","./analytic_events"],(function($,AJAX,str,templates,Replay,analyticButton,replayButton,AnalyticEvents){const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new Replay("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else templates.render("tiny_cursive/no_submission").then((html=>($("#content"+mid).html(html),!0))).catch((e=>window.console.error(e)));return!1};var usersTable={init:function(scoreSetting,showcomment,hasApiKey){str.get_strings([{key:"field_require",component:"tiny_cursive"}]).done((function(){usersTable.getToken(scoreSetting,showcomment,hasApiKey)}))},getToken:function(scoreSetting,showcomment,hasApiKey){$("#page-mod-forum-discuss").find("article").get().forEach((function(entry){var replyButton=$('a[data-region="post-action"][title="Reply"]');replyButton.length>0&&replyButton.on("click",(function(event){event.preventDefault();var url=$(this).attr("href");window.location.href=url}));var ids=$("#"+entry.id).data("post-id"),cmid=M.cfg.contextInstanceId;let args={id:ids,modulename:"forum",cmid:cmid},com=AJAX.call([{methodname:"cursive_get_forum_comment_link",args:args}]);return com[0].done((function(json){var data=JSON.parse(json),filepath="";if(data.data.filename&&(filepath=data.data.filename),filepath){let analyticButtonDiv=document.createElement("div");hasApiKey?analyticButtonDiv.append(analyticButton(data.data.effort_ratio,ids)):$(analyticButtonDiv).html(replayButton(ids)),analyticButtonDiv.classList.add("text-center","my-2"),analyticButtonDiv.dataset.region="analytic-div"+ids,$("#"+entry.id).find("#post-content-"+ids).prepend(analyticButtonDiv);let myEvents=new AnalyticEvents;var context={tabledata:data.data,formattime:myEvents.formatedTime(data.data),page:scoreSetting,userid:ids,apikey:hasApiKey};let authIcon=myEvents.authorshipStatus(data.data.first_file,data.data.score,scoreSetting);myEvents.createModal(ids,context,"",replayInstances,authIcon),myEvents.analytics(ids,templates,context,"",replayInstances,authIcon),myEvents.checkDiff(ids,data.data.file_id,"",replayInstances),myEvents.replyWriting(ids,filepath,"",replayInstances)}})),com.usercomment}))}};return usersTable})); //# sourceMappingURL=append_fourm_post.min.js.map \ No newline at end of file diff --git a/amd/build/append_fourm_post.min.js.map b/amd/build/append_fourm_post.min.js.map index 39f2aab9..3f491c81 100644 --- a/amd/build/append_fourm_post.min.js.map +++ b/amd/build/append_fourm_post.min.js.map @@ -1 +1 @@ -{"version":3,"file":"append_fourm_post.min.js","sources":["../src/append_fourm_post.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/append_fourm_post\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\"jquery\", \"core/ajax\", \"core/str\", \"core/templates\", \"./replay\", \"./analytic_button\", \"./analytic_events\"], function(\n $,\n AJAX,\n str,\n templates,\n Replay,\n analyticButton,\n AnalyticEvents\n) {\n const replayInstances = {};\n // eslint-disable-next-line camelcase\n window.video_playback = function(mid, filepath) {\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n return true;\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n\n var usersTable = {\n init: function(scoreSetting, showcomment) {\n str\n .get_strings([\n {key: \"field_require\", component: \"tiny_cursive\"},\n ])\n .done(function() {\n usersTable.getToken(scoreSetting, showcomment);\n });\n },\n getToken: function(scoreSetting, showcomment) {\n $('#page-mod-forum-discuss').find(\"article\").get().forEach(function(entry) {\n var replyButton = $('a[data-region=\"post-action\"][title=\"Reply\"]');\n if (replyButton.length > 0) {\n replyButton.on('click', function(event) {\n event.preventDefault();\n var url = $(this).attr('href');\n window.location.href = url;\n });\n }\n\n var ids = $(\"#\" + entry.id).data(\"post-id\");\n var cmid = M.cfg.contextInstanceId;\n\n let args = {id: ids, modulename: \"forum\", cmid: cmid};\n let methodname = 'cursive_get_forum_comment_link';\n let com = AJAX.call([{methodname, args}]);\n com[0].done(function(json) {\n var data = JSON.parse(json);\n\n var filepath = '';\n if (data.data.filename) {\n filepath = data.data.filename;\n }\n if (filepath) {\n\n let analyticButtonDiv = document.createElement('div');\n analyticButtonDiv.append(analyticButton(ids));\n analyticButtonDiv.classList.add('text-center', 'my-3');\n analyticButtonDiv.dataset.region = \"analytic-div\" + ids;\n\n if (data.usercomment != 'comments' && parseInt(showcomment)) {\n\n str.get_string('refer', 'tiny_cursive').then(str =>{\n let comments = \"\";\n data.usercomment.forEach(element => {\n // Create the anchor element\n comments += '
'\n + element.usercomment + '
';\n });\n\n $(\"#\" + entry.id).find('#post-content-' + ids).prepend($('
')\n .addClass('tiny_cursive-quiz-references rounded mb-2')\n .append(comments)).prepend($('

').append(str));\n return comments;\n }).catch(error => {\n window.console.error(error);\n });\n }\n $(\"#\" + entry.id).find('#post-content-' + ids).prepend(analyticButtonDiv);\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.data,\n formattime: myEvents.formatedTime(data.data),\n page: scoreSetting,\n userid: ids,\n };\n\n let authIcon = myEvents.authorshipStatus(data.data.first_file, data.data.score, scoreSetting);\n myEvents.createModal(ids, context, '', authIcon);\n myEvents.analytics(ids, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(ids, data.data.file_id, '', replayInstances);\n myEvents.replyWriting(ids, filepath, '', replayInstances);\n myEvents.quality(ids, templates, context, '', replayInstances, cmid);\n }\n\n });\n return com.usercomment;\n });\n },\n };\n return usersTable;\n\n\n});"],"names":["define","$","AJAX","str","templates","Replay","analyticButton","AnalyticEvents","replayInstances","window","video_playback","mid","filepath","replay","render","then","html","catch","e","console","error","usersTable","init","scoreSetting","showcomment","get_strings","key","component","done","getToken","find","get","forEach","entry","replyButton","length","on","event","preventDefault","url","this","attr","location","href","ids","id","data","cmid","M","cfg","contextInstanceId","args","modulename","com","call","methodname","json","JSON","parse","filename","analyticButtonDiv","document","createElement","append","classList","add","dataset","region","usercomment","parseInt","get_string","comments","element","prepend","addClass","myEvents","context","tabledata","formattime","formatedTime","page","userid","authIcon","authorshipStatus","first_file","score","createModal","analytics","checkDiff","file_id","replyWriting","quality"],"mappings":"AAsBAA,wCAAO,CAAC,SAAU,YAAa,WAAY,iBAAkB,WAAY,oBAAqB,sBAAsB,SAChHC,EACAC,KACAC,IACAC,UACAC,OACAC,eACAC,sBAEMC,gBAAkB,GAExBC,OAAOC,eAAiB,SAASC,IAAKC,aACjB,KAAbA,SAAiB,OACXC,OAAS,IAAIR,OACf,UAAYM,IACZC,SACA,IACA,EACA,UAAYD,KAEhBH,gBAAgBG,KAAOE,YAEvBT,UAAUU,OAAO,8BAA8BC,MAAKC,OAChDf,EAAE,WAAaU,KAAKK,KAAKA,OAClB,KACRC,OAAMC,GAAKT,OAAOU,QAAQC,MAAMF,YAEhC,OAIPG,WAAa,CACbC,KAAM,SAASC,aAAcC,aACzBrB,IACKsB,YAAY,CACT,CAACC,IAAK,gBAAiBC,UAAW,kBAErCC,MAAK,WACFP,WAAWQ,SAASN,aAAcC,iBAG9CK,SAAU,SAASN,aAAcC,aAC7BvB,EAAE,2BAA2B6B,KAAK,WAAWC,MAAMC,SAAQ,SAASC,WAC5DC,YAAcjC,EAAE,+CAChBiC,YAAYC,OAAS,GACrBD,YAAYE,GAAG,SAAS,SAASC,OAC7BA,MAAMC,qBACFC,IAAMtC,EAAEuC,MAAMC,KAAK,QACvBhC,OAAOiC,SAASC,KAAOJ,WAI3BK,IAAM3C,EAAE,IAAMgC,MAAMY,IAAIC,KAAK,WAC7BC,KAAOC,EAAEC,IAAIC,sBAEbC,KAAO,CAACN,GAAID,IAAKQ,WAAY,QAASL,KAAMA,MAE5CM,IAAMnD,KAAKoD,KAAK,CAAC,CAACC,WADL,iCACiBJ,KAAAA,eAClCE,IAAI,GAAGzB,MAAK,SAAS4B,UACbV,KAAOW,KAAKC,MAAMF,MAElB5C,SAAW,MACXkC,KAAKA,KAAKa,WACV/C,SAAWkC,KAAKA,KAAKa,UAErB/C,SAAU,KAENgD,kBAAoBC,SAASC,cAAc,OAC/CF,kBAAkBG,OAAOzD,eAAesC,MACxCgB,kBAAkBI,UAAUC,IAAI,cAAe,QAC/CL,kBAAkBM,QAAQC,OAAS,eAAiBvB,IAE5B,YAApBE,KAAKsB,aAA6BC,SAAS7C,cAE5CrB,IAAImE,WAAW,QAAS,gBAAgBvD,MAAKZ,UACxCoE,SAAW,UACfzB,KAAKsB,YAAYpC,SAAQwC,UAErBD,UAAY,wEACNC,QAAQJ,YAAc,YAGhCnE,EAAE,IAAMgC,MAAMY,IAAIf,KAAK,iBAAmBc,KAAK6B,QAAQxE,EAAE,SACpDyE,SAAS,6CACDX,OAAOQ,WAAWE,QAAQxE,EAAE,QAAQ8D,OAAO5D,MACjDoE,YACJtD,OAAMG,QACLX,OAAOU,QAAQC,MAAMA,UAG7BnB,EAAE,IAAMgC,MAAMY,IAAIf,KAAK,iBAAmBc,KAAK6B,QAAQb,uBAEnDe,SAAW,IAAIpE,mBACfqE,QAAU,CACVC,UAAW/B,KAAKA,KAChBgC,WAAYH,SAASI,aAAajC,KAAKA,MACvCkC,KAAMzD,aACN0D,OAAQrC,SAGRsC,SAAWP,SAASQ,iBAAiBrC,KAAKA,KAAKsC,WAAYtC,KAAKA,KAAKuC,MAAO9D,cAChFoD,SAASW,YAAY1C,IAAKgC,QAAS,GAAIM,UACvCP,SAASY,UAAU3C,IAAKxC,UAAWwE,QAAS,GAAIpE,gBAAiB0E,UACjEP,SAASa,UAAU5C,IAAKE,KAAKA,KAAK2C,QAAS,GAAIjF,iBAC/CmE,SAASe,aAAa9C,IAAKhC,SAAU,GAAIJ,iBACzCmE,SAASgB,QAAQ/C,IAAKxC,UAAWwE,QAAS,GAAIpE,gBAAiBuC,UAIhEM,IAAIe,wBAIhB/C"} \ No newline at end of file +{"version":3,"file":"append_fourm_post.min.js","sources":["../src/append_fourm_post.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/append_fourm_post\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\"jquery\", \"core/ajax\", \"core/str\", \"core/templates\", \"./replay\", \"./analytic_button\",\n \"./replay_button\", \"./analytic_events\"], function(\n $,\n AJAX,\n str,\n templates,\n Replay,\n analyticButton,\n replayButton,\n AnalyticEvents\n) {\n const replayInstances = {};\n // eslint-disable-next-line camelcase\n window.video_playback = function(mid, filepath) {\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n return true;\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n\n var usersTable = {\n init: function(scoreSetting, showcomment, hasApiKey) {\n str\n .get_strings([\n {key: \"field_require\", component: \"tiny_cursive\"},\n ])\n .done(function() {\n usersTable.getToken(scoreSetting, showcomment, hasApiKey);\n });\n },\n getToken: function(scoreSetting, showcomment, hasApiKey) {\n $('#page-mod-forum-discuss').find(\"article\").get().forEach(function(entry) {\n var replyButton = $('a[data-region=\"post-action\"][title=\"Reply\"]');\n if (replyButton.length > 0) {\n replyButton.on('click', function(event) {\n event.preventDefault();\n var url = $(this).attr('href');\n window.location.href = url;\n });\n }\n\n var ids = $(\"#\" + entry.id).data(\"post-id\");\n var cmid = M.cfg.contextInstanceId;\n\n let args = {id: ids, modulename: \"forum\", cmid: cmid};\n let methodname = 'cursive_get_forum_comment_link';\n let com = AJAX.call([{methodname, args}]);\n com[0].done(function(json) {\n var data = JSON.parse(json);\n\n var filepath = '';\n if (data.data.filename) {\n filepath = data.data.filename;\n }\n if (filepath) {\n\n let analyticButtonDiv = document.createElement('div');\n\n if (!hasApiKey) {\n $(analyticButtonDiv).html(replayButton(ids));\n } else {\n analyticButtonDiv.append(analyticButton(data.data.effort_ratio, ids));\n }\n\n analyticButtonDiv.classList.add('text-center', 'my-2');\n analyticButtonDiv.dataset.region = \"analytic-div\" + ids;\n\n $(\"#\" + entry.id).find('#post-content-' + ids).prepend(analyticButtonDiv);\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.data,\n formattime: myEvents.formatedTime(data.data),\n page: scoreSetting,\n userid: ids,\n apikey: hasApiKey\n };\n\n let authIcon = myEvents.authorshipStatus(data.data.first_file, data.data.score, scoreSetting);\n myEvents.createModal(ids, context, '', replayInstances, authIcon);\n myEvents.analytics(ids, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(ids, data.data.file_id, '', replayInstances);\n myEvents.replyWriting(ids, filepath, '', replayInstances);\n }\n\n });\n return com.usercomment;\n });\n },\n };\n return usersTable;\n\n\n});"],"names":["define","$","AJAX","str","templates","Replay","analyticButton","replayButton","AnalyticEvents","replayInstances","window","video_playback","mid","filepath","replay","render","then","html","catch","e","console","error","usersTable","init","scoreSetting","showcomment","hasApiKey","get_strings","key","component","done","getToken","find","get","forEach","entry","replyButton","length","on","event","preventDefault","url","this","attr","location","href","ids","id","data","cmid","M","cfg","contextInstanceId","args","modulename","com","call","methodname","json","JSON","parse","filename","analyticButtonDiv","document","createElement","append","effort_ratio","classList","add","dataset","region","prepend","myEvents","context","tabledata","formattime","formatedTime","page","userid","apikey","authIcon","authorshipStatus","first_file","score","createModal","analytics","checkDiff","file_id","replyWriting","usercomment"],"mappings":"AAsBAA,wCAAO,CAAC,SAAU,YAAa,WAAY,iBAAkB,WAAY,oBACrE,kBAAmB,sBAAsB,SACzCC,EACAC,KACAC,IACAC,UACAC,OACAC,eACAC,aACAC,sBAEMC,gBAAkB,GAExBC,OAAOC,eAAiB,SAASC,IAAKC,aACjB,KAAbA,SAAiB,OACXC,OAAS,IAAIT,OACf,UAAYO,IACZC,SACA,IACA,EACA,UAAYD,KAEhBH,gBAAgBG,KAAOE,YAEvBV,UAAUW,OAAO,8BAA8BC,MAAKC,OAChDhB,EAAE,WAAaW,KAAKK,KAAKA,OAClB,KACRC,OAAMC,GAAKT,OAAOU,QAAQC,MAAMF,YAEhC,OAIPG,WAAa,CACbC,KAAM,SAASC,aAAcC,YAAaC,WACtCvB,IACKwB,YAAY,CACT,CAACC,IAAK,gBAAiBC,UAAW,kBAErCC,MAAK,WACFR,WAAWS,SAASP,aAAcC,YAAaC,eAG3DK,SAAU,SAASP,aAAcC,YAAaC,WAC1CzB,EAAE,2BAA2B+B,KAAK,WAAWC,MAAMC,SAAQ,SAASC,WAC5DC,YAAcnC,EAAE,+CAChBmC,YAAYC,OAAS,GACrBD,YAAYE,GAAG,SAAS,SAASC,OAC7BA,MAAMC,qBACFC,IAAMxC,EAAEyC,MAAMC,KAAK,QACvBjC,OAAOkC,SAASC,KAAOJ,WAI3BK,IAAM7C,EAAE,IAAMkC,MAAMY,IAAIC,KAAK,WAC7BC,KAAOC,EAAEC,IAAIC,sBAEbC,KAAO,CAACN,GAAID,IAAKQ,WAAY,QAASL,KAAMA,MAE5CM,IAAMrD,KAAKsD,KAAK,CAAC,CAACC,WADL,iCACiBJ,KAAAA,eAClCE,IAAI,GAAGzB,MAAK,SAAS4B,UACbV,KAAOW,KAAKC,MAAMF,MAElB7C,SAAW,MACXmC,KAAKA,KAAKa,WACVhD,SAAWmC,KAAKA,KAAKa,UAErBhD,SAAU,KAENiD,kBAAoBC,SAASC,cAAc,OAE1CtC,UAGDoC,kBAAkBG,OAAO3D,eAAe0C,KAAKA,KAAKkB,aAAcpB,MAFhE7C,EAAE6D,mBAAmB7C,KAAKV,aAAauC,MAK3CgB,kBAAkBK,UAAUC,IAAI,cAAe,QAC/CN,kBAAkBO,QAAQC,OAAS,eAAiBxB,IAEpD7C,EAAE,IAAMkC,MAAMY,IAAIf,KAAK,iBAAmBc,KAAKyB,QAAQT,uBAEnDU,SAAW,IAAIhE,mBACfiE,QAAU,CACVC,UAAW1B,KAAKA,KAChB2B,WAAYH,SAASI,aAAa5B,KAAKA,MACvC6B,KAAMrD,aACNsD,OAAQhC,IACRiC,OAAQrD,eAGRsD,SAAWR,SAASS,iBAAiBjC,KAAKA,KAAKkC,WAAYlC,KAAKA,KAAKmC,MAAO3D,cAChFgD,SAASY,YAAYtC,IAAK2B,QAAS,GAAIhE,gBAAiBuE,UACxDR,SAASa,UAAUvC,IAAK1C,UAAWqE,QAAS,GAAIhE,gBAAiBuE,UACjER,SAASc,UAAUxC,IAAKE,KAAKA,KAAKuC,QAAS,GAAI9E,iBAC/C+D,SAASgB,aAAa1C,IAAKjC,SAAU,GAAIJ,qBAI1C8C,IAAIkC,wBAIhBnE"} \ No newline at end of file diff --git a/amd/build/append_lesson_grade_table.min.js b/amd/build/append_lesson_grade_table.min.js index c9d31119..5f481a66 100644 --- a/amd/build/append_lesson_grade_table.min.js +++ b/amd/build/append_lesson_grade_table.min.js @@ -1,4 +1,4 @@ -define("tiny_cursive/append_lesson_grade_table",["exports","./replay","jquery","core/ajax","core/templates","./analytic_events","./analytic_button","core/str"],(function(_exports,_replay,_jquery,_ajax,_templates,_analytic_events,_analytic_button,Str){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +define("tiny_cursive/append_lesson_grade_table",["exports","./replay","jquery","core/ajax","core/templates","./analytic_events","./analytic_button","./replay_button","core/str"],(function(_exports,_replay,_jquery,_ajax,_templates,_analytic_events,_analytic_button,_replay_button,Str){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} /** * Module to append analytics and grade table data for lesson submissions * Handles the display of analytics, replay functionality and grade information @@ -7,6 +7,6 @@ define("tiny_cursive/append_lesson_grade_table",["exports","./replay","jquery"," * @module tiny_cursive/append_lesson_grade_table * @copyright 2025 CTI * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_replay=_interopRequireDefault(_replay),_jquery=_interopRequireDefault(_jquery),_templates=_interopRequireDefault(_templates),_analytic_events=_interopRequireDefault(_analytic_events),_analytic_button=_interopRequireDefault(_analytic_button),Str=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Str);_exports.init=(scoreSetting,showcomment)=>{const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new _replay.default("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else _templates.default.render("tiny_cursive/no_submission").then((html=>((0,_jquery.default)("#content"+mid).html(html),!0))).catch((e=>window.console.error(e)));return!1};var cmid=M.cfg.contextInstanceId,emailLink=(0,_jquery.default)('#page-content div[role="main"] td.lastcol a'),headcolumn=(0,_jquery.default)('#region-main div[role="main"] table thead tr');Str.get_string("analytics","tiny_cursive").then((strs=>(headcolumn.each((function(){(0,_jquery.default)(this).find("th:eq(1)").after(''.concat(strs,""))})),!0))).catch((e=>window.console.error(e))),emailLink.each((function(){let href=(0,_jquery.default)(this).attr("href");const $emailLink=(0,_jquery.default)(this);let userid=0;if(href)if(userid=parseInt(new URLSearchParams(href.split("?")[1]).get("userid")),userid){let args={id:userid,modulename:"lesson",cmid:cmid},methodname="cursive_get_lesson_submission_data",com=(0,_ajax.call)([{methodname:methodname,args:args}]);com[0].done((function(json){var data=JSON.parse(json),filepath="";data.res.filename&&(filepath=data.res.filename);let analyticButtonDiv=document.createElement("div"),analyticsColumn=document.createElement("td");analyticButtonDiv.append((0,_analytic_button.default)(userid)),analyticButtonDiv.dataset.region="analytic-div"+userid,analyticsColumn.append(analyticButtonDiv),$emailLink.closest("tr").find("td:eq(1)").after(analyticsColumn);let myEvents=new _analytic_events.default;var context={tabledata:data.res,formattime:myEvents.formatedTime(data.res),page:scoreSetting,userid:userid};let authIcon=myEvents.authorshipStatus(data.res.first_file,data.res.score,scoreSetting);myEvents.createModal(userid,context,"",authIcon),myEvents.analytics(userid,_templates.default,context,"",replayInstances,authIcon),myEvents.checkDiff(userid,data.res.file_id,"",replayInstances),myEvents.replyWriting(userid,filepath,"",replayInstances),myEvents.quality(userid,_templates.default,context,"",replayInstances,cmid)})),com[0].fail((error=>{window.console.error("Error getting cursive config:",error)}))}else $emailLink.closest("tr").find("td:eq(1)").after("")}))}})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_replay=_interopRequireDefault(_replay),_jquery=_interopRequireDefault(_jquery),_templates=_interopRequireDefault(_templates),_analytic_events=_interopRequireDefault(_analytic_events),_analytic_button=_interopRequireDefault(_analytic_button),_replay_button=_interopRequireDefault(_replay_button),Str=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Str);_exports.init=(scoreSetting,showcomment,hasApiKey)=>{const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new _replay.default("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else _templates.default.render("tiny_cursive/no_submission").then((html=>((0,_jquery.default)("#content"+mid).html(html),!0))).catch((e=>window.console.error(e)));return!1};var cmid=M.cfg.contextInstanceId,emailLink=(0,_jquery.default)('#page-content div[role="main"] td.lastcol a'),headcolumn=(0,_jquery.default)('#region-main div[role="main"] table thead tr');let url=new URL(window.location.href),mode=url.searchParams.get("mode"),user=url.searchParams.get("user");function analytics(userid,cmid,$emailLink,grade){let args={id:userid,modulename:"lesson",cmid:cmid},com=(0,_ajax.call)([{methodname:"cursive_get_lesson_submission_data",args:args}]);com[0].done((function(json){var data=JSON.parse(json),filepath="";data.res.filename&&(filepath=data.res.filename);let analyticButtonDiv=document.createElement("div"),analyticsColumn=document.createElement("td");hasApiKey?analyticButtonDiv.append((0,_analytic_button.default)(data.res.effort_ratio,userid)):(0,_jquery.default)(analyticButtonDiv).html((0,_replay_button.default)(userid)),analyticButtonDiv.dataset.region="analytic-div"+userid,analyticsColumn.append(analyticButtonDiv),grade?(analyticButtonDiv.classList.add("w-100"),(0,_jquery.default)("#fitem_id_response_editor .felement").prepend(analyticButtonDiv)):$emailLink.closest("tr").find("td:eq(1)").after(analyticsColumn);let myEvents=new _analytic_events.default;var context={tabledata:data.res,formattime:myEvents.formatedTime(data.res),page:scoreSetting,userid:userid,apikey:hasApiKey};let authIcon=myEvents.authorshipStatus(data.res.first_file,data.res.score,scoreSetting);myEvents.createModal(userid,context,"",replayInstances,authIcon),myEvents.analytics(userid,_templates.default,context,"",replayInstances,authIcon),myEvents.checkDiff(userid,data.res.file_id,"",replayInstances),myEvents.replyWriting(userid,filepath,"",replayInstances)})),com[0].fail((error=>{window.console.error("Error getting cursive config:",error)}))}Str.get_string("analytics","tiny_cursive").then((strs=>(headcolumn.each((function(){(0,_jquery.default)(this).find("th:eq(1)").after(`${strs}`)})),!0))).catch((e=>window.console.error(e))),mode&&"grade"===mode&&analytics(user,cmid,"",!0),emailLink.each((function(){let href=(0,_jquery.default)(this).attr("href");const $emailLink=(0,_jquery.default)(this);let userid=0;href&&(userid=parseInt(new URLSearchParams(href.split("?")[1]).get("userid")),userid?((0,_jquery.default)("#region-main").on("click","table tbody tr td.cell.c1 a",(function(e){e.preventDefault();const link=e.target.href,url=new URL(link);url.searchParams.append("user",userid),window.location.href=url.toString()})),analytics(userid,cmid,$emailLink,!1)):$emailLink.closest("tr").find("td:eq(1)").after(""))}))}})); //# sourceMappingURL=append_lesson_grade_table.min.js.map \ No newline at end of file diff --git a/amd/build/append_lesson_grade_table.min.js.map b/amd/build/append_lesson_grade_table.min.js.map index 4df68e94..ac5fede6 100644 --- a/amd/build/append_lesson_grade_table.min.js.map +++ b/amd/build/append_lesson_grade_table.min.js.map @@ -1 +1 @@ -{"version":3,"file":"append_lesson_grade_table.min.js","sources":["../src/append_lesson_grade_table.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module to append analytics and grade table data for lesson submissions\n * Handles the display of analytics, replay functionality and grade information\n * for lesson submissions in the Moodle gradebook interface\n *\n * @module tiny_cursive/append_lesson_grade_table\n * @copyright 2025 CTI \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Replay from './replay';\nimport $ from 'jquery';\nimport {call as getData} from 'core/ajax';\nimport templates from 'core/templates';\nimport AnalyticEvents from './analytic_events';\nimport analyticButton from './analytic_button';\nimport * as Str from 'core/str';\n// eslint-disable-next-line\nexport const init = (scoreSetting, showcomment) => {\n const replayInstances = {};\n // eslint-disable-next-line camelcase\n window.video_playback = function(mid, filepath) {\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n return true;\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n\n\n var cmid = M.cfg.contextInstanceId;\n var emailLink = $('#page-content div[role=\"main\"] td.lastcol a');\n var headcolumn = $('#region-main div[role=\"main\"] table thead tr');\n\n Str.get_string('analytics', 'tiny_cursive').then((strs) => {\n headcolumn.each(function() {\n $(this).find('th:eq(1)').after(`${strs}`);\n });\n return true;\n }).catch(e => window.console.error(e));\n\n emailLink.each(function() {\n let href = $(this).attr('href');\n const $emailLink = $(this);\n let userid = 0;\n if (href) {\n userid = parseInt(new URLSearchParams(href.split('?')[1]).get('userid'));\n if (!userid) {\n $emailLink.closest('tr').find('td:eq(1)').after(\"\"); // For aligning the table column\n } else {\n let args = {id: userid, modulename: \"lesson\", cmid: cmid};\n let methodname = 'cursive_get_lesson_submission_data';\n let com = getData([{methodname, args}]);\n com[0].done(function(json) {\n var data = JSON.parse(json);\n var filepath = '';\n if (data.res.filename) {\n filepath = data.res.filename;\n }\n\n let analyticButtonDiv = document.createElement('div');\n let analyticsColumn = document.createElement('td');\n analyticButtonDiv.append(analyticButton(userid));\n analyticButtonDiv.dataset.region = \"analytic-div\" + userid;\n analyticsColumn.append(analyticButtonDiv);\n\n\n $emailLink.closest('tr').find('td:eq(1)').after(analyticsColumn);\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.res,\n formattime: myEvents.formatedTime(data.res),\n page: scoreSetting,\n userid: userid,\n };\n\n let authIcon = myEvents.authorshipStatus(data.res.first_file, data.res.score, scoreSetting);\n myEvents.createModal(userid, context, '', authIcon);\n myEvents.analytics(userid, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(userid, data.res.file_id, '', replayInstances);\n myEvents.replyWriting(userid, filepath, '', replayInstances);\n myEvents.quality(userid, templates, context, '', replayInstances, cmid);\n\n });\n com[0].fail((error) => {\n window.console.error('Error getting cursive config:', error);\n });\n }\n }\n });\n};"],"names":["scoreSetting","showcomment","replayInstances","window","video_playback","mid","filepath","replay","Replay","render","then","html","catch","e","console","error","cmid","M","cfg","contextInstanceId","emailLink","headcolumn","Str","get_string","strs","each","this","find","after","href","attr","$emailLink","userid","parseInt","URLSearchParams","split","get","args","id","modulename","methodname","com","done","json","data","JSON","parse","res","filename","analyticButtonDiv","document","createElement","analyticsColumn","append","dataset","region","closest","myEvents","AnalyticEvents","context","tabledata","formattime","formatedTime","page","authIcon","authorshipStatus","first_file","score","createModal","analytics","templates","checkDiff","file_id","replyWriting","quality","fail"],"mappings":";;;;;;;;;w+BAiCoB,CAACA,aAAcC,qBACzBC,gBAAkB,GAExBC,OAAOC,eAAiB,SAASC,IAAKC,aACjB,KAAbA,SAAiB,OACXC,OAAS,IAAIC,gBACf,UAAYH,IACZC,SACA,IACA,EACA,UAAYD,KAEhBH,gBAAgBG,KAAOE,+BAEbE,OAAO,8BAA8BC,MAAKC,2BAC9C,WAAaN,KAAKM,KAAKA,OAClB,KACRC,OAAMC,GAAKV,OAAOW,QAAQC,MAAMF,YAEhC,OAKPG,KAAOC,EAAEC,IAAIC,kBACbC,WAAY,mBAAE,+CACdC,YAAa,mBAAE,gDAEnBC,IAAIC,WAAW,YAAa,gBAAgBb,MAAMc,OAC9CH,WAAWI,MAAK,+BACVC,MAAMC,KAAK,YAAYC,mCAA4BJ,mBAElD,KACRZ,OAAMC,GAAKV,OAAOW,QAAQC,MAAMF,KAEnCO,UAAUK,MAAK,eACPI,MAAO,mBAAEH,MAAMI,KAAK,cAClBC,YAAa,mBAAEL,UACjBM,OAAS,KACTH,QACAG,OAASC,SAAS,IAAIC,gBAAgBL,KAAKM,MAAM,KAAK,IAAIC,IAAI,WACzDJ,OAEE,KACCK,KAAO,CAACC,GAAIN,OAAQO,WAAY,SAAUvB,KAAMA,MAChDwB,WAAa,qCACbC,KAAM,cAAQ,CAAC,CAACD,WAAAA,WAAYH,KAAAA,QAChCI,IAAI,GAAGC,MAAK,SAASC,UACbC,KAAOC,KAAKC,MAAMH,MAClBrC,SAAW,GACXsC,KAAKG,IAAIC,WACT1C,SAAWsC,KAAKG,IAAIC,cAGpBC,kBAAoBC,SAASC,cAAc,OAC3CC,gBAAkBF,SAASC,cAAc,MAC7CF,kBAAkBI,QAAO,4BAAerB,SACxCiB,kBAAkBK,QAAQC,OAAS,eAAiBvB,OACpDoB,gBAAgBC,OAAOJ,mBAGvBlB,WAAWyB,QAAQ,MAAM7B,KAAK,YAAYC,MAAMwB,qBAE5CK,SAAW,IAAIC,6BACfC,QAAU,CACVC,UAAWhB,KAAKG,IAChBc,WAAYJ,SAASK,aAAalB,KAAKG,KACvCgB,KAAM/D,aACNgC,OAAQA,YAGRgC,SAAWP,SAASQ,iBAAiBrB,KAAKG,IAAImB,WAAYtB,KAAKG,IAAIoB,MAAOnE,cAC9EyD,SAASW,YAAYpC,OAAQ2B,QAAS,GAAIK,UAC1CP,SAASY,UAAUrC,OAAQsC,mBAAWX,QAAS,GAAIzD,gBAAiB8D,UACpEP,SAASc,UAAUvC,OAAQY,KAAKG,IAAIyB,QAAS,GAAItE,iBACjDuD,SAASgB,aAAazC,OAAQ1B,SAAU,GAAIJ,iBAC5CuD,SAASiB,QAAQ1C,OAAQsC,mBAAWX,QAAS,GAAIzD,gBAAiBc,SAGtEyB,IAAI,GAAGkC,MAAM5D,QACTZ,OAAOW,QAAQC,MAAM,gCAAiCA,eAtC1DgB,WAAWyB,QAAQ,MAAM7B,KAAK,YAAYC,MAAM"} \ No newline at end of file +{"version":3,"file":"append_lesson_grade_table.min.js","sources":["../src/append_lesson_grade_table.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module to append analytics and grade table data for lesson submissions\n * Handles the display of analytics, replay functionality and grade information\n * for lesson submissions in the Moodle gradebook interface\n *\n * @module tiny_cursive/append_lesson_grade_table\n * @copyright 2025 CTI \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Replay from './replay';\nimport $ from 'jquery';\nimport {call as getData} from 'core/ajax';\nimport templates from 'core/templates';\nimport AnalyticEvents from './analytic_events';\nimport analyticButton from './analytic_button';\nimport replayButton from './replay_button';\nimport * as Str from 'core/str';\n\nexport const init = (scoreSetting, showcomment, hasApiKey) => {\n const replayInstances = {};\n // eslint-disable-next-line camelcase\n window.video_playback = function(mid, filepath) {\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n return true;\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n\n\n var cmid = M.cfg.contextInstanceId;\n var emailLink = $('#page-content div[role=\"main\"] td.lastcol a');\n var headcolumn = $('#region-main div[role=\"main\"] table thead tr');\n let url = new URL(window.location.href);\n let mode = url.searchParams.get('mode');\n let user = url.searchParams.get('user');\n\n Str.get_string('analytics', 'tiny_cursive').then((strs) => {\n headcolumn.each(function() {\n $(this).find('th:eq(1)').after(`${strs}`);\n });\n return true;\n }).catch(e => window.console.error(e));\n\n if (mode && mode === \"grade\") {\n analytics(user, cmid, \"\", true);\n }\n\n emailLink.each(function() {\n let href = $(this).attr('href');\n const $emailLink = $(this);\n let userid = 0;\n if (href) {\n userid = parseInt(new URLSearchParams(href.split('?')[1]).get('userid'));\n if (!userid) {\n $emailLink.closest('tr').find('td:eq(1)').after(\"\"); // For aligning the table column\n } else {\n\n $('#region-main').on('click', 'table tbody tr td.cell.c1 a', function(e) {\n e.preventDefault();\n const link = e.target.href;\n const url = new URL(link);\n url.searchParams.append('user', userid);\n window.location.href = url.toString();\n });\n\n analytics(userid, cmid, $emailLink, false);\n }\n }\n });\n\n /**\n * Fetches and displays analytics data for lesson submissions\n * @param {number} userid - The ID of the user whose analytics to fetch\n * @param {number} cmid - The course module ID\n * @param {jQuery|string} $emailLink - jQuery object of email link or empty string\n * @param {boolean} grade - Whether this is being called from grade view\n */\n function analytics(userid, cmid, $emailLink, grade) {\n\n let args = {id: userid, modulename: \"lesson\", cmid: cmid};\n let methodname = 'cursive_get_lesson_submission_data';\n let com = getData([{methodname, args}]);\n com[0].done(function(json) {\n var data = JSON.parse(json);\n var filepath = '';\n if (data.res.filename) {\n filepath = data.res.filename;\n }\n\n let analyticButtonDiv = document.createElement('div');\n let analyticsColumn = document.createElement('td');\n\n if (!hasApiKey) {\n $(analyticButtonDiv).html(replayButton(userid));\n } else {\n analyticButtonDiv.append(analyticButton(data.res.effort_ratio, userid));\n }\n\n analyticButtonDiv.dataset.region = \"analytic-div\" + userid;\n analyticsColumn.append(analyticButtonDiv);\n if (grade) {\n analyticButtonDiv.classList.add('w-100');\n $('#fitem_id_response_editor .felement').prepend(analyticButtonDiv);\n } else {\n $emailLink.closest('tr').find('td:eq(1)').after(analyticsColumn);\n }\n\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.res,\n formattime: myEvents.formatedTime(data.res),\n page: scoreSetting,\n userid: userid,\n apikey: hasApiKey\n };\n\n let authIcon = myEvents.authorshipStatus(data.res.first_file, data.res.score, scoreSetting);\n myEvents.createModal(userid, context, '', replayInstances, authIcon);\n myEvents.analytics(userid, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(userid, data.res.file_id, '', replayInstances);\n myEvents.replyWriting(userid, filepath, '', replayInstances);\n\n });\n com[0].fail((error) => {\n window.console.error('Error getting cursive config:', error);\n });\n }\n};"],"names":["scoreSetting","showcomment","hasApiKey","replayInstances","window","video_playback","mid","filepath","replay","Replay","render","then","html","catch","e","console","error","cmid","M","cfg","contextInstanceId","emailLink","headcolumn","url","URL","location","href","mode","searchParams","get","user","analytics","userid","$emailLink","grade","args","id","modulename","com","methodname","done","json","data","JSON","parse","res","filename","analyticButtonDiv","document","createElement","analyticsColumn","append","effort_ratio","dataset","region","classList","add","prepend","closest","find","after","myEvents","AnalyticEvents","context","tabledata","formattime","formatedTime","page","apikey","authIcon","authorshipStatus","first_file","score","createModal","templates","checkDiff","file_id","replyWriting","fail","Str","get_string","strs","each","this","attr","parseInt","URLSearchParams","split","on","preventDefault","link","target","toString"],"mappings":"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"} \ No newline at end of file diff --git a/amd/build/append_oublogs_post.min.js b/amd/build/append_oublogs_post.min.js index 405e7d31..cdce64ba 100644 --- a/amd/build/append_oublogs_post.min.js +++ b/amd/build/append_oublogs_post.min.js @@ -1,4 +1,4 @@ -define("tiny_cursive/append_oublogs_post",["exports","jquery","core/ajax","core/templates","./analytic_events","./analytic_button","./replay"],(function(_exports,_jquery,_ajax,_templates,_analytic_events,_analytic_button,_replay){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +define("tiny_cursive/append_oublogs_post",["exports","jquery","core/ajax","core/templates","./analytic_events","./analytic_button","./replay_button","./replay"],(function(_exports,_jquery,_ajax,_templates,_analytic_events,_analytic_button,_replay_button,_replay){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} /** * This module provides functionality to append blog posts in the OU Blogs plugin for TinyMCE editor * @@ -6,6 +6,6 @@ define("tiny_cursive/append_oublogs_post",["exports","jquery","core/ajax","core/ * @copyright 2025 CTI * @author Brain Station 23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_jquery=_interopRequireDefault(_jquery),_templates=_interopRequireDefault(_templates),_analytic_events=_interopRequireDefault(_analytic_events),_analytic_button=_interopRequireDefault(_analytic_button),_replay=_interopRequireDefault(_replay);_exports.init=scoreSetting=>{const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new _replay.default("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else _templates.default.render("tiny_cursive/no_submission").then((html=>((0,_jquery.default)("#content"+mid).html(html),!0))).catch((e=>window.console.error(e)));return!1};const ouBlogPosts=(0,_jquery.default)(".oublog-post"),cmid=M.cfg.contextInstanceId;ouBlogPosts.each((function(){var Element=(0,_jquery.default)(this),postedByLink=Element.find(".oublog-postedby a").attr("href"),permalink=Element.find(".oublog-post-links a").attr("href"),resourceId=parseInt(new URLSearchParams(permalink.split("?")[1]).get("post")),userid=parseInt(new URLSearchParams(postedByLink.split("?")[1]).get("id")),filepath="";if(userid&&resourceId){let args={id:userid,resourceid:resourceId,modulename:"oublog",cmid:cmid},methodname="cursive_get_oublog_submission_data",com=(0,_ajax.call)([{methodname:methodname,args:args}]);com[0].done((function(json){var data=JSON.parse(json);data.res.filename&&(filepath=data.res.filename),Element.find(".oublog-post-links").append((0,_analytic_button.default)(userid));let myEvents=new _analytic_events.default;var context={tabledata:data.res,formattime:myEvents.formatedTime(data.res),page:scoreSetting,userid:userid};let authIcon=myEvents.authorshipStatus(data.res.first_file,data.res.score,scoreSetting);myEvents.createModal(userid,context,"",authIcon),myEvents.analytics(userid,_templates.default,context,"",replayInstances,authIcon),myEvents.checkDiff(userid,data.res.file_id,"",replayInstances),myEvents.replyWriting(userid,filepath,"",replayInstances),myEvents.quality(userid,_templates.default,context,"",replayInstances,cmid)})),com[0].fail((error=>{window.console.error(error)}))}}))}})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_jquery=_interopRequireDefault(_jquery),_templates=_interopRequireDefault(_templates),_analytic_events=_interopRequireDefault(_analytic_events),_analytic_button=_interopRequireDefault(_analytic_button),_replay_button=_interopRequireDefault(_replay_button),_replay=_interopRequireDefault(_replay);_exports.init=(scoreSetting,comments,hasApiKey)=>{const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new _replay.default("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else _templates.default.render("tiny_cursive/no_submission").then((html=>((0,_jquery.default)("#content"+mid).html(html),!0))).catch((e=>window.console.error(e)));return!1};const ouBlogPosts=(0,_jquery.default)(".oublog-post"),cmid=M.cfg.contextInstanceId;ouBlogPosts.each((function(){var Element=(0,_jquery.default)(this),postedByLink=Element.find(".oublog-postedby a").attr("href"),permalink=Element.find(".oublog-post-links a").attr("href"),resourceId=parseInt(new URLSearchParams(permalink.split("?")[1]).get("post")),userid=parseInt(new URLSearchParams(postedByLink.split("?")[1]).get("id")),filepath="";if(userid&&resourceId){let args={id:userid,resourceid:resourceId,modulename:"oublog",cmid:cmid},methodname="cursive_get_oublog_submission_data",com=(0,_ajax.call)([{methodname:methodname,args:args}]);com[0].done((function(json){var data=JSON.parse(json);data.res.filename&&(filepath=data.res.filename),hasApiKey?Element.find(".oublog-post-links").append((0,_analytic_button.default)(data.res.effort_ratio,userid)):Element.find(".oublog-post-links").append((0,_replay_button.default)(userid));let myEvents=new _analytic_events.default;var context={tabledata:data.res,formattime:myEvents.formatedTime(data.res),page:scoreSetting,userid:userid,apikey:hasApiKey};let authIcon=myEvents.authorshipStatus(data.res.first_file,data.res.score,scoreSetting);myEvents.createModal(userid,context,"",replayInstances,authIcon),myEvents.analytics(userid,_templates.default,context,"",replayInstances,authIcon),myEvents.checkDiff(userid,data.res.file_id,"",replayInstances),myEvents.replyWriting(userid,filepath,"",replayInstances)})),com[0].fail((error=>{window.console.error(error)}))}}))}})); //# sourceMappingURL=append_oublogs_post.min.js.map \ No newline at end of file diff --git a/amd/build/append_oublogs_post.min.js.map b/amd/build/append_oublogs_post.min.js.map index 0d34fe8c..443769ab 100644 --- a/amd/build/append_oublogs_post.min.js.map +++ b/amd/build/append_oublogs_post.min.js.map @@ -1 +1 @@ -{"version":3,"file":"append_oublogs_post.min.js","sources":["../src/append_oublogs_post.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module provides functionality to append blog posts in the OU Blogs plugin for TinyMCE editor\n *\n * @module tiny_cursive/append_oublogs_post\n * @copyright 2025 CTI \n * @author Brain Station 23 \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport {call as getData} from 'core/ajax';\nimport templates from 'core/templates';\nimport AnalyticEvents from './analytic_events';\nimport analyticButton from './analytic_button';\nimport Replay from './replay';\n\nexport const init = (scoreSetting) => {\n const replayInstances = {};\n // eslint-disable-next-line camelcase\n window.video_playback = function(mid, filepath) {\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n return true;\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n\n const ouBlogPosts = $('.oublog-post');\n const cmid = M.cfg.contextInstanceId;\n ouBlogPosts.each(function() {\n\n var Element = $(this);\n var postedByLink = Element.find('.oublog-postedby a').attr('href');\n var permalink = Element.find('.oublog-post-links a').attr('href');\n var resourceId = parseInt(new URLSearchParams(permalink.split('?')[1]).get('post'));\n var userid = parseInt(new URLSearchParams(postedByLink.split('?')[1]).get('id'));\n var filepath = '';\n\n if (userid && resourceId) {\n let args = {id: userid, resourceid: resourceId, modulename: \"oublog\", cmid: cmid};\n let methodname = 'cursive_get_oublog_submission_data';\n let com = getData([{methodname, args}]);\n com[0].done(function(json) {\n var data = JSON.parse(json);\n\n if (data.res.filename) {\n filepath = data.res.filename;\n }\n\n Element.find('.oublog-post-links').append(analyticButton(userid));\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.res,\n formattime: myEvents.formatedTime(data.res),\n page: scoreSetting,\n userid: userid,\n };\n\n let authIcon = myEvents.authorshipStatus(data.res.first_file, data.res.score, scoreSetting);\n myEvents.createModal(userid, context, '', authIcon);\n myEvents.analytics(userid, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(userid, data.res.file_id, '', replayInstances);\n myEvents.replyWriting(userid, filepath, '', replayInstances);\n myEvents.quality(userid, templates, context, '', replayInstances, cmid);\n\n });\n com[0].fail((error) => {\n window.console.error(error);\n });\n }\n });\n\n};"],"names":["scoreSetting","replayInstances","window","video_playback","mid","filepath","replay","Replay","render","then","html","catch","e","console","error","ouBlogPosts","cmid","M","cfg","contextInstanceId","each","Element","this","postedByLink","find","attr","permalink","resourceId","parseInt","URLSearchParams","split","get","userid","args","id","resourceid","modulename","methodname","com","done","json","data","JSON","parse","res","filename","append","myEvents","AnalyticEvents","context","tabledata","formattime","formatedTime","page","authIcon","authorshipStatus","first_file","score","createModal","analytics","templates","checkDiff","file_id","replyWriting","quality","fail"],"mappings":";;;;;;;;kVA+BqBA,qBACXC,gBAAkB,GAExBC,OAAOC,eAAiB,SAASC,IAAKC,aACjB,KAAbA,SAAiB,OACXC,OAAS,IAAIC,gBACf,UAAYH,IACZC,SACA,IACA,EACA,UAAYD,KAEhBH,gBAAgBG,KAAOE,+BAEbE,OAAO,8BAA8BC,MAAKC,2BAC9C,WAAaN,KAAKM,KAAKA,OAClB,KACRC,OAAMC,GAAKV,OAAOW,QAAQC,MAAMF,YAEhC,SAILG,aAAc,mBAAE,gBAChBC,KAAOC,EAAEC,IAAIC,kBACnBJ,YAAYK,MAAK,eAETC,SAAU,mBAAEC,MACZC,aAAeF,QAAQG,KAAK,sBAAsBC,KAAK,QACvDC,UAAYL,QAAQG,KAAK,wBAAwBC,KAAK,QACtDE,WAAaC,SAAS,IAAIC,gBAAgBH,UAAUI,MAAM,KAAK,IAAIC,IAAI,SACvEC,OAASJ,SAAS,IAAIC,gBAAgBN,aAAaO,MAAM,KAAK,IAAIC,IAAI,OACtE1B,SAAW,MAEX2B,QAAUL,WAAY,KAClBM,KAAO,CAACC,GAAIF,OAAQG,WAAYR,WAAYS,WAAY,SAAUpB,KAAMA,MACxEqB,WAAa,qCACbC,KAAM,cAAQ,CAAC,CAACD,WAAAA,WAAYJ,KAAAA,QAChCK,IAAI,GAAGC,MAAK,SAASC,UACbC,KAAOC,KAAKC,MAAMH,MAElBC,KAAKG,IAAIC,WACTxC,SAAWoC,KAAKG,IAAIC,UAGxBxB,QAAQG,KAAK,sBAAsBsB,QAAO,4BAAed,aAErDe,SAAW,IAAIC,6BACfC,QAAU,CACVC,UAAWT,KAAKG,IAChBO,WAAYJ,SAASK,aAAaX,KAAKG,KACvCS,KAAMrD,aACNgC,OAAQA,YAGRsB,SAAWP,SAASQ,iBAAiBd,KAAKG,IAAIY,WAAYf,KAAKG,IAAIa,MAAOzD,cAC9E+C,SAASW,YAAY1B,OAAQiB,QAAS,GAAIK,UAC1CP,SAASY,UAAU3B,OAAQ4B,mBAAWX,QAAS,GAAIhD,gBAAiBqD,UACpEP,SAASc,UAAU7B,OAAQS,KAAKG,IAAIkB,QAAS,GAAI7D,iBACjD8C,SAASgB,aAAa/B,OAAQ3B,SAAU,GAAIJ,iBAC5C8C,SAASiB,QAAQhC,OAAQ4B,mBAAWX,QAAS,GAAIhD,gBAAiBe,SAGtEsB,IAAI,GAAG2B,MAAMnD,QACTZ,OAAOW,QAAQC,MAAMA"} \ No newline at end of file +{"version":3,"file":"append_oublogs_post.min.js","sources":["../src/append_oublogs_post.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module provides functionality to append blog posts in the OU Blogs plugin for TinyMCE editor\n *\n * @module tiny_cursive/append_oublogs_post\n * @copyright 2025 CTI \n * @author Brain Station 23 \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport {call as getData} from 'core/ajax';\nimport templates from 'core/templates';\nimport AnalyticEvents from './analytic_events';\nimport analyticButton from './analytic_button';\nimport replayButton from './replay_button';\nimport Replay from './replay';\n\nexport const init = (scoreSetting, comments, hasApiKey) => {\n const replayInstances = {};\n // eslint-disable-next-line camelcase\n window.video_playback = function(mid, filepath) {\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n return true;\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n\n const ouBlogPosts = $('.oublog-post');\n const cmid = M.cfg.contextInstanceId;\n ouBlogPosts.each(function() {\n\n var Element = $(this);\n var postedByLink = Element.find('.oublog-postedby a').attr('href');\n var permalink = Element.find('.oublog-post-links a').attr('href');\n var resourceId = parseInt(new URLSearchParams(permalink.split('?')[1]).get('post'));\n var userid = parseInt(new URLSearchParams(postedByLink.split('?')[1]).get('id'));\n var filepath = '';\n\n if (userid && resourceId) {\n let args = {id: userid, resourceid: resourceId, modulename: \"oublog\", cmid: cmid};\n let methodname = 'cursive_get_oublog_submission_data';\n let com = getData([{methodname, args}]);\n com[0].done(function(json) {\n var data = JSON.parse(json);\n\n if (data.res.filename) {\n filepath = data.res.filename;\n }\n\n if (!hasApiKey) {\n Element.find('.oublog-post-links').append(replayButton(userid));\n } else {\n Element.find('.oublog-post-links').append(analyticButton(data.res.effort_ratio, userid));\n }\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.res,\n formattime: myEvents.formatedTime(data.res),\n page: scoreSetting,\n userid: userid,\n apikey: hasApiKey\n };\n\n let authIcon = myEvents.authorshipStatus(data.res.first_file, data.res.score, scoreSetting);\n myEvents.createModal(userid, context, '', replayInstances, authIcon);\n myEvents.analytics(userid, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(userid, data.res.file_id, '', replayInstances);\n myEvents.replyWriting(userid, filepath, '', replayInstances);\n\n });\n com[0].fail((error) => {\n window.console.error(error);\n });\n }\n });\n\n};"],"names":["scoreSetting","comments","hasApiKey","replayInstances","window","video_playback","mid","filepath","replay","Replay","render","then","html","catch","e","console","error","ouBlogPosts","cmid","M","cfg","contextInstanceId","each","Element","this","postedByLink","find","attr","permalink","resourceId","parseInt","URLSearchParams","split","get","userid","args","id","resourceid","modulename","methodname","com","done","json","data","JSON","parse","res","filename","append","effort_ratio","myEvents","AnalyticEvents","context","tabledata","formattime","formatedTime","page","apikey","authIcon","authorshipStatus","first_file","score","createModal","analytics","templates","checkDiff","file_id","replyWriting","fail"],"mappings":";;;;;;;;wYAgCoB,CAACA,aAAcC,SAAUC,mBACnCC,gBAAkB,GAExBC,OAAOC,eAAiB,SAASC,IAAKC,aACjB,KAAbA,SAAiB,OACXC,OAAS,IAAIC,gBACf,UAAYH,IACZC,SACA,IACA,EACA,UAAYD,KAEhBH,gBAAgBG,KAAOE,+BAEbE,OAAO,8BAA8BC,MAAKC,2BAC9C,WAAaN,KAAKM,KAAKA,OAClB,KACRC,OAAMC,GAAKV,OAAOW,QAAQC,MAAMF,YAEhC,SAILG,aAAc,mBAAE,gBAChBC,KAAOC,EAAEC,IAAIC,kBACnBJ,YAAYK,MAAK,eAETC,SAAU,mBAAEC,MACZC,aAAeF,QAAQG,KAAK,sBAAsBC,KAAK,QACvDC,UAAYL,QAAQG,KAAK,wBAAwBC,KAAK,QACtDE,WAAaC,SAAS,IAAIC,gBAAgBH,UAAUI,MAAM,KAAK,IAAIC,IAAI,SACvEC,OAASJ,SAAS,IAAIC,gBAAgBN,aAAaO,MAAM,KAAK,IAAIC,IAAI,OACtE1B,SAAW,MAEX2B,QAAUL,WAAY,KAClBM,KAAO,CAACC,GAAIF,OAAQG,WAAYR,WAAYS,WAAY,SAAUpB,KAAMA,MACxEqB,WAAa,qCACbC,KAAM,cAAQ,CAAC,CAACD,WAAAA,WAAYJ,KAAAA,QAChCK,IAAI,GAAGC,MAAK,SAASC,UACbC,KAAOC,KAAKC,MAAMH,MAElBC,KAAKG,IAAIC,WACTxC,SAAWoC,KAAKG,IAAIC,UAGnB7C,UAGDqB,QAAQG,KAAK,sBAAsBsB,QAAO,4BAAeL,KAAKG,IAAIG,aAAcf,SAFhFX,QAAQG,KAAK,sBAAsBsB,QAAO,0BAAad,aAKvDgB,SAAW,IAAIC,6BACfC,QAAU,CACVC,UAAWV,KAAKG,IAChBQ,WAAYJ,SAASK,aAAaZ,KAAKG,KACvCU,KAAMxD,aACNkC,OAAQA,OACRuB,OAAQvD,eAGRwD,SAAWR,SAASS,iBAAiBhB,KAAKG,IAAIc,WAAYjB,KAAKG,IAAIe,MAAO7D,cAC9EkD,SAASY,YAAY5B,OAAQkB,QAAS,GAAIjD,gBAAiBuD,UAC3DR,SAASa,UAAU7B,OAAQ8B,mBAAWZ,QAAS,GAAIjD,gBAAiBuD,UACpER,SAASe,UAAU/B,OAAQS,KAAKG,IAAIoB,QAAS,GAAI/D,iBACjD+C,SAASiB,aAAajC,OAAQ3B,SAAU,GAAIJ,oBAGhDqC,IAAI,GAAG4B,MAAMpD,QACTZ,OAAOW,QAAQC,MAAMA"} \ No newline at end of file diff --git a/amd/build/append_pdfannotator.min.js b/amd/build/append_pdfannotator.min.js new file mode 100644 index 00000000..c1578298 --- /dev/null +++ b/amd/build/append_pdfannotator.min.js @@ -0,0 +1,10 @@ +define("tiny_cursive/append_pdfannotator",["exports","core/ajax","tiny_cursive/analytic_button","tiny_cursive/replay_button","tiny_cursive/analytic_events","core/templates","tiny_cursive/replay"],(function(_exports,_ajax,_analytic_button,_replay_button,_analytic_events,_templates,_replay){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +/** + * Module for handling PDF annotator functionality, + * + * @module tiny_cursive/append_pdfannotator + * @copyright 2025 Cursive Technology, Inc. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_analytic_button=_interopRequireDefault(_analytic_button),_replay_button=_interopRequireDefault(_replay_button),_analytic_events=_interopRequireDefault(_analytic_events),_templates=_interopRequireDefault(_templates),_replay=_interopRequireDefault(_replay);_exports.init=(scoreSetting,comments,hasApiKey,userid)=>{const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new _replay.default("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else _templates.default.render("tiny_cursive/no_submission").then((html=>(document.getElementById("content"+mid).innerHTML=html,!0))).catch((e=>window.console.error(e)));return!1};let container=document.querySelector(".comment-list-container");const overviewTable=document.querySelector('table[id^="mod-pdfannotator-"]');document.addEventListener("click",(function(e){"commentSubmit"===e.target.id&&(localStorage.removeItem("isEditing"),buttonElement=e.target.value,pendingSubmit=!0);"commentCancel"===e.target.id&&(localStorage.removeItem("isEditing"),pendingSubmit=!1)}));const moduleName=document.body.id.split("-")[2];var pendingSubmit=!1,buttonElement="";if(container){new MutationObserver((()=>{var _container$lastChild;null!=container&&null!==(_container$lastChild=container.lastChild)&&void 0!==_container$lastChild&&_container$lastChild.id&&function(id){if("Save"===buttonElement)return void(pendingSubmit=!1);let resourceId=parseInt(null==id?void 0:id.split("_")[1]);if(resourceId&&pendingSubmit){pendingSubmit=!1,(async(methodname,args)=>{try{await(0,_ajax.call)([{methodname:methodname,args:args}])[0]}catch(error){throw window.console.error("updating Entries:",error),error}})("cursive_update_pdf_annote_id",{cmid:M.cfg.contextInstanceId,userid:M.cfg.userId??0,courseid:M.cfg.courseId,modulename:moduleName,resourceid:resourceId})}}(container.lastChild.id)})).observe(container,{subtree:!0,childList:!0})}if(overviewTable){let newChild=document.createElement("th");newChild.textContent="Analytics",overviewTable.querySelector("thead>tr>th:first-child").insertAdjacentElement("afterend",newChild),function(overviewTable){const rows=overviewTable.querySelectorAll("tbody > tr"),action=new URL(window.location.href).searchParams.get("action");rows.forEach((row=>{var _cols$col,_cols$col2,_cols$col3,_links$link,_links$link2,_userLink;const cols={col1:row.querySelector("td:nth-child(1)"),col2:row.querySelector("td:nth-child(2)"),col3:row.querySelector("td:nth-child(3)")},links={link1:null===(_cols$col=cols.col1)||void 0===_cols$col?void 0:_cols$col.querySelector("a"),link2:null===(_cols$col2=cols.col2)||void 0===_cols$col2?void 0:_cols$col2.querySelector("a"),link3:null===(_cols$col3=cols.col3)||void 0===_cols$col3?void 0:_cols$col3.querySelector("a")},commentId=null!==(_links$link=links.link1)&&void 0!==_links$link&&_links$link.href?new URL(links.link1.href).searchParams.get("commid"):null,cmid=null!==(_links$link2=links.link1)&&void 0!==_links$link2&&_links$link2.href?new URL(links.link1.href).searchParams.get("id"):M.cfg.contextInstanceId;let userId=null,userLink=null;switch(action){case"overviewquestions":userLink=links.link2;break;case"overviewanswers":userLink=links.link3;break;default:userId=userid}if(null!==(_userLink=userLink)&&void 0!==_userLink&&_userLink.href)try{userId=new URL(userLink.href).searchParams.get("id")}catch(e){window.console.warn("Error parsing user URL:",e)}!function(userid,resourceid,cmid,place){let args={id:resourceid,modulename:"pdfannotator",cmid:cmid},methodname="cursive_get_forum_comment_link",com=(0,_ajax.call)([{methodname:methodname,args:args}]);com[0].done((function(json){var data=JSON.parse(json),filepath="";data.data.filename&&(filepath=data.data.filename);let analyticButtonDiv=document.createElement("div"),analyticsColumn=document.createElement("td");hasApiKey?analyticButtonDiv.append((0,_analytic_button.default)(data.data.effort_ratio,resourceid)):analyticButtonDiv.append((0,_replay_button.default)(resourceid)),analyticButtonDiv.dataset.region="analytic-div"+userid,analyticsColumn.append(analyticButtonDiv),place.insertAdjacentElement("afterend",analyticsColumn);let myEvents=new _analytic_events.default;var context={tabledata:data.data,formattime:myEvents.formatedTime(data.data),page:scoreSetting,userid:resourceid,apikey:hasApiKey};let authIcon=myEvents.authorshipStatus(data.data.first_file,data.data.score,scoreSetting);myEvents.createModal(resourceid,context,"",replayInstances,authIcon),myEvents.analytics(resourceid,_templates.default,context,"",replayInstances,authIcon),myEvents.checkDiff(resourceid,data.data.file_id,"",replayInstances),myEvents.replyWriting(resourceid,filepath,"",replayInstances)})),com[0].fail((error=>{window.console.error("Error getting cursive config:",error)}))}(userId,commentId,cmid,cols.col1)}))}(overviewTable)}}})); + +//# sourceMappingURL=append_pdfannotator.min.js.map \ No newline at end of file diff --git a/amd/build/append_pdfannotator.min.js.map b/amd/build/append_pdfannotator.min.js.map new file mode 100644 index 00000000..efbbc64c --- /dev/null +++ b/amd/build/append_pdfannotator.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"append_pdfannotator.min.js","sources":["../src/append_pdfannotator.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module for handling PDF annotator functionality,\n *\n * @module tiny_cursive/append_pdfannotator\n * @copyright 2025 Cursive Technology, Inc. \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {call} from 'core/ajax';\nimport analyticButton from 'tiny_cursive/analytic_button';\nimport replayButton from 'tiny_cursive/replay_button';\nimport AnalyticEvents from 'tiny_cursive/analytic_events';\nimport templates from 'core/templates';\nimport Replay from 'tiny_cursive/replay';\nexport const init = (scoreSetting, comments, hasApiKey, userid) => {\n const replayInstances = {};\n // eslint-disable-next-line camelcase\n window.video_playback = function(mid, filepath) {\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n templates.render('tiny_cursive/no_submission').then(html => {\n document.getElementById('content' + mid).innerHTML = html;\n return true;\n }).catch(e => window.console.error(e));\n }\n return false;\n };\n\n let container = document.querySelector('.comment-list-container');\n const overviewTable = document.querySelector('table[id^=\"mod-pdfannotator-\"]');\n\n document.addEventListener('click', handleSubmit);\n const moduleName = document.body.id.split('-')[2];\n var pendingSubmit = false;\n var buttonElement = \"\";\n\n if (container) {\n const observer = new MutationObserver(() => {\n if (container?.lastChild?.id) {\n extractResourceId(container.lastChild.id);\n }\n });\n\n observer.observe(container, {\n subtree: true,\n childList: true\n });\n }\n\n if (overviewTable) {\n let newChild = document.createElement('th');\n newChild.textContent = 'Analytics';\n let header = overviewTable.querySelector('thead>tr>th:first-child');\n header.insertAdjacentElement('afterend', newChild);\n setReplayButton(overviewTable);\n }\n\n /**\n * Sets up replay buttons and analytics for each row in the overview table\n * @param {HTMLTableElement} overviewTable - The table element containing the overview data\n * @description This function:\n * 1. Gets all rows from the table\n * 2. For each row:\n * - Extracts comment ID and user ID from relevant links\n * - Adds analytics column with replay/analytics buttons\n * - Sets up cursive analytics functionality\n */\n function setReplayButton(overviewTable) {\n const rows = overviewTable.querySelectorAll('tbody > tr');\n const action = new URL(window.location.href).searchParams.get('action');\n\n rows.forEach(row => {\n const cols = {\n col1: row.querySelector('td:nth-child(1)'),\n col2: row.querySelector('td:nth-child(2)'),\n col3: row.querySelector('td:nth-child(3)')\n };\n\n const links = {\n link1: cols.col1?.querySelector('a'),\n link2: cols.col2?.querySelector('a'),\n link3: cols.col3?.querySelector('a')\n };\n\n // Extract comment ID safely\n const commentId = links.link1?.href ?\n new URL(links.link1.href).searchParams.get('commid') : null;\n const cmid = links.link1?.href ?\n new URL(links.link1.href).searchParams.get('id') : M.cfg.contextInstanceId;\n // Extract user ID based on action\n let userId = null;\n let userLink = null;\n\n switch (action) {\n case 'overviewquestions':\n userLink = links.link2;\n break;\n case 'overviewanswers':\n userLink = links.link3;\n break;\n default:\n userId = userid;\n }\n\n if (userLink?.href) {\n try {\n userId = new URL(userLink.href).searchParams.get('id');\n } catch (e) {\n window.console.warn('Error parsing user URL:', e);\n }\n }\n\n getCursiveAnalytics(userId, commentId, cmid, cols.col1);\n });\n }\n\n /**\n * Handles the submission and cancellation of comments\n * @param {Event} e - The click event object\n * @description When comment is submitted or cancelled:\n * - Removes 'isEditing' flag from localStorage\n * - Sets pendingSubmit flag appropriately (true for submit, false for cancel)\n */\n function handleSubmit(e) {\n if (e.target.id === 'commentSubmit') {\n localStorage.removeItem('isEditing');\n buttonElement = e.target.value;\n pendingSubmit = true;\n }\n if (e.target.id === 'commentCancel') {\n localStorage.removeItem('isEditing');\n pendingSubmit = false;\n }\n }\n\n const updateEntries = async(methodname, args) => {\n try {\n const response = await call([{\n methodname,\n args,\n }])[0];\n return response;\n } catch (error) {\n window.console.error('updating Entries:', error);\n throw error;\n }\n };\n\n /**\n * Extracts the resource ID from a comment ID and updates entries if submission is pending\n * @param {string} id - The ID string to extract resource ID from, expected format: 'prefix_number'\n * @description This function:\n * 1. Parses the resource ID from the given ID string\n * 2. If resource ID exists and there's a pending submission:\n * - Resets the pending submission flag\n * - Constructs arguments with context info\n * - Calls updateEntries to process the PDF annotation\n */\n function extractResourceId(id) {\n\n // Prevent updating ID while editing a existing entry.\n if (buttonElement === 'Save') {\n\n pendingSubmit = false;\n return;\n }\n\n let resourceId = parseInt(id?.split('_')[1]);\n if (resourceId && pendingSubmit) {\n pendingSubmit = false;\n let args = {\n cmid: M.cfg.contextInstanceId,\n userid: M.cfg.userId ?? 0,\n courseid: M.cfg.courseId,\n modulename: moduleName,\n resourceid: resourceId\n };\n updateEntries('cursive_update_pdf_annote_id', args);\n }\n }\n\n /**\n * Retrieves and displays cursive analytics for a given resource\n * @param {number} userid - The ID of the user\n * @param {number} resourceid - The ID of the resource to get analytics for\n * @param {number} cmid - The course module ID\n * @param {HTMLElement} place - The DOM element where analytics should be placed\n * @description This function:\n * 1. Makes an AJAX call to get forum comment data\n * 2. Creates and inserts analytics/replay buttons\n * 3. Sets up analytics events and modal functionality\n * 4. Handles both API key and non-API key scenarios\n */\n function getCursiveAnalytics(userid, resourceid, cmid, place) {\n let args = {id: resourceid, modulename: \"pdfannotator\", cmid: cmid};\n let methodname = 'cursive_get_forum_comment_link';\n let com = call([{methodname, args}]);\n com[0].done(function(json) {\n var data = JSON.parse(json);\n\n var filepath = '';\n if (data.data.filename) {\n filepath = data.data.filename;\n }\n\n let analyticButtonDiv = document.createElement('div');\n let analyticsColumn = document.createElement('td');\n\n if (!hasApiKey) {\n analyticButtonDiv.append(replayButton(resourceid));\n } else {\n analyticButtonDiv.append(analyticButton(data.data.effort_ratio, resourceid));\n }\n\n analyticButtonDiv.dataset.region = \"analytic-div\" + userid;\n analyticsColumn.append(analyticButtonDiv);\n place.insertAdjacentElement('afterend', analyticsColumn);\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.data,\n formattime: myEvents.formatedTime(data.data),\n page: scoreSetting,\n userid: resourceid,\n apikey: hasApiKey\n };\n\n let authIcon = myEvents.authorshipStatus(data.data.first_file, data.data.score, scoreSetting);\n myEvents.createModal(resourceid, context, '', replayInstances, authIcon);\n myEvents.analytics(resourceid, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(resourceid, data.data.file_id, '', replayInstances);\n myEvents.replyWriting(resourceid, filepath, '', replayInstances);\n\n });\n com[0].fail((error) => {\n window.console.error('Error getting cursive config:', error);\n });\n }\n};"],"names":["scoreSetting","comments","hasApiKey","userid","replayInstances","window","video_playback","mid","filepath","replay","Replay","render","then","html","document","getElementById","innerHTML","catch","e","console","error","container","querySelector","overviewTable","addEventListener","target","id","localStorage","removeItem","buttonElement","value","pendingSubmit","moduleName","body","split","MutationObserver","lastChild","_container$lastChild","resourceId","parseInt","async","methodname","args","updateEntries","cmid","M","cfg","contextInstanceId","userId","courseid","courseId","modulename","resourceid","extractResourceId","observe","subtree","childList","newChild","createElement","textContent","insertAdjacentElement","rows","querySelectorAll","action","URL","location","href","searchParams","get","forEach","row","cols","col1","col2","col3","links","link1","_cols$col","link2","_cols$col2","link3","_cols$col3","commentId","userLink","_userLink","warn","place","com","done","json","data","JSON","parse","filename","analyticButtonDiv","analyticsColumn","append","effort_ratio","dataset","region","myEvents","AnalyticEvents","context","tabledata","formattime","formatedTime","page","apikey","authIcon","authorshipStatus","first_file","score","createModal","analytics","templates","checkDiff","file_id","replyWriting","fail","getCursiveAnalytics","setReplayButton"],"mappings":"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"} \ No newline at end of file diff --git a/amd/build/append_submissions_table.min.js b/amd/build/append_submissions_table.min.js index c5ed11ce..50a9c343 100644 --- a/amd/build/append_submissions_table.min.js +++ b/amd/build/append_submissions_table.min.js @@ -1,3 +1,3 @@ -define("tiny_cursive/append_submissions_table",["jquery","core/ajax","core/str","core/templates","./replay","./analytic_button","./analytic_events","core/str"],(function($,AJAX,str,templates,Replay,analyticButton,AnalyticEvents,Str){const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new Replay("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else templates.render("tiny_cursive/no_submission").then((html=>($("#content"+mid).html(html),!0))).catch((e=>window.console.error(e)));return!1};var usersTable={init:function(scoreSetting,showcomment){str.get_strings([{key:"confidence_threshold",component:"tiny_cursive"}]).done((function(){usersTable.appendTable(scoreSetting,showcomment)}))},appendTable:function(scoreSetting){let subUrl=window.location.href,parm=new URL(subUrl),hTr=$("thead").find("tr").get()[0];Str.get_string("analytics","tiny_cursive").then((analyticString=>($(hTr).find("th").eq(3).after(''+analyticString+'
'),$("tbody").find("tr").get().forEach((function(tr){var _$$find,_$$find$get$;let tdUser=$(tr).find("td").get()[0],userid=null===(_$$find=$(tdUser).find("input[type='checkbox']"))||void 0===_$$find||null===(_$$find$get$=_$$find.get()[0])||void 0===_$$find$get$?void 0:_$$find$get$.value,cmid=parm.searchParams.get("id");const tableCell=document.createElement("td");tableCell.appendChild(analyticButton(userid)),$(tr).find("td").eq(3).after(tableCell);let args={id:userid,modulename:"assign",cmid:cmid},com=AJAX.call([{methodname:"cursive_user_list_submission_stats",args:args}]);try{com[0].done((function(json){var data=JSON.parse(json),filepath="";data.res.filename&&(filepath=data.res.filename);let textContent=document.querySelector(".page-header-headings h1").textContent,myEvents=new AnalyticEvents;var context={tabledata:data.res,formattime:myEvents.formatedTime(data.res),moduletitle:textContent,page:scoreSetting,userid:userid};let authIcon=myEvents.authorshipStatus(data.res.first_file,data.res.score,scoreSetting);myEvents.createModal(userid,context,"",authIcon),myEvents.analytics(userid,templates,context,"",replayInstances,authIcon),myEvents.checkDiff(userid,data.res.file_id,"",replayInstances),myEvents.replyWriting(userid,filepath,"",replayInstances),myEvents.quality(userid,templates,context,"",replayInstances,cmid)})).fail((function(error){window.console.error("AJAX request failed:",error)}))}catch(error){window.console.error("Error processing data:",error)}return com.usercomment})),!0))).catch((error=>{window.console.error("Failed to get analytics string:",error)}))}};return usersTable})); +define("tiny_cursive/append_submissions_table",["jquery","core/ajax","core/str","core/templates","./replay","./analytic_button","./replay_button","./analytic_events","core/str"],(function($,AJAX,str,templates,Replay,analyticButton,replayButton,AnalyticEvents,Str){const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new Replay("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else templates.render("tiny_cursive/no_submission").then((html=>($("#content"+mid).html(html),!0))).catch((e=>window.console.error(e)));return!1};var usersTable={init:function(scoreSetting,showcomment,hasApiKey){str.get_strings([{key:"confidence_threshold",component:"tiny_cursive"}]).done((function(){usersTable.appendTable(scoreSetting,hasApiKey)}))},appendTable:function(scoreSetting,hasApiKey){let subUrl=window.location.href,parm=new URL(subUrl),hTr=$("thead").find("tr").get()[0];Str.get_string("analytics","tiny_cursive").then((analyticString=>($(hTr).find("th").eq(3).after(''+analyticString+'
'),$("tbody").find("tr").get().forEach((function(tr){var _$$find,_$$find$get$;let tdUser=$(tr).find("td").get()[0],userid=null===(_$$find=$(tdUser).find("input[type='checkbox']"))||void 0===_$$find||null===(_$$find$get$=_$$find.get()[0])||void 0===_$$find$get$?void 0:_$$find$get$.value,cmid=parm.searchParams.get("id"),args={id:userid,modulename:"assign",cmid:cmid},com=AJAX.call([{methodname:"cursive_user_list_submission_stats",args:args}]);try{com[0].done((function(json){var data=JSON.parse(json),filepath="";data.res.filename&&(filepath=data.res.filename);const tableCell=document.createElement("td");hasApiKey?tableCell.appendChild(analyticButton(data.res.effort_ratio,userid)):$(tableCell).html(replayButton(userid)),$(tr).find("td").eq(3).after(tableCell);let textContent=document.querySelector(".page-header-headings h1").textContent,myEvents=new AnalyticEvents;var context={tabledata:data.res,formattime:myEvents.formatedTime(data.res),moduletitle:textContent,page:scoreSetting,userid:userid,apikey:hasApiKey};let authIcon=myEvents.authorshipStatus(data.res.first_file,data.res.score,scoreSetting);myEvents.createModal(userid,context,"",replayInstances,authIcon),myEvents.analytics(userid,templates,context,"",replayInstances,authIcon),myEvents.checkDiff(userid,data.res.file_id,"",replayInstances),myEvents.replyWriting(userid,filepath,"",replayInstances)})).fail((function(error){window.console.error("AJAX request failed:",error)}))}catch(error){window.console.error("Error processing data:",error)}return com.usercomment})),!0))).catch((error=>{window.console.error("Failed to get analytics string:",error)}))}};return usersTable})); //# sourceMappingURL=append_submissions_table.min.js.map \ No newline at end of file diff --git a/amd/build/append_submissions_table.min.js.map b/amd/build/append_submissions_table.min.js.map index ea14034b..0ee320af 100644 --- a/amd/build/append_submissions_table.min.js.map +++ b/amd/build/append_submissions_table.min.js.map @@ -1 +1 @@ -{"version":3,"file":"append_submissions_table.min.js","sources":["../src/append_submissions_table.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/append_submissions_table\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\n \"jquery\",\n \"core/ajax\",\n \"core/str\",\n \"core/templates\",\n \"./replay\",\n './analytic_button',\n './analytic_events',\n 'core/str'], function(\n $,\n AJAX,\n str,\n templates,\n Replay,\n analyticButton,\n AnalyticEvents,\n Str\n) {\n const replayInstances = {};\n // eslint-disable-next-line camelcase\n window.video_playback = function(mid, filepath) {\n\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n return true;\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n\n var usersTable = {\n init: function(scoreSetting, showcomment) {\n str\n .get_strings([\n {key: \"confidence_threshold\", component: \"tiny_cursive\"},\n ]).done(function() {\n usersTable.appendTable(scoreSetting, showcomment);\n });\n },\n appendTable: function(scoreSetting) {\n let subUrl = window.location.href;\n let parm = new URL(subUrl);\n let hTr = $('thead').find('tr').get()[0];\n\n Str.get_string('analytics', 'tiny_cursive')\n .then(analyticString => {\n $(hTr).find('th').eq(3).after(''\n + analyticString + '
' +\n '
');\n $('tbody').find(\"tr\").get().forEach(function(tr) {\n let tdUser = $(tr).find(\"td\").get()[0];\n let userid = $(tdUser).find(\"input[type='checkbox']\")?.get()[0]?.value;\n let cmid = parm.searchParams.get('id');\n // Create the table cell element and append the anchor.\n const tableCell = document.createElement('td');\n tableCell.appendChild(analyticButton(userid));\n $(tr).find('td').eq(3).after(tableCell);\n let args = {id: userid, modulename: \"assign\", cmid: cmid};\n let methodname = 'cursive_user_list_submission_stats';\n let com = AJAX.call([{methodname, args}]);\n try {\n com[0].done(function(json) {\n var data = JSON.parse(json);\n var filepath = '';\n if (data.res.filename) {\n filepath = data.res.filename;\n }\n // Get Module Name from element.\n let element = document.querySelector('.page-header-headings h1');\n // Selects the h1 element within the .page-header-headings class\n let textContent = element.textContent; // Extracts the text content from the h1 element\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.res,\n formattime: myEvents.formatedTime(data.res),\n moduletitle: textContent,\n page: scoreSetting,\n userid: userid,\n };\n\n let authIcon = myEvents.authorshipStatus(data.res.first_file, data.res.score, scoreSetting);\n myEvents.createModal(userid, context, '', authIcon);\n myEvents.analytics(userid, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(userid, data.res.file_id, '', replayInstances);\n myEvents.replyWriting(userid, filepath, '', replayInstances);\n myEvents.quality(userid, templates, context, '', replayInstances, cmid);\n }).fail(function(error) {\n window.console.error('AJAX request failed:', error);\n });\n } catch (error) {\n window.console.error('Error processing data:', error);\n }\n return com.usercomment;\n });\n return true;\n })\n .catch(error => {\n window.console.error('Failed to get analytics string:', error);\n });\n }\n };\n\n return usersTable;\n});"],"names":["define","$","AJAX","str","templates","Replay","analyticButton","AnalyticEvents","Str","replayInstances","window","video_playback","mid","filepath","replay","render","then","html","catch","e","console","error","usersTable","init","scoreSetting","showcomment","get_strings","key","component","done","appendTable","subUrl","location","href","parm","URL","hTr","find","get","get_string","analyticString","eq","after","forEach","tr","tdUser","userid","_$$find","_$$find$get$","value","cmid","searchParams","tableCell","document","createElement","appendChild","args","id","modulename","com","call","methodname","json","data","JSON","parse","res","filename","textContent","querySelector","myEvents","context","tabledata","formattime","formatedTime","moduletitle","page","authIcon","authorshipStatus","first_file","score","createModal","analytics","checkDiff","file_id","replyWriting","quality","fail","usercomment"],"mappings":"AAsBAA,+CAAO,CACH,SACA,YACA,WACA,iBACA,WACA,oBACA,oBACA,aAAa,SACbC,EACAC,KACAC,IACAC,UACAC,OACAC,eACAC,eACAC,WAEMC,gBAAkB,GAExBC,OAAOC,eAAiB,SAASC,IAAKC,aAEjB,KAAbA,SAAiB,OACXC,OAAS,IAAIT,OACf,UAAYO,IACZC,SACA,IACA,EACA,UAAYD,KAEhBH,gBAAgBG,KAAOE,YAEvBV,UAAUW,OAAO,8BAA8BC,MAAKC,OAChDhB,EAAE,WAAaW,KAAKK,KAAKA,OAClB,KACRC,OAAMC,GAAKT,OAAOU,QAAQC,MAAMF,YAEhC,OAIPG,WAAa,CACbC,KAAM,SAASC,aAAcC,aACzBtB,IACKuB,YAAY,CACT,CAACC,IAAK,uBAAwBC,UAAW,kBAC1CC,MAAK,WACRP,WAAWQ,YAAYN,aAAcC,iBAG7CK,YAAa,SAASN,kBACdO,OAASrB,OAAOsB,SAASC,KACzBC,KAAO,IAAIC,IAAIJ,QACfK,IAAMnC,EAAE,SAASoC,KAAK,MAAMC,MAAM,GAEtC9B,IAAI+B,WAAW,YAAa,gBACvBvB,MAAKwB,iBACFvC,EAAEmC,KAAKC,KAAK,MAAMI,GAAG,GAAGC,MAAM,qCACxBF,eADwB,+FAG9BvC,EAAE,SAASoC,KAAK,MAAMC,MAAMK,SAAQ,SAASC,iCACrCC,OAAS5C,EAAE2C,IAAIP,KAAK,MAAMC,MAAM,GAChCQ,uBAAS7C,EAAE4C,QAAQR,KAAK,mEAAfU,QAA0CT,MAAM,kCAAhDU,aAAoDC,MAC7DC,KAAOhB,KAAKiB,aAAab,IAAI,YAE3Bc,UAAYC,SAASC,cAAc,MACzCF,UAAUG,YAAYjD,eAAewC,SACrC7C,EAAE2C,IAAIP,KAAK,MAAMI,GAAG,GAAGC,MAAMU,eACzBI,KAAO,CAACC,GAAIX,OAAQY,WAAY,SAAUR,KAAMA,MAEhDS,IAAMzD,KAAK0D,KAAK,CAAC,CAACC,WADL,qCACiBL,KAAAA,YAE9BG,IAAI,GAAG9B,MAAK,SAASiC,UACbC,KAAOC,KAAKC,MAAMH,MAClBjD,SAAW,GACXkD,KAAKG,IAAIC,WACTtD,SAAWkD,KAAKG,IAAIC,cAKpBC,YAFUf,SAASgB,cAAc,4BAEXD,YAEtBE,SAAW,IAAI/D,mBACfgE,QAAU,CACVC,UAAWT,KAAKG,IAChBO,WAAYH,SAASI,aAAaX,KAAKG,KACvCS,YAAaP,YACbQ,KAAMpD,aACNsB,OAAQA,YAGR+B,SAAWP,SAASQ,iBAAiBf,KAAKG,IAAIa,WAAYhB,KAAKG,IAAIc,MAAOxD,cAC9E8C,SAASW,YAAYnC,OAAQyB,QAAS,GAAIM,UAC1CP,SAASY,UAAUpC,OAAQ1C,UAAWmE,QAAS,GAAI9D,gBAAiBoE,UACpEP,SAASa,UAAUrC,OAAQiB,KAAKG,IAAIkB,QAAS,GAAI3E,iBACjD6D,SAASe,aAAavC,OAAQjC,SAAU,GAAIJ,iBAC5C6D,SAASgB,QAAQxC,OAAQ1C,UAAWmE,QAAS,GAAI9D,gBAAiByC,SACnEqC,MAAK,SAASlE,OACbX,OAAOU,QAAQC,MAAM,uBAAwBA,UAEnD,MAAOA,OACLX,OAAOU,QAAQC,MAAM,yBAA0BA,cAE5CsC,IAAI6B,gBAER,KAEVtE,OAAMG,QACHX,OAAOU,QAAQC,MAAM,kCAAmCA,mBAKjEC"} \ No newline at end of file +{"version":3,"file":"append_submissions_table.min.js","sources":["../src/append_submissions_table.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/append_submissions_table\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\n \"jquery\",\n \"core/ajax\",\n \"core/str\",\n \"core/templates\",\n \"./replay\",\n './analytic_button',\n './replay_button',\n './analytic_events',\n 'core/str'], function(\n $,\n AJAX,\n str,\n templates,\n Replay,\n analyticButton,\n replayButton,\n AnalyticEvents,\n Str\n) {\n const replayInstances = {};\n // eslint-disable-next-line camelcase\n window.video_playback = function(mid, filepath) {\n\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n return true;\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n\n var usersTable = {\n init: function(scoreSetting, showcomment, hasApiKey) {\n str\n .get_strings([\n {key: \"confidence_threshold\", component: \"tiny_cursive\"},\n ]).done(function() {\n usersTable.appendTable(scoreSetting, hasApiKey);\n });\n },\n appendTable: function(scoreSetting, hasApiKey) {\n let subUrl = window.location.href;\n let parm = new URL(subUrl);\n let hTr = $('thead').find('tr').get()[0];\n\n Str.get_string('analytics', 'tiny_cursive')\n .then(analyticString => {\n $(hTr).find('th').eq(3).after(''\n + analyticString + '
' +\n '
');\n $('tbody').find(\"tr\").get().forEach(function(tr) {\n let tdUser = $(tr).find(\"td\").get()[0];\n let userid = $(tdUser).find(\"input[type='checkbox']\")?.get()[0]?.value;\n let cmid = parm.searchParams.get('id');\n // Create the table cell element and append the anchor.\n\n let args = {id: userid, modulename: \"assign\", cmid: cmid};\n let methodname = 'cursive_user_list_submission_stats';\n let com = AJAX.call([{methodname, args}]);\n try {\n com[0].done(function(json) {\n var data = JSON.parse(json);\n var filepath = '';\n if (data.res.filename) {\n filepath = data.res.filename;\n }\n\n const tableCell = document.createElement('td');\n\n if (!hasApiKey) {\n $(tableCell).html(replayButton(userid));\n } else {\n tableCell.appendChild(analyticButton(data.res.effort_ratio, userid));\n }\n $(tr).find('td').eq(3).after(tableCell);\n\n // Get Module Name from element.\n let element = document.querySelector('.page-header-headings h1');\n // Selects the h1 element within the .page-header-headings class\n let textContent = element.textContent; // Extracts the text content from the h1 element\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.res,\n formattime: myEvents.formatedTime(data.res),\n moduletitle: textContent,\n page: scoreSetting,\n userid: userid,\n apikey: hasApiKey\n };\n\n let authIcon = myEvents.authorshipStatus(data.res.first_file, data.res.score, scoreSetting);\n myEvents.createModal(userid, context, '', replayInstances, authIcon);\n myEvents.analytics(userid, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(userid, data.res.file_id, '', replayInstances);\n myEvents.replyWriting(userid, filepath, '', replayInstances);\n\n }).fail(function(error) {\n window.console.error('AJAX request failed:', error);\n });\n } catch (error) {\n window.console.error('Error processing data:', error);\n }\n return com.usercomment;\n });\n return true;\n })\n .catch(error => {\n window.console.error('Failed to get analytics string:', error);\n });\n }\n };\n\n return usersTable;\n});"],"names":["define","$","AJAX","str","templates","Replay","analyticButton","replayButton","AnalyticEvents","Str","replayInstances","window","video_playback","mid","filepath","replay","render","then","html","catch","e","console","error","usersTable","init","scoreSetting","showcomment","hasApiKey","get_strings","key","component","done","appendTable","subUrl","location","href","parm","URL","hTr","find","get","get_string","analyticString","eq","after","forEach","tr","tdUser","userid","_$$find","_$$find$get$","value","cmid","searchParams","args","id","modulename","com","call","methodname","json","data","JSON","parse","res","filename","tableCell","document","createElement","appendChild","effort_ratio","textContent","querySelector","myEvents","context","tabledata","formattime","formatedTime","moduletitle","page","apikey","authIcon","authorshipStatus","first_file","score","createModal","analytics","checkDiff","file_id","replyWriting","fail","usercomment"],"mappings":"AAsBAA,+CAAO,CACH,SACA,YACA,WACA,iBACA,WACA,oBACA,kBACA,oBACA,aAAa,SACbC,EACAC,KACAC,IACAC,UACAC,OACAC,eACAC,aACAC,eACAC,WAEMC,gBAAkB,GAExBC,OAAOC,eAAiB,SAASC,IAAKC,aAEjB,KAAbA,SAAiB,OACXC,OAAS,IAAIV,OACf,UAAYQ,IACZC,SACA,IACA,EACA,UAAYD,KAEhBH,gBAAgBG,KAAOE,YAEvBX,UAAUY,OAAO,8BAA8BC,MAAKC,OAChDjB,EAAE,WAAaY,KAAKK,KAAKA,OAClB,KACRC,OAAMC,GAAKT,OAAOU,QAAQC,MAAMF,YAEhC,OAIPG,WAAa,CACbC,KAAM,SAASC,aAAcC,YAAaC,WACtCxB,IACKyB,YAAY,CACT,CAACC,IAAK,uBAAwBC,UAAW,kBAC1CC,MAAK,WACRR,WAAWS,YAAYP,aAAcE,eAG7CK,YAAa,SAASP,aAAcE,eAC5BM,OAAStB,OAAOuB,SAASC,KACzBC,KAAO,IAAIC,IAAIJ,QACfK,IAAMrC,EAAE,SAASsC,KAAK,MAAMC,MAAM,GAEtC/B,IAAIgC,WAAW,YAAa,gBACvBxB,MAAKyB,iBACFzC,EAAEqC,KAAKC,KAAK,MAAMI,GAAG,GAAGC,MAAM,qCACxBF,eADwB,+FAG9BzC,EAAE,SAASsC,KAAK,MAAMC,MAAMK,SAAQ,SAASC,iCACrCC,OAAS9C,EAAE6C,IAAIP,KAAK,MAAMC,MAAM,GAChCQ,uBAAS/C,EAAE8C,QAAQR,KAAK,mEAAfU,QAA0CT,MAAM,kCAAhDU,aAAoDC,MAC7DC,KAAOhB,KAAKiB,aAAab,IAAI,MAG7Bc,KAAO,CAACC,GAAIP,OAAQQ,WAAY,SAAUJ,KAAMA,MAEhDK,IAAMvD,KAAKwD,KAAK,CAAC,CAACC,WADL,qCACiBL,KAAAA,YAE9BG,IAAI,GAAG1B,MAAK,SAAS6B,UACbC,KAAOC,KAAKC,MAAMH,MAClB9C,SAAW,GACX+C,KAAKG,IAAIC,WACTnD,SAAW+C,KAAKG,IAAIC,gBAGlBC,UAAYC,SAASC,cAAc,MAEpCzC,UAGDuC,UAAUG,YAAY/D,eAAeuD,KAAKG,IAAIM,aAActB,SAF5D/C,EAAEiE,WAAWhD,KAAKX,aAAayC,SAInC/C,EAAE6C,IAAIP,KAAK,MAAMI,GAAG,GAAGC,MAAMsB,eAKzBK,YAFUJ,SAASK,cAAc,4BAEXD,YAEtBE,SAAW,IAAIjE,mBACfkE,QAAU,CACVC,UAAWd,KAAKG,IAChBY,WAAYH,SAASI,aAAahB,KAAKG,KACvCc,YAAaP,YACbQ,KAAMtD,aACNuB,OAAQA,OACRgC,OAAQrD,eAGRsD,SAAWR,SAASS,iBAAiBrB,KAAKG,IAAImB,WAAYtB,KAAKG,IAAIoB,MAAO3D,cAC9EgD,SAASY,YAAYrC,OAAQ0B,QAAS,GAAIhE,gBAAiBuE,UAC3DR,SAASa,UAAUtC,OAAQ5C,UAAWsE,QAAS,GAAIhE,gBAAiBuE,UACpER,SAASc,UAAUvC,OAAQa,KAAKG,IAAIwB,QAAS,GAAI9E,iBACjD+D,SAASgB,aAAazC,OAAQlC,SAAU,GAAIJ,oBAE7CgF,MAAK,SAASpE,OACbX,OAAOU,QAAQC,MAAM,uBAAwBA,UAEnD,MAAOA,OACLX,OAAOU,QAAQC,MAAM,yBAA0BA,cAE5CmC,IAAIkC,gBAER,KAEVxE,OAAMG,QACHX,OAAOU,QAAQC,MAAM,kCAAmCA,mBAKjEC"} \ No newline at end of file diff --git a/amd/build/autosaver.min.js b/amd/build/autosaver.min.js index 0b3a1dec..5c4badae 100644 --- a/amd/build/autosaver.min.js +++ b/amd/build/autosaver.min.js @@ -1,3 +1,3 @@ -define("tiny_cursive/autosaver",["exports","core/ajax","core/modal_factory","core/str","core/modal_events","jquery"],(function(_exports,_ajax,_modal_factory,_str,_modal_events,_jquery){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.register=void 0,_jquery=(obj=_jquery)&&obj.__esModule?obj:{default:obj};_exports.register=(editor,interval,userId)=>{var isStudent=!(0,_jquery.default)("#body").hasClass("teacher_admin"),intervention=(0,_jquery.default)("#body").hasClass("intervention"),userid=userId,host=M.cfg.wwwroot,courseid=M.cfg.courseId,filename="",quizSubmit=(0,_jquery.default)("#mod_quiz-next-nav"),ed="",event="",resourceId=0,modulename="",editorid=null==editor?void 0:editor.id,cmid=M.cfg.contextInstanceId,questionid=0;let assignSubmit=(0,_jquery.default)("#id_submitbutton");var syncInterval=interval?1e3*interval:1e4;const postOne=async(methodname,args)=>{try{return await(0,_ajax.call)([{methodname:methodname,args:args}])[0]}catch(error){throw window.console.error("Error in postOne:",error),error}};assignSubmit.on("click",(async function(e){e.preventDefault(),filename?syncData().then((()=>{assignSubmit.off("click").click()})):assignSubmit.off("click").click()})),quizSubmit.on("click",(async function(e){e.preventDefault(),filename?syncData().then((()=>{quizSubmit.off("click").click()})):quizSubmit.off("click").click()}));const getModal=e=>{Promise.all([(0,_str.get_string)("tiny_cursive_srcurl","tiny_cursive"),(0,_str.get_string)("tiny_cursive_srcurl_des","tiny_cursive"),(0,_str.get_string)("tiny_cursive_placeholder","tiny_cursive")]).then((function(_ref){let[title,titledes,placeholder]=_ref;return(0,_modal_factory.create)({type:"SAVE_CANCEL",title:"
".concat(title,"
").concat(titledes,"
"),body:''),removeOnClose:!0}).done((modal=>{modal.getRoot().append("\n "),modal.show();var lastEvent="";return modal.getRoot().on(_modal_events.save,(function(){var number=document.getElementById("inputUrl").value.trim();""===number||null==number?(editor.execCommand("Undo"),(0,_str.get_string)("pastewarning","tiny_cursive").then((str=>alert(str)))):editor.execCommand("Paste");let ur=e.srcElement.baseURI,resourceId=0,parm=new URL(ur),modulename="",editorid=null==editor?void 0:editor.id,courseid=M.cfg.courseId,cmid=M.cfg.contextInstanceId;if(!(ur.includes("attempt.php")||ur.includes("forum")||ur.includes("assign")||ur.includes("lesson")|ur.includes("oublog")))return!1;ur.includes("forum")&&!ur.includes("assign")&&(resourceId=parm.searchParams.get("edit")),ur.includes("forum")||ur.includes("assign")||(resourceId=parm.searchParams.get("attempt")),null===resourceId&&(resourceId=0),ur.includes("forum")&&(modulename="forum"),ur.includes("assign")&&(modulename="assign",resourceId=cmid),ur.includes("attempt")&&(modulename="quiz"),ur.includes("lesson")&&(modulename="lesson",resourceId=cmid),ur.includes("oublog")&&(modulename="oublog",resourceId=0),null===cmid&&(cmid=0),postOne("cursive_user_comments",{modulename:modulename,cmid:cmid,resourceid:resourceId,courseid:courseid,usercomment:number,timemodified:Date.now(),editorid:editorid||""}),lastEvent="save",modal.destroy()})),modal.getRoot().on(_modal_events.cancel,(function(){editor.execCommand("Undo"),lastEvent="cancel"})),modal.getRoot().on(_modal_events.hidden,(function(){"cancel"!=lastEvent&&"save"!=lastEvent&&editor.execCommand("Undo")})),modal}))})).catch((error=>window.console.error(error)))},sendKeyEvent=(events,eds)=>{let ur=eds.srcElement.baseURI,parm=new URL(ur);if(ed=eds,event=events,!(ur.includes("attempt.php")||ur.includes("forum")||ur.includes("assign")||ur.includes("lesson")||ur.includes("oublog")))return!1;if(null===(resourceId=ur.includes("forum")&&!ur.includes("assign")?parm.searchParams.get("edit"):parm.searchParams.get("attempt"))&&(resourceId=0),ur.includes("forum")&&(modulename="forum"),ur.includes("assign")&&(modulename="assign",resourceId=cmid),ur.includes("attempt")&&(modulename="quiz"),ur.includes("lesson")&&(modulename="lesson",resourceId=cmid),ur.includes("oublog")&&(modulename="oublog",resourceId=0),filename="".concat(userid,"_").concat(resourceId,"_").concat(cmid,"_").concat(modulename,"_attempt"),"quiz"===modulename&&(questionid=editorid.split(":")[1].split("_")[0],filename="".concat(userid,"_").concat(resourceId,"_").concat(cmid,"_").concat(questionid,"_").concat(modulename,"_attempt")),localStorage.getItem(filename)){let data=JSON.parse(localStorage.getItem(filename));data.push({resourceId:resourceId,key:ed.key,keyCode:ed.keyCode,event:event,courseId:courseid,unixTimestamp:Date.now(),clientId:host,personId:userid}),localStorage.setItem(filename,JSON.stringify(data))}else{let data=[];data.push({resourceId:resourceId,key:ed.key,keyCode:ed.keyCode,event:event,courseId:courseid,unixTimestamp:Date.now(),clientId:host,personId:userid}),localStorage.setItem(filename,JSON.stringify(data))}};async function syncData(){let data=localStorage.getItem(filename);if(data&&0!==data.length){localStorage.removeItem(filename);let originalText=editor.getContent({format:"text"});try{return await postOne("cursive_write_local_to_json",{key:ed.key,event:event,keyCode:ed.keyCode,resourceId:resourceId,cmid:cmid,modulename:modulename,editorid:editorid,json_data:data,originalText:originalText})}catch(error){window.console.error("Error submitting data:",error)}}}editor.on("keyUp",(editor=>{sendKeyEvent("keyUp",editor)})),editor.on("Paste",(async e=>{isStudent&&intervention&&getModal(e)})),editor.on("Redo",(async e=>{isStudent&&intervention&&getModal(e)})),editor.on("keyDown",(editor=>{sendKeyEvent("keyDown",editor)})),editor.on("init",(()=>{})),window.addEventListener("unload",(()=>{syncData()})),setInterval(syncData,syncInterval)}})); +define("tiny_cursive/autosaver",["exports","core/ajax","core/modal_factory","core/str","core/modal_events","jquery","tiny_cursive/common","tiny_cursive/cursive_autosave","tiny_cursive/document_view"],(function(_exports,_ajax,_modal_factory,_str,_modal_events,_jquery,_common,_cursive_autosave,_document_view){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.register=void 0,_jquery=_interopRequireDefault(_jquery),_cursive_autosave=_interopRequireDefault(_cursive_autosave),_document_view=_interopRequireDefault(_document_view);_exports.register=(editor,interval,userId,hasApiKey,MODULES,Rubrics,submission,quizInfo,pasteSetting)=>{var isStudent=!(0,_jquery.default)("#body").hasClass("teacher_admin"),intervention=(0,_jquery.default)("#body").hasClass("intervention"),host=M.cfg.wwwroot,userid=userId,courseid=M.cfg.courseId,editorid=null==editor?void 0:editor.id,cmid=M.cfg.contextInstanceId,ed="",event="",filename="",questionid=0,quizSubmit=(0,_jquery.default)("#mod_quiz-next-nav");let assignSubmit=(0,_jquery.default)("#id_submitbutton");var syncInterval=interval?1e3*interval:1e4,lastCaretPos=1;let aiContents=[];var isFullScreen=!1,user=null;let ur=window.location.href,parm=new URL(ur),modulesInfo=function(ur,parm,MODULES){if(function(){localStorage.getItem("sbTitle")||Promise.all([(0,_str.get_string)("assignment","tiny_cursive"),(0,_str.get_string)("discussion","tiny_cursive"),(0,_str.get_string)("pluginname","mod_quiz"),(0,_str.get_string)("pluginname","mod_lesson"),(0,_str.get_string)("description","tiny_cursive")]).then((function(strings){return localStorage.setItem("sbTitle",JSON.stringify(strings))})).catch((error=>window.console.error(error)));localStorage.getItem("docSideBar")||Promise.all([(0,_str.get_string)("details","tiny_cursive"),(0,_str.get_string)("student_info","tiny_cursive"),(0,_str.get_string)("progress","tiny_cursive"),(0,_str.get_string)("description","tiny_cursive"),(0,_str.get_string)("replyingto","tiny_cursive"),(0,_str.get_string)("answeringto","tiny_cursive"),(0,_str.get_string)("importantdates","tiny_cursive"),(0,_str.get_string)("rubrics","tiny_cursive"),(0,_str.get_string)("submission_status","tiny_cursive"),(0,_str.get_string)("status","tiny_cursive"),(0,_str.get_string)("draft","tiny_cursive"),(0,_str.get_string)("draftnot","tiny_cursive"),(0,_str.get_string)("last_modified","tiny_cursive"),(0,_str.get_string)("gradings","tiny_cursive"),(0,_str.get_string)("gradenot","tiny_cursive"),(0,_str.get_string)("word_count","tiny_cursive"),(0,_str.get_string)("timeleft","tiny_cursive"),(0,_str.get_string)("nolimit","tiny_cursive"),(0,_str.get_string)("name","tiny_cursive"),(0,_str.get_string)("userename","tiny_cursive"),(0,_str.get_string)("course","tiny_cursive"),(0,_str.get_string)("opened","tiny_cursive"),(0,_str.get_string)("due","tiny_cursive"),(0,_str.get_string)("overdue","tiny_cursive"),(0,_str.get_string)("remaining","tiny_cursive"),(0,_str.get_string)("savechanges","tiny_cursive"),(0,_str.get_string)("subjectnot","tiny_cursive"),(0,_str.get_string)("remaining","tiny_cursive")]).then((function(strings){return localStorage.setItem("docSideBar",JSON.stringify(strings))})).catch((error=>window.console.error(error)))}(),!MODULES.some((module=>ur.includes(module))))return!1;resourceId=ur.includes("forum")&&!ur.includes("assign")?parm.searchParams.get("edit"):parm.searchParams.get("attempt");null===resourceId&&(resourceId=0);for(const module of MODULES)if(ur.includes(module)){modulename=module,"lesson"===module||"assign"===module?resourceId=cmid:"oublog"===module&&(resourceId=0);break}return checkIsPdfAnnotator(),{resourceId:resourceId,name:modulename}}(ur,parm,MODULES);var resourceId=modulesInfo.resourceId,modulename=modulesInfo.name,errorAlert=!0;let PASTE_SETTING=pasteSetting||"allow",shouldBlockPaste=!1,isPasteAllowed=!1;ur.includes("pdfannotator")&&document.addEventListener("click",(e=>{if("dropdown-item comment-edit-a"===e.target.className){let id=e.target.id;resourceId=id.replace("editButton",""),localStorage.setItem("isEditing","1")}"commentSubmit"===e.target.id&&syncData()}));const postOne=async(methodname,args)=>{try{const response=await(0,_ajax.call)([{methodname:methodname,args:args}])[0];return response&&setTimeout((()=>{_cursive_autosave.default.updateSavingState("saved")}),1e3),response}catch(error){throw _cursive_autosave.default.updateSavingState("offline"),window.console.error("Error in postOne:",error),error}};(0,_ajax.call)([{methodname:"core_user_get_users_by_field",args:{field:"id",values:[userid]}}])[0].done((response=>{user=response[0]})).fail((ex=>{window.console.error("Error fetching user data:",ex)})),assignSubmit.on("click",(async function(e){e.preventDefault(),filename?syncData().then((()=>{assignSubmit.off("click").click()})):assignSubmit.off("click").click(),localStorage.removeItem("lastCopyCutContent")})),quizSubmit.on("click",(async function(e){e.preventDefault(),filename?syncData().then((()=>{quizSubmit.off("click").click()})):quizSubmit.off("click").click(),localStorage.removeItem("lastCopyCutContent")}));const getModal=()=>{Promise.all([(0,_str.get_string)("tiny_cursive_srcurl","tiny_cursive"),(0,_str.get_string)("tiny_cursive_srcurl_des","tiny_cursive"),(0,_str.get_string)("tiny_cursive_placeholder","tiny_cursive")]).then((function(_ref){let[title,titledes,placeholder]=_ref;return(0,_modal_factory.create)({type:"SAVE_CANCEL",title:`
${title}
\n ${titledes}
`,body:``,removeOnClose:!0}).done((modal=>{modal.getRoot().addClass("tiny-cursive-modal"),modal.show();var lastEvent="";return modal.getRoot().on(_modal_events.save,(function(){var number=document.getElementById("inputUrl").value.trim();""===number||null==number?(editor.execCommand("Undo"),(0,_str.get_string)("pastewarning","tiny_cursive").then((str=>alert(str)))):editor.execCommand("Paste"),postOne("cursive_user_comments",{modulename:modulename,cmid:cmid,resourceid:resourceId,courseid:courseid,usercomment:number,timemodified:Date.now(),editorid:editorid||""}),lastEvent="save",modal.destroy()})),modal.getRoot().on(_modal_events.cancel,(function(){editor.execCommand("Undo"),lastEvent="cancel"})),modal.getRoot().on(_modal_events.hidden,(function(){"cancel"!=lastEvent&&"save"!=lastEvent&&editor.execCommand("Undo")})),modal}))})).catch((error=>window.console.error(error)))},sendKeyEvent=(events,editor)=>{if(ed=editor,event=events,filename=`${userid}_${resourceId}_${cmid}_${modulename}_attempt`,"quiz"===modulename&&(questionid=editorid.split(":")[1].split("_")[0],filename=`${userid}_${resourceId}_${cmid}_${questionid}_${modulename}_attempt`),localStorage.getItem(filename)){let data=JSON.parse(localStorage.getItem(filename));data.push({resourceId:resourceId,key:editor.key,keyCode:editor.keyCode,event:event,courseId:courseid,unixTimestamp:Date.now(),clientId:host,personId:userid,position:ed.caretPosition,rePosition:ed.rePosition,pastedContent:editor.pastedContent,aiContent:editor.aiContent}),localStorage.setItem(filename,JSON.stringify(data))}else{let data=[{resourceId:resourceId,key:editor.key,keyCode:editor.keyCode,event:event,courseId:courseid,unixTimestamp:Date.now(),clientId:host,personId:userid,position:ed.caretPosition,rePosition:ed.rePosition,pastedContent:editor.pastedContent,aiContent:editor.aiContent}];localStorage.setItem(filename,JSON.stringify(data))}};function constructMouseEvent(editor){let position=getCaretPosition(!1);editor.caretPosition=position.caretPosition,editor.rePosition=position.rePosition,editor.key=function(editor){switch(editor.button){case 0:return"left";case 1:return"middle";case 2:return"right"}return null}(editor),editor.keyCode=editor.button}function getCaretPosition(){let skip=arguments.length>0&&void 0!==arguments[0]&&arguments[0];try{if(!editor||!editor.selection)return{caretPosition:0,rePosition:0};const range=editor.selection.getRng(),body=editor.getBody(),preCaretRange=range.cloneRange();preCaretRange.selectNodeContents(body),preCaretRange.setEnd(range.endContainer,range.endOffset);const fragment=preCaretRange.cloneContents(),tempDiv=document.createElement("div");tempDiv.appendChild(fragment);let textBeforeCursor=tempDiv.innerText||"";const endContainer=range.endContainer;0===range.endOffset&&endContainer.nodeType===Node.ELEMENT_NODE&&editor.dom.isBlock(endContainer)&&endContainer.previousSibling&&(textBeforeCursor+="\n");const blockElements=tempDiv.querySelectorAll("p, div, h1, h2, h3, h4, h5, h6, li");let emptyBlockCount=0;blockElements.forEach((block=>{""===(block.innerText||block.textContent||"").trim()&&1===block.childNodes.length&&"BR"===block.childNodes[0].nodeName&&emptyBlockCount++})),emptyBlockCount>0&&(textBeforeCursor+="\n".repeat(emptyBlockCount));const absolutePosition=textBeforeCursor.length;if(skip)return{caretPosition:lastCaretPos,rePosition:absolutePosition};const storageKey=`${userid}_${resourceId}_${cmid}_position`;let storedPos=parseInt(sessionStorage.getItem(storageKey),10);return isNaN(storedPos)&&(storedPos=0),storedPos++,lastCaretPos=storedPos,sessionStorage.setItem(storageKey,storedPos),{caretPosition:storedPos,rePosition:absolutePosition}}catch(e){return window.console.warn("Error getting caret position:",e),{caretPosition:lastCaretPos||1,rePosition:0}}}async function syncData(){checkIsPdfAnnotator();let data=localStorage.getItem(filename);if(data&&0!==data.length){localStorage.removeItem(filename),editor.fire("change");let originalText=editor.getContent({format:"text"});originalText||(originalText=function(editor){let editorId=null==editor?void 0:editor.id;if(editorId){var _iframe$contentDocume,_iframe$contentWindow,_iframe$contentWindow2;let iframe=document.querySelector(`#${editorId}_ifr`),iframeBody=(null===(_iframe$contentDocume=iframe.contentDocument)||void 0===_iframe$contentDocume?void 0:_iframe$contentDocume.body)||(null===(_iframe$contentWindow=iframe.contentWindow)||void 0===_iframe$contentWindow||null===(_iframe$contentWindow2=_iframe$contentWindow.document)||void 0===_iframe$contentWindow2?void 0:_iframe$contentWindow2.body);return null==iframeBody?void 0:iframeBody.textContent}return""}(editor));try{return _cursive_autosave.default.updateSavingState("saving"),await postOne("cursive_write_local_to_json",{key:ed.key,event:event,keyCode:ed.keyCode,resourceId:resourceId,cmid:cmid,modulename:modulename,editorid:editorid,json_data:data,originalText:originalText})}catch(error){window.console.error("Error submitting data:",error)}}}function customTooltip(){try{const tooltipText=async function(){const[buttonTitle,buttonDes]=await Promise.all([(0,_str.get_string)("cursive:state:active","tiny_cursive"),(0,_str.get_string)("cursive:state:active:des","tiny_cursive")]);return{buttonTitle:buttonTitle,buttonDes:buttonDes}}(),menubarDiv=document.querySelectorAll('div[role="menubar"].tox-menubar');let classArray=[];menubarDiv.length&&menubarDiv.forEach((function(element,index){let className="cursive-menu-"+(index+=1);element.classList.add(className),classArray.push(className)}));const cursiveIcon=document.createElement("img");cursiveIcon.src=hasApiKey?_common.iconUrl:_common.iconGrayUrl,cursiveIcon.setAttribute("class","tiny_cursive_StateButton"),cursiveIcon.style.display="inline-block",function(cursiveIcon,menubarDiv,classArray){if(!menubarDiv)return;for(let index in classArray){const rightWrapper=document.createElement("div"),imgWrapper=document.createElement("span"),iconClone=cursiveIcon.cloneNode(!0),targetMenu=document.querySelector("."+classArray[index]);let elementId="tiny_cursive_StateIcon"+index;rightWrapper.style.cssText="\n margin-left: auto;\n display: flex;\n align-items: center;\n ",imgWrapper.id=elementId,imgWrapper.style.marginLeft=".2rem",imgWrapper.appendChild(iconClone),rightWrapper.appendChild(imgWrapper);let moduleIds={resourceId:resourceId,cmid:cmid,modulename:modulename,questionid:questionid,userid:userid,courseid:courseid};if(!isFullScreen||"assign"!==modulename&&"forum"!==modulename&&"lesson"!==modulename)if(isFullScreen&&"quiz"===modulename){var _editor$container,_editor$container$chi,_editor$container$chi2,_editor$container$chi3,_editor$container2;let existingElement=null===(_editor$container=editor.container)||void 0===_editor$container||null===(_editor$container$chi=_editor$container.childNodes[1])||void 0===_editor$container$chi||null===(_editor$container$chi2=_editor$container$chi.childNodes[0])||void 0===_editor$container$chi2||null===(_editor$container$chi3=_editor$container$chi2.childNodes[0])||void 0===_editor$container$chi3?void 0:_editor$container$chi3.childNodes[7],newHeader=null===(_editor$container2=editor.container)||void 0===_editor$container2?void 0:_editor$container2.childNodes[0];existingElement&&existingElement.remove(),newHeader&&!newHeader.querySelector("span[id*=tiny_cursive_StateIcon]")&&(rightWrapper.style.marginTop="3px",document.querySelector("#tiny_cursive-fullpage-right-wrapper").prepend(rightWrapper)),_cursive_autosave.default.destroyInstance(),_cursive_autosave.default.getInstance(editor,rightWrapper,moduleIds,isFullScreen)}else{var _editor$container3,_editor$container3$ch,_editor$container3$ch2;let menubar=null==editor||null===(_editor$container3=editor.container)||void 0===_editor$container3||null===(_editor$container3$ch=_editor$container3.children[0])||void 0===_editor$container3$ch||null===(_editor$container3$ch2=_editor$container3$ch.childNodes[0])||void 0===_editor$container3$ch2?void 0:_editor$container3$ch2.childNodes[0];if(targetMenu&&!targetMenu.querySelector(`#${elementId}`)&&targetMenu.appendChild(rightWrapper),"quiz"===modulename&&menubar){let wrapper=menubar.querySelector('span[id*="tiny_cursive_StateIcon"]');wrapper&&(_cursive_autosave.default.destroyInstance(),_cursive_autosave.default.getInstance(editor,null==wrapper?void 0:wrapper.parentElement,moduleIds,isFullScreen))}else _cursive_autosave.default.destroyInstance(),_cursive_autosave.default.getInstance(editor,rightWrapper,moduleIds,isFullScreen)}else{let existsElement=document.querySelector('.tox-menubar[class*="cursive-menu-"] > div');existsElement&&existsElement.remove(),document.querySelector(`#${elementId}`)||(rightWrapper.style.marginTop="3px",document.querySelector("#tiny_cursive-fullpage-right-wrapper").prepend(rightWrapper)),_cursive_autosave.default.destroyInstance(),_cursive_autosave.default.getInstance(editor,rightWrapper,moduleIds,isFullScreen)}}}(cursiveIcon,menubarDiv,classArray);for(let index in classArray){const elementId="tiny_cursive_StateIcon"+index,tooltipId=`tiny_cursive_tooltip${index}`;tooltipText.then((text=>setTooltip(text,document.querySelector(`#${elementId}`),tooltipId))).catch((error=>window.console.error(error))),(0,_jquery.default)(`#${elementId}`).on("mouseenter",(function(){(0,_jquery.default)(this).css("position","relative"),(0,_jquery.default)(`#${tooltipId}`).css(_common.tooltipCss)})),(0,_jquery.default)(`#${elementId}`).on("mouseleave",(function(){(0,_jquery.default)(`#${tooltipId}`).css("display","none")}))}}catch(error){window.console.error("Error setting up custom tooltip:",error)}}function setTooltip(text,cursiveIcon,tooltipId){if(!document.querySelector(`#${tooltipId}`)&&cursiveIcon){const tooltipSpan=document.createElement("span"),description=document.createElement("span"),linebreak=document.createElement("br"),tooltipTitle=document.createElement("strong");tooltipSpan.style.display="none",tooltipTitle.textContent=text.buttonTitle,tooltipTitle.style.fontSize="16px",tooltipTitle.style.fontWeight="bold",description.textContent=text.buttonDes,description.style.fontSize="14px",tooltipSpan.id=tooltipId,tooltipSpan.classList.add("shadow"),tooltipSpan.appendChild(tooltipTitle),tooltipSpan.appendChild(linebreak),tooltipSpan.appendChild(description),cursiveIcon.appendChild(tooltipSpan)}}function checkIsPdfAnnotator(){ur.includes("pdfannotator")&&(resourceId="id_pdfannotator_content"!==editor.id&&parseInt(localStorage.getItem("isEditing"))?parseInt(null==editor?void 0:editor.id.replace("editarea","")):0)}editor.on("keyUp",(editor=>{customTooltip();let position=getCaretPosition(!1);editor.caretPosition=position.caretPosition,editor.rePosition=position.rePosition,sendKeyEvent("keyUp",editor)})),editor.on("Paste",(async e=>{customTooltip();const pastedContent=(e.clipboardData||e.originalEvent.clipboardData).getData("text");if(!pastedContent)return;const trimmedPastedContent=pastedContent.trim(),lastCopyCutContent=localStorage.getItem("lastCopyCutContent"),isFromOwnEditor=lastCopyCutContent&&trimmedPastedContent===lastCopyCutContent;if(isStudent&&intervention){if("block"===PASTE_SETTING)return isFromOwnEditor?(shouldBlockPaste=!1,void(isPasteAllowed=!0)):(e.preventDefault(),shouldBlockPaste=!0,isPasteAllowed=!1,e.stopPropagation(),e.stopImmediatePropagation(),(0,_str.get_string)("paste_blocked","tiny_cursive").then((str=>editor.windowManager.alert(str))).catch((error=>window.console.error(error))),void setTimeout((()=>{isPasteAllowed=!0,shouldBlockPaste=!1}),100));if("cite_source"===PASTE_SETTING)return isFromOwnEditor||(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),getModal()),void(isPasteAllowed=!0)}isPasteAllowed=!0})),editor.on("Redo",(async e=>{customTooltip(),isStudent&&intervention&&getModal()})),editor.on("keyDown",(editor=>{customTooltip();if(("v"===editor.key||"V"===editor.key)&&(editor.ctrlKey||editor.metaKey)&&isStudent&&intervention&&"block"===PASTE_SETTING&&!isPasteAllowed)return void setTimeout((()=>{isPasteAllowed=!0}),100);let position=getCaretPosition();editor.caretPosition=position.caretPosition,editor.rePosition=position.rePosition,sendKeyEvent("keyDown",editor)})),editor.on("Cut",(()=>{const selectedContent=editor.selection.getContent({format:"text"});localStorage.setItem("lastCopyCutContent",selectedContent.trim())})),editor.on("Copy",(()=>{const selectedContent=editor.selection.getContent({format:"text"});localStorage.setItem("lastCopyCutContent",selectedContent.trim())})),editor.on("mouseDown",(async editor=>{setTimeout((()=>{constructMouseEvent(editor),sendKeyEvent("mouseDown",editor)}),0)})),editor.on("mouseUp",(async editor=>{setTimeout((()=>{constructMouseEvent(editor),sendKeyEvent("mouseUp",editor)}),10)})),editor.on("init",(()=>{customTooltip(),localStorage.removeItem("lastCopyCutContent")})),editor.on("SetContent",(()=>{customTooltip()})),editor.on("FullscreenStateChanged",(e=>{let view=new _document_view.default(user,Rubrics,submission,modulename,editor,quizInfo);isFullScreen=e.state;try{e.state?view.fullPageMode():view.normalMode()}catch(error){errorAlert&&(errorAlert=!1,(0,_str.get_string)("fullmodeerror","tiny_cursive").then((str=>editor.windowManager.alert(str))).catch((error=>window.console.error(error)))),view.normalMode(),window.console.error("Error ResizeEditor event:",error)}})),editor.on("execcommand",(function(e){if("mceInsertContent"===e.command){const contentObj=e.value,isPaste=contentObj&&"object"==typeof contentObj&&!0===contentObj.paste;let insertedContent=contentObj.content||contentObj,tempDiv=document.createElement("div");tempDiv.innerHTML=insertedContent;let text=tempDiv.textContent||tempDiv.innerText||"",pastedText=tempDiv.textContent||tempDiv.innerText||"",position=getCaretPosition(!0);if(editor.caretPosition=position.caretPosition,editor.rePosition=position.rePosition,isPaste){if(shouldBlockPaste)return shouldBlockPaste=!1,e.preventDefault(),void editor.undoManager.undo();const lastCopyCutContent=localStorage.getItem("lastCopyCutContent"),isFromOwnEditor=lastCopyCutContent&&pastedText.trim()===lastCopyCutContent;if(isStudent&&intervention&&"block"===PASTE_SETTING&&!isFromOwnEditor)return isPasteAllowed=!1,void editor.undoManager.undo();sendKeyEvent("Paste",{key:"v",keyCode:86,caretPosition:editor.caretPosition,rePosition:editor.rePosition,pastedContent:pastedText,srcElement:{baseURI:window.location.href}})}else aiContents.push(text),sendKeyEvent("aiInsert",{key:"ai",keyCode:0,caretPosition:editor.caretPosition,rePosition:editor.rePosition,aiContent:text,srcElement:{baseURI:window.location.href}})}})),editor.on("input",(function(e){let position=getCaretPosition(!0);editor.caretPosition=position.caretPosition,editor.rePosition=position.rePosition;let aiContent=e.data;("insertReplacementText"===e.inputType||"insertText"===e.inputType&&aiContent&&aiContent.length>1)&&(aiContents.push(aiContent),e.key="ai",e.keyCode=0,e.caretPosition=position.caretPosition,e.rePosition=position.rePosition,e.aiContent=aiContent,sendKeyEvent("aiInsert",e))})),window.addEventListener("unload",(()=>{syncData()})),setInterval(syncData,syncInterval)}})); //# sourceMappingURL=autosaver.min.js.map \ No newline at end of file diff --git a/amd/build/autosaver.min.js.map b/amd/build/autosaver.min.js.map index e3e7b813..e0c9b4de 100644 --- a/amd/build/autosaver.min.js.map +++ b/amd/build/autosaver.min.js.map @@ -1 +1 @@ -{"version":3,"file":"autosaver.min.js","sources":["../src/autosaver.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/autosaver\n * @category TinyMCE Editor\n * @copyright CTI \n * @author Brain Station 23 \n */\n\nimport {call} from 'core/ajax';\nimport {create} from 'core/modal_factory';\nimport {get_string as getString} from 'core/str';\nimport {save, cancel, hidden} from 'core/modal_events';\nimport jQuery from 'jquery';\n\nexport const register = (editor, interval, userId) => {\n\n var isStudent = !(jQuery('#body').hasClass('teacher_admin'));\n var intervention = jQuery('#body').hasClass('intervention');\n var userid = userId;\n var host = M.cfg.wwwroot;\n var courseid = M.cfg.courseId;\n var filename = \"\";\n var quizSubmit = jQuery('#mod_quiz-next-nav');\n var ed = \"\";\n var event = \"\";\n var resourceId = 0;\n var modulename = \"\";\n var editorid = editor?.id;\n var cmid = M.cfg.contextInstanceId;\n var questionid = 0;\n let assignSubmit = jQuery('#id_submitbutton');\n var syncInterval = interval ? interval * 1000 : 10000; // Default: Sync Every 10s.\n\n const postOne = async(methodname, args) => {\n try {\n const response = await call([{\n methodname,\n args,\n }])[0];\n return response;\n } catch (error) {\n window.console.error('Error in postOne:', error);\n throw error;\n }\n };\n\n assignSubmit.on('click', async function(e) {\n e.preventDefault();\n if (filename) {\n // eslint-disable-next-line\n syncData().then(() => {\n assignSubmit.off('click').click();\n });\n } else {\n assignSubmit.off('click').click();\n }\n });\n\n quizSubmit.on('click', async function(e) {\n e.preventDefault();\n if (filename) {\n // eslint-disable-next-line\n syncData().then(() => {\n quizSubmit.off('click').click();\n });\n } else {\n quizSubmit.off('click').click();\n }\n });\n\n const getModal = (e) => {\n\n Promise.all([\n getString('tiny_cursive_srcurl', 'tiny_cursive'),\n getString('tiny_cursive_srcurl_des', 'tiny_cursive'),\n getString('tiny_cursive_placeholder', 'tiny_cursive')\n ]).then(function([title, titledes, placeholder]) {\n\n return create({\n type: 'SAVE_CANCEL',\n title: `
${title}
${titledes}
`,\n body: ``,\n\n removeOnClose: true,\n })\n .done(modal => {\n modal.getRoot().append(`\n `);\n modal.show();\n var lastEvent = '';\n // eslint-disable-next-line\n modal.getRoot().on(save, function() {\n var number = document.getElementById(\"inputUrl\").value.trim();\n if (number === \"\" || number === null || number === undefined) {\n editor.execCommand('Undo');\n // eslint-disable-next-line\n getString('pastewarning', 'tiny_cursive').then(str => alert(str));\n\n } else {\n editor.execCommand('Paste');\n }\n let ur = e.srcElement.baseURI;\n let resourceId = 0;\n let parm = new URL(ur);\n let modulename = \"\";\n let editorid = editor?.id;\n let courseid = M.cfg.courseId;\n let cmid = M.cfg.contextInstanceId;\n\n // eslint-disable-next-line\n if (ur.includes(\"attempt.php\") || ur.includes(\"forum\") || ur.includes(\"assign\") || ur.includes(\"lesson\") | ur.includes(\"oublog\")) { } else {\n return false;\n }\n if (ur.includes(\"forum\") && !ur.includes(\"assign\")) {\n resourceId = parm.searchParams.get('edit');\n }\n if (!ur.includes(\"forum\") && !ur.includes(\"assign\")) {\n resourceId = parm.searchParams.get('attempt');\n }\n\n if (resourceId === null) {\n resourceId = 0;\n }\n if (ur.includes(\"forum\")) {\n modulename = \"forum\";\n }\n if (ur.includes(\"assign\")) {\n modulename = \"assign\";\n resourceId = cmid;\n }\n if (ur.includes(\"attempt\")) {\n modulename = \"quiz\";\n }\n if (ur.includes(\"lesson\")) {\n modulename = \"lesson\";\n resourceId = cmid;\n }\n if (ur.includes(\"oublog\")) {\n modulename = \"oublog\";\n resourceId = 0;\n }\n if (cmid === null) {\n cmid = 0;\n }\n\n postOne('cursive_user_comments', {\n modulename: modulename,\n cmid: cmid,\n resourceid: resourceId,\n courseid: courseid,\n usercomment: number,\n timemodified: Date.now(),\n editorid: editorid ? editorid : \"\"\n });\n lastEvent = 'save';\n modal.destroy();\n });\n modal.getRoot().on(cancel, function() {\n\n editor.execCommand('Undo');\n lastEvent = 'cancel';\n });\n modal.getRoot().on(hidden, function() {\n if (lastEvent != 'cancel' && lastEvent != 'save') {\n editor.execCommand('Undo');\n }\n });\n return modal;\n });\n }).catch(error => window.console.error(error));\n\n };\n // eslint-disable-next-line\n const sendKeyEvent = (events, eds) => {\n let ur = eds.srcElement.baseURI;\n let parm = new URL(ur);\n ed = eds;\n event = events;\n // eslint-disable-next-line\n if (ur.includes(\"attempt.php\") || ur.includes(\"forum\") || ur.includes(\"assign\") || ur.includes('lesson') || ur.includes(\"oublog\")) { } else {\n return false;\n }\n\n if (ur.includes(\"forum\") && !ur.includes(\"assign\")) {\n resourceId = parm.searchParams.get('edit');\n } else {\n\n resourceId = parm.searchParams.get('attempt');\n }\n if (resourceId === null) {\n resourceId = 0;\n }\n\n if (ur.includes(\"forum\")) {\n modulename = \"forum\";\n }\n if (ur.includes(\"assign\")) {\n modulename = \"assign\";\n resourceId = cmid;\n }\n if (ur.includes(\"attempt\")) {\n modulename = \"quiz\";\n }\n if (ur.includes(\"lesson\")) {\n modulename = \"lesson\";\n resourceId = cmid;\n }\n if (ur.includes(\"oublog\")) {\n modulename = \"oublog\";\n resourceId = 0;\n }\n\n filename = `${userid}_${resourceId}_${cmid}_${modulename}_attempt`;\n\n if (modulename === 'quiz') {\n questionid = editorid.split(':')[1].split('_')[0];\n filename = `${userid}_${resourceId}_${cmid}_${questionid}_${modulename}_attempt`;\n\n }\n\n if (localStorage.getItem(filename)) {\n\n let data = JSON.parse(localStorage.getItem(filename));\n data.push({\n resourceId: resourceId,\n key: ed.key,\n keyCode: ed.keyCode,\n event: event,\n courseId: courseid,\n unixTimestamp: Date.now(),\n clientId: host,\n personId: userid\n });\n localStorage.setItem(filename, JSON.stringify(data));\n } else {\n let data = [];\n data.push({\n resourceId: resourceId,\n key: ed.key,\n keyCode: ed.keyCode,\n event: event,\n courseId: courseid,\n unixTimestamp: Date.now(),\n clientId: host,\n personId: userid\n });\n localStorage.setItem(filename, JSON.stringify(data));\n }\n\n };\n editor.on('keyUp', (editor) => {\n sendKeyEvent(\"keyUp\", editor);\n });\n editor.on('Paste', async(e) => {\n if (isStudent && intervention) {\n getModal(e);\n }\n });\n editor.on('Redo', async(e) => {\n if (isStudent && intervention) {\n getModal(e);\n }\n });\n editor.on('keyDown', (editor) => {\n sendKeyEvent(\"keyDown\", editor);\n });\n // eslint-disable-next-line\n editor.on('init', () => {\n\n });\n\n /**\n * Synchronizes data from localStorage to server\n * @async\n * @function SyncData\n * @description Retrieves stored keypress data from localStorage and sends it to server\n * @returns {Promise} Returns response from server if data exists and is successfully sent\n * @throws {Error} Logs error to console if data submission fails\n */\n async function syncData() {\n\n let data = localStorage.getItem(filename);\n\n if (!data || data.length === 0) {\n return;\n } else {\n localStorage.removeItem(filename);\n let originalText = editor.getContent({format: 'text'});\n try {\n // eslint-disable-next-line\n return await postOne('cursive_write_local_to_json', {\n key: ed.key,\n event: event,\n keyCode: ed.keyCode,\n resourceId: resourceId,\n cmid: cmid,\n modulename: modulename,\n editorid: editorid,\n \"json_data\": data,\n originalText: originalText\n });\n } catch (error) {\n window.console.error('Error submitting data:', error);\n }\n }\n }\n\n window.addEventListener('unload', () => {\n syncData();\n });\n\n setInterval(syncData, syncInterval);\n};\n"],"names":["editor","interval","userId","isStudent","hasClass","intervention","userid","host","M","cfg","wwwroot","courseid","courseId","filename","quizSubmit","ed","event","resourceId","modulename","editorid","id","cmid","contextInstanceId","questionid","assignSubmit","syncInterval","postOne","async","methodname","args","error","window","console","on","e","preventDefault","syncData","then","off","click","getModal","Promise","all","title","titledes","placeholder","type","body","removeOnClose","done","modal","getRoot","append","show","lastEvent","save","number","document","getElementById","value","trim","execCommand","str","alert","ur","srcElement","baseURI","parm","URL","includes","searchParams","get","resourceid","usercomment","timemodified","Date","now","destroy","cancel","hidden","catch","sendKeyEvent","events","eds","split","localStorage","getItem","data","JSON","parse","push","key","keyCode","unixTimestamp","clientId","personId","setItem","stringify","length","removeItem","originalText","getContent","format","addEventListener","setInterval"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"autosaver.min.js","sources":["../src/autosaver.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/autosaver\n * @category TinyMCE Editor\n * @copyright CTI \n * @author Brain Station 23 \n */\n\nimport {call} from 'core/ajax';\nimport {create} from 'core/modal_factory';\nimport {get_string as getString} from 'core/str';\nimport {save, cancel, hidden} from 'core/modal_events';\nimport $ from 'jquery';\nimport {iconUrl, iconGrayUrl, tooltipCss} from 'tiny_cursive/common';\nimport Autosave from 'tiny_cursive/cursive_autosave';\nimport DocumentView from 'tiny_cursive/document_view';\nimport {call as getUser} from \"core/ajax\";\n\nexport const register = (editor, interval, userId, hasApiKey, MODULES, Rubrics, submission, quizInfo, pasteSetting) => {\n\n var isStudent = !($('#body').hasClass('teacher_admin'));\n var intervention = $('#body').hasClass('intervention');\n var host = M.cfg.wwwroot;\n var userid = userId;\n var courseid = M.cfg.courseId;\n var editorid = editor?.id;\n var cmid = M.cfg.contextInstanceId;\n var ed = \"\";\n var event = \"\";\n var filename = \"\";\n var questionid = 0;\n var quizSubmit = $('#mod_quiz-next-nav');\n let assignSubmit = $('#id_submitbutton');\n var syncInterval = interval ? interval * 1000 : 10000; // Default: Sync Every 10s.\n var lastCaretPos = 1;\n let aiContents = [];\n var isFullScreen = false;\n var user = null;\n let ur = window.location.href;\n let parm = new URL(ur);\n let modulesInfo = getModulesInfo(ur, parm, MODULES);\n var resourceId = modulesInfo.resourceId;\n var modulename = modulesInfo.name;\n var errorAlert = true;\n let PASTE_SETTING = pasteSetting || 'allow';\n let shouldBlockPaste = false;\n let isPasteAllowed = false;\n\n if (ur.includes('pdfannotator')) {\n document.addEventListener('click', e => {\n if (e.target.className === \"dropdown-item comment-edit-a\") {\n let id = e.target.id;\n resourceId = id.replace('editButton', '');\n localStorage.setItem('isEditing', '1');\n }\n if (e.target.id === 'commentSubmit') {\n syncData();\n }\n });\n }\n\n const postOne = async(methodname, args) => {\n try {\n const response = await call([{\n methodname,\n args,\n }])[0];\n if (response) {\n setTimeout(() => {\n Autosave.updateSavingState('saved');\n }, 1000);\n }\n return response;\n } catch (error) {\n Autosave.updateSavingState('offline');\n window.console.error('Error in postOne:', error);\n throw error;\n }\n };\n\n getUser([{\n methodname: 'core_user_get_users_by_field',\n args: {field: 'id', values: [userid]},\n }])[0].done(response => {\n user = response[0];\n }).fail((ex) => {\n window.console.error('Error fetching user data:', ex);\n });\n\n assignSubmit.on('click', async function(e) {\n e.preventDefault();\n if (filename) {\n // eslint-disable-next-line\n syncData().then(() => {\n assignSubmit.off('click').click();\n });\n } else {\n assignSubmit.off('click').click();\n }\n localStorage.removeItem('lastCopyCutContent');\n });\n\n quizSubmit.on('click', async function(e) {\n e.preventDefault();\n if (filename) {\n // eslint-disable-next-line\n syncData().then(() => {\n quizSubmit.off('click').click();\n });\n } else {\n quizSubmit.off('click').click();\n }\n localStorage.removeItem('lastCopyCutContent');\n });\n\n const getModal = () => {\n\n Promise.all([\n getString('tiny_cursive_srcurl', 'tiny_cursive'),\n getString('tiny_cursive_srcurl_des', 'tiny_cursive'),\n getString('tiny_cursive_placeholder', 'tiny_cursive')\n ]).then(function([title, titledes, placeholder]) {\n\n return create({\n type: 'SAVE_CANCEL',\n title: `
${title}
\n ${titledes}
`,\n body: ``,\n removeOnClose: true,\n })\n .done(modal => {\n modal.getRoot().addClass('tiny-cursive-modal');\n modal.show();\n var lastEvent = '';\n\n modal.getRoot().on(save, function() {\n\n var number = document.getElementById(\"inputUrl\").value.trim();\n\n if (number === \"\" || number === null || number === undefined) {\n editor.execCommand('Undo');\n // eslint-disable-next-line\n getString('pastewarning', 'tiny_cursive').then(str => alert(str));\n } else {\n editor.execCommand('Paste');\n }\n\n postOne('cursive_user_comments', {\n modulename: modulename,\n cmid: cmid,\n resourceid: resourceId,\n courseid: courseid,\n usercomment: number,\n timemodified: Date.now(),\n editorid: editorid ? editorid : \"\"\n });\n\n lastEvent = 'save';\n modal.destroy();\n });\n modal.getRoot().on(cancel, function() {\n editor.execCommand('Undo');\n lastEvent = 'cancel';\n });\n\n modal.getRoot().on(hidden, function() {\n if (lastEvent != 'cancel' && lastEvent != 'save') {\n editor.execCommand('Undo');\n }\n });\n return modal;\n });\n }).catch(error => window.console.error(error));\n\n };\n\n const sendKeyEvent = (events, editor) => {\n ed = editor;\n event = events;\n\n filename = `${userid}_${resourceId}_${cmid}_${modulename}_attempt`;\n\n if (modulename === 'quiz') {\n questionid = editorid.split(':')[1].split('_')[0];\n filename = `${userid}_${resourceId}_${cmid}_${questionid}_${modulename}_attempt`;\n }\n\n if (localStorage.getItem(filename)) {\n let data = JSON.parse(localStorage.getItem(filename));\n data.push({\n resourceId: resourceId,\n key: editor.key,\n keyCode: editor.keyCode,\n event: event,\n courseId: courseid,\n unixTimestamp: Date.now(),\n clientId: host,\n personId: userid,\n position: ed.caretPosition,\n rePosition: ed.rePosition,\n pastedContent: editor.pastedContent,\n aiContent: editor.aiContent\n });\n localStorage.setItem(filename, JSON.stringify(data));\n } else {\n let data = [{\n resourceId: resourceId,\n key: editor.key,\n keyCode: editor.keyCode,\n event: event,\n courseId: courseid,\n unixTimestamp: Date.now(),\n clientId: host,\n personId: userid,\n position: ed.caretPosition,\n rePosition: ed.rePosition,\n pastedContent: editor.pastedContent,\n aiContent: editor.aiContent\n }];\n localStorage.setItem(filename, JSON.stringify(data));\n }\n };\n\n editor.on('keyUp', (editor) => {\n customTooltip();\n let position = getCaretPosition(false);\n editor.caretPosition = position.caretPosition;\n editor.rePosition = position.rePosition;\n sendKeyEvent(\"keyUp\", editor);\n });\n editor.on('Paste', async(e) => {\n customTooltip();\n const pastedContent = (e.clipboardData || e.originalEvent.clipboardData).getData('text');\n if (!pastedContent) {\n return;\n }\n // Trim both values for consistent comparison\n const trimmedPastedContent = pastedContent.trim();\n const lastCopyCutContent = localStorage.getItem('lastCopyCutContent');\n const isFromOwnEditor = lastCopyCutContent && trimmedPastedContent === lastCopyCutContent;\n\n if (isStudent && intervention) {\n\n if (PASTE_SETTING === 'block') {\n if (!isFromOwnEditor) {\n e.preventDefault();\n shouldBlockPaste = true;\n isPasteAllowed = false;\n e.stopPropagation();\n e.stopImmediatePropagation();\n getString('paste_blocked', 'tiny_cursive').then(str => {\n return editor.windowManager.alert(str);\n }).catch(error => window.console.error(error));\n setTimeout(() => {\n isPasteAllowed = true;\n shouldBlockPaste = false;\n }, 100);\n return;\n }\n shouldBlockPaste = false;\n isPasteAllowed = true;\n return;\n }\n if (PASTE_SETTING === 'cite_source') {\n if (!isFromOwnEditor) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n getModal(e);\n }\n isPasteAllowed = true;\n return;\n }\n }\n isPasteAllowed = true;\n });\n editor.on('Redo', async(e) => {\n customTooltip();\n if (isStudent && intervention) {\n getModal(e);\n }\n });\n editor.on('keyDown', (editor) => {\n customTooltip();\n const isPasteAttempt = (editor.key === 'v' || editor.key === 'V') &&\n (editor.ctrlKey || editor.metaKey);\n if (isPasteAttempt && isStudent && intervention && PASTE_SETTING === 'block' && !isPasteAllowed) {\n setTimeout(() => {\n isPasteAllowed = true;\n }, 100);\n return;\n }\n let position = getCaretPosition();\n editor.caretPosition = position.caretPosition;\n editor.rePosition = position.rePosition;\n sendKeyEvent(\"keyDown\", editor);\n });\n editor.on('Cut', () => {\n const selectedContent = editor.selection.getContent({format: 'text'});\n localStorage.setItem('lastCopyCutContent', selectedContent.trim());\n });\n editor.on('Copy', () => {\n const selectedContent = editor.selection.getContent({format: 'text'});\n localStorage.setItem('lastCopyCutContent', selectedContent.trim());\n });\n editor.on('mouseDown', async(editor) => {\n setTimeout(() => {\n constructMouseEvent(editor);\n sendKeyEvent(\"mouseDown\", editor);\n }, 0);\n });\n editor.on('mouseUp', async(editor) => {\n setTimeout(() => {\n constructMouseEvent(editor);\n sendKeyEvent(\"mouseUp\", editor);\n }, 10);\n });\n editor.on('init', () => {\n customTooltip();\n localStorage.removeItem('lastCopyCutContent');\n });\n editor.on('SetContent', () => {\n customTooltip();\n });\n editor.on('FullscreenStateChanged', (e) => {\n let view = new DocumentView(user, Rubrics, submission, modulename, editor, quizInfo);\n isFullScreen = e.state;\n try {\n if (!e.state) {\n view.normalMode();\n } else {\n view.fullPageMode();\n }\n } catch (error) {\n if (errorAlert) {\n errorAlert = false;\n getString('fullmodeerror', 'tiny_cursive').then(str => {\n return editor.windowManager.alert(str);\n }).catch(error => window.console.error(error));\n }\n view.normalMode();\n window.console.error('Error ResizeEditor event:', error);\n }\n });\n\n editor.on('execcommand', function(e) {\n if (e.command === \"mceInsertContent\") {\n const contentObj = e.value;\n\n const isPaste = contentObj && typeof contentObj === 'object' && contentObj.paste === true;\n\n let insertedContent = contentObj.content || contentObj;\n let tempDiv = document.createElement('div');\n tempDiv.innerHTML = insertedContent;\n let text = tempDiv.textContent || tempDiv.innerText || '';\n let pastedText = tempDiv.textContent || tempDiv.innerText || '';\n\n let position = getCaretPosition(true);\n editor.caretPosition = position.caretPosition;\n editor.rePosition = position.rePosition;\n\n if (isPaste) {\n if (shouldBlockPaste) {\n shouldBlockPaste = false;\n e.preventDefault();\n editor.undoManager.undo();\n return;\n }\n const lastCopyCutContent = localStorage.getItem('lastCopyCutContent');\n const isFromOwnEditor = lastCopyCutContent && pastedText.trim() === lastCopyCutContent;\n\n if (isStudent && intervention && PASTE_SETTING === 'block' && !isFromOwnEditor) {\n isPasteAllowed = false;\n editor.undoManager.undo();\n return;\n }\n\n sendKeyEvent(\"Paste\", {\n key: \"v\",\n keyCode: 86,\n caretPosition: editor.caretPosition,\n rePosition: editor.rePosition,\n pastedContent: pastedText,\n srcElement: {baseURI: window.location.href}\n });\n } else {\n aiContents.push(text);\n\n sendKeyEvent(\"aiInsert\", {\n key: \"ai\",\n keyCode: 0,\n caretPosition: editor.caretPosition,\n rePosition: editor.rePosition,\n aiContent: text,\n srcElement: {baseURI: window.location.href}\n });\n }\n }\n });\n\n editor.on('input', function(e) {\n let position = getCaretPosition(true);\n editor.caretPosition = position.caretPosition;\n editor.rePosition = position.rePosition;\n let aiContent = e.data;\n\n if (e.inputType === 'insertReplacementText' || (e.inputType === 'insertText' && aiContent && aiContent.length > 1)) {\n\n aiContents.push(aiContent);\n\n e.key = \"ai\";\n e.keyCode = 0;\n e.caretPosition = position.caretPosition;\n e.rePosition = position.rePosition;\n e.aiContent = aiContent;\n\n sendKeyEvent(\"aiInsert\", e);\n }\n });\n\n\n /**\n * Constructs a mouse event object with caret position and button information\n * @param {Object} editor - The TinyMCE editor instance\n * @function constructMouseEvent\n * @description Sets caret position, reposition, key and keyCode properties on the editor object based on current mouse state\n */\n function constructMouseEvent(editor) {\n let position = getCaretPosition(false);\n editor.caretPosition = position.caretPosition;\n editor.rePosition = position.rePosition;\n editor.key = getMouseButton(editor);\n editor.keyCode = editor.button;\n }\n\n /**\n * Gets the string representation of a mouse button based on its numeric value\n * @param {Object} editor - The editor object containing button information\n * @returns {string} The string representation of the mouse button ('left', 'middle', or 'right')\n */\n function getMouseButton(editor) {\n\n switch (editor.button) {\n case 0:\n return 'left';\n case 1:\n return 'middle';\n case 2:\n return 'right';\n }\n return null;\n }\n\n /**\n * Gets the current caret position in the editor\n * @param {boolean} skip - If true, returns the last known caret position instead of calculating a new one\n * @returns {Object} Object containing:\n * - caretPosition: Sequential position number stored in session\n * - rePosition: Absolute character offset from start of content\n * @throws {Error} Logs warning to console if error occurs during calculation\n */\n function getCaretPosition(skip = false) {\n try {\n if (!editor || !editor.selection) {\n return {caretPosition: 0, rePosition: 0};\n }\n\n const range = editor.selection.getRng();\n const body = editor.getBody();\n\n // Create a range from start of document to current caret\n const preCaretRange = range.cloneRange();\n preCaretRange.selectNodeContents(body);\n preCaretRange.setEnd(range.endContainer, range.endOffset);\n\n const fragment = preCaretRange.cloneContents();\n const tempDiv = document.createElement('div');\n tempDiv.appendChild(fragment);\n let textBeforeCursor = tempDiv.innerText || '';\n\n const endContainer = range.endContainer;\n const endOffset = range.endOffset;\n\n if (endOffset === 0 &&\n endContainer.nodeType === Node.ELEMENT_NODE &&\n editor.dom.isBlock(endContainer) &&\n endContainer.previousSibling) {\n textBeforeCursor += '\\n';\n }\n const blockElements = tempDiv.querySelectorAll('p, div, h1, h2, h3, h4, h5, h6, li');\n let emptyBlockCount = 0;\n blockElements.forEach(block => {\n const text = block.innerText || block.textContent || '';\n if (text.trim() === '' && block.childNodes.length === 1 &&\n block.childNodes[0].nodeName === 'BR') {\n emptyBlockCount++;\n }\n });\n\n // Add newlines for empty blocks (these represent Enter presses that created empty lines)\n if (emptyBlockCount > 0) {\n textBeforeCursor += '\\n'.repeat(emptyBlockCount);\n }\n\n const absolutePosition = textBeforeCursor.length;\n\n if (skip) {\n return {\n caretPosition: lastCaretPos,\n rePosition: absolutePosition\n };\n }\n // Increment sequential caretPosition\n const storageKey = `${userid}_${resourceId}_${cmid}_position`;\n let storedPos = parseInt(sessionStorage.getItem(storageKey), 10);\n if (isNaN(storedPos)) {\n storedPos = 0;\n }\n storedPos++;\n lastCaretPos = storedPos;\n sessionStorage.setItem(storageKey, storedPos);\n\n return {\n caretPosition: storedPos,\n rePosition: absolutePosition\n };\n\n } catch (e) {\n window.console.warn('Error getting caret position:', e);\n return {caretPosition: lastCaretPos || 1, rePosition: 0};\n }\n }\n\n\n /**\n * Synchronizes data from localStorage to server\n * @async\n * @function SyncData\n * @description Retrieves stored keypress data from localStorage and sends it to server\n * @returns {Promise} Returns response from server if data exists and is successfully sent\n * @throws {Error} Logs error to console if data submission fails\n */\n async function syncData() {\n checkIsPdfAnnotator();\n let data = localStorage.getItem(filename);\n\n if (!data || data.length === 0) {\n return;\n } else {\n localStorage.removeItem(filename);\n editor.fire('change');\n let originalText = editor.getContent({format: 'text'});\n if (!originalText) {\n originalText = getRawText(editor);\n }\n try {\n Autosave.updateSavingState('saving');\n // eslint-disable-next-line\n return await postOne('cursive_write_local_to_json', {\n key: ed.key,\n event: event,\n keyCode: ed.keyCode,\n resourceId: resourceId,\n cmid: cmid,\n modulename: modulename,\n editorid: editorid,\n \"json_data\": data,\n originalText: originalText\n });\n } catch (error) {\n window.console.error('Error submitting data:', error);\n }\n }\n }\n\n /**\n * Gets the raw text content from a TinyMCE editor iframe\n * @param {Object} editor - The TinyMCE editor instance\n * @returns {string} The raw text content of the editor body, or empty string if not found\n * @description Attempts to get the raw text content from the editor's iframe body by:\n * 1. Getting the editor ID\n * 2. Finding the associated iframe element\n * 3. Accessing the iframe's document body\n * 4. Returning the text content\n * Returns empty string if any step fails\n */\n function getRawText(editor) {\n let editorId = editor?.id;\n if (editorId) {\n let iframe = document.querySelector(`#${editorId}_ifr`);\n let iframeBody = iframe.contentDocument?.body || iframe.contentWindow?.document?.body;\n return iframeBody?.textContent;\n }\n return \"\";\n }\n\n /**\n * Sets up custom tooltip functionality for the Cursive icon\n * Initializes tooltip text, positions the icon in the menubar,\n * and sets up mouse event handlers for showing/hiding the tooltip\n * @function customTooltip\n */\n function customTooltip() {\n try {\n const tooltipText = getTooltipText();\n const menubarDiv = document.querySelectorAll('div[role=\"menubar\"].tox-menubar');\n let classArray = [];\n\n if (menubarDiv.length) {\n menubarDiv.forEach(function(element, index) {\n index += 1;\n let className = 'cursive-menu-' + index;\n element.classList.add(className);\n classArray.push(className);\n });\n }\n\n const cursiveIcon = document.createElement('img');\n cursiveIcon.src = hasApiKey ? iconUrl : iconGrayUrl;\n\n cursiveIcon.setAttribute('class', 'tiny_cursive_StateButton');\n cursiveIcon.style.display = 'inline-block';\n\n cursiveState(cursiveIcon, menubarDiv, classArray);\n\n for (let index in classArray) {\n const elementId = \"tiny_cursive_StateIcon\" + index;\n const tooltipId = `tiny_cursive_tooltip${index}`;\n\n tooltipText.then((text) => {\n return setTooltip(text, document.querySelector(`#${elementId}`), tooltipId);\n }).catch(error => window.console.error(error));\n\n $(`#${elementId}`).on('mouseenter', function() {\n $(this).css('position', 'relative');\n $(`#${tooltipId}`).css(tooltipCss);\n });\n\n $(`#${elementId}`).on('mouseleave', function() {\n $(`#${tooltipId}`).css('display', 'none');\n });\n }\n } catch (error) {\n window.console.error('Error setting up custom tooltip:', error);\n }\n }\n\n /**\n * Retrieves tooltip text strings from language files\n * @async\n * @function getTooltipText\n * @returns {Promise} Object containing buttonTitle and buttonDes strings\n */\n async function getTooltipText() {\n const [\n buttonTitle,\n buttonDes,\n ] = await Promise.all([\n getString('cursive:state:active', 'tiny_cursive'),\n getString('cursive:state:active:des', 'tiny_cursive'),\n ]);\n return {buttonTitle, buttonDes};\n }\n\n /**\n * Updates the Cursive icon state and positions it in the menubar\n * @param {HTMLElement} cursiveIcon - The Cursive icon element to modify\n * @param {HTMLElement} menubarDiv - The menubar div element\n * @param {Array} classArray - Array of class names for the menubar div elements\n */\n function cursiveState(cursiveIcon, menubarDiv, classArray) {\n if (!menubarDiv) {\n return;\n }\n\n for (let index in classArray) {\n const rightWrapper = document.createElement('div');\n const imgWrapper = document.createElement('span');\n const iconClone = cursiveIcon.cloneNode(true);\n const targetMenu = document.querySelector('.' + classArray[index]);\n let elementId = \"tiny_cursive_StateIcon\" + index;\n\n rightWrapper.style.cssText = `\n margin-left: auto;\n display: flex;\n align-items: center;\n `;\n\n imgWrapper.id = elementId;\n imgWrapper.style.marginLeft = '.2rem';\n imgWrapper.appendChild(iconClone);\n rightWrapper.appendChild(imgWrapper);\n\n let moduleIds = {\n resourceId: resourceId,\n cmid: cmid,\n modulename: modulename,\n questionid: questionid,\n userid: userid,\n courseid: courseid};\n // Document mode, other modules single editor instances\n if (isFullScreen && (modulename === 'assign' || modulename === 'forum'\n || modulename === 'lesson')) {\n let existsElement = document.querySelector('.tox-menubar[class*=\"cursive-menu-\"] > div');\n if (existsElement) {\n existsElement.remove();\n }\n\n if (!document.querySelector(`#${elementId}`)) {\n rightWrapper.style.marginTop = '3px';\n document.querySelector('#tiny_cursive-fullpage-right-wrapper').prepend(rightWrapper);\n }\n\n Autosave.destroyInstance();\n Autosave.getInstance(editor, rightWrapper, moduleIds, isFullScreen);\n } else if (isFullScreen && modulename === 'quiz') { // Document mode, quiz multiple editor instances\n let existingElement = editor.container?.childNodes[1]?.childNodes[0]?.childNodes[0]?.childNodes[7];\n let newHeader = editor.container?.childNodes[0];\n if (existingElement) {\n existingElement.remove();\n }\n\n if (newHeader && !newHeader.querySelector(`span[id*=tiny_cursive_StateIcon]`)) {\n rightWrapper.style.marginTop = '3px';\n document.querySelector('#tiny_cursive-fullpage-right-wrapper').prepend(rightWrapper);\n }\n Autosave.destroyInstance();\n Autosave.getInstance(editor, rightWrapper, moduleIds, isFullScreen);\n } else { // Regular view\n let menubar = editor?.container?.children[0]?.childNodes[0]?.childNodes[0];\n\n if (targetMenu && !targetMenu.querySelector(`#${elementId}`)) {\n targetMenu.appendChild(rightWrapper);\n }\n // Regular view, multiple editor instances\n if (modulename === 'quiz' && menubar) {\n let wrapper = menubar.querySelector('span[id*=\"tiny_cursive_StateIcon\"]');\n\n if (wrapper) {\n Autosave.destroyInstance();\n Autosave.getInstance(editor, wrapper?.parentElement, moduleIds, isFullScreen);\n }\n } else {\n Autosave.destroyInstance();\n Autosave.getInstance(editor, rightWrapper, moduleIds, isFullScreen);\n }\n }\n }\n }\n\n /**\n * Sets up tooltip content and styling for the Cursive icon\n * @param {Object} text - Object containing tooltip text strings\n * @param {string} text.buttonTitle - Title text for the tooltip\n * @param {string} text.buttonDes - Description text for the tooltip\n * @param {HTMLElement} cursiveIcon - The Cursive icon element to attach tooltip to\n * @param {string} tooltipId - ID for the tooltip element\n */\n function setTooltip(text, cursiveIcon, tooltipId) {\n\n if (document.querySelector(`#${tooltipId}`)) {\n return;\n }\n if (cursiveIcon) {\n\n const tooltipSpan = document.createElement('span');\n const description = document.createElement('span');\n const linebreak = document.createElement('br');\n const tooltipTitle = document.createElement('strong');\n\n tooltipSpan.style.display = 'none';\n tooltipTitle.textContent = text.buttonTitle;\n tooltipTitle.style.fontSize = '16px';\n tooltipTitle.style.fontWeight = 'bold';\n description.textContent = text.buttonDes;\n description.style.fontSize = '14px';\n\n tooltipSpan.id = tooltipId;\n tooltipSpan.classList.add(`shadow`);\n tooltipSpan.appendChild(tooltipTitle);\n tooltipSpan.appendChild(linebreak);\n tooltipSpan.appendChild(description);\n cursiveIcon.appendChild(tooltipSpan);\n }\n }\n\n /**\n * Extracts module information from URL parameters\n * @param {string} ur - The base URL to analyze\n * @param {URL} parm - URL object containing search parameters\n * @param {Array} MODULES - Array of valid module names to check against\n * @returns {Object|boolean} Object containing resourceId and module name if found, false if no valid module\n */\n function getModulesInfo(ur, parm, MODULES) {\n fetchStrings();\n\n if (!MODULES.some(module => ur.includes(module))) {\n return false;\n }\n\n if (ur.includes(\"forum\") && !ur.includes(\"assign\")) {\n resourceId = parm.searchParams.get('edit');\n } else {\n resourceId = parm.searchParams.get('attempt');\n }\n\n if (resourceId === null) {\n resourceId = 0;\n }\n\n for (const module of MODULES) {\n if (ur.includes(module)) {\n modulename = module;\n if (module === \"lesson\" || module === \"assign\") {\n resourceId = cmid;\n } else if (module === \"oublog\") {\n resourceId = 0;\n }\n break;\n }\n }\n\n checkIsPdfAnnotator();\n\n return {resourceId: resourceId, name: modulename};\n }\n\n /**\n * Fetches and caches localized strings used in the UI\n * @function fetchStrings\n * @description Retrieves strings for sidebar titles and document sidebar elements if not already cached in localStorage\n * Uses Promise.all to fetch multiple strings in parallel for better performance\n * Stores the fetched strings in localStorage under 'sbTitle' and 'docSideBar' keys\n */\n function fetchStrings() {\n if (!localStorage.getItem('sbTitle')) {\n Promise.all([\n getString('assignment', 'tiny_cursive'),\n getString('discussion', 'tiny_cursive'),\n getString('pluginname', 'mod_quiz'),\n getString('pluginname', 'mod_lesson'),\n getString('description', 'tiny_cursive'),\n ]).then(function(strings) {\n return localStorage.setItem('sbTitle', JSON.stringify(strings));\n }).catch(error => window.console.error(error));\n }\n if (!localStorage.getItem('docSideBar')) {\n Promise.all([\n getString('details', 'tiny_cursive'),\n getString('student_info', 'tiny_cursive'),\n getString('progress', 'tiny_cursive'),\n getString('description', 'tiny_cursive'),\n getString('replyingto', 'tiny_cursive'),\n getString('answeringto', 'tiny_cursive'),\n getString('importantdates', 'tiny_cursive'),\n getString('rubrics', 'tiny_cursive'),\n getString('submission_status', 'tiny_cursive'),\n getString('status', 'tiny_cursive'),\n getString('draft', 'tiny_cursive'),\n getString('draftnot', 'tiny_cursive'),\n getString('last_modified', 'tiny_cursive'),\n getString('gradings', 'tiny_cursive'),\n getString('gradenot', 'tiny_cursive'),\n getString('word_count', 'tiny_cursive'),\n getString('timeleft', 'tiny_cursive'),\n getString('nolimit', 'tiny_cursive'),\n getString('name', 'tiny_cursive'),\n getString('userename', 'tiny_cursive'),\n getString('course', 'tiny_cursive'),\n getString('opened', 'tiny_cursive'),\n getString('due', 'tiny_cursive'),\n getString('overdue', 'tiny_cursive'),\n getString('remaining', 'tiny_cursive'),\n getString('savechanges', 'tiny_cursive'),\n getString('subjectnot', 'tiny_cursive'),\n getString('remaining', 'tiny_cursive'),\n ]).then(function(strings) {\n return localStorage.setItem('docSideBar', JSON.stringify(strings));\n }).catch(error => window.console.error(error));\n }\n\n }\n\n /**\n * Checks if the current page is a PDF annotator and updates the resourceId accordingly\n * @function checkIsPdfAnnotator\n * @description Checks if URL contains 'pdfannotator' and sets resourceId based on editor ID and editing state:\n * - If editing an existing annotation (editor.id !== 'id_pdfannotator_content' and isEditing is true):\n * Sets resourceId to the annotation ID extracted from editor.id\n * - Otherwise: Sets resourceId to 0\n */\n function checkIsPdfAnnotator() {\n if (ur.includes('pdfannotator')) {\n if (editor.id !== 'id_pdfannotator_content' && parseInt(localStorage.getItem('isEditing'))) {\n resourceId = parseInt(editor?.id.replace('editarea', ''));\n } else {\n resourceId = 0;\n }\n }\n }\n\n window.addEventListener('unload', () => {\n syncData();\n });\n\n setInterval(syncData, syncInterval);\n};\n"],"names":["editor","interval","userId","hasApiKey","MODULES","Rubrics","submission","quizInfo","pasteSetting","isStudent","hasClass","intervention","host","M","cfg","wwwroot","userid","courseid","courseId","editorid","id","cmid","contextInstanceId","ed","event","filename","questionid","quizSubmit","assignSubmit","syncInterval","lastCaretPos","aiContents","isFullScreen","user","ur","window","location","href","parm","URL","modulesInfo","localStorage","getItem","Promise","all","then","strings","setItem","JSON","stringify","catch","error","console","fetchStrings","some","module","includes","resourceId","searchParams","get","modulename","checkIsPdfAnnotator","name","getModulesInfo","errorAlert","PASTE_SETTING","shouldBlockPaste","isPasteAllowed","document","addEventListener","e","target","className","replace","syncData","postOne","async","methodname","args","response","setTimeout","updateSavingState","field","values","done","fail","ex","on","preventDefault","off","click","removeItem","getModal","title","titledes","placeholder","type","body","removeOnClose","modal","getRoot","addClass","show","lastEvent","save","number","getElementById","value","trim","execCommand","str","alert","resourceid","usercomment","timemodified","Date","now","destroy","cancel","hidden","sendKeyEvent","events","split","data","parse","push","key","keyCode","unixTimestamp","clientId","personId","position","caretPosition","rePosition","pastedContent","aiContent","constructMouseEvent","getCaretPosition","button","getMouseButton","skip","selection","range","getRng","getBody","preCaretRange","cloneRange","selectNodeContents","setEnd","endContainer","endOffset","fragment","cloneContents","tempDiv","createElement","appendChild","textBeforeCursor","innerText","nodeType","Node","ELEMENT_NODE","dom","isBlock","previousSibling","blockElements","querySelectorAll","emptyBlockCount","forEach","block","textContent","childNodes","length","nodeName","repeat","absolutePosition","storageKey","storedPos","parseInt","sessionStorage","isNaN","warn","fire","originalText","getContent","format","editorId","iframe","querySelector","iframeBody","contentDocument","contentWindow","_iframe$contentWindow","_iframe$contentWindow2","getRawText","customTooltip","tooltipText","buttonTitle","buttonDes","getTooltipText","menubarDiv","classArray","element","index","classList","add","cursiveIcon","src","iconUrl","iconGrayUrl","setAttribute","style","display","rightWrapper","imgWrapper","iconClone","cloneNode","targetMenu","elementId","cssText","marginLeft","moduleIds","existingElement","container","_editor$container","_editor$container$chi","_editor$container$chi2","_editor$container$chi3","newHeader","_editor$container2","remove","marginTop","prepend","destroyInstance","getInstance","menubar","_editor$container3","children","_editor$container3$ch","_editor$container3$ch2","wrapper","parentElement","existsElement","cursiveState","tooltipId","text","setTooltip","this","css","tooltipCss","tooltipSpan","description","linebreak","tooltipTitle","fontSize","fontWeight","clipboardData","originalEvent","getData","trimmedPastedContent","lastCopyCutContent","isFromOwnEditor","stopPropagation","stopImmediatePropagation","windowManager","ctrlKey","metaKey","selectedContent","view","DocumentView","state","fullPageMode","normalMode","command","contentObj","isPaste","paste","insertedContent","content","innerHTML","pastedText","undoManager","undo","srcElement","baseURI","inputType","setInterval"],"mappings":"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"} \ No newline at end of file diff --git a/amd/build/common.min.js b/amd/build/common.min.js index ca81f4eb..c2b8ed1c 100644 --- a/amd/build/common.min.js +++ b/amd/build/common.min.js @@ -1,3 +1,3 @@ -define("tiny_cursive/common",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0;var _default={component:"tiny_cursive",pluginName:"".concat("tiny_cursive","/plugin")};return _exports.default=_default,_exports.default})); +define("tiny_cursive/common",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0;var _default={component:"tiny_cursive",pluginName:"tiny_cursive/plugin",iconUrl:M.util.image_url("cursive","tiny_cursive"),iconSaving:M.util.image_url("rotate","tiny_cursive"),iconGrayUrl:M.util.image_url("cursive_gray","tiny_cursive"),tooltipCss:{display:"block",position:"absolute",transform:"translateX(-100%)",backgroundColor:"white",color:"black",border:"1px solid #ccc",marginBottom:"6px",padding:"10px",textAlign:"justify",minWidth:"200px",borderRadius:"1px",pointerEvents:"none",zIndex:1e4}};return _exports.default=_default,_exports.default})); //# sourceMappingURL=common.min.js.map \ No newline at end of file diff --git a/amd/build/common.min.js.map b/amd/build/common.min.js.map index ea412f21..ddc7a5f5 100644 --- a/amd/build/common.min.js.map +++ b/amd/build/common.min.js.map @@ -1 +1 @@ -{"version":3,"file":"common.min.js","sources":["../src/common.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/common\n * @category TinyMCE Editor\n * @copyright 2025 CTI \n * @author Brain Station 23 \n */\n\n\nconst component = 'tiny_cursive';\n\nexport default {\n component,\n pluginName: `${component}/plugin`,\n};\n"],"names":["component","pluginName"],"mappings":"0JAyBe,CACXA,UAHc,eAIdC,qBAJc"} \ No newline at end of file +{"version":3,"file":"common.min.js","sources":["../src/common.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/common\n * @category TinyMCE Editor\n * @copyright 2025 CTI \n * @author Brain Station 23 \n */\n\n\nconst component = 'tiny_cursive';\n\nexport default {\n component,\n pluginName: `${component}/plugin`,\n iconUrl: M.util.image_url('cursive', 'tiny_cursive'),\n iconSaving: M.util.image_url('rotate', 'tiny_cursive'),\n iconGrayUrl: M.util.image_url('cursive_gray', 'tiny_cursive'),\n tooltipCss: {\n display: 'block',\n position: 'absolute',\n transform: 'translateX(-100%)',\n backgroundColor: 'white',\n color: 'black',\n border: '1px solid #ccc',\n marginBottom: '6px',\n padding: '10px',\n textAlign: 'justify',\n minWidth: '200px',\n borderRadius: '1px',\n pointerEvents: 'none',\n zIndex: 10000\n }\n};\n"],"names":["component","pluginName","iconUrl","M","util","image_url","iconSaving","iconGrayUrl","tooltipCss","display","position","transform","backgroundColor","color","border","marginBottom","padding","textAlign","minWidth","borderRadius","pointerEvents","zIndex"],"mappings":"0JAyBe,CACXA,UAHc,eAIdC,WAAa,sBACbC,QAASC,EAAEC,KAAKC,UAAU,UAAW,gBACrCC,WAAYH,EAAEC,KAAKC,UAAU,SAAU,gBACvCE,YAAaJ,EAAEC,KAAKC,UAAU,eAAgB,gBAC9CG,WAAY,CACRC,QAAS,QACTC,SAAU,WACVC,UAAW,oBACXC,gBAAiB,QACjBC,MAAO,QACPC,OAAQ,iBACRC,aAAc,MACdC,QAAS,OACTC,UAAW,UACXC,SAAU,QACVC,aAAc,MACdC,cAAe,OACfC,OAAQ"} \ No newline at end of file diff --git a/amd/build/cursive_autosave.min.js b/amd/build/cursive_autosave.min.js new file mode 100644 index 00000000..2ff57d50 --- /dev/null +++ b/amd/build/cursive_autosave.min.js @@ -0,0 +1,10 @@ +define("tiny_cursive/cursive_autosave",["exports","core/templates","core/ajax","tiny_cursive/svg_repo","core/str"],(function(_exports,_templates,_ajax,_svg_repo,_str){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +/** + * TODO describe module cursive_autosave + * + * @module tiny_cursive/cursive_autosave + * @copyright 2025 Cursive Technology, Inc. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_templates=_interopRequireDefault(_templates),_svg_repo=_interopRequireDefault(_svg_repo);class CursiveAutosave{static instance=null;constructor(editor,rightWrapper,modules,isFullScreen){if(CursiveAutosave.instance)return CursiveAutosave.instance;this.editor=editor,this.module=modules,this.savingState="",this.rightWrapper=rightWrapper,this.isFullScreen=isFullScreen,this.fetchSavedContent=this.fetchSavedContent.bind(this),this.handleEscapeKey=this.handleEscapeKey.bind(this),this._savingTimer=null,CursiveAutosave.instance=this,this.fetchStrings()}static getInstance(editor,rightWrapper,modules,isFullScreen){this.instance||(this.instance=new CursiveAutosave(editor,rightWrapper,modules,isFullScreen)),this.instance.isFullScreen=isFullScreen;return("quiz"===modules.modulename?document.querySelector(`#tiny_cursive_savingState${modules.questionid}`):document.querySelector("#tiny_cursive_savingState"))||this.instance.init(),this.instance}init(){const stateWrapper=this.cursiveSavingState(this.savingState);stateWrapper.classList.add("tiny_cursive_savingState","btn"),"quiz"===this.module.modulename?stateWrapper.id=`tiny_cursive_savingState${this.module.questionid}`:stateWrapper.id="tiny_cursive_savingState",this.rightWrapper.prepend(stateWrapper),stateWrapper.addEventListener("click",this.fetchSavedContent)}destroy(){CursiveAutosave.instance=null}static destroyInstance(){this.instance&&(this.instance.destroy(),this.instance=null)}cursiveSavingState(state){let wrapperDiv=document.createElement("div"),textSpan=document.createElement("span"),button=document.createElement("button"),iconSpan=document.createElement("span");return button.style.padding=".3rem",textSpan.style.fontSize="0.75rem",textSpan.style.color="gray","quiz"===this.module.modulename?(iconSpan.id=`CursiveCloudIcon${this.module.questionid}`,textSpan.id=`CursiveStateText${this.module.questionid}`):(iconSpan.id="CursiveCloudIcon",textSpan.id="CursiveStateText"),state&&(textSpan.textContent=this.getStateText(state),iconSpan.innerHTML=this.getStateIcon(state)),wrapperDiv.style.verticalAlign="middle",wrapperDiv.appendChild(iconSpan),wrapperDiv.appendChild(textSpan),button.appendChild(wrapperDiv),button}static updateSavingState(state){const instance=this.instance;instance.savingState=state;let stateWrapper=null;stateWrapper="quiz"===instance.module.modulename?document.querySelector(`#tiny_cursive_savingState${instance.module.questionid}`):document.querySelector("#tiny_cursive_savingState");let iconSpan="",stateTextEl="";stateWrapper&&("quiz"===instance.module.modulename?(iconSpan=stateWrapper.querySelector(`#CursiveCloudIcon${instance.module.questionid}`),stateTextEl=stateWrapper.querySelector(`#CursiveStateText${instance.module.questionid}`)):(iconSpan=stateWrapper.querySelector("#CursiveCloudIcon"),stateTextEl=stateWrapper.querySelector("#CursiveStateText")),stateTextEl&&iconSpan&&(stateTextEl.textContent=instance.getStateText(state),iconSpan.innerHTML=instance.getStateIcon(state)),instance._savingTimer&&clearTimeout(instance._savingTimer),"saved"===state&&stateTextEl&&(instance._savingTimer=setTimeout((()=>{stateTextEl.textContent=""}),5e3)))}getStateText(state){const[saving,saved,offline]=this.getText("state");switch(state){case"saving":return saving;case"saved":return saved;case"offline":return offline;default:return""}}getStateIcon(state){switch(state){case"saving":case"saved":return _svg_repo.default.cloudSave;case"offline":return"data:image/svg+xml;base64,"+btoa(_svg_repo.default.offline);default:return""}}async fetchSavedContent(e){var _dropdown$classList,_this$editor;e.preventDefault();let dropdown=document.querySelector("#savedDropdown");if(null==dropdown||null===(_dropdown$classList=dropdown.classList)||void 0===_dropdown$classList?void 0:_dropdown$classList.contains("show"))return void this.closeSavedDropdown();let editorWrapper=null;editorWrapper="quiz"===this.module.modulename?document.querySelector(`#tiny_cursive_savingState${this.module.questionid}`):document.querySelector("#tiny_cursive_savingState");let args={id:this.module.resourceId,cmid:this.module.cmid,modulename:`${this.module.modulename}_autosave`,editorid:null===(_this$editor=this.editor)||void 0===_this$editor?void 0:_this$editor.id,userid:this.module.userid,courseid:this.module.courseid};(0,_ajax.call)([{methodname:"cursive_get_autosave_content",args:args}])[0].done((data=>{let context={comments:JSON.parse(data)};Object.values(context.comments).forEach((content=>{content.time=this.timeAgo(content.timemodified)})),this.renderCommentList(context,editorWrapper)})).fail((error=>{this.throwWarning("fullmodeerrorr",this.editor),window.console.error("Error fetching saved content:",error)}))}toggleSavedDropdown(){var _dropdown$classList2;const dropdown=document.querySelector("#savedDropdown");(null==dropdown||null===(_dropdown$classList2=dropdown.classList)||void 0===_dropdown$classList2?void 0:_dropdown$classList2.contains("show"))?this.closeSavedDropdown():this.openSavedDropdown()}openSavedDropdown(){document.querySelector("#savedDropdown").classList.add("show"),document.removeEventListener("keydown",this.handleEscapeKey),document.addEventListener("keydown",this.handleEscapeKey)}closeSavedDropdown(){const dropdown=document.querySelector("#savedDropdown");dropdown&&(dropdown.classList.remove("show"),dropdown.remove(),document.removeEventListener("keydown",this.handleEscapeKey))}handleEscapeKey(event){"Escape"===event.key&&this.closeSavedDropdown()}timeAgo(unixTime){const seconds=Math.floor(Date.now()/1e3)-unixTime;if(seconds<5)return"just now";if(seconds<60)return`${seconds} sec ago`;const minutes=Math.floor(seconds/60);if(minutes<60)return`${minutes} min ago`;const hours=Math.floor(minutes/60);if(hours<24)return`${hours} hour${hours>1?"s":""} ago`;const days=Math.floor(hours/24);if(days<7)return`${days} day${days>1?"s":""} ago`;const weeks=Math.floor(days/7);if(weeks<4)return`${weeks} week${weeks>1?"s":""} ago`;const months=Math.floor(days/30);if(months<12)return`${months} month${months>1?"s":""} ago`;const years=Math.floor(days/365);return`${years} year${years>1?"s":""} ago`}renderCommentList(context,editorWrapper){_templates.default.render("tiny_cursive/saved_content",context).then((html=>{editorWrapper.style.position="relative";const tempDiv=document.createElement("div");if(tempDiv.innerHTML=html.trim(),tempDiv.id="savedDropdown",tempDiv.classList.add("tiny_cursive-saved-dropdown"),!tempDiv)return window.console.error("Saved content template rendered empty or invalid HTML."),!1;let existingPanel=document.querySelector("#savedDropdown");return existingPanel||(editorWrapper.appendChild(tempDiv),existingPanel=tempDiv),existingPanel.classList.toggle("active"),this.openSavedDropdown(),this.insertSavedItems(this.editor),!0})).catch((error=>window.console.error(error)))}fetchStrings(){localStorage.getItem("state")||Promise.all([(0,_str.get_string)("saving","tiny_cursive"),(0,_str.get_string)("saved","tiny_cursive"),(0,_str.get_string)("offline","tiny_cursive")]).then((function(strings){return localStorage.setItem("state",JSON.stringify(strings))})).catch((error=>window.console.error(error)))}throwWarning(str,editor){(0,_str.get_string)(str,"tiny_cursive").then((str=>editor.windowManager.alert(str))).catch((error=>window.console.error(error)))}getText(key){return JSON.parse(localStorage.getItem(key))}insertSavedItems(editor){document.querySelectorAll(".tiny_cursive-item-preview").forEach((element=>{element.addEventListener("click",(function(){editor.insertContent(" "+this.textContent)}))}))}}return _exports.default=CursiveAutosave,_exports.default})); + +//# sourceMappingURL=cursive_autosave.min.js.map \ No newline at end of file diff --git a/amd/build/cursive_autosave.min.js.map b/amd/build/cursive_autosave.min.js.map new file mode 100644 index 00000000..f0ea83bb --- /dev/null +++ b/amd/build/cursive_autosave.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cursive_autosave.min.js","sources":["../src/cursive_autosave.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * TODO describe module cursive_autosave\n *\n * @module tiny_cursive/cursive_autosave\n * @copyright 2025 Cursive Technology, Inc. \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport templates from 'core/templates';\nimport {call} from 'core/ajax';\nimport Icons from 'tiny_cursive/svg_repo';\nimport {get_string as getString} from 'core/str';\n\nexport default class CursiveAutosave {\n\n static instance = null;\n\n\n constructor(editor, rightWrapper, modules, isFullScreen) {\n if (CursiveAutosave.instance) {\n return CursiveAutosave.instance;\n }\n\n this.editor = editor;\n this.module = modules;\n this.savingState = '';\n this.rightWrapper = rightWrapper;\n this.isFullScreen = isFullScreen;\n // Bind methods that will be used as event listener\n this.fetchSavedContent = this.fetchSavedContent.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this._savingTimer = null;\n CursiveAutosave.instance = this;\n this.fetchStrings();\n }\n\n static getInstance(editor, rightWrapper, modules, isFullScreen) {\n if (!this.instance) {\n this.instance = new CursiveAutosave(editor, rightWrapper, modules, isFullScreen);\n }\n this.instance.isFullScreen = isFullScreen;\n const hasState = modules.modulename === 'quiz'\n ? document.querySelector(`#tiny_cursive_savingState${modules.questionid}`)\n : document.querySelector('#tiny_cursive_savingState');\n if (!hasState) {\n this.instance.init();\n }\n\n return this.instance;\n }\n\n init() {\n const stateWrapper = this.cursiveSavingState(this.savingState);\n stateWrapper.classList.add('tiny_cursive_savingState', 'btn');\n if (this.module.modulename === 'quiz') {\n stateWrapper.id = `tiny_cursive_savingState${this.module.questionid}`;\n } else {\n stateWrapper.id = 'tiny_cursive_savingState';\n }\n\n this.rightWrapper.prepend(stateWrapper);\n stateWrapper.addEventListener('click', this.fetchSavedContent);\n }\n\n destroy() {\n CursiveAutosave.instance = null;\n }\n\n static destroyInstance() {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n }\n }\n\n /**\n * Creates a wrapper div containing an icon and text to display the saving state\n * @param {string} state - The current saving state ('saving', 'saved', or 'offline')\n * @returns {HTMLElement} A div element containing the state icon and text\n * @description Creates and returns a div element with an icon and text span to show the current saving state.\n * The icon and text are updated based on the provided state parameter.\n */\n cursiveSavingState(state) {\n let wrapperDiv = document.createElement('div');\n let textSpan = document.createElement('span');\n let button = document.createElement('button');\n let iconSpan = document.createElement('span');\n\n button.style.padding = '.3rem';\n textSpan.style.fontSize = '0.75rem';\n textSpan.style.color = 'gray';\n\n if (this.module.modulename === 'quiz') {\n iconSpan.id = `CursiveCloudIcon${this.module.questionid}`;\n textSpan.id = `CursiveStateText${this.module.questionid}`;\n } else {\n iconSpan.id = 'CursiveCloudIcon';\n textSpan.id = 'CursiveStateText';\n }\n if (state) {\n textSpan.textContent = this.getStateText(state);\n iconSpan.innerHTML = this.getStateIcon(state);\n }\n\n wrapperDiv.style.verticalAlign = 'middle';\n\n wrapperDiv.appendChild(iconSpan);\n wrapperDiv.appendChild(textSpan);\n button.appendChild(wrapperDiv);\n\n return button;\n }\n\n /**\n * Updates the saving state icon and text in the editor\n * @param {string} state - The state to update to ('saving', 'saved', or 'offline')\n * @description Updates the global saving state and modifies the UI elements to reflect the new state\n */\n static updateSavingState(state) {\n const instance = this.instance;\n instance.savingState = state;\n let stateWrapper = null;\n if (instance.module.modulename === 'quiz') {\n stateWrapper = document.querySelector(`#tiny_cursive_savingState${instance.module.questionid}`);\n } else {\n stateWrapper = document.querySelector('#tiny_cursive_savingState');\n }\n\n let iconSpan = '';\n let stateTextEl = '';\n\n if (!stateWrapper) {\n return;\n }\n\n if (instance.module.modulename === 'quiz') {\n iconSpan = stateWrapper.querySelector(`#CursiveCloudIcon${instance.module.questionid}`);\n stateTextEl = stateWrapper.querySelector(`#CursiveStateText${instance.module.questionid}`);\n } else {\n iconSpan = stateWrapper.querySelector('#CursiveCloudIcon');\n stateTextEl = stateWrapper.querySelector('#CursiveStateText');\n }\n\n if (stateTextEl && iconSpan) {\n stateTextEl.textContent = instance.getStateText(state);\n iconSpan.innerHTML = instance.getStateIcon(state);\n }\n\n\n if (instance._savingTimer) {\n clearTimeout(instance._savingTimer);\n }\n\n if (state === 'saved' && stateTextEl) {\n instance._savingTimer = setTimeout(() => {\n stateTextEl.textContent = '';\n }, 5000);\n }\n }\n\n /**\n * Gets the display text for a given saving state\n * @param {string} state - The state to get text for ('saving', 'saved', or 'offline')\n * @returns {string} The text to display for the given state\n * @description Returns appropriate text label based on the current saving state\n */\n getStateText(state) {\n const [saving, saved, offline] = this.getText('state');\n switch (state) {\n case 'saving': return saving;\n case 'saved': return saved;\n case 'offline': return offline;\n default: return '';\n }\n }\n /**\n * Gets the icon URL for a given saving state\n * @param {string} state - The state to get icon for ('saving', 'saved', or 'offline')\n * @returns {string} The URL of the icon image for the given state\n * @description Returns appropriate icon URL based on the current saving state\n */\n getStateIcon(state) {\n switch (state) {\n case 'saving': return Icons.cloudSave;\n case 'saved': return Icons.cloudSave;\n case 'offline': return 'data:image/svg+xml;base64,' + btoa(Icons.offline);\n default: return '';\n }\n }\n\n /**\n * Fetches and displays saved content in a dropdown\n * @async\n * @param {Event} e - The event object\n * @description Handles fetching and displaying saved content when the save state button is clicked.\n * If the dropdown is already visible, it will be closed. Otherwise it will fetch saved content\n * from the server (or use cached content if available) and display it in a dropdown panel.\n * @throws {Error} Logs error to console if fetching content fails\n */\n async fetchSavedContent(e) {\n e.preventDefault();\n\n let dropdown = document.querySelector('#savedDropdown');\n let isVisible = dropdown?.classList?.contains('show');\n\n if (isVisible) {\n this.closeSavedDropdown();\n return;\n }\n let editorWrapper = null;\n if (this.module.modulename === 'quiz') {\n editorWrapper = document.querySelector(`#tiny_cursive_savingState${this.module.questionid}`);\n } else {\n editorWrapper = document.querySelector('#tiny_cursive_savingState');\n }\n\n let args = {\n id: this.module.resourceId,\n cmid: this.module.cmid,\n modulename: `${this.module.modulename}_autosave`,\n editorid: this.editor?.id,\n userid: this.module.userid,\n courseid: this.module.courseid\n };\n\n call([{\n methodname: \"cursive_get_autosave_content\",\n args: args\n }])[0].done((data) => {\n let context = {comments: JSON.parse(data)};\n Object.values(context.comments).forEach(content => {\n content.time = this.timeAgo(content.timemodified);\n });\n this.renderCommentList(context, editorWrapper);\n\n }).fail((error) => {\n this.throwWarning('fullmodeerrorr', this.editor);\n window.console.error('Error fetching saved content:', error);\n });\n }\n\n /**\n * Toggles the visibility of the saved content dropdown\n * @description Checks if the saved content dropdown is currently visible and either closes or opens it accordingly.\n * If visible, calls closeSavedDropdown(). If hidden, calls openSavedDropdown().\n */\n toggleSavedDropdown() {\n const dropdown = document.querySelector('#savedDropdown');\n const isVisible = dropdown?.classList?.contains('show');\n\n if (isVisible) {\n this.closeSavedDropdown();\n } else {\n this.openSavedDropdown();\n }\n }\n\n /**\n * Opens the saved content dropdown panel\n * @description Shows the saved content dropdown by adding the 'show' class and sets up an event listener\n * for the Escape key to allow closing the dropdown. This is called when toggling the dropdown open.\n */\n openSavedDropdown() {\n const dropdown = document.querySelector('#savedDropdown');\n dropdown.classList.add('show');\n\n // Add event listener to close on Escape key\n document.removeEventListener('keydown', this.handleEscapeKey);\n document.addEventListener('keydown', this.handleEscapeKey);\n }\n\n /**\n * Closes the saved content dropdown panel\n * @description Removes the 'show' class from the dropdown to hide it, removes the dropdown element from the DOM,\n * and removes the Escape key event listener. This is called when toggling the dropdown closed or when\n * clicking outside the dropdown.\n */\n closeSavedDropdown() {\n const dropdown = document.querySelector('#savedDropdown');\n if (dropdown) {\n dropdown.classList.remove('show');\n dropdown.remove();\n document.removeEventListener('keydown', this.handleEscapeKey);\n }\n }\n\n /**\n * Handles the Escape key press event for closing the saved content dropdown\n * @param {KeyboardEvent} event - The keyboard event object\n * @description Event handler that checks if the Escape key was pressed and closes the saved content dropdown if it was\n */\n handleEscapeKey(event) {\n if (event.key === 'Escape') {\n this.closeSavedDropdown();\n }\n }\n\n timeAgo(unixTime) {\n const seconds = Math.floor(Date.now() / 1000) - unixTime;\n\n if (seconds < 5) {\n return \"just now\";\n }\n if (seconds < 60) {\n return `${seconds} sec ago`;\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes} min ago`;\n }\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return `${hours} hour${hours > 1 ? \"s\" : \"\"} ago`;\n }\n\n const days = Math.floor(hours / 24);\n if (days < 7) {\n return `${days} day${days > 1 ? \"s\" : \"\"} ago`;\n }\n\n const weeks = Math.floor(days / 7);\n if (weeks < 4) {\n return `${weeks} week${weeks > 1 ? \"s\" : \"\"} ago`;\n }\n\n const months = Math.floor(days / 30);\n if (months < 12) {\n return `${months} month${months > 1 ? \"s\" : \"\"} ago`;\n }\n\n const years = Math.floor(days / 365);\n return `${years} year${years > 1 ? \"s\" : \"\"} ago`;\n }\n\n\n /**\n * Renders the saved content dropdown list using a template\n * @param {Object} context - The context object containing saved comments data to render\n * @param {HTMLElement} editorWrapper - The wrapper element to attach the dropdown to\n * @description Renders the saved content dropdown using the tiny_cursive/saved_content template.\n * Creates and positions the dropdown relative to the editor wrapper element.\n * Handles toggling visibility and caching of the saved content.\n * @throws {Error} Logs error to console if template rendering fails\n */\n renderCommentList(context, editorWrapper) {\n templates.render('tiny_cursive/saved_content', context).then(html => {\n editorWrapper.style.position = 'relative';\n\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = html.trim();\n tempDiv.id = 'savedDropdown';\n tempDiv.classList.add('tiny_cursive-saved-dropdown');\n\n if (!tempDiv) {\n window.console.error(\"Saved content template rendered empty or invalid HTML.\");\n return false;\n }\n\n // Add to DOM if not already added\n let existingPanel = document.querySelector('#savedDropdown');\n\n if (!existingPanel) {\n editorWrapper.appendChild(tempDiv);\n existingPanel = tempDiv;\n }\n\n // Toggle visibility\n existingPanel.classList.toggle('active');\n this.openSavedDropdown();\n\n this.insertSavedItems(this.editor);\n\n return true;\n\n }).catch(error => window.console.error(error));\n }\n\n fetchStrings() {\n if (!localStorage.getItem('state')) {\n\n Promise.all([\n getString('saving', 'tiny_cursive'),\n getString('saved', 'tiny_cursive'),\n getString('offline', 'tiny_cursive')\n ]).then(function(strings) {\n return localStorage.setItem('state', JSON.stringify(strings));\n }).catch(error => window.console.error(error));\n }\n }\n\n throwWarning(str, editor) {\n getString(str, 'tiny_cursive').then(str => {\n return editor.windowManager.alert(str);\n }).catch(error => window.console.error(error));\n }\n\n getText(key) {\n return JSON.parse(localStorage.getItem(key));\n }\n\n /**\n * Adds click event listeners to saved content items to insert them into the editor\n * @description Finds all elements with class 'tiny_cursive-item-preview' and adds click handlers that will\n * insert the element's text content into the editor when clicked. The text is inserted with\n * a leading space.\n * @param {Object} editor - The TinyMCE editor instance\n * @returns {void}\n */\n insertSavedItems(editor) {\n const items = document.querySelectorAll('.tiny_cursive-item-preview');\n items.forEach(element => {\n element.addEventListener('click', function() {\n editor.insertContent(\" \" + this.textContent);\n });\n });\n }\n\n}"],"names":["CursiveAutosave","constructor","editor","rightWrapper","modules","isFullScreen","instance","module","savingState","fetchSavedContent","this","bind","handleEscapeKey","_savingTimer","fetchStrings","modulename","document","querySelector","questionid","init","stateWrapper","cursiveSavingState","classList","add","id","prepend","addEventListener","destroy","state","wrapperDiv","createElement","textSpan","button","iconSpan","style","padding","fontSize","color","textContent","getStateText","innerHTML","getStateIcon","verticalAlign","appendChild","stateTextEl","clearTimeout","setTimeout","saving","saved","offline","getText","Icons","cloudSave","btoa","e","preventDefault","dropdown","_dropdown$classList","contains","closeSavedDropdown","editorWrapper","args","resourceId","cmid","editorid","_this$editor","userid","courseid","methodname","done","data","context","comments","JSON","parse","Object","values","forEach","content","time","timeAgo","timemodified","renderCommentList","fail","error","throwWarning","window","console","toggleSavedDropdown","_dropdown$classList2","openSavedDropdown","removeEventListener","remove","event","key","unixTime","seconds","Math","floor","Date","now","minutes","hours","days","weeks","months","years","render","then","html","position","tempDiv","trim","existingPanel","toggle","insertSavedItems","catch","localStorage","getItem","Promise","all","strings","setItem","stringify","str","windowManager","alert","querySelectorAll","element","insertContent"],"mappings":"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"} \ No newline at end of file diff --git a/amd/build/cursive_writing_reports.min.js b/amd/build/cursive_writing_reports.min.js index 3a5f024e..b3e11a58 100644 --- a/amd/build/cursive_writing_reports.min.js +++ b/amd/build/cursive_writing_reports.min.js @@ -1,3 +1,3 @@ -define("tiny_cursive/cursive_writing_reports",["jquery","core/ajax","core/str","core/templates","./replay","./analytic_button","./analytic_events"],(function($,AJAX,str,templates,Replay,analyticButton,AnalyticEvents){const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new Replay("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else templates.render("tiny_cursive/no_submission").then((html=>{$("#content"+mid).html(html)})).catch((e=>window.console.error(e)));return!1};var usersTable={init:function(page){str.get_strings([{key:"field_require",component:"tiny_cursive"}]).done((function(){usersTable.getusers(page)}));let myEvents=new AnalyticEvents;!async function(){try{!function(scoreSetting){$(".analytic-modal").each((function(){var mid=$(this).data("id"),filepath=$(this).data("filepath");let context={};context.userid=mid;let cmid=$(this).data("cmid");$(this).html(analyticButton($(this).data("id"))),AJAX.call([{methodname:"cursive_get_writing_statistics",args:{cmid:cmid,fileid:mid}}])[0].done((response=>{let data=JSON.parse(response.data);context.formattime=myEvents.formatedTime(data),context.tabledata=data;let authIcon=myEvents.authorshipStatus(data.first_file,data.score,scoreSetting);myEvents.createModal(mid,context,"",authIcon),myEvents.analytics(mid,templates,context,"",replayInstances,authIcon),myEvents.checkDiff(mid,mid,"",replayInstances),myEvents.replyWriting(mid,filepath,"",replayInstances),myEvents.quality(mid,templates,context,"",replayInstances,cmid)})).fail((error=>{throw new Error("Error: "+error.message)}))}))}(await str.get_string("confidence_threshold","tiny_cursive"))}catch(error){window.console.error("Error fetching string:",error)}}()},getusers:function(page){$("#id_coursename").change((function(){var courseid=$(this).val();AJAX.call([{methodname:"cursive_get_user_list",args:{courseid:courseid}}])[0].done((function(json){var context={tabledata:JSON.parse(json),page:page};templates.render("tiny_cursive/user_list",context).then((function(html){return $("#id_username").html(html),!0}))})),AJAX.call([{methodname:"cursive_get_module_list",args:{courseid:courseid}}])[0].done((function(json){var context={tabledata:JSON.parse(json),page:page};templates.render("tiny_cursive/module_list",context).then((function(html){return $("#id_modulename").html(html),!0}))}))}))}};return usersTable})); +define("tiny_cursive/cursive_writing_reports",["jquery","core/ajax","core/str","core/templates","./replay","./analytic_button","./replay_button","./analytic_events","core/modal_events","core/modal_save_cancel","core/modal_factory","core/modal"],(function($,AJAX,str,templates,Replay,analyticButton,replayButton,AnalyticEvents,Events,Modal,Factory,Alert){const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new Replay("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else templates.render("tiny_cursive/no_submission").then((html=>{$("#content"+mid).html(html)})).catch((e=>window.console.error(e)));return!1};var usersTable={init:function(page,hasApiKey,csvOption){str.get_strings([{key:"field_require",component:"tiny_cursive"}]).done((function(){usersTable.getusers(page)}));let myEvents=new AnalyticEvents;!async function(){try{!function(scoreSetting,hasApiKey,csvOption){$(".analytic-modal").each((function(){var mid=$(this).data("id"),filepath=$(this).data("filepath");let context={};context.userid=mid;let cmid=$(this).data("cmid");AJAX.call([{methodname:"cursive_get_writing_statistics",args:{cmid:cmid,fileid:mid}}])[0].done((response=>{let data=JSON.parse(response.data);hasApiKey?$(this).html(analyticButton(data.effort_ratio,$(this).data("id"))):$(this).html(replayButton(mid)),context.formattime=myEvents.formatedTime(data),context.tabledata=data,context.apikey=hasApiKey;let authIcon=myEvents.authorshipStatus(data.first_file,data.score,scoreSetting);myEvents.createModal(mid,context,"",replayInstances,authIcon),myEvents.analytics(mid,templates,context,"",replayInstances,authIcon),myEvents.checkDiff(mid,mid,"",replayInstances),myEvents.replyWriting(mid,filepath,"",replayInstances)})).fail((error=>{throw new Error("Error: "+error.message)}))})),$(".download-btn").on("click",(async function(e){e.preventDefault();const link1=$(this).attr("href"),link2=$(this).data("link");let type=Factory.types.SAVE_CANCEL,optionModal=Modal,select=document.createElement("select");select.id="download-type",select.classList.add("form-control","inputUrl");let title=await str.get_string("download","tiny_cursive");if(csvOption)try{const text=await str.get_string("payloadjson","tiny_cursive");let option=document.createElement("option");option.text=text,option.value=0,select.appendChild(option)}catch(error){window.console.error(error)}if(hasApiKey)try{const text=await str.get_string("analyticspdf","tiny_cursive");let option2=document.createElement("option");option2.text=text,option2.value=1,select.appendChild(option2)}catch(error){window.console.error(error)}if(!hasApiKey&&!csvOption)try{const noOptionText=await str.get_string("no_option","tiny_cursive");title=await str.get_string("message","tool_dataprivacy"),type=Factory.types.ALERT,optionModal=Alert,select=noOptionText}catch(error){window.console.error(error)}optionModal.create({type:type,title:title,body:select,removeOnClose:!0,buttons:type===Factory.types.SAVE_CANCEL?[{text:"OK",type:"submit",primary:!0}]:[]}).then((modal=>(modal.show(),type===Factory.types.SAVE_CANCEL&&modal.getRoot().on(Events.save,(function(){const data=document.getElementById("download-type");data&&(parseInt(data.value)?window.location.href=link2:window.location.href=link1)})),modal))).catch((error=>{window.console.error("failed to open modal",error)}))}))}(await str.get_string("confidence_threshold","tiny_cursive"),hasApiKey,parseInt(csvOption))}catch(error){window.console.error("Error fetching string:",error)}}()},getusers:function(page){$("#id_coursename").change((function(){var courseid=$(this).val();AJAX.call([{methodname:"cursive_get_user_list",args:{courseid:courseid}}])[0].done((function(json){var context={tabledata:JSON.parse(json),page:page};templates.render("tiny_cursive/user_list",context).then((function(html){return $("#id_username").html(html),!0}))})),AJAX.call([{methodname:"cursive_get_module_list",args:{courseid:courseid}}])[0].done((function(json){var context={tabledata:JSON.parse(json),page:page};templates.render("tiny_cursive/module_list",context).then((function(html){return $("#id_modulename").html(html),!0}))}))}))}};return usersTable})); //# sourceMappingURL=cursive_writing_reports.min.js.map \ No newline at end of file diff --git a/amd/build/cursive_writing_reports.min.js.map b/amd/build/cursive_writing_reports.min.js.map index 0caac568..373a386e 100644 --- a/amd/build/cursive_writing_reports.min.js.map +++ b/amd/build/cursive_writing_reports.min.js.map @@ -1 +1 @@ -{"version":3,"file":"cursive_writing_reports.min.js","sources":["../src/cursive_writing_reports.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/cursive_writing_reports\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\"jquery\", \"core/ajax\", \"core/str\", \"core/templates\", \"./replay\", './analytic_button', \"./analytic_events\"], function(\n $,\n AJAX,\n str,\n templates,\n Replay,\n analyticButton,\n AnalyticEvents\n) {\n const replayInstances = {};\n // eslint-disable-next-line\n window.video_playback = function (mid, filepath) {\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n // eslint-disable-next-line\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n var usersTable = {\n init: function(page) {\n str\n .get_strings([\n {key: \"field_require\", component: \"tiny_cursive\"},\n ])\n .done(function() {\n usersTable.getusers(page);\n });\n\n let myEvents = new AnalyticEvents();\n (async function() {\n try {\n let scoreSetting = await str.get_string('confidence_threshold', 'tiny_cursive');\n analyticsEvents(scoreSetting);\n } catch (error) {\n window.console.error('Error fetching string:', error);\n }\n })();\n\n /**\n * Handles the analytics events for each modal on the page.\n *\n * This function iterates over each element with the class `analytic-modal`,\n * retrieves necessary data attributes, and makes an AJAX call to get writing\n * statistics. Once the data is retrieved, it processes and displays it within\n * the modal.\n *\n * @param {Object} scoreSetting - Configuration settings related to scoring.\n */\n function analyticsEvents(scoreSetting) {\n\n $(\".analytic-modal\").each(function() {\n var mid = $(this).data(\"id\");\n var filepath = $(this).data(\"filepath\");\n let context = {};\n context.userid = mid;\n let cmid = $(this).data(\"cmid\");\n $(this).html(analyticButton($(this).data('id')));\n\n AJAX.call([{\n methodname: 'cursive_get_writing_statistics',\n args: {\n cmid: cmid,\n fileid: mid,\n },\n }])[0].done(response => {\n let data = JSON.parse(response.data);\n\n context.formattime = myEvents.formatedTime(data);\n context.tabledata = data;\n // Perform actions that require context.tabledata\n let authIcon = myEvents.authorshipStatus(data.first_file, data.score, scoreSetting);\n myEvents.createModal(mid, context, '', authIcon);\n myEvents.analytics(mid, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(mid, mid, '', replayInstances);\n myEvents.replyWriting(mid, filepath, '', replayInstances);\n myEvents.quality(mid, templates, context, '', replayInstances, cmid);\n }).fail(error => {\n throw new Error('Error: ' + error.message);\n });\n\n });\n }\n },\n getusers: function(page) {\n $(\"#id_coursename\").change(function() {\n var courseid = $(this).val();\n var promise1 = AJAX.call([\n {\n methodname: \"cursive_get_user_list\",\n args: {\n courseid: courseid,\n },\n },\n ]);\n promise1[0].done(function(json) {\n var data = JSON.parse(json);\n var context = {\n tabledata: data,\n page: page,\n };\n // eslint-disable-next-line\n templates\n .render(\"tiny_cursive/user_list\", context)\n .then(function(html) {\n\n var filteredUser = $(\"#id_username\");\n filteredUser.html(html);\n return true;\n });\n });\n\n var promise2 = AJAX.call([\n {\n methodname: \"cursive_get_module_list\",\n args: {\n courseid: courseid,\n },\n },\n ]);\n promise2[0].done(function(json) {\n var data = JSON.parse(json);\n var context = {\n tabledata: data,\n page: page,\n };\n // eslint-disable-next-line\n templates\n .render(\"tiny_cursive/module_list\", context)\n .then(function(html) {\n\n var filteredUser = $(\"#id_modulename\");\n filteredUser.html(html);\n return true;\n });\n });\n });\n },\n };\n return usersTable;\n});\n"],"names":["define","$","AJAX","str","templates","Replay","analyticButton","AnalyticEvents","replayInstances","window","video_playback","mid","filepath","replay","render","then","html","catch","e","console","error","usersTable","init","page","get_strings","key","component","done","getusers","myEvents","scoreSetting","each","this","data","context","userid","cmid","call","methodname","args","fileid","response","JSON","parse","formattime","formatedTime","tabledata","authIcon","authorshipStatus","first_file","score","createModal","analytics","checkDiff","replyWriting","quality","fail","Error","message","analyticsEvents","get_string","change","courseid","val","json"],"mappings":"AAsBAA,8CAAO,CAAC,SAAU,YAAa,WAAY,iBAAkB,WAAY,oBAAqB,sBAAsB,SAChHC,EACAC,KACAC,IACAC,UACAC,OACAC,eACAC,sBAEMC,gBAAkB,GAExBC,OAAOC,eAAiB,SAAUC,IAAKC,aAClB,KAAbA,SAAiB,OACXC,OAAS,IAAIR,OACf,UAAYM,IACZC,SACA,IACA,EACA,UAAYD,KAEhBH,gBAAgBG,KAAOE,YAGvBT,UAAUU,OAAO,8BAA8BC,MAAKC,OAChDf,EAAE,WAAaU,KAAKK,KAAKA,SAC1BC,OAAMC,GAAKT,OAAOU,QAAQC,MAAMF,YAEhC,OAGPG,WAAa,CACbC,KAAM,SAASC,MACXpB,IACKqB,YAAY,CACT,CAACC,IAAK,gBAAiBC,UAAW,kBAErCC,MAAK,WACFN,WAAWO,SAASL,aAGxBM,SAAW,IAAItB,+CAoBMuB,cAErB7B,EAAE,mBAAmB8B,MAAK,eAClBpB,IAAMV,EAAE+B,MAAMC,KAAK,MACnBrB,SAAWX,EAAE+B,MAAMC,KAAK,gBACxBC,QAAU,GACdA,QAAQC,OAASxB,QACbyB,KAAOnC,EAAE+B,MAAMC,KAAK,QACxBhC,EAAE+B,MAAMhB,KAAKV,eAAeL,EAAE+B,MAAMC,KAAK,QAEzC/B,KAAKmC,KAAK,CAAC,CACPC,WAAY,iCACZC,KAAM,CACFH,KAAMA,KACNI,OAAQ7B,QAEZ,GAAGgB,MAAKc,eACJR,KAAOS,KAAKC,MAAMF,SAASR,MAE/BC,QAAQU,WAAaf,SAASgB,aAAaZ,MAC3CC,QAAQY,UAAYb,SAEhBc,SAAWlB,SAASmB,iBAAiBf,KAAKgB,WAAYhB,KAAKiB,MAAOpB,cACtED,SAASsB,YAAYxC,IAAKuB,QAAS,GAAIa,UACvClB,SAASuB,UAAUzC,IAAKP,UAAW8B,QAAS,GAAI1B,gBAAiBuC,UACjElB,SAASwB,UAAU1C,IAAKA,IAAK,GAAIH,iBACjCqB,SAASyB,aAAa3C,IAAKC,SAAU,GAAIJ,iBACzCqB,SAAS0B,QAAQ5C,IAAKP,UAAW8B,QAAS,GAAI1B,gBAAiB4B,SAChEoB,MAAKpC,cACE,IAAIqC,MAAM,UAAYrC,MAAMsC,eA7CtCC,OADyBxD,IAAIyD,WAAW,uBAAwB,iBAElE,MAAOxC,OACLX,OAAOU,QAAQC,MAAM,yBAA0BA,YAiD3DQ,SAAU,SAASL,MACftB,EAAE,kBAAkB4D,QAAO,eACnBC,SAAW7D,EAAE+B,MAAM+B,MACR7D,KAAKmC,KAAK,CACrB,CACIC,WAAY,wBACZC,KAAM,CACFuB,SAAUA,aAIb,GAAGnC,MAAK,SAASqC,UAElB9B,QAAU,CACVY,UAFOJ,KAAKC,MAAMqB,MAGlBzC,KAAMA,MAGVnB,UACKU,OAAO,yBAA0BoB,SACjCnB,MAAK,SAASC,aAEQf,EAAE,gBACRe,KAAKA,OACX,QAIJd,KAAKmC,KAAK,CACrB,CACIC,WAAY,0BACZC,KAAM,CACFuB,SAAUA,aAIb,GAAGnC,MAAK,SAASqC,UAElB9B,QAAU,CACVY,UAFOJ,KAAKC,MAAMqB,MAGlBzC,KAAMA,MAGVnB,UACKU,OAAO,2BAA4BoB,SACnCnB,MAAK,SAASC,aAEQf,EAAE,kBACRe,KAAKA,OACX,oBAMxBK"} \ No newline at end of file +{"version":3,"file":"cursive_writing_reports.min.js","sources":["../src/cursive_writing_reports.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/cursive_writing_reports\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\"jquery\", \"core/ajax\", \"core/str\", \"core/templates\", \"./replay\", './analytic_button', './replay_button',\n\"./analytic_events\", \"core/modal_events\", 'core/modal_save_cancel', 'core/modal_factory', 'core/modal'],\n function(\n $,\n AJAX,\n str,\n templates,\n Replay,\n analyticButton,\n replayButton,\n AnalyticEvents,\n Events,\n Modal,\n Factory,\n Alert\n) {\n const replayInstances = {};\n // eslint-disable-next-line\n window.video_playback = function (mid, filepath) {\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n // eslint-disable-next-line\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n var usersTable = {\n init: function(page, hasApiKey, csvOption) {\n str\n .get_strings([\n {key: \"field_require\", component: \"tiny_cursive\"},\n ])\n .done(function() {\n usersTable.getusers(page);\n });\n\n let myEvents = new AnalyticEvents();\n (async function() {\n try {\n let scoreSetting = await str.get_string('confidence_threshold', 'tiny_cursive');\n analyticsEvents(scoreSetting, hasApiKey, parseInt(csvOption));\n } catch (error) {\n window.console.error('Error fetching string:', error);\n }\n })();\n\n /**\n * Handles the analytics events for each modal on the page.\n *\n * This function iterates over each element with the class `analytic-modal`,\n * retrieves necessary data attributes, and makes an AJAX call to get writing\n * statistics. Once the data is retrieved, it processes and displays it within\n * the modal.\n *\n * @param {Object} scoreSetting - Configuration settings related to scoring.\n * @param {boolean} hasApiKey - api key status\n * @param {boolean} csvOption - csv option status\n */\n function analyticsEvents(scoreSetting, hasApiKey, csvOption) {\n\n $(\".analytic-modal\").each(function() {\n var mid = $(this).data(\"id\");\n var filepath = $(this).data(\"filepath\");\n let context = {};\n context.userid = mid;\n let cmid = $(this).data(\"cmid\");\n\n AJAX.call([{\n methodname: 'cursive_get_writing_statistics',\n args: {\n cmid: cmid,\n fileid: mid,\n },\n }])[0].done(response => {\n let data = JSON.parse(response.data);\n\n // Show replay button if no API key, otherwise show analytics button\n if (!hasApiKey) {\n $(this).html(replayButton(mid));\n } else {\n $(this).html(analyticButton(data.effort_ratio, $(this).data('id')));\n }\n\n context.formattime = myEvents.formatedTime(data);\n context.tabledata = data;\n context.apikey = hasApiKey;\n // Perform actions that require context.tabledata\n let authIcon = myEvents.authorshipStatus(data.first_file, data.score, scoreSetting);\n myEvents.createModal(mid, context, '', replayInstances, authIcon);\n myEvents.analytics(mid, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(mid, mid, '', replayInstances);\n myEvents.replyWriting(mid, filepath, '', replayInstances);\n\n }).fail(error => {\n throw new Error('Error: ' + error.message);\n });\n\n });\n\n $('.download-btn').on('click', async function(e) {\n e.preventDefault();\n\n const link1 = $(this).attr('href');\n const link2 = $(this).data('link');\n\n let type = Factory.types.SAVE_CANCEL;\n let optionModal = Modal;\n let select = document.createElement('select');\n select.id = \"download-type\";\n select.classList.add('form-control', 'inputUrl');\n\n let title = await str.get_string('download', 'tiny_cursive');\n\n // Add CSV option\n if (csvOption) {\n try {\n const text = await str.get_string('payloadjson', 'tiny_cursive');\n let option = document.createElement('option');\n option.text = text;\n option.value = 0;\n select.appendChild(option);\n } catch (error) {\n window.console.error(error);\n }\n }\n\n // Add API key option\n if (hasApiKey) {\n try {\n const text = await str.get_string('analyticspdf', 'tiny_cursive');\n let option2 = document.createElement('option');\n option2.text = text;\n option2.value = 1;\n select.appendChild(option2);\n } catch (error) {\n window.console.error(error);\n }\n }\n\n // If no options available\n if (!hasApiKey && !csvOption) {\n try {\n const noOptionText = await str.get_string('no_option', 'tiny_cursive');\n const messageText = await str.get_string('message', 'tool_dataprivacy');\n title = messageText;\n type = Factory.types.ALERT;\n optionModal = Alert;\n select = noOptionText;\n } catch (error) {\n window.console.error(error);\n }\n }\n\n optionModal.create({\n type: type,\n title: title,\n body: select,\n removeOnClose: true,\n buttons: type === Factory.types.SAVE_CANCEL ? [{\n text: 'OK',\n type: 'submit',\n primary: true\n }] : []\n }).then(modal => {\n modal.show();\n\n if (type === Factory.types.SAVE_CANCEL) {\n modal.getRoot().on(Events.save, function() {\n const data = document.getElementById('download-type');\n if (!data) {\n return;\n }\n if (parseInt(data.value)) {\n window.location.href = link2;\n } else {\n window.location.href = link1;\n }\n });\n }\n return modal;\n }).catch(error => {\n window.console.error('failed to open modal', error);\n });\n });\n\n }\n },\n getusers: function(page) {\n $(\"#id_coursename\").change(function() {\n var courseid = $(this).val();\n var promise1 = AJAX.call([\n {\n methodname: \"cursive_get_user_list\",\n args: {\n courseid: courseid,\n },\n },\n ]);\n promise1[0].done(function(json) {\n var data = JSON.parse(json);\n var context = {\n tabledata: data,\n page: page,\n };\n // eslint-disable-next-line\n templates\n .render(\"tiny_cursive/user_list\", context)\n .then(function(html) {\n\n var filteredUser = $(\"#id_username\");\n filteredUser.html(html);\n return true;\n });\n });\n\n var promise2 = AJAX.call([\n {\n methodname: \"cursive_get_module_list\",\n args: {\n courseid: courseid,\n },\n },\n ]);\n promise2[0].done(function(json) {\n var data = JSON.parse(json);\n var context = {\n tabledata: data,\n page: page,\n };\n // eslint-disable-next-line\n templates\n .render(\"tiny_cursive/module_list\", context)\n .then(function(html) {\n\n var filteredUser = $(\"#id_modulename\");\n filteredUser.html(html);\n return true;\n });\n });\n });\n },\n };\n return usersTable;\n});\n"],"names":["define","$","AJAX","str","templates","Replay","analyticButton","replayButton","AnalyticEvents","Events","Modal","Factory","Alert","replayInstances","window","video_playback","mid","filepath","replay","render","then","html","catch","e","console","error","usersTable","init","page","hasApiKey","csvOption","get_strings","key","component","done","getusers","myEvents","scoreSetting","each","this","data","context","userid","cmid","call","methodname","args","fileid","response","JSON","parse","effort_ratio","formattime","formatedTime","tabledata","apikey","authIcon","authorshipStatus","first_file","score","createModal","analytics","checkDiff","replyWriting","fail","Error","message","on","async","preventDefault","link1","attr","link2","type","types","SAVE_CANCEL","optionModal","select","document","createElement","id","classList","add","title","get_string","text","option","value","appendChild","option2","noOptionText","ALERT","create","body","removeOnClose","buttons","primary","modal","show","getRoot","save","getElementById","parseInt","location","href","analyticsEvents","change","courseid","val","json"],"mappings":"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"} \ No newline at end of file diff --git a/amd/build/document_view.min.js b/amd/build/document_view.min.js new file mode 100644 index 00000000..dfc9c4cb --- /dev/null +++ b/amd/build/document_view.min.js @@ -0,0 +1,10 @@ +define("tiny_cursive/document_view",["exports","tiny_cursive/svg_repo"],(function(_exports,_svg_repo){var obj; +/** + * This module provides functionality for document view management in the Tiny editor, + * including full page mode display and sidebar information + * @module tiny_cursive/document_view + * @copyright 2025 Cursive Technology, Inc. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_svg_repo=(obj=_svg_repo)&&obj.__esModule?obj:{default:obj};return _exports.default=class{constructor(User,Rubrics,submission,modulename,editor,quizInfo){this.User=User,this.Rubrics=Rubrics,this.submission=submission,this.module=modulename,this.editor=editor,this.moduleIcon=_svg_repo.default.assignment,this.quizInfo=quizInfo,this.initStrings()}normalMode(){var _this$editor;let id=(null===(_this$editor=this.editor)||void 0===_this$editor?void 0:_this$editor.id)+"_ifr";("assign"===this.module||"quiz"===this.module||"forum"===this.module||"lesson"===this.module||"pdfannotator"===this.module)&&this.normalizePage(id)}fullPageMode(){var _this$editor4,_this$editor2;if("assign"===this.module)this.moduleIcon=_svg_repo.default.assignment,this.fullPageModule(null===(_this$editor2=this.editor)||void 0===_this$editor2?void 0:_this$editor2.id);else if("forum"===this.module){var _this$editor3;this.moduleIcon=_svg_repo.default.forum,this.fullPageModule(null===(_this$editor3=this.editor)||void 0===_this$editor3?void 0:_this$editor3.id)}else if("quiz"===this.module&&null!==(_this$editor4=this.editor)&&void 0!==_this$editor4&&_this$editor4.id){var _this$editor5;this.moduleIcon=_svg_repo.default.quiz,this.fullPageModule(null===(_this$editor5=this.editor)||void 0===_this$editor5?void 0:_this$editor5.id)}else if("lesson"===this.module){var _this$editor6;this.moduleIcon=_svg_repo.default.lesson,this.fullPageModule(null===(_this$editor6=this.editor)||void 0===_this$editor6?void 0:_this$editor6.id)}else if("pdfannotator"===this.module){var _this$editor7;this.moduleIcon=_svg_repo.default.pdfannotator,this.fullPageModule(null===(_this$editor7=this.editor)||void 0===_this$editor7?void 0:_this$editor7.id)}}docSideBar(status){var _this$editor8;const replyId=new URL(window.location.href).searchParams.get("reply"),toggle=document.querySelector("#cursive-fullpagemode-sidebar-toggle"),timelimitBlock=this.getTimerBlock(this.module),headerInfo=this.getSidebarTitle(),progressBar=document.querySelector(".box.progress_bar"),courseName=document.querySelector("#page-navbar > nav > ol > li:nth-child(1) > a"),courseDes=document.querySelector("#intro"),Dates=document.querySelector(".activity-dates");let openDate=null==Dates?void 0:Dates.querySelector("div:nth-child(1)"),dueDate=null==Dates?void 0:Dates.querySelector("div:nth-child(2)");const container=this.create("div");Object.assign(container,{id:"cursive-fullpagemode-sidebar",className:"bg-white h-100 shadow"}),Object.assign(container.style,{width:"300px",overflow:"auto"});const crossBtn=this.create("span");Object.assign(crossBtn,{id:"cursive-collapse-sidebar",className:"btn p-2",innerHTML:_svg_repo.default.close}),crossBtn.addEventListener("click",(()=>{container.style.transition="width 0.3s ease",container.style.width="0",toggle.style.display="flex"})),null==toggle||toggle.addEventListener("click",(function(){toggle.style.display="none",container.style.width="300px"}));const btnWrapper=this.create("div");Object.assign(btnWrapper,{padding:"0 1rem",position:"sticky",top:"0",backgroundColor:"white"}),btnWrapper.append(crossBtn);const header=this.create("div");header.className="border-bottom p-3 bg-light",Object.assign(header.style,{position:"sticky",top:"0"});const headerTitle=this.create("h3");headerTitle.className="mb-3 d-flex align-items-center",headerTitle.textContent=`${headerInfo.title} ${this.details}`,headerTitle.style.fontWeight="600";const headerIcon=document.querySelector(".page-header-image > div");headerIcon&&headerTitle.prepend(headerIcon.cloneNode(!0));let wordCount=this.wordCounter(status);null!=timelimitBlock&&timelimitBlock.textContent?header.append(headerTitle,wordCount,this.timerCountDown(timelimitBlock)):header.append(headerTitle,wordCount);const content=this.create("div");if(content.className="p-3",content.append(this.createBox({bg:"bg-info",titleColor:"text-info",icon:_svg_repo.default.people,title:this.studentInfo,bodyHTML:this.generateStudentInfo(this.User,courseName)})),"lesson"===this.module&&progressBar&&content.append(this.createBox({bg:"bg-gray",titleColor:"text-dark",icon:this.moduleIcon,title:this.progress,bodyHTML:progressBar.innerHTML})),courseDes&&""!==(null==courseDes?void 0:courseDes.textContent.trim())){let fileSubDiv=document.querySelectorAll(".fileuploadsubmission");fileSubDiv&&fileSubDiv.forEach((Element=>{Element.style.verticalAlign="middle"})),content.append(this.createBox({bg:"bg-gray",titleColor:"text-dark",icon:this.moduleIcon,title:`${this.getSidebarTitle().title} ${this.description}`,bodyHTML:courseDes.innerHTML}))}if("forum"===this.module&&replyId){this.checkForumSubject();let replyPost=document.querySelector(`#post-content-${replyId}`);null!=replyPost&&replyPost.textContent.trim()&&content.append(this.createBox({bg:"bg-gray",titleColor:"text-dark",icon:this.moduleIcon,title:this.replyingto,bodyHTML:replyPost.textContent.trim()}))}if("quiz"===this.module&&null!==(_this$editor8=this.editor)&&void 0!==_this$editor8&&_this$editor8.id){var _this$editor9;let questionId=this.getQuestionId(null===(_this$editor9=this.editor)||void 0===_this$editor9?void 0:_this$editor9.id),question=document.querySelector(`#question-${questionId} .qtext`),intro=atob(this.quizInfo.intro);null!=question&&question.textContent.trim()&&content.append(this.createBox({bg:"bg-amber",titleColor:"text-dark",icon:this.moduleIcon,title:this.answeringto,bodyHTML:question.textContent})),intro&&""!==intro.trim()&&content.append(this.createBox({bg:"bg-gray",titleColor:"text-dark",icon:this.moduleIcon,title:`${this.quiz} ${this.description}`,bodyHTML:intro})),Number(this.quizInfo.open)&&content.append(this.createBox({bg:"bg-amber",titleColor:"text-dark",icon:_svg_repo.default.time,title:this.importantdates,bodyHTML:this.generateImportantDates(Number(this.quizInfo.open),Number(this.quizInfo.close))}))}return Object.keys(this.Rubrics).length&&content.append(this.createBox({bg:"bg-gray",titleColor:"text-dark",icon:this.moduleIcon,title:this.rubrics,bodyHTML:this.generateRubrics(this.Rubrics)})),Dates&&content.append(this.createBox({bg:"bg-amber",titleColor:"text-dark",icon:_svg_repo.default.time,title:this.importantdates,bodyHTML:this.generateImportantDates(openDate,dueDate)})),"assign"===this.module&&content.append(this.createBox({bg:"bg-green",titleColor:"text-success",icon:this.moduleIcon,title:this.subStatus,bodyHTML:this.submissionStatus(this.submission)})),container.append(btnWrapper,header,content),container}createBox(_ref){let{bg:bg,titleColor:titleColor,icon:icon,title:title,bodyHTML:bodyHTML}=_ref;const box=this.create("div");box.className=`tiny_cursive-fullpage-card ${bg}`;const heading=this.create("h4");heading.className=`tiny_cursive-fullpage-card-header ${titleColor} d-flex align-items-center`,heading.innerHTML=`${icon} ${title}`;const body=this.create("div");return body.className="tiny_cursive-fullpage-card-body",body.innerHTML=bodyHTML,box.append(heading,body),box}generateRubrics(Rubrics){const wrapper=this.create("div");return Rubrics.forEach((rubric=>{const rubricDiv=this.create("div");rubricDiv.className="tiny_cursive-rubric-card";const title=this.create("h3");title.className="tiny_cursive-rubric-title",title.textContent=rubric.description,rubricDiv.appendChild(title),Object.values(rubric.levels).forEach((level=>{const levelDiv=this.create("div"),score=Number(level.score);levelDiv.className=0===score?"tiny_cursive-rubric-level tiny_cursive-rubric-low":score<=2?"tiny_cursive-rubric-level tiny_cursive-rubric-mid":"tiny_cursive-rubric-level tiny_cursive-rubric-high",levelDiv.textContent=`${level.definition} / ${level.score}`,rubricDiv.appendChild(levelDiv)})),wrapper.appendChild(rubricDiv)})),wrapper.innerHTML}submissionStatus(submission){var _submission$current,_submission$current2;const wrapper=this.create("div"),statusWrapper=this.create("div");statusWrapper.className="tiny_cursive-status-row";const statusName=this.create("span");statusName.textContent=`${this.status}:`;const statusValue=this.create("span"),isNew="new"===(null==submission||null===(_submission$current=submission.current)||void 0===_submission$current?void 0:_submission$current.status);statusValue.textContent=isNew?this.draftnot:this.draft,statusValue.className="tiny_cursive-status-value "+(isNew?"tiny_cursive-status-red":"tiny_cursive-status-green"),statusWrapper.append(statusName,statusValue);const modifiedWrapper=this.create("div");modifiedWrapper.className="tiny_cursive-status-row";const modifiedName=this.create("span");modifiedName.textContent=`${this.lastModified}: `;const modifiedValue=this.create("span");if(null!=submission&&null!==(_submission$current2=submission.current)&&void 0!==_submission$current2&&_submission$current2.timemodified){const date=new Date(1e3*submission.current.timemodified);modifiedValue.textContent=this.formatDate(date)}else modifiedValue.textContent="N/A";modifiedWrapper.append(modifiedName,modifiedValue);const gradeWrapper=this.create("div");gradeWrapper.className="tiny_cursive-status-row";const gradeName=this.create("span");gradeName.textContent=`${this.gradings}: `;const gradeValue=this.create("span");return null!=submission&&submission.grade?gradeValue.textContent=Number(submission.grade.grade)>0?submission.grade.grade:this.gradenot:gradeValue.textContent=this.gradenot,gradeWrapper.append(gradeName,gradeValue),wrapper.append(statusWrapper,gradeWrapper,modifiedWrapper),wrapper.innerHTML}wordCounter(status){const wordCount=this.create("div"),labelDiv=this.create("div"),label=this.create("span"),value=this.create("span"),icon=this.create("span");icon.className="me-2",icon.innerHTML=_svg_repo.default.assignment,labelDiv.appendChild(icon),labelDiv.append(label),label.textContent=`${this.wordCount}:`,value.textContent="0",value.className="text-primary",value.style.fontWeight="600",value.style.fontSize="14px",wordCount.className="bg-white rounded shadow-sm p-2 d-flex justify-content-between my-2",wordCount.append(labelDiv,value),wordCount.style.fontSize="12px";return new MutationObserver((()=>{const newText=status.textContent.trim();value.textContent=`${newText.replace("words","")}`})).observe(status,{characterData:!0,subtree:!0,childList:!0}),wordCount}timerCountDown(timer){let warningDiv=document.querySelector("#user-notifications > div");if(warningDiv){var _clone$querySelector;let clone=warningDiv.cloneNode(!0);null===(_clone$querySelector=clone.querySelector("button"))||void 0===_clone$querySelector||_clone$querySelector.remove(),this.editor.notificationManager.open({text:clone.textContent,type:"error"})}const timerCount=this.create("div");timerCount.className="bg-white rounded shadow-sm p-2 d-flex justify-content-between my-2";const labelDiv=this.create("div"),label=this.create("span"),value=this.create("span"),icon=this.create("span");if(icon.innerHTML=_svg_repo.default.time,labelDiv.appendChild(icon),labelDiv.append(label),label.textContent=`${this.timeleft}:`,value.textContent="00:00:00",value.className=warningDiv?"text-danger":"text-primary",Object.assign(value.style,{fontWeight:"600",fontSize:"14px"}),timerCount.append(labelDiv,value),timerCount.style.fontSize="12px",timer){new MutationObserver((()=>{const newText=timer.textContent.trim();value.textContent=`${newText}`})).observe(timer,{characterData:!0,subtree:!0,childList:!0})}else value.textContent=this.nolimit;return timerCount}generateStudentInfo(user,course){const wrapper=this.create("div"),nameWrapper=this.create("div"),usernameWrapper=this.create("div"),courseWrapper=this.create("div"),nameLabel=this.create("strong"),nameValue=this.create("span"),usernameLabel=this.create("strong"),usernameValue=this.create("span"),courseLabel=this.create("strong"),courseValue=this.create("span");return nameLabel.textContent=`${this.name}`,nameValue.textContent=user.fullname,usernameLabel.textContent=`${this.userename}: `,usernameValue.textContent=user.username,courseLabel.textContent=`${this.course}: `,courseValue.textContent=course.title,usernameLabel.className="cfw-bold me-2",usernameValue.className="cursiveFw-wrap",courseLabel.className="cfw-bold me-2",courseValue.className="cursiveFw-wrap",nameLabel.className="cfw-bold me-2",nameValue.className="cursiveFw-wrap",nameWrapper.append(nameLabel,nameValue),usernameWrapper.append(usernameLabel,usernameValue),courseWrapper.append(courseLabel,courseValue),wrapper.append(nameWrapper,usernameWrapper,courseWrapper),wrapper.innerHTML}generateImportantDates(open,due){const wrapper=this.create("div");let openDate=null,dueDate=null;const openedWrapper=this.create("div"),dueWrapper=this.create("div"),remainingWrapper=this.create("div"),openedLabel=this.create("span"),openedValue=this.create("span"),dueLabel=this.create("span"),dueValue=this.create("span"),remainingLabel=this.create("span"),remainingValue=this.create("span");return"quiz"===this.module?(openDate=1e3*open,dueDate=1e3*due):(openDate=this.extractDate(null==open?void 0:open.textContent),dueDate=this.extractDate(null==due?void 0:due.textContent)),openedLabel.textContent=`${this.opened}: `,openedValue.textContent=this.formatDate(openDate?new Date(openDate):null),openedValue.className="text-dark",dueLabel.textContent=`${this.due}: `,dueValue.textContent=this.formatDate(dueDate?new Date(dueDate):null),dueValue.className="text-danger",remainingLabel.textContent=`${this.remaining}: `,remainingValue.textContent=this.calculateDate(dueDate),remainingValue.className="text-danger",openedWrapper.className="d-flex justify-content-between",dueWrapper.className="d-flex justify-content-between",remainingWrapper.className="d-flex align-items-center justify-content-between mt-2 pt-2 border-top",openedWrapper.append(openedLabel,openedValue),dueWrapper.append(dueLabel,dueValue),remainingWrapper.append(remainingLabel,remainingValue),wrapper.append(openedWrapper,dueWrapper,remainingWrapper),wrapper.innerHTML}formatDate(date){if(!date)return"-";return date.toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"numeric",minute:"numeric",hour12:!0})}extractDate(text){if(!text)return"-";const parts=null==text?void 0:text.split(":");return parts.length>1?parts.slice(1).join(":").trim():text.trim()}calculateDate(date){if(!date)return"-";const diffMs=new Date(date)-new Date;if(diffMs<=0)return"Overdue";return`${Math.floor(diffMs/864e5)} days, ${Math.floor(diffMs/36e5%24)} hours`}fullPageModule(module){var _current$contentDocum,_current$contentWindo,_current$contentWindo2,_document$getElementB;let current="quiz"===this.module?document.getElementById(`${module}_ifr`):document.querySelector(`#${module}_ifr`),p1=current.parentElement,p2=p1.parentElement,p4=p2.parentElement.parentElement,statusBar=document.querySelector(".tox-statusbar__right-container > button"),assignName=document.querySelector(".page-context-header"),header=this.create("div"),btn=null;if(assignName.classList.remove("mb-2"),header.id="tiny_cursive-fullpage-custom-header",Object.assign(header.style,{backgroundColor:"white",display:"flex",justifyContent:"space-between"}),"quiz"===this.module?(btn=document.querySelector("#mod_quiz-next-nav").cloneNode(!0),btn.className="tiny_cursive-fullpage-submit-btn",btn.style.margin=".5rem"):(btn=this.create("input"),btn.className="tiny_cursive-fullpage-submit-btn",btn.value=this.savechanges,btn.type="submit",btn.style.margin=".5rem"),"pdfannotator"===this.module){const style=document.createElement("style");style.id="cursiveForceStyle",style.textContent="\n .path-mod-pdfannotator #comment-wrapper h4,\n .path-mod-pdfannotator #comment-nav {\n margin: 0 !important;\n }\n ",document.head.appendChild(style)}const leftSide=this.create("div"),rightSide=this.create("div");let commonStyle={display:"flex",alignItems:"center",margin:"0 1rem"};Object.assign(leftSide.style,commonStyle),rightSide.id="tiny_cursive-fullpage-right-wrapper",Object.assign(rightSide.style,commonStyle),rightSide.appendChild(btn),leftSide.appendChild(assignName.cloneNode(!0)),header.appendChild(leftSide),header.appendChild(rightSide),p4.insertBefore(header,p4.firstChild),p2.style.backgroundColor="#efefef",Object.assign(current.style,{width:"750px",minWidth:"750px",boxShadow:"0 10px 15px -3px rgb(0 0 0/0.1),0 4px 6px -4px rgb(0 0 0/0.1)"}),Object.assign(p1.style,{display:"flex",justifyContent:"center",outline:"none",margin:"2rem 0 0"});const style=this.create("style");style.id="tiny_cursive-fullpage-mode-style",style.textContent="\n .tox.tox-edit-focus .tox-edit-area::before {\n opacity: 0;\n }",document.head.appendChild(style);let iframeBody=(null===(_current$contentDocum=current.contentDocument)||void 0===_current$contentDocum?void 0:_current$contentDocum.body)||(null===(_current$contentWindo=current.contentWindow)||void 0===_current$contentWindo||null===(_current$contentWindo2=_current$contentWindo.document)||void 0===_current$contentWindo2?void 0:_current$contentWindo2.body);iframeBody&&(iframeBody.style.padding="0.5in"),p2.style.position="relative",null===(_document$getElementB=document.getElementById("cursive-fullpagemode-sidebar"))||void 0===_document$getElementB||_document$getElementB.remove();let toggle=this.create("div");toggle.id="cursive-fullpagemode-sidebar-toggle",toggle.innerHTML=_svg_repo.default.hamburger,p2.appendChild(toggle),p2.appendChild(this.docSideBar(statusBar))}normalizePage(editorId){var _document$getElementB2,_document$getElementB3,_current$contentDocum2,_current$contentWindo3,_current$contentWindo4,_document$head$queryS,_document$head$queryS2;null===(_document$getElementB2=document.getElementById("tiny_cursive-fullpage-custom-header"))||void 0===_document$getElementB2||_document$getElementB2.remove(),null===(_document$getElementB3=document.getElementById("cursive-fullpagemode-sidebar"))||void 0===_document$getElementB3||_document$getElementB3.remove();let current=document.getElementById(editorId),p1=current.parentElement,p2=p1.parentElement;Object.assign(p2.style,{backgroundColor:"",position:""}),Object.assign(current.style,{width:"",minWidth:"",boxShadow:""}),Object.assign(p1.style,{display:"",justifyContent:"",outline:"",margin:""}),p1.classList.remove("tiny-cursive-editor-container");let iframeBody=(null===(_current$contentDocum2=current.contentDocument)||void 0===_current$contentDocum2?void 0:_current$contentDocum2.body)||(null===(_current$contentWindo3=current.contentWindow)||void 0===_current$contentWindo3||null===(_current$contentWindo4=_current$contentWindo3.document)||void 0===_current$contentWindo4?void 0:_current$contentWindo4.body);iframeBody&&(iframeBody.style.padding="0"),null===(_document$head$queryS=document.head.querySelector("#tiny_cursive-fullpage-mode-style"))||void 0===_document$head$queryS||_document$head$queryS.remove(),null===(_document$head$queryS2=document.head.querySelector("#cursiveForceStyle"))||void 0===_document$head$queryS2||_document$head$queryS2.remove()}checkForumSubject(){const form=document.querySelector("#tiny_cursive-fullpage-right-wrapper > input"),msg=this.subjectnot;form&&form.addEventListener("click",(e=>{const subjectInput=document.getElementById("id_subject");let content=this.editor.getContent().trim();subjectInput&&""!==subjectInput.value.trim()&&""!==content||(e.preventDefault(),e.stopPropagation(),this.editor.windowManager.alert(msg))}))}getSidebarTitle(){const[assign,discus,quiz,lesson]=this.getText("sbTitle");switch(this.module){case"assign":return{title:assign,icon:_svg_repo.default.assignment};case"forum":return{title:discus,icon:_svg_repo.default.forum};case"lesson":return{title:lesson,icon:_svg_repo.default.forum};case"quiz":return{title:quiz,icon:_svg_repo.default.quiz};case"pdfannotator":return{title:"PDF Annotation",icon:_svg_repo.default.pdfannotator};default:return{title:"Page",icon:_svg_repo.default.quiz}}}getTimerBlock(module){switch(module){case"assign":return document.querySelector("#mod_assign_timelimit_block > div > div");case"forum":return document.querySelector("#mod_forum_timelimit_block");case"lesson":return document.querySelector("#lesson-timer");case"quiz":return document.querySelector("#quiz-time-left");default:return null}}getQuestionId(editoId){try{return editoId&&"string"==typeof editoId?editoId.replace(/^q(\d+):(\d+)_.*$/,"$1-$2"):""}catch(error){return window.console.error("Error getting question ID:",error),""}}initStrings(){[this.details,this.studentInfo,this.progress,this.description,this.replyingto,this.answeringto,this.importantdates,this.rubrics,this.subStatus,this.status,this.draft,this.draftnot,this.lastModified,this.gradings,this.gradenot,this.wordCount,this.timeleft,this.nolimit,this.name,this.userename,this.course,this.opened,this.due,this.overdue,this.remaining,this.savechanges,this.subjectnot]=this.getText("docSideBar")}getText(key){return JSON.parse(localStorage.getItem(key))||[]}create(tag){return document.createElement(tag)}},_exports.default})); + +//# sourceMappingURL=document_view.min.js.map \ No newline at end of file diff --git a/amd/build/document_view.min.js.map b/amd/build/document_view.min.js.map new file mode 100644 index 00000000..e291a61f --- /dev/null +++ b/amd/build/document_view.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"document_view.min.js","sources":["../src/document_view.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module provides functionality for document view management in the Tiny editor,\n * including full page mode display and sidebar information\n * @module tiny_cursive/document_view\n * @copyright 2025 Cursive Technology, Inc. \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Icons from 'tiny_cursive/svg_repo';\nexport default class DocumentView {\n\n constructor(User, Rubrics, submission, modulename, editor, quizInfo) {\n this.User = User;\n this.Rubrics = Rubrics;\n this.submission = submission;\n this.module = modulename;\n this.editor = editor;\n this.moduleIcon = Icons.assignment;\n this.quizInfo = quizInfo;\n this.initStrings();\n }\n\n normalMode() {\n let id = this.editor?.id + \"_ifr\";\n if (this.module === 'assign') {\n this.normalizePage(id);\n } else if (this.module === 'quiz') {\n this.normalizePage(id);\n } else if (this.module === 'forum') {\n this.normalizePage(id);\n } else if (this.module === 'lesson') {\n this.normalizePage(id);\n } else if(this.module === 'pdfannotator') {\n this.normalizePage(id);\n }\n }\n\n fullPageMode() {\n\n if (this.module === 'assign') {\n this.moduleIcon = Icons.assignment;\n this.fullPageModule(this.editor?.id);\n } else if (this.module === 'forum') {\n this.moduleIcon = Icons.forum;\n this.fullPageModule(this.editor?.id);\n } else if (this.module === 'quiz' && this.editor?.id) {\n this.moduleIcon = Icons.quiz;\n this.fullPageModule(this.editor?.id);\n } else if (this.module === 'lesson') {\n this.moduleIcon = Icons.lesson;\n this.fullPageModule(this.editor?.id);\n } else if (this.module === 'pdfannotator') {\n this.moduleIcon = Icons.pdfannotator;\n this.fullPageModule(this.editor?.id);\n }\n }\n\n docSideBar(status) {\n\n const url = new URL(window.location.href);\n const replyId = url.searchParams.get(\"reply\");\n const toggle = document.querySelector('#cursive-fullpagemode-sidebar-toggle');\n const timelimitBlock = this.getTimerBlock(this.module);\n const headerInfo = this.getSidebarTitle();\n const progressBar = document.querySelector('.box.progress_bar');\n\n const courseName = document.querySelector('#page-navbar > nav > ol > li:nth-child(1) > a');\n const courseDes = document.querySelector('#intro');\n const Dates = document.querySelector('.activity-dates');\n\n let openDate = Dates?.querySelector('div:nth-child(1)');\n let dueDate = Dates?.querySelector('div:nth-child(2)');\n\n const container = this.create('div');\n Object.assign(container, {\n id: 'cursive-fullpagemode-sidebar',\n className: 'bg-white h-100 shadow'\n });\n Object.assign(container.style, {\n width: '300px',\n overflow: 'auto'\n });\n\n const crossBtn = this.create('span');\n Object.assign(crossBtn, {\n id: 'cursive-collapse-sidebar',\n className: 'btn p-2',\n innerHTML: Icons.close\n });\n\n crossBtn.addEventListener('click', () => {\n container.style.transition = 'width 0.3s ease';\n container.style.width = '0';\n toggle.style.display = 'flex';\n });\n toggle?.addEventListener('click', function() {\n toggle.style.display = 'none';\n container.style.width = '300px';\n });\n\n const btnWrapper = this.create('div');\n Object.assign(btnWrapper, {\n padding: '0 1rem',\n position: 'sticky',\n top: '0',\n backgroundColor: 'white'\n });\n btnWrapper.append(crossBtn);\n\n\n const header = this.create('div');\n header.className = 'border-bottom p-3 bg-light';\n Object.assign(header.style, {\n position: 'sticky',\n top: '0'\n });\n\n const headerTitle = this.create('h3');\n headerTitle.className = 'mb-3 d-flex align-items-center';\n headerTitle.textContent = `${headerInfo.title} ${this.details}`;\n headerTitle.style.fontWeight = '600';\n\n const headerIcon = document.querySelector('.page-header-image > div');\n if (headerIcon) {\n headerTitle.prepend(headerIcon.cloneNode(true));\n }\n\n let wordCount = this.wordCounter(status);\n if (timelimitBlock?.textContent) {\n header.append(headerTitle, wordCount, this.timerCountDown(timelimitBlock));\n } else {\n header.append(headerTitle, wordCount);\n }\n\n const content = this.create('div');\n content.className = 'p-3';\n\n content.append(\n this.createBox({\n bg: 'bg-info',\n titleColor: 'text-info',\n icon: Icons.people,\n title: this.studentInfo,\n bodyHTML: this.generateStudentInfo(this.User, courseName)\n })\n );\n\n if (this.module === 'lesson' && progressBar) {\n content.append(\n this.createBox({\n bg: 'bg-gray',\n titleColor: 'text-dark',\n icon: this.moduleIcon,\n title: this.progress,\n bodyHTML: progressBar.innerHTML\n })\n );\n }\n\n if (courseDes && courseDes?.textContent.trim() !== '') {\n let fileSubDiv = document.querySelectorAll('.fileuploadsubmission');\n if (fileSubDiv) {\n fileSubDiv.forEach(Element => {\n Element.style.verticalAlign = 'middle';\n });\n }\n content.append(\n this.createBox({\n bg: 'bg-gray',\n titleColor: 'text-dark',\n icon: this.moduleIcon,\n title: `${this.getSidebarTitle().title} ${this.description}`,\n bodyHTML: courseDes.innerHTML\n })\n );\n }\n\n if (this.module === 'forum' && replyId) {\n this.checkForumSubject();\n let replyPost = document.querySelector(`#post-content-${replyId}`);\n if (replyPost?.textContent.trim()) {\n content.append(\n this.createBox({\n bg: 'bg-gray',\n titleColor: 'text-dark',\n icon: this.moduleIcon,\n title: this.replyingto,\n bodyHTML: replyPost.textContent.trim()\n })\n );\n }\n }\n\n if (this.module === 'quiz' && this.editor?.id) {\n\n let questionId = this.getQuestionId(this.editor?.id);\n let question = document.querySelector(`#question-${questionId} .qtext`);\n let intro = atob(this.quizInfo.intro);\n\n if (question?.textContent.trim()) {\n content.append(\n this.createBox({\n bg: 'bg-amber',\n titleColor: 'text-dark',\n icon: this.moduleIcon,\n title: this.answeringto,\n bodyHTML: question.textContent\n })\n );\n }\n\n if (intro && intro.trim() !== '') {\n content.append(\n this.createBox({\n bg: 'bg-gray',\n titleColor: 'text-dark',\n icon: this.moduleIcon,\n title: `${this.quiz} ${this.description}`,\n bodyHTML: intro\n })\n );\n }\n\n if (Number(this.quizInfo.open)) {\n content.append(\n this.createBox({\n bg: 'bg-amber',\n titleColor: 'text-dark',\n icon: Icons.time,\n title: this.importantdates,\n bodyHTML: this.generateImportantDates(Number(this.quizInfo.open), Number(this.quizInfo.close))\n })\n );\n }\n }\n\n if (Object.keys(this.Rubrics).length) {\n content.append(\n this.createBox({\n bg: 'bg-gray',\n titleColor: 'text-dark',\n icon: this.moduleIcon,\n title: this.rubrics,\n bodyHTML: this.generateRubrics(this.Rubrics)\n })\n );\n }\n\n if (Dates) {\n content.append(\n this.createBox({\n bg: 'bg-amber',\n titleColor: 'text-dark',\n icon: Icons.time,\n title: this.importantdates,\n bodyHTML: this.generateImportantDates(openDate, dueDate)\n })\n );\n }\n if (this.module === 'assign') {\n content.append(\n this.createBox({\n bg: 'bg-green',\n titleColor: 'text-success',\n icon: this.moduleIcon,\n title: this.subStatus,\n bodyHTML: this.submissionStatus(this.submission)\n })\n );\n }\n\n container.append(btnWrapper, header, content);\n return container;\n\n }\n // Helper to create info boxes\n createBox({bg, titleColor, icon, title, bodyHTML}) {\n const box = this.create('div');\n box.className = `tiny_cursive-fullpage-card ${bg}`;\n\n const heading = this.create('h4');\n heading.className = `tiny_cursive-fullpage-card-header ${titleColor} d-flex align-items-center`;\n heading.innerHTML = `${icon} ${title}`;\n\n const body = this.create('div');\n body.className = `tiny_cursive-fullpage-card-body`;\n body.innerHTML = bodyHTML;\n\n box.append(heading, body);\n return box;\n }\n\n generateRubrics(Rubrics) {\n const wrapper = this.create('div');\n\n Rubrics.forEach(rubric => {\n const rubricDiv = this.create('div');\n rubricDiv.className = 'tiny_cursive-rubric-card';\n\n const title = this.create('h3');\n title.className = 'tiny_cursive-rubric-title';\n title.textContent = rubric.description;\n rubricDiv.appendChild(title);\n\n Object.values(rubric.levels).forEach(level => {\n const levelDiv = this.create('div');\n const score = Number(level.score);\n\n // Assign background color class based on score\n if (score === 0) {\n levelDiv.className = 'tiny_cursive-rubric-level tiny_cursive-rubric-low';\n } else if (score <= 2) {\n levelDiv.className = 'tiny_cursive-rubric-level tiny_cursive-rubric-mid';\n } else {\n levelDiv.className = 'tiny_cursive-rubric-level tiny_cursive-rubric-high';\n }\n\n levelDiv.textContent = `${level.definition} / ${level.score}`;\n rubricDiv.appendChild(levelDiv);\n });\n\n wrapper.appendChild(rubricDiv);\n });\n\n return wrapper.innerHTML;\n }\n\n submissionStatus(submission) {\n const wrapper = this.create('div');\n\n const statusWrapper = this.create('div');\n statusWrapper.className = 'tiny_cursive-status-row';\n\n const statusName = this.create('span');\n statusName.textContent = `${this.status}:`;\n\n const statusValue = this.create('span');\n const isNew = submission?.current?.status === 'new';\n statusValue.textContent = isNew ? this.draftnot : this.draft;\n statusValue.className = `tiny_cursive-status-value ${isNew ? 'tiny_cursive-status-red' : 'tiny_cursive-status-green'}`;\n\n statusWrapper.append(statusName, statusValue);\n\n const modifiedWrapper = this.create('div');\n modifiedWrapper.className = 'tiny_cursive-status-row';\n\n const modifiedName = this.create('span');\n modifiedName.textContent = `${this.lastModified}: `;\n\n const modifiedValue = this.create('span');\n if (submission?.current?.timemodified) {\n const date = new Date(submission.current.timemodified * 1000);\n modifiedValue.textContent = this.formatDate(date);\n } else {\n modifiedValue.textContent = 'N/A';\n }\n modifiedWrapper.append(modifiedName, modifiedValue);\n\n const gradeWrapper = this.create('div');\n gradeWrapper.className = 'tiny_cursive-status-row';\n\n const gradeName = this.create('span');\n gradeName.textContent = `${this.gradings}: `;\n\n const gradeValue = this.create('span');\n\n if (submission?.grade) {\n gradeValue.textContent = Number(submission.grade.grade) > 0\n ? submission.grade.grade\n : this.gradenot;\n } else {\n gradeValue.textContent = this.gradenot;\n }\n\n gradeWrapper.append(gradeName, gradeValue);\n wrapper.append(statusWrapper, gradeWrapper, modifiedWrapper);\n return wrapper.innerHTML;\n }\n\n wordCounter(status) {\n const wordCount = this.create('div');\n const labelDiv = this.create('div');\n const label = this.create('span');\n const value = this.create('span');\n const icon = this.create('span');\n\n icon.className = 'me-2';\n icon.innerHTML = Icons.assignment;\n\n labelDiv.appendChild(icon);\n labelDiv.append(label);\n\n label.textContent = `${this.wordCount}:`;\n value.textContent = '0';\n value.className = 'text-primary';\n value.style.fontWeight = '600';\n value.style.fontSize = '14px';\n\n wordCount.className = 'bg-white rounded shadow-sm p-2 d-flex justify-content-between my-2';\n wordCount.append(labelDiv, value);\n wordCount.style.fontSize = '12px';\n\n const observer = new MutationObserver(() => {\n const newText = status.textContent.trim();\n value.textContent = `${newText.replace('words', '')}`;\n });\n\n observer.observe(status, {\n characterData: true,\n subtree: true,\n childList: true\n });\n\n return wordCount;\n }\n\n\n timerCountDown(timer) {\n\n let warningDiv = document.querySelector('#user-notifications > div');\n if (warningDiv) {\n let clone = warningDiv.cloneNode(true);\n clone.querySelector('button')?.remove();\n this.editor.notificationManager.open({\n text: clone.textContent,\n type: 'error'\n });\n }\n\n\n const timerCount = this.create('div');\n timerCount.className = 'bg-white rounded shadow-sm p-2 d-flex justify-content-between my-2';\n\n const labelDiv = this.create('div');\n const label = this.create('span');\n const value = this.create('span');\n const icon = this.create('span');\n icon.innerHTML = Icons.time;\n\n labelDiv.appendChild(icon);\n labelDiv.append(label);\n\n label.textContent = `${this.timeleft}:`;\n value.textContent = '00:00:00';\n value.className = warningDiv ? 'text-danger' : 'text-primary';\n Object.assign(value.style, {\n fontWeight: '600',\n fontSize: '14px'\n });\n\n\n timerCount.append(labelDiv, value);\n timerCount.style.fontSize = '12px';\n if (timer) {\n const observer = new MutationObserver(() => {\n const newText = timer.textContent.trim();\n value.textContent = `${newText}`;\n });\n observer.observe(timer, {\n characterData: true,\n subtree: true,\n childList: true\n });\n } else {\n value.textContent = this.nolimit;\n }\n\n\n return timerCount;\n }\n\n\n generateStudentInfo(user, course) {\n\n const wrapper = this.create('div');\n\n const nameWrapper = this.create('div');\n const usernameWrapper = this.create('div');\n const courseWrapper = this.create('div');\n\n const nameLabel = this.create('strong');\n const nameValue = this.create('span');\n const usernameLabel = this.create('strong');\n const usernameValue = this.create('span');\n const courseLabel = this.create('strong');\n const courseValue = this.create('span');\n\n nameLabel.textContent = `${this.name}`;\n nameValue.textContent = user.fullname;\n\n usernameLabel.textContent = `${this.userename}: `;\n usernameValue.textContent = user.username;\n\n courseLabel.textContent = `${this.course}: `;\n courseValue.textContent = course.title;\n\n usernameLabel.className = 'cfw-bold me-2';\n usernameValue.className = 'cursiveFw-wrap';\n courseLabel.className = 'cfw-bold me-2';\n courseValue.className = 'cursiveFw-wrap';\n nameLabel.className = 'cfw-bold me-2';\n nameValue.className = 'cursiveFw-wrap';\n\n nameWrapper.append(nameLabel, nameValue);\n usernameWrapper.append(usernameLabel, usernameValue);\n courseWrapper.append(courseLabel, courseValue);\n\n wrapper.append(nameWrapper, usernameWrapper, courseWrapper);\n\n return wrapper.innerHTML;\n\n }\n\n generateImportantDates(open, due) {\n\n const wrapper = this.create('div');\n let openDate = null;\n let dueDate = null;\n\n const openedWrapper = this.create('div');\n const dueWrapper = this.create('div');\n const remainingWrapper = this.create('div');\n\n const openedLabel = this.create('span');\n const openedValue = this.create('span');\n const dueLabel = this.create('span');\n const dueValue = this.create('span');\n const remainingLabel = this.create('span');\n const remainingValue = this.create('span');\n if (this.module === 'quiz') {\n openDate = open * 1000;\n dueDate = due * 1000;\n } else {\n openDate = this.extractDate(open?.textContent);\n dueDate = this.extractDate(due?.textContent);\n }\n\n openedLabel.textContent = `${this.opened}: `;\n openedValue.textContent = this.formatDate(openDate ? new Date(openDate) : null);\n openedValue.className = 'text-dark';\n\n dueLabel.textContent = `${this.due}: `;\n dueValue.textContent = this.formatDate(dueDate ? new Date(dueDate) : null);\n dueValue.className = 'text-danger';\n\n remainingLabel.textContent = `${this.remaining}: `;\n remainingValue.textContent = this.calculateDate(dueDate);\n remainingValue.className = 'text-danger';\n\n openedWrapper.className = 'd-flex justify-content-between';\n dueWrapper.className = 'd-flex justify-content-between';\n remainingWrapper.className = 'd-flex align-items-center justify-content-between mt-2 pt-2 border-top';\n\n openedWrapper.append(openedLabel, openedValue);\n dueWrapper.append(dueLabel, dueValue);\n remainingWrapper.append(remainingLabel, remainingValue);\n\n wrapper.append(openedWrapper, dueWrapper, remainingWrapper);\n\n return wrapper.innerHTML;\n }\n\n formatDate(date) {\n if (!date) {\n return '-';\n }\n\n let options = {year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true};\n return date.toLocaleString('en-US', options);\n }\n\n extractDate(text) {\n if (!text) {\n return '-';\n }\n // Split on first colon and return the right part\n const parts = text?.split(':');\n if (parts.length > 1) {\n return parts.slice(1).join(':').trim();\n }\n\n return text.trim();\n }\n\n\n calculateDate(date) {\n if (!date) {\n return '-';\n }\n const date1 = new Date(date); // Due date (local time)\n const now = new Date(); // Current date/time\n\n // Calculate the difference in milliseconds\n const diffMs = date1 - now;\n\n // Convert to days, hours, minutes\n if (diffMs <= 0) {\n return \"Overdue\";\n } else {\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n const diffHours = Math.floor((diffMs / (1000 * 60 * 60)) % 24);\n\n return `${diffDays} days, ${diffHours} hours`;\n }\n\n }\n\n fullPageModule(module) {\n let current = this.module === 'quiz' ?\n document.getElementById(`${module}_ifr`) : document.querySelector(`#${module}_ifr`);\n\n let p1 = current.parentElement;\n let p2 = p1.parentElement;\n let p3 = p2.parentElement;\n let p4 = p3.parentElement;\n\n let statusBar = document.querySelector('.tox-statusbar__right-container > button');\n let assignName = document.querySelector('.page-context-header');\n let header = this.create('div');\n let btn = null;\n\n assignName.classList.remove('mb-2');\n header.id = 'tiny_cursive-fullpage-custom-header';\n Object.assign(header.style, {\n backgroundColor: 'white',\n display: 'flex',\n justifyContent: 'space-between'\n });\n\n if (this.module === 'quiz') {\n btn = document.querySelector('#mod_quiz-next-nav').cloneNode(true);\n btn.className = 'tiny_cursive-fullpage-submit-btn';\n btn.style.margin = '.5rem';\n } else {\n btn = this.create('input');\n btn.className = 'tiny_cursive-fullpage-submit-btn';\n btn.value = this.savechanges;\n btn.type = 'submit';\n btn.style.margin = '.5rem';\n }\n\n if (this.module === 'pdfannotator') {\n const style = document.createElement('style');\n style.id = 'cursiveForceStyle';\n style.textContent = `\n .path-mod-pdfannotator #comment-wrapper h4,\n .path-mod-pdfannotator #comment-nav {\n margin: 0 !important;\n }\n `;\n document.head.appendChild(style);\n }\n\n const leftSide = this.create('div');\n const rightSide = this.create('div');\n let commonStyle = {\n display: 'flex',\n alignItems: 'center',\n margin: '0 1rem'\n };\n\n Object.assign(leftSide.style, commonStyle);\n rightSide.id = 'tiny_cursive-fullpage-right-wrapper';\n Object.assign(rightSide.style, commonStyle);\n\n rightSide.appendChild(btn);\n leftSide.appendChild(assignName.cloneNode(true));\n\n header.appendChild(leftSide);\n header.appendChild(rightSide);\n\n p4.insertBefore(header, p4.firstChild);\n p2.style.backgroundColor = '#efefef';\n Object.assign(current.style, {\n width: '750px',\n minWidth: '750px',\n boxShadow: '0 10px 15px -3px rgb(0 0 0/0.1),0 4px 6px -4px rgb(0 0 0/0.1)'\n });\n\n Object.assign(p1.style, {\n display: 'flex',\n justifyContent: 'center',\n outline: 'none',\n margin: '2rem 0 0'\n });\n const style = this.create('style');\n style.id = 'tiny_cursive-fullpage-mode-style';\n style.textContent = `\n .tox.tox-edit-focus .tox-edit-area::before {\n opacity: 0;\n }`;\n document.head.appendChild(style);\n\n let iframeBody = current.contentDocument?.body || current.contentWindow?.document?.body;\n\n if (iframeBody) {\n iframeBody.style.padding = '0.5in';\n }\n p2.style.position = 'relative';\n document.getElementById('cursive-fullpagemode-sidebar')?.remove();\n\n let toggle = this.create('div');\n toggle.id = 'cursive-fullpagemode-sidebar-toggle';\n toggle.innerHTML = Icons.hamburger;\n p2.appendChild(toggle);\n p2.appendChild(this.docSideBar(statusBar));\n }\n\n normalizePage(editorId) {\n document.getElementById('tiny_cursive-fullpage-custom-header')?.remove();\n document.getElementById('cursive-fullpagemode-sidebar')?.remove();\n\n let current = document.getElementById(editorId);\n let p1 = current.parentElement;\n let p2 = p1.parentElement;\n\n Object.assign(p2.style, {\n backgroundColor: \"\",\n position: \"\"\n });\n\n Object.assign(current.style, {\n width: '',\n minWidth: '',\n boxShadow: '',\n });\n\n Object.assign(p1.style, {\n display: '',\n justifyContent: '',\n outline: '',\n margin: ''\n });\n\n p1.classList.remove('tiny-cursive-editor-container');\n\n let iframeBody = current.contentDocument?.body || current.contentWindow?.document?.body;\n if (iframeBody) {\n iframeBody.style.padding = '0';\n }\n document.head.querySelector('#tiny_cursive-fullpage-mode-style')?.remove();\n document.head.querySelector('#cursiveForceStyle')?.remove();\n }\n\n checkForumSubject() {\n const form = document.querySelector('#tiny_cursive-fullpage-right-wrapper > input');\n const msg = this.subjectnot;\n\n if (form) {\n form.addEventListener('click', (e) => {\n const subjectInput = document.getElementById('id_subject');\n let content = this.editor.getContent().trim();\n if (!subjectInput || subjectInput.value.trim() === '' || content === '') {\n e.preventDefault();\n e.stopPropagation();\n this.editor.windowManager.alert(msg);\n }\n });\n }\n }\n\n getSidebarTitle() {\n const [assign, discus, quiz, lesson] = this.getText('sbTitle');\n switch (this.module) {\n case 'assign':\n return {title: assign, icon: Icons.assignment};\n case 'forum':\n return {title: discus, icon: Icons.forum};\n case 'lesson':\n return {title: lesson, icon: Icons.forum};\n case 'quiz':\n return {title: quiz, icon: Icons.quiz};\n case 'pdfannotator':\n return {title: 'PDF Annotation', icon: Icons.pdfannotator};\n default:\n return {title: 'Page', icon: Icons.quiz};\n }\n }\n\n getTimerBlock(module) {\n switch (module) {\n case 'assign':\n return document.querySelector('#mod_assign_timelimit_block > div > div');\n case 'forum':\n return document.querySelector('#mod_forum_timelimit_block');\n case 'lesson':\n return document.querySelector('#lesson-timer');\n case 'quiz':\n return document.querySelector('#quiz-time-left');\n default:\n return null;\n }\n }\n\n getQuestionId(editoId) {\n try {\n if (!editoId || typeof editoId !== 'string') {\n return '';\n }\n return editoId.replace(/^q(\\d+):(\\d+)_.*$/, \"$1-$2\");\n } catch (error) {\n window.console.error('Error getting question ID:', error);\n return '';\n }\n }\n\n initStrings() {\n [\n this.details,\n this.studentInfo,\n this.progress,\n this.description,\n this.replyingto,\n this.answeringto,\n this.importantdates,\n this.rubrics,\n this.subStatus,\n this.status,\n this.draft,\n this.draftnot,\n this.lastModified,\n this.gradings,\n this.gradenot,\n this.wordCount,\n this.timeleft,\n this.nolimit,\n this.name,\n this.userename,\n this.course,\n this.opened,\n this.due,\n this.overdue,\n this.remaining,\n this.savechanges,\n this.subjectnot\n ] = this.getText('docSideBar');\n }\n\n getText(key) {\n return JSON.parse(localStorage.getItem(key)) || [];\n }\n\n create(tag) {\n return document.createElement(tag);\n }\n\n}"],"names":["constructor","User","Rubrics","submission","modulename","editor","quizInfo","module","moduleIcon","Icons","assignment","initStrings","normalMode","id","this","normalizePage","fullPageMode","fullPageModule","_this$editor2","forum","_this$editor3","_this$editor4","quiz","_this$editor5","lesson","_this$editor6","pdfannotator","_this$editor7","docSideBar","status","replyId","URL","window","location","href","searchParams","get","toggle","document","querySelector","timelimitBlock","getTimerBlock","headerInfo","getSidebarTitle","progressBar","courseName","courseDes","Dates","openDate","dueDate","container","create","Object","assign","className","style","width","overflow","crossBtn","innerHTML","close","addEventListener","transition","display","btnWrapper","padding","position","top","backgroundColor","append","header","headerTitle","textContent","title","details","fontWeight","headerIcon","prepend","cloneNode","wordCount","wordCounter","timerCountDown","content","createBox","bg","titleColor","icon","people","studentInfo","bodyHTML","generateStudentInfo","progress","trim","fileSubDiv","querySelectorAll","forEach","Element","verticalAlign","description","checkForumSubject","replyPost","replyingto","_this$editor8","questionId","getQuestionId","_this$editor9","question","intro","atob","answeringto","Number","open","time","importantdates","generateImportantDates","keys","length","rubrics","generateRubrics","subStatus","submissionStatus","box","heading","body","wrapper","rubric","rubricDiv","appendChild","values","levels","level","levelDiv","score","definition","statusWrapper","statusName","statusValue","isNew","current","draftnot","draft","modifiedWrapper","modifiedName","lastModified","modifiedValue","_submission$current2","timemodified","date","Date","formatDate","gradeWrapper","gradeName","gradings","gradeValue","grade","gradenot","labelDiv","label","value","fontSize","MutationObserver","newText","replace","observe","characterData","subtree","childList","timer","warningDiv","clone","remove","notificationManager","text","type","timerCount","timeleft","nolimit","user","course","nameWrapper","usernameWrapper","courseWrapper","nameLabel","nameValue","usernameLabel","usernameValue","courseLabel","courseValue","name","fullname","userename","username","due","openedWrapper","dueWrapper","remainingWrapper","openedLabel","openedValue","dueLabel","dueValue","remainingLabel","remainingValue","extractDate","opened","remaining","calculateDate","toLocaleString","year","month","day","hour","minute","hour12","parts","split","slice","join","diffMs","Math","floor","getElementById","p1","parentElement","p2","p4","statusBar","assignName","btn","classList","justifyContent","margin","savechanges","createElement","head","leftSide","rightSide","commonStyle","alignItems","insertBefore","firstChild","minWidth","boxShadow","outline","iframeBody","contentDocument","contentWindow","_current$contentWindo","_current$contentWindo2","hamburger","editorId","_current$contentWindo3","_current$contentWindo4","form","msg","subjectnot","e","subjectInput","getContent","preventDefault","stopPropagation","windowManager","alert","discus","getText","editoId","error","console","overdue","key","JSON","parse","localStorage","getItem","tag"],"mappings":"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"} \ No newline at end of file diff --git a/amd/build/filter_writing_report.min.js b/amd/build/filter_writing_report.min.js deleted file mode 100644 index 76e1f7aa..00000000 --- a/amd/build/filter_writing_report.min.js +++ /dev/null @@ -1,3 +0,0 @@ -define("tiny_cursive/filter_writing_report",["jquery","core/ajax","core/templates"],(function($,AJAX,templates){return{init:function(page){$("#id_coursename").change((function(){AJAX.call([{methodname:"cursive_filtered_writing",args:{id:$("#id_coursename").val()}}])[0].done((function(json){var context={data:JSON.parse(json).data,page:page};templates.render("tiny_cursive/user_table",context).then((function(html){return $("#id_username").html(html),!0}))}))}))}}})); - -//# sourceMappingURL=filter_writing_report.min.js.map \ No newline at end of file diff --git a/amd/build/filter_writing_report.min.js.map b/amd/build/filter_writing_report.min.js.map deleted file mode 100644 index e1882024..00000000 --- a/amd/build/filter_writing_report.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"filter_writing_report.min.js","sources":["../src/filter_writing_report.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/filter_writing_report\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\"jquery\", \"core/ajax\", \"core/templates\"], function($, AJAX, templates) {\n return {\n init: function(page) {\n $(\"#id_coursename\").change(function() {\n var promise1 = AJAX.call([\n {\n methodname: \"cursive_filtered_writing\",\n args: {\n id: $(\"#id_coursename\").val(),\n },\n },\n ]);\n promise1[0].done(function(json) {\n var data = JSON.parse(json);\n var context = {\n data: data.data,\n page: page,\n };\n // eslint-disable-next-line\n templates\n .render(\"tiny_cursive/user_table\", context)\n .then(function(html) {\n var filteredUser = $(\"#id_username\");\n filteredUser.html(html);\n return true;\n });\n });\n });\n },\n };\n});\n"],"names":["define","$","AJAX","templates","init","page","change","call","methodname","args","id","val","done","json","context","data","JSON","parse","render","then","html"],"mappings":"AAsBAA,4CAAO,CAAC,SAAU,YAAa,mBAAmB,SAASC,EAAGC,KAAMC,iBAC3D,CACLC,KAAM,SAASC,MACbJ,EAAE,kBAAkBK,QAAO,WACVJ,KAAKK,KAAK,CACvB,CACEC,WAAY,2BACZC,KAAM,CACJC,GAAIT,EAAE,kBAAkBU,UAIrB,GAAGC,MAAK,SAASC,UAEpBC,QAAU,CACZC,KAFSC,KAAKC,MAAMJ,MAETE,KACXV,KAAMA,MAGRF,UACGe,OAAO,0BAA2BJ,SAClCK,MAAK,SAASC,aACMnB,EAAE,gBACRmB,KAAKA,OACX"} \ No newline at end of file diff --git a/amd/build/pdfexport.min.js b/amd/build/pdfexport.min.js new file mode 100644 index 00000000..cc028159 --- /dev/null +++ b/amd/build/pdfexport.min.js @@ -0,0 +1,11 @@ +define("tiny_cursive/pdfexport",["exports","core/templates","jquery","core/modal","core/modal_factory","core/modal_events","core/str"],(function(_exports,_templates,_jquery,_modal,_modal_factory,_modal_events,str){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +/** + * Module for exporting PDF documents with cursive content. Handles PDF generation with custom formatting, + * including margins, image quality settings and page orientation. Provides user feedback during export process. + * + * @module tiny_cursive/pdfexport + * @copyright 2025 Cursive Technology, Inc. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_templates=_interopRequireDefault(_templates),_jquery=_interopRequireDefault(_jquery),_modal=_interopRequireDefault(_modal),_modal_factory=_interopRequireDefault(_modal_factory),_modal_events=_interopRequireDefault(_modal_events),str=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(str);_exports.init=data=>{var _document$getElementB;data&&(data=JSON.parse((null===(_document$getElementB=document.getElementById("CursiveStudentData"))||void 0===_document$getElementB?void 0:_document$getElementB.dataset.submission)||"{}"));Object.keys(data).length?(0,_jquery.default)((function(){let option={margin:[10,6,10,6],filename:data.filename,image:{type:"jpeg",quality:1},html2canvas:{scale:2},jsPDF:{unit:"mm",format:"a4",orientation:"portrait"}};_templates.default.render("tiny_cursive/export_pdf",data).then((html=>html2pdf().set(option).from(html).save().then((()=>(str.get_string("download_pdf_message","tiny_cursive").then((str=>(document.getElementById("loadermessage").textContent=str,str))),setTimeout((()=>{document.getElementById("pdfexportLoader").remove(),window.history.back()}),4e3)))))).catch((e=>window.console.error(e)))})):_modal.default.create({type:_modal_factory.default.types.ALERT,title:str.get_string("message","tool_dataprivacy"),body:str.get_string("nopaylod","tiny_cursive"),cssClass:"modal-dialog modal-dialog-centered"}).then((modal=>(modal.show(),modal.getRoot().on(_modal_events.default.hidden,(()=>{window.history.back()})),modal))).catch((e=>window.console.error(e)))}})); + +//# sourceMappingURL=pdfexport.min.js.map \ No newline at end of file diff --git a/amd/build/pdfexport.min.js.map b/amd/build/pdfexport.min.js.map new file mode 100644 index 00000000..40333a1a --- /dev/null +++ b/amd/build/pdfexport.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pdfexport.min.js","sources":["../src/pdfexport.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n\n/**\n * Module for exporting PDF documents with cursive content. Handles PDF generation with custom formatting,\n * including margins, image quality settings and page orientation. Provides user feedback during export process.\n *\n * @module tiny_cursive/pdfexport\n * @copyright 2025 Cursive Technology, Inc. \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport templates from \"core/templates\";\nimport $ from 'jquery';\nimport Alert from 'core/modal';\nimport Factory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport * as str from 'core/str';\n\nexport const init = (data) => {\n\n if (data) {\n data = JSON.parse(document.getElementById('CursiveStudentData')?.dataset.submission || '{}');\n }\n\n if (!Object.keys(data).length) {\n Alert.create({\n type: Factory.types.ALERT,\n title: str.get_string('message', 'tool_dataprivacy'),\n body: str.get_string('nopaylod', 'tiny_cursive'),\n cssClass: 'modal-dialog modal-dialog-centered'\n }).then(modal => {\n modal.show();\n modal.getRoot().on(ModalEvents.hidden, () => {\n window.history.back();\n });\n return modal;\n }).catch(e => window.console.error(e));\n\n return;\n }\n\n $(function() {\n\n let option = {\n margin: [10, 6, 10, 6],\n filename: data.filename,\n image: {type: 'jpeg', quality: 1},\n html2canvas: {scale: 2},\n jsPDF: {unit: 'mm', format: 'a4', orientation: 'portrait'}};\n\n templates.render('tiny_cursive/export_pdf', data).then(html => {\n // eslint-disable-next-line\n return html2pdf().set(option).from(html).save().then(() => {\n // eslint-disable-next-line\n str.get_string('download_pdf_message', 'tiny_cursive').then(str =>{\n document.getElementById('loadermessage').textContent = str;\n return str;\n });\n\n return setTimeout(() => {\n document.getElementById('pdfexportLoader').remove();\n window.history.back();\n }, 4000);\n\n });\n\n }).catch(e => window.console.error(e));\n });\n};"],"names":["data","JSON","parse","document","getElementById","dataset","submission","Object","keys","length","option","margin","filename","image","type","quality","html2canvas","scale","jsPDF","unit","format","orientation","render","then","html","html2pdf","set","from","save","str","get_string","textContent","setTimeout","remove","window","history","back","catch","e","console","error","create","Factory","types","ALERT","title","body","cssClass","modal","show","getRoot","on","ModalEvents","hidden"],"mappings":";;;;;;;;49BAgCqBA,iCAEbA,OACAA,KAAOC,KAAKC,qCAAMC,SAASC,eAAe,oFAAuBC,QAAQC,aAAc,OAGtFC,OAAOC,KAAKR,MAAMS,4BAiBrB,eAEMC,OAAS,CACDC,OAAc,CAAC,GAAI,EAAG,GAAI,GAC1BC,SAAcZ,KAAKY,SACnBC,MAAc,CAACC,KAAM,OAAQC,QAAS,GACtCC,YAAc,CAACC,MAAO,GACtBC,MAAc,CAACC,KAAM,KAAMC,OAAQ,KAAMC,YAAa,gCAExDC,OAAO,0BAA2BtB,MAAMuB,MAAKC,MAE5CC,WAAWC,IAAIhB,QAAQiB,KAAKH,MAAMI,OAAOL,MAAK,KAEjDM,IAAIC,WAAW,uBAAwB,gBAAgBP,MAAKM,MACzD1B,SAASC,eAAe,iBAAiB2B,YAAcF,IAChDA,OAGJG,YAAW,KACb7B,SAASC,eAAe,mBAAmB6B,SAC3CC,OAAOC,QAAQC,SAChB,UAIRC,OAAMC,GAAKJ,OAAOK,QAAQC,MAAMF,uBAzC7BG,OAAO,CACT3B,KAAM4B,uBAAQC,MAAMC,MACpBC,MAAOhB,IAAIC,WAAW,UAAW,oBACjCgB,KAAMjB,IAAIC,WAAW,WAAY,gBACjCiB,SAAU,uCACXxB,MAAKyB,QACJA,MAAMC,OACND,MAAME,UAAUC,GAAGC,sBAAYC,QAAQ,KACnCnB,OAAOC,QAAQC,UAEZY,SACRX,OAAMC,GAAKJ,OAAOK,QAAQC,MAAMF"} \ No newline at end of file diff --git a/amd/build/plugin.min.js b/amd/build/plugin.min.js index 40ca3914..02dbc830 100644 --- a/amd/build/plugin.min.js +++ b/amd/build/plugin.min.js @@ -1,3 +1,3 @@ -define("tiny_cursive/plugin",["exports","editor_tiny/loader","editor_tiny/utils","./common","./autosaver","core/ajax"],(function(_exports,_loader,_utils,_common,Autosaver,_ajax){var obj;function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Autosaver=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Autosaver),_ajax=(obj=_ajax)&&obj.__esModule?obj:{default:obj};var _default=new Promise(((resolve,reject)=>{const page=["page-mod-assign-editsubmission","page-mod-quiz-attempt","page-mod-forum-view","page-mod-forum-post","page-mod-lesson-view","page-mod-oublog-editpost"];Promise.all([(0,_loader.getTinyMCE)(),(0,_utils.getPluginMetadata)(_common.component,_common.pluginName)]).then((_ref=>{let[tinyMCE,pluginMetadata]=_ref;return tinyMCE.PluginManager.add(_common.pluginName,(editor=>(_ajax.default.call([{methodname:"cursive_get_config",args:{courseid:M.cfg.courseId,cmid:M.cfg.contextInstanceId}}])[0].done((data=>{data.status&&page.includes(document.body.id)&&Autosaver.register(editor,data.sync_interval,data.userid)})).fail((error=>{window.console.error("Error getting cursive config:",error)})),pluginMetadata))),resolve(_common.pluginName)})).catch((error=>{reject(error)}))}));return _exports.default=_default,_exports.default})); +define("tiny_cursive/plugin",["exports","editor_tiny/loader","editor_tiny/utils","./common","./autosaver","core/ajax"],(function(_exports,_loader,_utils,_common,Autosaver,_ajax){var obj;function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,Autosaver=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Autosaver),_ajax=(obj=_ajax)&&obj.__esModule?obj:{default:obj};var _default=new Promise(((resolve,reject)=>{const page=["page-mod-assign-editsubmission","page-mod-quiz-attempt","page-mod-forum-view","page-mod-forum-post","page-mod-lesson-view","page-mod-pdfannotator-view"];Promise.all([(0,_loader.getTinyMCE)(),(0,_utils.getPluginMetadata)(_common.component,_common.pluginName)]).then((_ref=>{let[tinyMCE,pluginMetadata]=_ref;return tinyMCE.PluginManager.add(_common.pluginName,(editor=>(_ajax.default.call([{methodname:"cursive_get_config",args:{courseid:M.cfg.courseId,cmid:M.cfg.contextInstanceId}}])[0].done((data=>{data.status&&page.includes(document.body.id)&&data.mod_state&&Autosaver.register(editor,data.sync_interval,data.userid,data.apikey_status,JSON.parse(data.plugins),JSON.parse(data.rubrics),JSON.parse(data.submission),JSON.parse(data.quizinfo),data.pastesetting)})).fail((error=>{window.console.error("Error getting cursive config:",error)})),pluginMetadata))),resolve(_common.pluginName)})).catch((error=>{reject(error)}))}));return _exports.default=_default,_exports.default})); //# sourceMappingURL=plugin.min.js.map \ No newline at end of file diff --git a/amd/build/plugin.min.js.map b/amd/build/plugin.min.js.map index 04e0d590..30e6bff0 100644 --- a/amd/build/plugin.min.js.map +++ b/amd/build/plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"plugin.min.js","sources":["../src/plugin.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/plugin\n * @category TinyMCE Editor\n * @copyright 2025 CTI \n * @author Brain Station 23 \n */\n\nimport {getTinyMCE} from 'editor_tiny/loader';\nimport {getPluginMetadata} from 'editor_tiny/utils';\nimport {component, pluginName} from './common';\nimport * as Autosaver from './autosaver';\nimport getConfig from 'core/ajax';\n\nexport default new Promise((resolve, reject) => {\n const page = [\n 'page-mod-assign-editsubmission',\n 'page-mod-quiz-attempt',\n 'page-mod-forum-view',\n 'page-mod-forum-post',\n 'page-mod-lesson-view',\n 'page-mod-oublog-editpost'];\n\n Promise.all([\n getTinyMCE(),\n getPluginMetadata(component, pluginName),\n ])\n .then(([tinyMCE, pluginMetadata]) => {\n tinyMCE.PluginManager.add(pluginName, (editor) => {\n\n getConfig.call([{\n methodname: \"cursive_get_config\",\n args: {courseid: M.cfg.courseId, cmid: M.cfg.contextInstanceId}\n }])[0].done((data) => {\n if (data.status && page.includes(document.body.id)) {\n\n Autosaver.register(editor, data.sync_interval, data.userid);\n }\n }).fail((error) => {\n window.console.error('Error getting cursive config:', error);\n });\n\n return pluginMetadata;\n });\n return resolve(pluginName);\n })\n .catch((error) => {\n reject(error);\n });\n});\n"],"names":["Promise","resolve","reject","page","all","component","pluginName","then","_ref","tinyMCE","pluginMetadata","PluginManager","add","editor","call","methodname","args","courseid","M","cfg","courseId","cmid","contextInstanceId","done","data","status","includes","document","body","id","Autosaver","register","sync_interval","userid","fail","error","window","console","catch"],"mappings":"gwCA4Be,IAAIA,SAAQ,CAACC,QAASC,gBAC3BC,KAAO,CACT,iCACA,wBACA,sBACA,sBACA,uBACA,4BAEJH,QAAQI,IAAI,EACR,yBACA,4BAAkBC,kBAAWC,sBAE5BC,MAAKC,WAAEC,QAASC,4BACbD,QAAQE,cAAcC,IAAIN,oBAAaO,uBAEzBC,KAAK,CAAC,CACZC,WAAY,qBACZC,KAAM,CAACC,SAAUC,EAAEC,IAAIC,SAAUC,KAAMH,EAAEC,IAAIG,sBAC7C,GAAGC,MAAMC,OACLA,KAAKC,QAAUtB,KAAKuB,SAASC,SAASC,KAAKC,KAE3CC,UAAUC,SAASlB,OAAQW,KAAKQ,cAAeR,KAAKS,WAEzDC,MAAMC,QACLC,OAAOC,QAAQF,MAAM,gCAAiCA,UAGnDzB,kBAEJT,QAAQK,uBAElBgC,OAAOH,QACJjC,OAAOiC"} \ No newline at end of file +{"version":3,"file":"plugin.min.js","sources":["../src/plugin.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/plugin\n * @category TinyMCE Editor\n * @copyright 2025 CTI \n * @author Brain Station 23 \n */\n\nimport {getTinyMCE} from 'editor_tiny/loader';\nimport {getPluginMetadata} from 'editor_tiny/utils';\nimport {component, pluginName} from './common';\nimport * as Autosaver from './autosaver';\nimport getConfig from 'core/ajax';\n\nexport default new Promise((resolve, reject) => {\n const page = [\n 'page-mod-assign-editsubmission',\n 'page-mod-quiz-attempt',\n 'page-mod-forum-view',\n 'page-mod-forum-post',\n 'page-mod-lesson-view',\n 'page-mod-pdfannotator-view']; // 'page-mod-oublog-editpost' excluded\n\n Promise.all([\n getTinyMCE(),\n getPluginMetadata(component, pluginName),\n ])\n .then(([tinyMCE, pluginMetadata]) => {\n tinyMCE.PluginManager.add(pluginName, (editor) => {\n\n getConfig.call([{\n methodname: \"cursive_get_config\",\n args: {courseid: M.cfg.courseId, cmid: M.cfg.contextInstanceId}\n }])[0].done((data) => {\n if (data.status && page.includes(document.body.id) && data.mod_state) {\n\n Autosaver.register(\n editor,\n data.sync_interval,\n data.userid,\n data.apikey_status,\n JSON.parse(data.plugins),\n JSON.parse(data.rubrics),\n JSON.parse(data.submission),\n JSON.parse(data.quizinfo),\n data.pastesetting\n );\n }\n }).fail((error) => {\n window.console.error('Error getting cursive config:', error);\n });\n\n return pluginMetadata;\n });\n return resolve(pluginName);\n })\n .catch((error) => {\n reject(error);\n });\n});\n"],"names":["Promise","resolve","reject","page","all","component","pluginName","then","_ref","tinyMCE","pluginMetadata","PluginManager","add","editor","call","methodname","args","courseid","M","cfg","courseId","cmid","contextInstanceId","done","data","status","includes","document","body","id","mod_state","Autosaver","register","sync_interval","userid","apikey_status","JSON","parse","plugins","rubrics","submission","quizinfo","pastesetting","fail","error","window","console","catch"],"mappings":"gwCA4Be,IAAIA,SAAQ,CAACC,QAASC,gBAC3BC,KAAO,CACT,iCACA,wBACA,sBACA,sBACA,uBACA,8BAEJH,QAAQI,IAAI,EACR,yBACA,4BAAkBC,kBAAWC,sBAE5BC,MAAKC,WAAEC,QAASC,4BACbD,QAAQE,cAAcC,IAAIN,oBAAaO,uBAEzBC,KAAK,CAAC,CACZC,WAAY,qBACZC,KAAM,CAACC,SAAUC,EAAEC,IAAIC,SAAUC,KAAMH,EAAEC,IAAIG,sBAC7C,GAAGC,MAAMC,OACLA,KAAKC,QAAUtB,KAAKuB,SAASC,SAASC,KAAKC,KAAOL,KAAKM,WAEvDC,UAAUC,SACNnB,OACAW,KAAKS,cACLT,KAAKU,OACLV,KAAKW,cACLC,KAAKC,MAAMb,KAAKc,SAChBF,KAAKC,MAAMb,KAAKe,SAChBH,KAAKC,MAAMb,KAAKgB,YAChBJ,KAAKC,MAAMb,KAAKiB,UAChBjB,KAAKkB,iBAGdC,MAAMC,QACLC,OAAOC,QAAQF,MAAM,gCAAiCA,UAGnDlC,kBAEJT,QAAQK,uBAElByC,OAAOH,QACJ1C,OAAO0C"} \ No newline at end of file diff --git a/amd/build/replay.min.js b/amd/build/replay.min.js index a463eb3a..0b222771 100644 --- a/amd/build/replay.min.js +++ b/amd/build/replay.min.js @@ -1,3 +1,3 @@ -define("tiny_cursive/replay",["exports","core/ajax","core/templates","jquery","core/str"],(function(_exports,_ajax,_templates,_jquery,Str){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_templates=_interopRequireDefault(_templates),_jquery=_interopRequireDefault(_jquery),Str=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Str);return _exports.default=class{constructor(elementId,filePath){let speed=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,loop=arguments.length>3&&void 0!==arguments[3]&&arguments[3],controllerId=arguments.length>4?arguments[4]:void 0;var obj,key,value;value="",(key="controllerId")in(obj=this)?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,this.controllerId=controllerId,this.replayInProgress=!1,this.speed=speed,this.loop=loop;const element=document.getElementById(elementId);if(!element)throw new Error("Element with id '".concat(elementId,"' not found"));this.outputElement=element,controllerId&&this.constructController(controllerId),this.loadJSON(filePath).then((data=>{if(data.status){var val=JSON.parse(data.data);this.logData=val,"data"in this.logData&&(this.logData=this.logData.data),"payload"in this.logData&&(this.logData=this.logData.payload),this.startReplay()}else try{Promise.all([_templates.default.render("tiny_cursive/no_submission"),Str.get_string("warningpayload","tiny_cursive")]).then((function(results){var html=results[0],str=results[1],newElement=(0,_jquery.default)(html);return newElement.text(str),(0,_jquery.default)(".tiny_cursive").html(newElement),!0})).catch((function(error){window.console.error(error)}))}catch(error){window.console.error(error)}return data})).catch((error=>{try{Promise.all([_templates.default.render("tiny_cursive/no_submission"),Str.get_string("warningpayload","tiny_cursive")]).then((function(results){var html=results[0],str=results[1],newElement=(0,_jquery.default)(html);return newElement.text(str),(0,_jquery.default)(".tiny_cursive").html(newElement),!0})).catch((function(error){window.console.error(error)}))}catch(error){window.console.error(error)}window.console.error("Error loading JSON file: "+error.message)}))}stopReplay(){this.replayInProgress&&(clearTimeout(this.replayTimeout),this.replayInProgress=!1)}constructController(controllerId){const controller=document.getElementById(controllerId);controller&&(this.scrubberElement=document.createElement("input"),this.scrubberElement.type="range",this.scrubberElement.id="timelineScrubber",this.scrubberElement.min="0",this.scrubberElement.max="100",this.scrubberElement.addEventListener("input",(()=>{const scrubberValue=this.scrubberElement.value;this.skipToTime(scrubberValue)})),controller.appendChild(this.scrubberElement))}setScrubberVal(value){this.scrubberElement&&(this.scrubberElement.value=String(value))}loadJSON(filePath){return(0,_ajax.call)([{methodname:"cursive_get_reply_json",args:{filepath:filePath}}])[0].done((response=>response)).fail((error=>{throw new Error("Error loading JSON file: "+error.message)}))}startReplay(){this.replayInProgress&&clearTimeout(this.replayTimeout),this.replayInProgress=!0;let uid=this.controllerId.split("_")[1];document.getElementById("rep"+uid).classList.contains("active")?this.outputElement.innerHTML="":this.stopReplay(),this.replayLog()}replayLog(){let textOutput="",index=0;const processEvent=()=>{if(this.replayInProgress)if(index{"keydown"===event.event.toLowerCase()&&(textOutput=this.applyKey(event.key,textOutput))})),this.outputElement.innerHTML=textOutput.slice(0,-1),this.setScrubberVal(100)}skipToTime(percentage){this.replayInProgress&&(this.replayInProgress=!1);let textOutput="";const numElementsToProcess=Math.ceil(this.logData.length*percentage/100);for(let i=0;i2&&void 0!==arguments[2]?arguments[2]:1,loop=arguments.length>3&&void 0!==arguments[3]&&arguments[3],controllerId=arguments.length>4?arguments[4]:void 0;this.controllerId=controllerId||"",this.replayInProgress=!1,this.speed=parseFloat(speed),this.loop=loop,this.highlightedChars=[],this.deletedChars=[],this.cursorPosition=0,this.currentEventIndex=0,this.totalEvents=0,this.currentTime=0,this.totalDuration=0,this.usercomments=[],this.pasteTimestamps=[],this.isPasteEvent=!1,this.isControlKeyPressed=!1,this.isShiftKeyPressed=!1,this.isMetaKeyPressed=!1,this.text="",this.pastedEvents=[],this.currentPasteIndex=0,this.pastedChars=[],this.aiEvents=[],this.currentAiIndex=0,this.aiChars=[],this.undoTimestamps=[],this.undoChars=[];const element=document.getElementById(elementId);if(!element)throw new Error(`Element with id '${elementId}' not found`);this.outputElement=element,this.loadJSON(filePath).then((data=>(data.status?(this.processData(data),this.totalEvents=this.logData.length,this.identifyPasteEvents(),this.identifyUndoEvents(),this.controllerId&&this.logData&&this.constructController(this.controllerId),this.startReplay()):this.handleNoSubmission(),data))).catch((error=>{this.handleNoSubmission(),window.console.error("Error loading JSON file:",error.message)})),localStorage.getItem("nopasteevent")&&localStorage.getItem("pasteEvent")||(Str.get_string("nopasteevent","tiny_cursive").then((str=>(localStorage.setItem("nopasteevent",str),str))).catch((error=>window.console.log(error))),Str.get_string("pasteEvent","tiny_cursive").then((str=>(localStorage.setItem("pasteEvent",str),str))).catch((error=>window.console.log(error))))}processData(data){this.logData=JSON.parse(data.data),data.comments&&(this.usercomments=Array.isArray(JSON.parse(data.comments))?JSON.parse(data.comments):[]),"data"in this.logData&&(this.logData=this.logData.data),"payload"in this.logData&&(this.logData=this.logData.payload);for(let i=0;i0&&this.logData[0].unixTimestamp){const startTime=this.logData[0].unixTimestamp;this.logData=this.logData.map((event=>({...event,normalizedTime:event.unixTimestamp-startTime}))),this.totalDuration=this.logData[this.logData.length-1].normalizedTime}}async handleNoSubmission(){try{const[html,str]=await Promise.all([_templates.default.render("tiny_cursive/no_submission"),Str.get_string("warningpayload","tiny_cursive")]),newElement=(0,_jquery.default)(html).text(str);return(0,_jquery.default)(".tiny_cursive").html(newElement)}catch(error){return window.console.error(error),!1}}stopReplay(){if(this.replayInProgress&&(clearTimeout(this.replayTimeout),this.replayInProgress=!1,this.playButton)){const playSvg=document.createElement("img");playSvg.src=M.util.image_url("playicon","tiny_cursive"),this.playButton.querySelector(".play-icon").innerHTML=playSvg.outerHTML}}constructController(controllerId){var _controlContainer$que;this.replayInProgress=!1,this.currentPosition=0,this.speed=1,this.replayIntervalId&&(clearInterval(this.replayIntervalId),this.replayIntervalId=null);const container=document.getElementById(controllerId);if(!container)return void window.console.error("Container not found with ID:",controllerId);const controlContainer=container.querySelector(".tiny_cursive_replay_control");controlContainer?(controlContainer.innerHTML='',this.buildControllerUI(controlContainer,container),null===(_controlContainer$que=controlContainer.querySelector(".tiny_cursive_loading_spinner"))||void 0===_controlContainer$que||_controlContainer$que.remove()):window.console.error("Replay control container not found in:",controllerId)}buildControllerUI(controlContainer,container){const topRow=document.createElement("div");topRow.classList.add("tiny_cursive_top_row"),this.playButton=this.createPlayButton(),topRow.appendChild(this.playButton);const scrubberContainer=this.createScrubberContainer();topRow.appendChild(scrubberContainer),this.timeDisplay=this.createTimeDisplay(),topRow.appendChild(this.timeDisplay);const bottomRow=document.createElement("div");bottomRow.classList.add("tiny_cursive_bottom_row");const speedContainer=this.createSpeedControls();bottomRow.appendChild(speedContainer);const pasteEventsToggle=this.createPasteEventsToggle(container);bottomRow.appendChild(pasteEventsToggle),controlContainer.appendChild(topRow),controlContainer.appendChild(bottomRow),container.appendChild(this.pasteEventsPanel)}createPlayButton(){const playButton=document.createElement("button");playButton.classList.add("tiny_cursive_play_button");const playSvg=document.createElement("i");return playButton.innerHTML=`${playSvg.outerHTML}`,playButton.addEventListener("click",(()=>{this.replayInProgress?this.stopReplay():this.startReplay(!1),(0,_jquery.default)(".tiny_cursive-nav-tab").find(".active").removeClass("active"),(0,_jquery.default)('a[id^="rep"]').addClass("active")})),playButton}createScrubberContainer(){const scrubberContainer=document.createElement("div");return scrubberContainer.classList.add("tiny_cursive_scrubber_container"),this.scrubberElement=document.createElement("input"),this.scrubberElement.classList.add("tiny_cursive_timeline_scrubber","timeline-scrubber"),this.scrubberElement.type="range",this.scrubberElement.max="100",this.scrubberElement.min="0",this.scrubberElement.value="0",this.scrubberElement.addEventListener("input",(()=>{this.skipToTime(parseInt(this.scrubberElement.value,10))})),scrubberContainer.appendChild(this.scrubberElement),scrubberContainer}createTimeDisplay(){const timeDisplay=document.createElement("div");return timeDisplay.classList.add("tiny_cursive_time_display"),timeDisplay.textContent="00:00 / 00:00",timeDisplay}createSpeedControls(){const speedContainer=document.createElement("div");speedContainer.classList.add("tiny_cursive_speed_controls","speed-controls");const speedLabel=document.createElement("span");speedLabel.classList.add("tiny_cursive_speed_label"),speedLabel.textContent="Speed: ",speedContainer.appendChild(speedLabel);const speedGroup=document.createElement("div");return speedGroup.classList.add("tiny_cursive_speed_group"),[1,1.5,2,5,10].forEach((speed=>{const speedBtn=document.createElement("button");speedBtn.textContent=`${speed}x`,speedBtn.classList.add("tiny_cursive_speed_btn","speed-btn"),parseFloat(speed)===this.speed&&speedBtn.classList.add("active"),speedBtn.dataset.speed=speed,speedBtn.addEventListener("click",(()=>{document.querySelectorAll(".tiny_cursive_speed_btn").forEach((btn=>btn.classList.remove("active"))),speedBtn.classList.add("active"),this.speed=parseFloat(speedBtn.dataset.speed),this.replayInProgress&&(this.stopReplay(),this.startReplay(!1))})),speedGroup.appendChild(speedBtn)})),speedContainer.appendChild(speedGroup),speedContainer}createPasteEventsToggle(container){const pasteEventsToggle=document.createElement("div");pasteEventsToggle.classList.add("tiny_cursive_paste_events_toggle","paste-events-toggle");const pasteEventsIcon=document.createElement("span"),pasteIcon=document.createElement("img");pasteIcon.src=M.util.image_url("pasteicon","tiny_cursive"),pasteEventsIcon.innerHTML=pasteIcon.outerHTML,pasteEventsIcon.classList.add("tiny_cursive_paste_events_icon");const pasteEventsText=document.createElement("span");pasteEventsText.textContent=localStorage.getItem("pasteEvent"),this.pasteEventCount=document.createElement("span"),this.pasteEventCount.textContent=`(${this.pasteTimestamps.length})`,this.pasteEventCount.className="paste-event-count",this.pasteEventCount.style.marginLeft="2px";const chevronIcon=document.createElement("span"),chevron=document.createElement("i");return chevron.className="fa fa-chevron-down",chevronIcon.innerHTML=chevron.outerHTML,chevronIcon.style.marginLeft="5px",chevronIcon.style.transition="transform 0.3s ease",pasteEventsToggle.appendChild(pasteEventsIcon),pasteEventsToggle.appendChild(pasteEventsText),pasteEventsToggle.appendChild(this.pasteEventCount),pasteEventsToggle.appendChild(chevronIcon),this.pasteEventsPanel=this.createPasteEventsPanel(container),pasteEventsToggle.addEventListener("click",(()=>{const isHidden="none"===this.pasteEventsPanel.style.display;this.pasteEventsPanel.style.display=isHidden?"block":"none",chevronIcon.style.transform=isHidden?"rotate(180deg)":"rotate(0deg)"})),pasteEventsToggle}createPasteEventsPanel(container){const existingPanel=container.querySelector(".paste-events-panel");existingPanel&&existingPanel.remove();const pasteEventsPanel=document.createElement("div");return pasteEventsPanel.classList.add("tiny_cursive_paste_events_panel","paste-events-panel"),pasteEventsPanel.style.display="none",this.populatePasteEventsPanel(pasteEventsPanel),pasteEventsPanel}identifyPasteEvents(){this.pasteTimestamps=[];let controlPressed=!1,metaPressed=!1,shiftPressed=!1,pasteCount=0;for(let i=0;i';const nextButton=document.createElement("button");nextButton.classList.add("paste-event-next-btn","tiny_cursive_nav_button"),nextButton.innerHTML='',nextButton.disabled=this.pasteTimestamps.length<=1,navButtons.appendChild(prevButton),navButtons.appendChild(nextButton),navigationRow.appendChild(counterDisplay),navigationRow.appendChild(navButtons);const contentContainer=document.createElement("div");contentContainer.className="paste-events-content tiny_cursive_content_container",contentContainer.appendChild(this.createPasteEventDisplay(this.pasteTimestamps[0])),carouselContainer.appendChild(navigationRow),carouselContainer.appendChild(contentContainer),panel.appendChild(carouselContainer);let currentIndex=0;const updateDisplay=()=>{contentContainer.innerHTML="",contentContainer.appendChild(this.createPasteEventDisplay(this.pasteTimestamps[currentIndex])),counterDisplay.textContent="Paste Events",prevButton.disabled=0===currentIndex,prevButton.style.opacity=0===currentIndex?"0.5":"1",nextButton.disabled=currentIndex===this.pasteTimestamps.length-1,nextButton.style.opacity=currentIndex===this.pasteTimestamps.length-1?"0.5":"1"};prevButton.addEventListener("click",(()=>{currentIndex>0&&(currentIndex--,updateDisplay())})),nextButton.addEventListener("click",(()=>{currentIndexthis.jumpToTimestamp(pasteEvent.timestamp))),headerRow.appendChild(textContainer),headerRow.appendChild(playButton),eventRow.appendChild(headerRow),eventRow}jumpToTimestamp(timestamp){const percentage=this.totalDuration>0?timestamp/this.totalDuration*100:0;this.skipToTime(percentage),this.replayInProgress||this.startReplay(!1)}setScrubberVal(value){if(this.scrubberElement&&(this.scrubberElement.value=String(value),this.timeDisplay)){const displayTime=Math.min(this.currentTime,this.totalDuration);this.timeDisplay.textContent=`${this.formatTime(displayTime)} / ${this.formatTime(this.totalDuration)}`}}loadJSON(filePath){return(0,_ajax.call)([{methodname:"cursive_get_reply_json",args:{filepath:filePath}}])[0].done((response=>response)).fail((error=>{throw new Error(`Error loading JSON file: ${error.message}`)}))}formatTime(ms){const seconds=Math.floor(ms/1e3),remainingSeconds=seconds%60;return`${Math.floor(seconds/60).toString().padStart(2,"0")}:${remainingSeconds.toString().padStart(2,"0")}`}startReplay(){let reset=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.replayInProgress&&clearTimeout(this.replayTimeout);if((this.totalDuration>0&&this.currentTime>=this.totalDuration||this.currentEventIndex>=this.totalEvents)&&!reset&&(reset=!0),this.replayInProgress=!0,reset&&(this.outputElement.innerHTML="",this.text="",this.cursorPosition=0,this.currentEventIndex=0,this.currentTime=0,this.highlightedChars=[],this.deletedChars=[],this.isControlKeyPressed=!1,this.isMetaKeyPressed=!1,this.currentPasteIndex=0,this.pastedChars=[],this.currentAiIndex=0,this.aiChars=[]),this.playButton){const pauseSvg=document.createElement("i");pauseSvg.className="fa fa-pause",this.playButton.querySelector(".play-icon").innerHTML=pauseSvg.outerHTML}this.replayLog()}replayLog(){if(this.replayInProgress){for(;this.currentEventIndexthis.currentTime)break;let text=this.text||"",cursor=this.cursorPosition,updatedHighlights=[...this.highlightedChars],updatedDeleted=[...this.deletedChars];void 0===event.rePosition||0!==this.currentEventIndex&&"mouseDown"!==event.event&&"mouseUp"!==event.event||(cursor=Math.max(0,Math.min(event.rePosition,text.length))),"keydown"===(null===(_event$event3=event.event)||void 0===_event$event3?void 0:_event$event3.toLowerCase())?({text:text,cursor:cursor,updatedHighlights:updatedHighlights,updatedDeleted:updatedDeleted}=this.processKeydownEvent(event,text,cursor,updatedHighlights,updatedDeleted)):"aiInsert"===event.event&&({text:text,cursor:cursor,updatedHighlights:updatedHighlights,updatedDeleted:updatedDeleted}=this.processAiInsertEvent(event,text,cursor,updatedHighlights,updatedDeleted)),this.text=text,this.cursorPosition=cursor,this.highlightedChars=updatedHighlights.filter((h=>!h.expiresAt||h.expiresAt>this.currentTime)),this.deletedChars=updatedDeleted.filter((d=>!d.expiresAt||d.expiresAt>this.currentTime)),this.currentEventIndex++}if(this.updateDisplayText(this.text,this.cursorPosition,this.highlightedChars,this.deletedChars),this.totalDuration>0){const percentComplete=Math.min(this.currentTime/this.totalDuration*100,100);this.setScrubberVal(percentComplete)}if(this.replayInProgress){const baseIncrement=100,incrementTime=baseIncrement/this.speed;this.currentTime+=baseIncrement,this.currentEventIndex>=this.totalEvents?this.loop?this.startReplay(!0):(this.stopReplay(),this.updateDisplayText(this.text,this.cursorPosition,[],[])):this.replayTimeout=setTimeout((()=>this.replayLog()),incrementTime)}}else this.updateDisplayText(this.text,this.cursorPosition,[],[])}getLineAndColumn(text,pos){const before=text.substring(0,pos);return{lineIndex:before.split("\n").length-1,col:before.length-before.lastIndexOf("\n")-1}}processAiInsertEvent(event,text,cursor,highlights,deletions){if(this.aiEvents&&this.currentAiIndex1,isNewLineInsertion=insertText.startsWith("\n")||insertText.endsWith("\n"),{wordStart:wordStart,wordEnd:wordEnd}=this.findWordToReplace(text,targetPosition,currentCursor,aiWords,isMultiWord,isNewLineInsertion),wordToReplace=text.substring(wordStart,wordEnd);this.markCharsAsDeleted(wordToReplace,wordStart,deletions);const replacedLength=wordToReplace.length;text=text.substring(0,wordStart)+insertText+text.substring(wordEnd);const positionDiff=insertText.length-replacedLength,newCursor=this.calculateNewCursorPosition(currentCursor,targetPosition,wordStart,wordEnd,insertText,isNewLineInsertion);return this.updateCharacterIndices(wordStart,wordEnd,positionDiff,insertText),{text:text,cursor:newCursor}}findWordToReplace(text,targetPosition,currentCursor,aiWords,isMultiWord,isNewLineInsertion){if(isNewLineInsertion)return{wordStart:currentCursor,wordEnd:currentCursor};const{lineStart:lineStart,lineEnd:lineEnd}=this.findLineRange(text,targetPosition),lineText=text.substring(lineStart,lineEnd),words=this.extractWordsFromLine(lineText,lineStart);return 0===words.length?{wordStart:currentCursor,wordEnd:currentCursor}:isMultiWord?this.findMultiWordMatch(words,aiWords,targetPosition):this.findSingleWordMatch(words,aiWords[0],targetPosition)}findLineRange(text,targetPosition){let lineStart=0;for(let i=targetPosition-1;i>=0;i--)if("\n"===text[i]){lineStart=i+1;break}let lineEnd=text.length;for(let i=targetPosition;i=lineText.length)break;const start=pos;for(;posstart&&words.push({text:lineText.substring(start,pos),start:lineStart+start,end:lineStart+pos})}return words}findMultiWordMatch(words,aiWords,targetPosition){let bestMatch={start:-1,end:-1,score:-1,wordCount:0,similarityScore:0};for(let i=0;ibestMatch.score||matchResult.totalScore===bestMatch.score&&matchResult.similarityScore>bestMatch.similarityScore)&&(bestMatch=matchResult)}if(bestMatch.score>10)return{wordStart:bestMatch.start,wordEnd:bestMatch.end};{const closest=this.findClosestWord(words,targetPosition);return{wordStart:closest.start,wordEnd:closest.end}}}evaluateMultiWordSequence(words,aiWords,startIndex,targetPosition){const seqWords=[];for(let j=0;j=seqStart&&targetPosition<=seqEndPos&&(positionScore+=10,targetPosition>=seqWords[0].start&&targetPosition<=seqWords[0].end&&(positionScore+=5)),positionScore}findSingleWordMatch(words,aiWord,targetPosition){const aiWordLower=aiWord.toLowerCase(),bestSimilarityMatch=this.findBestSimilarityMatch(words,aiWordLower);if(bestSimilarityMatch.score>.5)return{wordStart:bestSimilarityMatch.word.start,wordEnd:bestSimilarityMatch.word.end};const bestPositionMatch=this.findBestPositionMatch(words,aiWordLower,targetPosition);return bestPositionMatch.word?{wordStart:bestPositionMatch.word.start,wordEnd:bestPositionMatch.word.end}:this.findWordBoundaryAtPosition(words[0].start,words[words.length-1].end,targetPosition,this.text)}findBestSimilarityMatch(words,aiWordLower){let bestMatch={word:null,score:0};for(const word of words){let similarity=this.calculateSimilarity(aiWordLower,word.text.toLowerCase());const wordLower=word.text.toLowerCase();wordLower.length<.5*aiWordLower.length&&aiWordLower.startsWith(wordLower)&&(similarity*=.3),similarity>bestMatch.score&&(bestMatch={word:word,score:similarity})}return bestMatch}findBestPositionMatch(words,aiWordLower,targetPosition){let bestMatch={word:null,score:-1};for(const word of words){let score=this.calculateWordScore(word,aiWordLower,targetPosition);score>bestMatch.score&&(bestMatch={word:word,score:score})}return bestMatch}calculateWordScore(word,aiWordLower,targetPosition){let score=0;if(targetPosition>=word.start&&targetPosition<=word.end)score+=30;else{const distance=Math.min(Math.abs(targetPosition-word.start),Math.abs(targetPosition-word.end));score+=Math.max(0,20-distance)}let similarity=this.calculateSimilarity(aiWordLower,word.text.toLowerCase());const wordLower=word.text.toLowerCase();return wordLower.length<.5*aiWordLower.length&&aiWordLower.startsWith(wordLower)&&(similarity*=.3),score+=10*similarity,score}findWordBoundaryAtPosition(lineStart,lineEnd,targetPosition,text){let wordStart=targetPosition;for(;wordStart>lineStart&&" "!==text[wordStart-1]&&"\n"!==text[wordStart-1];)wordStart--;let wordEnd=targetPosition;for(;wordEnd0)for(let i=0;i=wordStart&&targetPosition<=wordEnd)return wordStart+insertText.length;const positionDiff=insertText.length-(wordEnd-wordStart);return currentCursor>=wordEnd?currentCursor+positionDiff:currentCursor>wordStart&¤tCursorp.index>=wordEnd?{...p,index:p.index+positionDiff}:p.index>=wordStart&&p.indexnull!==p)))}markCharsAsAiInserted(wordStart,insertText){if(this.aiChars||(this.aiChars=[]),""!==insertText.trim())for(let i=0;i{if(!justAddedIndices.has(p.index)){if(p.index>=wordEnd)return{...p,index:p.index+positionDiff};if(p.index>=wordStart&&p.indexnull!==p))}calculateSimilarity(str1,str2){if(str1===str2)return 1;if(0===str1.length||0===str2.length)return 0;if(str1.startsWith(str2)||str2.startsWith(str1))return.8;const len1=str1.length,len2=str2.length,matrix=Array(len2+1).fill(null).map((()=>Array(len1+1).fill(0)));for(let i=0;i<=len1;i++)matrix[0][i]=i;for(let j=0;j<=len2;j++)matrix[j][0]=j;for(let j=1;j<=len2;j++)for(let i=1;i<=len1;i++){const cost=str1[i-1]===str2[j-1]?0:1;matrix[j][i]=Math.min(matrix[j][i-1]+1,matrix[j-1][i]+1,matrix[j-1][i-1]+cost)}const maxLen=Math.max(len1,len2);return 1-matrix[len2][len1]/maxLen}findClosestWord(words,targetPosition){if(0===words.length)return{start:targetPosition,end:targetPosition};let closest=words[0],minDistance=Math.min(Math.abs(targetPosition-words[0].start),Math.abs(targetPosition-words[0].end));for(const word of words){if(targetPosition>=word.start&&targetPosition<=word.end)return word;const distance=Math.min(Math.abs(targetPosition-word.start),Math.abs(targetPosition-word.end));distance0){const textBeforeUndo=text;text=text.substring(0,newPosition)+text.substring(cursor),cursor=newPosition;for(let i=0;i1}processKeyOperation(key,charToInsert,text,cursor,highlights,deletions,selection){return this.isCtrlBackspace(key,cursor)?({text:text,cursor:cursor}=this.handleCtrlBackspace(text,cursor,deletions)):this.isCtrlDelete(key,cursor,text)?({text:text}=this.handleCtrlDelete(text,cursor,deletions)):this.isCtrlArrowMove(key)?cursor=this.handleCtrlArrowMove(key,text,cursor):this.isRegularBackspace(key,cursor)?({text:text,cursor:cursor}=this.handleBackspace(text,cursor,deletions)):this.isRegularDelete(key,cursor,text)?({text:text}=this.handleDelete(text,cursor,deletions)):this.isArrowUp(key)?cursor=this.handleArrowUp(text,cursor):this.isArrowDown(key)?cursor=this.handleArrowDown(text,cursor):this.isRegularArrowMove(key)?cursor=this.handleArrowMove(key,text,cursor):charToInsert&&charToInsert.length>0&&(selection&&selection.length>0&&({text:text,cursor:cursor}=this.handleSelectionDeletion(selection,text,cursor,deletions)),({text:text,cursor:cursor}=this.handleCharacterInsert(charToInsert,text,cursor,highlights))),{text:text,cursor:cursor,updatedHighlights:highlights,updatedDeleted:deletions}}detectSelection(eventIndex){var _currentEvent$event;const currentEvent=this.logData[eventIndex];if("keydown"===(null===(_currentEvent$event=currentEvent.event)||void 0===_currentEvent$event?void 0:_currentEvent$event.toLowerCase())&&("Backspace"===currentEvent.key||"Delete"===currentEvent.key)){const currentPos=currentEvent.rePosition;return this.processDetection(currentPos,currentEvent,eventIndex)}return null}processDetection(currentPos,currentEvent,eventIndex){for(let i=eventIndex+1;i1)return{start:Math.min(currentPos,nextPos),end:Math.max(currentPos,nextPos),length:positionDiff};if(1===positionDiff)return"Backspace"===currentEvent.key?{start:nextPos,end:currentPos,length:1}:{start:currentPos,end:nextPos,length:1};break}}return null}handleSelectionDeletion(selection,text,cursor,deletions){const{start:start,end:end,length:length}=selection;for(let i=start;ip.index>=startIndex+numDeleted?{...p,index:p.index-numDeleted}:p.index>=startIndex&&p.indexnull!==p)),this.aiChars&&(this.aiChars=this.aiChars.map((p=>p.index>=startIndex+numDeleted?{...p,index:p.index-numDeleted}:p.index>=startIndex&&p.indexnull!==p)))}updateModifierStates(key){"Control"===key?this.isControlKeyPressed=!0:"Shift"===key?this.isShiftKeyPressed=!0:"Meta"===key?this.isMetaKeyPressed=!0:"v"!==key&&"V"!==key||!this.isControlKeyPressed&&!this.isMetaKeyPressed?["Control","Meta","Backspace","Delete","ArrowLeft","ArrowRight"].includes(key)||(this.isControlKeyPressed=!1,this.isShiftKeyPressed=!1,this.isMetaKeyPressed=!1,this.isPasteEvent=!1):this.isPasteEvent=!0}isCtrlBackspace(key,cursor){return"Backspace"===key&&this.isControlKeyPressed&&cursor>0}isCtrlDelete(key,cursor,text){return"Delete"===key&&this.isControlKeyPressed&&cursor0}isRegularDelete(key,cursor,text){return"Delete"===key&&!this.isControlKeyPressed&&cursorp.index>=cursor?{...p,index:p.index+1}:p))),this.aiChars&&(this.aiChars=this.aiChars.map((p=>p.index>=cursor?{...p,index:p.index+1}:p))),""!==charToInsert.trim()&&highlights.push({index:cursor,chars:charToInsert,time:this.currentTime,expiresAt:this.currentTime+1500}),{text:text,cursor:cursor+1}}handleCtrlDelete(text,cursor,deletions){const wordEnd=this.findNextWordBoundary(text,cursor),wordToDelete=text.substring(cursor,wordEnd);for(let i=0;i0){const prevLine=lines[lineIndex-1];cursor=lines.slice(0,lineIndex-1).join("\n").length+1+Math.min(col,prevLine.length)}else cursor=0;return cursor}handleArrowDown(text,cursor){const lines=text.split("\n"),{lineIndex:lineIndex,col:col}=this.getLineAndColumn(text,cursor);if(lineIndex0&&" "===text[wordStart-1];)wordStart--;for(;wordStart>0&&" "!==text[wordStart-1];)wordStart--;const wordToDelete=text.substring(wordStart,cursor);for(let i=0;i=text.length)return cursor;if(" "===text[cursor])for(;cursor=text.length){let lastNonSpace=text.length-1;for(;lastNonSpace>=0&&" "===text[lastNonSpace];)lastNonSpace--;return lastNonSpace+1}let wordEnd=cursor;for(;wordEnd0&&(" "===text[pos]||"\n"===text[pos]);)pos--;for(;pos>0&&" "!==text[pos-1]&&"\n"!==text[pos-1];)pos--;return pos}skipToEnd(){this.replayInProgress&&(this.replayInProgress=!1);let textOutput="";this.logData.forEach((event=>{"keydown"===event.event.toLowerCase()&&(textOutput=this.applyKey(event.key,textOutput))})),this.outputElement.innerHTML=textOutput.slice(0,-1),this.setScrubberVal(100)}skipToTime(percentage){const wasPlaying=this.replayInProgress;this.stopReplay();const targetTime=this.totalDuration*percentage/100;this.currentTime=targetTime,this.currentEventIndex=0,this.text="",this.cursorPosition=0,this.highlightedChars=[],this.deletedChars=[],this.isControlKeyPressed=!1,this.isMetaKeyPressed=!1,this.isPasteEvent=!1,this.pastedChars=[],this.currentPasteIndex=0,this.currentAiIndex=0,this.aiChars=[];let text="",cursor=0,highlights=[],deletions=[],pasteIndex=0,aiIndex=0;for(let i=0;itargetTime){this.currentEventIndex=i;break}void 0===event.rePosition||0!==this.currentEventIndex&&"mouseDown"!==event.event&&"mouseUp"!==event.event||(cursor=Math.max(0,Math.min(event.rePosition,text.length))),"keydown"===(null===(_event$event4=event.event)||void 0===_event$event4?void 0:_event$event4.toLowerCase())?(this.currentPasteIndex=pasteIndex,"v"!==event.key&&"V"!==event.key||!this.isControlKeyPressed&&!this.isMetaKeyPressed||pasteIndex++,({text:text,cursor:cursor,updatedHighlights:highlights,updatedDeleted:deletions}=this.processKeydownEvent(event,text,cursor,highlights,deletions))):"aiInsert"===event.event&&(this.currentAiIndex=aiIndex,({text:text,cursor:cursor,updatedHighlights:highlights,updatedDeleted:deletions}=this.processAiInsertEvent(event,text,cursor,highlights,deletions)),aiIndex++),this.currentEventIndex=i+1}this.currentPasteIndex=pasteIndex,this.currentAiIndex=aiIndex,this.text=text,this.cursorPosition=cursor,this.highlightedChars=highlights.filter((h=>!h.expiresAt||h.expiresAt>targetTime)),this.deletedChars=deletions.filter((d=>!d.expiresAt||d.expiresAt>targetTime)),this.updateDisplayText(this.text,this.cursorPosition,this.highlightedChars,this.deletedChars),this.setScrubberVal(percentage),wasPlaying&&(this.replayInProgress=!0,this.replayLog())}updateDisplayText(text,cursorPosition,highlights,deletions){let html="";const highlightMap={},deletionMap={},pastedMap={},aiMap={},currentTime=this.currentTime;highlights.forEach((h=>{let opacity=1;h.expiresAt&&h.expiresAt-currentTime<500&&(opacity=Math.max(0,(h.expiresAt-currentTime)/500)),highlightMap[h.index]={chars:h.chars,opacity:opacity}})),deletions.forEach((d=>{let opacity=.5;d.expiresAt&&d.expiresAt-currentTime<500&&(opacity=Math.max(0,(d.expiresAt-currentTime)/500*.5)),deletionMap[d.index]={chars:d.chars,opacity:opacity}})),this.pastedChars&&this.pastedChars.forEach((p=>{p.index{p.indexd.index>=text.length)),textLines=text.split("\n");let currentPosition=0;for(let lineIndex=0;lineIndex');const char=line[i];deletionMap[currentPosition]&&(html+=`${deletionMap[currentPosition].chars}`);const isPasted=pastedMap[currentPosition],isAi=aiMap[currentPosition],isHighlighted=highlightMap[currentPosition]&&" "!==char;html+=isPasted&&isHighlighted?`${char}`:isAi&&isHighlighted?`${char}`:isPasted?`${" "===char?" ":this.escapeHtml(char)}`:isAi?`${" "===char?" ":this.escapeHtml(char)}`:isHighlighted?`${char}`:" "===char?" ":this.escapeHtml(char),currentPosition++}currentPosition===cursorPosition&&(html+=''),lineIndex",currentPosition++)}if(cursorPosition!==text.length||html.endsWith('')||(html+=''),outOfRangeDeletions.length>0){outOfRangeDeletions.sort(((a,b)=>a.index-b.index));const cursorHTML='',cursorPos=html.lastIndexOf(cursorHTML);if(-1!==cursorPos){let deletedWordHTML='';outOfRangeDeletions.forEach((d=>{deletedWordHTML+=d.chars})),deletedWordHTML+="",html=html.substring(0,cursorPos)+deletedWordHTML+html.substring(cursorPos)}}const wasScrolledToBottom=this.outputElement.scrollHeight-this.outputElement.clientHeight<=this.outputElement.scrollTop+1;this.outputElement.innerHTML=html,(wasScrolledToBottom||this.isCursorBelowViewport())&&(this.outputElement.scrollTop=this.outputElement.scrollHeight)}isCursorBelowViewport(){const cursorElement=this.outputElement.querySelector(".tiny_cursive-cursor:last-of-type");if(!cursorElement)return!1;const cursorRect=cursorElement.getBoundingClientRect(),outputRect=this.outputElement.getBoundingClientRect();return cursorRect.bottom>outputRect.bottom}escapeHtml(unsafe){return unsafe.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}applyKey(key){switch(key){case"Enter":return"\n";case"Backspace":case"Delete":case"ControlBackspace":return"";case" ":return" ";default:return["Shift","Ctrl","Alt","ArrowDown","ArrowUp","Control","ArrowRight","ArrowLeft","Meta","CapsLock","Tab","Escape","Delete","PageUp","PageDown","Insert","Home","End","NumLock","AudioVolumeUp","AudioVolumeDown","MediaPlayPause","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","PrintScreen","UnIdentified"].includes(key)?"":key}}},_exports.default})); //# sourceMappingURL=replay.min.js.map \ No newline at end of file diff --git a/amd/build/replay.min.js.map b/amd/build/replay.min.js.map index 8bfae212..126f99bc 100644 --- a/amd/build/replay.min.js.map +++ b/amd/build/replay.min.js.map @@ -1 +1 @@ -{"version":3,"file":"replay.min.js","sources":["../src/replay.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/replay\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\nimport {call as fetchJson} from 'core/ajax';\nimport templates from 'core/templates';\nimport $ from 'jquery';\nimport * as Str from 'core/str';\nexport default class Replay {\n controllerId = '';\n constructor(elementId, filePath, speed = 1, loop = false, controllerId) {\n this.controllerId = controllerId;\n this.replayInProgress = false;\n this.speed = speed;\n this.loop = loop;\n const element = document.getElementById(elementId);\n if (element) {\n this.outputElement = element;\n } else {\n throw new Error(`Element with id '${elementId}' not found`);\n }\n if (controllerId) {\n\n this.constructController(controllerId);\n }\n this.loadJSON(filePath)\n .then((data) => {\n if (data.status) {\n var val = JSON.parse(data.data);\n this.logData = val;\n if (\"data\" in this.logData) {\n this.logData = this.logData.data;\n }\n if (\"payload\" in this.logData) {\n this.logData = this.logData.payload;\n }\n this.startReplay();\n } else {\n try {\n // eslint-disable-next-line\n Promise.all([\n templates.render('tiny_cursive/no_submission'),\n Str.get_string('warningpayload', 'tiny_cursive')\n ])\n .then(function(results) {\n var html = results[0];\n var str = results[1];\n var newElement = $(html);\n newElement.text(str);\n $('.tiny_cursive').html(newElement);\n return true;\n })\n .catch(function(error) {\n window.console.error(error);\n });\n } catch (error) {\n window.console.error(error);\n }\n }\n return data;\n })\n .catch(error => {\n\n try {\n // eslint-disable-next-line\n Promise.all([\n templates.render('tiny_cursive/no_submission'),\n Str.get_string('warningpayload', 'tiny_cursive')\n ])\n .then(function(results) {\n var html = results[0];\n var str = results[1];\n var newElement = $(html);\n newElement.text(str);\n $('.tiny_cursive').html(newElement);\n return true;\n })\n .catch(function(error) {\n window.console.error(error);\n });\n } catch (error) {\n window.console.error(error);\n }\n window.console.error('Error loading JSON file: ' + error.message);\n });\n }\n\n stopReplay() {\n if (this.replayInProgress) {\n clearTimeout(this.replayTimeout);\n this.replayInProgress = false;\n }\n }\n constructController(controllerId) {\n const controller = document.getElementById(controllerId);\n\n if (controller) {\n this.scrubberElement = document.createElement('input');\n this.scrubberElement.type = 'range';\n this.scrubberElement.id = 'timelineScrubber';\n this.scrubberElement.min = '0';\n this.scrubberElement.max = '100';\n this.scrubberElement.addEventListener('input', () => {\n const scrubberValue = this.scrubberElement.value;\n this.skipToTime(scrubberValue);\n });\n controller.appendChild(this.scrubberElement);\n }\n }\n\n setScrubberVal(value) {\n if (this.scrubberElement) {\n this.scrubberElement.value = String(value);\n }\n }\n\n loadJSON(filePath) {\n return fetchJson([{\n methodname: 'cursive_get_reply_json',\n args: {\n filepath: filePath,\n },\n }])[0].done(response => {\n return response;\n }).fail(error => {\n throw new Error('Error loading JSON file: ' + error.message);\n });\n }\n\n // Call this to make a \"start\" or \"start over\" function\n startReplay() {\n // Clear previous instances of timeout to prevent multiple running at once\n if (this.replayInProgress) {\n clearTimeout(this.replayTimeout);\n }\n this.replayInProgress = true;\n let uid = this.controllerId.split('_')[1];\n let element = document.getElementById('rep' + uid);\n let isactive = element.classList.contains('active');\n if (!isactive) {\n this.stopReplay();\n } else {\n this.outputElement.innerHTML = '';\n }\n this.replayLog();\n }\n\n // Called by startReplay() to recursively call through keydown events\n replayLog() {\n let textOutput = \"\";\n let index = 0;\n const processEvent = () => {\n\n if (this.replayInProgress) {\n if (index < this.logData.length) {\n let event = this.logData[index++];\n if (event.event.toLowerCase() === 'keydown') {\n textOutput = this.applyKey(event.key, textOutput);\n }\n this.outputElement.innerHTML = textOutput;\n this.setScrubberVal(index / this.logData.length * 100);\n this.replayTimeout = setTimeout(processEvent, 1 / this.speed * 100);\n } else {\n this.replayInProgress = false;\n if (this.loop) {\n this.startReplay();\n }\n }\n }\n };\n processEvent();\n }\n\n skipToEnd() {\n if (this.replayInProgress) {\n this.replayInProgress = false;\n }\n let textOutput = \"\";\n this.logData.forEach(event => {\n if (event.event.toLowerCase() === 'keydown') {\n textOutput = this.applyKey(event.key, textOutput);\n }\n });\n this.outputElement.innerHTML = textOutput.slice(0, -1);\n this.setScrubberVal(100);\n }\n\n // Used by the scrubber to skip to a certain percentage of data\n skipToTime(percentage) {\n if (this.replayInProgress) {\n this.replayInProgress = false;\n }\n // Only go through certain % of log data\n let textOutput = \"\";\n const numElementsToProcess = Math.ceil(this.logData.length * percentage / 100);\n for (let i = 0; i < numElementsToProcess; i++) {\n const event = this.logData[i];\n if (event.event.toLowerCase() === 'keydown') {\n textOutput = this.applyKey(event.key, textOutput);\n }\n }\n this.outputElement.innerHTML = textOutput.slice(0, -1);\n this.setScrubberVal(percentage);\n }\n\n // Used in various places to add a keydown, backspace, etc. to the output\n applyKey(key, textOutput) {\n switch (key) {\n case \"Enter\":\n return textOutput + \"\\n\";\n case \"Backspace\":\n return textOutput.slice(0, -1);\n case \"ControlBackspace\": {\n let lastSpace = textOutput.lastIndexOf(' ');\n return textOutput.slice(0, lastSpace);\n }\n default:\n return ![\"Shift\", \"Ctrl\", \"Alt\", \"ArrowDown\", \"ArrowUp\", \"Control\", \"ArrowRight\",\n \"ArrowLeft\", \"Meta\", \"CapsLock\", \"Tab\", \"Escape\", \"Delete\", \"PageUp\", \"PageDown\",\n \"Insert\", \"Home\", \"End\", \"NumLock\", \"Insert\", \"Home\", \"End\", \"NumLock\", \"AudioVolumeUp\",\n \"AudioVolumeDown\", \"MediaPlayPause\", \"F1\", \"F2\", \"F3\", \"F4\", \"F5\", \"F6\", \"F7\", \"F8\", \"F9\",\n \"F10\", \"F11\", \"F12\", \"PrintScreen\", \"UnIdentified\"]\n .includes(key) ? textOutput + key : textOutput;\n }\n }\n}\n"],"names":["constructor","elementId","filePath","speed","loop","controllerId","replayInProgress","element","document","getElementById","Error","outputElement","constructController","loadJSON","then","data","status","val","JSON","parse","logData","this","payload","startReplay","Promise","all","templates","render","Str","get_string","results","html","str","newElement","text","catch","error","window","console","message","stopReplay","clearTimeout","replayTimeout","controller","scrubberElement","createElement","type","id","min","max","addEventListener","scrubberValue","value","skipToTime","appendChild","setScrubberVal","String","methodname","args","filepath","done","response","fail","uid","split","classList","contains","innerHTML","replayLog","textOutput","index","processEvent","length","event","toLowerCase","applyKey","key","setTimeout","skipToEnd","forEach","slice","percentage","numElementsToProcess","Math","ceil","i","lastSpace","lastIndexOf","includes"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"replay.min.js","sources":["../src/replay.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/replay\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\nimport {call as fetchJson} from 'core/ajax';\nimport templates from 'core/templates';\nimport $ from 'jquery';\nimport * as Str from 'core/str';\n\nexport default class Replay {\n constructor(elementId, filePath, speed = 1, loop = false, controllerId) {\n // Initialize core properties\n this.controllerId = controllerId || '';\n this.replayInProgress = false;\n this.speed = parseFloat(speed);\n this.loop = loop;\n this.highlightedChars = [];\n this.deletedChars = [];\n this.cursorPosition = 0;\n this.currentEventIndex = 0;\n this.totalEvents = 0;\n this.currentTime = 0;\n this.totalDuration = 0;\n this.usercomments = [];\n this.pasteTimestamps = [];\n this.isPasteEvent = false;\n this.isControlKeyPressed = false;\n this.isShiftKeyPressed = false;\n this.isMetaKeyPressed = false;\n this.text = '';\n this.pastedEvents = [];\n this.currentPasteIndex = 0;\n this.pastedChars = [];\n this.aiEvents = [];\n this.currentAiIndex = 0;\n this.aiChars = [];\n this.undoTimestamps = [];\n this.undoChars = [];\n\n const element = document.getElementById(elementId);\n if (!element) {\n throw new Error(`Element with id '${elementId}' not found`);\n }\n this.outputElement = element;\n\n // Load JSON data and initialize replay\n this.loadJSON(filePath).then(data => {\n if (data.status) {\n this.processData(data);\n this.totalEvents = this.logData.length;\n this.identifyPasteEvents();\n this.identifyUndoEvents();\n if (this.controllerId && this.logData) {\n this.constructController(this.controllerId);\n }\n this.startReplay();\n } else {\n this.handleNoSubmission();\n }\n return data;\n }).catch(error => {\n this.handleNoSubmission();\n window.console.error('Error loading JSON file:', error.message);\n });\n if (!localStorage.getItem('nopasteevent') || !localStorage.getItem('pasteEvent')) {\n Str.get_string('nopasteevent', 'tiny_cursive').then(str => {\n localStorage.setItem('nopasteevent', str);\n return str;\n }).catch(error => window.console.log(error));\n Str.get_string('pasteEvent', 'tiny_cursive').then(str => {\n localStorage.setItem('pasteEvent', str);\n return str;\n }).catch(error => window.console.log(error));\n }\n }\n\n // Process JSON data and normalize timestamps\n processData(data) {\n this.logData = JSON.parse(data.data);\n if (data.comments) {\n this.usercomments = Array.isArray(JSON.parse(data.comments)) ? JSON.parse(data.comments) : [];\n }\n if ('data' in this.logData) {\n this.logData = this.logData.data;\n }\n if ('payload' in this.logData) {\n this.logData = this.logData.payload;\n }\n for (let i = 0; i < this.logData.length; i++) {\n const event = this.logData[i];\n if (event.event === 'Paste') {\n if (typeof event.pastedContent === 'string' && event.pastedContent.trim() !== '') {\n this.pastedEvents.push(event.pastedContent);\n }\n }\n if (event.event === 'aiInsert' && event.aiContent) {\n this.aiEvents.push(event.aiContent);\n }\n }\n if (this.logData.length > 0 && this.logData[0].unixTimestamp) {\n const startTime = this.logData[0].unixTimestamp;\n this.logData = this.logData.map(event => ({\n ...event,\n normalizedTime: event.unixTimestamp - startTime\n }));\n this.totalDuration = this.logData[this.logData.length - 1].normalizedTime;\n }\n }\n\n async handleNoSubmission() {\n try {\n const [html, str] = await Promise.all([\n templates.render('tiny_cursive/no_submission'),\n Str.get_string('warningpayload', 'tiny_cursive')\n ]);\n const newElement = $(html).text(str);\n return $('.tiny_cursive').html(newElement);\n } catch (error) {\n window.console.error(error);\n return false;\n }\n }\n\n // Stop the replay and update play button icon\n stopReplay() {\n if (this.replayInProgress) {\n clearTimeout(this.replayTimeout);\n this.replayInProgress = false;\n if (this.playButton) {\n const playSvg = document.createElement('img');\n playSvg.src = M.util.image_url('playicon', 'tiny_cursive');\n this.playButton.querySelector('.play-icon').innerHTML = playSvg.outerHTML;\n }\n }\n }\n\n // Build the replay control UI (play button, scrubber, speed controls)\n constructController(controllerId) {\n this.replayInProgress = false;\n this.currentPosition = 0;\n this.speed = 1;\n if (this.replayIntervalId) {\n clearInterval(this.replayIntervalId);\n this.replayIntervalId = null;\n }\n\n const container = document.getElementById(controllerId);\n if (!container) {\n window.console.error('Container not found with ID:', controllerId);\n return;\n }\n\n const controlContainer = container.querySelector('.tiny_cursive_replay_control');\n if (!controlContainer) {\n window.console.error('Replay control container not found in:', controllerId);\n return;\n }\n controlContainer.innerHTML = '';\n\n this.buildControllerUI(controlContainer, container);\n controlContainer.querySelector('.tiny_cursive_loading_spinner')?.remove();\n }\n\n buildControllerUI(controlContainer, container) {\n const topRow = document.createElement('div');\n topRow.classList.add('tiny_cursive_top_row');\n\n this.playButton = this.createPlayButton();\n topRow.appendChild(this.playButton);\n\n const scrubberContainer = this.createScrubberContainer();\n topRow.appendChild(scrubberContainer);\n\n this.timeDisplay = this.createTimeDisplay();\n topRow.appendChild(this.timeDisplay);\n\n const bottomRow = document.createElement('div');\n bottomRow.classList.add('tiny_cursive_bottom_row');\n\n const speedContainer = this.createSpeedControls();\n bottomRow.appendChild(speedContainer);\n\n const pasteEventsToggle = this.createPasteEventsToggle(container);\n bottomRow.appendChild(pasteEventsToggle);\n\n controlContainer.appendChild(topRow);\n controlContainer.appendChild(bottomRow);\n container.appendChild(this.pasteEventsPanel);\n }\n\n createPlayButton() {\n const playButton = document.createElement('button');\n playButton.classList.add('tiny_cursive_play_button');\n const playSvg = document.createElement('i');\n playButton.innerHTML = `${playSvg.outerHTML}`;\n playButton.addEventListener('click', () => {\n if (this.replayInProgress) {\n this.stopReplay();\n } else {\n this.startReplay(false);\n }\n $('.tiny_cursive-nav-tab').find('.active').removeClass('active');\n $('a[id^=\"rep\"]').addClass('active');\n });\n return playButton;\n }\n\n createScrubberContainer() {\n const scrubberContainer = document.createElement('div');\n scrubberContainer.classList.add('tiny_cursive_scrubber_container');\n this.scrubberElement = document.createElement('input');\n this.scrubberElement.classList.add('tiny_cursive_timeline_scrubber', 'timeline-scrubber');\n this.scrubberElement.type = 'range';\n this.scrubberElement.max = '100';\n this.scrubberElement.min = '0';\n this.scrubberElement.value = '0';\n this.scrubberElement.addEventListener('input', () => {\n this.skipToTime(parseInt(this.scrubberElement.value, 10));\n });\n scrubberContainer.appendChild(this.scrubberElement);\n return scrubberContainer;\n }\n\n createTimeDisplay() {\n const timeDisplay = document.createElement('div');\n timeDisplay.classList.add('tiny_cursive_time_display');\n timeDisplay.textContent = '00:00 / 00:00';\n return timeDisplay;\n }\n\n createSpeedControls() {\n const speedContainer = document.createElement('div');\n speedContainer.classList.add('tiny_cursive_speed_controls', 'speed-controls');\n const speedLabel = document.createElement('span');\n speedLabel.classList.add('tiny_cursive_speed_label');\n speedLabel.textContent = 'Speed: ';\n speedContainer.appendChild(speedLabel);\n\n const speedGroup = document.createElement('div');\n speedGroup.classList.add('tiny_cursive_speed_group');\n [1, 1.5, 2, 5, 10].forEach(speed => {\n const speedBtn = document.createElement('button');\n speedBtn.textContent = `${speed}x`;\n speedBtn.classList.add('tiny_cursive_speed_btn', 'speed-btn');\n if (parseFloat(speed) === this.speed) {\n speedBtn.classList.add('active');\n }\n speedBtn.dataset.speed = speed;\n speedBtn.addEventListener('click', () => {\n document.querySelectorAll('.tiny_cursive_speed_btn').forEach(btn => btn.classList.remove('active'));\n speedBtn.classList.add('active');\n this.speed = parseFloat(speedBtn.dataset.speed);\n if (this.replayInProgress) {\n this.stopReplay();\n this.startReplay(false);\n }\n });\n speedGroup.appendChild(speedBtn);\n });\n speedContainer.appendChild(speedGroup);\n return speedContainer;\n }\n\n createPasteEventsToggle(container) {\n const pasteEventsToggle = document.createElement('div');\n pasteEventsToggle.classList.add('tiny_cursive_paste_events_toggle', 'paste-events-toggle');\n\n const pasteEventsIcon = document.createElement('span');\n const pasteIcon = document.createElement('img');\n pasteIcon.src = M.util.image_url('pasteicon', 'tiny_cursive');\n pasteEventsIcon.innerHTML = pasteIcon.outerHTML;\n pasteEventsIcon.classList.add('tiny_cursive_paste_events_icon');\n\n const pasteEventsText = document.createElement('span');\n pasteEventsText.textContent = localStorage.getItem('pasteEvent');\n\n this.pasteEventCount = document.createElement('span');\n this.pasteEventCount.textContent = `(${this.pasteTimestamps.length})`;\n this.pasteEventCount.className = 'paste-event-count';\n this.pasteEventCount.style.marginLeft = '2px';\n\n const chevronIcon = document.createElement('span');\n const chevron = document.createElement('i');\n chevron.className = 'fa fa-chevron-down';\n chevronIcon.innerHTML = chevron.outerHTML;\n chevronIcon.style.marginLeft = '5px';\n chevronIcon.style.transition = 'transform 0.3s ease';\n\n pasteEventsToggle.appendChild(pasteEventsIcon);\n pasteEventsToggle.appendChild(pasteEventsText);\n pasteEventsToggle.appendChild(this.pasteEventCount);\n pasteEventsToggle.appendChild(chevronIcon);\n\n this.pasteEventsPanel = this.createPasteEventsPanel(container);\n pasteEventsToggle.addEventListener('click', () => {\n const isHidden = this.pasteEventsPanel.style.display === 'none';\n this.pasteEventsPanel.style.display = isHidden ? 'block' : 'none';\n chevronIcon.style.transform = isHidden ? 'rotate(180deg)' : 'rotate(0deg)';\n });\n\n return pasteEventsToggle;\n }\n\n createPasteEventsPanel(container) {\n const existingPanel = container.querySelector('.paste-events-panel');\n if (existingPanel) {\n existingPanel.remove();\n }\n const pasteEventsPanel = document.createElement('div');\n pasteEventsPanel.classList.add('tiny_cursive_paste_events_panel', 'paste-events-panel');\n pasteEventsPanel.style.display = 'none';\n this.populatePasteEventsPanel(pasteEventsPanel);\n return pasteEventsPanel;\n }\n\n // Detect Ctrl+V paste events and sync with user comments\n identifyPasteEvents() {\n this.pasteTimestamps = [];\n let controlPressed = false;\n let metaPressed = false;\n /* eslint-disable no-unused-vars */\n let shiftPressed = false;\n let pasteCount = 0;\n\n for (let i = 0; i < this.logData.length; i++) {\n const event = this.logData[i];\n if (event.event?.toLowerCase() === 'keydown') {\n if (event.key === 'Control') {\n controlPressed = true;\n } else if (event.key === 'Meta') {\n metaPressed = true;\n } else if (event.key === 'Shift') {\n shiftPressed = true;\n } else if ((event.key === 'v' || event.key === 'V') && (controlPressed || metaPressed)) {\n if (this.pastedEvents[pasteCount]) {\n const timestamp = event.normalizedTime || 0;\n this.pasteTimestamps.push({\n index: pasteCount,\n time: timestamp,\n formattedTime: this.formatTime(timestamp),\n pastedText: this.pastedEvents[pasteCount],\n timestamp\n });\n }\n pasteCount++;\n controlPressed = false;\n shiftPressed = false;\n metaPressed = false;\n } else {\n controlPressed = false;\n shiftPressed = false;\n metaPressed = false;\n }\n }\n }\n\n if (this.pasteEventsPanel) {\n this.populatePasteEventsPanel(this.pasteEventsPanel);\n }\n }\n\n identifyUndoEvents() {\n this.undoTimestamps = [];\n let controlPressed = false;\n let metaPressed = false;\n let undoCount = 0;\n\n for (let i = 0; i < this.logData.length; i++) {\n const event = this.logData[i];\n if (event.event?.toLowerCase() === 'keydown') {\n if (event.key === 'Control') {\n controlPressed = true;\n } else if (event.key === 'Meta') {\n metaPressed = true;\n } else if ((event.key === 'z' || event.key === 'Z') && (controlPressed || metaPressed)) {\n const timestamp = event.normalizedTime || 0;\n this.undoTimestamps.push({\n index: undoCount,\n time: timestamp,\n formattedTime: this.formatTime(timestamp),\n timestamp\n });\n undoCount++;\n controlPressed = false;\n metaPressed = false;\n } else {\n controlPressed = false;\n metaPressed = false;\n }\n }\n }\n }\n\n // Populate the paste events panel with navigation\n populatePasteEventsPanel(panel) {\n panel.innerHTML = '';\n panel.classList.add('tiny_cursive_event_panel');\n\n if (!this.pasteTimestamps.length) {\n const noEventsMessage = document.createElement('div');\n noEventsMessage.className = 'no-paste-events-message p-3';\n noEventsMessage.textContent = localStorage.getItem('nopasteevent');\n panel.appendChild(noEventsMessage);\n return;\n }\n\n const carouselContainer = document.createElement('div');\n carouselContainer.classList.add('tiny_cursive_paste_events_carousel', 'paste-events-carousel');\n\n const navigationRow = document.createElement('div');\n navigationRow.classList.add('paste-events-navigation', 'tiny_cursive_navigation_row');\n\n const counterDisplay = document.createElement('div');\n counterDisplay.classList.add('paste-events-counter', 'tiny_cursive_counter_display');\n counterDisplay.textContent = 'Paste Events';\n\n const navButtons = document.createElement('div');\n navButtons.classList.add('tiny_cursive_nav_buttons');\n const prevButton = document.createElement('button');\n prevButton.classList.add('paste-event-prev-btn', 'tiny_cursive_nav_button');\n prevButton.innerHTML = '';\n\n const nextButton = document.createElement('button');\n nextButton.classList.add('paste-event-next-btn', 'tiny_cursive_nav_button');\n nextButton.innerHTML = '';\n nextButton.disabled = this.pasteTimestamps.length <= 1;\n\n navButtons.appendChild(prevButton);\n navButtons.appendChild(nextButton);\n navigationRow.appendChild(counterDisplay);\n navigationRow.appendChild(navButtons);\n\n const contentContainer = document.createElement('div');\n contentContainer.className = 'paste-events-content tiny_cursive_content_container';\n contentContainer.appendChild(this.createPasteEventDisplay(this.pasteTimestamps[0]));\n\n carouselContainer.appendChild(navigationRow);\n carouselContainer.appendChild(contentContainer);\n panel.appendChild(carouselContainer);\n\n let currentIndex = 0;\n const updateDisplay = () => {\n contentContainer.innerHTML = '';\n contentContainer.appendChild(this.createPasteEventDisplay(this.pasteTimestamps[currentIndex]));\n counterDisplay.textContent = 'Paste Events';\n prevButton.disabled = currentIndex === 0;\n prevButton.style.opacity = currentIndex === 0 ? '0.5' : '1';\n nextButton.disabled = currentIndex === this.pasteTimestamps.length - 1;\n nextButton.style.opacity = currentIndex === this.pasteTimestamps.length - 1 ? '0.5' : '1';\n };\n\n prevButton.addEventListener('click', () => {\n if (currentIndex > 0) {\n currentIndex--;\n updateDisplay();\n }\n });\n\n nextButton.addEventListener('click', () => {\n if (currentIndex < this.pasteTimestamps.length - 1) {\n currentIndex++;\n updateDisplay();\n }\n });\n }\n\n createPasteEventDisplay(pasteEvent) {\n const eventRow = document.createElement('div');\n eventRow.className = 'tiny_cursive_event_row';\n\n const headerRow = document.createElement('div');\n headerRow.className = 'tiny_cursive_header_row';\n\n const textContainer = document.createElement('div');\n textContainer.className = 'tiny_cursive_text_container';\n\n const timestampContainer = document.createElement('div');\n timestampContainer.className = 'paste-event-timestamp tiny_cursive_paste_event_timestamp';\n timestampContainer.textContent = pasteEvent.formattedTime;\n\n const pastedTextContainer = document.createElement('div');\n pastedTextContainer.className = 'paste-event-text tiny_cursive_pasted_text_container';\n pastedTextContainer.textContent = pasteEvent.pastedText;\n\n textContainer.appendChild(timestampContainer);\n textContainer.appendChild(pastedTextContainer);\n\n const playButton = document.createElement('button');\n playButton.className = 'paste-event-play-btn tiny_cursive_seekplay_button';\n const playIcon = document.createElement('img');\n playIcon.src = M.util.image_url('seekplayicon', 'tiny_cursive');\n playButton.innerHTML = playIcon.outerHTML;\n playButton.addEventListener('click', () => this.jumpToTimestamp(pasteEvent.timestamp));\n\n headerRow.appendChild(textContainer);\n headerRow.appendChild(playButton);\n eventRow.appendChild(headerRow);\n\n return eventRow;\n }\n\n // Jump to a specific timestamp in the replay\n jumpToTimestamp(timestamp) {\n const percentage = this.totalDuration > 0 ? (timestamp / this.totalDuration) * 100 : 0;\n this.skipToTime(percentage);\n if (!this.replayInProgress) {\n this.startReplay(false);\n }\n }\n\n setScrubberVal(value) {\n if (this.scrubberElement) {\n this.scrubberElement.value = String(value);\n if (this.timeDisplay) {\n const displayTime = Math.min(this.currentTime, this.totalDuration);\n this.timeDisplay.textContent = `${this.formatTime(displayTime)} / ${this.formatTime(this.totalDuration)}`;\n }\n }\n }\n\n loadJSON(filePath) {\n return fetchJson([{\n methodname: 'cursive_get_reply_json',\n args: {filepath: filePath}\n }])[0].done(response => response).fail(error => {\n throw new Error(`Error loading JSON file: ${error.message}`);\n });\n }\n\n formatTime(ms) {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;\n }\n\n // Start or restart the replay\n startReplay(reset = true) {\n if (this.replayInProgress) {\n clearTimeout(this.replayTimeout);\n }\n const atEnd = (this.totalDuration > 0 && this.currentTime >= this.totalDuration) ||\n (this.currentEventIndex >= this.totalEvents);\n if (atEnd && !reset) {\n reset = true;\n }\n this.replayInProgress = true;\n if (reset) {\n this.outputElement.innerHTML = '';\n this.text = '';\n this.cursorPosition = 0;\n this.currentEventIndex = 0;\n this.currentTime = 0;\n this.highlightedChars = [];\n this.deletedChars = [];\n this.isControlKeyPressed = false;\n this.isMetaKeyPressed = false;\n this.currentPasteIndex = 0;\n this.pastedChars = [];\n this.currentAiIndex = 0;\n this.aiChars = [];\n }\n if (this.playButton) {\n const pauseSvg = document.createElement('i');\n pauseSvg.className = 'fa fa-pause';\n this.playButton.querySelector('.play-icon').innerHTML = pauseSvg.outerHTML;\n }\n this.replayLog();\n }\n\n // Process events in sequence to simulate typing\n replayLog() {\n if (!this.replayInProgress) {\n this.updateDisplayText(this.text, this.cursorPosition, [], []);\n return;\n }\n\n while (this.currentEventIndex < this.logData.length) {\n const event = this.logData[this.currentEventIndex];\n if (event.normalizedTime && event.normalizedTime > this.currentTime) {\n break;\n }\n\n let text = this.text || '';\n let cursor = this.cursorPosition;\n let updatedHighlights = [...this.highlightedChars];\n let updatedDeleted = [...this.deletedChars];\n\n if (event.rePosition !== undefined && (this.currentEventIndex === 0 ||\n event.event === 'mouseDown' || event.event === 'mouseUp')) {\n cursor = Math.max(0, Math.min(event.rePosition, text.length));\n }\n\n if (event.event?.toLowerCase() === 'keydown') {\n ({text, cursor, updatedHighlights, updatedDeleted} =\n this.processKeydownEvent(event, text, cursor, updatedHighlights, updatedDeleted));\n } else if (event.event === 'aiInsert') {\n ({text, cursor, updatedHighlights, updatedDeleted} =\n this.processAiInsertEvent(event, text, cursor, updatedHighlights, updatedDeleted));\n }\n\n this.text = text;\n this.cursorPosition = cursor;\n this.highlightedChars = updatedHighlights.filter(h => !h.expiresAt || h.expiresAt > this.currentTime);\n this.deletedChars = updatedDeleted.filter(d => !d.expiresAt || d.expiresAt > this.currentTime);\n\n this.currentEventIndex++;\n }\n\n this.updateDisplayText(this.text, this.cursorPosition, this.highlightedChars, this.deletedChars);\n if (this.totalDuration > 0) {\n const percentComplete = Math.min((this.currentTime / this.totalDuration) * 100, 100);\n this.setScrubberVal(percentComplete);\n }\n\n if (this.replayInProgress) {\n const baseIncrement = 100;\n const incrementTime = baseIncrement / this.speed;\n this.currentTime += baseIncrement;\n if (this.currentEventIndex >= this.totalEvents) {\n if (this.loop) {\n this.startReplay(true);\n } else {\n this.stopReplay();\n this.updateDisplayText(this.text, this.cursorPosition, [], []);\n }\n } else {\n this.replayTimeout = setTimeout(() => this.replayLog(), incrementTime);\n }\n }\n }\n\n getLineAndColumn(text, pos) {\n const before = text.substring(0, pos);\n const lineIndex = before.split('\\n').length - 1;\n const col = before.length - before.lastIndexOf('\\n') - 1;\n return {lineIndex, col};\n }\n\n processAiInsertEvent(event, text, cursor, highlights, deletions) {\n if (this.aiEvents && this.currentAiIndex < this.aiEvents.length) {\n const aiContent = this.aiEvents[this.currentAiIndex];\n // Use event.rePosition which points to where the word to replace is\n const targetPosition = event.rePosition;\n\n ({text, cursor} = this.handleAiReplacement(aiContent, text, targetPosition, cursor, deletions));\n this.currentAiIndex++;\n }\n return {\n text,\n cursor,\n updatedHighlights: highlights,\n updatedDeleted: deletions\n };\n }\n\n handleAiReplacement(aiContent, text, targetPosition, currentCursor, deletions) {\n const insertText = aiContent || '';\n const aiWords = insertText.trim().split(/\\s+/);\n const isMultiWord = aiWords.length > 1;\n const isNewLineInsertion = insertText.startsWith('\\n') || insertText.endsWith('\\n');\n\n const {wordStart, wordEnd} = this.findWordToReplace(\n text,\n targetPosition,\n currentCursor,\n aiWords,\n isMultiWord,\n isNewLineInsertion\n );\n\n const wordToReplace = text.substring(wordStart, wordEnd);\n\n // Mark replaced characters as deleted\n this.markCharsAsDeleted(wordToReplace, wordStart, deletions);\n\n // Perform the replacement\n const replacedLength = wordToReplace.length;\n text = text.substring(0, wordStart) + insertText + text.substring(wordEnd);\n const positionDiff = insertText.length - replacedLength;\n\n // Calculate new cursor position\n const newCursor = this.calculateNewCursorPosition(\n currentCursor,\n targetPosition,\n wordStart,\n wordEnd,\n insertText,\n isNewLineInsertion\n );\n\n // Update character tracking arrays\n this.updateCharacterIndices(wordStart, wordEnd, positionDiff, insertText);\n\n return {text, cursor: newCursor};\n }\n\n findWordToReplace(text, targetPosition, currentCursor, aiWords, isMultiWord, isNewLineInsertion) {\n if (isNewLineInsertion) {\n return {wordStart: currentCursor, wordEnd: currentCursor};\n }\n\n const {lineStart, lineEnd} = this.findLineRange(text, targetPosition);\n const lineText = text.substring(lineStart, lineEnd);\n const words = this.extractWordsFromLine(lineText, lineStart);\n\n if (words.length === 0) {\n return {wordStart: currentCursor, wordEnd: currentCursor};\n }\n\n if (isMultiWord) {\n return this.findMultiWordMatch(words, aiWords, targetPosition);\n } else {\n return this.findSingleWordMatch(words, aiWords[0], targetPosition);\n }\n }\n\n findLineRange(text, targetPosition) {\n let lineStart = 0;\n for (let i = targetPosition - 1; i >= 0; i--) {\n if (text[i] === '\\n') {\n lineStart = i + 1;\n break;\n }\n }\n\n let lineEnd = text.length;\n for (let i = targetPosition; i < text.length; i++) {\n if (text[i] === '\\n') {\n lineEnd = i;\n break;\n }\n }\n\n return {lineStart, lineEnd};\n }\n\n extractWordsFromLine(lineText, lineStart) {\n const words = [];\n let pos = 0;\n\n while (pos < lineText.length) {\n // Skip spaces\n while (pos < lineText.length && lineText[pos] === ' ') {\n pos++;\n }\n if (pos >= lineText.length) {\n break;\n }\n\n // Extract word\n const start = pos;\n while (pos < lineText.length && lineText[pos] !== ' ') {\n pos++;\n }\n\n if (pos > start) {\n words.push({\n text: lineText.substring(start, pos),\n start: lineStart + start,\n end: lineStart + pos\n });\n }\n }\n\n return words;\n }\n\n findMultiWordMatch(words, aiWords, targetPosition) {\n let bestMatch = {start: -1, end: -1, score: -1, wordCount: 0, similarityScore: 0};\n\n for (let i = 0; i < words.length; i++) {\n const matchResult = this.evaluateMultiWordSequence(words, aiWords, i, targetPosition);\n\n if (matchResult.totalScore > bestMatch.score ||\n (matchResult.totalScore === bestMatch.score &&\n matchResult.similarityScore > bestMatch.similarityScore)) {\n bestMatch = matchResult;\n }\n }\n\n if (bestMatch.score > 10) {\n return {wordStart: bestMatch.start, wordEnd: bestMatch.end};\n } else {\n const closest = this.findClosestWord(words, targetPosition);\n return {wordStart: closest.start, wordEnd: closest.end};\n }\n }\n\n evaluateMultiWordSequence(words, aiWords, startIndex, targetPosition) {\n const seqWords = [];\n for (let j = 0; j < aiWords.length && startIndex + j < words.length; j++) {\n seqWords.push(words[startIndex + j]);\n }\n\n if (seqWords.length === 0) {\n return {start: -1, end: -1, score: -1, wordCount: 0, similarityScore: 0};\n }\n\n const similarityScore = this.calculateSequenceSimilarity(aiWords, seqWords);\n const positionScore = this.calculatePositionScore(seqWords, targetPosition);\n const totalScore = similarityScore + positionScore + seqWords.length;\n\n return {\n start: seqWords[0].start,\n end: seqWords[seqWords.length - 1].end,\n score: totalScore,\n wordCount: seqWords.length,\n similarityScore: similarityScore\n };\n }\n\n calculateSequenceSimilarity(aiWords, seqWords) {\n let similarityScore = 0;\n const compareLength = Math.min(seqWords.length, aiWords.length);\n\n for (let k = 0; k < compareLength; k++) {\n const ai = aiWords[k].toLowerCase();\n const seq = seqWords[k].text.toLowerCase();\n\n if (ai === seq) {\n similarityScore += 10;\n } else {\n const similarity = this.calculateSimilarity(ai, seq);\n similarityScore += similarity * 10;\n }\n }\n\n return similarityScore;\n }\n\n calculatePositionScore(seqWords, targetPosition) {\n let positionScore = 0;\n const seqStart = seqWords[0].start;\n const seqEndPos = seqWords[seqWords.length - 1].end;\n\n if (targetPosition >= seqStart && targetPosition <= seqEndPos) {\n positionScore += 10;\n if (targetPosition >= seqWords[0].start && targetPosition <= seqWords[0].end) {\n positionScore += 5;\n }\n }\n\n return positionScore;\n }\n\n findSingleWordMatch(words, aiWord, targetPosition) {\n const aiWordLower = aiWord.toLowerCase();\n const bestSimilarityMatch = this.findBestSimilarityMatch(words, aiWordLower);\n\n if (bestSimilarityMatch.score > 0.5) {\n return {wordStart: bestSimilarityMatch.word.start, wordEnd: bestSimilarityMatch.word.end};\n }\n\n const bestPositionMatch = this.findBestPositionMatch(words, aiWordLower, targetPosition);\n\n if (bestPositionMatch.word) {\n return {wordStart: bestPositionMatch.word.start, wordEnd: bestPositionMatch.word.end};\n }\n\n // Fallback to position-based word boundary\n return this.findWordBoundaryAtPosition(words[0].start, words[words.length - 1].end,\n targetPosition, this.text);\n }\n\n findBestSimilarityMatch(words, aiWordLower) {\n let bestMatch = {word: null, score: 0};\n\n for (const word of words) {\n let similarity = this.calculateSimilarity(aiWordLower, word.text.toLowerCase());\n const wordLower = word.text.toLowerCase();\n\n // Penalize short prefix matches\n if (wordLower.length < aiWordLower.length * 0.5 && aiWordLower.startsWith(wordLower)) {\n similarity = similarity * 0.3;\n }\n\n if (similarity > bestMatch.score) {\n bestMatch = {word, score: similarity};\n }\n }\n\n return bestMatch;\n }\n\n findBestPositionMatch(words, aiWordLower, targetPosition) {\n let bestMatch = {word: null, score: -1};\n\n for (const word of words) {\n let score = this.calculateWordScore(word, aiWordLower, targetPosition);\n\n if (score > bestMatch.score) {\n bestMatch = {word, score};\n }\n }\n\n return bestMatch;\n }\n\n calculateWordScore(word, aiWordLower, targetPosition) {\n let score = 0;\n\n // Position score\n if (targetPosition >= word.start && targetPosition <= word.end) {\n score += 30;\n } else {\n const distance = Math.min(\n Math.abs(targetPosition - word.start),\n Math.abs(targetPosition - word.end)\n );\n score += Math.max(0, 20 - distance);\n }\n\n // Similarity score with penalty\n let similarity = this.calculateSimilarity(aiWordLower, word.text.toLowerCase());\n const wordLower = word.text.toLowerCase();\n if (wordLower.length < aiWordLower.length * 0.5 && aiWordLower.startsWith(wordLower)) {\n similarity = similarity * 0.3;\n }\n score += similarity * 10;\n\n return score;\n }\n\n findWordBoundaryAtPosition(lineStart, lineEnd, targetPosition, text) {\n let wordStart = targetPosition;\n while (wordStart > lineStart && text[wordStart - 1] !== ' ' && text[wordStart - 1] !== '\\n') {\n wordStart--;\n }\n let wordEnd = targetPosition;\n while (wordEnd < lineEnd && text[wordEnd] !== ' ' && text[wordEnd] !== '\\n') {\n wordEnd++;\n }\n return {wordStart, wordEnd};\n }\n\n markCharsAsDeleted(wordToReplace, wordStart, deletions) {\n if (wordToReplace.length > 0) {\n for (let i = 0; i < wordToReplace.length; i++) {\n deletions.push({\n index: wordStart + i,\n chars: wordToReplace[i],\n time: this.currentTime,\n expiresAt: this.currentTime + 2000\n });\n }\n }\n }\n\n calculateNewCursorPosition(currentCursor, targetPosition, wordStart, wordEnd, insertText, isNewLineInsertion) {\n if (isNewLineInsertion) {\n return wordStart + insertText.length;\n }\n\n if (targetPosition >= wordStart && targetPosition <= wordEnd) {\n return wordStart + insertText.length;\n }\n\n const positionDiff = insertText.length - (wordEnd - wordStart);\n\n if (currentCursor >= wordEnd) {\n return currentCursor + positionDiff;\n } else if (currentCursor > wordStart && currentCursor < wordEnd) {\n return wordStart + insertText.length;\n }\n\n return currentCursor;\n }\n\n updateCharacterIndices(wordStart, wordEnd, positionDiff, insertText) {\n // Update pasted character indices\n this.updatePastedCharIndices(wordStart, wordEnd, positionDiff);\n\n // Mark characters as AI-inserted\n this.markCharsAsAiInserted(wordStart, insertText);\n\n // Update AI character indices\n this.updateAiCharIndices(wordStart, wordEnd, positionDiff, insertText);\n }\n\n updatePastedCharIndices(wordStart, wordEnd, positionDiff) {\n if (this.pastedChars) {\n this.pastedChars = this.pastedChars.map(p => {\n if (p.index >= wordEnd) {\n return {...p, index: p.index + positionDiff};\n } else if (p.index >= wordStart && p.index < wordEnd) {\n return null;\n }\n return p;\n }).filter(p => p !== null);\n }\n }\n\n markCharsAsAiInserted(wordStart, insertText) {\n if (!this.aiChars) {\n this.aiChars = [];\n }\n\n if (insertText.trim() !== '') {\n for (let i = 0; i < insertText.length; i++) {\n this.aiChars.push({\n index: wordStart + i,\n chars: insertText[i]\n });\n }\n }\n }\n\n updateAiCharIndices(wordStart, wordEnd, positionDiff, insertText) {\n const justAddedIndices = new Set();\n for (let i = 0; i < insertText.length; i++) {\n justAddedIndices.add(wordStart + i);\n }\n\n this.aiChars = this.aiChars.map(p => {\n if (!justAddedIndices.has(p.index)) {\n if (p.index >= wordEnd) {\n return {...p, index: p.index + positionDiff};\n } else if (p.index >= wordStart && p.index < wordEnd) {\n return null;\n }\n }\n return p;\n }).filter(p => p !== null);\n }\n\n // Calculate similarity between two strings\n calculateSimilarity(str1, str2) {\n if (str1 === str2) {\n return 1;\n }\n if (str1.length === 0 || str2.length === 0) {\n return 0;\n }\n\n // Check if one string is a prefix of the other\n if (str1.startsWith(str2) || str2.startsWith(str1)) {\n return 0.8;\n }\n\n // Levenshtein distance\n const len1 = str1.length;\n const len2 = str2.length;\n const matrix = Array(len2 + 1).fill(null).map(() => Array(len1 + 1).fill(0));\n\n for (let i = 0; i <= len1; i++) {\n matrix[0][i] = i;\n }\n for (let j = 0; j <= len2; j++) {\n matrix[j][0] = j;\n }\n\n for (let j = 1; j <= len2; j++) {\n for (let i = 1; i <= len1; i++) {\n const cost = str1[i - 1] === str2[j - 1] ? 0 : 1;\n matrix[j][i] = Math.min(\n matrix[j][i - 1] + 1,\n matrix[j - 1][i] + 1,\n matrix[j - 1][i - 1] + cost\n );\n }\n }\n\n const maxLen = Math.max(len1, len2);\n return 1 - (matrix[len2][len1] / maxLen);\n }\n\n // Find the word closest to a target position\n findClosestWord(words, targetPosition) {\n if (words.length === 0) {\n return {start: targetPosition, end: targetPosition};\n }\n\n let closest = words[0];\n let minDistance = Math.min(\n Math.abs(targetPosition - words[0].start),\n Math.abs(targetPosition - words[0].end)\n );\n\n for (const word of words) {\n if (targetPosition >= word.start && targetPosition <= word.end) {\n return word;\n }\n\n const distance = Math.min(\n Math.abs(targetPosition - word.start),\n Math.abs(targetPosition - word.end)\n );\n\n if (distance < minDistance) {\n minDistance = distance;\n closest = word;\n }\n }\n\n return closest;\n }\n\n // Handle keydown events (e.g., typing, backspace, Ctrl+V)\n processKeydownEvent(event, text, cursor, highlights, deletions) {\n const key = event.key;\n const charToInsert = this.applyKey(key);\n\n // Handle copy operation (Ctrl+C)\n if (this.isCopyOperation(key)) {\n return {text, cursor, updatedHighlights: highlights, updatedDeleted: deletions};\n }\n\n // Handle undo operation (Ctrl+Z)\n if (this.isUndoOperation(key)) {\n return this.handleUndoOperation(event, text, cursor, highlights, deletions);\n }\n\n // Detect selection for current event\n const currentEventIndex = this.currentEventIndex;\n const selection = this.detectSelection(currentEventIndex);\n\n // Handle paste operation (Ctrl+V)\n if (this.isPasteOperation(key, event)) {\n return this.handlePasteOperation(event, selection, text, cursor, highlights, deletions);\n }\n\n // Update modifier key states\n this.updateModifierStates(key);\n\n // Handle selection deletion with Backspace/Delete\n if (this.isSelectionDeletion(key, selection)) {\n ({text, cursor} = this.handleSelectionDeletion(selection, text, cursor, deletions));\n return {text, cursor, updatedHighlights: highlights, updatedDeleted: deletions};\n }\n\n // Process various key operations\n return this.processKeyOperation(key, charToInsert, text, cursor, highlights, deletions, selection);\n }\n\n isCopyOperation(key) {\n return (key === 'c' || key === 'C') && (this.isControlKeyPressed || this.isMetaKeyPressed);\n }\n\n isUndoOperation(key) {\n return (key === 'z' || key === 'Z') && (this.isControlKeyPressed || this.isMetaKeyPressed);\n }\n\n handleUndoOperation(event, text, cursor, highlights, deletions) {\n const nextEventIndex = this.currentEventIndex + 1;\n if (nextEventIndex < this.logData.length) {\n const nextEvent = this.logData[nextEventIndex];\n\n if (nextEvent.event === 'keyUp' && (nextEvent.key === 'z' || nextEvent.key === 'Z')) {\n const newPosition = nextEvent.rePosition;\n if (newPosition < cursor && text.length > 0) {\n const textBeforeUndo = text;\n text = text.substring(0, newPosition) + text.substring(cursor);\n cursor = newPosition;\n\n // Mark as deleted for visual effect\n for (let i = 0; i < textBeforeUndo.length && i < cursor; i++) {\n deletions.push({\n index: newPosition,\n chars: textBeforeUndo[i],\n time: this.currentTime,\n expiresAt: this.currentTime + 2000\n });\n }\n }\n }\n }\n\n this.isControlKeyPressed = false;\n this.isMetaKeyPressed = false;\n\n return {text, cursor, updatedHighlights: highlights, updatedDeleted: deletions};\n }\n\n isPasteOperation(key, event) {\n if ((key === 'v' || key === 'V') && (this.isControlKeyPressed || this.isMetaKeyPressed)) {\n return (event.pastedContent && event.pastedContent.trim() !== '') ||\n (this.pastedEvents && this.currentPasteIndex < this.pastedEvents.length);\n }\n return false;\n }\n\n handlePasteOperation(event, selection, text, cursor, highlights, deletions) {\n const pastedContent = event.pastedContent || this.pastedEvents[this.currentPasteIndex];\n\n if (selection) {\n ({text, cursor} = this.handleSelectionDeletion(selection, text, cursor, deletions));\n }\n\n ({text, cursor} = this.handlePasteInsert(pastedContent, text, cursor));\n this.currentPasteIndex++;\n this.resetModifierStates();\n this.isPasteEvent = false;\n\n return {text, cursor, updatedHighlights: highlights, updatedDeleted: deletions};\n }\n\n resetModifierStates() {\n this.isControlKeyPressed = false;\n this.isShiftKeyPressed = false;\n this.isMetaKeyPressed = false;\n }\n\n isSelectionDeletion(key, selection) {\n return (key === 'Backspace' || key === 'Delete') && selection && selection.length > 1;\n }\n\n processKeyOperation(key, charToInsert, text, cursor, highlights, deletions, selection) {\n if (this.isCtrlBackspace(key, cursor)) {\n ({text, cursor} = this.handleCtrlBackspace(text, cursor, deletions));\n } else if (this.isCtrlDelete(key, cursor, text)) {\n ({text} = this.handleCtrlDelete(text, cursor, deletions));\n } else if (this.isCtrlArrowMove(key)) {\n cursor = this.handleCtrlArrowMove(key, text, cursor);\n } else if (this.isRegularBackspace(key, cursor)) {\n ({text, cursor} = this.handleBackspace(text, cursor, deletions));\n } else if (this.isRegularDelete(key, cursor, text)) {\n ({text} = this.handleDelete(text, cursor, deletions));\n } else if (this.isArrowUp(key)) {\n cursor = this.handleArrowUp(text, cursor);\n } else if (this.isArrowDown(key)) {\n cursor = this.handleArrowDown(text, cursor);\n } else if (this.isRegularArrowMove(key)) {\n cursor = this.handleArrowMove(key, text, cursor);\n } else if (charToInsert && charToInsert.length > 0) {\n if (selection && selection.length > 0) {\n ({text, cursor} = this.handleSelectionDeletion(selection, text, cursor, deletions));\n }\n ({text, cursor} = this.handleCharacterInsert(charToInsert, text, cursor, highlights));\n }\n\n return {text, cursor, updatedHighlights: highlights, updatedDeleted: deletions};\n }\n\n detectSelection(eventIndex) {\n const currentEvent = this.logData[eventIndex];\n\n if (currentEvent.event?.toLowerCase() === 'keydown' &&\n (currentEvent.key === 'Backspace' || currentEvent.key === 'Delete')) {\n\n const currentPos = currentEvent.rePosition;\n return this.processDetection(currentPos, currentEvent, eventIndex);\n }\n return null;\n }\n\n processDetection(currentPos, currentEvent, eventIndex) {\n for (let i = eventIndex + 1; i < this.logData.length; i++) {\n const nextEvent = this.logData[i];\n\n if (nextEvent.event?.toLowerCase() === 'keyup' &&\n nextEvent.key === currentEvent.key) {\n\n const nextPos = nextEvent.rePosition;\n\n // Calculate the difference in positions\n const positionDiff = Math.abs(currentPos - nextPos);\n\n if (positionDiff > 1) {\n return {\n start: Math.min(currentPos, nextPos),\n end: Math.max(currentPos, nextPos),\n length: positionDiff\n };\n } else if (positionDiff === 1) {\n if (currentEvent.key === 'Backspace') {\n return {\n start: nextPos,\n end: currentPos,\n length: 1\n };\n } else {\n return {\n start: currentPos,\n end: nextPos,\n length: 1\n };\n }\n }\n break;\n }\n }\n return null;\n }\n\n handleSelectionDeletion(selection, text, cursor, deletions) {\n const {start, end, length} = selection;\n\n // Add each character in the selection to the deletions array\n for (let i = start; i < end && i < text.length; i++) {\n deletions.push({\n index: start,\n chars: text[i],\n time: this.currentTime,\n expiresAt: this.currentTime + 2000\n });\n }\n\n text = text.substring(0, start) + text.substring(end);\n\n this.shiftPastedCharsIndices(start, length);\n\n cursor = start;\n\n return {text, cursor};\n }\n\n // Handle Paste events to highlight pasted text\n handlePasteInsert(pastedContent, text, cursor) {\n const insertText = pastedContent || '';\n text = text.substring(0, cursor) + insertText + text.substring(cursor);\n\n // Mark characters as pasted for bold styling\n if (insertText.trim() !== '') {\n for (let i = 0; i < insertText.length; i++) {\n if (!this.pastedChars) {\n this.pastedChars = [];\n }\n this.pastedChars.push({\n index: cursor + i,\n chars: insertText[i]\n });\n }\n }\n\n return {text, cursor: cursor + insertText.length};\n }\n\n // Adjusts pasted chars indices after deletion to maintain styling for pasted text\n shiftPastedCharsIndices(startIndex, numDeleted) {\n this.pastedChars = this.pastedChars.map(p => {\n if (p.index >= startIndex + numDeleted) {\n return {...p, index: p.index - numDeleted};\n } else if (p.index >= startIndex && p.index < startIndex + numDeleted) {\n // Remove pasted characters that were deleted\n return null;\n }\n return p;\n }).filter(p => p !== null);\n\n if (this.aiChars) {\n this.aiChars = this.aiChars.map(p => {\n if (p.index >= startIndex + numDeleted) {\n return {...p, index: p.index - numDeleted};\n } else if (p.index >= startIndex && p.index < startIndex + numDeleted) {\n return null;\n }\n return p;\n }).filter(p => p !== null);\n }\n }\n\n // Update state for modifier keys (Control, paste events)\n updateModifierStates(key) {\n if (key === 'Control') {\n this.isControlKeyPressed = true;\n } else if (key === 'Shift') {\n this.isShiftKeyPressed = true;\n } else if (key === 'Meta') {\n this.isMetaKeyPressed = true;\n } else if ((key === 'v' || key === 'V') && (this.isControlKeyPressed || this.isMetaKeyPressed)) {\n this.isPasteEvent = true;\n } else if (!['Control', 'Meta', 'Backspace', 'Delete', 'ArrowLeft', 'ArrowRight'].includes(key)) {\n this.isControlKeyPressed = false;\n this.isShiftKeyPressed = false;\n this.isMetaKeyPressed = false;\n this.isPasteEvent = false;\n }\n }\n\n isCtrlBackspace(key, cursor) {\n return key === 'Backspace' && this.isControlKeyPressed && cursor > 0;\n }\n\n isCtrlDelete(key, cursor, text) {\n return key === 'Delete' && this.isControlKeyPressed && cursor < text.length;\n }\n\n isCtrlArrowMove(key) {\n return this.isControlKeyPressed && (key === 'ArrowLeft' || key === 'ArrowRight');\n }\n\n isRegularBackspace(key, cursor) {\n return key === 'Backspace' && !this.isPasteEvent && cursor > 0;\n }\n\n isRegularDelete(key, cursor, text) {\n return key === 'Delete' && !this.isControlKeyPressed && cursor < text.length;\n }\n\n isRegularArrowMove(key) {\n return !this.isControlKeyPressed && (key === 'ArrowLeft' || key === 'ArrowRight');\n }\n\n isArrowUp(key) {\n return key === 'ArrowUp';\n }\n\n isArrowDown(key) {\n return key === 'ArrowDown';\n }\n\n handleCtrlArrowMove(key, text, cursor) {\n return key === 'ArrowLeft'\n ? this.findPreviousWordBoundary(text, cursor)\n : this.findNextWordBoundary(text, cursor);\n }\n\n handleBackspace(text, cursor, deletions) {\n deletions.push({\n index: cursor - 1,\n chars: text[cursor - 1],\n time: this.currentTime,\n expiresAt: this.currentTime + 2000\n });\n this.shiftPastedCharsIndices(cursor - 1, 1);\n return {\n text: text.substring(0, cursor - 1) + text.substring(cursor),\n cursor: cursor - 1\n };\n }\n\n handleDelete(text, cursor, deletions) {\n deletions.push({\n index: cursor,\n chars: text[cursor],\n time: this.currentTime,\n expiresAt: this.currentTime + 2000\n });\n this.shiftPastedCharsIndices(cursor, 1);\n return {\n text: text.substring(0, cursor) + text.substring(cursor + 1),\n cursor\n };\n }\n\n handleArrowMove(key, text, cursor) {\n return key === 'ArrowLeft'\n ? Math.max(0, cursor - 1)\n : Math.min(text.length, cursor + 1);\n }\n\n handleCharacterInsert(charToInsert, text, cursor, highlights) {\n text = text.substring(0, cursor) + charToInsert + text.substring(cursor);\n // Shift pasted chars indices after the insertion point\n if (this.pastedChars) {\n this.pastedChars = this.pastedChars.map(p => {\n return p.index >= cursor ? {...p, index: p.index + 1} : p;\n });\n }\n if (this.aiChars) {\n this.aiChars = this.aiChars.map(p => {\n return p.index >= cursor ? {...p, index: p.index + 1} : p;\n });\n }\n if (charToInsert.trim() !== '') {\n highlights.push({\n index: cursor,\n chars: charToInsert,\n time: this.currentTime,\n expiresAt: this.currentTime + 1500\n });\n }\n return {text, cursor: cursor + 1};\n }\n\n handleCtrlDelete(text, cursor, deletions) {\n const wordEnd = this.findNextWordBoundary(text, cursor);\n const wordToDelete = text.substring(cursor, wordEnd);\n for (let i = 0; i < wordToDelete.length; i++) {\n deletions.push({\n index: cursor + i,\n chars: wordToDelete[i],\n time: this.currentTime,\n expiresAt: this.currentTime + 2000\n });\n }\n this.shiftPastedCharsIndices(cursor, wordToDelete.length);\n return {\n text: text.substring(0, cursor) + text.substring(wordEnd),\n cursor\n };\n }\n\n handleArrowUp(text, cursor) {\n const lines = text.split('\\n');\n const {lineIndex, col} = this.getLineAndColumn(text, cursor);\n if (lineIndex > 0) {\n const prevLine = lines[lineIndex - 1];\n cursor = lines.slice(0, lineIndex - 1).join('\\n').length + 1 + Math.min(col, prevLine.length);\n } else {\n cursor = 0;\n }\n return cursor;\n }\n\n handleArrowDown(text, cursor) {\n const lines = text.split('\\n');\n const {lineIndex, col} = this.getLineAndColumn(text, cursor);\n if (lineIndex < lines.length - 1) {\n const nextLine = lines[lineIndex + 1];\n cursor = lines.slice(0, lineIndex + 1).join('\\n').length + 1 + Math.min(col, nextLine.length);\n } else {\n cursor = text.length;\n }\n return cursor;\n }\n\n handleCtrlBackspace(text, cursor, deletions) {\n let wordStart = cursor;\n while (wordStart > 0 && text[wordStart - 1] === ' ') {\n wordStart--;\n }\n while (wordStart > 0 && text[wordStart - 1] !== ' ') {\n wordStart--;\n }\n const wordToDelete = text.substring(wordStart, cursor);\n for (let i = 0; i < wordToDelete.length; i++) {\n deletions.push({\n index: wordStart + i,\n chars: wordToDelete[i],\n time: this.currentTime,\n expiresAt: this.currentTime + 2000\n });\n }\n this.shiftPastedCharsIndices(wordStart, wordToDelete.length);\n return {text: text.substring(0, wordStart) + text.substring(cursor), cursor: wordStart};\n }\n\n // Finds the index of the next word boundary after the cursor position\n findNextWordBoundary(text, cursor) {\n if (!text || cursor >= text.length) {\n return cursor;\n }\n if (text[cursor] === ' ') {\n while (cursor < text.length && text[cursor] === ' ') {\n cursor++;\n }\n }\n if (cursor >= text.length) {\n let lastNonSpace = text.length - 1;\n while (lastNonSpace >= 0 && text[lastNonSpace] === ' ') {\n lastNonSpace--;\n }\n return lastNonSpace + 1;\n }\n let wordEnd = cursor;\n while (wordEnd < text.length && text[wordEnd] !== ' ') {\n wordEnd++;\n }\n return wordEnd;\n }\n\n // Finds the index of the previous word boundary before the cursor position\n findPreviousWordBoundary(text, cursor) {\n if (cursor <= 0) {\n return 0;\n }\n let pos = cursor - 1;\n while (pos > 0 && (text[pos] === ' ' || text[pos] === '\\n')) {\n pos--;\n }\n while (pos > 0 && text[pos - 1] !== ' ' && text[pos - 1] !== '\\n') {\n pos--;\n }\n\n return pos;\n }\n\n skipToEnd() {\n if (this.replayInProgress) {\n this.replayInProgress = false;\n }\n let textOutput = \"\";\n this.logData.forEach(event => {\n if (event.event.toLowerCase() === 'keydown') {\n textOutput = this.applyKey(event.key, textOutput);\n }\n });\n this.outputElement.innerHTML = textOutput.slice(0, -1);\n this.setScrubberVal(100);\n }\n\n // Used by the scrubber to skip to a certain percentage of data\n skipToTime(percentage) {\n const wasPlaying = this.replayInProgress;\n this.stopReplay();\n\n const targetTime = (this.totalDuration * percentage) / 100;\n this.currentTime = targetTime;\n this.currentEventIndex = 0;\n this.text = '';\n this.cursorPosition = 0;\n this.highlightedChars = [];\n this.deletedChars = [];\n this.isControlKeyPressed = false;\n this.isMetaKeyPressed = false;\n this.isPasteEvent = false;\n this.pastedChars = [];\n this.currentPasteIndex = 0;\n this.currentAiIndex = 0;\n this.aiChars = [];\n let text = '';\n let cursor = 0;\n let highlights = [];\n let deletions = [];\n let pasteIndex = 0;\n let aiIndex = 0;\n\n for (let i = 0; i < this.logData.length; i++) {\n const event = this.logData[i];\n if (event.normalizedTime && event.normalizedTime > targetTime) {\n this.currentEventIndex = i;\n break;\n }\n if (event.rePosition !== undefined && (this.currentEventIndex === 0 ||\n event.event === 'mouseDown' || event.event === 'mouseUp')) {\n cursor = Math.max(0, Math.min(event.rePosition, text.length));\n }\n if (event.event?.toLowerCase() === 'keydown') {\n this.currentPasteIndex = pasteIndex;\n if ((event.key === 'v' || event.key === 'V') && (this.isControlKeyPressed || this.isMetaKeyPressed)) {\n pasteIndex++;\n }\n ({text, cursor, updatedHighlights: highlights, updatedDeleted: deletions} =\n this.processKeydownEvent(event, text, cursor, highlights, deletions));\n } else if (event.event === 'aiInsert') {\n this.currentAiIndex = aiIndex;\n ({text, cursor, updatedHighlights: highlights, updatedDeleted: deletions} =\n this.processAiInsertEvent(event, text, cursor, highlights, deletions));\n aiIndex++;\n }\n this.currentEventIndex = i + 1;\n }\n\n this.currentPasteIndex = pasteIndex;\n this.currentAiIndex = aiIndex;\n this.text = text;\n this.cursorPosition = cursor;\n this.highlightedChars = highlights.filter(h => !h.expiresAt || h.expiresAt > targetTime);\n this.deletedChars = deletions.filter(d => !d.expiresAt || d.expiresAt > targetTime);\n this.updateDisplayText(this.text, this.cursorPosition, this.highlightedChars, this.deletedChars);\n this.setScrubberVal(percentage);\n\n if (wasPlaying) {\n this.replayInProgress = true;\n this.replayLog();\n }\n }\n\n // Update display with text, cursor, highlights and deletions.\n // eslint-disable-next-line complexity\n updateDisplayText(text, cursorPosition, highlights, deletions) {\n let html = '';\n const highlightMap = {};\n const deletionMap = {};\n const pastedMap = {};\n const aiMap = {};\n const currentTime = this.currentTime;\n\n highlights.forEach(h => {\n let opacity = 1;\n if (h.expiresAt && h.expiresAt - currentTime < 500) {\n opacity = Math.max(0, (h.expiresAt - currentTime) / 500);\n }\n highlightMap[h.index] = {chars: h.chars, opacity};\n });\n\n deletions.forEach(d => {\n let opacity = 0.5;\n if (d.expiresAt && d.expiresAt - currentTime < 500) {\n opacity = Math.max(0, ((d.expiresAt - currentTime) / 500) * 0.5);\n }\n deletionMap[d.index] = {chars: d.chars, opacity};\n });\n\n // Process pasted characters for bold styling\n if (this.pastedChars) {\n this.pastedChars.forEach(p => {\n if (p.index < text.length) {\n pastedMap[p.index] = true;\n }\n });\n }\n\n // Process AI characters for styling\n if (this.aiChars) {\n this.aiChars.forEach(p => {\n if (p.index < text.length) {\n aiMap[p.index] = true;\n }\n });\n }\n\n // Find if we have out-of-bounds deletions (from Control+Backspace)\n const outOfRangeDeletions = deletions.filter(d => d.index >= text.length);\n const textLines = text.split('\\n');\n let currentPosition = 0;\n\n for (let lineIndex = 0; lineIndex < textLines.length; lineIndex++) {\n const line = textLines[lineIndex];\n for (let i = 0; i < line.length; i++) {\n if (currentPosition === cursorPosition) {\n html += '';\n }\n const char = line[i];\n if (deletionMap[currentPosition]) {\n html += `${deletionMap[currentPosition].chars}`;\n }\n const isPasted = pastedMap[currentPosition];\n const isAi = aiMap[currentPosition];\n const isHighlighted = highlightMap[currentPosition] && char !== ' ';\n\n if (isPasted && isHighlighted) {\n html += `${char}`;\n } else if (isAi && isHighlighted) {\n html += `${char}`;\n } else if (isPasted) {\n html += `${char === ' ' ? ' ' : this.escapeHtml(char)}`;\n } else if (isAi) {\n html += `${char === ' ' ? ' ' : this.escapeHtml(char)}`;\n } else if (isHighlighted) {\n html += `${char}`;\n } else {\n html += char === ' ' ? ' ' : this.escapeHtml(char);\n }\n currentPosition++;\n }\n if (currentPosition === cursorPosition) {\n html += '';\n }\n if (lineIndex < textLines.length - 1) {\n html += '
';\n currentPosition++;\n }\n }\n\n if (cursorPosition === text.length && !html.endsWith('')) {\n html += '';\n }\n\n if (outOfRangeDeletions.length > 0) {\n outOfRangeDeletions.sort((a, b) => a.index - b.index);\n const cursorHTML = '';\n const cursorPos = html.lastIndexOf(cursorHTML);\n if (cursorPos !== -1) {\n let deletedWordHTML = '';\n outOfRangeDeletions.forEach(d => {\n deletedWordHTML += d.chars;\n });\n deletedWordHTML += '';\n html = html.substring(0, cursorPos) + deletedWordHTML + html.substring(cursorPos);\n }\n }\n\n const wasScrolledToBottom = this.outputElement.scrollHeight -\n this.outputElement.clientHeight <= this.outputElement.scrollTop + 1;\n this.outputElement.innerHTML = html;\n\n if (wasScrolledToBottom || this.isCursorBelowViewport()) {\n this.outputElement.scrollTop = this.outputElement.scrollHeight;\n }\n }\n\n // Check if cursor is below visible viewport\n isCursorBelowViewport() {\n const cursorElement = this.outputElement.querySelector('.tiny_cursive-cursor:last-of-type');\n if (!cursorElement) {\n return false;\n }\n\n const cursorRect = cursorElement.getBoundingClientRect();\n const outputRect = this.outputElement.getBoundingClientRect();\n\n return cursorRect.bottom > outputRect.bottom;\n }\n\n escapeHtml(unsafe) {\n return unsafe\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n // Used in various places to add a keydown, backspace, etc. to the output\n applyKey(key) {\n switch (key) {\n case 'Enter':\n return '\\n';\n case 'Backspace':\n case 'Delete':\n case 'ControlBackspace':\n return '';\n case ' ':\n return ' ';\n default:\n return !['Shift', 'Ctrl', 'Alt', 'ArrowDown', 'ArrowUp', 'Control', 'ArrowRight',\n 'ArrowLeft', 'Meta', 'CapsLock', 'Tab', 'Escape', 'Delete', 'PageUp', 'PageDown',\n 'Insert', 'Home', 'End', 'NumLock', 'AudioVolumeUp', 'AudioVolumeDown',\n 'MediaPlayPause', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10',\n 'F11', 'F12', 'PrintScreen', 'UnIdentified'].includes(key) ? key : '';\n }\n }\n}\n"],"names":["constructor","elementId","filePath","speed","loop","controllerId","replayInProgress","parseFloat","highlightedChars","deletedChars","cursorPosition","currentEventIndex","totalEvents","currentTime","totalDuration","usercomments","pasteTimestamps","isPasteEvent","isControlKeyPressed","isShiftKeyPressed","isMetaKeyPressed","text","pastedEvents","currentPasteIndex","pastedChars","aiEvents","currentAiIndex","aiChars","undoTimestamps","undoChars","element","document","getElementById","Error","outputElement","loadJSON","then","data","status","processData","this","logData","length","identifyPasteEvents","identifyUndoEvents","constructController","startReplay","handleNoSubmission","catch","error","window","console","message","localStorage","getItem","Str","get_string","str","setItem","log","JSON","parse","comments","Array","isArray","payload","i","event","pastedContent","trim","push","aiContent","unixTimestamp","startTime","map","normalizedTime","html","Promise","all","templates","render","newElement","stopReplay","clearTimeout","replayTimeout","playButton","playSvg","createElement","src","M","util","image_url","querySelector","innerHTML","outerHTML","currentPosition","replayIntervalId","clearInterval","container","controlContainer","buildControllerUI","remove","topRow","classList","add","createPlayButton","appendChild","scrubberContainer","createScrubberContainer","timeDisplay","createTimeDisplay","bottomRow","speedContainer","createSpeedControls","pasteEventsToggle","createPasteEventsToggle","pasteEventsPanel","addEventListener","find","removeClass","addClass","scrubberElement","type","max","min","value","skipToTime","parseInt","textContent","speedLabel","speedGroup","forEach","speedBtn","dataset","querySelectorAll","btn","pasteEventsIcon","pasteIcon","pasteEventsText","pasteEventCount","className","style","marginLeft","chevronIcon","chevron","transition","createPasteEventsPanel","isHidden","display","transform","existingPanel","populatePasteEventsPanel","controlPressed","metaPressed","shiftPressed","pasteCount","toLowerCase","key","timestamp","index","time","formattedTime","formatTime","pastedText","undoCount","panel","noEventsMessage","carouselContainer","navigationRow","counterDisplay","navButtons","prevButton","nextButton","disabled","contentContainer","createPasteEventDisplay","currentIndex","updateDisplay","opacity","pasteEvent","eventRow","headerRow","textContainer","timestampContainer","pastedTextContainer","playIcon","jumpToTimestamp","percentage","setScrubberVal","String","displayTime","Math","methodname","args","filepath","done","response","fail","ms","seconds","floor","remainingSeconds","toString","padStart","reset","pauseSvg","replayLog","cursor","updatedHighlights","updatedDeleted","undefined","rePosition","processKeydownEvent","processAiInsertEvent","filter","h","expiresAt","d","updateDisplayText","percentComplete","baseIncrement","incrementTime","setTimeout","getLineAndColumn","pos","before","substring","lineIndex","split","col","lastIndexOf","highlights","deletions","targetPosition","handleAiReplacement","currentCursor","insertText","aiWords","isMultiWord","isNewLineInsertion","startsWith","endsWith","wordStart","wordEnd","findWordToReplace","wordToReplace","markCharsAsDeleted","replacedLength","positionDiff","newCursor","calculateNewCursorPosition","updateCharacterIndices","lineStart","lineEnd","findLineRange","lineText","words","extractWordsFromLine","findMultiWordMatch","findSingleWordMatch","start","end","bestMatch","score","wordCount","similarityScore","matchResult","evaluateMultiWordSequence","totalScore","closest","findClosestWord","startIndex","seqWords","j","calculateSequenceSimilarity","calculatePositionScore","compareLength","k","ai","seq","calculateSimilarity","positionScore","seqStart","seqEndPos","aiWord","aiWordLower","bestSimilarityMatch","findBestSimilarityMatch","word","bestPositionMatch","findBestPositionMatch","findWordBoundaryAtPosition","similarity","wordLower","calculateWordScore","distance","abs","chars","updatePastedCharIndices","markCharsAsAiInserted","updateAiCharIndices","p","justAddedIndices","Set","has","str1","str2","len1","len2","matrix","fill","cost","maxLen","minDistance","charToInsert","applyKey","isCopyOperation","isUndoOperation","handleUndoOperation","selection","detectSelection","isPasteOperation","handlePasteOperation","updateModifierStates","isSelectionDeletion","handleSelectionDeletion","processKeyOperation","nextEventIndex","nextEvent","newPosition","textBeforeUndo","handlePasteInsert","resetModifierStates","isCtrlBackspace","handleCtrlBackspace","isCtrlDelete","handleCtrlDelete","isCtrlArrowMove","handleCtrlArrowMove","isRegularBackspace","handleBackspace","isRegularDelete","handleDelete","isArrowUp","handleArrowUp","isArrowDown","handleArrowDown","isRegularArrowMove","handleArrowMove","handleCharacterInsert","eventIndex","currentEvent","currentPos","processDetection","nextPos","shiftPastedCharsIndices","numDeleted","includes","findPreviousWordBoundary","findNextWordBoundary","wordToDelete","lines","prevLine","slice","join","nextLine","lastNonSpace","skipToEnd","textOutput","wasPlaying","targetTime","pasteIndex","aiIndex","highlightMap","deletionMap","pastedMap","aiMap","outOfRangeDeletions","textLines","line","char","isPasted","isAi","isHighlighted","escapeHtml","sort","a","b","cursorHTML","cursorPos","deletedWordHTML","wasScrolledToBottom","scrollHeight","clientHeight","scrollTop","isCursorBelowViewport","cursorElement","cursorRect","getBoundingClientRect","outputRect","bottom","unsafe","replace"],"mappings":"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"} \ No newline at end of file diff --git a/amd/build/replay_button.min.js b/amd/build/replay_button.min.js new file mode 100644 index 00000000..f93ce5cd --- /dev/null +++ b/amd/build/replay_button.min.js @@ -0,0 +1,11 @@ +/** + * Module that creates a replay button. + * The button displays replay functionality for a specific user. + * + * @module tiny_cursive/replay_button + * @copyright 2024 CTI + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +define("tiny_cursive/replay_button",["core/str"],(function(Str){return function(userid){let questionid=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const anchor=document.createElement("a");anchor.href="#",anchor.id="analytics"+userid+questionid,anchor.classList.add("d-inline-flex","justify-content-center","text-decoration-none");const button=document.createElement("div");button.className="tiny_cursive-replay-button";const left=document.createElement("div");left.className="tiny_cursive-replay-left";const icon=document.createElement("img");icon.src=M.util.image_url("playicon","tiny_cursive"),icon.alt="Replay Icon",icon.className="tiny_cursive-replay-bar-icon";const label=document.createElement("span");return label.className="tiny_cursive-replay-label",label.textContent="Replay",Str.get_string("replay","tiny_cursive").then((replayString=>(label.textContent=replayString,replayString))).catch((error=>{window.console.error("Error fetching string:",error)})),left.appendChild(icon),left.appendChild(label),button.appendChild(left),anchor.appendChild(button),anchor}})); + +//# sourceMappingURL=replay_button.min.js.map \ No newline at end of file diff --git a/amd/build/replay_button.min.js.map b/amd/build/replay_button.min.js.map new file mode 100644 index 00000000..b939fdc0 --- /dev/null +++ b/amd/build/replay_button.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"replay_button.min.js","sources":["../src/replay_button.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module that creates a replay button.\n * The button displays replay functionality for a specific user.\n *\n * @module tiny_cursive/replay_button\n * @copyright 2024 CTI \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine([\"core/str\"], function(Str) {\n const replayButton = (userid, questionid = \"\") => {\n const anchor = document.createElement(\"a\");\n anchor.href = \"#\";\n anchor.id = \"analytics\" + userid + questionid;\n anchor.classList.add(\n \"d-inline-flex\",\n \"justify-content-center\",\n 'text-decoration-none'\n );\n\n const button = document.createElement('div');\n button.className = 'tiny_cursive-replay-button';\n\n // Left side (icon + label)\n const left = document.createElement('div');\n left.className = 'tiny_cursive-replay-left';\n\n const icon = document.createElement('img');\n icon.src = M.util.image_url('playicon', 'tiny_cursive');\n icon.alt = 'Replay Icon';\n icon.className = 'tiny_cursive-replay-bar-icon';\n\n const label = document.createElement('span');\n label.className = 'tiny_cursive-replay-label';\n label.textContent = 'Replay';\n\n Str.get_string(\"replay\", \"tiny_cursive\")\n .then((replayString) => {\n label.textContent = replayString;\n return replayString;\n })\n .catch((error) => {\n window.console.error(\"Error fetching string:\", error);\n });\n\n left.appendChild(icon);\n left.appendChild(label);\n button.appendChild(left);\n\n anchor.appendChild(button);\n return anchor;\n };\n\n return replayButton;\n});"],"names":["define","Str","userid","questionid","anchor","document","createElement","href","id","classList","add","button","className","left","icon","src","M","util","image_url","alt","label","textContent","get_string","then","replayString","catch","error","window","console","appendChild"],"mappings":";;;;;;;;AAwBAA,oCAAO,CAAC,aAAa,SAASC,YACL,SAACC,YAAQC,kEAAa,SACjCC,OAASC,SAASC,cAAc,KACtCF,OAAOG,KAAO,IACdH,OAAOI,GAAK,YAAcN,OAASC,WACnCC,OAAOK,UAAUC,IACf,gBACA,yBACA,8BAGIC,OAASN,SAASC,cAAc,OACtCK,OAAOC,UAAY,mCAGbC,KAAOR,SAASC,cAAc,OACpCO,KAAKD,UAAY,iCAEXE,KAAOT,SAASC,cAAc,OACpCQ,KAAKC,IAAMC,EAAEC,KAAKC,UAAU,WAAY,gBACxCJ,KAAKK,IAAM,cACXL,KAAKF,UAAY,qCAEXQ,MAAQf,SAASC,cAAc,eACrCc,MAAMR,UAAY,4BAClBQ,MAAMC,YAAc,SAEpBpB,IAAIqB,WAAW,SAAU,gBACpBC,MAAMC,eACHJ,MAAMC,YAAcG,aACbA,gBAEVC,OAAOC,QACJC,OAAOC,QAAQF,MAAM,yBAA0BA,UAGvDb,KAAKgB,YAAYf,MACjBD,KAAKgB,YAAYT,OACjBT,OAAOkB,YAAYhB,MAEnBT,OAAOyB,YAAYlB,QACZP"} \ No newline at end of file diff --git a/amd/build/scatter_chart.min.js b/amd/build/scatter_chart.min.js new file mode 100644 index 00000000..4dcd1cc7 --- /dev/null +++ b/amd/build/scatter_chart.min.js @@ -0,0 +1,11 @@ +define("tiny_cursive/scatter_chart",["exports","core/chartjs","core/str"],(function(_exports,_chartjs,_str){var obj; +/** + * A module that creates a scatter chart to visualize student effort data using Chart.js. + * The chart displays effort scores against time spent, with tooltips showing additional metrics. + * + * @module tiny_cursive/scatter_chart + * @copyright 2025 Cursive Technology, Inc. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_chartjs=(obj=_chartjs)&&obj.__esModule?obj:{default:obj};_exports.init=async(data,apiKey,caption)=>{const ctx=document.getElementById("effortScatterChart").getContext("2d");data&&(data=JSON.parse(document.getElementById("scatter-chart-data").dataset.data));let display=!0,isEmpty="";var dataset=[];const[applyFilter,noSubmission,noPayload,freemium]=await(0,_str.get_strings)([{key:"apply_filter",component:"tiny_cursive"},{key:"no_submission",component:"tiny_cursive"},{key:"nopaylod",component:"tiny_cursive"},{key:"freemium",component:"tiny_cursive"},{key:"chart_result",component:"tiny_cursive"}]);Array.isArray(data)&&!data.state&&apiKey&&(dataset=data,isEmpty=data.some((ds=>Array.isArray(ds.data)&&ds.data.some((point=>point&&"object"==typeof point&&Object.keys(point).length>0))))),apiKey&&0!==data.length&&isEmpty&&!1!==data||(display=!1);const fallbackMessagePlugin={id:"fallbackMessagePlugin",afterDraw(chart){apiKey?"apply_filter"!=data.state?"no_submission"!==data.state?isEmpty||data.state||drawMessage("⚠ "+noPayload,chart):drawMessage("⚠ "+noSubmission,chart):drawMessage("⚠ "+applyFilter,chart):drawMessage("⚠ "+freemium,chart)}};function formatTime(value){const minutes=Math.floor(value/60),seconds=value%60;return`${String(minutes).padStart(2,"0")}:${String(seconds).padStart(2,"0")}`}function drawMessage(text,chart){const{ctx:ctx,chartArea:{left:left,right:right,top:top,bottom:bottom}}=chart;ctx.save(),ctx.textAlign="center",ctx.textBaseline="middle",ctx.font='bold 16px "Segoe UI", Arial',ctx.fillStyle="#666";const centerX=(left+right)/2,centerY=(top+bottom)/2;ctx.fillText(text,centerX,centerY),ctx.restore()}new _chartjs.default(ctx,{type:"scatter",data:{datasets:dataset},options:{plugins:{title:{display:display,text:caption,font:{size:16,weight:"bold"},color:"#333",padding:{top:10,bottom:20},align:"center"},legend:{display:!0,position:"bottom",labels:{usePointStyle:!0,pointStyle:"circle",padding:20}},tooltip:{backgroundColor:"rgba(252, 252, 252, 0.8)",titleColor:"#000",bodyColor:"#000",borderColor:"#cccccc",borderWidth:1,displayColors:!1,callbacks:{title:function(context){return context[0].raw.label},label:function(context){const d=context.raw;return[`Time: ${formatTime(d.x)}`,`Effort: ${Math.round(100*d.effort*100)/100}%`,`Words: ${d.words}`,`WPM: ${d.wpm}`]}}}},scales:{x:{title:{display:!0,text:"Time Spent (mm:ss)"},min:0,ticks:{callback:function(value){return formatTime(value)}}},y:{title:{display:!0,text:"Effort Score"},min:0,ticks:{stepSize:.5}}}},plugins:[fallbackMessagePlugin]})}})); + +//# sourceMappingURL=scatter_chart.min.js.map \ No newline at end of file diff --git a/amd/build/scatter_chart.min.js.map b/amd/build/scatter_chart.min.js.map new file mode 100644 index 00000000..8b434228 --- /dev/null +++ b/amd/build/scatter_chart.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scatter_chart.min.js","sources":["../src/scatter_chart.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A module that creates a scatter chart to visualize student effort data using Chart.js.\n * The chart displays effort scores against time spent, with tooltips showing additional metrics.\n *\n * @module tiny_cursive/scatter_chart\n * @copyright 2025 Cursive Technology, Inc. \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Chart from 'core/chartjs';\nimport {get_strings as getStrings} from 'core/str';\nexport const init = async(data, apiKey, caption) => {\n\n const ctx = document.getElementById('effortScatterChart').getContext('2d');\n if (data) {\n data = JSON.parse(document.getElementById('scatter-chart-data').dataset.data);\n }\n\n let display = true;\n let isEmpty = \"\";\n var dataset = [];\n\n const [\n applyFilter,\n noSubmission,\n noPayload,\n freemium,\n ] = await getStrings([\n {key: 'apply_filter', component: 'tiny_cursive'},\n {key: 'no_submission', component: 'tiny_cursive'},\n {key: 'nopaylod', component: 'tiny_cursive'},\n {key: 'freemium', component: 'tiny_cursive'},\n {key: 'chart_result', component: 'tiny_cursive'}\n ]);\n\n if (Array.isArray(data) && !data.state && apiKey) {\n dataset = data;\n isEmpty = data.some(ds =>\n Array.isArray(ds.data) &&\n ds.data.some(point =>\n point && typeof point === 'object' && Object.keys(point).length > 0\n )\n );\n }\n\n if (!apiKey || data.length === 0 || !isEmpty || data === false) {\n display = false;\n }\n\n const fallbackMessagePlugin = {\n id: 'fallbackMessagePlugin',\n afterDraw(chart) {\n // ⚠ Case 1: Freemium user\n if (!apiKey) {\n drawMessage('⚠ ' + freemium, chart);\n return;\n }\n // ⚠ Case 2: Apply filter (data is empty array)\n if (data.state == \"apply_filter\") {\n drawMessage('⚠ ' + applyFilter, chart);\n return;\n }\n if (data.state === \"no_submission\") {\n drawMessage('⚠ ' + noSubmission, chart);\n return;\n }\n // ⚠ Case 3: No payload data (all `data` arrays are empty or full of empty objects)\n if (!isEmpty && !data.state) {\n drawMessage('⚠ ' + noPayload, chart);\n }\n\n }\n };\n\n new Chart(ctx, {\n type: 'scatter',\n data: {\n datasets: dataset,\n },\n options: {\n plugins: {\n title: {\n display: display,\n text: caption,\n font: {\n size: 16,\n weight: 'bold',\n },\n color: '#333',\n padding: {\n top: 10,\n bottom: 20\n },\n align: 'center'\n },\n legend: {\n display: true,\n position: 'bottom',\n labels: {\n usePointStyle: true,\n pointStyle: 'circle',\n padding: 20\n }\n },\n tooltip: {\n backgroundColor: 'rgba(252, 252, 252, 0.8)',\n titleColor: '#000',\n bodyColor: '#000',\n borderColor: '#cccccc',\n borderWidth: 1,\n displayColors: false,\n callbacks: {\n title: function(context) {\n const d = context[0].raw;\n return d.label; // This appears as bold title.\n },\n label: function(context) {\n const d = context.raw;\n return [\n `Time: ${formatTime(d.x)}`,\n `Effort: ${Math.round(d.effort * 100 * 100) / 100}%`,\n `Words: ${d.words}`,\n `WPM: ${d.wpm}`\n ];\n }\n }\n }\n },\n scales: {\n x: {\n title: {\n display: true,\n text: 'Time Spent (mm:ss)'\n },\n min: 0,\n ticks: {\n callback: function(value) {\n return formatTime(value);\n }\n }\n },\n y: {\n title: {\n display: true,\n text: 'Effort Score'\n },\n min: 0,\n ticks: {\n stepSize: 0.5\n }\n }\n }\n },\n plugins: [fallbackMessagePlugin]\n });\n\n /**\n * Formats a time value in seconds to a mm:ss string format\n * @param {number} value - The time value in seconds\n * @returns {string} The formatted time string in mm:ss format\n */\n function formatTime(value) {\n const minutes = Math.floor(value / 60);\n const seconds = value % 60;\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n }\n\n /**\n * Draws a message on the chart canvas\n * @param {string} text - The message to be displayed\n * @param {Chart} chart - The Chart.js chart object\n */\n function drawMessage(text, chart) {\n\n const {ctx, chartArea: {left, right, top, bottom}} = chart;\n ctx.save();\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.font = 'bold 16px \"Segoe UI\", Arial';\n ctx.fillStyle = '#666';\n\n const centerX = (left + right) / 2;\n const centerY = (top + bottom) / 2;\n\n ctx.fillText(text, centerX, centerY);\n ctx.restore();\n }\n};"],"names":["async","data","apiKey","caption","ctx","document","getElementById","getContext","JSON","parse","dataset","display","isEmpty","applyFilter","noSubmission","noPayload","freemium","key","component","Array","isArray","state","some","ds","point","Object","keys","length","fallbackMessagePlugin","id","afterDraw","chart","drawMessage","formatTime","value","minutes","Math","floor","seconds","String","padStart","text","chartArea","left","right","top","bottom","save","textAlign","textBaseline","font","fillStyle","centerX","centerY","fillText","restore","Chart","type","datasets","options","plugins","title","size","weight","color","padding","align","legend","position","labels","usePointStyle","pointStyle","tooltip","backgroundColor","titleColor","bodyColor","borderColor","borderWidth","displayColors","callbacks","context","raw","label","d","x","round","effort","words","wpm","scales","min","ticks","callback","y","stepSize"],"mappings":";;;;;;;;0JA0BoBA,MAAMC,KAAMC,OAAQC,iBAE9BC,IAAMC,SAASC,eAAe,sBAAsBC,WAAW,MACjEN,OACAA,KAAOO,KAAKC,MAAMJ,SAASC,eAAe,sBAAsBI,QAAQT,WAGxEU,SAAU,EACVC,QAAU,OACVF,QAAU,SAGVG,YACAC,aACAC,UACAC,gBACM,oBAAW,CACjB,CAACC,IAAK,eAAgBC,UAAW,gBACjC,CAACD,IAAK,gBAAiBC,UAAW,gBAClC,CAACD,IAAK,WAAYC,UAAW,gBAC7B,CAACD,IAAK,WAAYC,UAAW,gBAC7B,CAACD,IAAK,eAAgBC,UAAW,kBAGjCC,MAAMC,QAAQnB,QAAUA,KAAKoB,OAASnB,SACtCQ,QAAUT,KACVW,QAAUX,KAAKqB,MAAKC,IAChBJ,MAAMC,QAAQG,GAAGtB,OACjBsB,GAAGtB,KAAKqB,MAAKE,OACTA,OAA0B,iBAAVA,OAAsBC,OAAOC,KAAKF,OAAOG,OAAS,OAKzEzB,QAA0B,IAAhBD,KAAK0B,QAAiBf,UAAoB,IAATX,OAC5CU,SAAU,SAGRiB,sBAAwB,CAC1BC,GAAI,wBACJC,UAAUC,OAED7B,OAKa,gBAAdD,KAAKoB,MAIU,kBAAfpB,KAAKoB,MAKJT,SAAYX,KAAKoB,OAClBW,YAAY,KAAOjB,UAAWgB,OAL9BC,YAAY,KAAOlB,aAAciB,OAJjCC,YAAY,KAAOnB,YAAakB,OALhCC,YAAY,KAAOhB,SAAUe,kBA2GhCE,WAAWC,aACVC,QAAUC,KAAKC,MAAMH,MAAQ,IAC7BI,QAAUJ,MAAQ,SAChB,GAAEK,OAAOJ,SAASK,SAAS,EAAG,QAAQD,OAAOD,SAASE,SAAS,EAAG,gBAQrER,YAAYS,KAAMV,aAEjB3B,IAACA,IAAKsC,WAAWC,KAACA,KAADC,MAAOA,MAAPC,IAAcA,IAAdC,OAAmBA,SAAWf,MACrD3B,IAAI2C,OACJ3C,IAAI4C,UAAY,SAChB5C,IAAI6C,aAAe,SACnB7C,IAAI8C,KAAO,8BACX9C,IAAI+C,UAAY,aAEVC,SAAWT,KAAOC,OAAS,EAC3BS,SAAWR,IAAMC,QAAU,EAEjC1C,IAAIkD,SAASb,KAAMW,QAASC,SAC5BjD,IAAImD,cA/GJC,iBAAMpD,IAAK,CACXqD,KAAM,UACNxD,KAAM,CACFyD,SAAUhD,SAEdiD,QAAS,CACLC,QAAS,CACLC,MAAO,CACHlD,QAASA,QACT8B,KAAMtC,QACN+C,KAAM,CACFY,KAAM,GACNC,OAAQ,QAEZC,MAAO,OACPC,QAAS,CACLpB,IAAK,GACLC,OAAQ,IAEZoB,MAAO,UAEXC,OAAQ,CACJxD,SAAS,EACTyD,SAAU,SACVC,OAAQ,CACJC,eAAe,EACfC,WAAY,SACZN,QAAS,KAGjBO,QAAS,CACLC,gBAAiB,2BACjBC,WAAY,OACZC,UAAW,OACXC,YAAa,UACbC,YAAa,EACbC,eAAe,EACfC,UAAW,CACPlB,MAAO,SAASmB,gBACFA,QAAQ,GAAGC,IACZC,OAEbA,MAAO,SAASF,eACNG,EAAIH,QAAQC,UACX,CACF,SAAQhD,WAAWkD,EAAEC,KACrB,WAAUhD,KAAKiD,MAAiB,IAAXF,EAAEG,OAAe,KAAO,OAC7C,UAASH,EAAEI,QACX,QAAOJ,EAAEK,WAM9BC,OAAQ,CACJL,EAAG,CACCvB,MAAO,CACHlD,SAAS,EACT8B,KAAM,sBAEViD,IAAK,EACLC,MAAO,CACHC,SAAU,SAAS1D,cACRD,WAAWC,UAI9B2D,EAAG,CACChC,MAAO,CACHlD,SAAS,EACT8B,KAAM,gBAEViD,IAAK,EACLC,MAAO,CACHG,SAAU,OAK1BlC,QAAS,CAAChC"} \ No newline at end of file diff --git a/amd/build/show_url_in_quiz_detail.min.js b/amd/build/show_url_in_quiz_detail.min.js index 7a5ff0cd..fac6781f 100644 --- a/amd/build/show_url_in_quiz_detail.min.js +++ b/amd/build/show_url_in_quiz_detail.min.js @@ -1,3 +1,3 @@ -define("tiny_cursive/show_url_in_quiz_detail",["jquery","core/ajax","core/str","core/templates","./replay","./analytic_button","./analytic_events"],(function($,AJAX,str,templates,Replay,analyticButton,AnalyticEvents){const replayInstances={};window.video_playback=function(mid,filepath,questionid){if(""!==filepath){const replay=new Replay("content"+mid,filepath,10,!1,"player_"+mid+questionid);replayInstances[mid]=replay}else templates.render("tiny_cursive/no_submission").then((html=>{$("#content"+mid).html(html)})).catch((e=>window.console.error(e)));return!1};var usersTable={init:function(scoreSetting,showcomment){str.get_strings([{key:"field_require",component:"tiny_cursive"}]).done((function(){usersTable.appendSubmissionDetail(scoreSetting,showcomment)}))},appendSubmissionDetail:function(scoreSetting,showcomment){let subUrl=window.location.href,attemptId=new URL(subUrl).searchParams.get("attempt"),cmid=M.cfg.contextInstanceId;var userid="";$("table.generaltable.generalbox.quizreviewsummary tbody tr").each((function(){var href=$(this).find('a[href*="/user/view.php"]').attr("href");if(href){var id=href.match(/id=(\d+)/);id&&(userid=id[1])}})),$("#page-mod-quiz-review .info").each((function(){var editQuestionLink=$(this).find('.editquestion a[href*="question/bank/editquestion/question.php"]'),questionid=0;editQuestionLink.length>0&&(editQuestionLink=editQuestionLink.attr("href"),questionid=editQuestionLink.match(/&id=(\d+)/)[1]);let args={id:attemptId,modulename:"quiz",cmid:cmid,questionid:questionid,userid:userid},com=AJAX.call([{methodname:"cursive_get_comment_link",args:args}]);return com[0].done((function(json){var data=JSON.parse(json);if(data.data.filename){var content=$('.que.essay .editquestion a[href*="question/bank/editquestion/question.php"][href*="&id='+data.data.questionid+'"]');if("comments"!=data.usercomment&&parseInt(showcomment)){content.parent().parent().parent().find(".qtext").append('
');var tt="";str.get_string("refer","tiny_cursive").then((str=>{tt+="

"+str+'

',data.usercomment.forEach((element=>{tt+='
'+element.usercomment+"
"})),content.parent().parent().parent().find(".qtext").append(tt+"
")})).catch((error=>window.console.error(error)))}var filepath="";data.data.filename&&(filepath=data.data.filename);let analyticButtonDiv=document.createElement("div");analyticButtonDiv.classList.add("text-center","mt-2"),analyticButtonDiv.append(analyticButton(userid,questionid)),content.parent().parent().parent().find(".qtext").append(analyticButtonDiv);let myEvents=new AnalyticEvents;var context={tabledata:data.data,formattime:myEvents.formatedTime(data.data),page:scoreSetting,userid:userid,quizid:questionid};let authIcon=myEvents.authorshipStatus(data.data.first_file,data.data.score,scoreSetting);myEvents.createModal(userid,context,questionid,authIcon),myEvents.analytics(userid,templates,context,questionid,replayInstances,authIcon),myEvents.checkDiff(userid,data.data.file_id,questionid,replayInstances),myEvents.replyWriting(userid,filepath,questionid,replayInstances),myEvents.quality(userid,templates,context,questionid,replayInstances,cmid)}})),com.usercomment}))}};return usersTable})); +define("tiny_cursive/show_url_in_quiz_detail",["jquery","core/ajax","core/str","core/templates","./replay","./analytic_button","./analytic_events","./replay_button"],(function($,AJAX,str,templates,Replay,analyticButton,AnalyticEvents,replayButton){const replayInstances={};window.video_playback=function(mid,filepath,questionid){if(""!==filepath){const replay=new Replay("content"+mid,filepath,10,!1,"player_"+mid+questionid);replayInstances[mid]=replay}else templates.render("tiny_cursive/no_submission").then((html=>{$("#content"+mid).html(html)})).catch((e=>window.console.error(e)));return!1};var usersTable={init:function(scoreSetting,showcomment,hasApiKey){str.get_strings([{key:"field_require",component:"tiny_cursive"}]).done((function(){usersTable.appendSubmissionDetail(scoreSetting,hasApiKey)}))},appendSubmissionDetail:function(scoreSetting,hasApiKey){let subUrl=window.location.href,attemptId=new URL(subUrl).searchParams.get("attempt"),cmid=M.cfg.contextInstanceId;var userid="";$("table.generaltable.generalbox.quizreviewsummary tbody tr").each((function(){var href=$(this).find('a[href*="/user/view.php"]').attr("href");if(href){var id=href.match(/id=(\d+)/);id&&(userid=id[1])}})),$("#page-mod-quiz-review .info").each((function(){var editQuestionLink=$(this).find('.editquestion a[href*="question/bank/editquestion/question.php"]'),questionid=0;editQuestionLink.length>0&&(editQuestionLink=editQuestionLink.attr("href"),questionid=editQuestionLink.match(/&id=(\d+)/)[1]);let args={id:attemptId,modulename:"quiz",cmid:cmid,questionid:questionid,userid:userid},com=AJAX.call([{methodname:"cursive_get_comment_link",args:args}]);return com[0].done((function(json){var data=JSON.parse(json);if(data.data.filename){var content=$('.que.essay .editquestion a[href*="question/bank/editquestion/question.php"][href*="&id='+data.data.questionid+'"]');0==content.length&&(content=$('.que.aitext .editquestion a[href*="question/bank/editquestion/question.php"][href*="&id='+data.data.questionid+'"]'));var filepath="";data.data.filename&&(filepath=data.data.filename);let analyticButtonDiv=document.createElement("div");analyticButtonDiv.classList.add("text-center","mt-2"),hasApiKey?analyticButtonDiv.append(analyticButton(data.data.effort_ratio,userid,questionid)):$(analyticButtonDiv).html(replayButton(userid+questionid)),content.parent().parent().parent().find(".qtext").append(analyticButtonDiv);let myEvents=new AnalyticEvents;var context={tabledata:data.data,formattime:myEvents.formatedTime(data.data),page:scoreSetting,userid:userid,quizid:questionid,apikey:hasApiKey};let authIcon=myEvents.authorshipStatus(data.data.first_file,data.data.score,scoreSetting);myEvents.createModal(userid,context,questionid,replayInstances,authIcon),myEvents.analytics(userid,templates,context,questionid,replayInstances,authIcon),myEvents.checkDiff(userid,data.data.file_id,questionid,replayInstances),myEvents.replyWriting(userid,filepath,questionid,replayInstances)}})),com.usercomment}))}};return usersTable})); //# sourceMappingURL=show_url_in_quiz_detail.min.js.map \ No newline at end of file diff --git a/amd/build/show_url_in_quiz_detail.min.js.map b/amd/build/show_url_in_quiz_detail.min.js.map index 500bc6b9..03e5b185 100644 --- a/amd/build/show_url_in_quiz_detail.min.js.map +++ b/amd/build/show_url_in_quiz_detail.min.js.map @@ -1 +1 @@ -{"version":3,"file":"show_url_in_quiz_detail.min.js","sources":["../src/show_url_in_quiz_detail.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/show_url_in_quiz_detail\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\"jquery\", \"core/ajax\", \"core/str\", \"core/templates\", \"./replay\", \"./analytic_button\", \"./analytic_events\"], function(\n $,\n AJAX,\n str,\n templates,\n Replay,\n analyticButton,\n AnalyticEvents\n) {\n const replayInstances = {};\n // eslint-disable-next-line\n window.video_playback = function (mid, filepath, questionid) {\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid + questionid\n );\n replayInstances[mid] = replay;\n } else {\n // eslint-disable-next-line\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n }).catch(e => window.console.error(e));\n }\n return false;\n };\n\n var usersTable = {\n init: function(scoreSetting, showcomment) {\n str\n .get_strings([\n {key: \"field_require\", component: \"tiny_cursive\"},\n ])\n .done(function() {\n usersTable.appendSubmissionDetail(scoreSetting, showcomment);\n });\n },\n appendSubmissionDetail: function(scoreSetting, showcomment) {\n let subUrl = window.location.href;\n let parm = new URL(subUrl);\n let attemptId = parm.searchParams.get('attempt');\n let cmid = M.cfg.contextInstanceId;\n var userid = '';\n var tableRow = $('table.generaltable.generalbox.quizreviewsummary tbody tr');\n tableRow.each(function() {\n var href = $(this).find('a[href*=\"/user/view.php\"]').attr('href');\n if (href) {\n var id = href.match(/id=(\\d+)/);\n if (id) {\n userid = id[1];\n }\n }\n });\n\n $('#page-mod-quiz-review .info').each(function() {\n\n var editQuestionLink = $(this).find('.editquestion a[href*=\"question/bank/editquestion/question.php\"]');\n var questionid = 0;\n if (editQuestionLink.length > 0) {\n editQuestionLink = editQuestionLink.attr('href');\n questionid = editQuestionLink.match(/&id=(\\d+)/)[1];\n }\n\n let args = {id: attemptId, modulename: \"quiz\", \"cmid\": cmid, \"questionid\": questionid, \"userid\": userid};\n let methodname = 'cursive_get_comment_link';\n let com = AJAX.call([{methodname, args}]);\n com[0].done(function(json) {\n var data = JSON.parse(json);\n\n if (data.data.filename) {\n\n var content = $('.que.essay .editquestion a[href*=\"question/bank/editquestion/question.php\"][href*=\"&id='\n + data.data.questionid + '\"]');\n if (data.usercomment != 'comments' && parseInt(showcomment)) {\n content.parent().parent().parent().find('.qtext').append('
');\n var tt = \"\";\n // eslint-disable-next-line\n str.get_string('refer', 'tiny_cursive').then(str => {\n tt += '

' + str + '

';\n\n data.usercomment.forEach(element => {\n tt += '
'\n + element.usercomment + '
';\n });\n content.parent().parent().parent().find('.qtext').append(tt + '
');\n }).catch(error => window.console.error(error));\n }\n var filepath = '';\n if (data.data.filename) {\n filepath = data.data.filename;\n }\n let analyticButtonDiv = document.createElement('div');\n analyticButtonDiv.classList.add('text-center', 'mt-2');\n analyticButtonDiv.append(analyticButton(userid, questionid));\n content.parent().parent().parent().find('.qtext').append(analyticButtonDiv);\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.data,\n formattime: myEvents.formatedTime(data.data),\n page: scoreSetting,\n userid: userid,\n quizid: questionid,\n };\n\n let authIcon = myEvents.authorshipStatus(data.data.first_file, data.data.score, scoreSetting);\n myEvents.createModal(userid, context, questionid, authIcon);\n myEvents.analytics(userid, templates, context, questionid, replayInstances, authIcon);\n myEvents.checkDiff(userid, data.data.file_id, questionid, replayInstances);\n myEvents.replyWriting(userid, filepath, questionid, replayInstances);\n myEvents.quality(userid, templates, context, questionid, replayInstances, cmid);\n\n }\n });\n return com.usercomment;\n });\n },\n };\n return usersTable;\n});\n"],"names":["define","$","AJAX","str","templates","Replay","analyticButton","AnalyticEvents","replayInstances","window","video_playback","mid","filepath","questionid","replay","render","then","html","catch","e","console","error","usersTable","init","scoreSetting","showcomment","get_strings","key","component","done","appendSubmissionDetail","subUrl","location","href","attemptId","URL","searchParams","get","cmid","M","cfg","contextInstanceId","userid","each","this","find","attr","id","match","editQuestionLink","length","args","modulename","com","call","methodname","json","data","JSON","parse","filename","content","usercomment","parseInt","parent","append","tt","get_string","forEach","element","analyticButtonDiv","document","createElement","classList","add","myEvents","context","tabledata","formattime","formatedTime","page","quizid","authIcon","authorshipStatus","first_file","score","createModal","analytics","checkDiff","file_id","replyWriting","quality"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"show_url_in_quiz_detail.min.js","sources":["../src/show_url_in_quiz_detail.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/show_url_in_quiz_detail\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\"jquery\", \"core/ajax\", \"core/str\", \"core/templates\", \"./replay\", \"./analytic_button\", \"./analytic_events\",\n \"./replay_button\"], function(\n $,\n AJAX,\n str,\n templates,\n Replay,\n analyticButton,\n AnalyticEvents,\n replayButton\n) {\n const replayInstances = {};\n // eslint-disable-next-line\n window.video_playback = function (mid, filepath, questionid) {\n if (filepath !== '') {\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid + questionid\n );\n replayInstances[mid] = replay;\n } else {\n // eslint-disable-next-line\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n }).catch(e => window.console.error(e));\n }\n return false;\n };\n\n var usersTable = {\n\n init: function(scoreSetting, showcomment, hasApiKey) {\n str\n .get_strings([\n {key: \"field_require\", component: \"tiny_cursive\"},\n ])\n .done(function() {\n usersTable.appendSubmissionDetail(scoreSetting, hasApiKey);\n });\n },\n appendSubmissionDetail: function(scoreSetting, hasApiKey) {\n let subUrl = window.location.href;\n let parm = new URL(subUrl);\n let attemptId = parm.searchParams.get('attempt');\n let cmid = M.cfg.contextInstanceId;\n var userid = '';\n var tableRow = $('table.generaltable.generalbox.quizreviewsummary tbody tr');\n tableRow.each(function() {\n var href = $(this).find('a[href*=\"/user/view.php\"]').attr('href');\n if (href) {\n var id = href.match(/id=(\\d+)/);\n if (id) {\n userid = id[1];\n }\n }\n });\n\n $('#page-mod-quiz-review .info').each(function() {\n\n var editQuestionLink = $(this).find('.editquestion a[href*=\"question/bank/editquestion/question.php\"]');\n var questionid = 0;\n if (editQuestionLink.length > 0) {\n editQuestionLink = editQuestionLink.attr('href');\n questionid = editQuestionLink.match(/&id=(\\d+)/)[1];\n }\n\n let args = {id: attemptId, modulename: \"quiz\", \"cmid\": cmid, \"questionid\": questionid, \"userid\": userid};\n let methodname = 'cursive_get_comment_link';\n let com = AJAX.call([{methodname, args}]);\n com[0].done(function(json) {\n var data = JSON.parse(json);\n\n if (data.data.filename) {\n\n var content = $('.que.essay .editquestion a[href*=\"question/bank/editquestion/question.php\"][href*=\"&id='\n + data.data.questionid + '\"]');\n if (content.length == 0) {\n content = $('.que.aitext .editquestion a[href*=\"question/bank/editquestion/question.php\"][href*=\"&id='\n + data.data.questionid + '\"]');\n }\n var filepath = '';\n if (data.data.filename) {\n filepath = data.data.filename;\n }\n let analyticButtonDiv = document.createElement('div');\n analyticButtonDiv.classList.add('text-center', 'mt-2');\n\n if (!hasApiKey) {\n $(analyticButtonDiv).html(replayButton(userid + questionid));\n } else {\n analyticButtonDiv.append(analyticButton(data.data.effort_ratio, userid, questionid));\n }\n\n content.parent().parent().parent().find('.qtext').append(analyticButtonDiv);\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.data,\n formattime: myEvents.formatedTime(data.data),\n page: scoreSetting,\n userid: userid,\n quizid: questionid,\n apikey: hasApiKey\n };\n\n let authIcon = myEvents.authorshipStatus(data.data.first_file, data.data.score, scoreSetting);\n myEvents.createModal(userid, context, questionid, replayInstances, authIcon);\n myEvents.analytics(userid, templates, context, questionid, replayInstances, authIcon);\n myEvents.checkDiff(userid, data.data.file_id, questionid, replayInstances);\n myEvents.replyWriting(userid, filepath, questionid, replayInstances);\n\n }\n });\n return com.usercomment;\n });\n },\n };\n return usersTable;\n});\n"],"names":["define","$","AJAX","str","templates","Replay","analyticButton","AnalyticEvents","replayButton","replayInstances","window","video_playback","mid","filepath","questionid","replay","render","then","html","catch","e","console","error","usersTable","init","scoreSetting","showcomment","hasApiKey","get_strings","key","component","done","appendSubmissionDetail","subUrl","location","href","attemptId","URL","searchParams","get","cmid","M","cfg","contextInstanceId","userid","each","this","find","attr","id","match","editQuestionLink","length","args","modulename","com","call","methodname","json","data","JSON","parse","filename","content","analyticButtonDiv","document","createElement","classList","add","append","effort_ratio","parent","myEvents","context","tabledata","formattime","formatedTime","page","quizid","apikey","authIcon","authorshipStatus","first_file","score","createModal","analytics","checkDiff","file_id","replyWriting","usercomment"],"mappings":"AAsBAA,8CAAO,CAAC,SAAU,YAAa,WAAY,iBAAkB,WAAY,oBAAqB,oBAC1F,oBAAoB,SACpBC,EACAC,KACAC,IACAC,UACAC,OACAC,eACAC,eACAC,oBAEMC,gBAAkB,GAExBC,OAAOC,eAAiB,SAAUC,IAAKC,SAAUC,eAC5B,KAAbD,SAAiB,OACXE,OAAS,IAAIV,OACf,UAAYO,IACZC,SACA,IACA,EACA,UAAYD,IAAME,YAEtBL,gBAAgBG,KAAOG,YAGvBX,UAAUY,OAAO,8BAA8BC,MAAKC,OAChDjB,EAAE,WAAaW,KAAKM,KAAKA,SAC1BC,OAAMC,GAAKV,OAAOW,QAAQC,MAAMF,YAEhC,OAGPG,WAAa,CAEbC,KAAM,SAASC,aAAcC,YAAaC,WACtCxB,IACKyB,YAAY,CACT,CAACC,IAAK,gBAAiBC,UAAW,kBAErCC,MAAK,WACFR,WAAWS,uBAAuBP,aAAcE,eAG5DK,uBAAwB,SAASP,aAAcE,eACvCM,OAASvB,OAAOwB,SAASC,KAEzBC,UADO,IAAIC,IAAIJ,QACEK,aAAaC,IAAI,WAClCC,KAAOC,EAAEC,IAAIC,sBACbC,OAAS,GACE3C,EAAE,4DACR4C,MAAK,eACNV,KAAOlC,EAAE6C,MAAMC,KAAK,6BAA6BC,KAAK,WACtDb,KAAM,KACFc,GAAKd,KAAKe,MAAM,YAChBD,KACAL,OAASK,GAAG,QAKxBhD,EAAE,+BAA+B4C,MAAK,eAE9BM,iBAAmBlD,EAAE6C,MAAMC,KAAK,oEAChCjC,WAAa,EACbqC,iBAAiBC,OAAS,IAC1BD,iBAAmBA,iBAAiBH,KAAK,QACzClC,WAAaqC,iBAAiBD,MAAM,aAAa,QAGjDG,KAAO,CAACJ,GAAIb,UAAWkB,WAAY,YAAgBd,gBAAoB1B,kBAAsB8B,QAE7FW,IAAMrD,KAAKsD,KAAK,CAAC,CAACC,WADL,2BACiBJ,KAAAA,eAClCE,IAAI,GAAGxB,MAAK,SAAS2B,UACbC,KAAOC,KAAKC,MAAMH,SAElBC,KAAKA,KAAKG,SAAU,KAEhBC,QAAU9D,EAAE,0FACV0D,KAAKA,KAAK7C,WAAa,MACP,GAAlBiD,QAAQX,SACRW,QAAU9D,EAAE,2FACV0D,KAAKA,KAAK7C,WAAa,WAEzBD,SAAW,GACX8C,KAAKA,KAAKG,WACVjD,SAAW8C,KAAKA,KAAKG,cAErBE,kBAAoBC,SAASC,cAAc,OAC/CF,kBAAkBG,UAAUC,IAAI,cAAe,QAE1CzC,UAGDqC,kBAAkBK,OAAO/D,eAAeqD,KAAKA,KAAKW,aAAc1B,OAAQ9B,aAFxEb,EAAE+D,mBAAmB9C,KAAKV,aAAaoC,OAAS9B,aAKpDiD,QAAQQ,SAASA,SAASA,SAASxB,KAAK,UAAUsB,OAAOL,uBAErDQ,SAAW,IAAIjE,mBACfkE,QAAU,CACVC,UAAWf,KAAKA,KAChBgB,WAAYH,SAASI,aAAajB,KAAKA,MACvCkB,KAAMpD,aACNmB,OAAQA,OACRkC,OAAQhE,WACRiE,OAAQpD,eAGRqD,SAAWR,SAASS,iBAAiBtB,KAAKA,KAAKuB,WAAYvB,KAAKA,KAAKwB,MAAO1D,cAChF+C,SAASY,YAAYxC,OAAQ6B,QAAS3D,WAAYL,gBAAiBuE,UACnER,SAASa,UAAUzC,OAAQxC,UAAWqE,QAAS3D,WAAYL,gBAAiBuE,UAC5ER,SAASc,UAAU1C,OAAQe,KAAKA,KAAK4B,QAASzE,WAAYL,iBAC1D+D,SAASgB,aAAa5C,OAAQ/B,SAAUC,WAAYL,qBAIrD8C,IAAIkC,wBAIhBlE"} \ No newline at end of file diff --git a/amd/build/show_url_in_submission_grade.min.js b/amd/build/show_url_in_submission_grade.min.js index e8c742b0..ee174466 100644 --- a/amd/build/show_url_in_submission_grade.min.js +++ b/amd/build/show_url_in_submission_grade.min.js @@ -1,3 +1,3 @@ -define("tiny_cursive/show_url_in_submission_grade",["jquery","core/ajax","core/str","core/templates","./replay","./analytic_button","./analytic_events"],(function($,AJAX,str,templates,Replay,analyticButton,AnalyticEvents){const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new Replay("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else templates.render("tiny_cursive/no_submission").then((html=>{$("#content"+mid).html(html)})).catch((e=>window.console.error(e)));return!1};var usersTable={init:function(scoreSetting,showcomment){$(document).ready((function(){$("#page-mod-assign-grader").addClass("tiny_cursive_mod_assign_grader")})),str.get_strings([{key:"field_require",component:"tiny_cursive"}]).done((function(){usersTable.appendSubmissionDetail(scoreSetting,showcomment)}))},appendSubmissionDetail:function(scoreSetting,showcomment){$(document).ready((function($){var divElement=$('.path-mod-assign [data-region="grade-panel"]')[0],previousContextId=window.location.href;new MutationObserver((function(mutations){mutations.forEach((function(){var currentContextId=window.location.href;currentContextId!==previousContextId&&(window.location.reload(),previousContextId=currentContextId)}))})).observe(divElement,{childList:!0,subtree:!0});let subUrl=window.location.href,parm=new URL(subUrl),userid=parm.searchParams.get("userid");var cmid=parm.searchParams.get("id");let args={id:userid,modulename:"assign",cmid:cmid},com=AJAX.call([{methodname:"cursive_get_assign_grade_comment",args:args}]);return com[0].done((function(json){var data=JSON.parse(json),filepath="";data.data.filename&&(filepath=data.data.filename);let analyticButtonDiv=document.createElement("div");analyticButtonDiv.append(analyticButton(userid)),analyticButtonDiv.classList.add("text-center","mt-2"),$('div[data-region="grade-actions"]').before(analyticButtonDiv),$('div[data-region="review-panel"]').addClass("cursive_review_panel_path_mod_assign"),$('div[data-region="grading-navigation-panel"]').addClass("cursive_grading-navigation-panel_path_mod_assign"),$('div[data-region="grade-panel"]').addClass("cursive_grade-panel_path_mod_assign"),$('div[data-region="grade-actions-panel"]').addClass("cursive_grade-actions-panel_path_mod_assign");let myEvents=new AnalyticEvents;var context={tabledata:data.data,formattime:myEvents.formatedTime(data.data),page:scoreSetting,userid:userid};let authIcon=myEvents.authorshipStatus(data.data.first_file,data.data.score,scoreSetting);myEvents.createModal(userid,context,"",authIcon),myEvents.analytics(userid,templates,context,"",replayInstances,authIcon),myEvents.checkDiff(userid,data.data.file_id,"",replayInstances),myEvents.replyWriting(userid,filepath,"",replayInstances),myEvents.quality(userid,templates,context,"",replayInstances,M.cfg.contextInstanceId)})),com.usercomment}))}};return usersTable})); +define("tiny_cursive/show_url_in_submission_grade",["jquery","core/ajax","core/str","core/templates","./replay","./analytic_button","./analytic_events","./replay_button"],(function($,AJAX,str,templates,Replay,analyticButton,AnalyticEvents,replayButton){const replayInstances={};window.video_playback=function(mid,filepath){if(""!==filepath){const replay=new Replay("content"+mid,filepath,10,!1,"player_"+mid);replayInstances[mid]=replay}else templates.render("tiny_cursive/no_submission").then((html=>{$("#content"+mid).html(html)})).catch((e=>window.console.error(e)));return!1};var usersTable={init:function(scoreSetting,showcomment,hasApiKey){$(document).ready((function(){$("#page-mod-assign-grader").addClass("tiny_cursive_mod_assign_grader")})),str.get_strings([{key:"field_require",component:"tiny_cursive"}]).done((function(){usersTable.appendSubmissionDetail(scoreSetting,showcomment,hasApiKey)}))},appendSubmissionDetail:function(scoreSetting,showcomment,hasApiKey){$(document).ready((function($){var divElement=$('.path-mod-assign [data-region="grade-panel"]')[0],previousContextId=window.location.href;new MutationObserver((function(mutations){mutations.forEach((function(){var currentContextId=window.location.href;currentContextId!==previousContextId&&(window.location.reload(),previousContextId=currentContextId)}))})).observe(divElement,{childList:!0,subtree:!0});let subUrl=window.location.href,parm=new URL(subUrl),userid=parm.searchParams.get("userid");var cmid=parm.searchParams.get("id");let args={id:userid,modulename:"assign",cmid:cmid},com=AJAX.call([{methodname:"cursive_get_assign_grade_comment",args:args}]);return com[0].done((function(json){var data=JSON.parse(json),filepath="";data.data.filename&&(filepath=data.data.filename);let analyticButtonDiv=document.createElement("div");analyticButtonDiv.classList.add("text-center","mt-2"),$('div[data-region="grade-actions"]').before(analyticButtonDiv),$('div[data-region="review-panel"]').addClass("cursive_review_panel_path_mod_assign"),$('div[data-region="grading-navigation-panel"]').addClass("cursive_grading-navigation-panel_path_mod_assign"),$('div[data-region="grade-panel"]').addClass("cursive_grade-panel_path_mod_assign"),$('div[data-region="grade-actions-panel"]').addClass("cursive_grade-actions-panel_path_mod_assign"),hasApiKey?analyticButtonDiv.append(analyticButton(data.data.effort_ratio,userid)):$(analyticButtonDiv).html(replayButton(userid));let myEvents=new AnalyticEvents;var context={tabledata:data.data,formattime:myEvents.formatedTime(data.data),page:scoreSetting,userid:userid,apikey:hasApiKey};let authIcon=myEvents.authorshipStatus(data.data.first_file,data.data.score,scoreSetting);myEvents.createModal(userid,context,"",replayInstances,authIcon),myEvents.analytics(userid,templates,context,"",replayInstances,authIcon),myEvents.checkDiff(userid,data.data.file_id,"",replayInstances),myEvents.replyWriting(userid,filepath,"",replayInstances)})),com.usercomment}))}};return usersTable})); //# sourceMappingURL=show_url_in_submission_grade.min.js.map \ No newline at end of file diff --git a/amd/build/show_url_in_submission_grade.min.js.map b/amd/build/show_url_in_submission_grade.min.js.map index ab8e27a4..37e64040 100644 --- a/amd/build/show_url_in_submission_grade.min.js.map +++ b/amd/build/show_url_in_submission_grade.min.js.map @@ -1 +1 @@ -{"version":3,"file":"show_url_in_submission_grade.min.js","sources":["../src/show_url_in_submission_grade.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/show_url_in_submission_grade\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\"jquery\", \"core/ajax\", \"core/str\", \"core/templates\", \"./replay\", \"./analytic_button\", \"./analytic_events\"], function(\n $,\n AJAX,\n str,\n templates,\n Replay,\n analyticButton,\n AnalyticEvents\n) {\n const replayInstances = {};\n // eslint-disable-next-line\n window.video_playback = function (mid, filepath) {\n if (filepath !== '') {\n // $(\"#playback\" + mid).show();\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n // eslint-disable-next-line\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n\n var usersTable = {\n init: function(scoreSetting, showcomment) {\n $(document).ready(function() {\n $('#page-mod-assign-grader').addClass('tiny_cursive_mod_assign_grader');\n });\n str\n .get_strings([\n {key: \"field_require\", component: \"tiny_cursive\"},\n ])\n .done(function() {\n usersTable.appendSubmissionDetail(scoreSetting, showcomment);\n });\n },\n // eslint-disable-next-line\n appendSubmissionDetail: function(scoreSetting, showcomment) {\n $(document).ready(function($) {\n\n var divElement = $('.path-mod-assign [data-region=\"grade-panel\"]')[0];\n var previousContextId = window.location.href;\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function() {\n\n var currentContextId = window.location.href;\n if (currentContextId !== previousContextId) {\n window.location.reload();\n previousContextId = currentContextId;\n }\n });\n });\n // Configuration of the observer:\n var config = {childList: true, subtree: true};\n // Start observing the target node for configured mutations\n observer.observe(divElement, config);\n\n let subUrl = window.location.href;\n let parm = new URL(subUrl);\n let userid = parm.searchParams.get('userid');\n var cmid = parm.searchParams.get('id');\n\n let args = {id: userid, modulename: \"assign\", 'cmid': cmid};\n let methodname = 'cursive_get_assign_grade_comment';\n let com = AJAX.call([{methodname, args}]);\n com[0].done(function(json) {\n var data = JSON.parse(json);\n var filepath = '';\n if (data.data.filename) {\n filepath = data.data.filename;\n }\n\n let analyticButtonDiv = document.createElement('div');\n analyticButtonDiv.append(analyticButton(userid));\n analyticButtonDiv.classList.add('text-center', 'mt-2');\n\n $('div[data-region=\"grade-actions\"]').before(analyticButtonDiv);\n\n $('div[data-region=\"review-panel\"]').addClass('cursive_review_panel_path_mod_assign');\n\n $('div[data-region=\"grading-navigation-panel\"]').addClass('cursive_grading-navigation-panel_path_mod_assign');\n\n $('div[data-region=\"grade-panel\"]').addClass('cursive_grade-panel_path_mod_assign');\n\n $('div[data-region=\"grade-actions-panel\"]').addClass('cursive_grade-actions-panel_path_mod_assign');\n\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.data,\n formattime: myEvents.formatedTime(data.data),\n page: scoreSetting,\n userid: userid,\n };\n\n let authIcon = myEvents.authorshipStatus(data.data.first_file, data.data.score, scoreSetting);\n\n myEvents.createModal(userid, context, '', authIcon);\n myEvents.analytics(userid, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(userid, data.data.file_id, '', replayInstances);\n myEvents.replyWriting(userid, filepath, '', replayInstances);\n myEvents.quality(userid, templates, context, '', replayInstances, M.cfg.contextInstanceId);\n\n });\n return com.usercomment;\n });\n },\n };\n return usersTable;\n});\n\n\n"],"names":["define","$","AJAX","str","templates","Replay","analyticButton","AnalyticEvents","replayInstances","window","video_playback","mid","filepath","replay","render","then","html","catch","e","console","error","usersTable","init","scoreSetting","showcomment","document","ready","addClass","get_strings","key","component","done","appendSubmissionDetail","divElement","previousContextId","location","href","MutationObserver","mutations","forEach","currentContextId","reload","observe","childList","subtree","subUrl","parm","URL","userid","searchParams","get","cmid","args","id","modulename","com","call","methodname","json","data","JSON","parse","filename","analyticButtonDiv","createElement","append","classList","add","before","myEvents","context","tabledata","formattime","formatedTime","page","authIcon","authorshipStatus","first_file","score","createModal","analytics","checkDiff","file_id","replyWriting","quality","M","cfg","contextInstanceId","usercomment"],"mappings":"AAsBAA,mDAAO,CAAC,SAAU,YAAa,WAAY,iBAAkB,WAAY,oBAAqB,sBAAsB,SAChHC,EACAC,KACAC,IACAC,UACAC,OACAC,eACAC,sBAEMC,gBAAkB,GAExBC,OAAOC,eAAiB,SAAUC,IAAKC,aAClB,KAAbA,SAAiB,OAEXC,OAAS,IAAIR,OACf,UAAYM,IACZC,SACA,IACA,EACA,UAAYD,KAEhBH,gBAAgBG,KAAOE,YAGvBT,UAAUU,OAAO,8BAA8BC,MAAKC,OAChDf,EAAE,WAAaU,KAAKK,KAAKA,SAC1BC,OAAMC,GAAKT,OAAOU,QAAQC,MAAMF,YAEhC,OAIPG,WAAa,CACbC,KAAM,SAASC,aAAcC,aACzBvB,EAAEwB,UAAUC,OAAM,WACdzB,EAAE,2BAA2B0B,SAAS,qCAE1CxB,IACKyB,YAAY,CACT,CAACC,IAAK,gBAAiBC,UAAW,kBAErCC,MAAK,WACFV,WAAWW,uBAAuBT,aAAcC,iBAI5DQ,uBAAwB,SAAST,aAAcC,aAC3CvB,EAAEwB,UAAUC,OAAM,SAASzB,OAEnBgC,WAAahC,EAAE,gDAAgD,GAC/DiC,kBAAoBzB,OAAO0B,SAASC,KACzB,IAAIC,kBAAiB,SAASC,WACzCA,UAAUC,SAAQ,eAEVC,iBAAmB/B,OAAO0B,SAASC,KACnCI,mBAAqBN,oBACrBzB,OAAO0B,SAASM,SAChBP,kBAAoBM,wBAOvBE,QAAQT,WAFJ,CAACU,WAAW,EAAMC,SAAS,QAIpCC,OAASpC,OAAO0B,SAASC,KACzBU,KAAO,IAAIC,IAAIF,QACfG,OAASF,KAAKG,aAAaC,IAAI,cAC/BC,KAAOL,KAAKG,aAAaC,IAAI,UAE7BE,KAAO,CAACC,GAAIL,OAAQM,WAAY,cAAkBH,MAElDI,IAAMrD,KAAKsD,KAAK,CAAC,CAACC,WADL,mCACiBL,KAAAA,eAClCG,IAAI,GAAGxB,MAAK,SAAS2B,UACbC,KAAOC,KAAKC,MAAMH,MAClB9C,SAAW,GACX+C,KAAKA,KAAKG,WACVlD,SAAW+C,KAAKA,KAAKG,cAGrBC,kBAAoBtC,SAASuC,cAAc,OAC/CD,kBAAkBE,OAAO3D,eAAe0C,SACxCe,kBAAkBG,UAAUC,IAAI,cAAe,QAE/ClE,EAAE,oCAAoCmE,OAAOL,mBAE7C9D,EAAE,mCAAmC0B,SAAS,wCAE9C1B,EAAE,+CAA+C0B,SAAS,oDAE1D1B,EAAE,kCAAkC0B,SAAS,uCAE7C1B,EAAE,0CAA0C0B,SAAS,mDAGjD0C,SAAW,IAAI9D,mBACf+D,QAAU,CACVC,UAAWZ,KAAKA,KAChBa,WAAYH,SAASI,aAAad,KAAKA,MACvCe,KAAMnD,aACNyB,OAAQA,YAGR2B,SAAWN,SAASO,iBAAiBjB,KAAKA,KAAKkB,WAAYlB,KAAKA,KAAKmB,MAAOvD,cAEhF8C,SAASU,YAAY/B,OAAQsB,QAAS,GAAIK,UAC1CN,SAASW,UAAUhC,OAAQ5C,UAAWkE,QAAS,GAAI9D,gBAAiBmE,UACpEN,SAASY,UAAUjC,OAAQW,KAAKA,KAAKuB,QAAS,GAAI1E,iBAClD6D,SAASc,aAAanC,OAAQpC,SAAU,GAAIJ,iBAC5C6D,SAASe,QAAQpC,OAAQ5C,UAAWkE,QAAS,GAAI9D,gBAAiB6E,EAAEC,IAAIC,sBAGrEhC,IAAIiC,wBAIhBnE"} \ No newline at end of file +{"version":3,"file":"show_url_in_submission_grade.min.js","sources":["../src/show_url_in_submission_grade.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/show_url_in_submission_grade\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\"jquery\", \"core/ajax\", \"core/str\", \"core/templates\", \"./replay\", \"./analytic_button\", \"./analytic_events\",\n \"./replay_button\"], function(\n $,\n AJAX,\n str,\n templates,\n Replay,\n analyticButton,\n AnalyticEvents,\n replayButton,\n) {\n const replayInstances = {};\n // eslint-disable-next-line\n window.video_playback = function (mid, filepath) {\n if (filepath !== '') {\n // $(\"#playback\" + mid).show();\n const replay = new Replay(\n 'content' + mid,\n filepath,\n 10,\n false,\n 'player_' + mid\n );\n replayInstances[mid] = replay;\n } else {\n // eslint-disable-next-line\n templates.render('tiny_cursive/no_submission').then(html => {\n $('#content' + mid).html(html);\n }).catch(e => window.console.error(e));\n }\n return false;\n\n };\n\n var usersTable = {\n init: function(scoreSetting, showcomment, hasApiKey) {\n $(document).ready(function() {\n $('#page-mod-assign-grader').addClass('tiny_cursive_mod_assign_grader');\n });\n str\n .get_strings([\n {key: \"field_require\", component: \"tiny_cursive\"},\n ])\n .done(function() {\n usersTable.appendSubmissionDetail(scoreSetting, showcomment, hasApiKey);\n });\n },\n\n appendSubmissionDetail: function(scoreSetting, showcomment, hasApiKey) {\n $(document).ready(function($) {\n\n var divElement = $('.path-mod-assign [data-region=\"grade-panel\"]')[0];\n var previousContextId = window.location.href;\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function() {\n\n var currentContextId = window.location.href;\n if (currentContextId !== previousContextId) {\n window.location.reload();\n previousContextId = currentContextId;\n }\n });\n });\n // Configuration of the observer:\n var config = {childList: true, subtree: true};\n // Start observing the target node for configured mutations\n observer.observe(divElement, config);\n\n let subUrl = window.location.href;\n let parm = new URL(subUrl);\n let userid = parm.searchParams.get('userid');\n var cmid = parm.searchParams.get('id');\n\n let args = {id: userid, modulename: \"assign\", 'cmid': cmid};\n let methodname = 'cursive_get_assign_grade_comment';\n let com = AJAX.call([{methodname, args}]);\n com[0].done(function(json) {\n var data = JSON.parse(json);\n var filepath = '';\n if (data.data.filename) {\n filepath = data.data.filename;\n }\n\n let analyticButtonDiv = document.createElement('div');\n analyticButtonDiv.classList.add('text-center', 'mt-2');\n\n $('div[data-region=\"grade-actions\"]').before(analyticButtonDiv);\n\n $('div[data-region=\"review-panel\"]').addClass('cursive_review_panel_path_mod_assign');\n\n $('div[data-region=\"grading-navigation-panel\"]').addClass('cursive_grading-navigation-panel_path_mod_assign');\n\n $('div[data-region=\"grade-panel\"]').addClass('cursive_grade-panel_path_mod_assign');\n\n $('div[data-region=\"grade-actions-panel\"]').addClass('cursive_grade-actions-panel_path_mod_assign');\n\n if (!hasApiKey) {\n $(analyticButtonDiv).html(replayButton(userid));\n } else {\n analyticButtonDiv.append(analyticButton(data.data.effort_ratio, userid));\n }\n\n let myEvents = new AnalyticEvents();\n var context = {\n tabledata: data.data,\n formattime: myEvents.formatedTime(data.data),\n page: scoreSetting,\n userid: userid,\n apikey: hasApiKey\n };\n\n let authIcon = myEvents.authorshipStatus(data.data.first_file, data.data.score, scoreSetting);\n\n myEvents.createModal(userid, context, '', replayInstances, authIcon);\n myEvents.analytics(userid, templates, context, '', replayInstances, authIcon);\n myEvents.checkDiff(userid, data.data.file_id, '', replayInstances);\n myEvents.replyWriting(userid, filepath, '', replayInstances);\n\n\n });\n return com.usercomment;\n });\n },\n };\n return usersTable;\n});\n\n\n"],"names":["define","$","AJAX","str","templates","Replay","analyticButton","AnalyticEvents","replayButton","replayInstances","window","video_playback","mid","filepath","replay","render","then","html","catch","e","console","error","usersTable","init","scoreSetting","showcomment","hasApiKey","document","ready","addClass","get_strings","key","component","done","appendSubmissionDetail","divElement","previousContextId","location","href","MutationObserver","mutations","forEach","currentContextId","reload","observe","childList","subtree","subUrl","parm","URL","userid","searchParams","get","cmid","args","id","modulename","com","call","methodname","json","data","JSON","parse","filename","analyticButtonDiv","createElement","classList","add","before","append","effort_ratio","myEvents","context","tabledata","formattime","formatedTime","page","apikey","authIcon","authorshipStatus","first_file","score","createModal","analytics","checkDiff","file_id","replyWriting","usercomment"],"mappings":"AAsBAA,mDAAO,CAAC,SAAU,YAAa,WAAY,iBAAkB,WAAY,oBAAqB,oBAC1F,oBAAoB,SACpBC,EACAC,KACAC,IACAC,UACAC,OACAC,eACAC,eACAC,oBAEMC,gBAAkB,GAExBC,OAAOC,eAAiB,SAAUC,IAAKC,aAClB,KAAbA,SAAiB,OAEXC,OAAS,IAAIT,OACf,UAAYO,IACZC,SACA,IACA,EACA,UAAYD,KAEhBH,gBAAgBG,KAAOE,YAGvBV,UAAUW,OAAO,8BAA8BC,MAAKC,OAChDhB,EAAE,WAAaW,KAAKK,KAAKA,SAC1BC,OAAMC,GAAKT,OAAOU,QAAQC,MAAMF,YAEhC,OAIPG,WAAa,CACbC,KAAM,SAASC,aAAcC,YAAaC,WACtCzB,EAAE0B,UAAUC,OAAM,WACd3B,EAAE,2BAA2B4B,SAAS,qCAE1C1B,IACK2B,YAAY,CACT,CAACC,IAAK,gBAAiBC,UAAW,kBAErCC,MAAK,WACFX,WAAWY,uBAAuBV,aAAcC,YAAaC,eAIzEQ,uBAAwB,SAASV,aAAcC,YAAaC,WACxDzB,EAAE0B,UAAUC,OAAM,SAAS3B,OAEnBkC,WAAalC,EAAE,gDAAgD,GAC/DmC,kBAAoB1B,OAAO2B,SAASC,KACzB,IAAIC,kBAAiB,SAASC,WACzCA,UAAUC,SAAQ,eAEVC,iBAAmBhC,OAAO2B,SAASC,KACnCI,mBAAqBN,oBACrB1B,OAAO2B,SAASM,SAChBP,kBAAoBM,wBAOvBE,QAAQT,WAFJ,CAACU,WAAW,EAAMC,SAAS,QAIpCC,OAASrC,OAAO2B,SAASC,KACzBU,KAAO,IAAIC,IAAIF,QACfG,OAASF,KAAKG,aAAaC,IAAI,cAC/BC,KAAOL,KAAKG,aAAaC,IAAI,UAE7BE,KAAO,CAACC,GAAIL,OAAQM,WAAY,cAAkBH,MAElDI,IAAMvD,KAAKwD,KAAK,CAAC,CAACC,WADL,mCACiBL,KAAAA,eAClCG,IAAI,GAAGxB,MAAK,SAAS2B,UACbC,KAAOC,KAAKC,MAAMH,MAClB/C,SAAW,GACXgD,KAAKA,KAAKG,WACVnD,SAAWgD,KAAKA,KAAKG,cAGrBC,kBAAoBtC,SAASuC,cAAc,OAC/CD,kBAAkBE,UAAUC,IAAI,cAAe,QAE/CnE,EAAE,oCAAoCoE,OAAOJ,mBAE7ChE,EAAE,mCAAmC4B,SAAS,wCAE9C5B,EAAE,+CAA+C4B,SAAS,oDAE1D5B,EAAE,kCAAkC4B,SAAS,uCAE7C5B,EAAE,0CAA0C4B,SAAS,+CAEhDH,UAGDuC,kBAAkBK,OAAOhE,eAAeuD,KAAKA,KAAKU,aAAcrB,SAFhEjD,EAAEgE,mBAAmBhD,KAAKT,aAAa0C,aAKvCsB,SAAW,IAAIjE,mBACfkE,QAAU,CACVC,UAAWb,KAAKA,KAChBc,WAAYH,SAASI,aAAaf,KAAKA,MACvCgB,KAAMrD,aACN0B,OAAQA,OACR4B,OAAQpD,eAGRqD,SAAWP,SAASQ,iBAAiBnB,KAAKA,KAAKoB,WAAYpB,KAAKA,KAAKqB,MAAO1D,cAEhFgD,SAASW,YAAYjC,OAAQuB,QAAS,GAAIhE,gBAAiBsE,UAC3DP,SAASY,UAAUlC,OAAQ9C,UAAWqE,QAAS,GAAIhE,gBAAiBsE,UACpEP,SAASa,UAAUnC,OAAQW,KAAKA,KAAKyB,QAAS,GAAI7E,iBAClD+D,SAASe,aAAarC,OAAQrC,SAAU,GAAIJ,oBAIzCgD,IAAI+B,wBAIhBlE"} \ No newline at end of file diff --git a/amd/build/svg_repo.min.js b/amd/build/svg_repo.min.js new file mode 100644 index 00000000..e4901924 --- /dev/null +++ b/amd/build/svg_repo.min.js @@ -0,0 +1,11 @@ +define("tiny_cursive/svg_repo",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0; +/** + * SVG repository for icons used in the Curs + * + * @module tiny_cursive/svg_repo + * @copyright 2025 Cursive Technology, Inc. + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +var _default={people:'\n \n \n \n \n ',assignment:'\n \n \n \n ',time:'\n \n \n ',offline:'',forum:'',close:'\n \n ',hamburger:'\n \n ',quiz:'',cloudSave:'',lesson:'',pdfannotator:'\n \n \n \n \n \n \n \n \n \n \n \n \n \n '};return _exports.default=_default,_exports.default})); + +//# sourceMappingURL=svg_repo.min.js.map \ No newline at end of file diff --git a/amd/build/svg_repo.min.js.map b/amd/build/svg_repo.min.js.map new file mode 100644 index 00000000..505312fd --- /dev/null +++ b/amd/build/svg_repo.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"svg_repo.min.js","sources":["../src/svg_repo.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * SVG repository for icons used in the Curs\n *\n * @module tiny_cursive/svg_repo\n * @copyright 2025 Cursive Technology, Inc. \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nexport default {\n people: `\n \n \n \n \n `,\n assignment: `\n \n \n \n `,\n time: `\n \n \n `,\n offline: ``,\n forum: ``,\n close: `\n \n `,\n hamburger: `\n \n `,\n quiz: ``,\n cloudSave: ``,\n lesson: ``,\n pdfannotator: `\n \n \n \n \n \n \n \n \n \n \n \n \n \n `\n};\n"],"names":["people","assignment","time","offline","forum","close","hamburger","quiz","cloudSave","lesson","pdfannotator"],"mappings":";;;;;;;;aAuBe,CACXA,OAAS,ijBASTC,WAAa,siBAQbC,KAAO,qaAOPC,QAAU,qgBAMVC,MAAQ,mtDAeRC,MAAQ,85BAQRC,UAAY,6jBAKZC,KAAO,ksFAuBPC,UAAY,qzBAOZC,OAAS,4/EAqBTC,aAAe"} \ No newline at end of file diff --git a/amd/build/texteditor.min.js b/amd/build/texteditor.min.js index 3e4318a3..d78e256c 100644 --- a/amd/build/texteditor.min.js +++ b/amd/build/texteditor.min.js @@ -6,6 +6,6 @@ define("tiny_cursive/texteditor",["exports","core/config"],(function(_exports,Co * @copyright 2022 CTI * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -let tinyMCEPromise;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.getTinyMCE=_exports.baseUrl=void 0,Config=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Config);const baseUrl="".concat(Config.wwwroot,"/lib/editor/tiny/loader.php/").concat(M.cfg.jsrev);_exports.baseUrl=baseUrl;_exports.getTinyMCE=()=>tinyMCEPromise||(tinyMCEPromise=new Promise(((resolve,reject)=>{const head=document.querySelector("head");let script=head.querySelector('script[data-tinymce="tinymce"]');script&&resolve(window.tinyMCE),script=document.createElement("script"),script.dataset.tinymce="tinymce",script.src="".concat(baseUrl,"/tinymce.js"),script.async=!0,script.addEventListener("load",(()=>{resolve(window.tinyMCE)}),!1),script.addEventListener("error",(err=>{reject(err)}),!1),head.append(script)})),tinyMCEPromise)})); +let tinyMCEPromise;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.getTinyMCE=_exports.baseUrl=void 0;const baseUrl=`${(Config=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(Config)).wwwroot}/lib/editor/tiny/loader.php/${M.cfg.jsrev}`;_exports.baseUrl=baseUrl;_exports.getTinyMCE=()=>tinyMCEPromise||(tinyMCEPromise=new Promise(((resolve,reject)=>{const head=document.querySelector("head");let script=head.querySelector('script[data-tinymce="tinymce"]');script&&resolve(window.tinyMCE),script=document.createElement("script"),script.dataset.tinymce="tinymce",script.src=`${baseUrl}/tinymce.js`,script.async=!0,script.addEventListener("load",(()=>{resolve(window.tinyMCE)}),!1),script.addEventListener("error",(err=>{reject(err)}),!1),head.append(script)})),tinyMCEPromise)})); //# sourceMappingURL=texteditor.min.js.map \ No newline at end of file diff --git a/amd/build/texteditor.min.js.map b/amd/build/texteditor.min.js.map index cd6b3f19..053cad8b 100644 --- a/amd/build/texteditor.min.js.map +++ b/amd/build/texteditor.min.js.map @@ -1 +1 @@ -{"version":3,"file":"texteditor.min.js","sources":["../src/texteditor.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Tiny Loader for Moodle\n *\n * @module tiny_cursive/texteditor\n * @copyright 2022 CTI \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nlet tinyMCEPromise;\n\nimport * as Config from 'core/config';\n\nexport const baseUrl = `${Config.wwwroot}/lib/editor/tiny/loader.php/${M.cfg.jsrev}`;\n\n/**\n * Get the TinyMCE API Object.\n *\n * @returns {Promise} The TinyMCE API Object\n */\nexport const getTinyMCE = () => {\n if (tinyMCEPromise) {\n return tinyMCEPromise;\n }\n\n tinyMCEPromise = new Promise((resolve, reject) => {\n const head = document.querySelector('head');\n let script = head.querySelector('script[data-tinymce=\"tinymce\"]');\n if (script) {\n resolve(window.tinyMCE);\n }\n\n script = document.createElement('script');\n script.dataset.tinymce = 'tinymce';\n script.src = `${baseUrl}/tinymce.js`;\n script.async = true;\n\n script.addEventListener('load', () => {\n resolve(window.tinyMCE);\n }, false);\n\n script.addEventListener('error', (err) => {\n reject(err);\n }, false);\n\n head.append(script);\n });\n\n return tinyMCEPromise;\n\n};\n\n\n"],"names":["tinyMCEPromise","baseUrl","Config","wwwroot","M","cfg","jsrev","Promise","resolve","reject","head","document","querySelector","script","window","tinyMCE","createElement","dataset","tinymce","src","async","addEventListener","err","append"],"mappings":";;;;;;;;IAuBIA,qxBAISC,kBAAaC,OAAOC,+CAAsCC,EAAEC,IAAIC,oDAOnD,IAClBN,iBAIJA,eAAiB,IAAIO,SAAQ,CAACC,QAASC,gBAC7BC,KAAOC,SAASC,cAAc,YAChCC,OAASH,KAAKE,cAAc,kCAC5BC,QACAL,QAAQM,OAAOC,SAGnBF,OAASF,SAASK,cAAc,UAChCH,OAAOI,QAAQC,QAAU,UACzBL,OAAOM,cAASlB,uBAChBY,OAAOO,OAAQ,EAEfP,OAAOQ,iBAAiB,QAAQ,KAC5Bb,QAAQM,OAAOC,YAChB,GAEHF,OAAOQ,iBAAiB,SAAUC,MAC9Bb,OAAOa,QACR,GAEHZ,KAAKa,OAAOV,WAGTb"} \ No newline at end of file +{"version":3,"file":"texteditor.min.js","sources":["../src/texteditor.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Tiny Loader for Moodle\n *\n * @module tiny_cursive/texteditor\n * @copyright 2022 CTI \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nlet tinyMCEPromise;\n\nimport * as Config from 'core/config';\n\nexport const baseUrl = `${Config.wwwroot}/lib/editor/tiny/loader.php/${M.cfg.jsrev}`;\n\n/**\n * Get the TinyMCE API Object.\n *\n * @returns {Promise} The TinyMCE API Object\n */\nexport const getTinyMCE = () => {\n if (tinyMCEPromise) {\n return tinyMCEPromise;\n }\n\n tinyMCEPromise = new Promise((resolve, reject) => {\n const head = document.querySelector('head');\n let script = head.querySelector('script[data-tinymce=\"tinymce\"]');\n if (script) {\n resolve(window.tinyMCE);\n }\n\n script = document.createElement('script');\n script.dataset.tinymce = 'tinymce';\n script.src = `${baseUrl}/tinymce.js`;\n script.async = true;\n\n script.addEventListener('load', () => {\n resolve(window.tinyMCE);\n }, false);\n\n script.addEventListener('error', (err) => {\n reject(err);\n }, false);\n\n head.append(script);\n });\n\n return tinyMCEPromise;\n\n};\n\n\n"],"names":["tinyMCEPromise","baseUrl","wwwroot","M","cfg","jsrev","Promise","resolve","reject","head","document","querySelector","script","window","tinyMCE","createElement","dataset","tinymce","src","async","addEventListener","err","append"],"mappings":";;;;;;;;IAuBIA,yHAISC,QAAW,iqBAASC,sCAAsCC,EAAEC,IAAIC,qDAOnD,IAClBL,iBAIJA,eAAiB,IAAIM,SAAQ,CAACC,QAASC,gBAC7BC,KAAOC,SAASC,cAAc,YAChCC,OAASH,KAAKE,cAAc,kCAC5BC,QACAL,QAAQM,OAAOC,SAGnBF,OAASF,SAASK,cAAc,UAChCH,OAAOI,QAAQC,QAAU,UACzBL,OAAOM,IAAO,GAAEjB,qBAChBW,OAAOO,OAAQ,EAEfP,OAAOQ,iBAAiB,QAAQ,KAC5Bb,QAAQM,OAAOC,YAChB,GAEHF,OAAOQ,iBAAiB,SAAUC,MAC9Bb,OAAOa,QACR,GAEHZ,KAAKa,OAAOV,WAGTZ"} \ No newline at end of file diff --git a/amd/build/token_approve.min.js b/amd/build/token_approve.min.js index 20e600ba..96a5ed03 100644 --- a/amd/build/token_approve.min.js +++ b/amd/build/token_approve.min.js @@ -1,3 +1,3 @@ -define("tiny_cursive/token_approve",["jquery","core/ajax","core/str"],(function($,AJAX,str){var usersTable={init:function(page){str.get_strings([{key:"field_require",component:"tiny_cursive"}]).done((function(){usersTable.getToken(page),usersTable.generateToken()}))},getToken:function(){$("#approve_token").click((function(){var token=$("#id_s_tiny_cursive_secretkey").val();AJAX.call([{methodname:"cursive_approve_token",args:{token:token}}])[0].done((function(json){var data=JSON.parse(json),messageAlert="";messageAlert=1==data.status?""+data.message+"":""+data.message+"",$("#token_message").html(messageAlert)}))}))},generateToken(){const generateToken=$("#generate_cursivetoken"),cursiveDisable=$("#cursivedisable"),cursiveEnable=$("#cursiveenable");generateToken.on("click",(function(e){e.preventDefault();var promise1=AJAX.call([{methodname:"cursive_generate_webtoken",args:[]}]);promise1[0].done((function(data){var messageAlert="";str.get_strings([{key:"webservtokengensucc",component:"tiny_cursive"},{key:"webservtokengenfail",component:"tiny_cursive"}]).then((function(_ref){let[success,fail]=_ref;return data.token?($("#id_s_tiny_cursive_cursivetoken").val(data.token),messageAlert="".concat(success,"")):messageAlert="".concat(fail,""),$("#cursivetoken_").html(messageAlert),setTimeout((()=>{$("#cursivetoken_").empty()}),3e3),!0})).catch((error=>window.console.error(error)))})),promise1[0].fail((function(textStatus){var errorMessage="";str.get_string("webservtokenerror","tiny_cursive").then((str=>(errorMessage+=str+" "+textStatus.error+"",$("#cursivetoken_").html(errorMessage),setTimeout((function(){$("#cursivetoken_").empty()}),3e3),!0))).catch((error=>window.console.error(error)))}))})),cursiveDisable.on("click",(function(e){e.preventDefault();var promise1=AJAX.call([{methodname:"cursive_disable_all_course",args:{disable:!0}}]);promise1[0].done((function(data){var messageAlert="";str.get_strings([{key:"cursive:dis:succ",component:"tiny_cursive"},{key:"cursive:dis:fail",component:"tiny_cursive"}]).then((function(_ref2){let[success,fail]=_ref2;return messageAlert=data?"".concat(success,""):"".concat(fail,""),$("#cursivedisable_").html(messageAlert),setTimeout((()=>{$("#cursivedisable_").empty()}),3e3),!0})).catch((error=>window.console.error(error)))})),promise1[0].fail((function(textStatus){var errorMessage="";str.get_string("cursive:status","tiny_cursive").then((str=>(errorMessage+=str+" "+textStatus.error+"",$("#cursivedisable_").html(errorMessage),setTimeout((function(){$("#cursivedisable_").empty()}),3e3),!0))).catch((error=>window.console.error(error)))}))})),cursiveEnable.on("click",(function(e){e.preventDefault();var promise1=AJAX.call([{methodname:"cursive_disable_all_course",args:{disable:!1}}]);promise1[0].done((function(data){var messageAlert="";str.get_strings([{key:"cursive:ena:succ",component:"tiny_cursive"},{key:"cursive:ena:fail",component:"tiny_cursive"}]).then((function(_ref3){let[success,fail]=_ref3;return messageAlert=data?"".concat(success,""):"".concat(fail,""),$("#cursivedisable_").html(messageAlert),setTimeout((()=>{$("#cursivedisable_").empty()}),3e3),!0})).catch((error=>window.console.error(error)))})),promise1[0].fail((function(textStatus){var errorMessage="";str.get_string("cursive:status","tiny_cursive").then((str=>(errorMessage+=str+" "+textStatus.error+"",$("#cursivedisable_").html(errorMessage),setTimeout((function(){$("#cursivedisable_").empty()}),3e3),!0))).catch((error=>window.console.error(error)))}))}))}};return usersTable})); +define("tiny_cursive/token_approve",["jquery","core/ajax","core/str"],(function($,AJAX,str){var usersTable={init:function(page){str.get_strings([{key:"field_require",component:"tiny_cursive"}]).done((function(){usersTable.getToken(page),usersTable.generateToken()}))},getToken:function(){$("#approve_token").click((function(){var token=$("#id_s_tiny_cursive_secretkey").val();AJAX.call([{methodname:"cursive_approve_token",args:{token:token}}])[0].done((function(json){var data=JSON.parse(json),messageAlert="";messageAlert=1==data.status?""+data.message+"":""+data.message+"",$("#token_message").html(messageAlert)}))}))},generateToken(){const generateToken=$("#generate_cursivetoken"),cursiveDisable=$("#cursivedisable"),cursiveEnable=$("#cursiveenable");generateToken.on("click",(function(e){e.preventDefault();var promise1=AJAX.call([{methodname:"cursive_generate_webtoken",args:[]}]);promise1[0].done((function(data){var messageAlert="";str.get_strings([{key:"webservtokengensucc",component:"tiny_cursive"},{key:"webservtokengenfail",component:"tiny_cursive"}]).then((function(_ref){let[success,fail]=_ref;return data.token?($("#id_s_tiny_cursive_cursivetoken").val(data.token),messageAlert=`${success}`):messageAlert=`${fail}`,$("#cursivetoken_").html(messageAlert),setTimeout((()=>{$("#cursivetoken_").empty()}),3e3),!0})).catch((error=>window.console.error(error)))})),promise1[0].fail((function(textStatus){var errorMessage="";str.get_string("webservtokenerror","tiny_cursive").then((str=>(errorMessage+=str+" "+textStatus.error+"",$("#cursivetoken_").html(errorMessage),setTimeout((function(){$("#cursivetoken_").empty()}),3e3),!0))).catch((error=>window.console.error(error)))}))})),cursiveDisable.on("click",(function(e){e.preventDefault();var promise1=AJAX.call([{methodname:"cursive_disable_all_course",args:{disable:!0}}]);promise1[0].done((function(data){var messageAlert="";str.get_strings([{key:"cursive:dis:succ",component:"tiny_cursive"},{key:"cursive:dis:fail",component:"tiny_cursive"}]).then((function(_ref2){let[success,fail]=_ref2;return messageAlert=data?`${success}`:`${fail}`,$("#cursivedisable_").html(messageAlert),setTimeout((()=>{$("#cursivedisable_").empty()}),3e3),!0})).catch((error=>window.console.error(error)))})),promise1[0].fail((function(textStatus){var errorMessage="";str.get_string("cursive:status","tiny_cursive").then((str=>(errorMessage+=str+" "+textStatus.error+"",$("#cursivedisable_").html(errorMessage),setTimeout((function(){$("#cursivedisable_").empty()}),3e3),!0))).catch((error=>window.console.error(error)))}))})),cursiveEnable.on("click",(function(e){e.preventDefault();var promise1=AJAX.call([{methodname:"cursive_disable_all_course",args:{disable:!1}}]);promise1[0].done((function(data){var messageAlert="";str.get_strings([{key:"cursive:ena:succ",component:"tiny_cursive"},{key:"cursive:ena:fail",component:"tiny_cursive"}]).then((function(_ref3){let[success,fail]=_ref3;return messageAlert=data?`${success}`:`${fail}`,$("#cursivedisable_").html(messageAlert),setTimeout((()=>{$("#cursivedisable_").empty()}),3e3),!0})).catch((error=>window.console.error(error)))})),promise1[0].fail((function(textStatus){var errorMessage="";str.get_string("cursive:status","tiny_cursive").then((str=>(errorMessage+=str+" "+textStatus.error+"",$("#cursivedisable_").html(errorMessage),setTimeout((function(){$("#cursivedisable_").empty()}),3e3),!0))).catch((error=>window.console.error(error)))}))}))}};return usersTable})); //# sourceMappingURL=token_approve.min.js.map \ No newline at end of file diff --git a/amd/build/token_approve.min.js.map b/amd/build/token_approve.min.js.map index 2236c250..44d98c9a 100644 --- a/amd/build/token_approve.min.js.map +++ b/amd/build/token_approve.min.js.map @@ -1 +1 @@ -{"version":3,"file":"token_approve.min.js","sources":["../src/token_approve.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/token_approve\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\"jquery\", \"core/ajax\", \"core/str\"], function($, AJAX, str) {\n var usersTable = {\n init: function(page) {\n str\n .get_strings([{key: \"field_require\", component: \"tiny_cursive\"}])\n .done(function() {\n usersTable.getToken(page);\n usersTable.generateToken();\n });\n },\n getToken: function() {\n $(\"#approve_token\").click(function() {\n var token = $(\"#id_s_tiny_cursive_secretkey\").val();\n var promise1 = AJAX.call([\n {\n methodname: \"cursive_approve_token\",\n args: {\n token: token,\n },\n },\n ]);\n promise1[0].done(function(json) {\n var data = JSON.parse(json);\n var messageAlert = \"\";\n if (data.status == true) {\n messageAlert =\n \"\" +\n data.message +\n \"\";\n } else {\n messageAlert =\n \"\" +\n data.message +\n \"\";\n }\n $(\"#token_message\").html(messageAlert);\n });\n });\n },\n\n generateToken() {\n const generateToken = $(\"#generate_cursivetoken\");\n const cursiveDisable = $(\"#cursivedisable\");\n const cursiveEnable = $(\"#cursiveenable\");\n\n generateToken.on(\"click\", function(e) {\n e.preventDefault();\n var promise1 = AJAX.call([\n {\n methodname: \"cursive_generate_webtoken\",\n args: [],\n },\n ]);\n promise1[0].done(function(data) {\n var messageAlert = \"\";\n str.get_strings([\n {key: \"webservtokengensucc\", component: \"tiny_cursive\"},\n {key: \"webservtokengenfail\", component: \"tiny_cursive\"}\n ]).then(function([success, fail]) {\n\n if (data.token) {\n $(\"#id_s_tiny_cursive_cursivetoken\").val(data.token);\n messageAlert = `${success}`;\n } else {\n messageAlert = `${fail}`;\n }\n $(\"#cursivetoken_\").html(messageAlert);\n setTimeout(() => {\n $(\"#cursivetoken_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n promise1[0].fail(function(textStatus) {\n var errorMessage = \"\";\n str\n .get_string(\"webservtokenerror\", \"tiny_cursive\")\n .then((str) => {\n errorMessage += str + \" \" + textStatus.error + \"\";\n\n $(\"#cursivetoken_\").html(errorMessage);\n // Clear the error message after 3 seconds.\n setTimeout(function() {\n $(\"#cursivetoken_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n });\n\n cursiveDisable.on(\"click\", function(e) {\n e.preventDefault();\n\n var promise1 = AJAX.call([\n {\n methodname: \"cursive_disable_all_course\",\n args: {\n disable: true,\n },\n },\n ]);\n promise1[0].done(function(data) {\n var messageAlert = \"\";\n str.get_strings([\n {key: \"cursive:dis:succ\", component: \"tiny_cursive\"},\n {key: \"cursive:dis:fail\", component: \"tiny_cursive\"}\n ]).then(function([success, fail]) {\n if (data) {\n messageAlert = `${success}`;\n } else {\n messageAlert = `${fail}`;\n }\n\n $(\"#cursivedisable_\").html(messageAlert);\n setTimeout(() => {\n $(\"#cursivedisable_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n promise1[0].fail(function(textStatus) {\n var errorMessage = \"\";\n str\n .get_string(\"cursive:status\", \"tiny_cursive\")\n .then((str) => {\n errorMessage += str + \" \" + textStatus.error + \"\";\n\n $(\"#cursivedisable_\").html(errorMessage);\n // Clear the error message after 3 seconds.\n setTimeout(function() {\n $(\"#cursivedisable_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n });\n cursiveEnable.on(\"click\", function(e) {\n e.preventDefault();\n\n var promise1 = AJAX.call([\n {\n methodname: \"cursive_disable_all_course\",\n args: {\n disable: false,\n },\n },\n ]);\n promise1[0].done(function(data) {\n var messageAlert = \"\";\n str.get_strings([\n {key: \"cursive:ena:succ\", component: \"tiny_cursive\"},\n {key: \"cursive:ena:fail\", component: \"tiny_cursive\"}\n ]).then(function([success, fail]) {\n if (data) {\n messageAlert = `${success}`;\n } else {\n messageAlert = `${fail}`;\n }\n\n $(\"#cursivedisable_\").html(messageAlert);\n setTimeout(() => {\n $(\"#cursivedisable_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n promise1[0].fail(function(textStatus) {\n var errorMessage = \"\";\n str.get_string(\"cursive:status\", \"tiny_cursive\")\n .then((str) => {\n errorMessage += str + \" \" + textStatus.error + \"\";\n\n $(\"#cursivedisable_\").html(errorMessage);\n // Clear the error message after 3 seconds.\n setTimeout(function() {\n $(\"#cursivedisable_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n });\n },\n };\n return usersTable;\n});\n"],"names":["define","$","AJAX","str","usersTable","init","page","get_strings","key","component","done","getToken","generateToken","click","token","val","call","methodname","args","json","data","JSON","parse","messageAlert","status","message","html","cursiveDisable","cursiveEnable","on","e","preventDefault","promise1","then","success","fail","setTimeout","empty","catch","error","window","console","textStatus","errorMessage","get_string","disable"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"token_approve.min.js","sources":["../src/token_approve.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * @module tiny_cursive/token_approve\n * @category TinyMCE Editor\n * @copyright CTI \n * @author kuldeep singh \n */\n\ndefine([\"jquery\", \"core/ajax\", \"core/str\"], function($, AJAX, str) {\n var usersTable = {\n init: function(page) {\n str\n .get_strings([{key: \"field_require\", component: \"tiny_cursive\"}])\n .done(function() {\n usersTable.getToken(page);\n usersTable.generateToken();\n });\n },\n getToken: function() {\n $(\"#approve_token\").click(function() {\n var token = $(\"#id_s_tiny_cursive_secretkey\").val();\n var promise1 = AJAX.call([\n {\n methodname: \"cursive_approve_token\",\n args: {\n token: token,\n },\n },\n ]);\n promise1[0].done(function(json) {\n var data = JSON.parse(json);\n var messageAlert = \"\";\n if (data.status == true) {\n messageAlert =\n \"\" +\n data.message +\n \"\";\n } else {\n messageAlert =\n \"\" +\n data.message +\n \"\";\n }\n $(\"#token_message\").html(messageAlert);\n });\n });\n },\n\n generateToken() {\n const generateToken = $(\"#generate_cursivetoken\");\n const cursiveDisable = $(\"#cursivedisable\");\n const cursiveEnable = $(\"#cursiveenable\");\n\n generateToken.on(\"click\", function(e) {\n e.preventDefault();\n var promise1 = AJAX.call([\n {\n methodname: \"cursive_generate_webtoken\",\n args: [],\n },\n ]);\n promise1[0].done(function(data) {\n var messageAlert = \"\";\n str.get_strings([\n {key: \"webservtokengensucc\", component: \"tiny_cursive\"},\n {key: \"webservtokengenfail\", component: \"tiny_cursive\"}\n ]).then(function([success, fail]) {\n\n if (data.token) {\n $(\"#id_s_tiny_cursive_cursivetoken\").val(data.token);\n messageAlert = `${success}`;\n } else {\n messageAlert = `${fail}`;\n }\n $(\"#cursivetoken_\").html(messageAlert);\n setTimeout(() => {\n $(\"#cursivetoken_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n promise1[0].fail(function(textStatus) {\n var errorMessage = \"\";\n str\n .get_string(\"webservtokenerror\", \"tiny_cursive\")\n .then((str) => {\n errorMessage += str + \" \" + textStatus.error + \"\";\n\n $(\"#cursivetoken_\").html(errorMessage);\n // Clear the error message after 3 seconds.\n setTimeout(function() {\n $(\"#cursivetoken_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n });\n\n cursiveDisable.on(\"click\", function(e) {\n e.preventDefault();\n\n var promise1 = AJAX.call([\n {\n methodname: \"cursive_disable_all_course\",\n args: {\n disable: true,\n },\n },\n ]);\n promise1[0].done(function(data) {\n var messageAlert = \"\";\n str.get_strings([\n {key: \"cursive:dis:succ\", component: \"tiny_cursive\"},\n {key: \"cursive:dis:fail\", component: \"tiny_cursive\"}\n ]).then(function([success, fail]) {\n if (data) {\n messageAlert = `${success}`;\n } else {\n messageAlert = `${fail}`;\n }\n\n $(\"#cursivedisable_\").html(messageAlert);\n setTimeout(() => {\n $(\"#cursivedisable_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n promise1[0].fail(function(textStatus) {\n var errorMessage = \"\";\n str\n .get_string(\"cursive:status\", \"tiny_cursive\")\n .then((str) => {\n errorMessage += str + \" \" + textStatus.error + \"\";\n\n $(\"#cursivedisable_\").html(errorMessage);\n // Clear the error message after 3 seconds.\n setTimeout(function() {\n $(\"#cursivedisable_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n });\n cursiveEnable.on(\"click\", function(e) {\n e.preventDefault();\n\n var promise1 = AJAX.call([\n {\n methodname: \"cursive_disable_all_course\",\n args: {\n disable: false,\n },\n },\n ]);\n promise1[0].done(function(data) {\n var messageAlert = \"\";\n str.get_strings([\n {key: \"cursive:ena:succ\", component: \"tiny_cursive\"},\n {key: \"cursive:ena:fail\", component: \"tiny_cursive\"}\n ]).then(function([success, fail]) {\n if (data) {\n messageAlert = `${success}`;\n } else {\n messageAlert = `${fail}`;\n }\n\n $(\"#cursivedisable_\").html(messageAlert);\n setTimeout(() => {\n $(\"#cursivedisable_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n promise1[0].fail(function(textStatus) {\n var errorMessage = \"\";\n str.get_string(\"cursive:status\", \"tiny_cursive\")\n .then((str) => {\n errorMessage += str + \" \" + textStatus.error + \"\";\n\n $(\"#cursivedisable_\").html(errorMessage);\n // Clear the error message after 3 seconds.\n setTimeout(function() {\n $(\"#cursivedisable_\").empty();\n }, 3000);\n return true;\n }).catch(error => window.console.error(error));\n });\n });\n },\n };\n return usersTable;\n});\n"],"names":["define","$","AJAX","str","usersTable","init","page","get_strings","key","component","done","getToken","generateToken","click","token","val","call","methodname","args","json","data","JSON","parse","messageAlert","status","message","html","cursiveDisable","cursiveEnable","on","e","preventDefault","promise1","then","success","fail","setTimeout","empty","catch","error","window","console","textStatus","errorMessage","get_string","disable"],"mappings":"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"} \ No newline at end of file diff --git a/amd/js/html2pdf.js b/amd/js/html2pdf.js new file mode 100644 index 00000000..c01533d5 --- /dev/null +++ b/amd/js/html2pdf.js @@ -0,0 +1,4 @@ +/* eslint-disable */ +/*! For license information please see html2pdf.bundle.min.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("html2pdf",[],t):"object"==typeof exports?exports.html2pdf=t():e.html2pdf=t()}(self,(function(){return function(){var e,t,r={"./node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/array/from.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/array/is-array.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/date/now.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/date/now.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/bind.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/concat.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/every.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/every.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/fill.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/fill.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/filter.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/for-each.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/includes.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/index-of.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/map.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/reduce.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/reverse.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/reverse.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/slice.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/some.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/starts-with.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/starts-with.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/trim.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/instance/values.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/map.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/map/index.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/object/define-properties.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/object/define-property.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/object/get-own-property-descriptor.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/object/get-own-property-descriptors.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/object/get-own-property-symbols.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/object/keys.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/parse-float.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/parse-int.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/promise.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/promise/index.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/reflect/apply.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/reflect/apply.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/reflect/construct.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/reflect/delete-property.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/reflect/delete-property.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/reflect/get-prototype-of.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/reflect/get-prototype-of.js")},"./node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/stable/symbol/index.js")},"./node_modules/@babel/runtime-corejs3/core-js/array/from.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/array/from.js")},"./node_modules/@babel/runtime-corejs3/core-js/array/is-array.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/array/is-array.js")},"./node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/get-iterator-method.js")},"./node_modules/@babel/runtime-corejs3/core-js/get-iterator.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/get-iterator.js")},"./node_modules/@babel/runtime-corejs3/core-js/instance/slice.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/instance/slice.js")},"./node_modules/@babel/runtime-corejs3/core-js/object/create.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/object/create.js")},"./node_modules/@babel/runtime-corejs3/core-js/object/define-property.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/object/define-property.js")},"./node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-descriptor.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/object/get-own-property-descriptor.js")},"./node_modules/@babel/runtime-corejs3/core-js/object/get-prototype-of.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/object/get-prototype-of.js")},"./node_modules/@babel/runtime-corejs3/core-js/object/set-prototype-of.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/object/set-prototype-of.js")},"./node_modules/@babel/runtime-corejs3/core-js/promise.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/promise/index.js")},"./node_modules/@babel/runtime-corejs3/core-js/reflect/get.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/reflect/get.js")},"./node_modules/@babel/runtime-corejs3/core-js/symbol.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/symbol/index.js")},"./node_modules/@babel/runtime-corejs3/core-js/symbol/iterator.js":function(e,t,r){e.exports=r("./node_modules/core-js-pure/features/symbol/iterator.js")},"./node_modules/@babel/runtime-corejs3/helpers/esm/arrayLikeToArray.js":function(e,t,r){"use strict";function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);rA){var c=u;u=A,A=c}}else{if("l"!==e&&"landscape"!==e)throw"Invalid orientation: "+e;e="l",A>u&&(c=u,u=A,A=c)}return{width:u,height:A,unit:t,k:a}},t.default=n.jsPDF},"./src/plugin/pagebreaks.js":function(e,t,r){"use strict";r.r(t),r("./node_modules/core-js/modules/es.array.concat.js"),r("./node_modules/core-js/modules/es.array.slice.js"),r("./node_modules/core-js/modules/es.array.join.js"),r("./node_modules/core-js/modules/web.dom-collections.for-each.js"),r("./node_modules/core-js/modules/es.object.keys.js");var n=r("./src/worker.js"),o=r("./src/utils.js"),s={toContainer:n.default.prototype.toContainer};n.default.template.opt.pagebreak={mode:["css","legacy"],before:[],after:[],avoid:[]},n.default.prototype.toContainer=function(){return s.toContainer.call(this).then((function(){var e=this.prop.container,t=this.prop.pageSize.inner.px.height,r=[].concat(this.opt.pagebreak.mode),n={avoidAll:-1!==r.indexOf("avoid-all"),css:-1!==r.indexOf("css"),legacy:-1!==r.indexOf("legacy")},s={},i=this;["before","after","avoid"].forEach((function(t){var r=n.avoidAll&&"avoid"===t;s[t]=r?[]:[].concat(i.opt.pagebreak[t]||[]),s[t].length>0&&(s[t]=Array.prototype.slice.call(e.querySelectorAll(s[t].join(", "))))}));var a=e.querySelectorAll(".html2pdf__page-break");a=Array.prototype.slice.call(a);var A=e.querySelectorAll("*");Array.prototype.forEach.call(A,(function(e){var r={before:!1,after:n.legacy&&-1!==a.indexOf(e),avoid:n.avoidAll};if(n.css){var i=window.getComputedStyle(e),A=["always","page","left","right"];r={before:r.before||-1!==A.indexOf(i.breakBefore||i.pageBreakBefore),after:r.after||-1!==A.indexOf(i.breakAfter||i.pageBreakAfter),avoid:r.avoid||-1!==["avoid","avoid-page"].indexOf(i.breakInside||i.pageBreakInside)}}Object.keys(r).forEach((function(t){r[t]=r[t]||-1!==s[t].indexOf(e)}));var u=e.getBoundingClientRect();if(r.avoid&&!r.before){var c=Math.floor(u.top/t),l=Math.floor(u.bottom/t),f=Math.abs(u.bottom-u.top)/t;l!==c&&f<=1&&(r.before=!0)}if(r.before){var d=(0,o.createElement)("div",{style:{display:"block",height:t-u.top%t+"px"}});e.parentNode.insertBefore(d,e)}r.after&&(d=(0,o.createElement)("div",{style:{display:"block",height:t-u.bottom%t+"px"}}),e.parentNode.insertBefore(d,e.nextSibling))}))}))}},"./src/utils.js":function(e,t,r){"use strict";function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}r.r(t),r.d(t,{objType:function(){return o},createElement:function(){return s},cloneNode:function(){return i},unitConvert:function(){return a},toPx:function(){return A}}),r("./node_modules/core-js/modules/es.number.constructor.js"),r("./node_modules/core-js/modules/es.symbol.js"),r("./node_modules/core-js/modules/es.symbol.description.js"),r("./node_modules/core-js/modules/es.object.to-string.js"),r("./node_modules/core-js/modules/es.symbol.iterator.js"),r("./node_modules/core-js/modules/es.array.iterator.js"),r("./node_modules/core-js/modules/es.string.iterator.js"),r("./node_modules/core-js/modules/web.dom-collections.iterator.js");var o=function(e){var t=n(e);return"undefined"===t?"undefined":"string"===t||e instanceof String?"string":"number"===t||e instanceof Number?"number":"function"===t||e instanceof Function?"function":e&&e.constructor===Array?"array":e&&1===e.nodeType?"element":"object"===t?"object":"unknown"},s=function(e,t){var r=document.createElement(e);if(t.className&&(r.className=t.className),t.innerHTML){r.innerHTML=t.innerHTML;for(var n=r.getElementsByTagName("script"),o=n.length;o-- >0;null)n[o].parentNode.removeChild(n[o])}for(var s in t.style)r.style[s]=t.style[s];return r},i=function e(t,r){for(var n=3===t.nodeType?document.createTextNode(t.nodeValue):t.cloneNode(!1),o=t.firstChild;o;o=o.nextSibling)!0!==r&&1===o.nodeType&&"SCRIPT"===o.nodeName||n.appendChild(e(o,r));return 1===t.nodeType&&("CANVAS"===t.nodeName?(n.width=t.width,n.height=t.height,n.getContext("2d").drawImage(t,0,0)):"TEXTAREA"!==t.nodeName&&"SELECT"!==t.nodeName||(n.value=t.value),n.addEventListener("load",(function(){n.scrollTop=t.scrollTop,n.scrollLeft=t.scrollLeft}),!0)),n},a=function(e,t){if("number"===o(e))return 72*e/96/t;var r={};for(var n in e)r[n]=72*e[n]/96/t;return r},A=function(e,t){return Math.floor(e*t/72*96)}},"./src/worker.js":function(e,t,r){"use strict";r.r(t),r("./node_modules/core-js/modules/es.object.assign.js"),r("./node_modules/core-js/modules/es.array.map.js"),r("./node_modules/core-js/modules/es.object.keys.js"),r("./node_modules/core-js/modules/es.array.concat.js"),r("./node_modules/core-js/modules/es.object.to-string.js"),r("./node_modules/core-js/modules/es.regexp.to-string.js"),r("./node_modules/core-js/modules/es.function.name.js"),r("./node_modules/core-js/modules/web.dom-collections.for-each.js");var n=r("./node_modules/jspdf/dist/jspdf.es.min.js"),o=r("./node_modules/html2canvas/dist/html2canvas.js"),s=r("./src/utils.js"),i=r("./node_modules/es6-promise/dist/es6-promise.js"),a=r.n(i)().Promise,A=function e(t){var r=Object.assign(e.convert(a.resolve()),JSON.parse(JSON.stringify(e.template))),n=e.convert(a.resolve(),r);return(n=n.setProgress(1,e,1,[e])).set(t)};(A.prototype=Object.create(a.prototype)).constructor=A,A.convert=function(e,t){return e.__proto__=t||A.prototype,e},A.template={prop:{src:null,container:null,overlay:null,canvas:null,img:null,pdf:null,pageSize:null},progress:{val:0,state:null,n:0,stack:[]},opt:{filename:"file.pdf",margin:[0,0,0,0],image:{type:"jpeg",quality:.95},enableLinks:!0,html2canvas:{},jsPDF:{}}},A.prototype.from=function(e,t){return this.then((function(){switch(t=t||function(e){switch((0,s.objType)(e)){case"string":return"string";case"element":return e.nodeName.toLowerCase&&"canvas"===e.nodeName.toLowerCase()?"canvas":"element";default:return"unknown"}}(e)){case"string":return this.set({src:(0,s.createElement)("div",{innerHTML:e})});case"element":return this.set({src:e});case"canvas":return this.set({canvas:e});case"img":return this.set({img:e});default:return this.error("Unknown source type.")}}))},A.prototype.to=function(e){switch(e){case"container":return this.toContainer();case"canvas":return this.toCanvas();case"img":return this.toImg();case"pdf":return this.toPdf();default:return this.error("Invalid target.")}},A.prototype.toContainer=function(){return this.thenList([function(){return this.prop.src||this.error("Cannot duplicate - no source HTML.")},function(){return this.prop.pageSize||this.setPageSize()}]).then((function(){var e={position:"fixed",overflow:"hidden",zIndex:1e3,left:0,right:0,bottom:0,top:0,backgroundColor:"rgba(0,0,0,0.8)"},t={position:"absolute",width:this.prop.pageSize.inner.width+this.prop.pageSize.unit,left:0,right:0,top:0,height:"auto",margin:"auto",backgroundColor:"white"};e.opacity=0;var r=(0,s.cloneNode)(this.prop.src,this.opt.html2canvas.javascriptEnabled);this.prop.overlay=(0,s.createElement)("div",{className:"html2pdf__overlay",style:e}),this.prop.container=(0,s.createElement)("div",{className:"html2pdf__container",style:t}),this.prop.container.appendChild(r),this.prop.overlay.appendChild(this.prop.container),document.body.appendChild(this.prop.overlay)}))},A.prototype.toCanvas=function(){var e=[function(){return document.body.contains(this.prop.container)||this.toContainer()}];return this.thenList(e).then((function(){var e=Object.assign({},this.opt.html2canvas);return delete e.onrendered,o(this.prop.container,e)})).then((function(e){(this.opt.html2canvas.onrendered||function(){})(e),this.prop.canvas=e,document.body.removeChild(this.prop.overlay)}))},A.prototype.toImg=function(){return this.thenList([function(){return this.prop.canvas||this.toCanvas()}]).then((function(){var e=this.prop.canvas.toDataURL("image/"+this.opt.image.type,this.opt.image.quality);this.prop.img=document.createElement("img"),this.prop.img.src=e}))},A.prototype.toPdf=function(){return this.thenList([function(){return this.prop.canvas||this.toCanvas()},function(){return this.prop.pageSize||this.setPageSize()}]).then((function(){var e=this.prop.canvas,t=this.opt,r=e.height,o=Math.floor(e.width*this.prop.pageSize.inner.ratio),s=Math.ceil(r/o),i=this.prop.pageSize.inner.height,a=document.createElement("canvas"),A=a.getContext("2d");a.width=e.width,a.height=o,this.prop.pdf=this.prop.pdf||new n.jsPDF(t.jsPDF);for(var u=0;u~\.\[:]+)/g,Je=/(\.[^\s\+>~\.\[:]+)/g,Ye=/(::[^\s\+>~\.\[:]+|:first-line|:first-letter|:before|:after)/gi,Ze=/(:[\w-]+\([^\)]*\))/gi,$e=/(:[^\s\+>~\.\[:]+)/g,et=/([^\s\+>~\.\[:]+)/g;function tt(e,t){var r=e.match(t);return r?[e.replace(t," "),r.length]:[e,0]}function rt(e){var t=[0,0,0],r=e.replace(/:not\(([^\)]*)\)/g," $1 ").replace(/{[\s\S]*/gm," "),n=0,o=tt(r,Xe),s=(0,u.default)(o,2);r=s[0],n=s[1],t[1]+=n;var i=tt(r,We),a=(0,u.default)(i,2);r=a[0],n=a[1],t[0]+=n;var A=tt(r,Je),c=(0,u.default)(A,2);r=c[0],n=c[1],t[1]+=n;var l=tt(r,Ye),f=(0,u.default)(l,2);r=f[0],n=f[1],t[2]+=n;var d=tt(r,Ze),h=(0,u.default)(d,2);r=h[0],n=h[1],t[1]+=n;var p=tt(r,$e),m=(0,u.default)(p,2);r=m[0],n=m[1],t[1]+=n;var g=tt(r=r.replace(/[\*\s\+>~]/g," ").replace(/[#\.]/g," "),et),y=(0,u.default)(g,2);return r=y[0],n=y[1],t[2]+=n,t.join("")}var nt=1e-8;function ot(e){return Math.sqrt(Math.pow(e[0],2)+Math.pow(e[1],2))}function st(e,t){return(e[0]*t[0]+e[1]*t[1])/(ot(e)*ot(t))}function it(e,t){return(e[0]*t[1]0&&void 0!==arguments[0]?arguments[0]:" ",o=this.document,s=this.name;return A()(t=G()(r=Re(this.getString())).call(r).split(n)).call(t,(function(t){return new e(o,s,t)}))}},{key:"hasValue",value:function(e){var t=this.value;return null!==t&&""!==t&&(e||0!==t)&&void 0!==t}},{key:"isString",value:function(e){var t=this.value,r="string"==typeof t;return r&&e?e.test(t):r}},{key:"isUrlDefinition",value:function(){return this.isString(/^url\(/)}},{key:"isPixels",value:function(){if(!this.hasValue())return!1;var e=this.getString();switch(!0){case/px$/.test(e):case/^[0-9]+$/.test(e):return!0;default:return!1}}},{key:"setValue",value:function(e){return this.value=e,this}},{key:"getValue",value:function(e){return void 0===e||this.hasValue()?this.value:e}},{key:"getNumber",value:function(e){if(!this.hasValue())return void 0===e?0:i()(e);var t=this.value,r=i()(t);return this.isString(/%$/)&&(r/=100),r}},{key:"getString",value:function(e){return void 0===e||this.hasValue()?void 0===this.value?"":String(this.value):String(e)}},{key:"getColor",value:function(e){var t=this.getString(e);return this.isNormalizedColor||(this.isNormalizedColor=!0,t=Ge(t),this.value=t),t}},{key:"getDpi",value:function(){return 96}},{key:"getRem",value:function(){return this.document.rootEmSize}},{key:"getEm",value:function(){return this.document.emSize}},{key:"getUnits",value:function(){return this.getString().replace(/[0-9\.\-]/g,"")}},{key:"getPixels",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.hasValue())return 0;var r="boolean"==typeof e?[void 0,e]:[e],n=(0,u.default)(r,2),o=n[0],s=n[1],i=this.document.screen.viewPort;switch(!0){case this.isString(/vmin$/):return this.getNumber()/100*Math.min(i.computeSize("x"),i.computeSize("y"));case this.isString(/vmax$/):return this.getNumber()/100*Math.max(i.computeSize("x"),i.computeSize("y"));case this.isString(/vw$/):return this.getNumber()/100*i.computeSize("x");case this.isString(/vh$/):return this.getNumber()/100*i.computeSize("y");case this.isString(/rem$/):return this.getNumber()*this.getRem();case this.isString(/em$/):return this.getNumber()*this.getEm();case this.isString(/ex$/):return this.getNumber()*this.getEm()/2;case this.isString(/px$/):return this.getNumber();case this.isString(/pt$/):return this.getNumber()*this.getDpi()*(1/72);case this.isString(/pc$/):return 15*this.getNumber();case this.isString(/cm$/):return this.getNumber()*this.getDpi()/2.54;case this.isString(/mm$/):return this.getNumber()*this.getDpi()/25.4;case this.isString(/in$/):return this.getNumber()*this.getDpi();case this.isString(/%$/)&&s:return this.getNumber()*this.getEm();case this.isString(/%$/):return this.getNumber()*i.computeSize(o);default:var a=this.getNumber();return t&&a<1?a*i.computeSize(o):a}}},{key:"getMilliseconds",value:function(){return this.hasValue()?this.isString(/ms$/)?this.getNumber():1e3*this.getNumber():0}},{key:"getRadians",value:function(){if(!this.hasValue())return 0;switch(!0){case this.isString(/deg$/):return this.getNumber()*(Math.PI/180);case this.isString(/grad$/):return this.getNumber()*(Math.PI/200);case this.isString(/rad$/):return this.getNumber();default:return this.getNumber()*(Math.PI/180)}}},{key:"getDefinition",value:function(){var e=this.getString(),t=e.match(/#([^\)'"]+)/);return t&&(t=t[1]),t||(t=e),this.document.definitions[t]}},{key:"getFillStyleDefinition",value:function(e,t){var r=this.getDefinition();if(!r)return null;if("function"==typeof r.createGradient)return r.createGradient(this.document.ctx,e,t);if("function"==typeof r.createPattern){if(r.getHrefAttribute().hasValue()){var n=r.getAttribute("patternTransform");r=r.getHrefAttribute().getDefinition(),n.hasValue()&&r.getAttribute("patternTransform",!0).setValue(n.value)}return r.createPattern(this.document.ctx,e,t)}return null}},{key:"getTextBaseline",value:function(){return this.hasValue()?e.textBaselineMapping[this.getString()]:null}},{key:"addOpacity",value:function(t){for(var r=this.getColor(),n=r.length,o=0,s=0;s1&&void 0!==arguments[1]?arguments[1]:0,n=Ke(t),o=(0,u.default)(n,2),s=o[0],i=void 0===s?r:s,a=o[1],A=void 0===a?r:a;return new e(i,A)}},{key:"parseScale",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=Ke(t),o=(0,u.default)(n,2),s=o[0],i=void 0===s?r:s,a=o[1],A=void 0===a?i:a;return new e(i,A)}},{key:"parsePath",value:function(t){for(var r=Ke(t),n=r.length,o=[],s=0;s0}},{key:"runEvents",value:function(){if(this.working){var e=this.screen,t=this.events,r=this.eventElements,n=e.ctx.canvas.style;n&&(n.cursor=""),g()(t).call(t,(function(e,t){for(var n=e.run,o=r[t];o;)n(o),o=o.parent})),this.events=[],this.eventElements=[]}}},{key:"checkPath",value:function(e,t){if(this.working&&t){var r=this.events,n=this.eventElements;g()(r).call(r,(function(r,o){var s=r.x,i=r.y;!n[o]&&t.isPointInPath&&t.isPointInPath(s,i)&&(n[o]=e)}))}}},{key:"checkBoundingBox",value:function(e,t){if(this.working&&t){var r=this.events,n=this.eventElements;g()(r).call(r,(function(r,o){var s=r.x,i=r.y;!n[o]&&t.isPointInBox(s,i)&&(n[o]=e)}))}}},{key:"mapXY",value:function(e,t){for(var r=this.screen,n=r.window,o=r.ctx,s=new mt(e,t),i=o.canvas;i;)s.x-=i.offsetLeft,s.y-=i.offsetTop,i=i.offsetParent;return n.scrollX&&(s.x+=n.scrollX),n.scrollY&&(s.y+=n.scrollY),s}},{key:"onClick",value:function(e){var t=this.mapXY((e||event).clientX,(e||event).clientY),r=t.x,n=t.y;this.events.push({type:"onclick",x:r,y:n,run:function(e){e.onClick&&e.onClick()}})}},{key:"onMouseMove",value:function(e){var t=this.mapXY((e||event).clientX,(e||event).clientY),r=t.x,n=t.y;this.events.push({type:"onmousemove",x:r,y:n,run:function(e){e.onMouseMove&&e.onMouseMove()}})}}]),e}(),yt="undefined"!=typeof window?window:null,vt="undefined"!=typeof fetch?K()(fetch).call(fetch,void 0):null,wt=function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=r.fetch,o=void 0===n?vt:n,s=r.window,i=void 0===s?yt:s;(0,Q.default)(this,e),this.ctx=t,this.FRAMERATE=30,this.MAX_VIRTUAL_PIXELS=3e4,this.CLIENT_WIDTH=800,this.CLIENT_HEIGHT=600,this.viewPort=new pt,this.mouse=new gt(this),this.animations=[],this.waits=[],this.frameDuration=0,this.isReadyLock=!1,this.isFirstRender=!0,this.intervalId=null,this.window=i,this.fetch=o}return(0,U.default)(e,[{key:"wait",value:function(e){this.waits.push(e)}},{key:"ready",value:function(){return this.readyPromise?this.readyPromise:M().resolve()}},{key:"isReady",value:function(){var e;if(this.isReadyLock)return!0;var t=k()(e=this.waits).call(e,(function(e){return e()}));return t&&(this.waits=[],this.resolveReady&&this.resolveReady()),this.isReadyLock=t,t}},{key:"setDefaults",value:function(e){e.strokeStyle="rgba(0,0,0,0)",e.lineCap="butt",e.lineJoin="miter",e.miterLimit=4}},{key:"setViewBox",value:function(e){var t=e.document,r=e.ctx,n=e.aspectRatio,o=e.width,s=e.desiredWidth,i=e.height,a=e.desiredHeight,A=e.minX,c=void 0===A?0:A,l=e.minY,f=void 0===l?0:l,d=e.refX,h=e.refY,p=e.clip,m=void 0!==p&&p,g=e.clipX,y=void 0===g?0:g,v=e.clipY,w=void 0===v?0:v,b=Re(n).replace(/^defer\s/,"").split(" "),B=(0,u.default)(b,2),j=B[0]||"xMidYMid",_=B[1]||"meet",C=o/s,x=i/a,E=Math.min(C,x),N=Math.max(C,x),F=s,Q=a;"meet"===_&&(F*=E,Q*=E),"slice"===_&&(F*=N,Q*=N);var U=new ht(t,"refX",d),S=new ht(t,"refY",h),L=U.hasValue()&&S.hasValue();if(L&&r.translate(-E*U.getPixels("x"),-E*S.getPixels("y")),m){var T=E*y,I=E*w;r.beginPath(),r.moveTo(T,I),r.lineTo(o,I),r.lineTo(o,i),r.lineTo(T,i),r.closePath(),r.clip()}if(!L){var P="meet"===_&&E===x,O="slice"===_&&N===x,H="meet"===_&&E===C,k="slice"===_&&N===C;/^xMid/.test(j)&&(P||O)&&r.translate(o/2-F/2,0),/YMid$/.test(j)&&(H||k)&&r.translate(0,i/2-Q/2),/^xMax/.test(j)&&(P||O)&&r.translate(o-F,0),/YMax$/.test(j)&&(H||k)&&r.translate(0,i-Q)}switch(!0){case"none"===j:r.scale(C,x);break;case"meet"===_:r.scale(E,E);break;case"slice"===_:r.scale(N,N)}r.translate(-c,-f)}},{key:"start",value:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=r.enableRedraw,o=void 0!==n&&n,s=r.ignoreMouse,i=void 0!==s&&s,a=r.ignoreAnimation,A=void 0!==a&&a,u=r.ignoreDimensions,c=void 0!==u&&u,l=r.ignoreClear,f=void 0!==l&&l,d=r.forceRedraw,h=r.scaleWidth,p=r.scaleHeight,m=r.offsetX,g=r.offsetY,y=this.FRAMERATE,v=this.mouse,w=1e3/y;if(this.frameDuration=w,this.readyPromise=new(M())((function(e){t.resolveReady=e})),this.isReady()&&this.render(e,c,f,h,p,m,g),o){var b=O()(),B=b,j=0,_=function r(){b=O()(),(j=b-B)>=w&&(B=b-j%w,t.shouldUpdate(A,d)&&(t.render(e,c,f,h,p,m,g),v.runEvents())),t.intervalId=V()(r)};i||v.start(),this.intervalId=V()(_)}}},{key:"stop",value:function(){this.intervalId&&(V().cancel(this.intervalId),this.intervalId=null),this.mouse.stop()}},{key:"shouldUpdate",value:function(e,t){if(!e){var r,n=this.frameDuration;if(I()(r=this.animations).call(r,(function(e,t){return t.update(n)||e}),!1))return!0}return!("function"!=typeof t||!t())||!(this.isReadyLock||!this.isReady())||!!this.mouse.hasEvents()}},{key:"render",value:function(e,t,r,n,o,s,i){var a=this.CLIENT_WIDTH,A=this.CLIENT_HEIGHT,u=this.viewPort,c=this.ctx,l=this.isFirstRender,f=c.canvas;u.clear(),f.width&&f.height?u.setCurrent(f.width,f.height):u.setCurrent(a,A);var d=e.getStyle("width"),h=e.getStyle("height");!t&&(l||"number"!=typeof n&&"number"!=typeof o)&&(d.hasValue()&&(f.width=d.getPixels("x"),f.style&&(f.style.width="".concat(f.width,"px"))),h.hasValue()&&(f.height=h.getPixels("y"),f.style&&(f.style.height="".concat(f.height,"px"))));var p=f.clientWidth||f.width,m=f.clientHeight||f.height;if(t&&d.hasValue()&&h.hasValue()&&(p=d.getPixels("x"),m=h.getPixels("y")),u.setCurrent(p,m),"number"==typeof s&&e.getAttribute("x",!0).setValue(s),"number"==typeof i&&e.getAttribute("y",!0).setValue(i),"number"==typeof n||"number"==typeof o){var g,y,v=Ke(e.getAttribute("viewBox").getString()),w=0,b=0;if("number"==typeof n){var B=e.getStyle("width");B.hasValue()?w=B.getPixels("x")/n:isNaN(v[2])||(w=v[2]/n)}if("number"==typeof o){var j=e.getStyle("height");j.hasValue()?b=j.getPixels("y")/o:isNaN(v[3])||(b=v[3]/o)}w||(w=b),b||(b=w),e.getAttribute("width",!0).setValue(n),e.getAttribute("height",!0).setValue(o);var _=e.getStyle("transform",!0,!0);_.setValue(L()(g=L()(y="".concat(_.getString()," scale(")).call(y,1/w,", ")).call(g,1/b,")"))}r||c.clearRect(0,0,p,m),e.render(c),l&&(this.isFirstRender=!1)}}]),e}();wt.defaultWindow=yt,wt.defaultFetch=vt;var bt=wt.defaultFetch,Bt="undefined"!=typeof DOMParser?DOMParser:null,jt=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=t.fetch,n=void 0===r?bt:r,o=t.DOMParser,s=void 0===o?Bt:o;(0,Q.default)(this,e),this.fetch=n,this.DOMParser=s}var t,r;return(0,U.default)(e,[{key:"parse",value:(r=(0,N.default)(E().mark((function e(t){return E().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!/^=0;r--)t[r].unapply(e)}},{key:"applyToPoint",value:function(e){for(var t=this.transforms,r=t.length,n=0;n2&&void 0!==arguments[2]&&arguments[2];if((0,Q.default)(this,e),this.document=t,this.node=r,this.captureTextNodes=i,this.attributes={},this.styles={},this.stylesSpecificity={},this.animationFrozen=!1,this.animationFrozenValue="",this.parent=null,this.children=[],r&&1===r.nodeType){if(g()(n=ae()(r.attributes)).call(n,(function(e){var r=Ve(e.nodeName);s.attributes[r]=new ht(t,r,e.value)})),this.addStylesFromStyleDefinition(),this.getAttribute("style").hasValue()){var a,c=A()(a=this.getAttribute("style").getString().split(";")).call(a,(function(e){return G()(e).call(e)}));g()(c).call(c,(function(e){var r;if(e){var n=A()(r=e.split(":")).call(r,(function(e){return G()(e).call(e)})),o=(0,u.default)(n,2),i=o[0],a=o[1];s.styles[i]=new ht(t,i,a)}}))}var l=t.definitions,f=this.getAttribute("id");f.hasValue()&&(l[f.getValue()]||(l[f.getValue()]=this)),g()(o=ae()(r.childNodes)).call(o,(function(e){if(1===e.nodeType)s.addChild(e);else if(i&&(3===e.nodeType||4===e.nodeType)){var r=t.createTextNode(e);r.getText().length>0&&s.addChild(r)}}))}}return(0,U.default)(e,[{key:"getAttribute",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.attributes[e];if(!r&&t){var n=new ht(this.document,e,"");return this.attributes[e]=n,n}return r||ht.empty(this.document)}},{key:"getHrefAttribute",value:function(){for(var e in this.attributes)if("href"===e||/:href$/.test(e))return this.attributes[e];return ht.empty(this.document)}},{key:"getStyle",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=this.styles[e];if(n)return n;var o=this.getAttribute(e);if(o&&o.hasValue())return this.styles[e]=o,o;if(!r){var s=this.parent;if(s){var i=s.getStyle(e);if(i&&i.hasValue())return i}}if(t){var a=new ht(this.document,e,"");return this.styles[e]=a,a}return n||ht.empty(this.document)}},{key:"render",value:function(e){if("none"!==this.getStyle("display").getString()&&"hidden"!==this.getStyle("visibility").getString()){if(e.save(),this.getStyle("mask").hasValue()){var t=this.getStyle("mask").getDefinition();t&&(this.applyEffects(e),t.apply(e,this))}else if("none"!==this.getStyle("filter").getValue("none")){var r=this.getStyle("filter").getDefinition();r&&(this.applyEffects(e),r.apply(e,this))}else this.setContext(e),this.renderChildren(e),this.clearContext(e);e.restore()}}},{key:"setContext",value:function(e){}},{key:"applyEffects",value:function(e){var t=Ut.fromElement(this.document,this);t&&t.apply(e);var r=this.getStyle("clip-path",!1,!0);if(r.hasValue()){var n=r.getDefinition();n&&n.apply(e)}}},{key:"clearContext",value:function(e){}},{key:"renderChildren",value:function(e){var t;g()(t=this.children).call(t,(function(t){t.render(e)}))}},{key:"addChild",value:function(t){var r,n=t instanceof e?t:this.document.createElement(t);n.parent=this,se()(r=e.ignoreChildTypes).call(r,n.type)||this.children.push(n)}},{key:"matchesSelector",value:function(e){var t,r=this.node;if("function"==typeof r.matches)return r.matches(e);var n=r.getAttribute("class");return!(!n||""===n)&&ne()(t=n.split(" ")).call(t,(function(t){if(".".concat(t)===e)return!0}))}},{key:"addStylesFromStyleDefinition",value:function(){var e=this.document,t=e.styles,r=e.stylesSpecificity;for(var n in t)if("@"!==n[0]&&this.matchesSelector(n)){var o=t[n],s=r[n];if(o)for(var i in o){var a=this.stylesSpecificity[i];void 0===a&&(a="000"),s>=a&&(this.styles[i]=o[i],this.stylesSpecificity[i]=s)}}}},{key:"removeStyles",value:function(e,t){return I()(t).call(t,(function(t,r){var n,o=e.getStyle(r);if(!o.hasValue())return t;var s=o.getString();return o.setValue(""),L()(n=[]).call(n,(0,te.default)(t),[[r,s]])}),[])}},{key:"restoreStyles",value:function(e,t){g()(t).call(t,(function(t){var r=(0,u.default)(t,2),n=r[0],o=r[1];e.getStyle(n,!0).setValue(o)}))}}]),e}();St.ignoreChildTypes=["title"];var Lt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){return(0,Q.default)(this,o),n.call(this,e,t,r)}return o}(St);function Tt(e){var t=G()(e).call(e);return/^('|")/.test(t)?t:'"'.concat(t,'"')}function It(e){if(!e)return"";var t=G()(e).call(e).toLowerCase();switch(t){case"normal":case"italic":case"oblique":case"inherit":case"initial":case"unset":return t;default:return/^oblique\s+(-|)\d+deg$/.test(t)?t:""}}function Pt(e){if(!e)return"";var t=G()(e).call(e).toLowerCase();switch(t){case"normal":case"bold":case"lighter":case"bolder":case"inherit":case"initial":case"unset":return t;default:return/^[\d.]+$/.test(t)?t:""}}var Ot=function(){function e(t,r,n,o,s,i){(0,Q.default)(this,e);var a=i?"string"==typeof i?e.parse(i):i:{};this.fontFamily=s||a.fontFamily,this.fontSize=o||a.fontSize,this.fontStyle=t||a.fontStyle,this.fontWeight=n||a.fontWeight,this.fontVariant=r||a.fontVariant}return(0,U.default)(e,[{key:"toString",value:function(){var e,t,r;return G()(e=[It(this.fontStyle),this.fontVariant,Pt(this.fontWeight),this.fontSize,(t=this.fontFamily,"undefined"==typeof process?t:A()(r=G()(t).call(t).split(",")).call(r,Tt).join(","))].join(" ")).call(e)}}],[{key:"parse",value:function(){var t,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1?arguments[1]:void 0,o="",s="",i="",a="",A="",c=G()(t=Re(r)).call(t).split(" "),l={fontSize:!1,fontStyle:!1,fontWeight:!1,fontVariant:!1};return g()(c).call(c,(function(t){var r,n,c;switch(!0){case!l.fontStyle&&se()(r=e.styles).call(r,t):"inherit"!==t&&(o=t),l.fontStyle=!0;break;case!l.fontVariant&&se()(n=e.variants).call(n,t):"inherit"!==t&&(s=t),l.fontStyle=!0,l.fontVariant=!0;break;case!l.fontWeight&&se()(c=e.weights).call(c,t):"inherit"!==t&&(i=t),l.fontStyle=!0,l.fontVariant=!0,l.fontWeight=!0;break;case!l.fontSize:if("inherit"!==t){var f=t.split("/"),d=(0,u.default)(f,1);a=d[0]}l.fontStyle=!0,l.fontVariant=!0,l.fontWeight=!0,l.fontSize=!0;break;default:"inherit"!==t&&(A+=t)}})),new e(o,s,i,a,A,n)}}]),e}();Ot.styles="normal|italic|oblique|inherit",Ot.variants="normal|small-caps|inherit",Ot.weights="normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit";var Ht=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Number.NaN,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.NaN,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Number.NaN,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:Number.NaN;(0,Q.default)(this,e),this.x1=t,this.y1=r,this.x2=n,this.y2=o,this.addPoint(t,r),this.addPoint(n,o)}return(0,U.default)(e,[{key:"addPoint",value:function(e,t){void 0!==e&&((isNaN(this.x1)||isNaN(this.x2))&&(this.x1=e,this.x2=e),ethis.x2&&(this.x2=e)),void 0!==t&&((isNaN(this.y1)||isNaN(this.y2))&&(this.y1=t,this.y2=t),tthis.y2&&(this.y2=t))}},{key:"addX",value:function(e){this.addPoint(e,null)}},{key:"addY",value:function(e){this.addPoint(null,e)}},{key:"addBoundingBox",value:function(e){if(e){var t=e.x1,r=e.y1,n=e.x2,o=e.y2;this.addPoint(t,r),this.addPoint(n,o)}}},{key:"sumCubic",value:function(e,t,r,n,o){return Math.pow(1-e,3)*t+3*Math.pow(1-e,2)*e*r+3*(1-e)*Math.pow(e,2)*n+Math.pow(e,3)*o}},{key:"bezierCurveAdd",value:function(e,t,r,n,o){var s=6*t-12*r+6*n,i=-3*t+9*r-9*n+3*o,a=3*r-3*t;if(0!==i){var A=Math.pow(s,2)-4*a*i;if(!(A<0)){var u=(-s+Math.sqrt(A))/(2*i);01&&void 0!==arguments[1]&&arguments[1];if(!t){var r=this.getStyle("fill"),n=this.getStyle("fill-opacity"),o=this.getStyle("stroke"),s=this.getStyle("stroke-opacity");if(r.isUrlDefinition()){var i=r.getFillStyleDefinition(this,n);i&&(e.fillStyle=i)}else if(r.hasValue()){"currentColor"===r.getString()&&r.setValue(this.getStyle("color").getColor());var a=r.getColor();"inherit"!==a&&(e.fillStyle="none"===a?"rgba(0,0,0,0)":a)}if(n.hasValue()){var A=new ht(this.document,"fill",e.fillStyle).addOpacity(n).getColor();e.fillStyle=A}if(o.isUrlDefinition()){var u=o.getFillStyleDefinition(this,s);u&&(e.strokeStyle=u)}else if(o.hasValue()){"currentColor"===o.getString()&&o.setValue(this.getStyle("color").getColor());var c=o.getString();"inherit"!==c&&(e.strokeStyle="none"===c?"rgba(0,0,0,0)":c)}if(s.hasValue()){var l=new ht(this.document,"stroke",e.strokeStyle).addOpacity(s).getString();e.strokeStyle=l}var f=this.getStyle("stroke-width");if(f.hasValue()){var d=f.getPixels();e.lineWidth=d||nt}var h=this.getStyle("stroke-linecap"),p=this.getStyle("stroke-linejoin"),m=this.getStyle("stroke-miterlimit"),g=this.getStyle("paint-order"),y=this.getStyle("stroke-dasharray"),v=this.getStyle("stroke-dashoffset");if(h.hasValue()&&(e.lineCap=h.getString()),p.hasValue()&&(e.lineJoin=p.getString()),m.hasValue()&&(e.miterLimit=m.getNumber()),g.hasValue()&&(e.paintOrder=g.getValue()),y.hasValue()&&"none"!==y.getString()){var w=Ke(y.getString());void 0!==e.setLineDash?e.setLineDash(w):void 0!==e.webkitLineDash?e.webkitLineDash=w:void 0===e.mozDash||1===w.length&&0===w[0]||(e.mozDash=w);var b=v.getPixels();void 0!==e.lineDashOffset?e.lineDashOffset=b:void 0!==e.webkitLineDashOffset?e.webkitLineDashOffset=b:void 0!==e.mozDashOffset&&(e.mozDashOffset=b)}}if(this.modifiedEmSizeStack=!1,void 0!==e.font){var B=this.getStyle("font"),j=this.getStyle("font-style"),_=this.getStyle("font-variant"),C=this.getStyle("font-weight"),x=this.getStyle("font-size"),E=this.getStyle("font-family"),N=new Ot(j.getString(),_.getString(),C.getString(),x.hasValue()?"".concat(x.getPixels(!0),"px"):"",E.getString(),Ot.parse(B.getString(),e.font));j.setValue(N.fontStyle),_.setValue(N.fontVariant),C.setValue(N.fontWeight),x.setValue(N.fontSize),E.setValue(N.fontFamily),e.font=N.toString(),x.isPixels()&&(this.document.emSize=x.getPixels(),this.modifiedEmSizeStack=!0)}t||(this.applyEffects(e),e.globalAlpha=this.calculateOpacity())}},{key:"clearContext",value:function(e){(0,fe.default)((0,ee.default)(o.prototype),"clearContext",this).call(this,e),this.modifiedEmSizeStack&&this.document.popEmSize()}}]),o}(St);var Rt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s;return(0,Q.default)(this,o),(s=n.call(this,e,t,(this instanceof o?this.constructor:void 0)===o||r)).type="text",s.x=0,s.y=0,s.measureCache=-1,s}return(0,U.default)(o,[{key:"setContext",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];(0,fe.default)((0,ee.default)(o.prototype),"setContext",this).call(this,e,t);var r=this.getStyle("dominant-baseline").getTextBaseline()||this.getStyle("alignment-baseline").getTextBaseline();r&&(e.textBaseline=r)}},{key:"initializeCoordinates",value:function(e){this.x=this.getAttribute("x").getPixels("x"),this.y=this.getAttribute("y").getPixels("y");var t=this.getAttribute("dx"),r=this.getAttribute("dy");t.hasValue()&&(this.x+=t.getPixels("x")),r.hasValue()&&(this.y+=r.getPixels("y")),this.x+=this.getAnchorDelta(e,this,0)}},{key:"getBoundingBox",value:function(e){var t,r=this;if("text"!==this.type)return this.getTElementBoundingBox(e);this.initializeCoordinates(e);var n=null;return g()(t=this.children).call(t,(function(t,o){var s=r.getChildBoundingBox(e,r,r,o);n?n.addBoundingBox(s):n=s})),n}},{key:"getFontSize",value:function(){var e=this.document,t=this.parent,r=Ot.parse(e.ctx.font).fontSize;return t.getStyle("font-size").getNumber(r)}},{key:"getTElementBoundingBox",value:function(e){var t=this.getFontSize();return new Ht(this.x,this.y-t,this.x+this.measureText(e),this.y)}},{key:"getGlyph",value:function(e,t,r){var n=t[r],o=null;if(e.isArabic){var s=t.length,i=t[r-1],a=t[r+1],A="isolated";(0===r||" "===i)&&r0&&" "!==i&&r0&&" "!==i&&(r===s-1||" "===a)&&(A="initial"),void 0!==e.glyphs[n]&&((o=e.glyphs[n][A])||"glyph"!==e.glyphs[n].type||(o=e.glyphs[n]))}else o=e.glyphs[n];return o||(o=e.missingGlyph),o}},{key:"getText",value:function(){return""}},{key:"getTextFromNode",value:function(e){var t=e||this.node,r=ae()(t.parentNode.childNodes),n=le()(r).call(r,t),o=r.length-1,s=Re(t.value||t.text||t.textContent||"");return 0===n&&(s=Me(s)),n===o&&(s=De(s)),s}},{key:"renderChildren",value:function(e){var t,r=this;if("text"===this.type){this.initializeCoordinates(e),g()(t=this.children).call(t,(function(t,n){r.renderChild(e,r,r,n)}));var n=this.document.screen.mouse;n.isWorking()&&n.checkBoundingBox(this,this.getBoundingBox(e))}else this.renderTElementChildren(e)}},{key:"renderTElementChildren",value:function(e){var t=this.document,r=this.parent,n=this.getText(),o=r.getStyle("font-family").getDefinition();if(o)for(var s,i=o.fontFace.unitsPerEm,a=Ot.parse(t.ctx.font),A=r.getStyle("font-size").getNumber(a.fontSize),u=r.getStyle("font-style").getString(a.fontStyle),c=A/i,l=o.isRTL?ue()(s=n.split("")).call(s).join(""):n,f=Ke(r.getAttribute("dx").getString()),d=l.length,h=0;hr&&i.getAttribute("x").hasValue()||i.getAttribute("text-anchor").hasValue()));A++)a+=i.measureTextRecursive(e);return-1*("end"===n?a:a/2)}return 0}},{key:"adjustChildCoordinates",value:function(e,t,r,n){var o=r.children[n];if("function"!=typeof o.measureText)return o;e.save(),o.setContext(e,!0);var s=o.getAttribute("x"),i=o.getAttribute("y"),a=o.getAttribute("dx"),A=o.getAttribute("dy"),u=o.getAttribute("text-anchor").getString("start");if(0===n&&"textNode"!==o.type&&(s.hasValue()||s.setValue(t.getAttribute("x").getValue("0")),i.hasValue()||i.setValue(t.getAttribute("y").getValue("0")),a.hasValue()||a.setValue(t.getAttribute("dx").getValue("0")),A.hasValue()||A.setValue(t.getAttribute("dy").getValue("0"))),s.hasValue()){if(o.x=s.getPixels("x")+t.getAnchorDelta(e,r,n),"start"!==u){var c=o.measureTextRecursive(e);o.x+=-1*("end"===u?c:c/2)}a.hasValue()&&(o.x+=a.getPixels("x"))}else{if("start"!==u){var l=o.measureTextRecursive(e);t.x+=-1*("end"===u?l:l/2)}a.hasValue()&&(t.x+=a.getPixels("x")),o.x=t.x}return t.x=o.x+o.measureText(e),i.hasValue()?(o.y=i.getPixels("y"),A.hasValue()&&(o.y+=A.getPixels("y"))):(A.hasValue()&&(t.y+=A.getPixels("y")),o.y=t.y),t.y=o.y,o.clearContext(e),e.restore(),o}},{key:"getChildBoundingBox",value:function(e,t,r,n){var o,s=this.adjustChildCoordinates(e,t,r,n);if("function"!=typeof s.getBoundingBox)return null;var i=s.getBoundingBox(e);return i?(g()(o=s.children).call(o,(function(r,n){var o=t.getChildBoundingBox(e,t,s,n);i.addBoundingBox(o)})),i):null}},{key:"renderChild",value:function(e,t,r,n){var o,s=this.adjustChildCoordinates(e,t,r,n);s.render(e),g()(o=s.children).call(o,(function(r,n){t.renderChild(e,t,s,n)}))}},{key:"measureTextRecursive",value:function(e){var t;return I()(t=this.children).call(t,(function(t,r){return t+r.measureTextRecursive(e)}),this.measureText(e))}},{key:"measureText",value:function(e){var t=this.measureCache;if(~t)return t;var r=this.getText(),n=this.measureTargetText(e,r);return this.measureCache=n,n}},{key:"measureTargetText",value:function(e,t){if(!t.length)return 0;var r=this.parent,n=r.getStyle("font-family").getDefinition();if(n){for(var o,s=this.getFontSize(),i=n.isRTL?ue()(o=t.split("")).call(o).join(""):t,a=Ke(r.getAttribute("dx").getString()),A=i.length,u=0,c=0;c0?"":s.getTextFromNode(),s}return(0,U.default)(o,[{key:"getText",value:function(){return this.text}}]),o}(Rt);var Dt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="textNode",e}return o}(Mt);var Kt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e){var t;return(0,Q.default)(this,o),(t=n.call(this,e.replace(/[+-.]\s+/g,"-").replace(/[^MmZzLlHhVvCcSsQqTtAae\d\s.,+-].*/g,""))).control=null,t.start=null,t.current=null,t.command=null,t.commands=t.commands,t.i=-1,t.previousCommand=null,t.points=[],t.angles=[],t}return(0,U.default)(o,[{key:"reset",value:function(){this.i=-1,this.command=null,this.previousCommand=null,this.start=new mt(0,0),this.control=new mt(0,0),this.current=new mt(0,0),this.points=[],this.angles=[]}},{key:"isEnd",value:function(){return this.i>=this.commands.length-1}},{key:"next",value:function(){var e=this.commands[++this.i];return this.previousCommand=this.command,this.command=e,e}},{key:"getPoint",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"x",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"y",r=new mt(this.command[e],this.command[t]);return this.makeAbsolute(r)}},{key:"getAsControlPoint",value:function(e,t){var r=this.getPoint(e,t);return this.control=r,r}},{key:"getAsCurrentPoint",value:function(e,t){var r=this.getPoint(e,t);return this.current=r,r}},{key:"getReflectedControlPoint",value:function(){var e=this.previousCommand.type;if(e!==pe.SVGPathData.CURVE_TO&&e!==pe.SVGPathData.SMOOTH_CURVE_TO&&e!==pe.SVGPathData.QUAD_TO&&e!==pe.SVGPathData.SMOOTH_QUAD_TO)return this.current;var t=this.current,r=t.x,n=t.y,o=this.control,s=o.x,i=o.y;return new mt(2*r-s,2*n-i)}},{key:"makeAbsolute",value:function(e){if(this.command.relative){var t=this.current,r=t.x,n=t.y;e.x+=r,e.y+=n}return e}},{key:"addMarker",value:function(e,t,r){var n=this.points,o=this.angles;r&&o.length>0&&!o[o.length-1]&&(o[o.length-1]=n[n.length-1].angleTo(r)),this.addMarkerAngle(e,t?t.angleTo(e):null)}},{key:"addMarkerAngle",value:function(e,t){this.points.push(e),this.angles.push(t)}},{key:"getMarkerPoints",value:function(){return this.points}},{key:"getMarkerAngles",value:function(){for(var e=this.angles,t=e.length,r=0;ra?i:a,g=i>a?1:i/a,y=i>a?a/i:1;e.translate(c.x,c.y),e.rotate(u),e.scale(g,y),e.arc(0,0,m,l,l+f,Boolean(1-A)),e.scale(1/g,1/y),e.rotate(-u),e.translate(-c.x,-c.y)}}},{key:"pathZ",value:function(e,t){o.pathZ(this.pathParser),e&&t.x1!==t.x2&&t.y1!==t.y2&&e.closePath()}}],[{key:"pathM",value:function(e){var t=e.getAsCurrentPoint();return e.start=e.current,{point:t}}},{key:"pathL",value:function(e){return{current:e.current,point:e.getAsCurrentPoint()}}},{key:"pathH",value:function(e){var t=e.current,r=e.command,n=new mt((r.relative?t.x:0)+r.x,t.y);return e.current=n,{current:t,point:n}}},{key:"pathV",value:function(e){var t=e.current,r=e.command,n=new mt(t.x,(r.relative?t.y:0)+r.y);return e.current=n,{current:t,point:n}}},{key:"pathC",value:function(e){return{current:e.current,point:e.getPoint("x1","y1"),controlPoint:e.getAsControlPoint("x2","y2"),currentPoint:e.getAsCurrentPoint()}}},{key:"pathS",value:function(e){return{current:e.current,point:e.getReflectedControlPoint(),controlPoint:e.getAsControlPoint("x2","y2"),currentPoint:e.getAsCurrentPoint()}}},{key:"pathQ",value:function(e){return{current:e.current,controlPoint:e.getAsControlPoint("x1","y1"),currentPoint:e.getAsCurrentPoint()}}},{key:"pathT",value:function(e){var t=e.current,r=e.getReflectedControlPoint();return e.control=r,{current:t,controlPoint:r,currentPoint:e.getAsCurrentPoint()}}},{key:"pathA",value:function(e){var t=e.current,r=e.command,n=r.rX,o=r.rY,s=r.xRot,i=r.lArcFlag,a=r.sweepFlag,A=s*(Math.PI/180),u=e.getAsCurrentPoint(),c=new mt(Math.cos(A)*(t.x-u.x)/2+Math.sin(A)*(t.y-u.y)/2,-Math.sin(A)*(t.x-u.x)/2+Math.cos(A)*(t.y-u.y)/2),l=Math.pow(c.x,2)/Math.pow(n,2)+Math.pow(c.y,2)/Math.pow(o,2);l>1&&(n*=Math.sqrt(l),o*=Math.sqrt(l));var f=(i===a?-1:1)*Math.sqrt((Math.pow(n,2)*Math.pow(o,2)-Math.pow(n,2)*Math.pow(c.y,2)-Math.pow(o,2)*Math.pow(c.x,2))/(Math.pow(n,2)*Math.pow(c.y,2)+Math.pow(o,2)*Math.pow(c.x,2)));isNaN(f)&&(f=0);var d=new mt(f*n*c.y/o,f*-o*c.x/n),h=new mt((t.x+u.x)/2+Math.cos(A)*d.x-Math.sin(A)*d.y,(t.y+u.y)/2+Math.sin(A)*d.x+Math.cos(A)*d.y),p=it([1,0],[(c.x-d.x)/n,(c.y-d.y)/o]),m=[(c.x-d.x)/n,(c.y-d.y)/o],g=[(-c.x-d.x)/n,(-c.y-d.y)/o],y=it(m,g);return st(m,g)<=-1&&(y=Math.PI),st(m,g)>=1&&(y=0),{currentPoint:u,rX:n,rY:o,sweepFlag:a,xAxisRotation:A,centp:h,a1:p,ad:y}}},{key:"pathZ",value:function(e){e.current=e.start}}]),o}(kt);var Vt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="svg",e.root=!1,e}return(0,U.default)(o,[{key:"setContext",value:function(e){var t=this.document,r=t.screen,n=t.window,s=e.canvas;if(r.setDefaults(e),s.style&&void 0!==e.font&&n&&void 0!==n.getComputedStyle){e.font=n.getComputedStyle(s).getPropertyValue("font");var i=new ht(t,"fontSize",Ot.parse(e.font).fontSize);i.hasValue()&&(t.rootEmSize=i.getPixels("y"),t.emSize=t.rootEmSize)}this.getAttribute("x").hasValue()||this.getAttribute("x",!0).setValue(0),this.getAttribute("y").hasValue()||this.getAttribute("y",!0).setValue(0);var a=r.viewPort,A=a.width,u=a.height;this.getStyle("width").hasValue()||this.getStyle("width",!0).setValue("100%"),this.getStyle("height").hasValue()||this.getStyle("height",!0).setValue("100%"),this.getStyle("color").hasValue()||this.getStyle("color",!0).setValue("black");var c=this.getAttribute("refX"),l=this.getAttribute("refY"),f=this.getAttribute("viewBox"),d=f.hasValue()?Ke(f.getString()):null,h=!this.root&&"visible"!==this.getStyle("overflow").getValue("hidden"),p=0,m=0,g=0,y=0;d&&(p=d[0],m=d[1]),this.root||(A=this.getStyle("width").getPixels("x"),u=this.getStyle("height").getPixels("y"),"marker"===this.type&&(g=p,y=m,p=0,m=0)),r.viewPort.setCurrent(A,u),this.node&&this.getStyle("transform",!1,!0).hasValue()&&!this.getStyle("transform-origin",!1,!0).hasValue()&&this.getStyle("transform-origin",!0,!0).setValue("50% 50%"),(0,fe.default)((0,ee.default)(o.prototype),"setContext",this).call(this,e),e.translate(this.getAttribute("x").getPixels("x"),this.getAttribute("y").getPixels("y")),d&&(A=d[2],u=d[3]),t.setViewBox({ctx:e,aspectRatio:this.getAttribute("preserveAspectRatio").getString(),width:r.viewPort.width,desiredWidth:A,height:r.viewPort.height,desiredHeight:u,minX:p,minY:m,refX:c.getValue(),refY:l.getValue(),clip:h,clipX:g,clipY:y}),d&&(r.viewPort.removeCurrent(),r.viewPort.setCurrent(A,u))}},{key:"clearContext",value:function(e){(0,fe.default)((0,ee.default)(o.prototype),"clearContext",this).call(this,e),this.document.screen.viewPort.removeCurrent()}},{key:"resize",value:function(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.getAttribute("width",!0),s=this.getAttribute("height",!0),i=this.getAttribute("viewBox"),a=this.getAttribute("style"),A=o.getNumber(0),u=s.getNumber(0);if(n)if("string"==typeof n)this.getAttribute("preserveAspectRatio",!0).setValue(n);else{var c=this.getAttribute("preserveAspectRatio");c.hasValue()&&c.setValue(c.getString().replace(/^\s*(\S.*\S)\s*$/,"$1"))}if(o.setValue(e),s.setValue(r),i.hasValue()||i.setValue(L()(t="0 0 ".concat(A||e," ")).call(t,u||r)),a.hasValue()){var l=this.getStyle("width"),f=this.getStyle("height");l.hasValue()&&l.setValue("".concat(e,"px")),f.hasValue()&&f.setValue("".concat(r,"px"))}}}]),o}(kt);var qt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="rect",e}return(0,U.default)(o,[{key:"path",value:function(e){var t=this.getAttribute("x").getPixels("x"),r=this.getAttribute("y").getPixels("y"),n=this.getStyle("width",!1,!0).getPixels("x"),o=this.getStyle("height",!1,!0).getPixels("y"),s=this.getAttribute("rx"),i=this.getAttribute("ry"),a=s.getPixels("x"),A=i.getPixels("y");if(s.hasValue()&&!i.hasValue()&&(A=a),i.hasValue()&&!s.hasValue()&&(a=A),a=Math.min(a,n/2),A=Math.min(A,o/2),e){var u=(Math.sqrt(2)-1)/3*4;e.beginPath(),o>0&&n>0&&(e.moveTo(t+a,r),e.lineTo(t+n-a,r),e.bezierCurveTo(t+n-a+u*a,r,t+n,r+A-u*A,t+n,r+A),e.lineTo(t+n,r+o-A),e.bezierCurveTo(t+n,r+o-A+u*A,t+n-a+u*a,r+o,t+n-a,r+o),e.lineTo(t+a,r+o),e.bezierCurveTo(t+a-u*a,r+o,t,r+o-A+u*A,t,r+o-A),e.lineTo(t,r+A),e.bezierCurveTo(t,r+A-u*A,t+a-u*a,r,t+a,r),e.closePath())}return new Ht(t,r,t+n,r+o)}},{key:"getMarkers",value:function(){return null}}]),o}(zt);var Gt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="circle",e}return(0,U.default)(o,[{key:"path",value:function(e){var t=this.getAttribute("cx").getPixels("x"),r=this.getAttribute("cy").getPixels("y"),n=this.getAttribute("r").getPixels();return e&&n>0&&(e.beginPath(),e.arc(t,r,n,0,2*Math.PI,!1),e.closePath()),new Ht(t-n,r-n,t+n,r+n)}},{key:"getMarkers",value:function(){return null}}]),o}(zt);var Xt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="ellipse",e}return(0,U.default)(o,[{key:"path",value:function(e){var t=(Math.sqrt(2)-1)/3*4,r=this.getAttribute("rx").getPixels("x"),n=this.getAttribute("ry").getPixels("y"),o=this.getAttribute("cx").getPixels("x"),s=this.getAttribute("cy").getPixels("y");return e&&r>0&&n>0&&(e.beginPath(),e.moveTo(o+r,s),e.bezierCurveTo(o+r,s+t*n,o+t*r,s+n,o,s+n),e.bezierCurveTo(o-t*r,s+n,o-r,s+t*n,o-r,s),e.bezierCurveTo(o-r,s-t*n,o-t*r,s-n,o,s-n),e.bezierCurveTo(o+t*r,s-n,o+r,s-t*n,o+r,s),e.closePath()),new Ht(o-r,s-n,o+r,s+n)}},{key:"getMarkers",value:function(){return null}}]),o}(zt);var Wt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="line",e}return(0,U.default)(o,[{key:"getPoints",value:function(){return[new mt(this.getAttribute("x1").getPixels("x"),this.getAttribute("y1").getPixels("y")),new mt(this.getAttribute("x2").getPixels("x"),this.getAttribute("y2").getPixels("y"))]}},{key:"path",value:function(e){var t=this.getPoints(),r=(0,u.default)(t,2),n=r[0],o=n.x,s=n.y,i=r[1],a=i.x,A=i.y;return e&&(e.beginPath(),e.moveTo(o,s),e.lineTo(a,A)),new Ht(o,s,a,A)}},{key:"getMarkers",value:function(){var e=this.getPoints(),t=(0,u.default)(e,2),r=t[0],n=t[1],o=r.angleTo(n);return[[r,o],[n,o]]}}]),o}(zt);var Jt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s;return(0,Q.default)(this,o),(s=n.call(this,e,t,r)).type="polyline",s.points=[],s.points=mt.parsePath(s.getAttribute("points").getString()),s}return(0,U.default)(o,[{key:"path",value:function(e){var t=this.points,r=(0,u.default)(t,1)[0],n=r.x,o=r.y,s=new Ht(n,o);return e&&(e.beginPath(),e.moveTo(n,o)),g()(t).call(t,(function(t){var r=t.x,n=t.y;s.addPoint(r,n),e&&e.lineTo(r,n)})),s}},{key:"getMarkers",value:function(){var e=this.points,t=e.length-1,r=[];return g()(e).call(e,(function(n,o){o!==t&&r.push([n,n.angleTo(e[o+1])])})),r.length>0&&r.push([e[e.length-1],r[r.length-1][1]]),r}}]),o}(zt);var Yt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="polygon",e}return(0,U.default)(o,[{key:"path",value:function(e){var t=(0,fe.default)((0,ee.default)(o.prototype),"path",this).call(this,e),r=(0,u.default)(this.points,1)[0],n=r.x,s=r.y;return e&&(e.lineTo(n,s),e.closePath()),t}}]),o}(Jt);var Zt=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="pattern",e}return(0,U.default)(o,[{key:"createPattern",value:function(e,t,r){var n=this.getStyle("width").getPixels("x",!0),o=this.getStyle("height").getPixels("y",!0),s=new Vt(this.document,null);s.attributes.viewBox=new ht(this.document,"viewBox",this.getAttribute("viewBox").getValue()),s.attributes.width=new ht(this.document,"width","".concat(n,"px")),s.attributes.height=new ht(this.document,"height","".concat(o,"px")),s.attributes.transform=new ht(this.document,"transform",this.getAttribute("patternTransform").getValue()),s.children=this.children;var i=this.document.createCanvas(n,o),a=i.getContext("2d"),A=this.getAttribute("x"),u=this.getAttribute("y");A.hasValue()&&u.hasValue()&&a.translate(A.getPixels("x",!0),u.getPixels("y",!0)),r.hasValue()?this.styles["fill-opacity"]=r:ge()(this.styles,"fill-opacity");for(var c=-1;c<=1;c++)for(var l=-1;l<=1;l++)a.save(),s.attributes.x=new ht(this.document,"x",c*i.width),s.attributes.y=new ht(this.document,"y",l*i.height),s.render(a),a.restore();return e.createPattern(i,"repeat")}}]),o}(St);var $t=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="marker",e}return(0,U.default)(o,[{key:"render",value:function(e,t,r){if(t){var n=t.x,o=t.y,s=this.getAttribute("orient").getValue("auto"),i=this.getAttribute("markerUnits").getValue("strokeWidth");e.translate(n,o),"auto"===s&&e.rotate(r),"strokeWidth"===i&&e.scale(e.lineWidth,e.lineWidth),e.save();var a=new Vt(this.document,null);a.type=this.type,a.attributes.viewBox=new ht(this.document,"viewBox",this.getAttribute("viewBox").getValue()),a.attributes.refX=new ht(this.document,"refX",this.getAttribute("refX").getValue()),a.attributes.refY=new ht(this.document,"refY",this.getAttribute("refY").getValue()),a.attributes.width=new ht(this.document,"width",this.getAttribute("markerWidth").getValue()),a.attributes.height=new ht(this.document,"height",this.getAttribute("markerHeight").getValue()),a.attributes.overflow=new ht(this.document,"overflow",this.getAttribute("overflow").getValue()),a.attributes.fill=new ht(this.document,"fill",this.getAttribute("fill").getColor("black")),a.attributes.stroke=new ht(this.document,"stroke",this.getAttribute("stroke").getValue("none")),a.children=this.children,a.render(e),e.restore(),"strokeWidth"===i&&e.scale(1/e.lineWidth,1/e.lineWidth),"auto"===s&&e.rotate(-r),e.translate(-n,-o)}}}]),o}(St);var er=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="defs",e}return(0,U.default)(o,[{key:"render",value:function(){}}]),o}(St);var tr=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="g",e}return(0,U.default)(o,[{key:"getBoundingBox",value:function(e){var t,r=new Ht;return g()(t=this.children).call(t,(function(t){r.addBoundingBox(t.getBoundingBox(e))})),r}}]),o}(kt);var rr=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s;(0,Q.default)(this,o),(s=n.call(this,e,t,r)).attributesToInherit=["gradientUnits"],s.stops=[];var i=(0,ye.default)(s),a=i.stops,A=i.children;return g()(A).call(A,(function(e){"stop"===e.type&&a.push(e)})),s}return(0,U.default)(o,[{key:"getGradientUnits",value:function(){return this.getAttribute("gradientUnits").getString("objectBoundingBox")}},{key:"createGradient",value:function(e,t,r){var n=this,o=this;this.getHrefAttribute().hasValue()&&(o=this.getHrefAttribute().getDefinition(),this.inheritStopContainer(o));var s=o.stops,i=this.getGradient(e,t);if(!i)return this.addParentOpacity(r,s[s.length-1].color);if(g()(s).call(s,(function(e){i.addColorStop(e.offset,n.addParentOpacity(r,e.color))})),this.getAttribute("gradientTransform").hasValue()){var a=this.document,A=a.screen,c=A.MAX_VIRTUAL_PIXELS,l=A.viewPort,f=(0,u.default)(l.viewPorts,1)[0],d=new qt(a,null);d.attributes.x=new ht(a,"x",-c/3),d.attributes.y=new ht(a,"y",-c/3),d.attributes.width=new ht(a,"width",c),d.attributes.height=new ht(a,"height",c);var h=new tr(a,null);h.attributes.transform=new ht(a,"transform",this.getAttribute("gradientTransform").getValue()),h.children=[d];var p=new Vt(a,null);p.attributes.x=new ht(a,"x",0),p.attributes.y=new ht(a,"y",0),p.attributes.width=new ht(a,"width",f.width),p.attributes.height=new ht(a,"height",f.height),p.children=[h];var m=a.createCanvas(f.width,f.height),y=m.getContext("2d");return y.fillStyle=i,p.render(y),y.createPattern(m,"no-repeat")}return i}},{key:"inheritStopContainer",value:function(e){var t,r=this;g()(t=this.attributesToInherit).call(t,(function(t){!r.getAttribute(t).hasValue()&&e.getAttribute(t).hasValue()&&r.getAttribute(t,!0).setValue(e.getAttribute(t).getValue())}))}},{key:"addParentOpacity",value:function(e,t){return e.hasValue()?new ht(this.document,"color",t).addOpacity(e).getColor():t}}]),o}(St);var nr=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s;return(0,Q.default)(this,o),(s=n.call(this,e,t,r)).type="linearGradient",s.attributesToInherit.push("x1","y1","x2","y2"),s}return(0,U.default)(o,[{key:"getGradient",value:function(e,t){var r="objectBoundingBox"===this.getGradientUnits(),n=r?t.getBoundingBox(e):null;if(r&&!n)return null;this.getAttribute("x1").hasValue()||this.getAttribute("y1").hasValue()||this.getAttribute("x2").hasValue()||this.getAttribute("y2").hasValue()||(this.getAttribute("x1",!0).setValue(0),this.getAttribute("y1",!0).setValue(0),this.getAttribute("x2",!0).setValue(1),this.getAttribute("y2",!0).setValue(0));var o=r?n.x+n.width*this.getAttribute("x1").getNumber():this.getAttribute("x1").getPixels("x"),s=r?n.y+n.height*this.getAttribute("y1").getNumber():this.getAttribute("y1").getPixels("y"),i=r?n.x+n.width*this.getAttribute("x2").getNumber():this.getAttribute("x2").getPixels("x"),a=r?n.y+n.height*this.getAttribute("y2").getNumber():this.getAttribute("y2").getPixels("y");return o===i&&s===a?null:e.createLinearGradient(o,s,i,a)}}]),o}(rr);var or=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s;return(0,Q.default)(this,o),(s=n.call(this,e,t,r)).type="radialGradient",s.attributesToInherit.push("cx","cy","r","fx","fy","fr"),s}return(0,U.default)(o,[{key:"getGradient",value:function(e,t){var r="objectBoundingBox"===this.getGradientUnits(),n=t.getBoundingBox(e);if(r&&!n)return null;this.getAttribute("cx").hasValue()||this.getAttribute("cx",!0).setValue("50%"),this.getAttribute("cy").hasValue()||this.getAttribute("cy",!0).setValue("50%"),this.getAttribute("r").hasValue()||this.getAttribute("r",!0).setValue("50%");var o=r?n.x+n.width*this.getAttribute("cx").getNumber():this.getAttribute("cx").getPixels("x"),s=r?n.y+n.height*this.getAttribute("cy").getNumber():this.getAttribute("cy").getPixels("y"),i=o,a=s;this.getAttribute("fx").hasValue()&&(i=r?n.x+n.width*this.getAttribute("fx").getNumber():this.getAttribute("fx").getPixels("x")),this.getAttribute("fy").hasValue()&&(a=r?n.y+n.height*this.getAttribute("fy").getNumber():this.getAttribute("fy").getPixels("y"));var A=r?(n.width+n.height)/2*this.getAttribute("r").getNumber():this.getAttribute("r").getPixels(),u=this.getAttribute("fr").getPixels();return e.createRadialGradient(i,a,u,o,s,A)}}]),o}(rr);var sr=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s;(0,Q.default)(this,o),(s=n.call(this,e,t,r)).type="stop";var i=Math.max(0,Math.min(1,s.getAttribute("offset").getNumber())),a=s.getStyle("stop-opacity"),A=s.getStyle("stop-color",!0);return""===A.getString()&&A.setValue("#000"),a.hasValue()&&(A=A.addOpacity(a)),s.offset=i,s.color=A.getColor(),s}return o}(St);var ir=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s;return(0,Q.default)(this,o),(s=n.call(this,e,t,r)).type="animate",s.duration=0,s.initialValue=null,s.initialUnits="",s.removed=!1,s.frozen=!1,e.screen.animations.push((0,ye.default)(s)),s.begin=s.getAttribute("begin").getMilliseconds(),s.maxDuration=s.begin+s.getAttribute("dur").getMilliseconds(),s.from=s.getAttribute("from"),s.to=s.getAttribute("to"),s.values=s.getAttribute("values"),we()(s).hasValue()&&we()(s).setValue(we()(s).getString().split(";")),s}return(0,U.default)(o,[{key:"getProperty",value:function(){var e=this.getAttribute("attributeType").getString(),t=this.getAttribute("attributeName").getString();return"CSS"===e?this.parent.getStyle(t,!0):this.parent.getAttribute(t,!0)}},{key:"calcValue",value:function(){var e,t=this.initialUnits,r=this.getProgress(),n=r.progress,o=r.from,s=r.to,i=o.getNumber()+(s.getNumber()-o.getNumber())*n;return"%"===t&&(i*=100),L()(e="".concat(i)).call(e,t)}},{key:"update",value:function(e){var t=this.parent,r=this.getProperty();if(this.initialValue||(this.initialValue=r.getString(),this.initialUnits=r.getUnits()),this.duration>this.maxDuration){var n=this.getAttribute("fill").getString("remove");if("indefinite"===this.getAttribute("repeatCount").getString()||"indefinite"===this.getAttribute("repeatDur").getString())this.duration=0;else if("freeze"!==n||this.frozen){if("remove"===n&&!this.removed)return this.removed=!0,r.setValue(t.animationFrozen?t.animationFrozenValue:this.initialValue),!0}else this.frozen=!0,t.animationFrozen=!0,t.animationFrozenValue=r.getString();return!1}this.duration+=e;var o=!1;if(this.begine.length)&&(t=e.length);for(var r=0,n=new Array(t);r=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,i=!0,a=!1;return{s:function(){r=_e()(e)},n:function(){var e=r.next();return i=e.done,e},e:function(e){a=!0,s=e},f:function(){try{i||null==r.return||r.return()}finally{if(a)throw s}}}}((0,ye.default)(s).children);try{for(A.s();!(i=A.n()).done;){var u=i.value;switch(u.type){case"font-face":s.fontFace=u;var c=u.getStyle("font-family");c.hasValue()&&(a[c.getString()]=(0,ye.default)(s));break;case"missing-glyph":s.missingGlyph=u;break;case"glyph":var l=u;l.arabicForm?(s.isRTL=!0,s.isArabic=!0,void 0===s.glyphs[l.unicode]&&(s.glyphs[l.unicode]={}),s.glyphs[l.unicode][l.arabicForm]=l):s.glyphs[l.unicode]=l}}}catch(e){A.e(e)}finally{A.f()}return s}return(0,U.default)(o,[{key:"render",value:function(){}}]),o}(St);var lr=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s;return(0,Q.default)(this,o),(s=n.call(this,e,t,r)).type="font-face",s.ascent=s.getAttribute("ascent").getNumber(),s.descent=s.getAttribute("descent").getNumber(),s.unitsPerEm=s.getAttribute("units-per-em").getNumber(),s}return o}(St);var fr=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="missing-glyph",e.horizAdvX=0,e}return o}(zt);var dr=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s;return(0,Q.default)(this,o),(s=n.call(this,e,t,r)).type="glyph",s.horizAdvX=s.getAttribute("horiz-adv-x").getNumber(),s.unicode=s.getAttribute("unicode").getString(),s.arabicForm=s.getAttribute("arabic-form").getString(),s}return o}(zt);var hr=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="tref",e}return(0,U.default)(o,[{key:"getText",value:function(){var e=this.getHrefAttribute().getDefinition();if(e){var t=e.children[0];if(t)return t.getText()}return""}}]),o}(Rt);var pr=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s,i;(0,Q.default)(this,o),(i=n.call(this,e,t,r)).type="a";var a=t.childNodes,A=a[0],u=a.length>0&&k()(s=ae()(a)).call(s,(function(e){return 3===e.nodeType}));return i.hasText=u,i.text=u?i.getTextFromNode(A):"",i}return(0,U.default)(o,[{key:"getText",value:function(){return this.text}},{key:"renderChildren",value:function(e){if(this.hasText){(0,fe.default)((0,ee.default)(o.prototype),"renderChildren",this).call(this,e);var t=this.document,r=this.x,n=this.y,s=t.screen.mouse,i=new ht(t,"fontSize",Ot.parse(t.ctx.font).fontSize);s.isWorking()&&s.checkBoundingBox(this,new Ht(r,n-i.getPixels("y"),r+this.measureText(e),n))}else if(this.children.length>0){var a=new tr(this.document,null);a.children=this.children,a.parent=this,a.render(e)}}},{key:"onClick",value:function(){var e=this.document.window;e&&e.open(this.getHrefAttribute().getString())}},{key:"onMouseMove",value:function(){this.document.ctx.canvas.style.cursor="pointer"}}]),o}(Rt);function mr(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);rA?a:A,p=a>A?1:a/A,m=a>A?A/a:1;e&&(e.translate(s,i),e.rotate(f),e.scale(p,m),e.arc(0,0,h,c,c+l,Boolean(1-d)),e.scale(1/p,1/m),e.rotate(-f),e.translate(-s,-i));break;case Kt.CLOSE_PATH:e&&e.closePath()}}))}},{key:"renderChildren",value:function(e){this.setTextData(e),e.save();var t=this.parent.getStyle("text-decoration").getString(),r=this.getFontSize(),n=this.glyphInfo,o=e.fillStyle;"underline"===t&&e.beginPath(),g()(n).call(n,(function(n,o){var s=n.p0,i=n.p1,a=n.rotation,A=n.text;e.save(),e.translate(s.x,s.y),e.rotate(a),e.fillStyle&&e.fillText(A,0,0),e.strokeStyle&&e.strokeText(A,0,0),e.restore(),"underline"===t&&(0===o&&e.moveTo(s.x,s.y+r/8),e.lineTo(i.x,i.y+r/5))})),"underline"===t&&(e.lineWidth=r/20,e.strokeStyle=o,e.stroke(),e.closePath()),e.restore()}},{key:"getLetterSpacingAt",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return this.letterSpacingCache[e]||0}},{key:"findSegmentToFitChar",value:function(e,t,r,n,o,s,i,a,A){var u=s,c=this.measureText(e,a);" "===a&&"justify"===t&&r-1&&(u+=this.getLetterSpacingAt(A));var l=this.textHeight/20,f=this.getEquidistantPointOnPath(u,l,0),d=this.getEquidistantPointOnPath(u+c,l,0),h={p0:f,p1:d},p=f&&d?Math.atan2(d.y-f.y,d.x-f.x):0;if(i){var m=Math.cos(Math.PI/2+p)*i,g=Math.cos(-p)*i;h.p0=yr(yr({},f),{},{x:f.x+m,y:f.y+g}),h.p1=yr(yr({},d),{},{x:d.x+m,y:d.y+g})}return{offset:u+=c,segment:h,rotation:p}}},{key:"measureText",value:function(e,t){var r=this.measuresCache,n=t||this.getText();if(r.has(n))return r.get(n);var o=this.measureTargetText(e,n);return r.set(n,o),o}},{key:"setTextData",value:function(e){var t,r=this;if(!this.glyphInfo){var n=this.getText(),o=n.split(""),s=n.split(" ").length-1,i=A()(t=this.parent.getAttribute("dx").split()).call(t,(function(e){return e.getPixels("x")})),a=this.parent.getAttribute("dy").getPixels("y"),u=this.parent.getStyle("text-anchor").getString("start"),c=this.getStyle("letter-spacing"),l=this.parent.getStyle("letter-spacing"),f=0;c.hasValue()&&"inherit"!==c.getValue()?c.hasValue()&&"initial"!==c.getValue()&&"unset"!==c.getValue()&&(f=c.getPixels()):f=l.getPixels();var d=[],h=n.length;this.letterSpacingCache=d;for(var p=0;p0&&(A-=2*Math.PI),1===o&&A<0&&(A+=2*Math.PI),[i.x,i.y,r,n,a,A,s,o]}},{key:"calcLength",value:function(e,t,r,n){var o=0,s=null,i=null,a=0;switch(r){case Kt.LINE_TO:return this.getLineLength(e,t,n[0],n[1]);case Kt.CURVE_TO:for(o=0,s=this.getPointOnCubicBezier(0,e,t,n[0],n[1],n[2],n[3],n[4],n[5]),a=.01;a<=1;a+=.01)i=this.getPointOnCubicBezier(a,e,t,n[0],n[1],n[2],n[3],n[4],n[5]),o+=this.getLineLength(s.x,s.y,i.x,i.y),s=i;return o;case Kt.QUAD_TO:for(o=0,s=this.getPointOnQuadraticBezier(0,e,t,n[0],n[1],n[2],n[3]),a=.01;a<=1;a+=.01)i=this.getPointOnQuadraticBezier(a,e,t,n[0],n[1],n[2],n[3]),o+=this.getLineLength(s.x,s.y,i.x,i.y),s=i;return o;case Kt.ARC:o=0;var A=n[4],u=n[5],c=n[4]+u,l=Math.PI/180;if(Math.abs(A-c)c;a-=l)i=this.getPointOnEllipticalArc(n[0],n[1],n[2],n[3],a,0),o+=this.getLineLength(s.x,s.y,i.x,i.y),s=i;else for(a=A+l;a5&&void 0!==arguments[5]?arguments[5]:t,i=arguments.length>6&&void 0!==arguments[6]?arguments[6]:r,a=(o-r)/(n-t+nt),A=Math.sqrt(e*e/(1+a*a));nt)return null;var o,s=function(e,t){var r;if(void 0===Qe()||null==Ne()(e)){if(xe()(e)||(r=function(e,t){var r;if(e){if("string"==typeof e)return mr(e,t);var n=Se()(r=Object.prototype.toString.call(e)).call(r,8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?ae()(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?mr(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,i=!0,a=!1;return{s:function(){r=_e()(e)},n:function(){var e=r.next();return i=e.done,e},e:function(e){a=!0,s=e},f:function(){try{i||null==r.return||r.return()}finally{if(a)throw s}}}}(this.dataArray);try{for(s.s();!(o=s.n()).done;){var i=o.value;if(!i||!(i.pathLength<5e-5||r+i.pathLength+5e-5=0&&A>l)break;n=this.getPointOnEllipticalArc(i.points[0],i.points[1],i.points[2],i.points[3],A,i.points[6]);break;case Kt.CURVE_TO:(A=a/i.pathLength)>1&&(A=1),n=this.getPointOnCubicBezier(A,i.start.x,i.start.y,i.points[0],i.points[1],i.points[2],i.points[3],i.points[4],i.points[5]);break;case Kt.QUAD_TO:(A=a/i.pathLength)>1&&(A=1),n=this.getPointOnQuadraticBezier(A,i.start.x,i.start.y,i.points[0],i.points[1],i.points[2],i.points[3])}if(n)return n;break}r+=i.pathLength}}catch(e){s.e(e)}finally{s.f()}return null}},{key:"getLineLength",value:function(e,t,r,n){return Math.sqrt((r-e)*(r-e)+(n-t)*(n-t))}},{key:"getPathLength",value:function(){var e;return-1===this.pathLength&&(this.pathLength=I()(e=this.dataArray).call(e,(function(e,t){return t.pathLength>0?e+t.pathLength:e}),0)),this.pathLength}},{key:"getPointOnCubicBezier",value:function(e,t,r,n,o,s,i,a,A){return{x:a*at(e)+s*At(e)+n*ut(e)+t*ct(e),y:A*at(e)+i*At(e)+o*ut(e)+r*ct(e)}}},{key:"getPointOnQuadraticBezier",value:function(e,t,r,n,o,s,i){return{x:s*lt(e)+n*ft(e)+t*dt(e),y:i*lt(e)+o*ft(e)+r*dt(e)}}},{key:"getPointOnEllipticalArc",value:function(e,t,r,n,o,s){var i=Math.cos(s),a=Math.sin(s),A=r*Math.cos(o),u=n*Math.sin(o);return{x:e+(A*i-u*a),y:t+(A*a+u*i)}}},{key:"buildEquidistantCache",value:function(e,t){var r=this.getPathLength(),n=t||.25,o=e||r/100;if(!this.equidistantCache||this.equidistantCache.step!==o||this.equidistantCache.precision!==n){this.equidistantCache={step:o,precision:n,points:[]};for(var s=0,i=0;i<=r;i+=n){var a=this.getPointOnPath(i),A=this.getPointOnPath(i+n);a&&A&&(s+=this.getLineLength(a.x,a.y,A.x,A.y))>=o&&(this.equidistantCache.points.push({x:a.x,y:a.y,distance:i}),s-=o)}}}},{key:"getEquidistantPointOnPath",value:function(e,t,r){if(this.buildEquidistantCache(t,r),e<0||e-this.getPathLength()>5e-5)return null;var n=Math.round(e/this.getPathLength()*(this.equidistantCache.points.length-1));return this.equidistantCache.points[n]||null}}]),o}(Rt);var wr=function(e){(0,Z.default)(i,e);var t,r,n,o,s=(n=i,o=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=(0,ee.default)(n);if(o){var r=(0,ee.default)(this).constructor;e=Y()(t,arguments,r)}else e=t.apply(this,arguments);return(0,$.default)(this,e)});function i(e,t,r){var n;(0,Q.default)(this,i),(n=s.call(this,e,t,r)).type="image",n.loaded=!1;var o=n.getHrefAttribute().getString();if(!o)return(0,$.default)(n);var a=/\.svg$/.test(o);return e.images.push((0,ye.default)(n)),a?n.loadSvg(o):n.loadImage(o),n.isSvg=a,n}return(0,U.default)(i,[{key:"loadImage",value:(r=(0,N.default)(E().mark((function e(t){var r;return E().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this.document.createImage(t);case 3:r=e.sent,this.image=r,e.next=10;break;case 7:e.prev=7,e.t0=e.catch(0),console.error('Error while loading image "'.concat(t,'":'),e.t0);case 10:this.loaded=!0;case 11:case"end":return e.stop()}}),e,this,[[0,7]])}))),function(e){return r.apply(this,arguments)})},{key:"loadSvg",value:(t=(0,N.default)(E().mark((function e(t){var r,n;return E().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this.document.fetch(t);case 3:return r=e.sent,e.next=6,r.text();case 6:n=e.sent,this.image=n,e.next=13;break;case 10:e.prev=10,e.t0=e.catch(0),console.error('Error while loading image "'.concat(t,'":'),e.t0);case 13:this.loaded=!0;case 14:case"end":return e.stop()}}),e,this,[[0,10]])}))),function(e){return t.apply(this,arguments)})},{key:"renderChildren",value:function(e){var t=this.document,r=this.image,n=this.loaded,o=this.getAttribute("x").getPixels("x"),s=this.getAttribute("y").getPixels("y"),i=this.getStyle("width").getPixels("x"),a=this.getStyle("height").getPixels("y");if(n&&r&&i&&a){if(e.save(),this.isSvg)t.canvg.forkString(e,this.image,{ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0,ignoreClear:!0,offsetX:o,offsetY:s,scaleWidth:i,scaleHeight:a}).render();else{var A=this.image;e.translate(o,s),t.setViewBox({ctx:e,aspectRatio:this.getAttribute("preserveAspectRatio").getString(),width:i,desiredWidth:A.width,height:a,desiredHeight:A.height}),this.loaded&&(void 0===A.complete||A.complete)&&e.drawImage(A,0,0)}e.restore()}}},{key:"getBoundingBox",value:function(){var e=this.getAttribute("x").getPixels("x"),t=this.getAttribute("y").getPixels("y"),r=this.getStyle("width").getPixels("x"),n=this.getStyle("height").getPixels("y");return new Ht(e,t,e+r,t+n)}}]),i}(kt);var br=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="symbol",e}return(0,U.default)(o,[{key:"render",value:function(e){}}]),o}(kt),Br=function(){function e(t){(0,Q.default)(this,e),this.document=t,this.loaded=!1,t.fonts.push(this)}var t;return(0,U.default)(e,[{key:"load",value:(t=(0,N.default)(E().mark((function e(t,r){var n,o,s,i;return E().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,o=this.document,e.next=4,o.canvg.parser.load(r);case 4:s=e.sent,i=s.getElementsByTagName("font"),g()(n=ae()(i)).call(n,(function(e){var r=o.createElement(e);o.definitions[t]=r})),e.next=12;break;case 9:e.prev=9,e.t0=e.catch(0),console.error('Error while loading font "'.concat(r,'":'),e.t0);case 12:this.loaded=!0;case 13:case"end":return e.stop()}}),e,this,[[0,9]])}))),function(e,r){return t.apply(this,arguments)})}]),e}();var jr=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s,i;(0,Q.default)(this,o),(i=n.call(this,e,t,r)).type="style";var a=Re(A()(s=ae()(t.childNodes)).call(s,(function(e){return e.data})).join("").replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm,"").replace(/@import.*;/g,"")).split("}");return g()(a).call(a,(function(t){var r=G()(t).call(t);if(r){var n=r.split("{"),o=n[0].split(","),s=n[1].split(";");g()(o).call(o,(function(t){var r=G()(t).call(t);if(r){var n=e.styles[r]||{};if(g()(s).call(s,(function(t){var r,o,s=le()(t).call(t,":"),i=G()(r=t.substr(0,s)).call(r),a=G()(o=t.substr(s+1,t.length-s)).call(o);i&&a&&(n[i]=new ht(e,i,a))})),e.styles[r]=n,e.stylesSpecificity[r]=rt(r),"@font-face"===r){var o=n["font-family"].getString().replace(/"|'/g,""),i=n.src.getString().split(",");g()(i).call(i,(function(t){if(le()(t).call(t,'format("svg")')>0){var r=qe(t);r&&new Br(e).load(o,r)}}))}}}))}})),i}return o}(St);jr.parseExternalUrl=qe;var _r=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(){var e;return(0,Q.default)(this,o),(e=n.apply(this,arguments)).type="use",e}return(0,U.default)(o,[{key:"setContext",value:function(e){(0,fe.default)((0,ee.default)(o.prototype),"setContext",this).call(this,e);var t=this.getAttribute("x"),r=this.getAttribute("y");t.hasValue()&&e.translate(t.getPixels("x"),0),r.hasValue()&&e.translate(0,r.getPixels("y"))}},{key:"path",value:function(e){var t=this.element;t&&t.path(e)}},{key:"renderChildren",value:function(e){var t=this.document,r=this.element;if(r){var n=r;if("symbol"===r.type&&((n=new Vt(t,null)).attributes.viewBox=new ht(t,"viewBox",r.getAttribute("viewBox").getString()),n.attributes.preserveAspectRatio=new ht(t,"preserveAspectRatio",r.getAttribute("preserveAspectRatio").getString()),n.attributes.overflow=new ht(t,"overflow",r.getAttribute("overflow").getString()),n.children=r.children,r.styles.opacity=new ht(t,"opacity",this.calculateOpacity())),"svg"===n.type){var o=this.getStyle("width",!1,!0),s=this.getStyle("height",!1,!0);o.hasValue()&&(n.attributes.width=new ht(t,"width",o.getString())),s.hasValue()&&(n.attributes.height=new ht(t,"height",s.getString()))}var i=n.parent;n.parent=this,n.render(e),n.parent=i}}},{key:"getBoundingBox",value:function(e){var t=this.element;return t?t.getBoundingBox(e):null}},{key:"elementTransform",value:function(){var e=this.document,t=this.element;return Ut.fromElement(e,t)}},{key:"element",get:function(){return this._element||(this._element=this.getHrefAttribute().getDefinition()),this._element}}]),o}(kt);function Cr(e,t,r,n,o,s){return e[r*n*4+4*t+s]}function xr(e,t,r,n,o,s,i){e[r*n*4+4*t+s]=i}function Er(e,t,r){return e[t]*r}function Nr(e,t,r,n){return t+Math.cos(e)*r+Math.sin(e)*n}var Fr=function(e){(0,Z.default)(o,e);var t,r,n=(t=o,r=function(){if("undefined"==typeof Reflect||!Y())return!1;if(Y().sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Y()(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,n=(0,ee.default)(t);if(r){var o=(0,ee.default)(this).constructor;e=Y()(n,arguments,o)}else e=n.apply(this,arguments);return(0,$.default)(this,e)});function o(e,t,r){var s;(0,Q.default)(this,o),(s=n.call(this,e,t,r)).type="feColorMatrix";var i=Ke(s.getAttribute("values").getString());switch(s.getAttribute("type").getString("matrix")){case"saturate":var a=i[0];i=[.213+.787*a,.715-.715*a,.072-.072*a,0,0,.213-.213*a,.715+.285*a,.072-.072*a,0,0,.213-.213*a,.715-.715*a,.072+.928*a,0,0,0,0,0,1,0,0,0,0,0,1];break;case"hueRotate":var A=i[0]*Math.PI/180;i=[Nr(A,.213,.787,-.213),Nr(A,.715,-.715,-.715),Nr(A,.072,-.072,.928),0,0,Nr(A,.213,-.213,.143),Nr(A,.715,.285,.14),Nr(A,.072,-.072,-.283),0,0,Nr(A,.213,-.213,-.787),Nr(A,.715,-.715,.715),Nr(A,.072,.928,.072),0,0,0,0,0,1,0,0,0,0,0,1];break;case"luminanceToAlpha":i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,.2125,.7154,.0721,0,0,0,0,0,0,1]}return s.matrix=i,s.includeOpacity=s.getAttribute("includeOpacity").hasValue(),s}return(0,U.default)(o,[{key:"apply",value:function(e,t,r,n,o){for(var s=this.includeOpacity,i=this.matrix,a=e.getImageData(0,0,n,o),A=0;A1&&void 0!==o[1]&&o[1],n=document.createElement("img"),r&&(n.crossOrigin="Anonymous"),e.abrupt("return",new(M())((function(e,r){n.onload=function(){e(n)},n.onerror=function(){r()},n.src=t})));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Kr=function(){function e(t){var r,n,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=o.rootEmSize,i=void 0===s?12:s,a=o.emSize,A=void 0===a?12:a,u=o.createCanvas,c=void 0===u?e.createCanvas:u,l=o.createImage,f=void 0===l?e.createImage:l,d=o.anonymousCrossOrigin;(0,Q.default)(this,e),this.canvg=t,this.definitions={},this.styles={},this.stylesSpecificity={},this.images=[],this.fonts=[],this.emSizeStack=[],this.uniqueId=0,this.screen=t.screen,this.rootEmSize=i,this.emSize=A,this.createCanvas=c,this.createImage=this.bindCreateImage(f,d),this.screen.wait(K()(r=this.isImagesLoaded).call(r,this)),this.screen.wait(K()(n=this.isFontsLoaded).call(n,this))}return(0,U.default)(e,[{key:"bindCreateImage",value:function(e,t){return"boolean"==typeof t?function(r,n){return e(r,"boolean"==typeof n?n:t)}:e}},{key:"popEmSize",value:function(){this.emSizeStack.pop()}},{key:"getUniqueId",value:function(){return"canvg".concat(++this.uniqueId)}},{key:"isImagesLoaded",value:function(){var e;return k()(e=this.images).call(e,(function(e){return e.loaded}))}},{key:"isFontsLoaded",value:function(){var e;return k()(e=this.fonts).call(e,(function(e){return e.loaded}))}},{key:"createDocumentElement",value:function(e){var t=this.createElement(e.documentElement);return t.root=!0,t.addStylesFromStyleDefinition(),this.documentElement=t,t}},{key:"createElement",value:function(t){var r=t.nodeName.replace(/^[^:]+:/,""),n=e.elementTypes[r];return void 0!==n?new n(this,t):new Lt(this,t)}},{key:"createTextNode",value:function(e){return new Dt(this,e)}},{key:"setViewBox",value:function(e){this.screen.setViewBox(function(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};(0,Q.default)(this,e),this.parser=new jt(n),this.screen=new wt(t,n),this.options=n;var o=new Kr(this,n),s=o.createDocumentElement(r);this.document=o,this.documentElement=s}var t,r;return(0,U.default)(e,[{key:"fork",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e.from(t,r,Vr(Vr({},this.options),n))}},{key:"forkString",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e.fromString(t,r,Vr(Vr({},this.options),n))}},{key:"ready",value:function(){return this.screen.ready()}},{key:"isReady",value:function(){return this.screen.isReady()}},{key:"render",value:(r=(0,N.default)(E().mark((function e(){var t,r=arguments;return E().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=r.length>0&&void 0!==r[0]?r[0]:{},this.start(Vr({enableRedraw:!0,ignoreAnimation:!0,ignoreMouse:!0},t)),e.next=4,this.ready();case 4:this.stop();case 5:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"start",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.documentElement,r=this.screen,n=this.options;r.start(t,Vr(Vr({enableRedraw:!0},n),e))}},{key:"stop",value:function(){this.screen.stop()}},{key:"resize",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.documentElement.resize(e,t,r)}}],[{key:"from",value:(t=(0,N.default)(E().mark((function t(r,n){var o,s,i,a=arguments;return E().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return o=a.length>2&&void 0!==a[2]?a[2]:{},s=new jt(o),t.next=4,s.parse(n);case 4:return i=t.sent,t.abrupt("return",new e(r,i,o));case 6:case"end":return t.stop()}}),t)}))),function(e,r){return t.apply(this,arguments)})},{key:"fromString",value:function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=new jt(n),s=o.parseFromString(r);return new e(t,s,n)}}]),e}(),Gr=Object.freeze({__proto__:null,offscreen:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.DOMParser,r={window:null,ignoreAnimation:!0,ignoreMouse:!0,DOMParser:t,createCanvas:function(e,t){return new OffscreenCanvas(e,t)},createImage:function(e){return(0,N.default)(E().mark((function t(){var r,n,o;return E().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,fetch(e);case 2:return r=t.sent,t.next=5,r.blob();case 5:return n=t.sent,t.next=8,createImageBitmap(n);case 8:return o=t.sent,t.abrupt("return",o);case 10:case"end":return t.stop()}}),t)})))()}};return"undefined"==typeof DOMParser&&void 0!==t||ge()(r,"DOMParser"),r},node:function(e){var t=e.DOMParser,r=e.canvas;return{window:null,ignoreAnimation:!0,ignoreMouse:!0,DOMParser:t,fetch:e.fetch,createCanvas:r.createCanvas,createImage:r.loadImage}}});t.default=qr},"./node_modules/core-js-pure/es/array/from.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.string.iterator.js"),r("./node_modules/core-js-pure/modules/es.array.from.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Array.from},"./node_modules/core-js-pure/es/array/is-array.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.is-array.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Array.isArray},"./node_modules/core-js-pure/es/array/virtual/concat.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.concat.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").concat},"./node_modules/core-js-pure/es/array/virtual/every.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.every.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").every},"./node_modules/core-js-pure/es/array/virtual/fill.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.fill.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").fill},"./node_modules/core-js-pure/es/array/virtual/filter.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.filter.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").filter},"./node_modules/core-js-pure/es/array/virtual/for-each.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.for-each.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").forEach},"./node_modules/core-js-pure/es/array/virtual/includes.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.includes.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").includes},"./node_modules/core-js-pure/es/array/virtual/index-of.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.index-of.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").indexOf},"./node_modules/core-js-pure/es/array/virtual/map.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.map.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").map},"./node_modules/core-js-pure/es/array/virtual/reduce.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.reduce.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").reduce},"./node_modules/core-js-pure/es/array/virtual/reverse.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.reverse.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").reverse},"./node_modules/core-js-pure/es/array/virtual/slice.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.slice.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").slice},"./node_modules/core-js-pure/es/array/virtual/some.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.some.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").some},"./node_modules/core-js-pure/es/array/virtual/values.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.iterator.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Array").values},"./node_modules/core-js-pure/es/date/now.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.date.now.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Date.now},"./node_modules/core-js-pure/es/function/virtual/bind.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.function.bind.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("Function").bind},"./node_modules/core-js-pure/es/instance/bind.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/function/virtual/bind.js"),o=Function.prototype;e.exports=function(e){var t=e.bind;return e===o||e instanceof Function&&t===o.bind?n:t}},"./node_modules/core-js-pure/es/instance/concat.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/virtual/concat.js"),o=Array.prototype;e.exports=function(e){var t=e.concat;return e===o||e instanceof Array&&t===o.concat?n:t}},"./node_modules/core-js-pure/es/instance/every.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/virtual/every.js"),o=Array.prototype;e.exports=function(e){var t=e.every;return e===o||e instanceof Array&&t===o.every?n:t}},"./node_modules/core-js-pure/es/instance/fill.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/virtual/fill.js"),o=Array.prototype;e.exports=function(e){var t=e.fill;return e===o||e instanceof Array&&t===o.fill?n:t}},"./node_modules/core-js-pure/es/instance/filter.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/virtual/filter.js"),o=Array.prototype;e.exports=function(e){var t=e.filter;return e===o||e instanceof Array&&t===o.filter?n:t}},"./node_modules/core-js-pure/es/instance/includes.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/virtual/includes.js"),o=r("./node_modules/core-js-pure/es/string/virtual/includes.js"),s=Array.prototype,i=String.prototype;e.exports=function(e){var t=e.includes;return e===s||e instanceof Array&&t===s.includes?n:"string"==typeof e||e===i||e instanceof String&&t===i.includes?o:t}},"./node_modules/core-js-pure/es/instance/index-of.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/virtual/index-of.js"),o=Array.prototype;e.exports=function(e){var t=e.indexOf;return e===o||e instanceof Array&&t===o.indexOf?n:t}},"./node_modules/core-js-pure/es/instance/map.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/virtual/map.js"),o=Array.prototype;e.exports=function(e){var t=e.map;return e===o||e instanceof Array&&t===o.map?n:t}},"./node_modules/core-js-pure/es/instance/reduce.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/virtual/reduce.js"),o=Array.prototype;e.exports=function(e){var t=e.reduce;return e===o||e instanceof Array&&t===o.reduce?n:t}},"./node_modules/core-js-pure/es/instance/reverse.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/virtual/reverse.js"),o=Array.prototype;e.exports=function(e){var t=e.reverse;return e===o||e instanceof Array&&t===o.reverse?n:t}},"./node_modules/core-js-pure/es/instance/slice.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/virtual/slice.js"),o=Array.prototype;e.exports=function(e){var t=e.slice;return e===o||e instanceof Array&&t===o.slice?n:t}},"./node_modules/core-js-pure/es/instance/some.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/virtual/some.js"),o=Array.prototype;e.exports=function(e){var t=e.some;return e===o||e instanceof Array&&t===o.some?n:t}},"./node_modules/core-js-pure/es/instance/starts-with.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/string/virtual/starts-with.js"),o=String.prototype;e.exports=function(e){var t=e.startsWith;return"string"==typeof e||e===o||e instanceof String&&t===o.startsWith?n:t}},"./node_modules/core-js-pure/es/instance/trim.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/string/virtual/trim.js"),o=String.prototype;e.exports=function(e){var t=e.trim;return"string"==typeof e||e===o||e instanceof String&&t===o.trim?n:t}},"./node_modules/core-js-pure/es/map/index.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.map.js"),r("./node_modules/core-js-pure/modules/es.object.to-string.js"),r("./node_modules/core-js-pure/modules/es.string.iterator.js"),r("./node_modules/core-js-pure/modules/web.dom-collections.iterator.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Map},"./node_modules/core-js-pure/es/object/create.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.object.create.js");var n=r("./node_modules/core-js-pure/internals/path.js").Object;e.exports=function(e,t){return n.create(e,t)}},"./node_modules/core-js-pure/es/object/define-properties.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.object.define-properties.js");var n=r("./node_modules/core-js-pure/internals/path.js").Object,o=e.exports=function(e,t){return n.defineProperties(e,t)};n.defineProperties.sham&&(o.sham=!0)},"./node_modules/core-js-pure/es/object/define-property.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.object.define-property.js");var n=r("./node_modules/core-js-pure/internals/path.js").Object,o=e.exports=function(e,t,r){return n.defineProperty(e,t,r)};n.defineProperty.sham&&(o.sham=!0)},"./node_modules/core-js-pure/es/object/get-own-property-descriptor.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.object.get-own-property-descriptor.js");var n=r("./node_modules/core-js-pure/internals/path.js").Object,o=e.exports=function(e,t){return n.getOwnPropertyDescriptor(e,t)};n.getOwnPropertyDescriptor.sham&&(o.sham=!0)},"./node_modules/core-js-pure/es/object/get-own-property-descriptors.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.object.get-own-property-descriptors.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Object.getOwnPropertyDescriptors},"./node_modules/core-js-pure/es/object/get-own-property-symbols.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.symbol.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Object.getOwnPropertySymbols},"./node_modules/core-js-pure/es/object/get-prototype-of.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.object.get-prototype-of.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Object.getPrototypeOf},"./node_modules/core-js-pure/es/object/keys.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.object.keys.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Object.keys},"./node_modules/core-js-pure/es/object/set-prototype-of.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.object.set-prototype-of.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Object.setPrototypeOf},"./node_modules/core-js-pure/es/parse-float.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.parse-float.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.parseFloat},"./node_modules/core-js-pure/es/parse-int.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.parse-int.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.parseInt},"./node_modules/core-js-pure/es/promise/index.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.aggregate-error.js"),r("./node_modules/core-js-pure/modules/es.object.to-string.js"),r("./node_modules/core-js-pure/modules/es.promise.js"),r("./node_modules/core-js-pure/modules/es.promise.all-settled.js"),r("./node_modules/core-js-pure/modules/es.promise.any.js"),r("./node_modules/core-js-pure/modules/es.promise.finally.js"),r("./node_modules/core-js-pure/modules/es.string.iterator.js"),r("./node_modules/core-js-pure/modules/web.dom-collections.iterator.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Promise},"./node_modules/core-js-pure/es/reflect/apply.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.reflect.apply.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Reflect.apply},"./node_modules/core-js-pure/es/reflect/construct.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.reflect.construct.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Reflect.construct},"./node_modules/core-js-pure/es/reflect/delete-property.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.reflect.delete-property.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Reflect.deleteProperty},"./node_modules/core-js-pure/es/reflect/get-prototype-of.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.reflect.get-prototype-of.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Reflect.getPrototypeOf},"./node_modules/core-js-pure/es/reflect/get.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.reflect.get.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Reflect.get},"./node_modules/core-js-pure/es/string/virtual/includes.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.string.includes.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("String").includes},"./node_modules/core-js-pure/es/string/virtual/starts-with.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.string.starts-with.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("String").startsWith},"./node_modules/core-js-pure/es/string/virtual/trim.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.string.trim.js");var n=r("./node_modules/core-js-pure/internals/entry-virtual.js");e.exports=n("String").trim},"./node_modules/core-js-pure/es/symbol/index.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.array.concat.js"),r("./node_modules/core-js-pure/modules/es.object.to-string.js"),r("./node_modules/core-js-pure/modules/es.symbol.js"),r("./node_modules/core-js-pure/modules/es.symbol.async-iterator.js"),r("./node_modules/core-js-pure/modules/es.symbol.description.js"),r("./node_modules/core-js-pure/modules/es.symbol.has-instance.js"),r("./node_modules/core-js-pure/modules/es.symbol.is-concat-spreadable.js"),r("./node_modules/core-js-pure/modules/es.symbol.iterator.js"),r("./node_modules/core-js-pure/modules/es.symbol.match.js"),r("./node_modules/core-js-pure/modules/es.symbol.match-all.js"),r("./node_modules/core-js-pure/modules/es.symbol.replace.js"),r("./node_modules/core-js-pure/modules/es.symbol.search.js"),r("./node_modules/core-js-pure/modules/es.symbol.species.js"),r("./node_modules/core-js-pure/modules/es.symbol.split.js"),r("./node_modules/core-js-pure/modules/es.symbol.to-primitive.js"),r("./node_modules/core-js-pure/modules/es.symbol.to-string-tag.js"),r("./node_modules/core-js-pure/modules/es.symbol.unscopables.js"),r("./node_modules/core-js-pure/modules/es.json.to-string-tag.js"),r("./node_modules/core-js-pure/modules/es.math.to-string-tag.js"),r("./node_modules/core-js-pure/modules/es.reflect.to-string-tag.js");var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=n.Symbol},"./node_modules/core-js-pure/es/symbol/iterator.js":function(e,t,r){r("./node_modules/core-js-pure/modules/es.symbol.iterator.js"),r("./node_modules/core-js-pure/modules/es.string.iterator.js"),r("./node_modules/core-js-pure/modules/web.dom-collections.iterator.js");var n=r("./node_modules/core-js-pure/internals/well-known-symbol-wrapped.js");e.exports=n.f("iterator")},"./node_modules/core-js-pure/features/array/from.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/from.js");e.exports=n},"./node_modules/core-js-pure/features/array/is-array.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/array/is-array.js");e.exports=n},"./node_modules/core-js-pure/features/get-iterator-method.js":function(e,t,r){r("./node_modules/core-js-pure/modules/web.dom-collections.iterator.js"),r("./node_modules/core-js-pure/modules/es.string.iterator.js");var n=r("./node_modules/core-js-pure/internals/get-iterator-method.js");e.exports=n},"./node_modules/core-js-pure/features/get-iterator.js":function(e,t,r){r("./node_modules/core-js-pure/modules/web.dom-collections.iterator.js"),r("./node_modules/core-js-pure/modules/es.string.iterator.js");var n=r("./node_modules/core-js-pure/internals/get-iterator.js");e.exports=n},"./node_modules/core-js-pure/features/instance/slice.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/instance/slice.js");e.exports=n},"./node_modules/core-js-pure/features/object/create.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/object/create.js");e.exports=n},"./node_modules/core-js-pure/features/object/define-property.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/object/define-property.js");e.exports=n},"./node_modules/core-js-pure/features/object/get-own-property-descriptor.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/object/get-own-property-descriptor.js");e.exports=n},"./node_modules/core-js-pure/features/object/get-prototype-of.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/object/get-prototype-of.js");e.exports=n},"./node_modules/core-js-pure/features/object/set-prototype-of.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/object/set-prototype-of.js");e.exports=n},"./node_modules/core-js-pure/features/promise/index.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/promise/index.js");r("./node_modules/core-js-pure/modules/esnext.aggregate-error.js"),r("./node_modules/core-js-pure/modules/esnext.promise.all-settled.js"),r("./node_modules/core-js-pure/modules/esnext.promise.try.js"),r("./node_modules/core-js-pure/modules/esnext.promise.any.js"),e.exports=n},"./node_modules/core-js-pure/features/reflect/get.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/reflect/get.js");e.exports=n},"./node_modules/core-js-pure/features/symbol/index.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/symbol/index.js");r("./node_modules/core-js-pure/modules/esnext.symbol.async-dispose.js"),r("./node_modules/core-js-pure/modules/esnext.symbol.dispose.js"),r("./node_modules/core-js-pure/modules/esnext.symbol.matcher.js"),r("./node_modules/core-js-pure/modules/esnext.symbol.metadata.js"),r("./node_modules/core-js-pure/modules/esnext.symbol.observable.js"),r("./node_modules/core-js-pure/modules/esnext.symbol.pattern-match.js"),r("./node_modules/core-js-pure/modules/esnext.symbol.replace-all.js"),e.exports=n},"./node_modules/core-js-pure/features/symbol/iterator.js":function(e,t,r){var n=r("./node_modules/core-js-pure/es/symbol/iterator.js");e.exports=n},"./node_modules/core-js-pure/internals/a-function.js":function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},"./node_modules/core-js-pure/internals/a-possible-prototype.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/is-object.js");e.exports=function(e){if(!n(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},"./node_modules/core-js-pure/internals/add-to-unscopables.js":function(e){e.exports=function(){}},"./node_modules/core-js-pure/internals/an-instance.js":function(e){e.exports=function(e,t,r){if(!(e instanceof t))throw TypeError("Incorrect "+(r?r+" ":"")+"invocation");return e}},"./node_modules/core-js-pure/internals/an-object.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/is-object.js");e.exports=function(e){if(!n(e))throw TypeError(String(e)+" is not an object");return e}},"./node_modules/core-js-pure/internals/array-fill.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/to-object.js"),o=r("./node_modules/core-js-pure/internals/to-absolute-index.js"),s=r("./node_modules/core-js-pure/internals/to-length.js");e.exports=function(e){for(var t=n(this),r=s(t.length),i=arguments.length,a=o(i>1?arguments[1]:void 0,r),A=i>2?arguments[2]:void 0,u=void 0===A?r:o(A,r);u>a;)t[a++]=e;return t}},"./node_modules/core-js-pure/internals/array-for-each.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/array-iteration.js").forEach,o=r("./node_modules/core-js-pure/internals/array-method-is-strict.js")("forEach");e.exports=o?[].forEach:function(e){return n(this,e,arguments.length>1?arguments[1]:void 0)}},"./node_modules/core-js-pure/internals/array-from.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/function-bind-context.js"),o=r("./node_modules/core-js-pure/internals/to-object.js"),s=r("./node_modules/core-js-pure/internals/call-with-safe-iteration-closing.js"),i=r("./node_modules/core-js-pure/internals/is-array-iterator-method.js"),a=r("./node_modules/core-js-pure/internals/to-length.js"),A=r("./node_modules/core-js-pure/internals/create-property.js"),u=r("./node_modules/core-js-pure/internals/get-iterator-method.js");e.exports=function(e){var t,r,c,l,f,d,h=o(e),p="function"==typeof this?this:Array,m=arguments.length,g=m>1?arguments[1]:void 0,y=void 0!==g,v=u(h),w=0;if(y&&(g=n(g,m>2?arguments[2]:void 0,2)),null==v||p==Array&&i(v))for(r=new p(t=a(h.length));t>w;w++)d=y?g(h[w],w):h[w],A(r,w,d);else for(f=(l=v.call(h)).next,r=new p;!(c=f.call(l)).done;w++)d=y?s(l,g,[c.value,w],!0):c.value,A(r,w,d);return r.length=w,r}},"./node_modules/core-js-pure/internals/array-includes.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/to-indexed-object.js"),o=r("./node_modules/core-js-pure/internals/to-length.js"),s=r("./node_modules/core-js-pure/internals/to-absolute-index.js"),i=function(e){return function(t,r,i){var a,A=n(t),u=o(A.length),c=s(i,u);if(e&&r!=r){for(;u>c;)if((a=A[c++])!=a)return!0}else for(;u>c;c++)if((e||c in A)&&A[c]===r)return e||c||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},"./node_modules/core-js-pure/internals/array-iteration.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/function-bind-context.js"),o=r("./node_modules/core-js-pure/internals/indexed-object.js"),s=r("./node_modules/core-js-pure/internals/to-object.js"),i=r("./node_modules/core-js-pure/internals/to-length.js"),a=r("./node_modules/core-js-pure/internals/array-species-create.js"),A=[].push,u=function(e){var t=1==e,r=2==e,u=3==e,c=4==e,l=6==e,f=7==e,d=5==e||l;return function(h,p,m,g){for(var y,v,w=s(h),b=o(w),B=n(p,m,3),j=i(b.length),_=0,C=g||a,x=t?C(h,j):r||f?C(h,0):void 0;j>_;_++)if((d||_ in b)&&(v=B(y=b[_],_,w),e))if(t)x[_]=v;else if(v)switch(e){case 3:return!0;case 5:return y;case 6:return _;case 2:A.call(x,y)}else switch(e){case 4:return!1;case 7:A.call(x,y)}return l?-1:u||c?c:x}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterOut:u(7)}},"./node_modules/core-js-pure/internals/array-method-has-species-support.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/fails.js"),o=r("./node_modules/core-js-pure/internals/well-known-symbol.js"),s=r("./node_modules/core-js-pure/internals/engine-v8-version.js"),i=o("species");e.exports=function(e){return s>=51||!n((function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},"./node_modules/core-js-pure/internals/array-method-is-strict.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/fails.js");e.exports=function(e,t){var r=[][e];return!!r&&n((function(){r.call(null,t||function(){throw 1},1)}))}},"./node_modules/core-js-pure/internals/array-reduce.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/a-function.js"),o=r("./node_modules/core-js-pure/internals/to-object.js"),s=r("./node_modules/core-js-pure/internals/indexed-object.js"),i=r("./node_modules/core-js-pure/internals/to-length.js"),a=function(e){return function(t,r,a,A){n(r);var u=o(t),c=s(u),l=i(u.length),f=e?l-1:0,d=e?-1:1;if(a<2)for(;;){if(f in c){A=c[f],f+=d;break}if(f+=d,e?f<0:l<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:l>f;f+=d)f in c&&(A=r(A,c[f],f,u));return A}};e.exports={left:a(!1),right:a(!0)}},"./node_modules/core-js-pure/internals/array-species-create.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/is-object.js"),o=r("./node_modules/core-js-pure/internals/is-array.js"),s=r("./node_modules/core-js-pure/internals/well-known-symbol.js")("species");e.exports=function(e,t){var r;return o(e)&&("function"!=typeof(r=e.constructor)||r!==Array&&!o(r.prototype)?n(r)&&null===(r=r[s])&&(r=void 0):r=void 0),new(void 0===r?Array:r)(0===t?0:t)}},"./node_modules/core-js-pure/internals/call-with-safe-iteration-closing.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/an-object.js"),o=r("./node_modules/core-js-pure/internals/iterator-close.js");e.exports=function(e,t,r,s){try{return s?t(n(r)[0],r[1]):t(r)}catch(t){throw o(e),t}}},"./node_modules/core-js-pure/internals/check-correctness-of-iteration.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/well-known-symbol.js")("iterator"),o=!1;try{var s=0,i={next:function(){return{done:!!s++}},return:function(){o=!0}};i[n]=function(){return this},Array.from(i,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var r=!1;try{var s={};s[n]=function(){return{next:function(){return{done:r=!0}}}},e(s)}catch(e){}return r}},"./node_modules/core-js-pure/internals/classof-raw.js":function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},"./node_modules/core-js-pure/internals/classof.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/to-string-tag-support.js"),o=r("./node_modules/core-js-pure/internals/classof-raw.js"),s=r("./node_modules/core-js-pure/internals/well-known-symbol.js")("toStringTag"),i="Arguments"==o(function(){return arguments}());e.exports=n?o:function(e){var t,r,n;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),s))?r:i?o(t):"Object"==(n=o(t))&&"function"==typeof t.callee?"Arguments":n}},"./node_modules/core-js-pure/internals/collection-strong.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/object-define-property.js").f,o=r("./node_modules/core-js-pure/internals/object-create.js"),s=r("./node_modules/core-js-pure/internals/redefine-all.js"),i=r("./node_modules/core-js-pure/internals/function-bind-context.js"),a=r("./node_modules/core-js-pure/internals/an-instance.js"),A=r("./node_modules/core-js-pure/internals/iterate.js"),u=r("./node_modules/core-js-pure/internals/define-iterator.js"),c=r("./node_modules/core-js-pure/internals/set-species.js"),l=r("./node_modules/core-js-pure/internals/descriptors.js"),f=r("./node_modules/core-js-pure/internals/internal-metadata.js").fastKey,d=r("./node_modules/core-js-pure/internals/internal-state.js"),h=d.set,p=d.getterFor;e.exports={getConstructor:function(e,t,r,u){var c=e((function(e,n){a(e,c,t),h(e,{type:t,index:o(null),first:void 0,last:void 0,size:0}),l||(e.size=0),null!=n&&A(n,e[u],{that:e,AS_ENTRIES:r})})),d=p(t),m=function(e,t,r){var n,o,s=d(e),i=g(e,t);return i?i.value=r:(s.last=i={index:o=f(t,!0),key:t,value:r,previous:n=s.last,next:void 0,removed:!1},s.first||(s.first=i),n&&(n.next=i),l?s.size++:e.size++,"F"!==o&&(s.index[o]=i)),e},g=function(e,t){var r,n=d(e),o=f(t);if("F"!==o)return n.index[o];for(r=n.first;r;r=r.next)if(r.key==t)return r};return s(c.prototype,{clear:function(){for(var e=d(this),t=e.index,r=e.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete t[r.index],r=r.next;e.first=e.last=void 0,l?e.size=0:this.size=0},delete:function(e){var t=this,r=d(t),n=g(t,e);if(n){var o=n.next,s=n.previous;delete r.index[n.index],n.removed=!0,s&&(s.next=o),o&&(o.previous=s),r.first==n&&(r.first=o),r.last==n&&(r.last=s),l?r.size--:t.size--}return!!n},forEach:function(e){for(var t,r=d(this),n=i(e,arguments.length>1?arguments[1]:void 0,3);t=t?t.next:r.first;)for(n(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!g(this,e)}}),s(c.prototype,r?{get:function(e){var t=g(this,e);return t&&t.value},set:function(e,t){return m(this,0===e?0:e,t)}}:{add:function(e){return m(this,e=0===e?0:e,e)}}),l&&n(c.prototype,"size",{get:function(){return d(this).size}}),c},setStrong:function(e,t,r){var n=t+" Iterator",o=p(t),s=p(n);u(e,t,(function(e,t){h(this,{type:n,target:e,state:o(e),kind:t,last:void 0})}),(function(){for(var e=s(this),t=e.kind,r=e.last;r&&r.removed;)r=r.previous;return e.target&&(e.last=r=r?r.next:e.state.first)?"keys"==t?{value:r.key,done:!1}:"values"==t?{value:r.value,done:!1}:{value:[r.key,r.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),r?"entries":"values",!r,!0),c(t)}}},"./node_modules/core-js-pure/internals/collection.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/export.js"),o=r("./node_modules/core-js-pure/internals/global.js"),s=r("./node_modules/core-js-pure/internals/internal-metadata.js"),i=r("./node_modules/core-js-pure/internals/fails.js"),a=r("./node_modules/core-js-pure/internals/create-non-enumerable-property.js"),A=r("./node_modules/core-js-pure/internals/iterate.js"),u=r("./node_modules/core-js-pure/internals/an-instance.js"),c=r("./node_modules/core-js-pure/internals/is-object.js"),l=r("./node_modules/core-js-pure/internals/set-to-string-tag.js"),f=r("./node_modules/core-js-pure/internals/object-define-property.js").f,d=r("./node_modules/core-js-pure/internals/array-iteration.js").forEach,h=r("./node_modules/core-js-pure/internals/descriptors.js"),p=r("./node_modules/core-js-pure/internals/internal-state.js"),m=p.set,g=p.getterFor;e.exports=function(e,t,r){var p,y=-1!==e.indexOf("Map"),v=-1!==e.indexOf("Weak"),w=y?"set":"add",b=o[e],B=b&&b.prototype,j={};if(h&&"function"==typeof b&&(v||B.forEach&&!i((function(){(new b).entries().next()})))){p=t((function(t,r){m(u(t,p,e),{type:e,collection:new b}),null!=r&&A(r,t[w],{that:t,AS_ENTRIES:y})}));var _=g(e);d(["add","clear","delete","forEach","get","has","set","keys","values","entries"],(function(e){var t="add"==e||"set"==e;!(e in B)||v&&"clear"==e||a(p.prototype,e,(function(r,n){var o=_(this).collection;if(!t&&v&&!c(r))return"get"==e&&void 0;var s=o[e](0===r?0:r,n);return t?this:s}))})),v||f(p.prototype,"size",{configurable:!0,get:function(){return _(this).collection.size}})}else p=r.getConstructor(t,e,y,w),s.REQUIRED=!0;return l(p,e,!1,!0),j[e]=p,n({global:!0,forced:!0},j),v||r.setStrong(p,e,y),p}},"./node_modules/core-js-pure/internals/correct-is-regexp-logic.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/well-known-symbol.js")("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(r){try{return t[n]=!1,"/./"[e](t)}catch(e){}}return!1}},"./node_modules/core-js-pure/internals/correct-prototype-getter.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/fails.js");e.exports=!n((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},"./node_modules/core-js-pure/internals/create-iterator-constructor.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/iterators-core.js").IteratorPrototype,o=r("./node_modules/core-js-pure/internals/object-create.js"),s=r("./node_modules/core-js-pure/internals/create-property-descriptor.js"),i=r("./node_modules/core-js-pure/internals/set-to-string-tag.js"),a=r("./node_modules/core-js-pure/internals/iterators.js"),A=function(){return this};e.exports=function(e,t,r){var u=t+" Iterator";return e.prototype=o(n,{next:s(1,r)}),i(e,u,!1,!0),a[u]=A,e}},"./node_modules/core-js-pure/internals/create-non-enumerable-property.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/descriptors.js"),o=r("./node_modules/core-js-pure/internals/object-define-property.js"),s=r("./node_modules/core-js-pure/internals/create-property-descriptor.js");e.exports=n?function(e,t,r){return o.f(e,t,s(1,r))}:function(e,t,r){return e[t]=r,e}},"./node_modules/core-js-pure/internals/create-property-descriptor.js":function(e){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},"./node_modules/core-js-pure/internals/create-property.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/to-primitive.js"),o=r("./node_modules/core-js-pure/internals/object-define-property.js"),s=r("./node_modules/core-js-pure/internals/create-property-descriptor.js");e.exports=function(e,t,r){var i=n(t);i in e?o.f(e,i,s(0,r)):e[i]=r}},"./node_modules/core-js-pure/internals/define-iterator.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/export.js"),o=r("./node_modules/core-js-pure/internals/create-iterator-constructor.js"),s=r("./node_modules/core-js-pure/internals/object-get-prototype-of.js"),i=r("./node_modules/core-js-pure/internals/object-set-prototype-of.js"),a=r("./node_modules/core-js-pure/internals/set-to-string-tag.js"),A=r("./node_modules/core-js-pure/internals/create-non-enumerable-property.js"),u=r("./node_modules/core-js-pure/internals/redefine.js"),c=r("./node_modules/core-js-pure/internals/well-known-symbol.js"),l=r("./node_modules/core-js-pure/internals/is-pure.js"),f=r("./node_modules/core-js-pure/internals/iterators.js"),d=r("./node_modules/core-js-pure/internals/iterators-core.js"),h=d.IteratorPrototype,p=d.BUGGY_SAFARI_ITERATORS,m=c("iterator"),g="keys",y="values",v="entries",w=function(){return this};e.exports=function(e,t,r,c,d,b,B){o(r,t,c);var j,_,C,x=function(e){if(e===d&&U)return U;if(!p&&e in F)return F[e];switch(e){case g:case y:case v:return function(){return new r(this,e)}}return function(){return new r(this)}},E=t+" Iterator",N=!1,F=e.prototype,Q=F[m]||F["@@iterator"]||d&&F[d],U=!p&&Q||x(d),S="Array"==t&&F.entries||Q;if(S&&(j=s(S.call(new e)),h!==Object.prototype&&j.next&&(l||s(j)===h||(i?i(j,h):"function"!=typeof j[m]&&A(j,m,w)),a(j,E,!0,!0),l&&(f[E]=w))),d==y&&Q&&Q.name!==y&&(N=!0,U=function(){return Q.call(this)}),l&&!B||F[m]===U||A(F,m,U),f[t]=U,d)if(_={values:x(y),keys:b?U:x(g),entries:x(v)},B)for(C in _)(p||N||!(C in F))&&u(F,C,_[C]);else n({target:t,proto:!0,forced:p||N},_);return _}},"./node_modules/core-js-pure/internals/define-well-known-symbol.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/path.js"),o=r("./node_modules/core-js-pure/internals/has.js"),s=r("./node_modules/core-js-pure/internals/well-known-symbol-wrapped.js"),i=r("./node_modules/core-js-pure/internals/object-define-property.js").f;e.exports=function(e){var t=n.Symbol||(n.Symbol={});o(t,e)||i(t,e,{value:s.f(e)})}},"./node_modules/core-js-pure/internals/descriptors.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/fails.js");e.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},"./node_modules/core-js-pure/internals/document-create-element.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/global.js"),o=r("./node_modules/core-js-pure/internals/is-object.js"),s=n.document,i=o(s)&&o(s.createElement);e.exports=function(e){return i?s.createElement(e):{}}},"./node_modules/core-js-pure/internals/dom-iterables.js":function(e){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},"./node_modules/core-js-pure/internals/engine-is-browser.js":function(e){e.exports="object"==typeof window},"./node_modules/core-js-pure/internals/engine-is-ios.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/engine-user-agent.js");e.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(n)},"./node_modules/core-js-pure/internals/engine-is-node.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/classof-raw.js"),o=r("./node_modules/core-js-pure/internals/global.js");e.exports="process"==n(o.process)},"./node_modules/core-js-pure/internals/engine-is-webos-webkit.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/engine-user-agent.js");e.exports=/web0s(?!.*chrome)/i.test(n)},"./node_modules/core-js-pure/internals/engine-user-agent.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/get-built-in.js");e.exports=n("navigator","userAgent")||""},"./node_modules/core-js-pure/internals/engine-v8-version.js":function(e,t,r){var n,o,s=r("./node_modules/core-js-pure/internals/global.js"),i=r("./node_modules/core-js-pure/internals/engine-user-agent.js"),a=s.process,A=a&&a.versions,u=A&&A.v8;u?o=(n=u.split("."))[0]<4?1:n[0]+n[1]:i&&(!(n=i.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=i.match(/Chrome\/(\d+)/))&&(o=n[1]),e.exports=o&&+o},"./node_modules/core-js-pure/internals/entry-virtual.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/path.js");e.exports=function(e){return n[e+"Prototype"]}},"./node_modules/core-js-pure/internals/enum-bug-keys.js":function(e){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"./node_modules/core-js-pure/internals/export.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/global.js"),o=r("./node_modules/core-js-pure/internals/object-get-own-property-descriptor.js").f,s=r("./node_modules/core-js-pure/internals/is-forced.js"),i=r("./node_modules/core-js-pure/internals/path.js"),a=r("./node_modules/core-js-pure/internals/function-bind-context.js"),A=r("./node_modules/core-js-pure/internals/create-non-enumerable-property.js"),u=r("./node_modules/core-js-pure/internals/has.js"),c=function(e){var t=function(t,r,n){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,r)}return new e(t,r,n)}return e.apply(this,arguments)};return t.prototype=e.prototype,t};e.exports=function(e,t){var r,l,f,d,h,p,m,g,y=e.target,v=e.global,w=e.stat,b=e.proto,B=v?n:w?n[y]:(n[y]||{}).prototype,j=v?i:i[y]||(i[y]={}),_=j.prototype;for(f in t)r=!s(v?f:y+(w?".":"#")+f,e.forced)&&B&&u(B,f),h=j[f],r&&(p=e.noTargetGet?(g=o(B,f))&&g.value:B[f]),d=r&&p?p:t[f],r&&typeof h==typeof d||(m=e.bind&&r?a(d,n):e.wrap&&r?c(d):b&&"function"==typeof d?a(Function.call,d):d,(e.sham||d&&d.sham||h&&h.sham)&&A(m,"sham",!0),j[f]=m,b&&(u(i,l=y+"Prototype")||A(i,l,{}),i[l][f]=d,e.real&&_&&!_[f]&&A(_,f,d)))}},"./node_modules/core-js-pure/internals/fails.js":function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},"./node_modules/core-js-pure/internals/freezing.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/fails.js");e.exports=!n((function(){return Object.isExtensible(Object.preventExtensions({}))}))},"./node_modules/core-js-pure/internals/function-bind-context.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/a-function.js");e.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 0:return function(){return e.call(t)};case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,o){return e.call(t,r,n,o)}}return function(){return e.apply(t,arguments)}}},"./node_modules/core-js-pure/internals/function-bind.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/a-function.js"),o=r("./node_modules/core-js-pure/internals/is-object.js"),s=[].slice,i={},a=function(e,t,r){if(!(t in i)){for(var n=[],o=0;of;f++)if((h=j(e[f]))&&h instanceof u)return h;return new u(!1)}c=l.call(e)}for(p=c.next;!(m=p.call(c)).done;){try{h=j(m.value)}catch(e){throw A(c),e}if("object"==typeof h&&h&&h instanceof u)return h}return new u(!1)}},"./node_modules/core-js-pure/internals/iterator-close.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/an-object.js");e.exports=function(e){var t=e.return;if(void 0!==t)return n(t.call(e)).value}},"./node_modules/core-js-pure/internals/iterators-core.js":function(e,t,r){"use strict";var n,o,s,i=r("./node_modules/core-js-pure/internals/fails.js"),a=r("./node_modules/core-js-pure/internals/object-get-prototype-of.js"),A=r("./node_modules/core-js-pure/internals/create-non-enumerable-property.js"),u=r("./node_modules/core-js-pure/internals/has.js"),c=r("./node_modules/core-js-pure/internals/well-known-symbol.js"),l=r("./node_modules/core-js-pure/internals/is-pure.js"),f=c("iterator"),d=!1;[].keys&&("next"in(s=[].keys())?(o=a(a(s)))!==Object.prototype&&(n=o):d=!0);var h=null==n||i((function(){var e={};return n[f].call(e)!==e}));h&&(n={}),l&&!h||u(n,f)||A(n,f,(function(){return this})),e.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:d}},"./node_modules/core-js-pure/internals/iterators.js":function(e){e.exports={}},"./node_modules/core-js-pure/internals/microtask.js":function(e,t,r){var n,o,s,i,a,A,u,c,l=r("./node_modules/core-js-pure/internals/global.js"),f=r("./node_modules/core-js-pure/internals/object-get-own-property-descriptor.js").f,d=r("./node_modules/core-js-pure/internals/task.js").set,h=r("./node_modules/core-js-pure/internals/engine-is-ios.js"),p=r("./node_modules/core-js-pure/internals/engine-is-webos-webkit.js"),m=r("./node_modules/core-js-pure/internals/engine-is-node.js"),g=l.MutationObserver||l.WebKitMutationObserver,y=l.document,v=l.process,w=l.Promise,b=f(l,"queueMicrotask"),B=b&&b.value;B||(n=function(){var e,t;for(m&&(e=v.domain)&&e.exit();o;){t=o.fn,o=o.next;try{t()}catch(e){throw o?i():s=void 0,e}}s=void 0,e&&e.enter()},h||m||p||!g||!y?w&&w.resolve?((u=w.resolve(void 0)).constructor=w,c=u.then,i=function(){c.call(u,n)}):i=m?function(){v.nextTick(n)}:function(){d.call(l,n)}:(a=!0,A=y.createTextNode(""),new g(n).observe(A,{characterData:!0}),i=function(){A.data=a=!a})),e.exports=B||function(e){var t={fn:e,next:void 0};s&&(s.next=t),o||(o=t,i()),s=t}},"./node_modules/core-js-pure/internals/native-promise-constructor.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/global.js");e.exports=n.Promise},"./node_modules/core-js-pure/internals/native-symbol.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/engine-v8-version.js"),o=r("./node_modules/core-js-pure/internals/fails.js");e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},"./node_modules/core-js-pure/internals/native-weak-map.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/global.js"),o=r("./node_modules/core-js-pure/internals/inspect-source.js"),s=n.WeakMap;e.exports="function"==typeof s&&/native code/.test(o(s))},"./node_modules/core-js-pure/internals/new-promise-capability.js":function(e,t,r){"use strict";var n=r("./node_modules/core-js-pure/internals/a-function.js"),o=function(e){var t,r;this.promise=new e((function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=n})),this.resolve=n(t),this.reject=n(r)};e.exports.f=function(e){return new o(e)}},"./node_modules/core-js-pure/internals/not-a-regexp.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/is-regexp.js");e.exports=function(e){if(n(e))throw TypeError("The method doesn't accept regular expressions");return e}},"./node_modules/core-js-pure/internals/number-parse-float.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/global.js"),o=r("./node_modules/core-js-pure/internals/string-trim.js").trim,s=r("./node_modules/core-js-pure/internals/whitespaces.js"),i=n.parseFloat,a=1/i(s+"-0")!=-1/0;e.exports=a?function(e){var t=o(String(e)),r=i(t);return 0===r&&"-"==t.charAt(0)?-0:r}:i},"./node_modules/core-js-pure/internals/number-parse-int.js":function(e,t,r){var n=r("./node_modules/core-js-pure/internals/global.js"),o=r("./node_modules/core-js-pure/internals/string-trim.js").trim,s=r("./node_modules/core-js-pure/internals/whitespaces.js"),i=n.parseInt,a=/^[+-]?0[Xx]/,A=8!==i(s+"08")||22!==i(s+"0x16");e.exports=A?function(e,t){var r=o(String(e));return i(r,t>>>0||(a.test(r)?16:10))}:i},"./node_modules/core-js-pure/internals/object-create.js":function(e,t,r){var n,o=r("./node_modules/core-js-pure/internals/an-object.js"),s=r("./node_modules/core-js-pure/internals/object-define-properties.js"),i=r("./node_modules/core-js-pure/internals/enum-bug-keys.js"),a=r("./node_modules/core-js-pure/internals/hidden-keys.js"),A=r("./node_modules/core-js-pure/internals/html.js"),u=r("./node_modules/core-js-pure/internals/document-create-element.js"),c=r("./node_modules/core-js-pure/internals/shared-key.js")("IE_PROTO"),l=function(){},f=function(e){return"