diff --git a/admin/tool/analytics/amd/build/log_info.min.js.map b/admin/tool/analytics/amd/build/log_info.min.js.map index 38c60d0eedc..c9ec36604be 100644 --- a/admin/tool/analytics/amd/build/log_info.min.js.map +++ b/admin/tool/analytics/amd/build/log_info.min.js.map @@ -1 +1 @@ -{"version":3,"file":"log_info.min.js","sources":["../src/log_info.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 * Shows a dialogue with info about this logs.\n *\n * @module tool_analytics/log_info\n * @copyright 2017 David Monllao {@link http://www.davidmonllao.com}\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/modal_factory', 'core/notification'], function($, str, ModalFactory, Notification) {\n\n return /** @alias module:tool_analytics/log_info */ {\n\n /**\n * Prepares a modal info for a log's results.\n *\n * @method loadInfo\n * @param {int} id\n * @param {string[]} info\n */\n loadInfo: function(id, info) {\n\n var link = $('[data-model-log-id=\"' + id + '\"]');\n str.get_string('loginfo', 'tool_analytics').then(function(langString) {\n\n var bodyInfo = $(\"\");\n\n return ModalFactory.create({\n title: langString,\n body: bodyInfo.html(),\n large: true,\n }, link);\n\n }).catch(Notification.exception);\n }\n };\n});\n"],"names":["define","$","str","ModalFactory","Notification","loadInfo","id","info","link","get_string","then","langString","bodyInfo","forEach","item","append","create","title","body","html","large","catch","exception"],"mappings":";;;;;;;AAsBAA,iCAAO,CAAC,SAAU,WAAY,qBAAsB,sBAAsB,SAASC,EAAGC,IAAKC,aAAcC,oBAEjD,CAShDC,SAAU,SAASC,GAAIC,UAEfC,KAAOP,EAAE,uBAAyBK,GAAK,MAC3CJ,IAAIO,WAAW,UAAW,kBAAkBC,MAAK,SAASC,gBAElDC,SAAWX,EAAE,eACjBM,KAAKM,SAAQ,SAASC,MAClBF,SAASG,OAAO,OAASD,KAAO,YAEpCF,SAASG,OAAO,SAETZ,aAAaa,OAAO,CACvBC,MAAON,WACPO,KAAMN,SAASO,OACfC,OAAO,GACRZ,SAEJa,MAAMjB,aAAakB"} \ No newline at end of file +{"version":3,"file":"log_info.min.js","sources":["../src/log_info.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 * Shows a dialogue with info about this logs.\n *\n * @module tool_analytics/log_info\n * @copyright 2017 David Monllao {@link http://www.davidmonllao.com}\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/modal_factory', 'core/notification'], function($, str, ModalFactory, Notification) {\n\n return /** @alias module:tool_analytics/log_info */ {\n\n /**\n * Prepares a modal info for a log's results.\n *\n * @method loadInfo\n * @param {int} id\n * @param {string[]} info\n */\n loadInfo: function(id, info) {\n\n var link = $('[data-model-log-id=\"' + id + '\"]');\n str.get_string('loginfo', 'tool_analytics').then(function(langString) {\n\n var bodyInfo = $(\"\");\n\n return ModalFactory.create({\n title: langString,\n body: bodyInfo.html(),\n large: true,\n }, link);\n\n }).catch(Notification.exception);\n }\n };\n});\n"],"names":["define","$","str","ModalFactory","Notification","loadInfo","id","info","link","get_string","then","langString","bodyInfo","forEach","item","append","create","title","body","html","large","catch","exception"],"mappings":";;;;;;;AAsBAA,iCAAO,CAAC,SAAU,WAAY,qBAAsB,sBAAsB,SAASC,EAAGC,IAAKC,aAAcC,cAEjD,MAAA,CAShDC,SAAU,SAASC,GAAIC,MAEfC,IAAAA,KAAOP,EAAE,uBAAyBK,GAAK,MAC3CJ,IAAIO,WAAW,UAAW,kBAAkBC,MAAK,SAASC,YAEtD,IAAIC,SAAWX,EAAE,QAMVE,OALPI,KAAKM,SAAQ,SAASC,MAClBF,SAASG,OAAO,OAASD,KAAO,QACnC,IACDF,SAASG,OAAO,SAETZ,aAAaa,OAAO,CACvBC,MAAON,WACPO,KAAMN,SAASO,OACfC,OAAO,GACRZ,KAZP,IAcGa,MAAMjB,aAAakB,UACzB,EAER"} \ No newline at end of file diff --git a/admin/tool/analytics/amd/build/model.min.js.map b/admin/tool/analytics/amd/build/model.min.js.map index f50f1c0f05a..691d7aaeba6 100644 --- a/admin/tool/analytics/amd/build/model.min.js.map +++ b/admin/tool/analytics/amd/build/model.min.js.map @@ -1 +1 @@ -{"version":3,"file":"model.min.js","sources":["../src/model.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 * AMD module for model actions confirmation.\n *\n * @module tool_analytics/model\n * @copyright 2017 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/log', 'core/notification', 'core/modal_factory', 'core/modal_events', 'core/templates'],\n function($, Str, log, Notification, ModalFactory, ModalEvents, Templates) {\n\n /**\n * List of actions that require confirmation and confirmation message.\n */\n var actionsList = {\n clear: {\n title: {\n key: 'clearpredictions',\n component: 'tool_analytics'\n }, body: {\n key: 'clearmodelpredictions',\n component: 'tool_analytics'\n }\n\n },\n 'delete': {\n title: {\n key: 'delete',\n component: 'tool_analytics'\n }, body: {\n key: 'deletemodelconfirmation',\n component: 'tool_analytics'\n }\n }\n };\n\n /**\n * Returns the model name.\n *\n * @param {Object} actionItem The action item DOM node.\n * @return {String}\n */\n var getModelName = function(actionItem) {\n var wrap = $(actionItem).closest('[data-model-name]');\n\n if (wrap.length) {\n return wrap.attr('data-model-name');\n\n } else {\n log.error('Unexpected DOM error - unable to obtain the model name');\n return '';\n }\n };\n\n /** @alias module:tool_analytics/model */\n return {\n\n /**\n * Displays a confirm modal window before executing the action.\n *\n * @param {String} actionId\n * @param {String} actionType\n */\n confirmAction: function(actionId, actionType) {\n $('[data-action-id=\"' + actionId + '\"]').on('click', function(ev) {\n ev.preventDefault();\n\n var a = $(ev.currentTarget);\n\n if (typeof actionsList[actionType] === \"undefined\") {\n log.error('Action \"' + actionType + '\" is not allowed.');\n return;\n }\n\n var reqStrings = [\n actionsList[actionType].title,\n actionsList[actionType].body\n ];\n reqStrings[1].param = getModelName(a);\n\n var stringsPromise = Str.get_strings(reqStrings);\n var modalPromise = ModalFactory.create({type: ModalFactory.types.SAVE_CANCEL});\n\n $.when(stringsPromise, modalPromise).then(function(strings, modal) {\n modal.setTitle(strings[0]);\n modal.setBody(strings[1]);\n modal.setSaveButtonText(strings[0]);\n modal.getRoot().on(ModalEvents.save, function() {\n window.location.href = a.attr('href');\n });\n modal.show();\n return modal;\n }).fail(Notification.exception);\n });\n },\n\n /**\n * Displays evaluation mode and time-splitting method choices.\n *\n * @param {String} actionId\n * @param {Boolean} trainedOnlyExternally\n */\n selectEvaluationOptions: function(actionId, trainedOnlyExternally) {\n $('[data-action-id=\"' + actionId + '\"]').on('click', function(ev) {\n ev.preventDefault();\n\n var a = $(ev.currentTarget);\n\n var timeSplittingMethods = $(this).attr('data-timesplitting-methods');\n\n var stringsPromise = Str.get_strings([\n {\n key: 'evaluatemodel',\n component: 'tool_analytics'\n }, {\n key: 'evaluate',\n component: 'tool_analytics'\n }\n ]);\n var modalPromise = ModalFactory.create({type: ModalFactory.types.SAVE_CANCEL});\n var bodyPromise = Templates.render('tool_analytics/evaluation_options', {\n trainedexternally: trainedOnlyExternally,\n timesplittingmethods: JSON.parse(timeSplittingMethods)\n });\n\n $.when(stringsPromise, modalPromise).then(function(strings, modal) {\n\n\n modal.getRoot().on(ModalEvents.hidden, modal.destroy.bind(modal));\n\n modal.setTitle(strings[0]);\n modal.setSaveButtonText(strings[1]);\n modal.setBody(bodyPromise);\n\n modal.getRoot().on(ModalEvents.save, function() {\n\n // Evaluation mode.\n var evaluationMode = $(\"input[name='evaluationmode']:checked\").val();\n if (evaluationMode == 'trainedmodel') {\n a.attr('href', a.attr('href') + '&mode=trainedmodel');\n }\n\n // Selected time-splitting id.\n var timeSplittingMethod = $(\"#id-evaluation-timesplitting\").val();\n a.attr('href', a.attr('href') + '×plitting=' + timeSplittingMethod);\n\n window.location.href = a.attr('href');\n return;\n });\n\n modal.show();\n return modal;\n }).fail(Notification.exception);\n });\n },\n\n /**\n * Displays export options.\n *\n * We have two main options: export training data and export configuration.\n * The 2nd option has an extra option: include the trained algorithm weights.\n *\n * @param {String} actionId\n * @param {Boolean} isTrained\n */\n selectExportOptions: function(actionId, isTrained) {\n $('[data-action-id=\"' + actionId + '\"]').on('click', function(ev) {\n ev.preventDefault();\n\n var a = $(ev.currentTarget);\n\n if (!isTrained) {\n // Export the model configuration if the model is not trained. We can't export anything else.\n a.attr('href', a.attr('href') + '&action=exportmodel&includeweights=0');\n window.location.href = a.attr('href');\n return;\n }\n\n var stringsPromise = Str.get_strings([\n {\n key: 'export',\n component: 'tool_analytics'\n }\n ]);\n var modalPromise = ModalFactory.create({type: ModalFactory.types.SAVE_CANCEL});\n var bodyPromise = Templates.render('tool_analytics/export_options', {});\n\n $.when(stringsPromise, modalPromise).then(function(strings, modal) {\n\n modal.getRoot().on(ModalEvents.hidden, modal.destroy.bind(modal));\n\n modal.setTitle(strings[0]);\n modal.setSaveButtonText(strings[0]);\n modal.setBody(bodyPromise);\n\n modal.getRoot().on(ModalEvents.save, function() {\n\n var exportOption = $(\"input[name='exportoption']:checked\").val();\n\n if (exportOption == 'exportdata') {\n a.attr('href', a.attr('href') + '&action=exportdata');\n\n } else {\n a.attr('href', a.attr('href') + '&action=exportmodel');\n if ($(\"#id-includeweights\").is(':checked')) {\n a.attr('href', a.attr('href') + '&includeweights=1');\n } else {\n a.attr('href', a.attr('href') + '&includeweights=0');\n }\n }\n\n window.location.href = a.attr('href');\n return;\n });\n\n modal.show();\n return modal;\n }).fail(Notification.exception);\n });\n }\n };\n});\n"],"names":["define","$","Str","log","Notification","ModalFactory","ModalEvents","Templates","actionsList","clear","title","key","component","body","confirmAction","actionId","actionType","on","ev","preventDefault","a","currentTarget","wrap","reqStrings","param","closest","length","attr","error","stringsPromise","get_strings","modalPromise","create","type","types","SAVE_CANCEL","when","then","strings","modal","setTitle","setBody","setSaveButtonText","getRoot","save","window","location","href","show","fail","exception","selectEvaluationOptions","trainedOnlyExternally","timeSplittingMethods","this","bodyPromise","render","trainedexternally","timesplittingmethods","JSON","parse","hidden","destroy","bind","val","timeSplittingMethod","selectExportOptions","isTrained","is"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"model.min.js","sources":["../src/model.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 * AMD module for model actions confirmation.\n *\n * @module tool_analytics/model\n * @copyright 2017 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/log', 'core/notification', 'core/modal_factory', 'core/modal_events', 'core/templates'],\n function($, Str, log, Notification, ModalFactory, ModalEvents, Templates) {\n\n /**\n * List of actions that require confirmation and confirmation message.\n */\n var actionsList = {\n clear: {\n title: {\n key: 'clearpredictions',\n component: 'tool_analytics'\n }, body: {\n key: 'clearmodelpredictions',\n component: 'tool_analytics'\n }\n\n },\n 'delete': {\n title: {\n key: 'delete',\n component: 'tool_analytics'\n }, body: {\n key: 'deletemodelconfirmation',\n component: 'tool_analytics'\n }\n }\n };\n\n /**\n * Returns the model name.\n *\n * @param {Object} actionItem The action item DOM node.\n * @return {String}\n */\n var getModelName = function(actionItem) {\n var wrap = $(actionItem).closest('[data-model-name]');\n\n if (wrap.length) {\n return wrap.attr('data-model-name');\n\n } else {\n log.error('Unexpected DOM error - unable to obtain the model name');\n return '';\n }\n };\n\n /** @alias module:tool_analytics/model */\n return {\n\n /**\n * Displays a confirm modal window before executing the action.\n *\n * @param {String} actionId\n * @param {String} actionType\n */\n confirmAction: function(actionId, actionType) {\n $('[data-action-id=\"' + actionId + '\"]').on('click', function(ev) {\n ev.preventDefault();\n\n var a = $(ev.currentTarget);\n\n if (typeof actionsList[actionType] === \"undefined\") {\n log.error('Action \"' + actionType + '\" is not allowed.');\n return;\n }\n\n var reqStrings = [\n actionsList[actionType].title,\n actionsList[actionType].body\n ];\n reqStrings[1].param = getModelName(a);\n\n var stringsPromise = Str.get_strings(reqStrings);\n var modalPromise = ModalFactory.create({type: ModalFactory.types.SAVE_CANCEL});\n\n $.when(stringsPromise, modalPromise).then(function(strings, modal) {\n modal.setTitle(strings[0]);\n modal.setBody(strings[1]);\n modal.setSaveButtonText(strings[0]);\n modal.getRoot().on(ModalEvents.save, function() {\n window.location.href = a.attr('href');\n });\n modal.show();\n return modal;\n }).fail(Notification.exception);\n });\n },\n\n /**\n * Displays evaluation mode and time-splitting method choices.\n *\n * @param {String} actionId\n * @param {Boolean} trainedOnlyExternally\n */\n selectEvaluationOptions: function(actionId, trainedOnlyExternally) {\n $('[data-action-id=\"' + actionId + '\"]').on('click', function(ev) {\n ev.preventDefault();\n\n var a = $(ev.currentTarget);\n\n var timeSplittingMethods = $(this).attr('data-timesplitting-methods');\n\n var stringsPromise = Str.get_strings([\n {\n key: 'evaluatemodel',\n component: 'tool_analytics'\n }, {\n key: 'evaluate',\n component: 'tool_analytics'\n }\n ]);\n var modalPromise = ModalFactory.create({type: ModalFactory.types.SAVE_CANCEL});\n var bodyPromise = Templates.render('tool_analytics/evaluation_options', {\n trainedexternally: trainedOnlyExternally,\n timesplittingmethods: JSON.parse(timeSplittingMethods)\n });\n\n $.when(stringsPromise, modalPromise).then(function(strings, modal) {\n\n\n modal.getRoot().on(ModalEvents.hidden, modal.destroy.bind(modal));\n\n modal.setTitle(strings[0]);\n modal.setSaveButtonText(strings[1]);\n modal.setBody(bodyPromise);\n\n modal.getRoot().on(ModalEvents.save, function() {\n\n // Evaluation mode.\n var evaluationMode = $(\"input[name='evaluationmode']:checked\").val();\n if (evaluationMode == 'trainedmodel') {\n a.attr('href', a.attr('href') + '&mode=trainedmodel');\n }\n\n // Selected time-splitting id.\n var timeSplittingMethod = $(\"#id-evaluation-timesplitting\").val();\n a.attr('href', a.attr('href') + '×plitting=' + timeSplittingMethod);\n\n window.location.href = a.attr('href');\n return;\n });\n\n modal.show();\n return modal;\n }).fail(Notification.exception);\n });\n },\n\n /**\n * Displays export options.\n *\n * We have two main options: export training data and export configuration.\n * The 2nd option has an extra option: include the trained algorithm weights.\n *\n * @param {String} actionId\n * @param {Boolean} isTrained\n */\n selectExportOptions: function(actionId, isTrained) {\n $('[data-action-id=\"' + actionId + '\"]').on('click', function(ev) {\n ev.preventDefault();\n\n var a = $(ev.currentTarget);\n\n if (!isTrained) {\n // Export the model configuration if the model is not trained. We can't export anything else.\n a.attr('href', a.attr('href') + '&action=exportmodel&includeweights=0');\n window.location.href = a.attr('href');\n return;\n }\n\n var stringsPromise = Str.get_strings([\n {\n key: 'export',\n component: 'tool_analytics'\n }\n ]);\n var modalPromise = ModalFactory.create({type: ModalFactory.types.SAVE_CANCEL});\n var bodyPromise = Templates.render('tool_analytics/export_options', {});\n\n $.when(stringsPromise, modalPromise).then(function(strings, modal) {\n\n modal.getRoot().on(ModalEvents.hidden, modal.destroy.bind(modal));\n\n modal.setTitle(strings[0]);\n modal.setSaveButtonText(strings[0]);\n modal.setBody(bodyPromise);\n\n modal.getRoot().on(ModalEvents.save, function() {\n\n var exportOption = $(\"input[name='exportoption']:checked\").val();\n\n if (exportOption == 'exportdata') {\n a.attr('href', a.attr('href') + '&action=exportdata');\n\n } else {\n a.attr('href', a.attr('href') + '&action=exportmodel');\n if ($(\"#id-includeweights\").is(':checked')) {\n a.attr('href', a.attr('href') + '&includeweights=1');\n } else {\n a.attr('href', a.attr('href') + '&includeweights=0');\n }\n }\n\n window.location.href = a.attr('href');\n return;\n });\n\n modal.show();\n return modal;\n }).fail(Notification.exception);\n });\n }\n };\n});\n"],"names":["define","$","Str","log","Notification","ModalFactory","ModalEvents","Templates","actionsList","clear","title","key","component","body","delete","confirmAction","actionId","actionType","on","ev","preventDefault","a","currentTarget","wrap","reqStrings","param","closest","length","attr","error","stringsPromise","get_strings","modalPromise","create","type","types","SAVE_CANCEL","when","then","strings","modal","setTitle","setBody","setSaveButtonText","getRoot","save","window","location","href","show","fail","exception","selectEvaluationOptions","trainedOnlyExternally","timeSplittingMethods","this","bodyPromise","render","trainedexternally","timesplittingmethods","JSON","parse","hidden","destroy","bind","val","timeSplittingMethod","selectExportOptions","isTrained","is"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/analytics/amd/build/potential-contexts.min.js.map b/admin/tool/analytics/amd/build/potential-contexts.min.js.map index 82ec224e954..d720eb9d2c5 100644 --- a/admin/tool/analytics/amd/build/potential-contexts.min.js.map +++ b/admin/tool/analytics/amd/build/potential-contexts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"potential-contexts.min.js","sources":["../src/potential-contexts.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 * Potential contexts selector module.\n *\n * @module tool_analytics/potential-contexts\n * @copyright 2019 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax'], function($, Ajax) {\n\n return /** @alias module:tool_analytics/potential-contexts */ {\n\n processResults: function(selector, results) {\n var contexts = [];\n if ($.isArray(results)) {\n $.each(results, function(index, context) {\n contexts.push({\n value: context.id,\n label: context.name\n });\n });\n return contexts;\n\n } else {\n return results;\n }\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n\n let modelid = $(selector).attr('modelid') || null;\n promise = Ajax.call([{\n methodname: 'tool_analytics_potential_contexts',\n args: {\n query: query,\n modelid: modelid\n }\n }]);\n\n promise[0].then(success).fail(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","processResults","selector","results","contexts","isArray","each","index","context","push","value","id","label","name","transport","query","success","failure","modelid","attr","call","methodname","args","then","fail"],"mappings":";;;;;;;AAuBAA,2CAAO,CAAC,SAAU,cAAc,SAASC,EAAGC,YAEsB,CAE1DC,eAAgB,SAASC,SAAUC,aAC3BC,SAAW,UACXL,EAAEM,QAAQF,UACVJ,EAAEO,KAAKH,SAAS,SAASI,MAAOC,SAC5BJ,SAASK,KAAK,CACVC,MAAOF,QAAQG,GACfC,MAAOJ,QAAQK,UAGhBT,UAGAD,SAIfW,UAAW,SAASZ,SAAUa,MAAOC,QAASC,aAGtCC,QAAUnB,EAAEG,UAAUiB,KAAK,YAAc,KACnCnB,KAAKoB,KAAK,CAAC,CACjBC,WAAY,oCACZC,KAAM,CACFP,MAAOA,MACPG,QAASA,YAIT,GAAGK,KAAKP,SAASQ,KAAKP"} \ No newline at end of file +{"version":3,"file":"potential-contexts.min.js","sources":["../src/potential-contexts.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 * Potential contexts selector module.\n *\n * @module tool_analytics/potential-contexts\n * @copyright 2019 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax'], function($, Ajax) {\n\n return /** @alias module:tool_analytics/potential-contexts */ {\n\n processResults: function(selector, results) {\n var contexts = [];\n if ($.isArray(results)) {\n $.each(results, function(index, context) {\n contexts.push({\n value: context.id,\n label: context.name\n });\n });\n return contexts;\n\n } else {\n return results;\n }\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n\n let modelid = $(selector).attr('modelid') || null;\n promise = Ajax.call([{\n methodname: 'tool_analytics_potential_contexts',\n args: {\n query: query,\n modelid: modelid\n }\n }]);\n\n promise[0].then(success).fail(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","processResults","selector","results","contexts","isArray","each","index","context","push","value","id","label","name","transport","query","success","failure","modelid","attr","call","methodname","args","then","fail"],"mappings":";;;;;;;AAuBAA,OAAM,oCAAC,CAAC,SAAU,cAAc,SAASC,EAAGC,MAEsB,MAAA,CAE1DC,eAAgB,SAASC,SAAUC,SAC3BC,IAAAA,SAAW,GACf,OAAIL,EAAEM,QAAQF,UACVJ,EAAEO,KAAKH,SAAS,SAASI,MAAOC,SAC5BJ,SAASK,KAAK,CACVC,MAAOF,QAAQG,GACfC,MAAOJ,QAAQK,MAEtB,IACMT,UAGAD,OAd2C,EAkB1DW,UAAW,SAASZ,SAAUa,MAAOC,QAASC,SAC1C,IAEIC,QAAUnB,EAAEG,UAAUiB,KAAK,YAAc,KACnCnB,KAAKoB,KAAK,CAAC,CACjBC,WAAY,oCACZC,KAAM,CACFP,MAAOA,MACPG,QAASA,YAIT,GAAGK,KAAKP,SAASQ,KAAKP,QACjC,EAIR"} \ No newline at end of file diff --git a/admin/tool/behat/amd/build/steps.min.js.map b/admin/tool/behat/amd/build/steps.min.js.map index 6fb204a7630..49593c5647b 100644 --- a/admin/tool/behat/amd/build/steps.min.js.map +++ b/admin/tool/behat/amd/build/steps.min.js.map @@ -1 +1 @@ -{"version":3,"file":"steps.min.js","sources":["../src/steps.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\nimport Ajax from 'core/ajax';\nimport Templates from 'core/templates';\nimport PendingJS from 'core/pending';\n\n/**\n * Enhancements for the step definitions page.\n *\n * @module tool_behat/steps\n * @copyright 2022 Catalyst IT EU\n * @author Mark Johnson \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Call the get_entity_generator web service function\n *\n * Takes the name of an entity generator and returns an object containing a list of the required fields.\n *\n * @param {String} entityType\n * @returns {Promise}\n */\nconst getGeneratorEntities = (entityType) => Ajax.call([{\n methodname: 'tool_behat_get_entity_generator',\n args: {entitytype: entityType}\n}])[0];\n\n/**\n * Render HTML for required fields\n *\n * Takes the entity data returned from getGeneratorEntities and renders the HTML to display the required fields.\n *\n * @param {String} entityData\n * @return {Promise}\n */\nconst getRequiredFieldsContent = (entityData) => {\n if (!entityData.required?.length) {\n return Promise.resolve({\n html: '',\n js: ''\n });\n }\n return Templates.renderForPromise('tool_behat/steprequiredfields', {fields: entityData.required});\n};\n\nexport const init = () => {\n // When an entity is selected in the \"the following exist\" step, fetch and display the required fields.\n document.addEventListener('change', async(e) => {\n const entityElement = e.target.closest('.entities');\n const stepElement = e.target.closest('.stepcontent');\n if (!entityElement || !stepElement) {\n return;\n }\n\n const pendingPromise = new PendingJS('tool_behat/steps:change');\n\n const entityData = await getGeneratorEntities(e.target.value);\n const {html, js} = await getRequiredFieldsContent(entityData);\n\n const stepRequiredFields = stepElement.querySelector('.steprequiredfields');\n if (stepRequiredFields) {\n await Templates.replaceNode(stepRequiredFields, html, js);\n } else {\n await Templates.appendNodeContents(stepElement, html, js);\n }\n pendingPromise.resolve();\n });\n};\n"],"names":["getRequiredFieldsContent","entityData","required","_entityData$required","length","Templates","renderForPromise","fields","Promise","resolve","html","js","document","addEventListener","e","entityElement","target","closest","stepElement","pendingPromise","PendingJS","entityType","value","Ajax","call","methodname","args","entitytype","stepRequiredFields","querySelector","replaceNode","appendNodeContents"],"mappings":";;;;;;;;;IAiDMA,yBAA2B,SAACC,yEACzBA,WAAWC,0CAAXC,qBAAqBC,OAMnBC,mBAAUC,iBAAiB,gCAAiC,CAACC,OAAQN,WAAWC,WAL5EM,QAAQC,QAAQ,CACnBC,KAAM,GACNC,GAAI,oBAMI,uBAEhBC,SAASC,iBAAiB,sCAAU,iBAAMC,oNAChCC,cAAgBD,EAAEE,OAAOC,QAAQ,aACjCC,YAAcJ,EAAEE,OAAOC,QAAQ,gBAChCF,eAAkBG,kFAIjBC,eAAiB,IAAIC,iBAAU,2CAhCfC,WAkCwBP,EAAEE,OAAOM,MAlClBC,cAAKC,KAAK,CAAC,CACpDC,WAAY,kCACZC,KAAM,CAACC,WAAYN,eACnB,iBA+BUpB,0CACmBD,yBAAyBC,2DAA3CS,2BAAAA,KAAMC,yBAAAA,KAEPiB,mBAAqBV,YAAYW,cAAc,wEAE3CxB,mBAAUyB,YAAYF,mBAAoBlB,KAAMC,mEAEhDN,mBAAU0B,mBAAmBb,YAAaR,KAAMC,YAE1DQ,eAAeV,mDA3CM,IAACY"} \ No newline at end of file +{"version":3,"file":"steps.min.js","sources":["../src/steps.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\nimport Ajax from 'core/ajax';\nimport Templates from 'core/templates';\nimport PendingJS from 'core/pending';\n\n/**\n * Enhancements for the step definitions page.\n *\n * @module tool_behat/steps\n * @copyright 2022 Catalyst IT EU\n * @author Mark Johnson \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Call the get_entity_generator web service function\n *\n * Takes the name of an entity generator and returns an object containing a list of the required fields.\n *\n * @param {String} entityType\n * @returns {Promise}\n */\nconst getGeneratorEntities = (entityType) => Ajax.call([{\n methodname: 'tool_behat_get_entity_generator',\n args: {entitytype: entityType}\n}])[0];\n\n/**\n * Render HTML for required fields\n *\n * Takes the entity data returned from getGeneratorEntities and renders the HTML to display the required fields.\n *\n * @param {String} entityData\n * @return {Promise}\n */\nconst getRequiredFieldsContent = (entityData) => {\n if (!entityData.required?.length) {\n return Promise.resolve({\n html: '',\n js: ''\n });\n }\n return Templates.renderForPromise('tool_behat/steprequiredfields', {fields: entityData.required});\n};\n\nexport const init = () => {\n // When an entity is selected in the \"the following exist\" step, fetch and display the required fields.\n document.addEventListener('change', async(e) => {\n const entityElement = e.target.closest('.entities');\n const stepElement = e.target.closest('.stepcontent');\n if (!entityElement || !stepElement) {\n return;\n }\n\n const pendingPromise = new PendingJS('tool_behat/steps:change');\n\n const entityData = await getGeneratorEntities(e.target.value);\n const {html, js} = await getRequiredFieldsContent(entityData);\n\n const stepRequiredFields = stepElement.querySelector('.steprequiredfields');\n if (stepRequiredFields) {\n await Templates.replaceNode(stepRequiredFields, html, js);\n } else {\n await Templates.appendNodeContents(stepElement, html, js);\n }\n pendingPromise.resolve();\n });\n};\n"],"names":["_ajax","_interopRequireDefault","_templates","_pending","getRequiredFieldsContent","entityData","_entityData$required","required","length","Templates","renderForPromise","fields","Promise","resolve","html","js","_ref","document","addEventListener","regeneratorRuntime","mark","e","entityElement","stepElement","pendingPromise","_yield$getRequiredFie","stepRequiredFields","wrap","_context","prev","next","target","closest","abrupt","PendingJS","default","entityType","value","Ajax","call","methodname","args","entitytype","sent","querySelector","replaceNode","appendNodeContents","stop","_callee","_x","apply","this","arguments"],"mappings":"0fAeAA,MAAAC,uBAAAD,OACAE,WAAAD,uBAAAC,YACAC,SAAAF,uBAAAE;;;;;;;;;AAmBA,IAaMC,yBAA2B,SAACC,YAAe,IAAAC,qBACzC,eAAAA,qBAACD,WAAWE,0CAAXD,qBAAqBE,OAMnBC,WAAUC,QAAAA,iBAAiB,gCAAiC,CAACC,OAAQN,WAAWE,WAL5EK,QAAQC,QAAQ,CACnBC,KAAM,GACNC,GAAI,IAIf,gBAEmB,WAEhB,OAAAC,KAAAC,SAASC,iBAAiB,aAA1BC,mBAAAC,MAAoC,iBAAMC,GAAN,IAAAC,cAAAC,YAAAC,eAAAnB,WAAAoB,sBAAAX,KAAAC,GAAAW,mBAAA,OAAAP,mBAAAQ,MAAA,SAAAC,UAAA,OAAA,OAAAA,SAAAC,KAAAD,SAAAE,MAAA,KAAA,EAAA,GAC1BR,cAAgBD,EAAEU,OAAOC,QAAQ,aACjCT,YAAcF,EAAEU,OAAOC,QAAQ,gBAChCV,eAAkBC,YAHS,CAAAK,SAAAE,KAAA,EAAA,KAAA,CAAA,OAAAF,SAAAK,OAAA,UAAA,KAAA,EAAA,OAO1BT,eAAiB,IAAIU,SAAJC,QAAc,2BAPLP,SAAAE,KAAA,EAzBVM,WAkCwBf,EAAEU,OAAOM,MAlClBC,MAAAA,QAAKC,KAAK,CAAC,CACpDC,WAAY,kCACZC,KAAM,CAACC,WAAYN,eACnB,GAsBoC,KAAA,EAUPhC,OADnBC,WAT0BuB,SAAAe,KAAAf,SAAAE,KAAA,GAUP1B,yBAAyBC,YAVlB,KAAA,GAAA,GAAAoB,sBAAAG,SAAAe,KAUzB7B,2BAAAA,KAAMC,yBAAAA,KAEPW,mBAAqBH,YAAYqB,cAAc,wBAZrB,CAAAhB,SAAAE,KAAA,GAAA,KAAA,CActBrB,OAdsBmB,SAAAE,KAAA,GActBrB,WAAAA,QAAUoC,YAAYnB,mBAAoBZ,KAAMC,IAd1B,KAAA,GAAAa,SAAAE,KAAA,GAAA,MAAA,KAAA,GAgBtBrB,OAhBsBmB,SAAAE,KAAA,GAgBtBrB,WAAAA,QAAUqC,mBAAmBvB,YAAaT,KAAMC,IAhB1B,KAAA,GAkBhCS,eAAeX,UAlBiB,KAAA,GAAA,IAAA,MAAA,OAAAe,SAAAmB,OAzBX,IAACX,UAyBU,GAAAY,QAApC,IAAAhC,oTAAA,SAAAiC,IAAA,OAAAjC,KAAAkC,MAAAC,KAAAC,UAAA,GAoBH"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/add_category.min.js.map b/admin/tool/dataprivacy/amd/build/add_category.min.js.map index 21026b9f71b..5f3e7ecac9e 100644 --- a/admin/tool/dataprivacy/amd/build/add_category.min.js.map +++ b/admin/tool/dataprivacy/amd/build/add_category.min.js.map @@ -1 +1 @@ -{"version":3,"file":"add_category.min.js","sources":["../src/add_category.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 add categories.\n *\n * @module tool_dataprivacy/add_category\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/modal_factory', 'core/modal_events', 'core/fragment'],\n function($, Str, Ajax, Notification, ModalFactory, ModalEvents, Fragment) {\n\n var SELECTORS = {\n CATEGORY_LINK: '[data-add-element=\"category\"]',\n };\n\n var AddCategory = function(contextId) {\n this.contextId = contextId;\n\n var stringKeys = [\n {\n key: 'addcategory',\n component: 'tool_dataprivacy'\n },\n {\n key: 'save',\n component: 'admin'\n }\n ];\n this.strings = Str.get_strings(stringKeys);\n\n this.registerEventListeners();\n };\n\n /**\n * @var {int} contextId\n * @private\n */\n AddCategory.prototype.contextId = 0;\n\n /**\n * @var {Promise}\n * @private\n */\n AddCategory.prototype.strings = 0;\n\n AddCategory.prototype.registerEventListeners = function() {\n\n var trigger = $(SELECTORS.CATEGORY_LINK);\n trigger.on('click', function() {\n return this.strings.then(function(strings) {\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: strings[0],\n body: '',\n }, trigger).done(function(modal) {\n this.setupFormModal(modal, strings[1]);\n }.bind(this));\n }.bind(this))\n .fail(Notification.exception);\n }.bind(this));\n\n };\n\n /**\n * @method getBody\n * @param {Object} formdata\n * @private\n * @return {Promise}\n */\n AddCategory.prototype.getBody = function(formdata) {\n\n var params = null;\n if (typeof formdata !== \"undefined\") {\n params = {jsonformdata: JSON.stringify(formdata)};\n }\n // Get the content of the modal.\n return Fragment.loadFragment('tool_dataprivacy', 'addcategory_form', this.contextId, params);\n };\n\n AddCategory.prototype.setupFormModal = function(modal, saveText) {\n modal.setLarge();\n\n modal.setSaveButtonText(saveText);\n\n // We want to reset the form every time it is opened.\n modal.getRoot().on(ModalEvents.hidden, this.destroy.bind(this));\n\n modal.setBody(this.getBody());\n\n // We catch the modal save event, and use it to submit the form inside the modal.\n // Triggering a form submission will give JS validation scripts a chance to check for errors.\n modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));\n // We also catch the form submit event and use it to submit the form with ajax.\n modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));\n\n this.modal = modal;\n\n modal.show();\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n AddCategory.prototype.submitForm = function(e) {\n e.preventDefault();\n this.modal.getRoot().find('form').submit();\n };\n\n AddCategory.prototype.submitFormAjax = function(e) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = this.modal.getRoot().find('form').serialize();\n\n Ajax.call([{\n methodname: 'tool_dataprivacy_create_category_form',\n args: {jsonformdata: JSON.stringify(formData)},\n done: function(data) {\n if (data.validationerrors) {\n this.modal.setBody(this.getBody(formData));\n } else {\n this.close();\n }\n }.bind(this),\n fail: Notification.exception\n }]);\n };\n\n AddCategory.prototype.close = function() {\n this.destroy();\n document.location.reload();\n };\n\n AddCategory.prototype.destroy = function() {\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n this.modal.destroy();\n };\n\n AddCategory.prototype.removeListeners = function() {\n $(SELECTORS.CATEGORY_LINK).off('click');\n };\n\n return /** @alias module:tool_dataprivacy/add_category */ {\n getInstance: function(contextId) {\n return new AddCategory(contextId);\n }\n };\n }\n);\n\n"],"names":["define","$","Str","Ajax","Notification","ModalFactory","ModalEvents","Fragment","SELECTORS","AddCategory","contextId","strings","get_strings","key","component","registerEventListeners","prototype","trigger","on","this","then","create","type","types","SAVE_CANCEL","title","body","done","modal","setupFormModal","bind","fail","exception","getBody","formdata","params","jsonformdata","JSON","stringify","loadFragment","saveText","setLarge","setSaveButtonText","getRoot","hidden","destroy","setBody","save","submitForm","submitFormAjax","show","e","preventDefault","find","submit","formData","serialize","call","methodname","args","data","validationerrors","close","document","location","reload","Y","use","M","core_formchangechecker","reset_form_dirty_state","removeListeners","off","getInstance"],"mappings":";;;;;;;AAsBAA,uCAAO,CAAC,SAAU,WAAY,YAAa,oBAAqB,qBAAsB,oBAAqB,kBACvG,SAASC,EAAGC,IAAKC,KAAMC,aAAcC,aAAcC,YAAaC,cAExDC,wBACe,gCAGfC,YAAc,SAASC,gBAClBA,UAAYA,eAYZC,QAAUT,IAAIU,YAVF,CACb,CACIC,IAAK,cACLC,UAAW,oBAEf,CACID,IAAK,OACLC,UAAW,gBAKdC,iCAOTN,YAAYO,UAAUN,UAAY,EAMlCD,YAAYO,UAAUL,QAAU,EAEhCF,YAAYO,UAAUD,uBAAyB,eAEvCE,QAAUhB,EAAEO,yBAChBS,QAAQC,GAAG,QAAS,kBACTC,KAAKR,QAAQS,KAAK,SAAST,SAC9BN,aAAagB,OAAO,CAChBC,KAAMjB,aAAakB,MAAMC,YACzBC,MAAOd,QAAQ,GACfe,KAAM,IACPT,SAASU,KAAK,SAASC,YACjBC,eAAeD,MAAOjB,QAAQ,KACrCmB,KAAKX,QACTW,KAAKX,OACNY,KAAK3B,aAAa4B,YACrBF,KAAKX,QAUXV,YAAYO,UAAUiB,QAAU,SAASC,cAEjCC,OAAS,iBACW,IAAbD,WACPC,OAAS,CAACC,aAAcC,KAAKC,UAAUJ,YAGpC3B,SAASgC,aAAa,mBAAoB,mBAAoBpB,KAAKT,UAAWyB,SAGzF1B,YAAYO,UAAUa,eAAiB,SAASD,MAAOY,UACnDZ,MAAMa,WAENb,MAAMc,kBAAkBF,UAGxBZ,MAAMe,UAAUzB,GAAGZ,YAAYsC,OAAQzB,KAAK0B,QAAQf,KAAKX,OAEzDS,MAAMkB,QAAQ3B,KAAKc,WAInBL,MAAMe,UAAUzB,GAAGZ,YAAYyC,KAAM5B,KAAK6B,WAAWlB,KAAKX,OAE1DS,MAAMe,UAAUzB,GAAG,SAAU,OAAQC,KAAK8B,eAAenB,KAAKX,YAEzDS,MAAQA,MAEbA,MAAMsB,QAUVzC,YAAYO,UAAUgC,WAAa,SAASG,GACxCA,EAAEC,sBACGxB,MAAMe,UAAUU,KAAK,QAAQC,UAGtC7C,YAAYO,UAAUiC,eAAiB,SAASE,GAE5CA,EAAEC,qBAGEG,SAAWpC,KAAKS,MAAMe,UAAUU,KAAK,QAAQG,YAEjDrD,KAAKsD,KAAK,CAAC,CACPC,WAAY,wCACZC,KAAM,CAACvB,aAAcC,KAAKC,UAAUiB,WACpC5B,KAAM,SAASiC,MACPA,KAAKC,sBACAjC,MAAMkB,QAAQ3B,KAAKc,QAAQsB,gBAE3BO,SAEXhC,KAAKX,MACPY,KAAM3B,aAAa4B,cAI3BvB,YAAYO,UAAU8C,MAAQ,gBACrBjB,UACLkB,SAASC,SAASC,UAGtBxD,YAAYO,UAAU6B,QAAU,WAC5BqB,EAAEC,IAAI,iCAAiC,WACnCC,EAAEC,uBAAuBC,iCAExB1C,MAAMiB,WAGfpC,YAAYO,UAAUuD,gBAAkB,WACpCtE,EAAEO,yBAAyBgE,IAAI,UAGuB,CACtDC,YAAa,SAAS/D,kBACX,IAAID,YAAYC"} \ No newline at end of file +{"version":3,"file":"add_category.min.js","sources":["../src/add_category.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 add categories.\n *\n * @module tool_dataprivacy/add_category\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/modal_factory', 'core/modal_events', 'core/fragment'],\n function($, Str, Ajax, Notification, ModalFactory, ModalEvents, Fragment) {\n\n var SELECTORS = {\n CATEGORY_LINK: '[data-add-element=\"category\"]',\n };\n\n var AddCategory = function(contextId) {\n this.contextId = contextId;\n\n var stringKeys = [\n {\n key: 'addcategory',\n component: 'tool_dataprivacy'\n },\n {\n key: 'save',\n component: 'admin'\n }\n ];\n this.strings = Str.get_strings(stringKeys);\n\n this.registerEventListeners();\n };\n\n /**\n * @var {int} contextId\n * @private\n */\n AddCategory.prototype.contextId = 0;\n\n /**\n * @var {Promise}\n * @private\n */\n AddCategory.prototype.strings = 0;\n\n AddCategory.prototype.registerEventListeners = function() {\n\n var trigger = $(SELECTORS.CATEGORY_LINK);\n trigger.on('click', function() {\n return this.strings.then(function(strings) {\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: strings[0],\n body: '',\n }, trigger).done(function(modal) {\n this.setupFormModal(modal, strings[1]);\n }.bind(this));\n }.bind(this))\n .fail(Notification.exception);\n }.bind(this));\n\n };\n\n /**\n * @method getBody\n * @param {Object} formdata\n * @private\n * @return {Promise}\n */\n AddCategory.prototype.getBody = function(formdata) {\n\n var params = null;\n if (typeof formdata !== \"undefined\") {\n params = {jsonformdata: JSON.stringify(formdata)};\n }\n // Get the content of the modal.\n return Fragment.loadFragment('tool_dataprivacy', 'addcategory_form', this.contextId, params);\n };\n\n AddCategory.prototype.setupFormModal = function(modal, saveText) {\n modal.setLarge();\n\n modal.setSaveButtonText(saveText);\n\n // We want to reset the form every time it is opened.\n modal.getRoot().on(ModalEvents.hidden, this.destroy.bind(this));\n\n modal.setBody(this.getBody());\n\n // We catch the modal save event, and use it to submit the form inside the modal.\n // Triggering a form submission will give JS validation scripts a chance to check for errors.\n modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));\n // We also catch the form submit event and use it to submit the form with ajax.\n modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));\n\n this.modal = modal;\n\n modal.show();\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n AddCategory.prototype.submitForm = function(e) {\n e.preventDefault();\n this.modal.getRoot().find('form').submit();\n };\n\n AddCategory.prototype.submitFormAjax = function(e) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = this.modal.getRoot().find('form').serialize();\n\n Ajax.call([{\n methodname: 'tool_dataprivacy_create_category_form',\n args: {jsonformdata: JSON.stringify(formData)},\n done: function(data) {\n if (data.validationerrors) {\n this.modal.setBody(this.getBody(formData));\n } else {\n this.close();\n }\n }.bind(this),\n fail: Notification.exception\n }]);\n };\n\n AddCategory.prototype.close = function() {\n this.destroy();\n document.location.reload();\n };\n\n AddCategory.prototype.destroy = function() {\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n this.modal.destroy();\n };\n\n AddCategory.prototype.removeListeners = function() {\n $(SELECTORS.CATEGORY_LINK).off('click');\n };\n\n return /** @alias module:tool_dataprivacy/add_category */ {\n getInstance: function(contextId) {\n return new AddCategory(contextId);\n }\n };\n }\n);\n\n"],"names":["define","$","Str","Ajax","Notification","ModalFactory","ModalEvents","Fragment","SELECTORS","AddCategory","contextId","this","strings","get_strings","key","component","registerEventListeners","prototype","trigger","on","then","create","type","types","SAVE_CANCEL","title","body","done","modal","setupFormModal","bind","fail","exception","getBody","formdata","params","jsonformdata","JSON","stringify","loadFragment","saveText","setLarge","setSaveButtonText","getRoot","hidden","destroy","setBody","save","submitForm","submitFormAjax","show","e","preventDefault","find","submit","formData","serialize","call","methodname","args","data","validationerrors","close","document","location","reload","Y","use","M","core_formchangechecker","reset_form_dirty_state","removeListeners","off","getInstance"],"mappings":";;;;;;;AAsBAA,OAAO,gCAAA,CAAC,SAAU,WAAY,YAAa,oBAAqB,qBAAsB,oBAAqB,kBACvG,SAASC,EAAGC,IAAKC,KAAMC,aAAcC,aAAcC,YAAaC,UAE5D,IAAIC,wBACe,gCAGfC,YAAc,SAASC,WAClBA,KAAAA,UAAYA,UAYjBC,KAAKC,QAAUV,IAAIW,YAVF,CACb,CACIC,IAAK,cACLC,UAAW,oBAEf,CACID,IAAK,OACLC,UAAW,WAKnBJ,KAAKK,wBACR,EAsHyD,OAhH1DP,YAAYQ,UAAUP,UAAY,EAMlCD,YAAYQ,UAAUL,QAAU,EAEhCH,YAAYQ,UAAUD,uBAAyB,WAE3C,IAAIE,QAAUjB,EAAEO,yBAChBU,QAAQC,GAAG,QAAS,WAChB,OAAOR,KAAKC,QAAQQ,KAAK,SAASR,SAC9BP,aAAagB,OAAO,CAChBC,KAAMjB,aAAakB,MAAMC,YACzBC,MAAOb,QAAQ,GACfc,KAAM,IACPR,SAASS,KAAK,SAASC,OACtBjB,KAAKkB,eAAeD,MAAOhB,QAAQ,GACtC,EAACkB,KAAKnB,MACV,EAACmB,KAAKnB,OACNoB,KAAK3B,aAAa4B,UACtB,EAACF,KAAKnB,MAEV,EAQDF,YAAYQ,UAAUgB,QAAU,SAASC,UAEjCC,IAAAA,OAAS,KAKb,YAJwB,IAAbD,WACPC,OAAS,CAACC,aAAcC,KAAKC,UAAUJ,YAGpC3B,SAASgC,aAAa,mBAAoB,mBAAoB5B,KAAKD,UAAWyB,OACxF,EAED1B,YAAYQ,UAAUY,eAAiB,SAASD,MAAOY,UACnDZ,MAAMa,WAENb,MAAMc,kBAAkBF,UAGxBZ,MAAMe,UAAUxB,GAAGb,YAAYsC,OAAQjC,KAAKkC,QAAQf,KAAKnB,OAEzDiB,MAAMkB,QAAQnC,KAAKsB,WAInBL,MAAMe,UAAUxB,GAAGb,YAAYyC,KAAMpC,KAAKqC,WAAWlB,KAAKnB,OAE1DiB,MAAMe,UAAUxB,GAAG,SAAU,OAAQR,KAAKsC,eAAenB,KAAKnB,OAEzDiB,KAAAA,MAAQA,MAEbA,MAAMsB,MACT,EASDzC,YAAYQ,UAAU+B,WAAa,SAASG,GACxCA,EAAEC,iBACGxB,KAAAA,MAAMe,UAAUU,KAAK,QAAQC,QACrC,EAED7C,YAAYQ,UAAUgC,eAAiB,SAASE,GAE5CA,EAAEC,iBAGF,IAAIG,SAAW5C,KAAKiB,MAAMe,UAAUU,KAAK,QAAQG,YAEjDrD,KAAKsD,KAAK,CAAC,CACPC,WAAY,wCACZC,KAAM,CAACvB,aAAcC,KAAKC,UAAUiB,WACpC5B,KAAM,SAASiC,MACPA,KAAKC,iBACAjC,KAAAA,MAAMkB,QAAQnC,KAAKsB,QAAQsB,WAEhC5C,KAAKmD,OAEZ,EAAChC,KAAKnB,MACPoB,KAAM3B,aAAa4B,YAE1B,EAEDvB,YAAYQ,UAAU6C,MAAQ,WAC1BnD,KAAKkC,UACLkB,SAASC,SAASC,QACrB,EAEDxD,YAAYQ,UAAU4B,QAAU,WAC5BqB,EAAEC,IAAI,iCAAiC,WACnCC,EAAEC,uBAAuBC,wBAC5B,IACI1C,KAAAA,MAAMiB,SACd,EAEDpC,YAAYQ,UAAUsD,gBAAkB,WACpCtE,EAAEO,yBAAyBgE,IAAI,QAClC,EAEyD,CACtDC,YAAa,SAAS/D,WAClB,OAAO,IAAID,YAAYC,UAC1B,EAER"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/add_purpose.min.js.map b/admin/tool/dataprivacy/amd/build/add_purpose.min.js.map index 9d8acf4e897..93453826457 100644 --- a/admin/tool/dataprivacy/amd/build/add_purpose.min.js.map +++ b/admin/tool/dataprivacy/amd/build/add_purpose.min.js.map @@ -1 +1 @@ -{"version":3,"file":"add_purpose.min.js","sources":["../src/add_purpose.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 add purposes.\n *\n * @module tool_dataprivacy/add_purpose\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/modal_factory', 'core/modal_events', 'core/fragment'],\n function($, Str, Ajax, Notification, ModalFactory, ModalEvents, Fragment) {\n\n var SELECTORS = {\n PURPOSE_LINK: '[data-add-element=\"purpose\"]',\n };\n\n var AddPurpose = function(contextId) {\n this.contextId = contextId;\n\n var stringKeys = [\n {\n key: 'addpurpose',\n component: 'tool_dataprivacy'\n },\n {\n key: 'save',\n component: 'admin'\n }\n ];\n this.strings = Str.get_strings(stringKeys);\n\n this.registerEventListeners();\n };\n\n /**\n * @var {int} contextId\n * @private\n */\n AddPurpose.prototype.contextId = 0;\n\n /**\n * @var {Promise}\n * @private\n */\n AddPurpose.prototype.strings = 0;\n\n AddPurpose.prototype.registerEventListeners = function() {\n\n var trigger = $(SELECTORS.PURPOSE_LINK);\n trigger.on('click', function() {\n return this.strings.then(function(strings) {\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: strings[0],\n body: '',\n }, trigger).done(function(modal) {\n this.setupFormModal(modal, strings[1]);\n }.bind(this));\n }.bind(this))\n .fail(Notification.exception);\n }.bind(this));\n\n };\n\n /**\n * @method getBody\n * @param {Object} formdata\n * @private\n * @return {Promise}\n */\n AddPurpose.prototype.getBody = function(formdata) {\n\n var params = null;\n if (typeof formdata !== \"undefined\") {\n params = {jsonformdata: JSON.stringify(formdata)};\n }\n // Get the content of the modal.\n return Fragment.loadFragment('tool_dataprivacy', 'addpurpose_form', this.contextId, params);\n };\n\n AddPurpose.prototype.setupFormModal = function(modal, saveText) {\n modal.setLarge();\n\n modal.setSaveButtonText(saveText);\n\n // We want to reset the form every time it is opened.\n modal.getRoot().on(ModalEvents.hidden, this.destroy.bind(this));\n\n modal.setBody(this.getBody());\n\n // We catch the modal save event, and use it to submit the form inside the modal.\n // Triggering a form submission will give JS validation scripts a chance to check for errors.\n modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));\n // We also catch the form submit event and use it to submit the form with ajax.\n modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));\n\n this.modal = modal;\n\n modal.show();\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n AddPurpose.prototype.submitForm = function(e) {\n e.preventDefault();\n this.modal.getRoot().find('form').submit();\n };\n\n AddPurpose.prototype.submitFormAjax = function(e) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = this.modal.getRoot().find('form').serialize();\n\n Ajax.call([{\n methodname: 'tool_dataprivacy_create_purpose_form',\n args: {jsonformdata: JSON.stringify(formData)},\n done: function(data) {\n if (data.validationerrors) {\n this.modal.setBody(this.getBody(formData));\n } else {\n this.close();\n }\n }.bind(this),\n\n fail: Notification.exception\n }]);\n };\n\n AddPurpose.prototype.close = function() {\n this.destroy();\n document.location.reload();\n };\n\n AddPurpose.prototype.destroy = function() {\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n this.modal.destroy();\n };\n\n AddPurpose.prototype.removeListeners = function() {\n $(SELECTORS.PURPOSE_LINK).off('click');\n };\n\n return /** @alias module:tool_dataprivacy/add_purpose */ {\n getInstance: function(contextId) {\n return new AddPurpose(contextId);\n }\n };\n }\n);\n\n"],"names":["define","$","Str","Ajax","Notification","ModalFactory","ModalEvents","Fragment","SELECTORS","AddPurpose","contextId","strings","get_strings","key","component","registerEventListeners","prototype","trigger","on","this","then","create","type","types","SAVE_CANCEL","title","body","done","modal","setupFormModal","bind","fail","exception","getBody","formdata","params","jsonformdata","JSON","stringify","loadFragment","saveText","setLarge","setSaveButtonText","getRoot","hidden","destroy","setBody","save","submitForm","submitFormAjax","show","e","preventDefault","find","submit","formData","serialize","call","methodname","args","data","validationerrors","close","document","location","reload","Y","use","M","core_formchangechecker","reset_form_dirty_state","removeListeners","off","getInstance"],"mappings":";;;;;;;AAsBAA,sCAAO,CAAC,SAAU,WAAY,YAAa,oBAAqB,qBAAsB,oBAAqB,kBACvG,SAASC,EAAGC,IAAKC,KAAMC,aAAcC,aAAcC,YAAaC,cAExDC,uBACc,+BAGdC,WAAa,SAASC,gBACjBA,UAAYA,eAYZC,QAAUT,IAAIU,YAVF,CACb,CACIC,IAAK,aACLC,UAAW,oBAEf,CACID,IAAK,OACLC,UAAW,gBAKdC,iCAOTN,WAAWO,UAAUN,UAAY,EAMjCD,WAAWO,UAAUL,QAAU,EAE/BF,WAAWO,UAAUD,uBAAyB,eAEtCE,QAAUhB,EAAEO,wBAChBS,QAAQC,GAAG,QAAS,kBACTC,KAAKR,QAAQS,KAAK,SAAST,SAC9BN,aAAagB,OAAO,CAChBC,KAAMjB,aAAakB,MAAMC,YACzBC,MAAOd,QAAQ,GACfe,KAAM,IACPT,SAASU,KAAK,SAASC,YACjBC,eAAeD,MAAOjB,QAAQ,KACrCmB,KAAKX,QACTW,KAAKX,OACNY,KAAK3B,aAAa4B,YACrBF,KAAKX,QAUXV,WAAWO,UAAUiB,QAAU,SAASC,cAEhCC,OAAS,iBACW,IAAbD,WACPC,OAAS,CAACC,aAAcC,KAAKC,UAAUJ,YAGpC3B,SAASgC,aAAa,mBAAoB,kBAAmBpB,KAAKT,UAAWyB,SAGxF1B,WAAWO,UAAUa,eAAiB,SAASD,MAAOY,UAClDZ,MAAMa,WAENb,MAAMc,kBAAkBF,UAGxBZ,MAAMe,UAAUzB,GAAGZ,YAAYsC,OAAQzB,KAAK0B,QAAQf,KAAKX,OAEzDS,MAAMkB,QAAQ3B,KAAKc,WAInBL,MAAMe,UAAUzB,GAAGZ,YAAYyC,KAAM5B,KAAK6B,WAAWlB,KAAKX,OAE1DS,MAAMe,UAAUzB,GAAG,SAAU,OAAQC,KAAK8B,eAAenB,KAAKX,YAEzDS,MAAQA,MAEbA,MAAMsB,QAUVzC,WAAWO,UAAUgC,WAAa,SAASG,GACvCA,EAAEC,sBACGxB,MAAMe,UAAUU,KAAK,QAAQC,UAGtC7C,WAAWO,UAAUiC,eAAiB,SAASE,GAE3CA,EAAEC,qBAGEG,SAAWpC,KAAKS,MAAMe,UAAUU,KAAK,QAAQG,YAEjDrD,KAAKsD,KAAK,CAAC,CACPC,WAAY,uCACZC,KAAM,CAACvB,aAAcC,KAAKC,UAAUiB,WACpC5B,KAAM,SAASiC,MACPA,KAAKC,sBACAjC,MAAMkB,QAAQ3B,KAAKc,QAAQsB,gBAE3BO,SAEXhC,KAAKX,MAEPY,KAAM3B,aAAa4B,cAI3BvB,WAAWO,UAAU8C,MAAQ,gBACpBjB,UACLkB,SAASC,SAASC,UAGtBxD,WAAWO,UAAU6B,QAAU,WAC3BqB,EAAEC,IAAI,iCAAiC,WACnCC,EAAEC,uBAAuBC,iCAExB1C,MAAMiB,WAGfpC,WAAWO,UAAUuD,gBAAkB,WACnCtE,EAAEO,wBAAwBgE,IAAI,UAGuB,CACrDC,YAAa,SAAS/D,kBACX,IAAID,WAAWC"} \ No newline at end of file +{"version":3,"file":"add_purpose.min.js","sources":["../src/add_purpose.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 add purposes.\n *\n * @module tool_dataprivacy/add_purpose\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/modal_factory', 'core/modal_events', 'core/fragment'],\n function($, Str, Ajax, Notification, ModalFactory, ModalEvents, Fragment) {\n\n var SELECTORS = {\n PURPOSE_LINK: '[data-add-element=\"purpose\"]',\n };\n\n var AddPurpose = function(contextId) {\n this.contextId = contextId;\n\n var stringKeys = [\n {\n key: 'addpurpose',\n component: 'tool_dataprivacy'\n },\n {\n key: 'save',\n component: 'admin'\n }\n ];\n this.strings = Str.get_strings(stringKeys);\n\n this.registerEventListeners();\n };\n\n /**\n * @var {int} contextId\n * @private\n */\n AddPurpose.prototype.contextId = 0;\n\n /**\n * @var {Promise}\n * @private\n */\n AddPurpose.prototype.strings = 0;\n\n AddPurpose.prototype.registerEventListeners = function() {\n\n var trigger = $(SELECTORS.PURPOSE_LINK);\n trigger.on('click', function() {\n return this.strings.then(function(strings) {\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: strings[0],\n body: '',\n }, trigger).done(function(modal) {\n this.setupFormModal(modal, strings[1]);\n }.bind(this));\n }.bind(this))\n .fail(Notification.exception);\n }.bind(this));\n\n };\n\n /**\n * @method getBody\n * @param {Object} formdata\n * @private\n * @return {Promise}\n */\n AddPurpose.prototype.getBody = function(formdata) {\n\n var params = null;\n if (typeof formdata !== \"undefined\") {\n params = {jsonformdata: JSON.stringify(formdata)};\n }\n // Get the content of the modal.\n return Fragment.loadFragment('tool_dataprivacy', 'addpurpose_form', this.contextId, params);\n };\n\n AddPurpose.prototype.setupFormModal = function(modal, saveText) {\n modal.setLarge();\n\n modal.setSaveButtonText(saveText);\n\n // We want to reset the form every time it is opened.\n modal.getRoot().on(ModalEvents.hidden, this.destroy.bind(this));\n\n modal.setBody(this.getBody());\n\n // We catch the modal save event, and use it to submit the form inside the modal.\n // Triggering a form submission will give JS validation scripts a chance to check for errors.\n modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));\n // We also catch the form submit event and use it to submit the form with ajax.\n modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));\n\n this.modal = modal;\n\n modal.show();\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n AddPurpose.prototype.submitForm = function(e) {\n e.preventDefault();\n this.modal.getRoot().find('form').submit();\n };\n\n AddPurpose.prototype.submitFormAjax = function(e) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = this.modal.getRoot().find('form').serialize();\n\n Ajax.call([{\n methodname: 'tool_dataprivacy_create_purpose_form',\n args: {jsonformdata: JSON.stringify(formData)},\n done: function(data) {\n if (data.validationerrors) {\n this.modal.setBody(this.getBody(formData));\n } else {\n this.close();\n }\n }.bind(this),\n\n fail: Notification.exception\n }]);\n };\n\n AddPurpose.prototype.close = function() {\n this.destroy();\n document.location.reload();\n };\n\n AddPurpose.prototype.destroy = function() {\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n this.modal.destroy();\n };\n\n AddPurpose.prototype.removeListeners = function() {\n $(SELECTORS.PURPOSE_LINK).off('click');\n };\n\n return /** @alias module:tool_dataprivacy/add_purpose */ {\n getInstance: function(contextId) {\n return new AddPurpose(contextId);\n }\n };\n }\n);\n\n"],"names":["define","$","Str","Ajax","Notification","ModalFactory","ModalEvents","Fragment","SELECTORS","AddPurpose","contextId","this","strings","get_strings","key","component","registerEventListeners","prototype","trigger","on","then","create","type","types","SAVE_CANCEL","title","body","done","modal","setupFormModal","bind","fail","exception","getBody","formdata","params","jsonformdata","JSON","stringify","loadFragment","saveText","setLarge","setSaveButtonText","getRoot","hidden","destroy","setBody","save","submitForm","submitFormAjax","show","e","preventDefault","find","submit","formData","serialize","call","methodname","args","data","validationerrors","close","document","location","reload","Y","use","M","core_formchangechecker","reset_form_dirty_state","removeListeners","off","getInstance"],"mappings":";;;;;;;AAsBAA,OAAO,+BAAA,CAAC,SAAU,WAAY,YAAa,oBAAqB,qBAAsB,oBAAqB,kBACvG,SAASC,EAAGC,IAAKC,KAAMC,aAAcC,aAAcC,YAAaC,UAE5D,IAAIC,uBACc,+BAGdC,WAAa,SAASC,WACjBA,KAAAA,UAAYA,UAYjBC,KAAKC,QAAUV,IAAIW,YAVF,CACb,CACIC,IAAK,aACLC,UAAW,oBAEf,CACID,IAAK,OACLC,UAAW,WAKnBJ,KAAKK,wBACR,EAuHwD,OAjHzDP,WAAWQ,UAAUP,UAAY,EAMjCD,WAAWQ,UAAUL,QAAU,EAE/BH,WAAWQ,UAAUD,uBAAyB,WAE1C,IAAIE,QAAUjB,EAAEO,wBAChBU,QAAQC,GAAG,QAAS,WAChB,OAAOR,KAAKC,QAAQQ,KAAK,SAASR,SAC9BP,aAAagB,OAAO,CAChBC,KAAMjB,aAAakB,MAAMC,YACzBC,MAAOb,QAAQ,GACfc,KAAM,IACPR,SAASS,KAAK,SAASC,OACtBjB,KAAKkB,eAAeD,MAAOhB,QAAQ,GACtC,EAACkB,KAAKnB,MACV,EAACmB,KAAKnB,OACNoB,KAAK3B,aAAa4B,UACtB,EAACF,KAAKnB,MAEV,EAQDF,WAAWQ,UAAUgB,QAAU,SAASC,UAEhCC,IAAAA,OAAS,KAKb,YAJwB,IAAbD,WACPC,OAAS,CAACC,aAAcC,KAAKC,UAAUJ,YAGpC3B,SAASgC,aAAa,mBAAoB,kBAAmB5B,KAAKD,UAAWyB,OACvF,EAED1B,WAAWQ,UAAUY,eAAiB,SAASD,MAAOY,UAClDZ,MAAMa,WAENb,MAAMc,kBAAkBF,UAGxBZ,MAAMe,UAAUxB,GAAGb,YAAYsC,OAAQjC,KAAKkC,QAAQf,KAAKnB,OAEzDiB,MAAMkB,QAAQnC,KAAKsB,WAInBL,MAAMe,UAAUxB,GAAGb,YAAYyC,KAAMpC,KAAKqC,WAAWlB,KAAKnB,OAE1DiB,MAAMe,UAAUxB,GAAG,SAAU,OAAQR,KAAKsC,eAAenB,KAAKnB,OAEzDiB,KAAAA,MAAQA,MAEbA,MAAMsB,MACT,EASDzC,WAAWQ,UAAU+B,WAAa,SAASG,GACvCA,EAAEC,iBACGxB,KAAAA,MAAMe,UAAUU,KAAK,QAAQC,QACrC,EAED7C,WAAWQ,UAAUgC,eAAiB,SAASE,GAE3CA,EAAEC,iBAGF,IAAIG,SAAW5C,KAAKiB,MAAMe,UAAUU,KAAK,QAAQG,YAEjDrD,KAAKsD,KAAK,CAAC,CACPC,WAAY,uCACZC,KAAM,CAACvB,aAAcC,KAAKC,UAAUiB,WACpC5B,KAAM,SAASiC,MACPA,KAAKC,iBACAjC,KAAAA,MAAMkB,QAAQnC,KAAKsB,QAAQsB,WAEhC5C,KAAKmD,OAEZ,EAAChC,KAAKnB,MAEPoB,KAAM3B,aAAa4B,YAE1B,EAEDvB,WAAWQ,UAAU6C,MAAQ,WACzBnD,KAAKkC,UACLkB,SAASC,SAASC,QACrB,EAEDxD,WAAWQ,UAAU4B,QAAU,WAC3BqB,EAAEC,IAAI,iCAAiC,WACnCC,EAAEC,uBAAuBC,wBAC5B,IACI1C,KAAAA,MAAMiB,SACd,EAEDpC,WAAWQ,UAAUsD,gBAAkB,WACnCtE,EAAEO,wBAAwBgE,IAAI,QACjC,EAEwD,CACrDC,YAAa,SAAS/D,WAClB,OAAO,IAAID,WAAWC,UACzB,EAER"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/categoriesactions.min.js.map b/admin/tool/dataprivacy/amd/build/categoriesactions.min.js.map index 683666ec3bb..c8471c76e13 100644 --- a/admin/tool/dataprivacy/amd/build/categoriesactions.min.js.map +++ b/admin/tool/dataprivacy/amd/build/categoriesactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"categoriesactions.min.js","sources":["../src/categoriesactions.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 * AMD module for categories actions.\n *\n * @module tool_dataprivacy/categoriesactions\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{DELETE: string}}\n */\n var ACTIONS = {\n DELETE: '[data-action=\"deletecategory\"]',\n };\n\n /**\n * CategoriesActions class.\n */\n var CategoriesActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n CategoriesActions.prototype.registerEvents = function() {\n $(ACTIONS.DELETE).click(function(e) {\n e.preventDefault();\n\n var id = $(this).data('id');\n var categoryname = $(this).data('name');\n var stringkeys = [\n {\n key: 'deletecategory',\n component: 'tool_dataprivacy'\n },\n {\n key: 'deletecategorytext',\n component: 'tool_dataprivacy',\n param: categoryname\n },\n {\n key: 'delete'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langStrings) {\n var title = langStrings[0];\n var confirmMessage = langStrings[1];\n var buttonText = langStrings[2];\n return ModalFactory.create({\n title: title,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n }).then(function(modal) {\n modal.setSaveButtonText(buttonText);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n\n var request = {\n methodname: 'tool_dataprivacy_delete_category',\n args: {'id': id}\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n $('tr[data-categoryid=\"' + id + '\"]').remove();\n } else {\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n });\n }).done(function(modal) {\n modal.show();\n\n }).fail(Notification.exception);\n });\n };\n\n return /** @alias module:tool_dataprivacy/categoriesactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the module.\n *\n * @method init\n * @return {CategoriesActions}\n */\n 'init': function() {\n return new CategoriesActions();\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","ACTIONS","CategoriesActions","registerEvents","prototype","click","e","preventDefault","id","this","data","stringkeys","key","component","param","get_strings","then","langStrings","title","confirmMessage","buttonText","create","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","request","methodname","args","call","done","result","remove","addNotification","message","warnings","fail","exception","hidden","destroy","show"],"mappings":";;;;;;;AAsBAA,4CAAO,CACH,SACA,YACA,oBACA,WACA,qBACA,sBACJ,SAASC,EAAGC,KAAMC,aAAcC,IAAKC,aAAcC,iBAO3CC,eACQ,iCAMRC,kBAAoB,gBACfC,yBAMTD,kBAAkBE,UAAUD,eAAiB,WACzCR,EAAEM,gBAAgBI,OAAM,SAASC,GAC7BA,EAAEC,qBAEEC,GAAKb,EAAEc,MAAMC,KAAK,MAElBC,WAAa,CACb,CACIC,IAAK,iBACLC,UAAW,oBAEf,CACID,IAAK,qBACLC,UAAW,mBACXC,MATWnB,EAAEc,MAAMC,KAAK,SAW5B,CACIE,IAAK,WAIbd,IAAIiB,YAAYJ,YAAYK,MAAK,SAASC,iBAClCC,MAAQD,YAAY,GACpBE,eAAiBF,YAAY,GAC7BG,WAAaH,YAAY,UACtBlB,aAAasB,OAAO,CACvBH,MAAOA,MACPI,KAAMH,eACNI,KAAMxB,aAAayB,MAAMC,cAC1BT,MAAK,SAASU,cACbA,MAAMC,kBAAkBP,YAGxBM,MAAME,UAAUC,GAAG7B,YAAY8B,MAAM,eAE7BC,QAAU,CACVC,WAAY,mCACZC,KAAM,IAAOzB,KAGjBZ,KAAKsC,KAAK,CAACH,UAAU,GAAGI,MAAK,SAASzB,MAC9BA,KAAK0B,OACLzC,EAAE,uBAAyBa,GAAK,MAAM6B,SAEtCxC,aAAayC,gBAAgB,CACzBC,QAAS7B,KAAK8B,SAAS,GAAGD,QAC1BhB,KAAM,aAGfkB,KAAK5C,aAAa6C,cAIzBhB,MAAME,UAAUC,GAAG7B,YAAY2C,QAAQ,WAEnCjB,MAAMkB,aAGHlB,YAEZS,MAAK,SAAST,OACbA,MAAMmB,UAEPJ,KAAK5C,aAAa6C,eAIkC,MASnD,kBACG,IAAIxC"} \ No newline at end of file +{"version":3,"file":"categoriesactions.min.js","sources":["../src/categoriesactions.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 * AMD module for categories actions.\n *\n * @module tool_dataprivacy/categoriesactions\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{DELETE: string}}\n */\n var ACTIONS = {\n DELETE: '[data-action=\"deletecategory\"]',\n };\n\n /**\n * CategoriesActions class.\n */\n var CategoriesActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n CategoriesActions.prototype.registerEvents = function() {\n $(ACTIONS.DELETE).click(function(e) {\n e.preventDefault();\n\n var id = $(this).data('id');\n var categoryname = $(this).data('name');\n var stringkeys = [\n {\n key: 'deletecategory',\n component: 'tool_dataprivacy'\n },\n {\n key: 'deletecategorytext',\n component: 'tool_dataprivacy',\n param: categoryname\n },\n {\n key: 'delete'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langStrings) {\n var title = langStrings[0];\n var confirmMessage = langStrings[1];\n var buttonText = langStrings[2];\n return ModalFactory.create({\n title: title,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n }).then(function(modal) {\n modal.setSaveButtonText(buttonText);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n\n var request = {\n methodname: 'tool_dataprivacy_delete_category',\n args: {'id': id}\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n $('tr[data-categoryid=\"' + id + '\"]').remove();\n } else {\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n });\n }).done(function(modal) {\n modal.show();\n\n }).fail(Notification.exception);\n });\n };\n\n return /** @alias module:tool_dataprivacy/categoriesactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the module.\n *\n * @method init\n * @return {CategoriesActions}\n */\n 'init': function() {\n return new CategoriesActions();\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","ACTIONS","CategoriesActions","this","registerEvents","prototype","click","e","preventDefault","id","data","stringkeys","key","component","param","get_strings","then","langStrings","title","confirmMessage","buttonText","create","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","request","methodname","args","call","done","result","remove","addNotification","message","warnings","fail","exception","hidden","destroy","show","init"],"mappings":";;;;;;;AAsBAA,OAAM,qCAAC,CACH,SACA,YACA,oBACA,WACA,qBACA,sBACJ,SAASC,EAAGC,KAAMC,aAAcC,IAAKC,aAAcC,aAO/C,IAAIC,eACQ,iCAMRC,kBAAoB,WACpBC,KAAKC,gBACR,EAwE8D,OAnE/DF,kBAAkBG,UAAUD,eAAiB,WACzCT,EAAEM,gBAAgBK,OAAM,SAASC,GAC7BA,EAAEC,iBAEEC,IAAAA,GAAKd,EAAEQ,MAAMO,KAAK,MAElBC,WAAa,CACb,CACIC,IAAK,iBACLC,UAAW,oBAEf,CACID,IAAK,qBACLC,UAAW,mBACXC,MATWnB,EAAEQ,MAAMO,KAAK,SAW5B,CACIE,IAAK,WAIbd,IAAIiB,YAAYJ,YAAYK,MAAK,SAASC,aACtC,IAAIC,MAAQD,YAAY,GACpBE,eAAiBF,YAAY,GAC7BG,WAAaH,YAAY,GACtBlB,OAAAA,aAAasB,OAAO,CACvBH,MAAOA,MACPI,KAAMH,eACNI,KAAMxB,aAAayB,MAAMC,cAC1BT,MAAK,SAASU,OA6Bb,OA5BAA,MAAMC,kBAAkBP,YAGxBM,MAAME,UAAUC,GAAG7B,YAAY8B,MAAM,WAEjC,IAAIC,QAAU,CACVC,WAAY,mCACZC,KAAM,CAAOxB,GAAAA,KAGjBb,KAAKsC,KAAK,CAACH,UAAU,GAAGI,MAAK,SAASzB,MAC9BA,KAAK0B,OACLzC,EAAE,uBAAyBc,GAAK,MAAM4B,SAEtCxC,aAAayC,gBAAgB,CACzBC,QAAS7B,KAAK8B,SAAS,GAAGD,QAC1BhB,KAAM,SANlB,IASGkB,KAAK5C,aAAa6C,UACxB,IAGDhB,MAAME,UAAUC,GAAG7B,YAAY2C,QAAQ,WAEnCjB,MAAMkB,SACT,IAEMlB,KACV,GACJ,IAAES,MAAK,SAAST,OACbA,MAAMmB,MAxCV,IA0CGJ,KAAK5C,aAAa6C,UACxB,GACJ,EAE8D,CAS3DI,KAAQ,WACG,OAAA,IAAI5C,iBACd,EAER"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/contactdpo.min.js.map b/admin/tool/dataprivacy/amd/build/contactdpo.min.js.map index 5e857b38784..5df5153ade3 100644 --- a/admin/tool/dataprivacy/amd/build/contactdpo.min.js.map +++ b/admin/tool/dataprivacy/amd/build/contactdpo.min.js.map @@ -1 +1 @@ -{"version":3,"file":"contactdpo.min.js","sources":["../src/contactdpo.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 * Javascript module for contacting the site DPO\n *\n * @module tool_dataprivacy/contactdpo\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalForm from 'core_form/modalform';\nimport Notification from 'core/notification';\nimport {get_string as getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\n\nconst SELECTORS = {\n CONTACT_DPO: '[data-action=\"contactdpo\"]',\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n const triggerElement = document.querySelector(SELECTORS.CONTACT_DPO);\n\n triggerElement.addEventListener('click', event => {\n event.preventDefault();\n\n const modalForm = new ModalForm({\n modalConfig: {\n title: getString('contactdataprotectionofficer', 'tool_dataprivacy'),\n },\n formClass: 'tool_dataprivacy\\\\form\\\\contactdpo',\n saveButtonText: getString('send', 'tool_dataprivacy'),\n returnFocus: triggerElement,\n });\n\n // Show a toast notification when the form is submitted.\n modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {\n if (event.detail.result) {\n getString('requestsubmitted', 'tool_dataprivacy').then(addToast).catch();\n } else {\n const warningMessages = event.detail.warnings.map(warning => warning.message);\n Notification.addNotification({\n type: 'error',\n message: warningMessages.join('
')\n });\n }\n });\n\n modalForm.show();\n });\n};\n"],"names":["SELECTORS","triggerElement","document","querySelector","addEventListener","event","preventDefault","modalForm","ModalForm","modalConfig","title","formClass","saveButtonText","returnFocus","events","FORM_SUBMITTED","detail","result","then","addToast","catch","warningMessages","warnings","map","warning","message","addNotification","type","join","show"],"mappings":";;;;;;;wLA4BMA,sBACW,2CAMG,eACVC,eAAiBC,SAASC,cAAcH,uBAE9CC,eAAeG,iBAAiB,SAAS,SAAAC,OACrCA,MAAMC,qBAEAC,UAAY,IAAIC,mBAAU,CAC5BC,YAAa,CACTC,OAAO,mBAAU,+BAAgC,qBAErDC,UAAW,qCACXC,gBAAgB,mBAAU,OAAQ,oBAClCC,YAAaZ,iBAIjBM,UAAUH,iBAAiBG,UAAUO,OAAOC,gBAAgB,SAAAV,UACpDA,MAAMW,OAAOC,2BACH,mBAAoB,oBAAoBC,KAAKC,YAAUC,YAC9D,KACGC,gBAAkBhB,MAAMW,OAAOM,SAASC,KAAI,SAAAC,gBAAWA,QAAQC,iCACxDC,gBAAgB,CACzBC,KAAM,QACNF,QAASJ,gBAAgBO,KAAK,cAK1CrB,UAAUsB"} \ No newline at end of file +{"version":3,"file":"contactdpo.min.js","sources":["../src/contactdpo.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 * Javascript module for contacting the site DPO\n *\n * @module tool_dataprivacy/contactdpo\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalForm from 'core_form/modalform';\nimport Notification from 'core/notification';\nimport {get_string as getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\n\nconst SELECTORS = {\n CONTACT_DPO: '[data-action=\"contactdpo\"]',\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n const triggerElement = document.querySelector(SELECTORS.CONTACT_DPO);\n\n triggerElement.addEventListener('click', event => {\n event.preventDefault();\n\n const modalForm = new ModalForm({\n modalConfig: {\n title: getString('contactdataprotectionofficer', 'tool_dataprivacy'),\n },\n formClass: 'tool_dataprivacy\\\\form\\\\contactdpo',\n saveButtonText: getString('send', 'tool_dataprivacy'),\n returnFocus: triggerElement,\n });\n\n // Show a toast notification when the form is submitted.\n modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {\n if (event.detail.result) {\n getString('requestsubmitted', 'tool_dataprivacy').then(addToast).catch();\n } else {\n const warningMessages = event.detail.warnings.map(warning => warning.message);\n Notification.addNotification({\n type: 'error',\n message: warningMessages.join('
')\n });\n }\n });\n\n modalForm.show();\n });\n};\n"],"names":["_modalform","_interopRequireDefault","_notification","SELECTORS","triggerElement","document","querySelector","addEventListener","event","preventDefault","modalForm","ModalForm","modalConfig","title","_str","get_string","formClass","saveButtonText","returnFocus","events","FORM_SUBMITTED","detail","result","then","addToast","catch","warningMessages","warnings","map","warning","message","Notification","addNotification","type","join","show"],"mappings":";;;;;;;kFAuBAA,WAAAC,uBAAAD,YACAE,cAAAD,uBAAAC,eAIA,IAAMC,sBACW,2CAMG,WACVC,IAAAA,eAAiBC,SAASC,cAAcH,uBAE9CC,eAAeG,iBAAiB,SAAS,SAAAC,OACrCA,MAAMC,iBAEN,IAAMC,UAAY,IAAIC,WAAAA,QAAU,CAC5BC,YAAa,CACTC,OAAO,EAAUC,KAAAC,YAAA,+BAAgC,qBAErDC,UAAW,qCACXC,gBAAgB,EAAAH,KAAAC,YAAU,OAAQ,oBAClCG,YAAad,iBAIjBM,UAAUH,iBAAiBG,UAAUS,OAAOC,gBAAgB,SAAAZ,OACxD,GAAIA,MAAMa,OAAOC,QACH,EAAAR,KAAAC,YAAA,mBAAoB,oBAAoBQ,KAAKC,OAAAA,KAAUC,YAC9D,CACGC,IAAAA,gBAAkBlB,MAAMa,OAAOM,SAASC,KAAI,SAAAC,SAAWA,OAAAA,QAAQC,OAAZ,IACzDC,cAAAA,QAAaC,gBAAgB,CACzBC,KAAM,QACNH,QAASJ,gBAAgBQ,KAAK,SAErC,CACJ,IAEDxB,UAAUyB,MACb,GACJ"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/data_deletion.min.js.map b/admin/tool/dataprivacy/amd/build/data_deletion.min.js.map index 79fec21d7e6..bca8049e311 100644 --- a/admin/tool/dataprivacy/amd/build/data_deletion.min.js.map +++ b/admin/tool/dataprivacy/amd/build/data_deletion.min.js.map @@ -1 +1 @@ -{"version":3,"file":"data_deletion.min.js","sources":["../src/data_deletion.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 * Request actions.\n *\n * @module tool_dataprivacy/data_deletion\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{MARK_FOR_DELETION: string}}\n * @type {{SELECT_ALL: string}}\n */\n var ACTIONS = {\n MARK_FOR_DELETION: '[data-action=\"markfordeletion\"]',\n SELECT_ALL: '[data-action=\"selectall\"]',\n };\n\n /**\n * List of selectors.\n *\n * @type {{SELECTCONTEXT: string}}\n */\n var SELECTORS = {\n SELECTCONTEXT: '.selectcontext',\n };\n\n /**\n * DataDeletionActions class.\n */\n var DataDeletionActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n DataDeletionActions.prototype.registerEvents = function() {\n $(ACTIONS.MARK_FOR_DELETION).click(function(e) {\n e.preventDefault();\n\n var selectedIds = [];\n $(SELECTORS.SELECTCONTEXT).each(function() {\n var checkbox = $(this);\n if (checkbox.is(':checked')) {\n selectedIds.push(checkbox.val());\n }\n });\n showConfirmation(selectedIds);\n });\n\n $(ACTIONS.SELECT_ALL).change(function(e) {\n e.preventDefault();\n\n var selectallnone = $(this);\n if (selectallnone.is(':checked')) {\n $(SELECTORS.SELECTCONTEXT).attr('checked', 'checked');\n } else {\n $(SELECTORS.SELECTCONTEXT).removeAttr('checked');\n }\n });\n };\n\n /**\n * Show the confirmation dialogue.\n *\n * @param {Array} ids The array of expired context record IDs.\n */\n function showConfirmation(ids) {\n var keys = [\n {\n key: 'confirm',\n component: 'moodle'\n },\n {\n key: 'confirmcontextdeletion',\n component: 'tool_dataprivacy'\n }\n ];\n var wsfunction = 'tool_dataprivacy_confirm_contexts_for_deletion';\n\n var modalTitle = '';\n Str.get_strings(keys).then(function(langStrings) {\n modalTitle = langStrings[0];\n var confirmMessage = langStrings[1];\n return ModalFactory.create({\n title: modalTitle,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n });\n }).then(function(modal) {\n modal.setSaveButtonText(modalTitle);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n // Confirm the request.\n var params = {\n 'ids': ids\n };\n\n var request = {\n methodname: wsfunction,\n args: params\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n window.location.reload();\n } else {\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n }).done(function(modal) {\n modal.show();\n }).fail(Notification.exception);\n }\n\n return DataDeletionActions;\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","ACTIONS","SELECTORS","DataDeletionActions","registerEvents","prototype","click","e","preventDefault","ids","keys","wsfunction","modalTitle","selectedIds","each","checkbox","this","is","push","val","key","component","get_strings","then","langStrings","confirmMessage","create","title","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","request","methodname","args","call","done","data","result","window","location","reload","addNotification","message","warnings","fail","exception","hidden","destroy","show","change","attr","removeAttr"],"mappings":";;;;;;;AAsBAA,wCAAO,CACH,SACA,YACA,oBACA,WACA,qBACA,sBACJ,SAASC,EAAGC,KAAMC,aAAcC,IAAKC,aAAcC,iBAQ3CC,0BACmB,kCADnBA,mBAEY,4BAQZC,wBACe,iBAMfC,oBAAsB,gBACjBC,yBAMTD,oBAAoBE,UAAUD,eAAiB,WAC3CT,EAAEM,2BAA2BK,OAAM,SAASC,GACxCA,EAAEC,qBA6BgBC,IAClBC,KAUAC,WAEAC,WAxCIC,YAAc,GAClBlB,EAAEO,yBAAyBY,MAAK,eACxBC,SAAWpB,EAAEqB,MACbD,SAASE,GAAG,aACZJ,YAAYK,KAAKH,SAASI,UAuBhBV,IApBDI,YAqBjBH,KAAO,CACP,CACIU,IAAK,UACLC,UAAW,UAEf,CACID,IAAK,yBACLC,UAAW,qBAGfV,WAAa,iDAEbC,WAAa,GACjBd,IAAIwB,YAAYZ,MAAMa,MAAK,SAASC,aAChCZ,WAAaY,YAAY,OACrBC,eAAiBD,YAAY,UAC1BzB,aAAa2B,OAAO,CACvBC,MAAOf,WACPgB,KAAMH,eACNI,KAAM9B,aAAa+B,MAAMC,iBAE9BR,MAAK,SAASS,cACbA,MAAMC,kBAAkBrB,YAGxBoB,MAAME,UAAUC,GAAGnC,YAAYoC,MAAM,eAM7BC,QAAU,CACVC,WAAY3B,WACZ4B,KANS,KACF9B,MAQXb,KAAK4C,KAAK,CAACH,UAAU,GAAGI,MAAK,SAASC,MAC9BA,KAAKC,OACLC,OAAOC,SAASC,SAEhBjD,aAAakD,gBAAgB,CACzBC,QAASN,KAAKO,SAAS,GAAGD,QAC1BnB,KAAM,aAGfqB,KAAKrD,aAAasD,cAIzBnB,MAAME,UAAUC,GAAGnC,YAAYoD,QAAQ,WAEnCpB,MAAMqB,aAGHrB,SACRS,MAAK,SAAST,OACbA,MAAMsB,UACPJ,KAAKrD,aAAasD,cA3ErBxD,EAAEM,oBAAoBsD,QAAO,SAAShD,GAClCA,EAAEC,iBAEkBb,EAAEqB,MACJC,GAAG,YACjBtB,EAAEO,yBAAyBsD,KAAK,UAAW,WAE3C7D,EAAEO,yBAAyBuD,WAAW,eAuE3CtD"} \ No newline at end of file +{"version":3,"file":"data_deletion.min.js","sources":["../src/data_deletion.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 * Request actions.\n *\n * @module tool_dataprivacy/data_deletion\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{MARK_FOR_DELETION: string}}\n * @type {{SELECT_ALL: string}}\n */\n var ACTIONS = {\n MARK_FOR_DELETION: '[data-action=\"markfordeletion\"]',\n SELECT_ALL: '[data-action=\"selectall\"]',\n };\n\n /**\n * List of selectors.\n *\n * @type {{SELECTCONTEXT: string}}\n */\n var SELECTORS = {\n SELECTCONTEXT: '.selectcontext',\n };\n\n /**\n * DataDeletionActions class.\n */\n var DataDeletionActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n DataDeletionActions.prototype.registerEvents = function() {\n $(ACTIONS.MARK_FOR_DELETION).click(function(e) {\n e.preventDefault();\n\n var selectedIds = [];\n $(SELECTORS.SELECTCONTEXT).each(function() {\n var checkbox = $(this);\n if (checkbox.is(':checked')) {\n selectedIds.push(checkbox.val());\n }\n });\n showConfirmation(selectedIds);\n });\n\n $(ACTIONS.SELECT_ALL).change(function(e) {\n e.preventDefault();\n\n var selectallnone = $(this);\n if (selectallnone.is(':checked')) {\n $(SELECTORS.SELECTCONTEXT).attr('checked', 'checked');\n } else {\n $(SELECTORS.SELECTCONTEXT).removeAttr('checked');\n }\n });\n };\n\n /**\n * Show the confirmation dialogue.\n *\n * @param {Array} ids The array of expired context record IDs.\n */\n function showConfirmation(ids) {\n var keys = [\n {\n key: 'confirm',\n component: 'moodle'\n },\n {\n key: 'confirmcontextdeletion',\n component: 'tool_dataprivacy'\n }\n ];\n var wsfunction = 'tool_dataprivacy_confirm_contexts_for_deletion';\n\n var modalTitle = '';\n Str.get_strings(keys).then(function(langStrings) {\n modalTitle = langStrings[0];\n var confirmMessage = langStrings[1];\n return ModalFactory.create({\n title: modalTitle,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n });\n }).then(function(modal) {\n modal.setSaveButtonText(modalTitle);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n // Confirm the request.\n var params = {\n 'ids': ids\n };\n\n var request = {\n methodname: wsfunction,\n args: params\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n window.location.reload();\n } else {\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n }).done(function(modal) {\n modal.show();\n }).fail(Notification.exception);\n }\n\n return DataDeletionActions;\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","ACTIONS","SELECTORS","DataDeletionActions","this","registerEvents","prototype","click","e","preventDefault","selectedIds","ids","keys","wsfunction","modalTitle","each","checkbox","is","push","val","key","component","get_strings","then","langStrings","confirmMessage","create","title","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","request","methodname","args","call","done","data","result","window","location","reload","addNotification","message","warnings","fail","exception","hidden","destroy","show","change","attr","removeAttr"],"mappings":";;;;;;;AAsBAA,OAAM,iCAAC,CACH,SACA,YACA,oBACA,WACA,qBACA,sBACJ,SAASC,EAAGC,KAAMC,aAAcC,IAAKC,aAAcC,aAQ/C,IAAIC,0BACmB,kCADnBA,mBAEY,4BAQZC,wBACe,iBAMfC,oBAAsB,WACtBC,KAAKC,gBACR,EAiGD,OA5FAF,oBAAoBG,UAAUD,eAAiB,WAC3CV,EAAEM,2BAA2BM,OAAM,SAASC,GACxCA,EAAEC,iBAEEC,IA2BcC,IAClBC,KAUAC,WAEAC,WAxCIJ,YAAc,GAClBf,EAAEO,yBAAyBa,MAAK,WAC5B,IAAIC,SAAWrB,EAAES,MACbY,SAASC,GAAG,aACZP,YAAYQ,KAAKF,SAASG,MAEjC,IAqBiBR,IApBDD,YAqBjBE,KAAO,CACP,CACIQ,IAAK,UACLC,UAAW,UAEf,CACID,IAAK,yBACLC,UAAW,qBAGfR,WAAa,iDAEbC,WAAa,GACjBhB,IAAIwB,YAAYV,MAAMW,MAAK,SAASC,aAChCV,WAAaU,YAAY,GACzB,IAAIC,eAAiBD,YAAY,GAC1BzB,OAAAA,aAAa2B,OAAO,CACvBC,MAAOb,WACPc,KAAMH,eACNI,KAAM9B,aAAa+B,MAAMC,aAEhC,IAAER,MAAK,SAASS,OAiCb,OAhCAA,MAAMC,kBAAkBnB,YAGxBkB,MAAME,UAAUC,GAAGnC,YAAYoC,MAAM,WAEjC,IAIIC,QAAU,CACVC,WAAYzB,WACZ0B,KANS,CACF5B,IAAAA,MAQXf,KAAK4C,KAAK,CAACH,UAAU,GAAGI,MAAK,SAASC,MAC9BA,KAAKC,OACLC,OAAOC,SAASC,SAEhBjD,aAAakD,gBAAgB,CACzBC,QAASN,KAAKO,SAAS,GAAGD,QAC1BnB,KAAM,SANlB,IASGqB,KAAKrD,aAAasD,UACxB,IAGDnB,MAAME,UAAUC,GAAGnC,YAAYoD,QAAQ,WAEnCpB,MAAMqB,SACT,IAEMrB,KACV,IAAES,MAAK,SAAST,OACbA,MAAMsB,MA3CV,IA4CGJ,KAAKrD,aAAasD,UA7EpB,IAEDxD,EAAEM,oBAAoBsD,QAAO,SAAS/C,GAClCA,EAAEC,iBAEkBd,EAAES,MACJa,GAAG,YACjBtB,EAAEO,yBAAyBsD,KAAK,UAAW,WAE3C7D,EAAEO,yBAAyBuD,WAAW,UAE7C,GACJ,EAoEMtD,mBACV"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/data_registry.min.js.map b/admin/tool/dataprivacy/amd/build/data_registry.min.js.map index cd38e85729d..d0ee3c2a422 100644 --- a/admin/tool/dataprivacy/amd/build/data_registry.min.js.map +++ b/admin/tool/dataprivacy/amd/build/data_registry.min.js.map @@ -1 +1 @@ -{"version":3,"file":"data_registry.min.js","sources":["../src/data_registry.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 * Request actions.\n *\n * @module tool_dataprivacy/data_registry\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/templates', 'core/modal_factory',\n 'core/modal_events', 'core/fragment', 'tool_dataprivacy/add_purpose', 'tool_dataprivacy/add_category'],\n function($, Str, Ajax, Notification, Templates, ModalFactory, ModalEvents, Fragment, AddPurpose, AddCategory) {\n\n var SELECTORS = {\n TREE_NODES: '[data-context-tree-node=1]',\n FORM_CONTAINER: '#context-form-container',\n };\n\n var DataRegistry = function(systemContextId, initContextLevel, initContextId) {\n this.systemContextId = systemContextId;\n this.currentContextLevel = initContextLevel;\n this.currentContextId = initContextId;\n this.init();\n };\n\n /**\n * @var {int} systemContextId\n * @private\n */\n DataRegistry.prototype.systemContextId = 0;\n\n /**\n * @var {int} currentContextLevel\n * @private\n */\n DataRegistry.prototype.currentContextLevel = 0;\n\n /**\n * @var {int} currentContextId\n * @private\n */\n DataRegistry.prototype.currentContextId = 0;\n\n /**\n * @var {AddPurpose} addpurpose\n * @private\n */\n DataRegistry.prototype.addpurpose = null;\n\n /**\n * @var {AddCategory} addcategory\n * @private\n */\n DataRegistry.prototype.addcategory = null;\n\n DataRegistry.prototype.init = function() {\n // Add purpose and category modals always at system context.\n this.addpurpose = AddPurpose.getInstance(this.systemContextId);\n this.addcategory = AddCategory.getInstance(this.systemContextId);\n\n var stringKeys = [\n {\n key: 'changessaved',\n component: 'moodle'\n }, {\n key: 'contextpurposecategorysaved',\n component: 'tool_dataprivacy'\n }, {\n key: 'noblockstoload',\n component: 'tool_dataprivacy'\n }, {\n key: 'noactivitiestoload',\n component: 'tool_dataprivacy'\n }, {\n key: 'nocoursestoload',\n component: 'tool_dataprivacy'\n }\n ];\n this.strings = Str.get_strings(stringKeys);\n\n this.registerEventListeners();\n\n // Load the default context level form.\n if (this.currentContextId) {\n this.loadForm('context_form', [this.currentContextId], this.submitContextFormAjax.bind(this));\n } else {\n this.loadForm('contextlevel_form', [this.currentContextLevel], this.submitContextLevelFormAjax.bind(this));\n }\n };\n\n DataRegistry.prototype.registerEventListeners = function() {\n $(SELECTORS.TREE_NODES).on('click', function(ev) {\n ev.preventDefault();\n\n var trigger = $(ev.currentTarget);\n\n // Active node.\n $(SELECTORS.TREE_NODES).removeClass('active');\n trigger.addClass('active');\n\n var contextLevel = trigger.data('contextlevel');\n var contextId = trigger.data('contextid');\n if (contextLevel) {\n // Context level level.\n\n window.history.pushState({}, null, '?contextlevel=' + contextLevel);\n\n // Remove previous add purpose and category listeners to avoid memory leaks.\n this.addpurpose.removeListeners();\n this.addcategory.removeListeners();\n\n // Load the context level form.\n this.currentContextLevel = contextLevel;\n this.loadForm('contextlevel_form', [this.currentContextLevel], this.submitContextLevelFormAjax.bind(this));\n } else if (contextId) {\n // Context instance level.\n\n window.history.pushState({}, null, '?contextid=' + contextId);\n\n // Remove previous add purpose and category listeners to avoid memory leaks.\n this.addpurpose.removeListeners();\n this.addcategory.removeListeners();\n\n // Load the context level form.\n this.currentContextId = contextId;\n this.loadForm('context_form', [this.currentContextId], this.submitContextFormAjax.bind(this));\n } else {\n // Expandable nodes.\n\n var expandContextId = trigger.data('expandcontextid');\n var expandElement = trigger.data('expandelement');\n var expanded = trigger.data('expanded');\n\n // Extra checking that there is an expandElement because we remove it after loading 0 branches.\n if (expandElement) {\n\n if (!expanded) {\n if (trigger.data('loaded') || !expandContextId || !expandElement) {\n this.expand(trigger);\n } else {\n\n trigger.find('> i').removeClass('fa-plus');\n trigger.find('> i').addClass('fa-circle-o-notch fa-spin');\n this.loadExtra(trigger, expandContextId, expandElement);\n }\n } else {\n this.collapse(trigger);\n }\n }\n }\n\n }.bind(this));\n };\n\n DataRegistry.prototype.removeListeners = function() {\n $(SELECTORS.TREE_NODES).off('click');\n };\n\n DataRegistry.prototype.loadForm = function(fragmentName, fragmentArgs, formSubmitCallback) {\n\n this.clearForm();\n\n var fragment = Fragment.loadFragment('tool_dataprivacy', fragmentName, this.systemContextId, fragmentArgs);\n fragment.done(function(html, js) {\n\n $(SELECTORS.FORM_CONTAINER).html(html);\n Templates.runTemplateJS(js);\n\n this.addpurpose.registerEventListeners();\n this.addcategory.registerEventListeners();\n\n // We also catch the form submit event and use it to submit the form with ajax.\n $(SELECTORS.FORM_CONTAINER).on('submit', 'form', formSubmitCallback);\n\n }.bind(this)).fail(Notification.exception);\n };\n\n DataRegistry.prototype.clearForm = function() {\n // For the previously loaded form.\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n\n // Remove previous listeners.\n $(SELECTORS.FORM_CONTAINER).off('submit', 'form');\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n DataRegistry.prototype.submitForm = function(e) {\n e.preventDefault();\n $(SELECTORS.FORM_CONTAINER).find('form').submit();\n };\n\n DataRegistry.prototype.submitContextLevelFormAjax = function(e) {\n this.submitFormAjax(e, 'tool_dataprivacy_set_contextlevel_form');\n };\n\n DataRegistry.prototype.submitContextFormAjax = function(e) {\n this.submitFormAjax(e, 'tool_dataprivacy_set_context_form');\n };\n\n DataRegistry.prototype.submitFormAjax = function(e, saveMethodName) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = $(SELECTORS.FORM_CONTAINER).find('form').serialize();\n return this.strings.then(function(strings) {\n Ajax.call([{\n methodname: saveMethodName,\n args: {jsonformdata: JSON.stringify(formData)},\n done: function() {\n Notification.alert(strings[0], strings[1]);\n },\n fail: Notification.exception\n }]);\n return;\n }).catch(Notification.exception);\n\n };\n\n DataRegistry.prototype.loadExtra = function(parentNode, expandContextId, expandElement) {\n\n Ajax.call([{\n methodname: 'tool_dataprivacy_tree_extra_branches',\n args: {\n contextid: expandContextId,\n element: expandElement,\n },\n done: function(data) {\n if (data.branches.length == 0) {\n this.noElements(parentNode, expandElement);\n return;\n }\n Templates.render('tool_dataprivacy/context_tree_branches', data)\n .then(function(html) {\n parentNode.after(html);\n this.removeListeners();\n this.registerEventListeners();\n this.expand(parentNode);\n parentNode.data('loaded', 1);\n return;\n }.bind(this))\n .fail(Notification.exception);\n }.bind(this),\n fail: Notification.exception\n }]);\n };\n\n DataRegistry.prototype.noElements = function(node, expandElement) {\n node.data('expandcontextid', '');\n node.data('expandelement', '');\n this.strings.then(function(strings) {\n\n // 2 = blocks, 3 = activities, 4 = courses (although courses is not likely really).\n var key = 2;\n if (expandElement == 'module') {\n key = 3;\n } else if (expandElement == 'course') {\n key = 4;\n }\n node.text(strings[key]);\n return;\n }).fail(Notification.exception);\n };\n\n DataRegistry.prototype.collapse = function(node) {\n node.data('expanded', 0);\n node.siblings('nav').addClass('hidden');\n node.find('> i').removeClass('fa-minus');\n node.find('> i').addClass('fa-plus');\n };\n\n DataRegistry.prototype.expand = function(node) {\n node.data('expanded', 1);\n node.siblings('nav').removeClass('hidden');\n node.find('> i').removeClass('fa-plus');\n // Also remove the spinning one if data was just loaded.\n node.find('> i').removeClass('fa-circle-o-notch fa-spin');\n node.find('> i').addClass('fa-minus');\n };\n return /** @alias module:tool_dataprivacy/data_registry */ {\n\n /**\n * Initialise the page.\n *\n * @param {Number} systemContextId\n * @param {Number} initContextLevel\n * @param {Number} initContextId\n * @return {DataRegistry}\n */\n init: function(systemContextId, initContextLevel, initContextId) {\n return new DataRegistry(systemContextId, initContextLevel, initContextId);\n }\n };\n }\n);\n\n"],"names":["define","$","Str","Ajax","Notification","Templates","ModalFactory","ModalEvents","Fragment","AddPurpose","AddCategory","SELECTORS","DataRegistry","systemContextId","initContextLevel","initContextId","currentContextLevel","currentContextId","init","prototype","addpurpose","addcategory","getInstance","this","strings","get_strings","key","component","registerEventListeners","loadForm","submitContextFormAjax","bind","submitContextLevelFormAjax","on","ev","preventDefault","trigger","currentTarget","removeClass","addClass","contextLevel","data","contextId","window","history","pushState","removeListeners","expandContextId","expandElement","expanded","collapse","find","loadExtra","expand","off","fragmentName","fragmentArgs","formSubmitCallback","clearForm","loadFragment","done","html","js","runTemplateJS","fail","exception","Y","use","M","core_formchangechecker","reset_form_dirty_state","submitForm","e","submit","submitFormAjax","saveMethodName","formData","serialize","then","call","methodname","args","jsonformdata","JSON","stringify","alert","catch","parentNode","contextid","element","branches","length","render","after","noElements","node","text","siblings"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"data_registry.min.js","sources":["../src/data_registry.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 * Request actions.\n *\n * @module tool_dataprivacy/data_registry\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/templates', 'core/modal_factory',\n 'core/modal_events', 'core/fragment', 'tool_dataprivacy/add_purpose', 'tool_dataprivacy/add_category'],\n function($, Str, Ajax, Notification, Templates, ModalFactory, ModalEvents, Fragment, AddPurpose, AddCategory) {\n\n var SELECTORS = {\n TREE_NODES: '[data-context-tree-node=1]',\n FORM_CONTAINER: '#context-form-container',\n };\n\n var DataRegistry = function(systemContextId, initContextLevel, initContextId) {\n this.systemContextId = systemContextId;\n this.currentContextLevel = initContextLevel;\n this.currentContextId = initContextId;\n this.init();\n };\n\n /**\n * @var {int} systemContextId\n * @private\n */\n DataRegistry.prototype.systemContextId = 0;\n\n /**\n * @var {int} currentContextLevel\n * @private\n */\n DataRegistry.prototype.currentContextLevel = 0;\n\n /**\n * @var {int} currentContextId\n * @private\n */\n DataRegistry.prototype.currentContextId = 0;\n\n /**\n * @var {AddPurpose} addpurpose\n * @private\n */\n DataRegistry.prototype.addpurpose = null;\n\n /**\n * @var {AddCategory} addcategory\n * @private\n */\n DataRegistry.prototype.addcategory = null;\n\n DataRegistry.prototype.init = function() {\n // Add purpose and category modals always at system context.\n this.addpurpose = AddPurpose.getInstance(this.systemContextId);\n this.addcategory = AddCategory.getInstance(this.systemContextId);\n\n var stringKeys = [\n {\n key: 'changessaved',\n component: 'moodle'\n }, {\n key: 'contextpurposecategorysaved',\n component: 'tool_dataprivacy'\n }, {\n key: 'noblockstoload',\n component: 'tool_dataprivacy'\n }, {\n key: 'noactivitiestoload',\n component: 'tool_dataprivacy'\n }, {\n key: 'nocoursestoload',\n component: 'tool_dataprivacy'\n }\n ];\n this.strings = Str.get_strings(stringKeys);\n\n this.registerEventListeners();\n\n // Load the default context level form.\n if (this.currentContextId) {\n this.loadForm('context_form', [this.currentContextId], this.submitContextFormAjax.bind(this));\n } else {\n this.loadForm('contextlevel_form', [this.currentContextLevel], this.submitContextLevelFormAjax.bind(this));\n }\n };\n\n DataRegistry.prototype.registerEventListeners = function() {\n $(SELECTORS.TREE_NODES).on('click', function(ev) {\n ev.preventDefault();\n\n var trigger = $(ev.currentTarget);\n\n // Active node.\n $(SELECTORS.TREE_NODES).removeClass('active');\n trigger.addClass('active');\n\n var contextLevel = trigger.data('contextlevel');\n var contextId = trigger.data('contextid');\n if (contextLevel) {\n // Context level level.\n\n window.history.pushState({}, null, '?contextlevel=' + contextLevel);\n\n // Remove previous add purpose and category listeners to avoid memory leaks.\n this.addpurpose.removeListeners();\n this.addcategory.removeListeners();\n\n // Load the context level form.\n this.currentContextLevel = contextLevel;\n this.loadForm('contextlevel_form', [this.currentContextLevel], this.submitContextLevelFormAjax.bind(this));\n } else if (contextId) {\n // Context instance level.\n\n window.history.pushState({}, null, '?contextid=' + contextId);\n\n // Remove previous add purpose and category listeners to avoid memory leaks.\n this.addpurpose.removeListeners();\n this.addcategory.removeListeners();\n\n // Load the context level form.\n this.currentContextId = contextId;\n this.loadForm('context_form', [this.currentContextId], this.submitContextFormAjax.bind(this));\n } else {\n // Expandable nodes.\n\n var expandContextId = trigger.data('expandcontextid');\n var expandElement = trigger.data('expandelement');\n var expanded = trigger.data('expanded');\n\n // Extra checking that there is an expandElement because we remove it after loading 0 branches.\n if (expandElement) {\n\n if (!expanded) {\n if (trigger.data('loaded') || !expandContextId || !expandElement) {\n this.expand(trigger);\n } else {\n\n trigger.find('> i').removeClass('fa-plus');\n trigger.find('> i').addClass('fa-circle-o-notch fa-spin');\n this.loadExtra(trigger, expandContextId, expandElement);\n }\n } else {\n this.collapse(trigger);\n }\n }\n }\n\n }.bind(this));\n };\n\n DataRegistry.prototype.removeListeners = function() {\n $(SELECTORS.TREE_NODES).off('click');\n };\n\n DataRegistry.prototype.loadForm = function(fragmentName, fragmentArgs, formSubmitCallback) {\n\n this.clearForm();\n\n var fragment = Fragment.loadFragment('tool_dataprivacy', fragmentName, this.systemContextId, fragmentArgs);\n fragment.done(function(html, js) {\n\n $(SELECTORS.FORM_CONTAINER).html(html);\n Templates.runTemplateJS(js);\n\n this.addpurpose.registerEventListeners();\n this.addcategory.registerEventListeners();\n\n // We also catch the form submit event and use it to submit the form with ajax.\n $(SELECTORS.FORM_CONTAINER).on('submit', 'form', formSubmitCallback);\n\n }.bind(this)).fail(Notification.exception);\n };\n\n DataRegistry.prototype.clearForm = function() {\n // For the previously loaded form.\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n\n // Remove previous listeners.\n $(SELECTORS.FORM_CONTAINER).off('submit', 'form');\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n DataRegistry.prototype.submitForm = function(e) {\n e.preventDefault();\n $(SELECTORS.FORM_CONTAINER).find('form').submit();\n };\n\n DataRegistry.prototype.submitContextLevelFormAjax = function(e) {\n this.submitFormAjax(e, 'tool_dataprivacy_set_contextlevel_form');\n };\n\n DataRegistry.prototype.submitContextFormAjax = function(e) {\n this.submitFormAjax(e, 'tool_dataprivacy_set_context_form');\n };\n\n DataRegistry.prototype.submitFormAjax = function(e, saveMethodName) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = $(SELECTORS.FORM_CONTAINER).find('form').serialize();\n return this.strings.then(function(strings) {\n Ajax.call([{\n methodname: saveMethodName,\n args: {jsonformdata: JSON.stringify(formData)},\n done: function() {\n Notification.alert(strings[0], strings[1]);\n },\n fail: Notification.exception\n }]);\n return;\n }).catch(Notification.exception);\n\n };\n\n DataRegistry.prototype.loadExtra = function(parentNode, expandContextId, expandElement) {\n\n Ajax.call([{\n methodname: 'tool_dataprivacy_tree_extra_branches',\n args: {\n contextid: expandContextId,\n element: expandElement,\n },\n done: function(data) {\n if (data.branches.length == 0) {\n this.noElements(parentNode, expandElement);\n return;\n }\n Templates.render('tool_dataprivacy/context_tree_branches', data)\n .then(function(html) {\n parentNode.after(html);\n this.removeListeners();\n this.registerEventListeners();\n this.expand(parentNode);\n parentNode.data('loaded', 1);\n return;\n }.bind(this))\n .fail(Notification.exception);\n }.bind(this),\n fail: Notification.exception\n }]);\n };\n\n DataRegistry.prototype.noElements = function(node, expandElement) {\n node.data('expandcontextid', '');\n node.data('expandelement', '');\n this.strings.then(function(strings) {\n\n // 2 = blocks, 3 = activities, 4 = courses (although courses is not likely really).\n var key = 2;\n if (expandElement == 'module') {\n key = 3;\n } else if (expandElement == 'course') {\n key = 4;\n }\n node.text(strings[key]);\n return;\n }).fail(Notification.exception);\n };\n\n DataRegistry.prototype.collapse = function(node) {\n node.data('expanded', 0);\n node.siblings('nav').addClass('hidden');\n node.find('> i').removeClass('fa-minus');\n node.find('> i').addClass('fa-plus');\n };\n\n DataRegistry.prototype.expand = function(node) {\n node.data('expanded', 1);\n node.siblings('nav').removeClass('hidden');\n node.find('> i').removeClass('fa-plus');\n // Also remove the spinning one if data was just loaded.\n node.find('> i').removeClass('fa-circle-o-notch fa-spin');\n node.find('> i').addClass('fa-minus');\n };\n return /** @alias module:tool_dataprivacy/data_registry */ {\n\n /**\n * Initialise the page.\n *\n * @param {Number} systemContextId\n * @param {Number} initContextLevel\n * @param {Number} initContextId\n * @return {DataRegistry}\n */\n init: function(systemContextId, initContextLevel, initContextId) {\n return new DataRegistry(systemContextId, initContextLevel, initContextId);\n }\n };\n }\n);\n\n"],"names":["define","$","Str","Ajax","Notification","Templates","ModalFactory","ModalEvents","Fragment","AddPurpose","AddCategory","SELECTORS","DataRegistry","systemContextId","initContextLevel","initContextId","currentContextLevel","currentContextId","this","init","prototype","addpurpose","addcategory","getInstance","strings","get_strings","key","component","registerEventListeners","loadForm","submitContextFormAjax","bind","submitContextLevelFormAjax","on","ev","preventDefault","trigger","currentTarget","removeClass","addClass","contextLevel","data","contextId","window","history","pushState","removeListeners","expandContextId","expandElement","expanded","collapse","find","loadExtra","expand","off","fragmentName","fragmentArgs","formSubmitCallback","clearForm","loadFragment","done","html","js","runTemplateJS","fail","exception","Y","use","M","core_formchangechecker","reset_form_dirty_state","submitForm","e","submit","submitFormAjax","saveMethodName","formData","serialize","then","call","methodname","args","jsonformdata","JSON","stringify","alert","catch","parentNode","contextid","element","branches","length","render","after","noElements","node","text","siblings"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/data_request_modal.min.js.map b/admin/tool/dataprivacy/amd/build/data_request_modal.min.js.map index ef4fbb7deda..7226684880d 100644 --- a/admin/tool/dataprivacy/amd/build/data_request_modal.min.js.map +++ b/admin/tool/dataprivacy/amd/build/data_request_modal.min.js.map @@ -1 +1 @@ -{"version":3,"file":"data_request_modal.min.js","sources":["../src/data_request_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 * Request actions.\n *\n * @module tool_dataprivacy/data_request_modal\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/notification', 'core/custom_interaction_events', 'core/modal', 'core/modal_registry',\n 'tool_dataprivacy/events'],\n function($, Notification, CustomEvents, Modal, ModalRegistry, DataPrivacyEvents) {\n\n var registered = false;\n var SELECTORS = {\n APPROVE_BUTTON: '[data-action=\"approve\"]',\n DENY_BUTTON: '[data-action=\"deny\"]',\n COMPLETE_BUTTON: '[data-action=\"complete\"]'\n };\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var ModalDataRequest = function(root) {\n Modal.call(this, root);\n };\n\n ModalDataRequest.TYPE = 'tool_dataprivacy-data_request';\n ModalDataRequest.prototype = Object.create(Modal.prototype);\n ModalDataRequest.prototype.constructor = ModalDataRequest;\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalDataRequest.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.APPROVE_BUTTON, function(e, data) {\n var approveEvent = $.Event(DataPrivacyEvents.approve);\n this.getRoot().trigger(approveEvent, this);\n\n if (!approveEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.DENY_BUTTON, function(e, data) {\n var denyEvent = $.Event(DataPrivacyEvents.deny);\n this.getRoot().trigger(denyEvent, this);\n\n if (!denyEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.COMPLETE_BUTTON, function(e, data) {\n var completeEvent = $.Event(DataPrivacyEvents.complete);\n this.getRoot().trigger(completeEvent, this);\n\n if (!completeEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalDataRequest.TYPE, ModalDataRequest, 'tool_dataprivacy/data_request_modal');\n registered = true;\n }\n\n return ModalDataRequest;\n });"],"names":["define","$","Notification","CustomEvents","Modal","ModalRegistry","DataPrivacyEvents","registered","SELECTORS","ModalDataRequest","root","call","this","TYPE","prototype","Object","create","constructor","registerEventListeners","getModal","on","events","activate","e","data","approveEvent","Event","approve","getRoot","trigger","isDefaultPrevented","hide","originalEvent","preventDefault","bind","denyEvent","deny","completeEvent","complete","register"],"mappings":";;;;;;;AAsBAA,6CAAO,CAAC,SAAU,oBAAqB,iCAAkC,aAAc,sBAC/E,4BACJ,SAASC,EAAGC,aAAcC,aAAcC,MAAOC,cAAeC,uBAEtDC,YAAa,EACbC,yBACgB,0BADhBA,sBAEa,uBAFbA,0BAGiB,2BAQjBC,iBAAmB,SAASC,MAC5BN,MAAMO,KAAKC,KAAMF,cAGrBD,iBAAiBI,KAAO,iCACxBJ,iBAAiBK,UAAYC,OAAOC,OAAOZ,MAAMU,YACtBG,YAAcR,iBAOzCA,iBAAiBK,UAAUI,uBAAyB,WAEhDd,MAAMU,UAAUI,uBAAuBP,KAAKC,WAEvCO,WAAWC,GAAGjB,aAAakB,OAAOC,SAAUd,yBAA0B,SAASe,EAAGC,UAC/EC,aAAexB,EAAEyB,MAAMpB,kBAAkBqB,cACxCC,UAAUC,QAAQJ,aAAcb,MAEhCa,aAAaK,4BACTC,OACLP,KAAKQ,cAAcC,mBAEzBC,KAAKtB,YAEFO,WAAWC,GAAGjB,aAAakB,OAAOC,SAAUd,sBAAuB,SAASe,EAAGC,UAC5EW,UAAYlC,EAAEyB,MAAMpB,kBAAkB8B,WACrCR,UAAUC,QAAQM,UAAWvB,MAE7BuB,UAAUL,4BACNC,OACLP,KAAKQ,cAAcC,mBAEzBC,KAAKtB,YAEFO,WAAWC,GAAGjB,aAAakB,OAAOC,SAAUd,0BAA2B,SAASe,EAAGC,UAChFa,cAAgBpC,EAAEyB,MAAMpB,kBAAkBgC,eACzCV,UAAUC,QAAQQ,cAAezB,MAEjCyB,cAAcP,4BACVC,OACLP,KAAKQ,cAAcC,mBAEzBC,KAAKtB,QAKNL,aACDF,cAAckC,SAAS9B,iBAAiBI,KAAMJ,iBAAkB,uCAChEF,YAAa,GAGVE"} \ No newline at end of file +{"version":3,"file":"data_request_modal.min.js","sources":["../src/data_request_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 * Request actions.\n *\n * @module tool_dataprivacy/data_request_modal\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/notification', 'core/custom_interaction_events', 'core/modal', 'core/modal_registry',\n 'tool_dataprivacy/events'],\n function($, Notification, CustomEvents, Modal, ModalRegistry, DataPrivacyEvents) {\n\n var registered = false;\n var SELECTORS = {\n APPROVE_BUTTON: '[data-action=\"approve\"]',\n DENY_BUTTON: '[data-action=\"deny\"]',\n COMPLETE_BUTTON: '[data-action=\"complete\"]'\n };\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var ModalDataRequest = function(root) {\n Modal.call(this, root);\n };\n\n ModalDataRequest.TYPE = 'tool_dataprivacy-data_request';\n ModalDataRequest.prototype = Object.create(Modal.prototype);\n ModalDataRequest.prototype.constructor = ModalDataRequest;\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalDataRequest.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.APPROVE_BUTTON, function(e, data) {\n var approveEvent = $.Event(DataPrivacyEvents.approve);\n this.getRoot().trigger(approveEvent, this);\n\n if (!approveEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.DENY_BUTTON, function(e, data) {\n var denyEvent = $.Event(DataPrivacyEvents.deny);\n this.getRoot().trigger(denyEvent, this);\n\n if (!denyEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.COMPLETE_BUTTON, function(e, data) {\n var completeEvent = $.Event(DataPrivacyEvents.complete);\n this.getRoot().trigger(completeEvent, this);\n\n if (!completeEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalDataRequest.TYPE, ModalDataRequest, 'tool_dataprivacy/data_request_modal');\n registered = true;\n }\n\n return ModalDataRequest;\n });"],"names":["define","$","Notification","CustomEvents","Modal","ModalRegistry","DataPrivacyEvents","registered","SELECTORS","ModalDataRequest","root","call","this","TYPE","prototype","Object","create","constructor","registerEventListeners","getModal","on","events","activate","e","data","approveEvent","Event","approve","getRoot","trigger","isDefaultPrevented","hide","originalEvent","preventDefault","bind","denyEvent","deny","completeEvent","complete","register"],"mappings":";;;;;;;AAsBAA,OAAM,sCAAC,CAAC,SAAU,oBAAqB,iCAAkC,aAAc,sBAC/E,4BACJ,SAASC,EAAGC,aAAcC,aAAcC,MAAOC,cAAeC,mBAEtDC,IAAAA,YAAa,EACbC,yBACgB,0BADhBA,sBAEa,uBAFbA,0BAGiB,2BAQjBC,iBAAmB,SAASC,MAC5BN,MAAMO,KAAKC,KAAMF,KACpB,EAqDD,OAnDAD,iBAAiBI,KAAO,iCACxBJ,iBAAiBK,UAAYC,OAAOC,OAAOZ,MAAMU,YACtBG,YAAcR,iBAOzCA,iBAAiBK,UAAUI,uBAAyB,WAEhDd,MAAMU,UAAUI,uBAAuBP,KAAKC,MAE5CA,KAAKO,WAAWC,GAAGjB,aAAakB,OAAOC,SAAUd,yBAA0B,SAASe,EAAGC,MAC/EC,IAAAA,aAAexB,EAAEyB,MAAMpB,kBAAkBqB,SAC7Cf,KAAKgB,UAAUC,QAAQJ,aAAcb,MAEhCa,aAAaK,uBACdlB,KAAKmB,OACLP,KAAKQ,cAAcC,iBAE1B,EAACC,KAAKtB,OAEPA,KAAKO,WAAWC,GAAGjB,aAAakB,OAAOC,SAAUd,sBAAuB,SAASe,EAAGC,MAC5EW,IAAAA,UAAYlC,EAAEyB,MAAMpB,kBAAkB8B,MAC1CxB,KAAKgB,UAAUC,QAAQM,UAAWvB,MAE7BuB,UAAUL,uBACXlB,KAAKmB,OACLP,KAAKQ,cAAcC,iBAE1B,EAACC,KAAKtB,OAEPA,KAAKO,WAAWC,GAAGjB,aAAakB,OAAOC,SAAUd,0BAA2B,SAASe,EAAGC,MAChFa,IAAAA,cAAgBpC,EAAEyB,MAAMpB,kBAAkBgC,UAC9C1B,KAAKgB,UAAUC,QAAQQ,cAAezB,MAEjCyB,cAAcP,uBACflB,KAAKmB,OACLP,KAAKQ,cAAcC,iBAE1B,EAACC,KAAKtB,MACV,EAIIL,aACDF,cAAckC,SAAS9B,iBAAiBI,KAAMJ,iBAAkB,uCAChEF,YAAa,GAGVE,gBACV"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/defaultsactions.min.js.map b/admin/tool/dataprivacy/amd/build/defaultsactions.min.js.map index 50b7d083a24..5d87f61543f 100644 --- a/admin/tool/dataprivacy/amd/build/defaultsactions.min.js.map +++ b/admin/tool/dataprivacy/amd/build/defaultsactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"defaultsactions.min.js","sources":["../src/defaultsactions.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 * AMD module for data registry defaults actions.\n *\n * @module tool_dataprivacy/defaultsactions\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/templates'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {\n\n /**\n * List of action selectors.\n *\n * @type {{EDIT_LEVEL_DEFAULTS: string}}\n * @type {{NEW_ACTIVITY_DEFAULTS: string}}\n * @type {{EDIT_ACTIVITY_DEFAULTS: string}}\n * @type {{DELETE_ACTIVITY_DEFAULTS: string}}\n */\n var ACTIONS = {\n EDIT_LEVEL_DEFAULTS: '[data-action=\"edit-level-defaults\"]',\n NEW_ACTIVITY_DEFAULTS: '[data-action=\"new-activity-defaults\"]',\n EDIT_ACTIVITY_DEFAULTS: '[data-action=\"edit-activity-defaults\"]',\n DELETE_ACTIVITY_DEFAULTS: '[data-action=\"delete-activity-defaults\"]'\n };\n\n /** @type {{INHERIT: Number}} **/\n var INHERIT = -1;\n\n /**\n * DefaultsActions class.\n */\n var DefaultsActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n DefaultsActions.prototype.registerEvents = function() {\n $(ACTIONS.EDIT_LEVEL_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n var category = button.data('category');\n var purpose = button.data('purpose');\n\n // Get options.\n var requests = [\n {methodname: 'tool_dataprivacy_get_category_options', args: {}},\n {methodname: 'tool_dataprivacy_get_purpose_options', args: {}}\n ];\n\n var promises = Ajax.call(requests);\n var titlePromise = Str.get_string('editdefaults', 'tool_dataprivacy', $('#defaults-header').text());\n $.when(promises[0], promises[1], titlePromise).then(function(categoryResponse, purposeResponse, title) {\n var categories = categoryResponse.options;\n var purposes = purposeResponse.options;\n showDefaultsFormModal(title, contextLevel, category, purpose, null, categories, purposes, null);\n\n return true;\n }).catch(Notification.exception);\n });\n\n $(ACTIONS.NEW_ACTIVITY_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n\n // Get options.\n var requests = [\n {methodname: 'tool_dataprivacy_get_category_options', args: {}},\n {methodname: 'tool_dataprivacy_get_purpose_options', args: {}},\n {methodname: 'tool_dataprivacy_get_activity_options', args: {'nodefaults': true}}\n ];\n\n var promises = Ajax.call(requests);\n var titlePromise = Str.get_string('addnewdefaults', 'tool_dataprivacy');\n\n $.when(promises[0], promises[1], promises[2], titlePromise).then(\n function(categoryResponse, purposeResponse, activityResponse, title) {\n var categories = categoryResponse.options;\n var purposes = purposeResponse.options;\n var activities = activityResponse.options;\n\n showDefaultsFormModal(title, contextLevel, null, null, null, categories, purposes, activities);\n\n return true;\n\n }).catch(Notification.exception);\n }\n );\n\n $(ACTIONS.EDIT_ACTIVITY_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n var category = button.data('category');\n var purpose = button.data('purpose');\n var activity = button.data('activityname');\n\n // Get options.\n var requests = [\n {methodname: 'tool_dataprivacy_get_category_options', args: {}},\n {methodname: 'tool_dataprivacy_get_purpose_options', args: {}},\n {methodname: 'tool_dataprivacy_get_activity_options', args: {}}\n ];\n\n var promises = Ajax.call(requests);\n var titlePromise = Str.get_string('editmoduledefaults', 'tool_dataprivacy');\n\n $.when(promises[0], promises[1], promises[2], titlePromise).then(\n function(categoryResponse, purposeResponse, activityResponse, title) {\n var categories = categoryResponse.options;\n var purposes = purposeResponse.options;\n var activities = activityResponse.options;\n\n showDefaultsFormModal(title, contextLevel, category, purpose, activity, categories, purposes, activities);\n\n return true;\n\n }).catch(Notification.exception);\n }\n );\n\n $(ACTIONS.DELETE_ACTIVITY_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n var activity = button.data('activityname');\n var activityDisplayName = button.data('activitydisplayname');\n // Set category and purpose to inherit (-1).\n var category = INHERIT;\n var purpose = INHERIT;\n\n ModalFactory.create({\n title: Str.get_string('deletedefaults', 'tool_dataprivacy', activityDisplayName),\n body: Templates.render('tool_dataprivacy/delete_activity_defaults', {\"activityname\": activityDisplayName}),\n type: ModalFactory.types.SAVE_CANCEL,\n large: true\n }).then(function(modal) {\n modal.setSaveButtonText(Str.get_string('delete'));\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n setContextDefaults(contextLevel, category, purpose, activity, false);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return true;\n }).catch(Notification.exception);\n });\n };\n\n /**\n * Prepares and renders the modal for setting the defaults for the given context level/plugin.\n *\n * @param {String} title The modal's title.\n * @param {Number} contextLevel The context level to set defaults for.\n * @param {Number} category The current category ID.\n * @param {Number} purpose The current purpose ID.\n * @param {String} activity The plugin name of the activity. Optional.\n * @param {Array} categoryOptions The list of category options.\n * @param {Array} purposeOptions The list of purpose options.\n * @param {Array} activityOptions The list of activity options. Optional.\n */\n function showDefaultsFormModal(title, contextLevel, category, purpose, activity,\n categoryOptions, purposeOptions, activityOptions) {\n\n if (category !== null) {\n categoryOptions.forEach(function(currentValue) {\n if (currentValue.id === category) {\n currentValue.selected = true;\n }\n });\n }\n\n if (purpose !== null) {\n purposeOptions.forEach(function(currentValue) {\n if (currentValue.id === purpose) {\n currentValue.selected = true;\n }\n });\n }\n\n var templateContext = {\n \"contextlevel\": contextLevel,\n \"categoryoptions\": categoryOptions,\n \"purposeoptions\": purposeOptions\n };\n\n // Check the activityOptions parameter that was passed.\n if (activityOptions !== null && activityOptions.length) {\n // Check the activity parameter that was passed.\n if (activity === null) {\n // We're setting a new defaults for a module.\n templateContext.newactivitydefaults = true;\n\n } else {\n // Edit mode. Set selection.\n activityOptions.forEach(function(currentValue) {\n if (activity === currentValue.name) {\n currentValue.selected = true;\n }\n });\n }\n\n templateContext.modemodule = true;\n templateContext.activityoptions = activityOptions;\n }\n\n ModalFactory.create({\n title: title,\n body: Templates.render('tool_dataprivacy/category_purpose_form', templateContext),\n type: ModalFactory.types.SAVE_CANCEL,\n large: true\n }).then(function(modal) {\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n var activity = $('#activity');\n var activityVal = typeof activity !== 'undefined' ? activity.val() : null;\n var override = $('#override');\n var overrideVal = typeof override !== 'undefined' ? override.is(':checked') : false;\n\n setContextDefaults($('#contextlevel').val(), $('#category').val(), $('#purpose').val(), activityVal, overrideVal);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return modal;\n }).catch(Notification.exception);\n }\n\n /**\n * Calls a the tool_dataprivacy_set_context_defaults WS function.\n *\n * @param {Number} contextLevel The context level.\n * @param {Number} category The category ID.\n * @param {Number} purpose The purpose ID.\n * @param {String} activity The plugin name of the activity module.\n * @param {Boolean} override Whether to override custom instances.\n */\n function setContextDefaults(contextLevel, category, purpose, activity, override) {\n var request = {\n methodname: 'tool_dataprivacy_set_context_defaults',\n args: {\n 'contextlevel': contextLevel,\n 'category': category,\n 'purpose': purpose,\n 'override': override,\n 'activity': activity\n }\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n window.location.reload();\n }\n });\n }\n\n return /** @alias module:tool_dataprivacy/defaultsactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the module.\n *\n * @method init\n * @return {DefaultsActions}\n */\n 'init': function() {\n return new DefaultsActions();\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","Templates","ACTIONS","DefaultsActions","registerEvents","showDefaultsFormModal","title","contextLevel","category","purpose","activity","categoryOptions","purposeOptions","activityOptions","forEach","currentValue","id","selected","templateContext","length","newactivitydefaults","name","modemodule","activityoptions","create","body","render","type","types","SAVE_CANCEL","large","then","modal","getRoot","on","save","activityVal","val","override","overrideVal","is","setContextDefaults","hidden","destroy","show","catch","exception","request","methodname","args","call","done","data","result","window","location","reload","prototype","click","e","preventDefault","button","this","promises","titlePromise","get_string","text","when","categoryResponse","purposeResponse","categories","options","purposes","activityResponse","activities","activityDisplayName","setSaveButtonText"],"mappings":";;;;;;;AAsBAA,0CAAO,CACH,SACA,YACA,oBACA,WACA,qBACA,oBACA,mBACJ,SAASC,EAAGC,KAAMC,aAAcC,IAAKC,aAAcC,YAAaC,eAUxDC,4BACqB,sCADrBA,8BAEuB,wCAFvBA,+BAGwB,yCAHxBA,iCAI0B,2CAS1BC,gBAAkB,gBACbC,2BAgJAC,sBAAsBC,MAAOC,aAAcC,SAAUC,QAASC,SACxCC,gBAAiBC,eAAgBC,iBAE3C,OAAbL,UACAG,gBAAgBG,SAAQ,SAASC,cACzBA,aAAaC,KAAOR,WACpBO,aAAaE,UAAW,MAKpB,OAAZR,SACAG,eAAeE,SAAQ,SAASC,cACxBA,aAAaC,KAAOP,UACpBM,aAAaE,UAAW,UAKhCC,gBAAkB,cACFX,6BACGI,+BACDC,gBAIE,OAApBC,iBAA4BA,gBAAgBM,SAE3B,OAAbT,SAEAQ,gBAAgBE,qBAAsB,EAItCP,gBAAgBC,SAAQ,SAASC,cACzBL,WAAaK,aAAaM,OAC1BN,aAAaE,UAAW,MAKpCC,gBAAgBI,YAAa,EAC7BJ,gBAAgBK,gBAAkBV,iBAGtCd,aAAayB,OAAO,CAChBlB,MAAOA,MACPmB,KAAMxB,UAAUyB,OAAO,yCAA0CR,iBACjES,KAAM5B,aAAa6B,MAAMC,YACzBC,OAAO,IACRC,MAAK,SAASC,cAGbA,MAAMC,UAAUC,GAAGlC,YAAYmC,MAAM,eAC7BzB,SAAWf,EAAE,aACbyC,iBAAkC,IAAb1B,SAA2BA,SAAS2B,MAAQ,KACjEC,SAAW3C,EAAE,aACb4C,iBAAkC,IAAbD,UAA2BA,SAASE,GAAG,YAEhEC,mBAAmB9C,EAAE,iBAAiB0C,MAAO1C,EAAE,aAAa0C,MAAO1C,EAAE,YAAY0C,MAAOD,YAAaG,gBAIzGP,MAAMC,UAAUC,GAAGlC,YAAY0C,QAAQ,WAEnCV,MAAMW,aAGVX,MAAMY,OAECZ,SACRa,MAAMhD,aAAaiD,oBAYjBL,mBAAmBlC,aAAcC,SAAUC,QAASC,SAAU4B,cAC/DS,QAAU,CACVC,WAAY,wCACZC,KAAM,cACc1C,sBACJC,iBACDC,iBACC6B,kBACA5B,WAIpBd,KAAKsD,KAAK,CAACH,UAAU,GAAGI,MAAK,SAASC,MAC9BA,KAAKC,QACLC,OAAOC,SAASC,mBA3O5BrD,gBAAgBsD,UAAUrD,eAAiB,WACvCT,EAAEO,6BAA6BwD,OAAM,SAASC,GAC1CA,EAAEC,qBAEEC,OAASlE,EAAEmE,MACXvD,aAAesD,OAAOT,KAAK,gBAC3B5C,SAAWqD,OAAOT,KAAK,YACvB3C,QAAUoD,OAAOT,KAAK,WAQtBW,SAAWnE,KAAKsD,KALL,CACX,CAACF,WAAY,wCAAyCC,KAAM,IAC5D,CAACD,WAAY,uCAAwCC,KAAM,MAI3De,aAAelE,IAAImE,WAAW,eAAgB,mBAAoBtE,EAAE,oBAAoBuE,QAC5FvE,EAAEwE,KAAKJ,SAAS,GAAIA,SAAS,GAAIC,cAAcjC,MAAK,SAASqC,iBAAkBC,gBAAiB/D,WACxFgE,WAAaF,iBAAiBG,QAC9BC,SAAWH,gBAAgBE,eAC/BlE,sBAAsBC,MAAOC,aAAcC,SAAUC,QAAS,KAAM6D,WAAYE,SAAU,OAEnF,KACR3B,MAAMhD,aAAaiD,cAG1BnD,EAAEO,+BAA+BwD,OAAM,SAASC,GAC5CA,EAAEC,qBAGErD,aADSZ,EAAEmE,MACWV,KAAK,gBAS3BW,SAAWnE,KAAKsD,KANL,CACX,CAACF,WAAY,wCAAyCC,KAAM,IAC5D,CAACD,WAAY,uCAAwCC,KAAM,IAC3D,CAACD,WAAY,wCAAyCC,KAAM,aAAe,MAI3Ee,aAAelE,IAAImE,WAAW,iBAAkB,oBAEpDtE,EAAEwE,KAAKJ,SAAS,GAAIA,SAAS,GAAIA,SAAS,GAAIC,cAAcjC,MACxD,SAASqC,iBAAkBC,gBAAiBI,iBAAkBnE,WACtDgE,WAAaF,iBAAiBG,QAC9BC,SAAWH,gBAAgBE,QAC3BG,WAAaD,iBAAiBF,eAElClE,sBAAsBC,MAAOC,aAAc,KAAM,KAAM,KAAM+D,WAAYE,SAAUE,aAE5E,KAER7B,MAAMhD,aAAaiD,cAI9BnD,EAAEO,gCAAgCwD,OAAM,SAASC,GAC7CA,EAAEC,qBAEEC,OAASlE,EAAEmE,MACXvD,aAAesD,OAAOT,KAAK,gBAC3B5C,SAAWqD,OAAOT,KAAK,YACvB3C,QAAUoD,OAAOT,KAAK,WACtB1C,SAAWmD,OAAOT,KAAK,gBASvBW,SAAWnE,KAAKsD,KANL,CACX,CAACF,WAAY,wCAAyCC,KAAM,IAC5D,CAACD,WAAY,uCAAwCC,KAAM,IAC3D,CAACD,WAAY,wCAAyCC,KAAM,MAI5De,aAAelE,IAAImE,WAAW,qBAAsB,oBAExDtE,EAAEwE,KAAKJ,SAAS,GAAIA,SAAS,GAAIA,SAAS,GAAIC,cAAcjC,MACxD,SAASqC,iBAAkBC,gBAAiBI,iBAAkBnE,WACtDgE,WAAaF,iBAAiBG,QAC9BC,SAAWH,gBAAgBE,QAC3BG,WAAaD,iBAAiBF,eAElClE,sBAAsBC,MAAOC,aAAcC,SAAUC,QAASC,SAAU4D,WAAYE,SAAUE,aAEvF,KAER7B,MAAMhD,aAAaiD,cAI9BnD,EAAEO,kCAAkCwD,OAAM,SAASC,GAC/CA,EAAEC,qBAEEC,OAASlE,EAAEmE,MACXvD,aAAesD,OAAOT,KAAK,gBAC3B1C,SAAWmD,OAAOT,KAAK,gBACvBuB,oBAAsBd,OAAOT,KAAK,uBAKtCrD,aAAayB,OAAO,CAChBlB,MAAOR,IAAImE,WAAW,iBAAkB,mBAAoBU,qBAC5DlD,KAAMxB,UAAUyB,OAAO,4CAA6C,cAAiBiD,sBACrFhD,KAAM5B,aAAa6B,MAAMC,YACzBC,OAAO,IACRC,MAAK,SAASC,cACbA,MAAM4C,kBAAkB9E,IAAImE,WAAW,WAGvCjC,MAAMC,UAAUC,GAAGlC,YAAYmC,MAAM,WACjCM,mBAAmBlC,cA1HrB,GAAA,EA0HsDG,UAAU,MAIlEsB,MAAMC,UAAUC,GAAGlC,YAAY0C,QAAQ,WAEnCV,MAAMW,aAGVX,MAAMY,QAEC,KACRC,MAAMhD,aAAaiD,eAsH+B,MASjD,kBACG,IAAI3C"} \ No newline at end of file +{"version":3,"file":"defaultsactions.min.js","sources":["../src/defaultsactions.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 * AMD module for data registry defaults actions.\n *\n * @module tool_dataprivacy/defaultsactions\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/templates'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {\n\n /**\n * List of action selectors.\n *\n * @type {{EDIT_LEVEL_DEFAULTS: string}}\n * @type {{NEW_ACTIVITY_DEFAULTS: string}}\n * @type {{EDIT_ACTIVITY_DEFAULTS: string}}\n * @type {{DELETE_ACTIVITY_DEFAULTS: string}}\n */\n var ACTIONS = {\n EDIT_LEVEL_DEFAULTS: '[data-action=\"edit-level-defaults\"]',\n NEW_ACTIVITY_DEFAULTS: '[data-action=\"new-activity-defaults\"]',\n EDIT_ACTIVITY_DEFAULTS: '[data-action=\"edit-activity-defaults\"]',\n DELETE_ACTIVITY_DEFAULTS: '[data-action=\"delete-activity-defaults\"]'\n };\n\n /** @type {{INHERIT: Number}} **/\n var INHERIT = -1;\n\n /**\n * DefaultsActions class.\n */\n var DefaultsActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n DefaultsActions.prototype.registerEvents = function() {\n $(ACTIONS.EDIT_LEVEL_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n var category = button.data('category');\n var purpose = button.data('purpose');\n\n // Get options.\n var requests = [\n {methodname: 'tool_dataprivacy_get_category_options', args: {}},\n {methodname: 'tool_dataprivacy_get_purpose_options', args: {}}\n ];\n\n var promises = Ajax.call(requests);\n var titlePromise = Str.get_string('editdefaults', 'tool_dataprivacy', $('#defaults-header').text());\n $.when(promises[0], promises[1], titlePromise).then(function(categoryResponse, purposeResponse, title) {\n var categories = categoryResponse.options;\n var purposes = purposeResponse.options;\n showDefaultsFormModal(title, contextLevel, category, purpose, null, categories, purposes, null);\n\n return true;\n }).catch(Notification.exception);\n });\n\n $(ACTIONS.NEW_ACTIVITY_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n\n // Get options.\n var requests = [\n {methodname: 'tool_dataprivacy_get_category_options', args: {}},\n {methodname: 'tool_dataprivacy_get_purpose_options', args: {}},\n {methodname: 'tool_dataprivacy_get_activity_options', args: {'nodefaults': true}}\n ];\n\n var promises = Ajax.call(requests);\n var titlePromise = Str.get_string('addnewdefaults', 'tool_dataprivacy');\n\n $.when(promises[0], promises[1], promises[2], titlePromise).then(\n function(categoryResponse, purposeResponse, activityResponse, title) {\n var categories = categoryResponse.options;\n var purposes = purposeResponse.options;\n var activities = activityResponse.options;\n\n showDefaultsFormModal(title, contextLevel, null, null, null, categories, purposes, activities);\n\n return true;\n\n }).catch(Notification.exception);\n }\n );\n\n $(ACTIONS.EDIT_ACTIVITY_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n var category = button.data('category');\n var purpose = button.data('purpose');\n var activity = button.data('activityname');\n\n // Get options.\n var requests = [\n {methodname: 'tool_dataprivacy_get_category_options', args: {}},\n {methodname: 'tool_dataprivacy_get_purpose_options', args: {}},\n {methodname: 'tool_dataprivacy_get_activity_options', args: {}}\n ];\n\n var promises = Ajax.call(requests);\n var titlePromise = Str.get_string('editmoduledefaults', 'tool_dataprivacy');\n\n $.when(promises[0], promises[1], promises[2], titlePromise).then(\n function(categoryResponse, purposeResponse, activityResponse, title) {\n var categories = categoryResponse.options;\n var purposes = purposeResponse.options;\n var activities = activityResponse.options;\n\n showDefaultsFormModal(title, contextLevel, category, purpose, activity, categories, purposes, activities);\n\n return true;\n\n }).catch(Notification.exception);\n }\n );\n\n $(ACTIONS.DELETE_ACTIVITY_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n var activity = button.data('activityname');\n var activityDisplayName = button.data('activitydisplayname');\n // Set category and purpose to inherit (-1).\n var category = INHERIT;\n var purpose = INHERIT;\n\n ModalFactory.create({\n title: Str.get_string('deletedefaults', 'tool_dataprivacy', activityDisplayName),\n body: Templates.render('tool_dataprivacy/delete_activity_defaults', {\"activityname\": activityDisplayName}),\n type: ModalFactory.types.SAVE_CANCEL,\n large: true\n }).then(function(modal) {\n modal.setSaveButtonText(Str.get_string('delete'));\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n setContextDefaults(contextLevel, category, purpose, activity, false);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return true;\n }).catch(Notification.exception);\n });\n };\n\n /**\n * Prepares and renders the modal for setting the defaults for the given context level/plugin.\n *\n * @param {String} title The modal's title.\n * @param {Number} contextLevel The context level to set defaults for.\n * @param {Number} category The current category ID.\n * @param {Number} purpose The current purpose ID.\n * @param {String} activity The plugin name of the activity. Optional.\n * @param {Array} categoryOptions The list of category options.\n * @param {Array} purposeOptions The list of purpose options.\n * @param {Array} activityOptions The list of activity options. Optional.\n */\n function showDefaultsFormModal(title, contextLevel, category, purpose, activity,\n categoryOptions, purposeOptions, activityOptions) {\n\n if (category !== null) {\n categoryOptions.forEach(function(currentValue) {\n if (currentValue.id === category) {\n currentValue.selected = true;\n }\n });\n }\n\n if (purpose !== null) {\n purposeOptions.forEach(function(currentValue) {\n if (currentValue.id === purpose) {\n currentValue.selected = true;\n }\n });\n }\n\n var templateContext = {\n \"contextlevel\": contextLevel,\n \"categoryoptions\": categoryOptions,\n \"purposeoptions\": purposeOptions\n };\n\n // Check the activityOptions parameter that was passed.\n if (activityOptions !== null && activityOptions.length) {\n // Check the activity parameter that was passed.\n if (activity === null) {\n // We're setting a new defaults for a module.\n templateContext.newactivitydefaults = true;\n\n } else {\n // Edit mode. Set selection.\n activityOptions.forEach(function(currentValue) {\n if (activity === currentValue.name) {\n currentValue.selected = true;\n }\n });\n }\n\n templateContext.modemodule = true;\n templateContext.activityoptions = activityOptions;\n }\n\n ModalFactory.create({\n title: title,\n body: Templates.render('tool_dataprivacy/category_purpose_form', templateContext),\n type: ModalFactory.types.SAVE_CANCEL,\n large: true\n }).then(function(modal) {\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n var activity = $('#activity');\n var activityVal = typeof activity !== 'undefined' ? activity.val() : null;\n var override = $('#override');\n var overrideVal = typeof override !== 'undefined' ? override.is(':checked') : false;\n\n setContextDefaults($('#contextlevel').val(), $('#category').val(), $('#purpose').val(), activityVal, overrideVal);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return modal;\n }).catch(Notification.exception);\n }\n\n /**\n * Calls a the tool_dataprivacy_set_context_defaults WS function.\n *\n * @param {Number} contextLevel The context level.\n * @param {Number} category The category ID.\n * @param {Number} purpose The purpose ID.\n * @param {String} activity The plugin name of the activity module.\n * @param {Boolean} override Whether to override custom instances.\n */\n function setContextDefaults(contextLevel, category, purpose, activity, override) {\n var request = {\n methodname: 'tool_dataprivacy_set_context_defaults',\n args: {\n 'contextlevel': contextLevel,\n 'category': category,\n 'purpose': purpose,\n 'override': override,\n 'activity': activity\n }\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n window.location.reload();\n }\n });\n }\n\n return /** @alias module:tool_dataprivacy/defaultsactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the module.\n *\n * @method init\n * @return {DefaultsActions}\n */\n 'init': function() {\n return new DefaultsActions();\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","Templates","ACTIONS","DefaultsActions","this","registerEvents","showDefaultsFormModal","title","contextLevel","category","purpose","activity","categoryOptions","purposeOptions","activityOptions","forEach","currentValue","id","selected","templateContext","contextlevel","categoryoptions","length","newactivitydefaults","name","modemodule","activityoptions","create","body","render","type","types","SAVE_CANCEL","large","then","modal","getRoot","on","save","activityVal","val","override","overrideVal","is","setContextDefaults","hidden","destroy","show","catch","exception","request","methodname","args","call","done","data","result","window","location","reload","prototype","click","e","preventDefault","button","promises","titlePromise","get_string","text","when","categoryResponse","purposeResponse","categories","options","purposes","nodefaults","activityResponse","activities","activityDisplayName","setSaveButtonText","init"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/effective_retention_period.min.js.map b/admin/tool/dataprivacy/amd/build/effective_retention_period.min.js.map index ac590ba9ea6..b03cd45fc48 100644 --- a/admin/tool/dataprivacy/amd/build/effective_retention_period.min.js.map +++ b/admin/tool/dataprivacy/amd/build/effective_retention_period.min.js.map @@ -1 +1 @@ -{"version":3,"file":"effective_retention_period.min.js","sources":["../src/effective_retention_period.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 update the displayed retention period.\n *\n * @module tool_dataprivacy/effective_retention_period\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'],\n function($) {\n\n var SELECTORS = {\n PURPOSE_SELECT: '#id_purposeid',\n RETENTION_FIELD: '#fitem_id_retention_current [data-fieldtype=static]',\n };\n\n /**\n * Constructor for the retention period display.\n *\n * @param {Array} purposeRetentionPeriods Associative array of purposeids with effective retention period at this context\n */\n var EffectiveRetentionPeriod = function(purposeRetentionPeriods) {\n this.purposeRetentionPeriods = purposeRetentionPeriods;\n this.registerEventListeners();\n };\n\n /**\n * Removes the current 'change' listeners.\n *\n * Useful when a new form is loaded.\n */\n var removeListeners = function() {\n $(SELECTORS.PURPOSE_SELECT).off('change');\n };\n\n /**\n * @var {Array} purposeRetentionPeriods\n * @private\n */\n EffectiveRetentionPeriod.prototype.purposeRetentionPeriods = [];\n\n /**\n * Add purpose change listeners.\n *\n * @method registerEventListeners\n */\n EffectiveRetentionPeriod.prototype.registerEventListeners = function() {\n\n $(SELECTORS.PURPOSE_SELECT).on('change', function(ev) {\n var selected = $(ev.currentTarget).val();\n var selectedPurpose = this.purposeRetentionPeriods[selected];\n $(SELECTORS.RETENTION_FIELD).text(selectedPurpose);\n }.bind(this));\n };\n\n return /** @alias module:tool_dataprivacy/effective_retention_period */ {\n init: function(purposeRetentionPeriods) {\n // Remove previously attached listeners.\n removeListeners();\n return new EffectiveRetentionPeriod(purposeRetentionPeriods);\n }\n };\n }\n);\n\n"],"names":["define","$","SELECTORS","EffectiveRetentionPeriod","purposeRetentionPeriods","registerEventListeners","prototype","on","ev","selected","currentTarget","val","selectedPurpose","this","text","bind","init","off"],"mappings":";;;;;;;AAsBAA,qDAAO,CAAC,WACJ,SAASC,OAEDC,yBACgB,gBADhBA,0BAEiB,sDAQjBC,yBAA2B,SAASC,8BAC/BA,wBAA0BA,6BAC1BC,iCAgBTF,yBAAyBG,UAAUF,wBAA0B,GAO7DD,yBAAyBG,UAAUD,uBAAyB,WAExDJ,EAAEC,0BAA0BK,GAAG,SAAU,SAASC,QAC1CC,SAAWR,EAAEO,GAAGE,eAAeC,MAC/BC,gBAAkBC,KAAKT,wBAAwBK,UACnDR,EAAEC,2BAA2BY,KAAKF,kBACpCG,KAAKF,QAG6D,CACpEG,KAAM,SAASZ,gCAxBfH,EAAEC,0BAA0Be,IAAI,UA2BrB,IAAId,yBAAyBC"} \ No newline at end of file +{"version":3,"file":"effective_retention_period.min.js","sources":["../src/effective_retention_period.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 update the displayed retention period.\n *\n * @module tool_dataprivacy/effective_retention_period\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'],\n function($) {\n\n var SELECTORS = {\n PURPOSE_SELECT: '#id_purposeid',\n RETENTION_FIELD: '#fitem_id_retention_current [data-fieldtype=static]',\n };\n\n /**\n * Constructor for the retention period display.\n *\n * @param {Array} purposeRetentionPeriods Associative array of purposeids with effective retention period at this context\n */\n var EffectiveRetentionPeriod = function(purposeRetentionPeriods) {\n this.purposeRetentionPeriods = purposeRetentionPeriods;\n this.registerEventListeners();\n };\n\n /**\n * Removes the current 'change' listeners.\n *\n * Useful when a new form is loaded.\n */\n var removeListeners = function() {\n $(SELECTORS.PURPOSE_SELECT).off('change');\n };\n\n /**\n * @var {Array} purposeRetentionPeriods\n * @private\n */\n EffectiveRetentionPeriod.prototype.purposeRetentionPeriods = [];\n\n /**\n * Add purpose change listeners.\n *\n * @method registerEventListeners\n */\n EffectiveRetentionPeriod.prototype.registerEventListeners = function() {\n\n $(SELECTORS.PURPOSE_SELECT).on('change', function(ev) {\n var selected = $(ev.currentTarget).val();\n var selectedPurpose = this.purposeRetentionPeriods[selected];\n $(SELECTORS.RETENTION_FIELD).text(selectedPurpose);\n }.bind(this));\n };\n\n return /** @alias module:tool_dataprivacy/effective_retention_period */ {\n init: function(purposeRetentionPeriods) {\n // Remove previously attached listeners.\n removeListeners();\n return new EffectiveRetentionPeriod(purposeRetentionPeriods);\n }\n };\n }\n);\n\n"],"names":["define","$","SELECTORS","EffectiveRetentionPeriod","purposeRetentionPeriods","this","registerEventListeners","prototype","on","ev","selected","currentTarget","val","selectedPurpose","text","bind","init","off"],"mappings":";;;;;;;AAsBAA,qDAAO,CAAC,WACJ,SAASC,GAEL,IAAIC,yBACgB,gBADhBA,0BAEiB,sDAQjBC,yBAA2B,SAASC,yBAC/BA,KAAAA,wBAA0BA,wBAC/BC,KAAKC,wBACR,EA+BuE,OAhBxEH,yBAAyBI,UAAUH,wBAA0B,GAO7DD,yBAAyBI,UAAUD,uBAAyB,WAExDL,EAAEC,0BAA0BM,GAAG,SAAU,SAASC,IAC1CC,IAAAA,SAAWT,EAAEQ,GAAGE,eAAeC,MAC/BC,gBAAkBR,KAAKD,wBAAwBM,UACnDT,EAAEC,2BAA2BY,KAAKD,gBACrC,EAACE,KAAKV,MACV,EAEuE,CACpEW,KAAM,SAASZ,yBAGX,OA3BJH,EAAEC,0BAA0Be,IAAI,UA2BrB,IAAId,yBAAyBC,wBACvC,EAER"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/events.min.js.map b/admin/tool/dataprivacy/amd/build/events.min.js.map index 287e52800b6..528d200ecda 100644 --- a/admin/tool/dataprivacy/amd/build/events.min.js.map +++ b/admin/tool/dataprivacy/amd/build/events.min.js.map @@ -1 +1 @@ -{"version":3,"file":"events.min.js","sources":["../src/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 * Contain the events the data privacy tool can fire.\n *\n * @module tool_dataprivacy/events\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n approve: 'tool_dataprivacy-data_request:approve',\n bulkApprove: 'tool_dataprivacy-data_request:bulk_approve',\n deny: 'tool_dataprivacy-data_request:deny',\n bulkDeny: 'tool_dataprivacy-data_request:bulk_deny',\n complete: 'tool_dataprivacy-data_request:complete'\n };\n});\n"],"names":["define","approve","bulkApprove","deny","bulkDeny","complete"],"mappings":";;;;;;;AAsBAA,iCAAO,IAAI,iBACA,CACHC,QAAS,wCACTC,YAAa,6CACbC,KAAM,qCACNC,SAAU,0CACVC,SAAU"} \ No newline at end of file +{"version":3,"file":"events.min.js","sources":["../src/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 * Contain the events the data privacy tool can fire.\n *\n * @module tool_dataprivacy/events\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n approve: 'tool_dataprivacy-data_request:approve',\n bulkApprove: 'tool_dataprivacy-data_request:bulk_approve',\n deny: 'tool_dataprivacy-data_request:deny',\n bulkDeny: 'tool_dataprivacy-data_request:bulk_deny',\n complete: 'tool_dataprivacy-data_request:complete'\n };\n});\n"],"names":["define","approve","bulkApprove","deny","bulkDeny","complete"],"mappings":";;;;;;;AAsBAA,OAAM,0BAAC,IAAI,WACA,MAAA,CACHC,QAAS,wCACTC,YAAa,6CACbC,KAAM,qCACNC,SAAU,0CACVC,SAAU,yCAEjB"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/expand_contract.min.js.map b/admin/tool/dataprivacy/amd/build/expand_contract.min.js.map index f14dcd9e805..0665f37740b 100644 --- a/admin/tool/dataprivacy/amd/build/expand_contract.min.js.map +++ b/admin/tool/dataprivacy/amd/build/expand_contract.min.js.map @@ -1 +1 @@ -{"version":3,"file":"expand_contract.min.js","sources":["../src/expand_contract.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 * Potential user selector module.\n *\n * @module tool_dataprivacy/expand_contract\n * @copyright 2018 Adrian Greeve\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/url', 'core/str'], function($, url, str) {\n\n var expandedImage = $('\"\"');\n var collapsedImage = $('\"\"');\n\n /*\n * Class names to apply when expanding/collapsing nodes.\n */\n var CLASSES = {\n EXPAND: 'fa-caret-right',\n COLLAPSE: 'fa-caret-down'\n };\n\n return /** @alias module:tool_dataprivacy/expand-collapse */ {\n /**\n * Expand or collapse a selected node.\n *\n * @param {object} targetnode The node that we want to expand / collapse\n * @param {object} thisnode The node that was clicked.\n */\n expandCollapse: function(targetnode, thisnode) {\n if (targetnode.hasClass('hide')) {\n targetnode.removeClass('hide');\n targetnode.addClass('visible');\n targetnode.attr('aria-expanded', true);\n thisnode.find(':header i.fa').removeClass(CLASSES.EXPAND);\n thisnode.find(':header i.fa').addClass(CLASSES.COLLAPSE);\n thisnode.find(':header img.icon').attr('src', expandedImage.attr('src'));\n } else {\n targetnode.removeClass('visible');\n targetnode.addClass('hide');\n targetnode.attr('aria-expanded', false);\n thisnode.find(':header i.fa').removeClass(CLASSES.COLLAPSE);\n thisnode.find(':header i.fa').addClass(CLASSES.EXPAND);\n thisnode.find(':header img.icon').attr('src', collapsedImage.attr('src'));\n }\n },\n\n /**\n * Expand or collapse all nodes on this page.\n *\n * @param {string} nextstate The next state to change to.\n */\n expandCollapseAll: function(nextstate) {\n var currentstate = (nextstate == 'visible') ? 'hide' : 'visible';\n var ariaexpandedstate = (nextstate == 'visible') ? true : false;\n var iconclassnow = (nextstate == 'visible') ? CLASSES.EXPAND : CLASSES.COLLAPSE;\n var iconclassnext = (nextstate == 'visible') ? CLASSES.COLLAPSE : CLASSES.EXPAND;\n var imagenow = (nextstate == 'visible') ? expandedImage.attr('src') : collapsedImage.attr('src');\n $('.' + currentstate).each(function() {\n $(this).removeClass(currentstate);\n $(this).addClass(nextstate);\n $(this).attr('aria-expanded', ariaexpandedstate);\n });\n $('.tool_dataprivacy-expand-all').data('visibilityState', currentstate);\n\n str.get_string(currentstate, 'tool_dataprivacy').then(function(langString) {\n $('.tool_dataprivacy-expand-all').html(langString);\n return;\n }).catch(Notification.exception);\n\n $(':header i.fa').each(function() {\n $(this).removeClass(iconclassnow);\n $(this).addClass(iconclassnext);\n });\n $(':header img.icon').each(function() {\n $(this).attr('src', imagenow);\n });\n }\n };\n});\n"],"names":["define","$","url","str","expandedImage","imageUrl","collapsedImage","CLASSES","expandCollapse","targetnode","thisnode","hasClass","removeClass","addClass","attr","find","expandCollapseAll","nextstate","currentstate","ariaexpandedstate","iconclassnow","iconclassnext","imagenow","each","this","data","get_string","then","langString","html","catch","Notification","exception"],"mappings":";;;;;;;AAuBAA,0CAAO,CAAC,SAAU,WAAY,aAAa,SAASC,EAAGC,IAAKC,SAEpDC,cAAgBH,EAAE,oBAAsBC,IAAIG,SAAS,cAAgB,OACrEC,eAAiBL,EAAE,oBAAsBC,IAAIG,SAAS,eAAiB,OAKvEE,eACQ,iBADRA,iBAEU,sBAG+C,CAOzDC,eAAgB,SAASC,WAAYC,UAC7BD,WAAWE,SAAS,SACpBF,WAAWG,YAAY,QACvBH,WAAWI,SAAS,WACpBJ,WAAWK,KAAK,iBAAiB,GACjCJ,SAASK,KAAK,gBAAgBH,YAAYL,gBAC1CG,SAASK,KAAK,gBAAgBF,SAASN,kBACvCG,SAASK,KAAK,oBAAoBD,KAAK,MAAOV,cAAcU,KAAK,UAEjEL,WAAWG,YAAY,WACvBH,WAAWI,SAAS,QACpBJ,WAAWK,KAAK,iBAAiB,GACjCJ,SAASK,KAAK,gBAAgBH,YAAYL,kBAC1CG,SAASK,KAAK,gBAAgBF,SAASN,gBACvCG,SAASK,KAAK,oBAAoBD,KAAK,MAAOR,eAAeQ,KAAK,UAS1EE,kBAAmB,SAASC,eACpBC,aAA6B,WAAbD,UAA0B,OAAS,UACnDE,kBAAkC,WAAbF,UACrBG,aAA6B,WAAbH,UAA0BV,eAAiBA,iBAC3Dc,cAA8B,WAAbJ,UAA0BV,iBAAmBA,eAC9De,SAAyB,WAAbL,UAA0Bb,cAAcU,KAAK,OAASR,eAAeQ,KAAK,OAC1Fb,EAAE,IAAMiB,cAAcK,MAAK,WACvBtB,EAAEuB,MAAMZ,YAAYM,cACpBjB,EAAEuB,MAAMX,SAASI,WACjBhB,EAAEuB,MAAMV,KAAK,gBAAiBK,sBAElClB,EAAE,gCAAgCwB,KAAK,kBAAmBP,cAE1Df,IAAIuB,WAAWR,aAAc,oBAAoBS,MAAK,SAASC,YAC3D3B,EAAE,gCAAgC4B,KAAKD,eAExCE,MAAMC,aAAaC,WAEtB/B,EAAE,gBAAgBsB,MAAK,WACnBtB,EAAEuB,MAAMZ,YAAYQ,cACpBnB,EAAEuB,MAAMX,SAASQ,kBAErBpB,EAAE,oBAAoBsB,MAAK,WACvBtB,EAAEuB,MAAMV,KAAK,MAAOQ"} \ No newline at end of file +{"version":3,"file":"expand_contract.min.js","sources":["../src/expand_contract.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 * Potential user selector module.\n *\n * @module tool_dataprivacy/expand_contract\n * @copyright 2018 Adrian Greeve\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/url', 'core/str'], function($, url, str) {\n\n var expandedImage = $('\"\"');\n var collapsedImage = $('\"\"');\n\n /*\n * Class names to apply when expanding/collapsing nodes.\n */\n var CLASSES = {\n EXPAND: 'fa-caret-right',\n COLLAPSE: 'fa-caret-down'\n };\n\n return /** @alias module:tool_dataprivacy/expand-collapse */ {\n /**\n * Expand or collapse a selected node.\n *\n * @param {object} targetnode The node that we want to expand / collapse\n * @param {object} thisnode The node that was clicked.\n */\n expandCollapse: function(targetnode, thisnode) {\n if (targetnode.hasClass('hide')) {\n targetnode.removeClass('hide');\n targetnode.addClass('visible');\n targetnode.attr('aria-expanded', true);\n thisnode.find(':header i.fa').removeClass(CLASSES.EXPAND);\n thisnode.find(':header i.fa').addClass(CLASSES.COLLAPSE);\n thisnode.find(':header img.icon').attr('src', expandedImage.attr('src'));\n } else {\n targetnode.removeClass('visible');\n targetnode.addClass('hide');\n targetnode.attr('aria-expanded', false);\n thisnode.find(':header i.fa').removeClass(CLASSES.COLLAPSE);\n thisnode.find(':header i.fa').addClass(CLASSES.EXPAND);\n thisnode.find(':header img.icon').attr('src', collapsedImage.attr('src'));\n }\n },\n\n /**\n * Expand or collapse all nodes on this page.\n *\n * @param {string} nextstate The next state to change to.\n */\n expandCollapseAll: function(nextstate) {\n var currentstate = (nextstate == 'visible') ? 'hide' : 'visible';\n var ariaexpandedstate = (nextstate == 'visible') ? true : false;\n var iconclassnow = (nextstate == 'visible') ? CLASSES.EXPAND : CLASSES.COLLAPSE;\n var iconclassnext = (nextstate == 'visible') ? CLASSES.COLLAPSE : CLASSES.EXPAND;\n var imagenow = (nextstate == 'visible') ? expandedImage.attr('src') : collapsedImage.attr('src');\n $('.' + currentstate).each(function() {\n $(this).removeClass(currentstate);\n $(this).addClass(nextstate);\n $(this).attr('aria-expanded', ariaexpandedstate);\n });\n $('.tool_dataprivacy-expand-all').data('visibilityState', currentstate);\n\n str.get_string(currentstate, 'tool_dataprivacy').then(function(langString) {\n $('.tool_dataprivacy-expand-all').html(langString);\n return;\n }).catch(Notification.exception);\n\n $(':header i.fa').each(function() {\n $(this).removeClass(iconclassnow);\n $(this).addClass(iconclassnext);\n });\n $(':header img.icon').each(function() {\n $(this).attr('src', imagenow);\n });\n }\n };\n});\n"],"names":["define","$","url","str","expandedImage","imageUrl","collapsedImage","CLASSES","expandCollapse","targetnode","thisnode","hasClass","removeClass","addClass","attr","find","expandCollapseAll","nextstate","currentstate","ariaexpandedstate","iconclassnow","iconclassnext","imagenow","each","this","data","get_string","then","langString","html","catch","Notification","exception"],"mappings":";;;;;;;AAuBAA,OAAO,mCAAA,CAAC,SAAU,WAAY,aAAa,SAASC,EAAGC,IAAKC,KAExD,IAAIC,cAAgBH,EAAE,oBAAsBC,IAAIG,SAAS,cAAgB,OACrEC,eAAiBL,EAAE,oBAAsBC,IAAIG,SAAS,eAAiB,OAKvEE,eACQ,iBADRA,iBAEU,gBAG+C,MAAA,CAOzDC,eAAgB,SAASC,WAAYC,UAC7BD,WAAWE,SAAS,SACpBF,WAAWG,YAAY,QACvBH,WAAWI,SAAS,WACpBJ,WAAWK,KAAK,iBAAiB,GACjCJ,SAASK,KAAK,gBAAgBH,YAAYL,gBAC1CG,SAASK,KAAK,gBAAgBF,SAASN,kBACvCG,SAASK,KAAK,oBAAoBD,KAAK,MAAOV,cAAcU,KAAK,UAEjEL,WAAWG,YAAY,WACvBH,WAAWI,SAAS,QACpBJ,WAAWK,KAAK,iBAAiB,GACjCJ,SAASK,KAAK,gBAAgBH,YAAYL,kBAC1CG,SAASK,KAAK,gBAAgBF,SAASN,gBACvCG,SAASK,KAAK,oBAAoBD,KAAK,MAAOR,eAAeQ,KAAK,QArBjB,EA8BzDE,kBAAmB,SAASC,WACpBC,IAAAA,aAA6B,WAAbD,UAA0B,OAAS,UACnDE,kBAAkC,WAAbF,UACrBG,aAA6B,WAAbH,UAA0BV,eAAiBA,iBAC3Dc,cAA8B,WAAbJ,UAA0BV,iBAAmBA,eAC9De,SAAyB,WAAbL,UAA0Bb,cAAcU,KAAK,OAASR,eAAeQ,KAAK,OAC1Fb,EAAE,IAAMiB,cAAcK,MAAK,WACvBtB,EAAEuB,MAAMZ,YAAYM,cACpBjB,EAAEuB,MAAMX,SAASI,WACjBhB,EAAEuB,MAAMV,KAAK,gBAAiBK,kBACjC,IACDlB,EAAE,gCAAgCwB,KAAK,kBAAmBP,cAE1Df,IAAIuB,WAAWR,aAAc,oBAAoBS,MAAK,SAASC,YAC3D3B,EAAE,gCAAgC4B,KAAKD,WAD3C,IAGGE,MAAMC,aAAaC,WAEtB/B,EAAE,gBAAgBsB,MAAK,WACnBtB,EAAEuB,MAAMZ,YAAYQ,cACpBnB,EAAEuB,MAAMX,SAASQ,cACpB,IACDpB,EAAE,oBAAoBsB,MAAK,WACvBtB,EAAEuB,MAAMV,KAAK,MAAOQ,SACvB,GACJ,EAER"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/form-user-selector.min.js.map b/admin/tool/dataprivacy/amd/build/form-user-selector.min.js.map index 5d218425475..849172cadfa 100644 --- a/admin/tool/dataprivacy/amd/build/form-user-selector.min.js.map +++ b/admin/tool/dataprivacy/amd/build/form-user-selector.min.js.map @@ -1 +1 @@ -{"version":3,"file":"form-user-selector.min.js","sources":["../src/form-user-selector.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 * Potential user selector module.\n *\n * @module tool_dataprivacy/form-user-selector\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {\n\n return /** @alias module:tool_dataprivacy/form-user-selector */ {\n\n processResults: function(selector, results) {\n var users = [];\n $.each(results, function(index, user) {\n users.push({\n value: user.id,\n label: user._label\n });\n });\n return users;\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n\n promise = Ajax.call([{\n methodname: 'tool_dataprivacy_get_users',\n args: {\n query: query\n }\n }]);\n\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n // Render the label.\n $.each(results, function(index, user) {\n promises.push(Templates.render('tool_dataprivacy/form-user-selector-suggestion', user));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results, function(index, user) {\n user._label = args[i];\n i++;\n });\n success(results);\n return;\n });\n\n }).fail(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","Templates","processResults","selector","results","users","each","index","user","push","value","id","label","_label","transport","query","success","failure","call","methodname","args","then","promises","i","render","when","apply","arguments","fail"],"mappings":";;;;;;;AAuBAA,6CAAO,CAAC,SAAU,YAAa,mBAAmB,SAASC,EAAGC,KAAMC,iBAEA,CAE5DC,eAAgB,SAASC,SAAUC,aAC3BC,MAAQ,UACZN,EAAEO,KAAKF,SAAS,SAASG,MAAOC,MAC5BH,MAAMI,KAAK,CACPC,MAAOF,KAAKG,GACZC,MAAOJ,KAAKK,YAGbR,OAGXS,UAAW,SAASX,SAAUY,MAAOC,QAASC,SAGhCjB,KAAKkB,KAAK,CAAC,CACjBC,WAAY,6BACZC,KAAM,CACFL,MAAOA,UAIP,GAAGM,MAAK,SAASjB,aACjBkB,SAAW,GACXC,EAAI,SAGRxB,EAAEO,KAAKF,SAAS,SAASG,MAAOC,MAC5Bc,SAASb,KAAKR,UAAUuB,OAAO,iDAAkDhB,UAI9ET,EAAE0B,KAAKC,MAAM3B,EAAE0B,KAAMH,UAAUD,MAAK,eACnCD,KAAOO,UACX5B,EAAEO,KAAKF,SAAS,SAASG,MAAOC,MAC5BA,KAAKK,OAASO,KAAKG,GACnBA,OAEJP,QAAQZ,eAIbwB,KAAKX"} \ No newline at end of file +{"version":3,"file":"form-user-selector.min.js","sources":["../src/form-user-selector.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 * Potential user selector module.\n *\n * @module tool_dataprivacy/form-user-selector\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {\n\n return /** @alias module:tool_dataprivacy/form-user-selector */ {\n\n processResults: function(selector, results) {\n var users = [];\n $.each(results, function(index, user) {\n users.push({\n value: user.id,\n label: user._label\n });\n });\n return users;\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n\n promise = Ajax.call([{\n methodname: 'tool_dataprivacy_get_users',\n args: {\n query: query\n }\n }]);\n\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n // Render the label.\n $.each(results, function(index, user) {\n promises.push(Templates.render('tool_dataprivacy/form-user-selector-suggestion', user));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results, function(index, user) {\n user._label = args[i];\n i++;\n });\n success(results);\n return;\n });\n\n }).fail(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","Templates","processResults","selector","results","users","each","index","user","push","value","id","label","_label","transport","query","success","failure","call","methodname","args","then","promises","i","render","when","apply","arguments","fail"],"mappings":";;;;;;;AAuBAA,OAAO,sCAAA,CAAC,SAAU,YAAa,mBAAmB,SAASC,EAAGC,KAAMC,WAEA,MAAA,CAE5DC,eAAgB,SAASC,SAAUC,SAC3BC,IAAAA,MAAQ,GAOZ,OANAN,EAAEO,KAAKF,SAAS,SAASG,MAAOC,MAC5BH,MAAMI,KAAK,CACPC,MAAOF,KAAKG,GACZC,MAAOJ,KAAKK,QAEnB,IACMR,KAViD,EAa5DS,UAAW,SAASX,SAAUY,MAAOC,QAASC,SAGhCjB,KAAKkB,KAAK,CAAC,CACjBC,WAAY,6BACZC,KAAM,CACFL,MAAOA,UAIP,GAAGM,MAAK,SAASjB,SACjBkB,IAAAA,SAAW,GACXC,EAAI,EAQR,OALAxB,EAAEO,KAAKF,SAAS,SAASG,MAAOC,MAC5Bc,SAASb,KAAKR,UAAUuB,OAAO,iDAAkDhB,MACpF,IAGMT,EAAE0B,KAAKC,MAAM3B,EAAE0B,KAAMH,UAAUD,MAAK,WACnCD,IAAAA,KAAOO,UACX5B,EAAEO,KAAKF,SAAS,SAASG,MAAOC,MAC5BA,KAAKK,OAASO,KAAKG,GACnBA,GACH,IACDP,QAAQZ,QAEX,GAEJ,IAAEwB,KAAKX,QACX,EAIR"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map b/admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map index e5c3f27e439..fbd7b7245e8 100644 --- a/admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map +++ b/admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"myrequestactions.min.js","sources":["../src/myrequestactions.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 * AMD module to enable users to manage their own data requests.\n *\n * @module tool_dataprivacy/myrequestactions\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {get_strings as getStrings} from 'core/str';\n\nconst SELECTORS = {\n CANCEL_REQUEST: '[data-action=\"cancel\"][data-requestid]',\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n document.addEventListener('click', event => {\n const triggerElement = event.target.closest(SELECTORS.CANCEL_REQUEST);\n if (triggerElement === null) {\n return;\n }\n\n event.preventDefault();\n\n const requiredStrings = [\n {key: 'cancelrequest', component: 'tool_dataprivacy'},\n {key: 'cancelrequestconfirmation', component: 'tool_dataprivacy'},\n ];\n\n getStrings(requiredStrings).then(([cancelRequest, cancelConfirm]) => {\n return Notification.confirm(cancelRequest, cancelConfirm, cancelRequest, null, () => {\n const pendingPromise = new Pending('tool/dataprivacy:cancelRequest');\n const request = {\n methodname: 'tool_dataprivacy_cancel_data_request',\n args: {requestid: triggerElement.dataset.requestid}\n };\n\n Ajax.call([request])[0].then(response => {\n if (response.result) {\n window.location.reload();\n } else {\n Notification.addNotification({\n type: 'error',\n message: response.warnings[0].message\n });\n }\n return pendingPromise.resolve();\n }).catch(Notification.exception);\n });\n }).catch();\n });\n};\n"],"names":["SELECTORS","document","addEventListener","event","triggerElement","target","closest","preventDefault","key","component","then","cancelRequest","cancelConfirm","Notification","confirm","pendingPromise","Pending","request","methodname","args","requestid","dataset","call","response","result","window","location","reload","addNotification","type","message","warnings","resolve","catch","exception"],"mappings":"ikDA4BMA,yBACc,uDAMA,WAChBC,SAASC,iBAAiB,SAAS,SAAAC,WACzBC,eAAiBD,MAAME,OAAOC,QAAQN,6BACrB,OAAnBI,gBAIJD,MAAMI,sCAEkB,CACpB,CAACC,IAAK,gBAAiBC,UAAW,oBAClC,CAACD,IAAK,4BAA6BC,UAAW,sBAGtBC,MAAK,gDAAEC,uBAAeC,8BACvCC,sBAAaC,QAAQH,cAAeC,cAAeD,cAAe,MAAM,eACrEI,eAAiB,IAAIC,iBAAQ,kCAC7BC,QAAU,CACZC,WAAY,uCACZC,KAAM,CAACC,UAAWhB,eAAeiB,QAAQD,0BAGxCE,KAAK,CAACL,UAAU,GAAGP,MAAK,SAAAa,iBACrBA,SAASC,OACTC,OAAOC,SAASC,+BAEHC,gBAAgB,CACzBC,KAAM,QACNC,QAASP,SAASQ,SAAS,GAAGD,UAG/Bf,eAAeiB,aACvBC,MAAMpB,sBAAaqB,iBAE3BD"} \ No newline at end of file +{"version":3,"file":"myrequestactions.min.js","sources":["../src/myrequestactions.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 * AMD module to enable users to manage their own data requests.\n *\n * @module tool_dataprivacy/myrequestactions\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {get_strings as getStrings} from 'core/str';\n\nconst SELECTORS = {\n CANCEL_REQUEST: '[data-action=\"cancel\"][data-requestid]',\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n document.addEventListener('click', event => {\n const triggerElement = event.target.closest(SELECTORS.CANCEL_REQUEST);\n if (triggerElement === null) {\n return;\n }\n\n event.preventDefault();\n\n const requiredStrings = [\n {key: 'cancelrequest', component: 'tool_dataprivacy'},\n {key: 'cancelrequestconfirmation', component: 'tool_dataprivacy'},\n ];\n\n getStrings(requiredStrings).then(([cancelRequest, cancelConfirm]) => {\n return Notification.confirm(cancelRequest, cancelConfirm, cancelRequest, null, () => {\n const pendingPromise = new Pending('tool/dataprivacy:cancelRequest');\n const request = {\n methodname: 'tool_dataprivacy_cancel_data_request',\n args: {requestid: triggerElement.dataset.requestid}\n };\n\n Ajax.call([request])[0].then(response => {\n if (response.result) {\n window.location.reload();\n } else {\n Notification.addNotification({\n type: 'error',\n message: response.warnings[0].message\n });\n }\n return pendingPromise.resolve();\n }).catch(Notification.exception);\n });\n }).catch();\n });\n};\n"],"names":["_ajax","_interopRequireDefault","_notification","_pending","SELECTORS","document","addEventListener","event","triggerElement","target","closest","preventDefault","_str","get_strings","key","component","then","_ref","_ref2","_slicedToArray","cancelRequest","cancelConfirm","Notification","confirm","pendingPromise","Pending","default","request","methodname","args","requestid","dataset","Ajax","call","response","result","window","location","reload","addNotification","type","message","warnings","resolve","catch","exception"],"mappings":"27CAuBAA,MAAAC,uBAAAD,OACAE,cAAAD,uBAAAC,eACAC,SAAAF,uBAAAE,UAGA,IAAMC,yBACc,uDAMA,WAChBC,SAASC,iBAAiB,SAAS,SAAAC,OACzBC,IAAAA,eAAiBD,MAAME,OAAOC,QAAQN,0BACxCI,GAAmB,OAAnBA,eAAAA,CAIJD,MAAMI,kBAON,EAAAC,KAAAC,aALwB,CACpB,CAACC,IAAK,gBAAiBC,UAAW,oBAClC,CAACD,IAAK,4BAA6BC,UAAW,sBAGtBC,MAAK,SAAoCC,MAAA,IAAAC,MAAAC,eAAAF,KAAA,GAAlCG,cAAkCF,MAAA,GAAnBG,cAAmBH,MAAA,GAC1DI,OAAAA,cAAAA,QAAaC,QAAQH,cAAeC,cAAeD,cAAe,MAAM,WAC3E,IAAMI,eAAiB,IAAIC,SAAJC,QAAY,kCAC7BC,QAAU,CACZC,WAAY,uCACZC,KAAM,CAACC,UAAWtB,eAAeuB,QAAQD,YAG7CE,MAAAA,QAAKC,KAAK,CAACN,UAAU,GAAGX,MAAK,SAAAkB,UASlBV,OARHU,SAASC,OACTC,OAAOC,SAASC,SAEhBhB,cAAAA,QAAaiB,gBAAgB,CACzBC,KAAM,QACNC,QAASP,SAASQ,SAAS,GAAGD,UAG/BjB,eAAemB,SAT1B,IAUGC,MAAMtB,cAAAA,QAAauB,UACzB,GACJ,IAAED,OA7BF,CA8BJ,GACJ"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/purposesactions.min.js.map b/admin/tool/dataprivacy/amd/build/purposesactions.min.js.map index 6e7f8f4da8f..d504e38811d 100644 --- a/admin/tool/dataprivacy/amd/build/purposesactions.min.js.map +++ b/admin/tool/dataprivacy/amd/build/purposesactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"purposesactions.min.js","sources":["../src/purposesactions.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 * AMD module for purposes actions.\n *\n * @module tool_dataprivacy/purposesactions\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{DELETE: string}}\n */\n var ACTIONS = {\n DELETE: '[data-action=\"deletepurpose\"]',\n };\n\n /**\n * PurposesActions class.\n */\n var PurposesActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n PurposesActions.prototype.registerEvents = function() {\n $(ACTIONS.DELETE).click(function(e) {\n e.preventDefault();\n\n var id = $(this).data('id');\n var purposename = $(this).data('name');\n var stringkeys = [\n {\n key: 'deletepurpose',\n component: 'tool_dataprivacy'\n },\n {\n key: 'deletepurposetext',\n component: 'tool_dataprivacy',\n param: purposename\n },\n {\n key: 'delete'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langStrings) {\n var title = langStrings[0];\n var confirmMessage = langStrings[1];\n var buttonText = langStrings[2];\n return ModalFactory.create({\n title: title,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n }).then(function(modal) {\n modal.setSaveButtonText(buttonText);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n\n var request = {\n methodname: 'tool_dataprivacy_delete_purpose',\n args: {'id': id}\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n $('tr[data-purposeid=\"' + id + '\"]').remove();\n } else {\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n });\n }).done(function(modal) {\n modal.show();\n\n }).fail(Notification.exception);\n });\n };\n\n return /** @alias module:tool_dataprivacy/purposesactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the module.\n *\n * @method init\n * @return {PurposesActions}\n */\n 'init': function() {\n return new PurposesActions();\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","ACTIONS","PurposesActions","registerEvents","prototype","click","e","preventDefault","id","this","data","stringkeys","key","component","param","get_strings","then","langStrings","title","confirmMessage","buttonText","create","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","request","methodname","args","call","done","result","remove","addNotification","message","warnings","fail","exception","hidden","destroy","show"],"mappings":";;;;;;;AAsBAA,0CAAO,CACH,SACA,YACA,oBACA,WACA,qBACA,sBACJ,SAASC,EAAGC,KAAMC,aAAcC,IAAKC,aAAcC,iBAO3CC,eACQ,gCAMRC,gBAAkB,gBACbC,yBAMTD,gBAAgBE,UAAUD,eAAiB,WACvCR,EAAEM,gBAAgBI,OAAM,SAASC,GAC7BA,EAAEC,qBAEEC,GAAKb,EAAEc,MAAMC,KAAK,MAElBC,WAAa,CACb,CACIC,IAAK,gBACLC,UAAW,oBAEf,CACID,IAAK,oBACLC,UAAW,mBACXC,MATUnB,EAAEc,MAAMC,KAAK,SAW3B,CACIE,IAAK,WAIbd,IAAIiB,YAAYJ,YAAYK,MAAK,SAASC,iBAClCC,MAAQD,YAAY,GACpBE,eAAiBF,YAAY,GAC7BG,WAAaH,YAAY,UACtBlB,aAAasB,OAAO,CACvBH,MAAOA,MACPI,KAAMH,eACNI,KAAMxB,aAAayB,MAAMC,cAC1BT,MAAK,SAASU,cACbA,MAAMC,kBAAkBP,YAGxBM,MAAME,UAAUC,GAAG7B,YAAY8B,MAAM,eAE7BC,QAAU,CACVC,WAAY,kCACZC,KAAM,IAAOzB,KAGjBZ,KAAKsC,KAAK,CAACH,UAAU,GAAGI,MAAK,SAASzB,MAC9BA,KAAK0B,OACLzC,EAAE,sBAAwBa,GAAK,MAAM6B,SAErCxC,aAAayC,gBAAgB,CACzBC,QAAS7B,KAAK8B,SAAS,GAAGD,QAC1BhB,KAAM,aAGfkB,KAAK5C,aAAa6C,cAIzBhB,MAAME,UAAUC,GAAG7B,YAAY2C,QAAQ,WAEnCjB,MAAMkB,aAGHlB,YAEZS,MAAK,SAAST,OACbA,MAAMmB,UAEPJ,KAAK5C,aAAa6C,eAIgC,MASjD,kBACG,IAAIxC"} \ No newline at end of file +{"version":3,"file":"purposesactions.min.js","sources":["../src/purposesactions.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 * AMD module for purposes actions.\n *\n * @module tool_dataprivacy/purposesactions\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{DELETE: string}}\n */\n var ACTIONS = {\n DELETE: '[data-action=\"deletepurpose\"]',\n };\n\n /**\n * PurposesActions class.\n */\n var PurposesActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n PurposesActions.prototype.registerEvents = function() {\n $(ACTIONS.DELETE).click(function(e) {\n e.preventDefault();\n\n var id = $(this).data('id');\n var purposename = $(this).data('name');\n var stringkeys = [\n {\n key: 'deletepurpose',\n component: 'tool_dataprivacy'\n },\n {\n key: 'deletepurposetext',\n component: 'tool_dataprivacy',\n param: purposename\n },\n {\n key: 'delete'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langStrings) {\n var title = langStrings[0];\n var confirmMessage = langStrings[1];\n var buttonText = langStrings[2];\n return ModalFactory.create({\n title: title,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n }).then(function(modal) {\n modal.setSaveButtonText(buttonText);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n\n var request = {\n methodname: 'tool_dataprivacy_delete_purpose',\n args: {'id': id}\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n $('tr[data-purposeid=\"' + id + '\"]').remove();\n } else {\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n });\n }).done(function(modal) {\n modal.show();\n\n }).fail(Notification.exception);\n });\n };\n\n return /** @alias module:tool_dataprivacy/purposesactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the module.\n *\n * @method init\n * @return {PurposesActions}\n */\n 'init': function() {\n return new PurposesActions();\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","ACTIONS","PurposesActions","this","registerEvents","prototype","click","e","preventDefault","id","data","stringkeys","key","component","param","get_strings","then","langStrings","title","confirmMessage","buttonText","create","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","request","methodname","args","call","done","result","remove","addNotification","message","warnings","fail","exception","hidden","destroy","show","init"],"mappings":";;;;;;;AAsBAA,OAAM,mCAAC,CACH,SACA,YACA,oBACA,WACA,qBACA,sBACJ,SAASC,EAAGC,KAAMC,aAAcC,IAAKC,aAAcC,aAO/C,IAAIC,eACQ,gCAMRC,gBAAkB,WAClBC,KAAKC,gBACR,EAwE4D,OAnE7DF,gBAAgBG,UAAUD,eAAiB,WACvCT,EAAEM,gBAAgBK,OAAM,SAASC,GAC7BA,EAAEC,iBAEEC,IAAAA,GAAKd,EAAEQ,MAAMO,KAAK,MAElBC,WAAa,CACb,CACIC,IAAK,gBACLC,UAAW,oBAEf,CACID,IAAK,oBACLC,UAAW,mBACXC,MATUnB,EAAEQ,MAAMO,KAAK,SAW3B,CACIE,IAAK,WAIbd,IAAIiB,YAAYJ,YAAYK,MAAK,SAASC,aACtC,IAAIC,MAAQD,YAAY,GACpBE,eAAiBF,YAAY,GAC7BG,WAAaH,YAAY,GACtBlB,OAAAA,aAAasB,OAAO,CACvBH,MAAOA,MACPI,KAAMH,eACNI,KAAMxB,aAAayB,MAAMC,cAC1BT,MAAK,SAASU,OA6Bb,OA5BAA,MAAMC,kBAAkBP,YAGxBM,MAAME,UAAUC,GAAG7B,YAAY8B,MAAM,WAEjC,IAAIC,QAAU,CACVC,WAAY,kCACZC,KAAM,CAAOxB,GAAAA,KAGjBb,KAAKsC,KAAK,CAACH,UAAU,GAAGI,MAAK,SAASzB,MAC9BA,KAAK0B,OACLzC,EAAE,sBAAwBc,GAAK,MAAM4B,SAErCxC,aAAayC,gBAAgB,CACzBC,QAAS7B,KAAK8B,SAAS,GAAGD,QAC1BhB,KAAM,SANlB,IASGkB,KAAK5C,aAAa6C,UACxB,IAGDhB,MAAME,UAAUC,GAAG7B,YAAY2C,QAAQ,WAEnCjB,MAAMkB,SACT,IAEMlB,KACV,GACJ,IAAES,MAAK,SAAST,OACbA,MAAMmB,MAxCV,IA0CGJ,KAAK5C,aAAa6C,UACxB,GACJ,EAE4D,CASzDI,KAAQ,WACG,OAAA,IAAI5C,eACd,EAER"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/request_filter.min.js.map b/admin/tool/dataprivacy/amd/build/request_filter.min.js.map index 2bc86c5ab28..9970d50d480 100644 --- a/admin/tool/dataprivacy/amd/build/request_filter.min.js.map +++ b/admin/tool/dataprivacy/amd/build/request_filter.min.js.map @@ -1 +1 @@ -{"version":3,"file":"request_filter.min.js","sources":["../src/request_filter.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 * JS module for the data requests filter.\n *\n * @module tool_dataprivacy/request_filter\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/form-autocomplete', 'core/str', 'core/notification'], function($, Autocomplete, Str, Notification) {\n\n /**\n * Selectors.\n *\n * @access private\n * @type {{REQUEST_FILTERS: string}}\n */\n var SELECTORS = {\n REQUEST_FILTERS: '#request-filters'\n };\n\n /**\n * Init function.\n *\n * @method init\n * @private\n */\n var init = function() {\n var stringkeys = [\n {\n key: 'filter',\n component: 'moodle'\n },\n {\n key: 'nofiltersapplied',\n component: 'moodle'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langstrings) {\n var placeholder = langstrings[0];\n var noSelectionString = langstrings[1];\n return Autocomplete.enhance(SELECTORS.REQUEST_FILTERS, false, '', placeholder, false, true, noSelectionString, true);\n }).fail(Notification.exception);\n\n var last = $(SELECTORS.REQUEST_FILTERS).val();\n $(SELECTORS.REQUEST_FILTERS).on('change', function() {\n var current = $(this).val();\n // Prevent form from submitting unnecessarily, eg. on blur when no filter is selected.\n if (last.join(',') !== current.join(',')) {\n // If we're submitting without filters, set the hidden input 'filters-cleared' to 1.\n if (current.length === 0) {\n $('#filters-cleared').val(1);\n }\n $(this.form).submit();\n }\n });\n };\n\n return /** @alias module:core/form-autocomplete */ {\n /**\n * Initialise the unified user filter.\n *\n * @method init\n */\n init: function() {\n init();\n }\n };\n});\n"],"names":["define","$","Autocomplete","Str","Notification","SELECTORS","init","get_strings","key","component","then","langstrings","placeholder","noSelectionString","enhance","fail","exception","last","val","on","current","this","join","length","form","submit"],"mappings":";;;;;;;AAsBAA,yCAAO,CAAC,SAAU,yBAA0B,WAAY,sBAAsB,SAASC,EAAGC,aAAcC,IAAKC,kBAQrGC,0BACiB,yBAyC8B,CAM/CC,KAAM,YAtCC,WAYPH,IAAII,YAXa,CACb,CACIC,IAAK,SACLC,UAAW,UAEf,CACID,IAAK,mBACLC,UAAW,YAISC,MAAK,SAASC,iBAClCC,YAAcD,YAAY,GAC1BE,kBAAoBF,YAAY,UAC7BT,aAAaY,QAAQT,2BAA2B,EAAO,GAAIO,aAAa,GAAO,EAAMC,mBAAmB,MAChHE,KAAKX,aAAaY,eAEjBC,KAAOhB,EAAEI,2BAA2Ba,MACxCjB,EAAEI,2BAA2Bc,GAAG,UAAU,eAClCC,QAAUnB,EAAEoB,MAAMH,MAElBD,KAAKK,KAAK,OAASF,QAAQE,KAAK,OAET,IAAnBF,QAAQG,QACRtB,EAAE,oBAAoBiB,IAAI,GAE9BjB,EAAEoB,KAAKG,MAAMC,aAYjBnB"} \ No newline at end of file +{"version":3,"file":"request_filter.min.js","sources":["../src/request_filter.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 * JS module for the data requests filter.\n *\n * @module tool_dataprivacy/request_filter\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/form-autocomplete', 'core/str', 'core/notification'], function($, Autocomplete, Str, Notification) {\n\n /**\n * Selectors.\n *\n * @access private\n * @type {{REQUEST_FILTERS: string}}\n */\n var SELECTORS = {\n REQUEST_FILTERS: '#request-filters'\n };\n\n /**\n * Init function.\n *\n * @method init\n * @private\n */\n var init = function() {\n var stringkeys = [\n {\n key: 'filter',\n component: 'moodle'\n },\n {\n key: 'nofiltersapplied',\n component: 'moodle'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langstrings) {\n var placeholder = langstrings[0];\n var noSelectionString = langstrings[1];\n return Autocomplete.enhance(SELECTORS.REQUEST_FILTERS, false, '', placeholder, false, true, noSelectionString, true);\n }).fail(Notification.exception);\n\n var last = $(SELECTORS.REQUEST_FILTERS).val();\n $(SELECTORS.REQUEST_FILTERS).on('change', function() {\n var current = $(this).val();\n // Prevent form from submitting unnecessarily, eg. on blur when no filter is selected.\n if (last.join(',') !== current.join(',')) {\n // If we're submitting without filters, set the hidden input 'filters-cleared' to 1.\n if (current.length === 0) {\n $('#filters-cleared').val(1);\n }\n $(this.form).submit();\n }\n });\n };\n\n return /** @alias module:core/form-autocomplete */ {\n /**\n * Initialise the unified user filter.\n *\n * @method init\n */\n init: function() {\n init();\n }\n };\n});\n"],"names":["define","$","Autocomplete","Str","Notification","SELECTORS","init","get_strings","key","component","then","langstrings","placeholder","noSelectionString","enhance","fail","exception","last","val","on","current","this","join","length","form","submit"],"mappings":";;;;;;;AAsBAA,yCAAO,CAAC,SAAU,yBAA0B,WAAY,sBAAsB,SAASC,EAAGC,aAAcC,IAAKC,cAQzG,IAAIC,0BACiB,mBAyC8B,MAAA,CAM/CC,KAAM,YAtCC,WAYPH,IAAII,YAXa,CACb,CACIC,IAAK,SACLC,UAAW,UAEf,CACID,IAAK,mBACLC,UAAW,YAISC,MAAK,SAASC,aACtC,IAAIC,YAAcD,YAAY,GAC1BE,kBAAoBF,YAAY,GAC7BT,OAAAA,aAAaY,QAAQT,2BAA2B,EAAO,GAAIO,aAAa,GAAO,EAAMC,mBAAmB,EAHnH,IAIGE,KAAKX,aAAaY,WAEjBC,IAAAA,KAAOhB,EAAEI,2BAA2Ba,MACxCjB,EAAEI,2BAA2Bc,GAAG,UAAU,WAClCC,IAAAA,QAAUnB,EAAEoB,MAAMH,MAElBD,KAAKK,KAAK,OAASF,QAAQE,KAAK,OAET,IAAnBF,QAAQG,QACRtB,EAAE,oBAAoBiB,IAAI,GAE9BjB,EAAEoB,KAAKG,MAAMC,SAEpB,GACJ,CASOnB,EACH,EAER"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/requestactions.min.js.map b/admin/tool/dataprivacy/amd/build/requestactions.min.js.map index 4d822b3e809..b5d22838e12 100644 --- a/admin/tool/dataprivacy/amd/build/requestactions.min.js.map +++ b/admin/tool/dataprivacy/amd/build/requestactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"requestactions.min.js","sources":["../src/requestactions.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 * Request actions.\n *\n * @module tool_dataprivacy/requestactions\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/templates',\n 'tool_dataprivacy/data_request_modal',\n 'tool_dataprivacy/events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates, ModalDataRequest, DataPrivacyEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{APPROVE_REQUEST: string}}\n * @type {{DENY_REQUEST: string}}\n * @type {{VIEW_REQUEST: string}}\n * @type {{MARK_COMPLETE: string}}\n * @type {{CHANGE_BULK_ACTION: string}}\n * @type {{CONFIRM_BULK_ACTION: string}}\n * @type {{SELECT_ALL: string}}\n */\n var ACTIONS = {\n APPROVE_REQUEST: '[data-action=\"approve\"]',\n DENY_REQUEST: '[data-action=\"deny\"]',\n VIEW_REQUEST: '[data-action=\"view\"]',\n MARK_COMPLETE: '[data-action=\"complete\"]',\n CHANGE_BULK_ACTION: '[id=\"bulk-action\"]',\n CONFIRM_BULK_ACTION: '[id=\"confirm-bulk-action\"]',\n SELECT_ALL: '[data-action=\"selectall\"]'\n };\n\n /**\n * List of available bulk actions.\n *\n * @type {{APPROVE: number}}\n * @type {{DENY: number}}\n */\n var BULK_ACTIONS = {\n APPROVE: 1,\n DENY: 2\n };\n\n /**\n * List of selectors.\n *\n * @type {{SELECT_REQUEST: string}}\n */\n var SELECTORS = {\n SELECT_REQUEST: '.selectrequests'\n };\n\n /**\n * RequestActions class.\n */\n var RequestActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n RequestActions.prototype.registerEvents = function() {\n $(ACTIONS.VIEW_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n\n // Cancel the request.\n var params = {\n 'requestid': requestId\n };\n\n var request = {\n methodname: 'tool_dataprivacy_get_data_request',\n args: params\n };\n\n var promises = Ajax.call([request]);\n $.when(promises[0]).then(function(data) {\n if (data.result) {\n return data.result;\n }\n // Fail.\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n return false;\n\n }).then(function(data) {\n var body = Templates.render('tool_dataprivacy/request_details', data);\n var templateContext = {\n approvedeny: data.approvedeny,\n canmarkcomplete: data.canmarkcomplete\n };\n return ModalFactory.create({\n title: data.typename,\n body: body,\n type: ModalDataRequest.TYPE,\n large: true,\n templateContext: templateContext\n });\n\n }).then(function(modal) {\n // Handle approve event.\n modal.getRoot().on(DataPrivacyEvents.approve, function() {\n showConfirmation(DataPrivacyEvents.approve, approveEventWsData(requestId));\n });\n\n // Handle deny event.\n modal.getRoot().on(DataPrivacyEvents.deny, function() {\n showConfirmation(DataPrivacyEvents.deny, denyEventWsData(requestId));\n });\n\n // Handle send event.\n modal.getRoot().on(DataPrivacyEvents.complete, function() {\n var params = {\n 'requestid': requestId\n };\n handleSave('tool_dataprivacy_mark_complete', params);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Show the modal!\n modal.show();\n\n return;\n\n }).catch(Notification.exception);\n });\n\n $(ACTIONS.APPROVE_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n showConfirmation(DataPrivacyEvents.approve, approveEventWsData(requestId));\n });\n\n $(ACTIONS.DENY_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n showConfirmation(DataPrivacyEvents.deny, denyEventWsData(requestId));\n });\n\n $(ACTIONS.MARK_COMPLETE).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n showConfirmation(DataPrivacyEvents.complete, completeEventWsData(requestId));\n });\n\n $(ACTIONS.CONFIRM_BULK_ACTION).click(function() {\n var requestIds = [];\n var actionEvent = '';\n var wsdata = {};\n var bulkActionKeys = [\n {\n key: 'selectbulkaction',\n component: 'tool_dataprivacy'\n },\n {\n key: 'selectdatarequests',\n component: 'tool_dataprivacy'\n },\n {\n key: 'ok'\n }\n ];\n\n var bulkaction = parseInt($('#bulk-action').val());\n\n if (bulkaction != BULK_ACTIONS.APPROVE && bulkaction != BULK_ACTIONS.DENY) {\n Str.get_strings(bulkActionKeys).done(function(langStrings) {\n Notification.alert('', langStrings[0], langStrings[2]);\n }).fail(Notification.exception);\n\n return;\n }\n\n $(\".selectrequests:checked\").each(function() {\n requestIds.push($(this).val());\n });\n\n if (requestIds.length < 1) {\n Str.get_strings(bulkActionKeys).done(function(langStrings) {\n Notification.alert('', langStrings[1], langStrings[2]);\n }).fail(Notification.exception);\n\n return;\n }\n\n switch (bulkaction) {\n case BULK_ACTIONS.APPROVE:\n actionEvent = DataPrivacyEvents.bulkApprove;\n wsdata = bulkApproveEventWsData(requestIds);\n break;\n case BULK_ACTIONS.DENY:\n actionEvent = DataPrivacyEvents.bulkDeny;\n wsdata = bulkDenyEventWsData(requestIds);\n }\n\n showConfirmation(actionEvent, wsdata);\n });\n\n $(ACTIONS.SELECT_ALL).change(function(e) {\n e.preventDefault();\n\n var selectAll = $(this).is(':checked');\n $(SELECTORS.SELECT_REQUEST).prop('checked', selectAll);\n });\n };\n\n /**\n * Return the webservice data for the approve request action.\n *\n * @param {Number} requestId The ID of the request.\n * @return {Object}\n */\n function approveEventWsData(requestId) {\n return {\n 'wsfunction': 'tool_dataprivacy_approve_data_request',\n 'wsparams': {'requestid': requestId}\n };\n }\n\n /**\n * Return the webservice data for the bulk approve request action.\n *\n * @param {Array} requestIds The array of request ID's.\n * @return {Object}\n */\n function bulkApproveEventWsData(requestIds) {\n return {\n 'wsfunction': 'tool_dataprivacy_bulk_approve_data_requests',\n 'wsparams': {'requestids': requestIds}\n };\n }\n\n /**\n * Return the webservice data for the deny request action.\n *\n * @param {Number} requestId The ID of the request.\n * @return {Object}\n */\n function denyEventWsData(requestId) {\n return {\n 'wsfunction': 'tool_dataprivacy_deny_data_request',\n 'wsparams': {'requestid': requestId}\n };\n }\n\n /**\n * Return the webservice data for the bulk deny request action.\n *\n * @param {Array} requestIds The array of request ID's.\n * @return {Object}\n */\n function bulkDenyEventWsData(requestIds) {\n return {\n 'wsfunction': 'tool_dataprivacy_bulk_deny_data_requests',\n 'wsparams': {'requestids': requestIds}\n };\n }\n\n /**\n * Return the webservice data for the complete request action.\n *\n * @param {Number} requestId The ID of the request.\n * @return {Object}\n */\n function completeEventWsData(requestId) {\n return {\n 'wsfunction': 'tool_dataprivacy_mark_complete',\n 'wsparams': {'requestid': requestId}\n };\n }\n\n /**\n * Show the confirmation dialogue.\n *\n * @param {String} action The action name.\n * @param {Object} wsdata Object containing ws data.\n */\n function showConfirmation(action, wsdata) {\n var keys = [];\n\n switch (action) {\n case DataPrivacyEvents.approve:\n keys = [\n {\n key: 'approverequest',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmapproval',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.bulkApprove:\n keys = [\n {\n key: 'bulkapproverequests',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmbulkapproval',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.deny:\n keys = [\n {\n key: 'denyrequest',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmdenial',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.bulkDeny:\n keys = [\n {\n key: 'bulkdenyrequests',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmbulkdenial',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.complete:\n keys = [\n {\n key: 'markcomplete',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmcompletion',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n }\n\n var modalTitle = '';\n Str.get_strings(keys).then(function(langStrings) {\n modalTitle = langStrings[0];\n var confirmMessage = langStrings[1];\n return ModalFactory.create({\n title: modalTitle,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n });\n }).then(function(modal) {\n modal.setSaveButtonText(modalTitle);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n handleSave(wsdata.wsfunction, wsdata.wsparams);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return;\n\n }).catch(Notification.exception);\n }\n\n /**\n * Calls a web service function and reloads the page on success and shows a notification.\n * Displays an error notification, otherwise.\n *\n * @param {String} wsfunction The web service function to call.\n * @param {Object} params The parameters for the web service functoon.\n */\n function handleSave(wsfunction, params) {\n // Confirm the request.\n var request = {\n methodname: wsfunction,\n args: params\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n // On success, reload the page so that the data request table will be updated.\n // TODO: Probably in the future, better to reload the table or the target data request via AJAX.\n window.location.reload();\n } else {\n // Add the notification.\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n }\n\n return RequestActions;\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","Templates","ModalDataRequest","DataPrivacyEvents","ACTIONS","BULK_ACTIONS","SELECTORS","RequestActions","registerEvents","approveEventWsData","requestId","denyEventWsData","showConfirmation","action","wsdata","keys","approve","key","component","bulkApprove","deny","bulkDeny","complete","modalTitle","get_strings","then","langStrings","confirmMessage","create","title","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","handleSave","wsfunction","wsparams","hidden","destroy","show","catch","exception","params","request","methodname","args","call","done","data","result","window","location","reload","addNotification","message","warnings","fail","prototype","click","e","preventDefault","this","promises","when","render","templateContext","approvedeny","canmarkcomplete","typename","TYPE","large","completeEventWsData","requestIds","actionEvent","bulkActionKeys","bulkaction","parseInt","val","each","push","length","alert","bulkApproveEventWsData","bulkDenyEventWsData","change","selectAll","is","prop"],"mappings":";;;;;;;AAsBAA,yCAAO,CACH,SACA,YACA,oBACA,WACA,qBACA,oBACA,iBACA,sCACA,4BACJ,SAASC,EAAGC,KAAMC,aAAcC,IAAKC,aAAcC,YAAaC,UAAWC,iBAAkBC,uBAarFC,wBACiB,0BADjBA,qBAEc,uBAFdA,qBAGc,uBAHdA,sBAIe,2BAJfA,4BAMqB,6BANrBA,mBAOY,4BASZC,qBACS,EADTA,kBAEM,EAQNC,yBACgB,kBAMhBC,eAAiB,gBACZC,2BAyKAC,mBAAmBC,iBACjB,YACW,iDACF,WAAcA,qBAuBzBC,gBAAgBD,iBACd,YACW,8CACF,WAAcA,qBAoCzBE,iBAAiBC,OAAQC,YAC1BC,KAAO,UAEHF,aACCV,kBAAkBa,QACnBD,KAAO,CACH,CACIE,IAAK,iBACLC,UAAW,oBAEf,CACID,IAAK,kBACLC,UAAW,gCAIlBf,kBAAkBgB,YACnBJ,KAAO,CACH,CACIE,IAAK,sBACLC,UAAW,oBAEf,CACID,IAAK,sBACLC,UAAW,gCAIlBf,kBAAkBiB,KACnBL,KAAO,CACH,CACIE,IAAK,cACLC,UAAW,oBAEf,CACID,IAAK,gBACLC,UAAW,gCAIlBf,kBAAkBkB,SACnBN,KAAO,CACH,CACIE,IAAK,mBACLC,UAAW,oBAEf,CACID,IAAK,oBACLC,UAAW,gCAIlBf,kBAAkBmB,SACnBP,KAAO,CACH,CACIE,IAAK,eACLC,UAAW,oBAEf,CACID,IAAK,oBACLC,UAAW,yBAMvBK,WAAa,GACjBzB,IAAI0B,YAAYT,MAAMU,MAAK,SAASC,aAChCH,WAAaG,YAAY,OACrBC,eAAiBD,YAAY,UAC1B3B,aAAa6B,OAAO,CACvBC,MAAON,WACPO,KAAMH,eACNI,KAAMhC,aAAaiC,MAAMC,iBAE9BR,MAAK,SAASS,OACbA,MAAMC,kBAAkBZ,YAGxBW,MAAME,UAAUC,GAAGrC,YAAYsC,MAAM,WACjCC,WAAWzB,OAAO0B,WAAY1B,OAAO2B,aAIzCP,MAAME,UAAUC,GAAGrC,YAAY0C,QAAQ,WAEnCR,MAAMS,aAGVT,MAAMU,UAIPC,MAAMhD,aAAaiD,oBAUjBP,WAAWC,WAAYO,YAExBC,QAAU,CACVC,WAAYT,WACZU,KAAMH,QAGVnD,KAAKuD,KAAK,CAACH,UAAU,GAAGI,MAAK,SAASC,MAC9BA,KAAKC,OAGLC,OAAOC,SAASC,SAGhB5D,aAAa6D,gBAAgB,CACzBC,QAASN,KAAKO,SAAS,GAAGD,QAC1B5B,KAAM,aAGf8B,KAAKhE,aAAaiD,kBA9VzBvC,eAAeuD,UAAUtD,eAAiB,WACtCb,EAAES,sBAAsB2D,OAAM,SAASC,GACnCA,EAAEC,qBAEEvD,UAAYf,EAAEuE,MAAMb,KAAK,aAOzBL,QAAU,CACVC,WAAY,oCACZC,KANS,WACIxC,YAQbyD,SAAWvE,KAAKuD,KAAK,CAACH,UAC1BrD,EAAEyE,KAAKD,SAAS,IAAI1C,MAAK,SAAS4B,aAC1BA,KAAKC,OACED,KAAKC,QAGhBzD,aAAa6D,gBAAgB,CACzBC,QAASN,KAAKO,SAAS,GAAGD,QAC1B5B,KAAM,WAEH,MAERN,MAAK,SAAS4B,UACTvB,KAAO7B,UAAUoE,OAAO,mCAAoChB,MAC5DiB,gBAAkB,CAClBC,YAAalB,KAAKkB,YAClBC,gBAAiBnB,KAAKmB,wBAEnBzE,aAAa6B,OAAO,CACvBC,MAAOwB,KAAKoB,SACZ3C,KAAMA,KACNC,KAAM7B,iBAAiBwE,KACvBC,OAAO,EACPL,gBAAiBA,qBAGtB7C,MAAK,SAASS,OAEbA,MAAME,UAAUC,GAAGlC,kBAAkBa,SAAS,WAC1CJ,iBAAiBT,kBAAkBa,QAASP,mBAAmBC,eAInEwB,MAAME,UAAUC,GAAGlC,kBAAkBiB,MAAM,WACvCR,iBAAiBT,kBAAkBiB,KAAMT,gBAAgBD,eAI7DwB,MAAME,UAAUC,GAAGlC,kBAAkBmB,UAAU,WAI3CiB,WAAW,iCAHE,WACI7B,eAMrBwB,MAAME,UAAUC,GAAGrC,YAAY0C,QAAQ,WAEnCR,MAAMS,aAIVT,MAAMU,UAIPC,MAAMhD,aAAaiD,cAG1BnD,EAAES,yBAAyB2D,OAAM,SAASC,GACtCA,EAAEC,qBAEEvD,UAAYf,EAAEuE,MAAMb,KAAK,aAC7BzC,iBAAiBT,kBAAkBa,QAASP,mBAAmBC,eAGnEf,EAAES,sBAAsB2D,OAAM,SAASC,GACnCA,EAAEC,qBAEEvD,UAAYf,EAAEuE,MAAMb,KAAK,aAC7BzC,iBAAiBT,kBAAkBiB,KAAMT,gBAAgBD,eAG7Df,EAAES,uBAAuB2D,OAAM,SAASC,GACpCA,EAAEC,qBAEEvD,UAAYf,EAAEuE,MAAMb,KAAK,aAC7BzC,iBAAiBT,kBAAkBmB,kBA0HdZ,iBAClB,YACW,0CACF,WAAcA,YA7HmBkE,CAAoBlE,eAGrEf,EAAES,6BAA6B2D,OAAM,eAC7Bc,WAAa,GACbC,YAAc,GACdhE,OAAS,GACTiE,eAAiB,CACjB,CACI9D,IAAK,mBACLC,UAAW,oBAEf,CACID,IAAK,qBACLC,UAAW,oBAEf,CACID,IAAK,OAIT+D,WAAaC,SAAStF,EAAE,gBAAgBuF,UAExCF,YAAc3E,sBAAwB2E,YAAc3E,qBAQxDV,EAAE,2BAA2BwF,MAAK,WAC9BN,WAAWO,KAAKzF,EAAEuE,MAAMgB,UAGxBL,WAAWQ,OAAS,EACpBvF,IAAI0B,YAAYuD,gBAAgB3B,MAAK,SAAS1B,aAC1C7B,aAAayF,MAAM,GAAI5D,YAAY,GAAIA,YAAY,OACpDmC,KAAKhE,aAAaiD,uBAKjBkC,iBACC3E,qBACDyE,YAAc3E,kBAAkBgB,YAChCL,gBAqCgB+D,kBACrB,YACW,uDACF,YAAeA,aAxCVU,CAAuBV,uBAE/BxE,kBACDyE,YAAc3E,kBAAkBkB,SAChCP,gBA2Da+D,kBAClB,YACW,oDACF,YAAeA,aA9DVW,CAAoBX,YAGrCjE,iBAAiBkE,YAAahE,aA7B1BhB,IAAI0B,YAAYuD,gBAAgB3B,MAAK,SAAS1B,aAC1C7B,aAAayF,MAAM,GAAI5D,YAAY,GAAIA,YAAY,OACpDmC,KAAKhE,aAAaiD,cA8B7BnD,EAAES,oBAAoBqF,QAAO,SAASzB,GAClCA,EAAEC,qBAEEyB,UAAY/F,EAAEuE,MAAMyB,GAAG,YAC3BhG,EAAEW,0BAA0BsF,KAAK,UAAWF,eAwM7CnF"} \ No newline at end of file +{"version":3,"file":"requestactions.min.js","sources":["../src/requestactions.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 * Request actions.\n *\n * @module tool_dataprivacy/requestactions\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/templates',\n 'tool_dataprivacy/data_request_modal',\n 'tool_dataprivacy/events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates, ModalDataRequest, DataPrivacyEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{APPROVE_REQUEST: string}}\n * @type {{DENY_REQUEST: string}}\n * @type {{VIEW_REQUEST: string}}\n * @type {{MARK_COMPLETE: string}}\n * @type {{CHANGE_BULK_ACTION: string}}\n * @type {{CONFIRM_BULK_ACTION: string}}\n * @type {{SELECT_ALL: string}}\n */\n var ACTIONS = {\n APPROVE_REQUEST: '[data-action=\"approve\"]',\n DENY_REQUEST: '[data-action=\"deny\"]',\n VIEW_REQUEST: '[data-action=\"view\"]',\n MARK_COMPLETE: '[data-action=\"complete\"]',\n CHANGE_BULK_ACTION: '[id=\"bulk-action\"]',\n CONFIRM_BULK_ACTION: '[id=\"confirm-bulk-action\"]',\n SELECT_ALL: '[data-action=\"selectall\"]'\n };\n\n /**\n * List of available bulk actions.\n *\n * @type {{APPROVE: number}}\n * @type {{DENY: number}}\n */\n var BULK_ACTIONS = {\n APPROVE: 1,\n DENY: 2\n };\n\n /**\n * List of selectors.\n *\n * @type {{SELECT_REQUEST: string}}\n */\n var SELECTORS = {\n SELECT_REQUEST: '.selectrequests'\n };\n\n /**\n * RequestActions class.\n */\n var RequestActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n RequestActions.prototype.registerEvents = function() {\n $(ACTIONS.VIEW_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n\n // Cancel the request.\n var params = {\n 'requestid': requestId\n };\n\n var request = {\n methodname: 'tool_dataprivacy_get_data_request',\n args: params\n };\n\n var promises = Ajax.call([request]);\n $.when(promises[0]).then(function(data) {\n if (data.result) {\n return data.result;\n }\n // Fail.\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n return false;\n\n }).then(function(data) {\n var body = Templates.render('tool_dataprivacy/request_details', data);\n var templateContext = {\n approvedeny: data.approvedeny,\n canmarkcomplete: data.canmarkcomplete\n };\n return ModalFactory.create({\n title: data.typename,\n body: body,\n type: ModalDataRequest.TYPE,\n large: true,\n templateContext: templateContext\n });\n\n }).then(function(modal) {\n // Handle approve event.\n modal.getRoot().on(DataPrivacyEvents.approve, function() {\n showConfirmation(DataPrivacyEvents.approve, approveEventWsData(requestId));\n });\n\n // Handle deny event.\n modal.getRoot().on(DataPrivacyEvents.deny, function() {\n showConfirmation(DataPrivacyEvents.deny, denyEventWsData(requestId));\n });\n\n // Handle send event.\n modal.getRoot().on(DataPrivacyEvents.complete, function() {\n var params = {\n 'requestid': requestId\n };\n handleSave('tool_dataprivacy_mark_complete', params);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Show the modal!\n modal.show();\n\n return;\n\n }).catch(Notification.exception);\n });\n\n $(ACTIONS.APPROVE_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n showConfirmation(DataPrivacyEvents.approve, approveEventWsData(requestId));\n });\n\n $(ACTIONS.DENY_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n showConfirmation(DataPrivacyEvents.deny, denyEventWsData(requestId));\n });\n\n $(ACTIONS.MARK_COMPLETE).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n showConfirmation(DataPrivacyEvents.complete, completeEventWsData(requestId));\n });\n\n $(ACTIONS.CONFIRM_BULK_ACTION).click(function() {\n var requestIds = [];\n var actionEvent = '';\n var wsdata = {};\n var bulkActionKeys = [\n {\n key: 'selectbulkaction',\n component: 'tool_dataprivacy'\n },\n {\n key: 'selectdatarequests',\n component: 'tool_dataprivacy'\n },\n {\n key: 'ok'\n }\n ];\n\n var bulkaction = parseInt($('#bulk-action').val());\n\n if (bulkaction != BULK_ACTIONS.APPROVE && bulkaction != BULK_ACTIONS.DENY) {\n Str.get_strings(bulkActionKeys).done(function(langStrings) {\n Notification.alert('', langStrings[0], langStrings[2]);\n }).fail(Notification.exception);\n\n return;\n }\n\n $(\".selectrequests:checked\").each(function() {\n requestIds.push($(this).val());\n });\n\n if (requestIds.length < 1) {\n Str.get_strings(bulkActionKeys).done(function(langStrings) {\n Notification.alert('', langStrings[1], langStrings[2]);\n }).fail(Notification.exception);\n\n return;\n }\n\n switch (bulkaction) {\n case BULK_ACTIONS.APPROVE:\n actionEvent = DataPrivacyEvents.bulkApprove;\n wsdata = bulkApproveEventWsData(requestIds);\n break;\n case BULK_ACTIONS.DENY:\n actionEvent = DataPrivacyEvents.bulkDeny;\n wsdata = bulkDenyEventWsData(requestIds);\n }\n\n showConfirmation(actionEvent, wsdata);\n });\n\n $(ACTIONS.SELECT_ALL).change(function(e) {\n e.preventDefault();\n\n var selectAll = $(this).is(':checked');\n $(SELECTORS.SELECT_REQUEST).prop('checked', selectAll);\n });\n };\n\n /**\n * Return the webservice data for the approve request action.\n *\n * @param {Number} requestId The ID of the request.\n * @return {Object}\n */\n function approveEventWsData(requestId) {\n return {\n 'wsfunction': 'tool_dataprivacy_approve_data_request',\n 'wsparams': {'requestid': requestId}\n };\n }\n\n /**\n * Return the webservice data for the bulk approve request action.\n *\n * @param {Array} requestIds The array of request ID's.\n * @return {Object}\n */\n function bulkApproveEventWsData(requestIds) {\n return {\n 'wsfunction': 'tool_dataprivacy_bulk_approve_data_requests',\n 'wsparams': {'requestids': requestIds}\n };\n }\n\n /**\n * Return the webservice data for the deny request action.\n *\n * @param {Number} requestId The ID of the request.\n * @return {Object}\n */\n function denyEventWsData(requestId) {\n return {\n 'wsfunction': 'tool_dataprivacy_deny_data_request',\n 'wsparams': {'requestid': requestId}\n };\n }\n\n /**\n * Return the webservice data for the bulk deny request action.\n *\n * @param {Array} requestIds The array of request ID's.\n * @return {Object}\n */\n function bulkDenyEventWsData(requestIds) {\n return {\n 'wsfunction': 'tool_dataprivacy_bulk_deny_data_requests',\n 'wsparams': {'requestids': requestIds}\n };\n }\n\n /**\n * Return the webservice data for the complete request action.\n *\n * @param {Number} requestId The ID of the request.\n * @return {Object}\n */\n function completeEventWsData(requestId) {\n return {\n 'wsfunction': 'tool_dataprivacy_mark_complete',\n 'wsparams': {'requestid': requestId}\n };\n }\n\n /**\n * Show the confirmation dialogue.\n *\n * @param {String} action The action name.\n * @param {Object} wsdata Object containing ws data.\n */\n function showConfirmation(action, wsdata) {\n var keys = [];\n\n switch (action) {\n case DataPrivacyEvents.approve:\n keys = [\n {\n key: 'approverequest',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmapproval',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.bulkApprove:\n keys = [\n {\n key: 'bulkapproverequests',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmbulkapproval',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.deny:\n keys = [\n {\n key: 'denyrequest',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmdenial',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.bulkDeny:\n keys = [\n {\n key: 'bulkdenyrequests',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmbulkdenial',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.complete:\n keys = [\n {\n key: 'markcomplete',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmcompletion',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n }\n\n var modalTitle = '';\n Str.get_strings(keys).then(function(langStrings) {\n modalTitle = langStrings[0];\n var confirmMessage = langStrings[1];\n return ModalFactory.create({\n title: modalTitle,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n });\n }).then(function(modal) {\n modal.setSaveButtonText(modalTitle);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n handleSave(wsdata.wsfunction, wsdata.wsparams);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return;\n\n }).catch(Notification.exception);\n }\n\n /**\n * Calls a web service function and reloads the page on success and shows a notification.\n * Displays an error notification, otherwise.\n *\n * @param {String} wsfunction The web service function to call.\n * @param {Object} params The parameters for the web service functoon.\n */\n function handleSave(wsfunction, params) {\n // Confirm the request.\n var request = {\n methodname: wsfunction,\n args: params\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n // On success, reload the page so that the data request table will be updated.\n // TODO: Probably in the future, better to reload the table or the target data request via AJAX.\n window.location.reload();\n } else {\n // Add the notification.\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n }\n\n return RequestActions;\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","Templates","ModalDataRequest","DataPrivacyEvents","ACTIONS","BULK_ACTIONS","SELECTORS","RequestActions","this","registerEvents","approveEventWsData","requestId","wsfunction","wsparams","denyEventWsData","showConfirmation","action","wsdata","keys","approve","key","component","bulkApprove","deny","bulkDeny","complete","modalTitle","get_strings","then","langStrings","confirmMessage","create","title","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","handleSave","hidden","destroy","show","catch","exception","params","request","methodname","args","call","done","data","result","window","location","reload","addNotification","message","warnings","fail","prototype","click","e","preventDefault","promises","when","render","templateContext","approvedeny","canmarkcomplete","typename","TYPE","large","completeEventWsData","requestIds","actionEvent","bulkActionKeys","bulkaction","parseInt","val","each","push","length","alert","bulkApproveEventWsData","bulkDenyEventWsData","change","selectAll","is","prop"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/langimport/amd/build/search.min.js.map b/admin/tool/langimport/amd/build/search.min.js.map index b121f0f42f8..70402cc83d2 100644 --- a/admin/tool/langimport/amd/build/search.min.js.map +++ b/admin/tool/langimport/amd/build/search.min.js.map @@ -1 +1 @@ -{"version":3,"file":"search.min.js","sources":["../src/search.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 * Add search filtering of available language packs\n *\n * @module tool_langimport/search\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Pending from 'core/pending';\nimport {debounce} from 'core/utils';\n\nconst SELECTORS = {\n AVAILABLE_LANG_SELECT: 'select',\n AVAILABLE_LANG_SEARCH: '[data-action=\"search\"]',\n};\n\nconst DEBOUNCE_TIMER = 250;\n\n/**\n * Initialize module\n *\n * @param {Element} form\n */\nconst init = (form) => {\n const availableLangsElement = form.querySelector(SELECTORS.AVAILABLE_LANG_SELECT);\n\n const availableLangsFilter = (event) => {\n const pendingPromise = new Pending('tool_langimport/search:filter');\n\n // Remove existing options.\n availableLangsElement.querySelectorAll('option').forEach((option) => {\n option.remove();\n });\n\n // Filter for matching languages.\n const searchTerm = event.target.value.toLowerCase();\n const availableLanguages = JSON.parse(availableLangsElement.dataset.availableLanguages);\n const filteredLanguages = Object.keys(availableLanguages).reduce((matches, langcode) => {\n if (availableLanguages[langcode].toLowerCase().includes(searchTerm)) {\n matches[langcode] = availableLanguages[langcode];\n }\n return matches;\n }, []);\n\n // Re-create filtered options.\n Object.entries(filteredLanguages).forEach(([langcode, langname]) => {\n const option = document.createElement('option');\n option.value = langcode;\n option.innerText = langname;\n availableLangsElement.append(option);\n });\n\n pendingPromise.resolve();\n };\n\n // Cache initial available language options.\n const availableLanguages = {};\n availableLangsElement.querySelectorAll('option').forEach((option) => {\n availableLanguages[option.value] = option.text;\n });\n availableLangsElement.dataset.availableLanguages = JSON.stringify(availableLanguages);\n\n // Register event listeners on the search element.\n const availableLangsSearch = form.querySelector(SELECTORS.AVAILABLE_LANG_SEARCH);\n availableLangsSearch.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n }\n });\n\n // Debounce the event listener to allow the user to finish typing.\n availableLangsSearch.addEventListener('keyup', (event) => {\n const pendingPromise = new Pending('tool_langimport/search:keyup');\n\n debounce(availableLangsFilter, DEBOUNCE_TIMER)(event);\n setTimeout(() => {\n pendingPromise.resolve();\n }, DEBOUNCE_TIMER);\n });\n};\n\nexport default {\n init: init,\n};\n"],"names":["SELECTORS","init","form","availableLangsElement","querySelector","availableLangsFilter","event","pendingPromise","Pending","querySelectorAll","forEach","option","remove","searchTerm","target","value","toLowerCase","availableLanguages","JSON","parse","dataset","filteredLanguages","Object","keys","reduce","matches","langcode","includes","entries","langname","document","createElement","innerText","append","resolve","text","stringify","availableLangsSearch","addEventListener","key","preventDefault","setTimeout"],"mappings":"u3CA0BMA,gCACqB,SADrBA,gCAEqB,kCAoEZ,CACXC,KA3DS,SAACC,UACJC,sBAAwBD,KAAKE,cAAcJ,iCAE3CK,qBAAuB,SAACC,WACpBC,eAAiB,IAAIC,iBAAQ,iCAGnCL,sBAAsBM,iBAAiB,UAAUC,SAAQ,SAACC,QACtDA,OAAOC,gBAILC,WAAaP,MAAMQ,OAAOC,MAAMC,cAChCC,mBAAqBC,KAAKC,MAAMhB,sBAAsBiB,QAAQH,oBAC9DI,kBAAoBC,OAAOC,KAAKN,oBAAoBO,QAAO,SAACC,QAASC,iBACnET,mBAAmBS,UAAUV,cAAcW,SAASd,cACpDY,QAAQC,UAAYT,mBAAmBS,WAEpCD,UACR,IAGHH,OAAOM,QAAQP,mBAAmBX,SAAQ,gDAAEgB,kBAAUG,kBAC5ClB,OAASmB,SAASC,cAAc,UACtCpB,OAAOI,MAAQW,SACff,OAAOqB,UAAYH,SACnB1B,sBAAsB8B,OAAOtB,WAGjCJ,eAAe2B,WAIbjB,mBAAqB,GAC3Bd,sBAAsBM,iBAAiB,UAAUC,SAAQ,SAACC,QACtDM,mBAAmBN,OAAOI,OAASJ,OAAOwB,QAE9ChC,sBAAsBiB,QAAQH,mBAAqBC,KAAKkB,UAAUnB,wBAG5DoB,qBAAuBnC,KAAKE,cAAcJ,iCAChDqC,qBAAqBC,iBAAiB,WAAW,SAAChC,OAC5B,UAAdA,MAAMiC,KACNjC,MAAMkC,oBAKdH,qBAAqBC,iBAAiB,SAAS,SAAChC,WACtCC,eAAiB,IAAIC,iBAAQ,oDAE1BH,qBA1DM,KA0DgCC,OAC/CmC,YAAW,WACPlC,eAAe2B,YA5DJ"} \ No newline at end of file +{"version":3,"file":"search.min.js","sources":["../src/search.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 * Add search filtering of available language packs\n *\n * @module tool_langimport/search\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Pending from 'core/pending';\nimport {debounce} from 'core/utils';\n\nconst SELECTORS = {\n AVAILABLE_LANG_SELECT: 'select',\n AVAILABLE_LANG_SEARCH: '[data-action=\"search\"]',\n};\n\nconst DEBOUNCE_TIMER = 250;\n\n/**\n * Initialize module\n *\n * @param {Element} form\n */\nconst init = (form) => {\n const availableLangsElement = form.querySelector(SELECTORS.AVAILABLE_LANG_SELECT);\n\n const availableLangsFilter = (event) => {\n const pendingPromise = new Pending('tool_langimport/search:filter');\n\n // Remove existing options.\n availableLangsElement.querySelectorAll('option').forEach((option) => {\n option.remove();\n });\n\n // Filter for matching languages.\n const searchTerm = event.target.value.toLowerCase();\n const availableLanguages = JSON.parse(availableLangsElement.dataset.availableLanguages);\n const filteredLanguages = Object.keys(availableLanguages).reduce((matches, langcode) => {\n if (availableLanguages[langcode].toLowerCase().includes(searchTerm)) {\n matches[langcode] = availableLanguages[langcode];\n }\n return matches;\n }, []);\n\n // Re-create filtered options.\n Object.entries(filteredLanguages).forEach(([langcode, langname]) => {\n const option = document.createElement('option');\n option.value = langcode;\n option.innerText = langname;\n availableLangsElement.append(option);\n });\n\n pendingPromise.resolve();\n };\n\n // Cache initial available language options.\n const availableLanguages = {};\n availableLangsElement.querySelectorAll('option').forEach((option) => {\n availableLanguages[option.value] = option.text;\n });\n availableLangsElement.dataset.availableLanguages = JSON.stringify(availableLanguages);\n\n // Register event listeners on the search element.\n const availableLangsSearch = form.querySelector(SELECTORS.AVAILABLE_LANG_SEARCH);\n availableLangsSearch.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n }\n });\n\n // Debounce the event listener to allow the user to finish typing.\n availableLangsSearch.addEventListener('keyup', (event) => {\n const pendingPromise = new Pending('tool_langimport/search:keyup');\n\n debounce(availableLangsFilter, DEBOUNCE_TIMER)(event);\n setTimeout(() => {\n pendingPromise.resolve();\n }, DEBOUNCE_TIMER);\n });\n};\n\nexport default {\n init: init,\n};\n"],"names":["_pending","SELECTORS","_default","init","form","availableLangsElement","querySelector","availableLangsFilter","event","pendingPromise","Pending","default","querySelectorAll","forEach","option","remove","searchTerm","target","value","toLowerCase","availableLanguages","JSON","parse","dataset","filteredLanguages","Object","keys","reduce","matches","langcode","includes","entries","_ref","_ref2","_slicedToArray","langname","document","createElement","innerText","append","resolve","text","stringify","availableLangsSearch","addEventListener","key","preventDefault","_utils","debounce","setTimeout"],"mappings":"yzCAuBAA,cAAAA,4CAGA,IAAMC,gCACqB,SADrBA,gCAEqB,yBAoEZC,SAAA,CACXC,KA3DS,SAACC,MACJC,IAAAA,sBAAwBD,KAAKE,cAAcL,iCAE3CM,qBAAuB,SAACC,OAC1B,IAAMC,eAAiB,IAAIC,SAAJC,QAAY,iCAGnCN,sBAAsBO,iBAAiB,UAAUC,SAAQ,SAACC,QACtDA,OAAOC,QACV,IAGKC,IAAAA,WAAaR,MAAMS,OAAOC,MAAMC,cAChCC,mBAAqBC,KAAKC,MAAMjB,sBAAsBkB,QAAQH,oBAC9DI,kBAAoBC,OAAOC,KAAKN,oBAAoBO,QAAO,SAACC,QAASC,UAIvE,OAHIT,mBAAmBS,UAAUV,cAAcW,SAASd,cACpDY,QAAQC,UAAYT,mBAAmBS,WAEpCD,OAJe,GAKvB,IAGHH,OAAOM,QAAQP,mBAAmBX,SAAQ,SAA0BmB,MAAA,IAAAC,MAAAC,eAAAF,KAAA,GAAxBH,SAAwBI,MAAA,GAAdE,SAAcF,MAAA,GAC1DnB,OAASsB,SAASC,cAAc,UACtCvB,OAAOI,MAAQW,SACff,OAAOwB,UAAYH,SACnB9B,sBAAsBkC,OAAOzB,OAChC,IAEDL,eAAe+B,SAClB,EAGKpB,mBAAqB,CAAA,EAC3Bf,sBAAsBO,iBAAiB,UAAUC,SAAQ,SAACC,QACtDM,mBAAmBN,OAAOI,OAASJ,OAAO2B,IAC7C,IACDpC,sBAAsBkB,QAAQH,mBAAqBC,KAAKqB,UAAUtB,oBAG5DuB,IAAAA,qBAAuBvC,KAAKE,cAAcL,iCAChD0C,qBAAqBC,iBAAiB,WAAW,SAACpC,OAC5B,UAAdA,MAAMqC,KACNrC,MAAMsC,gBAEb,IAGDH,qBAAqBC,iBAAiB,SAAS,SAACpC,OAC5C,IAAMC,eAAiB,IAAIC,SAAJC,QAAY,iCAEnC,EAAAoC,OAAAC,UAASzC,qBA1DM,IA0Df,CAA+CC,OAC/CyC,YAAW,WACPxC,eAAe+B,SADT,GA3DK,IA8DlB,GACJ"} \ No newline at end of file diff --git a/admin/tool/licensemanager/amd/build/delete_license.min.js.map b/admin/tool/licensemanager/amd/build/delete_license.min.js.map index 71785b2bf5c..3f4cb8c066b 100644 --- a/admin/tool/licensemanager/amd/build/delete_license.min.js.map +++ b/admin/tool/licensemanager/amd/build/delete_license.min.js.map @@ -1 +1 @@ -{"version":3,"file":"delete_license.min.js","sources":["../src/delete_license.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 * Modal for confirming deletion of a custom license.\n *\n * @module tool_licensemanager/delete_license\n * @copyright 2019 Tom Dickman \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/modal_factory', 'core/modal_events', 'core/url', 'core/str'],\n function($, ModalFactory, ModalEvents, Url, String) {\n\n var trigger = $('.delete-license');\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: String.get_string('deletelicense', 'tool_licensemanager'),\n body: String.get_string('deletelicenseconfirmmessage', 'tool_licensemanager'),\n preShowCallback: function(triggerElement, modal) {\n triggerElement = $(triggerElement);\n let params = {\n 'action': 'delete',\n 'license': triggerElement.data('license')\n };\n modal.deleteURL = Url.relativeUrl('/admin/tool/licensemanager/index.php', params, true);\n },\n large: true,\n }, trigger)\n .done(function(modal) {\n modal.getRoot().on(ModalEvents.save, function(e) {\n // Stop the default save button behaviour which is to close the modal.\n e.preventDefault();\n // Redirect to delete url.\n window.location.href = modal.deleteURL;\n });\n });\n });\n"],"names":["define","$","ModalFactory","ModalEvents","Url","String","trigger","create","type","types","SAVE_CANCEL","title","get_string","body","preShowCallback","triggerElement","modal","params","data","deleteURL","relativeUrl","large","done","getRoot","on","save","e","preventDefault","window","location","href"],"mappings":";;;;;;;AAsBAA,4CAAO,CAAC,SAAU,qBAAsB,oBAAqB,WAAY,aACrE,SAASC,EAAGC,aAAcC,YAAaC,IAAKC,YAEpCC,QAAUL,EAAE,mBAChBC,aAAaK,OAAO,CAChBC,KAAMN,aAAaO,MAAMC,YACzBC,MAAON,OAAOO,WAAW,gBAAiB,uBAC1CC,KAAMR,OAAOO,WAAW,8BAA+B,uBACvDE,gBAAiB,SAASC,eAAgBC,WAElCC,OAAS,QACC,kBAFdF,eAAiBd,EAAEc,iBAGWG,KAAK,YAEnCF,MAAMG,UAAYf,IAAIgB,YAAY,uCAAwCH,QAAQ,IAEtFI,OAAO,GACRf,SACEgB,MAAK,SAASN,OACXA,MAAMO,UAAUC,GAAGrB,YAAYsB,MAAM,SAASC,GAE1CA,EAAEC,iBAEFC,OAAOC,SAASC,KAAOd,MAAMG"} \ No newline at end of file +{"version":3,"file":"delete_license.min.js","sources":["../src/delete_license.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 * Modal for confirming deletion of a custom license.\n *\n * @module tool_licensemanager/delete_license\n * @copyright 2019 Tom Dickman \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/modal_factory', 'core/modal_events', 'core/url', 'core/str'],\n function($, ModalFactory, ModalEvents, Url, String) {\n\n var trigger = $('.delete-license');\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: String.get_string('deletelicense', 'tool_licensemanager'),\n body: String.get_string('deletelicenseconfirmmessage', 'tool_licensemanager'),\n preShowCallback: function(triggerElement, modal) {\n triggerElement = $(triggerElement);\n let params = {\n 'action': 'delete',\n 'license': triggerElement.data('license')\n };\n modal.deleteURL = Url.relativeUrl('/admin/tool/licensemanager/index.php', params, true);\n },\n large: true,\n }, trigger)\n .done(function(modal) {\n modal.getRoot().on(ModalEvents.save, function(e) {\n // Stop the default save button behaviour which is to close the modal.\n e.preventDefault();\n // Redirect to delete url.\n window.location.href = modal.deleteURL;\n });\n });\n });\n"],"names":["define","$","ModalFactory","ModalEvents","Url","String","trigger","create","type","types","SAVE_CANCEL","title","get_string","body","preShowCallback","triggerElement","modal","params","action","license","data","deleteURL","relativeUrl","large","done","getRoot","on","save","e","preventDefault","window","location","href"],"mappings":";;;;;;;AAsBAA,OAAM,qCAAC,CAAC,SAAU,qBAAsB,oBAAqB,WAAY,aACrE,SAASC,EAAGC,aAAcC,YAAaC,IAAKC,QAExC,IAAIC,QAAUL,EAAE,mBAChBC,aAAaK,OAAO,CAChBC,KAAMN,aAAaO,MAAMC,YACzBC,MAAON,OAAOO,WAAW,gBAAiB,uBAC1CC,KAAMR,OAAOO,WAAW,8BAA+B,uBACvDE,gBAAiB,SAASC,eAAgBC,OAEtC,IAAIC,OAAS,CACTC,OAAU,SACVC,SAHJJ,eAAiBd,EAAEc,iBAGWK,KAAK,YAEnCJ,MAAMK,UAAYjB,IAAIkB,YAAY,uCAAwCL,QAAQ,EAVtE,EAYhBM,OAAO,GACRjB,SACEkB,MAAK,SAASR,OACXA,MAAMS,UAAUC,GAAGvB,YAAYwB,MAAM,SAASC,GAE1CA,EAAEC,iBAEFC,OAAOC,SAASC,KAAOhB,MAAMK,SAChC,GACJ,GACR"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/actionselector.min.js.map b/admin/tool/lp/amd/build/actionselector.min.js.map index 1061e04a7e2..eceaf0d174f 100644 --- a/admin/tool/lp/amd/build/actionselector.min.js.map +++ b/admin/tool/lp/amd/build/actionselector.min.js.map @@ -1 +1 @@ -{"version":3,"file":"actionselector.min.js","sources":["../src/actionselector.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 * Action selector.\n *\n * To handle 'save' events use: actionselector.on('save')\n * This will receive the information to display in popup.\n * The actions have the format [{'text': sometext, 'value' : somevalue}].\n *\n * @module tool_lp/actionselector\n * @copyright 2016 Serge Gauthier - \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'tool_lp/dialogue',\n 'tool_lp/event_base'],\n function($, Notification, Ajax, Templates, Dialogue, EventBase) {\n\n /**\n * Action selector class.\n *\n * @class tool_lp/actionselector\n * @param {String} title The title of popup.\n * @param {String} message The message to display.\n * @param {object} actions The actions that can be selected.\n * @param {String} confirm Text for confirm button.\n * @param {String} cancel Text for cancel button.\n */\n var ActionSelector = function(title, message, actions, confirm, cancel) {\n var self = this;\n\n EventBase.prototype.constructor.apply(this, []);\n self._title = title;\n self._message = message;\n self._actions = actions;\n self._confirm = confirm;\n self._cancel = cancel;\n self._selectedValue = null;\n self._reset();\n };\n\n ActionSelector.prototype = Object.create(EventBase.prototype);\n\n /** @property {String} The value that was selected. */\n ActionSelector.prototype._selectedValue = null;\n /** @property {Dialogue} The reference to the dialogue. */\n ActionSelector.prototype._popup = null;\n /** @property {String} The title of popup. */\n ActionSelector.prototype._title = null;\n /** @property {String} The message in popup. */\n ActionSelector.prototype._message = null;\n /** @property {object} The information for radion buttons. */\n ActionSelector.prototype._actions = null;\n /** @property {String} The text for confirm button. */\n ActionSelector.prototype._confirm = null;\n /** @property {String} The text for cancel button. */\n ActionSelector.prototype._cancel = null;\n\n /**\n * Hook to executed after the view is rendered.\n *\n * @method _afterRender\n */\n ActionSelector.prototype._afterRender = function() {\n var self = this;\n\n // Confirm button is disabled until a choice is done.\n self._find('[data-action=\"action-selector-confirm\"]').attr('disabled', 'disabled');\n\n // Add listener for radio buttons change.\n self._find('[data-region=\"action-selector-radio-buttons\"]').change(function() {\n self._selectedValue = $(\"input[type='radio']:checked\").val();\n self._find('[data-action=\"action-selector-confirm\"]').removeAttr('disabled');\n self._refresh.bind(self);\n });\n\n // Add listener for cancel.\n self._find('[data-action=\"action-selector-cancel\"]').click(function(e) {\n e.preventDefault();\n self.close();\n });\n\n // Add listener for confirm.\n self._find('[data-action=\"action-selector-confirm\"]').click(function(e) {\n e.preventDefault();\n if (!self._selectedValue.length) {\n return;\n }\n self._trigger('save', {action: self._selectedValue});\n self.close();\n });\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n ActionSelector.prototype.close = function() {\n var self = this;\n self._popup.close();\n self._reset();\n };\n\n /**\n * Opens the action selector.\n *\n * @method display\n * @return {Promise}\n */\n ActionSelector.prototype.display = function() {\n var self = this;\n return self._render().then(function(html) {\n self._popup = new Dialogue(\n self._title,\n html,\n self._afterRender.bind(self)\n );\n return;\n }).fail(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @return {JQuery} The node\n * @method _find\n */\n ActionSelector.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Refresh the view.\n *\n * @method _refresh\n * @return {Promise}\n */\n ActionSelector.prototype._refresh = function() {\n var self = this;\n return self._render().then(function(html) {\n self._find('[data-region=\"action-selector\"]').replaceWith(html);\n self._afterRender();\n return;\n });\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @return {Promise}\n */\n ActionSelector.prototype._render = function() {\n var self = this;\n var choices = [];\n for (var i in self._actions) {\n choices.push(self._actions[i]);\n }\n var content = {'message': self._message, 'choices': choices,\n 'confirm': self._confirm, 'cancel': self._cancel};\n\n return Templates.render('tool_lp/action_selector', content);\n };\n\n /**\n * Reset the dialogue properties.\n *\n * This does not reset everything, just enough to reset the UI.\n *\n * @method _reset\n */\n ActionSelector.prototype._reset = function() {\n this._popup = null;\n this._selectedValue = '';\n };\n\n return ActionSelector;\n\n});\n"],"names":["define","$","Notification","Ajax","Templates","Dialogue","EventBase","ActionSelector","title","message","actions","confirm","cancel","prototype","constructor","apply","this","_title","_message","_actions","_confirm","_cancel","_selectedValue","_reset","Object","create","_popup","_afterRender","self","_find","attr","change","val","removeAttr","_refresh","bind","click","e","preventDefault","close","length","_trigger","action","display","_render","then","html","fail","exception","selector","getContent","find","replaceWith","choices","i","push","content","render"],"mappings":";;;;;;;;;;;AA2BAA,gCAAO,CAAC,SACA,oBACA,YACA,iBACA,mBACA,uBACA,SAASC,EAAGC,aAAcC,KAAMC,UAAWC,SAAUC,eAYrDC,eAAiB,SAASC,MAAOC,QAASC,QAASC,QAASC,QAG5DN,UAAUO,UAAUC,YAAYC,MAAMC,KAAM,IAFjCA,KAGNC,OAAST,MAHHQ,KAINE,SAAWT,QAJLO,KAKNG,SAAWT,QALLM,KAMNI,SAAWT,QANLK,KAONK,QAAUT,OAPJI,KAQNM,eAAiB,KARXN,KASNO,iBAGThB,eAAeM,UAAYW,OAAOC,OAAOnB,UAAUO,YAG1BS,eAAiB,KAE1Cf,eAAeM,UAAUa,OAAS,KAElCnB,eAAeM,UAAUI,OAAS,KAElCV,eAAeM,UAAUK,SAAW,KAEpCX,eAAeM,UAAUM,SAAW,KAEpCZ,eAAeM,UAAUO,SAAW,KAEpCb,eAAeM,UAAUQ,QAAU,KAOnCd,eAAeM,UAAUc,aAAe,eAChCC,KAAOZ,KAGXY,KAAKC,MAAM,2CAA2CC,KAAK,WAAY,YAGvEF,KAAKC,MAAM,iDAAiDE,QAAO,WAC/DH,KAAKN,eAAiBrB,EAAE,+BAA+B+B,MACvDJ,KAAKC,MAAM,2CAA2CI,WAAW,YACjEL,KAAKM,SAASC,KAAKP,SAIvBA,KAAKC,MAAM,0CAA0CO,OAAM,SAASC,GAChEA,EAAEC,iBACFV,KAAKW,WAITX,KAAKC,MAAM,2CAA2CO,OAAM,SAASC,GACjEA,EAAEC,iBACGV,KAAKN,eAAekB,SAGzBZ,KAAKa,SAAS,OAAQ,CAACC,OAAQd,KAAKN,iBACpCM,KAAKW,aASbhC,eAAeM,UAAU0B,MAAQ,WAClBvB,KACNU,OAAOa,QADDvB,KAENO,UASThB,eAAeM,UAAU8B,QAAU,eAC3Bf,KAAOZ,YACJY,KAAKgB,UAAUC,MAAK,SAASC,MAChClB,KAAKF,OAAS,IAAIrB,SACduB,KAAKX,OACL6B,KACAlB,KAAKD,aAAaQ,KAAKP,UAG5BmB,KAAK7C,aAAa8C,YAUzBzC,eAAeM,UAAUgB,MAAQ,SAASoB,iBAC/BhD,EAAEe,KAAKU,OAAOwB,cAAcC,KAAKF,WAS5C1C,eAAeM,UAAUqB,SAAW,eAC5BN,KAAOZ,YACJY,KAAKgB,UAAUC,MAAK,SAASC,MAChClB,KAAKC,MAAM,mCAAmCuB,YAAYN,MAC1DlB,KAAKD,mBAWbpB,eAAeM,UAAU+B,QAAU,eAE3BS,QAAU,OACT,IAAIC,KAFEtC,KAEQG,SACfkC,QAAQE,KAHDvC,KAGWG,SAASmC,QAE3BE,QAAU,SALHxC,KAKoBE,iBAAqBmC,gBALzCrC,KAMSI,gBANTJ,KAMkCK,gBAEtCjB,UAAUqD,OAAO,0BAA2BD,UAUvDjD,eAAeM,UAAUU,OAAS,gBACzBG,OAAS,UACTJ,eAAiB,IAGnBf"} \ No newline at end of file +{"version":3,"file":"actionselector.min.js","sources":["../src/actionselector.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 * Action selector.\n *\n * To handle 'save' events use: actionselector.on('save')\n * This will receive the information to display in popup.\n * The actions have the format [{'text': sometext, 'value' : somevalue}].\n *\n * @module tool_lp/actionselector\n * @copyright 2016 Serge Gauthier - \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'tool_lp/dialogue',\n 'tool_lp/event_base'],\n function($, Notification, Ajax, Templates, Dialogue, EventBase) {\n\n /**\n * Action selector class.\n *\n * @class tool_lp/actionselector\n * @param {String} title The title of popup.\n * @param {String} message The message to display.\n * @param {object} actions The actions that can be selected.\n * @param {String} confirm Text for confirm button.\n * @param {String} cancel Text for cancel button.\n */\n var ActionSelector = function(title, message, actions, confirm, cancel) {\n var self = this;\n\n EventBase.prototype.constructor.apply(this, []);\n self._title = title;\n self._message = message;\n self._actions = actions;\n self._confirm = confirm;\n self._cancel = cancel;\n self._selectedValue = null;\n self._reset();\n };\n\n ActionSelector.prototype = Object.create(EventBase.prototype);\n\n /** @property {String} The value that was selected. */\n ActionSelector.prototype._selectedValue = null;\n /** @property {Dialogue} The reference to the dialogue. */\n ActionSelector.prototype._popup = null;\n /** @property {String} The title of popup. */\n ActionSelector.prototype._title = null;\n /** @property {String} The message in popup. */\n ActionSelector.prototype._message = null;\n /** @property {object} The information for radion buttons. */\n ActionSelector.prototype._actions = null;\n /** @property {String} The text for confirm button. */\n ActionSelector.prototype._confirm = null;\n /** @property {String} The text for cancel button. */\n ActionSelector.prototype._cancel = null;\n\n /**\n * Hook to executed after the view is rendered.\n *\n * @method _afterRender\n */\n ActionSelector.prototype._afterRender = function() {\n var self = this;\n\n // Confirm button is disabled until a choice is done.\n self._find('[data-action=\"action-selector-confirm\"]').attr('disabled', 'disabled');\n\n // Add listener for radio buttons change.\n self._find('[data-region=\"action-selector-radio-buttons\"]').change(function() {\n self._selectedValue = $(\"input[type='radio']:checked\").val();\n self._find('[data-action=\"action-selector-confirm\"]').removeAttr('disabled');\n self._refresh.bind(self);\n });\n\n // Add listener for cancel.\n self._find('[data-action=\"action-selector-cancel\"]').click(function(e) {\n e.preventDefault();\n self.close();\n });\n\n // Add listener for confirm.\n self._find('[data-action=\"action-selector-confirm\"]').click(function(e) {\n e.preventDefault();\n if (!self._selectedValue.length) {\n return;\n }\n self._trigger('save', {action: self._selectedValue});\n self.close();\n });\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n ActionSelector.prototype.close = function() {\n var self = this;\n self._popup.close();\n self._reset();\n };\n\n /**\n * Opens the action selector.\n *\n * @method display\n * @return {Promise}\n */\n ActionSelector.prototype.display = function() {\n var self = this;\n return self._render().then(function(html) {\n self._popup = new Dialogue(\n self._title,\n html,\n self._afterRender.bind(self)\n );\n return;\n }).fail(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @return {JQuery} The node\n * @method _find\n */\n ActionSelector.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Refresh the view.\n *\n * @method _refresh\n * @return {Promise}\n */\n ActionSelector.prototype._refresh = function() {\n var self = this;\n return self._render().then(function(html) {\n self._find('[data-region=\"action-selector\"]').replaceWith(html);\n self._afterRender();\n return;\n });\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @return {Promise}\n */\n ActionSelector.prototype._render = function() {\n var self = this;\n var choices = [];\n for (var i in self._actions) {\n choices.push(self._actions[i]);\n }\n var content = {'message': self._message, 'choices': choices,\n 'confirm': self._confirm, 'cancel': self._cancel};\n\n return Templates.render('tool_lp/action_selector', content);\n };\n\n /**\n * Reset the dialogue properties.\n *\n * This does not reset everything, just enough to reset the UI.\n *\n * @method _reset\n */\n ActionSelector.prototype._reset = function() {\n this._popup = null;\n this._selectedValue = '';\n };\n\n return ActionSelector;\n\n});\n"],"names":["define","$","Notification","Ajax","Templates","Dialogue","EventBase","ActionSelector","title","message","actions","confirm","cancel","prototype","constructor","apply","this","_title","_message","_actions","_confirm","_cancel","_selectedValue","_reset","Object","create","_popup","_afterRender","self","_find","attr","change","val","removeAttr","_refresh","bind","click","e","preventDefault","close","length","_trigger","action","display","_render","then","html","fail","exception","selector","getContent","find","replaceWith","choices","i","push","content","render"],"mappings":";;;;;;;;;;;AA2BAA,OAAM,yBAAC,CAAC,SACA,oBACA,YACA,iBACA,mBACA,uBACA,SAASC,EAAGC,aAAcC,KAAMC,UAAWC,SAAUC,WAYzD,IAAIC,eAAiB,SAASC,MAAOC,QAASC,QAASC,QAASC,QAG5DN,UAAUO,UAAUC,YAAYC,MAAMC,KAAM,IAFjCA,KAGNC,OAAST,MAHHQ,KAINE,SAAWT,QAJLO,KAKNG,SAAWT,QALLM,KAMNI,SAAWT,QANLK,KAONK,QAAUT,OAPJI,KAQNM,eAAiB,KARXN,KASNO,QACR,EA2ID,OAzIAhB,eAAeM,UAAYW,OAAOC,OAAOnB,UAAUO,YAG1BS,eAAiB,KAE1Cf,eAAeM,UAAUa,OAAS,KAElCnB,eAAeM,UAAUI,OAAS,KAElCV,eAAeM,UAAUK,SAAW,KAEpCX,eAAeM,UAAUM,SAAW,KAEpCZ,eAAeM,UAAUO,SAAW,KAEpCb,eAAeM,UAAUQ,QAAU,KAOnCd,eAAeM,UAAUc,aAAe,WAChCC,IAAAA,KAAOZ,KAGXY,KAAKC,MAAM,2CAA2CC,KAAK,WAAY,YAGvEF,KAAKC,MAAM,iDAAiDE,QAAO,WAC/DH,KAAKN,eAAiBrB,EAAE,+BAA+B+B,MACvDJ,KAAKC,MAAM,2CAA2CI,WAAW,YACjEL,KAAKM,SAASC,KAAKP,KACtB,IAGDA,KAAKC,MAAM,0CAA0CO,OAAM,SAASC,GAChEA,EAAEC,iBACFV,KAAKW,OACR,IAGDX,KAAKC,MAAM,2CAA2CO,OAAM,SAASC,GACjEA,EAAEC,iBACGV,KAAKN,eAAekB,SAGzBZ,KAAKa,SAAS,OAAQ,CAACC,OAAQd,KAAKN,iBACpCM,KAAKW,QACR,GACJ,EAODhC,eAAeM,UAAU0B,MAAQ,WAClBvB,KACNU,OAAOa,QADDvB,KAENO,QACR,EAQDhB,eAAeM,UAAU8B,QAAU,WAC3Bf,IAAAA,KAAOZ,KACJY,OAAAA,KAAKgB,UAAUC,MAAK,SAASC,MAChClB,KAAKF,OAAS,IAAIrB,SACduB,KAAKX,OACL6B,KACAlB,KAAKD,aAAaQ,KAAKP,MAJxB,IAOJmB,KAAK7C,aAAa8C,UACxB,EASDzC,eAAeM,UAAUgB,MAAQ,SAASoB,UACtC,OAAOhD,EAAEe,KAAKU,OAAOwB,cAAcC,KAAKF,SAC3C,EAQD1C,eAAeM,UAAUqB,SAAW,WAC5BN,IAAAA,KAAOZ,KACJY,OAAAA,KAAKgB,UAAUC,MAAK,SAASC,MAChClB,KAAKC,MAAM,mCAAmCuB,YAAYN,MAC1DlB,KAAKD,cAER,GACJ,EAQDpB,eAAeM,UAAU+B,QAAU,WAC3BhB,IACAyB,QAAU,GACd,IAAK,IAAIC,KAFEtC,KAEQG,SACfkC,QAAQE,KAHDvC,KAGWG,SAASmC,IAE/B,IAAIE,QAAU,CAAY5B,QALfZ,KAKoBE,SAAUmC,QAAWA,QACrCzB,QANJZ,KAMSI,SAAUR,OANnBI,KAMkCK,SAE7C,OAAOjB,UAAUqD,OAAO,0BAA2BD,QACtD,EASDjD,eAAeM,UAAUU,OAAS,WACzBG,KAAAA,OAAS,KACTJ,KAAAA,eAAiB,EACzB,EAEMf,cAEV"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencies.min.js.map b/admin/tool/lp/amd/build/competencies.min.js.map index 38cbcbe25d1..a6555cd9238 100644 --- a/admin/tool/lp/amd/build/competencies.min.js.map +++ b/admin/tool/lp/amd/build/competencies.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competencies.min.js","sources":["../src/competencies.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 * Handle add/remove competency links.\n *\n * @module tool_lp/competencies\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'core/str',\n 'tool_lp/competencypicker',\n 'tool_lp/dragdrop-reorder',\n 'core/pending'],\n function($, notification, ajax, templates, str, Picker, dragdrop, Pending) {\n\n /**\n * Constructor\n *\n * @class tool_lp/competencies\n * @param {Number} itemid\n * @param {String} itemtype\n * @param {Number} pagectxid\n */\n var competencies = function(itemid, itemtype, pagectxid) {\n this.itemid = itemid;\n this.itemtype = itemtype;\n this.pageContextId = pagectxid;\n this.pickerInstance = null;\n\n $('[data-region=\"actions\"] button').prop('disabled', false);\n this.registerEvents();\n this.registerDragDrop();\n };\n\n /**\n * Initialise the drag/drop code.\n * @method registerDragDrop\n */\n competencies.prototype.registerDragDrop = function() {\n var localthis = this;\n // Init this module.\n str.get_string('movecompetency', 'tool_lp').done(\n function(movestring) {\n dragdrop.dragdrop('movecompetency',\n movestring,\n {identifier: 'movecompetency', component: 'tool_lp'},\n {identifier: 'movecompetencyafter', component: 'tool_lp'},\n 'drag-samenode',\n 'drag-parentnode',\n 'drag-handlecontainer',\n function(drag, drop) {\n localthis.handleDrop(drag, drop);\n });\n }\n ).fail(notification.exception);\n\n };\n\n /**\n * Handle a drop from a drag/drop operation.\n *\n * @method handleDrop\n * @param {DOMNode} drag The dragged node.\n * @param {DOMNode} drop The dropped on node.\n */\n competencies.prototype.handleDrop = function(drag, drop) {\n var fromid = $(drag).data('id');\n var toid = $(drop).data('id');\n var localthis = this;\n var requests = [];\n\n if (localthis.itemtype == 'course') {\n requests = ajax.call([\n {\n methodname: 'core_competency_reorder_course_competency',\n args: {courseid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid}\n }\n ]);\n } else if (localthis.itemtype == 'template') {\n requests = ajax.call([\n {\n methodname: 'core_competency_reorder_template_competency',\n args: {templateid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid}\n }\n ]);\n } else if (localthis.itemtype == 'plan') {\n requests = ajax.call([\n {\n methodname: 'core_competency_reorder_plan_competency',\n args: {planid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid}\n }\n ]);\n } else {\n return;\n }\n\n requests[0].fail(notification.exception);\n };\n\n /**\n * Pick a competency\n *\n * @method pickCompetency\n * @return {Promise}\n */\n competencies.prototype.pickCompetency = function() {\n var self = this;\n var requests;\n var pagerender;\n var pageregion;\n var pageContextIncludes;\n\n if (!self.pickerInstance) {\n if (self.itemtype === 'template' || self.itemtype === 'course') {\n pageContextIncludes = 'parents';\n }\n self.pickerInstance = new Picker(self.pageContextId, false, pageContextIncludes);\n self.pickerInstance.on('save', function(e, data) {\n var compIds = data.competencyIds;\n var pendingPromise = new Pending();\n\n if (self.itemtype === \"course\") {\n requests = [];\n\n $.each(compIds, function(index, compId) {\n requests.push({\n methodname: 'core_competency_add_competency_to_course',\n args: {courseid: self.itemid, competencyid: compId}\n });\n });\n requests.push({\n methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: self.itemid, moduleid: 0}\n });\n\n pagerender = 'tool_lp/course_competencies_page';\n pageregion = 'coursecompetenciespage';\n\n } else if (self.itemtype === \"template\") {\n requests = [];\n\n $.each(compIds, function(index, compId) {\n requests.push({\n methodname: 'core_competency_add_competency_to_template',\n args: {templateid: self.itemid, competencyid: compId}\n });\n });\n requests.push({\n methodname: 'tool_lp_data_for_template_competencies_page',\n args: {templateid: self.itemid, pagecontext: {contextid: self.pageContextId}}\n });\n pagerender = 'tool_lp/template_competencies_page';\n pageregion = 'templatecompetenciespage';\n } else if (self.itemtype === \"plan\") {\n requests = [];\n\n $.each(compIds, function(index, compId) {\n requests.push({\n methodname: 'core_competency_add_competency_to_plan',\n args: {planid: self.itemid, competencyid: compId}\n });\n });\n requests.push({\n methodname: 'tool_lp_data_for_plan_page',\n args: {planid: self.itemid}\n });\n pagerender = 'tool_lp/plan_page';\n pageregion = 'plan-page';\n }\n ajax.call(requests)[requests.length - 1]\n .then(function(context) {\n return templates.render(pagerender, context);\n })\n .then(function(html, js) {\n templates.replaceNode($('[data-region=\"' + pageregion + '\"]'), html, js);\n return;\n })\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n });\n }\n\n return self.pickerInstance.display();\n };\n\n /**\n * Delete the link between competency and course, template or plan. Reload the page.\n *\n * @method doDelete\n * @param {int} deleteid The id of record to delete.\n */\n competencies.prototype.doDelete = function(deleteid) {\n var localthis = this;\n var requests = [],\n pagerender = '',\n pageregion = '';\n\n // Delete the link and reload the page template.\n if (localthis.itemtype == 'course') {\n requests = ajax.call([\n {methodname: 'core_competency_remove_competency_from_course',\n args: {courseid: localthis.itemid, competencyid: deleteid}},\n {methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: localthis.itemid, moduleid: 0}}\n ]);\n pagerender = 'tool_lp/course_competencies_page';\n pageregion = 'coursecompetenciespage';\n } else if (localthis.itemtype == 'template') {\n requests = ajax.call([\n {methodname: 'core_competency_remove_competency_from_template',\n args: {templateid: localthis.itemid, competencyid: deleteid}},\n {methodname: 'tool_lp_data_for_template_competencies_page',\n args: {templateid: localthis.itemid, pagecontext: {contextid: localthis.pageContextId}}}\n ]);\n pagerender = 'tool_lp/template_competencies_page';\n pageregion = 'templatecompetenciespage';\n } else if (localthis.itemtype == 'plan') {\n requests = ajax.call([\n {methodname: 'core_competency_remove_competency_from_plan',\n args: {planid: localthis.itemid, competencyid: deleteid}},\n {methodname: 'tool_lp_data_for_plan_page',\n args: {planid: localthis.itemid}}\n ]);\n pagerender = 'tool_lp/plan_page';\n pageregion = 'plan-page';\n }\n\n requests[1].done(function(context) {\n templates.render(pagerender, context).done(function(html, js) {\n $('[data-region=\"' + pageregion + '\"]').replaceWith(html);\n templates.runTemplateJS(js);\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Show a confirm dialogue before deleting a competency.\n *\n * @method deleteHandler\n * @param {int} deleteid The id of record to delete.\n */\n competencies.prototype.deleteHandler = function(deleteid) {\n var localthis = this;\n var requests = [];\n var message;\n\n if (localthis.itemtype == 'course') {\n message = 'unlinkcompetencycourse';\n } else if (localthis.itemtype == 'template') {\n message = 'unlinkcompetencytemplate';\n } else if (localthis.itemtype == 'plan') {\n message = 'unlinkcompetencyplan';\n } else {\n return;\n }\n\n requests = ajax.call([{\n methodname: 'core_competency_read_competency',\n args: {id: deleteid}\n }]);\n\n requests[0].done(function(competency) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: message, component: 'tool_lp', param: competency.shortname},\n {key: 'confirm', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Unlink the competency X from the course?\n strings[2], // Confirm.\n strings[3], // Cancel.\n function() {\n localthis.doDelete(deleteid);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Register the javascript event handlers for this page.\n *\n * @method registerEvents\n */\n competencies.prototype.registerEvents = function() {\n var localthis = this;\n\n if (localthis.itemtype == 'course') {\n // Course completion rule handling.\n $('[data-region=\"coursecompetenciespage\"]').on('change', 'select[data-field=\"ruleoutcome\"]', function(e) {\n var pendingPromise = new Pending();\n var requests = [];\n var pagerender = 'tool_lp/course_competencies_page';\n var pageregion = 'coursecompetenciespage';\n var coursecompetencyid = $(e.target).data('id');\n var ruleoutcome = $(e.target).val();\n requests = ajax.call([\n {methodname: 'core_competency_set_course_competency_ruleoutcome',\n args: {coursecompetencyid: coursecompetencyid, ruleoutcome: ruleoutcome}},\n {methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: localthis.itemid, moduleid: 0}}\n ]);\n\n requests[1].then(function(context) {\n return templates.render(pagerender, context);\n })\n .then(function(html, js) {\n return templates.replaceNode($('[data-region=\"' + pageregion + '\"]'), html, js);\n })\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n });\n }\n\n $('[data-region=\"actions\"] button').click(function(e) {\n var pendingPromise = new Pending();\n e.preventDefault();\n\n localthis.pickCompetency()\n .then(pendingPromise.resolve)\n .catch();\n });\n $('[data-action=\"delete-competency-link\"]').click(function(e) {\n e.preventDefault();\n\n var deleteid = $(e.target).closest('[data-id]').data('id');\n localthis.deleteHandler(deleteid);\n });\n };\n\n return /** @alias module:tool_lp/competencies */ competencies;\n});\n"],"names":["define","$","notification","ajax","templates","str","Picker","dragdrop","Pending","competencies","itemid","itemtype","pagectxid","pageContextId","pickerInstance","prop","registerEvents","registerDragDrop","prototype","localthis","this","get_string","done","movestring","identifier","component","drag","drop","handleDrop","fail","exception","fromid","data","toid","requests","call","methodname","args","courseid","competencyidfrom","competencyidto","templateid","planid","pickCompetency","pagerender","pageregion","pageContextIncludes","self","on","e","compIds","competencyIds","pendingPromise","each","index","compId","push","competencyid","moduleid","pagecontext","contextid","length","then","context","render","html","js","replaceNode","resolve","catch","display","doDelete","deleteid","replaceWith","runTemplateJS","deleteHandler","message","id","competency","get_strings","key","param","shortname","strings","confirm","coursecompetencyid","target","ruleoutcome","val","click","preventDefault","closest"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"competencies.min.js","sources":["../src/competencies.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 * Handle add/remove competency links.\n *\n * @module tool_lp/competencies\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'core/str',\n 'tool_lp/competencypicker',\n 'tool_lp/dragdrop-reorder',\n 'core/pending'],\n function($, notification, ajax, templates, str, Picker, dragdrop, Pending) {\n\n /**\n * Constructor\n *\n * @class tool_lp/competencies\n * @param {Number} itemid\n * @param {String} itemtype\n * @param {Number} pagectxid\n */\n var competencies = function(itemid, itemtype, pagectxid) {\n this.itemid = itemid;\n this.itemtype = itemtype;\n this.pageContextId = pagectxid;\n this.pickerInstance = null;\n\n $('[data-region=\"actions\"] button').prop('disabled', false);\n this.registerEvents();\n this.registerDragDrop();\n };\n\n /**\n * Initialise the drag/drop code.\n * @method registerDragDrop\n */\n competencies.prototype.registerDragDrop = function() {\n var localthis = this;\n // Init this module.\n str.get_string('movecompetency', 'tool_lp').done(\n function(movestring) {\n dragdrop.dragdrop('movecompetency',\n movestring,\n {identifier: 'movecompetency', component: 'tool_lp'},\n {identifier: 'movecompetencyafter', component: 'tool_lp'},\n 'drag-samenode',\n 'drag-parentnode',\n 'drag-handlecontainer',\n function(drag, drop) {\n localthis.handleDrop(drag, drop);\n });\n }\n ).fail(notification.exception);\n\n };\n\n /**\n * Handle a drop from a drag/drop operation.\n *\n * @method handleDrop\n * @param {DOMNode} drag The dragged node.\n * @param {DOMNode} drop The dropped on node.\n */\n competencies.prototype.handleDrop = function(drag, drop) {\n var fromid = $(drag).data('id');\n var toid = $(drop).data('id');\n var localthis = this;\n var requests = [];\n\n if (localthis.itemtype == 'course') {\n requests = ajax.call([\n {\n methodname: 'core_competency_reorder_course_competency',\n args: {courseid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid}\n }\n ]);\n } else if (localthis.itemtype == 'template') {\n requests = ajax.call([\n {\n methodname: 'core_competency_reorder_template_competency',\n args: {templateid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid}\n }\n ]);\n } else if (localthis.itemtype == 'plan') {\n requests = ajax.call([\n {\n methodname: 'core_competency_reorder_plan_competency',\n args: {planid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid}\n }\n ]);\n } else {\n return;\n }\n\n requests[0].fail(notification.exception);\n };\n\n /**\n * Pick a competency\n *\n * @method pickCompetency\n * @return {Promise}\n */\n competencies.prototype.pickCompetency = function() {\n var self = this;\n var requests;\n var pagerender;\n var pageregion;\n var pageContextIncludes;\n\n if (!self.pickerInstance) {\n if (self.itemtype === 'template' || self.itemtype === 'course') {\n pageContextIncludes = 'parents';\n }\n self.pickerInstance = new Picker(self.pageContextId, false, pageContextIncludes);\n self.pickerInstance.on('save', function(e, data) {\n var compIds = data.competencyIds;\n var pendingPromise = new Pending();\n\n if (self.itemtype === \"course\") {\n requests = [];\n\n $.each(compIds, function(index, compId) {\n requests.push({\n methodname: 'core_competency_add_competency_to_course',\n args: {courseid: self.itemid, competencyid: compId}\n });\n });\n requests.push({\n methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: self.itemid, moduleid: 0}\n });\n\n pagerender = 'tool_lp/course_competencies_page';\n pageregion = 'coursecompetenciespage';\n\n } else if (self.itemtype === \"template\") {\n requests = [];\n\n $.each(compIds, function(index, compId) {\n requests.push({\n methodname: 'core_competency_add_competency_to_template',\n args: {templateid: self.itemid, competencyid: compId}\n });\n });\n requests.push({\n methodname: 'tool_lp_data_for_template_competencies_page',\n args: {templateid: self.itemid, pagecontext: {contextid: self.pageContextId}}\n });\n pagerender = 'tool_lp/template_competencies_page';\n pageregion = 'templatecompetenciespage';\n } else if (self.itemtype === \"plan\") {\n requests = [];\n\n $.each(compIds, function(index, compId) {\n requests.push({\n methodname: 'core_competency_add_competency_to_plan',\n args: {planid: self.itemid, competencyid: compId}\n });\n });\n requests.push({\n methodname: 'tool_lp_data_for_plan_page',\n args: {planid: self.itemid}\n });\n pagerender = 'tool_lp/plan_page';\n pageregion = 'plan-page';\n }\n ajax.call(requests)[requests.length - 1]\n .then(function(context) {\n return templates.render(pagerender, context);\n })\n .then(function(html, js) {\n templates.replaceNode($('[data-region=\"' + pageregion + '\"]'), html, js);\n return;\n })\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n });\n }\n\n return self.pickerInstance.display();\n };\n\n /**\n * Delete the link between competency and course, template or plan. Reload the page.\n *\n * @method doDelete\n * @param {int} deleteid The id of record to delete.\n */\n competencies.prototype.doDelete = function(deleteid) {\n var localthis = this;\n var requests = [],\n pagerender = '',\n pageregion = '';\n\n // Delete the link and reload the page template.\n if (localthis.itemtype == 'course') {\n requests = ajax.call([\n {methodname: 'core_competency_remove_competency_from_course',\n args: {courseid: localthis.itemid, competencyid: deleteid}},\n {methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: localthis.itemid, moduleid: 0}}\n ]);\n pagerender = 'tool_lp/course_competencies_page';\n pageregion = 'coursecompetenciespage';\n } else if (localthis.itemtype == 'template') {\n requests = ajax.call([\n {methodname: 'core_competency_remove_competency_from_template',\n args: {templateid: localthis.itemid, competencyid: deleteid}},\n {methodname: 'tool_lp_data_for_template_competencies_page',\n args: {templateid: localthis.itemid, pagecontext: {contextid: localthis.pageContextId}}}\n ]);\n pagerender = 'tool_lp/template_competencies_page';\n pageregion = 'templatecompetenciespage';\n } else if (localthis.itemtype == 'plan') {\n requests = ajax.call([\n {methodname: 'core_competency_remove_competency_from_plan',\n args: {planid: localthis.itemid, competencyid: deleteid}},\n {methodname: 'tool_lp_data_for_plan_page',\n args: {planid: localthis.itemid}}\n ]);\n pagerender = 'tool_lp/plan_page';\n pageregion = 'plan-page';\n }\n\n requests[1].done(function(context) {\n templates.render(pagerender, context).done(function(html, js) {\n $('[data-region=\"' + pageregion + '\"]').replaceWith(html);\n templates.runTemplateJS(js);\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Show a confirm dialogue before deleting a competency.\n *\n * @method deleteHandler\n * @param {int} deleteid The id of record to delete.\n */\n competencies.prototype.deleteHandler = function(deleteid) {\n var localthis = this;\n var requests = [];\n var message;\n\n if (localthis.itemtype == 'course') {\n message = 'unlinkcompetencycourse';\n } else if (localthis.itemtype == 'template') {\n message = 'unlinkcompetencytemplate';\n } else if (localthis.itemtype == 'plan') {\n message = 'unlinkcompetencyplan';\n } else {\n return;\n }\n\n requests = ajax.call([{\n methodname: 'core_competency_read_competency',\n args: {id: deleteid}\n }]);\n\n requests[0].done(function(competency) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: message, component: 'tool_lp', param: competency.shortname},\n {key: 'confirm', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Unlink the competency X from the course?\n strings[2], // Confirm.\n strings[3], // Cancel.\n function() {\n localthis.doDelete(deleteid);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Register the javascript event handlers for this page.\n *\n * @method registerEvents\n */\n competencies.prototype.registerEvents = function() {\n var localthis = this;\n\n if (localthis.itemtype == 'course') {\n // Course completion rule handling.\n $('[data-region=\"coursecompetenciespage\"]').on('change', 'select[data-field=\"ruleoutcome\"]', function(e) {\n var pendingPromise = new Pending();\n var requests = [];\n var pagerender = 'tool_lp/course_competencies_page';\n var pageregion = 'coursecompetenciespage';\n var coursecompetencyid = $(e.target).data('id');\n var ruleoutcome = $(e.target).val();\n requests = ajax.call([\n {methodname: 'core_competency_set_course_competency_ruleoutcome',\n args: {coursecompetencyid: coursecompetencyid, ruleoutcome: ruleoutcome}},\n {methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: localthis.itemid, moduleid: 0}}\n ]);\n\n requests[1].then(function(context) {\n return templates.render(pagerender, context);\n })\n .then(function(html, js) {\n return templates.replaceNode($('[data-region=\"' + pageregion + '\"]'), html, js);\n })\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n });\n }\n\n $('[data-region=\"actions\"] button').click(function(e) {\n var pendingPromise = new Pending();\n e.preventDefault();\n\n localthis.pickCompetency()\n .then(pendingPromise.resolve)\n .catch();\n });\n $('[data-action=\"delete-competency-link\"]').click(function(e) {\n e.preventDefault();\n\n var deleteid = $(e.target).closest('[data-id]').data('id');\n localthis.deleteHandler(deleteid);\n });\n };\n\n return /** @alias module:tool_lp/competencies */ competencies;\n});\n"],"names":["define","$","notification","ajax","templates","str","Picker","dragdrop","Pending","competencies","itemid","itemtype","pagectxid","pageContextId","pickerInstance","prop","this","registerEvents","registerDragDrop","prototype","localthis","get_string","done","movestring","identifier","component","drag","drop","handleDrop","fail","exception","fromid","data","toid","requests","call","methodname","args","courseid","competencyidfrom","competencyidto","templateid","planid","pickCompetency","self","pagerender","pageregion","pageContextIncludes","on","e","compIds","competencyIds","pendingPromise","each","index","compId","push","competencyid","moduleid","pagecontext","contextid","length","then","context","render","html","js","replaceNode","resolve","catch","display","doDelete","deleteid","replaceWith","runTemplateJS","deleteHandler","message","id","competency","get_strings","key","param","shortname","strings","confirm","coursecompetencyid","target","ruleoutcome","val","click","preventDefault","closest"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competency_outcomes.min.js.map b/admin/tool/lp/amd/build/competency_outcomes.min.js.map index e3bf7de9983..e36913e3b48 100644 --- a/admin/tool/lp/amd/build/competency_outcomes.min.js.map +++ b/admin/tool/lp/amd/build/competency_outcomes.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competency_outcomes.min.js","sources":["../src/competency_outcomes.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 * Competency rule config.\n *\n * @module tool_lp/competency_outcomes\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/str'],\n function($, Str) {\n\n var OUTCOME_NONE = 0,\n OUTCOME_EVIDENCE = 1,\n OUTCOME_COMPLETE = 2,\n OUTCOME_RECOMMEND = 3;\n\n return {\n\n NONE: OUTCOME_NONE,\n EVIDENCE: OUTCOME_EVIDENCE,\n COMPLETE: OUTCOME_COMPLETE,\n RECOMMEND: OUTCOME_RECOMMEND,\n\n /**\n * Get all the outcomes.\n *\n * @return {Object} Indexed by outcome code, contains code and name.\n * @method getAll\n */\n getAll: function() {\n var self = this;\n return Str.get_strings([\n {key: 'competencyoutcome_none', component: 'tool_lp'},\n {key: 'competencyoutcome_evidence', component: 'tool_lp'},\n {key: 'competencyoutcome_recommend', component: 'tool_lp'},\n {key: 'competencyoutcome_complete', component: 'tool_lp'},\n ]).then(function(strings) {\n var outcomes = {};\n outcomes[self.NONE] = {code: self.NONE, name: strings[0]};\n outcomes[self.EVIDENCE] = {code: self.EVIDENCE, name: strings[1]};\n outcomes[self.RECOMMEND] = {code: self.RECOMMEND, name: strings[2]};\n outcomes[self.COMPLETE] = {code: self.COMPLETE, name: strings[3]};\n return outcomes;\n });\n },\n\n /**\n * Get the string for an outcome.\n *\n * @param {Number} id The outcome code.\n * @return {Promise} Resolved with the string.\n * @method getString\n */\n getString: function(id) {\n var self = this,\n all = self.getAll();\n\n return all.then(function(outcomes) {\n if (typeof outcomes[id] === 'undefined') {\n return $.Deferred().reject().promise();\n }\n return outcomes[id].name;\n });\n }\n };\n});\n"],"names":["define","$","Str","NONE","EVIDENCE","COMPLETE","RECOMMEND","getAll","self","this","get_strings","key","component","then","strings","outcomes","code","name","getString","id","Deferred","reject","promise"],"mappings":";;;;;;;AAuBAA,qCAAO,CAAC,SACA,aACA,SAASC,EAAGC,WAOT,CAEHC,KAPe,EAQfC,SAPmB,EAQnBC,SAPmB,EAQnBC,UAPoB,EAepBC,OAAQ,eACAC,KAAOC,YACJP,IAAIQ,YAAY,CACnB,CAACC,IAAK,yBAA0BC,UAAW,WAC3C,CAACD,IAAK,6BAA8BC,UAAW,WAC/C,CAACD,IAAK,8BAA+BC,UAAW,WAChD,CAACD,IAAK,6BAA8BC,UAAW,aAChDC,MAAK,SAASC,aACTC,SAAW,UACfA,SAASP,KAAKL,MAAQ,CAACa,KAAMR,KAAKL,KAAMc,KAAMH,QAAQ,IACtDC,SAASP,KAAKJ,UAAY,CAACY,KAAMR,KAAKJ,SAAUa,KAAMH,QAAQ,IAC9DC,SAASP,KAAKF,WAAa,CAACU,KAAMR,KAAKF,UAAWW,KAAMH,QAAQ,IAChEC,SAASP,KAAKH,UAAY,CAACW,KAAMR,KAAKH,SAAUY,KAAMH,QAAQ,IACvDC,aAWfG,UAAW,SAASC,WACLV,KACIF,SAEJM,MAAK,SAASE,sBACO,IAAjBA,SAASI,IACTlB,EAAEmB,WAAWC,SAASC,UAE1BP,SAASI,IAAIF"} \ No newline at end of file +{"version":3,"file":"competency_outcomes.min.js","sources":["../src/competency_outcomes.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 * Competency rule config.\n *\n * @module tool_lp/competency_outcomes\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/str'],\n function($, Str) {\n\n var OUTCOME_NONE = 0,\n OUTCOME_EVIDENCE = 1,\n OUTCOME_COMPLETE = 2,\n OUTCOME_RECOMMEND = 3;\n\n return {\n\n NONE: OUTCOME_NONE,\n EVIDENCE: OUTCOME_EVIDENCE,\n COMPLETE: OUTCOME_COMPLETE,\n RECOMMEND: OUTCOME_RECOMMEND,\n\n /**\n * Get all the outcomes.\n *\n * @return {Object} Indexed by outcome code, contains code and name.\n * @method getAll\n */\n getAll: function() {\n var self = this;\n return Str.get_strings([\n {key: 'competencyoutcome_none', component: 'tool_lp'},\n {key: 'competencyoutcome_evidence', component: 'tool_lp'},\n {key: 'competencyoutcome_recommend', component: 'tool_lp'},\n {key: 'competencyoutcome_complete', component: 'tool_lp'},\n ]).then(function(strings) {\n var outcomes = {};\n outcomes[self.NONE] = {code: self.NONE, name: strings[0]};\n outcomes[self.EVIDENCE] = {code: self.EVIDENCE, name: strings[1]};\n outcomes[self.RECOMMEND] = {code: self.RECOMMEND, name: strings[2]};\n outcomes[self.COMPLETE] = {code: self.COMPLETE, name: strings[3]};\n return outcomes;\n });\n },\n\n /**\n * Get the string for an outcome.\n *\n * @param {Number} id The outcome code.\n * @return {Promise} Resolved with the string.\n * @method getString\n */\n getString: function(id) {\n var self = this,\n all = self.getAll();\n\n return all.then(function(outcomes) {\n if (typeof outcomes[id] === 'undefined') {\n return $.Deferred().reject().promise();\n }\n return outcomes[id].name;\n });\n }\n };\n});\n"],"names":["define","$","Str","NONE","EVIDENCE","COMPLETE","RECOMMEND","getAll","self","this","get_strings","key","component","then","strings","outcomes","code","name","getString","id","Deferred","reject","promise"],"mappings":";;;;;;;AAuBAA,OAAM,8BAAC,CAAC,SACA,aACA,SAASC,EAAGC,KAOT,MAAA,CAEHC,KAPe,EAQfC,SAPmB,EAQnBC,SAPmB,EAQnBC,UAPoB,EAepBC,OAAQ,WACAC,IAAAA,KAAOC,KACX,OAAOP,IAAIQ,YAAY,CACnB,CAACC,IAAK,yBAA0BC,UAAW,WAC3C,CAACD,IAAK,6BAA8BC,UAAW,WAC/C,CAACD,IAAK,8BAA+BC,UAAW,WAChD,CAACD,IAAK,6BAA8BC,UAAW,aAChDC,MAAK,SAASC,SACTC,IAAAA,SAAW,CAAA,EAKf,OAJAA,SAASP,KAAKL,MAAQ,CAACa,KAAMR,KAAKL,KAAMc,KAAMH,QAAQ,IACtDC,SAASP,KAAKJ,UAAY,CAACY,KAAMR,KAAKJ,SAAUa,KAAMH,QAAQ,IAC9DC,SAASP,KAAKF,WAAa,CAACU,KAAMR,KAAKF,UAAWW,KAAMH,QAAQ,IAChEC,SAASP,KAAKH,UAAY,CAACW,KAAMR,KAAKH,SAAUY,KAAMH,QAAQ,IACvDC,QACV,GA3BF,EAqCHG,UAAW,SAASC,IAIhB,OAHWV,KACIF,SAEJM,MAAK,SAASE,UACrB,YAA4B,IAAjBA,SAASI,IACTlB,EAAEmB,WAAWC,SAASC,UAE1BP,SAASI,IAAIF,IACvB,GACJ,EAER"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competency_plan_navigation.min.js.map b/admin/tool/lp/amd/build/competency_plan_navigation.min.js.map index 613139fd6e8..f78ee621d78 100644 --- a/admin/tool/lp/amd/build/competency_plan_navigation.min.js.map +++ b/admin/tool/lp/amd/build/competency_plan_navigation.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competency_plan_navigation.min.js","sources":["../src/competency_plan_navigation.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 * Event click on selecting competency in the competency autocomplete.\n *\n * @module tool_lp/competency_plan_navigation\n * @copyright 2016 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * CompetencyPlanNavigation\n *\n * @class\n * @param {String} competencySelector The selector of the competency element.\n * @param {String} baseUrl The base url for the page (no params).\n * @param {Number} userId The user id\n * @param {Number} competencyId The competency id\n * @param {Number} planId The plan id\n */\n var CompetencyPlanNavigation = function(competencySelector, baseUrl, userId, competencyId, planId) {\n this._baseUrl = baseUrl;\n this._userId = userId + '';\n this._competencyId = competencyId + '';\n this._planId = planId;\n this._ignoreFirstCompetency = true;\n\n $(competencySelector).on('change', this._competencyChanged.bind(this));\n };\n\n /**\n * The competency was changed in the select list.\n *\n * @method _competencyChanged\n * @param {Event} e\n */\n CompetencyPlanNavigation.prototype._competencyChanged = function(e) {\n if (this._ignoreFirstCompetency) {\n this._ignoreFirstCompetency = false;\n return;\n }\n var newCompetencyId = $(e.target).val();\n var queryStr = '?userid=' + this._userId + '&planid=' + this._planId + '&competencyid=' + newCompetencyId;\n document.location = this._baseUrl + queryStr;\n };\n\n /** @property {Number} The id of the competency. */\n CompetencyPlanNavigation.prototype._competencyId = null;\n /** @property {Number} The id of the user. */\n CompetencyPlanNavigation.prototype._userId = null;\n /** @property {Number} The id of the plan. */\n CompetencyPlanNavigation.prototype._planId = null;\n /** @property {String} Plugin base url. */\n CompetencyPlanNavigation.prototype._baseUrl = null;\n /** @property {Boolean} Ignore the first change event for competencies. */\n CompetencyPlanNavigation.prototype._ignoreFirstCompetency = null;\n\n return CompetencyPlanNavigation;\n});\n"],"names":["define","$","CompetencyPlanNavigation","competencySelector","baseUrl","userId","competencyId","planId","_baseUrl","_userId","_competencyId","_planId","_ignoreFirstCompetency","on","this","_competencyChanged","bind","prototype","e","newCompetencyId","target","val","queryStr","document","location"],"mappings":";;;;;;;AAuBAA,4CAAO,CAAC,WAAW,SAASC,OAYpBC,yBAA2B,SAASC,mBAAoBC,QAASC,OAAQC,aAAcC,aAClFC,SAAWJ,aACXK,QAAUJ,OAAS,QACnBK,cAAgBJ,aAAe,QAC/BK,QAAUJ,YACVK,wBAAyB,EAE9BX,EAAEE,oBAAoBU,GAAG,SAAUC,KAAKC,mBAAmBC,KAAKF,eASpEZ,yBAAyBe,UAAUF,mBAAqB,SAASG,MACzDJ,KAAKF,4BACAA,wBAAyB,WAG9BO,gBAAkBlB,EAAEiB,EAAEE,QAAQC,MAC9BC,SAAW,WAAaR,KAAKL,QAAU,WAAaK,KAAKH,QAAU,iBAAmBQ,gBAC1FI,SAASC,SAAWV,KAAKN,SAAWc,WAIxCpB,yBAAyBe,UAAUP,cAAgB,KAEnDR,yBAAyBe,UAAUR,QAAU,KAE7CP,yBAAyBe,UAAUN,QAAU,KAE7CT,yBAAyBe,UAAUT,SAAW,KAE9CN,yBAAyBe,UAAUL,uBAAyB,KAErDV"} \ No newline at end of file +{"version":3,"file":"competency_plan_navigation.min.js","sources":["../src/competency_plan_navigation.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 * Event click on selecting competency in the competency autocomplete.\n *\n * @module tool_lp/competency_plan_navigation\n * @copyright 2016 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * CompetencyPlanNavigation\n *\n * @class\n * @param {String} competencySelector The selector of the competency element.\n * @param {String} baseUrl The base url for the page (no params).\n * @param {Number} userId The user id\n * @param {Number} competencyId The competency id\n * @param {Number} planId The plan id\n */\n var CompetencyPlanNavigation = function(competencySelector, baseUrl, userId, competencyId, planId) {\n this._baseUrl = baseUrl;\n this._userId = userId + '';\n this._competencyId = competencyId + '';\n this._planId = planId;\n this._ignoreFirstCompetency = true;\n\n $(competencySelector).on('change', this._competencyChanged.bind(this));\n };\n\n /**\n * The competency was changed in the select list.\n *\n * @method _competencyChanged\n * @param {Event} e\n */\n CompetencyPlanNavigation.prototype._competencyChanged = function(e) {\n if (this._ignoreFirstCompetency) {\n this._ignoreFirstCompetency = false;\n return;\n }\n var newCompetencyId = $(e.target).val();\n var queryStr = '?userid=' + this._userId + '&planid=' + this._planId + '&competencyid=' + newCompetencyId;\n document.location = this._baseUrl + queryStr;\n };\n\n /** @property {Number} The id of the competency. */\n CompetencyPlanNavigation.prototype._competencyId = null;\n /** @property {Number} The id of the user. */\n CompetencyPlanNavigation.prototype._userId = null;\n /** @property {Number} The id of the plan. */\n CompetencyPlanNavigation.prototype._planId = null;\n /** @property {String} Plugin base url. */\n CompetencyPlanNavigation.prototype._baseUrl = null;\n /** @property {Boolean} Ignore the first change event for competencies. */\n CompetencyPlanNavigation.prototype._ignoreFirstCompetency = null;\n\n return CompetencyPlanNavigation;\n});\n"],"names":["define","$","CompetencyPlanNavigation","competencySelector","baseUrl","userId","competencyId","planId","_baseUrl","this","_userId","_competencyId","_planId","_ignoreFirstCompetency","on","_competencyChanged","bind","prototype","e","newCompetencyId","target","val","queryStr","document","location"],"mappings":";;;;;;;AAuBAA,4CAAO,CAAC,WAAW,SAASC,GAYxB,IAAIC,yBAA2B,SAASC,mBAAoBC,QAASC,OAAQC,aAAcC,QAClFC,KAAAA,SAAWJ,QAChBK,KAAKC,QAAUL,OAAS,GACxBI,KAAKE,cAAgBL,aAAe,GAC/BM,KAAAA,QAAUL,OACVM,KAAAA,wBAAyB,EAE9BZ,EAAEE,oBAAoBW,GAAG,SAAUL,KAAKM,mBAAmBC,KAAKP,MACnE,EA6BD,OArBAP,yBAAyBe,UAAUF,mBAAqB,SAASG,GACzD,GAAAT,KAAKI,uBACAA,KAAAA,wBAAyB,MAD9B,CAIAM,IAAAA,gBAAkBlB,EAAEiB,EAAEE,QAAQC,MAC9BC,SAAW,WAAab,KAAKC,QAAU,WAAaD,KAAKG,QAAU,iBAAmBO,gBAC1FI,SAASC,SAAWf,KAAKD,SAAWc,QAHnC,CAIJ,EAGDpB,yBAAyBe,UAAUN,cAAgB,KAEnDT,yBAAyBe,UAAUP,QAAU,KAE7CR,yBAAyBe,UAAUL,QAAU,KAE7CV,yBAAyBe,UAAUT,SAAW,KAE9CN,yBAAyBe,UAAUJ,uBAAyB,KAErDX,wBACV"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competency_rule.min.js.map b/admin/tool/lp/amd/build/competency_rule.min.js.map index a0fe9913190..d40d957b259 100644 --- a/admin/tool/lp/amd/build/competency_rule.min.js.map +++ b/admin/tool/lp/amd/build/competency_rule.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competency_rule.min.js","sources":["../src/competency_rule.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 * Competency rule base module.\n *\n * @module tool_lp/competencyrule\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * Competency rule abstract class.\n *\n * Any competency rule should extend this object. The event 'change' should be\n * triggered on the instance when the configuration has changed. This will allow\n * the components using the rule to gather the config, or check its validity.\n *\n * this._triggerChange();\n *\n * @param {Tree} tree The competency tree.\n */\n var Rule = function(tree) {\n this._eventNode = $('
');\n this._ready = $.Deferred();\n this._tree = tree;\n };\n\n /** @property {Object} The current competency. */\n Rule.prototype._competency = null;\n /** @property {Node} The node we attach the events to. */\n Rule.prototype._eventNode = null;\n /** @property {Promise} Resolved when the object is ready. */\n Rule.prototype._ready = null;\n /** @property {Tree} The competency tree. */\n Rule.prototype._tree = null;\n\n /**\n * Whether or not the current competency can be configured using this rule.\n *\n * @return {Boolean}\n * @method canConfig\n */\n Rule.prototype.canConfig = function() {\n return this._tree.hasChildren(this._competency.id);\n };\n\n /**\n * The config established by this rule.\n *\n * To override in subclasses when relevant.\n *\n * @return {String|null}\n * @method getConfig\n */\n Rule.prototype.getConfig = function() {\n return null;\n };\n\n // eslint-disable-line valid-jsdoc\n /**\n * Return the type of the module.\n *\n * @return {String}\n * @method getType\n */\n // eslint-enable-line valid-jsdoc\n Rule.prototype.getType = function() {\n throw new Error('Not implemented');\n };\n\n /**\n * The init process.\n *\n * Do not override this, instead override _load.\n *\n * @return {Promise} Revoled when the plugin is initialised.\n * @method init\n */\n Rule.prototype.init = function() {\n return this._load();\n };\n\n /**\n * Callback to inject the template.\n *\n * @returns {Promise} Resolved when done.\n * @method injectTemplate\n */\n Rule.prototype.injectTemplate = function() {\n return $.Deferred().reject().promise();\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * Plugins should override this.\n *\n * @return {Boolean}\n * @method _isValid\n */\n Rule.prototype.isValid = function() {\n return false;\n };\n\n /**\n * Load the class.\n *\n * @return {Promise}\n * @method _load\n * @protected\n */\n Rule.prototype._load = function() {\n return $.when();\n };\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n Rule.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Sets the current competency.\n *\n * @param {Competency} competency\n * @method setTargetCompetency\n */\n Rule.prototype.setTargetCompetency = function(competency) {\n this._competency = competency;\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _trigger\n * @protected\n */\n Rule.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n /**\n * Trigger the change event.\n *\n * @method _triggerChange\n * @protected\n */\n Rule.prototype._triggerChange = function() {\n this._trigger('change', this);\n };\n\n return /** @alias module:tool_lp/competency_rule */ Rule;\n\n});\n"],"names":["define","$","Rule","tree","_eventNode","_ready","Deferred","_tree","prototype","_competency","canConfig","this","hasChildren","id","getConfig","getType","Error","init","_load","injectTemplate","reject","promise","isValid","when","on","type","handler","setTargetCompetency","competency","_trigger","data","trigger","_triggerChange"],"mappings":";;;;;;;AAuBAA,iCAAO,CAAC,WAAW,SAASC,OAapBC,KAAO,SAASC,WACXC,WAAaH,EAAE,cACfI,OAASJ,EAAEK,gBACXC,MAAQJ,aAIjBD,KAAKM,UAAUC,YAAc,KAE7BP,KAAKM,UAAUJ,WAAa,KAE5BF,KAAKM,UAAUH,OAAS,KAExBH,KAAKM,UAAUD,MAAQ,KAQvBL,KAAKM,UAAUE,UAAY,kBAChBC,KAAKJ,MAAMK,YAAYD,KAAKF,YAAYI,KAWnDX,KAAKM,UAAUM,UAAY,kBAChB,MAWXZ,KAAKM,UAAUO,QAAU,iBACf,IAAIC,MAAM,oBAWpBd,KAAKM,UAAUS,KAAO,kBACXN,KAAKO,SAShBhB,KAAKM,UAAUW,eAAiB,kBACrBlB,EAAEK,WAAWc,SAASC,WAWjCnB,KAAKM,UAAUc,QAAU,kBACd,GAUXpB,KAAKM,UAAUU,MAAQ,kBACZjB,EAAEsB,QAUbrB,KAAKM,UAAUgB,GAAK,SAASC,KAAMC,cAC1BtB,WAAWoB,GAAGC,KAAMC,UAS7BxB,KAAKM,UAAUmB,oBAAsB,SAASC,iBACrCnB,YAAcmB,YAWvB1B,KAAKM,UAAUqB,SAAW,SAASJ,KAAMK,WAChC1B,WAAW2B,QAAQN,KAAM,CAACK,QASnC5B,KAAKM,UAAUwB,eAAiB,gBACvBH,SAAS,SAAUlB,OAGwBT"} \ No newline at end of file +{"version":3,"file":"competency_rule.min.js","sources":["../src/competency_rule.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 * Competency rule base module.\n *\n * @module tool_lp/competencyrule\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * Competency rule abstract class.\n *\n * Any competency rule should extend this object. The event 'change' should be\n * triggered on the instance when the configuration has changed. This will allow\n * the components using the rule to gather the config, or check its validity.\n *\n * this._triggerChange();\n *\n * @param {Tree} tree The competency tree.\n */\n var Rule = function(tree) {\n this._eventNode = $('
');\n this._ready = $.Deferred();\n this._tree = tree;\n };\n\n /** @property {Object} The current competency. */\n Rule.prototype._competency = null;\n /** @property {Node} The node we attach the events to. */\n Rule.prototype._eventNode = null;\n /** @property {Promise} Resolved when the object is ready. */\n Rule.prototype._ready = null;\n /** @property {Tree} The competency tree. */\n Rule.prototype._tree = null;\n\n /**\n * Whether or not the current competency can be configured using this rule.\n *\n * @return {Boolean}\n * @method canConfig\n */\n Rule.prototype.canConfig = function() {\n return this._tree.hasChildren(this._competency.id);\n };\n\n /**\n * The config established by this rule.\n *\n * To override in subclasses when relevant.\n *\n * @return {String|null}\n * @method getConfig\n */\n Rule.prototype.getConfig = function() {\n return null;\n };\n\n // eslint-disable-line valid-jsdoc\n /**\n * Return the type of the module.\n *\n * @return {String}\n * @method getType\n */\n // eslint-enable-line valid-jsdoc\n Rule.prototype.getType = function() {\n throw new Error('Not implemented');\n };\n\n /**\n * The init process.\n *\n * Do not override this, instead override _load.\n *\n * @return {Promise} Revoled when the plugin is initialised.\n * @method init\n */\n Rule.prototype.init = function() {\n return this._load();\n };\n\n /**\n * Callback to inject the template.\n *\n * @returns {Promise} Resolved when done.\n * @method injectTemplate\n */\n Rule.prototype.injectTemplate = function() {\n return $.Deferred().reject().promise();\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * Plugins should override this.\n *\n * @return {Boolean}\n * @method _isValid\n */\n Rule.prototype.isValid = function() {\n return false;\n };\n\n /**\n * Load the class.\n *\n * @return {Promise}\n * @method _load\n * @protected\n */\n Rule.prototype._load = function() {\n return $.when();\n };\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n Rule.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Sets the current competency.\n *\n * @param {Competency} competency\n * @method setTargetCompetency\n */\n Rule.prototype.setTargetCompetency = function(competency) {\n this._competency = competency;\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _trigger\n * @protected\n */\n Rule.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n /**\n * Trigger the change event.\n *\n * @method _triggerChange\n * @protected\n */\n Rule.prototype._triggerChange = function() {\n this._trigger('change', this);\n };\n\n return /** @alias module:tool_lp/competency_rule */ Rule;\n\n});\n"],"names":["define","$","Rule","tree","this","_eventNode","_ready","Deferred","_tree","prototype","_competency","canConfig","hasChildren","id","getConfig","getType","Error","init","_load","injectTemplate","reject","promise","isValid","when","on","type","handler","setTargetCompetency","competency","_trigger","data","trigger","_triggerChange"],"mappings":";;;;;;;AAuBAA,iCAAO,CAAC,WAAW,SAASC,GAaxB,IAAIC,KAAO,SAASC,MAChBC,KAAKC,WAAaJ,EAAE,SACpBG,KAAKE,OAASL,EAAEM,WACXC,KAAAA,MAAQL,IAChB,EAqID,OAlIAD,KAAKO,UAAUC,YAAc,KAE7BR,KAAKO,UAAUJ,WAAa,KAE5BH,KAAKO,UAAUH,OAAS,KAExBJ,KAAKO,UAAUD,MAAQ,KAQvBN,KAAKO,UAAUE,UAAY,WAChB,OAAAP,KAAKI,MAAMI,YAAYR,KAAKM,YAAYG,GAClD,EAUDX,KAAKO,UAAUK,UAAY,WACvB,OAAO,IACV,EAUDZ,KAAKO,UAAUM,QAAU,WACrB,MAAM,IAAIC,MAAM,kBACnB,EAUDd,KAAKO,UAAUQ,KAAO,WACX,OAAAb,KAAKc,OACf,EAQDhB,KAAKO,UAAUU,eAAiB,WAC5B,OAAOlB,EAAEM,WAAWa,SAASC,SAChC,EAUDnB,KAAKO,UAAUa,QAAU,WACrB,OAAO,CACV,EASDpB,KAAKO,UAAUS,MAAQ,WACZjB,OAAAA,EAAEsB,MACZ,EASDrB,KAAKO,UAAUe,GAAK,SAASC,KAAMC,SAC/BtB,KAAKC,WAAWmB,GAAGC,KAAMC,QAC5B,EAQDxB,KAAKO,UAAUkB,oBAAsB,SAASC,YACrClB,KAAAA,YAAckB,UACtB,EAUD1B,KAAKO,UAAUoB,SAAW,SAASJ,KAAMK,MAChCzB,KAAAA,WAAW0B,QAAQN,KAAM,CAACK,MAClC,EAQD5B,KAAKO,UAAUuB,eAAiB,WAC5B5B,KAAKyB,SAAS,SAAUzB,KAC3B,EAEmDF,IAEvD"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competency_rule_all.min.js.map b/admin/tool/lp/amd/build/competency_rule_all.min.js.map index cb5f90d05f7..cc7b52ebbee 100644 --- a/admin/tool/lp/amd/build/competency_rule_all.min.js.map +++ b/admin/tool/lp/amd/build/competency_rule_all.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competency_rule_all.min.js","sources":["../src/competency_rule_all.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 * Competency rule all module.\n *\n * @module tool_lp/competency_rule_all\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/str',\n 'tool_lp/competency_rule',\n ],\n function($, Str, RuleBase) {\n\n /**\n * Competency rule all class.\n *\n * @class tool_lp/competency_rule_all\n */\n var Rule = function() {\n RuleBase.apply(this, arguments);\n };\n Rule.prototype = Object.create(RuleBase.prototype);\n\n /**\n * Return the type of the module.\n *\n * @return {String}\n * @method getType\n */\n Rule.prototype.getType = function() {\n return 'core_competency\\\\competency_rule_all';\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * @return {Boolean}\n * @method isValid\n */\n Rule.prototype.isValid = function() {\n return true;\n };\n\n return Rule;\n});\n"],"names":["define","$","Str","RuleBase","Rule","apply","this","arguments","prototype","Object","create","getType","isValid"],"mappings":";;;;;;;AAuBAA,qCAAO,CAAC,SACA,WACA,4BAEA,SAASC,EAAGC,IAAKC,cAOjBC,KAAO,WACPD,SAASE,MAAMC,KAAMC,mBAEzBH,KAAKI,UAAYC,OAAOC,OAAOP,SAASK,YAQzBG,QAAU,iBACd,wCASXP,KAAKI,UAAUI,QAAU,kBACd,GAGJR"} \ No newline at end of file +{"version":3,"file":"competency_rule_all.min.js","sources":["../src/competency_rule_all.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 * Competency rule all module.\n *\n * @module tool_lp/competency_rule_all\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/str',\n 'tool_lp/competency_rule',\n ],\n function($, Str, RuleBase) {\n\n /**\n * Competency rule all class.\n *\n * @class tool_lp/competency_rule_all\n */\n var Rule = function() {\n RuleBase.apply(this, arguments);\n };\n Rule.prototype = Object.create(RuleBase.prototype);\n\n /**\n * Return the type of the module.\n *\n * @return {String}\n * @method getType\n */\n Rule.prototype.getType = function() {\n return 'core_competency\\\\competency_rule_all';\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * @return {Boolean}\n * @method isValid\n */\n Rule.prototype.isValid = function() {\n return true;\n };\n\n return Rule;\n});\n"],"names":["define","$","Str","RuleBase","Rule","apply","this","arguments","prototype","Object","create","getType","isValid"],"mappings":";;;;;;;AAuBAA,OAAO,8BAAA,CAAC,SACA,WACA,4BAEA,SAASC,EAAGC,IAAKC,UAOrB,IAAIC,KAAO,WACPD,SAASE,MAAMC,KAAMC,UACxB,EAuBD,OAtBAH,KAAKI,UAAYC,OAAOC,OAAOP,SAASK,YAQzBG,QAAU,WACrB,MAAO,sCACV,EAQDP,KAAKI,UAAUI,QAAU,WACrB,OAAO,CACV,EAEMR,IACV"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competency_rule_points.min.js.map b/admin/tool/lp/amd/build/competency_rule_points.min.js.map index d3583f13916..27179cca82a 100644 --- a/admin/tool/lp/amd/build/competency_rule_points.min.js.map +++ b/admin/tool/lp/amd/build/competency_rule_points.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competency_rule_points.min.js","sources":["../src/competency_rule_points.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 * Competency rule points module.\n *\n * @module tool_lp/competency_rule_all\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/str',\n 'core/templates',\n 'tool_lp/competency_rule',\n ],\n function($, Str, Templates, RuleBase) {\n\n /**\n * Competency rule points class.\n */\n var Rule = function() {\n RuleBase.apply(this, arguments);\n };\n Rule.prototype = Object.create(RuleBase.prototype);\n\n /** @property {Node} Reference to the container in which the template was included. */\n Rule.prototype._container = null;\n /** @property {Boolean} Whether or not the template was included. */\n Rule.prototype._templateLoaded = false;\n\n /**\n * The config established by this rule.\n *\n * @return {String}\n * @method getConfig\n */\n Rule.prototype.getConfig = function() {\n return JSON.stringify({\n base: {\n points: this._getRequiredPoints(),\n },\n competencies: this._getCompetenciesConfig()\n });\n };\n\n /**\n * Gathers the input provided by the user for competencies.\n *\n * @return {Array} Containing id, points and required.\n * @method _getCompetenciesConfig\n * @protected\n */\n Rule.prototype._getCompetenciesConfig = function() {\n var competencies = [];\n\n this._container.find('[data-competency]').each(function() {\n var node = $(this),\n id = node.data('competency'),\n points = parseInt(node.find('[name=\"points\"]').val(), 10),\n required = node.find('[name=\"required\"]').prop('checked');\n\n competencies.push({\n id: id,\n points: points,\n required: required ? 1 : 0\n });\n });\n\n return competencies;\n };\n\n /**\n * Fetches the required points set by the user.\n *\n * @return {Number}\n * @method _getRequiredPoints\n * @protected\n */\n Rule.prototype._getRequiredPoints = function() {\n return parseInt(this._container.find('[name=\"requiredpoints\"]').val() || 1, 10);\n };\n\n /**\n * Return the type of the module.\n *\n * @return {String}\n * @method getType\n */\n Rule.prototype.getType = function() {\n return 'core_competency\\\\competency_rule_points';\n };\n\n /**\n * Callback to inject the template.\n *\n * @param {Node} container Node to inject in.\n * @return {Promise} Resolved when done.\n * @method injectTemplate\n */\n Rule.prototype.injectTemplate = function(container) {\n var self = this,\n children = this._tree.getChildren(this._competency.id),\n context,\n config = {\n base: {points: 2},\n competencies: []\n };\n\n this._templateLoaded = false;\n\n // Only pre-load the configuration when the competency is using this rule.\n if (self._competency.ruletype == self.getType()) {\n try {\n config = JSON.parse(self._competency.ruleconfig);\n } catch (e) {\n // eslint-disable-line no-empty\n }\n }\n\n context = {\n requiredpoints: (config && config.base) ? config.base.points : 2,\n competency: self._competency,\n children: []\n };\n\n $.each(children, function(index, child) {\n var competency = {\n id: child.id,\n shortname: child.shortname,\n required: false,\n points: 0\n };\n\n if (config) {\n $.each(config.competencies, function(index, comp) {\n if (comp.id == competency.id) {\n competency.required = comp.required ? true : false;\n competency.points = comp.points;\n }\n });\n }\n\n context.children.push(competency);\n });\n\n return Templates.render('tool_lp/competency_rule_points', context).then(function(html) {\n self._container = container;\n container.html(html);\n container.find('input').change(function() {\n self._triggerChange();\n });\n\n // We're done, let's trigger a change.\n self._templateLoaded = true;\n self._triggerChange();\n return;\n });\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * @return {Boolean}\n * @method isValid\n */\n Rule.prototype.isValid = function() {\n if (!this._templateLoaded) {\n return false;\n }\n\n var required = this._getRequiredPoints(),\n max = 0,\n valid = true;\n\n $.each(this._getCompetenciesConfig(), function(index, competency) {\n if (competency.points < 0) {\n valid = false;\n }\n max += competency.points;\n });\n\n valid = valid && max >= required;\n return valid;\n };\n\n return Rule;\n});\n"],"names":["define","$","Str","Templates","RuleBase","Rule","apply","this","arguments","prototype","Object","create","_container","_templateLoaded","getConfig","JSON","stringify","base","points","_getRequiredPoints","competencies","_getCompetenciesConfig","find","each","node","id","data","parseInt","val","required","prop","push","getType","injectTemplate","container","context","self","children","_tree","getChildren","_competency","config","ruletype","parse","ruleconfig","e","requiredpoints","competency","index","child","shortname","comp","render","then","html","change","_triggerChange","isValid","max","valid"],"mappings":";;;;;;;AAuBAA,wCAAO,CAAC,SACA,WACA,iBACA,4BAEA,SAASC,EAAGC,IAAKC,UAAWC,cAK5BC,KAAO,WACPD,SAASE,MAAMC,KAAMC,mBAEzBH,KAAKI,UAAYC,OAAOC,OAAOP,SAASK,YAGzBG,WAAa,KAE5BP,KAAKI,UAAUI,iBAAkB,EAQjCR,KAAKI,UAAUK,UAAY,kBAChBC,KAAKC,UAAU,CAClBC,KAAM,CACFC,OAAQX,KAAKY,sBAEjBC,aAAcb,KAAKc,4BAW3BhB,KAAKI,UAAUY,uBAAyB,eAChCD,aAAe,eAEdR,WAAWU,KAAK,qBAAqBC,MAAK,eACvCC,KAAOvB,EAAEM,MACTkB,GAAKD,KAAKE,KAAK,cACfR,OAASS,SAASH,KAAKF,KAAK,mBAAmBM,MAAO,IACtDC,SAAWL,KAAKF,KAAK,qBAAqBQ,KAAK,WAEnDV,aAAaW,KAAK,CACdN,GAAIA,GACJP,OAAQA,OACRW,SAAUA,SAAW,EAAI,OAI1BT,cAUXf,KAAKI,UAAUU,mBAAqB,kBACzBQ,SAASpB,KAAKK,WAAWU,KAAK,2BAA2BM,OAAS,EAAG,KAShFvB,KAAKI,UAAUuB,QAAU,iBACd,2CAUX3B,KAAKI,UAAUwB,eAAiB,SAASC,eAGjCC,QAFAC,KAAO7B,KACP8B,SAAW9B,KAAK+B,MAAMC,YAAYhC,KAAKiC,YAAYf,IAEnDgB,OAAS,CACLxB,KAAM,CAACC,OAAQ,GACfE,aAAc,YAGjBP,iBAAkB,EAGnBuB,KAAKI,YAAYE,UAAYN,KAAKJ,cAE9BS,OAAS1B,KAAK4B,MAAMP,KAAKI,YAAYI,YACvC,MAAOC,WAKbV,QAAU,CACNW,eAAiBL,QAAUA,OAAOxB,KAAQwB,OAAOxB,KAAKC,OAAS,EAC/D6B,WAAYX,KAAKI,YACjBH,SAAU,IAGdpC,EAAEsB,KAAKc,UAAU,SAASW,MAAOC,WACzBF,WAAa,CACbtB,GAAIwB,MAAMxB,GACVyB,UAAWD,MAAMC,UACjBrB,UAAU,EACVX,OAAQ,GAGRuB,QACAxC,EAAEsB,KAAKkB,OAAOrB,cAAc,SAAS4B,MAAOG,MACpCA,KAAK1B,IAAMsB,WAAWtB,KACtBsB,WAAWlB,WAAWsB,KAAKtB,SAC3BkB,WAAW7B,OAASiC,KAAKjC,WAKrCiB,QAAQE,SAASN,KAAKgB,eAGnB5C,UAAUiD,OAAO,iCAAkCjB,SAASkB,MAAK,SAASC,MAC7ElB,KAAKxB,WAAasB,UAClBA,UAAUoB,KAAKA,MACfpB,UAAUZ,KAAK,SAASiC,QAAO,WAC3BnB,KAAKoB,oBAITpB,KAAKvB,iBAAkB,EACvBuB,KAAKoB,qBAWbnD,KAAKI,UAAUgD,QAAU,eAChBlD,KAAKM,uBACC,MAGPgB,SAAWtB,KAAKY,qBAChBuC,IAAM,EACNC,OAAQ,SAEZ1D,EAAEsB,KAAKhB,KAAKc,0BAA0B,SAAS2B,MAAOD,YAC9CA,WAAW7B,OAAS,IACpByC,OAAQ,GAEZD,KAAOX,WAAW7B,UAGtByC,MAAQA,OAASD,KAAO7B,UAIrBxB"} \ No newline at end of file +{"version":3,"file":"competency_rule_points.min.js","sources":["../src/competency_rule_points.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 * Competency rule points module.\n *\n * @module tool_lp/competency_rule_all\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/str',\n 'core/templates',\n 'tool_lp/competency_rule',\n ],\n function($, Str, Templates, RuleBase) {\n\n /**\n * Competency rule points class.\n */\n var Rule = function() {\n RuleBase.apply(this, arguments);\n };\n Rule.prototype = Object.create(RuleBase.prototype);\n\n /** @property {Node} Reference to the container in which the template was included. */\n Rule.prototype._container = null;\n /** @property {Boolean} Whether or not the template was included. */\n Rule.prototype._templateLoaded = false;\n\n /**\n * The config established by this rule.\n *\n * @return {String}\n * @method getConfig\n */\n Rule.prototype.getConfig = function() {\n return JSON.stringify({\n base: {\n points: this._getRequiredPoints(),\n },\n competencies: this._getCompetenciesConfig()\n });\n };\n\n /**\n * Gathers the input provided by the user for competencies.\n *\n * @return {Array} Containing id, points and required.\n * @method _getCompetenciesConfig\n * @protected\n */\n Rule.prototype._getCompetenciesConfig = function() {\n var competencies = [];\n\n this._container.find('[data-competency]').each(function() {\n var node = $(this),\n id = node.data('competency'),\n points = parseInt(node.find('[name=\"points\"]').val(), 10),\n required = node.find('[name=\"required\"]').prop('checked');\n\n competencies.push({\n id: id,\n points: points,\n required: required ? 1 : 0\n });\n });\n\n return competencies;\n };\n\n /**\n * Fetches the required points set by the user.\n *\n * @return {Number}\n * @method _getRequiredPoints\n * @protected\n */\n Rule.prototype._getRequiredPoints = function() {\n return parseInt(this._container.find('[name=\"requiredpoints\"]').val() || 1, 10);\n };\n\n /**\n * Return the type of the module.\n *\n * @return {String}\n * @method getType\n */\n Rule.prototype.getType = function() {\n return 'core_competency\\\\competency_rule_points';\n };\n\n /**\n * Callback to inject the template.\n *\n * @param {Node} container Node to inject in.\n * @return {Promise} Resolved when done.\n * @method injectTemplate\n */\n Rule.prototype.injectTemplate = function(container) {\n var self = this,\n children = this._tree.getChildren(this._competency.id),\n context,\n config = {\n base: {points: 2},\n competencies: []\n };\n\n this._templateLoaded = false;\n\n // Only pre-load the configuration when the competency is using this rule.\n if (self._competency.ruletype == self.getType()) {\n try {\n config = JSON.parse(self._competency.ruleconfig);\n } catch (e) {\n // eslint-disable-line no-empty\n }\n }\n\n context = {\n requiredpoints: (config && config.base) ? config.base.points : 2,\n competency: self._competency,\n children: []\n };\n\n $.each(children, function(index, child) {\n var competency = {\n id: child.id,\n shortname: child.shortname,\n required: false,\n points: 0\n };\n\n if (config) {\n $.each(config.competencies, function(index, comp) {\n if (comp.id == competency.id) {\n competency.required = comp.required ? true : false;\n competency.points = comp.points;\n }\n });\n }\n\n context.children.push(competency);\n });\n\n return Templates.render('tool_lp/competency_rule_points', context).then(function(html) {\n self._container = container;\n container.html(html);\n container.find('input').change(function() {\n self._triggerChange();\n });\n\n // We're done, let's trigger a change.\n self._templateLoaded = true;\n self._triggerChange();\n return;\n });\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * @return {Boolean}\n * @method isValid\n */\n Rule.prototype.isValid = function() {\n if (!this._templateLoaded) {\n return false;\n }\n\n var required = this._getRequiredPoints(),\n max = 0,\n valid = true;\n\n $.each(this._getCompetenciesConfig(), function(index, competency) {\n if (competency.points < 0) {\n valid = false;\n }\n max += competency.points;\n });\n\n valid = valid && max >= required;\n return valid;\n };\n\n return Rule;\n});\n"],"names":["define","$","Str","Templates","RuleBase","Rule","apply","this","arguments","prototype","Object","create","_container","_templateLoaded","getConfig","JSON","stringify","base","points","_getRequiredPoints","competencies","_getCompetenciesConfig","find","each","node","id","data","parseInt","val","required","prop","push","getType","injectTemplate","container","self","context","children","_tree","getChildren","_competency","config","ruletype","parse","ruleconfig","e","requiredpoints","competency","index","child","shortname","comp","render","then","html","change","_triggerChange","isValid","max","valid"],"mappings":";;;;;;;AAuBAA,wCAAO,CAAC,SACA,WACA,iBACA,4BAEA,SAASC,EAAGC,IAAKC,UAAWC,UAKhC,IAAIC,KAAO,WACPD,SAASE,MAAMC,KAAMC,UACxB,EAmKD,OAlKAH,KAAKI,UAAYC,OAAOC,OAAOP,SAASK,YAGzBG,WAAa,KAE5BP,KAAKI,UAAUI,iBAAkB,EAQjCR,KAAKI,UAAUK,UAAY,WAChBC,OAAAA,KAAKC,UAAU,CAClBC,KAAM,CACFC,OAAQX,KAAKY,sBAEjBC,aAAcb,KAAKc,0BAE1B,EASDhB,KAAKI,UAAUY,uBAAyB,WAChCD,IAAAA,aAAe,GAenB,OAbKR,KAAAA,WAAWU,KAAK,qBAAqBC,MAAK,WAC3C,IAAIC,KAAOvB,EAAEM,MACTkB,GAAKD,KAAKE,KAAK,cACfR,OAASS,SAASH,KAAKF,KAAK,mBAAmBM,MAAO,IACtDC,SAAWL,KAAKF,KAAK,qBAAqBQ,KAAK,WAEnDV,aAAaW,KAAK,CACdN,GAAIA,GACJP,OAAQA,OACRW,SAAUA,SAAW,EAAI,GAEhC,IAEMT,YACV,EASDf,KAAKI,UAAUU,mBAAqB,WAChC,OAAOQ,SAASpB,KAAKK,WAAWU,KAAK,2BAA2BM,OAAS,EAAG,GAC/E,EAQDvB,KAAKI,UAAUuB,QAAU,WACrB,MAAO,yCACV,EASD3B,KAAKI,UAAUwB,eAAiB,SAASC,WACjCC,IAEAC,QAFAD,KAAO5B,KACP8B,SAAW9B,KAAK+B,MAAMC,YAAYhC,KAAKiC,YAAYf,IAEnDgB,OAAS,CACLxB,KAAM,CAACC,OAAQ,GACfE,aAAc,IAMlBe,GAHCtB,KAAAA,iBAAkB,EAGnBsB,KAAKK,YAAYE,UAAYP,KAAKH,UAC9B,IACAS,OAAS1B,KAAK4B,MAAMR,KAAKK,YAAYI,WACxC,CAAC,MAAOC,GAER,CA6BL,OA1BAT,QAAU,CACNU,eAAiBL,QAAUA,OAAOxB,KAAQwB,OAAOxB,KAAKC,OAAS,EAC/D6B,WAAYZ,KAAKK,YACjBH,SAAU,IAGdpC,EAAEsB,KAAKc,UAAU,SAASW,MAAOC,OAC7B,IAAIF,WAAa,CACbtB,GAAIwB,MAAMxB,GACVyB,UAAWD,MAAMC,UACjBrB,UAAU,EACVX,OAAQ,GAGRuB,QACAxC,EAAEsB,KAAKkB,OAAOrB,cAAc,SAAS4B,MAAOG,MACpCA,KAAK1B,IAAMsB,WAAWtB,KACtBsB,WAAWlB,WAAWsB,KAAKtB,SAC3BkB,WAAW7B,OAASiC,KAAKjC,OAEhC,IAGLkB,QAAQC,SAASN,KAAKgB,WACzB,IAEM5C,UAAUiD,OAAO,iCAAkChB,SAASiB,MAAK,SAASC,MAC7EnB,KAAKvB,WAAasB,UAClBA,UAAUoB,KAAKA,MACfpB,UAAUZ,KAAK,SAASiC,QAAO,WAC3BpB,KAAKqB,gBACR,IAGDrB,KAAKtB,iBAAkB,EACvBsB,KAAKqB,gBAER,GACJ,EAQDnD,KAAKI,UAAUgD,QAAU,WACjB,IAAClD,KAAKM,gBACN,OAAO,EAGX,IAAIgB,SAAWtB,KAAKY,qBAChBuC,IAAM,EACNC,OAAQ,EAUZ,OARA1D,EAAEsB,KAAKhB,KAAKc,0BAA0B,SAAS2B,MAAOD,YAC9CA,WAAW7B,OAAS,IACpByC,OAAQ,GAEZD,KAAOX,WAAW7B,MACrB,IAEDyC,MAAQA,OAASD,KAAO7B,QAE3B,EAEMxB,IACV"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencyactions.min.js.map b/admin/tool/lp/amd/build/competencyactions.min.js.map index b495936cebc..f18e7bb3f12 100644 --- a/admin/tool/lp/amd/build/competencyactions.min.js.map +++ b/admin/tool/lp/amd/build/competencyactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competencyactions.min.js","sources":["../src/competencyactions.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 * Handle selection changes and actions on the competency tree.\n *\n * @module tool_lp/competencyactions\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/url',\n 'core/templates',\n 'core/notification',\n 'core/str',\n 'core/ajax',\n 'tool_lp/dragdrop-reorder',\n 'tool_lp/tree',\n 'tool_lp/dialogue',\n 'tool_lp/menubar',\n 'tool_lp/competencypicker',\n 'tool_lp/competency_outcomes',\n 'tool_lp/competencyruleconfig',\n 'core/pending',\n ],\n function(\n $, url, templates, notification, str, ajax, dragdrop, Ariatree, Dialogue, menubar, Picker, Outcomes, RuleConfig, Pending\n ) {\n\n // Private variables and functions.\n /** @var {Object} treeModel - This is an object representing the nodes in the tree. */\n var treeModel = null;\n /** @var {Node} moveSource - The start of a drag operation */\n var moveSource = null;\n /** @var {Node} moveTarget - The end of a drag operation */\n var moveTarget = null;\n /** @var {Number} pageContextId The page context ID. */\n var pageContextId;\n /** @var {Object} Picker instance. */\n var pickerInstance;\n /** @var {Object} Rule config instance. */\n var ruleConfigInstance;\n /** @var {Object} The competency we're picking a relation to. */\n var relatedTarget;\n /** @var {Object} Taxonomy constants indexed per level. */\n var taxonomiesConstants;\n /** @var {Array} The rules modules. Values are object containing type, namd and amd. */\n var rulesModules;\n /** @var {Number} the selected competency ID. */\n var selectedCompetencyId = null;\n\n /**\n * Respond to choosing the \"Add\" menu item for the selected node in the tree.\n * @method addHandler\n */\n var addHandler = function() {\n var parent = $('[data-region=\"competencyactions\"]').data('competency');\n\n var params = {\n competencyframeworkid: treeModel.getCompetencyFrameworkId(),\n pagecontextid: pageContextId\n };\n\n if (parent !== null) {\n // We are adding at a sub node.\n params.parentid = parent.id;\n }\n\n var relocate = function() {\n var queryparams = $.param(params);\n window.location = url.relativeUrl('/admin/tool/lp/editcompetency.php?' + queryparams);\n };\n\n if (parent !== null && treeModel.hasRule(parent.id)) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'addingcompetencywillresetparentrule', component: 'tool_lp', param: parent.shortname},\n {key: 'yes', component: 'core'},\n {key: 'no', component: 'core'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0],\n strings[1],\n strings[2],\n strings[3],\n relocate\n );\n }).fail(notification.exception);\n } else {\n relocate();\n }\n };\n\n /**\n * A source and destination has been chosen - so time to complete a move.\n * @method doMove\n */\n var doMove = function() {\n var frameworkid = $('[data-region=\"filtercompetencies\"]').data('frameworkid');\n var requests = ajax.call([{\n methodname: 'core_competency_set_parent_competency',\n args: {competencyid: moveSource, parentid: moveTarget}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: frameworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Confirms a competency move.\n *\n * @method confirmMove\n */\n var confirmMove = function() {\n moveTarget = typeof moveTarget === \"undefined\" ? 0 : moveTarget;\n if (moveTarget == moveSource) {\n // No move to do.\n return;\n }\n\n var targetComp = treeModel.getCompetency(moveTarget) || {},\n sourceComp = treeModel.getCompetency(moveSource) || {},\n confirmMessage = 'movecompetencywillresetrules',\n showConfirm = false;\n\n // We shouldn't be moving the competency to the same parent.\n if (sourceComp.parentid == moveTarget) {\n return;\n }\n\n // If we are moving to a child of self.\n if (targetComp.path && targetComp.path.indexOf('/' + sourceComp.id + '/') >= 0) {\n confirmMessage = 'movecompetencytochildofselfwillresetrules';\n\n // Show a confirmation if self has rules, as they'll disappear.\n showConfirm = showConfirm || treeModel.hasRule(sourceComp.id);\n }\n\n // Show a confirmation if the current parent, or the destination have rules.\n showConfirm = showConfirm || (treeModel.hasRule(targetComp.id) || treeModel.hasRule(sourceComp.parentid));\n\n // Show confirm, and/or do the things.\n if (showConfirm) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: confirmMessage, component: 'tool_lp'},\n {key: 'yes', component: 'moodle'},\n {key: 'no', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete competency X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doMove\n );\n }).fail(notification.exception);\n\n } else {\n doMove();\n }\n };\n\n /**\n * A move competency popup was opened - initialise the aria tree in it.\n * @method initMovePopup\n * @param {dialogue} popup The tool_lp/dialogue that was created.\n */\n var initMovePopup = function(popup) {\n var body = $(popup.getContent());\n var treeRoot = body.find('[data-enhance=movetree]');\n var tree = new Ariatree(treeRoot, false);\n tree.on('selectionchanged', function(evt, params) {\n var target = params.selected;\n moveTarget = $(target).data('id');\n });\n treeRoot.show();\n\n body.on('click', '[data-action=\"move\"]', function() {\n popup.close();\n confirmMove();\n });\n body.on('click', '[data-action=\"cancel\"]', function() {\n popup.close();\n });\n };\n\n /**\n * Turn a flat list of competencies into a tree structure (recursive).\n * @method addCompetencyChildren\n * @param {Object} parent The current parent node in the tree\n * @param {Object[]} competencies The flat list of competencies\n */\n var addCompetencyChildren = function(parent, competencies) {\n var i;\n\n for (i = 0; i < competencies.length; i++) {\n if (competencies[i].parentid == parent.id) {\n parent.haschildren = true;\n competencies[i].children = [];\n competencies[i].haschildren = false;\n parent.children[parent.children.length] = competencies[i];\n addCompetencyChildren(competencies[i], competencies);\n }\n }\n };\n\n /**\n * A node was chosen and \"Move\" was selected from the menu. Open a popup to select the target.\n * @param {Event} e\n * @method moveHandler\n */\n var moveHandler = function(e) {\n e.preventDefault();\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n // Remember what we are moving.\n moveSource = competency.id;\n\n // Load data for the template.\n var requests = ajax.call([\n {\n methodname: 'core_competency_search_competencies',\n args: {\n competencyframeworkid: competency.competencyframeworkid,\n searchtext: ''\n }\n }, {\n methodname: 'core_competency_read_competency_framework',\n args: {\n id: competency.competencyframeworkid\n }\n }\n ]);\n\n // When all data has arrived, continue.\n $.when.apply(null, requests).done(function(competencies, framework) {\n\n // Expand the list of competencies into a tree.\n var i;\n var competenciestree = [];\n for (i = 0; i < competencies.length; i++) {\n var onecompetency = competencies[i];\n if (onecompetency.parentid == \"0\") {\n onecompetency.children = [];\n onecompetency.haschildren = 0;\n competenciestree[competenciestree.length] = onecompetency;\n addCompetencyChildren(onecompetency, competencies);\n }\n }\n\n str.get_strings([\n {key: 'movecompetency', component: 'tool_lp', param: competency.shortname},\n {key: 'move', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n\n var context = {\n framework: framework,\n competencies: competenciestree\n };\n\n templates.render('tool_lp/competencies_move_tree', context)\n .done(function(tree) {\n new Dialogue(\n strings[0], // Move competency x.\n tree, // The move tree.\n initMovePopup\n );\n\n }).fail(notification.exception);\n\n }).fail(notification.exception);\n\n }).fail(notification.exception);\n\n };\n\n /**\n * Edit the selected competency.\n * @method editHandler\n */\n var editHandler = function() {\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n var params = {\n competencyframeworkid: treeModel.getCompetencyFrameworkId(),\n id: competency.id,\n parentid: competency.parentid,\n pagecontextid: pageContextId\n };\n\n var queryparams = $.param(params);\n window.location = url.relativeUrl('/admin/tool/lp/editcompetency.php?' + queryparams);\n };\n\n /**\n * Re-render the page with the latest data.\n * @param {Object} context\n * @method reloadPage\n */\n var reloadPage = function(context) {\n templates.render('tool_lp/manage_competencies_page', context)\n .done(function(newhtml, newjs) {\n $('[data-region=\"managecompetencies\"]').replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n })\n .fail(notification.exception);\n };\n\n /**\n * Perform a search and render the page with the new search results.\n * @param {Event} e\n * @method updateSearchHandler\n */\n var updateSearchHandler = function(e) {\n e.preventDefault();\n\n var frameworkid = $('[data-region=\"filtercompetencies\"]').data('frameworkid');\n\n var requests = ajax.call([{\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: frameworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[0].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Move a competency \"up\". This only affects the sort order within the same branch of the tree.\n * @method moveUpHandler\n */\n var moveUpHandler = function() {\n // We are chaining ajax requests here.\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var requests = ajax.call([{\n methodname: 'core_competency_move_up_competency',\n args: {id: competency.id}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: competency.competencyframeworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Move a competency \"down\". This only affects the sort order within the same branch of the tree.\n * @method moveDownHandler\n */\n var moveDownHandler = function() {\n // We are chaining ajax requests here.\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var requests = ajax.call([{\n methodname: 'core_competency_move_down_competency',\n args: {id: competency.id}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: competency.competencyframeworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Open a dialogue to show all the courses using the selected competency.\n * @method seeCoursesHandler\n */\n var seeCoursesHandler = function() {\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n var requests = ajax.call([{\n methodname: 'tool_lp_list_courses_using_competency',\n args: {id: competency.id}\n }]);\n\n requests[0].done(function(courses) {\n var context = {\n courses: courses\n };\n templates.render('tool_lp/linked_courses_summary', context).done(function(html) {\n str.get_string('linkedcourses', 'tool_lp').done(function(linkedcourses) {\n new Dialogue(\n linkedcourses, // Title.\n html, // The linked courses.\n initMovePopup\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Open a competencies popup to relate competencies.\n *\n * @method relateCompetenciesHandler\n */\n var relateCompetenciesHandler = function() {\n relatedTarget = $('[data-region=\"competencyactions\"]').data('competency');\n\n if (!pickerInstance) {\n pickerInstance = new Picker(pageContextId, relatedTarget.competencyframeworkid);\n pickerInstance.on('save', function(e, data) {\n var pendingPromise = new Pending();\n var compIds = data.competencyIds;\n\n var calls = [];\n $.each(compIds, function(index, value) {\n calls.push({\n methodname: 'core_competency_add_related_competency',\n args: {competencyid: value, relatedcompetencyid: relatedTarget.id}\n });\n });\n\n calls.push({\n methodname: 'tool_lp_data_for_related_competencies_section',\n args: {competencyid: relatedTarget.id}\n });\n\n var promises = ajax.call(calls);\n\n promises[calls.length - 1].then(function(context) {\n return templates.render('tool_lp/related_competencies', context);\n }).then(function(html, js) {\n $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n templates.runTemplateJS(js);\n updatedRelatedCompetencies();\n return;\n })\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n });\n }\n\n pickerInstance.setDisallowedCompetencyIDs([relatedTarget.id]);\n pickerInstance.display();\n };\n\n var ruleConfigHandler = function(e) {\n e.preventDefault();\n relatedTarget = $('[data-region=\"competencyactions\"]').data('competency');\n ruleConfigInstance.setTargetCompetencyId(relatedTarget.id);\n ruleConfigInstance.display();\n };\n\n var ruleConfigSaveHandler = function(e, config) {\n var update = {\n id: relatedTarget.id,\n shortname: relatedTarget.shortname,\n idnumber: relatedTarget.idnumber,\n description: relatedTarget.description,\n descriptionformat: relatedTarget.descriptionformat,\n ruletype: config.ruletype,\n ruleoutcome: config.ruleoutcome,\n ruleconfig: config.ruleconfig\n };\n var promise = ajax.call([{\n methodname: 'core_competency_update_competency',\n args: {competency: update}\n }]);\n promise[0].then(function(result) {\n if (result) {\n relatedTarget.ruletype = config.ruletype;\n relatedTarget.ruleoutcome = config.ruleoutcome;\n relatedTarget.ruleconfig = config.ruleconfig;\n renderCompetencySummary(relatedTarget);\n }\n return;\n }).catch(notification.exception);\n };\n\n /**\n * Delete a competency.\n * @method doDelete\n */\n var doDelete = function() {\n // We are chaining ajax requests here.\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var requests = ajax.call([{\n methodname: 'core_competency_delete_competency',\n args: {id: competency.id}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: competency.competencyframeworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[0].done(function(success) {\n if (success === false) {\n str.get_strings([\n {key: 'competencycannotbedeleted', component: 'tool_lp', param: competency.shortname},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.alert(\n null,\n strings[0]\n );\n }).fail(notification.exception);\n }\n }).fail(notification.exception);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Show a confirm dialogue before deleting a competency.\n * @method deleteCompetencyHandler\n */\n var deleteCompetencyHandler = function() {\n var competency = $('[data-region=\"competencyactions\"]').data('competency'),\n confirmMessage = 'deletecompetency';\n\n if (treeModel.hasRule(competency.parentid)) {\n confirmMessage = 'deletecompetencyparenthasrule';\n }\n\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: confirmMessage, component: 'tool_lp', param: competency.shortname},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete competency X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doDelete\n );\n }).fail(notification.exception);\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dragStart\n * @param {Event} e\n */\n var dragStart = function(e) {\n e.originalEvent.dataTransfer.setData('text', $(e.target).parent().data('id'));\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method allowDrop\n * @param {Event} e\n */\n var allowDrop = function(e) {\n e.originalEvent.dataTransfer.dropEffect = 'move';\n e.preventDefault();\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dragEnter\n * @param {Event} e\n */\n var dragEnter = function(e) {\n e.preventDefault();\n $(this).addClass('currentdragtarget');\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dragLeave\n * @param {Event} e\n */\n var dragLeave = function(e) {\n e.preventDefault();\n $(this).removeClass('currentdragtarget');\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dropOver\n * @param {Event} e\n */\n var dropOver = function(e) {\n e.preventDefault();\n moveSource = e.originalEvent.dataTransfer.getData('text');\n moveTarget = $(e.target).parent().data('id');\n $(this).removeClass('currentdragtarget');\n\n confirmMove();\n };\n\n /**\n * Deletes a related competency without confirmation.\n *\n * @param {Event} e The event that triggered the action.\n * @method deleteRelatedHandler\n */\n var deleteRelatedHandler = function(e) {\n e.preventDefault();\n\n var relatedid = this.id.substr(11);\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var removeRelated = ajax.call([\n {methodname: 'core_competency_remove_related_competency',\n args: {relatedcompetencyid: relatedid, competencyid: competency.id}},\n {methodname: 'tool_lp_data_for_related_competencies_section',\n args: {competencyid: competency.id}}\n ]);\n\n removeRelated[1].done(function(context) {\n templates.render('tool_lp/related_competencies', context).done(function(html) {\n $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n updatedRelatedCompetencies();\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Updates the competencies list (with relations) and add listeners.\n *\n * @method updatedRelatedCompetencies\n */\n var updatedRelatedCompetencies = function() {\n\n // Listeners to newly loaded related competencies.\n $('[data-action=\"deleterelation\"]').on('click', deleteRelatedHandler);\n\n };\n\n /**\n * Log the competency viewed event.\n *\n * @param {Object} competency The competency.\n * @method triggerCompetencyViewedEvent\n */\n var triggerCompetencyViewedEvent = function(competency) {\n if (competency.id !== selectedCompetencyId) {\n // Set the selected competency id.\n selectedCompetencyId = competency.id;\n ajax.call([{\n methodname: 'core_competency_competency_viewed',\n args: {id: competency.id}\n }]);\n }\n };\n\n /**\n * Return the taxonomy constant for a level.\n *\n * @param {Number} level The level.\n * @return {String}\n * @function getTaxonomyAtLevel\n */\n var getTaxonomyAtLevel = function(level) {\n var constant = taxonomiesConstants[level];\n if (!constant) {\n constant = 'competency';\n }\n return constant;\n };\n\n /**\n * Render the competency summary.\n *\n * @param {Object} competency The competency.\n */\n var renderCompetencySummary = function(competency) {\n var promise = $.Deferred().resolve().promise(),\n context = {};\n\n context.competency = competency;\n context.showdeleterelatedaction = true;\n context.showrelatedcompetencies = true;\n context.showrule = false;\n context.pluginbaseurl = url.relativeUrl('/admin/tool/lp');\n\n if (competency.ruleoutcome != Outcomes.NONE) {\n // Get the outcome and rule name.\n promise = Outcomes.getString(competency.ruleoutcome).then(function(str) {\n var name;\n $.each(rulesModules, function(index, modInfo) {\n if (modInfo.type == competency.ruletype) {\n name = modInfo.name;\n }\n });\n return [str, name];\n });\n }\n\n promise.then(function(strs) {\n if (typeof strs !== 'undefined') {\n context.showrule = true;\n context.rule = {\n outcome: strs[0],\n type: strs[1]\n };\n }\n return context;\n }).then(function(context) {\n return templates.render('tool_lp/competency_summary', context);\n }).then(function(html) {\n $('[data-region=\"competencyinfo\"]').html(html);\n $('[data-action=\"deleterelation\"]').on('click', deleteRelatedHandler);\n return templates.render('tool_lp/loading', {});\n }).then(function(html, js) {\n templates.replaceNodeContents('[data-region=\"relatedcompetencies\"]', html, js);\n return ajax.call([{\n methodname: 'tool_lp_data_for_related_competencies_section',\n args: {competencyid: competency.id}\n }])[0];\n }).then(function(context) {\n return templates.render('tool_lp/related_competencies', context);\n }).then(function(html, js) {\n $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n templates.runTemplateJS(js);\n updatedRelatedCompetencies();\n return;\n }).catch(notification.exception);\n };\n\n /**\n * Return the string \"Add \".\n *\n * @param {Number} level The level.\n * @return {String}\n * @function strAddTaxonomy\n */\n var strAddTaxonomy = function(level) {\n return str.get_string('taxonomy_add_' + getTaxonomyAtLevel(level), 'tool_lp');\n };\n\n /**\n * Return the string \"Selected \".\n *\n * @param {Number} level The level.\n * @return {String}\n * @function strSelectedTaxonomy\n */\n var strSelectedTaxonomy = function(level) {\n return str.get_string('taxonomy_selected_' + getTaxonomyAtLevel(level), 'tool_lp');\n };\n\n /**\n * Handler when a node in the aria tree is selected.\n * @method selectionChanged\n * @param {Event} evt The event that triggered the selection change.\n * @param {Object} params The parameters for the event. Contains a list of selected nodes.\n * @return {Boolean}\n */\n var selectionChanged = function(evt, params) {\n var node = params.selected,\n id = $(node).data('id'),\n btn = $('[data-region=\"competencyactions\"] [data-action=\"add\"]'),\n actionMenu = $('[data-region=\"competencyactionsmenu\"]'),\n selectedTitle = $('[data-region=\"selected-competency\"]'),\n level = 0,\n sublevel = 1;\n\n menubar.closeAll();\n\n if (typeof id === \"undefined\") {\n // Assume this is the root of the tree.\n // Here we are only getting the text from the top of the tree, to do it we clone the tree,\n // remove all children and then call text on the result.\n $('[data-region=\"competencyinfo\"]').html(node.clone().children().remove().end().text());\n $('[data-region=\"competencyactions\"]').data('competency', null);\n actionMenu.hide();\n\n } else {\n var competency = treeModel.getCompetency(id);\n\n level = treeModel.getCompetencyLevel(id);\n sublevel = level + 1;\n\n actionMenu.show();\n $('[data-region=\"competencyactions\"]').data('competency', competency);\n renderCompetencySummary(competency);\n // Log Competency viewed event.\n triggerCompetencyViewedEvent(competency);\n }\n strSelectedTaxonomy(level).then(function(str) {\n selectedTitle.text(str);\n return;\n }).catch(notification.exception);\n\n strAddTaxonomy(sublevel).then(function(str) {\n btn.show()\n .find('[data-region=\"term\"]')\n .text(str);\n return;\n }).catch(notification.exception);\n\n // We handled this event so consume it.\n evt.preventDefault();\n return false;\n };\n\n /**\n * Return the string \"Selected \".\n *\n * @function parseTaxonomies\n * @param {String} taxonomiesstr Comma separated list of taxonomies.\n * @return {Array} of level => taxonomystr\n */\n var parseTaxonomies = function(taxonomiesstr) {\n var all = taxonomiesstr.split(',');\n all.unshift(\"\");\n delete all[0];\n\n // Note we don't need to fill holes, because other functions check for empty anyway.\n return all;\n };\n\n return {\n /**\n * Initialise this page (attach event handlers etc).\n *\n * @method init\n * @param {Object} model The tree model provides some useful functions for loading and searching competencies.\n * @param {Number} pagectxid The page context ID.\n * @param {Object} taxonomies Constants indexed by level.\n * @param {Object} rulesMods The modules of the rules.\n */\n init: function(model, pagectxid, taxonomies, rulesMods) {\n treeModel = model;\n pageContextId = pagectxid;\n taxonomiesConstants = parseTaxonomies(taxonomies);\n rulesModules = rulesMods;\n\n $('[data-region=\"competencyactions\"] [data-action=\"add\"]').on('click', addHandler);\n\n menubar.enhance('.competencyactionsmenu', {\n '[data-action=\"edit\"]': editHandler,\n '[data-action=\"delete\"]': deleteCompetencyHandler,\n '[data-action=\"move\"]': moveHandler,\n '[data-action=\"moveup\"]': moveUpHandler,\n '[data-action=\"movedown\"]': moveDownHandler,\n '[data-action=\"linkedcourses\"]': seeCoursesHandler,\n '[data-action=\"relatedcompetencies\"]': relateCompetenciesHandler.bind(this),\n '[data-action=\"competencyrules\"]': ruleConfigHandler.bind(this)\n });\n $('[data-region=\"competencyactionsmenu\"]').hide();\n $('[data-region=\"competencyactions\"] [data-action=\"add\"]').hide();\n\n $('[data-region=\"filtercompetencies\"]').on('submit', updateSearchHandler);\n // Simple html5 drag drop because we already added an accessible alternative.\n var top = $('[data-region=\"managecompetencies\"] [data-enhance=\"tree\"]');\n top.on('dragstart', 'li>span', dragStart)\n .on('dragover', 'li>span', allowDrop)\n .on('dragenter', 'li>span', dragEnter)\n .on('dragleave', 'li>span', dragLeave)\n .on('drop', 'li>span', dropOver);\n\n model.on('selectionchanged', selectionChanged);\n\n // Prepare the configuration tool.\n ruleConfigInstance = new RuleConfig(treeModel, rulesModules);\n ruleConfigInstance.on('save', ruleConfigSaveHandler.bind(this));\n }\n };\n});\n"],"names":["define","$","url","templates","notification","str","ajax","dragdrop","Ariatree","Dialogue","menubar","Picker","Outcomes","RuleConfig","Pending","pageContextId","pickerInstance","ruleConfigInstance","relatedTarget","taxonomiesConstants","rulesModules","treeModel","moveSource","moveTarget","selectedCompetencyId","addHandler","parent","data","params","competencyframeworkid","getCompetencyFrameworkId","pagecontextid","parentid","id","relocate","queryparams","param","window","location","relativeUrl","hasRule","get_strings","key","component","shortname","done","strings","confirm","fail","exception","doMove","frameworkid","call","methodname","args","competencyid","search","val","reloadPage","confirmMove","targetComp","getCompetency","sourceComp","confirmMessage","showConfirm","path","indexOf","initMovePopup","popup","body","getContent","treeRoot","find","on","evt","target","selected","show","close","addCompetencyChildren","competencies","i","length","haschildren","children","moveHandler","e","preventDefault","competency","requests","searchtext","when","apply","framework","competenciestree","onecompetency","context","render","tree","editHandler","newhtml","newjs","replaceWith","runTemplateJS","updateSearchHandler","moveUpHandler","moveDownHandler","seeCoursesHandler","courses","html","get_string","linkedcourses","relateCompetenciesHandler","pendingPromise","compIds","competencyIds","calls","each","index","value","push","relatedcompetencyid","then","js","updatedRelatedCompetencies","resolve","catch","setDisallowedCompetencyIDs","display","ruleConfigHandler","setTargetCompetencyId","ruleConfigSaveHandler","config","update","idnumber","description","descriptionformat","ruletype","ruleoutcome","ruleconfig","result","renderCompetencySummary","doDelete","success","alert","deleteCompetencyHandler","dragStart","originalEvent","dataTransfer","setData","allowDrop","dropEffect","dragEnter","this","addClass","dragLeave","removeClass","dropOver","getData","deleteRelatedHandler","relatedid","substr","getTaxonomyAtLevel","level","constant","promise","Deferred","showdeleterelatedaction","showrelatedcompetencies","showrule","pluginbaseurl","NONE","getString","name","modInfo","type","strs","rule","outcome","replaceNodeContents","selectionChanged","node","btn","actionMenu","selectedTitle","sublevel","closeAll","clone","remove","end","text","hide","getCompetencyLevel","triggerCompetencyViewedEvent","strSelectedTaxonomy","strAddTaxonomy","init","model","pagectxid","taxonomies","rulesMods","all","split","unshift","enhance","bind"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"competencyactions.min.js","sources":["../src/competencyactions.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 * Handle selection changes and actions on the competency tree.\n *\n * @module tool_lp/competencyactions\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/url',\n 'core/templates',\n 'core/notification',\n 'core/str',\n 'core/ajax',\n 'tool_lp/dragdrop-reorder',\n 'tool_lp/tree',\n 'tool_lp/dialogue',\n 'tool_lp/menubar',\n 'tool_lp/competencypicker',\n 'tool_lp/competency_outcomes',\n 'tool_lp/competencyruleconfig',\n 'core/pending',\n ],\n function(\n $, url, templates, notification, str, ajax, dragdrop, Ariatree, Dialogue, menubar, Picker, Outcomes, RuleConfig, Pending\n ) {\n\n // Private variables and functions.\n /** @var {Object} treeModel - This is an object representing the nodes in the tree. */\n var treeModel = null;\n /** @var {Node} moveSource - The start of a drag operation */\n var moveSource = null;\n /** @var {Node} moveTarget - The end of a drag operation */\n var moveTarget = null;\n /** @var {Number} pageContextId The page context ID. */\n var pageContextId;\n /** @var {Object} Picker instance. */\n var pickerInstance;\n /** @var {Object} Rule config instance. */\n var ruleConfigInstance;\n /** @var {Object} The competency we're picking a relation to. */\n var relatedTarget;\n /** @var {Object} Taxonomy constants indexed per level. */\n var taxonomiesConstants;\n /** @var {Array} The rules modules. Values are object containing type, namd and amd. */\n var rulesModules;\n /** @var {Number} the selected competency ID. */\n var selectedCompetencyId = null;\n\n /**\n * Respond to choosing the \"Add\" menu item for the selected node in the tree.\n * @method addHandler\n */\n var addHandler = function() {\n var parent = $('[data-region=\"competencyactions\"]').data('competency');\n\n var params = {\n competencyframeworkid: treeModel.getCompetencyFrameworkId(),\n pagecontextid: pageContextId\n };\n\n if (parent !== null) {\n // We are adding at a sub node.\n params.parentid = parent.id;\n }\n\n var relocate = function() {\n var queryparams = $.param(params);\n window.location = url.relativeUrl('/admin/tool/lp/editcompetency.php?' + queryparams);\n };\n\n if (parent !== null && treeModel.hasRule(parent.id)) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'addingcompetencywillresetparentrule', component: 'tool_lp', param: parent.shortname},\n {key: 'yes', component: 'core'},\n {key: 'no', component: 'core'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0],\n strings[1],\n strings[2],\n strings[3],\n relocate\n );\n }).fail(notification.exception);\n } else {\n relocate();\n }\n };\n\n /**\n * A source and destination has been chosen - so time to complete a move.\n * @method doMove\n */\n var doMove = function() {\n var frameworkid = $('[data-region=\"filtercompetencies\"]').data('frameworkid');\n var requests = ajax.call([{\n methodname: 'core_competency_set_parent_competency',\n args: {competencyid: moveSource, parentid: moveTarget}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: frameworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Confirms a competency move.\n *\n * @method confirmMove\n */\n var confirmMove = function() {\n moveTarget = typeof moveTarget === \"undefined\" ? 0 : moveTarget;\n if (moveTarget == moveSource) {\n // No move to do.\n return;\n }\n\n var targetComp = treeModel.getCompetency(moveTarget) || {},\n sourceComp = treeModel.getCompetency(moveSource) || {},\n confirmMessage = 'movecompetencywillresetrules',\n showConfirm = false;\n\n // We shouldn't be moving the competency to the same parent.\n if (sourceComp.parentid == moveTarget) {\n return;\n }\n\n // If we are moving to a child of self.\n if (targetComp.path && targetComp.path.indexOf('/' + sourceComp.id + '/') >= 0) {\n confirmMessage = 'movecompetencytochildofselfwillresetrules';\n\n // Show a confirmation if self has rules, as they'll disappear.\n showConfirm = showConfirm || treeModel.hasRule(sourceComp.id);\n }\n\n // Show a confirmation if the current parent, or the destination have rules.\n showConfirm = showConfirm || (treeModel.hasRule(targetComp.id) || treeModel.hasRule(sourceComp.parentid));\n\n // Show confirm, and/or do the things.\n if (showConfirm) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: confirmMessage, component: 'tool_lp'},\n {key: 'yes', component: 'moodle'},\n {key: 'no', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete competency X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doMove\n );\n }).fail(notification.exception);\n\n } else {\n doMove();\n }\n };\n\n /**\n * A move competency popup was opened - initialise the aria tree in it.\n * @method initMovePopup\n * @param {dialogue} popup The tool_lp/dialogue that was created.\n */\n var initMovePopup = function(popup) {\n var body = $(popup.getContent());\n var treeRoot = body.find('[data-enhance=movetree]');\n var tree = new Ariatree(treeRoot, false);\n tree.on('selectionchanged', function(evt, params) {\n var target = params.selected;\n moveTarget = $(target).data('id');\n });\n treeRoot.show();\n\n body.on('click', '[data-action=\"move\"]', function() {\n popup.close();\n confirmMove();\n });\n body.on('click', '[data-action=\"cancel\"]', function() {\n popup.close();\n });\n };\n\n /**\n * Turn a flat list of competencies into a tree structure (recursive).\n * @method addCompetencyChildren\n * @param {Object} parent The current parent node in the tree\n * @param {Object[]} competencies The flat list of competencies\n */\n var addCompetencyChildren = function(parent, competencies) {\n var i;\n\n for (i = 0; i < competencies.length; i++) {\n if (competencies[i].parentid == parent.id) {\n parent.haschildren = true;\n competencies[i].children = [];\n competencies[i].haschildren = false;\n parent.children[parent.children.length] = competencies[i];\n addCompetencyChildren(competencies[i], competencies);\n }\n }\n };\n\n /**\n * A node was chosen and \"Move\" was selected from the menu. Open a popup to select the target.\n * @param {Event} e\n * @method moveHandler\n */\n var moveHandler = function(e) {\n e.preventDefault();\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n // Remember what we are moving.\n moveSource = competency.id;\n\n // Load data for the template.\n var requests = ajax.call([\n {\n methodname: 'core_competency_search_competencies',\n args: {\n competencyframeworkid: competency.competencyframeworkid,\n searchtext: ''\n }\n }, {\n methodname: 'core_competency_read_competency_framework',\n args: {\n id: competency.competencyframeworkid\n }\n }\n ]);\n\n // When all data has arrived, continue.\n $.when.apply(null, requests).done(function(competencies, framework) {\n\n // Expand the list of competencies into a tree.\n var i;\n var competenciestree = [];\n for (i = 0; i < competencies.length; i++) {\n var onecompetency = competencies[i];\n if (onecompetency.parentid == \"0\") {\n onecompetency.children = [];\n onecompetency.haschildren = 0;\n competenciestree[competenciestree.length] = onecompetency;\n addCompetencyChildren(onecompetency, competencies);\n }\n }\n\n str.get_strings([\n {key: 'movecompetency', component: 'tool_lp', param: competency.shortname},\n {key: 'move', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n\n var context = {\n framework: framework,\n competencies: competenciestree\n };\n\n templates.render('tool_lp/competencies_move_tree', context)\n .done(function(tree) {\n new Dialogue(\n strings[0], // Move competency x.\n tree, // The move tree.\n initMovePopup\n );\n\n }).fail(notification.exception);\n\n }).fail(notification.exception);\n\n }).fail(notification.exception);\n\n };\n\n /**\n * Edit the selected competency.\n * @method editHandler\n */\n var editHandler = function() {\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n var params = {\n competencyframeworkid: treeModel.getCompetencyFrameworkId(),\n id: competency.id,\n parentid: competency.parentid,\n pagecontextid: pageContextId\n };\n\n var queryparams = $.param(params);\n window.location = url.relativeUrl('/admin/tool/lp/editcompetency.php?' + queryparams);\n };\n\n /**\n * Re-render the page with the latest data.\n * @param {Object} context\n * @method reloadPage\n */\n var reloadPage = function(context) {\n templates.render('tool_lp/manage_competencies_page', context)\n .done(function(newhtml, newjs) {\n $('[data-region=\"managecompetencies\"]').replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n })\n .fail(notification.exception);\n };\n\n /**\n * Perform a search and render the page with the new search results.\n * @param {Event} e\n * @method updateSearchHandler\n */\n var updateSearchHandler = function(e) {\n e.preventDefault();\n\n var frameworkid = $('[data-region=\"filtercompetencies\"]').data('frameworkid');\n\n var requests = ajax.call([{\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: frameworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[0].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Move a competency \"up\". This only affects the sort order within the same branch of the tree.\n * @method moveUpHandler\n */\n var moveUpHandler = function() {\n // We are chaining ajax requests here.\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var requests = ajax.call([{\n methodname: 'core_competency_move_up_competency',\n args: {id: competency.id}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: competency.competencyframeworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Move a competency \"down\". This only affects the sort order within the same branch of the tree.\n * @method moveDownHandler\n */\n var moveDownHandler = function() {\n // We are chaining ajax requests here.\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var requests = ajax.call([{\n methodname: 'core_competency_move_down_competency',\n args: {id: competency.id}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: competency.competencyframeworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Open a dialogue to show all the courses using the selected competency.\n * @method seeCoursesHandler\n */\n var seeCoursesHandler = function() {\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n var requests = ajax.call([{\n methodname: 'tool_lp_list_courses_using_competency',\n args: {id: competency.id}\n }]);\n\n requests[0].done(function(courses) {\n var context = {\n courses: courses\n };\n templates.render('tool_lp/linked_courses_summary', context).done(function(html) {\n str.get_string('linkedcourses', 'tool_lp').done(function(linkedcourses) {\n new Dialogue(\n linkedcourses, // Title.\n html, // The linked courses.\n initMovePopup\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Open a competencies popup to relate competencies.\n *\n * @method relateCompetenciesHandler\n */\n var relateCompetenciesHandler = function() {\n relatedTarget = $('[data-region=\"competencyactions\"]').data('competency');\n\n if (!pickerInstance) {\n pickerInstance = new Picker(pageContextId, relatedTarget.competencyframeworkid);\n pickerInstance.on('save', function(e, data) {\n var pendingPromise = new Pending();\n var compIds = data.competencyIds;\n\n var calls = [];\n $.each(compIds, function(index, value) {\n calls.push({\n methodname: 'core_competency_add_related_competency',\n args: {competencyid: value, relatedcompetencyid: relatedTarget.id}\n });\n });\n\n calls.push({\n methodname: 'tool_lp_data_for_related_competencies_section',\n args: {competencyid: relatedTarget.id}\n });\n\n var promises = ajax.call(calls);\n\n promises[calls.length - 1].then(function(context) {\n return templates.render('tool_lp/related_competencies', context);\n }).then(function(html, js) {\n $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n templates.runTemplateJS(js);\n updatedRelatedCompetencies();\n return;\n })\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n });\n }\n\n pickerInstance.setDisallowedCompetencyIDs([relatedTarget.id]);\n pickerInstance.display();\n };\n\n var ruleConfigHandler = function(e) {\n e.preventDefault();\n relatedTarget = $('[data-region=\"competencyactions\"]').data('competency');\n ruleConfigInstance.setTargetCompetencyId(relatedTarget.id);\n ruleConfigInstance.display();\n };\n\n var ruleConfigSaveHandler = function(e, config) {\n var update = {\n id: relatedTarget.id,\n shortname: relatedTarget.shortname,\n idnumber: relatedTarget.idnumber,\n description: relatedTarget.description,\n descriptionformat: relatedTarget.descriptionformat,\n ruletype: config.ruletype,\n ruleoutcome: config.ruleoutcome,\n ruleconfig: config.ruleconfig\n };\n var promise = ajax.call([{\n methodname: 'core_competency_update_competency',\n args: {competency: update}\n }]);\n promise[0].then(function(result) {\n if (result) {\n relatedTarget.ruletype = config.ruletype;\n relatedTarget.ruleoutcome = config.ruleoutcome;\n relatedTarget.ruleconfig = config.ruleconfig;\n renderCompetencySummary(relatedTarget);\n }\n return;\n }).catch(notification.exception);\n };\n\n /**\n * Delete a competency.\n * @method doDelete\n */\n var doDelete = function() {\n // We are chaining ajax requests here.\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var requests = ajax.call([{\n methodname: 'core_competency_delete_competency',\n args: {id: competency.id}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: competency.competencyframeworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[0].done(function(success) {\n if (success === false) {\n str.get_strings([\n {key: 'competencycannotbedeleted', component: 'tool_lp', param: competency.shortname},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.alert(\n null,\n strings[0]\n );\n }).fail(notification.exception);\n }\n }).fail(notification.exception);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Show a confirm dialogue before deleting a competency.\n * @method deleteCompetencyHandler\n */\n var deleteCompetencyHandler = function() {\n var competency = $('[data-region=\"competencyactions\"]').data('competency'),\n confirmMessage = 'deletecompetency';\n\n if (treeModel.hasRule(competency.parentid)) {\n confirmMessage = 'deletecompetencyparenthasrule';\n }\n\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: confirmMessage, component: 'tool_lp', param: competency.shortname},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete competency X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doDelete\n );\n }).fail(notification.exception);\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dragStart\n * @param {Event} e\n */\n var dragStart = function(e) {\n e.originalEvent.dataTransfer.setData('text', $(e.target).parent().data('id'));\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method allowDrop\n * @param {Event} e\n */\n var allowDrop = function(e) {\n e.originalEvent.dataTransfer.dropEffect = 'move';\n e.preventDefault();\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dragEnter\n * @param {Event} e\n */\n var dragEnter = function(e) {\n e.preventDefault();\n $(this).addClass('currentdragtarget');\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dragLeave\n * @param {Event} e\n */\n var dragLeave = function(e) {\n e.preventDefault();\n $(this).removeClass('currentdragtarget');\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dropOver\n * @param {Event} e\n */\n var dropOver = function(e) {\n e.preventDefault();\n moveSource = e.originalEvent.dataTransfer.getData('text');\n moveTarget = $(e.target).parent().data('id');\n $(this).removeClass('currentdragtarget');\n\n confirmMove();\n };\n\n /**\n * Deletes a related competency without confirmation.\n *\n * @param {Event} e The event that triggered the action.\n * @method deleteRelatedHandler\n */\n var deleteRelatedHandler = function(e) {\n e.preventDefault();\n\n var relatedid = this.id.substr(11);\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var removeRelated = ajax.call([\n {methodname: 'core_competency_remove_related_competency',\n args: {relatedcompetencyid: relatedid, competencyid: competency.id}},\n {methodname: 'tool_lp_data_for_related_competencies_section',\n args: {competencyid: competency.id}}\n ]);\n\n removeRelated[1].done(function(context) {\n templates.render('tool_lp/related_competencies', context).done(function(html) {\n $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n updatedRelatedCompetencies();\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Updates the competencies list (with relations) and add listeners.\n *\n * @method updatedRelatedCompetencies\n */\n var updatedRelatedCompetencies = function() {\n\n // Listeners to newly loaded related competencies.\n $('[data-action=\"deleterelation\"]').on('click', deleteRelatedHandler);\n\n };\n\n /**\n * Log the competency viewed event.\n *\n * @param {Object} competency The competency.\n * @method triggerCompetencyViewedEvent\n */\n var triggerCompetencyViewedEvent = function(competency) {\n if (competency.id !== selectedCompetencyId) {\n // Set the selected competency id.\n selectedCompetencyId = competency.id;\n ajax.call([{\n methodname: 'core_competency_competency_viewed',\n args: {id: competency.id}\n }]);\n }\n };\n\n /**\n * Return the taxonomy constant for a level.\n *\n * @param {Number} level The level.\n * @return {String}\n * @function getTaxonomyAtLevel\n */\n var getTaxonomyAtLevel = function(level) {\n var constant = taxonomiesConstants[level];\n if (!constant) {\n constant = 'competency';\n }\n return constant;\n };\n\n /**\n * Render the competency summary.\n *\n * @param {Object} competency The competency.\n */\n var renderCompetencySummary = function(competency) {\n var promise = $.Deferred().resolve().promise(),\n context = {};\n\n context.competency = competency;\n context.showdeleterelatedaction = true;\n context.showrelatedcompetencies = true;\n context.showrule = false;\n context.pluginbaseurl = url.relativeUrl('/admin/tool/lp');\n\n if (competency.ruleoutcome != Outcomes.NONE) {\n // Get the outcome and rule name.\n promise = Outcomes.getString(competency.ruleoutcome).then(function(str) {\n var name;\n $.each(rulesModules, function(index, modInfo) {\n if (modInfo.type == competency.ruletype) {\n name = modInfo.name;\n }\n });\n return [str, name];\n });\n }\n\n promise.then(function(strs) {\n if (typeof strs !== 'undefined') {\n context.showrule = true;\n context.rule = {\n outcome: strs[0],\n type: strs[1]\n };\n }\n return context;\n }).then(function(context) {\n return templates.render('tool_lp/competency_summary', context);\n }).then(function(html) {\n $('[data-region=\"competencyinfo\"]').html(html);\n $('[data-action=\"deleterelation\"]').on('click', deleteRelatedHandler);\n return templates.render('tool_lp/loading', {});\n }).then(function(html, js) {\n templates.replaceNodeContents('[data-region=\"relatedcompetencies\"]', html, js);\n return ajax.call([{\n methodname: 'tool_lp_data_for_related_competencies_section',\n args: {competencyid: competency.id}\n }])[0];\n }).then(function(context) {\n return templates.render('tool_lp/related_competencies', context);\n }).then(function(html, js) {\n $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n templates.runTemplateJS(js);\n updatedRelatedCompetencies();\n return;\n }).catch(notification.exception);\n };\n\n /**\n * Return the string \"Add \".\n *\n * @param {Number} level The level.\n * @return {String}\n * @function strAddTaxonomy\n */\n var strAddTaxonomy = function(level) {\n return str.get_string('taxonomy_add_' + getTaxonomyAtLevel(level), 'tool_lp');\n };\n\n /**\n * Return the string \"Selected \".\n *\n * @param {Number} level The level.\n * @return {String}\n * @function strSelectedTaxonomy\n */\n var strSelectedTaxonomy = function(level) {\n return str.get_string('taxonomy_selected_' + getTaxonomyAtLevel(level), 'tool_lp');\n };\n\n /**\n * Handler when a node in the aria tree is selected.\n * @method selectionChanged\n * @param {Event} evt The event that triggered the selection change.\n * @param {Object} params The parameters for the event. Contains a list of selected nodes.\n * @return {Boolean}\n */\n var selectionChanged = function(evt, params) {\n var node = params.selected,\n id = $(node).data('id'),\n btn = $('[data-region=\"competencyactions\"] [data-action=\"add\"]'),\n actionMenu = $('[data-region=\"competencyactionsmenu\"]'),\n selectedTitle = $('[data-region=\"selected-competency\"]'),\n level = 0,\n sublevel = 1;\n\n menubar.closeAll();\n\n if (typeof id === \"undefined\") {\n // Assume this is the root of the tree.\n // Here we are only getting the text from the top of the tree, to do it we clone the tree,\n // remove all children and then call text on the result.\n $('[data-region=\"competencyinfo\"]').html(node.clone().children().remove().end().text());\n $('[data-region=\"competencyactions\"]').data('competency', null);\n actionMenu.hide();\n\n } else {\n var competency = treeModel.getCompetency(id);\n\n level = treeModel.getCompetencyLevel(id);\n sublevel = level + 1;\n\n actionMenu.show();\n $('[data-region=\"competencyactions\"]').data('competency', competency);\n renderCompetencySummary(competency);\n // Log Competency viewed event.\n triggerCompetencyViewedEvent(competency);\n }\n strSelectedTaxonomy(level).then(function(str) {\n selectedTitle.text(str);\n return;\n }).catch(notification.exception);\n\n strAddTaxonomy(sublevel).then(function(str) {\n btn.show()\n .find('[data-region=\"term\"]')\n .text(str);\n return;\n }).catch(notification.exception);\n\n // We handled this event so consume it.\n evt.preventDefault();\n return false;\n };\n\n /**\n * Return the string \"Selected \".\n *\n * @function parseTaxonomies\n * @param {String} taxonomiesstr Comma separated list of taxonomies.\n * @return {Array} of level => taxonomystr\n */\n var parseTaxonomies = function(taxonomiesstr) {\n var all = taxonomiesstr.split(',');\n all.unshift(\"\");\n delete all[0];\n\n // Note we don't need to fill holes, because other functions check for empty anyway.\n return all;\n };\n\n return {\n /**\n * Initialise this page (attach event handlers etc).\n *\n * @method init\n * @param {Object} model The tree model provides some useful functions for loading and searching competencies.\n * @param {Number} pagectxid The page context ID.\n * @param {Object} taxonomies Constants indexed by level.\n * @param {Object} rulesMods The modules of the rules.\n */\n init: function(model, pagectxid, taxonomies, rulesMods) {\n treeModel = model;\n pageContextId = pagectxid;\n taxonomiesConstants = parseTaxonomies(taxonomies);\n rulesModules = rulesMods;\n\n $('[data-region=\"competencyactions\"] [data-action=\"add\"]').on('click', addHandler);\n\n menubar.enhance('.competencyactionsmenu', {\n '[data-action=\"edit\"]': editHandler,\n '[data-action=\"delete\"]': deleteCompetencyHandler,\n '[data-action=\"move\"]': moveHandler,\n '[data-action=\"moveup\"]': moveUpHandler,\n '[data-action=\"movedown\"]': moveDownHandler,\n '[data-action=\"linkedcourses\"]': seeCoursesHandler,\n '[data-action=\"relatedcompetencies\"]': relateCompetenciesHandler.bind(this),\n '[data-action=\"competencyrules\"]': ruleConfigHandler.bind(this)\n });\n $('[data-region=\"competencyactionsmenu\"]').hide();\n $('[data-region=\"competencyactions\"] [data-action=\"add\"]').hide();\n\n $('[data-region=\"filtercompetencies\"]').on('submit', updateSearchHandler);\n // Simple html5 drag drop because we already added an accessible alternative.\n var top = $('[data-region=\"managecompetencies\"] [data-enhance=\"tree\"]');\n top.on('dragstart', 'li>span', dragStart)\n .on('dragover', 'li>span', allowDrop)\n .on('dragenter', 'li>span', dragEnter)\n .on('dragleave', 'li>span', dragLeave)\n .on('drop', 'li>span', dropOver);\n\n model.on('selectionchanged', selectionChanged);\n\n // Prepare the configuration tool.\n ruleConfigInstance = new RuleConfig(treeModel, rulesModules);\n ruleConfigInstance.on('save', ruleConfigSaveHandler.bind(this));\n }\n };\n});\n"],"names":["define","$","url","templates","notification","str","ajax","dragdrop","Ariatree","Dialogue","menubar","Picker","Outcomes","RuleConfig","Pending","treeModel","pageContextId","pickerInstance","ruleConfigInstance","relatedTarget","taxonomiesConstants","rulesModules","moveSource","moveTarget","selectedCompetencyId","addHandler","parent","data","params","competencyframeworkid","getCompetencyFrameworkId","pagecontextid","parentid","id","relocate","queryparams","param","window","location","relativeUrl","hasRule","get_strings","key","component","shortname","done","strings","confirm","fail","exception","doMove","frameworkid","call","methodname","args","competencyid","search","val","reloadPage","confirmMove","targetComp","getCompetency","sourceComp","confirmMessage","showConfirm","path","indexOf","initMovePopup","popup","body","getContent","treeRoot","find","on","evt","target","selected","show","close","addCompetencyChildren","competencies","i","length","haschildren","children","moveHandler","e","preventDefault","competency","requests","searchtext","when","apply","framework","competenciestree","onecompetency","context","render","tree","editHandler","newhtml","newjs","replaceWith","runTemplateJS","updateSearchHandler","moveUpHandler","moveDownHandler","seeCoursesHandler","courses","html","get_string","linkedcourses","relateCompetenciesHandler","pendingPromise","compIds","competencyIds","calls","each","index","value","push","relatedcompetencyid","then","js","updatedRelatedCompetencies","resolve","catch","setDisallowedCompetencyIDs","display","ruleConfigHandler","setTargetCompetencyId","ruleConfigSaveHandler","config","update","idnumber","description","descriptionformat","ruletype","ruleoutcome","ruleconfig","result","renderCompetencySummary","doDelete","success","alert","deleteCompetencyHandler","dragStart","originalEvent","dataTransfer","setData","allowDrop","dropEffect","dragEnter","this","addClass","dragLeave","removeClass","dropOver","getData","deleteRelatedHandler","relatedid","substr","getTaxonomyAtLevel","level","constant","promise","Deferred","showdeleterelatedaction","showrelatedcompetencies","showrule","pluginbaseurl","NONE","getString","name","modInfo","type","strs","rule","outcome","replaceNodeContents","selectionChanged","node","btn","actionMenu","selectedTitle","sublevel","closeAll","clone","remove","end","text","hide","getCompetencyLevel","triggerCompetencyViewedEvent","strSelectedTaxonomy","strAddTaxonomy","init","model","pagectxid","taxonomies","rulesMods","all","split","unshift","enhance","bind"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencydialogue.min.js.map b/admin/tool/lp/amd/build/competencydialogue.min.js.map index 3a66a43e0e3..739974e1810 100644 --- a/admin/tool/lp/amd/build/competencydialogue.min.js.map +++ b/admin/tool/lp/amd/build/competencydialogue.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competencydialogue.min.js","sources":["../src/competencydialogue.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 * Display Competency in dialogue box.\n *\n * @module tool_lp/Competencydialogue\n * @copyright 2015 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'core/str',\n 'tool_lp/dialogue'],\n function($, notification, ajax, templates, str, Dialogue) {\n\n /**\n * The main instance we'll be working with.\n *\n * @type {Competencydialogue}\n */\n var instance;\n\n /**\n * Constructor for CompetencyDialogue.\n */\n var Competencydialogue = function() {\n // Intentionally left empty.\n };\n\n /**\n * Log the competency viewed event.\n *\n * @param {Number} competencyId The competency ID.\n * @method triggerCompetencyViewedEvent\n */\n Competencydialogue.prototype.triggerCompetencyViewedEvent = function(competencyId) {\n ajax.call([{\n methodname: 'core_competency_competency_viewed',\n args: {id: competencyId}\n }]);\n };\n\n /**\n * Display a dialogue box by competencyid.\n *\n * @param {Number} competencyid The competency ID.\n * @param {Object} options The options.\n * @method showDialogue\n */\n Competencydialogue.prototype.showDialogue = function(competencyid, options) {\n\n var datapromise = this.getCompetencyDataPromise(competencyid, options);\n var localthis = this;\n datapromise.done(function(data) {\n // Inner Html in the dialogue content.\n templates.render('tool_lp/competency_summary', data)\n .done(function(html) {\n // Log competency viewed event.\n localthis.triggerCompetencyViewedEvent(competencyid);\n\n // Show the dialogue.\n new Dialogue(\n data.competency.shortname,\n html\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Display a dialogue box from data.\n *\n * @param {Object} dataSource data to be used to display dialogue box\n * @method showDialogueFromData\n */\n Competencydialogue.prototype.showDialogueFromData = function(dataSource) {\n\n var localthis = this;\n // Inner Html in the dialogue content.\n templates.render('tool_lp/competency_summary', dataSource)\n .done(function(html) {\n // Log competency viewed event.\n localthis.triggerCompetencyViewedEvent(dataSource.id);\n\n // Show the dialogue.\n new Dialogue(\n dataSource.shortname,\n html,\n localthis.enhanceDialogue\n );\n }).fail(notification.exception);\n };\n\n /**\n * The action on the click event.\n *\n * @param {Event} e event click\n * @method clickEventHandler\n */\n Competencydialogue.prototype.clickEventHandler = function(e) {\n\n var compdialogue = e.data.compdialogue;\n var currentTarget = $(e.currentTarget);\n var competencyid = currentTarget.data('id');\n var includerelated = !(currentTarget.data('excluderelated'));\n var includecourses = currentTarget.data('includecourses');\n\n // Show the dialogue box.\n compdialogue.showDialogue(competencyid, {\n includerelated: includerelated,\n includecourses: includecourses\n });\n e.preventDefault();\n };\n\n /**\n * Get a promise on data competency.\n *\n * @param {Number} competencyid\n * @param {Object} options\n * @return {Promise} return promise on data request\n * @method getCompetencyDataPromise\n */\n Competencydialogue.prototype.getCompetencyDataPromise = function(competencyid, options) {\n\n var requests = ajax.call([\n {methodname: 'tool_lp_data_for_competency_summary',\n args: {competencyid: competencyid,\n includerelated: options.includerelated || false,\n includecourses: options.includecourses || false\n }\n }\n ]);\n\n return requests[0].then(function(context) {\n return context;\n }).fail(notification.exception);\n };\n\n return /** @alias module:tool_lp/competencydialogue */ {\n\n /**\n * Initialise the competency dialogue module.\n *\n * Only the first call matters.\n */\n init: function() {\n if (typeof instance !== 'undefined') {\n return;\n }\n\n // Instantiate the one instance and delegate event on the body.\n instance = new Competencydialogue();\n $('body').delegate('[data-action=\"competency-dialogue\"]', 'click', {compdialogue: instance},\n instance.clickEventHandler.bind(instance));\n }\n };\n});\n"],"names":["define","$","notification","ajax","templates","str","Dialogue","instance","Competencydialogue","prototype","triggerCompetencyViewedEvent","competencyId","call","methodname","args","id","showDialogue","competencyid","options","datapromise","this","getCompetencyDataPromise","localthis","done","data","render","html","competency","shortname","fail","exception","showDialogueFromData","dataSource","enhanceDialogue","clickEventHandler","e","compdialogue","currentTarget","includerelated","includecourses","preventDefault","then","context","init","delegate","bind"],"mappings":";;;;;;;AAsBAA,oCAAO,CAAC,SACA,oBACA,YACA,iBACA,WACA,qBACD,SAASC,EAAGC,aAAcC,KAAMC,UAAWC,IAAKC,cAO/CC,SAKAC,mBAAqB,oBAUzBA,mBAAmBC,UAAUC,6BAA+B,SAASC,cACjER,KAAKS,KAAK,CAAC,CACHC,WAAY,oCACZC,KAAM,CAACC,GAAIJ,kBAWvBH,mBAAmBC,UAAUO,aAAe,SAASC,aAAcC,aAE3DC,YAAcC,KAAKC,yBAAyBJ,aAAcC,SAC1DI,UAAYF,KAChBD,YAAYI,MAAK,SAASC,MAEtBpB,UAAUqB,OAAO,6BAA8BD,MAC1CD,MAAK,SAASG,MAEXJ,UAAUZ,6BAA6BO,kBAGnCX,SACAkB,KAAKG,WAAWC,UAChBF,SAELG,KAAK3B,aAAa4B,cAC1BD,KAAK3B,aAAa4B,YASzBtB,mBAAmBC,UAAUsB,qBAAuB,SAASC,gBAErDV,UAAYF,KAEhBhB,UAAUqB,OAAO,6BAA8BO,YAC1CT,MAAK,SAASG,MAEXJ,UAAUZ,6BAA6BsB,WAAWjB,QAG9CT,SACA0B,WAAWJ,UACXF,KACAJ,UAAUW,oBAEfJ,KAAK3B,aAAa4B,YAS7BtB,mBAAmBC,UAAUyB,kBAAoB,SAASC,OAElDC,aAAeD,EAAEX,KAAKY,aACtBC,cAAgBpC,EAAEkC,EAAEE,eACpBpB,aAAeoB,cAAcb,KAAK,MAClCc,gBAAmBD,cAAcb,KAAK,kBACtCe,eAAiBF,cAAcb,KAAK,kBAGxCY,aAAapB,aAAaC,aAAc,CACpCqB,eAAgBA,eAChBC,eAAgBA,iBAEpBJ,EAAEK,kBAWNhC,mBAAmBC,UAAUY,yBAA2B,SAASJ,aAAcC,gBAE5Df,KAAKS,KAAK,CACrB,CAACC,WAAY,sCACXC,KAAM,CAACG,aAAcA,aACbqB,eAAgBpB,QAAQoB,iBAAkB,EAC1CC,eAAgBrB,QAAQqB,iBAAkB,MAKxC,GAAGE,MAAK,SAASC,gBACvBA,WACPb,KAAK3B,aAAa4B,YAG8B,CAOnDa,KAAM,gBACsB,IAAbpC,WAKXA,SAAW,IAAIC,mBACfP,EAAE,QAAQ2C,SAAS,sCAAuC,QAAS,CAACR,aAAc7B,UAC9EA,SAAS2B,kBAAkBW,KAAKtC"} \ No newline at end of file +{"version":3,"file":"competencydialogue.min.js","sources":["../src/competencydialogue.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 * Display Competency in dialogue box.\n *\n * @module tool_lp/Competencydialogue\n * @copyright 2015 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'core/str',\n 'tool_lp/dialogue'],\n function($, notification, ajax, templates, str, Dialogue) {\n\n /**\n * The main instance we'll be working with.\n *\n * @type {Competencydialogue}\n */\n var instance;\n\n /**\n * Constructor for CompetencyDialogue.\n */\n var Competencydialogue = function() {\n // Intentionally left empty.\n };\n\n /**\n * Log the competency viewed event.\n *\n * @param {Number} competencyId The competency ID.\n * @method triggerCompetencyViewedEvent\n */\n Competencydialogue.prototype.triggerCompetencyViewedEvent = function(competencyId) {\n ajax.call([{\n methodname: 'core_competency_competency_viewed',\n args: {id: competencyId}\n }]);\n };\n\n /**\n * Display a dialogue box by competencyid.\n *\n * @param {Number} competencyid The competency ID.\n * @param {Object} options The options.\n * @method showDialogue\n */\n Competencydialogue.prototype.showDialogue = function(competencyid, options) {\n\n var datapromise = this.getCompetencyDataPromise(competencyid, options);\n var localthis = this;\n datapromise.done(function(data) {\n // Inner Html in the dialogue content.\n templates.render('tool_lp/competency_summary', data)\n .done(function(html) {\n // Log competency viewed event.\n localthis.triggerCompetencyViewedEvent(competencyid);\n\n // Show the dialogue.\n new Dialogue(\n data.competency.shortname,\n html\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Display a dialogue box from data.\n *\n * @param {Object} dataSource data to be used to display dialogue box\n * @method showDialogueFromData\n */\n Competencydialogue.prototype.showDialogueFromData = function(dataSource) {\n\n var localthis = this;\n // Inner Html in the dialogue content.\n templates.render('tool_lp/competency_summary', dataSource)\n .done(function(html) {\n // Log competency viewed event.\n localthis.triggerCompetencyViewedEvent(dataSource.id);\n\n // Show the dialogue.\n new Dialogue(\n dataSource.shortname,\n html,\n localthis.enhanceDialogue\n );\n }).fail(notification.exception);\n };\n\n /**\n * The action on the click event.\n *\n * @param {Event} e event click\n * @method clickEventHandler\n */\n Competencydialogue.prototype.clickEventHandler = function(e) {\n\n var compdialogue = e.data.compdialogue;\n var currentTarget = $(e.currentTarget);\n var competencyid = currentTarget.data('id');\n var includerelated = !(currentTarget.data('excluderelated'));\n var includecourses = currentTarget.data('includecourses');\n\n // Show the dialogue box.\n compdialogue.showDialogue(competencyid, {\n includerelated: includerelated,\n includecourses: includecourses\n });\n e.preventDefault();\n };\n\n /**\n * Get a promise on data competency.\n *\n * @param {Number} competencyid\n * @param {Object} options\n * @return {Promise} return promise on data request\n * @method getCompetencyDataPromise\n */\n Competencydialogue.prototype.getCompetencyDataPromise = function(competencyid, options) {\n\n var requests = ajax.call([\n {methodname: 'tool_lp_data_for_competency_summary',\n args: {competencyid: competencyid,\n includerelated: options.includerelated || false,\n includecourses: options.includecourses || false\n }\n }\n ]);\n\n return requests[0].then(function(context) {\n return context;\n }).fail(notification.exception);\n };\n\n return /** @alias module:tool_lp/competencydialogue */ {\n\n /**\n * Initialise the competency dialogue module.\n *\n * Only the first call matters.\n */\n init: function() {\n if (typeof instance !== 'undefined') {\n return;\n }\n\n // Instantiate the one instance and delegate event on the body.\n instance = new Competencydialogue();\n $('body').delegate('[data-action=\"competency-dialogue\"]', 'click', {compdialogue: instance},\n instance.clickEventHandler.bind(instance));\n }\n };\n});\n"],"names":["define","$","notification","ajax","templates","str","Dialogue","instance","Competencydialogue","prototype","triggerCompetencyViewedEvent","competencyId","call","methodname","args","id","showDialogue","competencyid","options","datapromise","this","getCompetencyDataPromise","localthis","done","data","render","html","competency","shortname","fail","exception","showDialogueFromData","dataSource","enhanceDialogue","clickEventHandler","e","compdialogue","currentTarget","includerelated","includecourses","preventDefault","requests","then","context","init","delegate","bind"],"mappings":";;;;;;;AAsBAA,OAAM,6BAAC,CAAC,SACA,oBACA,YACA,iBACA,WACA,qBACD,SAASC,EAAGC,aAAcC,KAAMC,UAAWC,IAAKC,UAOnD,IAAIC,SAKAC,mBAAqB,aAkH8B,OAxGvDA,mBAAmBC,UAAUC,6BAA+B,SAASC,cACjER,KAAKS,KAAK,CAAC,CACHC,WAAY,oCACZC,KAAM,CAACC,GAAIJ,gBAEtB,EASDH,mBAAmBC,UAAUO,aAAe,SAASC,aAAcC,SAE3DC,IAAAA,YAAcC,KAAKC,yBAAyBJ,aAAcC,SAC1DI,UAAYF,KAChBD,YAAYI,MAAK,SAASC,MAEtBpB,UAAUqB,OAAO,6BAA8BD,MAC1CD,MAAK,SAASG,MAEXJ,UAAUZ,6BAA6BO,cAGnCX,IAAAA,SACAkB,KAAKG,WAAWC,UAChBF,KARZ,IAUOG,KAAK3B,aAAa4B,UAZ7B,IAaGD,KAAK3B,aAAa4B,UACxB,EAQDtB,mBAAmBC,UAAUsB,qBAAuB,SAASC,YAErDV,IAAAA,UAAYF,KAEhBhB,UAAUqB,OAAO,6BAA8BO,YAC1CT,MAAK,SAASG,MAEXJ,UAAUZ,6BAA6BsB,WAAWjB,IAG9CT,IAAAA,SACA0B,WAAWJ,UACXF,KACAJ,UAAUW,gBATtB,IAWOJ,KAAK3B,aAAa4B,UAC5B,EAQDtB,mBAAmBC,UAAUyB,kBAAoB,SAASC,GAEtD,IAAIC,aAAeD,EAAEX,KAAKY,aACtBC,cAAgBpC,EAAEkC,EAAEE,eACpBpB,aAAeoB,cAAcb,KAAK,MAClCc,gBAAmBD,cAAcb,KAAK,kBACtCe,eAAiBF,cAAcb,KAAK,kBAGxCY,aAAapB,aAAaC,aAAc,CACpCqB,eAAgBA,eAChBC,eAAgBA,iBAEpBJ,EAAEK,gBACL,EAUDhC,mBAAmBC,UAAUY,yBAA2B,SAASJ,aAAcC,SAWpEuB,OATQtC,KAAKS,KAAK,CACrB,CAACC,WAAY,sCACXC,KAAM,CAACG,aAAcA,aACbqB,eAAgBpB,QAAQoB,iBAAkB,EAC1CC,eAAgBrB,QAAQqB,iBAAkB,MAKxC,GAAGG,MAAK,SAASC,SAC9B,OAAOA,OADH,IAEJd,KAAK3B,aAAa4B,UACxB,EAEsD,CAOnDc,KAAM,gBACsB,IAAbrC,WAKXA,SAAW,IAAIC,mBACfP,EAAE,QAAQ4C,SAAS,sCAAuC,QAAS,CAACT,aAAc7B,UAC9EA,SAAS2B,kBAAkBY,KAAKvC,WACvC,EAER"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencypicker.min.js.map b/admin/tool/lp/amd/build/competencypicker.min.js.map index 6fca0dc076b..4bfba53c313 100644 --- a/admin/tool/lp/amd/build/competencypicker.min.js.map +++ b/admin/tool/lp/amd/build/competencypicker.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competencypicker.min.js","sources":["../src/competencypicker.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 * Competency picker.\n *\n * To handle 'save' events use: picker.on('save')\n * This will receive a object with either a single 'competencyId', or an array in 'competencyIds'\n * depending on the value of multiSelect.\n *\n * @module tool_lp/competencypicker\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'tool_lp/dialogue',\n 'core/str',\n 'tool_lp/tree',\n 'core/pending'\n ],\n function($, Notification, Ajax, Templates, Dialogue, Str, Tree, Pending) {\n\n /**\n * Competency picker class.\n * @param {Number} pageContextId The page context ID.\n * @param {Number|false} singleFramework The ID of the framework when limited to one.\n * @param {String} pageContextIncludes One of 'children', 'parents', 'self'.\n * @param {Boolean} multiSelect Support multi-select in the tree.\n */\n var Picker = function(pageContextId, singleFramework, pageContextIncludes, multiSelect) {\n var self = this;\n self._eventNode = $('
');\n self._frameworks = [];\n self._reset();\n\n self._pageContextId = pageContextId;\n self._pageContextIncludes = pageContextIncludes || 'children';\n self._multiSelect = (typeof multiSelect === 'undefined' || multiSelect === true);\n if (singleFramework) {\n self._frameworkId = singleFramework;\n self._singleFramework = true;\n }\n };\n\n /** @property {Array} The competencies fetched. */\n Picker.prototype._competencies = null;\n /** @property {Array} The competencies that cannot be picked. */\n Picker.prototype._disallowedCompetencyIDs = null;\n /** @property {Node} The node we attach the events to. */\n Picker.prototype._eventNode = null;\n /** @property {Array} The list of frameworks fetched. */\n Picker.prototype._frameworks = null;\n /** @property {Number} The current framework ID. */\n Picker.prototype._frameworkId = null;\n /** @property {Number} The page context ID. */\n Picker.prototype._pageContextId = null;\n /** @property {Number} Relevant contexts inclusion. */\n Picker.prototype._pageContextIncludes = null;\n /** @property {Dialogue} The reference to the dialogue. */\n Picker.prototype._popup = null;\n /** @property {String} The string we filter the competencies with. */\n Picker.prototype._searchText = '';\n /** @property {Object} The competency that was selected. */\n Picker.prototype._selectedCompetencies = null;\n /** @property {Boolean} Whether we can browse frameworks or not. */\n Picker.prototype._singleFramework = false;\n /** @property {Boolean} Do we allow multi select? */\n Picker.prototype._multiSelect = true;\n /** @property {Boolean} Do we allow to display hidden framework? */\n Picker.prototype._onlyVisible = true;\n\n /**\n * Hook to executed after the view is rendered.\n *\n * @method _afterRender\n */\n Picker.prototype._afterRender = function() {\n var self = this;\n\n // Initialise the tree.\n var tree = new Tree(self._find('[data-enhance=linktree]'), self._multiSelect);\n\n // To prevent jiggling we only show the tree after it is enhanced.\n self._find('[data-enhance=linktree]').show();\n\n tree.on('selectionchanged', function(evt, params) {\n var selected = params.selected;\n evt.preventDefault();\n var validIds = [];\n $.each(selected, function(index, item) {\n var compId = $(item).data('id'),\n valid = true;\n\n if (typeof compId === 'undefined') {\n // Do not allow picking nodes with no id.\n valid = false;\n } else {\n $.each(self._disallowedCompetencyIDs, function(i, id) {\n if (id == compId) {\n valid = false;\n }\n });\n }\n if (valid) {\n validIds.push(compId);\n }\n });\n\n self._selectedCompetencies = validIds;\n\n // TODO Implement disabling of nodes in the tree module somehow.\n if (!self._selectedCompetencies.length) {\n self._find('[data-region=\"competencylinktree\"] [data-action=\"add\"]').attr('disabled', 'disabled');\n } else {\n self._find('[data-region=\"competencylinktree\"] [data-action=\"add\"]').removeAttr('disabled');\n }\n });\n\n // Add listener for framework change.\n if (!self._singleFramework) {\n self._find('[data-action=\"chooseframework\"]').change(function(e) {\n self._frameworkId = $(e.target).val();\n self._loadCompetencies().then(self._refresh.bind(self)).catch(Notification.exception);\n });\n }\n\n // Add listener for search.\n self._find('[data-region=\"filtercompetencies\"] button').click(function(e) {\n e.preventDefault();\n $(e.target).attr('disabled', 'disabled');\n self._searchText = self._find('[data-region=\"filtercompetencies\"] input').val() || '';\n return self._refresh().always(function() {\n $(e.target).removeAttr('disabled');\n });\n });\n\n // Add listener for cancel.\n self._find('[data-region=\"competencylinktree\"] [data-action=\"cancel\"]').click(function(e) {\n e.preventDefault();\n self.close();\n });\n\n // Add listener for add.\n self._find('[data-region=\"competencylinktree\"] [data-action=\"add\"]').click(function(e) {\n e.preventDefault();\n var pendingPromise = new Pending();\n if (!self._selectedCompetencies.length) {\n return;\n }\n\n if (self._multiSelect) {\n self._trigger('save', {competencyIds: self._selectedCompetencies});\n } else {\n // We checked above that the array has at least one value.\n self._trigger('save', {competencyId: self._selectedCompetencies[0]});\n }\n\n // The dialogue here is a YUI dialogue and doesn't support Promises at all.\n // However, it is typically synchronous so this shoudl suffice.\n self.close();\n pendingPromise.resolve();\n });\n\n // The list of selected competencies will be modified while looping (because of the listeners above).\n var currentItems = self._selectedCompetencies.slice(0);\n\n $.each(currentItems, function(index, id) {\n var node = self._find('[data-id=' + id + ']');\n if (node.length) {\n tree.toggleItem(node);\n tree.updateFocus(node);\n }\n });\n\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n Picker.prototype.close = function() {\n var self = this;\n self._popup.close();\n self._reset();\n };\n\n /**\n * Opens the picker.\n *\n * @method display\n * @return {Promise}\n */\n Picker.prototype.display = function() {\n var self = this;\n return $.when(Str.get_string('competencypicker', 'tool_lp'), self._render())\n .then(function(title, render) {\n self._popup = new Dialogue(\n title,\n render[0],\n self._afterRender.bind(self)\n );\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Fetch the competencies.\n *\n * @param {Number} frameworkId The frameworkId.\n * @param {String} searchText Limit the competencies to those matching the text.\n * @method _fetchCompetencies\n * @return {Promise}\n */\n Picker.prototype._fetchCompetencies = function(frameworkId, searchText) {\n var self = this;\n\n return Ajax.call([\n {methodname: 'core_competency_search_competencies', args: {\n searchtext: searchText,\n competencyframeworkid: frameworkId\n }}\n ])[0].done(function(competencies) {\n /**\n * @param {Object} parent\n * @param {Array} competencies\n */\n function addCompetencyChildren(parent, competencies) {\n for (var i = 0; i < competencies.length; i++) {\n if (competencies[i].parentid == parent.id) {\n parent.haschildren = true;\n competencies[i].children = [];\n competencies[i].haschildren = false;\n parent.children[parent.children.length] = competencies[i];\n addCompetencyChildren(competencies[i], competencies);\n }\n }\n }\n\n // Expand the list of competencies into a tree.\n var i, comp;\n var tree = [];\n for (i = 0; i < competencies.length; i++) {\n comp = competencies[i];\n if (comp.parentid == \"0\") { // Loose check for now, because WS returns a string.\n comp.children = [];\n comp.haschildren = 0;\n tree[tree.length] = comp;\n addCompetencyChildren(comp, competencies);\n }\n }\n\n self._competencies = tree;\n\n }).fail(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @return {JQuery}\n * @method _find\n */\n Picker.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Convenience method to get a framework object.\n *\n * @param {Number} fid The framework ID.\n * @return {Object}\n * @method _getFramework\n */\n Picker.prototype._getFramework = function(fid) {\n var frm;\n $.each(this._frameworks, function(i, f) {\n if (f.id == fid) {\n frm = f;\n return;\n }\n });\n return frm;\n };\n\n /**\n * Load the competencies.\n *\n * @method _loadCompetencies\n * @return {Promise}\n */\n Picker.prototype._loadCompetencies = function() {\n return this._fetchCompetencies(this._frameworkId, this._searchText);\n };\n\n /**\n * Load the frameworks.\n *\n * @method _loadFrameworks\n * @return {Promise}\n */\n Picker.prototype._loadFrameworks = function() {\n var promise,\n self = this;\n\n // Quit early because we already have the data.\n if (self._frameworks.length > 0) {\n return $.when();\n }\n\n if (self._singleFramework) {\n promise = Ajax.call([\n {methodname: 'core_competency_read_competency_framework', args: {\n id: this._frameworkId\n }}\n ])[0].then(function(framework) {\n return [framework];\n });\n } else {\n promise = Ajax.call([\n {methodname: 'core_competency_list_competency_frameworks', args: {\n sort: 'shortname',\n context: {contextid: self._pageContextId},\n includes: self._pageContextIncludes,\n onlyvisible: self._onlyVisible\n }}\n ])[0];\n }\n\n return promise.done(function(frameworks) {\n self._frameworks = frameworks;\n }).fail(Notification.exception);\n };\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n Picker.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Hook to executed before render.\n *\n * @method _preRender\n * @return {Promise}\n */\n Picker.prototype._preRender = function() {\n var self = this;\n return self._loadFrameworks().then(function() {\n if (!self._frameworkId && self._frameworks.length > 0) {\n self._frameworkId = self._frameworks[0].id;\n }\n\n // We could not set a framework ID, that probably means there are no frameworks accessible.\n if (!self._frameworkId) {\n self._frameworks = [];\n return $.when();\n }\n\n return self._loadCompetencies();\n });\n };\n\n /**\n * Refresh the view.\n *\n * @method _refresh\n * @return {Promise}\n */\n Picker.prototype._refresh = function() {\n var self = this;\n return self._render().then(function(html) {\n self._find('[data-region=\"competencylinktree\"]').replaceWith(html);\n self._afterRender();\n return;\n });\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @return {Promise}\n */\n Picker.prototype._render = function() {\n var self = this;\n return self._preRender().then(function() {\n\n if (!self._singleFramework) {\n $.each(self._frameworks, function(i, framework) {\n if (framework.id == self._frameworkId) {\n framework.selected = true;\n } else {\n framework.selected = false;\n }\n });\n }\n\n var context = {\n competencies: self._competencies,\n framework: self._getFramework(self._frameworkId),\n frameworks: self._frameworks,\n search: self._searchText,\n singleFramework: self._singleFramework,\n };\n\n return Templates.render('tool_lp/competency_picker', context);\n });\n };\n\n /**\n * Reset the dialogue properties.\n *\n * This does not reset everything, just enough to reset the UI.\n *\n * @method _reset\n */\n Picker.prototype._reset = function() {\n this._competencies = [];\n this._disallowedCompetencyIDs = [];\n this._popup = null;\n this._searchText = '';\n this._selectedCompetencies = [];\n };\n\n /**\n * Set what competencies cannot be picked.\n *\n * This needs to be set after reset/close.\n *\n * @param {Number[]} ids The IDs.\n * @method _setDisallowedCompetencyIDs\n */\n Picker.prototype.setDisallowedCompetencyIDs = function(ids) {\n this._disallowedCompetencyIDs = ids;\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _reset\n */\n Picker.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n return Picker;\n\n});\n"],"names":["define","$","Notification","Ajax","Templates","Dialogue","Str","Tree","Pending","Picker","pageContextId","singleFramework","pageContextIncludes","multiSelect","this","_eventNode","_frameworks","_reset","_pageContextId","_pageContextIncludes","_multiSelect","_frameworkId","_singleFramework","prototype","_competencies","_disallowedCompetencyIDs","_popup","_searchText","_selectedCompetencies","_onlyVisible","_afterRender","self","tree","_find","show","on","evt","params","selected","preventDefault","validIds","each","index","item","compId","data","valid","i","id","push","length","removeAttr","attr","change","e","target","val","_loadCompetencies","then","_refresh","bind","catch","exception","click","always","close","pendingPromise","_trigger","competencyIds","competencyId","resolve","currentItems","slice","node","toggleItem","updateFocus","display","when","get_string","_render","title","render","_fetchCompetencies","frameworkId","searchText","call","methodname","args","searchtext","competencyframeworkid","done","competencies","addCompetencyChildren","parent","parentid","haschildren","children","comp","fail","selector","getContent","find","_getFramework","fid","frm","f","_loadFrameworks","framework","sort","context","contextid","includes","onlyvisible","frameworks","type","handler","_preRender","html","replaceWith","search","setDisallowedCompetencyIDs","ids","trigger"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"competencypicker.min.js","sources":["../src/competencypicker.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 * Competency picker.\n *\n * To handle 'save' events use: picker.on('save')\n * This will receive a object with either a single 'competencyId', or an array in 'competencyIds'\n * depending on the value of multiSelect.\n *\n * @module tool_lp/competencypicker\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'tool_lp/dialogue',\n 'core/str',\n 'tool_lp/tree',\n 'core/pending'\n ],\n function($, Notification, Ajax, Templates, Dialogue, Str, Tree, Pending) {\n\n /**\n * Competency picker class.\n * @param {Number} pageContextId The page context ID.\n * @param {Number|false} singleFramework The ID of the framework when limited to one.\n * @param {String} pageContextIncludes One of 'children', 'parents', 'self'.\n * @param {Boolean} multiSelect Support multi-select in the tree.\n */\n var Picker = function(pageContextId, singleFramework, pageContextIncludes, multiSelect) {\n var self = this;\n self._eventNode = $('
');\n self._frameworks = [];\n self._reset();\n\n self._pageContextId = pageContextId;\n self._pageContextIncludes = pageContextIncludes || 'children';\n self._multiSelect = (typeof multiSelect === 'undefined' || multiSelect === true);\n if (singleFramework) {\n self._frameworkId = singleFramework;\n self._singleFramework = true;\n }\n };\n\n /** @property {Array} The competencies fetched. */\n Picker.prototype._competencies = null;\n /** @property {Array} The competencies that cannot be picked. */\n Picker.prototype._disallowedCompetencyIDs = null;\n /** @property {Node} The node we attach the events to. */\n Picker.prototype._eventNode = null;\n /** @property {Array} The list of frameworks fetched. */\n Picker.prototype._frameworks = null;\n /** @property {Number} The current framework ID. */\n Picker.prototype._frameworkId = null;\n /** @property {Number} The page context ID. */\n Picker.prototype._pageContextId = null;\n /** @property {Number} Relevant contexts inclusion. */\n Picker.prototype._pageContextIncludes = null;\n /** @property {Dialogue} The reference to the dialogue. */\n Picker.prototype._popup = null;\n /** @property {String} The string we filter the competencies with. */\n Picker.prototype._searchText = '';\n /** @property {Object} The competency that was selected. */\n Picker.prototype._selectedCompetencies = null;\n /** @property {Boolean} Whether we can browse frameworks or not. */\n Picker.prototype._singleFramework = false;\n /** @property {Boolean} Do we allow multi select? */\n Picker.prototype._multiSelect = true;\n /** @property {Boolean} Do we allow to display hidden framework? */\n Picker.prototype._onlyVisible = true;\n\n /**\n * Hook to executed after the view is rendered.\n *\n * @method _afterRender\n */\n Picker.prototype._afterRender = function() {\n var self = this;\n\n // Initialise the tree.\n var tree = new Tree(self._find('[data-enhance=linktree]'), self._multiSelect);\n\n // To prevent jiggling we only show the tree after it is enhanced.\n self._find('[data-enhance=linktree]').show();\n\n tree.on('selectionchanged', function(evt, params) {\n var selected = params.selected;\n evt.preventDefault();\n var validIds = [];\n $.each(selected, function(index, item) {\n var compId = $(item).data('id'),\n valid = true;\n\n if (typeof compId === 'undefined') {\n // Do not allow picking nodes with no id.\n valid = false;\n } else {\n $.each(self._disallowedCompetencyIDs, function(i, id) {\n if (id == compId) {\n valid = false;\n }\n });\n }\n if (valid) {\n validIds.push(compId);\n }\n });\n\n self._selectedCompetencies = validIds;\n\n // TODO Implement disabling of nodes in the tree module somehow.\n if (!self._selectedCompetencies.length) {\n self._find('[data-region=\"competencylinktree\"] [data-action=\"add\"]').attr('disabled', 'disabled');\n } else {\n self._find('[data-region=\"competencylinktree\"] [data-action=\"add\"]').removeAttr('disabled');\n }\n });\n\n // Add listener for framework change.\n if (!self._singleFramework) {\n self._find('[data-action=\"chooseframework\"]').change(function(e) {\n self._frameworkId = $(e.target).val();\n self._loadCompetencies().then(self._refresh.bind(self)).catch(Notification.exception);\n });\n }\n\n // Add listener for search.\n self._find('[data-region=\"filtercompetencies\"] button').click(function(e) {\n e.preventDefault();\n $(e.target).attr('disabled', 'disabled');\n self._searchText = self._find('[data-region=\"filtercompetencies\"] input').val() || '';\n return self._refresh().always(function() {\n $(e.target).removeAttr('disabled');\n });\n });\n\n // Add listener for cancel.\n self._find('[data-region=\"competencylinktree\"] [data-action=\"cancel\"]').click(function(e) {\n e.preventDefault();\n self.close();\n });\n\n // Add listener for add.\n self._find('[data-region=\"competencylinktree\"] [data-action=\"add\"]').click(function(e) {\n e.preventDefault();\n var pendingPromise = new Pending();\n if (!self._selectedCompetencies.length) {\n return;\n }\n\n if (self._multiSelect) {\n self._trigger('save', {competencyIds: self._selectedCompetencies});\n } else {\n // We checked above that the array has at least one value.\n self._trigger('save', {competencyId: self._selectedCompetencies[0]});\n }\n\n // The dialogue here is a YUI dialogue and doesn't support Promises at all.\n // However, it is typically synchronous so this shoudl suffice.\n self.close();\n pendingPromise.resolve();\n });\n\n // The list of selected competencies will be modified while looping (because of the listeners above).\n var currentItems = self._selectedCompetencies.slice(0);\n\n $.each(currentItems, function(index, id) {\n var node = self._find('[data-id=' + id + ']');\n if (node.length) {\n tree.toggleItem(node);\n tree.updateFocus(node);\n }\n });\n\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n Picker.prototype.close = function() {\n var self = this;\n self._popup.close();\n self._reset();\n };\n\n /**\n * Opens the picker.\n *\n * @method display\n * @return {Promise}\n */\n Picker.prototype.display = function() {\n var self = this;\n return $.when(Str.get_string('competencypicker', 'tool_lp'), self._render())\n .then(function(title, render) {\n self._popup = new Dialogue(\n title,\n render[0],\n self._afterRender.bind(self)\n );\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Fetch the competencies.\n *\n * @param {Number} frameworkId The frameworkId.\n * @param {String} searchText Limit the competencies to those matching the text.\n * @method _fetchCompetencies\n * @return {Promise}\n */\n Picker.prototype._fetchCompetencies = function(frameworkId, searchText) {\n var self = this;\n\n return Ajax.call([\n {methodname: 'core_competency_search_competencies', args: {\n searchtext: searchText,\n competencyframeworkid: frameworkId\n }}\n ])[0].done(function(competencies) {\n /**\n * @param {Object} parent\n * @param {Array} competencies\n */\n function addCompetencyChildren(parent, competencies) {\n for (var i = 0; i < competencies.length; i++) {\n if (competencies[i].parentid == parent.id) {\n parent.haschildren = true;\n competencies[i].children = [];\n competencies[i].haschildren = false;\n parent.children[parent.children.length] = competencies[i];\n addCompetencyChildren(competencies[i], competencies);\n }\n }\n }\n\n // Expand the list of competencies into a tree.\n var i, comp;\n var tree = [];\n for (i = 0; i < competencies.length; i++) {\n comp = competencies[i];\n if (comp.parentid == \"0\") { // Loose check for now, because WS returns a string.\n comp.children = [];\n comp.haschildren = 0;\n tree[tree.length] = comp;\n addCompetencyChildren(comp, competencies);\n }\n }\n\n self._competencies = tree;\n\n }).fail(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @return {JQuery}\n * @method _find\n */\n Picker.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Convenience method to get a framework object.\n *\n * @param {Number} fid The framework ID.\n * @return {Object}\n * @method _getFramework\n */\n Picker.prototype._getFramework = function(fid) {\n var frm;\n $.each(this._frameworks, function(i, f) {\n if (f.id == fid) {\n frm = f;\n return;\n }\n });\n return frm;\n };\n\n /**\n * Load the competencies.\n *\n * @method _loadCompetencies\n * @return {Promise}\n */\n Picker.prototype._loadCompetencies = function() {\n return this._fetchCompetencies(this._frameworkId, this._searchText);\n };\n\n /**\n * Load the frameworks.\n *\n * @method _loadFrameworks\n * @return {Promise}\n */\n Picker.prototype._loadFrameworks = function() {\n var promise,\n self = this;\n\n // Quit early because we already have the data.\n if (self._frameworks.length > 0) {\n return $.when();\n }\n\n if (self._singleFramework) {\n promise = Ajax.call([\n {methodname: 'core_competency_read_competency_framework', args: {\n id: this._frameworkId\n }}\n ])[0].then(function(framework) {\n return [framework];\n });\n } else {\n promise = Ajax.call([\n {methodname: 'core_competency_list_competency_frameworks', args: {\n sort: 'shortname',\n context: {contextid: self._pageContextId},\n includes: self._pageContextIncludes,\n onlyvisible: self._onlyVisible\n }}\n ])[0];\n }\n\n return promise.done(function(frameworks) {\n self._frameworks = frameworks;\n }).fail(Notification.exception);\n };\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n Picker.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Hook to executed before render.\n *\n * @method _preRender\n * @return {Promise}\n */\n Picker.prototype._preRender = function() {\n var self = this;\n return self._loadFrameworks().then(function() {\n if (!self._frameworkId && self._frameworks.length > 0) {\n self._frameworkId = self._frameworks[0].id;\n }\n\n // We could not set a framework ID, that probably means there are no frameworks accessible.\n if (!self._frameworkId) {\n self._frameworks = [];\n return $.when();\n }\n\n return self._loadCompetencies();\n });\n };\n\n /**\n * Refresh the view.\n *\n * @method _refresh\n * @return {Promise}\n */\n Picker.prototype._refresh = function() {\n var self = this;\n return self._render().then(function(html) {\n self._find('[data-region=\"competencylinktree\"]').replaceWith(html);\n self._afterRender();\n return;\n });\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @return {Promise}\n */\n Picker.prototype._render = function() {\n var self = this;\n return self._preRender().then(function() {\n\n if (!self._singleFramework) {\n $.each(self._frameworks, function(i, framework) {\n if (framework.id == self._frameworkId) {\n framework.selected = true;\n } else {\n framework.selected = false;\n }\n });\n }\n\n var context = {\n competencies: self._competencies,\n framework: self._getFramework(self._frameworkId),\n frameworks: self._frameworks,\n search: self._searchText,\n singleFramework: self._singleFramework,\n };\n\n return Templates.render('tool_lp/competency_picker', context);\n });\n };\n\n /**\n * Reset the dialogue properties.\n *\n * This does not reset everything, just enough to reset the UI.\n *\n * @method _reset\n */\n Picker.prototype._reset = function() {\n this._competencies = [];\n this._disallowedCompetencyIDs = [];\n this._popup = null;\n this._searchText = '';\n this._selectedCompetencies = [];\n };\n\n /**\n * Set what competencies cannot be picked.\n *\n * This needs to be set after reset/close.\n *\n * @param {Number[]} ids The IDs.\n * @method _setDisallowedCompetencyIDs\n */\n Picker.prototype.setDisallowedCompetencyIDs = function(ids) {\n this._disallowedCompetencyIDs = ids;\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _reset\n */\n Picker.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n return Picker;\n\n});\n"],"names":["define","$","Notification","Ajax","Templates","Dialogue","Str","Tree","Pending","Picker","pageContextId","singleFramework","pageContextIncludes","multiSelect","this","_eventNode","_frameworks","_reset","_pageContextId","_pageContextIncludes","_multiSelect","_frameworkId","_singleFramework","prototype","_competencies","_disallowedCompetencyIDs","_popup","_searchText","_selectedCompetencies","_onlyVisible","_afterRender","self","tree","_find","show","on","evt","params","selected","preventDefault","validIds","each","index","item","compId","data","valid","i","id","push","length","removeAttr","attr","change","e","target","val","_loadCompetencies","then","_refresh","bind","catch","exception","click","always","close","pendingPromise","_trigger","competencyIds","competencyId","resolve","currentItems","slice","node","toggleItem","updateFocus","display","when","get_string","_render","title","render","_fetchCompetencies","frameworkId","searchText","call","methodname","args","searchtext","competencyframeworkid","done","competencies","addCompetencyChildren","parent","parentid","haschildren","children","comp","fail","selector","getContent","find","_getFramework","fid","frm","f","_loadFrameworks","framework","sort","context","contextid","includes","onlyvisible","frameworks","type","handler","_preRender","html","replaceWith","search","setDisallowedCompetencyIDs","ids","trigger"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencypicker_user_plans.min.js.map b/admin/tool/lp/amd/build/competencypicker_user_plans.min.js.map index 26cd77c5717..ba9f7fa6767 100644 --- a/admin/tool/lp/amd/build/competencypicker_user_plans.min.js.map +++ b/admin/tool/lp/amd/build/competencypicker_user_plans.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competencypicker_user_plans.min.js","sources":["../src/competencypicker_user_plans.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 * Competency picker from user plans.\n *\n * To handle 'save' events use: picker.on('save').\n *\n * This will receive a object with either a single 'competencyId', or an array in 'competencyIds'\n * depending on the value of multiSelect.\n *\n * @module tool_lp/competencypicker_user_plans\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'core/str',\n 'tool_lp/tree',\n 'tool_lp/competencypicker'\n ],\n function($, Notification, Ajax, Templates, Str, Tree, PickerBase) {\n\n /**\n * Competency picker in plan class.\n *\n * @class tool_lp/competencypicker_user_plans\n * @param {Number} userId\n * @param {Number|false} singlePlan The ID of the plan when limited to one.\n * @param {Boolean} multiSelect Support multi-select in the tree.\n */\n var Picker = function(userId, singlePlan, multiSelect) {\n PickerBase.prototype.constructor.apply(this, [1, false, 'self', multiSelect]);\n this._userId = userId;\n this._plans = [];\n\n if (singlePlan) {\n this._planId = singlePlan;\n this._singlePlan = true;\n }\n };\n Picker.prototype = Object.create(PickerBase.prototype);\n\n /** @property {Array} The list of plans fetched. */\n Picker.prototype._plans = null;\n /** @property {Number} The current plan ID. */\n Picker.prototype._planId = null;\n /** @property {Boolean} Whether we can browse plans or not. */\n Picker.prototype._singlePlan = false;\n /** @property {Number} The user the plans belongs to. */\n Picker.prototype._userId = null;\n\n /**\n * Hook to executed after the view is rendered.\n *\n * @method _afterRender\n */\n Picker.prototype._afterRender = function() {\n var self = this;\n PickerBase.prototype._afterRender.apply(self, arguments);\n\n // Add listener for framework change.\n if (!self._singlePlan) {\n self._find('[data-action=\"chooseplan\"]').change(function(e) {\n self._planId = $(e.target).val();\n self._loadCompetencies().then(self._refresh.bind(self))\n .catch(Notification.exception);\n });\n }\n };\n\n /**\n * Fetch the competencies.\n *\n * @param {Number} planId The planId.\n * @param {String} searchText Limit the competencies to those matching the text.\n * @method _fetchCompetencies\n * @return {Promise} The promise object.\n */\n Picker.prototype._fetchCompetencies = function(planId, searchText) {\n var self = this;\n\n return Ajax.call([\n {methodname: 'core_competency_list_plan_competencies', args: {\n id: planId\n }}\n ])[0].done(function(competencies) {\n\n // Expand the list of competencies into a fake tree.\n var i, comp;\n var tree = [];\n for (i = 0; i < competencies.length; i++) {\n comp = competencies[i].competency;\n if (comp.shortname.toLowerCase().indexOf(searchText.toLowerCase()) < 0) {\n continue;\n }\n comp.children = [];\n comp.haschildren = 0;\n tree.push(comp);\n }\n\n self._competencies = tree;\n\n }).fail(Notification.exception);\n };\n\n /**\n * Convenience method to get a plan object.\n *\n * @param {Number} id The plan ID.\n * @return {Object|undefined} The plan.\n * @method _getPlan\n */\n Picker.prototype._getPlan = function(id) {\n var plan;\n $.each(this._plans, function(i, f) {\n if (f.id == id) {\n plan = f;\n return;\n }\n });\n return plan;\n };\n\n /**\n * Load the competencies.\n *\n * @method _loadCompetencies\n * @return {Promise}\n */\n Picker.prototype._loadCompetencies = function() {\n return this._fetchCompetencies(this._planId, this._searchText);\n };\n\n /**\n * Load the plans.\n *\n * @method _loadPlans\n * @return {Promise}\n */\n Picker.prototype._loadPlans = function() {\n var promise,\n self = this;\n\n // Quit early because we already have the data.\n if (self._plans.length > 0) {\n return $.when();\n }\n\n if (self._singlePlan) {\n promise = Ajax.call([\n {methodname: 'core_competency_read_plan', args: {\n id: this._planId\n }}\n ])[0].then(function(plan) {\n return [plan];\n });\n } else {\n promise = Ajax.call([\n {methodname: 'core_competency_list_user_plans', args: {\n userid: self._userId\n }}\n ])[0];\n }\n\n return promise.done(function(plans) {\n self._plans = plans;\n }).fail(Notification.exception);\n };\n\n /**\n * Hook to executed before render.\n *\n * @method _preRender\n * @return {Promise}\n */\n Picker.prototype._preRender = function() {\n var self = this;\n return self._loadPlans().then(function() {\n if (!self._planId && self._plans.length > 0) {\n self._planId = self._plans[0].id;\n }\n\n // We could not set a framework ID, that probably means there are no frameworks accessible.\n if (!self._planId) {\n self._plans = [];\n return $.when();\n }\n\n return self._loadCompetencies();\n });\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @return {Promise}\n */\n Picker.prototype._render = function() {\n var self = this;\n return self._preRender().then(function() {\n\n if (!self._singlePlan) {\n $.each(self._plans, function(i, plan) {\n if (plan.id == self._planId) {\n plan.selected = true;\n } else {\n plan.selected = false;\n }\n });\n }\n\n var context = {\n competencies: self._competencies,\n plan: self._getPlan(self._planId),\n plans: self._plans,\n search: self._searchText,\n singlePlan: self._singlePlan,\n };\n\n return Templates.render('tool_lp/competency_picker_user_plans', context);\n });\n };\n\n return Picker;\n});\n"],"names":["define","$","Notification","Ajax","Templates","Str","Tree","PickerBase","Picker","userId","singlePlan","multiSelect","prototype","constructor","apply","this","_userId","_plans","_planId","_singlePlan","Object","create","_afterRender","self","arguments","_find","change","e","target","val","_loadCompetencies","then","_refresh","bind","catch","exception","_fetchCompetencies","planId","searchText","call","methodname","args","id","done","competencies","i","comp","tree","length","competency","shortname","toLowerCase","indexOf","children","haschildren","push","_competencies","fail","_getPlan","plan","each","f","_searchText","_loadPlans","when","userid","plans","_preRender","_render","selected","context","search","render"],"mappings":";;;;;;;;;;;;AA4BAA,6CAAO,CAAC,SACA,oBACA,YACA,iBACA,WACA,eACA,6BAEA,SAASC,EAAGC,aAAcC,KAAMC,UAAWC,IAAKC,KAAMC,gBAUtDC,OAAS,SAASC,OAAQC,WAAYC,aACtCJ,WAAWK,UAAUC,YAAYC,MAAMC,KAAM,CAAC,GAAG,EAAO,OAAQJ,mBAC3DK,QAAUP,YACVQ,OAAS,GAEVP,kBACKQ,QAAUR,gBACVS,aAAc,WAG3BX,OAAOI,UAAYQ,OAAOC,OAAOd,WAAWK,YAG3BK,OAAS,KAE1BT,OAAOI,UAAUM,QAAU,KAE3BV,OAAOI,UAAUO,aAAc,EAE/BX,OAAOI,UAAUI,QAAU,KAO3BR,OAAOI,UAAUU,aAAe,eACxBC,KAAOR,KACXR,WAAWK,UAAUU,aAAaR,MAAMS,KAAMC,WAGzCD,KAAKJ,aACNI,KAAKE,MAAM,8BAA8BC,QAAO,SAASC,GACrDJ,KAAKL,QAAUjB,EAAE0B,EAAEC,QAAQC,MAC3BN,KAAKO,oBAAoBC,KAAKR,KAAKS,SAASC,KAAKV,OAChDW,MAAMhC,aAAaiC,eAahC3B,OAAOI,UAAUwB,mBAAqB,SAASC,OAAQC,gBAC/Cf,KAAOR,YAEJZ,KAAKoC,KAAK,CACb,CAACC,WAAY,yCAA0CC,KAAM,CACzDC,GAAIL,WAET,GAAGM,MAAK,SAASC,kBAGZC,EAAGC,KACHC,KAAO,OACNF,EAAI,EAAGA,EAAID,aAAaI,OAAQH,KACjCC,KAAOF,aAAaC,GAAGI,YACdC,UAAUC,cAAcC,QAAQd,WAAWa,eAAiB,IAGrEL,KAAKO,SAAW,GAChBP,KAAKQ,YAAc,EACnBP,KAAKQ,KAAKT,OAGdvB,KAAKiC,cAAgBT,QAEtBU,KAAKvD,aAAaiC,YAUzB3B,OAAOI,UAAU8C,SAAW,SAAShB,QAC7BiB,YACJ1D,EAAE2D,KAAK7C,KAAKE,QAAQ,SAAS4B,EAAGgB,GACxBA,EAAEnB,IAAMA,KACRiB,KAAOE,MAIRF,MASXnD,OAAOI,UAAUkB,kBAAoB,kBAC1Bf,KAAKqB,mBAAmBrB,KAAKG,QAASH,KAAK+C,cAStDtD,OAAOI,UAAUmD,WAAa,eAEtBxC,KAAOR,YAGPQ,KAAKN,OAAO+B,OAAS,EACd/C,EAAE+D,QAGTzC,KAAKJ,YACKhB,KAAKoC,KAAK,CAChB,CAACC,WAAY,4BAA6BC,KAAM,CAC5CC,GAAI3B,KAAKG,YAEd,GAAGa,MAAK,SAAS4B,YACT,CAACA,SAGFxD,KAAKoC,KAAK,CAChB,CAACC,WAAY,kCAAmCC,KAAM,CAClDwB,OAAQ1C,KAAKP,YAElB,IAGQ2B,MAAK,SAASuB,OACzB3C,KAAKN,OAASiD,SACfT,KAAKvD,aAAaiC,YASzB3B,OAAOI,UAAUuD,WAAa,eACtB5C,KAAOR,YACJQ,KAAKwC,aAAahC,MAAK,kBACrBR,KAAKL,SAAWK,KAAKN,OAAO+B,OAAS,IACtCzB,KAAKL,QAAUK,KAAKN,OAAO,GAAGyB,IAI7BnB,KAAKL,QAKHK,KAAKO,qBAJRP,KAAKN,OAAS,GACPhB,EAAE+D,YAarBxD,OAAOI,UAAUwD,QAAU,eACnB7C,KAAOR,YACJQ,KAAK4C,aAAapC,MAAK,WAErBR,KAAKJ,aACNlB,EAAE2D,KAAKrC,KAAKN,QAAQ,SAAS4B,EAAGc,MACxBA,KAAKjB,IAAMnB,KAAKL,QAChByC,KAAKU,UAAW,EAEhBV,KAAKU,UAAW,SAKxBC,QAAU,CACV1B,aAAcrB,KAAKiC,cACnBG,KAAMpC,KAAKmC,SAASnC,KAAKL,SACzBgD,MAAO3C,KAAKN,OACZsD,OAAQhD,KAAKuC,YACbpD,WAAYa,KAAKJ,oBAGdf,UAAUoE,OAAO,uCAAwCF,aAIjE9D"} \ No newline at end of file +{"version":3,"file":"competencypicker_user_plans.min.js","sources":["../src/competencypicker_user_plans.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 * Competency picker from user plans.\n *\n * To handle 'save' events use: picker.on('save').\n *\n * This will receive a object with either a single 'competencyId', or an array in 'competencyIds'\n * depending on the value of multiSelect.\n *\n * @module tool_lp/competencypicker_user_plans\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'core/str',\n 'tool_lp/tree',\n 'tool_lp/competencypicker'\n ],\n function($, Notification, Ajax, Templates, Str, Tree, PickerBase) {\n\n /**\n * Competency picker in plan class.\n *\n * @class tool_lp/competencypicker_user_plans\n * @param {Number} userId\n * @param {Number|false} singlePlan The ID of the plan when limited to one.\n * @param {Boolean} multiSelect Support multi-select in the tree.\n */\n var Picker = function(userId, singlePlan, multiSelect) {\n PickerBase.prototype.constructor.apply(this, [1, false, 'self', multiSelect]);\n this._userId = userId;\n this._plans = [];\n\n if (singlePlan) {\n this._planId = singlePlan;\n this._singlePlan = true;\n }\n };\n Picker.prototype = Object.create(PickerBase.prototype);\n\n /** @property {Array} The list of plans fetched. */\n Picker.prototype._plans = null;\n /** @property {Number} The current plan ID. */\n Picker.prototype._planId = null;\n /** @property {Boolean} Whether we can browse plans or not. */\n Picker.prototype._singlePlan = false;\n /** @property {Number} The user the plans belongs to. */\n Picker.prototype._userId = null;\n\n /**\n * Hook to executed after the view is rendered.\n *\n * @method _afterRender\n */\n Picker.prototype._afterRender = function() {\n var self = this;\n PickerBase.prototype._afterRender.apply(self, arguments);\n\n // Add listener for framework change.\n if (!self._singlePlan) {\n self._find('[data-action=\"chooseplan\"]').change(function(e) {\n self._planId = $(e.target).val();\n self._loadCompetencies().then(self._refresh.bind(self))\n .catch(Notification.exception);\n });\n }\n };\n\n /**\n * Fetch the competencies.\n *\n * @param {Number} planId The planId.\n * @param {String} searchText Limit the competencies to those matching the text.\n * @method _fetchCompetencies\n * @return {Promise} The promise object.\n */\n Picker.prototype._fetchCompetencies = function(planId, searchText) {\n var self = this;\n\n return Ajax.call([\n {methodname: 'core_competency_list_plan_competencies', args: {\n id: planId\n }}\n ])[0].done(function(competencies) {\n\n // Expand the list of competencies into a fake tree.\n var i, comp;\n var tree = [];\n for (i = 0; i < competencies.length; i++) {\n comp = competencies[i].competency;\n if (comp.shortname.toLowerCase().indexOf(searchText.toLowerCase()) < 0) {\n continue;\n }\n comp.children = [];\n comp.haschildren = 0;\n tree.push(comp);\n }\n\n self._competencies = tree;\n\n }).fail(Notification.exception);\n };\n\n /**\n * Convenience method to get a plan object.\n *\n * @param {Number} id The plan ID.\n * @return {Object|undefined} The plan.\n * @method _getPlan\n */\n Picker.prototype._getPlan = function(id) {\n var plan;\n $.each(this._plans, function(i, f) {\n if (f.id == id) {\n plan = f;\n return;\n }\n });\n return plan;\n };\n\n /**\n * Load the competencies.\n *\n * @method _loadCompetencies\n * @return {Promise}\n */\n Picker.prototype._loadCompetencies = function() {\n return this._fetchCompetencies(this._planId, this._searchText);\n };\n\n /**\n * Load the plans.\n *\n * @method _loadPlans\n * @return {Promise}\n */\n Picker.prototype._loadPlans = function() {\n var promise,\n self = this;\n\n // Quit early because we already have the data.\n if (self._plans.length > 0) {\n return $.when();\n }\n\n if (self._singlePlan) {\n promise = Ajax.call([\n {methodname: 'core_competency_read_plan', args: {\n id: this._planId\n }}\n ])[0].then(function(plan) {\n return [plan];\n });\n } else {\n promise = Ajax.call([\n {methodname: 'core_competency_list_user_plans', args: {\n userid: self._userId\n }}\n ])[0];\n }\n\n return promise.done(function(plans) {\n self._plans = plans;\n }).fail(Notification.exception);\n };\n\n /**\n * Hook to executed before render.\n *\n * @method _preRender\n * @return {Promise}\n */\n Picker.prototype._preRender = function() {\n var self = this;\n return self._loadPlans().then(function() {\n if (!self._planId && self._plans.length > 0) {\n self._planId = self._plans[0].id;\n }\n\n // We could not set a framework ID, that probably means there are no frameworks accessible.\n if (!self._planId) {\n self._plans = [];\n return $.when();\n }\n\n return self._loadCompetencies();\n });\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @return {Promise}\n */\n Picker.prototype._render = function() {\n var self = this;\n return self._preRender().then(function() {\n\n if (!self._singlePlan) {\n $.each(self._plans, function(i, plan) {\n if (plan.id == self._planId) {\n plan.selected = true;\n } else {\n plan.selected = false;\n }\n });\n }\n\n var context = {\n competencies: self._competencies,\n plan: self._getPlan(self._planId),\n plans: self._plans,\n search: self._searchText,\n singlePlan: self._singlePlan,\n };\n\n return Templates.render('tool_lp/competency_picker_user_plans', context);\n });\n };\n\n return Picker;\n});\n"],"names":["define","$","Notification","Ajax","Templates","Str","Tree","PickerBase","Picker","userId","singlePlan","multiSelect","prototype","constructor","apply","this","_userId","_plans","_planId","_singlePlan","Object","create","_afterRender","self","arguments","_find","change","e","target","val","_loadCompetencies","then","_refresh","bind","catch","exception","_fetchCompetencies","planId","searchText","call","methodname","args","id","done","competencies","i","comp","tree","length","competency","shortname","toLowerCase","indexOf","children","haschildren","push","_competencies","fail","_getPlan","plan","each","f","_searchText","_loadPlans","when","userid","plans","_preRender","_render","selected","context","search","render"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencyruleconfig.min.js.map b/admin/tool/lp/amd/build/competencyruleconfig.min.js.map index abb941a1722..bc513ec22e2 100644 --- a/admin/tool/lp/amd/build/competencyruleconfig.min.js.map +++ b/admin/tool/lp/amd/build/competencyruleconfig.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competencyruleconfig.min.js","sources":["../src/competencyruleconfig.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 * Competency rule config.\n *\n * @module tool_lp/competencyruleconfig\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/templates',\n 'tool_lp/dialogue',\n 'tool_lp/competency_outcomes',\n 'core/str'],\n function($, Notification, Templates, Dialogue, Outcomes, Str) {\n\n /**\n * Competency rule class.\n *\n * When implementing this you should attach a listener to the event 'save'\n * on the instance. E.g.\n *\n * var config = new RuleConfig(tree, modules);\n * config.on('save', function(e, config) { ... });\n *\n * @param {competencytree} tree The competency tree.\n * @param {Array} rulesModules The modules containing the rules: [{ typeName: { amd: amdModule, name: ruleName }}].\n */\n var RuleConfig = function(tree, rulesModules) {\n this._eventNode = $('
');\n this._tree = tree;\n this._rulesModules = rulesModules;\n this._setUp();\n };\n\n /** @property {Object} The current competency. */\n RuleConfig.prototype._competency = null;\n /** @property {Node} The node we attach the events to. */\n RuleConfig.prototype._eventNode = null;\n /** @property {Array} Outcomes options. */\n RuleConfig.prototype._outcomesOption = null;\n /** @property {Dialogue} The dialogue. */\n RuleConfig.prototype._popup = null;\n /** @property {Promise} Resolved when the module is ready. */\n RuleConfig.prototype._ready = null;\n /** @property {Array} The rules. */\n RuleConfig.prototype._rules = null;\n /** @property {Array} The rules modules. */\n RuleConfig.prototype._rulesModules = null;\n /** @property {competencytree} The competency tree. */\n RuleConfig.prototype._tree = null;\n\n /**\n * After change.\n *\n * Triggered when a change occured.\n *\n * @method _afterChange\n * @protected\n */\n RuleConfig.prototype._afterChange = function() {\n if (!this._isValid()) {\n this._find('[data-action=\"save\"]').prop('disabled', true);\n } else {\n this._find('[data-action=\"save\"]').prop('disabled', false);\n }\n };\n\n /**\n * After change in rule's config.\n *\n * Triggered when a change occured in a specific rule config.\n *\n * @method _afterRuleConfigChange\n * @protected\n * @param {Event} e\n * @param {Rule} rule\n */\n RuleConfig.prototype._afterRuleConfigChange = function(e, rule) {\n if (rule != this._getRule()) {\n // This rule is not the current one any more, we can ignore.\n return;\n }\n this._afterChange();\n };\n\n /**\n * After render hook.\n *\n * @method _afterRender\n * @protected\n */\n RuleConfig.prototype._afterRender = function() {\n var self = this;\n\n self._find('[name=\"outcome\"]').on('change', function() {\n self._switchedOutcome();\n }).trigger('change');\n\n self._find('[name=\"rule\"]').on('change', function() {\n self._switchedRule();\n }).trigger('change');\n\n self._find('[data-action=\"save\"]').on('click', function() {\n self._trigger('save', self._getConfig());\n self.close();\n });\n\n self._find('[data-action=\"cancel\"]').on('click', function() {\n self.close();\n });\n };\n\n /**\n * Whether the current competency can be configured.\n *\n * @return {Boolean}\n * @method canBeConfigured\n */\n RuleConfig.prototype.canBeConfigured = function() {\n var can = false;\n $.each(this._rules, function(index, rule) {\n if (rule.canConfig()) {\n can = true;\n return;\n }\n });\n return can;\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n RuleConfig.prototype.close = function() {\n this._popup.close();\n this._popup = null;\n };\n\n /**\n * Opens the picker.\n *\n * @method display\n * @returns {Promise}\n */\n RuleConfig.prototype.display = function() {\n var self = this;\n if (!self._competency) {\n return false;\n }\n return $.when(Str.get_string('competencyrule', 'tool_lp'), self._render())\n .then(function(title, render) {\n self._popup = new Dialogue(\n title,\n render[0],\n self._afterRender.bind(self)\n );\n return;\n }).fail(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @return {JQuery}\n * @method _find\n * @protected\n */\n RuleConfig.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Get the applicable outcome options.\n *\n * @return {Array}\n * @method _getApplicableOutcomesOptions\n * @protected\n */\n RuleConfig.prototype._getApplicableOutcomesOptions = function() {\n var self = this,\n options = [];\n\n $.each(self._outcomesOption, function(index, outcome) {\n options.push({\n code: outcome.code,\n name: outcome.name,\n selected: (outcome.code == self._competency.ruleoutcome) ? true : false,\n });\n });\n\n return options;\n };\n\n /**\n * Get the applicable rules options.\n *\n * @return {Array}\n * @method _getApplicableRulesOptions\n * @protected\n */\n RuleConfig.prototype._getApplicableRulesOptions = function() {\n var self = this,\n options = [];\n\n $.each(self._rules, function(index, rule) {\n if (!rule.canConfig()) {\n return;\n }\n options.push({\n name: self._getRuleName(rule.getType()),\n type: rule.getType(),\n selected: (rule.getType() == self._competency.ruletype) ? true : false,\n });\n });\n\n return options;\n };\n\n /**\n * Get the full config for the competency.\n *\n * @return {Object} Contains rule, ruleoutcome and ruleconfig.\n * @method _getConfig\n * @protected\n */\n RuleConfig.prototype._getConfig = function() {\n var rule = this._getRule();\n return {\n ruletype: rule ? rule.getType() : null,\n ruleconfig: rule ? rule.getConfig() : null,\n ruleoutcome: this._getOutcome()\n };\n };\n\n /**\n * Get the selected outcome code.\n *\n * @return {String}\n * @method _getOutcome\n * @protected\n */\n RuleConfig.prototype._getOutcome = function() {\n return this._find('[name=\"outcome\"]').val();\n };\n\n /**\n * Get the selected rule.\n *\n * @return {null|Rule}\n * @method _getRule\n * @protected\n */\n RuleConfig.prototype._getRule = function() {\n var result,\n type = this._find('[name=\"rule\"]').val();\n\n $.each(this._rules, function(index, rule) {\n if (rule.getType() == type) {\n result = rule;\n return;\n }\n });\n\n return result;\n };\n\n /**\n * Return the name of a rule.\n *\n * @param {String} type The type of a rule.\n * @return {String}\n * @method _getRuleName\n * @protected\n */\n RuleConfig.prototype._getRuleName = function(type) {\n var self = this,\n name;\n $.each(self._rulesModules, function(index, modInfo) {\n if (modInfo.type == type) {\n name = modInfo.name;\n return;\n }\n });\n return name;\n };\n\n /**\n * Initialise the outcomes.\n *\n * @return {Promise}\n * @method _initOutcomes\n * @protected\n */\n RuleConfig.prototype._initOutcomes = function() {\n var self = this;\n return Outcomes.getAll().then(function(outcomes) {\n self._outcomesOption = outcomes;\n return;\n });\n };\n\n /**\n * Initialise the rules.\n *\n * @return {Promise}\n * @method _initRules\n * @protected\n */\n RuleConfig.prototype._initRules = function() {\n var self = this,\n promises = [];\n $.each(self._rules, function(index, rule) {\n var promise = rule.init().then(function() {\n rule.setTargetCompetency(self._competency);\n rule.on('change', self._afterRuleConfigChange.bind(self));\n return;\n }, function() {\n // Upon failure remove the rule, and resolve the promise.\n self._rules.splice(index, 1);\n return $.when();\n });\n promises.push(promise);\n });\n\n return $.when.apply($.when, promises);\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * @return {Boolean}\n * @method _isValid\n * @protected\n */\n RuleConfig.prototype._isValid = function() {\n var outcome = this._getOutcome(),\n rule = this._getRule();\n\n if (outcome == Outcomes.NONE) {\n return true;\n } else if (!rule) {\n return false;\n }\n\n return rule.isValid();\n };\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n RuleConfig.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Hook to executed before render.\n *\n * @method _preRender\n * @protected\n * @return {Promise}\n */\n RuleConfig.prototype._preRender = function() {\n // We need to have all the information about the rule plugins first.\n return this.ready();\n };\n\n /**\n * Returns a promise that is resolved when the module is ready.\n *\n * @return {Promise}\n * @method ready\n * @protected\n */\n RuleConfig.prototype.ready = function() {\n return this._ready.promise();\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @protected\n * @return {Promise}\n */\n RuleConfig.prototype._render = function() {\n var self = this;\n return this._preRender().then(function() {\n var config;\n\n if (!self.canBeConfigured()) {\n config = false;\n } else {\n config = {};\n config.outcomes = self._getApplicableOutcomesOptions();\n config.rules = self._getApplicableRulesOptions();\n }\n\n var context = {\n competencyshortname: self._competency.shortname,\n config: config\n };\n\n return Templates.render('tool_lp/competency_rule_config', context);\n });\n };\n\n /**\n * Set the target competency.\n *\n * @param {Number} competencyId The target competency Id.\n * @method setTargetCompetencyId\n */\n RuleConfig.prototype.setTargetCompetencyId = function(competencyId) {\n var self = this;\n self._competency = self._tree.getCompetency(competencyId);\n $.each(self._rules, function(index, rule) {\n rule.setTargetCompetency(self._competency);\n });\n };\n\n /**\n * Set up the instance.\n *\n * @method _setUp\n * @protected\n */\n RuleConfig.prototype._setUp = function() {\n var self = this,\n promises = [],\n modules = [];\n\n self._ready = $.Deferred();\n self._rules = [];\n\n $.each(self._rulesModules, function(index, rule) {\n modules.push(rule.amd);\n });\n\n // Load all the modules.\n require(modules, function() {\n $.each(arguments, function(index, Module) {\n // Instantiate the rule and listen to it.\n var rule = new Module(self._tree);\n self._rules.push(rule);\n });\n\n // Load all the option values.\n promises.push(self._initRules());\n promises.push(self._initOutcomes());\n\n // Ready when everything is done.\n $.when.apply($.when, promises).always(function() {\n self._ready.resolve();\n });\n });\n };\n\n /**\n * Called when the user switches outcome.\n *\n * @method _switchedOutcome\n * @protected\n */\n RuleConfig.prototype._switchedOutcome = function() {\n var self = this,\n type = self._getOutcome();\n\n if (type == Outcomes.NONE) {\n // Reset to defaults.\n self._find('[data-region=\"rule-type\"]').hide()\n .find('[name=\"rule\"]').val(-1);\n self._find('[data-region=\"rule-config\"]').empty().hide();\n self._afterChange();\n return;\n }\n\n self._find('[data-region=\"rule-type\"]').show();\n self._find('[data-region=\"rule-config\"]').show();\n self._afterChange();\n };\n\n /**\n * Called when the user switches rule.\n *\n * @method _switchedRule\n * @protected\n */\n RuleConfig.prototype._switchedRule = function() {\n var self = this,\n container = self._find('[data-region=\"rule-config\"]'),\n rule = self._getRule();\n\n if (!rule) {\n container.empty().hide();\n self._afterChange();\n return;\n }\n rule.injectTemplate(container).then(function() {\n container.show();\n return;\n }).always(function() {\n self._afterChange();\n }).catch(function() {\n container.empty().hide();\n });\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _trigger\n * @protected\n */\n RuleConfig.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n return /** @alias module:tool_lp/competencyruleconfig */ RuleConfig;\n\n});\n"],"names":["define","$","Notification","Templates","Dialogue","Outcomes","Str","RuleConfig","tree","rulesModules","_eventNode","_tree","_rulesModules","_setUp","prototype","_competency","_outcomesOption","_popup","_ready","_rules","_afterChange","this","_isValid","_find","prop","_afterRuleConfigChange","e","rule","_getRule","_afterRender","self","on","_switchedOutcome","trigger","_switchedRule","_trigger","_getConfig","close","canBeConfigured","can","each","index","canConfig","display","when","get_string","_render","then","title","render","bind","fail","exception","selector","getContent","find","_getApplicableOutcomesOptions","options","outcome","push","code","name","selected","ruleoutcome","_getApplicableRulesOptions","_getRuleName","getType","type","ruletype","ruleconfig","getConfig","_getOutcome","val","result","modInfo","_initOutcomes","getAll","outcomes","_initRules","promises","promise","init","setTargetCompetency","splice","apply","NONE","isValid","handler","_preRender","ready","config","rules","context","competencyshortname","shortname","setTargetCompetencyId","competencyId","getCompetency","modules","Deferred","amd","require","arguments","Module","always","resolve","hide","empty","show","container","injectTemplate","catch","data"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"competencyruleconfig.min.js","sources":["../src/competencyruleconfig.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 * Competency rule config.\n *\n * @module tool_lp/competencyruleconfig\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/templates',\n 'tool_lp/dialogue',\n 'tool_lp/competency_outcomes',\n 'core/str'],\n function($, Notification, Templates, Dialogue, Outcomes, Str) {\n\n /**\n * Competency rule class.\n *\n * When implementing this you should attach a listener to the event 'save'\n * on the instance. E.g.\n *\n * var config = new RuleConfig(tree, modules);\n * config.on('save', function(e, config) { ... });\n *\n * @param {competencytree} tree The competency tree.\n * @param {Array} rulesModules The modules containing the rules: [{ typeName: { amd: amdModule, name: ruleName }}].\n */\n var RuleConfig = function(tree, rulesModules) {\n this._eventNode = $('
');\n this._tree = tree;\n this._rulesModules = rulesModules;\n this._setUp();\n };\n\n /** @property {Object} The current competency. */\n RuleConfig.prototype._competency = null;\n /** @property {Node} The node we attach the events to. */\n RuleConfig.prototype._eventNode = null;\n /** @property {Array} Outcomes options. */\n RuleConfig.prototype._outcomesOption = null;\n /** @property {Dialogue} The dialogue. */\n RuleConfig.prototype._popup = null;\n /** @property {Promise} Resolved when the module is ready. */\n RuleConfig.prototype._ready = null;\n /** @property {Array} The rules. */\n RuleConfig.prototype._rules = null;\n /** @property {Array} The rules modules. */\n RuleConfig.prototype._rulesModules = null;\n /** @property {competencytree} The competency tree. */\n RuleConfig.prototype._tree = null;\n\n /**\n * After change.\n *\n * Triggered when a change occured.\n *\n * @method _afterChange\n * @protected\n */\n RuleConfig.prototype._afterChange = function() {\n if (!this._isValid()) {\n this._find('[data-action=\"save\"]').prop('disabled', true);\n } else {\n this._find('[data-action=\"save\"]').prop('disabled', false);\n }\n };\n\n /**\n * After change in rule's config.\n *\n * Triggered when a change occured in a specific rule config.\n *\n * @method _afterRuleConfigChange\n * @protected\n * @param {Event} e\n * @param {Rule} rule\n */\n RuleConfig.prototype._afterRuleConfigChange = function(e, rule) {\n if (rule != this._getRule()) {\n // This rule is not the current one any more, we can ignore.\n return;\n }\n this._afterChange();\n };\n\n /**\n * After render hook.\n *\n * @method _afterRender\n * @protected\n */\n RuleConfig.prototype._afterRender = function() {\n var self = this;\n\n self._find('[name=\"outcome\"]').on('change', function() {\n self._switchedOutcome();\n }).trigger('change');\n\n self._find('[name=\"rule\"]').on('change', function() {\n self._switchedRule();\n }).trigger('change');\n\n self._find('[data-action=\"save\"]').on('click', function() {\n self._trigger('save', self._getConfig());\n self.close();\n });\n\n self._find('[data-action=\"cancel\"]').on('click', function() {\n self.close();\n });\n };\n\n /**\n * Whether the current competency can be configured.\n *\n * @return {Boolean}\n * @method canBeConfigured\n */\n RuleConfig.prototype.canBeConfigured = function() {\n var can = false;\n $.each(this._rules, function(index, rule) {\n if (rule.canConfig()) {\n can = true;\n return;\n }\n });\n return can;\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n RuleConfig.prototype.close = function() {\n this._popup.close();\n this._popup = null;\n };\n\n /**\n * Opens the picker.\n *\n * @method display\n * @returns {Promise}\n */\n RuleConfig.prototype.display = function() {\n var self = this;\n if (!self._competency) {\n return false;\n }\n return $.when(Str.get_string('competencyrule', 'tool_lp'), self._render())\n .then(function(title, render) {\n self._popup = new Dialogue(\n title,\n render[0],\n self._afterRender.bind(self)\n );\n return;\n }).fail(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @return {JQuery}\n * @method _find\n * @protected\n */\n RuleConfig.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Get the applicable outcome options.\n *\n * @return {Array}\n * @method _getApplicableOutcomesOptions\n * @protected\n */\n RuleConfig.prototype._getApplicableOutcomesOptions = function() {\n var self = this,\n options = [];\n\n $.each(self._outcomesOption, function(index, outcome) {\n options.push({\n code: outcome.code,\n name: outcome.name,\n selected: (outcome.code == self._competency.ruleoutcome) ? true : false,\n });\n });\n\n return options;\n };\n\n /**\n * Get the applicable rules options.\n *\n * @return {Array}\n * @method _getApplicableRulesOptions\n * @protected\n */\n RuleConfig.prototype._getApplicableRulesOptions = function() {\n var self = this,\n options = [];\n\n $.each(self._rules, function(index, rule) {\n if (!rule.canConfig()) {\n return;\n }\n options.push({\n name: self._getRuleName(rule.getType()),\n type: rule.getType(),\n selected: (rule.getType() == self._competency.ruletype) ? true : false,\n });\n });\n\n return options;\n };\n\n /**\n * Get the full config for the competency.\n *\n * @return {Object} Contains rule, ruleoutcome and ruleconfig.\n * @method _getConfig\n * @protected\n */\n RuleConfig.prototype._getConfig = function() {\n var rule = this._getRule();\n return {\n ruletype: rule ? rule.getType() : null,\n ruleconfig: rule ? rule.getConfig() : null,\n ruleoutcome: this._getOutcome()\n };\n };\n\n /**\n * Get the selected outcome code.\n *\n * @return {String}\n * @method _getOutcome\n * @protected\n */\n RuleConfig.prototype._getOutcome = function() {\n return this._find('[name=\"outcome\"]').val();\n };\n\n /**\n * Get the selected rule.\n *\n * @return {null|Rule}\n * @method _getRule\n * @protected\n */\n RuleConfig.prototype._getRule = function() {\n var result,\n type = this._find('[name=\"rule\"]').val();\n\n $.each(this._rules, function(index, rule) {\n if (rule.getType() == type) {\n result = rule;\n return;\n }\n });\n\n return result;\n };\n\n /**\n * Return the name of a rule.\n *\n * @param {String} type The type of a rule.\n * @return {String}\n * @method _getRuleName\n * @protected\n */\n RuleConfig.prototype._getRuleName = function(type) {\n var self = this,\n name;\n $.each(self._rulesModules, function(index, modInfo) {\n if (modInfo.type == type) {\n name = modInfo.name;\n return;\n }\n });\n return name;\n };\n\n /**\n * Initialise the outcomes.\n *\n * @return {Promise}\n * @method _initOutcomes\n * @protected\n */\n RuleConfig.prototype._initOutcomes = function() {\n var self = this;\n return Outcomes.getAll().then(function(outcomes) {\n self._outcomesOption = outcomes;\n return;\n });\n };\n\n /**\n * Initialise the rules.\n *\n * @return {Promise}\n * @method _initRules\n * @protected\n */\n RuleConfig.prototype._initRules = function() {\n var self = this,\n promises = [];\n $.each(self._rules, function(index, rule) {\n var promise = rule.init().then(function() {\n rule.setTargetCompetency(self._competency);\n rule.on('change', self._afterRuleConfigChange.bind(self));\n return;\n }, function() {\n // Upon failure remove the rule, and resolve the promise.\n self._rules.splice(index, 1);\n return $.when();\n });\n promises.push(promise);\n });\n\n return $.when.apply($.when, promises);\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * @return {Boolean}\n * @method _isValid\n * @protected\n */\n RuleConfig.prototype._isValid = function() {\n var outcome = this._getOutcome(),\n rule = this._getRule();\n\n if (outcome == Outcomes.NONE) {\n return true;\n } else if (!rule) {\n return false;\n }\n\n return rule.isValid();\n };\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n RuleConfig.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Hook to executed before render.\n *\n * @method _preRender\n * @protected\n * @return {Promise}\n */\n RuleConfig.prototype._preRender = function() {\n // We need to have all the information about the rule plugins first.\n return this.ready();\n };\n\n /**\n * Returns a promise that is resolved when the module is ready.\n *\n * @return {Promise}\n * @method ready\n * @protected\n */\n RuleConfig.prototype.ready = function() {\n return this._ready.promise();\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @protected\n * @return {Promise}\n */\n RuleConfig.prototype._render = function() {\n var self = this;\n return this._preRender().then(function() {\n var config;\n\n if (!self.canBeConfigured()) {\n config = false;\n } else {\n config = {};\n config.outcomes = self._getApplicableOutcomesOptions();\n config.rules = self._getApplicableRulesOptions();\n }\n\n var context = {\n competencyshortname: self._competency.shortname,\n config: config\n };\n\n return Templates.render('tool_lp/competency_rule_config', context);\n });\n };\n\n /**\n * Set the target competency.\n *\n * @param {Number} competencyId The target competency Id.\n * @method setTargetCompetencyId\n */\n RuleConfig.prototype.setTargetCompetencyId = function(competencyId) {\n var self = this;\n self._competency = self._tree.getCompetency(competencyId);\n $.each(self._rules, function(index, rule) {\n rule.setTargetCompetency(self._competency);\n });\n };\n\n /**\n * Set up the instance.\n *\n * @method _setUp\n * @protected\n */\n RuleConfig.prototype._setUp = function() {\n var self = this,\n promises = [],\n modules = [];\n\n self._ready = $.Deferred();\n self._rules = [];\n\n $.each(self._rulesModules, function(index, rule) {\n modules.push(rule.amd);\n });\n\n // Load all the modules.\n require(modules, function() {\n $.each(arguments, function(index, Module) {\n // Instantiate the rule and listen to it.\n var rule = new Module(self._tree);\n self._rules.push(rule);\n });\n\n // Load all the option values.\n promises.push(self._initRules());\n promises.push(self._initOutcomes());\n\n // Ready when everything is done.\n $.when.apply($.when, promises).always(function() {\n self._ready.resolve();\n });\n });\n };\n\n /**\n * Called when the user switches outcome.\n *\n * @method _switchedOutcome\n * @protected\n */\n RuleConfig.prototype._switchedOutcome = function() {\n var self = this,\n type = self._getOutcome();\n\n if (type == Outcomes.NONE) {\n // Reset to defaults.\n self._find('[data-region=\"rule-type\"]').hide()\n .find('[name=\"rule\"]').val(-1);\n self._find('[data-region=\"rule-config\"]').empty().hide();\n self._afterChange();\n return;\n }\n\n self._find('[data-region=\"rule-type\"]').show();\n self._find('[data-region=\"rule-config\"]').show();\n self._afterChange();\n };\n\n /**\n * Called when the user switches rule.\n *\n * @method _switchedRule\n * @protected\n */\n RuleConfig.prototype._switchedRule = function() {\n var self = this,\n container = self._find('[data-region=\"rule-config\"]'),\n rule = self._getRule();\n\n if (!rule) {\n container.empty().hide();\n self._afterChange();\n return;\n }\n rule.injectTemplate(container).then(function() {\n container.show();\n return;\n }).always(function() {\n self._afterChange();\n }).catch(function() {\n container.empty().hide();\n });\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _trigger\n * @protected\n */\n RuleConfig.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n return /** @alias module:tool_lp/competencyruleconfig */ RuleConfig;\n\n});\n"],"names":["define","$","Notification","Templates","Dialogue","Outcomes","Str","RuleConfig","tree","rulesModules","this","_eventNode","_tree","_rulesModules","_setUp","prototype","_competency","_outcomesOption","_popup","_ready","_rules","_afterChange","_isValid","_find","prop","_afterRuleConfigChange","e","rule","_getRule","_afterRender","self","on","_switchedOutcome","trigger","_switchedRule","_trigger","_getConfig","close","canBeConfigured","can","each","index","canConfig","display","when","get_string","_render","then","title","render","bind","fail","exception","selector","getContent","find","_getApplicableOutcomesOptions","options","outcome","push","code","name","selected","ruleoutcome","_getApplicableRulesOptions","_getRuleName","getType","type","ruletype","ruleconfig","getConfig","_getOutcome","val","result","modInfo","_initOutcomes","getAll","outcomes","_initRules","promises","promise","init","setTargetCompetency","splice","apply","NONE","isValid","handler","_preRender","ready","config","rules","context","competencyshortname","shortname","setTargetCompetencyId","competencyId","getCompetency","modules","Deferred","amd","require","arguments","Module","always","resolve","hide","empty","show","container","injectTemplate","catch","data"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencytree.min.js.map b/admin/tool/lp/amd/build/competencytree.min.js.map index 124a061992d..7336ad23026 100644 --- a/admin/tool/lp/amd/build/competencytree.min.js.map +++ b/admin/tool/lp/amd/build/competencytree.min.js.map @@ -1 +1 @@ -{"version":3,"file":"competencytree.min.js","sources":["../src/competencytree.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 * Handle selection changes on the competency tree.\n *\n * @module tool_lp/competencyselect\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/ajax', 'core/notification', 'core/templates', 'tool_lp/tree', 'tool_lp/competency_outcomes', 'jquery'],\n function(ajax, notification, templates, Ariatree, CompOutcomes, $) {\n\n // Private variables and functions.\n /** @var {Object[]} competencies - Cached list of competencies */\n var competencies = {};\n\n /** @var {Number} competencyFrameworkId - The current framework id */\n var competencyFrameworkId = 0;\n\n /** @var {String} competencyFrameworkShortName - The current framework short name */\n var competencyFrameworkShortName = '';\n\n /** @var {String} treeSelector - The selector for the root of the tree. */\n var treeSelector = '';\n\n /** @var {String} currentNodeId - The data-id of the current node in the tree. */\n var currentNodeId = '';\n\n /** @var {Boolean} competencyFramworkCanManage - Can manage the competencies framework */\n var competencyFramworkCanManage = false;\n\n /**\n * Build a tree from the flat list of competencies.\n * @param {Object} parent The parent competency.\n * @param {Array} all The list of all competencies.\n */\n var addChildren = function(parent, all) {\n var i = 0;\n var current = false;\n parent.haschildren = false;\n parent.children = [];\n for (i = 0; i < all.length; i++) {\n current = all[i];\n if (current.parentid == parent.id) {\n parent.haschildren = true;\n parent.children.push(current);\n addChildren(current, all);\n }\n }\n };\n\n /**\n * Load the list of competencies via ajax. Competencies are filtered by the searchtext.\n * @param {String} searchtext The text to filter on.\n * @return {promise}\n */\n var loadCompetencies = function(searchtext) {\n var deferred = $.Deferred();\n\n templates.render('tool_lp/loading', {}).done(function(loadinghtml, loadingjs) {\n templates.replaceNodeContents($(treeSelector), loadinghtml, loadingjs);\n\n var promises = ajax.call([{\n methodname: 'core_competency_search_competencies',\n args: {\n searchtext: searchtext,\n competencyframeworkid: competencyFrameworkId\n }\n }]);\n promises[0].done(function(result) {\n competencies = {};\n var i = 0;\n for (i = 0; i < result.length; i++) {\n competencies[result[i].id] = result[i];\n }\n\n var children = [];\n var competency = false;\n for (i = 0; i < result.length; i++) {\n competency = result[i];\n if (parseInt(competency.parentid, 10) === 0) {\n children.push(competency);\n addChildren(competency, result);\n }\n }\n var context = {\n shortname: competencyFrameworkShortName,\n canmanage: competencyFramworkCanManage,\n competencies: children\n };\n templates.render('tool_lp/competencies_tree_root', context).done(function(html, js) {\n templates.replaceNodeContents($(treeSelector), $(html).html(), js);\n var tree = new Ariatree(treeSelector, false);\n\n if (currentNodeId) {\n var node = $(treeSelector).find('[data-id=' + currentNodeId + ']');\n if (node.length) {\n tree.selectItem(node);\n tree.updateFocus(node);\n }\n }\n deferred.resolve(competencies);\n }).fail(deferred.reject);\n }).fail(deferred.reject);\n });\n\n return deferred.promise();\n };\n\n /**\n * Whenever the current item in the tree is changed - remember the \"id\".\n * @param {Event} evt\n * @param {Object} params The parameters for the event (This is the selected node).\n */\n var rememberCurrent = function(evt, params) {\n var node = params.selected;\n currentNodeId = node.attr('data-id');\n };\n\n return /** @alias module:tool_lp/competencytree */ {\n // Public variables and functions.\n /**\n * Initialise the tree.\n *\n * @param {Number} id The competency framework id.\n * @param {String} shortname The framework shortname\n * @param {String} search The current search string\n * @param {String} selector The selector for the tree div\n * @param {Boolean} canmanage Can manage the competencies\n * @param {Number} competencyid The id of the competency to show first\n */\n init: function(id, shortname, search, selector, canmanage, competencyid) {\n competencyFrameworkId = id;\n competencyFrameworkShortName = shortname;\n competencyFramworkCanManage = canmanage;\n treeSelector = selector;\n loadCompetencies(search).fail(notification.exception);\n if (competencyid > 0) {\n currentNodeId = competencyid;\n }\n\n this.on('selectionchanged', rememberCurrent);\n },\n\n /**\n * Add an event handler for custom events emitted by the tree.\n *\n * @param {String} eventname The name of the event - only \"selectionchanged\" for now\n * @param {Function} handler The handler for the event.\n */\n on: function(eventname, handler) {\n // We can't use the tree on function directly\n // because the tree gets rebuilt whenever the search string changes,\n // instead we attach the listner to the root node of the tree which never\n // gets destroyed (same as \"on()\" code in the tree.js).\n $(treeSelector).on(eventname, handler);\n },\n\n /**\n * Get the children of a competency.\n *\n * @param {Number} id The competency ID.\n * @return {Array}\n * @method getChildren\n */\n getChildren: function(id) {\n var children = [];\n $.each(competencies, function(index, competency) {\n if (competency.parentid == id) {\n children.push(competency);\n }\n });\n return children;\n },\n\n /**\n * Get the competency framework id this model was initiliased with.\n *\n * @return {Number}\n */\n getCompetencyFrameworkId: function() {\n return competencyFrameworkId;\n },\n\n /**\n * Get a competency by id\n *\n * @param {Number} id The competency id\n * @return {Object}\n */\n getCompetency: function(id) {\n return competencies[id];\n },\n\n /**\n * Get the competency level.\n *\n * @param {Number} id The competency ID.\n * @return {Number}\n */\n getCompetencyLevel: function(id) {\n var competency = this.getCompetency(id),\n level = competency.path.replace(/^\\/|\\/$/g, '').split('/').length;\n return level;\n },\n\n /**\n * Whether a competency has children.\n *\n * @param {Number} id The competency ID.\n * @return {Boolean}\n * @method hasChildren\n */\n hasChildren: function(id) {\n return this.getChildren(id).length > 0;\n },\n\n /**\n * Does the competency have a rule?\n *\n * @param {Number} id The competency ID.\n * @return {Boolean}\n */\n hasRule: function(id) {\n var comp = this.getCompetency(id);\n if (comp) {\n return comp.ruleoutcome != CompOutcomes.OUTCOME_NONE\n && comp.ruletype;\n }\n return false;\n },\n\n /**\n * Reload all the page competencies framework competencies.\n * @method reloadCompetencies\n * @return {Promise}\n */\n reloadCompetencies: function() {\n return loadCompetencies('').fail(notification.exception);\n },\n\n /**\n * Get all competencies for this framework.\n *\n * @return {Object[]}\n */\n listCompetencies: function() {\n return competencies;\n },\n\n };\n });\n"],"names":["define","ajax","notification","templates","Ariatree","CompOutcomes","$","competencies","competencyFrameworkId","competencyFrameworkShortName","treeSelector","currentNodeId","competencyFramworkCanManage","addChildren","parent","all","i","current","haschildren","children","length","parentid","id","push","loadCompetencies","searchtext","deferred","Deferred","render","done","loadinghtml","loadingjs","replaceNodeContents","call","methodname","args","competencyframeworkid","result","competency","parseInt","context","shortname","canmanage","html","js","tree","node","find","selectItem","updateFocus","resolve","fail","reject","promise","rememberCurrent","evt","params","selected","attr","init","search","selector","competencyid","exception","on","eventname","handler","getChildren","each","index","getCompetencyFrameworkId","getCompetency","getCompetencyLevel","this","path","replace","split","hasChildren","hasRule","comp","ruleoutcome","OUTCOME_NONE","ruletype","reloadCompetencies","listCompetencies"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"competencytree.min.js","sources":["../src/competencytree.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 * Handle selection changes on the competency tree.\n *\n * @module tool_lp/competencyselect\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/ajax', 'core/notification', 'core/templates', 'tool_lp/tree', 'tool_lp/competency_outcomes', 'jquery'],\n function(ajax, notification, templates, Ariatree, CompOutcomes, $) {\n\n // Private variables and functions.\n /** @var {Object[]} competencies - Cached list of competencies */\n var competencies = {};\n\n /** @var {Number} competencyFrameworkId - The current framework id */\n var competencyFrameworkId = 0;\n\n /** @var {String} competencyFrameworkShortName - The current framework short name */\n var competencyFrameworkShortName = '';\n\n /** @var {String} treeSelector - The selector for the root of the tree. */\n var treeSelector = '';\n\n /** @var {String} currentNodeId - The data-id of the current node in the tree. */\n var currentNodeId = '';\n\n /** @var {Boolean} competencyFramworkCanManage - Can manage the competencies framework */\n var competencyFramworkCanManage = false;\n\n /**\n * Build a tree from the flat list of competencies.\n * @param {Object} parent The parent competency.\n * @param {Array} all The list of all competencies.\n */\n var addChildren = function(parent, all) {\n var i = 0;\n var current = false;\n parent.haschildren = false;\n parent.children = [];\n for (i = 0; i < all.length; i++) {\n current = all[i];\n if (current.parentid == parent.id) {\n parent.haschildren = true;\n parent.children.push(current);\n addChildren(current, all);\n }\n }\n };\n\n /**\n * Load the list of competencies via ajax. Competencies are filtered by the searchtext.\n * @param {String} searchtext The text to filter on.\n * @return {promise}\n */\n var loadCompetencies = function(searchtext) {\n var deferred = $.Deferred();\n\n templates.render('tool_lp/loading', {}).done(function(loadinghtml, loadingjs) {\n templates.replaceNodeContents($(treeSelector), loadinghtml, loadingjs);\n\n var promises = ajax.call([{\n methodname: 'core_competency_search_competencies',\n args: {\n searchtext: searchtext,\n competencyframeworkid: competencyFrameworkId\n }\n }]);\n promises[0].done(function(result) {\n competencies = {};\n var i = 0;\n for (i = 0; i < result.length; i++) {\n competencies[result[i].id] = result[i];\n }\n\n var children = [];\n var competency = false;\n for (i = 0; i < result.length; i++) {\n competency = result[i];\n if (parseInt(competency.parentid, 10) === 0) {\n children.push(competency);\n addChildren(competency, result);\n }\n }\n var context = {\n shortname: competencyFrameworkShortName,\n canmanage: competencyFramworkCanManage,\n competencies: children\n };\n templates.render('tool_lp/competencies_tree_root', context).done(function(html, js) {\n templates.replaceNodeContents($(treeSelector), $(html).html(), js);\n var tree = new Ariatree(treeSelector, false);\n\n if (currentNodeId) {\n var node = $(treeSelector).find('[data-id=' + currentNodeId + ']');\n if (node.length) {\n tree.selectItem(node);\n tree.updateFocus(node);\n }\n }\n deferred.resolve(competencies);\n }).fail(deferred.reject);\n }).fail(deferred.reject);\n });\n\n return deferred.promise();\n };\n\n /**\n * Whenever the current item in the tree is changed - remember the \"id\".\n * @param {Event} evt\n * @param {Object} params The parameters for the event (This is the selected node).\n */\n var rememberCurrent = function(evt, params) {\n var node = params.selected;\n currentNodeId = node.attr('data-id');\n };\n\n return /** @alias module:tool_lp/competencytree */ {\n // Public variables and functions.\n /**\n * Initialise the tree.\n *\n * @param {Number} id The competency framework id.\n * @param {String} shortname The framework shortname\n * @param {String} search The current search string\n * @param {String} selector The selector for the tree div\n * @param {Boolean} canmanage Can manage the competencies\n * @param {Number} competencyid The id of the competency to show first\n */\n init: function(id, shortname, search, selector, canmanage, competencyid) {\n competencyFrameworkId = id;\n competencyFrameworkShortName = shortname;\n competencyFramworkCanManage = canmanage;\n treeSelector = selector;\n loadCompetencies(search).fail(notification.exception);\n if (competencyid > 0) {\n currentNodeId = competencyid;\n }\n\n this.on('selectionchanged', rememberCurrent);\n },\n\n /**\n * Add an event handler for custom events emitted by the tree.\n *\n * @param {String} eventname The name of the event - only \"selectionchanged\" for now\n * @param {Function} handler The handler for the event.\n */\n on: function(eventname, handler) {\n // We can't use the tree on function directly\n // because the tree gets rebuilt whenever the search string changes,\n // instead we attach the listner to the root node of the tree which never\n // gets destroyed (same as \"on()\" code in the tree.js).\n $(treeSelector).on(eventname, handler);\n },\n\n /**\n * Get the children of a competency.\n *\n * @param {Number} id The competency ID.\n * @return {Array}\n * @method getChildren\n */\n getChildren: function(id) {\n var children = [];\n $.each(competencies, function(index, competency) {\n if (competency.parentid == id) {\n children.push(competency);\n }\n });\n return children;\n },\n\n /**\n * Get the competency framework id this model was initiliased with.\n *\n * @return {Number}\n */\n getCompetencyFrameworkId: function() {\n return competencyFrameworkId;\n },\n\n /**\n * Get a competency by id\n *\n * @param {Number} id The competency id\n * @return {Object}\n */\n getCompetency: function(id) {\n return competencies[id];\n },\n\n /**\n * Get the competency level.\n *\n * @param {Number} id The competency ID.\n * @return {Number}\n */\n getCompetencyLevel: function(id) {\n var competency = this.getCompetency(id),\n level = competency.path.replace(/^\\/|\\/$/g, '').split('/').length;\n return level;\n },\n\n /**\n * Whether a competency has children.\n *\n * @param {Number} id The competency ID.\n * @return {Boolean}\n * @method hasChildren\n */\n hasChildren: function(id) {\n return this.getChildren(id).length > 0;\n },\n\n /**\n * Does the competency have a rule?\n *\n * @param {Number} id The competency ID.\n * @return {Boolean}\n */\n hasRule: function(id) {\n var comp = this.getCompetency(id);\n if (comp) {\n return comp.ruleoutcome != CompOutcomes.OUTCOME_NONE\n && comp.ruletype;\n }\n return false;\n },\n\n /**\n * Reload all the page competencies framework competencies.\n * @method reloadCompetencies\n * @return {Promise}\n */\n reloadCompetencies: function() {\n return loadCompetencies('').fail(notification.exception);\n },\n\n /**\n * Get all competencies for this framework.\n *\n * @return {Object[]}\n */\n listCompetencies: function() {\n return competencies;\n },\n\n };\n });\n"],"names":["define","ajax","notification","templates","Ariatree","CompOutcomes","$","competencies","competencyFrameworkId","competencyFrameworkShortName","treeSelector","currentNodeId","competencyFramworkCanManage","addChildren","parent","all","i","current","haschildren","children","length","parentid","id","push","loadCompetencies","searchtext","deferred","Deferred","render","done","loadinghtml","loadingjs","replaceNodeContents","call","methodname","args","competencyframeworkid","result","competency","parseInt","context","shortname","canmanage","html","js","tree","node","find","selectItem","updateFocus","resolve","fail","reject","promise","rememberCurrent","evt","params","selected","attr","init","search","selector","competencyid","exception","this","on","eventname","handler","getChildren","each","index","getCompetencyFrameworkId","getCompetency","getCompetencyLevel","path","replace","split","hasChildren","hasRule","comp","ruleoutcome","OUTCOME_NONE","ruletype","reloadCompetencies","listCompetencies"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/course_competency_settings.min.js.map b/admin/tool/lp/amd/build/course_competency_settings.min.js.map index f473cf570da..adc4f42b8ff 100644 --- a/admin/tool/lp/amd/build/course_competency_settings.min.js.map +++ b/admin/tool/lp/amd/build/course_competency_settings.min.js.map @@ -1 +1 @@ -{"version":3,"file":"course_competency_settings.min.js","sources":["../src/course_competency_settings.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 * Change the course competency settings in a popup.\n *\n * @module tool_lp/configurecoursecompetencysettings\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/notification',\n 'tool_lp/dialogue',\n 'core/str',\n 'core/ajax',\n 'core/templates',\n 'core/pending'\n ],\n function($, notification, Dialogue, str, ajax, templates, Pending) {\n\n /**\n * Constructor\n *\n * @param {String} selector - selector for the links to open the dialogue.\n */\n var settingsMod = function(selector) {\n $(selector).on('click', this.configureSettings.bind(this));\n };\n\n /** @property {Dialogue} Reference to the dialogue that we opened. */\n settingsMod.prototype._dialogue = null;\n\n /**\n * Open the configure settings dialogue.\n *\n * @param {Event} e\n * @method configureSettings\n */\n settingsMod.prototype.configureSettings = function(e) {\n var pendingPromise = new Pending();\n var courseid = $(e.target).closest('a').data('courseid');\n var currentValue = $(e.target).closest('a').data('pushratingstouserplans');\n var context = {\n courseid: courseid,\n settings: {pushratingstouserplans: currentValue}\n };\n e.preventDefault();\n\n $.when(\n str.get_string('configurecoursecompetencysettings', 'tool_lp'),\n templates.render('tool_lp/course_competency_settings', context),\n )\n .then(function(title, templateResult) {\n this._dialogue = new Dialogue(\n title,\n templateResult[0],\n this.addListeners.bind(this)\n );\n\n return this._dialogue;\n }.bind(this))\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n };\n\n /**\n * Add the save listener to the form.\n *\n * @method addSaveListener\n */\n settingsMod.prototype.addListeners = function() {\n var save = this._find('[data-action=\"save\"]');\n save.on('click', this.saveSettings.bind(this));\n var cancel = this._find('[data-action=\"cancel\"]');\n cancel.on('click', this.cancelChanges.bind(this));\n };\n\n /**\n * Cancel the changes.\n *\n * @param {Event} e\n * @method cancelChanges\n */\n settingsMod.prototype.cancelChanges = function(e) {\n e.preventDefault();\n this._dialogue.close();\n };\n\n /**\n * Cancel the changes.\n *\n * @param {String} selector\n * @return {JQuery}\n */\n settingsMod.prototype._find = function(selector) {\n return $('[data-region=\"coursecompetencysettings\"]').find(selector);\n };\n\n /**\n * Save the settings.\n *\n * @param {Event} e\n * @method saveSettings\n */\n settingsMod.prototype.saveSettings = function(e) {\n var pendingPromise = new Pending();\n e.preventDefault();\n\n var newValue = this._find('input[name=\"pushratingstouserplans\"]:checked').val();\n var courseId = this._find('input[name=\"courseid\"]').val();\n var settings = {pushratingstouserplans: newValue};\n\n ajax.call([\n {methodname: 'core_competency_update_course_competency_settings',\n args: {courseid: courseId, settings: settings}}\n ])[0]\n .then(function() {\n return this.refreshCourseCompetenciesPage();\n }.bind(this))\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n\n };\n\n /**\n * Refresh the course competencies page.\n *\n * @method saveSettings\n */\n settingsMod.prototype.refreshCourseCompetenciesPage = function() {\n var courseId = this._find('input[name=\"courseid\"]').val();\n var pendingPromise = new Pending();\n\n ajax.call([\n {methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: courseId, moduleid: 0}}\n ])[0]\n .then(function(context) {\n return templates.render('tool_lp/course_competencies_page', context);\n })\n .then(function(html, js) {\n templates.replaceNode($('[data-region=\"coursecompetenciespage\"]'), html, js);\n this._dialogue.close();\n\n return;\n }.bind(this))\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n };\n\n return /** @alias module:tool_lp/configurecoursecompetencysettings */ settingsMod;\n});\n"],"names":["define","$","notification","Dialogue","str","ajax","templates","Pending","settingsMod","selector","on","this","configureSettings","bind","prototype","_dialogue","e","pendingPromise","context","courseid","target","closest","data","settings","pushratingstouserplans","preventDefault","when","get_string","render","then","title","templateResult","addListeners","resolve","catch","exception","_find","saveSettings","cancelChanges","close","find","newValue","val","courseId","call","methodname","args","refreshCourseCompetenciesPage","moduleid","html","js","replaceNode"],"mappings":";;;;;;;AAsBAA,4CAAO,CAAC,SACA,oBACA,mBACA,WACA,YACA,iBACA,iBAED,SAASC,EAAGC,aAAcC,SAAUC,IAAKC,KAAMC,UAAWC,aAOzDC,YAAc,SAASC,UACvBR,EAAEQ,UAAUC,GAAG,QAASC,KAAKC,kBAAkBC,KAAKF,eAIxDH,YAAYM,UAAUC,UAAY,KAQlCP,YAAYM,UAAUF,kBAAoB,SAASI,OAC3CC,eAAiB,IAAIV,QAGrBW,QAAU,CACVC,SAHWlB,EAAEe,EAAEI,QAAQC,QAAQ,KAAKC,KAAK,YAIzCC,SAAU,CAACC,uBAHIvB,EAAEe,EAAEI,QAAQC,QAAQ,KAAKC,KAAK,4BAKjDN,EAAES,iBAEFxB,EAAEyB,KACEtB,IAAIuB,WAAW,oCAAqC,WACpDrB,UAAUsB,OAAO,qCAAsCV,UAE1DW,KAAK,SAASC,MAAOC,4BACbhB,UAAY,IAAIZ,SACjB2B,MACAC,eAAe,GACfpB,KAAKqB,aAAanB,KAAKF,OAGpBA,KAAKI,WACdF,KAAKF,OACNkB,KAAKZ,eAAegB,SACpBC,MAAMhC,aAAaiC,YAQxB3B,YAAYM,UAAUkB,aAAe,WACtBrB,KAAKyB,MAAM,wBACjB1B,GAAG,QAASC,KAAK0B,aAAaxB,KAAKF,OAC3BA,KAAKyB,MAAM,0BACjB1B,GAAG,QAASC,KAAK2B,cAAczB,KAAKF,QAS/CH,YAAYM,UAAUwB,cAAgB,SAAStB,GAC3CA,EAAES,sBACGV,UAAUwB,SASnB/B,YAAYM,UAAUsB,MAAQ,SAAS3B,iBAC5BR,EAAE,4CAA4CuC,KAAK/B,WAS9DD,YAAYM,UAAUuB,aAAe,SAASrB,OACtCC,eAAiB,IAAIV,QACzBS,EAAES,qBAEEgB,SAAW9B,KAAKyB,MAAM,gDAAgDM,MACtEC,SAAWhC,KAAKyB,MAAM,0BAA0BM,MAChDnB,SAAW,CAACC,uBAAwBiB,UAExCpC,KAAKuC,KAAK,CACN,CAACC,WAAY,oDACXC,KAAM,CAAC3B,SAAUwB,SAAUpB,SAAUA,aACxC,GACFM,KAAK,kBACKlB,KAAKoC,iCACdlC,KAAKF,OACNkB,KAAKZ,eAAegB,SACpBC,MAAMhC,aAAaiC,YASxB3B,YAAYM,UAAUiC,8BAAgC,eAC9CJ,SAAWhC,KAAKyB,MAAM,0BAA0BM,MAChDzB,eAAiB,IAAIV,QAEzBF,KAAKuC,KAAK,CACN,CAACC,WAAY,4CACXC,KAAM,CAAC3B,SAAUwB,SAAUK,SAAU,MACxC,GACFnB,MAAK,SAASX,gBACJZ,UAAUsB,OAAO,mCAAoCV,YAE/DW,KAAK,SAASoB,KAAMC,IACjB5C,UAAU6C,YAAYlD,EAAE,0CAA2CgD,KAAMC,SACpEnC,UAAUwB,SAGjB1B,KAAKF,OACNkB,KAAKZ,eAAegB,SACpBC,MAAMhC,aAAaiC,YAG8C3B"} \ No newline at end of file +{"version":3,"file":"course_competency_settings.min.js","sources":["../src/course_competency_settings.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 * Change the course competency settings in a popup.\n *\n * @module tool_lp/configurecoursecompetencysettings\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/notification',\n 'tool_lp/dialogue',\n 'core/str',\n 'core/ajax',\n 'core/templates',\n 'core/pending'\n ],\n function($, notification, Dialogue, str, ajax, templates, Pending) {\n\n /**\n * Constructor\n *\n * @param {String} selector - selector for the links to open the dialogue.\n */\n var settingsMod = function(selector) {\n $(selector).on('click', this.configureSettings.bind(this));\n };\n\n /** @property {Dialogue} Reference to the dialogue that we opened. */\n settingsMod.prototype._dialogue = null;\n\n /**\n * Open the configure settings dialogue.\n *\n * @param {Event} e\n * @method configureSettings\n */\n settingsMod.prototype.configureSettings = function(e) {\n var pendingPromise = new Pending();\n var courseid = $(e.target).closest('a').data('courseid');\n var currentValue = $(e.target).closest('a').data('pushratingstouserplans');\n var context = {\n courseid: courseid,\n settings: {pushratingstouserplans: currentValue}\n };\n e.preventDefault();\n\n $.when(\n str.get_string('configurecoursecompetencysettings', 'tool_lp'),\n templates.render('tool_lp/course_competency_settings', context),\n )\n .then(function(title, templateResult) {\n this._dialogue = new Dialogue(\n title,\n templateResult[0],\n this.addListeners.bind(this)\n );\n\n return this._dialogue;\n }.bind(this))\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n };\n\n /**\n * Add the save listener to the form.\n *\n * @method addSaveListener\n */\n settingsMod.prototype.addListeners = function() {\n var save = this._find('[data-action=\"save\"]');\n save.on('click', this.saveSettings.bind(this));\n var cancel = this._find('[data-action=\"cancel\"]');\n cancel.on('click', this.cancelChanges.bind(this));\n };\n\n /**\n * Cancel the changes.\n *\n * @param {Event} e\n * @method cancelChanges\n */\n settingsMod.prototype.cancelChanges = function(e) {\n e.preventDefault();\n this._dialogue.close();\n };\n\n /**\n * Cancel the changes.\n *\n * @param {String} selector\n * @return {JQuery}\n */\n settingsMod.prototype._find = function(selector) {\n return $('[data-region=\"coursecompetencysettings\"]').find(selector);\n };\n\n /**\n * Save the settings.\n *\n * @param {Event} e\n * @method saveSettings\n */\n settingsMod.prototype.saveSettings = function(e) {\n var pendingPromise = new Pending();\n e.preventDefault();\n\n var newValue = this._find('input[name=\"pushratingstouserplans\"]:checked').val();\n var courseId = this._find('input[name=\"courseid\"]').val();\n var settings = {pushratingstouserplans: newValue};\n\n ajax.call([\n {methodname: 'core_competency_update_course_competency_settings',\n args: {courseid: courseId, settings: settings}}\n ])[0]\n .then(function() {\n return this.refreshCourseCompetenciesPage();\n }.bind(this))\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n\n };\n\n /**\n * Refresh the course competencies page.\n *\n * @method saveSettings\n */\n settingsMod.prototype.refreshCourseCompetenciesPage = function() {\n var courseId = this._find('input[name=\"courseid\"]').val();\n var pendingPromise = new Pending();\n\n ajax.call([\n {methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: courseId, moduleid: 0}}\n ])[0]\n .then(function(context) {\n return templates.render('tool_lp/course_competencies_page', context);\n })\n .then(function(html, js) {\n templates.replaceNode($('[data-region=\"coursecompetenciespage\"]'), html, js);\n this._dialogue.close();\n\n return;\n }.bind(this))\n .then(pendingPromise.resolve)\n .catch(notification.exception);\n };\n\n return /** @alias module:tool_lp/configurecoursecompetencysettings */ settingsMod;\n});\n"],"names":["define","$","notification","Dialogue","str","ajax","templates","Pending","settingsMod","selector","on","this","configureSettings","bind","prototype","_dialogue","e","pendingPromise","context","courseid","target","closest","data","settings","pushratingstouserplans","preventDefault","when","get_string","render","then","title","templateResult","addListeners","resolve","catch","exception","_find","saveSettings","cancelChanges","close","find","newValue","val","courseId","call","methodname","args","refreshCourseCompetenciesPage","moduleid","html","js","replaceNode"],"mappings":";;;;;;;AAsBAA,OAAO,qCAAA,CAAC,SACA,oBACA,mBACA,WACA,YACA,iBACA,iBAED,SAASC,EAAGC,aAAcC,SAAUC,IAAKC,KAAMC,UAAWC,SAO7D,IAAIC,YAAc,SAASC,UACvBR,EAAEQ,UAAUC,GAAG,QAASC,KAAKC,kBAAkBC,KAAKF,MACvD,EA2HD,OAxHAH,YAAYM,UAAUC,UAAY,KAQlCP,YAAYM,UAAUF,kBAAoB,SAASI,GAC/C,IAAIC,eAAiB,IAAIV,QAGrBW,QAAU,CACVC,SAHWlB,EAAEe,EAAEI,QAAQC,QAAQ,KAAKC,KAAK,YAIzCC,SAAU,CAACC,uBAHIvB,EAAEe,EAAEI,QAAQC,QAAQ,KAAKC,KAAK,4BAKjDN,EAAES,iBAEFxB,EAAEyB,KACEtB,IAAIuB,WAAW,oCAAqC,WACpDrB,UAAUsB,OAAO,qCAAsCV,UAE1DW,KAAK,SAASC,MAAOC,gBAOlB,OANApB,KAAKI,UAAY,IAAIZ,SACjB2B,MACAC,eAAe,GACfpB,KAAKqB,aAAanB,KAAKF,OAGpBA,KAAKI,SAPV,EAQJF,KAAKF,OACNkB,KAAKZ,eAAegB,SACpBC,MAAMhC,aAAaiC,UACvB,EAOD3B,YAAYM,UAAUkB,aAAe,WACtBrB,KAAKyB,MAAM,wBACjB1B,GAAG,QAASC,KAAK0B,aAAaxB,KAAKF,OAC3BA,KAAKyB,MAAM,0BACjB1B,GAAG,QAASC,KAAK2B,cAAczB,KAAKF,MAC9C,EAQDH,YAAYM,UAAUwB,cAAgB,SAAStB,GAC3CA,EAAES,iBACGV,KAAAA,UAAUwB,OAClB,EAQD/B,YAAYM,UAAUsB,MAAQ,SAAS3B,UAC5BR,OAAAA,EAAE,4CAA4CuC,KAAK/B,SAC7D,EAQDD,YAAYM,UAAUuB,aAAe,SAASrB,GAC1C,IAAIC,eAAiB,IAAIV,QACzBS,EAAES,iBAEEgB,IAAAA,SAAW9B,KAAKyB,MAAM,gDAAgDM,MACtEC,SAAWhC,KAAKyB,MAAM,0BAA0BM,MAChDnB,SAAW,CAACC,uBAAwBiB,UAExCpC,KAAKuC,KAAK,CACN,CAACC,WAAY,oDACXC,KAAM,CAAC3B,SAAUwB,SAAUpB,SAAUA,aACxC,GACFM,KAAK,WACK,OAAAlB,KAAKoC,+BADV,EAEJlC,KAAKF,OACNkB,KAAKZ,eAAegB,SACpBC,MAAMhC,aAAaiC,UAEvB,EAOD3B,YAAYM,UAAUiC,8BAAgC,WAC9CJ,IAAAA,SAAWhC,KAAKyB,MAAM,0BAA0BM,MAChDzB,eAAiB,IAAIV,QAEzBF,KAAKuC,KAAK,CACN,CAACC,WAAY,4CACXC,KAAM,CAAC3B,SAAUwB,SAAUK,SAAU,MACxC,GACFnB,MAAK,SAASX,SACX,OAAOZ,UAAUsB,OAAO,mCAAoCV,QALhE,IAOCW,KAAK,SAASoB,KAAMC,IACjB5C,UAAU6C,YAAYlD,EAAE,0CAA2CgD,KAAMC,IACpEnC,KAAAA,UAAUwB,OAFb,EAKJ1B,KAAKF,OACNkB,KAAKZ,eAAegB,SACpBC,MAAMhC,aAAaiC,UACvB,EAEqE3B,WACzE"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/dialogue.min.js.map b/admin/tool/lp/amd/build/dialogue.min.js.map index 97577b8780a..8bccef2402d 100644 --- a/admin/tool/lp/amd/build/dialogue.min.js.map +++ b/admin/tool/lp/amd/build/dialogue.min.js.map @@ -1 +1 @@ -{"version":3,"file":"dialogue.min.js","sources":["../src/dialogue.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 * Wrapper for the YUI M.core.notification class. Allows us to\n * use the YUI version in AMD code until it is replaced.\n *\n * @module tool_lp/dialogue\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/yui'], function(Y) {\n\n // Private variables and functions.\n /**\n * Constructor\n *\n * @param {String} title Title for the window.\n * @param {String} content The content for the window.\n * @param {function} afterShow Callback executed after the window is opened.\n * @param {function} afterHide Callback executed after the window is closed.\n * @param {Boolean} wide Specify we want an extra wide dialogue (the size is standard, but wider than the default).\n */\n var dialogue = function(title, content, afterShow, afterHide, wide) {\n M.util.js_pending('tool_lp/dialogue:dialogue');\n\n this.yuiDialogue = null;\n var parent = this;\n\n // Default for wide is false.\n if (typeof wide == 'undefined') {\n wide = false;\n }\n\n Y.use('moodle-core-notification', 'timers', function() {\n var width = '480px';\n if (wide) {\n width = '800px';\n }\n\n parent.yuiDialogue = new M.core.dialogue({\n headerContent: title,\n bodyContent: content,\n draggable: true,\n visible: false,\n center: true,\n modal: true,\n width: width\n });\n\n parent.yuiDialogue.before('visibleChange', function() {\n M.util.js_pending('tool_lp/dialogue:before:visibleChange');\n });\n\n parent.yuiDialogue.after('visibleChange', function(e) {\n if (e.newVal) {\n // Delay the callback call to the next tick, otherwise it can happen that it is\n // executed before the dialogue constructor returns.\n if ((typeof afterShow !== 'undefined')) {\n Y.soon(function() {\n afterShow(parent);\n parent.yuiDialogue.centerDialogue();\n M.util.js_complete('tool_lp/dialogue:before:visibleChange');\n });\n } else {\n M.util.js_complete('tool_lp/dialogue:before:visibleChange');\n }\n } else {\n if ((typeof afterHide !== 'undefined')) {\n Y.soon(function() {\n afterHide(parent);\n M.util.js_complete('tool_lp/dialogue:before:visibleChange');\n });\n } else {\n M.util.js_complete('tool_lp/dialogue:before:visibleChange');\n }\n }\n });\n\n parent.yuiDialogue.show();\n M.util.js_complete('tool_lp/dialogue:dialogue');\n });\n };\n\n /**\n * Close this window.\n */\n dialogue.prototype.close = function() {\n this.yuiDialogue.hide();\n this.yuiDialogue.destroy();\n };\n\n /**\n * Get content.\n * @return {node}\n */\n dialogue.prototype.getContent = function() {\n return this.yuiDialogue.bodyNode.getDOMNode();\n };\n\n return /** @alias module:tool_lp/dialogue */ dialogue;\n});\n"],"names":["define","Y","dialogue","title","content","afterShow","afterHide","wide","M","util","js_pending","yuiDialogue","parent","this","use","width","core","headerContent","bodyContent","draggable","visible","center","modal","before","after","e","newVal","soon","centerDialogue","js_complete","show","prototype","close","hide","destroy","getContent","bodyNode","getDOMNode"],"mappings":";;;;;;;;AAuBAA,0BAAO,CAAC,aAAa,SAASC,OAYtBC,SAAW,SAASC,MAAOC,QAASC,UAAWC,UAAWC,MAC1DC,EAAEC,KAAKC,WAAW,kCAEbC,YAAc,SACfC,OAASC,UAGM,IAARN,OACPA,MAAO,GAGXN,EAAEa,IAAI,2BAA4B,UAAU,eACpCC,MAAQ,QACRR,OACAQ,MAAQ,SAGZH,OAAOD,YAAc,IAAIH,EAAEQ,KAAKd,SAAS,CACrCe,cAAed,MACfe,YAAad,QACbe,WAAW,EACXC,SAAS,EACTC,QAAQ,EACRC,OAAO,EACPP,MAAOA,QAGXH,OAAOD,YAAYY,OAAO,iBAAiB,WACvCf,EAAEC,KAAKC,WAAW,4CAGtBE,OAAOD,YAAYa,MAAM,iBAAiB,SAASC,GAC3CA,EAAEC,YAGwB,IAAdrB,UACRJ,EAAE0B,MAAK,WACHtB,UAAUO,QACVA,OAAOD,YAAYiB,iBACnBpB,EAAEC,KAAKoB,YAAY,4CAGvBrB,EAAEC,KAAKoB,YAAY,8CAGG,IAAdvB,UACRL,EAAE0B,MAAK,WACHrB,UAAUM,QACVJ,EAAEC,KAAKoB,YAAY,4CAGvBrB,EAAEC,KAAKoB,YAAY,4CAK/BjB,OAAOD,YAAYmB,OACnBtB,EAAEC,KAAKoB,YAAY,wCAO3B3B,SAAS6B,UAAUC,MAAQ,gBAClBrB,YAAYsB,YACZtB,YAAYuB,WAOrBhC,SAAS6B,UAAUI,WAAa,kBACrBtB,KAAKF,YAAYyB,SAASC,cAGQnC"} \ No newline at end of file +{"version":3,"file":"dialogue.min.js","sources":["../src/dialogue.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 * Wrapper for the YUI M.core.notification class. Allows us to\n * use the YUI version in AMD code until it is replaced.\n *\n * @module tool_lp/dialogue\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/yui'], function(Y) {\n\n // Private variables and functions.\n /**\n * Constructor\n *\n * @param {String} title Title for the window.\n * @param {String} content The content for the window.\n * @param {function} afterShow Callback executed after the window is opened.\n * @param {function} afterHide Callback executed after the window is closed.\n * @param {Boolean} wide Specify we want an extra wide dialogue (the size is standard, but wider than the default).\n */\n var dialogue = function(title, content, afterShow, afterHide, wide) {\n M.util.js_pending('tool_lp/dialogue:dialogue');\n\n this.yuiDialogue = null;\n var parent = this;\n\n // Default for wide is false.\n if (typeof wide == 'undefined') {\n wide = false;\n }\n\n Y.use('moodle-core-notification', 'timers', function() {\n var width = '480px';\n if (wide) {\n width = '800px';\n }\n\n parent.yuiDialogue = new M.core.dialogue({\n headerContent: title,\n bodyContent: content,\n draggable: true,\n visible: false,\n center: true,\n modal: true,\n width: width\n });\n\n parent.yuiDialogue.before('visibleChange', function() {\n M.util.js_pending('tool_lp/dialogue:before:visibleChange');\n });\n\n parent.yuiDialogue.after('visibleChange', function(e) {\n if (e.newVal) {\n // Delay the callback call to the next tick, otherwise it can happen that it is\n // executed before the dialogue constructor returns.\n if ((typeof afterShow !== 'undefined')) {\n Y.soon(function() {\n afterShow(parent);\n parent.yuiDialogue.centerDialogue();\n M.util.js_complete('tool_lp/dialogue:before:visibleChange');\n });\n } else {\n M.util.js_complete('tool_lp/dialogue:before:visibleChange');\n }\n } else {\n if ((typeof afterHide !== 'undefined')) {\n Y.soon(function() {\n afterHide(parent);\n M.util.js_complete('tool_lp/dialogue:before:visibleChange');\n });\n } else {\n M.util.js_complete('tool_lp/dialogue:before:visibleChange');\n }\n }\n });\n\n parent.yuiDialogue.show();\n M.util.js_complete('tool_lp/dialogue:dialogue');\n });\n };\n\n /**\n * Close this window.\n */\n dialogue.prototype.close = function() {\n this.yuiDialogue.hide();\n this.yuiDialogue.destroy();\n };\n\n /**\n * Get content.\n * @return {node}\n */\n dialogue.prototype.getContent = function() {\n return this.yuiDialogue.bodyNode.getDOMNode();\n };\n\n return /** @alias module:tool_lp/dialogue */ dialogue;\n});\n"],"names":["define","Y","dialogue","title","content","afterShow","afterHide","wide","M","util","js_pending","yuiDialogue","parent","this","use","width","core","headerContent","bodyContent","draggable","visible","center","modal","before","after","e","newVal","soon","centerDialogue","js_complete","show","prototype","close","hide","destroy","getContent","bodyNode","getDOMNode"],"mappings":";;;;;;;;AAuBAA,0BAAO,CAAC,aAAa,SAASC,GAY1B,IAAIC,SAAW,SAASC,MAAOC,QAASC,UAAWC,UAAWC,MAC1DC,EAAEC,KAAKC,WAAW,6BAEbC,KAAAA,YAAc,KACfC,IAAAA,OAASC,UAGM,IAARN,OACPA,MAAO,GAGXN,EAAEa,IAAI,2BAA4B,UAAU,WACpCC,IAAAA,MAAQ,QACRR,OACAQ,MAAQ,SAGZH,OAAOD,YAAc,IAAIH,EAAEQ,KAAKd,SAAS,CACrCe,cAAed,MACfe,YAAad,QACbe,WAAW,EACXC,SAAS,EACTC,QAAQ,EACRC,OAAO,EACPP,MAAOA,QAGXH,OAAOD,YAAYY,OAAO,iBAAiB,WACvCf,EAAEC,KAAKC,WAAW,wCACrB,IAEDE,OAAOD,YAAYa,MAAM,iBAAiB,SAASC,GAC3CA,EAAEC,YAGwB,IAAdrB,UACRJ,EAAE0B,MAAK,WACHtB,UAAUO,QACVA,OAAOD,YAAYiB,iBACnBpB,EAAEC,KAAKoB,YAAY,wCACtB,IAEDrB,EAAEC,KAAKoB,YAAY,8CAGG,IAAdvB,UACRL,EAAE0B,MAAK,WACHrB,UAAUM,QACVJ,EAAEC,KAAKoB,YAAY,wCACtB,IAEDrB,EAAEC,KAAKoB,YAAY,wCAG9B,IAEDjB,OAAOD,YAAYmB,OACnBtB,EAAEC,KAAKoB,YAAY,4BACtB,GACJ,EAkBD,OAbA3B,SAAS6B,UAAUC,MAAQ,WAClBrB,KAAAA,YAAYsB,OACZtB,KAAAA,YAAYuB,SACpB,EAMDhC,SAAS6B,UAAUI,WAAa,WAC5B,OAAOtB,KAAKF,YAAYyB,SAASC,YACpC,EAE4CnC,QAChD"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/dragdrop-reorder.min.js.map b/admin/tool/lp/amd/build/dragdrop-reorder.min.js.map index ed41f5b52a8..6b82436ece9 100644 --- a/admin/tool/lp/amd/build/dragdrop-reorder.min.js.map +++ b/admin/tool/lp/amd/build/dragdrop-reorder.min.js.map @@ -1 +1 @@ -{"version":3,"file":"dragdrop-reorder.min.js","sources":["../src/dragdrop-reorder.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 * Drag and drop reorder via HTML5.\n *\n * @module tool_lp/dragdrop-reorder\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/str', 'core/yui'], function(str, Y) {\n // Private variables and functions.\n\n /**\n * Store the current instance of the core drag drop.\n *\n * @property {object} dragDropInstance M.tool_lp.dragdrop_reorder\n */\n var dragDropInstance = null;\n\n /**\n * Translate the drophit event from YUI\n * into simple drag and drop nodes.\n * @param {Y.Event} e The yui drop event.\n */\n var proxyCallback = function(e) {\n var dragNode = e.drag.get('node');\n var dropNode = e.drop.get('node');\n this.callback(dragNode.getDOMNode(), dropNode.getDOMNode());\n };\n\n return /** @alias module:tool_lp/dragdrop-reorder */ {\n // Public variables and functions.\n /**\n * Create an instance of M.tool_lp.dragdrop\n *\n * @param {String} group Unique string to identify this interaction.\n * @param {String} dragHandleText Alt text for the drag handle.\n * @param {String} sameNodeText Used in keyboard drag drop for the list of items target.\n * @param {String} parentNodeText Used in keyboard drag drop for the parent target.\n * @param {String} sameNodeClass class used to find the each of the list of items.\n * @param {String} parentNodeClass class used to find the container for the list of items.\n * @param {String} dragHandleInsertClass class used to find the location to insert the drag handles.\n * @param {function} callback Drop hit handler.\n */\n dragdrop: function(group,\n dragHandleText,\n sameNodeText,\n parentNodeText,\n sameNodeClass,\n parentNodeClass,\n dragHandleInsertClass,\n callback) {\n // Here we are wrapping YUI. This allows us to start transitioning, but\n // wait for a good alternative without having inconsistent UIs.\n str.get_strings([\n {key: 'emptydragdropregion', component: 'moodle'},\n {key: 'movecontent', component: 'moodle'},\n {key: 'tocontent', component: 'moodle'},\n ]).done(function() {\n Y.use('moodle-tool_lp-dragdrop-reorder', function() {\n\n var context = {\n callback: callback\n };\n if (dragDropInstance) {\n dragDropInstance.destroy();\n }\n dragDropInstance = M.tool_lp.dragdrop_reorder({\n group: group,\n dragHandleText: dragHandleText,\n sameNodeText: sameNodeText,\n parentNodeText: parentNodeText,\n sameNodeClass: sameNodeClass,\n parentNodeClass: parentNodeClass,\n dragHandleInsertClass: dragHandleInsertClass,\n callback: Y.bind(proxyCallback, context)\n });\n });\n });\n }\n\n };\n});\n"],"names":["define","str","Y","dragDropInstance","proxyCallback","e","dragNode","drag","get","dropNode","drop","callback","getDOMNode","dragdrop","group","dragHandleText","sameNodeText","parentNodeText","sameNodeClass","parentNodeClass","dragHandleInsertClass","get_strings","key","component","done","use","context","destroy","M","tool_lp","dragdrop_reorder","bind"],"mappings":";;;;;;;AAsBAA,kCAAO,CAAC,WAAY,aAAa,SAASC,IAAKC,OAQvCC,iBAAmB,KAOnBC,cAAgB,SAASC,OACrBC,SAAWD,EAAEE,KAAKC,IAAI,QACtBC,SAAWJ,EAAEK,KAAKF,IAAI,aACrBG,SAASL,SAASM,aAAcH,SAASG,qBAGG,CAcjDC,SAAU,SAASC,MACAC,eACAC,aACAC,eACAC,cACAC,gBACAC,sBACAT,UAGfV,IAAIoB,YAAY,CACZ,CAACC,IAAK,sBAAuBC,UAAW,UACxC,CAACD,IAAK,cAAeC,UAAW,UAChC,CAACD,IAAK,YAAaC,UAAW,YAC/BC,MAAK,WACJtB,EAAEuB,IAAI,mCAAmC,eAEjCC,QAAU,CACVf,SAAUA,UAEVR,kBACAA,iBAAiBwB,UAErBxB,iBAAmByB,EAAEC,QAAQC,iBAAiB,CAC1ChB,MAAOA,MACPC,eAAgBA,eAChBC,aAAcA,aACdC,eAAgBA,eAChBC,cAAeA,cACfC,gBAAiBA,gBACjBC,sBAAuBA,sBACvBT,SAAUT,EAAE6B,KAAK3B,cAAesB"} \ No newline at end of file +{"version":3,"file":"dragdrop-reorder.min.js","sources":["../src/dragdrop-reorder.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 * Drag and drop reorder via HTML5.\n *\n * @module tool_lp/dragdrop-reorder\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/str', 'core/yui'], function(str, Y) {\n // Private variables and functions.\n\n /**\n * Store the current instance of the core drag drop.\n *\n * @property {object} dragDropInstance M.tool_lp.dragdrop_reorder\n */\n var dragDropInstance = null;\n\n /**\n * Translate the drophit event from YUI\n * into simple drag and drop nodes.\n * @param {Y.Event} e The yui drop event.\n */\n var proxyCallback = function(e) {\n var dragNode = e.drag.get('node');\n var dropNode = e.drop.get('node');\n this.callback(dragNode.getDOMNode(), dropNode.getDOMNode());\n };\n\n return /** @alias module:tool_lp/dragdrop-reorder */ {\n // Public variables and functions.\n /**\n * Create an instance of M.tool_lp.dragdrop\n *\n * @param {String} group Unique string to identify this interaction.\n * @param {String} dragHandleText Alt text for the drag handle.\n * @param {String} sameNodeText Used in keyboard drag drop for the list of items target.\n * @param {String} parentNodeText Used in keyboard drag drop for the parent target.\n * @param {String} sameNodeClass class used to find the each of the list of items.\n * @param {String} parentNodeClass class used to find the container for the list of items.\n * @param {String} dragHandleInsertClass class used to find the location to insert the drag handles.\n * @param {function} callback Drop hit handler.\n */\n dragdrop: function(group,\n dragHandleText,\n sameNodeText,\n parentNodeText,\n sameNodeClass,\n parentNodeClass,\n dragHandleInsertClass,\n callback) {\n // Here we are wrapping YUI. This allows us to start transitioning, but\n // wait for a good alternative without having inconsistent UIs.\n str.get_strings([\n {key: 'emptydragdropregion', component: 'moodle'},\n {key: 'movecontent', component: 'moodle'},\n {key: 'tocontent', component: 'moodle'},\n ]).done(function() {\n Y.use('moodle-tool_lp-dragdrop-reorder', function() {\n\n var context = {\n callback: callback\n };\n if (dragDropInstance) {\n dragDropInstance.destroy();\n }\n dragDropInstance = M.tool_lp.dragdrop_reorder({\n group: group,\n dragHandleText: dragHandleText,\n sameNodeText: sameNodeText,\n parentNodeText: parentNodeText,\n sameNodeClass: sameNodeClass,\n parentNodeClass: parentNodeClass,\n dragHandleInsertClass: dragHandleInsertClass,\n callback: Y.bind(proxyCallback, context)\n });\n });\n });\n }\n\n };\n});\n"],"names":["define","str","Y","dragDropInstance","proxyCallback","e","dragNode","drag","get","dropNode","drop","callback","getDOMNode","dragdrop","group","dragHandleText","sameNodeText","parentNodeText","sameNodeClass","parentNodeClass","dragHandleInsertClass","get_strings","key","component","done","use","context","destroy","M","tool_lp","dragdrop_reorder","bind"],"mappings":";;;;;;;AAsBAA,OAAM,2BAAC,CAAC,WAAY,aAAa,SAASC,IAAKC,GAQvCC,IAAAA,iBAAmB,KAOnBC,cAAgB,SAASC,GACrBC,IAAAA,SAAWD,EAAEE,KAAKC,IAAI,QACtBC,SAAWJ,EAAEK,KAAKF,IAAI,QACrBG,KAAAA,SAASL,SAASM,aAAcH,SAASG,aACjD,EAEoD,MAAA,CAcjDC,SAAU,SAASC,MACAC,eACAC,aACAC,eACAC,cACAC,gBACAC,sBACAT,UAGfV,IAAIoB,YAAY,CACZ,CAACC,IAAK,sBAAuBC,UAAW,UACxC,CAACD,IAAK,cAAeC,UAAW,UAChC,CAACD,IAAK,YAAaC,UAAW,YAC/BC,MAAK,WACJtB,EAAEuB,IAAI,mCAAmC,WAErC,IAAIC,QAAU,CACVf,SAAUA,UAEVR,kBACAA,iBAAiBwB,UAErBxB,iBAAmByB,EAAEC,QAAQC,iBAAiB,CAC1ChB,MAAOA,MACPC,eAAgBA,eAChBC,aAAcA,aACdC,eAAgBA,eAChBC,cAAeA,cACfC,gBAAiBA,gBACjBC,sBAAuBA,sBACvBT,SAAUT,EAAE6B,KAAK3B,cAAesB,UAEvC,GACJ,GACJ,EAGR"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/event_base.min.js.map b/admin/tool/lp/amd/build/event_base.min.js.map index 5acbe6740c4..1f24da8644e 100644 --- a/admin/tool/lp/amd/build/event_base.min.js.map +++ b/admin/tool/lp/amd/build/event_base.min.js.map @@ -1 +1 @@ -{"version":3,"file":"event_base.min.js","sources":["../src/event_base.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 * Event base javascript module.\n *\n * @module tool_lp/event_base\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n /**\n * Base class.\n */\n var Base = function() {\n this._eventNode = $('
');\n };\n\n /** @property {Node} The node we attach the events to. */\n Base.prototype._eventNode = null;\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n Base.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _trigger\n */\n Base.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n return /** @alias module:tool_lp/event_base */ Base;\n});\n"],"names":["define","$","Base","_eventNode","prototype","on","type","handler","_trigger","data","trigger"],"mappings":";;;;;;;AAsBAA,4BAAO,CAAC,WAAW,SAASC,OAKpBC,KAAO,gBACFC,WAAaF,EAAE,uBAIxBC,KAAKE,UAAUD,WAAa,KAS5BD,KAAKE,UAAUC,GAAK,SAASC,KAAMC,cAC1BJ,WAAWE,GAAGC,KAAMC,UAU7BL,KAAKE,UAAUI,SAAW,SAASF,KAAMG,WAChCN,WAAWO,QAAQJ,KAAM,CAACG,QAGYP"} \ No newline at end of file +{"version":3,"file":"event_base.min.js","sources":["../src/event_base.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 * Event base javascript module.\n *\n * @module tool_lp/event_base\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n /**\n * Base class.\n */\n var Base = function() {\n this._eventNode = $('
');\n };\n\n /** @property {Node} The node we attach the events to. */\n Base.prototype._eventNode = null;\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n Base.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _trigger\n */\n Base.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n return /** @alias module:tool_lp/event_base */ Base;\n});\n"],"names":["define","$","Base","this","_eventNode","prototype","on","type","handler","_trigger","data","trigger"],"mappings":";;;;;;;AAsBAA,4BAAO,CAAC,WAAW,SAASC,GAKxB,IAAIC,KAAO,WACPC,KAAKC,WAAaH,EAAE,cACvB,EA2BD,OAxBAC,KAAKG,UAAUD,WAAa,KAS5BF,KAAKG,UAAUC,GAAK,SAASC,KAAMC,SAC/BL,KAAKC,WAAWE,GAAGC,KAAMC,QAC5B,EASDN,KAAKG,UAAUI,SAAW,SAASF,KAAMG,MAChCN,KAAAA,WAAWO,QAAQJ,KAAM,CAACG,MAClC,EAE8CR,IAClD"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/evidence_delete.min.js.map b/admin/tool/lp/amd/build/evidence_delete.min.js.map index f16b333f0b6..e5eec27d407 100644 --- a/admin/tool/lp/amd/build/evidence_delete.min.js.map +++ b/admin/tool/lp/amd/build/evidence_delete.min.js.map @@ -1 +1 @@ -{"version":3,"file":"evidence_delete.min.js","sources":["../src/evidence_delete.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 * Evidence delete.\n *\n * @module tool_lp/evidence_delete\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/str',\n 'core/log'],\n function($, Notification, Ajax, Str, Log) {\n\n var selectors = {};\n\n /**\n * Register an event listener.\n *\n * @param {String} triggerSelector The node on which the click will happen.\n * @param {String} containerSelector The parent node that will be removed and contains the evidence ID.\n */\n var register = function(triggerSelector, containerSelector) {\n if (typeof selectors[triggerSelector] !== 'undefined') {\n return;\n }\n\n selectors[triggerSelector] = $('body').delegate(triggerSelector, 'click', function(e) {\n var parent = $(e.currentTarget).parents(containerSelector);\n if (!parent.length || parent.length > 1) {\n Log.error('None or too many evidence container were found.');\n return;\n }\n var evidenceId = parent.data('id');\n if (!evidenceId) {\n Log.error('Evidence ID was not found.');\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n Str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'areyousure', component: 'moodle'},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n Notification.confirm(\n strings[0], // Confirm.\n strings[1], // Are you sure?\n strings[2], // Delete.\n strings[3], // Cancel.\n function() {\n var promise = Ajax.call([{\n methodname: 'core_competency_delete_evidence',\n args: {\n id: evidenceId\n }\n }]);\n promise[0].then(function() {\n parent.remove();\n return;\n }).fail(Notification.exception);\n }\n );\n }).fail(Notification.exception);\n\n\n });\n };\n\n return /** @alias module:tool_lp/evidence_delete */ {\n\n /**\n * Register an event listener.\n *\n * @param {String} triggerSelector The node on which the click will happen.\n * @param {String} containerSelector The parent node that will be removed and contains the evidence ID.\n * @return {Void}\n */\n register: register\n };\n\n});\n"],"names":["define","$","Notification","Ajax","Str","Log","selectors","register","triggerSelector","containerSelector","delegate","e","parent","currentTarget","parents","length","error","evidenceId","data","preventDefault","stopPropagation","get_strings","key","component","done","strings","confirm","call","methodname","args","id","then","remove","fail","exception"],"mappings":";;;;;;;AAuBAA,iCAAO,CAAC,SACA,oBACA,YACA,WACA,aACA,SAASC,EAAGC,aAAcC,KAAMC,IAAKC,SAErCC,UAAY,SA0DoC,CAShDC,SA3DW,SAASC,gBAAiBC,wBACK,IAA/BH,UAAUE,mBAIrBF,UAAUE,iBAAmBP,EAAE,QAAQS,SAASF,gBAAiB,SAAS,SAASG,OAC3EC,OAASX,EAAEU,EAAEE,eAAeC,QAAQL,uBACnCG,OAAOG,QAAUH,OAAOG,OAAS,EAClCV,IAAIW,MAAM,4DAGVC,WAAaL,OAAOM,KAAK,MACxBD,YAKLN,EAAEQ,iBACFR,EAAES,kBAEFhB,IAAIiB,YAAY,CACZ,CAACC,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,aAAcC,UAAW,UAC/B,CAACD,IAAK,SAAUC,UAAW,UAC3B,CAACD,IAAK,SAAUC,UAAW,YAC5BC,MAAK,SAASC,SACbvB,aAAawB,QACTD,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRA,QAAQ,IACR,WACkBtB,KAAKwB,KAAK,CAAC,CACrBC,WAAY,kCACZC,KAAM,CACFC,GAAIb,eAGJ,GAAGc,MAAK,WACZnB,OAAOoB,YAERC,KAAK/B,aAAagC,iBAG9BD,KAAK/B,aAAagC,YA/BjB7B,IAAIW,MAAM"} \ No newline at end of file +{"version":3,"file":"evidence_delete.min.js","sources":["../src/evidence_delete.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 * Evidence delete.\n *\n * @module tool_lp/evidence_delete\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/str',\n 'core/log'],\n function($, Notification, Ajax, Str, Log) {\n\n var selectors = {};\n\n /**\n * Register an event listener.\n *\n * @param {String} triggerSelector The node on which the click will happen.\n * @param {String} containerSelector The parent node that will be removed and contains the evidence ID.\n */\n var register = function(triggerSelector, containerSelector) {\n if (typeof selectors[triggerSelector] !== 'undefined') {\n return;\n }\n\n selectors[triggerSelector] = $('body').delegate(triggerSelector, 'click', function(e) {\n var parent = $(e.currentTarget).parents(containerSelector);\n if (!parent.length || parent.length > 1) {\n Log.error('None or too many evidence container were found.');\n return;\n }\n var evidenceId = parent.data('id');\n if (!evidenceId) {\n Log.error('Evidence ID was not found.');\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n Str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'areyousure', component: 'moodle'},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n Notification.confirm(\n strings[0], // Confirm.\n strings[1], // Are you sure?\n strings[2], // Delete.\n strings[3], // Cancel.\n function() {\n var promise = Ajax.call([{\n methodname: 'core_competency_delete_evidence',\n args: {\n id: evidenceId\n }\n }]);\n promise[0].then(function() {\n parent.remove();\n return;\n }).fail(Notification.exception);\n }\n );\n }).fail(Notification.exception);\n\n\n });\n };\n\n return /** @alias module:tool_lp/evidence_delete */ {\n\n /**\n * Register an event listener.\n *\n * @param {String} triggerSelector The node on which the click will happen.\n * @param {String} containerSelector The parent node that will be removed and contains the evidence ID.\n * @return {Void}\n */\n register: register\n };\n\n});\n"],"names":["define","$","Notification","Ajax","Str","Log","selectors","register","triggerSelector","containerSelector","delegate","e","parent","currentTarget","parents","length","error","evidenceId","data","preventDefault","stopPropagation","get_strings","key","component","done","strings","confirm","call","methodname","args","id","then","remove","fail","exception"],"mappings":";;;;;;;AAuBAA,OAAM,0BAAC,CAAC,SACA,oBACA,YACA,WACA,aACA,SAASC,EAAGC,aAAcC,KAAMC,IAAKC,KAErCC,IAAAA,UAAY,CAAA,EA0DoC,MAAA,CAShDC,SA3DW,SAASC,gBAAiBC,wBACK,IAA/BH,UAAUE,mBAIrBF,UAAUE,iBAAmBP,EAAE,QAAQS,SAASF,gBAAiB,SAAS,SAASG,GAC/E,IAAIC,OAASX,EAAEU,EAAEE,eAAeC,QAAQL,mBACpC,IAACG,OAAOG,QAAUH,OAAOG,OAAS,EAClCV,IAAIW,MAAM,uDADV,CAIJ,IAAIC,WAAaL,OAAOM,KAAK,MACxBD,YAKLN,EAAEQ,iBACFR,EAAES,kBAEFhB,IAAIiB,YAAY,CACZ,CAACC,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,aAAcC,UAAW,UAC/B,CAACD,IAAK,SAAUC,UAAW,UAC3B,CAACD,IAAK,SAAUC,UAAW,YAC5BC,MAAK,SAASC,SACbvB,aAAawB,QACTD,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRA,QAAQ,IACR,WACkBtB,KAAKwB,KAAK,CAAC,CACrBC,WAAY,kCACZC,KAAM,CACFC,GAAIb,eAGJ,GAAGc,MAAK,WACZnB,OAAOoB,QADX,IAGGC,KAAK/B,aAAagC,UACxB,GAtBT,IAwBGD,KAAK/B,aAAagC,YA/BjB7B,IAAIW,MAAM,6BAHb,CAqCJ,IACJ,EAcJ"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/form-cohort-selector.min.js.map b/admin/tool/lp/amd/build/form-cohort-selector.min.js.map index aa365af512a..aa49e2303bb 100644 --- a/admin/tool/lp/amd/build/form-cohort-selector.min.js.map +++ b/admin/tool/lp/amd/build/form-cohort-selector.min.js.map @@ -1 +1 @@ -{"version":3,"file":"form-cohort-selector.min.js","sources":["../src/form-cohort-selector.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 * Cohort selector module.\n *\n * @module tool_lp/form-cohort-selector\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {\n\n return /** @alias module:tool_lp/form-cohort-selector */ {\n\n processResults: function(selector, results) {\n var cohorts = [];\n $.each(results, function(index, cohort) {\n cohorts.push({\n value: cohort.id,\n label: cohort._label\n });\n });\n return cohorts;\n },\n\n transport: function(selector, query, success, failure) {\n var promise,\n contextid = parseInt($(selector).data('contextid'), 10),\n includes = $(selector).data('includes');\n\n promise = Ajax.call([{\n methodname: 'tool_lp_search_cohorts',\n args: {\n query: query,\n context: {contextid: contextid},\n includes: includes\n }\n }]);\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n // Render the label.\n $.each(results.cohorts, function(index, cohort) {\n promises.push(Templates.render('tool_lp/form-cohort-selector-suggestion', cohort));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results.cohorts, function(index, cohort) {\n cohort._label = args[i];\n i++;\n });\n success(results.cohorts);\n return;\n });\n\n }).catch(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","Templates","processResults","selector","results","cohorts","each","index","cohort","push","value","id","label","_label","transport","query","success","failure","contextid","parseInt","data","includes","call","methodname","args","context","then","promises","i","render","when","apply","arguments","catch"],"mappings":";;;;;;;AAuBAA,sCAAO,CAAC,SAAU,YAAa,mBAAmB,SAASC,EAAGC,KAAMC,iBAEP,CAErDC,eAAgB,SAASC,SAAUC,aAC3BC,QAAU,UACdN,EAAEO,KAAKF,SAAS,SAASG,MAAOC,QAC5BH,QAAQI,KAAK,CACTC,MAAOF,OAAOG,GACdC,MAAOJ,OAAOK,YAGfR,SAGXS,UAAW,SAASX,SAAUY,MAAOC,QAASC,aAEtCC,UAAYC,SAASpB,EAAEI,UAAUiB,KAAK,aAAc,IACpDC,SAAWtB,EAAEI,UAAUiB,KAAK,YAEtBpB,KAAKsB,KAAK,CAAC,CACjBC,WAAY,yBACZC,KAAM,CACFT,MAAOA,MACPU,QAAS,CAACP,UAAWA,WACrBG,SAAUA,aAGV,GAAGK,MAAK,SAAStB,aACjBuB,SAAW,GACXC,EAAI,SAGR7B,EAAEO,KAAKF,QAAQC,SAAS,SAASE,MAAOC,QACpCmB,SAASlB,KAAKR,UAAU4B,OAAO,0CAA2CrB,YAIvET,EAAE+B,KAAKC,MAAMhC,EAAE+B,KAAMH,UAAUD,MAAK,eACnCF,KAAOQ,UACXjC,EAAEO,KAAKF,QAAQC,SAAS,SAASE,MAAOC,QACpCA,OAAOK,OAASW,KAAKI,GACrBA,OAEJZ,QAAQZ,QAAQC,eAIrB4B,MAAMhB"} \ No newline at end of file +{"version":3,"file":"form-cohort-selector.min.js","sources":["../src/form-cohort-selector.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 * Cohort selector module.\n *\n * @module tool_lp/form-cohort-selector\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {\n\n return /** @alias module:tool_lp/form-cohort-selector */ {\n\n processResults: function(selector, results) {\n var cohorts = [];\n $.each(results, function(index, cohort) {\n cohorts.push({\n value: cohort.id,\n label: cohort._label\n });\n });\n return cohorts;\n },\n\n transport: function(selector, query, success, failure) {\n var promise,\n contextid = parseInt($(selector).data('contextid'), 10),\n includes = $(selector).data('includes');\n\n promise = Ajax.call([{\n methodname: 'tool_lp_search_cohorts',\n args: {\n query: query,\n context: {contextid: contextid},\n includes: includes\n }\n }]);\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n // Render the label.\n $.each(results.cohorts, function(index, cohort) {\n promises.push(Templates.render('tool_lp/form-cohort-selector-suggestion', cohort));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results.cohorts, function(index, cohort) {\n cohort._label = args[i];\n i++;\n });\n success(results.cohorts);\n return;\n });\n\n }).catch(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","Templates","processResults","selector","results","cohorts","each","index","cohort","push","value","id","label","_label","transport","query","success","failure","contextid","parseInt","data","includes","call","methodname","args","context","then","promises","i","render","when","apply","arguments","catch"],"mappings":";;;;;;;AAuBAA,OAAO,+BAAA,CAAC,SAAU,YAAa,mBAAmB,SAASC,EAAGC,KAAMC,WAEP,MAAA,CAErDC,eAAgB,SAASC,SAAUC,SAC3BC,IAAAA,QAAU,GAOd,OANAN,EAAEO,KAAKF,SAAS,SAASG,MAAOC,QAC5BH,QAAQI,KAAK,CACTC,MAAOF,OAAOG,GACdC,MAAOJ,OAAOK,QAErB,IACMR,OAV0C,EAarDS,UAAW,SAASX,SAAUY,MAAOC,QAASC,SAC1C,IACIC,UAAYC,SAASpB,EAAEI,UAAUiB,KAAK,aAAc,IACpDC,SAAWtB,EAAEI,UAAUiB,KAAK,YAEtBpB,KAAKsB,KAAK,CAAC,CACjBC,WAAY,yBACZC,KAAM,CACFT,MAAOA,MACPU,QAAS,CAACP,UAAWA,WACrBG,SAAUA,aAGV,GAAGK,MAAK,SAAStB,SACjBuB,IAAAA,SAAW,GACXC,EAAI,EAQR,OALA7B,EAAEO,KAAKF,QAAQC,SAAS,SAASE,MAAOC,QACpCmB,SAASlB,KAAKR,UAAU4B,OAAO,0CAA2CrB,QAC7E,IAGMT,EAAE+B,KAAKC,MAAMhC,EAAE+B,KAAMH,UAAUD,MAAK,WACnCF,IAAAA,KAAOQ,UACXjC,EAAEO,KAAKF,QAAQC,SAAS,SAASE,MAAOC,QACpCA,OAAOK,OAASW,KAAKI,GACrBA,GACH,IACDZ,QAAQZ,QAAQC,QAEnB,GAEJ,IAAE4B,MAAMhB,QACZ,EAIR"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/form-user-selector.min.js.map b/admin/tool/lp/amd/build/form-user-selector.min.js.map index 795c5d36195..c99417e9a87 100644 --- a/admin/tool/lp/amd/build/form-user-selector.min.js.map +++ b/admin/tool/lp/amd/build/form-user-selector.min.js.map @@ -1 +1 @@ -{"version":3,"file":"form-user-selector.min.js","sources":["../src/form-user-selector.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 * User selector module.\n *\n * @module tool_lp/form-user-selector\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {\n\n return /** @alias module:tool_lp/form-user-selector */ {\n\n processResults: function(selector, results) {\n var users = [];\n $.each(results, function(index, user) {\n users.push({\n value: user.id,\n label: user._label\n });\n });\n return users;\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n var capability = $(selector).data('capability');\n if (typeof capability === \"undefined\") {\n capability = '';\n }\n\n promise = Ajax.call([{\n methodname: 'tool_lp_search_users',\n args: {\n query: query,\n capability: capability\n }\n }]);\n\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n // Render the label.\n $.each(results.users, function(index, user) {\n var ctx = user,\n identity = [];\n $.each(['idnumber', 'email', 'phone1', 'phone2', 'department', 'institution'], function(i, k) {\n if (typeof user[k] !== 'undefined' && user[k] !== '') {\n ctx.hasidentity = true;\n identity.push(user[k]);\n }\n });\n ctx.identity = identity.join(', ');\n promises.push(Templates.render('tool_lp/form-user-selector-suggestion', ctx));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results.users, function(index, user) {\n user._label = args[i];\n i++;\n });\n success(results.users);\n return;\n });\n\n }).catch(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","Templates","processResults","selector","results","users","each","index","user","push","value","id","label","_label","transport","query","success","failure","capability","data","call","methodname","args","then","promises","i","ctx","identity","k","hasidentity","join","render","when","apply","arguments","catch"],"mappings":";;;;;;;AAuBAA,oCAAO,CAAC,SAAU,YAAa,mBAAmB,SAASC,EAAGC,KAAMC,iBAET,CAEnDC,eAAgB,SAASC,SAAUC,aAC3BC,MAAQ,UACZN,EAAEO,KAAKF,SAAS,SAASG,MAAOC,MAC5BH,MAAMI,KAAK,CACPC,MAAOF,KAAKG,GACZC,MAAOJ,KAAKK,YAGbR,OAGXS,UAAW,SAASX,SAAUY,MAAOC,QAASC,aAEtCC,WAAanB,EAAEI,UAAUgB,KAAK,mBACR,IAAfD,aACPA,WAAa,IAGPlB,KAAKoB,KAAK,CAAC,CACjBC,WAAY,uBACZC,KAAM,CACFP,MAAOA,MACPG,WAAYA,eAIZ,GAAGK,MAAK,SAASnB,aACjBoB,SAAW,GACXC,EAAI,SAGR1B,EAAEO,KAAKF,QAAQC,OAAO,SAASE,MAAOC,UAC9BkB,IAAMlB,KACNmB,SAAW,GACf5B,EAAEO,KAAK,CAAC,WAAY,QAAS,SAAU,SAAU,aAAc,gBAAgB,SAASmB,EAAGG,QAChE,IAAZpB,KAAKoB,IAAkC,KAAZpB,KAAKoB,KACvCF,IAAIG,aAAc,EAClBF,SAASlB,KAAKD,KAAKoB,QAG3BF,IAAIC,SAAWA,SAASG,KAAK,MAC7BN,SAASf,KAAKR,UAAU8B,OAAO,wCAAyCL,SAIrE3B,EAAEiC,KAAKC,MAAMlC,EAAEiC,KAAMR,UAAUD,MAAK,eACnCD,KAAOY,UACXnC,EAAEO,KAAKF,QAAQC,OAAO,SAASE,MAAOC,MAClCA,KAAKK,OAASS,KAAKG,GACnBA,OAEJT,QAAQZ,QAAQC,aAIrB8B,MAAMlB"} \ No newline at end of file +{"version":3,"file":"form-user-selector.min.js","sources":["../src/form-user-selector.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 * User selector module.\n *\n * @module tool_lp/form-user-selector\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {\n\n return /** @alias module:tool_lp/form-user-selector */ {\n\n processResults: function(selector, results) {\n var users = [];\n $.each(results, function(index, user) {\n users.push({\n value: user.id,\n label: user._label\n });\n });\n return users;\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n var capability = $(selector).data('capability');\n if (typeof capability === \"undefined\") {\n capability = '';\n }\n\n promise = Ajax.call([{\n methodname: 'tool_lp_search_users',\n args: {\n query: query,\n capability: capability\n }\n }]);\n\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n // Render the label.\n $.each(results.users, function(index, user) {\n var ctx = user,\n identity = [];\n $.each(['idnumber', 'email', 'phone1', 'phone2', 'department', 'institution'], function(i, k) {\n if (typeof user[k] !== 'undefined' && user[k] !== '') {\n ctx.hasidentity = true;\n identity.push(user[k]);\n }\n });\n ctx.identity = identity.join(', ');\n promises.push(Templates.render('tool_lp/form-user-selector-suggestion', ctx));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results.users, function(index, user) {\n user._label = args[i];\n i++;\n });\n success(results.users);\n return;\n });\n\n }).catch(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","Templates","processResults","selector","results","users","each","index","user","push","value","id","label","_label","transport","query","success","failure","capability","data","call","methodname","args","then","promises","i","ctx","identity","k","hasidentity","join","render","when","apply","arguments","catch"],"mappings":";;;;;;;AAuBAA,OAAO,6BAAA,CAAC,SAAU,YAAa,mBAAmB,SAASC,EAAGC,KAAMC,WAET,MAAA,CAEnDC,eAAgB,SAASC,SAAUC,SAC3BC,IAAAA,MAAQ,GAOZ,OANAN,EAAEO,KAAKF,SAAS,SAASG,MAAOC,MAC5BH,MAAMI,KAAK,CACPC,MAAOF,KAAKG,GACZC,MAAOJ,KAAKK,QAEnB,IACMR,KAVwC,EAanDS,UAAW,SAASX,SAAUY,MAAOC,QAASC,SAC1C,IACIC,WAAanB,EAAEI,UAAUgB,KAAK,mBACR,IAAfD,aACPA,WAAa,IAGPlB,KAAKoB,KAAK,CAAC,CACjBC,WAAY,uBACZC,KAAM,CACFP,MAAOA,MACPG,WAAYA,eAIZ,GAAGK,MAAK,SAASnB,SACjBoB,IAAAA,SAAW,GACXC,EAAI,EAiBR,OAdA1B,EAAEO,KAAKF,QAAQC,OAAO,SAASE,MAAOC,MAC9BkB,IAAAA,IAAMlB,KACNmB,SAAW,GACf5B,EAAEO,KAAK,CAAC,WAAY,QAAS,SAAU,SAAU,aAAc,gBAAgB,SAASmB,EAAGG,QAChE,IAAZpB,KAAKoB,IAAkC,KAAZpB,KAAKoB,KACvCF,IAAIG,aAAc,EAClBF,SAASlB,KAAKD,KAAKoB,IAE1B,IACDF,IAAIC,SAAWA,SAASG,KAAK,MAC7BN,SAASf,KAAKR,UAAU8B,OAAO,wCAAyCL,KAC3E,IAGM3B,EAAEiC,KAAKC,MAAMlC,EAAEiC,KAAMR,UAAUD,MAAK,WACnCD,IAAAA,KAAOY,UACXnC,EAAEO,KAAKF,QAAQC,OAAO,SAASE,MAAOC,MAClCA,KAAKK,OAASS,KAAKG,GACnBA,GACH,IACDT,QAAQZ,QAAQC,MAEnB,GAEJ,IAAE8B,MAAMlB,QACZ,EAIR"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/form_competency_element.min.js.map b/admin/tool/lp/amd/build/form_competency_element.min.js.map index 32c2f6f7dfa..ccd0c621233 100644 --- a/admin/tool/lp/amd/build/form_competency_element.min.js.map +++ b/admin/tool/lp/amd/build/form_competency_element.min.js.map @@ -1 +1 @@ -{"version":3,"file":"form_competency_element.min.js","sources":["../src/form_competency_element.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 * Badge select competency actions\n *\n * @module tool_lp/form_competency_element\n * @copyright 2019 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'tool_lp/competencypicker', 'core/ajax', 'core/notification', 'core/templates'],\n function($, Picker, Ajax, Notification, Templates) {\n\n var pickerInstance = null;\n\n var pageContextId = 1;\n\n /**\n * Re-render the list of selected competencies.\n *\n * @method renderCompetencies\n * @return {boolean}\n */\n var renderCompetencies = function() {\n var currentCompetencies = $('[data-action=\"competencies\"]').val();\n var requests = [];\n var i = 0;\n\n if (currentCompetencies != '') {\n currentCompetencies = currentCompetencies.split(',');\n for (i = 0; i < currentCompetencies.length; i++) {\n requests[requests.length] = {\n methodname: 'core_competency_read_competency',\n args: {id: currentCompetencies[i]}\n };\n }\n }\n\n $.when.apply($, Ajax.call(requests, false)).then(function() {\n var i = 0,\n competencies = [];\n\n for (i = 0; i < arguments.length; i++) {\n competencies[i] = arguments[i];\n }\n var context = {\n competencies: competencies\n };\n\n return Templates.render('tool_lp/form_competency_list', context);\n }).then(function(html, js) {\n Templates.replaceNode($('[data-region=\"competencies\"]'), html, js);\n return true;\n }).fail(Notification.exception);\n\n return true;\n };\n\n /**\n * Deselect a competency\n *\n * @method unpickCompetenciesHandler\n * @param {Event} e\n * @return {boolean}\n */\n var unpickCompetenciesHandler = function(e) {\n var currentCompetencies = $('[data-action=\"competencies\"]').val().split(','),\n newCompetencies = [],\n i,\n toRemove = $(e.currentTarget).data('id');\n\n for (i = 0; i < currentCompetencies.length; i++) {\n if (currentCompetencies[i] != toRemove) {\n newCompetencies[newCompetencies.length] = currentCompetencies[i];\n }\n }\n\n $('[data-action=\"competencies\"]').val(newCompetencies.join(','));\n\n return renderCompetencies();\n };\n\n /**\n * Open a competencies popup to relate competencies.\n *\n * @method pickCompetenciesHandler\n */\n var pickCompetenciesHandler = function() {\n var currentCompetencies = $('[data-action=\"competencies\"]').val().split(',');\n\n if (!pickerInstance) {\n pickerInstance = new Picker(pageContextId, false, 'parents', true);\n pickerInstance.on('save', function(e, data) {\n var before = $('[data-action=\"competencies\"]').val();\n var compIds = data.competencyIds;\n if (before != '') {\n compIds = compIds.concat(before.split(','));\n }\n var value = compIds.join(',');\n\n $('[data-action=\"competencies\"]').val(value);\n\n return renderCompetencies();\n });\n }\n\n pickerInstance.setDisallowedCompetencyIDs(currentCompetencies);\n pickerInstance.display();\n };\n\n return /** @alias module:tool_lp/form_competency_element */ {\n /**\n * Listen for clicks on the competency picker and push the changes to the form element.\n *\n * @method init\n * @param {Integer} contextId\n */\n init: function(contextId) {\n pageContextId = contextId;\n renderCompetencies();\n $('[data-action=\"select-competencies\"]').on('click', pickCompetenciesHandler);\n $('body').on('click', '[data-action=\"deselect-competency\"]', unpickCompetenciesHandler);\n }\n };\n});\n"],"names":["define","$","Picker","Ajax","Notification","Templates","pickerInstance","pageContextId","renderCompetencies","currentCompetencies","val","requests","i","split","length","methodname","args","id","when","apply","call","then","competencies","arguments","context","render","html","js","replaceNode","fail","exception","unpickCompetenciesHandler","e","newCompetencies","toRemove","currentTarget","data","join","pickCompetenciesHandler","on","before","compIds","competencyIds","concat","value","setDisallowedCompetencyIDs","display","init","contextId"],"mappings":";;;;;;;AAsBAA,yCAAO,CAAC,SAAU,2BAA4B,YAAa,oBAAqB,mBACxE,SAASC,EAAGC,OAAQC,KAAMC,aAAcC,eAExCC,eAAiB,KAEjBC,cAAgB,EAQhBC,mBAAqB,eACjBC,oBAAsBR,EAAE,gCAAgCS,MACxDC,SAAW,GACXC,EAAI,KAEmB,IAAvBH,wBACAA,oBAAsBA,oBAAoBI,MAAM,KAC3CD,EAAI,EAAGA,EAAIH,oBAAoBK,OAAQF,IACxCD,SAASA,SAASG,QAAU,CACxBC,WAAY,kCACZC,KAAM,CAACC,GAAIR,oBAAoBG,YAK3CX,EAAEiB,KAAKC,MAAMlB,EAAGE,KAAKiB,KAAKT,UAAU,IAAQU,MAAK,eACzCT,EAAI,EACJU,aAAe,OAEdV,EAAI,EAAGA,EAAIW,UAAUT,OAAQF,IAC9BU,aAAaV,GAAKW,UAAUX,OAE5BY,QAAU,CACVF,aAAcA,qBAGXjB,UAAUoB,OAAO,+BAAgCD,YACzDH,MAAK,SAASK,KAAMC,WACnBtB,UAAUuB,YAAY3B,EAAE,gCAAiCyB,KAAMC,KACxD,KACRE,KAAKzB,aAAa0B,YAEd,GAUPC,0BAA4B,SAASC,OAGjCpB,EAFAH,oBAAsBR,EAAE,gCAAgCS,MAAMG,MAAM,KACpEoB,gBAAkB,GAElBC,SAAWjC,EAAE+B,EAAEG,eAAeC,KAAK,UAElCxB,EAAI,EAAGA,EAAIH,oBAAoBK,OAAQF,IACpCH,oBAAoBG,IAAMsB,WAC1BD,gBAAgBA,gBAAgBnB,QAAUL,oBAAoBG,WAItEX,EAAE,gCAAgCS,IAAIuB,gBAAgBI,KAAK,MAEpD7B,sBAQP8B,wBAA0B,eACtB7B,oBAAsBR,EAAE,gCAAgCS,MAAMG,MAAM,KAEnEP,iBACDA,eAAiB,IAAIJ,OAAOK,eAAe,EAAO,WAAW,IAC9CgC,GAAG,QAAQ,SAASP,EAAGI,UAC9BI,OAASvC,EAAE,gCAAgCS,MAC3C+B,QAAUL,KAAKM,cACL,IAAVF,SACAC,QAAUA,QAAQE,OAAOH,OAAO3B,MAAM,WAEtC+B,MAAQH,QAAQJ,KAAK,YAEzBpC,EAAE,gCAAgCS,IAAIkC,OAE/BpC,wBAIfF,eAAeuC,2BAA2BpC,qBAC1CH,eAAewC,iBAGyC,CAOxDC,KAAM,SAASC,WACXzC,cAAgByC,UAChBxC,qBACAP,EAAE,uCAAuCsC,GAAG,QAASD,yBACrDrC,EAAE,QAAQsC,GAAG,QAAS,sCAAuCR"} \ No newline at end of file +{"version":3,"file":"form_competency_element.min.js","sources":["../src/form_competency_element.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 * Badge select competency actions\n *\n * @module tool_lp/form_competency_element\n * @copyright 2019 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'tool_lp/competencypicker', 'core/ajax', 'core/notification', 'core/templates'],\n function($, Picker, Ajax, Notification, Templates) {\n\n var pickerInstance = null;\n\n var pageContextId = 1;\n\n /**\n * Re-render the list of selected competencies.\n *\n * @method renderCompetencies\n * @return {boolean}\n */\n var renderCompetencies = function() {\n var currentCompetencies = $('[data-action=\"competencies\"]').val();\n var requests = [];\n var i = 0;\n\n if (currentCompetencies != '') {\n currentCompetencies = currentCompetencies.split(',');\n for (i = 0; i < currentCompetencies.length; i++) {\n requests[requests.length] = {\n methodname: 'core_competency_read_competency',\n args: {id: currentCompetencies[i]}\n };\n }\n }\n\n $.when.apply($, Ajax.call(requests, false)).then(function() {\n var i = 0,\n competencies = [];\n\n for (i = 0; i < arguments.length; i++) {\n competencies[i] = arguments[i];\n }\n var context = {\n competencies: competencies\n };\n\n return Templates.render('tool_lp/form_competency_list', context);\n }).then(function(html, js) {\n Templates.replaceNode($('[data-region=\"competencies\"]'), html, js);\n return true;\n }).fail(Notification.exception);\n\n return true;\n };\n\n /**\n * Deselect a competency\n *\n * @method unpickCompetenciesHandler\n * @param {Event} e\n * @return {boolean}\n */\n var unpickCompetenciesHandler = function(e) {\n var currentCompetencies = $('[data-action=\"competencies\"]').val().split(','),\n newCompetencies = [],\n i,\n toRemove = $(e.currentTarget).data('id');\n\n for (i = 0; i < currentCompetencies.length; i++) {\n if (currentCompetencies[i] != toRemove) {\n newCompetencies[newCompetencies.length] = currentCompetencies[i];\n }\n }\n\n $('[data-action=\"competencies\"]').val(newCompetencies.join(','));\n\n return renderCompetencies();\n };\n\n /**\n * Open a competencies popup to relate competencies.\n *\n * @method pickCompetenciesHandler\n */\n var pickCompetenciesHandler = function() {\n var currentCompetencies = $('[data-action=\"competencies\"]').val().split(',');\n\n if (!pickerInstance) {\n pickerInstance = new Picker(pageContextId, false, 'parents', true);\n pickerInstance.on('save', function(e, data) {\n var before = $('[data-action=\"competencies\"]').val();\n var compIds = data.competencyIds;\n if (before != '') {\n compIds = compIds.concat(before.split(','));\n }\n var value = compIds.join(',');\n\n $('[data-action=\"competencies\"]').val(value);\n\n return renderCompetencies();\n });\n }\n\n pickerInstance.setDisallowedCompetencyIDs(currentCompetencies);\n pickerInstance.display();\n };\n\n return /** @alias module:tool_lp/form_competency_element */ {\n /**\n * Listen for clicks on the competency picker and push the changes to the form element.\n *\n * @method init\n * @param {Integer} contextId\n */\n init: function(contextId) {\n pageContextId = contextId;\n renderCompetencies();\n $('[data-action=\"select-competencies\"]').on('click', pickCompetenciesHandler);\n $('body').on('click', '[data-action=\"deselect-competency\"]', unpickCompetenciesHandler);\n }\n };\n});\n"],"names":["define","$","Picker","Ajax","Notification","Templates","pickerInstance","pageContextId","renderCompetencies","currentCompetencies","val","requests","i","split","length","methodname","args","id","when","apply","call","then","competencies","arguments","context","render","html","js","replaceNode","fail","exception","unpickCompetenciesHandler","e","newCompetencies","toRemove","currentTarget","data","join","pickCompetenciesHandler","on","before","compIds","competencyIds","concat","value","setDisallowedCompetencyIDs","display","init","contextId"],"mappings":";;;;;;;AAsBAA,OAAM,kCAAC,CAAC,SAAU,2BAA4B,YAAa,oBAAqB,mBACxE,SAASC,EAAGC,OAAQC,KAAMC,aAAcC,WAExCC,IAAAA,eAAiB,KAEjBC,cAAgB,EAQhBC,mBAAqB,WACjBC,IAAAA,oBAAsBR,EAAE,gCAAgCS,MACxDC,SAAW,GACXC,EAAI,EAEJH,GAAuB,IAAvBA,oBAEA,IADAA,oBAAsBA,oBAAoBI,MAAM,KAC3CD,EAAI,EAAGA,EAAIH,oBAAoBK,OAAQF,IACxCD,SAASA,SAASG,QAAU,CACxBC,WAAY,kCACZC,KAAM,CAACC,GAAIR,oBAAoBG,KAsB3C,OAjBAX,EAAEiB,KAAKC,MAAMlB,EAAGE,KAAKiB,KAAKT,UAAU,IAAQU,MAAK,WACzCT,IAAAA,EAAI,EACJU,aAAe,GAEnB,IAAKV,EAAI,EAAGA,EAAIW,UAAUT,OAAQF,IAC9BU,aAAaV,GAAKW,UAAUX,GAEhC,IAAIY,QAAU,CACVF,aAAcA,cAGlB,OAAOjB,UAAUoB,OAAO,+BAAgCD,QAX5D,IAYGH,MAAK,SAASK,KAAMC,IAEnB,OADAtB,UAAUuB,YAAY3B,EAAE,gCAAiCyB,KAAMC,KACxD,CAdX,IAeGE,KAAKzB,aAAa0B,YAEd,CACV,EASGC,0BAA4B,SAASC,GACrC,IAEIpB,EAFAH,oBAAsBR,EAAE,gCAAgCS,MAAMG,MAAM,KACpEoB,gBAAkB,GAElBC,SAAWjC,EAAE+B,EAAEG,eAAeC,KAAK,MAEvC,IAAKxB,EAAI,EAAGA,EAAIH,oBAAoBK,OAAQF,IACpCH,oBAAoBG,IAAMsB,WAC1BD,gBAAgBA,gBAAgBnB,QAAUL,oBAAoBG,IAMtE,OAFAX,EAAE,gCAAgCS,IAAIuB,gBAAgBI,KAAK,MAEpD7B,oBACV,EAOG8B,wBAA0B,WAC1B,IAAI7B,oBAAsBR,EAAE,gCAAgCS,MAAMG,MAAM,KAEnEP,iBACDA,eAAiB,IAAIJ,OAAOK,eAAe,EAAO,WAAW,IAC9CgC,GAAG,QAAQ,SAASP,EAAGI,MAC9BI,IAAAA,OAASvC,EAAE,gCAAgCS,MAC3C+B,QAAUL,KAAKM,cACL,IAAVF,SACAC,QAAUA,QAAQE,OAAOH,OAAO3B,MAAM,OAE1C,IAAI+B,MAAQH,QAAQJ,KAAK,KAIzB,OAFApC,EAAE,gCAAgCS,IAAIkC,OAE/BpC,oBACV,IAGLF,eAAeuC,2BAA2BpC,qBAC1CH,eAAewC,SAClB,EAE2D,MAAA,CAOxDC,KAAM,SAASC,WACXzC,cAAgByC,UAChBxC,qBACAP,EAAE,uCAAuCsC,GAAG,QAASD,yBACrDrC,EAAE,QAAQsC,GAAG,QAAS,sCAAuCR,0BAChE,EAER"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/frameworkactions.min.js.map b/admin/tool/lp/amd/build/frameworkactions.min.js.map index 96e2bbfc0ee..d418feffd0f 100644 --- a/admin/tool/lp/amd/build/frameworkactions.min.js.map +++ b/admin/tool/lp/amd/build/frameworkactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frameworkactions.min.js","sources":["../src/frameworkactions.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 * Competency frameworks actions via ajax.\n *\n * @module tool_lp/frameworkactions\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/ajax', 'core/notification', 'core/str'], function($, templates, ajax, notification, str) {\n // Private variables and functions.\n\n /** @var {Number} pagecontextid The id of the context */\n var pagecontextid = 0;\n\n /** @var {Number} frameworkid The id of the framework */\n var frameworkid = 0;\n\n /**\n * Callback to replace the dom element with the rendered template.\n *\n * @param {String} newhtml The new html to insert.\n * @param {String} newjs The new js to run.\n */\n var updatePage = function(newhtml, newjs) {\n $('[data-region=\"managecompetencies\"]').replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n };\n\n /**\n * Callback to render the page template again and update the page.\n *\n * @param {Object} context The context for the template.\n */\n var reloadList = function(context) {\n templates.render('tool_lp/manage_competency_frameworks_page', context)\n .done(updatePage)\n .fail(notification.exception);\n };\n\n /**\n * Duplicate a framework and reload the page.\n * @method doDuplicate\n * @param {Event} e\n */\n var doDuplicate = function(e) {\n e.preventDefault();\n\n frameworkid = $(this).attr('data-frameworkid');\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_duplicate_competency_framework',\n args: {id: frameworkid}\n }, {\n methodname: 'tool_lp_data_for_competency_frameworks_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[1].done(reloadList).fail(notification.exception);\n };\n /**\n * Delete a framework and reload the page.\n */\n var doDelete = function() {\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_delete_competency_framework',\n args: {id: frameworkid}\n }, {\n methodname: 'tool_lp_data_for_competency_frameworks_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[0].done(function(success) {\n if (success === false) {\n var req = ajax.call([{\n methodname: 'core_competency_read_competency_framework',\n args: {id: frameworkid}\n }]);\n req[0].done(function(framework) {\n str.get_strings([\n {key: 'frameworkcannotbedeleted', component: 'tool_lp', param: framework.shortname},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.alert(\n null,\n strings[0]\n );\n }).fail(notification.exception);\n });\n }\n }).fail(notification.exception);\n requests[1].done(reloadList).fail(notification.exception);\n };\n\n /**\n * Handler for \"Delete competency framework\" actions.\n * @param {Event} e\n */\n var confirmDelete = function(e) {\n e.preventDefault();\n\n var id = $(this).attr('data-frameworkid');\n frameworkid = id;\n\n var requests = ajax.call([{\n methodname: 'core_competency_read_competency_framework',\n args: {id: frameworkid}\n }]);\n\n requests[0].done(function(framework) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deletecompetencyframework', component: 'tool_lp', param: framework.shortname},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete competency framework X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doDelete\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n\n return /** @alias module:tool_lp/frameworkactions */ {\n // Public variables and functions.\n\n /**\n * Expose the event handler for delete.\n * @method deleteHandler\n * @param {Event} e\n */\n deleteHandler: confirmDelete,\n\n /**\n * Expose the event handler for duplicate.\n * @method duplicateHandler\n * @param {Event} e\n */\n duplicateHandler: doDuplicate,\n\n /**\n * Initialise the module.\n * @method init\n * @param {Number} contextid The context id of the page.\n */\n init: function(contextid) {\n pagecontextid = contextid;\n }\n };\n});\n"],"names":["define","$","templates","ajax","notification","str","pagecontextid","frameworkid","updatePage","newhtml","newjs","replaceWith","runTemplateJS","reloadList","context","render","done","fail","exception","doDelete","requests","call","methodname","args","id","pagecontext","contextid","success","framework","get_strings","key","component","param","shortname","strings","alert","deleteHandler","e","preventDefault","this","attr","confirm","duplicateHandler","init"],"mappings":";;;;;;;AAsBAA,kCAAO,CAAC,SAAU,iBAAkB,YAAa,oBAAqB,aAAa,SAASC,EAAGC,UAAWC,KAAMC,aAAcC,SAItHC,cAAgB,EAGhBC,YAAc,EAQdC,WAAa,SAASC,QAASC,OAC/BT,EAAE,sCAAsCU,YAAYF,SACpDP,UAAUU,cAAcF,QAQxBG,WAAa,SAASC,SACtBZ,UAAUa,OAAO,4CAA6CD,SACzDE,KAAKR,YACLS,KAAKb,aAAac,YA8BvBC,SAAW,eAGPC,SAAWjB,KAAKkB,KAAK,CAAC,CACtBC,WAAY,8CACZC,KAAM,CAACC,GAAIjB,cACZ,CACCe,WAAY,qDACZC,KAAM,CACFE,YAAa,CACTC,UAAWpB,mBAIvBc,SAAS,GAAGJ,MAAK,SAASW,UACN,IAAZA,SACUxB,KAAKkB,KAAK,CAAC,CACjBC,WAAY,4CACZC,KAAM,CAACC,GAAIjB,gBAEX,GAAGS,MAAK,SAASY,WACjBvB,IAAIwB,YAAY,CACZ,CAACC,IAAK,2BAA4BC,UAAW,UAAWC,MAAOJ,UAAUK,WACzE,CAACH,IAAK,SAAUC,UAAW,YAC5Bf,MAAK,SAASkB,SACb9B,aAAa+B,MACT,KACAD,QAAQ,OAEbjB,KAAKb,aAAac,iBAG9BD,KAAKb,aAAac,WACrBE,SAAS,GAAGJ,KAAKH,YAAYI,KAAKb,aAAac,kBAsCE,CAQjDkB,cAvCgB,SAASC,GACzBA,EAAEC,qBAEEd,GAAKvB,EAAEsC,MAAMC,KAAK,oBACtBjC,YAAciB,GAECrB,KAAKkB,KAAK,CAAC,CACtBC,WAAY,4CACZC,KAAM,CAACC,GAAIjB,gBAGN,GAAGS,MAAK,SAASY,WACtBvB,IAAIwB,YAAY,CACZ,CAACC,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,4BAA6BC,UAAW,UAAWC,MAAOJ,UAAUK,WAC1E,CAACH,IAAK,SAAUC,UAAW,UAC3B,CAACD,IAAK,SAAUC,UAAW,YAC5Bf,MAAK,SAASkB,SACb9B,aAAaqC,QACTP,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRf,aAELF,KAAKb,aAAac,cACtBD,KAAKb,aAAac,YAoBrBwB,iBA5Gc,SAASL,GACvBA,EAAEC,iBAEF/B,YAAcN,EAAEsC,MAAMC,KAAK,oBAGZrC,KAAKkB,KAAK,CAAC,CACtBC,WAAY,iDACZC,KAAM,CAACC,GAAIjB,cACZ,CACCe,WAAY,qDACZC,KAAM,CACFE,YAAa,CACTC,UAAWpB,mBAId,GAAGU,KAAKH,YAAYI,KAAKb,aAAac,YAkG/CyB,KAAM,SAASjB,WACXpB,cAAgBoB"} \ No newline at end of file +{"version":3,"file":"frameworkactions.min.js","sources":["../src/frameworkactions.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 * Competency frameworks actions via ajax.\n *\n * @module tool_lp/frameworkactions\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/ajax', 'core/notification', 'core/str'], function($, templates, ajax, notification, str) {\n // Private variables and functions.\n\n /** @var {Number} pagecontextid The id of the context */\n var pagecontextid = 0;\n\n /** @var {Number} frameworkid The id of the framework */\n var frameworkid = 0;\n\n /**\n * Callback to replace the dom element with the rendered template.\n *\n * @param {String} newhtml The new html to insert.\n * @param {String} newjs The new js to run.\n */\n var updatePage = function(newhtml, newjs) {\n $('[data-region=\"managecompetencies\"]').replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n };\n\n /**\n * Callback to render the page template again and update the page.\n *\n * @param {Object} context The context for the template.\n */\n var reloadList = function(context) {\n templates.render('tool_lp/manage_competency_frameworks_page', context)\n .done(updatePage)\n .fail(notification.exception);\n };\n\n /**\n * Duplicate a framework and reload the page.\n * @method doDuplicate\n * @param {Event} e\n */\n var doDuplicate = function(e) {\n e.preventDefault();\n\n frameworkid = $(this).attr('data-frameworkid');\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_duplicate_competency_framework',\n args: {id: frameworkid}\n }, {\n methodname: 'tool_lp_data_for_competency_frameworks_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[1].done(reloadList).fail(notification.exception);\n };\n /**\n * Delete a framework and reload the page.\n */\n var doDelete = function() {\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_delete_competency_framework',\n args: {id: frameworkid}\n }, {\n methodname: 'tool_lp_data_for_competency_frameworks_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[0].done(function(success) {\n if (success === false) {\n var req = ajax.call([{\n methodname: 'core_competency_read_competency_framework',\n args: {id: frameworkid}\n }]);\n req[0].done(function(framework) {\n str.get_strings([\n {key: 'frameworkcannotbedeleted', component: 'tool_lp', param: framework.shortname},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.alert(\n null,\n strings[0]\n );\n }).fail(notification.exception);\n });\n }\n }).fail(notification.exception);\n requests[1].done(reloadList).fail(notification.exception);\n };\n\n /**\n * Handler for \"Delete competency framework\" actions.\n * @param {Event} e\n */\n var confirmDelete = function(e) {\n e.preventDefault();\n\n var id = $(this).attr('data-frameworkid');\n frameworkid = id;\n\n var requests = ajax.call([{\n methodname: 'core_competency_read_competency_framework',\n args: {id: frameworkid}\n }]);\n\n requests[0].done(function(framework) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deletecompetencyframework', component: 'tool_lp', param: framework.shortname},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete competency framework X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doDelete\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n\n return /** @alias module:tool_lp/frameworkactions */ {\n // Public variables and functions.\n\n /**\n * Expose the event handler for delete.\n * @method deleteHandler\n * @param {Event} e\n */\n deleteHandler: confirmDelete,\n\n /**\n * Expose the event handler for duplicate.\n * @method duplicateHandler\n * @param {Event} e\n */\n duplicateHandler: doDuplicate,\n\n /**\n * Initialise the module.\n * @method init\n * @param {Number} contextid The context id of the page.\n */\n init: function(contextid) {\n pagecontextid = contextid;\n }\n };\n});\n"],"names":["define","$","templates","ajax","notification","str","pagecontextid","frameworkid","updatePage","newhtml","newjs","replaceWith","runTemplateJS","reloadList","context","render","done","fail","exception","doDelete","requests","call","methodname","args","id","pagecontext","contextid","success","framework","get_strings","key","component","param","shortname","strings","alert","deleteHandler","e","preventDefault","this","attr","confirm","duplicateHandler","init"],"mappings":";;;;;;;AAsBAA,OAAM,2BAAC,CAAC,SAAU,iBAAkB,YAAa,oBAAqB,aAAa,SAASC,EAAGC,UAAWC,KAAMC,aAAcC,KAItHC,IAAAA,cAAgB,EAGhBC,YAAc,EAQdC,WAAa,SAASC,QAASC,OAC/BT,EAAE,sCAAsCU,YAAYF,SACpDP,UAAUU,cAAcF,MAC3B,EAOGG,WAAa,SAASC,SACtBZ,UAAUa,OAAO,4CAA6CD,SACzDE,KAAKR,YACLS,KAAKb,aAAac,UAC1B,EA6BGC,SAAW,WAGX,IAAIC,SAAWjB,KAAKkB,KAAK,CAAC,CACtBC,WAAY,8CACZC,KAAM,CAACC,GAAIjB,cACZ,CACCe,WAAY,qDACZC,KAAM,CACFE,YAAa,CACTC,UAAWpB,mBAIvBc,SAAS,GAAGJ,MAAK,SAASW,UACN,IAAZA,SACUxB,KAAKkB,KAAK,CAAC,CACjBC,WAAY,4CACZC,KAAM,CAACC,GAAIjB,gBAEX,GAAGS,MAAK,SAASY,WACjBvB,IAAIwB,YAAY,CACZ,CAACC,IAAK,2BAA4BC,UAAW,UAAWC,MAAOJ,UAAUK,WACzE,CAACH,IAAK,SAAUC,UAAW,YAC5Bf,MAAK,SAASkB,SACb9B,aAAa+B,MACT,KACAD,QAAQ,GANhB,IAQGjB,KAAKb,aAAac,UACxB,GAhBT,IAkBGD,KAAKb,aAAac,WACrBE,SAAS,GAAGJ,KAAKH,YAAYI,KAAKb,aAAac,UAClD,EAqCoD,MAAA,CAQjDkB,cAvCgB,SAASC,GACzBA,EAAEC,iBAEEd,IAAAA,GAAKvB,EAAEsC,MAAMC,KAAK,oBACtBjC,YAAciB,GAECrB,KAAKkB,KAAK,CAAC,CACtBC,WAAY,4CACZC,KAAM,CAACC,GAAIjB,gBAGN,GAAGS,MAAK,SAASY,WACtBvB,IAAIwB,YAAY,CACZ,CAACC,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,4BAA6BC,UAAW,UAAWC,MAAOJ,UAAUK,WAC1E,CAACH,IAAK,SAAUC,UAAW,UAC3B,CAACD,IAAK,SAAUC,UAAW,YAC5Bf,MAAK,SAASkB,SACb9B,aAAaqC,QACTP,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRf,SAXR,IAaGF,KAAKb,aAAac,UAdzB,IAeGD,KAAKb,aAAac,UAExB,EAkBGwB,iBA5Gc,SAASL,GACvBA,EAAEC,iBAEF/B,YAAcN,EAAEsC,MAAMC,KAAK,oBAGZrC,KAAKkB,KAAK,CAAC,CACtBC,WAAY,iDACZC,KAAM,CAACC,GAAIjB,cACZ,CACCe,WAAY,qDACZC,KAAM,CACFE,YAAa,CACTC,UAAWpB,mBAId,GAAGU,KAAKH,YAAYI,KAAKb,aAAac,UAClD,EAiGGyB,KAAM,SAASjB,WACXpB,cAAgBoB,SACnB,EAER"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/frameworks_datasource.min.js.map b/admin/tool/lp/amd/build/frameworks_datasource.min.js.map index 26a6873f93f..b8bbaf83113 100644 --- a/admin/tool/lp/amd/build/frameworks_datasource.min.js.map +++ b/admin/tool/lp/amd/build/frameworks_datasource.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frameworks_datasource.min.js","sources":["../src/frameworks_datasource.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 * Frameworks datasource.\n *\n * This module is compatible with core/form-autocomplete.\n *\n * @module tool_lp/frameworks_datasource\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n return /** @alias module:tool_lpmigrate/frameworks_datasource */ {\n\n /**\n * List frameworks.\n *\n * @param {Number} contextId The context ID.\n * @param {Object} options Additional parameters to pass to the external function.\n * @return {Promise}\n */\n list: function(contextId, options) {\n var args = {\n context: {\n contextid: contextId\n }\n };\n\n $.extend(args, typeof options === 'undefined' ? {} : options);\n return Ajax.call([{\n methodname: 'core_competency_list_competency_frameworks',\n args: args\n }])[0];\n },\n\n /**\n * Process the results for auto complete elements.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {Array} results An array or results.\n * @return {Array} New array of results.\n */\n processResults: function(selector, results) {\n var options = [];\n $.each(results, function(index, data) {\n options.push({\n value: data.id,\n label: data.shortname + ' ' + data.idnumber\n });\n });\n return options;\n },\n\n /**\n * Source of data for Ajax element.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {String} query The query string.\n * @param {Function} callback A callback function receiving an array of results.\n */\n /* eslint-disable promise/no-callback-in-promise */\n transport: function(selector, query, callback) {\n var el = $(selector),\n contextId = el.data('contextid'),\n onlyVisible = el.data('onlyvisible');\n\n if (!contextId) {\n throw new Error('The attribute data-contextid is required on ' + selector);\n }\n this.list(contextId, {\n query: query,\n onlyvisible: onlyVisible,\n }).then(callback).catch(Notification.exception);\n }\n };\n\n});\n"],"names":["define","$","Ajax","Notification","list","contextId","options","args","context","contextid","extend","call","methodname","processResults","selector","results","each","index","data","push","value","id","label","shortname","idnumber","transport","query","callback","el","onlyVisible","Error","onlyvisible","then","catch","exception"],"mappings":";;;;;;;;;AAyBAA,uCAAO,CAAC,SAAU,YAAa,sBAAsB,SAASC,EAAGC,KAAMC,oBAEF,CAS7DC,KAAM,SAASC,UAAWC,aAClBC,KAAO,CACHC,QAAS,CACLC,UAAWJ,mBAIvBJ,EAAES,OAAOH,UAAyB,IAAZD,QAA0B,GAAKA,SAC9CJ,KAAKS,KAAK,CAAC,CACdC,WAAY,6CACZL,KAAMA,QACN,IAURM,eAAgB,SAASC,SAAUC,aAC3BT,QAAU,UACdL,EAAEe,KAAKD,SAAS,SAASE,MAAOC,MAC5BZ,QAAQa,KAAK,CACTC,MAAOF,KAAKG,GACZC,MAAOJ,KAAKK,UAAY,IAAML,KAAKM,cAGpClB,SAWXmB,UAAW,SAASX,SAAUY,MAAOC,cAC7BC,GAAK3B,EAAEa,UACPT,UAAYuB,GAAGV,KAAK,aACpBW,YAAcD,GAAGV,KAAK,mBAErBb,gBACK,IAAIyB,MAAM,+CAAiDhB,eAEhEV,KAAKC,UAAW,CACjBqB,MAAOA,MACPK,YAAaF,cACdG,KAAKL,UAAUM,MAAM9B,aAAa+B"} \ No newline at end of file +{"version":3,"file":"frameworks_datasource.min.js","sources":["../src/frameworks_datasource.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 * Frameworks datasource.\n *\n * This module is compatible with core/form-autocomplete.\n *\n * @module tool_lp/frameworks_datasource\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n return /** @alias module:tool_lpmigrate/frameworks_datasource */ {\n\n /**\n * List frameworks.\n *\n * @param {Number} contextId The context ID.\n * @param {Object} options Additional parameters to pass to the external function.\n * @return {Promise}\n */\n list: function(contextId, options) {\n var args = {\n context: {\n contextid: contextId\n }\n };\n\n $.extend(args, typeof options === 'undefined' ? {} : options);\n return Ajax.call([{\n methodname: 'core_competency_list_competency_frameworks',\n args: args\n }])[0];\n },\n\n /**\n * Process the results for auto complete elements.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {Array} results An array or results.\n * @return {Array} New array of results.\n */\n processResults: function(selector, results) {\n var options = [];\n $.each(results, function(index, data) {\n options.push({\n value: data.id,\n label: data.shortname + ' ' + data.idnumber\n });\n });\n return options;\n },\n\n /**\n * Source of data for Ajax element.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {String} query The query string.\n * @param {Function} callback A callback function receiving an array of results.\n */\n /* eslint-disable promise/no-callback-in-promise */\n transport: function(selector, query, callback) {\n var el = $(selector),\n contextId = el.data('contextid'),\n onlyVisible = el.data('onlyvisible');\n\n if (!contextId) {\n throw new Error('The attribute data-contextid is required on ' + selector);\n }\n this.list(contextId, {\n query: query,\n onlyvisible: onlyVisible,\n }).then(callback).catch(Notification.exception);\n }\n };\n\n});\n"],"names":["define","$","Ajax","Notification","list","contextId","options","args","context","contextid","extend","call","methodname","processResults","selector","results","each","index","data","push","value","id","label","shortname","idnumber","transport","query","callback","el","onlyVisible","Error","onlyvisible","then","catch","exception"],"mappings":";;;;;;;;;AAyBAA,OAAO,gCAAA,CAAC,SAAU,YAAa,sBAAsB,SAASC,EAAGC,KAAMC,cAEF,MAAA,CAS7DC,KAAM,SAASC,UAAWC,SACtB,IAAIC,KAAO,CACHC,QAAS,CACLC,UAAWJ,YAKvB,OADAJ,EAAES,OAAOH,UAAyB,IAAZD,QAA0B,CAAA,EAAKA,SAC9CJ,KAAKS,KAAK,CAAC,CACdC,WAAY,6CACZL,KAAMA,QACN,EApBqD,EA8B7DM,eAAgB,SAASC,SAAUC,SAC3BT,IAAAA,QAAU,GAOd,OANAL,EAAEe,KAAKD,SAAS,SAASE,MAAOC,MAC5BZ,QAAQa,KAAK,CACTC,MAAOF,KAAKG,GACZC,MAAOJ,KAAKK,UAAY,IAAML,KAAKM,UAE1C,IACMlB,OAtCkD,EAiD7DmB,UAAW,SAASX,SAAUY,MAAOC,UACjC,IAAIC,GAAK3B,EAAEa,UACPT,UAAYuB,GAAGV,KAAK,aACpBW,YAAcD,GAAGV,KAAK,eAEtB,IAACb,UACD,MAAM,IAAIyB,MAAM,+CAAiDhB,UAEhEV,KAAAA,KAAKC,UAAW,CACjBqB,MAAOA,MACPK,YAAaF,cACdG,KAAKL,UAAUM,MAAM9B,aAAa+B,UACxC,EAGR"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/grade_dialogue.min.js.map b/admin/tool/lp/amd/build/grade_dialogue.min.js.map index 52764f4e8fe..cb991abf7bf 100644 --- a/admin/tool/lp/amd/build/grade_dialogue.min.js.map +++ b/admin/tool/lp/amd/build/grade_dialogue.min.js.map @@ -1 +1 @@ -{"version":3,"file":"grade_dialogue.min.js","sources":["../src/grade_dialogue.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 * Grade dialogue.\n *\n * @module tool_lp/grade_dialogue\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/templates',\n 'tool_lp/dialogue',\n 'tool_lp/event_base',\n 'core/str'],\n function($, Notification, Templates, Dialogue, EventBase, Str) {\n\n /**\n * Grade dialogue class.\n *\n * @class tool_lp/grade_dialogue\n * @param {Array} ratingOptions\n */\n var Grade = function(ratingOptions) {\n EventBase.prototype.constructor.apply(this, []);\n this._ratingOptions = ratingOptions;\n };\n Grade.prototype = Object.create(EventBase.prototype);\n\n /** @property {Dialogue} The dialogue. */\n Grade.prototype._popup = null;\n /** @property {Array} Array of objects containing, 'value', 'name' and optionally 'selected'. */\n Grade.prototype._ratingOptions = null;\n\n /**\n * After render hook.\n *\n * @method _afterRender\n * @protected\n */\n Grade.prototype._afterRender = function() {\n var btnRate = this._find('[data-action=\"rate\"]'),\n lstRating = this._find('[name=\"rating\"]'),\n txtComment = this._find('[name=\"comment\"]');\n\n this._find('[data-action=\"cancel\"]').click(function(e) {\n e.preventDefault();\n this._trigger('cancelled');\n this.close();\n }.bind(this));\n\n lstRating.change(function() {\n var node = $(this);\n if (!node.val()) {\n btnRate.prop('disabled', true);\n } else {\n btnRate.prop('disabled', false);\n }\n }).change();\n\n btnRate.click(function(e) {\n e.preventDefault();\n var val = lstRating.val();\n if (!val) {\n return;\n }\n this._trigger('rated', {\n 'rating': val,\n 'note': txtComment.val()\n });\n this.close();\n }.bind(this));\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n Grade.prototype.close = function() {\n this._popup.close();\n this._popup = null;\n };\n\n /**\n * Opens the picker.\n *\n * @method display\n * @return {Promise}\n */\n Grade.prototype.display = function() {\n M.util.js_pending('tool_lp/grade_dialogue:display');\n return $.when(\n Str.get_string('rate', 'tool_lp'),\n this._render()\n )\n .then(function(title, templateResult) {\n this._popup = new Dialogue(\n title,\n templateResult[0],\n function() {\n this._afterRender();\n M.util.js_complete('tool_lp/grade_dialogue:display');\n }.bind(this)\n );\n\n return this._popup;\n }.bind(this))\n .catch(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @method _find\n * @returns {node} The node\n * @protected\n */\n Grade.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @protected\n * @return {Promise}\n */\n Grade.prototype._render = function() {\n var context = {\n cangrade: this._canGrade,\n ratings: this._ratingOptions\n };\n return Templates.render('tool_lp/competency_grader', context);\n };\n\n return Grade;\n});\n"],"names":["define","$","Notification","Templates","Dialogue","EventBase","Str","Grade","ratingOptions","prototype","constructor","apply","this","_ratingOptions","Object","create","_popup","_afterRender","btnRate","_find","lstRating","txtComment","click","e","preventDefault","_trigger","close","bind","change","val","prop","display","M","util","js_pending","when","get_string","_render","then","title","templateResult","js_complete","catch","exception","selector","getContent","find","context","cangrade","_canGrade","ratings","render"],"mappings":";;;;;;;AAuBAA,gCAAO,CAAC,SACA,oBACA,iBACA,mBACA,qBACA,aACA,SAASC,EAAGC,aAAcC,UAAWC,SAAUC,UAAWC,SAQ1DC,MAAQ,SAASC,eACjBH,UAAUI,UAAUC,YAAYC,MAAMC,KAAM,SACvCC,eAAiBL,sBAE1BD,MAAME,UAAYK,OAAOC,OAAOV,UAAUI,YAG1BO,OAAS,KAEzBT,MAAME,UAAUI,eAAiB,KAQjCN,MAAME,UAAUQ,aAAe,eACvBC,QAAUN,KAAKO,MAAM,wBACrBC,UAAYR,KAAKO,MAAM,mBACvBE,WAAaT,KAAKO,MAAM,yBAEvBA,MAAM,0BAA0BG,MAAM,SAASC,GAChDA,EAAEC,sBACGC,SAAS,kBACTC,SACPC,KAAKf,OAEPQ,UAAUQ,QAAO,WACF3B,EAAEW,MACHiB,MAGNX,QAAQY,KAAK,YAAY,GAFzBZ,QAAQY,KAAK,YAAY,MAI9BF,SAEHV,QAAQI,MAAM,SAASC,GACnBA,EAAEC,qBACEK,IAAMT,UAAUS,MACfA,WAGAJ,SAAS,QAAS,QACTI,SACFR,WAAWQ,aAElBH,UACPC,KAAKf,QAQXL,MAAME,UAAUiB,MAAQ,gBACfV,OAAOU,aACPV,OAAS,MASlBT,MAAME,UAAUsB,QAAU,kBACtBC,EAAEC,KAAKC,WAAW,kCACXjC,EAAEkC,KACL7B,IAAI8B,WAAW,OAAQ,WACvBxB,KAAKyB,WAERC,KAAK,SAASC,MAAOC,4BACbxB,OAAS,IAAIZ,SACdmC,MACAC,eAAe,GACf,gBACSvB,eACLe,EAAEC,KAAKQ,YAAY,mCACrBd,KAAKf,OAGJA,KAAKI,QACdW,KAAKf,OACN8B,MAAMxC,aAAayC,YAWxBpC,MAAME,UAAUU,MAAQ,SAASyB,iBACtB3C,EAAEW,KAAKI,OAAO6B,cAAcC,KAAKF,WAU5CrC,MAAME,UAAU4B,QAAU,eAClBU,QAAU,CACVC,SAAUpC,KAAKqC,UACfC,QAAStC,KAAKC,uBAEXV,UAAUgD,OAAO,4BAA6BJ,UAGlDxC"} \ No newline at end of file +{"version":3,"file":"grade_dialogue.min.js","sources":["../src/grade_dialogue.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 * Grade dialogue.\n *\n * @module tool_lp/grade_dialogue\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/templates',\n 'tool_lp/dialogue',\n 'tool_lp/event_base',\n 'core/str'],\n function($, Notification, Templates, Dialogue, EventBase, Str) {\n\n /**\n * Grade dialogue class.\n *\n * @class tool_lp/grade_dialogue\n * @param {Array} ratingOptions\n */\n var Grade = function(ratingOptions) {\n EventBase.prototype.constructor.apply(this, []);\n this._ratingOptions = ratingOptions;\n };\n Grade.prototype = Object.create(EventBase.prototype);\n\n /** @property {Dialogue} The dialogue. */\n Grade.prototype._popup = null;\n /** @property {Array} Array of objects containing, 'value', 'name' and optionally 'selected'. */\n Grade.prototype._ratingOptions = null;\n\n /**\n * After render hook.\n *\n * @method _afterRender\n * @protected\n */\n Grade.prototype._afterRender = function() {\n var btnRate = this._find('[data-action=\"rate\"]'),\n lstRating = this._find('[name=\"rating\"]'),\n txtComment = this._find('[name=\"comment\"]');\n\n this._find('[data-action=\"cancel\"]').click(function(e) {\n e.preventDefault();\n this._trigger('cancelled');\n this.close();\n }.bind(this));\n\n lstRating.change(function() {\n var node = $(this);\n if (!node.val()) {\n btnRate.prop('disabled', true);\n } else {\n btnRate.prop('disabled', false);\n }\n }).change();\n\n btnRate.click(function(e) {\n e.preventDefault();\n var val = lstRating.val();\n if (!val) {\n return;\n }\n this._trigger('rated', {\n 'rating': val,\n 'note': txtComment.val()\n });\n this.close();\n }.bind(this));\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n Grade.prototype.close = function() {\n this._popup.close();\n this._popup = null;\n };\n\n /**\n * Opens the picker.\n *\n * @method display\n * @return {Promise}\n */\n Grade.prototype.display = function() {\n M.util.js_pending('tool_lp/grade_dialogue:display');\n return $.when(\n Str.get_string('rate', 'tool_lp'),\n this._render()\n )\n .then(function(title, templateResult) {\n this._popup = new Dialogue(\n title,\n templateResult[0],\n function() {\n this._afterRender();\n M.util.js_complete('tool_lp/grade_dialogue:display');\n }.bind(this)\n );\n\n return this._popup;\n }.bind(this))\n .catch(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @method _find\n * @returns {node} The node\n * @protected\n */\n Grade.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @protected\n * @return {Promise}\n */\n Grade.prototype._render = function() {\n var context = {\n cangrade: this._canGrade,\n ratings: this._ratingOptions\n };\n return Templates.render('tool_lp/competency_grader', context);\n };\n\n return Grade;\n});\n"],"names":["define","$","Notification","Templates","Dialogue","EventBase","Str","Grade","ratingOptions","prototype","constructor","apply","this","_ratingOptions","Object","create","_popup","_afterRender","btnRate","_find","lstRating","txtComment","click","e","preventDefault","_trigger","close","bind","change","val","prop","rating","display","M","util","js_pending","when","get_string","_render","then","title","templateResult","js_complete","catch","exception","selector","getContent","find","context","cangrade","_canGrade","ratings","render"],"mappings":";;;;;;;AAuBAA,OAAM,yBAAC,CAAC,SACA,oBACA,iBACA,mBACA,qBACA,aACA,SAASC,EAAGC,aAAcC,UAAWC,SAAUC,UAAWC,KAQ9D,IAAIC,MAAQ,SAASC,eACjBH,UAAUI,UAAUC,YAAYC,MAAMC,KAAM,IACvCC,KAAAA,eAAiBL,aACzB,EAgHD,OA/GAD,MAAME,UAAYK,OAAOC,OAAOV,UAAUI,YAG1BO,OAAS,KAEzBT,MAAME,UAAUI,eAAiB,KAQjCN,MAAME,UAAUQ,aAAe,WAC3B,IAAIC,QAAUN,KAAKO,MAAM,wBACrBC,UAAYR,KAAKO,MAAM,mBACvBE,WAAaT,KAAKO,MAAM,oBAEvBA,KAAAA,MAAM,0BAA0BG,MAAM,SAASC,GAChDA,EAAEC,iBACGC,KAAAA,SAAS,aACdb,KAAKc,OACR,EAACC,KAAKf,OAEPQ,UAAUQ,QAAO,WACF3B,EAAEW,MACHiB,MAGNX,QAAQY,KAAK,YAAY,GAFzBZ,QAAQY,KAAK,YAAY,EAIhC,IAAEF,SAEHV,QAAQI,MAAM,SAASC,GACnBA,EAAEC,iBACF,IAAIK,IAAMT,UAAUS,MACfA,MAGAJ,KAAAA,SAAS,QAAS,CACnBM,OAAUF,IACFR,KAAAA,WAAWQ,QAEvBjB,KAAKc,QACR,EAACC,KAAKf,MACV,EAODL,MAAME,UAAUiB,MAAQ,WACfV,KAAAA,OAAOU,QACPV,KAAAA,OAAS,IACjB,EAQDT,MAAME,UAAUuB,QAAU,WAEf/B,OADPgC,EAAEC,KAAKC,WAAW,kCACXlC,EAAEmC,KACL9B,IAAI+B,WAAW,OAAQ,WACvBzB,KAAK0B,WAERC,KAAK,SAASC,MAAOC,gBAUlB,OATA7B,KAAKI,OAAS,IAAIZ,SACdoC,MACAC,eAAe,GACf,WACI7B,KAAKK,eACLgB,EAAEC,KAAKQ,YAAY,iCACtB,EAACf,KAAKf,OAGJA,KAAKI,MACf,EAACW,KAAKf,OACN+B,MAAMzC,aAAa0C,UACvB,EAUDrC,MAAME,UAAUU,MAAQ,SAAS0B,UAC7B,OAAO5C,EAAEW,KAAKI,OAAO8B,cAAcC,KAAKF,SAC3C,EASDtC,MAAME,UAAU6B,QAAU,WACtB,IAAIU,QAAU,CACVC,SAAUrC,KAAKsC,UACfC,QAASvC,KAAKC,gBAElB,OAAOV,UAAUiD,OAAO,4BAA6BJ,QACxD,EAEMzC,KACV"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/grade_user_competency_inline.min.js.map b/admin/tool/lp/amd/build/grade_user_competency_inline.min.js.map index 180d674de1a..8c32293a5d7 100644 --- a/admin/tool/lp/amd/build/grade_user_competency_inline.min.js.map +++ b/admin/tool/lp/amd/build/grade_user_competency_inline.min.js.map @@ -1 +1 @@ -{"version":3,"file":"grade_user_competency_inline.min.js","sources":["../src/grade_user_competency_inline.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 enable inline editing of a comptency grade.\n *\n * @module tool_lp/grade_user_competency_inline\n * @copyright 2015 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/log',\n 'tool_lp/grade_dialogue',\n 'tool_lp/event_base',\n 'tool_lp/scalevalues',\n ], function($, notification, ajax, log, GradeDialogue, EventBase, ScaleValues) {\n\n /**\n * InlineEditor\n *\n * @class tool_lp/grade_user_competency_inline\n * @param {String} selector The selector to trigger the grading.\n * @param {Number} scaleId The id of the scale for this competency.\n * @param {Number} competencyId The id of the competency.\n * @param {Number} userId The id of the user.\n * @param {Number} planId The id of the plan.\n * @param {Number} courseId The id of the course.\n * @param {String} chooseStr Language string for choose a rating.\n */\n var InlineEditor = function(selector, scaleId, competencyId, userId, planId, courseId, chooseStr) {\n EventBase.prototype.constructor.apply(this, []);\n\n var trigger = $(selector);\n if (!trigger.length) {\n throw new Error('Could not find the trigger');\n }\n\n this._scaleId = scaleId;\n this._competencyId = competencyId;\n this._userId = userId;\n this._planId = planId;\n this._courseId = courseId;\n this._chooseStr = chooseStr;\n this._setUp();\n\n trigger.click(function(e) {\n e.preventDefault();\n this._dialogue.display();\n }.bind(this));\n\n if (this._planId) {\n this._methodName = 'core_competency_grade_competency_in_plan';\n this._args = {\n competencyid: this._competencyId,\n planid: this._planId\n };\n } else if (this._courseId) {\n this._methodName = 'core_competency_grade_competency_in_course';\n this._args = {\n competencyid: this._competencyId,\n courseid: this._courseId,\n userid: this._userId\n };\n } else {\n this._methodName = 'core_competency_grade_competency';\n this._args = {\n userid: this._userId,\n competencyid: this._competencyId\n };\n }\n };\n InlineEditor.prototype = Object.create(EventBase.prototype);\n\n /**\n * Setup.\n *\n * @method _setUp\n */\n InlineEditor.prototype._setUp = function() {\n var options = [],\n self = this;\n\n M.util.js_pending('tool_lp/grade_user_competency_inline:_setUp');\n var promise = ScaleValues.get_values(self._scaleId);\n promise.then(function(scalevalues) {\n options.push({\n value: '',\n name: self._chooseStr\n });\n\n for (var i = 0; i < scalevalues.length; i++) {\n var optionConfig = scalevalues[i];\n options.push({\n value: optionConfig.id,\n name: optionConfig.name\n });\n }\n\n return options;\n })\n .then(function(options) {\n return new GradeDialogue(options);\n })\n .then(function(dialogue) {\n dialogue.on('rated', function(e, data) {\n var args = self._args;\n args.grade = data.rating;\n args.note = data.note;\n ajax.call([{\n methodname: self._methodName,\n args: args,\n done: function(evidence) {\n self._trigger('competencyupdated', {args: args, evidence: evidence});\n },\n fail: notification.exception\n }]);\n });\n\n return dialogue;\n })\n .then(function(dialogue) {\n self._dialogue = dialogue;\n\n M.util.js_complete('tool_lp/grade_user_competency_inline:_setUp');\n return;\n })\n .fail(notification.exception);\n };\n\n /** @property {Number} The scale id for this competency. */\n InlineEditor.prototype._scaleId = null;\n /** @property {Number} The id of the competency. */\n InlineEditor.prototype._competencyId = null;\n /** @property {Number} The id of the user. */\n InlineEditor.prototype._userId = null;\n /** @property {Number} The id of the plan. */\n InlineEditor.prototype._planId = null;\n /** @property {Number} The id of the course. */\n InlineEditor.prototype._courseId = null;\n /** @property {String} The text for Choose rating. */\n InlineEditor.prototype._chooseStr = null;\n /** @property {GradeDialogue} The grading dialogue. */\n InlineEditor.prototype._dialogue = null;\n\n return InlineEditor;\n});\n"],"names":["define","$","notification","ajax","log","GradeDialogue","EventBase","ScaleValues","InlineEditor","selector","scaleId","competencyId","userId","planId","courseId","chooseStr","prototype","constructor","apply","this","trigger","length","Error","_scaleId","_competencyId","_userId","_planId","_courseId","_chooseStr","_setUp","click","e","preventDefault","_dialogue","display","bind","_methodName","_args","competencyid","planid","courseid","userid","Object","create","options","self","M","util","js_pending","get_values","then","scalevalues","push","value","name","i","optionConfig","id","dialogue","on","data","args","grade","rating","note","call","methodname","done","evidence","_trigger","fail","exception","js_complete"],"mappings":";;;;;;;AAuBAA,8CAAO,CAAC,SACA,oBACA,YACA,WACA,yBACA,qBACA,wBACD,SAASC,EAAGC,aAAcC,KAAMC,IAAKC,cAAeC,UAAWC,iBAc9DC,aAAe,SAASC,SAAUC,QAASC,aAAcC,OAAQC,OAAQC,SAAUC,WACnFT,UAAUU,UAAUC,YAAYC,MAAMC,KAAM,QAExCC,QAAUnB,EAAEQ,cACXW,QAAQC,aACH,IAAIC,MAAM,mCAGfC,SAAWb,aACXc,cAAgBb,kBAChBc,QAAUb,YACVc,QAAUb,YACVc,UAAYb,cACZc,WAAab,eACbc,SAELT,QAAQU,MAAM,SAASC,GACnBA,EAAEC,sBACGC,UAAUC,WACjBC,KAAKhB,OAEHA,KAAKO,cACAU,YAAc,gDACdC,MAAQ,CACTC,aAAcnB,KAAKK,cACnBe,OAAQpB,KAAKO,UAEVP,KAAKQ,gBACPS,YAAc,kDACdC,MAAQ,CACTC,aAAcnB,KAAKK,cACnBgB,SAAUrB,KAAKQ,UACfc,OAAQtB,KAAKM,gBAGZW,YAAc,wCACdC,MAAQ,CACTI,OAAQtB,KAAKM,QACba,aAAcnB,KAAKK,wBAI/BhB,aAAaQ,UAAY0B,OAAOC,OAAOrC,UAAUU,YAO1Ba,OAAS,eACxBe,QAAU,GACVC,KAAO1B,KAEX2B,EAAEC,KAAKC,WAAW,+CACJzC,YAAY0C,WAAWJ,KAAKtB,UAClC2B,MAAK,SAASC,aAClBP,QAAQQ,KAAK,CACTC,MAAO,GACPC,KAAMT,KAAKjB,iBAGV,IAAI2B,EAAI,EAAGA,EAAIJ,YAAY9B,OAAQkC,IAAK,KACrCC,aAAeL,YAAYI,GAC/BX,QAAQQ,KAAK,CACTC,MAAOG,aAAaC,GACpBH,KAAME,aAAaF,cAIpBV,WAEVM,MAAK,SAASN,gBACJ,IAAIvC,cAAcuC,YAE5BM,MAAK,SAASQ,iBACXA,SAASC,GAAG,SAAS,SAAS5B,EAAG6B,UACzBC,KAAOhB,KAAKR,MAChBwB,KAAKC,MAAQF,KAAKG,OAClBF,KAAKG,KAAOJ,KAAKI,KACjB7D,KAAK8D,KAAK,CAAC,CACPC,WAAYrB,KAAKT,YACjByB,KAAMA,KACNM,KAAM,SAASC,UACXvB,KAAKwB,SAAS,oBAAqB,CAACR,KAAMA,KAAMO,SAAUA,YAE9DE,KAAMpE,aAAaqE,gBAIpBb,YAEVR,MAAK,SAASQ,UACXb,KAAKZ,UAAYyB,SAEjBZ,EAAEC,KAAKyB,YAAY,kDAGtBF,KAAKpE,aAAaqE,YAIvB/D,aAAaQ,UAAUO,SAAW,KAElCf,aAAaQ,UAAUQ,cAAgB,KAEvChB,aAAaQ,UAAUS,QAAU,KAEjCjB,aAAaQ,UAAUU,QAAU,KAEjClB,aAAaQ,UAAUW,UAAY,KAEnCnB,aAAaQ,UAAUY,WAAa,KAEpCpB,aAAaQ,UAAUiB,UAAY,KAE5BzB"} \ No newline at end of file +{"version":3,"file":"grade_user_competency_inline.min.js","sources":["../src/grade_user_competency_inline.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 enable inline editing of a comptency grade.\n *\n * @module tool_lp/grade_user_competency_inline\n * @copyright 2015 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/log',\n 'tool_lp/grade_dialogue',\n 'tool_lp/event_base',\n 'tool_lp/scalevalues',\n ], function($, notification, ajax, log, GradeDialogue, EventBase, ScaleValues) {\n\n /**\n * InlineEditor\n *\n * @class tool_lp/grade_user_competency_inline\n * @param {String} selector The selector to trigger the grading.\n * @param {Number} scaleId The id of the scale for this competency.\n * @param {Number} competencyId The id of the competency.\n * @param {Number} userId The id of the user.\n * @param {Number} planId The id of the plan.\n * @param {Number} courseId The id of the course.\n * @param {String} chooseStr Language string for choose a rating.\n */\n var InlineEditor = function(selector, scaleId, competencyId, userId, planId, courseId, chooseStr) {\n EventBase.prototype.constructor.apply(this, []);\n\n var trigger = $(selector);\n if (!trigger.length) {\n throw new Error('Could not find the trigger');\n }\n\n this._scaleId = scaleId;\n this._competencyId = competencyId;\n this._userId = userId;\n this._planId = planId;\n this._courseId = courseId;\n this._chooseStr = chooseStr;\n this._setUp();\n\n trigger.click(function(e) {\n e.preventDefault();\n this._dialogue.display();\n }.bind(this));\n\n if (this._planId) {\n this._methodName = 'core_competency_grade_competency_in_plan';\n this._args = {\n competencyid: this._competencyId,\n planid: this._planId\n };\n } else if (this._courseId) {\n this._methodName = 'core_competency_grade_competency_in_course';\n this._args = {\n competencyid: this._competencyId,\n courseid: this._courseId,\n userid: this._userId\n };\n } else {\n this._methodName = 'core_competency_grade_competency';\n this._args = {\n userid: this._userId,\n competencyid: this._competencyId\n };\n }\n };\n InlineEditor.prototype = Object.create(EventBase.prototype);\n\n /**\n * Setup.\n *\n * @method _setUp\n */\n InlineEditor.prototype._setUp = function() {\n var options = [],\n self = this;\n\n M.util.js_pending('tool_lp/grade_user_competency_inline:_setUp');\n var promise = ScaleValues.get_values(self._scaleId);\n promise.then(function(scalevalues) {\n options.push({\n value: '',\n name: self._chooseStr\n });\n\n for (var i = 0; i < scalevalues.length; i++) {\n var optionConfig = scalevalues[i];\n options.push({\n value: optionConfig.id,\n name: optionConfig.name\n });\n }\n\n return options;\n })\n .then(function(options) {\n return new GradeDialogue(options);\n })\n .then(function(dialogue) {\n dialogue.on('rated', function(e, data) {\n var args = self._args;\n args.grade = data.rating;\n args.note = data.note;\n ajax.call([{\n methodname: self._methodName,\n args: args,\n done: function(evidence) {\n self._trigger('competencyupdated', {args: args, evidence: evidence});\n },\n fail: notification.exception\n }]);\n });\n\n return dialogue;\n })\n .then(function(dialogue) {\n self._dialogue = dialogue;\n\n M.util.js_complete('tool_lp/grade_user_competency_inline:_setUp');\n return;\n })\n .fail(notification.exception);\n };\n\n /** @property {Number} The scale id for this competency. */\n InlineEditor.prototype._scaleId = null;\n /** @property {Number} The id of the competency. */\n InlineEditor.prototype._competencyId = null;\n /** @property {Number} The id of the user. */\n InlineEditor.prototype._userId = null;\n /** @property {Number} The id of the plan. */\n InlineEditor.prototype._planId = null;\n /** @property {Number} The id of the course. */\n InlineEditor.prototype._courseId = null;\n /** @property {String} The text for Choose rating. */\n InlineEditor.prototype._chooseStr = null;\n /** @property {GradeDialogue} The grading dialogue. */\n InlineEditor.prototype._dialogue = null;\n\n return InlineEditor;\n});\n"],"names":["define","$","notification","ajax","log","GradeDialogue","EventBase","ScaleValues","InlineEditor","selector","scaleId","competencyId","userId","planId","courseId","chooseStr","prototype","constructor","apply","this","trigger","length","Error","_scaleId","_competencyId","_userId","_planId","_courseId","_chooseStr","_setUp","click","e","preventDefault","_dialogue","display","bind","_methodName","_args","competencyid","planid","courseid","userid","Object","create","options","self","M","util","js_pending","get_values","then","scalevalues","push","value","name","i","optionConfig","id","dialogue","on","data","args","grade","rating","note","call","methodname","done","evidence","_trigger","fail","exception","js_complete"],"mappings":";;;;;;;AAuBAA,OAAO,uCAAA,CAAC,SACA,oBACA,YACA,WACA,yBACA,qBACA,wBACD,SAASC,EAAGC,aAAcC,KAAMC,IAAKC,cAAeC,UAAWC,aAclE,IAAIC,aAAe,SAASC,SAAUC,QAASC,aAAcC,OAAQC,OAAQC,SAAUC,WACnFT,UAAUU,UAAUC,YAAYC,MAAMC,KAAM,IAE5C,IAAIC,QAAUnB,EAAEQ,UAChB,IAAKW,QAAQC,OACT,MAAM,IAAIC,MAAM,8BAGfC,KAAAA,SAAWb,QACXc,KAAAA,cAAgBb,aAChBc,KAAAA,QAAUb,OACVc,KAAAA,QAAUb,OACVc,KAAAA,UAAYb,SACZc,KAAAA,WAAab,UAClBI,KAAKU,SAELT,QAAQU,MAAM,SAASC,GACnBA,EAAEC,iBACGC,KAAAA,UAAUC,SAClB,EAACC,KAAKhB,OAEHA,KAAKO,SACAU,KAAAA,YAAc,2CACnBjB,KAAKkB,MAAQ,CACTC,aAAcnB,KAAKK,cACnBe,OAAQpB,KAAKO,UAEVP,KAAKQ,WACPS,KAAAA,YAAc,6CACnBjB,KAAKkB,MAAQ,CACTC,aAAcnB,KAAKK,cACnBgB,SAAUrB,KAAKQ,UACfc,OAAQtB,KAAKM,WAGZW,KAAAA,YAAc,mCACnBjB,KAAKkB,MAAQ,CACTI,OAAQtB,KAAKM,QACba,aAAcnB,KAAKK,eAG9B,EA0ED,OAzEAhB,aAAaQ,UAAY0B,OAAOC,OAAOrC,UAAUU,YAO1Ba,OAAS,WACxBe,IAAAA,QAAU,GACVC,KAAO1B,KAEX2B,EAAEC,KAAKC,WAAW,+CACJzC,YAAY0C,WAAWJ,KAAKtB,UAClC2B,MAAK,SAASC,aAClBP,QAAQQ,KAAK,CACTC,MAAO,GACPC,KAAMT,KAAKjB,aAGf,IAAK,IAAI2B,EAAI,EAAGA,EAAIJ,YAAY9B,OAAQkC,IAAK,CACzC,IAAIC,aAAeL,YAAYI,GAC/BX,QAAQQ,KAAK,CACTC,MAAOG,aAAaC,GACpBH,KAAME,aAAaF,MAE1B,CAED,OAAOV,OACV,IACAM,MAAK,SAASN,SACX,OAAO,IAAIvC,cAAcuC,QAC5B,IACAM,MAAK,SAASQ,UAeX,OAdAA,SAASC,GAAG,SAAS,SAAS5B,EAAG6B,MAC7B,IAAIC,KAAOhB,KAAKR,MAChBwB,KAAKC,MAAQF,KAAKG,OAClBF,KAAKG,KAAOJ,KAAKI,KACjB7D,KAAK8D,KAAK,CAAC,CACPC,WAAYrB,KAAKT,YACjByB,KAAMA,KACNM,KAAM,SAASC,UACXvB,KAAKwB,SAAS,oBAAqB,CAACR,KAAMA,KAAMO,SAAUA,UAJvD,EAMPE,KAAMpE,aAAaqE,YAE1B,IAEMb,QACV,IACAR,MAAK,SAASQ,UACXb,KAAKZ,UAAYyB,SAEjBZ,EAAEC,KAAKyB,YAAY,8CAvCvB,IA0CCF,KAAKpE,aAAaqE,UACtB,EAGD/D,aAAaQ,UAAUO,SAAW,KAElCf,aAAaQ,UAAUQ,cAAgB,KAEvChB,aAAaQ,UAAUS,QAAU,KAEjCjB,aAAaQ,UAAUU,QAAU,KAEjClB,aAAaQ,UAAUW,UAAY,KAEnCnB,aAAaQ,UAAUY,WAAa,KAEpCpB,aAAaQ,UAAUiB,UAAY,KAE5BzB,YACV"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/menubar.min.js.map b/admin/tool/lp/amd/build/menubar.min.js.map index 01dbfe4212f..9ce6db4f629 100644 --- a/admin/tool/lp/amd/build/menubar.min.js.map +++ b/admin/tool/lp/amd/build/menubar.min.js.map @@ -1 +1 @@ -{"version":3,"file":"menubar.min.js","sources":["../src/menubar.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 * Aria menubar functionality. Enhances a simple nested list structure into a full aria widget.\n * Based on the open ajax example: http://oaa-accessibility.org/example/26/\n *\n * @module tool_lp/menubar\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n /** @property {boolean} Flag to indicate if we have already registered a click event handler for the document. */\n var documentClickHandlerRegistered = false;\n\n /** @property {boolean} Flag to indicate whether there's an active, open menu. */\n var menuActive = false;\n\n /**\n * Close all open submenus anywhere in the page (there should only ever be one open at a time).\n *\n * @method closeAllSubMenus\n */\n var closeAllSubMenus = function() {\n $('.tool-lp-menu .tool-lp-sub-menu').attr('aria-hidden', 'true');\n // Every menu's closed at this point, so set the menu active flag to false.\n menuActive = false;\n };\n\n /**\n * Constructor\n *\n * @param {jQuery} menuRoot Jquery collection matching the root of the menu.\n * @param {Function[]} handlers called when a menu item is chosen.\n */\n var Menubar = function(menuRoot, handlers) {\n // Setup private class variables.\n this.menuRoot = menuRoot;\n this.handlers = handlers;\n this.rootMenus = this.menuRoot.children('li');\n this.subMenus = this.rootMenus.children('ul');\n this.subMenuItems = this.subMenus.children('li');\n this.allItems = this.rootMenus.add(this.subMenuItems);\n this.activeItem = null;\n this.isChildOpen = false;\n\n this.keys = {\n tab: 9,\n enter: 13,\n esc: 27,\n space: 32,\n left: 37,\n up: 38,\n right: 39,\n down: 40\n };\n\n this.addAriaAttributes();\n // Add the event listeners.\n this.addEventListeners();\n };\n\n /**\n * Open a submenu, first it closes all other sub-menus and sets the open direction.\n * @method openSubMenu\n * @param {Node} menu\n */\n Menubar.prototype.openSubMenu = function(menu) {\n this.setOpenDirection();\n closeAllSubMenus();\n menu.attr('aria-hidden', 'false');\n // Set menu active flag to true when a menu is opened.\n menuActive = true;\n };\n\n\n /**\n * Bind the event listeners to the DOM\n * @method addEventListeners\n */\n Menubar.prototype.addEventListeners = function() {\n var currentThis = this;\n\n // When clicking outside the menubar.\n if (documentClickHandlerRegistered === false) {\n $(document).click(function() {\n // Check if a menu is opened.\n if (menuActive) {\n // Close menu.\n closeAllSubMenus();\n }\n });\n // Set this flag to true so that we won't need to add a document click handler for the other Menubar instances.\n documentClickHandlerRegistered = true;\n }\n\n // Hovers.\n this.subMenuItems.mouseenter(function() {\n $(this).addClass('menu-hover');\n return true;\n });\n\n this.subMenuItems.mouseout(function() {\n $(this).removeClass('menu-hover');\n return true;\n });\n\n // Mouse listeners.\n this.allItems.click(function(e) {\n return currentThis.handleClick($(this), e);\n });\n\n // Key listeners.\n this.allItems.keydown(function(e) {\n return currentThis.handleKeyDown($(this), e);\n });\n\n this.allItems.focus(function() {\n return currentThis.handleFocus($(this));\n });\n\n this.allItems.blur(function() {\n return currentThis.handleBlur($(this));\n });\n };\n\n /**\n * Process click events for the top menus.\n *\n * @method handleClick\n * @param {Object} item is the jquery object of the item firing the event\n * @param {Event} e is the associated event object\n * @return {boolean} Returns false\n */\n Menubar.prototype.handleClick = function(item, e) {\n e.stopPropagation();\n\n var parentUL = item.parent();\n\n if (parentUL.is('.tool-lp-menu')) {\n // Toggle the child menu open/closed.\n if (item.children('ul').first().attr('aria-hidden') == 'true') {\n this.openSubMenu(item.children('ul').first());\n } else {\n item.children('ul').first().attr('aria-hidden', 'true');\n }\n } else {\n // Remove hover and focus styling.\n this.allItems.removeClass('menu-hover menu-focus');\n\n // Clear the active item.\n this.activeItem = null;\n\n // Close the menu.\n this.menuRoot.find('ul').not('.root-level').attr('aria-hidden', 'true');\n // Follow any link, or call the click handlers.\n var anchor = item.find('a').first();\n var clickEvent = new $.Event('click');\n clickEvent.target = anchor;\n var eventHandled = false;\n if (this.handlers) {\n $.each(this.handlers, function(selector, handler) {\n if (eventHandled) {\n return;\n }\n if (item.find(selector).length > 0) {\n var callable = $.proxy(handler, anchor);\n // False means stop propogatting events.\n eventHandled = (callable(clickEvent) === false) || clickEvent.isDefaultPrevented();\n }\n });\n }\n // If we didn't find a handler, and the HREF is # that probably means that\n // we are handling it from somewhere else. Let's just do nothing in that case.\n if (!eventHandled && anchor.attr('href') !== '#') {\n window.location.href = anchor.attr('href');\n }\n }\n return false;\n };\n\n /*\n * Process focus events for the menu.\n *\n * @method handleFocus\n * @param {Object} item is the jquery object of the item firing the event\n * @return boolean Returns false\n */\n Menubar.prototype.handleFocus = function(item) {\n\n // If activeItem is null, we are getting focus from outside the menu. Store\n // the item that triggered the event.\n if (this.activeItem === null) {\n this.activeItem = item;\n } else if (item[0] != this.activeItem[0]) {\n return true;\n }\n\n // Get the set of jquery objects for all the parent items of the active item.\n var parentItems = this.activeItem.parentsUntil('ul.tool-lp-menu').filter('li');\n\n // Remove focus styling from all other menu items.\n this.allItems.removeClass('menu-focus');\n\n // Add focus styling to the active item.\n this.activeItem.addClass('menu-focus');\n\n // Add focus styling to all parent items.\n parentItems.addClass('menu-focus');\n\n // If the bChildOpen flag has been set, open the active item's child menu (if applicable).\n if (this.isChildOpen === true) {\n\n var itemUL = item.parent();\n\n // If the itemUL is a root-level menu and item is a parent item,\n // show the child menu.\n if (itemUL.is('.tool-lp-menu') && (item.attr('aria-haspopup') == 'true')) {\n this.openSubMenu(item.children('ul').first());\n }\n }\n\n return true;\n };\n\n /*\n * Process blur events for the menu.\n *\n * @method handleBlur\n * @param {Object} item is the jquery object of the item firing the event\n * @return boolean Returns false\n */\n Menubar.prototype.handleBlur = function(item) {\n item.removeClass('menu-focus');\n\n return true;\n };\n\n /*\n * Determine if the menu should open to the left, or the right,\n * based on the screen size and menu position.\n * @method setOpenDirection\n */\n Menubar.prototype.setOpenDirection = function() {\n var pos = this.menuRoot.offset();\n var isRTL = $(document.body).hasClass('dir-rtl');\n var openLeft = true;\n var heightmenuRoot = this.rootMenus.outerHeight();\n var widthmenuRoot = this.rootMenus.outerWidth();\n // Sometimes the menuMinWidth is not enough to figure out if menu exceeds the window width.\n // So we have to calculate the real menu width.\n var subMenuContainer = this.rootMenus.find('ul.tool-lp-sub-menu');\n\n // Reset margins.\n subMenuContainer.css('margin-right', '');\n subMenuContainer.css('margin-left', '');\n subMenuContainer.css('margin-top', '');\n\n subMenuContainer.attr('aria-hidden', false);\n var menuRealWidth = subMenuContainer.outerWidth(),\n menuRealHeight = subMenuContainer.outerHeight();\n\n var margintop = null,\n marginright = null,\n marginleft = null;\n var top = pos.top - $(window).scrollTop();\n // Top is the same for RTL and LTR.\n if (top + menuRealHeight > $(window).height()) {\n margintop = menuRealHeight + heightmenuRoot;\n subMenuContainer.css('margin-top', '-' + margintop + 'px');\n }\n\n if (isRTL) {\n if (pos.left - menuRealWidth < 0) {\n marginright = menuRealWidth - widthmenuRoot;\n subMenuContainer.css('margin-right', '-' + marginright + 'px');\n }\n } else {\n if (pos.left + menuRealWidth > $(window).width()) {\n marginleft = menuRealWidth - widthmenuRoot;\n subMenuContainer.css('margin-left', '-' + marginleft + 'px');\n }\n }\n\n if (openLeft) {\n this.menuRoot.addClass('tool-lp-menu-open-left');\n } else {\n this.menuRoot.removeClass('tool-lp-menu-open-left');\n }\n\n };\n\n /*\n * Process keyDown events for the menu.\n *\n * @method handleKeyDown\n * @param {Object} item is the jquery object of the item firing the event\n * @param {Event} e is the associated event object\n * @return boolean Returns false if consuming the event\n */\n Menubar.prototype.handleKeyDown = function(item, e) {\n\n if (e.altKey || e.ctrlKey) {\n // Modifier key pressed: Do not process.\n return true;\n }\n\n switch (e.keyCode) {\n case this.keys.tab: {\n\n // Hide all menu items and update their aria attributes.\n this.menuRoot.find('ul').attr('aria-hidden', 'true');\n\n // Remove focus styling from all menu items.\n this.allItems.removeClass('menu-focus');\n\n this.activeItem = null;\n\n this.isChildOpen = false;\n\n break;\n }\n case this.keys.esc: {\n var itemUL = item.parent();\n\n if (itemUL.is('.tool-lp-menu')) {\n // Hide the child menu and update the aria attributes.\n item.children('ul').first().attr('aria-hidden', 'true');\n } else {\n\n // Move up one level.\n this.activeItem = itemUL.parent();\n\n // Reset the isChildOpen flag.\n this.isChildOpen = false;\n\n // Set focus on the new item.\n this.activeItem.focus();\n\n // Hide the active menu and update the aria attributes.\n itemUL.attr('aria-hidden', 'true');\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.enter:\n case this.keys.space: {\n // Trigger click handler.\n return this.handleClick(item, e);\n }\n\n case this.keys.left: {\n\n this.activeItem = this.moveToPrevious(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n case this.keys.right: {\n\n this.activeItem = this.moveToNext(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n case this.keys.up: {\n\n this.activeItem = this.moveUp(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n case this.keys.down: {\n\n this.activeItem = this.moveDown(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n }\n\n return true;\n\n };\n\n\n /**\n * Move to the next menu level.\n * This will be either the next root-level menu or the child of a menu parent. If\n * at the root level and the active item is the last in the menu, this function will loop\n * to the first menu item.\n *\n * If the menu is a horizontal menu, the first child element of the newly selected menu will\n * be selected\n *\n * @method moveToNext\n * @param {Object} item is the active menu item\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveToNext = function(item) {\n // Item's containing menu.\n var itemUL = item.parent();\n\n // The items in the currently active menu.\n var menuItems = itemUL.children('li');\n\n // The number of items in the active menu.\n var menuNum = menuItems.length;\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n var childMenu = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level move to next sibling. This will require closing\n // the current child menu and opening the new one.\n\n if (menuIndex < menuNum - 1) {\n // Not the last root menu.\n newItem = item.next();\n } else { // Wrap to first item.\n newItem = menuItems.first();\n }\n\n // Close the current child menu (if applicable).\n if (item.attr('aria-haspopup') == 'true') {\n\n childMenu = item.children('ul').first();\n\n if (childMenu.attr('aria-hidden') == 'false') {\n // Update the child menu's aria-hidden attribute.\n childMenu.attr('aria-hidden', 'true');\n this.isChildOpen = true;\n }\n }\n\n // Remove the focus styling from the current menu.\n item.removeClass('menu-focus');\n\n // Open the new child menu (if applicable).\n if ((newItem.attr('aria-haspopup') === 'true') && (this.isChildOpen === true)) {\n\n childMenu = newItem.children('ul').first();\n\n // Update the child's aria-hidden attribute.\n this.openSubMenu(childMenu);\n }\n } else {\n // This is not the root level. If there is a child menu to be moved into, do that;\n // otherwise, move to the next root-level menu if there is one.\n if (item.attr('aria-haspopup') == 'true') {\n\n childMenu = item.children('ul').first();\n\n newItem = childMenu.children('li').first();\n\n // Show the child menu and update its aria attributes.\n this.openSubMenu(childMenu);\n } else {\n // At deepest level, move to the next root-level menu.\n\n var parentMenus = null;\n var rootItem = null;\n\n // Get list of all parent menus for item, up to the root level.\n parentMenus = item.parentsUntil('ul.tool-lp-menu').filter('ul').not('.tool-lp-menu');\n\n // Hide the current menu and update its aria attributes accordingly.\n parentMenus.attr('aria-hidden', 'true');\n\n // Remove the focus styling from the active menu.\n parentMenus.find('li').removeClass('menu-focus');\n parentMenus.last().parent().removeClass('menu-focus');\n\n // The containing root for the menu.\n rootItem = parentMenus.last().parent();\n\n menuIndex = this.rootMenus.index(rootItem);\n\n // If this is not the last root menu item, move to the next one.\n if (menuIndex < this.rootMenus.length - 1) {\n newItem = rootItem.next();\n } else {\n // Loop.\n newItem = this.rootMenus.first();\n }\n\n // Add the focus styling to the new menu.\n newItem.addClass('menu-focus');\n\n if (newItem.attr('aria-haspopup') == 'true') {\n childMenu = newItem.children('ul').first();\n\n newItem = childMenu.children('li').first();\n\n // Show the child menu and update it's aria attributes.\n this.openSubMenu(childMenu);\n this.isChildOpen = true;\n }\n }\n }\n\n return newItem;\n };\n\n /**\n * Member function to move to the previous menu level.\n * This will be either the previous root-level menu or the child of a menu parent. If\n * at the root level and the active item is the first in the menu, this function will loop\n * to the last menu item.\n *\n * If the menu is a horizontal menu, the first child element of the newly selected menu will\n * be selected\n *\n * @method moveToPrevious\n * @param {Object} item is the active menu item\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveToPrevious = function(item) {\n // Item's containing menu.\n var itemUL = item.parent();\n // The items in the currently active menu.\n var menuItems = itemUL.children('li');\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n var childMenu = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level move to previous sibling. This will require closing\n // the current child menu and opening the new one.\n\n if (menuIndex > 0) {\n // Not the first root menu.\n newItem = item.prev();\n } else {\n // Wrap to last item.\n newItem = menuItems.last();\n }\n\n // Close the current child menu (if applicable).\n if (item.attr('aria-haspopup') == 'true') {\n childMenu = item.children('ul').first();\n\n if (childMenu.attr('aria-hidden') == 'false') {\n // Update the child menu's aria-hidden attribute.\n childMenu.attr('aria-hidden', 'true');\n this.isChildOpen = true;\n }\n }\n\n // Remove the focus styling from the current menu.\n item.removeClass('menu-focus');\n\n // Open the new child menu (if applicable).\n if ((newItem.attr('aria-haspopup') === 'true') && (this.isChildOpen === true)) {\n\n childMenu = newItem.children('ul').first();\n\n // Update the child's aria-hidden attribute.\n this.openSubMenu(childMenu);\n\n }\n } else {\n // This is not the root level. If there is a parent menu that is not the\n // root menu, move up one level; otherwise, move to first item of the previous\n // root menu.\n\n var parentLI = itemUL.parent();\n var parentUL = parentLI.parent();\n\n // If this is a vertical menu or is not the first child menu\n // of the root-level menu, move up one level.\n if (!parentUL.is('.tool-lp-menu')) {\n\n newItem = itemUL.parent();\n\n // Hide the active menu and update aria-hidden.\n itemUL.attr('aria-hidden', 'true');\n\n // Remove the focus highlight from the item.\n item.removeClass('menu-focus');\n\n } else {\n // Move to previous root-level menu.\n\n // Hide the current menu and update the aria attributes accordingly.\n itemUL.attr('aria-hidden', 'true');\n\n // Remove the focus styling from the active menu.\n item.removeClass('menu-focus');\n parentLI.removeClass('menu-focus');\n\n menuIndex = this.rootMenus.index(parentLI);\n\n if (menuIndex > 0) {\n // Move to the previous root-level menu.\n newItem = parentLI.prev();\n } else {\n // Loop to last root-level menu.\n newItem = this.rootMenus.last();\n }\n\n // Add the focus styling to the new menu.\n newItem.addClass('menu-focus');\n\n if (newItem.attr('aria-haspopup') == 'true') {\n childMenu = newItem.children('ul').first();\n\n // Show the child menu and update it's aria attributes.\n this.openSubMenu(childMenu);\n this.isChildOpen = true;\n\n newItem = childMenu.children('li').first();\n }\n }\n }\n\n return newItem;\n };\n\n /**\n * Member function to select the next item in a menu.\n * If the active item is the last in the menu, this function will loop to the\n * first menu item.\n *\n * @method moveDown\n * @param {Object} item is the active menu item\n * @param {String} startChr is the character to attempt to match against the beginning of the\n * menu item titles. If found, focus moves to the next menu item beginning with that character.\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveDown = function(item, startChr) {\n // Item's containing menu.\n var itemUL = item.parent();\n // The items in the currently active menu.\n var menuItems = itemUL.children('li').not('.separator');\n // The number of items in the active menu.\n var menuNum = menuItems.length;\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n var newItemUL = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level menu.\n\n if (item.attr('aria-haspopup') != 'true') {\n // No child menu to move to.\n return item;\n }\n\n // Move to the first item in the child menu.\n newItemUL = item.children('ul').first();\n newItem = newItemUL.children('li').first();\n\n // Make sure the child menu is visible.\n this.openSubMenu(newItemUL);\n\n return newItem;\n }\n\n // If $item is not the last item in its menu, move to the next item. If startChr is specified, move\n // to the next item with a title that begins with that character.\n if (startChr) {\n var match = false;\n var curNdx = menuIndex + 1;\n\n // Check if the active item was the last one on the list.\n if (curNdx == menuNum) {\n curNdx = 0;\n }\n\n // Iterate through the menu items (starting from the current item and wrapping) until a match is found\n // or the loop returns to the current menu item.\n while (curNdx != menuIndex) {\n\n var titleChr = menuItems.eq(curNdx).html().charAt(0);\n\n if (titleChr.toLowerCase() == startChr) {\n match = true;\n break;\n }\n\n curNdx = curNdx + 1;\n\n if (curNdx == menuNum) {\n // Reached the end of the list, start again at the beginning.\n curNdx = 0;\n }\n }\n\n if (match === true) {\n newItem = menuItems.eq(curNdx);\n\n // Remove the focus styling from the current item.\n item.removeClass('menu-focus');\n\n return newItem;\n } else {\n return item;\n }\n } else {\n if (menuIndex < menuNum - 1) {\n newItem = menuItems.eq(menuIndex + 1);\n } else {\n newItem = menuItems.first();\n }\n }\n\n // Remove the focus styling from the current item.\n item.removeClass('menu-focus');\n\n return newItem;\n };\n\n /**\n * Function moveUp() is a member function to select the previous item in a menu.\n * If the active item is the first in the menu, this function will loop to the\n * last menu item.\n *\n * @method moveUp\n * @param {Object} item is the active menu item\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveUp = function(item) {\n // Item's containing menu.\n var itemUL = item.parent();\n // The items in the currently active menu.\n var menuItems = itemUL.children('li').not('.separator');\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level menu.\n // Nothing to do.\n return item;\n }\n\n // If item is not the first item in its menu, move to the previous item.\n if (menuIndex > 0) {\n newItem = menuItems.eq(menuIndex - 1);\n } else {\n // Loop to top of menu.\n newItem = menuItems.last();\n }\n\n // Remove the focus styling from the current item.\n item.removeClass('menu-focus');\n\n return newItem;\n };\n\n /**\n * Enhance the dom with aria attributes.\n * @method addAriaAttributes\n */\n Menubar.prototype.addAriaAttributes = function() {\n this.menuRoot.attr('role', 'menubar');\n this.rootMenus.attr('role', 'menuitem');\n this.rootMenus.attr('tabindex', '0');\n this.rootMenus.attr('aria-haspopup', 'true');\n this.subMenus.attr('role', 'menu');\n this.subMenus.attr('aria-hidden', 'true');\n this.subMenuItems.attr('role', 'menuitem');\n this.subMenuItems.attr('tabindex', '-1');\n\n // For CSS styling and effects.\n this.menuRoot.addClass('tool-lp-menu');\n this.allItems.addClass('tool-lp-menu-item');\n this.rootMenus.addClass('tool-lp-root-menu');\n this.subMenus.addClass('tool-lp-sub-menu');\n this.subMenuItems.addClass('dropdown-item');\n };\n\n return /** @alias module:tool_lp/menubar */ {\n /**\n * Create a menu bar object for every node matching the selector.\n *\n * The expected DOM structure is shown below.\n *
    <- This is the target of the selector parameter.\n *
  • <- This is repeated for each top level menu.\n * Text <- This is the text for the top level menu.\n *
      <- This is a list of the entries in this top level menu.\n *
    • <- This is repeated for each menu entry.\n * Choice 1 <- The anchor for the menu.\n *
    • \n *
    \n *
  • \n *
\n *\n * @method enhance\n * @param {String} selector - The selector for the outer most menu node.\n * @param {Function} handler - Javascript handler for when a menu item was chosen. If the\n * handler returns true (or does not exist), the\n * menu will look for an anchor with a link to follow.\n * For example, if the menu entry has a \"data-action\" attribute\n * and we want to call a javascript function when that entry is chosen,\n * we could pass a list of handlers like this:\n * { \"[data-action='add']\" : callAddFunction }\n */\n enhance: function(selector, handler) {\n $(selector).each(function(index, element) {\n var menuRoot = $(element);\n // Don't enhance the same menu twice.\n if (menuRoot.data(\"menubarEnhanced\") !== true) {\n (new Menubar(menuRoot, handler));\n menuRoot.data(\"menubarEnhanced\", true);\n }\n });\n },\n\n /**\n * Handy function to close all open menus anywhere on the page.\n * @method closeAll\n */\n closeAll: closeAllSubMenus\n };\n});\n"],"names":["define","$","documentClickHandlerRegistered","menuActive","closeAllSubMenus","attr","Menubar","menuRoot","handlers","rootMenus","this","children","subMenus","subMenuItems","allItems","add","activeItem","isChildOpen","keys","tab","enter","esc","space","left","up","right","down","addAriaAttributes","addEventListeners","prototype","openSubMenu","menu","setOpenDirection","currentThis","document","click","mouseenter","addClass","mouseout","removeClass","e","handleClick","keydown","handleKeyDown","focus","handleFocus","blur","handleBlur","item","stopPropagation","parent","is","first","find","not","anchor","clickEvent","Event","target","eventHandled","each","selector","handler","length","callable","proxy","isDefaultPrevented","window","location","href","parentItems","parentsUntil","filter","pos","offset","isRTL","body","hasClass","heightmenuRoot","outerHeight","widthmenuRoot","outerWidth","subMenuContainer","css","menuRealWidth","menuRealHeight","margintop","marginright","marginleft","top","scrollTop","height","width","altKey","ctrlKey","keyCode","itemUL","moveToPrevious","moveToNext","moveUp","moveDown","menuItems","menuNum","menuIndex","index","newItem","childMenu","next","parentMenus","rootItem","last","prev","parentLI","startChr","newItemUL","match","curNdx","eq","html","charAt","toLowerCase","enhance","element","data","closeAll"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"menubar.min.js","sources":["../src/menubar.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 * Aria menubar functionality. Enhances a simple nested list structure into a full aria widget.\n * Based on the open ajax example: http://oaa-accessibility.org/example/26/\n *\n * @module tool_lp/menubar\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n /** @property {boolean} Flag to indicate if we have already registered a click event handler for the document. */\n var documentClickHandlerRegistered = false;\n\n /** @property {boolean} Flag to indicate whether there's an active, open menu. */\n var menuActive = false;\n\n /**\n * Close all open submenus anywhere in the page (there should only ever be one open at a time).\n *\n * @method closeAllSubMenus\n */\n var closeAllSubMenus = function() {\n $('.tool-lp-menu .tool-lp-sub-menu').attr('aria-hidden', 'true');\n // Every menu's closed at this point, so set the menu active flag to false.\n menuActive = false;\n };\n\n /**\n * Constructor\n *\n * @param {jQuery} menuRoot Jquery collection matching the root of the menu.\n * @param {Function[]} handlers called when a menu item is chosen.\n */\n var Menubar = function(menuRoot, handlers) {\n // Setup private class variables.\n this.menuRoot = menuRoot;\n this.handlers = handlers;\n this.rootMenus = this.menuRoot.children('li');\n this.subMenus = this.rootMenus.children('ul');\n this.subMenuItems = this.subMenus.children('li');\n this.allItems = this.rootMenus.add(this.subMenuItems);\n this.activeItem = null;\n this.isChildOpen = false;\n\n this.keys = {\n tab: 9,\n enter: 13,\n esc: 27,\n space: 32,\n left: 37,\n up: 38,\n right: 39,\n down: 40\n };\n\n this.addAriaAttributes();\n // Add the event listeners.\n this.addEventListeners();\n };\n\n /**\n * Open a submenu, first it closes all other sub-menus and sets the open direction.\n * @method openSubMenu\n * @param {Node} menu\n */\n Menubar.prototype.openSubMenu = function(menu) {\n this.setOpenDirection();\n closeAllSubMenus();\n menu.attr('aria-hidden', 'false');\n // Set menu active flag to true when a menu is opened.\n menuActive = true;\n };\n\n\n /**\n * Bind the event listeners to the DOM\n * @method addEventListeners\n */\n Menubar.prototype.addEventListeners = function() {\n var currentThis = this;\n\n // When clicking outside the menubar.\n if (documentClickHandlerRegistered === false) {\n $(document).click(function() {\n // Check if a menu is opened.\n if (menuActive) {\n // Close menu.\n closeAllSubMenus();\n }\n });\n // Set this flag to true so that we won't need to add a document click handler for the other Menubar instances.\n documentClickHandlerRegistered = true;\n }\n\n // Hovers.\n this.subMenuItems.mouseenter(function() {\n $(this).addClass('menu-hover');\n return true;\n });\n\n this.subMenuItems.mouseout(function() {\n $(this).removeClass('menu-hover');\n return true;\n });\n\n // Mouse listeners.\n this.allItems.click(function(e) {\n return currentThis.handleClick($(this), e);\n });\n\n // Key listeners.\n this.allItems.keydown(function(e) {\n return currentThis.handleKeyDown($(this), e);\n });\n\n this.allItems.focus(function() {\n return currentThis.handleFocus($(this));\n });\n\n this.allItems.blur(function() {\n return currentThis.handleBlur($(this));\n });\n };\n\n /**\n * Process click events for the top menus.\n *\n * @method handleClick\n * @param {Object} item is the jquery object of the item firing the event\n * @param {Event} e is the associated event object\n * @return {boolean} Returns false\n */\n Menubar.prototype.handleClick = function(item, e) {\n e.stopPropagation();\n\n var parentUL = item.parent();\n\n if (parentUL.is('.tool-lp-menu')) {\n // Toggle the child menu open/closed.\n if (item.children('ul').first().attr('aria-hidden') == 'true') {\n this.openSubMenu(item.children('ul').first());\n } else {\n item.children('ul').first().attr('aria-hidden', 'true');\n }\n } else {\n // Remove hover and focus styling.\n this.allItems.removeClass('menu-hover menu-focus');\n\n // Clear the active item.\n this.activeItem = null;\n\n // Close the menu.\n this.menuRoot.find('ul').not('.root-level').attr('aria-hidden', 'true');\n // Follow any link, or call the click handlers.\n var anchor = item.find('a').first();\n var clickEvent = new $.Event('click');\n clickEvent.target = anchor;\n var eventHandled = false;\n if (this.handlers) {\n $.each(this.handlers, function(selector, handler) {\n if (eventHandled) {\n return;\n }\n if (item.find(selector).length > 0) {\n var callable = $.proxy(handler, anchor);\n // False means stop propogatting events.\n eventHandled = (callable(clickEvent) === false) || clickEvent.isDefaultPrevented();\n }\n });\n }\n // If we didn't find a handler, and the HREF is # that probably means that\n // we are handling it from somewhere else. Let's just do nothing in that case.\n if (!eventHandled && anchor.attr('href') !== '#') {\n window.location.href = anchor.attr('href');\n }\n }\n return false;\n };\n\n /*\n * Process focus events for the menu.\n *\n * @method handleFocus\n * @param {Object} item is the jquery object of the item firing the event\n * @return boolean Returns false\n */\n Menubar.prototype.handleFocus = function(item) {\n\n // If activeItem is null, we are getting focus from outside the menu. Store\n // the item that triggered the event.\n if (this.activeItem === null) {\n this.activeItem = item;\n } else if (item[0] != this.activeItem[0]) {\n return true;\n }\n\n // Get the set of jquery objects for all the parent items of the active item.\n var parentItems = this.activeItem.parentsUntil('ul.tool-lp-menu').filter('li');\n\n // Remove focus styling from all other menu items.\n this.allItems.removeClass('menu-focus');\n\n // Add focus styling to the active item.\n this.activeItem.addClass('menu-focus');\n\n // Add focus styling to all parent items.\n parentItems.addClass('menu-focus');\n\n // If the bChildOpen flag has been set, open the active item's child menu (if applicable).\n if (this.isChildOpen === true) {\n\n var itemUL = item.parent();\n\n // If the itemUL is a root-level menu and item is a parent item,\n // show the child menu.\n if (itemUL.is('.tool-lp-menu') && (item.attr('aria-haspopup') == 'true')) {\n this.openSubMenu(item.children('ul').first());\n }\n }\n\n return true;\n };\n\n /*\n * Process blur events for the menu.\n *\n * @method handleBlur\n * @param {Object} item is the jquery object of the item firing the event\n * @return boolean Returns false\n */\n Menubar.prototype.handleBlur = function(item) {\n item.removeClass('menu-focus');\n\n return true;\n };\n\n /*\n * Determine if the menu should open to the left, or the right,\n * based on the screen size and menu position.\n * @method setOpenDirection\n */\n Menubar.prototype.setOpenDirection = function() {\n var pos = this.menuRoot.offset();\n var isRTL = $(document.body).hasClass('dir-rtl');\n var openLeft = true;\n var heightmenuRoot = this.rootMenus.outerHeight();\n var widthmenuRoot = this.rootMenus.outerWidth();\n // Sometimes the menuMinWidth is not enough to figure out if menu exceeds the window width.\n // So we have to calculate the real menu width.\n var subMenuContainer = this.rootMenus.find('ul.tool-lp-sub-menu');\n\n // Reset margins.\n subMenuContainer.css('margin-right', '');\n subMenuContainer.css('margin-left', '');\n subMenuContainer.css('margin-top', '');\n\n subMenuContainer.attr('aria-hidden', false);\n var menuRealWidth = subMenuContainer.outerWidth(),\n menuRealHeight = subMenuContainer.outerHeight();\n\n var margintop = null,\n marginright = null,\n marginleft = null;\n var top = pos.top - $(window).scrollTop();\n // Top is the same for RTL and LTR.\n if (top + menuRealHeight > $(window).height()) {\n margintop = menuRealHeight + heightmenuRoot;\n subMenuContainer.css('margin-top', '-' + margintop + 'px');\n }\n\n if (isRTL) {\n if (pos.left - menuRealWidth < 0) {\n marginright = menuRealWidth - widthmenuRoot;\n subMenuContainer.css('margin-right', '-' + marginright + 'px');\n }\n } else {\n if (pos.left + menuRealWidth > $(window).width()) {\n marginleft = menuRealWidth - widthmenuRoot;\n subMenuContainer.css('margin-left', '-' + marginleft + 'px');\n }\n }\n\n if (openLeft) {\n this.menuRoot.addClass('tool-lp-menu-open-left');\n } else {\n this.menuRoot.removeClass('tool-lp-menu-open-left');\n }\n\n };\n\n /*\n * Process keyDown events for the menu.\n *\n * @method handleKeyDown\n * @param {Object} item is the jquery object of the item firing the event\n * @param {Event} e is the associated event object\n * @return boolean Returns false if consuming the event\n */\n Menubar.prototype.handleKeyDown = function(item, e) {\n\n if (e.altKey || e.ctrlKey) {\n // Modifier key pressed: Do not process.\n return true;\n }\n\n switch (e.keyCode) {\n case this.keys.tab: {\n\n // Hide all menu items and update their aria attributes.\n this.menuRoot.find('ul').attr('aria-hidden', 'true');\n\n // Remove focus styling from all menu items.\n this.allItems.removeClass('menu-focus');\n\n this.activeItem = null;\n\n this.isChildOpen = false;\n\n break;\n }\n case this.keys.esc: {\n var itemUL = item.parent();\n\n if (itemUL.is('.tool-lp-menu')) {\n // Hide the child menu and update the aria attributes.\n item.children('ul').first().attr('aria-hidden', 'true');\n } else {\n\n // Move up one level.\n this.activeItem = itemUL.parent();\n\n // Reset the isChildOpen flag.\n this.isChildOpen = false;\n\n // Set focus on the new item.\n this.activeItem.focus();\n\n // Hide the active menu and update the aria attributes.\n itemUL.attr('aria-hidden', 'true');\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.enter:\n case this.keys.space: {\n // Trigger click handler.\n return this.handleClick(item, e);\n }\n\n case this.keys.left: {\n\n this.activeItem = this.moveToPrevious(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n case this.keys.right: {\n\n this.activeItem = this.moveToNext(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n case this.keys.up: {\n\n this.activeItem = this.moveUp(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n case this.keys.down: {\n\n this.activeItem = this.moveDown(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n }\n\n return true;\n\n };\n\n\n /**\n * Move to the next menu level.\n * This will be either the next root-level menu or the child of a menu parent. If\n * at the root level and the active item is the last in the menu, this function will loop\n * to the first menu item.\n *\n * If the menu is a horizontal menu, the first child element of the newly selected menu will\n * be selected\n *\n * @method moveToNext\n * @param {Object} item is the active menu item\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveToNext = function(item) {\n // Item's containing menu.\n var itemUL = item.parent();\n\n // The items in the currently active menu.\n var menuItems = itemUL.children('li');\n\n // The number of items in the active menu.\n var menuNum = menuItems.length;\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n var childMenu = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level move to next sibling. This will require closing\n // the current child menu and opening the new one.\n\n if (menuIndex < menuNum - 1) {\n // Not the last root menu.\n newItem = item.next();\n } else { // Wrap to first item.\n newItem = menuItems.first();\n }\n\n // Close the current child menu (if applicable).\n if (item.attr('aria-haspopup') == 'true') {\n\n childMenu = item.children('ul').first();\n\n if (childMenu.attr('aria-hidden') == 'false') {\n // Update the child menu's aria-hidden attribute.\n childMenu.attr('aria-hidden', 'true');\n this.isChildOpen = true;\n }\n }\n\n // Remove the focus styling from the current menu.\n item.removeClass('menu-focus');\n\n // Open the new child menu (if applicable).\n if ((newItem.attr('aria-haspopup') === 'true') && (this.isChildOpen === true)) {\n\n childMenu = newItem.children('ul').first();\n\n // Update the child's aria-hidden attribute.\n this.openSubMenu(childMenu);\n }\n } else {\n // This is not the root level. If there is a child menu to be moved into, do that;\n // otherwise, move to the next root-level menu if there is one.\n if (item.attr('aria-haspopup') == 'true') {\n\n childMenu = item.children('ul').first();\n\n newItem = childMenu.children('li').first();\n\n // Show the child menu and update its aria attributes.\n this.openSubMenu(childMenu);\n } else {\n // At deepest level, move to the next root-level menu.\n\n var parentMenus = null;\n var rootItem = null;\n\n // Get list of all parent menus for item, up to the root level.\n parentMenus = item.parentsUntil('ul.tool-lp-menu').filter('ul').not('.tool-lp-menu');\n\n // Hide the current menu and update its aria attributes accordingly.\n parentMenus.attr('aria-hidden', 'true');\n\n // Remove the focus styling from the active menu.\n parentMenus.find('li').removeClass('menu-focus');\n parentMenus.last().parent().removeClass('menu-focus');\n\n // The containing root for the menu.\n rootItem = parentMenus.last().parent();\n\n menuIndex = this.rootMenus.index(rootItem);\n\n // If this is not the last root menu item, move to the next one.\n if (menuIndex < this.rootMenus.length - 1) {\n newItem = rootItem.next();\n } else {\n // Loop.\n newItem = this.rootMenus.first();\n }\n\n // Add the focus styling to the new menu.\n newItem.addClass('menu-focus');\n\n if (newItem.attr('aria-haspopup') == 'true') {\n childMenu = newItem.children('ul').first();\n\n newItem = childMenu.children('li').first();\n\n // Show the child menu and update it's aria attributes.\n this.openSubMenu(childMenu);\n this.isChildOpen = true;\n }\n }\n }\n\n return newItem;\n };\n\n /**\n * Member function to move to the previous menu level.\n * This will be either the previous root-level menu or the child of a menu parent. If\n * at the root level and the active item is the first in the menu, this function will loop\n * to the last menu item.\n *\n * If the menu is a horizontal menu, the first child element of the newly selected menu will\n * be selected\n *\n * @method moveToPrevious\n * @param {Object} item is the active menu item\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveToPrevious = function(item) {\n // Item's containing menu.\n var itemUL = item.parent();\n // The items in the currently active menu.\n var menuItems = itemUL.children('li');\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n var childMenu = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level move to previous sibling. This will require closing\n // the current child menu and opening the new one.\n\n if (menuIndex > 0) {\n // Not the first root menu.\n newItem = item.prev();\n } else {\n // Wrap to last item.\n newItem = menuItems.last();\n }\n\n // Close the current child menu (if applicable).\n if (item.attr('aria-haspopup') == 'true') {\n childMenu = item.children('ul').first();\n\n if (childMenu.attr('aria-hidden') == 'false') {\n // Update the child menu's aria-hidden attribute.\n childMenu.attr('aria-hidden', 'true');\n this.isChildOpen = true;\n }\n }\n\n // Remove the focus styling from the current menu.\n item.removeClass('menu-focus');\n\n // Open the new child menu (if applicable).\n if ((newItem.attr('aria-haspopup') === 'true') && (this.isChildOpen === true)) {\n\n childMenu = newItem.children('ul').first();\n\n // Update the child's aria-hidden attribute.\n this.openSubMenu(childMenu);\n\n }\n } else {\n // This is not the root level. If there is a parent menu that is not the\n // root menu, move up one level; otherwise, move to first item of the previous\n // root menu.\n\n var parentLI = itemUL.parent();\n var parentUL = parentLI.parent();\n\n // If this is a vertical menu or is not the first child menu\n // of the root-level menu, move up one level.\n if (!parentUL.is('.tool-lp-menu')) {\n\n newItem = itemUL.parent();\n\n // Hide the active menu and update aria-hidden.\n itemUL.attr('aria-hidden', 'true');\n\n // Remove the focus highlight from the item.\n item.removeClass('menu-focus');\n\n } else {\n // Move to previous root-level menu.\n\n // Hide the current menu and update the aria attributes accordingly.\n itemUL.attr('aria-hidden', 'true');\n\n // Remove the focus styling from the active menu.\n item.removeClass('menu-focus');\n parentLI.removeClass('menu-focus');\n\n menuIndex = this.rootMenus.index(parentLI);\n\n if (menuIndex > 0) {\n // Move to the previous root-level menu.\n newItem = parentLI.prev();\n } else {\n // Loop to last root-level menu.\n newItem = this.rootMenus.last();\n }\n\n // Add the focus styling to the new menu.\n newItem.addClass('menu-focus');\n\n if (newItem.attr('aria-haspopup') == 'true') {\n childMenu = newItem.children('ul').first();\n\n // Show the child menu and update it's aria attributes.\n this.openSubMenu(childMenu);\n this.isChildOpen = true;\n\n newItem = childMenu.children('li').first();\n }\n }\n }\n\n return newItem;\n };\n\n /**\n * Member function to select the next item in a menu.\n * If the active item is the last in the menu, this function will loop to the\n * first menu item.\n *\n * @method moveDown\n * @param {Object} item is the active menu item\n * @param {String} startChr is the character to attempt to match against the beginning of the\n * menu item titles. If found, focus moves to the next menu item beginning with that character.\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveDown = function(item, startChr) {\n // Item's containing menu.\n var itemUL = item.parent();\n // The items in the currently active menu.\n var menuItems = itemUL.children('li').not('.separator');\n // The number of items in the active menu.\n var menuNum = menuItems.length;\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n var newItemUL = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level menu.\n\n if (item.attr('aria-haspopup') != 'true') {\n // No child menu to move to.\n return item;\n }\n\n // Move to the first item in the child menu.\n newItemUL = item.children('ul').first();\n newItem = newItemUL.children('li').first();\n\n // Make sure the child menu is visible.\n this.openSubMenu(newItemUL);\n\n return newItem;\n }\n\n // If $item is not the last item in its menu, move to the next item. If startChr is specified, move\n // to the next item with a title that begins with that character.\n if (startChr) {\n var match = false;\n var curNdx = menuIndex + 1;\n\n // Check if the active item was the last one on the list.\n if (curNdx == menuNum) {\n curNdx = 0;\n }\n\n // Iterate through the menu items (starting from the current item and wrapping) until a match is found\n // or the loop returns to the current menu item.\n while (curNdx != menuIndex) {\n\n var titleChr = menuItems.eq(curNdx).html().charAt(0);\n\n if (titleChr.toLowerCase() == startChr) {\n match = true;\n break;\n }\n\n curNdx = curNdx + 1;\n\n if (curNdx == menuNum) {\n // Reached the end of the list, start again at the beginning.\n curNdx = 0;\n }\n }\n\n if (match === true) {\n newItem = menuItems.eq(curNdx);\n\n // Remove the focus styling from the current item.\n item.removeClass('menu-focus');\n\n return newItem;\n } else {\n return item;\n }\n } else {\n if (menuIndex < menuNum - 1) {\n newItem = menuItems.eq(menuIndex + 1);\n } else {\n newItem = menuItems.first();\n }\n }\n\n // Remove the focus styling from the current item.\n item.removeClass('menu-focus');\n\n return newItem;\n };\n\n /**\n * Function moveUp() is a member function to select the previous item in a menu.\n * If the active item is the first in the menu, this function will loop to the\n * last menu item.\n *\n * @method moveUp\n * @param {Object} item is the active menu item\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveUp = function(item) {\n // Item's containing menu.\n var itemUL = item.parent();\n // The items in the currently active menu.\n var menuItems = itemUL.children('li').not('.separator');\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level menu.\n // Nothing to do.\n return item;\n }\n\n // If item is not the first item in its menu, move to the previous item.\n if (menuIndex > 0) {\n newItem = menuItems.eq(menuIndex - 1);\n } else {\n // Loop to top of menu.\n newItem = menuItems.last();\n }\n\n // Remove the focus styling from the current item.\n item.removeClass('menu-focus');\n\n return newItem;\n };\n\n /**\n * Enhance the dom with aria attributes.\n * @method addAriaAttributes\n */\n Menubar.prototype.addAriaAttributes = function() {\n this.menuRoot.attr('role', 'menubar');\n this.rootMenus.attr('role', 'menuitem');\n this.rootMenus.attr('tabindex', '0');\n this.rootMenus.attr('aria-haspopup', 'true');\n this.subMenus.attr('role', 'menu');\n this.subMenus.attr('aria-hidden', 'true');\n this.subMenuItems.attr('role', 'menuitem');\n this.subMenuItems.attr('tabindex', '-1');\n\n // For CSS styling and effects.\n this.menuRoot.addClass('tool-lp-menu');\n this.allItems.addClass('tool-lp-menu-item');\n this.rootMenus.addClass('tool-lp-root-menu');\n this.subMenus.addClass('tool-lp-sub-menu');\n this.subMenuItems.addClass('dropdown-item');\n };\n\n return /** @alias module:tool_lp/menubar */ {\n /**\n * Create a menu bar object for every node matching the selector.\n *\n * The expected DOM structure is shown below.\n *
    <- This is the target of the selector parameter.\n *
  • <- This is repeated for each top level menu.\n * Text <- This is the text for the top level menu.\n *
      <- This is a list of the entries in this top level menu.\n *
    • <- This is repeated for each menu entry.\n * Choice 1 <- The anchor for the menu.\n *
    • \n *
    \n *
  • \n *
\n *\n * @method enhance\n * @param {String} selector - The selector for the outer most menu node.\n * @param {Function} handler - Javascript handler for when a menu item was chosen. If the\n * handler returns true (or does not exist), the\n * menu will look for an anchor with a link to follow.\n * For example, if the menu entry has a \"data-action\" attribute\n * and we want to call a javascript function when that entry is chosen,\n * we could pass a list of handlers like this:\n * { \"[data-action='add']\" : callAddFunction }\n */\n enhance: function(selector, handler) {\n $(selector).each(function(index, element) {\n var menuRoot = $(element);\n // Don't enhance the same menu twice.\n if (menuRoot.data(\"menubarEnhanced\") !== true) {\n (new Menubar(menuRoot, handler));\n menuRoot.data(\"menubarEnhanced\", true);\n }\n });\n },\n\n /**\n * Handy function to close all open menus anywhere on the page.\n * @method closeAll\n */\n closeAll: closeAllSubMenus\n };\n});\n"],"names":["define","$","documentClickHandlerRegistered","menuActive","closeAllSubMenus","attr","Menubar","menuRoot","handlers","rootMenus","this","children","subMenus","subMenuItems","allItems","add","activeItem","isChildOpen","keys","tab","enter","esc","space","left","up","right","down","addAriaAttributes","addEventListeners","prototype","openSubMenu","menu","setOpenDirection","currentThis","document","click","mouseenter","addClass","mouseout","removeClass","e","handleClick","keydown","handleKeyDown","focus","handleFocus","blur","handleBlur","item","stopPropagation","parent","is","first","find","not","anchor","clickEvent","Event","target","eventHandled","each","selector","handler","length","callable","proxy","isDefaultPrevented","window","location","href","parentItems","parentsUntil","filter","pos","offset","isRTL","body","hasClass","heightmenuRoot","outerHeight","widthmenuRoot","outerWidth","subMenuContainer","css","menuRealWidth","menuRealHeight","margintop","marginright","marginleft","top","scrollTop","height","width","altKey","ctrlKey","keyCode","itemUL","moveToPrevious","moveToNext","moveUp","moveDown","menuItems","menuNum","menuIndex","index","newItem","childMenu","next","parentMenus","rootItem","last","prev","parentLI","startChr","newItemUL","match","curNdx","eq","html","charAt","toLowerCase","enhance","element","data","closeAll"],"mappings":";;;;;;;;AAuBAA,yBAAO,CAAC,WAAW,SAASC,GAGpBC,IAAAA,gCAAiC,EAGjCC,YAAa,EAObC,iBAAmB,WACnBH,EAAE,mCAAmCI,KAAK,cAAe,QAEzDF,YAAa,CAChB,EAQGG,QAAU,SAASC,SAAUC,UAExBD,KAAAA,SAAWA,SACXC,KAAAA,SAAWA,SACXC,KAAAA,UAAYC,KAAKH,SAASI,SAAS,MACnCC,KAAAA,SAAWF,KAAKD,UAAUE,SAAS,MACnCE,KAAAA,aAAeH,KAAKE,SAASD,SAAS,MACtCG,KAAAA,SAAWJ,KAAKD,UAAUM,IAAIL,KAAKG,cACnCG,KAAAA,WAAa,KACbC,KAAAA,aAAc,EAEnBP,KAAKQ,KAAO,CACRC,IAAQ,EACRC,MAAQ,GACRC,IAAQ,GACRC,MAAQ,GACRC,KAAQ,GACRC,GAAQ,GACRC,MAAQ,GACRC,KAAQ,IAGZhB,KAAKiB,oBAELjB,KAAKkB,mBACR,EAqtB2C,OA9sB5CtB,QAAQuB,UAAUC,YAAc,SAASC,MACrCrB,KAAKsB,mBACL5B,mBACA2B,KAAK1B,KAAK,cAAe,SAEzBF,YAAa,CAChB,EAODG,QAAQuB,UAAUD,kBAAoB,WAC9BK,IAAAA,YAAcvB,MAGqB,IAAnCR,iCACAD,EAAEiC,UAAUC,OAAM,WAEVhC,YAEAC,kBAEP,IAEDF,gCAAiC,GAIrCQ,KAAKG,aAAauB,YAAW,WAEzB,OADAnC,EAAES,MAAM2B,SAAS,eACV,CACV,IAED3B,KAAKG,aAAayB,UAAS,WAEvB,OADArC,EAAES,MAAM6B,YAAY,eACb,CACV,IAGD7B,KAAKI,SAASqB,OAAM,SAASK,GAClBP,OAAAA,YAAYQ,YAAYxC,EAAES,MAAO8B,EAC3C,IAGD9B,KAAKI,SAAS4B,SAAQ,SAASF,GACpBP,OAAAA,YAAYU,cAAc1C,EAAES,MAAO8B,EAC7C,IAED9B,KAAKI,SAAS8B,OAAM,WACTX,OAAAA,YAAYY,YAAY5C,EAAES,MACpC,IAEDA,KAAKI,SAASgC,MAAK,WACRb,OAAAA,YAAYc,WAAW9C,EAAES,MACnC,GACJ,EAUDJ,QAAQuB,UAAUY,YAAc,SAASO,KAAMR,GAK3C,GAJAA,EAAES,kBAEaD,KAAKE,SAEPC,GAAG,iBAE2C,QAAnDH,KAAKrC,SAAS,MAAMyC,QAAQ/C,KAAK,eAC5ByB,KAAAA,YAAYkB,KAAKrC,SAAS,MAAMyC,SAErCJ,KAAKrC,SAAS,MAAMyC,QAAQ/C,KAAK,cAAe,YAEjD,CAEHK,KAAKI,SAASyB,YAAY,yBAGrBvB,KAAAA,WAAa,KAGlBN,KAAKH,SAAS8C,KAAK,MAAMC,IAAI,eAAejD,KAAK,cAAe,QAE5DkD,IAAAA,OAASP,KAAKK,KAAK,KAAKD,QACxBI,WAAa,IAAIvD,EAAEwD,MAAM,SAC7BD,WAAWE,OAASH,OAChBI,IAAAA,cAAe,EACfjD,KAAKF,UACLP,EAAE2D,KAAKlD,KAAKF,UAAU,SAASqD,SAAUC,SACrC,IAAIH,cAGAX,KAAKK,KAAKQ,UAAUE,OAAS,EAAG,CAC5BC,IAAAA,SAAW/D,EAAEgE,MAAMH,QAASP,QAEhCI,cAAyC,IAAzBK,SAASR,aAA0BA,WAAWU,oBACjE,CACJ,IAIAP,cAAwC,MAAxBJ,OAAOlD,KAAK,UAC7B8D,OAAOC,SAASC,KAAOd,OAAOlD,KAAK,QAE1C,CACD,OAAO,CACV,EASDC,QAAQuB,UAAUgB,YAAc,SAASG,MAIrC,GAAwB,OAApBtC,KAAKM,WACAA,KAAAA,WAAagC,UACf,GAAIA,KAAK,IAAMtC,KAAKM,WAAW,GAClC,OAAO,EAIX,IAAIsD,YAAc5D,KAAKM,WAAWuD,aAAa,mBAAmBC,OAAO,OAGzE9D,KAAKI,SAASyB,YAAY,cAG1B7B,KAAKM,WAAWqB,SAAS,cAGzBiC,YAAYjC,SAAS,eAGI,IAArB3B,KAAKO,eAEQ+B,KAAKE,SAIPC,GAAG,kBAAmD,QAA9BH,KAAK3C,KAAK,kBACpCyB,KAAAA,YAAYkB,KAAKrC,SAAS,MAAMyC,UAI7C,OAAO,CACV,EASD9C,QAAQuB,UAAUkB,WAAa,SAASC,MAGpC,OAFAA,KAAKT,YAAY,eAEV,CACV,EAODjC,QAAQuB,UAAUG,iBAAmB,WACjC,IAAIyC,IAAM/D,KAAKH,SAASmE,SACpBC,MAAQ1E,EAAEiC,SAAS0C,MAAMC,SAAS,WAElCC,eAAiBpE,KAAKD,UAAUsE,cAChCC,cAAgBtE,KAAKD,UAAUwE,aAG/BC,iBAAmBxE,KAAKD,UAAU4C,KAAK,uBAG3C6B,iBAAiBC,IAAI,eAAgB,IACrCD,iBAAiBC,IAAI,cAAe,IACpCD,iBAAiBC,IAAI,aAAc,IAEnCD,iBAAiB7E,KAAK,eAAe,GACrC,IAAI+E,cAAgBF,iBAAiBD,aACjCI,eAAiBH,iBAAiBH,cAElCO,UAAY,KACZC,YAAc,KACdC,WAAa,KACPf,IAAIgB,IAAMxF,EAAEkE,QAAQuB,YAEpBL,eAAiBpF,EAAEkE,QAAQwB,WACjCL,UAAYD,eAAiBP,eAC7BI,iBAAiBC,IAAI,aAAc,IAAMG,UAAY,OAGrDX,MACIF,IAAIlD,KAAO6D,cAAgB,IAC3BG,YAAcH,cAAgBJ,cAC9BE,iBAAiBC,IAAI,eAAgB,IAAMI,YAAc,OAGzDd,IAAIlD,KAAO6D,cAAgBnF,EAAEkE,QAAQyB,UACrCJ,WAAaJ,cAAgBJ,cAC7BE,iBAAiBC,IAAI,cAAe,IAAMK,WAAa,OAK3D9E,KAAKH,SAAS8B,SAAS,yBAK9B,EAUD/B,QAAQuB,UAAUc,cAAgB,SAASK,KAAMR,GAE7C,GAAIA,EAAEqD,QAAUrD,EAAEsD,QAEd,OAAO,EAGHtD,OAAAA,EAAEuD,SACD,KAAArF,KAAKQ,KAAKC,IAGNZ,KAAAA,SAAS8C,KAAK,MAAMhD,KAAK,cAAe,QAG7CK,KAAKI,SAASyB,YAAY,cAErBvB,KAAAA,WAAa,KAEbC,KAAAA,aAAc,EAEnB,MAEC,KAAAP,KAAKQ,KAAKG,IACX,IAAI2E,OAAShD,KAAKE,SAqBlB,OAnBI8C,OAAO7C,GAAG,iBAEVH,KAAKrC,SAAS,MAAMyC,QAAQ/C,KAAK,cAAe,SAIhDK,KAAKM,WAAagF,OAAO9C,SAGpBjC,KAAAA,aAAc,EAGdD,KAAAA,WAAW4B,QAGhBoD,OAAO3F,KAAK,cAAe,SAG/BmC,EAAES,mBACK,EAEN,KAAAvC,KAAKQ,KAAKE,MACV,KAAAV,KAAKQ,KAAKI,MAEX,OAAOZ,KAAK+B,YAAYO,KAAMR,GAG7B,KAAA9B,KAAKQ,KAAKK,KAOX,OALAb,KAAKM,WAAaN,KAAKuF,eAAejD,MAEjChC,KAAAA,WAAW4B,QAEhBJ,EAAES,mBACK,EAEN,KAAAvC,KAAKQ,KAAKO,MAOX,OALAf,KAAKM,WAAaN,KAAKwF,WAAWlD,MAE7BhC,KAAAA,WAAW4B,QAEhBJ,EAAES,mBACK,EAEN,KAAAvC,KAAKQ,KAAKM,GAOX,OALAd,KAAKM,WAAaN,KAAKyF,OAAOnD,MAEzBhC,KAAAA,WAAW4B,QAEhBJ,EAAES,mBACK,EAEN,KAAAvC,KAAKQ,KAAKQ,KAOX,OALAhB,KAAKM,WAAaN,KAAK0F,SAASpD,MAE3BhC,KAAAA,WAAW4B,QAEhBJ,EAAES,mBACK,EAIf,OAAO,CAEV,EAgBD3C,QAAQuB,UAAUqE,WAAa,SAASlD,MAEpC,IAAIgD,OAAShD,KAAKE,SAGdmD,UAAYL,OAAOrF,SAAS,MAG5B2F,QAAUD,UAAUtC,OAEpBwC,UAAYF,UAAUG,MAAMxD,MAC5ByD,QAAU,KACVC,UAAY,KAEhB,GAAIV,OAAO7C,GAAG,iBAMNsD,QAFAF,UAAYD,QAAU,EAEZtD,KAAK2D,OAELN,UAAUjD,QAIU,QAA9BJ,KAAK3C,KAAK,kBAI2B,UAFrCqG,UAAY1D,KAAKrC,SAAS,MAAMyC,SAElB/C,KAAK,iBAEfqG,UAAUrG,KAAK,cAAe,QACzBY,KAAAA,aAAc,GAK3B+B,KAAKT,YAAY,cAGsB,SAAlCkE,QAAQpG,KAAK,mBAAsD,IAArBK,KAAKO,cAEpDyF,UAAYD,QAAQ9F,SAAS,MAAMyC,QAG9BtB,KAAAA,YAAY4E,iBAKrB,GAAkC,QAA9B1D,KAAK3C,KAAK,iBAIVoG,SAFAC,UAAY1D,KAAKrC,SAAS,MAAMyC,SAEZzC,SAAS,MAAMyC,QAG9BtB,KAAAA,YAAY4E,eACd,CAGCE,IAAAA,YAAc,KACdC,SAAW,MAGfD,YAAc5D,KAAKuB,aAAa,mBAAmBC,OAAO,MAAMlB,IAAI,kBAGxDjD,KAAK,cAAe,QAGhCuG,YAAYvD,KAAK,MAAMd,YAAY,cACnCqE,YAAYE,OAAO5D,SAASX,YAAY,cAGxCsE,SAAWD,YAAYE,OAAO5D,UAM1BuD,SAJJF,UAAY7F,KAAKD,UAAU+F,MAAMK,WAGjBnG,KAAKD,UAAUsD,OAAS,EAC1B8C,SAASF,OAGTjG,KAAKD,UAAU2C,SAIrBf,SAAS,cAEoB,QAAjCoE,QAAQpG,KAAK,mBACbqG,UAAYD,QAAQ9F,SAAS,MAAMyC,QAEnCqD,QAAUC,UAAU/F,SAAS,MAAMyC,QAG9BtB,KAAAA,YAAY4E,WACZzF,KAAAA,aAAc,EAE1B,CAGL,OAAOwF,OACV,EAeDnG,QAAQuB,UAAUoE,eAAiB,SAASjD,MAExC,IAAIgD,OAAShD,KAAKE,SAEdmD,UAAYL,OAAOrF,SAAS,MAE5B4F,UAAYF,UAAUG,MAAMxD,MAC5ByD,QAAU,KACVC,UAAY,KAEhB,GAAIV,OAAO7C,GAAG,iBAMNsD,QAFAF,UAAY,EAEFvD,KAAK+D,OAGLV,UAAUS,OAIU,QAA9B9D,KAAK3C,KAAK,kBAG2B,UAFrCqG,UAAY1D,KAAKrC,SAAS,MAAMyC,SAElB/C,KAAK,iBAEfqG,UAAUrG,KAAK,cAAe,QACzBY,KAAAA,aAAc,GAK3B+B,KAAKT,YAAY,cAGsB,SAAlCkE,QAAQpG,KAAK,mBAAsD,IAArBK,KAAKO,cAEpDyF,UAAYD,QAAQ9F,SAAS,MAAMyC,QAG9BtB,KAAAA,YAAY4E,gBAGlB,CAKH,IAAIM,SAAWhB,OAAO9C,SACP8D,SAAS9D,SAIVC,GAAG,kBAcb6C,OAAO3F,KAAK,cAAe,QAG3B2C,KAAKT,YAAY,cACjByE,SAASzE,YAAY,eAMjBkE,SAJJF,UAAY7F,KAAKD,UAAU+F,MAAMQ,WAEjB,EAEFA,SAASD,OAGTrG,KAAKD,UAAUqG,QAIrBzE,SAAS,cAEoB,QAAjCoE,QAAQpG,KAAK,mBACbqG,UAAYD,QAAQ9F,SAAS,MAAMyC,QAG9BtB,KAAAA,YAAY4E,WACZzF,KAAAA,aAAc,EAEnBwF,QAAUC,UAAU/F,SAAS,MAAMyC,WAtCvCqD,QAAUT,OAAO9C,SAGjB8C,OAAO3F,KAAK,cAAe,QAG3B2C,KAAKT,YAAY,cAmCxB,CAED,OAAOkE,OACV,EAaDnG,QAAQuB,UAAUuE,SAAW,SAASpD,KAAMiE,UAExC,IAAIjB,OAAShD,KAAKE,SAEdmD,UAAYL,OAAOrF,SAAS,MAAM2C,IAAI,cAEtCgD,QAAUD,UAAUtC,OAEpBwC,UAAYF,UAAUG,MAAMxD,MAC5ByD,QAAU,KACVS,UAAY,KAEhB,GAAIlB,OAAO7C,GAAG,iBAGV,MAAkC,QAA9BH,KAAK3C,KAAK,iBAEH2C,MAKXyD,SADAS,UAAYlE,KAAKrC,SAAS,MAAMyC,SACZzC,SAAS,MAAMyC,QAG9BtB,KAAAA,YAAYoF,WAEVT,SAKX,GAAIQ,SAAU,CACNE,IAAAA,OAAQ,EACRC,OAASb,UAAY,EASlBa,IANHA,QAAUd,UACVc,OAAS,GAKNA,QAAUb,WAAW,CAIxB,GAFeF,UAAUgB,GAAGD,QAAQE,OAAOC,OAAO,GAErCC,eAAiBP,SAAU,CACpCE,OAAQ,EACR,KACH,EAEDC,QAAkB,IAEJd,UAEVc,OAAS,EAEhB,CAEGD,OAAU,IAAVA,OACAV,QAAUJ,UAAUgB,GAAGD,QAGvBpE,KAAKT,YAAY,cAEVkE,SAEAzD,IAEd,CAWD,OATQyD,QADAF,UAAYD,QAAU,EACZD,UAAUgB,GAAGd,UAAY,GAEzBF,UAAUjD,QAK5BJ,KAAKT,YAAY,cAEVkE,OACV,EAWDnG,QAAQuB,UAAUsE,OAAS,SAASnD,MAEhC,IAAIgD,OAAShD,KAAKE,SAEdmD,UAAYL,OAAOrF,SAAS,MAAM2C,IAAI,cAEtCiD,UAAYF,UAAUG,MAAMxD,MAC5ByD,QAAU,KAEd,OAAIT,OAAO7C,GAAG,iBAGHH,MAKPyD,QADAF,UAAY,EACFF,UAAUgB,GAAGd,UAAY,GAGzBF,UAAUS,OAIxB9D,KAAKT,YAAY,cAEVkE,QACV,EAMDnG,QAAQuB,UAAUF,kBAAoB,WAClCjB,KAAKH,SAASF,KAAK,OAAQ,WAC3BK,KAAKD,UAAUJ,KAAK,OAAQ,YAC5BK,KAAKD,UAAUJ,KAAK,WAAY,KAChCK,KAAKD,UAAUJ,KAAK,gBAAiB,QACrCK,KAAKE,SAASP,KAAK,OAAQ,QAC3BK,KAAKE,SAASP,KAAK,cAAe,QAClCK,KAAKG,aAAaR,KAAK,OAAQ,YAC/BK,KAAKG,aAAaR,KAAK,WAAY,MAGnCK,KAAKH,SAAS8B,SAAS,gBACvB3B,KAAKI,SAASuB,SAAS,qBACvB3B,KAAKD,UAAU4B,SAAS,qBACxB3B,KAAKE,SAASyB,SAAS,oBACvB3B,KAAKG,aAAawB,SAAS,gBAC9B,EAE2C,CA0BxCoF,QAAS,SAAS5D,SAAUC,SACxB7D,EAAE4D,UAAUD,MAAK,SAAS4C,MAAOkB,SAC7B,IAAInH,SAAWN,EAAEyH,UAEwB,IAArCnH,SAASoH,KAAK,qBACb,IAAIrH,QAAQC,SAAUuD,SACvBvD,SAASoH,KAAK,mBAAmB,GAExC,GAlCmC,EAyCxCC,SAAUxH,iBAEjB"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/module_navigation.min.js.map b/admin/tool/lp/amd/build/module_navigation.min.js.map index adddb1a552d..426834c3946 100644 --- a/admin/tool/lp/amd/build/module_navigation.min.js.map +++ b/admin/tool/lp/amd/build/module_navigation.min.js.map @@ -1 +1 @@ -{"version":3,"file":"module_navigation.min.js","sources":["../src/module_navigation.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 navigation between users in a course.\n *\n * @module tool_lp/module_navigation\n * @copyright 2019 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * ModuleNavigation\n *\n * @class tool_lp/module_navigation\n * @param {String} moduleSelector The selector of the module element.\n * @param {String} baseUrl The base url for the page (no params).\n * @param {Number} courseId The course id\n * @param {Number} moduleId The activity module (filter)\n */\n var ModuleNavigation = function(moduleSelector, baseUrl, courseId, moduleId) {\n this._baseUrl = baseUrl;\n this._moduleId = moduleId;\n this._courseId = courseId;\n\n $(moduleSelector).on('change', this._moduleChanged.bind(this));\n };\n\n /**\n * The module was changed in the select list.\n *\n * @method _moduleChanged\n * @param {Event} e the event\n */\n ModuleNavigation.prototype._moduleChanged = function(e) {\n var newModuleId = $(e.target).val();\n var queryStr = '?mod=' + newModuleId + '&courseid=' + this._courseId;\n document.location = this._baseUrl + queryStr;\n };\n\n /** @property {Number} The id of the course. */\n ModuleNavigation.prototype._courseId = null;\n /** @property {Number} The id of the module. */\n ModuleNavigation.prototype._moduleId = null;\n /** @property {String} Plugin base url. */\n ModuleNavigation.prototype._baseUrl = null;\n\n return ModuleNavigation;\n});\n"],"names":["define","$","ModuleNavigation","moduleSelector","baseUrl","courseId","moduleId","_baseUrl","_moduleId","_courseId","on","this","_moduleChanged","bind","prototype","e","queryStr","target","val","document","location"],"mappings":";;;;;;;AAuBAA,mCAAO,CAAC,WAAW,SAASC,OAWpBC,iBAAmB,SAASC,eAAgBC,QAASC,SAAUC,eAC1DC,SAAWH,aACXI,UAAYF,cACZG,UAAYJ,SAEjBJ,EAAEE,gBAAgBO,GAAG,SAAUC,KAAKC,eAAeC,KAAKF,eAS5DT,iBAAiBY,UAAUF,eAAiB,SAASG,OAE7CC,SAAW,QADGf,EAAEc,EAAEE,QAAQC,MACS,aAAeP,KAAKF,UAC3DU,SAASC,SAAWT,KAAKJ,SAAWS,UAIxCd,iBAAiBY,UAAUL,UAAY,KAEvCP,iBAAiBY,UAAUN,UAAY,KAEvCN,iBAAiBY,UAAUP,SAAW,KAE/BL"} \ No newline at end of file +{"version":3,"file":"module_navigation.min.js","sources":["../src/module_navigation.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 navigation between users in a course.\n *\n * @module tool_lp/module_navigation\n * @copyright 2019 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * ModuleNavigation\n *\n * @class tool_lp/module_navigation\n * @param {String} moduleSelector The selector of the module element.\n * @param {String} baseUrl The base url for the page (no params).\n * @param {Number} courseId The course id\n * @param {Number} moduleId The activity module (filter)\n */\n var ModuleNavigation = function(moduleSelector, baseUrl, courseId, moduleId) {\n this._baseUrl = baseUrl;\n this._moduleId = moduleId;\n this._courseId = courseId;\n\n $(moduleSelector).on('change', this._moduleChanged.bind(this));\n };\n\n /**\n * The module was changed in the select list.\n *\n * @method _moduleChanged\n * @param {Event} e the event\n */\n ModuleNavigation.prototype._moduleChanged = function(e) {\n var newModuleId = $(e.target).val();\n var queryStr = '?mod=' + newModuleId + '&courseid=' + this._courseId;\n document.location = this._baseUrl + queryStr;\n };\n\n /** @property {Number} The id of the course. */\n ModuleNavigation.prototype._courseId = null;\n /** @property {Number} The id of the module. */\n ModuleNavigation.prototype._moduleId = null;\n /** @property {String} Plugin base url. */\n ModuleNavigation.prototype._baseUrl = null;\n\n return ModuleNavigation;\n});\n"],"names":["define","$","ModuleNavigation","moduleSelector","baseUrl","courseId","moduleId","_baseUrl","_moduleId","_courseId","on","this","_moduleChanged","bind","prototype","e","newModuleId","queryStr","target","val","document","location"],"mappings":";;;;;;;AAuBAA,mCAAO,CAAC,WAAW,SAASC,GAWxB,IAAIC,iBAAmB,SAASC,eAAgBC,QAASC,SAAUC,UAC1DC,KAAAA,SAAWH,QACXI,KAAAA,UAAYF,SACZG,KAAAA,UAAYJ,SAEjBJ,EAAEE,gBAAgBO,GAAG,SAAUC,KAAKC,eAAeC,KAAKF,MAC3D,EAqBD,OAbAT,iBAAiBY,UAAUF,eAAiB,SAASG,GAC7CC,IACAC,SAAW,QADGhB,EAAEc,EAAEG,QAAQC,MACS,aAAeR,KAAKF,UAC3DW,SAASC,SAAWV,KAAKJ,SAAWU,QACvC,EAGDf,iBAAiBY,UAAUL,UAAY,KAEvCP,iBAAiBY,UAAUN,UAAY,KAEvCN,iBAAiBY,UAAUP,SAAW,KAE/BL,gBACV"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/parentcompetency_form.min.js.map b/admin/tool/lp/amd/build/parentcompetency_form.min.js.map index 0b2c3238c2b..ba1ddf6feda 100644 --- a/admin/tool/lp/amd/build/parentcompetency_form.min.js.map +++ b/admin/tool/lp/amd/build/parentcompetency_form.min.js.map @@ -1 +1 @@ -{"version":3,"file":"parentcompetency_form.min.js","sources":["../src/parentcompetency_form.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 * Handle selecting parent competency in competency form.\n *\n * @module tool_lp/parentcompetency_form\n * @copyright 2015 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/str', 'tool_lp/competencypicker', 'core/templates', 'core/notification'],\n function($, ajax, Str, Picker, Templates, Notification) {\n\n /**\n * Parent Competency Form object.\n * @param {String} buttonSelector The parent competency button selector.\n * @param {String} inputHiddenSelector The hidden input field selector.\n * @param {String} staticElementSelector The static element displaying the parent competency.\n * @param {Number} frameworkId The competency framework ID.\n * @param {Number} pageContextId The page context ID.\n */\n var ParentCompetencyForm = function(buttonSelector,\n inputHiddenSelector,\n staticElementSelector,\n frameworkId,\n pageContextId) {\n this.buttonSelector = buttonSelector;\n this.inputHiddenSelector = inputHiddenSelector;\n this.staticElementSelector = staticElementSelector;\n this.frameworkId = frameworkId;\n this.pageContextId = pageContextId;\n\n // Register the events.\n this.registerEvents();\n };\n\n /** @var {String} The parent competency button selector. */\n ParentCompetencyForm.prototype.buttonSelector = null;\n /** @var {String} The hidden input field selector. */\n ParentCompetencyForm.prototype.inputHiddenSelector = null;\n /** @var {String} The static element displaying the parent competency. */\n ParentCompetencyForm.prototype.staticElementSelector = null;\n /** @var {Number} The competency framework ID. */\n ParentCompetencyForm.prototype.frameworkId = null;\n /** @var {Number} The page context ID. */\n ParentCompetencyForm.prototype.pageContextId = null;\n\n /**\n * Set the parent competency in the competency form.\n *\n * @param {Object} data Data containing selected competency.\n * @method setParent\n */\n ParentCompetencyForm.prototype.setParent = function(data) {\n var self = this;\n\n if (data.competencyId !== 0) {\n ajax.call([\n {methodname: 'core_competency_read_competency', args: {\n id: data.competencyId\n }}\n ])[0].done(function(competency) {\n $(self.staticElementSelector).html(competency.shortname);\n $(self.inputHiddenSelector).val(competency.id);\n }).fail(Notification.exception);\n } else {\n // Root of competency framework selected.\n Str.get_string('competencyframeworkroot', 'tool_lp').then(function(rootframework) {\n $(self.staticElementSelector).html(rootframework);\n $(self.inputHiddenSelector).val(data.competencyId);\n return;\n }).fail(Notification.exception);\n }\n };\n\n /**\n * Register the events of parent competency button click.\n *\n * @method registerEvents\n */\n ParentCompetencyForm.prototype.registerEvents = function() {\n var self = this;\n\n // Event on edit parent button.\n $(self.buttonSelector).on('click', function(e) {\n e.preventDefault();\n\n var picker = new Picker(self.pageContextId, self.frameworkId, 'self', false);\n\n // Override the render method to make framework selectable.\n picker._render = function() {\n var self = this;\n return self._preRender().then(function() {\n var context = {\n competencies: self._competencies,\n framework: self._getFramework(self._frameworkId),\n frameworks: self._frameworks,\n search: self._searchText,\n singleFramework: self._singleFramework,\n };\n\n return Templates.render('tool_lp/competency_picker_competencyform', context);\n });\n };\n\n // On selected competency.\n picker.on('save', function(e, data) {\n self.setParent(data);\n });\n\n picker.display();\n });\n };\n\n return {\n\n /**\n * Main initialisation.\n * @param {String} buttonSelector The parent competency button selector.\n * @param {String} inputSelector The hidden input field selector.\n * @param {String} staticElementSelector The static element displaying the parent competency.\n * @param {Number} frameworkId The competency framework ID.\n * @param {Number} pageContextId The page context ID.\n * @method init\n */\n init: function(buttonSelector,\n inputSelector,\n staticElementSelector,\n frameworkId,\n pageContextId) {\n // Create instance.\n new ParentCompetencyForm(buttonSelector,\n inputSelector,\n staticElementSelector,\n frameworkId,\n pageContextId);\n }\n };\n});\n"],"names":["define","$","ajax","Str","Picker","Templates","Notification","ParentCompetencyForm","buttonSelector","inputHiddenSelector","staticElementSelector","frameworkId","pageContextId","registerEvents","prototype","setParent","data","self","this","competencyId","call","methodname","args","id","done","competency","html","shortname","val","fail","exception","get_string","then","rootframework","on","e","preventDefault","picker","_render","_preRender","context","competencies","_competencies","framework","_getFramework","_frameworkId","frameworks","_frameworks","search","_searchText","singleFramework","_singleFramework","render","display","init","inputSelector"],"mappings":";;;;;;;AAsBAA,uCAAO,CAAC,SAAU,YAAa,WAAY,2BAA4B,iBAAkB,sBACrF,SAASC,EAAGC,KAAMC,IAAKC,OAAQC,UAAWC,kBAUtCC,qBAAuB,SAASC,eACAC,oBACAC,sBACAC,YACAC,oBAC3BJ,eAAiBA,oBACjBC,oBAAsBA,yBACtBC,sBAAwBA,2BACxBC,YAAcA,iBACdC,cAAgBA,mBAGhBC,yBAITN,qBAAqBO,UAAUN,eAAiB,KAEhDD,qBAAqBO,UAAUL,oBAAsB,KAErDF,qBAAqBO,UAAUJ,sBAAwB,KAEvDH,qBAAqBO,UAAUH,YAAc,KAE7CJ,qBAAqBO,UAAUF,cAAgB,KAQ/CL,qBAAqBO,UAAUC,UAAY,SAASC,UAC5CC,KAAOC,KAEe,IAAtBF,KAAKG,aACLjB,KAAKkB,KAAK,CACN,CAACC,WAAY,kCAAmCC,KAAM,CAClDC,GAAIP,KAAKG,iBAEd,GAAGK,MAAK,SAASC,YAChBxB,EAAEgB,KAAKP,uBAAuBgB,KAAKD,WAAWE,WAC9C1B,EAAEgB,KAAKR,qBAAqBmB,IAAIH,WAAWF,OAC5CM,KAAKvB,aAAawB,WAGrB3B,IAAI4B,WAAW,0BAA2B,WAAWC,MAAK,SAASC,eAC/DhC,EAAEgB,KAAKP,uBAAuBgB,KAAKO,eACnChC,EAAEgB,KAAKR,qBAAqBmB,IAAIZ,KAAKG,iBAEtCU,KAAKvB,aAAawB,YAS7BvB,qBAAqBO,UAAUD,eAAiB,eACxCI,KAAOC,KAGXjB,EAAEgB,KAAKT,gBAAgB0B,GAAG,SAAS,SAASC,GACxCA,EAAEC,qBAEEC,OAAS,IAAIjC,OAAOa,KAAKL,cAAeK,KAAKN,YAAa,QAAQ,GAGtE0B,OAAOC,QAAU,eACTrB,KAAOC,YACJD,KAAKsB,aAAaP,MAAK,eACtBQ,QAAU,CACVC,aAAcxB,KAAKyB,cACnBC,UAAW1B,KAAK2B,cAAc3B,KAAK4B,cACnCC,WAAY7B,KAAK8B,YACjBC,OAAQ/B,KAAKgC,YACbC,gBAAiBjC,KAAKkC,yBAGnB9C,UAAU+C,OAAO,2CAA4CZ,aAK5EH,OAAOH,GAAG,QAAQ,SAASC,EAAGnB,MAC1BC,KAAKF,UAAUC,SAGnBqB,OAAOgB,cAIR,CAWHC,KAAM,SAAS9C,eACC+C,cACA7C,sBACAC,YACAC,mBAERL,qBAAqBC,eACD+C,cACA7C,sBACAC,YACAC"} \ No newline at end of file +{"version":3,"file":"parentcompetency_form.min.js","sources":["../src/parentcompetency_form.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 * Handle selecting parent competency in competency form.\n *\n * @module tool_lp/parentcompetency_form\n * @copyright 2015 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/str', 'tool_lp/competencypicker', 'core/templates', 'core/notification'],\n function($, ajax, Str, Picker, Templates, Notification) {\n\n /**\n * Parent Competency Form object.\n * @param {String} buttonSelector The parent competency button selector.\n * @param {String} inputHiddenSelector The hidden input field selector.\n * @param {String} staticElementSelector The static element displaying the parent competency.\n * @param {Number} frameworkId The competency framework ID.\n * @param {Number} pageContextId The page context ID.\n */\n var ParentCompetencyForm = function(buttonSelector,\n inputHiddenSelector,\n staticElementSelector,\n frameworkId,\n pageContextId) {\n this.buttonSelector = buttonSelector;\n this.inputHiddenSelector = inputHiddenSelector;\n this.staticElementSelector = staticElementSelector;\n this.frameworkId = frameworkId;\n this.pageContextId = pageContextId;\n\n // Register the events.\n this.registerEvents();\n };\n\n /** @var {String} The parent competency button selector. */\n ParentCompetencyForm.prototype.buttonSelector = null;\n /** @var {String} The hidden input field selector. */\n ParentCompetencyForm.prototype.inputHiddenSelector = null;\n /** @var {String} The static element displaying the parent competency. */\n ParentCompetencyForm.prototype.staticElementSelector = null;\n /** @var {Number} The competency framework ID. */\n ParentCompetencyForm.prototype.frameworkId = null;\n /** @var {Number} The page context ID. */\n ParentCompetencyForm.prototype.pageContextId = null;\n\n /**\n * Set the parent competency in the competency form.\n *\n * @param {Object} data Data containing selected competency.\n * @method setParent\n */\n ParentCompetencyForm.prototype.setParent = function(data) {\n var self = this;\n\n if (data.competencyId !== 0) {\n ajax.call([\n {methodname: 'core_competency_read_competency', args: {\n id: data.competencyId\n }}\n ])[0].done(function(competency) {\n $(self.staticElementSelector).html(competency.shortname);\n $(self.inputHiddenSelector).val(competency.id);\n }).fail(Notification.exception);\n } else {\n // Root of competency framework selected.\n Str.get_string('competencyframeworkroot', 'tool_lp').then(function(rootframework) {\n $(self.staticElementSelector).html(rootframework);\n $(self.inputHiddenSelector).val(data.competencyId);\n return;\n }).fail(Notification.exception);\n }\n };\n\n /**\n * Register the events of parent competency button click.\n *\n * @method registerEvents\n */\n ParentCompetencyForm.prototype.registerEvents = function() {\n var self = this;\n\n // Event on edit parent button.\n $(self.buttonSelector).on('click', function(e) {\n e.preventDefault();\n\n var picker = new Picker(self.pageContextId, self.frameworkId, 'self', false);\n\n // Override the render method to make framework selectable.\n picker._render = function() {\n var self = this;\n return self._preRender().then(function() {\n var context = {\n competencies: self._competencies,\n framework: self._getFramework(self._frameworkId),\n frameworks: self._frameworks,\n search: self._searchText,\n singleFramework: self._singleFramework,\n };\n\n return Templates.render('tool_lp/competency_picker_competencyform', context);\n });\n };\n\n // On selected competency.\n picker.on('save', function(e, data) {\n self.setParent(data);\n });\n\n picker.display();\n });\n };\n\n return {\n\n /**\n * Main initialisation.\n * @param {String} buttonSelector The parent competency button selector.\n * @param {String} inputSelector The hidden input field selector.\n * @param {String} staticElementSelector The static element displaying the parent competency.\n * @param {Number} frameworkId The competency framework ID.\n * @param {Number} pageContextId The page context ID.\n * @method init\n */\n init: function(buttonSelector,\n inputSelector,\n staticElementSelector,\n frameworkId,\n pageContextId) {\n // Create instance.\n new ParentCompetencyForm(buttonSelector,\n inputSelector,\n staticElementSelector,\n frameworkId,\n pageContextId);\n }\n };\n});\n"],"names":["define","$","ajax","Str","Picker","Templates","Notification","ParentCompetencyForm","buttonSelector","inputHiddenSelector","staticElementSelector","frameworkId","pageContextId","this","registerEvents","prototype","setParent","data","self","competencyId","call","methodname","args","id","done","competency","html","shortname","val","fail","exception","get_string","then","rootframework","on","e","preventDefault","picker","_render","_preRender","context","competencies","_competencies","framework","_getFramework","_frameworkId","frameworks","_frameworks","search","_searchText","singleFramework","_singleFramework","render","display","init","inputSelector"],"mappings":";;;;;;;AAsBAA,OAAM,gCAAC,CAAC,SAAU,YAAa,WAAY,2BAA4B,iBAAkB,sBACrF,SAASC,EAAGC,KAAMC,IAAKC,OAAQC,UAAWC,cAU1C,IAAIC,qBAAuB,SAASC,eACAC,oBACAC,sBACAC,YACAC,eAC3BJ,KAAAA,eAAiBA,eACjBC,KAAAA,oBAAsBA,oBACtBC,KAAAA,sBAAwBA,sBACxBC,KAAAA,YAAcA,YACdC,KAAAA,cAAgBA,cAGrBC,KAAKC,gBACR,EAgFM,OA7EPP,qBAAqBQ,UAAUP,eAAiB,KAEhDD,qBAAqBQ,UAAUN,oBAAsB,KAErDF,qBAAqBQ,UAAUL,sBAAwB,KAEvDH,qBAAqBQ,UAAUJ,YAAc,KAE7CJ,qBAAqBQ,UAAUH,cAAgB,KAQ/CL,qBAAqBQ,UAAUC,UAAY,SAASC,MAC5CC,IAAAA,KAAOL,KAEe,IAAtBI,KAAKE,aACLjB,KAAKkB,KAAK,CACN,CAACC,WAAY,kCAAmCC,KAAM,CAClDC,GAAIN,KAAKE,iBAEd,GAAGK,MAAK,SAASC,YAChBxB,EAAEiB,KAAKR,uBAAuBgB,KAAKD,WAAWE,WAC9C1B,EAAEiB,KAAKT,qBAAqBmB,IAAIH,WAAWF,GAN/C,IAOGM,KAAKvB,aAAawB,WAGrB3B,IAAI4B,WAAW,0BAA2B,WAAWC,MAAK,SAASC,eAC/DhC,EAAEiB,KAAKR,uBAAuBgB,KAAKO,eACnChC,EAAEiB,KAAKT,qBAAqBmB,IAAIX,KAAKE,aAFzC,IAIGU,KAAKvB,aAAawB,UAE5B,EAODvB,qBAAqBQ,UAAUD,eAAiB,WACxCI,IAAAA,KAAOL,KAGXZ,EAAEiB,KAAKV,gBAAgB0B,GAAG,SAAS,SAASC,GACxCA,EAAEC,iBAEF,IAAIC,OAAS,IAAIjC,OAAOc,KAAKN,cAAeM,KAAKP,YAAa,QAAQ,GAGtE0B,OAAOC,QAAU,WACTpB,IAAAA,KAAOL,KACX,OAAOK,KAAKqB,aAAaP,MAAK,WAC1B,IAAIQ,QAAU,CACVC,aAAcvB,KAAKwB,cACnBC,UAAWzB,KAAK0B,cAAc1B,KAAK2B,cACnCC,WAAY5B,KAAK6B,YACjBC,OAAQ9B,KAAK+B,YACbC,gBAAiBhC,KAAKiC,kBAG1B,OAAO9C,UAAU+C,OAAO,2CAA4CZ,QACvE,GACJ,EAGDH,OAAOH,GAAG,QAAQ,SAASC,EAAGlB,MAC1BC,KAAKF,UAAUC,KAClB,IAEDoB,OAAOgB,SACV,GACJ,EAEM,CAWHC,KAAM,SAAS9C,eACC+C,cACA7C,sBACAC,YACAC,eAERL,IAAAA,qBAAqBC,eACD+C,cACA7C,sBACAC,YACAC,cAC3B,EAER"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/planactions.min.js.map b/admin/tool/lp/amd/build/planactions.min.js.map index 9ef56027339..4678c4d7844 100644 --- a/admin/tool/lp/amd/build/planactions.min.js.map +++ b/admin/tool/lp/amd/build/planactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"planactions.min.js","sources":["../src/planactions.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 * Plan actions via ajax.\n *\n * @module tool_lp/planactions\n * @copyright 2015 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/templates',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'tool_lp/menubar',\n 'tool_lp/dialogue'],\n function($, templates, ajax, notification, str, Menubar, Dialogue) {\n\n /**\n * PlanActions class.\n *\n * Note that presently this cannot be instantiated more than once per page.\n *\n * @param {String} type The type of page we're in.\n */\n var PlanActions = function(type) {\n this._type = type;\n\n if (type === 'plan') {\n // This is the page to view one plan.\n this._region = '[data-region=\"plan-page\"]';\n this._planNode = '[data-region=\"plan-page\"]';\n this._template = 'tool_lp/plan_page';\n this._contextMethod = 'tool_lp_data_for_plan_page';\n\n } else if (type === 'plans') {\n // This is the page to view a list of plans.\n this._region = '[data-region=\"plans\"]';\n this._planNode = '[data-region=\"plan-node\"]';\n this._template = 'tool_lp/plans_page';\n this._contextMethod = 'tool_lp_data_for_plans_page';\n\n } else {\n throw new TypeError('Unexpected type.');\n }\n };\n\n /** @property {String} Ajax method to fetch the page data from. */\n PlanActions.prototype._contextMethod = null;\n /** @property {String} Selector to find the node describing the plan. */\n PlanActions.prototype._planNode = null;\n /** @property {String} Selector mapping to the region to update. Usually similar to wrapper. */\n PlanActions.prototype._region = null;\n /** @property {String} Name of the template used to render the region. */\n PlanActions.prototype._template = null;\n /** @property {String} Type of page/region we're in. */\n PlanActions.prototype._type = null;\n\n /**\n * Resolve the arguments to refresh the region.\n *\n * @param {Object} planData Plan data from plan node.\n * @return {Object} List of arguments.\n */\n PlanActions.prototype._getContextArgs = function(planData) {\n var self = this,\n args = {};\n\n if (self._type === 'plan') {\n args = {\n planid: planData.id\n };\n\n } else if (self._type === 'plans') {\n args = {\n userid: planData.userid\n };\n }\n\n return args;\n };\n\n /**\n * Refresh the plan view.\n *\n * This is useful when you only want to refresh the view.\n *\n * @param {String} selector The node to search the plan data from.\n */\n PlanActions.prototype.refresh = function(selector) {\n var planData = this._findPlanData($(selector));\n this._callAndRefresh([], planData);\n };\n\n /**\n * Callback to render the region template.\n *\n * @param {Object} context The context for the template.\n * @return {Promise}\n */\n PlanActions.prototype._renderView = function(context) {\n var self = this;\n return templates.render(self._template, context)\n .then(function(newhtml, newjs) {\n $(self._region).replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n return;\n });\n };\n\n /**\n * Call multiple ajax methods, and refresh.\n *\n * @param {Array} calls List of Ajax calls.\n * @param {Object} planData Plan data from plan node.\n * @return {Promise}\n */\n PlanActions.prototype._callAndRefresh = function(calls, planData) {\n // Because this function causes a refresh, we must track the JS completion from start to finish to prevent\n // stale reference issues in Behat.\n var callKey = 'tool_lp/planactions:_callAndRefresh-' + Math.floor(Math.random() * Math.floor(1000));\n M.util.js_pending(callKey);\n\n var self = this;\n calls.push({\n methodname: self._contextMethod,\n args: self._getContextArgs(planData)\n });\n\n // Apply all the promises, and refresh when the last one is resolved.\n return $.when.apply($, ajax.call(calls))\n .then(function() {\n return self._renderView(arguments[arguments.length - 1]);\n })\n .fail(notification.exception)\n .always(function() {\n return M.util.js_complete(callKey);\n });\n };\n\n /**\n * Delete a plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doDelete = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_delete_plan',\n args: {id: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Delete a plan.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.deletePlan = function(planData) {\n var self = this,\n requests;\n\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deleteplan', component: 'tool_lp', param: plan.name},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete plan X?\n strings[2], // Delete.\n strings[3], // Cancel.\n function() {\n self._doDelete(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Reopen plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doReopenPlan = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_reopen_plan',\n args: {planid: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Reopen a plan.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.reopenPlan = function(planData) {\n var self = this,\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'reopenplanconfirm', component: 'tool_lp', param: plan.name},\n {key: 'reopenplan', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Reopen plan X?\n strings[2], // Reopen.\n strings[3], // Cancel.\n function() {\n self._doReopenPlan(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Complete plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doCompletePlan = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_complete_plan',\n args: {planid: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Complete a plan process.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.completePlan = function(planData) {\n var self = this,\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'completeplanconfirm', component: 'tool_lp', param: plan.name},\n {key: 'completeplan', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Complete plan X?\n strings[2], // Complete.\n strings[3], // Cancel.\n function() {\n self._doCompletePlan(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Unlink plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doUnlinkPlan = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_unlink_plan_from_template',\n args: {planid: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Unlink a plan process.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.unlinkPlan = function(planData) {\n var self = this,\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'unlinkplantemplateconfirm', component: 'tool_lp', param: plan.name},\n {key: 'unlinkplantemplate', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Unlink plan X?\n strings[2], // Unlink.\n strings[3], // Cancel.\n function() {\n self._doUnlinkPlan(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Request review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doRequestReview\n */\n PlanActions.prototype._doRequestReview = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_request_review',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Request review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method requestReview\n */\n PlanActions.prototype.requestReview = function(planData) {\n this._doRequestReview(planData);\n };\n\n /**\n * Cancel review request of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doCancelReviewRequest\n */\n PlanActions.prototype._doCancelReviewRequest = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_cancel_review_request',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Cancel review request of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method cancelReviewRequest\n */\n PlanActions.prototype.cancelReviewRequest = function(planData) {\n this._doCancelReviewRequest(planData);\n };\n\n /**\n * Start review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doStartReview\n */\n PlanActions.prototype._doStartReview = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_start_review',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Start review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method startReview\n */\n PlanActions.prototype.startReview = function(planData) {\n this._doStartReview(planData);\n };\n\n /**\n * Stop review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doStopReview\n */\n PlanActions.prototype._doStopReview = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_stop_review',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Stop review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method stopReview\n */\n PlanActions.prototype.stopReview = function(planData) {\n this._doStopReview(planData);\n };\n\n /**\n * Approve a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doApprove\n */\n PlanActions.prototype._doApprove = function(planData) {\n var calls = [{\n methodname: 'core_competency_approve_plan',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Approve a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method approve\n */\n PlanActions.prototype.approve = function(planData) {\n this._doApprove(planData);\n };\n\n /**\n * Unapprove a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doUnapprove\n */\n PlanActions.prototype._doUnapprove = function(planData) {\n var calls = [{\n methodname: 'core_competency_unapprove_plan',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Unapprove a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method unapprove\n */\n PlanActions.prototype.unapprove = function(planData) {\n this._doUnapprove(planData);\n };\n\n /**\n * Display list of linked courses on a modal dialogue.\n *\n * @param {Event} e The event.\n */\n PlanActions.prototype._showLinkedCoursesHandler = function(e) {\n e.preventDefault();\n\n var competencyid = $(e.target).data('id');\n var requests = ajax.call([{\n methodname: 'tool_lp_list_courses_using_competency',\n args: {id: competencyid}\n }]);\n\n requests[0].done(function(courses) {\n var context = {\n courses: courses\n };\n templates.render('tool_lp/linked_courses_summary', context).done(function(html) {\n str.get_string('linkedcourses', 'tool_lp').done(function(linkedcourses) {\n new Dialogue(\n linkedcourses, // Title.\n html // The linked courses.\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Plan event handler.\n *\n * @param {String} method The method to call.\n * @param {Event} e The event.\n * @method _eventHandler\n */\n PlanActions.prototype._eventHandler = function(method, e) {\n e.preventDefault();\n var data = this._findPlanData($(e.target));\n this[method](data);\n };\n\n /**\n * Find the plan data from the plan node.\n *\n * @param {Node} node The node to search from.\n * @return {Object} Plan data.\n */\n PlanActions.prototype._findPlanData = function(node) {\n var parent = node.parentsUntil($(this._region).parent(), this._planNode),\n data;\n\n if (parent.length != 1) {\n throw new Error('The plan node was not located.');\n }\n\n data = parent.data();\n if (typeof data === 'undefined' || typeof data.id === 'undefined') {\n throw new Error('Plan data could not be found.');\n }\n\n return data;\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n PlanActions.prototype.enhanceMenubar = function(selector) {\n Menubar.enhance(selector, {\n '[data-action=\"plan-delete\"]': this._eventHandler.bind(this, 'deletePlan'),\n '[data-action=\"plan-complete\"]': this._eventHandler.bind(this, 'completePlan'),\n '[data-action=\"plan-reopen\"]': this._eventHandler.bind(this, 'reopenPlan'),\n '[data-action=\"plan-unlink\"]': this._eventHandler.bind(this, 'unlinkPlan'),\n '[data-action=\"plan-request-review\"]': this._eventHandler.bind(this, 'requestReview'),\n '[data-action=\"plan-cancel-review-request\"]': this._eventHandler.bind(this, 'cancelReviewRequest'),\n '[data-action=\"plan-start-review\"]': this._eventHandler.bind(this, 'startReview'),\n '[data-action=\"plan-stop-review\"]': this._eventHandler.bind(this, 'stopReview'),\n '[data-action=\"plan-approve\"]': this._eventHandler.bind(this, 'approve'),\n '[data-action=\"plan-unapprove\"]': this._eventHandler.bind(this, 'unapprove'),\n });\n };\n\n /**\n * Register the events in the region.\n *\n * At this stage this cannot be used with enhanceMenubar or multiple handlers\n * will be added to the same node.\n */\n PlanActions.prototype.registerEvents = function() {\n var wrapper = $(this._region);\n\n wrapper.find('[data-action=\"plan-delete\"]').click(this._eventHandler.bind(this, 'deletePlan'));\n wrapper.find('[data-action=\"plan-complete\"]').click(this._eventHandler.bind(this, 'completePlan'));\n wrapper.find('[data-action=\"plan-reopen\"]').click(this._eventHandler.bind(this, 'reopenPlan'));\n wrapper.find('[data-action=\"plan-unlink\"]').click(this._eventHandler.bind(this, 'unlinkPlan'));\n\n wrapper.find('[data-action=\"plan-request-review\"]').click(this._eventHandler.bind(this, 'requestReview'));\n wrapper.find('[data-action=\"plan-cancel-review-request\"]').click(this._eventHandler.bind(this, 'cancelReviewRequest'));\n wrapper.find('[data-action=\"plan-start-review\"]').click(this._eventHandler.bind(this, 'startReview'));\n wrapper.find('[data-action=\"plan-stop-review\"]').click(this._eventHandler.bind(this, 'stopReview'));\n wrapper.find('[data-action=\"plan-approve\"]').click(this._eventHandler.bind(this, 'approve'));\n wrapper.find('[data-action=\"plan-unapprove\"]').click(this._eventHandler.bind(this, 'unapprove'));\n\n wrapper.find('[data-action=\"find-courses-link\"]').click(this._showLinkedCoursesHandler.bind(this));\n };\n\n return PlanActions;\n});\n"],"names":["define","$","templates","ajax","notification","str","Menubar","Dialogue","PlanActions","type","_type","_region","_planNode","_template","_contextMethod","TypeError","prototype","_getContextArgs","planData","args","this","planid","id","userid","refresh","selector","_findPlanData","_callAndRefresh","_renderView","context","self","render","then","newhtml","newjs","replaceWith","runTemplateJS","calls","callKey","Math","floor","random","M","util","js_pending","push","methodname","when","apply","call","arguments","length","fail","exception","always","js_complete","_doDelete","deletePlan","done","plan","get_strings","key","component","param","name","strings","confirm","_doReopenPlan","reopenPlan","_doCompletePlan","completePlan","_doUnlinkPlan","unlinkPlan","_doRequestReview","requestReview","_doCancelReviewRequest","cancelReviewRequest","_doStartReview","startReview","_doStopReview","stopReview","_doApprove","approve","_doUnapprove","unapprove","_showLinkedCoursesHandler","e","preventDefault","competencyid","target","data","courses","html","get_string","linkedcourses","_eventHandler","method","node","parent","parentsUntil","Error","enhanceMenubar","enhance","bind","registerEvents","wrapper","find","click"],"mappings":";;;;;;;AAsBAA,6BAAO,CAAC,SACA,iBACA,YACA,oBACA,WACA,kBACA,qBACA,SAASC,EAAGC,UAAWC,KAAMC,aAAcC,IAAKC,QAASC,cASzDC,YAAc,SAASC,cAClBC,MAAQD,KAEA,SAATA,UAEKE,QAAU,iCACVC,UAAY,iCACZC,UAAY,yBACZC,eAAiB,iCAEnB,CAAA,GAAa,UAATL,WAQD,IAAIM,UAAU,yBANfJ,QAAU,6BACVC,UAAY,iCACZC,UAAY,0BACZC,eAAiB,uCAQ9BN,YAAYQ,UAAUF,eAAiB,KAEvCN,YAAYQ,UAAUJ,UAAY,KAElCJ,YAAYQ,UAAUL,QAAU,KAEhCH,YAAYQ,UAAUH,UAAY,KAElCL,YAAYQ,UAAUN,MAAQ,KAQ9BF,YAAYQ,UAAUC,gBAAkB,SAASC,cAEzCC,KAAO,SAEQ,SAHRC,KAGFV,MACLS,KAAO,CACHE,OAAQH,SAASI,IAGC,UARfF,KAQKV,QACZS,KAAO,CACHI,OAAQL,SAASK,SAIlBJ,MAUXX,YAAYQ,UAAUQ,QAAU,SAASC,cACjCP,SAAWE,KAAKM,cAAczB,EAAEwB,gBAC/BE,gBAAgB,GAAIT,WAS7BV,YAAYQ,UAAUY,YAAc,SAASC,aACrCC,KAAOV,YACJlB,UAAU6B,OAAOD,KAAKjB,UAAWgB,SACnCG,MAAK,SAASC,QAASC,OACpBjC,EAAE6B,KAAKnB,SAASwB,YAAYF,SAC5B/B,UAAUkC,cAAcF,WAYpC1B,YAAYQ,UAAUW,gBAAkB,SAASU,MAAOnB,cAGhDoB,QAAU,uCAAyCC,KAAKC,MAAMD,KAAKE,SAAWF,KAAKC,MAAM,MAC7FE,EAAEC,KAAKC,WAAWN,aAEdR,KAAOV,YACXiB,MAAMQ,KAAK,CACPC,WAAYhB,KAAKhB,eACjBK,KAAMW,KAAKb,gBAAgBC,YAIxBjB,EAAE8C,KAAKC,MAAM/C,EAAGE,KAAK8C,KAAKZ,QAC5BL,MAAK,kBACKF,KAAKF,YAAYsB,UAAUA,UAAUC,OAAS,OAExDC,KAAKhD,aAAaiD,WAClBC,QAAO,kBACGZ,EAAEC,KAAKY,YAAYjB,aAStC9B,YAAYQ,UAAUwC,UAAY,SAAStC,cAEnCmB,MAAQ,CAAC,CACLS,WAAY,8BACZ3B,KAAM,CAACG,GAAIJ,SAASI,MAHjBF,KAKNO,gBAAgBU,MAAOnB,WAQhCV,YAAYQ,UAAUyC,WAAa,SAASvC,cACpCY,KAAOV,KAGAjB,KAAK8C,KAAK,CAAC,CAClBH,WAAY,4BACZ3B,KAAM,CAACG,GAAIJ,SAASI,OAGf,GAAGoC,MAAK,SAASC,MACtBtD,IAAIuD,YAAY,CACZ,CAACC,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,aAAcC,UAAW,UAAWC,MAAOJ,KAAKK,MACtD,CAACH,IAAK,SAAUC,UAAW,UAC3B,CAACD,IAAK,SAAUC,UAAW,YAC5BJ,MAAK,SAASO,SACb7D,aAAa8D,QACTD,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRA,QAAQ,IACR,WACInC,KAAK0B,UAAUtC,gBAGxBkC,KAAKhD,aAAaiD,cACtBD,KAAKhD,aAAaiD,YASzB7C,YAAYQ,UAAUmD,cAAgB,SAASjD,cAEvCmB,MAAQ,CAAC,CACLS,WAAY,8BACZ3B,KAAM,CAACE,OAAQH,SAASI,MAHrBF,KAKNO,gBAAgBU,MAAOnB,WAQhCV,YAAYQ,UAAUoD,WAAa,SAASlD,cACpCY,KAAOV,KACIjB,KAAK8C,KAAK,CAAC,CAClBH,WAAY,4BACZ3B,KAAM,CAACG,GAAIJ,SAASI,OAGnB,GAAGoC,MAAK,SAASC,MACtBtD,IAAIuD,YAAY,CACZ,CAACC,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,oBAAqBC,UAAW,UAAWC,MAAOJ,KAAKK,MAC7D,CAACH,IAAK,aAAcC,UAAW,WAC/B,CAACD,IAAK,SAAUC,UAAW,YAC5BJ,MAAK,SAASO,SACb7D,aAAa8D,QACTD,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRA,QAAQ,IACR,WACInC,KAAKqC,cAAcjD,gBAG5BkC,KAAKhD,aAAaiD,cACtBD,KAAKhD,aAAaiD,YASzB7C,YAAYQ,UAAUqD,gBAAkB,SAASnD,cAEzCmB,MAAQ,CAAC,CACLS,WAAY,gCACZ3B,KAAM,CAACE,OAAQH,SAASI,MAHrBF,KAKNO,gBAAgBU,MAAOnB,WAQhCV,YAAYQ,UAAUsD,aAAe,SAASpD,cACtCY,KAAOV,KACIjB,KAAK8C,KAAK,CAAC,CAClBH,WAAY,4BACZ3B,KAAM,CAACG,GAAIJ,SAASI,OAGnB,GAAGoC,MAAK,SAASC,MACtBtD,IAAIuD,YAAY,CACZ,CAACC,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,sBAAuBC,UAAW,UAAWC,MAAOJ,KAAKK,MAC/D,CAACH,IAAK,eAAgBC,UAAW,WACjC,CAACD,IAAK,SAAUC,UAAW,YAC5BJ,MAAK,SAASO,SACb7D,aAAa8D,QACTD,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRA,QAAQ,IACR,WACInC,KAAKuC,gBAAgBnD,gBAG9BkC,KAAKhD,aAAaiD,cACtBD,KAAKhD,aAAaiD,YAQzB7C,YAAYQ,UAAUuD,cAAgB,SAASrD,cAEvCmB,MAAQ,CAAC,CACLS,WAAY,4CACZ3B,KAAM,CAACE,OAAQH,SAASI,MAHrBF,KAKNO,gBAAgBU,MAAOnB,WAQhCV,YAAYQ,UAAUwD,WAAa,SAAStD,cACpCY,KAAOV,KACIjB,KAAK8C,KAAK,CAAC,CAClBH,WAAY,4BACZ3B,KAAM,CAACG,GAAIJ,SAASI,OAGnB,GAAGoC,MAAK,SAASC,MACtBtD,IAAIuD,YAAY,CACZ,CAACC,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,4BAA6BC,UAAW,UAAWC,MAAOJ,KAAKK,MACrE,CAACH,IAAK,qBAAsBC,UAAW,WACvC,CAACD,IAAK,SAAUC,UAAW,YAC5BJ,MAAK,SAASO,SACb7D,aAAa8D,QACTD,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRA,QAAQ,IACR,WACInC,KAAKyC,cAAcrD,gBAG5BkC,KAAKhD,aAAaiD,cACtBD,KAAKhD,aAAaiD,YASzB7C,YAAYQ,UAAUyD,iBAAmB,SAASvD,cAC1CmB,MAAQ,CAAC,CACTS,WAAY,sCACZ3B,KAAM,CACFG,GAAIJ,SAASI,WAGhBK,gBAAgBU,MAAOnB,WAShCV,YAAYQ,UAAU0D,cAAgB,SAASxD,eACtCuD,iBAAiBvD,WAS1BV,YAAYQ,UAAU2D,uBAAyB,SAASzD,cAChDmB,MAAQ,CAAC,CACTS,WAAY,6CACZ3B,KAAM,CACFG,GAAIJ,SAASI,WAGhBK,gBAAgBU,MAAOnB,WAShCV,YAAYQ,UAAU4D,oBAAsB,SAAS1D,eAC5CyD,uBAAuBzD,WAShCV,YAAYQ,UAAU6D,eAAiB,SAAS3D,cACxCmB,MAAQ,CAAC,CACTS,WAAY,oCACZ3B,KAAM,CACFG,GAAIJ,SAASI,WAGhBK,gBAAgBU,MAAOnB,WAShCV,YAAYQ,UAAU8D,YAAc,SAAS5D,eACpC2D,eAAe3D,WASxBV,YAAYQ,UAAU+D,cAAgB,SAAS7D,cACvCmB,MAAQ,CAAC,CACTS,WAAY,mCACZ3B,KAAM,CACFG,GAAIJ,SAASI,WAGhBK,gBAAgBU,MAAOnB,WAShCV,YAAYQ,UAAUgE,WAAa,SAAS9D,eACnC6D,cAAc7D,WASvBV,YAAYQ,UAAUiE,WAAa,SAAS/D,cACpCmB,MAAQ,CAAC,CACTS,WAAY,+BACZ3B,KAAM,CACFG,GAAIJ,SAASI,WAGhBK,gBAAgBU,MAAOnB,WAShCV,YAAYQ,UAAUkE,QAAU,SAAShE,eAChC+D,WAAW/D,WASpBV,YAAYQ,UAAUmE,aAAe,SAASjE,cACtCmB,MAAQ,CAAC,CACTS,WAAY,iCACZ3B,KAAM,CACFG,GAAIJ,SAASI,WAGhBK,gBAAgBU,MAAOnB,WAShCV,YAAYQ,UAAUoE,UAAY,SAASlE,eAClCiE,aAAajE,WAQtBV,YAAYQ,UAAUqE,0BAA4B,SAASC,GACvDA,EAAEC,qBAEEC,aAAevF,EAAEqF,EAAEG,QAAQC,KAAK,MACrBvF,KAAK8C,KAAK,CAAC,CACtBH,WAAY,wCACZ3B,KAAM,CAACG,GAAIkE,iBAGN,GAAG9B,MAAK,SAASiC,aAClB9D,QAAU,CACV8D,QAASA,SAEbzF,UAAU6B,OAAO,iCAAkCF,SAAS6B,MAAK,SAASkC,MACtEvF,IAAIwF,WAAW,gBAAiB,WAAWnC,MAAK,SAASoC,mBACjDvF,SACAuF,cACAF,SAELxC,KAAKhD,aAAaiD,cACtBD,KAAKhD,aAAaiD,cACtBD,KAAKhD,aAAaiD,YAUzB7C,YAAYQ,UAAU+E,cAAgB,SAASC,OAAQV,GACnDA,EAAEC,qBACEG,KAAOtE,KAAKM,cAAczB,EAAEqF,EAAEG,cAC7BO,QAAQN,OASjBlF,YAAYQ,UAAUU,cAAgB,SAASuE,UAEvCP,KADAQ,OAASD,KAAKE,aAAalG,EAAEmB,KAAKT,SAASuF,SAAU9E,KAAKR,cAGzC,GAAjBsF,OAAO/C,aACD,IAAIiD,MAAM,0CAIA,KADpBV,KAAOQ,OAAOR,cACwC,IAAZA,KAAKpE,SACrC,IAAI8E,MAAM,wCAGbV,MAQXlF,YAAYQ,UAAUqF,eAAiB,SAAS5E,UAC5CnB,QAAQgG,QAAQ7E,SAAU,+BACSL,KAAK2E,cAAcQ,KAAKnF,KAAM,8CAC5BA,KAAK2E,cAAcQ,KAAKnF,KAAM,8CAChCA,KAAK2E,cAAcQ,KAAKnF,KAAM,4CAC9BA,KAAK2E,cAAcQ,KAAKnF,KAAM,oDACtBA,KAAK2E,cAAcQ,KAAKnF,KAAM,8DACvBA,KAAK2E,cAAcQ,KAAKnF,KAAM,2DACvCA,KAAK2E,cAAcQ,KAAKnF,KAAM,kDAC/BA,KAAK2E,cAAcQ,KAAKnF,KAAM,6CAClCA,KAAK2E,cAAcQ,KAAKnF,KAAM,4CAC5BA,KAAK2E,cAAcQ,KAAKnF,KAAM,gBAUxEZ,YAAYQ,UAAUwF,eAAiB,eAC/BC,QAAUxG,EAAEmB,KAAKT,SAErB8F,QAAQC,KAAK,+BAA+BC,MAAMvF,KAAK2E,cAAcQ,KAAKnF,KAAM,eAChFqF,QAAQC,KAAK,iCAAiCC,MAAMvF,KAAK2E,cAAcQ,KAAKnF,KAAM,iBAClFqF,QAAQC,KAAK,+BAA+BC,MAAMvF,KAAK2E,cAAcQ,KAAKnF,KAAM,eAChFqF,QAAQC,KAAK,+BAA+BC,MAAMvF,KAAK2E,cAAcQ,KAAKnF,KAAM,eAEhFqF,QAAQC,KAAK,uCAAuCC,MAAMvF,KAAK2E,cAAcQ,KAAKnF,KAAM,kBACxFqF,QAAQC,KAAK,8CAA8CC,MAAMvF,KAAK2E,cAAcQ,KAAKnF,KAAM,wBAC/FqF,QAAQC,KAAK,qCAAqCC,MAAMvF,KAAK2E,cAAcQ,KAAKnF,KAAM,gBACtFqF,QAAQC,KAAK,oCAAoCC,MAAMvF,KAAK2E,cAAcQ,KAAKnF,KAAM,eACrFqF,QAAQC,KAAK,gCAAgCC,MAAMvF,KAAK2E,cAAcQ,KAAKnF,KAAM,YACjFqF,QAAQC,KAAK,kCAAkCC,MAAMvF,KAAK2E,cAAcQ,KAAKnF,KAAM,cAEnFqF,QAAQC,KAAK,qCAAqCC,MAAMvF,KAAKiE,0BAA0BkB,KAAKnF,QAGzFZ"} \ No newline at end of file +{"version":3,"file":"planactions.min.js","sources":["../src/planactions.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 * Plan actions via ajax.\n *\n * @module tool_lp/planactions\n * @copyright 2015 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/templates',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'tool_lp/menubar',\n 'tool_lp/dialogue'],\n function($, templates, ajax, notification, str, Menubar, Dialogue) {\n\n /**\n * PlanActions class.\n *\n * Note that presently this cannot be instantiated more than once per page.\n *\n * @param {String} type The type of page we're in.\n */\n var PlanActions = function(type) {\n this._type = type;\n\n if (type === 'plan') {\n // This is the page to view one plan.\n this._region = '[data-region=\"plan-page\"]';\n this._planNode = '[data-region=\"plan-page\"]';\n this._template = 'tool_lp/plan_page';\n this._contextMethod = 'tool_lp_data_for_plan_page';\n\n } else if (type === 'plans') {\n // This is the page to view a list of plans.\n this._region = '[data-region=\"plans\"]';\n this._planNode = '[data-region=\"plan-node\"]';\n this._template = 'tool_lp/plans_page';\n this._contextMethod = 'tool_lp_data_for_plans_page';\n\n } else {\n throw new TypeError('Unexpected type.');\n }\n };\n\n /** @property {String} Ajax method to fetch the page data from. */\n PlanActions.prototype._contextMethod = null;\n /** @property {String} Selector to find the node describing the plan. */\n PlanActions.prototype._planNode = null;\n /** @property {String} Selector mapping to the region to update. Usually similar to wrapper. */\n PlanActions.prototype._region = null;\n /** @property {String} Name of the template used to render the region. */\n PlanActions.prototype._template = null;\n /** @property {String} Type of page/region we're in. */\n PlanActions.prototype._type = null;\n\n /**\n * Resolve the arguments to refresh the region.\n *\n * @param {Object} planData Plan data from plan node.\n * @return {Object} List of arguments.\n */\n PlanActions.prototype._getContextArgs = function(planData) {\n var self = this,\n args = {};\n\n if (self._type === 'plan') {\n args = {\n planid: planData.id\n };\n\n } else if (self._type === 'plans') {\n args = {\n userid: planData.userid\n };\n }\n\n return args;\n };\n\n /**\n * Refresh the plan view.\n *\n * This is useful when you only want to refresh the view.\n *\n * @param {String} selector The node to search the plan data from.\n */\n PlanActions.prototype.refresh = function(selector) {\n var planData = this._findPlanData($(selector));\n this._callAndRefresh([], planData);\n };\n\n /**\n * Callback to render the region template.\n *\n * @param {Object} context The context for the template.\n * @return {Promise}\n */\n PlanActions.prototype._renderView = function(context) {\n var self = this;\n return templates.render(self._template, context)\n .then(function(newhtml, newjs) {\n $(self._region).replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n return;\n });\n };\n\n /**\n * Call multiple ajax methods, and refresh.\n *\n * @param {Array} calls List of Ajax calls.\n * @param {Object} planData Plan data from plan node.\n * @return {Promise}\n */\n PlanActions.prototype._callAndRefresh = function(calls, planData) {\n // Because this function causes a refresh, we must track the JS completion from start to finish to prevent\n // stale reference issues in Behat.\n var callKey = 'tool_lp/planactions:_callAndRefresh-' + Math.floor(Math.random() * Math.floor(1000));\n M.util.js_pending(callKey);\n\n var self = this;\n calls.push({\n methodname: self._contextMethod,\n args: self._getContextArgs(planData)\n });\n\n // Apply all the promises, and refresh when the last one is resolved.\n return $.when.apply($, ajax.call(calls))\n .then(function() {\n return self._renderView(arguments[arguments.length - 1]);\n })\n .fail(notification.exception)\n .always(function() {\n return M.util.js_complete(callKey);\n });\n };\n\n /**\n * Delete a plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doDelete = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_delete_plan',\n args: {id: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Delete a plan.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.deletePlan = function(planData) {\n var self = this,\n requests;\n\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deleteplan', component: 'tool_lp', param: plan.name},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete plan X?\n strings[2], // Delete.\n strings[3], // Cancel.\n function() {\n self._doDelete(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Reopen plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doReopenPlan = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_reopen_plan',\n args: {planid: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Reopen a plan.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.reopenPlan = function(planData) {\n var self = this,\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'reopenplanconfirm', component: 'tool_lp', param: plan.name},\n {key: 'reopenplan', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Reopen plan X?\n strings[2], // Reopen.\n strings[3], // Cancel.\n function() {\n self._doReopenPlan(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Complete plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doCompletePlan = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_complete_plan',\n args: {planid: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Complete a plan process.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.completePlan = function(planData) {\n var self = this,\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'completeplanconfirm', component: 'tool_lp', param: plan.name},\n {key: 'completeplan', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Complete plan X?\n strings[2], // Complete.\n strings[3], // Cancel.\n function() {\n self._doCompletePlan(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Unlink plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doUnlinkPlan = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_unlink_plan_from_template',\n args: {planid: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Unlink a plan process.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.unlinkPlan = function(planData) {\n var self = this,\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'unlinkplantemplateconfirm', component: 'tool_lp', param: plan.name},\n {key: 'unlinkplantemplate', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Unlink plan X?\n strings[2], // Unlink.\n strings[3], // Cancel.\n function() {\n self._doUnlinkPlan(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Request review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doRequestReview\n */\n PlanActions.prototype._doRequestReview = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_request_review',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Request review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method requestReview\n */\n PlanActions.prototype.requestReview = function(planData) {\n this._doRequestReview(planData);\n };\n\n /**\n * Cancel review request of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doCancelReviewRequest\n */\n PlanActions.prototype._doCancelReviewRequest = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_cancel_review_request',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Cancel review request of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method cancelReviewRequest\n */\n PlanActions.prototype.cancelReviewRequest = function(planData) {\n this._doCancelReviewRequest(planData);\n };\n\n /**\n * Start review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doStartReview\n */\n PlanActions.prototype._doStartReview = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_start_review',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Start review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method startReview\n */\n PlanActions.prototype.startReview = function(planData) {\n this._doStartReview(planData);\n };\n\n /**\n * Stop review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doStopReview\n */\n PlanActions.prototype._doStopReview = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_stop_review',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Stop review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method stopReview\n */\n PlanActions.prototype.stopReview = function(planData) {\n this._doStopReview(planData);\n };\n\n /**\n * Approve a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doApprove\n */\n PlanActions.prototype._doApprove = function(planData) {\n var calls = [{\n methodname: 'core_competency_approve_plan',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Approve a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method approve\n */\n PlanActions.prototype.approve = function(planData) {\n this._doApprove(planData);\n };\n\n /**\n * Unapprove a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doUnapprove\n */\n PlanActions.prototype._doUnapprove = function(planData) {\n var calls = [{\n methodname: 'core_competency_unapprove_plan',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Unapprove a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method unapprove\n */\n PlanActions.prototype.unapprove = function(planData) {\n this._doUnapprove(planData);\n };\n\n /**\n * Display list of linked courses on a modal dialogue.\n *\n * @param {Event} e The event.\n */\n PlanActions.prototype._showLinkedCoursesHandler = function(e) {\n e.preventDefault();\n\n var competencyid = $(e.target).data('id');\n var requests = ajax.call([{\n methodname: 'tool_lp_list_courses_using_competency',\n args: {id: competencyid}\n }]);\n\n requests[0].done(function(courses) {\n var context = {\n courses: courses\n };\n templates.render('tool_lp/linked_courses_summary', context).done(function(html) {\n str.get_string('linkedcourses', 'tool_lp').done(function(linkedcourses) {\n new Dialogue(\n linkedcourses, // Title.\n html // The linked courses.\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Plan event handler.\n *\n * @param {String} method The method to call.\n * @param {Event} e The event.\n * @method _eventHandler\n */\n PlanActions.prototype._eventHandler = function(method, e) {\n e.preventDefault();\n var data = this._findPlanData($(e.target));\n this[method](data);\n };\n\n /**\n * Find the plan data from the plan node.\n *\n * @param {Node} node The node to search from.\n * @return {Object} Plan data.\n */\n PlanActions.prototype._findPlanData = function(node) {\n var parent = node.parentsUntil($(this._region).parent(), this._planNode),\n data;\n\n if (parent.length != 1) {\n throw new Error('The plan node was not located.');\n }\n\n data = parent.data();\n if (typeof data === 'undefined' || typeof data.id === 'undefined') {\n throw new Error('Plan data could not be found.');\n }\n\n return data;\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n PlanActions.prototype.enhanceMenubar = function(selector) {\n Menubar.enhance(selector, {\n '[data-action=\"plan-delete\"]': this._eventHandler.bind(this, 'deletePlan'),\n '[data-action=\"plan-complete\"]': this._eventHandler.bind(this, 'completePlan'),\n '[data-action=\"plan-reopen\"]': this._eventHandler.bind(this, 'reopenPlan'),\n '[data-action=\"plan-unlink\"]': this._eventHandler.bind(this, 'unlinkPlan'),\n '[data-action=\"plan-request-review\"]': this._eventHandler.bind(this, 'requestReview'),\n '[data-action=\"plan-cancel-review-request\"]': this._eventHandler.bind(this, 'cancelReviewRequest'),\n '[data-action=\"plan-start-review\"]': this._eventHandler.bind(this, 'startReview'),\n '[data-action=\"plan-stop-review\"]': this._eventHandler.bind(this, 'stopReview'),\n '[data-action=\"plan-approve\"]': this._eventHandler.bind(this, 'approve'),\n '[data-action=\"plan-unapprove\"]': this._eventHandler.bind(this, 'unapprove'),\n });\n };\n\n /**\n * Register the events in the region.\n *\n * At this stage this cannot be used with enhanceMenubar or multiple handlers\n * will be added to the same node.\n */\n PlanActions.prototype.registerEvents = function() {\n var wrapper = $(this._region);\n\n wrapper.find('[data-action=\"plan-delete\"]').click(this._eventHandler.bind(this, 'deletePlan'));\n wrapper.find('[data-action=\"plan-complete\"]').click(this._eventHandler.bind(this, 'completePlan'));\n wrapper.find('[data-action=\"plan-reopen\"]').click(this._eventHandler.bind(this, 'reopenPlan'));\n wrapper.find('[data-action=\"plan-unlink\"]').click(this._eventHandler.bind(this, 'unlinkPlan'));\n\n wrapper.find('[data-action=\"plan-request-review\"]').click(this._eventHandler.bind(this, 'requestReview'));\n wrapper.find('[data-action=\"plan-cancel-review-request\"]').click(this._eventHandler.bind(this, 'cancelReviewRequest'));\n wrapper.find('[data-action=\"plan-start-review\"]').click(this._eventHandler.bind(this, 'startReview'));\n wrapper.find('[data-action=\"plan-stop-review\"]').click(this._eventHandler.bind(this, 'stopReview'));\n wrapper.find('[data-action=\"plan-approve\"]').click(this._eventHandler.bind(this, 'approve'));\n wrapper.find('[data-action=\"plan-unapprove\"]').click(this._eventHandler.bind(this, 'unapprove'));\n\n wrapper.find('[data-action=\"find-courses-link\"]').click(this._showLinkedCoursesHandler.bind(this));\n };\n\n return PlanActions;\n});\n"],"names":["define","$","templates","ajax","notification","str","Menubar","Dialogue","PlanActions","type","_type","_region","_planNode","_template","_contextMethod","TypeError","prototype","_getContextArgs","planData","self","args","this","planid","id","userid","refresh","selector","_findPlanData","_callAndRefresh","_renderView","context","render","then","newhtml","newjs","replaceWith","runTemplateJS","calls","callKey","Math","floor","random","M","util","js_pending","push","methodname","when","apply","call","arguments","length","fail","exception","always","js_complete","_doDelete","deletePlan","done","plan","get_strings","key","component","param","name","strings","confirm","_doReopenPlan","reopenPlan","_doCompletePlan","completePlan","_doUnlinkPlan","unlinkPlan","_doRequestReview","requestReview","_doCancelReviewRequest","cancelReviewRequest","_doStartReview","startReview","_doStopReview","stopReview","_doApprove","approve","_doUnapprove","unapprove","_showLinkedCoursesHandler","e","preventDefault","competencyid","target","data","courses","html","get_string","linkedcourses","_eventHandler","method","node","parent","parentsUntil","Error","enhanceMenubar","enhance","bind","registerEvents","wrapper","find","click"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/scaleconfig.min.js.map b/admin/tool/lp/amd/build/scaleconfig.min.js.map index 3a709b50add..d3b8dcefca7 100644 --- a/admin/tool/lp/amd/build/scaleconfig.min.js.map +++ b/admin/tool/lp/amd/build/scaleconfig.min.js.map @@ -1 +1 @@ -{"version":3,"file":"scaleconfig.min.js","sources":["../src/scaleconfig.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 * Handle opening a dialogue to configure scale data.\n *\n * @module tool_lp/scaleconfig\n * @copyright 2015 Adrian Greeve \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/notification', 'core/templates', 'core/ajax', 'tool_lp/dialogue', 'tool_lp/scalevalues'],\n function($, notification, templates, ajax, Dialogue, ModScaleValues) {\n\n /**\n * Scale config object.\n * @param {String} selectSelector The select box selector.\n * @param {String} inputSelector The hidden input field selector.\n * @param {String} triggerSelector The trigger selector.\n */\n var ScaleConfig = function(selectSelector, inputSelector, triggerSelector) {\n this.selectSelector = selectSelector;\n this.inputSelector = inputSelector;\n this.triggerSelector = triggerSelector;\n\n // Get the current scale ID.\n this.originalscaleid = $(selectSelector).val();\n $(selectSelector).on('change', this.scaleChangeHandler.bind(this)).change();\n $(triggerSelector).click(this.showConfig.bind(this));\n };\n\n /** @var {String} The select box selector. */\n ScaleConfig.prototype.selectSelector = null;\n /** @var {String} The hidden field selector. */\n ScaleConfig.prototype.inputSelector = null;\n /** @var {String} The trigger selector. */\n ScaleConfig.prototype.triggerSelector = null;\n /** @var {Array} scalevalues ID and name of the scales. */\n ScaleConfig.prototype.scalevalues = null;\n /** @var {Number) originalscaleid Original scale ID when the page loads. */\n ScaleConfig.prototype.originalscaleid = 0;\n /** @var {Number} scaleid Current scale ID. */\n ScaleConfig.prototype.scaleid = 0;\n /** @var {Dialogue} Reference to the popup. */\n ScaleConfig.prototype.popup = null;\n\n /**\n * Displays the scale configuration dialogue.\n *\n * @method showConfig\n */\n ScaleConfig.prototype.showConfig = function() {\n var self = this;\n\n this.scaleid = $(this.selectSelector).val();\n if (this.scaleid <= 0) {\n // This should not happen.\n return;\n }\n\n var scalename = $(this.selectSelector).find(\"option:selected\").text();\n this.getScaleValues(this.scaleid).done(function() {\n\n var context = {\n scalename: scalename,\n scales: self.scalevalues\n };\n\n // Dish up the form.\n templates.render('tool_lp/scale_configuration_page', context)\n .done(function(html) {\n new Dialogue(\n scalename,\n html,\n self.initScaleConfig.bind(self)\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Gets the original scale configuration if it was set.\n *\n * @method retrieveOriginalScaleConfig\n * @return {Object|String} scale configuration or empty string.\n */\n ScaleConfig.prototype.retrieveOriginalScaleConfig = function() {\n var jsonstring = $(this.inputSelector).val();\n if (jsonstring !== '') {\n var scaleconfiguration = $.parseJSON(jsonstring);\n // The first object should contain the scale ID for the configuration.\n var scaledetail = scaleconfiguration.shift();\n // Check that this scale id matches the one from the page before returning the configuration.\n if (scaledetail.scaleid === this.originalscaleid) {\n return scaleconfiguration;\n }\n }\n return '';\n };\n\n /**\n * Initialises the scale configuration dialogue.\n *\n * @method initScaleConfig\n * @param {Dialogue} popup Dialogue object to initialise.\n */\n ScaleConfig.prototype.initScaleConfig = function(popup) {\n this.popup = popup;\n var body = $(popup.getContent());\n if (this.originalscaleid === this.scaleid) {\n // Set up the popup to show the current configuration.\n var currentconfig = this.retrieveOriginalScaleConfig();\n // Set up the form only if there is configuration settings to set.\n if (currentconfig !== '') {\n currentconfig.forEach(function(value) {\n if (value.scaledefault === 1) {\n body.find('[data-field=\"tool_lp_scale_default_' + value.id + '\"]').attr('checked', true);\n }\n if (value.proficient === 1) {\n body.find('[data-field=\"tool_lp_scale_proficient_' + value.id + '\"]').attr('checked', true);\n }\n });\n }\n }\n body.on('click', '[data-action=\"close\"]', function() {\n this.setScaleConfig();\n popup.close();\n }.bind(this));\n body.on('click', '[data-action=\"cancel\"]', function() {\n popup.close();\n });\n };\n\n /**\n * Set the scale configuration back into a JSON string in the hidden element.\n *\n * @method setScaleConfig\n */\n ScaleConfig.prototype.setScaleConfig = function() {\n var body = $(this.popup.getContent());\n // Get the data.\n var data = [{scaleid: this.scaleid}];\n this.scalevalues.forEach(function(value) {\n var scaledefault = 0;\n var proficient = 0;\n if (body.find('[data-field=\"tool_lp_scale_default_' + value.id + '\"]').is(':checked')) {\n scaledefault = 1;\n }\n if (body.find('[data-field=\"tool_lp_scale_proficient_' + value.id + '\"]').is(':checked')) {\n proficient = 1;\n }\n\n if (!scaledefault && !proficient) {\n return;\n }\n\n data.push({\n id: value.id,\n scaledefault: scaledefault,\n proficient: proficient\n });\n });\n var datastring = JSON.stringify(data);\n // Send to the hidden field on the form.\n $(this.inputSelector).val(datastring);\n // Once the configuration has been saved then the original scale ID is set to the current scale ID.\n this.originalscaleid = this.scaleid;\n };\n\n /**\n * Get the scale values for the selected scale.\n *\n * @method getScaleValues\n * @param {Number} scaleid The scale ID of the selected scale.\n * @return {Promise} A deffered object with the scale values.\n */\n ScaleConfig.prototype.getScaleValues = function(scaleid) {\n return ModScaleValues.get_values(scaleid).then(function(values) {\n this.scalevalues = values;\n return values;\n }.bind(this));\n };\n\n /**\n * Triggered when a scale is selected.\n *\n * @name scaleChangeHandler\n * @param {Event} e\n * @function\n */\n ScaleConfig.prototype.scaleChangeHandler = function(e) {\n if ($(e.target).val() <= 0) {\n $(this.triggerSelector).prop('disabled', true);\n } else {\n $(this.triggerSelector).prop('disabled', false);\n }\n\n };\n\n return {\n\n /**\n * Main initialisation.\n *\n * @param {String} selectSelector The select box selector.\n * @param {String} inputSelector The hidden input field selector.\n * @param {String} triggerSelector The trigger selector.\n * @return {ScaleConfig} A new instance of ScaleConfig.\n * @method init\n */\n init: function(selectSelector, inputSelector, triggerSelector) {\n return new ScaleConfig(selectSelector, inputSelector, triggerSelector);\n }\n };\n});\n"],"names":["define","$","notification","templates","ajax","Dialogue","ModScaleValues","ScaleConfig","selectSelector","inputSelector","triggerSelector","originalscaleid","val","on","this","scaleChangeHandler","bind","change","click","showConfig","prototype","scalevalues","scaleid","popup","self","scalename","find","text","getScaleValues","done","context","scales","render","html","initScaleConfig","fail","exception","retrieveOriginalScaleConfig","jsonstring","scaleconfiguration","parseJSON","shift","body","getContent","currentconfig","forEach","value","scaledefault","id","attr","proficient","setScaleConfig","close","data","is","push","datastring","JSON","stringify","get_values","then","values","e","target","prop","init"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"scaleconfig.min.js","sources":["../src/scaleconfig.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 * Handle opening a dialogue to configure scale data.\n *\n * @module tool_lp/scaleconfig\n * @copyright 2015 Adrian Greeve \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/notification', 'core/templates', 'core/ajax', 'tool_lp/dialogue', 'tool_lp/scalevalues'],\n function($, notification, templates, ajax, Dialogue, ModScaleValues) {\n\n /**\n * Scale config object.\n * @param {String} selectSelector The select box selector.\n * @param {String} inputSelector The hidden input field selector.\n * @param {String} triggerSelector The trigger selector.\n */\n var ScaleConfig = function(selectSelector, inputSelector, triggerSelector) {\n this.selectSelector = selectSelector;\n this.inputSelector = inputSelector;\n this.triggerSelector = triggerSelector;\n\n // Get the current scale ID.\n this.originalscaleid = $(selectSelector).val();\n $(selectSelector).on('change', this.scaleChangeHandler.bind(this)).change();\n $(triggerSelector).click(this.showConfig.bind(this));\n };\n\n /** @var {String} The select box selector. */\n ScaleConfig.prototype.selectSelector = null;\n /** @var {String} The hidden field selector. */\n ScaleConfig.prototype.inputSelector = null;\n /** @var {String} The trigger selector. */\n ScaleConfig.prototype.triggerSelector = null;\n /** @var {Array} scalevalues ID and name of the scales. */\n ScaleConfig.prototype.scalevalues = null;\n /** @var {Number) originalscaleid Original scale ID when the page loads. */\n ScaleConfig.prototype.originalscaleid = 0;\n /** @var {Number} scaleid Current scale ID. */\n ScaleConfig.prototype.scaleid = 0;\n /** @var {Dialogue} Reference to the popup. */\n ScaleConfig.prototype.popup = null;\n\n /**\n * Displays the scale configuration dialogue.\n *\n * @method showConfig\n */\n ScaleConfig.prototype.showConfig = function() {\n var self = this;\n\n this.scaleid = $(this.selectSelector).val();\n if (this.scaleid <= 0) {\n // This should not happen.\n return;\n }\n\n var scalename = $(this.selectSelector).find(\"option:selected\").text();\n this.getScaleValues(this.scaleid).done(function() {\n\n var context = {\n scalename: scalename,\n scales: self.scalevalues\n };\n\n // Dish up the form.\n templates.render('tool_lp/scale_configuration_page', context)\n .done(function(html) {\n new Dialogue(\n scalename,\n html,\n self.initScaleConfig.bind(self)\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Gets the original scale configuration if it was set.\n *\n * @method retrieveOriginalScaleConfig\n * @return {Object|String} scale configuration or empty string.\n */\n ScaleConfig.prototype.retrieveOriginalScaleConfig = function() {\n var jsonstring = $(this.inputSelector).val();\n if (jsonstring !== '') {\n var scaleconfiguration = $.parseJSON(jsonstring);\n // The first object should contain the scale ID for the configuration.\n var scaledetail = scaleconfiguration.shift();\n // Check that this scale id matches the one from the page before returning the configuration.\n if (scaledetail.scaleid === this.originalscaleid) {\n return scaleconfiguration;\n }\n }\n return '';\n };\n\n /**\n * Initialises the scale configuration dialogue.\n *\n * @method initScaleConfig\n * @param {Dialogue} popup Dialogue object to initialise.\n */\n ScaleConfig.prototype.initScaleConfig = function(popup) {\n this.popup = popup;\n var body = $(popup.getContent());\n if (this.originalscaleid === this.scaleid) {\n // Set up the popup to show the current configuration.\n var currentconfig = this.retrieveOriginalScaleConfig();\n // Set up the form only if there is configuration settings to set.\n if (currentconfig !== '') {\n currentconfig.forEach(function(value) {\n if (value.scaledefault === 1) {\n body.find('[data-field=\"tool_lp_scale_default_' + value.id + '\"]').attr('checked', true);\n }\n if (value.proficient === 1) {\n body.find('[data-field=\"tool_lp_scale_proficient_' + value.id + '\"]').attr('checked', true);\n }\n });\n }\n }\n body.on('click', '[data-action=\"close\"]', function() {\n this.setScaleConfig();\n popup.close();\n }.bind(this));\n body.on('click', '[data-action=\"cancel\"]', function() {\n popup.close();\n });\n };\n\n /**\n * Set the scale configuration back into a JSON string in the hidden element.\n *\n * @method setScaleConfig\n */\n ScaleConfig.prototype.setScaleConfig = function() {\n var body = $(this.popup.getContent());\n // Get the data.\n var data = [{scaleid: this.scaleid}];\n this.scalevalues.forEach(function(value) {\n var scaledefault = 0;\n var proficient = 0;\n if (body.find('[data-field=\"tool_lp_scale_default_' + value.id + '\"]').is(':checked')) {\n scaledefault = 1;\n }\n if (body.find('[data-field=\"tool_lp_scale_proficient_' + value.id + '\"]').is(':checked')) {\n proficient = 1;\n }\n\n if (!scaledefault && !proficient) {\n return;\n }\n\n data.push({\n id: value.id,\n scaledefault: scaledefault,\n proficient: proficient\n });\n });\n var datastring = JSON.stringify(data);\n // Send to the hidden field on the form.\n $(this.inputSelector).val(datastring);\n // Once the configuration has been saved then the original scale ID is set to the current scale ID.\n this.originalscaleid = this.scaleid;\n };\n\n /**\n * Get the scale values for the selected scale.\n *\n * @method getScaleValues\n * @param {Number} scaleid The scale ID of the selected scale.\n * @return {Promise} A deffered object with the scale values.\n */\n ScaleConfig.prototype.getScaleValues = function(scaleid) {\n return ModScaleValues.get_values(scaleid).then(function(values) {\n this.scalevalues = values;\n return values;\n }.bind(this));\n };\n\n /**\n * Triggered when a scale is selected.\n *\n * @name scaleChangeHandler\n * @param {Event} e\n * @function\n */\n ScaleConfig.prototype.scaleChangeHandler = function(e) {\n if ($(e.target).val() <= 0) {\n $(this.triggerSelector).prop('disabled', true);\n } else {\n $(this.triggerSelector).prop('disabled', false);\n }\n\n };\n\n return {\n\n /**\n * Main initialisation.\n *\n * @param {String} selectSelector The select box selector.\n * @param {String} inputSelector The hidden input field selector.\n * @param {String} triggerSelector The trigger selector.\n * @return {ScaleConfig} A new instance of ScaleConfig.\n * @method init\n */\n init: function(selectSelector, inputSelector, triggerSelector) {\n return new ScaleConfig(selectSelector, inputSelector, triggerSelector);\n }\n };\n});\n"],"names":["define","$","notification","templates","ajax","Dialogue","ModScaleValues","ScaleConfig","selectSelector","inputSelector","triggerSelector","originalscaleid","val","on","this","scaleChangeHandler","bind","change","click","showConfig","prototype","scalevalues","scaleid","popup","self","scalename","find","text","getScaleValues","done","context","scales","render","html","initScaleConfig","fail","exception","retrieveOriginalScaleConfig","jsonstring","scaleconfiguration","parseJSON","shift","body","getContent","currentconfig","forEach","value","scaledefault","id","attr","proficient","setScaleConfig","close","data","is","push","datastring","JSON","stringify","get_values","then","values","e","target","prop","init"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/scalevalues.min.js.map b/admin/tool/lp/amd/build/scalevalues.min.js.map index f15ca392296..4eb6dd979fa 100644 --- a/admin/tool/lp/amd/build/scalevalues.min.js.map +++ b/admin/tool/lp/amd/build/scalevalues.min.js.map @@ -1 +1 @@ -{"version":3,"file":"scalevalues.min.js","sources":["../src/scalevalues.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 get the scale values.\n *\n * @module tool_lp/scalevalues\n * @copyright 2016 Serge Gauthier\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax'], function($, ajax) {\n var localCache = [];\n\n return {\n\n /**\n * Return a promise object that will be resolved into a string eventually (maybe immediately).\n *\n * @method get_values\n * @param {Number} scaleid The scale id\n * @return [] {Promise}\n */\n // eslint-disable-next-line camelcase\n get_values: function(scaleid) {\n\n var deferred = $.Deferred();\n\n if (typeof localCache[scaleid] === 'undefined') {\n ajax.call([{\n methodname: 'core_competency_get_scale_values',\n args: {scaleid: scaleid},\n done: function(scaleinfo) {\n localCache[scaleid] = scaleinfo;\n deferred.resolve(scaleinfo);\n },\n fail: (deferred.reject)\n }]);\n } else {\n deferred.resolve(localCache[scaleid]);\n }\n\n return deferred.promise();\n }\n };\n});\n"],"names":["define","$","ajax","localCache","get_values","scaleid","deferred","Deferred","call","methodname","args","done","scaleinfo","resolve","fail","reject","promise"],"mappings":";;;;;;;AAsBAA,6BAAO,CAAC,SAAU,cAAc,SAASC,EAAGC,UACpCC,WAAa,SAEV,CAUHC,WAAY,SAASC,aAEbC,SAAWL,EAAEM,uBAEkB,IAAxBJ,WAAWE,SAClBH,KAAKM,KAAK,CAAC,CACPC,WAAY,mCACZC,KAAM,CAACL,QAASA,SAChBM,KAAM,SAASC,WACXT,WAAWE,SAAWO,UACtBN,SAASO,QAAQD,YAErBE,KAAOR,SAASS,UAGpBT,SAASO,QAAQV,WAAWE,UAGzBC,SAASU"} \ No newline at end of file +{"version":3,"file":"scalevalues.min.js","sources":["../src/scalevalues.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 get the scale values.\n *\n * @module tool_lp/scalevalues\n * @copyright 2016 Serge Gauthier\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax'], function($, ajax) {\n var localCache = [];\n\n return {\n\n /**\n * Return a promise object that will be resolved into a string eventually (maybe immediately).\n *\n * @method get_values\n * @param {Number} scaleid The scale id\n * @return [] {Promise}\n */\n // eslint-disable-next-line camelcase\n get_values: function(scaleid) {\n\n var deferred = $.Deferred();\n\n if (typeof localCache[scaleid] === 'undefined') {\n ajax.call([{\n methodname: 'core_competency_get_scale_values',\n args: {scaleid: scaleid},\n done: function(scaleinfo) {\n localCache[scaleid] = scaleinfo;\n deferred.resolve(scaleinfo);\n },\n fail: (deferred.reject)\n }]);\n } else {\n deferred.resolve(localCache[scaleid]);\n }\n\n return deferred.promise();\n }\n };\n});\n"],"names":["define","$","ajax","localCache","get_values","scaleid","deferred","Deferred","call","methodname","args","done","scaleinfo","resolve","fail","reject","promise"],"mappings":";;;;;;;AAsBAA,OAAM,sBAAC,CAAC,SAAU,cAAc,SAASC,EAAGC,MACpCC,IAAAA,WAAa,GAEV,MAAA,CAUHC,WAAY,SAASC,SAEjB,IAAIC,SAAWL,EAAEM,WAgBVD,YAd4B,IAAxBH,WAAWE,SAClBH,KAAKM,KAAK,CAAC,CACPC,WAAY,mCACZC,KAAM,CAACL,QAASA,SAChBM,KAAM,SAASC,WACXT,WAAWE,SAAWO,UACtBN,SAASO,QAAQD,UALd,EAOPE,KAAOR,SAASS,UAGpBT,SAASO,QAAQV,WAAWE,UAGzBC,SAASU,SACnB,EAER"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/templateactions.min.js.map b/admin/tool/lp/amd/build/templateactions.min.js.map index 6c72d2794ca..238d87a815c 100644 --- a/admin/tool/lp/amd/build/templateactions.min.js.map +++ b/admin/tool/lp/amd/build/templateactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"templateactions.min.js","sources":["../src/templateactions.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 * Handle actions on learning plan templates via ajax.\n *\n * @module tool_lp/templateactions\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/ajax', 'core/notification', 'core/str', 'tool_lp/actionselector'],\n function($, templates, ajax, notification, str, Actionselector) {\n // Private variables and functions.\n\n /** @var {Number} pagecontextid The id of the context */\n var pagecontextid = 0;\n\n /** @var {Number} templateid The id of the template */\n var templateid = 0;\n\n /** @var {Boolean} Action to apply to plans when deleting a template */\n var deleteplans = true;\n\n /**\n * Callback to replace the dom element with the rendered template.\n *\n * @method updatePage\n * @param {String} newhtml The new html to insert.\n * @param {String} newjs The new js to run.\n */\n var updatePage = function(newhtml, newjs) {\n $('[data-region=\"managetemplates\"]').replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n };\n\n /**\n * Callback to render the page template again and update the page.\n *\n * @method reloadList\n * @param {Object} context The context for the template.\n */\n var reloadList = function(context) {\n templates.render('tool_lp/manage_templates_page', context)\n .done(updatePage)\n .fail(notification.exception);\n };\n\n /**\n * Delete a template and reload the page.\n * @method doDelete\n */\n var doDelete = function() {\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_delete_template',\n args: {id: templateid,\n deleteplans: deleteplans}\n }, {\n methodname: 'tool_lp_data_for_templates_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[1].done(reloadList).fail(notification.exception);\n };\n\n /**\n * Duplicate a template and reload the page.\n * @method doDuplicate\n * @param {Event} e\n */\n var doDuplicate = function(e) {\n e.preventDefault();\n\n templateid = $(this).attr('data-templateid');\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_duplicate_template',\n args: {id: templateid}\n }, {\n methodname: 'tool_lp_data_for_templates_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[1].done(reloadList).fail(notification.exception);\n };\n\n /**\n * Handler for \"Delete learning plan template\" actions.\n * @method confirmDelete\n * @param {Event} e\n */\n var confirmDelete = function(e) {\n e.preventDefault();\n\n var id = $(this).attr('data-templateid');\n templateid = id;\n deleteplans = true;\n\n var requests = ajax.call([{\n methodname: 'core_competency_read_template',\n args: {id: templateid}\n }, {\n methodname: 'core_competency_template_has_related_data',\n args: {id: templateid}\n }]);\n\n requests[0].done(function(template) {\n requests[1].done(function(templatehasrelateddata) {\n if (templatehasrelateddata) {\n str.get_strings([\n {key: 'deletetemplate', component: 'tool_lp', param: template.shortname},\n {key: 'deletetemplatewithplans', component: 'tool_lp'},\n {key: 'deleteplans', component: 'tool_lp'},\n {key: 'unlinkplanstemplate', component: 'tool_lp'},\n {key: 'confirm', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n var actions = [{'text': strings[2], 'value': 'delete'},\n {'text': strings[3], 'value': 'unlink'}];\n var actionselector = new Actionselector(\n strings[0], // Title.\n strings[1], // Message\n actions, // Radio button options.\n strings[4], // Confirm.\n strings[5]); // Cancel.\n actionselector.display();\n actionselector.on('save', function(e, data) {\n if (data.action != 'delete') {\n deleteplans = false;\n }\n doDelete();\n });\n }).fail(notification.exception);\n } else {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deletetemplate', component: 'tool_lp', param: template.shortname},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete learning plan template X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doDelete\n );\n }).fail(notification.exception);\n }\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n return /** @alias module:tool_lp/templateactions */ {\n // Public variables and functions.\n /**\n * Expose the event handler for the delete.\n * @method deleteHandler\n * @param {Event} e\n */\n deleteHandler: confirmDelete,\n\n /**\n * Expose the event handler for the duplicate.\n * @method duplicateHandler\n * @param {Event} e\n */\n duplicateHandler: doDuplicate,\n\n /**\n * Initialise the module.\n * @method init\n * @param {Number} contextid The context id of the page.\n */\n init: function(contextid) {\n pagecontextid = contextid;\n }\n };\n});\n"],"names":["define","$","templates","ajax","notification","str","Actionselector","pagecontextid","templateid","deleteplans","updatePage","newhtml","newjs","replaceWith","runTemplateJS","reloadList","context","render","done","fail","exception","doDelete","call","methodname","args","id","pagecontext","contextid","deleteHandler","e","preventDefault","this","attr","requests","template","templatehasrelateddata","get_strings","key","component","param","shortname","strings","actions","actionselector","display","on","data","action","confirm","duplicateHandler","init"],"mappings":";;;;;;;AAsBAA,iCAAO,CAAC,SAAU,iBAAkB,YAAa,oBAAqB,WAAY,2BAC3E,SAASC,EAAGC,UAAWC,KAAMC,aAAcC,IAAKC,oBAI/CC,cAAgB,EAGhBC,WAAa,EAGbC,aAAc,EASdC,WAAa,SAASC,QAASC,OAC/BX,EAAE,mCAAmCY,YAAYF,SACjDT,UAAUY,cAAcF,QASxBG,WAAa,SAASC,SACtBd,UAAUe,OAAO,gCAAiCD,SAC7CE,KAAKR,YACLS,KAAKf,aAAagB,YAOvBC,SAAW,WAGIlB,KAAKmB,KAAK,CAAC,CACtBC,WAAY,kCACZC,KAAM,CAACC,GAAIjB,WACHC,YAAaA,cACtB,CACCc,WAAY,yCACZC,KAAM,CACFE,YAAa,CACTC,UAAWpB,mBAId,GAAGW,KAAKH,YAAYI,KAAKf,aAAagB,kBAgGC,CAOhDQ,cAtEgB,SAASC,GACzBA,EAAEC,qBAEEL,GAAKxB,EAAE8B,MAAMC,KAAK,mBACtBxB,WAAaiB,GACbhB,aAAc,MAEVwB,SAAW9B,KAAKmB,KAAK,CAAC,CACtBC,WAAY,gCACZC,KAAM,CAACC,GAAIjB,aACZ,CACCe,WAAY,4CACZC,KAAM,CAACC,GAAIjB,eAGfyB,SAAS,GAAGf,MAAK,SAASgB,UACtBD,SAAS,GAAGf,MAAK,SAASiB,wBAClBA,uBACA9B,IAAI+B,YAAY,CACZ,CAACC,IAAK,iBAAkBC,UAAW,UAAWC,MAAOL,SAASM,WAC9D,CAACH,IAAK,0BAA2BC,UAAW,WAC5C,CAACD,IAAK,cAAeC,UAAW,WAChC,CAACD,IAAK,sBAAuBC,UAAW,WACxC,CAACD,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,SAAUC,UAAW,YAC5BpB,MAAK,SAASuB,aACTC,QAAU,CAAC,MAASD,QAAQ,SAAa,UAC9B,MAASA,QAAQ,SAAa,WACzCE,eAAiB,IAAIrC,eACjBmC,QAAQ,GACRA,QAAQ,GACRC,QACAD,QAAQ,GACRA,QAAQ,IAChBE,eAAeC,UACfD,eAAeE,GAAG,QAAQ,SAAShB,EAAGiB,MACf,UAAfA,KAAKC,SACLtC,aAAc,GAElBY,iBAELF,KAAKf,aAAagB,WAErBf,IAAI+B,YAAY,CACZ,CAACC,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,iBAAkBC,UAAW,UAAWC,MAAOL,SAASM,WAC9D,CAACH,IAAK,SAAUC,UAAW,UAC3B,CAACD,IAAK,SAAUC,UAAW,YAC5BpB,MAAK,SAASuB,SACbrC,aAAa4C,QACbP,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRpB,aAEDF,KAAKf,aAAagB,cAE1BD,KAAKf,aAAagB,cACtBD,KAAKf,aAAagB,YAkBrB6B,iBAtGc,SAASpB,GACvBA,EAAEC,iBAEFtB,WAAaP,EAAE8B,MAAMC,KAAK,mBAGX7B,KAAKmB,KAAK,CAAC,CACtBC,WAAY,qCACZC,KAAM,CAACC,GAAIjB,aACZ,CACCe,WAAY,yCACZC,KAAM,CACFE,YAAa,CACTC,UAAWpB,mBAId,GAAGW,KAAKH,YAAYI,KAAKf,aAAagB,YA4F/C8B,KAAM,SAASvB,WACXpB,cAAgBoB"} \ No newline at end of file +{"version":3,"file":"templateactions.min.js","sources":["../src/templateactions.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 * Handle actions on learning plan templates via ajax.\n *\n * @module tool_lp/templateactions\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/ajax', 'core/notification', 'core/str', 'tool_lp/actionselector'],\n function($, templates, ajax, notification, str, Actionselector) {\n // Private variables and functions.\n\n /** @var {Number} pagecontextid The id of the context */\n var pagecontextid = 0;\n\n /** @var {Number} templateid The id of the template */\n var templateid = 0;\n\n /** @var {Boolean} Action to apply to plans when deleting a template */\n var deleteplans = true;\n\n /**\n * Callback to replace the dom element with the rendered template.\n *\n * @method updatePage\n * @param {String} newhtml The new html to insert.\n * @param {String} newjs The new js to run.\n */\n var updatePage = function(newhtml, newjs) {\n $('[data-region=\"managetemplates\"]').replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n };\n\n /**\n * Callback to render the page template again and update the page.\n *\n * @method reloadList\n * @param {Object} context The context for the template.\n */\n var reloadList = function(context) {\n templates.render('tool_lp/manage_templates_page', context)\n .done(updatePage)\n .fail(notification.exception);\n };\n\n /**\n * Delete a template and reload the page.\n * @method doDelete\n */\n var doDelete = function() {\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_delete_template',\n args: {id: templateid,\n deleteplans: deleteplans}\n }, {\n methodname: 'tool_lp_data_for_templates_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[1].done(reloadList).fail(notification.exception);\n };\n\n /**\n * Duplicate a template and reload the page.\n * @method doDuplicate\n * @param {Event} e\n */\n var doDuplicate = function(e) {\n e.preventDefault();\n\n templateid = $(this).attr('data-templateid');\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_duplicate_template',\n args: {id: templateid}\n }, {\n methodname: 'tool_lp_data_for_templates_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[1].done(reloadList).fail(notification.exception);\n };\n\n /**\n * Handler for \"Delete learning plan template\" actions.\n * @method confirmDelete\n * @param {Event} e\n */\n var confirmDelete = function(e) {\n e.preventDefault();\n\n var id = $(this).attr('data-templateid');\n templateid = id;\n deleteplans = true;\n\n var requests = ajax.call([{\n methodname: 'core_competency_read_template',\n args: {id: templateid}\n }, {\n methodname: 'core_competency_template_has_related_data',\n args: {id: templateid}\n }]);\n\n requests[0].done(function(template) {\n requests[1].done(function(templatehasrelateddata) {\n if (templatehasrelateddata) {\n str.get_strings([\n {key: 'deletetemplate', component: 'tool_lp', param: template.shortname},\n {key: 'deletetemplatewithplans', component: 'tool_lp'},\n {key: 'deleteplans', component: 'tool_lp'},\n {key: 'unlinkplanstemplate', component: 'tool_lp'},\n {key: 'confirm', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n var actions = [{'text': strings[2], 'value': 'delete'},\n {'text': strings[3], 'value': 'unlink'}];\n var actionselector = new Actionselector(\n strings[0], // Title.\n strings[1], // Message\n actions, // Radio button options.\n strings[4], // Confirm.\n strings[5]); // Cancel.\n actionselector.display();\n actionselector.on('save', function(e, data) {\n if (data.action != 'delete') {\n deleteplans = false;\n }\n doDelete();\n });\n }).fail(notification.exception);\n } else {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deletetemplate', component: 'tool_lp', param: template.shortname},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete learning plan template X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doDelete\n );\n }).fail(notification.exception);\n }\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n return /** @alias module:tool_lp/templateactions */ {\n // Public variables and functions.\n /**\n * Expose the event handler for the delete.\n * @method deleteHandler\n * @param {Event} e\n */\n deleteHandler: confirmDelete,\n\n /**\n * Expose the event handler for the duplicate.\n * @method duplicateHandler\n * @param {Event} e\n */\n duplicateHandler: doDuplicate,\n\n /**\n * Initialise the module.\n * @method init\n * @param {Number} contextid The context id of the page.\n */\n init: function(contextid) {\n pagecontextid = contextid;\n }\n };\n});\n"],"names":["define","$","templates","ajax","notification","str","Actionselector","pagecontextid","templateid","deleteplans","updatePage","newhtml","newjs","replaceWith","runTemplateJS","reloadList","context","render","done","fail","exception","doDelete","call","methodname","args","id","pagecontext","contextid","deleteHandler","e","preventDefault","this","attr","requests","template","templatehasrelateddata","get_strings","key","component","param","shortname","strings","actions","value","actionselector","display","on","data","action","confirm","duplicateHandler","init"],"mappings":";;;;;;;AAsBAA,OAAM,0BAAC,CAAC,SAAU,iBAAkB,YAAa,oBAAqB,WAAY,2BAC3E,SAASC,EAAGC,UAAWC,KAAMC,aAAcC,IAAKC,gBAI/CC,IAAAA,cAAgB,EAGhBC,WAAa,EAGbC,aAAc,EASdC,WAAa,SAASC,QAASC,OAC/BX,EAAE,mCAAmCY,YAAYF,SACjDT,UAAUY,cAAcF,MAC3B,EAQGG,WAAa,SAASC,SACtBd,UAAUe,OAAO,gCAAiCD,SAC7CE,KAAKR,YACLS,KAAKf,aAAagB,UAC1B,EAMGC,SAAW,WAGIlB,KAAKmB,KAAK,CAAC,CACtBC,WAAY,kCACZC,KAAM,CAACC,GAAIjB,WACHC,YAAaA,cACtB,CACCc,WAAY,yCACZC,KAAM,CACFE,YAAa,CACTC,UAAWpB,mBAId,GAAGW,KAAKH,YAAYI,KAAKf,aAAagB,UAClD,EA+FmD,MAAA,CAOhDQ,cAtEgB,SAASC,GACzBA,EAAEC,iBAEEL,IAAAA,GAAKxB,EAAE8B,MAAMC,KAAK,mBACtBxB,WAAaiB,GACbhB,aAAc,EAEd,IAAIwB,SAAW9B,KAAKmB,KAAK,CAAC,CACtBC,WAAY,gCACZC,KAAM,CAACC,GAAIjB,aACZ,CACCe,WAAY,4CACZC,KAAM,CAACC,GAAIjB,eAGfyB,SAAS,GAAGf,MAAK,SAASgB,UACtBD,SAAS,GAAGf,MAAK,SAASiB,wBAClBA,uBACA9B,IAAI+B,YAAY,CACZ,CAACC,IAAK,iBAAkBC,UAAW,UAAWC,MAAOL,SAASM,WAC9D,CAACH,IAAK,0BAA2BC,UAAW,WAC5C,CAACD,IAAK,cAAeC,UAAW,WAChC,CAACD,IAAK,sBAAuBC,UAAW,WACxC,CAACD,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,SAAUC,UAAW,YAC5BpB,MAAK,SAASuB,SACTC,IAAAA,QAAU,CAAC,CAASD,KAAAA,QAAQ,GAAaE,MAAA,UAC9B,CAASF,KAAAA,QAAQ,GAAaE,MAAA,WACzCC,eAAiB,IAAItC,eACjBmC,QAAQ,GACRA,QAAQ,GACRC,QACAD,QAAQ,GACRA,QAAQ,IAChBG,eAAeC,UACfD,eAAeE,GAAG,QAAQ,SAASjB,EAAGkB,MACf,UAAfA,KAAKC,SACLvC,aAAc,GAElBY,UACH,GAtBL,IAuBGF,KAAKf,aAAagB,WAErBf,IAAI+B,YAAY,CACZ,CAACC,IAAK,UAAWC,UAAW,UAC5B,CAACD,IAAK,iBAAkBC,UAAW,UAAWC,MAAOL,SAASM,WAC9D,CAACH,IAAK,SAAUC,UAAW,UAC3B,CAACD,IAAK,SAAUC,UAAW,YAC5BpB,MAAK,SAASuB,SACbrC,aAAa6C,QACbR,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRA,QAAQ,GACRpB,SAXJ,IAaGF,KAAKf,aAAagB,UAxC7B,IA0CGD,KAAKf,aAAagB,UA3CzB,IA4CGD,KAAKf,aAAagB,UAExB,EAgBG8B,iBAtGc,SAASrB,GACvBA,EAAEC,iBAEFtB,WAAaP,EAAE8B,MAAMC,KAAK,mBAGX7B,KAAKmB,KAAK,CAAC,CACtBC,WAAY,qCACZC,KAAM,CAACC,GAAIjB,aACZ,CACCe,WAAY,yCACZC,KAAM,CACFE,YAAa,CACTC,UAAWpB,mBAId,GAAGW,KAAKH,YAAYI,KAAKf,aAAagB,UAClD,EA2FG+B,KAAM,SAASxB,WACXpB,cAAgBoB,SACnB,EAER"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/tree.min.js.map b/admin/tool/lp/amd/build/tree.min.js.map index d2b98e75cb3..12967317b8d 100644 --- a/admin/tool/lp/amd/build/tree.min.js.map +++ b/admin/tool/lp/amd/build/tree.min.js.map @@ -1 +1 @@ -{"version":3,"file":"tree.min.js","sources":["../src/tree.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 * Implement an accessible aria tree widget, from a nested unordered list.\n * Based on http://oaa-accessibility.org/example/41/\n *\n * To respond to selection changed events - use tree.on(\"selectionchanged\", handler).\n * The handler will receive an array of nodes, which are the list items that are currently\n * selected. (Or a single node if multiselect is disabled).\n *\n * @module tool_lp/tree\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/url', 'core/log'], function($, url, log) {\n // Private variables and functions.\n /** @var {String} expandedImage The html for an expanded tree node twistie. */\n var expandedImage = $('\"\"');\n /** @var {String} collapsedImage The html for a collapsed tree node twistie. */\n var collapsedImage = $('\"\"');\n\n /**\n * Constructor\n *\n * @param {String} selector\n * @param {Boolean} multiSelect\n */\n var Tree = function(selector, multiSelect) {\n this.treeRoot = $(selector);\n this.multiSelect = (typeof multiSelect === 'undefined' || multiSelect === true);\n\n this.items = this.treeRoot.find('li');\n this.expandAll = this.items.length < 20;\n this.parents = this.treeRoot.find('li:has(ul)');\n\n if (multiSelect) {\n this.treeRoot.attr('aria-multiselectable', 'true');\n }\n\n this.items.attr('aria-selected', 'false');\n\n this.visibleItems = null;\n this.activeItem = null;\n this.lastActiveItem = null;\n\n this.keys = {\n tab: 9,\n enter: 13,\n space: 32,\n pageup: 33,\n pagedown: 34,\n end: 35,\n home: 36,\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n eight: 56,\n asterisk: 106\n };\n\n this.init();\n\n this.bindEventHandlers();\n };\n // Public variables and functions.\n\n /**\n * Init this tree\n * @method init\n */\n Tree.prototype.init = function() {\n this.parents.attr('aria-expanded', 'true');\n this.parents.prepend(expandedImage.clone());\n\n this.items.attr('role', 'tree-item');\n this.items.attr('tabindex', '-1');\n this.parents.attr('role', 'group');\n this.treeRoot.attr('role', 'tree');\n\n this.visibleItems = this.treeRoot.find('li');\n\n var thisObj = this;\n if (!this.expandAll) {\n this.parents.each(function() {\n thisObj.collapseGroup($(this));\n });\n this.expandGroup(this.parents.first());\n }\n };\n\n /**\n * Expand a collapsed group.\n *\n * @method expandGroup\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.expandGroup = function(item) {\n // Find the first child ul node.\n var group = item.children('ul');\n\n // Expand the group.\n group.show().attr('aria-hidden', 'false');\n\n item.attr('aria-expanded', 'true');\n\n item.children('img').attr('src', expandedImage.attr('src'));\n\n // Update the list of visible items.\n this.visibleItems = this.treeRoot.find('li:visible');\n };\n\n /**\n * Collapse an expanded group.\n *\n * @method collapseGroup\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.collapseGroup = function(item) {\n var group = item.children('ul');\n\n // Collapse the group.\n group.hide().attr('aria-hidden', 'true');\n\n item.attr('aria-expanded', 'false');\n\n item.children('img').attr('src', collapsedImage.attr('src'));\n\n // Update the list of visible items.\n this.visibleItems = this.treeRoot.find('li:visible');\n };\n\n /**\n * Expand or collapse a group.\n *\n * @method toggleGroup\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.toggleGroup = function(item) {\n if (item.attr('aria-expanded') == 'true') {\n this.collapseGroup(item);\n } else {\n this.expandGroup(item);\n }\n };\n\n /**\n * Whenever the currently selected node has changed, trigger an event using this function.\n *\n * @method triggerChange\n */\n Tree.prototype.triggerChange = function() {\n var allSelected = this.items.filter('[aria-selected=true]');\n if (!this.multiSelect) {\n allSelected = allSelected.first();\n }\n this.treeRoot.trigger('selectionchanged', {selected: allSelected});\n };\n\n /**\n * Select all the items between the last focused item and this currently focused item.\n *\n * @method multiSelectItem\n * @param {Object} item is the jquery id of the newly selected item.\n */\n Tree.prototype.multiSelectItem = function(item) {\n if (!this.multiSelect) {\n this.items.attr('aria-selected', 'false');\n } else if (this.lastActiveItem !== null) {\n var lastIndex = this.visibleItems.index(this.lastActiveItem);\n var currentIndex = this.visibleItems.index(this.activeItem);\n var oneItem = null;\n\n while (lastIndex < currentIndex) {\n oneItem = $(this.visibleItems.get(lastIndex));\n oneItem.attr('aria-selected', 'true');\n lastIndex++;\n }\n while (lastIndex > currentIndex) {\n oneItem = $(this.visibleItems.get(lastIndex));\n oneItem.attr('aria-selected', 'true');\n lastIndex--;\n }\n }\n\n item.attr('aria-selected', 'true');\n this.triggerChange();\n };\n\n /**\n * Select a single item. Make sure all the parents are expanded. De-select all other items.\n *\n * @method selectItem\n * @param {Object} item is the jquery id of the newly selected item.\n */\n Tree.prototype.selectItem = function(item) {\n // Expand all nodes up the tree.\n var walk = item.parent();\n while (walk.attr('role') != 'tree') {\n walk = walk.parent();\n if (walk.attr('aria-expanded') == 'false') {\n this.expandGroup(walk);\n }\n walk = walk.parent();\n }\n this.items.attr('aria-selected', 'false');\n item.attr('aria-selected', 'true');\n this.triggerChange();\n };\n\n /**\n * Toggle the selected state for an item back and forth.\n *\n * @method toggleItem\n * @param {Object} item is the jquery id of the item to toggle.\n */\n Tree.prototype.toggleItem = function(item) {\n if (!this.multiSelect) {\n this.selectItem(item);\n return;\n }\n\n var current = item.attr('aria-selected');\n if (current === 'true') {\n current = 'false';\n } else {\n current = 'true';\n }\n item.attr('aria-selected', current);\n this.triggerChange();\n };\n\n /**\n * Set the focus to this item.\n *\n * @method updateFocus\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.updateFocus = function(item) {\n this.lastActiveItem = this.activeItem;\n this.activeItem = item;\n // Expand all nodes up the tree.\n var walk = item.parent();\n while (walk.attr('role') != 'tree') {\n walk = walk.parent();\n if (walk.attr('aria-expanded') == 'false') {\n this.expandGroup(walk);\n }\n walk = walk.parent();\n }\n this.items.attr('tabindex', '-1');\n item.attr('tabindex', 0);\n };\n\n /**\n * Handle a key down event - ie navigate the tree.\n *\n * @method handleKeyDown\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n // This function should be simplified. In the meantime..\n // eslint-disable-next-line complexity\n Tree.prototype.handleKeyDown = function(item, e) {\n var currentIndex = this.visibleItems.index(item);\n var newItem = null;\n var hasKeyModifier = e.shiftKey || e.ctrlKey || e.metaKey || e.altKey;\n var thisObj = this;\n\n switch (e.keyCode) {\n case this.keys.home: {\n // Jump to first item in tree.\n newItem = this.parents.first();\n newItem.focus();\n if (e.shiftKey) {\n this.multiSelectItem(newItem);\n } else if (!hasKeyModifier) {\n this.selectItem(newItem);\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.end: {\n // Jump to last visible item.\n newItem = this.visibleItems.last();\n newItem.focus();\n if (e.shiftKey) {\n this.multiSelectItem(newItem);\n } else if (!hasKeyModifier) {\n this.selectItem(newItem);\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.enter:\n case this.keys.space: {\n\n if (e.shiftKey) {\n this.multiSelectItem(item);\n } else if (e.metaKey || e.ctrlKey) {\n this.toggleItem(item);\n } else {\n this.selectItem(item);\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.left: {\n if (item.has('ul') && item.attr('aria-expanded') == 'true') {\n this.collapseGroup(item);\n } else {\n // Move up to the parent.\n var itemUL = item.parent();\n var itemParent = itemUL.parent();\n if (itemParent.is('li')) {\n itemParent.focus();\n if (e.shiftKey) {\n this.multiSelectItem(itemParent);\n } else if (!hasKeyModifier) {\n this.selectItem(itemParent);\n }\n }\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.right: {\n if (item.has('ul') && item.attr('aria-expanded') == 'false') {\n this.expandGroup(item);\n } else {\n // Move to the first item in the child group.\n newItem = item.children('ul').children('li').first();\n if (newItem.length > 0) {\n newItem.focus();\n if (e.shiftKey) {\n this.multiSelectItem(newItem);\n } else if (!hasKeyModifier) {\n this.selectItem(newItem);\n }\n }\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.up: {\n\n if (currentIndex > 0) {\n var prev = this.visibleItems.eq(currentIndex - 1);\n prev.focus();\n if (e.shiftKey) {\n this.multiSelectItem(prev);\n } else if (!hasKeyModifier) {\n this.selectItem(prev);\n }\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.down: {\n\n if (currentIndex < this.visibleItems.length - 1) {\n var next = this.visibleItems.eq(currentIndex + 1);\n next.focus();\n if (e.shiftKey) {\n this.multiSelectItem(next);\n } else if (!hasKeyModifier) {\n this.selectItem(next);\n }\n }\n e.stopPropagation();\n return false;\n }\n case this.keys.asterisk: {\n // Expand all groups.\n this.parents.each(function() {\n thisObj.expandGroup($(this));\n });\n\n e.stopPropagation();\n return false;\n }\n case this.keys.eight: {\n if (e.shiftKey) {\n // Expand all groups.\n this.parents.each(function() {\n thisObj.expandGroup($(this));\n });\n\n e.stopPropagation();\n }\n\n return false;\n }\n }\n\n return true;\n };\n\n /**\n * Handle a key press event - ie navigate the tree.\n *\n * @method handleKeyPress\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleKeyPress = function(item, e) {\n if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {\n // Do nothing.\n return true;\n }\n\n switch (e.keyCode) {\n case this.keys.tab: {\n return true;\n }\n case this.keys.enter:\n case this.keys.home:\n case this.keys.end:\n case this.keys.left:\n case this.keys.right:\n case this.keys.up:\n case this.keys.down: {\n e.stopPropagation();\n return false;\n }\n default : {\n var chr = String.fromCharCode(e.which);\n var match = false;\n var itemIndex = this.visibleItems.index(item);\n var itemCount = this.visibleItems.length;\n var currentIndex = itemIndex + 1;\n\n // Check if the active item was the last one on the list.\n if (currentIndex == itemCount) {\n currentIndex = 0;\n }\n\n // Iterate through the menu items (starting from the current item and wrapping) until a match is found\n // or the loop returns to the current menu item.\n while (currentIndex != itemIndex) {\n\n var currentItem = this.visibleItems.eq(currentIndex);\n var titleChr = currentItem.text().charAt(0);\n\n if (currentItem.has('ul')) {\n titleChr = currentItem.find('span').text().charAt(0);\n }\n\n if (titleChr.toLowerCase() == chr) {\n match = true;\n break;\n }\n\n currentIndex = currentIndex + 1;\n if (currentIndex == itemCount) {\n // Reached the end of the list, start again at the beginning.\n currentIndex = 0;\n }\n }\n\n if (match === true) {\n this.updateFocus(this.visibleItems.eq(currentIndex));\n }\n e.stopPropagation();\n return false;\n }\n }\n\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n /**\n * Attach an event listener to the tree.\n *\n * @method on\n * @param {String} eventname This is the name of the event to listen for. Only 'selectionchanged' is supported for now.\n * @param {Function} handler The function to call when the event is triggered.\n */\n Tree.prototype.on = function(eventname, handler) {\n if (eventname !== 'selectionchanged') {\n log.warning('Invalid custom event name for tree. Only \"selectionchanged\" is supported.');\n } else {\n this.treeRoot.on(eventname, handler);\n }\n };\n\n /**\n * Handle a double click (expand/collapse).\n *\n * @method handleDblClick\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleDblClick = function(item, e) {\n\n if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {\n // Do nothing.\n return true;\n }\n\n // Apply the focus markup.\n this.updateFocus(item);\n\n // Expand or collapse the group.\n this.toggleGroup(item);\n\n e.stopPropagation();\n return false;\n };\n\n /**\n * Handle a click (select).\n *\n * @method handleExpandCollapseClick\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleExpandCollapseClick = function(item, e) {\n\n // Do not shift the focus.\n this.toggleGroup(item);\n e.stopPropagation();\n return false;\n };\n\n\n /**\n * Handle a click (select).\n *\n * @method handleClick\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleClick = function(item, e) {\n\n if (e.shiftKey) {\n this.multiSelectItem(item);\n } else if (e.metaKey || e.ctrlKey) {\n this.toggleItem(item);\n } else {\n this.selectItem(item);\n }\n this.updateFocus(item);\n e.stopPropagation();\n return false;\n };\n\n /**\n * Handle a blur event\n *\n * @method handleBlur\n * @return {Boolean}\n */\n Tree.prototype.handleBlur = function() {\n return true;\n };\n\n /**\n * Handle a focus event\n *\n * @method handleFocus\n * @param {Object} item item is the jquery id of the parent item of the group\n * @return {Boolean}\n */\n Tree.prototype.handleFocus = function(item) {\n\n this.updateFocus(item);\n\n return true;\n };\n\n /**\n * Bind the event listeners we require.\n *\n * @method bindEventHandlers\n */\n Tree.prototype.bindEventHandlers = function() {\n var thisObj = this;\n\n // Bind a dblclick handler to the parent items.\n this.parents.dblclick(function(e) {\n return thisObj.handleDblClick($(this), e);\n });\n\n // Bind a click handler.\n this.items.click(function(e) {\n return thisObj.handleClick($(this), e);\n });\n\n // Bind a toggle handler to the expand/collapse icons.\n this.items.children('img').click(function(e) {\n return thisObj.handleExpandCollapseClick($(this).parent(), e);\n });\n\n // Bind a keydown handler.\n this.items.keydown(function(e) {\n return thisObj.handleKeyDown($(this), e);\n });\n\n // Bind a keypress handler.\n this.items.keypress(function(e) {\n return thisObj.handleKeyPress($(this), e);\n });\n\n // Bind a focus handler.\n this.items.focus(function(e) {\n return thisObj.handleFocus($(this), e);\n });\n\n // Bind a blur handler.\n this.items.blur(function(e) {\n return thisObj.handleBlur($(this), e);\n });\n\n };\n\n return /** @alias module:tool_lp/tree */ Tree;\n});\n"],"names":["define","$","url","log","expandedImage","imageUrl","collapsedImage","Tree","selector","multiSelect","treeRoot","items","this","find","expandAll","length","parents","attr","visibleItems","activeItem","lastActiveItem","keys","tab","enter","space","pageup","pagedown","end","home","left","up","right","down","eight","asterisk","init","bindEventHandlers","prototype","prepend","clone","thisObj","each","collapseGroup","expandGroup","first","item","children","show","hide","toggleGroup","triggerChange","allSelected","filter","trigger","selected","multiSelectItem","lastIndex","index","currentIndex","get","selectItem","walk","parent","toggleItem","current","updateFocus","handleKeyDown","e","newItem","hasKeyModifier","shiftKey","ctrlKey","metaKey","altKey","keyCode","focus","stopPropagation","last","has","itemParent","is","prev","eq","next","handleKeyPress","chr","String","fromCharCode","which","match","itemIndex","itemCount","currentItem","titleChr","text","charAt","toLowerCase","on","eventname","handler","warning","handleDblClick","handleExpandCollapseClick","handleClick","handleBlur","handleFocus","dblclick","click","keydown","keypress","blur"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tree.min.js","sources":["../src/tree.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 * Implement an accessible aria tree widget, from a nested unordered list.\n * Based on http://oaa-accessibility.org/example/41/\n *\n * To respond to selection changed events - use tree.on(\"selectionchanged\", handler).\n * The handler will receive an array of nodes, which are the list items that are currently\n * selected. (Or a single node if multiselect is disabled).\n *\n * @module tool_lp/tree\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/url', 'core/log'], function($, url, log) {\n // Private variables and functions.\n /** @var {String} expandedImage The html for an expanded tree node twistie. */\n var expandedImage = $('\"\"');\n /** @var {String} collapsedImage The html for a collapsed tree node twistie. */\n var collapsedImage = $('\"\"');\n\n /**\n * Constructor\n *\n * @param {String} selector\n * @param {Boolean} multiSelect\n */\n var Tree = function(selector, multiSelect) {\n this.treeRoot = $(selector);\n this.multiSelect = (typeof multiSelect === 'undefined' || multiSelect === true);\n\n this.items = this.treeRoot.find('li');\n this.expandAll = this.items.length < 20;\n this.parents = this.treeRoot.find('li:has(ul)');\n\n if (multiSelect) {\n this.treeRoot.attr('aria-multiselectable', 'true');\n }\n\n this.items.attr('aria-selected', 'false');\n\n this.visibleItems = null;\n this.activeItem = null;\n this.lastActiveItem = null;\n\n this.keys = {\n tab: 9,\n enter: 13,\n space: 32,\n pageup: 33,\n pagedown: 34,\n end: 35,\n home: 36,\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n eight: 56,\n asterisk: 106\n };\n\n this.init();\n\n this.bindEventHandlers();\n };\n // Public variables and functions.\n\n /**\n * Init this tree\n * @method init\n */\n Tree.prototype.init = function() {\n this.parents.attr('aria-expanded', 'true');\n this.parents.prepend(expandedImage.clone());\n\n this.items.attr('role', 'tree-item');\n this.items.attr('tabindex', '-1');\n this.parents.attr('role', 'group');\n this.treeRoot.attr('role', 'tree');\n\n this.visibleItems = this.treeRoot.find('li');\n\n var thisObj = this;\n if (!this.expandAll) {\n this.parents.each(function() {\n thisObj.collapseGroup($(this));\n });\n this.expandGroup(this.parents.first());\n }\n };\n\n /**\n * Expand a collapsed group.\n *\n * @method expandGroup\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.expandGroup = function(item) {\n // Find the first child ul node.\n var group = item.children('ul');\n\n // Expand the group.\n group.show().attr('aria-hidden', 'false');\n\n item.attr('aria-expanded', 'true');\n\n item.children('img').attr('src', expandedImage.attr('src'));\n\n // Update the list of visible items.\n this.visibleItems = this.treeRoot.find('li:visible');\n };\n\n /**\n * Collapse an expanded group.\n *\n * @method collapseGroup\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.collapseGroup = function(item) {\n var group = item.children('ul');\n\n // Collapse the group.\n group.hide().attr('aria-hidden', 'true');\n\n item.attr('aria-expanded', 'false');\n\n item.children('img').attr('src', collapsedImage.attr('src'));\n\n // Update the list of visible items.\n this.visibleItems = this.treeRoot.find('li:visible');\n };\n\n /**\n * Expand or collapse a group.\n *\n * @method toggleGroup\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.toggleGroup = function(item) {\n if (item.attr('aria-expanded') == 'true') {\n this.collapseGroup(item);\n } else {\n this.expandGroup(item);\n }\n };\n\n /**\n * Whenever the currently selected node has changed, trigger an event using this function.\n *\n * @method triggerChange\n */\n Tree.prototype.triggerChange = function() {\n var allSelected = this.items.filter('[aria-selected=true]');\n if (!this.multiSelect) {\n allSelected = allSelected.first();\n }\n this.treeRoot.trigger('selectionchanged', {selected: allSelected});\n };\n\n /**\n * Select all the items between the last focused item and this currently focused item.\n *\n * @method multiSelectItem\n * @param {Object} item is the jquery id of the newly selected item.\n */\n Tree.prototype.multiSelectItem = function(item) {\n if (!this.multiSelect) {\n this.items.attr('aria-selected', 'false');\n } else if (this.lastActiveItem !== null) {\n var lastIndex = this.visibleItems.index(this.lastActiveItem);\n var currentIndex = this.visibleItems.index(this.activeItem);\n var oneItem = null;\n\n while (lastIndex < currentIndex) {\n oneItem = $(this.visibleItems.get(lastIndex));\n oneItem.attr('aria-selected', 'true');\n lastIndex++;\n }\n while (lastIndex > currentIndex) {\n oneItem = $(this.visibleItems.get(lastIndex));\n oneItem.attr('aria-selected', 'true');\n lastIndex--;\n }\n }\n\n item.attr('aria-selected', 'true');\n this.triggerChange();\n };\n\n /**\n * Select a single item. Make sure all the parents are expanded. De-select all other items.\n *\n * @method selectItem\n * @param {Object} item is the jquery id of the newly selected item.\n */\n Tree.prototype.selectItem = function(item) {\n // Expand all nodes up the tree.\n var walk = item.parent();\n while (walk.attr('role') != 'tree') {\n walk = walk.parent();\n if (walk.attr('aria-expanded') == 'false') {\n this.expandGroup(walk);\n }\n walk = walk.parent();\n }\n this.items.attr('aria-selected', 'false');\n item.attr('aria-selected', 'true');\n this.triggerChange();\n };\n\n /**\n * Toggle the selected state for an item back and forth.\n *\n * @method toggleItem\n * @param {Object} item is the jquery id of the item to toggle.\n */\n Tree.prototype.toggleItem = function(item) {\n if (!this.multiSelect) {\n this.selectItem(item);\n return;\n }\n\n var current = item.attr('aria-selected');\n if (current === 'true') {\n current = 'false';\n } else {\n current = 'true';\n }\n item.attr('aria-selected', current);\n this.triggerChange();\n };\n\n /**\n * Set the focus to this item.\n *\n * @method updateFocus\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.updateFocus = function(item) {\n this.lastActiveItem = this.activeItem;\n this.activeItem = item;\n // Expand all nodes up the tree.\n var walk = item.parent();\n while (walk.attr('role') != 'tree') {\n walk = walk.parent();\n if (walk.attr('aria-expanded') == 'false') {\n this.expandGroup(walk);\n }\n walk = walk.parent();\n }\n this.items.attr('tabindex', '-1');\n item.attr('tabindex', 0);\n };\n\n /**\n * Handle a key down event - ie navigate the tree.\n *\n * @method handleKeyDown\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n // This function should be simplified. In the meantime..\n // eslint-disable-next-line complexity\n Tree.prototype.handleKeyDown = function(item, e) {\n var currentIndex = this.visibleItems.index(item);\n var newItem = null;\n var hasKeyModifier = e.shiftKey || e.ctrlKey || e.metaKey || e.altKey;\n var thisObj = this;\n\n switch (e.keyCode) {\n case this.keys.home: {\n // Jump to first item in tree.\n newItem = this.parents.first();\n newItem.focus();\n if (e.shiftKey) {\n this.multiSelectItem(newItem);\n } else if (!hasKeyModifier) {\n this.selectItem(newItem);\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.end: {\n // Jump to last visible item.\n newItem = this.visibleItems.last();\n newItem.focus();\n if (e.shiftKey) {\n this.multiSelectItem(newItem);\n } else if (!hasKeyModifier) {\n this.selectItem(newItem);\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.enter:\n case this.keys.space: {\n\n if (e.shiftKey) {\n this.multiSelectItem(item);\n } else if (e.metaKey || e.ctrlKey) {\n this.toggleItem(item);\n } else {\n this.selectItem(item);\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.left: {\n if (item.has('ul') && item.attr('aria-expanded') == 'true') {\n this.collapseGroup(item);\n } else {\n // Move up to the parent.\n var itemUL = item.parent();\n var itemParent = itemUL.parent();\n if (itemParent.is('li')) {\n itemParent.focus();\n if (e.shiftKey) {\n this.multiSelectItem(itemParent);\n } else if (!hasKeyModifier) {\n this.selectItem(itemParent);\n }\n }\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.right: {\n if (item.has('ul') && item.attr('aria-expanded') == 'false') {\n this.expandGroup(item);\n } else {\n // Move to the first item in the child group.\n newItem = item.children('ul').children('li').first();\n if (newItem.length > 0) {\n newItem.focus();\n if (e.shiftKey) {\n this.multiSelectItem(newItem);\n } else if (!hasKeyModifier) {\n this.selectItem(newItem);\n }\n }\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.up: {\n\n if (currentIndex > 0) {\n var prev = this.visibleItems.eq(currentIndex - 1);\n prev.focus();\n if (e.shiftKey) {\n this.multiSelectItem(prev);\n } else if (!hasKeyModifier) {\n this.selectItem(prev);\n }\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.down: {\n\n if (currentIndex < this.visibleItems.length - 1) {\n var next = this.visibleItems.eq(currentIndex + 1);\n next.focus();\n if (e.shiftKey) {\n this.multiSelectItem(next);\n } else if (!hasKeyModifier) {\n this.selectItem(next);\n }\n }\n e.stopPropagation();\n return false;\n }\n case this.keys.asterisk: {\n // Expand all groups.\n this.parents.each(function() {\n thisObj.expandGroup($(this));\n });\n\n e.stopPropagation();\n return false;\n }\n case this.keys.eight: {\n if (e.shiftKey) {\n // Expand all groups.\n this.parents.each(function() {\n thisObj.expandGroup($(this));\n });\n\n e.stopPropagation();\n }\n\n return false;\n }\n }\n\n return true;\n };\n\n /**\n * Handle a key press event - ie navigate the tree.\n *\n * @method handleKeyPress\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleKeyPress = function(item, e) {\n if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {\n // Do nothing.\n return true;\n }\n\n switch (e.keyCode) {\n case this.keys.tab: {\n return true;\n }\n case this.keys.enter:\n case this.keys.home:\n case this.keys.end:\n case this.keys.left:\n case this.keys.right:\n case this.keys.up:\n case this.keys.down: {\n e.stopPropagation();\n return false;\n }\n default : {\n var chr = String.fromCharCode(e.which);\n var match = false;\n var itemIndex = this.visibleItems.index(item);\n var itemCount = this.visibleItems.length;\n var currentIndex = itemIndex + 1;\n\n // Check if the active item was the last one on the list.\n if (currentIndex == itemCount) {\n currentIndex = 0;\n }\n\n // Iterate through the menu items (starting from the current item and wrapping) until a match is found\n // or the loop returns to the current menu item.\n while (currentIndex != itemIndex) {\n\n var currentItem = this.visibleItems.eq(currentIndex);\n var titleChr = currentItem.text().charAt(0);\n\n if (currentItem.has('ul')) {\n titleChr = currentItem.find('span').text().charAt(0);\n }\n\n if (titleChr.toLowerCase() == chr) {\n match = true;\n break;\n }\n\n currentIndex = currentIndex + 1;\n if (currentIndex == itemCount) {\n // Reached the end of the list, start again at the beginning.\n currentIndex = 0;\n }\n }\n\n if (match === true) {\n this.updateFocus(this.visibleItems.eq(currentIndex));\n }\n e.stopPropagation();\n return false;\n }\n }\n\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n /**\n * Attach an event listener to the tree.\n *\n * @method on\n * @param {String} eventname This is the name of the event to listen for. Only 'selectionchanged' is supported for now.\n * @param {Function} handler The function to call when the event is triggered.\n */\n Tree.prototype.on = function(eventname, handler) {\n if (eventname !== 'selectionchanged') {\n log.warning('Invalid custom event name for tree. Only \"selectionchanged\" is supported.');\n } else {\n this.treeRoot.on(eventname, handler);\n }\n };\n\n /**\n * Handle a double click (expand/collapse).\n *\n * @method handleDblClick\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleDblClick = function(item, e) {\n\n if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {\n // Do nothing.\n return true;\n }\n\n // Apply the focus markup.\n this.updateFocus(item);\n\n // Expand or collapse the group.\n this.toggleGroup(item);\n\n e.stopPropagation();\n return false;\n };\n\n /**\n * Handle a click (select).\n *\n * @method handleExpandCollapseClick\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleExpandCollapseClick = function(item, e) {\n\n // Do not shift the focus.\n this.toggleGroup(item);\n e.stopPropagation();\n return false;\n };\n\n\n /**\n * Handle a click (select).\n *\n * @method handleClick\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleClick = function(item, e) {\n\n if (e.shiftKey) {\n this.multiSelectItem(item);\n } else if (e.metaKey || e.ctrlKey) {\n this.toggleItem(item);\n } else {\n this.selectItem(item);\n }\n this.updateFocus(item);\n e.stopPropagation();\n return false;\n };\n\n /**\n * Handle a blur event\n *\n * @method handleBlur\n * @return {Boolean}\n */\n Tree.prototype.handleBlur = function() {\n return true;\n };\n\n /**\n * Handle a focus event\n *\n * @method handleFocus\n * @param {Object} item item is the jquery id of the parent item of the group\n * @return {Boolean}\n */\n Tree.prototype.handleFocus = function(item) {\n\n this.updateFocus(item);\n\n return true;\n };\n\n /**\n * Bind the event listeners we require.\n *\n * @method bindEventHandlers\n */\n Tree.prototype.bindEventHandlers = function() {\n var thisObj = this;\n\n // Bind a dblclick handler to the parent items.\n this.parents.dblclick(function(e) {\n return thisObj.handleDblClick($(this), e);\n });\n\n // Bind a click handler.\n this.items.click(function(e) {\n return thisObj.handleClick($(this), e);\n });\n\n // Bind a toggle handler to the expand/collapse icons.\n this.items.children('img').click(function(e) {\n return thisObj.handleExpandCollapseClick($(this).parent(), e);\n });\n\n // Bind a keydown handler.\n this.items.keydown(function(e) {\n return thisObj.handleKeyDown($(this), e);\n });\n\n // Bind a keypress handler.\n this.items.keypress(function(e) {\n return thisObj.handleKeyPress($(this), e);\n });\n\n // Bind a focus handler.\n this.items.focus(function(e) {\n return thisObj.handleFocus($(this), e);\n });\n\n // Bind a blur handler.\n this.items.blur(function(e) {\n return thisObj.handleBlur($(this), e);\n });\n\n };\n\n return /** @alias module:tool_lp/tree */ Tree;\n});\n"],"names":["define","$","url","log","expandedImage","imageUrl","collapsedImage","Tree","selector","multiSelect","this","treeRoot","items","find","expandAll","length","parents","attr","visibleItems","activeItem","lastActiveItem","keys","tab","enter","space","pageup","pagedown","end","home","left","up","right","down","eight","asterisk","init","bindEventHandlers","prototype","prepend","clone","thisObj","each","collapseGroup","expandGroup","first","item","children","show","hide","toggleGroup","triggerChange","allSelected","filter","trigger","selected","multiSelectItem","lastIndex","index","currentIndex","get","selectItem","walk","parent","toggleItem","current","updateFocus","handleKeyDown","e","newItem","hasKeyModifier","shiftKey","ctrlKey","metaKey","altKey","keyCode","focus","stopPropagation","last","has","itemParent","is","prev","eq","next","handleKeyPress","chr","String","fromCharCode","which","match","itemIndex","itemCount","currentItem","titleChr","text","charAt","toLowerCase","on","eventname","handler","warning","handleDblClick","handleExpandCollapseClick","handleClick","handleBlur","handleFocus","dblclick","click","keydown","keypress","blur"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/user_competency_course_navigation.min.js.map b/admin/tool/lp/amd/build/user_competency_course_navigation.min.js.map index 180e7138397..193677a80b8 100644 --- a/admin/tool/lp/amd/build/user_competency_course_navigation.min.js.map +++ b/admin/tool/lp/amd/build/user_competency_course_navigation.min.js.map @@ -1 +1 @@ -{"version":3,"file":"user_competency_course_navigation.min.js","sources":["../src/user_competency_course_navigation.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 enable inline editing of a comptency grade.\n *\n * @module tool_lp/user_competency_course_navigation\n * @copyright 2015 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * UserCompetencyCourseNavigation\n *\n * @class tool_lp/user_competency_course_navigation\n * @param {String} userSelector The selector of the user element.\n * @param {String} competencySelector The selector of the competency element.\n * @param {String} baseUrl The base url for the page (no params).\n * @param {Number} userId The user id\n * @param {Number} competencyId The competency id\n * @param {Number} courseId The course id\n */\n var UserCompetencyCourseNavigation = function(userSelector, competencySelector, baseUrl, userId, competencyId, courseId) {\n this._baseUrl = baseUrl;\n this._userId = userId + '';\n this._competencyId = competencyId + '';\n this._courseId = courseId;\n\n $(userSelector).on('change', this._userChanged.bind(this));\n $(competencySelector).on('change', this._competencyChanged.bind(this));\n };\n\n /**\n * The user was changed in the select list.\n *\n * @method _userChanged\n * @param {Event} e\n */\n UserCompetencyCourseNavigation.prototype._userChanged = function(e) {\n var newUserId = $(e.target).val();\n var queryStr = '?userid=' + newUserId + '&courseid=' + this._courseId + '&competencyid=' + this._competencyId;\n document.location = this._baseUrl + queryStr;\n };\n\n /**\n * The competency was changed in the select list.\n *\n * @method _competencyChanged\n * @param {Event} e\n */\n UserCompetencyCourseNavigation.prototype._competencyChanged = function(e) {\n var newCompetencyId = $(e.target).val();\n var queryStr = '?userid=' + this._userId + '&courseid=' + this._courseId + '&competencyid=' + newCompetencyId;\n document.location = this._baseUrl + queryStr;\n };\n\n /** @property {Number} The id of the competency. */\n UserCompetencyCourseNavigation.prototype._competencyId = null;\n /** @property {Number} The id of the user. */\n UserCompetencyCourseNavigation.prototype._userId = null;\n /** @property {Number} The id of the course. */\n UserCompetencyCourseNavigation.prototype._courseId = null;\n /** @property {String} Plugin base url. */\n UserCompetencyCourseNavigation.prototype._baseUrl = null;\n /** @property {Boolean} Ignore the first change event for competencies. */\n UserCompetencyCourseNavigation.prototype._ignoreFirstCompetency = null;\n\n return UserCompetencyCourseNavigation;\n});\n"],"names":["define","$","UserCompetencyCourseNavigation","userSelector","competencySelector","baseUrl","userId","competencyId","courseId","_baseUrl","_userId","_competencyId","_courseId","on","this","_userChanged","bind","_competencyChanged","prototype","e","queryStr","target","val","document","location","newCompetencyId","_ignoreFirstCompetency"],"mappings":";;;;;;;AAuBAA,mDAAO,CAAC,WAAW,SAASC,OAapBC,+BAAiC,SAASC,aAAcC,mBAAoBC,QAASC,OAAQC,aAAcC,eACtGC,SAAWJ,aACXK,QAAUJ,OAAS,QACnBK,cAAgBJ,aAAe,QAC/BK,UAAYJ,SAEjBP,EAAEE,cAAcU,GAAG,SAAUC,KAAKC,aAAaC,KAAKF,OACpDb,EAAEG,oBAAoBS,GAAG,SAAUC,KAAKG,mBAAmBD,KAAKF,eASpEZ,+BAA+BgB,UAAUH,aAAe,SAASI,OAEzDC,SAAW,WADCnB,EAAEkB,EAAEE,QAAQC,MACY,aAAeR,KAAKF,UAAY,iBAAmBE,KAAKH,cAChGY,SAASC,SAAWV,KAAKL,SAAWW,UASxClB,+BAA+BgB,UAAUD,mBAAqB,SAASE,OAC/DM,gBAAkBxB,EAAEkB,EAAEE,QAAQC,MAC9BF,SAAW,WAAaN,KAAKJ,QAAU,aAAeI,KAAKF,UAAY,iBAAmBa,gBAC9FF,SAASC,SAAWV,KAAKL,SAAWW,UAIxClB,+BAA+BgB,UAAUP,cAAgB,KAEzDT,+BAA+BgB,UAAUR,QAAU,KAEnDR,+BAA+BgB,UAAUN,UAAY,KAErDV,+BAA+BgB,UAAUT,SAAW,KAEpDP,+BAA+BgB,UAAUQ,uBAAyB,KAE3DxB"} \ No newline at end of file +{"version":3,"file":"user_competency_course_navigation.min.js","sources":["../src/user_competency_course_navigation.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 enable inline editing of a comptency grade.\n *\n * @module tool_lp/user_competency_course_navigation\n * @copyright 2015 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * UserCompetencyCourseNavigation\n *\n * @class tool_lp/user_competency_course_navigation\n * @param {String} userSelector The selector of the user element.\n * @param {String} competencySelector The selector of the competency element.\n * @param {String} baseUrl The base url for the page (no params).\n * @param {Number} userId The user id\n * @param {Number} competencyId The competency id\n * @param {Number} courseId The course id\n */\n var UserCompetencyCourseNavigation = function(userSelector, competencySelector, baseUrl, userId, competencyId, courseId) {\n this._baseUrl = baseUrl;\n this._userId = userId + '';\n this._competencyId = competencyId + '';\n this._courseId = courseId;\n\n $(userSelector).on('change', this._userChanged.bind(this));\n $(competencySelector).on('change', this._competencyChanged.bind(this));\n };\n\n /**\n * The user was changed in the select list.\n *\n * @method _userChanged\n * @param {Event} e\n */\n UserCompetencyCourseNavigation.prototype._userChanged = function(e) {\n var newUserId = $(e.target).val();\n var queryStr = '?userid=' + newUserId + '&courseid=' + this._courseId + '&competencyid=' + this._competencyId;\n document.location = this._baseUrl + queryStr;\n };\n\n /**\n * The competency was changed in the select list.\n *\n * @method _competencyChanged\n * @param {Event} e\n */\n UserCompetencyCourseNavigation.prototype._competencyChanged = function(e) {\n var newCompetencyId = $(e.target).val();\n var queryStr = '?userid=' + this._userId + '&courseid=' + this._courseId + '&competencyid=' + newCompetencyId;\n document.location = this._baseUrl + queryStr;\n };\n\n /** @property {Number} The id of the competency. */\n UserCompetencyCourseNavigation.prototype._competencyId = null;\n /** @property {Number} The id of the user. */\n UserCompetencyCourseNavigation.prototype._userId = null;\n /** @property {Number} The id of the course. */\n UserCompetencyCourseNavigation.prototype._courseId = null;\n /** @property {String} Plugin base url. */\n UserCompetencyCourseNavigation.prototype._baseUrl = null;\n /** @property {Boolean} Ignore the first change event for competencies. */\n UserCompetencyCourseNavigation.prototype._ignoreFirstCompetency = null;\n\n return UserCompetencyCourseNavigation;\n});\n"],"names":["define","$","UserCompetencyCourseNavigation","userSelector","competencySelector","baseUrl","userId","competencyId","courseId","_baseUrl","this","_userId","_competencyId","_courseId","on","_userChanged","bind","_competencyChanged","prototype","e","newUserId","queryStr","target","val","document","location","newCompetencyId","_ignoreFirstCompetency"],"mappings":";;;;;;;AAuBAA,mDAAO,CAAC,WAAW,SAASC,GAaxB,IAAIC,+BAAiC,SAASC,aAAcC,mBAAoBC,QAASC,OAAQC,aAAcC,UACtGC,KAAAA,SAAWJ,QAChBK,KAAKC,QAAUL,OAAS,GACxBI,KAAKE,cAAgBL,aAAe,GAC/BM,KAAAA,UAAYL,SAEjBP,EAAEE,cAAcW,GAAG,SAAUJ,KAAKK,aAAaC,KAAKN,OACpDT,EAAEG,oBAAoBU,GAAG,SAAUJ,KAAKO,mBAAmBD,KAAKN,MACnE,EAqCD,OA7BAR,+BAA+BgB,UAAUH,aAAe,SAASI,GACzDC,IACAC,SAAW,WADCpB,EAAEkB,EAAEG,QAAQC,MACY,aAAeb,KAAKG,UAAY,iBAAmBH,KAAKE,cAChGY,SAASC,SAAWf,KAAKD,SAAWY,QACvC,EAQDnB,+BAA+BgB,UAAUD,mBAAqB,SAASE,GAC/DO,IAAAA,gBAAkBzB,EAAEkB,EAAEG,QAAQC,MAC9BF,SAAW,WAAaX,KAAKC,QAAU,aAAeD,KAAKG,UAAY,iBAAmBa,gBAC9FF,SAASC,SAAWf,KAAKD,SAAWY,QACvC,EAGDnB,+BAA+BgB,UAAUN,cAAgB,KAEzDV,+BAA+BgB,UAAUP,QAAU,KAEnDT,+BAA+BgB,UAAUL,UAAY,KAErDX,+BAA+BgB,UAAUT,SAAW,KAEpDP,+BAA+BgB,UAAUS,uBAAyB,KAE3DzB,8BACV"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/user_competency_info.min.js.map b/admin/tool/lp/amd/build/user_competency_info.min.js.map index 6a86054a7a4..970e6f78c82 100644 --- a/admin/tool/lp/amd/build/user_competency_info.min.js.map +++ b/admin/tool/lp/amd/build/user_competency_info.min.js.map @@ -1 +1 @@ -{"version":3,"file":"user_competency_info.min.js","sources":["../src/user_competency_info.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 refresh a user competency summary in a page.\n *\n * @module tool_lp/user_competency_info\n * @copyright 2015 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/notification', 'core/ajax', 'core/templates'], function($, notification, ajax, templates) {\n\n /**\n * Info\n *\n * @param {JQuery} rootElement Selector to replace when the information needs updating.\n * @param {Number} competencyId The id of the competency.\n * @param {Number} userId The id of the user.\n * @param {Number} planId The id of the plan.\n * @param {Number} courseId The id of the course.\n * @param {Boolean} displayuser If we should display the user info.\n */\n var Info = function(rootElement, competencyId, userId, planId, courseId, displayuser) {\n this._rootElement = rootElement;\n this._competencyId = competencyId;\n this._userId = userId;\n this._planId = planId;\n this._courseId = courseId;\n this._valid = true;\n this._displayuser = (typeof displayuser !== 'undefined') ? displayuser : false;\n\n if (this._planId) {\n this._methodName = 'tool_lp_data_for_user_competency_summary_in_plan';\n this._args = {competencyid: this._competencyId, planid: this._planId};\n this._templateName = 'tool_lp/user_competency_summary_in_plan';\n } else if (this._courseId) {\n this._methodName = 'tool_lp_data_for_user_competency_summary_in_course';\n this._args = {userid: this._userId, competencyid: this._competencyId, courseid: this._courseId};\n this._templateName = 'tool_lp/user_competency_summary_in_course';\n } else {\n this._methodName = 'tool_lp_data_for_user_competency_summary';\n this._args = {userid: this._userId, competencyid: this._competencyId};\n this._templateName = 'tool_lp/user_competency_summary';\n }\n };\n\n /**\n * Reload the info for this user competency.\n *\n * @method reload\n */\n Info.prototype.reload = function() {\n var self = this,\n promises = [];\n\n if (!this._valid) {\n return;\n }\n\n promises = ajax.call([{\n methodname: this._methodName,\n args: this._args\n }]);\n\n promises[0].done(function(context) {\n // Check if we should also the user info.\n if (self._displayuser) {\n context.displayuser = true;\n }\n templates.render(self._templateName, context).done(function(html, js) {\n templates.replaceNode(self._rootElement, html, js);\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /** @property {JQuery} The root element to replace in the DOM. */\n Info.prototype._rootElement = null;\n /** @property {Number} The id of the course. */\n Info.prototype._courseId = null;\n /** @property {Boolean} Is this module valid? */\n Info.prototype._valid = null;\n /** @property {Number} The id of the plan. */\n Info.prototype._planId = null;\n /** @property {Number} The id of the competency. */\n Info.prototype._competencyId = null;\n /** @property {Number} The id of the user. */\n Info.prototype._userId = null;\n /** @property {String} The method name to load the data. */\n Info.prototype._methodName = null;\n /** @property {Object} The arguments to load the data. */\n Info.prototype._args = null;\n /** @property {String} The template to reload the fragment. */\n Info.prototype._templateName = null;\n /** @property {Boolean} If we should display the user info? */\n Info.prototype._displayuser = false;\n\n return /** @alias module:tool_lp/user_competency_info */ Info;\n\n});\n"],"names":["define","$","notification","ajax","templates","Info","rootElement","competencyId","userId","planId","courseId","displayuser","_rootElement","_competencyId","_userId","_planId","_courseId","_valid","_displayuser","this","_methodName","_args","competencyid","planid","_templateName","userid","courseid","prototype","reload","self","call","methodname","args","done","context","render","html","js","replaceNode","fail","exception"],"mappings":";;;;;;;AAuBAA,sCAAO,CAAC,SAAU,oBAAqB,YAAa,mBAAmB,SAASC,EAAGC,aAAcC,KAAMC,eAY/FC,KAAO,SAASC,YAAaC,aAAcC,OAAQC,OAAQC,SAAUC,kBAChEC,aAAeN,iBACfO,cAAgBN,kBAChBO,QAAUN,YACVO,QAAUN,YACVO,UAAYN,cACZO,QAAS,OACTC,kBAAuC,IAAhBP,aAA+BA,YAEvDQ,KAAKJ,cACAK,YAAc,wDACdC,MAAQ,CAACC,aAAcH,KAAKN,cAAeU,OAAQJ,KAAKJ,cACxDS,cAAgB,2CACdL,KAAKH,gBACPI,YAAc,0DACdC,MAAQ,CAACI,OAAQN,KAAKL,QAASQ,aAAcH,KAAKN,cAAea,SAAUP,KAAKH,gBAChFQ,cAAgB,mDAEhBJ,YAAc,gDACdC,MAAQ,CAACI,OAAQN,KAAKL,QAASQ,aAAcH,KAAKN,oBAClDW,cAAgB,2CAS7BnB,KAAKsB,UAAUC,OAAS,eAChBC,KAAOV,KAGNA,KAAKF,QAICd,KAAK2B,KAAK,CAAC,CAClBC,WAAYZ,KAAKC,YACjBY,KAAMb,KAAKE,SAGN,GAAGY,MAAK,SAASC,SAElBL,KAAKX,eACLgB,QAAQvB,aAAc,GAE1BP,UAAU+B,OAAON,KAAKL,cAAeU,SAASD,MAAK,SAASG,KAAMC,IAC9DjC,UAAUkC,YAAYT,KAAKjB,aAAcwB,KAAMC,OAChDE,KAAKrC,aAAasC,cACtBD,KAAKrC,aAAasC,YAIzBnC,KAAKsB,UAAUf,aAAe,KAE9BP,KAAKsB,UAAUX,UAAY,KAE3BX,KAAKsB,UAAUV,OAAS,KAExBZ,KAAKsB,UAAUZ,QAAU,KAEzBV,KAAKsB,UAAUd,cAAgB,KAE/BR,KAAKsB,UAAUb,QAAU,KAEzBT,KAAKsB,UAAUP,YAAc,KAE7Bf,KAAKsB,UAAUN,MAAQ,KAEvBhB,KAAKsB,UAAUH,cAAgB,KAE/BnB,KAAKsB,UAAUT,cAAe,EAE2Bb"} \ No newline at end of file +{"version":3,"file":"user_competency_info.min.js","sources":["../src/user_competency_info.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 refresh a user competency summary in a page.\n *\n * @module tool_lp/user_competency_info\n * @copyright 2015 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/notification', 'core/ajax', 'core/templates'], function($, notification, ajax, templates) {\n\n /**\n * Info\n *\n * @param {JQuery} rootElement Selector to replace when the information needs updating.\n * @param {Number} competencyId The id of the competency.\n * @param {Number} userId The id of the user.\n * @param {Number} planId The id of the plan.\n * @param {Number} courseId The id of the course.\n * @param {Boolean} displayuser If we should display the user info.\n */\n var Info = function(rootElement, competencyId, userId, planId, courseId, displayuser) {\n this._rootElement = rootElement;\n this._competencyId = competencyId;\n this._userId = userId;\n this._planId = planId;\n this._courseId = courseId;\n this._valid = true;\n this._displayuser = (typeof displayuser !== 'undefined') ? displayuser : false;\n\n if (this._planId) {\n this._methodName = 'tool_lp_data_for_user_competency_summary_in_plan';\n this._args = {competencyid: this._competencyId, planid: this._planId};\n this._templateName = 'tool_lp/user_competency_summary_in_plan';\n } else if (this._courseId) {\n this._methodName = 'tool_lp_data_for_user_competency_summary_in_course';\n this._args = {userid: this._userId, competencyid: this._competencyId, courseid: this._courseId};\n this._templateName = 'tool_lp/user_competency_summary_in_course';\n } else {\n this._methodName = 'tool_lp_data_for_user_competency_summary';\n this._args = {userid: this._userId, competencyid: this._competencyId};\n this._templateName = 'tool_lp/user_competency_summary';\n }\n };\n\n /**\n * Reload the info for this user competency.\n *\n * @method reload\n */\n Info.prototype.reload = function() {\n var self = this,\n promises = [];\n\n if (!this._valid) {\n return;\n }\n\n promises = ajax.call([{\n methodname: this._methodName,\n args: this._args\n }]);\n\n promises[0].done(function(context) {\n // Check if we should also the user info.\n if (self._displayuser) {\n context.displayuser = true;\n }\n templates.render(self._templateName, context).done(function(html, js) {\n templates.replaceNode(self._rootElement, html, js);\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /** @property {JQuery} The root element to replace in the DOM. */\n Info.prototype._rootElement = null;\n /** @property {Number} The id of the course. */\n Info.prototype._courseId = null;\n /** @property {Boolean} Is this module valid? */\n Info.prototype._valid = null;\n /** @property {Number} The id of the plan. */\n Info.prototype._planId = null;\n /** @property {Number} The id of the competency. */\n Info.prototype._competencyId = null;\n /** @property {Number} The id of the user. */\n Info.prototype._userId = null;\n /** @property {String} The method name to load the data. */\n Info.prototype._methodName = null;\n /** @property {Object} The arguments to load the data. */\n Info.prototype._args = null;\n /** @property {String} The template to reload the fragment. */\n Info.prototype._templateName = null;\n /** @property {Boolean} If we should display the user info? */\n Info.prototype._displayuser = false;\n\n return /** @alias module:tool_lp/user_competency_info */ Info;\n\n});\n"],"names":["define","$","notification","ajax","templates","Info","rootElement","competencyId","userId","planId","courseId","displayuser","_rootElement","_competencyId","_userId","_planId","_courseId","_valid","_displayuser","this","_methodName","_args","competencyid","planid","_templateName","userid","courseid","prototype","reload","self","call","methodname","args","done","context","render","html","js","replaceNode","fail","exception"],"mappings":";;;;;;;AAuBAA,sCAAO,CAAC,SAAU,oBAAqB,YAAa,mBAAmB,SAASC,EAAGC,aAAcC,KAAMC,WAYnG,IAAIC,KAAO,SAASC,YAAaC,aAAcC,OAAQC,OAAQC,SAAUC,aAChEC,KAAAA,aAAeN,YACfO,KAAAA,cAAgBN,aAChBO,KAAAA,QAAUN,OACVO,KAAAA,QAAUN,OACVO,KAAAA,UAAYN,SACZO,KAAAA,QAAS,EACTC,KAAAA,kBAAuC,IAAhBP,aAA+BA,YAEvDQ,KAAKJ,SACAK,KAAAA,YAAc,mDACnBD,KAAKE,MAAQ,CAACC,aAAcH,KAAKN,cAAeU,OAAQJ,KAAKJ,SACxDS,KAAAA,cAAgB,2CACdL,KAAKH,WACPI,KAAAA,YAAc,qDACnBD,KAAKE,MAAQ,CAACI,OAAQN,KAAKL,QAASQ,aAAcH,KAAKN,cAAea,SAAUP,KAAKH,WAChFQ,KAAAA,cAAgB,8CAEhBJ,KAAAA,YAAc,2CACnBD,KAAKE,MAAQ,CAACI,OAAQN,KAAKL,QAASQ,aAAcH,KAAKN,eAClDW,KAAAA,cAAgB,kCAE5B,EAoDD,OA7CAnB,KAAKsB,UAAUC,OAAS,WAChBC,IAAAA,KAAOV,KAGNA,KAAKF,QAICd,KAAK2B,KAAK,CAAC,CAClBC,WAAYZ,KAAKC,YACjBY,KAAMb,KAAKE,SAGN,GAAGY,MAAK,SAASC,SAElBL,KAAKX,eACLgB,QAAQvB,aAAc,GAE1BP,UAAU+B,OAAON,KAAKL,cAAeU,SAASD,MAAK,SAASG,KAAMC,IAC9DjC,UAAUkC,YAAYT,KAAKjB,aAAcwB,KAAMC,GADnD,IAEGE,KAAKrC,aAAasC,UAPzB,IAQGD,KAAKrC,aAAasC,UACxB,EAGDnC,KAAKsB,UAAUf,aAAe,KAE9BP,KAAKsB,UAAUX,UAAY,KAE3BX,KAAKsB,UAAUV,OAAS,KAExBZ,KAAKsB,UAAUZ,QAAU,KAEzBV,KAAKsB,UAAUd,cAAgB,KAE/BR,KAAKsB,UAAUb,QAAU,KAEzBT,KAAKsB,UAAUP,YAAc,KAE7Bf,KAAKsB,UAAUN,MAAQ,KAEvBhB,KAAKsB,UAAUH,cAAgB,KAE/BnB,KAAKsB,UAAUT,cAAe,EAE2Bb,IAE5D"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/user_competency_plan_popup.min.js.map b/admin/tool/lp/amd/build/user_competency_plan_popup.min.js.map index 14958c5e65c..abb62f526e7 100644 --- a/admin/tool/lp/amd/build/user_competency_plan_popup.min.js.map +++ b/admin/tool/lp/amd/build/user_competency_plan_popup.min.js.map @@ -1 +1 @@ -{"version":3,"file":"user_competency_plan_popup.min.js","sources":["../src/user_competency_plan_popup.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 open user competency plan in popup\n *\n * @module tool_lp/user_competency_plan_popup\n * @copyright 2016 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/notification', 'core/str', 'core/ajax', 'core/templates', 'tool_lp/dialogue'],\n function($, notification, str, ajax, templates, Dialogue) {\n\n /**\n * UserCompetencyPopup\n *\n * @param {String} regionSelector The regionSelector\n * @param {String} userCompetencySelector The userCompetencySelector\n * @param {Number} planId The plan ID\n */\n var UserCompetencyPopup = function(regionSelector, userCompetencySelector, planId) {\n this._regionSelector = regionSelector;\n this._userCompetencySelector = userCompetencySelector;\n this._planId = planId;\n\n $(this._regionSelector).on('click', this._userCompetencySelector, this._handleClick.bind(this));\n };\n\n /**\n * Get the data from the closest TR and open the popup.\n *\n * @method _handleClick\n * @param {Event} e\n */\n UserCompetencyPopup.prototype._handleClick = function(e) {\n e.preventDefault();\n var tr = $(e.target).closest('tr');\n var competencyId = $(tr).data('competencyid');\n var userId = $(tr).data('userid');\n var planId = this._planId;\n\n var requests = ajax.call([{\n methodname: 'tool_lp_data_for_user_competency_summary_in_plan',\n args: {competencyid: competencyId, planid: planId},\n done: this._contextLoaded.bind(this),\n fail: notification.exception\n }]);\n // Log the user competency viewed in plan event.\n requests[0].then(function(result) {\n var eventMethodName = 'core_competency_user_competency_viewed_in_plan';\n // Trigger core_competency_user_competency_plan_viewed event instead if plan is already completed.\n if (result.plan.iscompleted) {\n eventMethodName = 'core_competency_user_competency_plan_viewed';\n }\n return ajax.call([{\n methodname: eventMethodName,\n args: {competencyid: competencyId, userid: userId, planid: planId}\n }])[0];\n }).catch(notification.exception);\n };\n\n /**\n * We loaded the context, now render the template.\n *\n * @method _contextLoaded\n * @param {Object} context\n */\n UserCompetencyPopup.prototype._contextLoaded = function(context) {\n var self = this;\n templates.render('tool_lp/user_competency_summary_in_plan', context).done(function(html, js) {\n str.get_string('usercompetencysummary', 'report_competency').done(function(title) {\n (new Dialogue(title, html, templates.runTemplateJS.bind(templates, js), self._refresh.bind(self), true));\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Refresh the page.\n *\n * @method _refresh\n */\n UserCompetencyPopup.prototype._refresh = function() {\n var planId = this._planId;\n\n ajax.call([{\n methodname: 'tool_lp_data_for_plan_page',\n args: {planid: planId},\n done: this._pageContextLoaded.bind(this),\n fail: notification.exception\n }]);\n };\n\n /**\n * We loaded the context, now render the template.\n *\n * @method _pageContextLoaded\n * @param {Object} context\n */\n UserCompetencyPopup.prototype._pageContextLoaded = function(context) {\n var self = this;\n templates.render('tool_lp/plan_page', context).done(function(html, js) {\n templates.replaceNode(self._regionSelector, html, js);\n }).fail(notification.exception);\n };\n\n /** @property {String} The selector for the region with the user competencies */\n UserCompetencyPopup.prototype._regionSelector = null;\n /** @property {String} The selector for the region with a single user competencies */\n UserCompetencyPopup.prototype._userCompetencySelector = null;\n /** @property {Number} The plan Id */\n UserCompetencyPopup.prototype._planId = null;\n\n return /** @alias module:tool_lp/user_competency_plan_popup */ UserCompetencyPopup;\n\n});\n"],"names":["define","$","notification","str","ajax","templates","Dialogue","UserCompetencyPopup","regionSelector","userCompetencySelector","planId","_regionSelector","_userCompetencySelector","_planId","this","on","_handleClick","bind","prototype","e","preventDefault","tr","target","closest","competencyId","data","userId","call","methodname","args","competencyid","planid","done","_contextLoaded","fail","exception","then","result","eventMethodName","plan","iscompleted","userid","catch","context","self","render","html","js","get_string","title","runTemplateJS","_refresh","_pageContextLoaded","replaceNode"],"mappings":";;;;;;;AAuBAA,4CAAO,CAAC,SAAU,oBAAqB,WAAY,YAAa,iBAAkB,qBAC3E,SAASC,EAAGC,aAAcC,IAAKC,KAAMC,UAAWC,cAS/CC,oBAAsB,SAASC,eAAgBC,uBAAwBC,aAClEC,gBAAkBH,oBAClBI,wBAA0BH,4BAC1BI,QAAUH,OAEfT,EAAEa,KAAKH,iBAAiBI,GAAG,QAASD,KAAKF,wBAAyBE,KAAKE,aAAaC,KAAKH,eAS7FP,oBAAoBW,UAAUF,aAAe,SAASG,GAClDA,EAAEC,qBACEC,GAAKpB,EAAEkB,EAAEG,QAAQC,QAAQ,MACzBC,aAAevB,EAAEoB,IAAII,KAAK,gBAC1BC,OAASzB,EAAEoB,IAAII,KAAK,UACpBf,OAASI,KAAKD,QAEHT,KAAKuB,KAAK,CAAC,CACtBC,WAAY,mDACZC,KAAM,CAACC,aAAcN,aAAcO,OAAQrB,QAC3CsB,KAAMlB,KAAKmB,eAAehB,KAAKH,MAC/BoB,KAAMhC,aAAaiC,aAGd,GAAGC,MAAK,SAASC,YAClBC,gBAAkB,wDAElBD,OAAOE,KAAKC,cACZF,gBAAkB,+CAEflC,KAAKuB,KAAK,CAAC,CACdC,WAAYU,gBACZT,KAAM,CAACC,aAAcN,aAAciB,OAAQf,OAAQK,OAAQrB,WAC3D,MACLgC,MAAMxC,aAAaiC,YAS1B5B,oBAAoBW,UAAUe,eAAiB,SAASU,aAChDC,KAAO9B,KACXT,UAAUwC,OAAO,0CAA2CF,SAASX,MAAK,SAASc,KAAMC,IACrF5C,IAAI6C,WAAW,wBAAyB,qBAAqBhB,MAAK,SAASiB,WAClE3C,SAAS2C,MAAOH,KAAMzC,UAAU6C,cAAcjC,KAAKZ,UAAW0C,IAAKH,KAAKO,SAASlC,KAAK2B,OAAO,MACnGV,KAAKhC,aAAaiC,cACtBD,KAAKhC,aAAaiC,YAQzB5B,oBAAoBW,UAAUiC,SAAW,eACjCzC,OAASI,KAAKD,QAElBT,KAAKuB,KAAK,CAAC,CACPC,WAAY,6BACZC,KAAM,CAACE,OAAQrB,QACfsB,KAAMlB,KAAKsC,mBAAmBnC,KAAKH,MACnCoB,KAAMhC,aAAaiC,cAU3B5B,oBAAoBW,UAAUkC,mBAAqB,SAAST,aACpDC,KAAO9B,KACXT,UAAUwC,OAAO,oBAAqBF,SAASX,MAAK,SAASc,KAAMC,IAC/D1C,UAAUgD,YAAYT,KAAKjC,gBAAiBmC,KAAMC,OACnDb,KAAKhC,aAAaiC,YAIzB5B,oBAAoBW,UAAUP,gBAAkB,KAEhDJ,oBAAoBW,UAAUN,wBAA0B,KAExDL,oBAAoBW,UAAUL,QAAU,KAEuBN"} \ No newline at end of file +{"version":3,"file":"user_competency_plan_popup.min.js","sources":["../src/user_competency_plan_popup.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 open user competency plan in popup\n *\n * @module tool_lp/user_competency_plan_popup\n * @copyright 2016 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/notification', 'core/str', 'core/ajax', 'core/templates', 'tool_lp/dialogue'],\n function($, notification, str, ajax, templates, Dialogue) {\n\n /**\n * UserCompetencyPopup\n *\n * @param {String} regionSelector The regionSelector\n * @param {String} userCompetencySelector The userCompetencySelector\n * @param {Number} planId The plan ID\n */\n var UserCompetencyPopup = function(regionSelector, userCompetencySelector, planId) {\n this._regionSelector = regionSelector;\n this._userCompetencySelector = userCompetencySelector;\n this._planId = planId;\n\n $(this._regionSelector).on('click', this._userCompetencySelector, this._handleClick.bind(this));\n };\n\n /**\n * Get the data from the closest TR and open the popup.\n *\n * @method _handleClick\n * @param {Event} e\n */\n UserCompetencyPopup.prototype._handleClick = function(e) {\n e.preventDefault();\n var tr = $(e.target).closest('tr');\n var competencyId = $(tr).data('competencyid');\n var userId = $(tr).data('userid');\n var planId = this._planId;\n\n var requests = ajax.call([{\n methodname: 'tool_lp_data_for_user_competency_summary_in_plan',\n args: {competencyid: competencyId, planid: planId},\n done: this._contextLoaded.bind(this),\n fail: notification.exception\n }]);\n // Log the user competency viewed in plan event.\n requests[0].then(function(result) {\n var eventMethodName = 'core_competency_user_competency_viewed_in_plan';\n // Trigger core_competency_user_competency_plan_viewed event instead if plan is already completed.\n if (result.plan.iscompleted) {\n eventMethodName = 'core_competency_user_competency_plan_viewed';\n }\n return ajax.call([{\n methodname: eventMethodName,\n args: {competencyid: competencyId, userid: userId, planid: planId}\n }])[0];\n }).catch(notification.exception);\n };\n\n /**\n * We loaded the context, now render the template.\n *\n * @method _contextLoaded\n * @param {Object} context\n */\n UserCompetencyPopup.prototype._contextLoaded = function(context) {\n var self = this;\n templates.render('tool_lp/user_competency_summary_in_plan', context).done(function(html, js) {\n str.get_string('usercompetencysummary', 'report_competency').done(function(title) {\n (new Dialogue(title, html, templates.runTemplateJS.bind(templates, js), self._refresh.bind(self), true));\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Refresh the page.\n *\n * @method _refresh\n */\n UserCompetencyPopup.prototype._refresh = function() {\n var planId = this._planId;\n\n ajax.call([{\n methodname: 'tool_lp_data_for_plan_page',\n args: {planid: planId},\n done: this._pageContextLoaded.bind(this),\n fail: notification.exception\n }]);\n };\n\n /**\n * We loaded the context, now render the template.\n *\n * @method _pageContextLoaded\n * @param {Object} context\n */\n UserCompetencyPopup.prototype._pageContextLoaded = function(context) {\n var self = this;\n templates.render('tool_lp/plan_page', context).done(function(html, js) {\n templates.replaceNode(self._regionSelector, html, js);\n }).fail(notification.exception);\n };\n\n /** @property {String} The selector for the region with the user competencies */\n UserCompetencyPopup.prototype._regionSelector = null;\n /** @property {String} The selector for the region with a single user competencies */\n UserCompetencyPopup.prototype._userCompetencySelector = null;\n /** @property {Number} The plan Id */\n UserCompetencyPopup.prototype._planId = null;\n\n return /** @alias module:tool_lp/user_competency_plan_popup */ UserCompetencyPopup;\n\n});\n"],"names":["define","$","notification","str","ajax","templates","Dialogue","UserCompetencyPopup","regionSelector","userCompetencySelector","planId","_regionSelector","_userCompetencySelector","_planId","this","on","_handleClick","bind","prototype","e","preventDefault","tr","target","closest","competencyId","data","userId","call","methodname","args","competencyid","planid","done","_contextLoaded","fail","exception","then","result","eventMethodName","plan","iscompleted","userid","catch","context","self","render","html","js","get_string","title","runTemplateJS","_refresh","_pageContextLoaded","replaceNode"],"mappings":";;;;;;;AAuBAA,OAAM,qCAAC,CAAC,SAAU,oBAAqB,WAAY,YAAa,iBAAkB,qBAC3E,SAASC,EAAGC,aAAcC,IAAKC,KAAMC,UAAWC,UAS/CC,IAAAA,oBAAsB,SAASC,eAAgBC,uBAAwBC,QAClEC,KAAAA,gBAAkBH,eAClBI,KAAAA,wBAA0BH,uBAC1BI,KAAAA,QAAUH,OAEfT,EAAEa,KAAKH,iBAAiBI,GAAG,QAASD,KAAKF,wBAAyBE,KAAKE,aAAaC,KAAKH,MAC5F,EAsFD,OA9EAP,oBAAoBW,UAAUF,aAAe,SAASG,GAClDA,EAAEC,iBACF,IAAIC,GAAKpB,EAAEkB,EAAEG,QAAQC,QAAQ,MACzBC,aAAevB,EAAEoB,IAAII,KAAK,gBAC1BC,OAASzB,EAAEoB,IAAII,KAAK,UACpBf,OAASI,KAAKD,QAEHT,KAAKuB,KAAK,CAAC,CACtBC,WAAY,mDACZC,KAAM,CAACC,aAAcN,aAAcO,OAAQrB,QAC3CsB,KAAMlB,KAAKmB,eAAehB,KAAKH,MAC/BoB,KAAMhC,aAAaiC,aAGd,GAAGC,MAAK,SAASC,QAClBC,IAAAA,gBAAkB,iDAKtB,OAHID,OAAOE,KAAKC,cACZF,gBAAkB,+CAEflC,KAAKuB,KAAK,CAAC,CACdC,WAAYU,gBACZT,KAAM,CAACC,aAAcN,aAAciB,OAAQf,OAAQK,OAAQrB,WAC3D,EATR,IAUGgC,MAAMxC,aAAaiC,UACzB,EAQD5B,oBAAoBW,UAAUe,eAAiB,SAASU,SAChDC,IAAAA,KAAO9B,KACXT,UAAUwC,OAAO,0CAA2CF,SAASX,MAAK,SAASc,KAAMC,IACrF5C,IAAI6C,WAAW,wBAAyB,qBAAqBhB,MAAK,SAASiB,OAClE3C,IAAAA,SAAS2C,MAAOH,KAAMzC,UAAU6C,cAAcjC,KAAKZ,UAAW0C,IAAKH,KAAKO,SAASlC,KAAK2B,OAAO,EADtG,IAEGV,KAAKhC,aAAaiC,UAHzB,IAIGD,KAAKhC,aAAaiC,UACxB,EAOD5B,oBAAoBW,UAAUiC,SAAW,WACjCzC,IAAAA,OAASI,KAAKD,QAElBT,KAAKuB,KAAK,CAAC,CACPC,WAAY,6BACZC,KAAM,CAACE,OAAQrB,QACfsB,KAAMlB,KAAKsC,mBAAmBnC,KAAKH,MACnCoB,KAAMhC,aAAaiC,YAE1B,EAQD5B,oBAAoBW,UAAUkC,mBAAqB,SAAST,SACpDC,IAAAA,KAAO9B,KACXT,UAAUwC,OAAO,oBAAqBF,SAASX,MAAK,SAASc,KAAMC,IAC/D1C,UAAUgD,YAAYT,KAAKjC,gBAAiBmC,KAAMC,GADtD,IAEGb,KAAKhC,aAAaiC,UACxB,EAGD5B,oBAAoBW,UAAUP,gBAAkB,KAEhDJ,oBAAoBW,UAAUN,wBAA0B,KAExDL,oBAAoBW,UAAUL,QAAU,KAEuBN,mBAElE"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/user_competency_workflow.min.js.map b/admin/tool/lp/amd/build/user_competency_workflow.min.js.map index 6828088a678..4e8ae3f3d20 100644 --- a/admin/tool/lp/amd/build/user_competency_workflow.min.js.map +++ b/admin/tool/lp/amd/build/user_competency_workflow.min.js.map @@ -1 +1 @@ -{"version":3,"file":"user_competency_workflow.min.js","sources":["../src/user_competency_workflow.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 * User competency workflow.\n *\n * @module tool_lp/user_competency_workflow\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/templates',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'tool_lp/menubar',\n 'tool_lp/event_base'],\n function($, Templates, Ajax, Notification, Str, Menubar, EventBase) {\n\n /**\n * UserCompetencyWorkflow class.\n */\n var UserCompetencyWorkflow = function() {\n EventBase.prototype.constructor.apply(this, []);\n };\n UserCompetencyWorkflow.prototype = Object.create(EventBase.prototype);\n\n /** @property {String} The selector to find the user competency data. */\n UserCompetencyWorkflow.prototype._nodeSelector = '[data-node=\"user-competency\"]';\n\n /**\n * Cancel a review request and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _cancelReviewRequest\n */\n UserCompetencyWorkflow.prototype._cancelReviewRequest = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_cancel_review_request',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n\n Ajax.call([call])[0].then(function() {\n this._trigger('review-request-cancelled', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Cancel a review request an refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method cancelReviewRequest\n */\n UserCompetencyWorkflow.prototype.cancelReviewRequest = function(data) {\n this._cancelReviewRequest(data);\n };\n\n /**\n * Cancel a review request handler.\n *\n * @param {Event} e The event.\n * @method _cancelReviewRequestHandler\n */\n UserCompetencyWorkflow.prototype._cancelReviewRequestHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.cancelReviewRequest(data);\n };\n\n /**\n * Request a review and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _requestReview\n */\n UserCompetencyWorkflow.prototype._requestReview = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_request_review',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n\n Ajax.call([call])[0].then(function() {\n this._trigger('review-requested', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Request a review.\n *\n * @param {Object} data The user competency data.\n * @method requestReview\n */\n UserCompetencyWorkflow.prototype.requestReview = function(data) {\n this._requestReview(data);\n };\n\n /**\n * Request a review handler.\n *\n * @param {Event} e The event.\n * @method _requestReviewHandler\n */\n UserCompetencyWorkflow.prototype._requestReviewHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.requestReview(data);\n };\n\n /**\n * Start a review and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _startReview\n */\n UserCompetencyWorkflow.prototype._startReview = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_start_review',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n Ajax.call([call])[0].then(function() {\n this._trigger('review-started', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Start a review.\n *\n * @param {Object} data The user competency data.\n * @method startReview\n */\n UserCompetencyWorkflow.prototype.startReview = function(data) {\n this._startReview(data);\n };\n\n /**\n * Start a review handler.\n *\n * @param {Event} e The event.\n * @method _startReviewHandler\n */\n UserCompetencyWorkflow.prototype._startReviewHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.startReview(data);\n };\n\n /**\n * Stop a review and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _stopReview\n */\n UserCompetencyWorkflow.prototype._stopReview = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_stop_review',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n\n Ajax.call([call])[0].then(function() {\n this._trigger('review-stopped', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Stop a review.\n *\n * @param {Object} data The user competency data.\n * @method stopReview\n */\n UserCompetencyWorkflow.prototype.stopReview = function(data) {\n this._stopReview(data);\n };\n\n /**\n * Stop a review handler.\n *\n * @param {Event} e The event.\n * @method _stopReviewHandler\n */\n UserCompetencyWorkflow.prototype._stopReviewHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.stopReview(data);\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n UserCompetencyWorkflow.prototype.enhanceMenubar = function(selector) {\n Menubar.enhance(selector, {\n '[data-action=\"request-review\"]': this._requestReviewHandler.bind(this),\n '[data-action=\"cancel-review-request\"]': this._cancelReviewRequestHandler.bind(this),\n });\n };\n\n /**\n * Find the user competency data from a node.\n *\n * @param {Node} node The node to search from.\n * @return {Object} User competency data.\n */\n UserCompetencyWorkflow.prototype._findUserCompetencyData = function(node) {\n var parent = node.parents(this._nodeSelector),\n data;\n\n if (parent.length != 1) {\n throw new Error('The evidence node was not located.');\n }\n\n data = parent.data();\n if (typeof data === 'undefined' || typeof data.userid === 'undefined' || typeof data.competencyid === 'undefined') {\n throw new Error('User competency data could not be found.');\n }\n\n return data;\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n UserCompetencyWorkflow.prototype.enhanceMenubar = function(selector) {\n Menubar.enhance(selector, {\n '[data-action=\"request-review\"]': this._requestReviewHandler.bind(this),\n '[data-action=\"cancel-review-request\"]': this._cancelReviewRequestHandler.bind(this),\n '[data-action=\"start-review\"]': this._startReviewHandler.bind(this),\n '[data-action=\"stop-review\"]': this._stopReviewHandler.bind(this),\n });\n };\n\n /**\n * Register the events in the region.\n *\n * @param {String} selector The base selector to search nodes in and attach events.\n */\n UserCompetencyWorkflow.prototype.registerEvents = function(selector) {\n var wrapper = $(selector);\n\n wrapper.find('[data-action=\"request-review\"]').click(this._requestReviewHandler.bind(this));\n wrapper.find('[data-action=\"cancel-review-request\"]').click(this._cancelReviewRequestHandler.bind(this));\n wrapper.find('[data-action=\"start-review\"]').click(this._startReviewHandler.bind(this));\n wrapper.find('[data-action=\"stop-review\"]').click(this._stopReviewHandler.bind(this));\n };\n\n return /** @alias module:tool_lp/user_competency_actions */ UserCompetencyWorkflow;\n});\n"],"names":["define","$","Templates","Ajax","Notification","Str","Menubar","EventBase","UserCompetencyWorkflow","prototype","constructor","apply","this","Object","create","_nodeSelector","_cancelReviewRequest","data","call","methodname","args","userid","competencyid","then","_trigger","bind","catch","cancelReviewRequest","_cancelReviewRequestHandler","e","preventDefault","_findUserCompetencyData","target","_requestReview","requestReview","_requestReviewHandler","_startReview","startReview","_startReviewHandler","_stopReview","stopReview","_stopReviewHandler","enhanceMenubar","selector","enhance","node","parent","parents","length","Error","registerEvents","wrapper","find","click"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"user_competency_workflow.min.js","sources":["../src/user_competency_workflow.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 * User competency workflow.\n *\n * @module tool_lp/user_competency_workflow\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/templates',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'tool_lp/menubar',\n 'tool_lp/event_base'],\n function($, Templates, Ajax, Notification, Str, Menubar, EventBase) {\n\n /**\n * UserCompetencyWorkflow class.\n */\n var UserCompetencyWorkflow = function() {\n EventBase.prototype.constructor.apply(this, []);\n };\n UserCompetencyWorkflow.prototype = Object.create(EventBase.prototype);\n\n /** @property {String} The selector to find the user competency data. */\n UserCompetencyWorkflow.prototype._nodeSelector = '[data-node=\"user-competency\"]';\n\n /**\n * Cancel a review request and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _cancelReviewRequest\n */\n UserCompetencyWorkflow.prototype._cancelReviewRequest = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_cancel_review_request',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n\n Ajax.call([call])[0].then(function() {\n this._trigger('review-request-cancelled', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Cancel a review request an refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method cancelReviewRequest\n */\n UserCompetencyWorkflow.prototype.cancelReviewRequest = function(data) {\n this._cancelReviewRequest(data);\n };\n\n /**\n * Cancel a review request handler.\n *\n * @param {Event} e The event.\n * @method _cancelReviewRequestHandler\n */\n UserCompetencyWorkflow.prototype._cancelReviewRequestHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.cancelReviewRequest(data);\n };\n\n /**\n * Request a review and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _requestReview\n */\n UserCompetencyWorkflow.prototype._requestReview = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_request_review',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n\n Ajax.call([call])[0].then(function() {\n this._trigger('review-requested', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Request a review.\n *\n * @param {Object} data The user competency data.\n * @method requestReview\n */\n UserCompetencyWorkflow.prototype.requestReview = function(data) {\n this._requestReview(data);\n };\n\n /**\n * Request a review handler.\n *\n * @param {Event} e The event.\n * @method _requestReviewHandler\n */\n UserCompetencyWorkflow.prototype._requestReviewHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.requestReview(data);\n };\n\n /**\n * Start a review and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _startReview\n */\n UserCompetencyWorkflow.prototype._startReview = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_start_review',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n Ajax.call([call])[0].then(function() {\n this._trigger('review-started', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Start a review.\n *\n * @param {Object} data The user competency data.\n * @method startReview\n */\n UserCompetencyWorkflow.prototype.startReview = function(data) {\n this._startReview(data);\n };\n\n /**\n * Start a review handler.\n *\n * @param {Event} e The event.\n * @method _startReviewHandler\n */\n UserCompetencyWorkflow.prototype._startReviewHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.startReview(data);\n };\n\n /**\n * Stop a review and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _stopReview\n */\n UserCompetencyWorkflow.prototype._stopReview = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_stop_review',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n\n Ajax.call([call])[0].then(function() {\n this._trigger('review-stopped', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Stop a review.\n *\n * @param {Object} data The user competency data.\n * @method stopReview\n */\n UserCompetencyWorkflow.prototype.stopReview = function(data) {\n this._stopReview(data);\n };\n\n /**\n * Stop a review handler.\n *\n * @param {Event} e The event.\n * @method _stopReviewHandler\n */\n UserCompetencyWorkflow.prototype._stopReviewHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.stopReview(data);\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n UserCompetencyWorkflow.prototype.enhanceMenubar = function(selector) {\n Menubar.enhance(selector, {\n '[data-action=\"request-review\"]': this._requestReviewHandler.bind(this),\n '[data-action=\"cancel-review-request\"]': this._cancelReviewRequestHandler.bind(this),\n });\n };\n\n /**\n * Find the user competency data from a node.\n *\n * @param {Node} node The node to search from.\n * @return {Object} User competency data.\n */\n UserCompetencyWorkflow.prototype._findUserCompetencyData = function(node) {\n var parent = node.parents(this._nodeSelector),\n data;\n\n if (parent.length != 1) {\n throw new Error('The evidence node was not located.');\n }\n\n data = parent.data();\n if (typeof data === 'undefined' || typeof data.userid === 'undefined' || typeof data.competencyid === 'undefined') {\n throw new Error('User competency data could not be found.');\n }\n\n return data;\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n UserCompetencyWorkflow.prototype.enhanceMenubar = function(selector) {\n Menubar.enhance(selector, {\n '[data-action=\"request-review\"]': this._requestReviewHandler.bind(this),\n '[data-action=\"cancel-review-request\"]': this._cancelReviewRequestHandler.bind(this),\n '[data-action=\"start-review\"]': this._startReviewHandler.bind(this),\n '[data-action=\"stop-review\"]': this._stopReviewHandler.bind(this),\n });\n };\n\n /**\n * Register the events in the region.\n *\n * @param {String} selector The base selector to search nodes in and attach events.\n */\n UserCompetencyWorkflow.prototype.registerEvents = function(selector) {\n var wrapper = $(selector);\n\n wrapper.find('[data-action=\"request-review\"]').click(this._requestReviewHandler.bind(this));\n wrapper.find('[data-action=\"cancel-review-request\"]').click(this._cancelReviewRequestHandler.bind(this));\n wrapper.find('[data-action=\"start-review\"]').click(this._startReviewHandler.bind(this));\n wrapper.find('[data-action=\"stop-review\"]').click(this._stopReviewHandler.bind(this));\n };\n\n return /** @alias module:tool_lp/user_competency_actions */ UserCompetencyWorkflow;\n});\n"],"names":["define","$","Templates","Ajax","Notification","Str","Menubar","EventBase","UserCompetencyWorkflow","prototype","constructor","apply","this","Object","create","_nodeSelector","_cancelReviewRequest","data","call","methodname","args","userid","competencyid","then","_trigger","bind","catch","cancelReviewRequest","_cancelReviewRequestHandler","e","preventDefault","_findUserCompetencyData","target","_requestReview","requestReview","_requestReviewHandler","_startReview","startReview","_startReviewHandler","_stopReview","stopReview","_stopReviewHandler","enhanceMenubar","selector","enhance","node","parent","parents","length","Error","registerEvents","wrapper","find","click"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/user_evidence_actions.min.js.map b/admin/tool/lp/amd/build/user_evidence_actions.min.js.map index 719e3f31120..a0289848ae7 100644 --- a/admin/tool/lp/amd/build/user_evidence_actions.min.js.map +++ b/admin/tool/lp/amd/build/user_evidence_actions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"user_evidence_actions.min.js","sources":["../src/user_evidence_actions.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 * User evidence actions.\n *\n * @module tool_lp/user_evidence_actions\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/templates',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'tool_lp/menubar',\n 'tool_lp/competencypicker_user_plans'],\n function($, templates, ajax, notification, str, Menubar, PickerUserPlans) {\n\n /**\n * UserEvidenceActions class.\n *\n * Note that presently this cannot be instantiated more than once per page.\n *\n * @param {String} type The type of page we're in.\n */\n var UserEvidenceActions = function(type) {\n this._type = type;\n\n if (type === 'evidence') {\n // This is the page to view one evidence.\n this._region = '[data-region=\"user-evidence-page\"]';\n this._evidenceNode = '[data-region=\"user-evidence-page\"]';\n this._template = 'tool_lp/user_evidence_page';\n this._contextMethod = 'tool_lp_data_for_user_evidence_page';\n\n } else if (type === 'list') {\n // This is the page to view a list of evidence.\n this._region = '[data-region=\"user-evidence-list\"]';\n this._evidenceNode = '[data-region=\"user-evidence-node\"]';\n this._template = 'tool_lp/user_evidence_list_page';\n this._contextMethod = 'tool_lp_data_for_user_evidence_list_page';\n\n } else {\n throw new TypeError('Unexpected type.');\n }\n };\n\n /** @property {String} Ajax method to fetch the page data from. */\n UserEvidenceActions.prototype._contextMethod = null;\n /** @property {String} Selector to find the node describing the evidence. */\n UserEvidenceActions.prototype._evidenceNode = null;\n /** @property {String} Selector mapping to the region to update. Usually similar to wrapper. */\n UserEvidenceActions.prototype._region = null;\n /** @property {String} Name of the template used to render the region. */\n UserEvidenceActions.prototype._template = null;\n /** @property {String} Type of page/region we're in. */\n UserEvidenceActions.prototype._type = null;\n\n /**\n * Resolve the arguments to refresh the region.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @return {Object} List of arguments.\n */\n UserEvidenceActions.prototype._getContextArgs = function(evidenceData) {\n var self = this,\n args = {};\n\n if (self._type === 'evidence') {\n args = {\n id: evidenceData.id\n };\n\n } else if (self._type === 'list') {\n args = {\n userid: evidenceData.userid\n };\n }\n\n return args;\n };\n\n /**\n * Callback to render the region template.\n *\n * @param {Object} context The context for the template.\n * @return {Promise}\n */\n UserEvidenceActions.prototype._renderView = function(context) {\n var self = this;\n return templates.render(self._template, context)\n .then(function(newhtml, newjs) {\n templates.replaceNode($(self._region), newhtml, newjs);\n return;\n });\n };\n\n /**\n * Call multiple ajax methods, and refresh.\n *\n * @param {Array} calls List of Ajax calls.\n * @param {Object} evidenceData Evidence data from evidence node.\n * @return {Promise}\n */\n UserEvidenceActions.prototype._callAndRefresh = function(calls, evidenceData) {\n var self = this;\n calls.push({\n methodname: self._contextMethod,\n args: self._getContextArgs(evidenceData)\n });\n\n // Apply all the promises, and refresh when the last one is resolved.\n return $.when.apply($.when, ajax.call(calls))\n .then(function() {\n return self._renderView(arguments[arguments.length - 1]);\n })\n .fail(notification.exception);\n };\n\n /**\n * Delete a plan and reload the region.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype._doDelete = function(evidenceData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_delete_user_evidence',\n args: {id: evidenceData.id}\n }];\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Delete a plan.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype.deleteEvidence = function(evidenceData) {\n var self = this,\n requests;\n\n requests = ajax.call([{\n methodname: 'core_competency_read_user_evidence',\n args: {id: evidenceData.id}\n }]);\n\n requests[0].done(function(evidence) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deleteuserevidence', component: 'tool_lp', param: evidence.name},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete evidence X?\n strings[2], // Delete.\n strings[3], // Cancel.\n function() {\n self._doDelete(evidenceData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Delete evidence handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._deleteEvidenceHandler = function(e) {\n e.preventDefault();\n var data = this._findEvidenceData($(e.target));\n this.deleteEvidence(data);\n };\n\n /**\n * Link a competency and reload.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @param {Number} competencyIds The competency IDs.\n */\n UserEvidenceActions.prototype._doCreateUserEvidenceCompetency = function(evidenceData, competencyIds) {\n var self = this,\n calls = [];\n\n $.each(competencyIds, function(index, competencyId) {\n calls.push({\n methodname: 'core_competency_create_user_evidence_competency',\n args: {\n userevidenceid: evidenceData.id,\n competencyid: competencyId,\n }\n });\n });\n\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Create a user evidence competency.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype.createUserEvidenceCompetency = function(evidenceData) {\n var self = this,\n picker = new PickerUserPlans(evidenceData.userid);\n\n picker.on('save', function(e, data) {\n var competencyIds = data.competencyIds;\n self._doCreateUserEvidenceCompetency(evidenceData, competencyIds, data.requestReview);\n });\n\n picker.display();\n };\n\n /**\n * Create user evidence competency handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._createUserEvidenceCompetencyHandler = function(e) {\n e.preventDefault();\n var data = this._findEvidenceData($(e.target));\n this.createUserEvidenceCompetency(data);\n };\n\n /**\n * Remove a linked competency and reload.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @param {Number} competencyId The competency ID.\n */\n UserEvidenceActions.prototype._doDeleteUserEvidenceCompetency = function(evidenceData, competencyId) {\n var self = this,\n calls = [];\n\n calls.push({\n methodname: 'core_competency_delete_user_evidence_competency',\n args: {\n userevidenceid: evidenceData.id,\n competencyid: competencyId,\n }\n });\n\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Delete a user evidence competency.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @param {Number} competencyId The competency ID.\n */\n UserEvidenceActions.prototype.deleteUserEvidenceCompetency = function(evidenceData, competencyId) {\n this._doDeleteUserEvidenceCompetency(evidenceData, competencyId);\n };\n\n /**\n * Delete user evidence competency handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._deleteUserEvidenceCompetencyHandler = function(e) {\n var data = this._findEvidenceData($(e.currentTarget)),\n competencyId = $(e.currentTarget).data('id');\n e.preventDefault();\n this.deleteUserEvidenceCompetency(data, competencyId);\n };\n\n /**\n * Send request review for user evidence competencies and reload the region.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype._doReviewUserEvidenceCompetencies = function(evidenceData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_request_review_of_user_evidence_linked_competencies',\n args: {id: evidenceData.id}\n }];\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Send request review for user evidence competencies.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype.reviewUserEvidenceCompetencies = function(evidenceData) {\n var self = this,\n requests;\n\n requests = ajax.call([{\n methodname: 'core_competency_read_user_evidence',\n args: {id: evidenceData.id}\n }]);\n\n requests[0].done(function(evidence) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'sendallcompetenciestoreview', component: 'tool_lp', param: evidence.name},\n {key: 'confirm', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Send all competencies in review for X?\n strings[2], // Confirm.\n strings[3], // Cancel.\n function() {\n self._doReviewUserEvidenceCompetencies(evidenceData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Send request review for user evidence competencies handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._reviewUserEvidenceCompetenciesHandler = function(e) {\n e.preventDefault();\n var data = this._findEvidenceData($(e.target));\n this.reviewUserEvidenceCompetencies(data);\n };\n\n /**\n * Find the evidence data from the evidence node.\n *\n * @param {Node} node The node to search from.\n * @return {Object} Evidence data.\n */\n UserEvidenceActions.prototype._findEvidenceData = function(node) {\n var parent = node.parentsUntil($(this._region).parent(), this._evidenceNode),\n data;\n\n if (parent.length != 1) {\n throw new Error('The evidence node was not located.');\n }\n\n data = parent.data();\n if (typeof data === 'undefined' || typeof data.id === 'undefined') {\n throw new Error('Evidence data could not be found.');\n }\n\n return data;\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n UserEvidenceActions.prototype.enhanceMenubar = function(selector) {\n var self = this;\n Menubar.enhance(selector, {\n '[data-action=\"user-evidence-delete\"]': self._deleteEvidenceHandler.bind(self),\n '[data-action=\"link-competency\"]': self._createUserEvidenceCompetencyHandler.bind(self),\n '[data-action=\"send-competencies-review\"]': self._reviewUserEvidenceCompetenciesHandler.bind(self),\n });\n };\n\n /**\n * Register the events in the region.\n *\n * At this stage this cannot be used with enhanceMenubar or multiple handlers\n * will be added to the same node.\n */\n UserEvidenceActions.prototype.registerEvents = function() {\n var wrapper = $(this._region),\n self = this;\n\n wrapper.find('[data-action=\"user-evidence-delete\"]').click(self._deleteEvidenceHandler.bind(self));\n wrapper.find('[data-action=\"link-competency\"]').click(self._createUserEvidenceCompetencyHandler.bind(self));\n wrapper.find('[data-action=\"delete-competency-link\"]').click(self._deleteUserEvidenceCompetencyHandler.bind(self));\n wrapper.find('[data-action=\"send-competencies-review\"]').click(self._reviewUserEvidenceCompetenciesHandler.bind(self));\n };\n\n return /** @alias module:tool_lp/user_evidence_actions */ UserEvidenceActions;\n});\n"],"names":["define","$","templates","ajax","notification","str","Menubar","PickerUserPlans","UserEvidenceActions","type","_type","_region","_evidenceNode","_template","_contextMethod","TypeError","prototype","_getContextArgs","evidenceData","args","this","id","userid","_renderView","context","self","render","then","newhtml","newjs","replaceNode","_callAndRefresh","calls","push","methodname","when","apply","call","arguments","length","fail","exception","_doDelete","deleteEvidence","done","evidence","get_strings","key","component","param","name","strings","confirm","_deleteEvidenceHandler","e","preventDefault","data","_findEvidenceData","target","_doCreateUserEvidenceCompetency","competencyIds","each","index","competencyId","userevidenceid","competencyid","createUserEvidenceCompetency","picker","on","requestReview","display","_createUserEvidenceCompetencyHandler","_doDeleteUserEvidenceCompetency","deleteUserEvidenceCompetency","_deleteUserEvidenceCompetencyHandler","currentTarget","_doReviewUserEvidenceCompetencies","reviewUserEvidenceCompetencies","_reviewUserEvidenceCompetenciesHandler","node","parent","parentsUntil","Error","enhanceMenubar","selector","enhance","bind","registerEvents","wrapper","find","click"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"user_evidence_actions.min.js","sources":["../src/user_evidence_actions.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 * User evidence actions.\n *\n * @module tool_lp/user_evidence_actions\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/templates',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'tool_lp/menubar',\n 'tool_lp/competencypicker_user_plans'],\n function($, templates, ajax, notification, str, Menubar, PickerUserPlans) {\n\n /**\n * UserEvidenceActions class.\n *\n * Note that presently this cannot be instantiated more than once per page.\n *\n * @param {String} type The type of page we're in.\n */\n var UserEvidenceActions = function(type) {\n this._type = type;\n\n if (type === 'evidence') {\n // This is the page to view one evidence.\n this._region = '[data-region=\"user-evidence-page\"]';\n this._evidenceNode = '[data-region=\"user-evidence-page\"]';\n this._template = 'tool_lp/user_evidence_page';\n this._contextMethod = 'tool_lp_data_for_user_evidence_page';\n\n } else if (type === 'list') {\n // This is the page to view a list of evidence.\n this._region = '[data-region=\"user-evidence-list\"]';\n this._evidenceNode = '[data-region=\"user-evidence-node\"]';\n this._template = 'tool_lp/user_evidence_list_page';\n this._contextMethod = 'tool_lp_data_for_user_evidence_list_page';\n\n } else {\n throw new TypeError('Unexpected type.');\n }\n };\n\n /** @property {String} Ajax method to fetch the page data from. */\n UserEvidenceActions.prototype._contextMethod = null;\n /** @property {String} Selector to find the node describing the evidence. */\n UserEvidenceActions.prototype._evidenceNode = null;\n /** @property {String} Selector mapping to the region to update. Usually similar to wrapper. */\n UserEvidenceActions.prototype._region = null;\n /** @property {String} Name of the template used to render the region. */\n UserEvidenceActions.prototype._template = null;\n /** @property {String} Type of page/region we're in. */\n UserEvidenceActions.prototype._type = null;\n\n /**\n * Resolve the arguments to refresh the region.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @return {Object} List of arguments.\n */\n UserEvidenceActions.prototype._getContextArgs = function(evidenceData) {\n var self = this,\n args = {};\n\n if (self._type === 'evidence') {\n args = {\n id: evidenceData.id\n };\n\n } else if (self._type === 'list') {\n args = {\n userid: evidenceData.userid\n };\n }\n\n return args;\n };\n\n /**\n * Callback to render the region template.\n *\n * @param {Object} context The context for the template.\n * @return {Promise}\n */\n UserEvidenceActions.prototype._renderView = function(context) {\n var self = this;\n return templates.render(self._template, context)\n .then(function(newhtml, newjs) {\n templates.replaceNode($(self._region), newhtml, newjs);\n return;\n });\n };\n\n /**\n * Call multiple ajax methods, and refresh.\n *\n * @param {Array} calls List of Ajax calls.\n * @param {Object} evidenceData Evidence data from evidence node.\n * @return {Promise}\n */\n UserEvidenceActions.prototype._callAndRefresh = function(calls, evidenceData) {\n var self = this;\n calls.push({\n methodname: self._contextMethod,\n args: self._getContextArgs(evidenceData)\n });\n\n // Apply all the promises, and refresh when the last one is resolved.\n return $.when.apply($.when, ajax.call(calls))\n .then(function() {\n return self._renderView(arguments[arguments.length - 1]);\n })\n .fail(notification.exception);\n };\n\n /**\n * Delete a plan and reload the region.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype._doDelete = function(evidenceData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_delete_user_evidence',\n args: {id: evidenceData.id}\n }];\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Delete a plan.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype.deleteEvidence = function(evidenceData) {\n var self = this,\n requests;\n\n requests = ajax.call([{\n methodname: 'core_competency_read_user_evidence',\n args: {id: evidenceData.id}\n }]);\n\n requests[0].done(function(evidence) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deleteuserevidence', component: 'tool_lp', param: evidence.name},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete evidence X?\n strings[2], // Delete.\n strings[3], // Cancel.\n function() {\n self._doDelete(evidenceData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Delete evidence handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._deleteEvidenceHandler = function(e) {\n e.preventDefault();\n var data = this._findEvidenceData($(e.target));\n this.deleteEvidence(data);\n };\n\n /**\n * Link a competency and reload.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @param {Number} competencyIds The competency IDs.\n */\n UserEvidenceActions.prototype._doCreateUserEvidenceCompetency = function(evidenceData, competencyIds) {\n var self = this,\n calls = [];\n\n $.each(competencyIds, function(index, competencyId) {\n calls.push({\n methodname: 'core_competency_create_user_evidence_competency',\n args: {\n userevidenceid: evidenceData.id,\n competencyid: competencyId,\n }\n });\n });\n\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Create a user evidence competency.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype.createUserEvidenceCompetency = function(evidenceData) {\n var self = this,\n picker = new PickerUserPlans(evidenceData.userid);\n\n picker.on('save', function(e, data) {\n var competencyIds = data.competencyIds;\n self._doCreateUserEvidenceCompetency(evidenceData, competencyIds, data.requestReview);\n });\n\n picker.display();\n };\n\n /**\n * Create user evidence competency handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._createUserEvidenceCompetencyHandler = function(e) {\n e.preventDefault();\n var data = this._findEvidenceData($(e.target));\n this.createUserEvidenceCompetency(data);\n };\n\n /**\n * Remove a linked competency and reload.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @param {Number} competencyId The competency ID.\n */\n UserEvidenceActions.prototype._doDeleteUserEvidenceCompetency = function(evidenceData, competencyId) {\n var self = this,\n calls = [];\n\n calls.push({\n methodname: 'core_competency_delete_user_evidence_competency',\n args: {\n userevidenceid: evidenceData.id,\n competencyid: competencyId,\n }\n });\n\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Delete a user evidence competency.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @param {Number} competencyId The competency ID.\n */\n UserEvidenceActions.prototype.deleteUserEvidenceCompetency = function(evidenceData, competencyId) {\n this._doDeleteUserEvidenceCompetency(evidenceData, competencyId);\n };\n\n /**\n * Delete user evidence competency handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._deleteUserEvidenceCompetencyHandler = function(e) {\n var data = this._findEvidenceData($(e.currentTarget)),\n competencyId = $(e.currentTarget).data('id');\n e.preventDefault();\n this.deleteUserEvidenceCompetency(data, competencyId);\n };\n\n /**\n * Send request review for user evidence competencies and reload the region.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype._doReviewUserEvidenceCompetencies = function(evidenceData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_request_review_of_user_evidence_linked_competencies',\n args: {id: evidenceData.id}\n }];\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Send request review for user evidence competencies.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype.reviewUserEvidenceCompetencies = function(evidenceData) {\n var self = this,\n requests;\n\n requests = ajax.call([{\n methodname: 'core_competency_read_user_evidence',\n args: {id: evidenceData.id}\n }]);\n\n requests[0].done(function(evidence) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'sendallcompetenciestoreview', component: 'tool_lp', param: evidence.name},\n {key: 'confirm', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Send all competencies in review for X?\n strings[2], // Confirm.\n strings[3], // Cancel.\n function() {\n self._doReviewUserEvidenceCompetencies(evidenceData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Send request review for user evidence competencies handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._reviewUserEvidenceCompetenciesHandler = function(e) {\n e.preventDefault();\n var data = this._findEvidenceData($(e.target));\n this.reviewUserEvidenceCompetencies(data);\n };\n\n /**\n * Find the evidence data from the evidence node.\n *\n * @param {Node} node The node to search from.\n * @return {Object} Evidence data.\n */\n UserEvidenceActions.prototype._findEvidenceData = function(node) {\n var parent = node.parentsUntil($(this._region).parent(), this._evidenceNode),\n data;\n\n if (parent.length != 1) {\n throw new Error('The evidence node was not located.');\n }\n\n data = parent.data();\n if (typeof data === 'undefined' || typeof data.id === 'undefined') {\n throw new Error('Evidence data could not be found.');\n }\n\n return data;\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n UserEvidenceActions.prototype.enhanceMenubar = function(selector) {\n var self = this;\n Menubar.enhance(selector, {\n '[data-action=\"user-evidence-delete\"]': self._deleteEvidenceHandler.bind(self),\n '[data-action=\"link-competency\"]': self._createUserEvidenceCompetencyHandler.bind(self),\n '[data-action=\"send-competencies-review\"]': self._reviewUserEvidenceCompetenciesHandler.bind(self),\n });\n };\n\n /**\n * Register the events in the region.\n *\n * At this stage this cannot be used with enhanceMenubar or multiple handlers\n * will be added to the same node.\n */\n UserEvidenceActions.prototype.registerEvents = function() {\n var wrapper = $(this._region),\n self = this;\n\n wrapper.find('[data-action=\"user-evidence-delete\"]').click(self._deleteEvidenceHandler.bind(self));\n wrapper.find('[data-action=\"link-competency\"]').click(self._createUserEvidenceCompetencyHandler.bind(self));\n wrapper.find('[data-action=\"delete-competency-link\"]').click(self._deleteUserEvidenceCompetencyHandler.bind(self));\n wrapper.find('[data-action=\"send-competencies-review\"]').click(self._reviewUserEvidenceCompetenciesHandler.bind(self));\n };\n\n return /** @alias module:tool_lp/user_evidence_actions */ UserEvidenceActions;\n});\n"],"names":["define","$","templates","ajax","notification","str","Menubar","PickerUserPlans","UserEvidenceActions","type","_type","_region","_evidenceNode","_template","_contextMethod","TypeError","prototype","_getContextArgs","evidenceData","self","args","this","id","userid","_renderView","context","render","then","newhtml","newjs","replaceNode","_callAndRefresh","calls","push","methodname","when","apply","call","arguments","length","fail","exception","_doDelete","deleteEvidence","done","evidence","get_strings","key","component","param","name","strings","confirm","_deleteEvidenceHandler","e","preventDefault","data","_findEvidenceData","target","_doCreateUserEvidenceCompetency","competencyIds","each","index","competencyId","userevidenceid","competencyid","createUserEvidenceCompetency","picker","on","requestReview","display","_createUserEvidenceCompetencyHandler","_doDeleteUserEvidenceCompetency","deleteUserEvidenceCompetency","_deleteUserEvidenceCompetencyHandler","currentTarget","_doReviewUserEvidenceCompetencies","reviewUserEvidenceCompetencies","_reviewUserEvidenceCompetenciesHandler","node","parent","parentsUntil","Error","enhanceMenubar","selector","enhance","bind","registerEvents","wrapper","find","click"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/moodlenet/amd/build/instance_form.min.js.map b/admin/tool/moodlenet/amd/build/instance_form.min.js.map index d346db6e229..944767f4289 100644 --- a/admin/tool/moodlenet/amd/build/instance_form.min.js.map +++ b/admin/tool/moodlenet/amd/build/instance_form.min.js.map @@ -1 +1 @@ -{"version":3,"file":"instance_form.min.js","sources":["../src/instance_form.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 * Our basic form manager for when a user either enters\n * their profile url or just wants to browse.\n *\n * This file is a mishmash of JS functions we need for both the standalone (M3.7, M3.8)\n * plugin & Moodle 3.9 functions. The 3.9 Functions have a base understanding that certain\n * things exist i.e. directory structures for templates. When this feature goes 3.9+ only\n * The goal is that we can quickly gut all AMD modules into bare JS files and use ES6 guidelines.\n * Till then this will have to do.\n *\n * @module tool_moodlenet/instance_form\n * @copyright 2020 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['tool_moodlenet/validator',\n 'tool_moodlenet/selectors',\n 'core/loadingicon',\n 'core/templates',\n 'core/notification',\n 'jquery'],\n function(Validator,\n Selectors,\n LoadingIcon,\n Templates,\n Notification,\n $) {\n\n /**\n * Add the event listeners to our form.\n *\n * @method registerListenerEvents\n * @param {HTMLElement} page The whole page element for our form area\n */\n var registerListenerEvents = function registerListenerEvents(page) {\n page.addEventListener('click', function(e) {\n\n // Our fake submit button / browse button.\n if (e.target.matches(Selectors.action.submit)) {\n var input = page.querySelector('[data-var=\"mnet-link\"]');\n var overlay = page.querySelector(Selectors.region.spinner);\n var validationArea = document.querySelector(Selectors.region.validationArea);\n\n overlay.classList.remove('d-none');\n var spinner = LoadingIcon.addIconToContainerWithPromise(overlay);\n Validator.validation(input)\n .then(function(result) {\n spinner.resolve();\n overlay.classList.add('d-none');\n if (result.result) {\n input.classList.remove('is-invalid'); // Just in case the class has been applied already.\n input.classList.add('is-valid');\n validationArea.innerText = result.message;\n validationArea.classList.remove('text-danger');\n validationArea.classList.add('text-success');\n // Give the user some time to see their input is valid.\n setTimeout(function() {\n window.location = result.domain;\n }, 1000);\n } else {\n input.classList.add('is-invalid');\n validationArea.innerText = result.message;\n validationArea.classList.add('text-danger');\n }\n return;\n }).catch();\n }\n });\n };\n\n /**\n * Given a user wishes to see the MoodleNet profile url form transition them there.\n *\n * @method chooserNavigateToMnet\n * @param {HTMLElement} showMoodleNet The chooser's area for ment\n * @param {Object} footerData Our footer object to render out\n * @param {jQuery} carousel Our carousel instance to manage\n * @param {jQuery} modal Our modal instance to manage\n */\n var chooserNavigateToMnet = function(showMoodleNet, footerData, carousel, modal) {\n showMoodleNet.innerHTML = '';\n\n // Add a spinner.\n var spinnerPromise = LoadingIcon.addIconToContainer(showMoodleNet);\n\n // Used later...\n var transitionPromiseResolver = null;\n var transitionPromise = new Promise(resolve => {\n transitionPromiseResolver = resolve;\n });\n\n $.when(\n spinnerPromise,\n transitionPromise\n ).then(function() {\n Templates.replaceNodeContents(showMoodleNet, footerData.customcarouseltemplate, '');\n return;\n }).catch(Notification.exception);\n\n // We apply our handlers in here to minimise plugin dependency in the Chooser.\n registerListenerEvents(showMoodleNet);\n\n // Move to the next slide, and resolve the transition promise when it's done.\n carousel.one('slid.bs.carousel', function() {\n transitionPromiseResolver();\n });\n // Trigger the transition between 'pages'.\n carousel.carousel(2);\n // eslint-disable-next-line max-len\n modal.setFooter(Templates.render('tool_moodlenet/chooser_footer_close_mnet', {}));\n };\n\n /**\n * Given a user no longer wishes to see the MoodleNet profile url form transition them from there.\n *\n * @method chooserNavigateFromMnet\n * @param {jQuery} carousel Our carousel instance to manage\n * @param {jQuery} modal Our modal instance to manage\n * @param {Object} footerData Our footer object to render out\n */\n var chooserNavigateFromMnet = function(carousel, modal, footerData) {\n // Trigger the transition between 'pages'.\n carousel.carousel(0);\n modal.setFooter(footerData.customfootertemplate);\n };\n\n /**\n * Create the custom listener that would handle anything in the footer.\n *\n * @param {Event} e The event being triggered.\n * @param {Object} footerData The data generated from the exporter.\n * @param {Object} modal The chooser modal.\n */\n var footerClickListener = function(e, footerData, modal) {\n if (e.target.matches(Selectors.action.showMoodleNet) || e.target.closest(Selectors.action.showMoodleNet)) {\n e.preventDefault();\n const carousel = $(modal.getBody()[0].querySelector(Selectors.region.carousel));\n const showMoodleNet = carousel.find(Selectors.region.moodleNet)[0];\n\n chooserNavigateToMnet(showMoodleNet, footerData, carousel, modal);\n }\n // From the help screen go back to the module overview.\n if (e.target.matches(Selectors.action.closeOption)) {\n const carousel = $(modal.getBody()[0].querySelector(Selectors.region.carousel));\n\n chooserNavigateFromMnet(carousel, modal, footerData);\n }\n };\n\n return {\n footerClickListener: footerClickListener\n };\n});\n"],"names":["define","Validator","Selectors","LoadingIcon","Templates","Notification","$","chooserNavigateToMnet","showMoodleNet","footerData","carousel","modal","innerHTML","page","spinnerPromise","addIconToContainer","transitionPromiseResolver","transitionPromise","Promise","resolve","when","then","replaceNodeContents","customcarouseltemplate","catch","exception","addEventListener","e","target","matches","action","submit","input","querySelector","overlay","region","spinner","validationArea","document","classList","remove","addIconToContainerWithPromise","validation","result","add","innerText","message","setTimeout","window","location","domain","one","setFooter","render","footerClickListener","closest","preventDefault","getBody","find","moodleNet","closeOption","customfootertemplate","chooserNavigateFromMnet"],"mappings":";;;;;;;;;;;;;;AA8BAA,sCAAO,CAAC,2BACA,2BACA,mBACA,iBACA,oBACA,WACJ,SAASC,UACAC,UACAC,YACAC,UACAC,aACAC,OAqDLC,sBAAwB,SAASC,cAAeC,WAAYC,SAAUC,OACtEH,cAAcI,UAAY,OA9C+BC,KAiDrDC,eAAiBX,YAAYY,mBAAmBP,eAGhDQ,0BAA4B,KAC5BC,kBAAoB,IAAIC,SAAQ,SAAAC,SAChCH,0BAA4BG,WAGhCb,EAAEc,KACEN,eACAG,mBACFI,MAAK,WACCjB,UAAUkB,oBAAoBd,cAAeC,WAAWc,uBAAwB,OAErFC,MAAMnB,aAAaoB,YA/DmCZ,KAkElCL,eAjElBkB,iBAAiB,SAAS,SAASC,MAGhCA,EAAEC,OAAOC,QAAQ3B,UAAU4B,OAAOC,QAAS,KACvCC,MAAQnB,KAAKoB,cAAc,0BAC3BC,QAAUrB,KAAKoB,cAAc/B,UAAUiC,OAAOC,SAC9CC,eAAiBC,SAASL,cAAc/B,UAAUiC,OAAOE,gBAE7DH,QAAQK,UAAUC,OAAO,cACrBJ,QAAUjC,YAAYsC,8BAA8BP,SACxDjC,UAAUyC,WAAWV,OAChBX,MAAK,SAASsB,QACXP,QAAQjB,UACRe,QAAQK,UAAUK,IAAI,UAClBD,OAAOA,QACPX,MAAMO,UAAUC,OAAO,cACvBR,MAAMO,UAAUK,IAAI,YACpBP,eAAeQ,UAAYF,OAAOG,QAClCT,eAAeE,UAAUC,OAAO,eAChCH,eAAeE,UAAUK,IAAI,gBAE7BG,YAAW,WACPC,OAAOC,SAAWN,OAAOO,SAC1B,OAEHlB,MAAMO,UAAUK,IAAI,cACpBP,eAAeQ,UAAYF,OAAOG,QAClCT,eAAeE,UAAUK,IAAI,mBAGtCpB,YAsCXd,SAASyC,IAAI,oBAAoB,WAC7BnC,+BAGJN,SAASA,SAAS,GAElBC,MAAMyC,UAAUhD,UAAUiD,OAAO,2CAA4C,YAwC1E,CACHC,oBAjBsB,SAAS3B,EAAGlB,WAAYE,UAC1CgB,EAAEC,OAAOC,QAAQ3B,UAAU4B,OAAOtB,gBAAkBmB,EAAEC,OAAO2B,QAAQrD,UAAU4B,OAAOtB,eAAgB,CACtGmB,EAAE6B,qBACI9C,SAAWJ,EAAEK,MAAM8C,UAAU,GAAGxB,cAAc/B,UAAUiC,OAAOzB,WAC/DF,cAAgBE,SAASgD,KAAKxD,UAAUiC,OAAOwB,WAAW,GAEhEpD,sBAAsBC,cAAeC,WAAYC,SAAUC,OAG3DgB,EAAEC,OAAOC,QAAQ3B,UAAU4B,OAAO8B,cAtBZ,SAASlD,SAAUC,MAAOF,YAEpDC,SAASA,SAAS,GAClBC,MAAMyC,UAAU3C,WAAWoD,sBAsBvBC,CAFiBxD,EAAEK,MAAM8C,UAAU,GAAGxB,cAAc/B,UAAUiC,OAAOzB,WAEnCC,MAAOF"} \ No newline at end of file +{"version":3,"file":"instance_form.min.js","sources":["../src/instance_form.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 * Our basic form manager for when a user either enters\n * their profile url or just wants to browse.\n *\n * This file is a mishmash of JS functions we need for both the standalone (M3.7, M3.8)\n * plugin & Moodle 3.9 functions. The 3.9 Functions have a base understanding that certain\n * things exist i.e. directory structures for templates. When this feature goes 3.9+ only\n * The goal is that we can quickly gut all AMD modules into bare JS files and use ES6 guidelines.\n * Till then this will have to do.\n *\n * @module tool_moodlenet/instance_form\n * @copyright 2020 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['tool_moodlenet/validator',\n 'tool_moodlenet/selectors',\n 'core/loadingicon',\n 'core/templates',\n 'core/notification',\n 'jquery'],\n function(Validator,\n Selectors,\n LoadingIcon,\n Templates,\n Notification,\n $) {\n\n /**\n * Add the event listeners to our form.\n *\n * @method registerListenerEvents\n * @param {HTMLElement} page The whole page element for our form area\n */\n var registerListenerEvents = function registerListenerEvents(page) {\n page.addEventListener('click', function(e) {\n\n // Our fake submit button / browse button.\n if (e.target.matches(Selectors.action.submit)) {\n var input = page.querySelector('[data-var=\"mnet-link\"]');\n var overlay = page.querySelector(Selectors.region.spinner);\n var validationArea = document.querySelector(Selectors.region.validationArea);\n\n overlay.classList.remove('d-none');\n var spinner = LoadingIcon.addIconToContainerWithPromise(overlay);\n Validator.validation(input)\n .then(function(result) {\n spinner.resolve();\n overlay.classList.add('d-none');\n if (result.result) {\n input.classList.remove('is-invalid'); // Just in case the class has been applied already.\n input.classList.add('is-valid');\n validationArea.innerText = result.message;\n validationArea.classList.remove('text-danger');\n validationArea.classList.add('text-success');\n // Give the user some time to see their input is valid.\n setTimeout(function() {\n window.location = result.domain;\n }, 1000);\n } else {\n input.classList.add('is-invalid');\n validationArea.innerText = result.message;\n validationArea.classList.add('text-danger');\n }\n return;\n }).catch();\n }\n });\n };\n\n /**\n * Given a user wishes to see the MoodleNet profile url form transition them there.\n *\n * @method chooserNavigateToMnet\n * @param {HTMLElement} showMoodleNet The chooser's area for ment\n * @param {Object} footerData Our footer object to render out\n * @param {jQuery} carousel Our carousel instance to manage\n * @param {jQuery} modal Our modal instance to manage\n */\n var chooserNavigateToMnet = function(showMoodleNet, footerData, carousel, modal) {\n showMoodleNet.innerHTML = '';\n\n // Add a spinner.\n var spinnerPromise = LoadingIcon.addIconToContainer(showMoodleNet);\n\n // Used later...\n var transitionPromiseResolver = null;\n var transitionPromise = new Promise(resolve => {\n transitionPromiseResolver = resolve;\n });\n\n $.when(\n spinnerPromise,\n transitionPromise\n ).then(function() {\n Templates.replaceNodeContents(showMoodleNet, footerData.customcarouseltemplate, '');\n return;\n }).catch(Notification.exception);\n\n // We apply our handlers in here to minimise plugin dependency in the Chooser.\n registerListenerEvents(showMoodleNet);\n\n // Move to the next slide, and resolve the transition promise when it's done.\n carousel.one('slid.bs.carousel', function() {\n transitionPromiseResolver();\n });\n // Trigger the transition between 'pages'.\n carousel.carousel(2);\n // eslint-disable-next-line max-len\n modal.setFooter(Templates.render('tool_moodlenet/chooser_footer_close_mnet', {}));\n };\n\n /**\n * Given a user no longer wishes to see the MoodleNet profile url form transition them from there.\n *\n * @method chooserNavigateFromMnet\n * @param {jQuery} carousel Our carousel instance to manage\n * @param {jQuery} modal Our modal instance to manage\n * @param {Object} footerData Our footer object to render out\n */\n var chooserNavigateFromMnet = function(carousel, modal, footerData) {\n // Trigger the transition between 'pages'.\n carousel.carousel(0);\n modal.setFooter(footerData.customfootertemplate);\n };\n\n /**\n * Create the custom listener that would handle anything in the footer.\n *\n * @param {Event} e The event being triggered.\n * @param {Object} footerData The data generated from the exporter.\n * @param {Object} modal The chooser modal.\n */\n var footerClickListener = function(e, footerData, modal) {\n if (e.target.matches(Selectors.action.showMoodleNet) || e.target.closest(Selectors.action.showMoodleNet)) {\n e.preventDefault();\n const carousel = $(modal.getBody()[0].querySelector(Selectors.region.carousel));\n const showMoodleNet = carousel.find(Selectors.region.moodleNet)[0];\n\n chooserNavigateToMnet(showMoodleNet, footerData, carousel, modal);\n }\n // From the help screen go back to the module overview.\n if (e.target.matches(Selectors.action.closeOption)) {\n const carousel = $(modal.getBody()[0].querySelector(Selectors.region.carousel));\n\n chooserNavigateFromMnet(carousel, modal, footerData);\n }\n };\n\n return {\n footerClickListener: footerClickListener\n };\n});\n"],"names":["define","Validator","Selectors","LoadingIcon","Templates","Notification","$","chooserNavigateToMnet","showMoodleNet","footerData","carousel","modal","innerHTML","page","spinnerPromise","addIconToContainer","transitionPromiseResolver","transitionPromise","Promise","resolve","when","then","replaceNodeContents","customcarouseltemplate","catch","exception","addEventListener","e","target","matches","action","submit","input","querySelector","overlay","region","spinner","validationArea","document","classList","remove","addIconToContainerWithPromise","validation","result","add","innerText","message","setTimeout","window","location","domain","one","setFooter","render","footerClickListener","closest","preventDefault","getBody","find","moodleNet","closeOption","customfootertemplate","chooserNavigateFromMnet"],"mappings":";;;;;;;;;;;;;;AA8BAA,OAAM,+BAAC,CAAC,2BACA,2BACA,mBACA,iBACA,oBACA,WACJ,SAASC,UACAC,UACAC,YACAC,UACAC,aACAC,GAQT,IA6CIC,sBAAwB,SAASC,cAAeC,WAAYC,SAAUC,OACtEH,cAAcI,UAAY,GAG1B,IAjDyDC,KAiDrDC,eAAiBX,YAAYY,mBAAmBP,eAGhDQ,0BAA4B,KAC5BC,kBAAoB,IAAIC,SAAQ,SAAAC,SAChCH,0BAA4BG,OAC/B,IAEDb,EAAEc,KACEN,eACAG,mBACFI,MAAK,WACCjB,UAAUkB,oBAAoBd,cAAeC,WAAWc,uBAAwB,GAJxF,IAMGC,MAAMnB,aAAaoB,YA/DmCZ,KAkElCL,eAjElBkB,iBAAiB,SAAS,SAASC,GAGpC,GAAIA,EAAEC,OAAOC,QAAQ3B,UAAU4B,OAAOC,QAAS,CAC3C,IAAIC,MAAQnB,KAAKoB,cAAc,0BAC3BC,QAAUrB,KAAKoB,cAAc/B,UAAUiC,OAAOC,SAC9CC,eAAiBC,SAASL,cAAc/B,UAAUiC,OAAOE,gBAE7DH,QAAQK,UAAUC,OAAO,UACzB,IAAIJ,QAAUjC,YAAYsC,8BAA8BP,SACxDjC,UAAUyC,WAAWV,OAChBX,MAAK,SAASsB,QACXP,QAAQjB,UACRe,QAAQK,UAAUK,IAAI,UAClBD,OAAOA,QACPX,MAAMO,UAAUC,OAAO,cACvBR,MAAMO,UAAUK,IAAI,YACpBP,eAAeQ,UAAYF,OAAOG,QAClCT,eAAeE,UAAUC,OAAO,eAChCH,eAAeE,UAAUK,IAAI,gBAE7BG,YAAW,WACPC,OAAOC,SAAWN,OAAOO,MADnB,GAEP,OAEHlB,MAAMO,UAAUK,IAAI,cACpBP,eAAeQ,UAAYF,OAAOG,QAClCT,eAAeE,UAAUK,IAAI,eAGxC,IAAEpB,OACN,CACJ,IAoCDd,SAASyC,IAAI,oBAAoB,WAC7BnC,2BACH,IAEDN,SAASA,SAAS,GAElBC,MAAMyC,UAAUhD,UAAUiD,OAAO,2CAA4C,CAA7D,GACnB,EAuCM,MAAA,CACHC,oBAjBsB,SAAS3B,EAAGlB,WAAYE,OAC1CgB,GAAAA,EAAEC,OAAOC,QAAQ3B,UAAU4B,OAAOtB,gBAAkBmB,EAAEC,OAAO2B,QAAQrD,UAAU4B,OAAOtB,eAAgB,CACtGmB,EAAE6B,iBACF,IAAM9C,SAAWJ,EAAEK,MAAM8C,UAAU,GAAGxB,cAAc/B,UAAUiC,OAAOzB,WAC/DF,cAAgBE,SAASgD,KAAKxD,UAAUiC,OAAOwB,WAAW,GAEhEpD,sBAAsBC,cAAeC,WAAYC,SAAUC,MAC9D,CAEGgB,EAAEC,OAAOC,QAAQ3B,UAAU4B,OAAO8B,cAtBZ,SAASlD,SAAUC,MAAOF,YAEpDC,SAASA,SAAS,GAClBC,MAAMyC,UAAU3C,WAAWoD,qBAC9B,CAqBOC,CAFiBxD,EAAEK,MAAM8C,UAAU,GAAGxB,cAAc/B,UAAUiC,OAAOzB,WAEnCC,MAAOF,WAEhD,EAKJ"} \ No newline at end of file diff --git a/admin/tool/moodlenet/amd/build/select_page.min.js b/admin/tool/moodlenet/amd/build/select_page.min.js index a74d396a408..10c8e9d9c92 100644 --- a/admin/tool/moodlenet/amd/build/select_page.min.js +++ b/admin/tool/moodlenet/amd/build/select_page.min.js @@ -5,6 +5,6 @@ * @copyright 2020 Mathew May * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -define("tool_moodlenet/select_page",["core/ajax","core/templates","tool_moodlenet/selectors","core/notification"],(function(Ajax,Templates,Selectors,Notification){var importId,searchCourses=function(inputValue,page,areaReplace){var searchIcon=page.querySelector(Selectors.region.searchIcon),clearIcon=page.querySelector(Selectors.region.clearIcon);""!==inputValue?(searchIcon.classList.add("d-none"),clearIcon.parentElement.classList.remove("d-none")):(searchIcon.classList.remove("d-none"),clearIcon.parentElement.classList.add("d-none"));var args={searchvalue:inputValue};Ajax.call([{methodname:"tool_moodlenet_search_courses",args:args}])[0].then((function(result){return 0===result.courses.length?function(areaReplace){return Templates.renderPix("courses","tool_moodlenet").then((function(img){return img})).then((function(img){var temp=document.createElement("div");return temp.innerHTML=img.trim(),Templates.render("core_course/no-courses",{nocoursesimg:temp.firstChild.src})})).then((function(html,js){Templates.replaceNodeContents(areaReplace,html,js),areaReplace.classList.add("mx-auto"),areaReplace.classList.add("w-25")}))}(areaReplace):(result.courses.forEach((function(course){course.viewurl+="&id="+importId})),function(areaReplace,courses){return Templates.render("tool_moodlenet/view-cards",{courses:courses}).then((function(html,js){Templates.replaceNodeContents(areaReplace,html,js),areaReplace.classList.remove("mx-auto"),areaReplace.classList.remove("w-25")}))}(areaReplace,result.courses))})).catch(Notification.exception)},registerListenerEvents=function(page){var input=page.querySelector(Selectors.region.searchInput),courseArea=page.querySelector(Selectors.region.courses);page.querySelector(Selectors.region.clearIcon).addEventListener("click",(function(){input.value="",searchCourses("",page,courseArea)})),input.addEventListener("input",debounce((function(){searchCourses(input.value,page,courseArea)}),300))},addCourses=function(page){var courseArea=page.querySelector(Selectors.region.courses);searchCourses("",page,courseArea)},debounce=function(func,wait,immediate){var timeout;return function(){var context=this,args=arguments,later=function(){timeout=null,immediate||func.apply(context,args)},callNow=immediate&&!timeout;clearTimeout(timeout),timeout=setTimeout(later,wait),callNow&&func.apply(context,args)}};return{init:function(importIdString){importId=importIdString;var page=document.querySelector(Selectors.region.selectPage);registerListenerEvents(page),addCourses(page)}}})); +define("tool_moodlenet/select_page",["core/ajax","core/templates","tool_moodlenet/selectors","core/notification"],(function(Ajax,Templates,Selectors,Notification){var importId,searchCourses=function(inputValue,page,areaReplace){var searchIcon=page.querySelector(Selectors.region.searchIcon),clearIcon=page.querySelector(Selectors.region.clearIcon);""!==inputValue?(searchIcon.classList.add("d-none"),clearIcon.parentElement.classList.remove("d-none")):(searchIcon.classList.remove("d-none"),clearIcon.parentElement.classList.add("d-none"));var args={searchvalue:inputValue};Ajax.call([{methodname:"tool_moodlenet_search_courses",args:args}])[0].then((function(result){return 0===result.courses.length?function(areaReplace){return Templates.renderPix("courses","tool_moodlenet").then((function(img){return img})).then((function(img){var temp=document.createElement("div");return temp.innerHTML=img.trim(),Templates.render("core_course/no-courses",{nocoursesimg:temp.firstChild.src})})).then((function(html,js){Templates.replaceNodeContents(areaReplace,html,js),areaReplace.classList.add("mx-auto"),areaReplace.classList.add("w-25")}))}(areaReplace):(result.courses.forEach((function(course){course.viewurl+="&id="+importId})),function(areaReplace,courses){return Templates.render("tool_moodlenet/view-cards",{courses:courses}).then((function(html,js){Templates.replaceNodeContents(areaReplace,html,js),areaReplace.classList.remove("mx-auto"),areaReplace.classList.remove("w-25")}))}(areaReplace,result.courses))})).catch(Notification.exception)},registerListenerEvents=function(page){var input=page.querySelector(Selectors.region.searchInput),courseArea=page.querySelector(Selectors.region.courses);page.querySelector(Selectors.region.clearIcon).addEventListener("click",(function(){input.value="",searchCourses("",page,courseArea)})),input.addEventListener("input",debounce((function(){searchCourses(input.value,page,courseArea)}),300))},addCourses=function(page){var courseArea=page.querySelector(Selectors.region.courses);searchCourses("",page,courseArea)},debounce=function(func,wait,immediate){var timeout;return function(){var context=this,args=arguments,callNow=immediate&&!timeout;clearTimeout(timeout),timeout=setTimeout((function(){timeout=null,immediate||func.apply(context,args)}),wait),callNow&&func.apply(context,args)}};return{init:function(importIdString){importId=importIdString;var page=document.querySelector(Selectors.region.selectPage);registerListenerEvents(page),addCourses(page)}}})); //# sourceMappingURL=select_page.min.js.map \ No newline at end of file diff --git a/admin/tool/moodlenet/amd/build/select_page.min.js.map b/admin/tool/moodlenet/amd/build/select_page.min.js.map index bc80e534253..a923bd72bbc 100644 --- a/admin/tool/moodlenet/amd/build/select_page.min.js.map +++ b/admin/tool/moodlenet/amd/build/select_page.min.js.map @@ -1 +1 @@ -{"version":3,"file":"select_page.min.js","sources":["../src/select_page.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 * When returning to Moodle let the user select which course to add the resource to.\n *\n * @module tool_moodlenet/select_page\n * @copyright 2020 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine([\n 'core/ajax',\n 'core/templates',\n 'tool_moodlenet/selectors',\n 'core/notification'\n], function(\n Ajax,\n Templates,\n Selectors,\n Notification\n) {\n /**\n * @var {string} The id corresponding to the import.\n */\n var importId;\n\n /**\n * Set up the page.\n *\n * @method init\n * @param {string} importIdString the string ID of the import.\n */\n var init = function(importIdString) {\n importId = importIdString;\n var page = document.querySelector(Selectors.region.selectPage);\n registerListenerEvents(page);\n addCourses(page);\n };\n\n /**\n * Renders the 'no-courses' template.\n *\n * @param {HTMLElement} areaReplace the DOM node to replace.\n * @returns {Promise}\n */\n var renderNoCourses = function(areaReplace) {\n return Templates.renderPix('courses', 'tool_moodlenet').then(function(img) {\n return img;\n }).then(function(img) {\n var temp = document.createElement('div');\n temp.innerHTML = img.trim();\n return Templates.render('core_course/no-courses', {\n nocoursesimg: temp.firstChild.src\n });\n }).then(function(html, js) {\n Templates.replaceNodeContents(areaReplace, html, js);\n areaReplace.classList.add('mx-auto');\n areaReplace.classList.add('w-25');\n return;\n });\n };\n\n /**\n * Render the course cards for those supplied courses.\n *\n * @param {HTMLElement} areaReplace the DOM node to replace.\n * @param {Array} courses the courses to render.\n * @returns {Promise}\n */\n var renderCourses = function(areaReplace, courses) {\n return Templates.render('tool_moodlenet/view-cards', {\n courses: courses\n }).then(function(html, js) {\n Templates.replaceNodeContents(areaReplace, html, js);\n areaReplace.classList.remove('mx-auto');\n areaReplace.classList.remove('w-25');\n return;\n });\n };\n\n /**\n * For a given input, the page & what to replace fetch courses and manage icons too.\n *\n * @method searchCourses\n * @param {string} inputValue What to search for\n * @param {HTMLElement} page The whole page element for our page\n * @param {HTMLElement} areaReplace The Element to replace the contents of\n */\n var searchCourses = function(inputValue, page, areaReplace) {\n var searchIcon = page.querySelector(Selectors.region.searchIcon);\n var clearIcon = page.querySelector(Selectors.region.clearIcon);\n\n if (inputValue !== '') {\n searchIcon.classList.add('d-none');\n clearIcon.parentElement.classList.remove('d-none');\n } else {\n searchIcon.classList.remove('d-none');\n clearIcon.parentElement.classList.add('d-none');\n }\n var args = {\n searchvalue: inputValue,\n };\n Ajax.call([{\n methodname: 'tool_moodlenet_search_courses',\n args: args\n }])[0].then(function(result) {\n if (result.courses.length === 0) {\n return renderNoCourses(areaReplace);\n } else {\n // Add the importId to the course link\n result.courses.forEach(function(course) {\n course.viewurl += '&id=' + importId;\n });\n return renderCourses(areaReplace, result.courses);\n }\n }).catch(Notification.exception);\n };\n\n /**\n * Add the event listeners to our page.\n *\n * @method registerListenerEvents\n * @param {HTMLElement} page The whole page element for our page\n */\n var registerListenerEvents = function(page) {\n var input = page.querySelector(Selectors.region.searchInput);\n var courseArea = page.querySelector(Selectors.region.courses);\n var clearIcon = page.querySelector(Selectors.region.clearIcon);\n clearIcon.addEventListener('click', function() {\n input.value = '';\n searchCourses('', page, courseArea);\n });\n\n input.addEventListener('input', debounce(function() {\n searchCourses(input.value, page, courseArea);\n }, 300));\n };\n\n /**\n * Fetch the courses to show the user. We use the same WS structure & template as the search for consistency.\n *\n * @method addCourses\n * @param {HTMLElement} page The whole page element for our course page\n */\n var addCourses = function(page) {\n var courseArea = page.querySelector(Selectors.region.courses);\n searchCourses('', page, courseArea);\n };\n\n /**\n * Define our own debounce function as Moodle 3.7 does not have it.\n *\n * @method debounce\n * @from underscore.js\n * @copyright 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * @licence MIT\n * @param {function} func The function we want to keep calling\n * @param {number} wait Our timeout\n * @param {boolean} immediate Do we want to apply the function immediately\n * @return {function}\n */\n var debounce = function(func, wait, immediate) {\n var timeout;\n return function() {\n var context = this;\n var args = arguments;\n var later = function() {\n timeout = null;\n if (!immediate) {\n func.apply(context, args);\n }\n };\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) {\n func.apply(context, args);\n }\n };\n };\n return {\n init: init,\n };\n});\n"],"names":["define","Ajax","Templates","Selectors","Notification","importId","searchCourses","inputValue","page","areaReplace","searchIcon","querySelector","region","clearIcon","classList","add","parentElement","remove","args","searchvalue","call","methodname","then","result","courses","length","renderPix","img","temp","document","createElement","innerHTML","trim","render","nocoursesimg","firstChild","src","html","js","replaceNodeContents","renderNoCourses","forEach","course","viewurl","renderCourses","catch","exception","registerListenerEvents","input","searchInput","courseArea","addEventListener","value","debounce","addCourses","func","wait","immediate","timeout","context","this","arguments","later","apply","callNow","clearTimeout","setTimeout","init","importIdString","selectPage"],"mappings":";;;;;;;AAuBAA,oCAAO,CACH,YACA,iBACA,2BACA,sBACD,SACCC,KACAC,UACAC,UACAC,kBAKIC,SAgEAC,cAAgB,SAASC,WAAYC,KAAMC,iBACvCC,WAAaF,KAAKG,cAAcR,UAAUS,OAAOF,YACjDG,UAAYL,KAAKG,cAAcR,UAAUS,OAAOC,WAEjC,KAAfN,YACAG,WAAWI,UAAUC,IAAI,UACzBF,UAAUG,cAAcF,UAAUG,OAAO,YAEzCP,WAAWI,UAAUG,OAAO,UAC5BJ,UAAUG,cAAcF,UAAUC,IAAI,eAEtCG,KAAO,CACPC,YAAaZ,YAEjBN,KAAKmB,KAAK,CAAC,CACPC,WAAY,gCACZH,KAAMA,QACN,GAAGI,MAAK,SAASC,eACa,IAA1BA,OAAOC,QAAQC,OA7DL,SAAShB,oBACpBP,UAAUwB,UAAU,UAAW,kBAAkBJ,MAAK,SAASK,YAC3DA,OACRL,MAAK,SAASK,SACTC,KAAOC,SAASC,cAAc,cAClCF,KAAKG,UAAYJ,IAAIK,OACd9B,UAAU+B,OAAO,yBAA0B,CAC9CC,aAAcN,KAAKO,WAAWC,SAEnCd,MAAK,SAASe,KAAMC,IACnBpC,UAAUqC,oBAAoB9B,YAAa4B,KAAMC,IACjD7B,YAAYK,UAAUC,IAAI,WAC1BN,YAAYK,UAAUC,IAAI,WAkDfyB,CAAgB/B,cAGvBc,OAAOC,QAAQiB,SAAQ,SAASC,QAC5BA,OAAOC,SAAW,OAAStC,YA1CvB,SAASI,YAAae,gBAC/BtB,UAAU+B,OAAO,4BAA6B,CACjDT,QAASA,UACVF,MAAK,SAASe,KAAMC,IACnBpC,UAAUqC,oBAAoB9B,YAAa4B,KAAMC,IACjD7B,YAAYK,UAAUG,OAAO,WAC7BR,YAAYK,UAAUG,OAAO,WAsClB2B,CAAcnC,YAAac,OAAOC,aAE9CqB,MAAMzC,aAAa0C,YAStBC,uBAAyB,SAASvC,UAC9BwC,MAAQxC,KAAKG,cAAcR,UAAUS,OAAOqC,aAC5CC,WAAa1C,KAAKG,cAAcR,UAAUS,OAAOY,SACrChB,KAAKG,cAAcR,UAAUS,OAAOC,WAC1CsC,iBAAiB,SAAS,WAChCH,MAAMI,MAAQ,GACd9C,cAAc,GAAIE,KAAM0C,eAG5BF,MAAMG,iBAAiB,QAASE,UAAS,WACrC/C,cAAc0C,MAAMI,MAAO5C,KAAM0C,cAClC,OASHI,WAAa,SAAS9C,UAClB0C,WAAa1C,KAAKG,cAAcR,UAAUS,OAAOY,SACrDlB,cAAc,GAAIE,KAAM0C,aAexBG,SAAW,SAASE,KAAMC,KAAMC,eAC5BC,eACG,eACCC,QAAUC,KACV1C,KAAO2C,UACPC,MAAQ,WACRJ,QAAU,KACLD,WACDF,KAAKQ,MAAMJ,QAASzC,OAGxB8C,QAAUP,YAAcC,QAC5BO,aAAaP,SACbA,QAAUQ,WAAWJ,MAAON,MACxBQ,SACAT,KAAKQ,MAAMJ,QAASzC,cAIzB,CACHiD,KArJO,SAASC,gBAChB/D,SAAW+D,mBACP5D,KAAOqB,SAASlB,cAAcR,UAAUS,OAAOyD,YACnDtB,uBAAuBvC,MACvB8C,WAAW9C"} \ No newline at end of file +{"version":3,"file":"select_page.min.js","sources":["../src/select_page.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 * When returning to Moodle let the user select which course to add the resource to.\n *\n * @module tool_moodlenet/select_page\n * @copyright 2020 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine([\n 'core/ajax',\n 'core/templates',\n 'tool_moodlenet/selectors',\n 'core/notification'\n], function(\n Ajax,\n Templates,\n Selectors,\n Notification\n) {\n /**\n * @var {string} The id corresponding to the import.\n */\n var importId;\n\n /**\n * Set up the page.\n *\n * @method init\n * @param {string} importIdString the string ID of the import.\n */\n var init = function(importIdString) {\n importId = importIdString;\n var page = document.querySelector(Selectors.region.selectPage);\n registerListenerEvents(page);\n addCourses(page);\n };\n\n /**\n * Renders the 'no-courses' template.\n *\n * @param {HTMLElement} areaReplace the DOM node to replace.\n * @returns {Promise}\n */\n var renderNoCourses = function(areaReplace) {\n return Templates.renderPix('courses', 'tool_moodlenet').then(function(img) {\n return img;\n }).then(function(img) {\n var temp = document.createElement('div');\n temp.innerHTML = img.trim();\n return Templates.render('core_course/no-courses', {\n nocoursesimg: temp.firstChild.src\n });\n }).then(function(html, js) {\n Templates.replaceNodeContents(areaReplace, html, js);\n areaReplace.classList.add('mx-auto');\n areaReplace.classList.add('w-25');\n return;\n });\n };\n\n /**\n * Render the course cards for those supplied courses.\n *\n * @param {HTMLElement} areaReplace the DOM node to replace.\n * @param {Array} courses the courses to render.\n * @returns {Promise}\n */\n var renderCourses = function(areaReplace, courses) {\n return Templates.render('tool_moodlenet/view-cards', {\n courses: courses\n }).then(function(html, js) {\n Templates.replaceNodeContents(areaReplace, html, js);\n areaReplace.classList.remove('mx-auto');\n areaReplace.classList.remove('w-25');\n return;\n });\n };\n\n /**\n * For a given input, the page & what to replace fetch courses and manage icons too.\n *\n * @method searchCourses\n * @param {string} inputValue What to search for\n * @param {HTMLElement} page The whole page element for our page\n * @param {HTMLElement} areaReplace The Element to replace the contents of\n */\n var searchCourses = function(inputValue, page, areaReplace) {\n var searchIcon = page.querySelector(Selectors.region.searchIcon);\n var clearIcon = page.querySelector(Selectors.region.clearIcon);\n\n if (inputValue !== '') {\n searchIcon.classList.add('d-none');\n clearIcon.parentElement.classList.remove('d-none');\n } else {\n searchIcon.classList.remove('d-none');\n clearIcon.parentElement.classList.add('d-none');\n }\n var args = {\n searchvalue: inputValue,\n };\n Ajax.call([{\n methodname: 'tool_moodlenet_search_courses',\n args: args\n }])[0].then(function(result) {\n if (result.courses.length === 0) {\n return renderNoCourses(areaReplace);\n } else {\n // Add the importId to the course link\n result.courses.forEach(function(course) {\n course.viewurl += '&id=' + importId;\n });\n return renderCourses(areaReplace, result.courses);\n }\n }).catch(Notification.exception);\n };\n\n /**\n * Add the event listeners to our page.\n *\n * @method registerListenerEvents\n * @param {HTMLElement} page The whole page element for our page\n */\n var registerListenerEvents = function(page) {\n var input = page.querySelector(Selectors.region.searchInput);\n var courseArea = page.querySelector(Selectors.region.courses);\n var clearIcon = page.querySelector(Selectors.region.clearIcon);\n clearIcon.addEventListener('click', function() {\n input.value = '';\n searchCourses('', page, courseArea);\n });\n\n input.addEventListener('input', debounce(function() {\n searchCourses(input.value, page, courseArea);\n }, 300));\n };\n\n /**\n * Fetch the courses to show the user. We use the same WS structure & template as the search for consistency.\n *\n * @method addCourses\n * @param {HTMLElement} page The whole page element for our course page\n */\n var addCourses = function(page) {\n var courseArea = page.querySelector(Selectors.region.courses);\n searchCourses('', page, courseArea);\n };\n\n /**\n * Define our own debounce function as Moodle 3.7 does not have it.\n *\n * @method debounce\n * @from underscore.js\n * @copyright 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * @licence MIT\n * @param {function} func The function we want to keep calling\n * @param {number} wait Our timeout\n * @param {boolean} immediate Do we want to apply the function immediately\n * @return {function}\n */\n var debounce = function(func, wait, immediate) {\n var timeout;\n return function() {\n var context = this;\n var args = arguments;\n var later = function() {\n timeout = null;\n if (!immediate) {\n func.apply(context, args);\n }\n };\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) {\n func.apply(context, args);\n }\n };\n };\n return {\n init: init,\n };\n});\n"],"names":["define","Ajax","Templates","Selectors","Notification","importId","searchCourses","inputValue","page","areaReplace","searchIcon","querySelector","region","clearIcon","classList","add","parentElement","remove","args","searchvalue","call","methodname","then","result","courses","length","renderPix","img","temp","document","createElement","innerHTML","trim","render","nocoursesimg","firstChild","src","html","js","replaceNodeContents","renderNoCourses","forEach","course","viewurl","renderCourses","catch","exception","registerListenerEvents","input","searchInput","courseArea","addEventListener","value","debounce","addCourses","func","wait","immediate","timeout","context","this","arguments","callNow","clearTimeout","setTimeout","apply","init","importIdString","selectPage"],"mappings":";;;;;;;AAuBAA,oCAAO,CACH,YACA,iBACA,2BACA,sBACD,SACCC,KACAC,UACAC,UACAC,cAKA,IAAIC,SAgEAC,cAAgB,SAASC,WAAYC,KAAMC,aACvCC,IAAAA,WAAaF,KAAKG,cAAcR,UAAUS,OAAOF,YACjDG,UAAYL,KAAKG,cAAcR,UAAUS,OAAOC,WAEjC,KAAfN,YACAG,WAAWI,UAAUC,IAAI,UACzBF,UAAUG,cAAcF,UAAUG,OAAO,YAEzCP,WAAWI,UAAUG,OAAO,UAC5BJ,UAAUG,cAAcF,UAAUC,IAAI,WAE1C,IAAIG,KAAO,CACPC,YAAaZ,YAEjBN,KAAKmB,KAAK,CAAC,CACPC,WAAY,gCACZH,KAAMA,QACN,GAAGI,MAAK,SAASC,QACjB,OAA8B,IAA1BA,OAAOC,QAAQC,OA7DL,SAAShB,aAC3B,OAAOP,UAAUwB,UAAU,UAAW,kBAAkBJ,MAAK,SAASK,KAClE,OAAOA,GACV,IAAEL,MAAK,SAASK,KACb,IAAIC,KAAOC,SAASC,cAAc,OAElC,OADAF,KAAKG,UAAYJ,IAAIK,OACd9B,UAAU+B,OAAO,yBAA0B,CAC9CC,aAAcN,KAAKO,WAAWC,KAN/B,IAQJd,MAAK,SAASe,KAAMC,IACnBpC,UAAUqC,oBAAoB9B,YAAa4B,KAAMC,IACjD7B,YAAYK,UAAUC,IAAI,WAC1BN,YAAYK,UAAUC,IAAI,OAE7B,GACJ,CA+CkByB,CAAgB/B,cAGvBc,OAAOC,QAAQiB,SAAQ,SAASC,QAC5BA,OAAOC,SAAW,OAAStC,QAC9B,IA3CO,SAASI,YAAae,SACtC,OAAOtB,UAAU+B,OAAO,4BAA6B,CACjDT,QAASA,UACVF,MAAK,SAASe,KAAMC,IACnBpC,UAAUqC,oBAAoB9B,YAAa4B,KAAMC,IACjD7B,YAAYK,UAAUG,OAAO,WAC7BR,YAAYK,UAAUG,OAAO,OAEhC,GACJ,CAmCkB2B,CAAcnC,YAAac,OAAOC,SAXjD,IAaGqB,MAAMzC,aAAa0C,UACzB,EAQGC,uBAAyB,SAASvC,MAC9BwC,IAAAA,MAAQxC,KAAKG,cAAcR,UAAUS,OAAOqC,aAC5CC,WAAa1C,KAAKG,cAAcR,UAAUS,OAAOY,SACrChB,KAAKG,cAAcR,UAAUS,OAAOC,WAC1CsC,iBAAiB,SAAS,WAChCH,MAAMI,MAAQ,GACd9C,cAAc,GAAIE,KAAM0C,WAC3B,IAEDF,MAAMG,iBAAiB,QAASE,UAAS,WACrC/C,cAAc0C,MAAMI,MAAO5C,KAAM0C,WACpC,GAAE,KACN,EAQGI,WAAa,SAAS9C,MAClB0C,IAAAA,WAAa1C,KAAKG,cAAcR,UAAUS,OAAOY,SACrDlB,cAAc,GAAIE,KAAM0C,WAC3B,EAcGG,SAAW,SAASE,KAAMC,KAAMC,WAChC,IAAIC,QACJ,OAAO,WACCC,IAAAA,QAAUC,KACV1C,KAAO2C,UAOPC,QAAUL,YAAcC,QAC5BK,aAAaL,SACbA,QAAUM,YARE,WACRN,QAAU,KACLD,WACDF,KAAKU,MAAMN,QAASzC,KAE3B,GAG2BsC,MACxBM,SACAP,KAAKU,MAAMN,QAASzC,KAE3B,CACJ,EACM,MAAA,CACHgD,KArJO,SAASC,gBAChB9D,SAAW8D,eACP3D,IAAAA,KAAOqB,SAASlB,cAAcR,UAAUS,OAAOwD,YACnDrB,uBAAuBvC,MACvB8C,WAAW9C,KACd,EAkJJ"} \ No newline at end of file diff --git a/admin/tool/moodlenet/amd/build/selectors.min.js.map b/admin/tool/moodlenet/amd/build/selectors.min.js.map index 4adbf8d872f..298a4c2b24f 100644 --- a/admin/tool/moodlenet/amd/build/selectors.min.js.map +++ b/admin/tool/moodlenet/amd/build/selectors.min.js.map @@ -1 +1 @@ -{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 * Define all of the selectors we will be using within MoodleNet plugin.\n *\n * @module tool_moodlenet/selectors\n * @copyright 2020 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n action: {\n browse: '[data-action=\"browse\"]',\n submit: '[data-action=\"submit\"]',\n showMoodleNet: '[data-action=\"show-moodlenet\"]',\n closeOption: '[data-action=\"close-chooser-option-summary\"]',\n },\n region: {\n clearIcon: '[data-region=\"clear-icon\"]',\n courses: '[data-region=\"mnet-courses\"]',\n instancePage: '[data-region=\"moodle-net\"]',\n searchInput: '[data-region=\"search-input\"]',\n searchIcon: '[data-region=\"search-icon\"]',\n selectPage: '[data-region=\"moodle-net-select\"]',\n spinner: '[data-region=\"spinner\"]',\n validationArea: '[data-region=\"validation-area\"]',\n carousel: '[data-region=\"carousel\"]',\n moodleNet: '[data-region=\"pluginCarousel\"]',\n },\n };\n});\n"],"names":["define","action","browse","submit","showMoodleNet","closeOption","region","clearIcon","courses","instancePage","searchInput","searchIcon","selectPage","spinner","validationArea","carousel","moodleNet"],"mappings":";;;;;;;AAsBAA,kCAAO,IAAI,iBACA,CACHC,OAAQ,CACJC,OAAQ,yBACRC,OAAQ,yBACRC,cAAe,iCACfC,YAAa,gDAEjBC,OAAQ,CACJC,UAAW,6BACXC,QAAS,+BACTC,aAAc,6BACdC,YAAa,+BACbC,WAAY,8BACZC,WAAY,oCACZC,QAAS,0BACTC,eAAgB,kCAChBC,SAAU,2BACVC,UAAW"} \ No newline at end of file +{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 * Define all of the selectors we will be using within MoodleNet plugin.\n *\n * @module tool_moodlenet/selectors\n * @copyright 2020 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n action: {\n browse: '[data-action=\"browse\"]',\n submit: '[data-action=\"submit\"]',\n showMoodleNet: '[data-action=\"show-moodlenet\"]',\n closeOption: '[data-action=\"close-chooser-option-summary\"]',\n },\n region: {\n clearIcon: '[data-region=\"clear-icon\"]',\n courses: '[data-region=\"mnet-courses\"]',\n instancePage: '[data-region=\"moodle-net\"]',\n searchInput: '[data-region=\"search-input\"]',\n searchIcon: '[data-region=\"search-icon\"]',\n selectPage: '[data-region=\"moodle-net-select\"]',\n spinner: '[data-region=\"spinner\"]',\n validationArea: '[data-region=\"validation-area\"]',\n carousel: '[data-region=\"carousel\"]',\n moodleNet: '[data-region=\"pluginCarousel\"]',\n },\n };\n});\n"],"names":["define","action","browse","submit","showMoodleNet","closeOption","region","clearIcon","courses","instancePage","searchInput","searchIcon","selectPage","spinner","validationArea","carousel","moodleNet"],"mappings":";;;;;;;AAsBAA,OAAM,2BAAC,IAAI,WACA,MAAA,CACHC,OAAQ,CACJC,OAAQ,yBACRC,OAAQ,yBACRC,cAAe,iCACfC,YAAa,gDAEjBC,OAAQ,CACJC,UAAW,6BACXC,QAAS,+BACTC,aAAc,6BACdC,YAAa,+BACbC,WAAY,8BACZC,WAAY,oCACZC,QAAS,0BACTC,eAAgB,kCAChBC,SAAU,2BACVC,UAAW,kCAGtB"} \ No newline at end of file diff --git a/admin/tool/moodlenet/amd/build/validator.min.js.map b/admin/tool/moodlenet/amd/build/validator.min.js.map index 7d0a9ae7781..8b202a4bb50 100644 --- a/admin/tool/moodlenet/amd/build/validator.min.js.map +++ b/admin/tool/moodlenet/amd/build/validator.min.js.map @@ -1 +1 @@ -{"version":3,"file":"validator.min.js","sources":["../src/validator.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 * Our validator that splits the user's input then fires off to a webservice\n *\n * @module tool_moodlenet/validator\n * @copyright 2020 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/str', 'core/notification'], function($, Ajax, Str, Notification) {\n /**\n * Handle form validation\n *\n * @method validation\n * @param {HTMLElement} inputElement The element the user entered text into.\n * @return {Promise} Was the users' entry a valid profile URL?\n */\n var validation = function validation(inputElement) {\n var inputValue = inputElement.value;\n\n // They didn't submit anything or they gave us a simple string that we can't do anything with.\n if (inputValue === \"\" || !inputValue.includes(\"@\")) {\n // Create a promise and immediately reject it.\n $.when(Str.get_string('profilevalidationerror', 'tool_moodlenet')).then(function(strings) {\n return Promise.reject().catch(function() {\n return {result: false, message: strings[0]};\n });\n }).fail(Notification.exception);\n }\n\n return Ajax.call([{\n methodname: 'tool_moodlenet_verify_webfinger',\n args: {\n profileurl: inputValue,\n course: inputElement.dataset.courseid,\n section: inputElement.dataset.sectionid\n }\n }])[0].then(function(result) {\n return result;\n }).catch();\n };\n return {\n validation: validation,\n };\n});\n"],"names":["define","$","Ajax","Str","Notification","validation","inputElement","inputValue","value","includes","when","get_string","then","strings","Promise","reject","catch","result","message","fail","exception","call","methodname","args","profileurl","course","dataset","courseid","section","sectionid"],"mappings":";;;;;;;AAsBAA,kCAAO,CAAC,SAAU,YAAa,WAAY,sBAAsB,SAASC,EAAGC,KAAMC,IAAKC,oBAgC7E,CACHC,WAzBa,SAAoBC,kBAC7BC,WAAaD,aAAaE,YAGX,KAAfD,YAAsBA,WAAWE,SAAS,MAE1CR,EAAES,KAAKP,IAAIQ,WAAW,yBAA0B,mBAAmBC,MAAK,SAASC,gBACtEC,QAAQC,SAASC,OAAM,iBACnB,CAACC,QAAQ,EAAOC,QAASL,QAAQ,UAE7CM,KAAKf,aAAagB,WAGlBlB,KAAKmB,KAAK,CAAC,CACdC,WAAY,kCACZC,KAAM,CACFC,WAAYjB,WACZkB,OAAQnB,aAAaoB,QAAQC,SAC7BC,QAAStB,aAAaoB,QAAQG,cAElC,GAAGjB,MAAK,SAASK,eACVA,UACRD"} \ No newline at end of file +{"version":3,"file":"validator.min.js","sources":["../src/validator.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 * Our validator that splits the user's input then fires off to a webservice\n *\n * @module tool_moodlenet/validator\n * @copyright 2020 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/str', 'core/notification'], function($, Ajax, Str, Notification) {\n /**\n * Handle form validation\n *\n * @method validation\n * @param {HTMLElement} inputElement The element the user entered text into.\n * @return {Promise} Was the users' entry a valid profile URL?\n */\n var validation = function validation(inputElement) {\n var inputValue = inputElement.value;\n\n // They didn't submit anything or they gave us a simple string that we can't do anything with.\n if (inputValue === \"\" || !inputValue.includes(\"@\")) {\n // Create a promise and immediately reject it.\n $.when(Str.get_string('profilevalidationerror', 'tool_moodlenet')).then(function(strings) {\n return Promise.reject().catch(function() {\n return {result: false, message: strings[0]};\n });\n }).fail(Notification.exception);\n }\n\n return Ajax.call([{\n methodname: 'tool_moodlenet_verify_webfinger',\n args: {\n profileurl: inputValue,\n course: inputElement.dataset.courseid,\n section: inputElement.dataset.sectionid\n }\n }])[0].then(function(result) {\n return result;\n }).catch();\n };\n return {\n validation: validation,\n };\n});\n"],"names":["define","$","Ajax","Str","Notification","validation","inputElement","inputValue","value","includes","when","get_string","then","strings","Promise","reject","catch","result","message","fail","exception","call","methodname","args","profileurl","course","dataset","courseid","section","sectionid"],"mappings":";;;;;;;AAsBAA,kCAAO,CAAC,SAAU,YAAa,WAAY,sBAAsB,SAASC,EAAGC,KAAMC,IAAKC,cAgC7E,MAAA,CACHC,WAzBa,SAAoBC,cACjC,IAAIC,WAAaD,aAAaE,MAY9B,MATmB,KAAfD,YAAsBA,WAAWE,SAAS,MAE1CR,EAAES,KAAKP,IAAIQ,WAAW,yBAA0B,mBAAmBC,MAAK,SAASC,SAC7E,OAAOC,QAAQC,SAASC,OAAM,WACnB,MAAA,CAACC,QAAQ,EAAOC,QAASL,QAAQ,GAC3C,GAHL,IAIGM,KAAKf,aAAagB,WAGlBlB,KAAKmB,KAAK,CAAC,CACdC,WAAY,kCACZC,KAAM,CACFC,WAAYjB,WACZkB,OAAQnB,aAAaoB,QAAQC,SAC7BC,QAAStB,aAAaoB,QAAQG,cAElC,GAAGjB,MAAK,SAASK,QACjB,OAAOA,MACV,IAAED,OACN,EAIJ"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/acceptances_filter.min.js.map b/admin/tool/policy/amd/build/acceptances_filter.min.js.map index 360aa9aa9b6..ce8d9ac1ca4 100644 --- a/admin/tool/policy/amd/build/acceptances_filter.min.js.map +++ b/admin/tool/policy/amd/build/acceptances_filter.min.js.map @@ -1 +1 @@ -{"version":3,"file":"acceptances_filter.min.js","sources":["../src/acceptances_filter.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 * Unified filter page JS module for the course participants page.\n *\n * @module tool_policy/acceptances_filter\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/form-autocomplete', 'core/str', 'core/notification'],\n function($, Autocomplete, Str, Notification) {\n\n /**\n * Selectors.\n *\n * @access private\n * @type {{UNIFIED_FILTERS: string}}\n */\n var SELECTORS = {\n UNIFIED_FILTERS: '#unified-filters'\n };\n\n /**\n * Init function.\n *\n * @method init\n * @private\n */\n var init = function() {\n var stringkeys = [{\n key: 'filterplaceholder',\n component: 'tool_policy'\n }, {\n key: 'nofiltersapplied',\n component: 'tool_policy'\n }];\n\n M.util.js_pending('acceptances_filter_datasource');\n Str.get_strings(stringkeys).done(function(langstrings) {\n var placeholder = langstrings[0];\n var noSelectionString = langstrings[1];\n Autocomplete.enhance(SELECTORS.UNIFIED_FILTERS, true, 'tool_policy/acceptances_filter_datasource', placeholder,\n false, true, noSelectionString, true)\n .then(function() {\n M.util.js_complete('acceptances_filter_datasource');\n\n return;\n })\n .fail(Notification.exception);\n }).fail(Notification.exception);\n\n var last = $(SELECTORS.UNIFIED_FILTERS).val();\n $(SELECTORS.UNIFIED_FILTERS).on('change', function() {\n var current = $(this).val();\n var listoffilters = [];\n var textfilters = [];\n var updatedselectedfilters = false;\n\n $.each(current, function(index, catoption) {\n var catandoption = catoption.split(':', 2);\n if (catandoption.length !== 2) {\n textfilters.push(catoption);\n return true; // Text search filter.\n }\n\n var category = catandoption[0];\n var option = catandoption[1];\n\n // The last option (eg. 'Teacher') out of a category (eg. 'Role') in this loop is the one that was last\n // selected, so we want to use that if there are multiple options from the same category. Eg. The user\n // may have chosen to filter by the 'Student' role, then wanted to filter by the 'Teacher' role - the\n // last option in the category to be selected (in this case 'Teacher') will come last, so will overwrite\n // 'Student' (after this if). We want to let the JS know that the filters have been updated.\n if (typeof listoffilters[category] !== 'undefined') {\n updatedselectedfilters = true;\n }\n\n listoffilters[category] = option;\n return true;\n });\n\n // Check if we have something to remove from the list of filters.\n if (updatedselectedfilters) {\n // Go through and put the list into something we can use to update the list of filters.\n var updatefilters = [];\n for (var category in listoffilters) {\n updatefilters.push(category + \":\" + listoffilters[category]);\n }\n updatefilters = updatefilters.concat(textfilters);\n $(this).val(updatefilters);\n }\n\n // Prevent form from submitting unnecessarily, eg. on blur when no filter is selected.\n if (last.join(',') != current.join(',')) {\n this.form.submit();\n }\n });\n };\n\n /**\n * Return the unified user filter form.\n *\n * @method getForm\n * @return {DOMElement}\n */\n var getForm = function() {\n return $(SELECTORS.UNIFIED_FILTERS).closest('form');\n };\n\n return /** @alias module:core/form-autocomplete */ {\n /**\n * Initialise the unified user filter.\n *\n * @method init\n */\n init: function() {\n init();\n },\n\n /**\n * Return the unified user filter form.\n *\n * @method getForm\n * @return {DOMElement}\n */\n getForm: function() {\n return getForm();\n }\n };\n });\n"],"names":["define","$","Autocomplete","Str","Notification","SELECTORS","init","M","util","js_pending","get_strings","key","component","done","langstrings","placeholder","noSelectionString","enhance","then","js_complete","fail","exception","last","val","on","current","this","listoffilters","textfilters","updatedselectedfilters","each","index","catoption","catandoption","split","length","push","category","option","updatefilters","concat","join","form","submit","getForm","closest"],"mappings":";;;;;;;AAsBAA,wCAAO,CAAC,SAAU,yBAA0B,WAAY,sBACpD,SAASC,EAAGC,aAAcC,IAAKC,kBAQvBC,0BACiB,yBA0F8B,CAM/CC,KAAM,YAvFC,WASPC,EAAEC,KAAKC,WAAW,iCAClBN,IAAIO,YATa,CAAC,CACdC,IAAK,oBACLC,UAAW,eACZ,CACCD,IAAK,mBACLC,UAAW,iBAIaC,MAAK,SAASC,iBAClCC,YAAcD,YAAY,GAC1BE,kBAAoBF,YAAY,GACpCZ,aAAae,QAAQZ,2BAA2B,EAAM,4CAA6CU,aAC/F,GAAO,EAAMC,mBAAmB,GAC/BE,MAAK,WACFX,EAAEC,KAAKW,YAAY,oCAItBC,KAAKhB,aAAaiB,cACxBD,KAAKhB,aAAaiB,eAEjBC,KAAOrB,EAAEI,2BAA2BkB,MACxCtB,EAAEI,2BAA2BmB,GAAG,UAAU,eAClCC,QAAUxB,EAAEyB,MAAMH,MAClBI,cAAgB,GAChBC,YAAc,GACdC,wBAAyB,KAE7B5B,EAAE6B,KAAKL,SAAS,SAASM,MAAOC,eACxBC,aAAeD,UAAUE,MAAM,IAAK,MACZ,IAAxBD,aAAaE,cACbP,YAAYQ,KAAKJ,YACV,MAGPK,SAAWJ,aAAa,GACxBK,OAASL,aAAa,eAOa,IAA5BN,cAAcU,YACrBR,wBAAyB,GAG7BF,cAAcU,UAAYC,QACnB,KAIPT,uBAAwB,KAEpBU,cAAgB,OACf,IAAIF,YAAYV,cACjBY,cAAcH,KAAKC,SAAW,IAAMV,cAAcU,WAEtDE,cAAgBA,cAAcC,OAAOZ,aACrC3B,EAAEyB,MAAMH,IAAIgB,eAIZjB,KAAKmB,KAAK,MAAQhB,QAAQgB,KAAK,WAC1BC,KAAKC,YAsBdrC,IASJsC,QAAS,kBAnBF3C,EAAEI,2BAA2BwC,QAAQ"} \ No newline at end of file +{"version":3,"file":"acceptances_filter.min.js","sources":["../src/acceptances_filter.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 * Unified filter page JS module for the course participants page.\n *\n * @module tool_policy/acceptances_filter\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/form-autocomplete', 'core/str', 'core/notification'],\n function($, Autocomplete, Str, Notification) {\n\n /**\n * Selectors.\n *\n * @access private\n * @type {{UNIFIED_FILTERS: string}}\n */\n var SELECTORS = {\n UNIFIED_FILTERS: '#unified-filters'\n };\n\n /**\n * Init function.\n *\n * @method init\n * @private\n */\n var init = function() {\n var stringkeys = [{\n key: 'filterplaceholder',\n component: 'tool_policy'\n }, {\n key: 'nofiltersapplied',\n component: 'tool_policy'\n }];\n\n M.util.js_pending('acceptances_filter_datasource');\n Str.get_strings(stringkeys).done(function(langstrings) {\n var placeholder = langstrings[0];\n var noSelectionString = langstrings[1];\n Autocomplete.enhance(SELECTORS.UNIFIED_FILTERS, true, 'tool_policy/acceptances_filter_datasource', placeholder,\n false, true, noSelectionString, true)\n .then(function() {\n M.util.js_complete('acceptances_filter_datasource');\n\n return;\n })\n .fail(Notification.exception);\n }).fail(Notification.exception);\n\n var last = $(SELECTORS.UNIFIED_FILTERS).val();\n $(SELECTORS.UNIFIED_FILTERS).on('change', function() {\n var current = $(this).val();\n var listoffilters = [];\n var textfilters = [];\n var updatedselectedfilters = false;\n\n $.each(current, function(index, catoption) {\n var catandoption = catoption.split(':', 2);\n if (catandoption.length !== 2) {\n textfilters.push(catoption);\n return true; // Text search filter.\n }\n\n var category = catandoption[0];\n var option = catandoption[1];\n\n // The last option (eg. 'Teacher') out of a category (eg. 'Role') in this loop is the one that was last\n // selected, so we want to use that if there are multiple options from the same category. Eg. The user\n // may have chosen to filter by the 'Student' role, then wanted to filter by the 'Teacher' role - the\n // last option in the category to be selected (in this case 'Teacher') will come last, so will overwrite\n // 'Student' (after this if). We want to let the JS know that the filters have been updated.\n if (typeof listoffilters[category] !== 'undefined') {\n updatedselectedfilters = true;\n }\n\n listoffilters[category] = option;\n return true;\n });\n\n // Check if we have something to remove from the list of filters.\n if (updatedselectedfilters) {\n // Go through and put the list into something we can use to update the list of filters.\n var updatefilters = [];\n for (var category in listoffilters) {\n updatefilters.push(category + \":\" + listoffilters[category]);\n }\n updatefilters = updatefilters.concat(textfilters);\n $(this).val(updatefilters);\n }\n\n // Prevent form from submitting unnecessarily, eg. on blur when no filter is selected.\n if (last.join(',') != current.join(',')) {\n this.form.submit();\n }\n });\n };\n\n /**\n * Return the unified user filter form.\n *\n * @method getForm\n * @return {DOMElement}\n */\n var getForm = function() {\n return $(SELECTORS.UNIFIED_FILTERS).closest('form');\n };\n\n return /** @alias module:core/form-autocomplete */ {\n /**\n * Initialise the unified user filter.\n *\n * @method init\n */\n init: function() {\n init();\n },\n\n /**\n * Return the unified user filter form.\n *\n * @method getForm\n * @return {DOMElement}\n */\n getForm: function() {\n return getForm();\n }\n };\n });\n"],"names":["define","$","Autocomplete","Str","Notification","SELECTORS","init","M","util","js_pending","get_strings","key","component","done","langstrings","placeholder","noSelectionString","enhance","then","js_complete","fail","exception","last","val","on","current","this","listoffilters","textfilters","updatedselectedfilters","each","index","catoption","catandoption","split","length","push","category","option","updatefilters","concat","join","form","submit","getForm","closest"],"mappings":";;;;;;;AAsBAA,wCAAO,CAAC,SAAU,yBAA0B,WAAY,sBACpD,SAASC,EAAGC,aAAcC,IAAKC,cAQ3B,IAAIC,0BACiB,mBA0F8B,MAAA,CAM/CC,KAAM,YAvFC,WASPC,EAAEC,KAAKC,WAAW,iCAClBN,IAAIO,YATa,CAAC,CACdC,IAAK,oBACLC,UAAW,eACZ,CACCD,IAAK,mBACLC,UAAW,iBAIaC,MAAK,SAASC,aACtC,IAAIC,YAAcD,YAAY,GAC1BE,kBAAoBF,YAAY,GACpCZ,aAAae,QAAQZ,2BAA2B,EAAM,4CAA6CU,aAC/F,GAAO,EAAMC,mBAAmB,GAC/BE,MAAK,WACFX,EAAEC,KAAKW,YAAY,gCAH3B,IAOKC,KAAKhB,aAAaiB,UAV3B,IAWGD,KAAKhB,aAAaiB,WAEjBC,IAAAA,KAAOrB,EAAEI,2BAA2BkB,MACxCtB,EAAEI,2BAA2BmB,GAAG,UAAU,WAClCC,IAAAA,QAAUxB,EAAEyB,MAAMH,MAClBI,cAAgB,GAChBC,YAAc,GACdC,wBAAyB,EA0B7B,GAxBA5B,EAAE6B,KAAKL,SAAS,SAASM,MAAOC,WACxBC,IAAAA,aAAeD,UAAUE,MAAM,IAAK,GACxC,GAA4B,IAAxBD,aAAaE,OAEb,OADAP,YAAYQ,KAAKJ,YACV,EAGX,IAAIK,SAAWJ,aAAa,GACxBK,OAASL,aAAa,GAY1B,YALuC,IAA5BN,cAAcU,YACrBR,wBAAyB,GAG7BF,cAAcU,UAAYC,QACnB,CACV,IAGGT,uBAAwB,CAEpBU,IAAAA,cAAgB,GACpB,IAAK,IAAIF,YAAYV,cACjBY,cAAcH,KAAKC,SAAW,IAAMV,cAAcU,WAEtDE,cAAgBA,cAAcC,OAAOZ,aACrC3B,EAAEyB,MAAMH,IAAIgB,cACf,CAGGjB,KAAKmB,KAAK,MAAQhB,QAAQgB,KAAK,MAC1BC,KAAAA,KAAKC,QAEjB,GACJ,CAmBOrC,EAP2C,EAgB/CsC,QAAS,WACL,OApBG3C,EAAEI,2BAA2BwC,QAAQ,OAqB3C,EAER"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js.map b/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js.map index 2d37ce4cd38..7e7d434a902 100644 --- a/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js.map +++ b/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js.map @@ -1 +1 @@ -{"version":3,"file":"acceptances_filter_datasource.min.js","sources":["../src/acceptances_filter_datasource.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 * Datasource for the tool_policy/acceptances_filter.\n *\n * This module is compatible with core/form-autocomplete.\n *\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n return /** @alias module:tool_policy/acceptances_filter_datasource */ {\n /**\n * List filter options.\n *\n * @param {String} selector The select element selector.\n * @param {String} query The query string.\n * @return {Promise}\n */\n list: function(selector, query) {\n var filteredOptions = [];\n\n var el = $(selector);\n var originalOptions = $(selector).data('originaloptionsjson');\n var selectedFilters = el.val();\n $.each(originalOptions, function(index, option) {\n // Skip option if it does not contain the query string.\n if (query.trim() !== '' && option.label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) === -1) {\n return true;\n }\n // Skip filters that have already been selected.\n if ($.inArray(option.value, selectedFilters) > -1) {\n return true;\n }\n\n filteredOptions.push(option);\n return true;\n });\n\n var deferred = new $.Deferred();\n deferred.resolve(filteredOptions);\n\n return deferred.promise();\n },\n\n /**\n * Process the results for auto complete elements.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {Array} results An array or results.\n * @return {Array} New array of results.\n */\n processResults: function(selector, results) {\n var options = [];\n $.each(results, function(index, data) {\n options.push({\n value: data.value,\n label: data.label\n });\n });\n return options;\n },\n\n /**\n * Source of data for Ajax element.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {String} query The query string.\n * @param {Function} callback A callback function receiving an array of results.\n */\n /* eslint-disable promise/no-callback-in-promise */\n transport: function(selector, query, callback) {\n this.list(selector, query).then(callback).catch(Notification.exception);\n }\n };\n\n});\n"],"names":["define","$","Ajax","Notification","list","selector","query","filteredOptions","el","originalOptions","data","selectedFilters","val","each","index","option","trim","label","toLocaleLowerCase","indexOf","inArray","value","push","deferred","Deferred","resolve","promise","processResults","results","options","transport","callback","then","catch","exception"],"mappings":";;;;;;;;AAwBAA,mDAAO,CAAC,SAAU,YAAa,sBAAsB,SAASC,EAAGC,KAAMC,oBAEG,CAQlEC,KAAM,SAASC,SAAUC,WACjBC,gBAAkB,GAElBC,GAAKP,EAAEI,UACPI,gBAAkBR,EAAEI,UAAUK,KAAK,uBACnCC,gBAAkBH,GAAGI,MACzBX,EAAEY,KAAKJ,iBAAiB,SAASK,MAAOC,cAEf,KAAjBT,MAAMU,SAA0F,IAAzED,OAAOE,MAAMC,oBAAoBC,QAAQb,MAAMY,sBAItEjB,EAAEmB,QAAQL,OAAOM,MAAOV,kBAAoB,GAIhDJ,gBAAgBe,KAAKP,SAPV,SAWXQ,SAAW,IAAItB,EAAEuB,gBACrBD,SAASE,QAAQlB,iBAEVgB,SAASG,WAUpBC,eAAgB,SAAStB,SAAUuB,aAC3BC,QAAU,UACd5B,EAAEY,KAAKe,SAAS,SAASd,MAAOJ,MAC5BmB,QAAQP,KAAK,CACTD,MAAOX,KAAKW,MACZJ,MAAOP,KAAKO,WAGbY,SAWXC,UAAW,SAASzB,SAAUC,MAAOyB,eAC5B3B,KAAKC,SAAUC,OAAO0B,KAAKD,UAAUE,MAAM9B,aAAa+B"} \ No newline at end of file +{"version":3,"file":"acceptances_filter_datasource.min.js","sources":["../src/acceptances_filter_datasource.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 * Datasource for the tool_policy/acceptances_filter.\n *\n * This module is compatible with core/form-autocomplete.\n *\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n return /** @alias module:tool_policy/acceptances_filter_datasource */ {\n /**\n * List filter options.\n *\n * @param {String} selector The select element selector.\n * @param {String} query The query string.\n * @return {Promise}\n */\n list: function(selector, query) {\n var filteredOptions = [];\n\n var el = $(selector);\n var originalOptions = $(selector).data('originaloptionsjson');\n var selectedFilters = el.val();\n $.each(originalOptions, function(index, option) {\n // Skip option if it does not contain the query string.\n if (query.trim() !== '' && option.label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) === -1) {\n return true;\n }\n // Skip filters that have already been selected.\n if ($.inArray(option.value, selectedFilters) > -1) {\n return true;\n }\n\n filteredOptions.push(option);\n return true;\n });\n\n var deferred = new $.Deferred();\n deferred.resolve(filteredOptions);\n\n return deferred.promise();\n },\n\n /**\n * Process the results for auto complete elements.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {Array} results An array or results.\n * @return {Array} New array of results.\n */\n processResults: function(selector, results) {\n var options = [];\n $.each(results, function(index, data) {\n options.push({\n value: data.value,\n label: data.label\n });\n });\n return options;\n },\n\n /**\n * Source of data for Ajax element.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {String} query The query string.\n * @param {Function} callback A callback function receiving an array of results.\n */\n /* eslint-disable promise/no-callback-in-promise */\n transport: function(selector, query, callback) {\n this.list(selector, query).then(callback).catch(Notification.exception);\n }\n };\n\n});\n"],"names":["define","$","Ajax","Notification","list","selector","query","filteredOptions","el","originalOptions","data","selectedFilters","val","each","index","option","trim","label","toLocaleLowerCase","indexOf","inArray","value","push","deferred","Deferred","resolve","promise","processResults","results","options","transport","callback","this","then","catch","exception"],"mappings":";;;;;;;;AAwBAA,OAAO,4CAAA,CAAC,SAAU,YAAa,sBAAsB,SAASC,EAAGC,KAAMC,cAEG,MAAA,CAQlEC,KAAM,SAASC,SAAUC,OACjBC,IAAAA,gBAAkB,GAElBC,GAAKP,EAAEI,UACPI,gBAAkBR,EAAEI,UAAUK,KAAK,uBACnCC,gBAAkBH,GAAGI,MACzBX,EAAEY,KAAKJ,iBAAiB,SAASK,MAAOC,QAEhCT,MAAiB,KAAjBA,MAAMU,SAA0F,IAAzED,OAAOE,MAAMC,oBAAoBC,QAAQb,MAAMY,sBAItEjB,EAAEmB,QAAQL,OAAOM,MAAOV,kBAAoB,GAIhDJ,gBAAgBe,KAAKP,SAPV,CASd,IAED,IAAIQ,SAAW,IAAItB,EAAEuB,SAGdD,OAFPA,SAASE,QAAQlB,iBAEVgB,SAASG,SA/B8C,EAyClEC,eAAgB,SAAStB,SAAUuB,SAC3BC,IAAAA,QAAU,GAOd,OANA5B,EAAEY,KAAKe,SAAS,SAASd,MAAOJ,MAC5BmB,QAAQP,KAAK,CACTD,MAAOX,KAAKW,MACZJ,MAAOP,KAAKO,OAEnB,IACMY,OAjDuD,EA4DlEC,UAAW,SAASzB,SAAUC,MAAOyB,UACjCC,KAAK5B,KAAKC,SAAUC,OAAO2B,KAAKF,UAAUG,MAAM/B,aAAagC,UAChE,EAGR"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/acceptmodal.min.js.map b/admin/tool/policy/amd/build/acceptmodal.min.js.map index 058b57a507c..944cfe1673e 100644 --- a/admin/tool/policy/amd/build/acceptmodal.min.js.map +++ b/admin/tool/policy/amd/build/acceptmodal.min.js.map @@ -1 +1 @@ -{"version":3,"file":"acceptmodal.min.js","sources":["../src/acceptmodal.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 * Add policy consent modal to the page\n *\n * @module tool_policy/acceptmodal\n * @copyright 2018 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/modal_factory', 'core/modal_events', 'core/notification', 'core/fragment',\n 'core/ajax', 'core/yui'],\n function($, Str, ModalFactory, ModalEvents, Notification, Fragment, Ajax, Y) {\n\n \"use strict\";\n\n /**\n * Constructor\n *\n * @param {int} contextid\n *\n * Each call to init gets it's own instance of this class.\n */\n var AcceptOnBehalf = function(contextid) {\n this.contextid = contextid;\n this.init();\n };\n\n /**\n * @var {Modal} modal\n * @private\n */\n AcceptOnBehalf.prototype.modal = null;\n\n /**\n * @var {int} contextid\n * @private\n */\n AcceptOnBehalf.prototype.contextid = -1;\n\n /**\n * @var {object} currentTrigger The triggered HTML jQuery object\n * @private\n */\n AcceptOnBehalf.prototype.currentTrigger = null;\n\n /**\n * @var {object} triggers The trigger selectors\n * @private\n */\n AcceptOnBehalf.prototype.triggers = {\n SINGLE: 'a[data-action=acceptmodal]',\n BULK: 'input[data-action=acceptmodal]'\n };\n\n /**\n * Initialise the class.\n *\n * @private\n */\n AcceptOnBehalf.prototype.init = function() {\n // Initialise for links accepting policies for individual users.\n $(this.triggers.SINGLE).on('click', function(e) {\n e.preventDefault();\n this.currentTrigger = $(e.currentTarget);\n var href = $(e.currentTarget).attr('href'),\n formData = href.slice(href.indexOf('?') + 1);\n this.showFormModal(formData);\n }.bind(this));\n\n // Initialise for multiple users acceptance form.\n $(this.triggers.BULK).on('click', function(e) {\n e.preventDefault();\n this.currentTrigger = $(e.currentTarget);\n var form = $(e.currentTarget).closest('form');\n if (form.find('input[type=checkbox][name=\"userids[]\"]:checked').length) {\n var formData = form.serialize();\n this.showFormModal(formData);\n } else {\n Str.get_strings([\n {key: 'notice'},\n {key: 'selectusersforconsent', component: 'tool_policy'},\n {key: 'ok'}\n ]).then(function(strings) {\n Notification.alert(strings[0], strings[1], strings[2]);\n return;\n }).fail(Notification.exception);\n }\n }.bind(this));\n };\n\n /**\n * Show modal with a form\n *\n * @param {String} formData\n */\n AcceptOnBehalf.prototype.showFormModal = function(formData) {\n var action;\n var params = formData.split('&');\n for (var i = 0; i < params.length; i++) {\n var pair = params[i].split('=');\n if (pair[0] == 'action') {\n action = pair[1];\n }\n }\n // Fetch the title string.\n Str.get_strings([\n {key: 'statusformtitleaccept', component: 'tool_policy'},\n {key: 'iagreetothepolicy', component: 'tool_policy'},\n {key: 'statusformtitlerevoke', component: 'tool_policy'},\n {key: 'irevokethepolicy', component: 'tool_policy'},\n {key: 'statusformtitledecline', component: 'tool_policy'},\n {key: 'declinethepolicy', component: 'tool_policy'}\n ]).then(function(strings) {\n var title;\n var saveText;\n if (action == 'accept') {\n title = strings[0];\n saveText = strings[1];\n } else if (action == 'revoke') {\n title = strings[2];\n saveText = strings[3];\n } else if (action == 'decline') {\n title = strings[4];\n saveText = strings[5];\n }\n // Create the modal.\n return ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: title,\n body: ''\n }).done(function(modal) {\n this.modal = modal;\n this.setupFormModal(formData, saveText);\n }.bind(this));\n }.bind(this))\n .catch(Notification.exception);\n };\n\n /**\n * Setup form inside a modal\n *\n * @param {String} formData\n * @param {String} saveText\n */\n AcceptOnBehalf.prototype.setupFormModal = function(formData, saveText) {\n var modal = this.modal;\n\n modal.setLarge();\n\n modal.setSaveButtonText(saveText);\n\n // We want to reset the form every time it is opened.\n modal.getRoot().on(ModalEvents.hidden, this.destroy.bind(this));\n\n modal.setBody(this.getBody(formData));\n\n // We catch the modal save event, and use it to submit the form inside the modal.\n // Triggering a form submission will give JS validation scripts a chance to check for errors.\n modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));\n // We also catch the form submit event and use it to submit the form with ajax.\n modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));\n\n modal.show();\n };\n\n /**\n * Load the body of the modal (contains the form)\n *\n * @method getBody\n * @private\n * @param {String} formData\n * @return {Promise}\n */\n AcceptOnBehalf.prototype.getBody = function(formData) {\n if (typeof formData === \"undefined\") {\n formData = {};\n }\n // Get the content of the modal.\n var params = {jsonformdata: JSON.stringify(formData)};\n return Fragment.loadFragment('tool_policy', 'accept_on_behalf', this.contextid, params);\n };\n\n /**\n * Submit the form inside the modal via AJAX request\n *\n * @method submitFormAjax\n * @private\n * @param {Event} e Form submission event.\n */\n AcceptOnBehalf.prototype.submitFormAjax = function(e) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = this.modal.getRoot().find('form').serialize();\n\n var requests = Ajax.call([{\n methodname: 'tool_policy_submit_accept_on_behalf',\n args: {jsonformdata: JSON.stringify(formData)}\n }]);\n requests[0].done(function(data) {\n if (data.validationerrors) {\n this.modal.setBody(this.getBody(formData));\n } else {\n this.close();\n }\n }.bind(this)).fail(Notification.exception);\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n AcceptOnBehalf.prototype.submitForm = function(e) {\n e.preventDefault();\n this.modal.getRoot().find('form').submit();\n };\n\n /**\n * Close the modal\n */\n AcceptOnBehalf.prototype.close = function() {\n this.destroy();\n document.location.reload();\n };\n\n /**\n * Destroy the modal\n */\n AcceptOnBehalf.prototype.destroy = function() {\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n this.modal.destroy();\n this.currentTrigger.focus();\n };\n\n return /** @alias module:tool_policy/acceptmodal */ {\n // Public variables and functions.\n /**\n * Attach event listeners to initialise this module.\n *\n * @method init\n * @param {int} contextid The contextid for the course.\n * @return {AcceptOnBehalf}\n */\n getInstance: function(contextid) {\n return new AcceptOnBehalf(contextid);\n }\n };\n });\n"],"names":["define","$","Str","ModalFactory","ModalEvents","Notification","Fragment","Ajax","Y","AcceptOnBehalf","contextid","init","prototype","modal","currentTrigger","triggers","SINGLE","BULK","this","on","e","preventDefault","currentTarget","href","attr","formData","slice","indexOf","showFormModal","bind","form","closest","find","length","serialize","get_strings","key","component","then","strings","alert","fail","exception","action","params","split","i","pair","title","saveText","create","type","types","SAVE_CANCEL","body","done","setupFormModal","catch","setLarge","setSaveButtonText","getRoot","hidden","destroy","setBody","getBody","save","submitForm","submitFormAjax","show","jsonformdata","JSON","stringify","loadFragment","call","methodname","args","data","validationerrors","close","submit","document","location","reload","use","M","core_formchangechecker","reset_form_dirty_state","focus","getInstance"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"acceptmodal.min.js","sources":["../src/acceptmodal.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 * Add policy consent modal to the page\n *\n * @module tool_policy/acceptmodal\n * @copyright 2018 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/modal_factory', 'core/modal_events', 'core/notification', 'core/fragment',\n 'core/ajax', 'core/yui'],\n function($, Str, ModalFactory, ModalEvents, Notification, Fragment, Ajax, Y) {\n\n \"use strict\";\n\n /**\n * Constructor\n *\n * @param {int} contextid\n *\n * Each call to init gets it's own instance of this class.\n */\n var AcceptOnBehalf = function(contextid) {\n this.contextid = contextid;\n this.init();\n };\n\n /**\n * @var {Modal} modal\n * @private\n */\n AcceptOnBehalf.prototype.modal = null;\n\n /**\n * @var {int} contextid\n * @private\n */\n AcceptOnBehalf.prototype.contextid = -1;\n\n /**\n * @var {object} currentTrigger The triggered HTML jQuery object\n * @private\n */\n AcceptOnBehalf.prototype.currentTrigger = null;\n\n /**\n * @var {object} triggers The trigger selectors\n * @private\n */\n AcceptOnBehalf.prototype.triggers = {\n SINGLE: 'a[data-action=acceptmodal]',\n BULK: 'input[data-action=acceptmodal]'\n };\n\n /**\n * Initialise the class.\n *\n * @private\n */\n AcceptOnBehalf.prototype.init = function() {\n // Initialise for links accepting policies for individual users.\n $(this.triggers.SINGLE).on('click', function(e) {\n e.preventDefault();\n this.currentTrigger = $(e.currentTarget);\n var href = $(e.currentTarget).attr('href'),\n formData = href.slice(href.indexOf('?') + 1);\n this.showFormModal(formData);\n }.bind(this));\n\n // Initialise for multiple users acceptance form.\n $(this.triggers.BULK).on('click', function(e) {\n e.preventDefault();\n this.currentTrigger = $(e.currentTarget);\n var form = $(e.currentTarget).closest('form');\n if (form.find('input[type=checkbox][name=\"userids[]\"]:checked').length) {\n var formData = form.serialize();\n this.showFormModal(formData);\n } else {\n Str.get_strings([\n {key: 'notice'},\n {key: 'selectusersforconsent', component: 'tool_policy'},\n {key: 'ok'}\n ]).then(function(strings) {\n Notification.alert(strings[0], strings[1], strings[2]);\n return;\n }).fail(Notification.exception);\n }\n }.bind(this));\n };\n\n /**\n * Show modal with a form\n *\n * @param {String} formData\n */\n AcceptOnBehalf.prototype.showFormModal = function(formData) {\n var action;\n var params = formData.split('&');\n for (var i = 0; i < params.length; i++) {\n var pair = params[i].split('=');\n if (pair[0] == 'action') {\n action = pair[1];\n }\n }\n // Fetch the title string.\n Str.get_strings([\n {key: 'statusformtitleaccept', component: 'tool_policy'},\n {key: 'iagreetothepolicy', component: 'tool_policy'},\n {key: 'statusformtitlerevoke', component: 'tool_policy'},\n {key: 'irevokethepolicy', component: 'tool_policy'},\n {key: 'statusformtitledecline', component: 'tool_policy'},\n {key: 'declinethepolicy', component: 'tool_policy'}\n ]).then(function(strings) {\n var title;\n var saveText;\n if (action == 'accept') {\n title = strings[0];\n saveText = strings[1];\n } else if (action == 'revoke') {\n title = strings[2];\n saveText = strings[3];\n } else if (action == 'decline') {\n title = strings[4];\n saveText = strings[5];\n }\n // Create the modal.\n return ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: title,\n body: ''\n }).done(function(modal) {\n this.modal = modal;\n this.setupFormModal(formData, saveText);\n }.bind(this));\n }.bind(this))\n .catch(Notification.exception);\n };\n\n /**\n * Setup form inside a modal\n *\n * @param {String} formData\n * @param {String} saveText\n */\n AcceptOnBehalf.prototype.setupFormModal = function(formData, saveText) {\n var modal = this.modal;\n\n modal.setLarge();\n\n modal.setSaveButtonText(saveText);\n\n // We want to reset the form every time it is opened.\n modal.getRoot().on(ModalEvents.hidden, this.destroy.bind(this));\n\n modal.setBody(this.getBody(formData));\n\n // We catch the modal save event, and use it to submit the form inside the modal.\n // Triggering a form submission will give JS validation scripts a chance to check for errors.\n modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));\n // We also catch the form submit event and use it to submit the form with ajax.\n modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));\n\n modal.show();\n };\n\n /**\n * Load the body of the modal (contains the form)\n *\n * @method getBody\n * @private\n * @param {String} formData\n * @return {Promise}\n */\n AcceptOnBehalf.prototype.getBody = function(formData) {\n if (typeof formData === \"undefined\") {\n formData = {};\n }\n // Get the content of the modal.\n var params = {jsonformdata: JSON.stringify(formData)};\n return Fragment.loadFragment('tool_policy', 'accept_on_behalf', this.contextid, params);\n };\n\n /**\n * Submit the form inside the modal via AJAX request\n *\n * @method submitFormAjax\n * @private\n * @param {Event} e Form submission event.\n */\n AcceptOnBehalf.prototype.submitFormAjax = function(e) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = this.modal.getRoot().find('form').serialize();\n\n var requests = Ajax.call([{\n methodname: 'tool_policy_submit_accept_on_behalf',\n args: {jsonformdata: JSON.stringify(formData)}\n }]);\n requests[0].done(function(data) {\n if (data.validationerrors) {\n this.modal.setBody(this.getBody(formData));\n } else {\n this.close();\n }\n }.bind(this)).fail(Notification.exception);\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n AcceptOnBehalf.prototype.submitForm = function(e) {\n e.preventDefault();\n this.modal.getRoot().find('form').submit();\n };\n\n /**\n * Close the modal\n */\n AcceptOnBehalf.prototype.close = function() {\n this.destroy();\n document.location.reload();\n };\n\n /**\n * Destroy the modal\n */\n AcceptOnBehalf.prototype.destroy = function() {\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n this.modal.destroy();\n this.currentTrigger.focus();\n };\n\n return /** @alias module:tool_policy/acceptmodal */ {\n // Public variables and functions.\n /**\n * Attach event listeners to initialise this module.\n *\n * @method init\n * @param {int} contextid The contextid for the course.\n * @return {AcceptOnBehalf}\n */\n getInstance: function(contextid) {\n return new AcceptOnBehalf(contextid);\n }\n };\n });\n"],"names":["define","$","Str","ModalFactory","ModalEvents","Notification","Fragment","Ajax","Y","AcceptOnBehalf","contextid","this","init","prototype","modal","currentTrigger","triggers","SINGLE","BULK","on","e","preventDefault","currentTarget","href","attr","formData","slice","indexOf","showFormModal","bind","form","closest","find","length","serialize","get_strings","key","component","then","strings","alert","fail","exception","action","params","split","i","pair","title","saveText","create","type","types","SAVE_CANCEL","body","done","setupFormModal","catch","setLarge","setSaveButtonText","getRoot","hidden","destroy","setBody","getBody","save","submitForm","submitFormAjax","show","jsonformdata","JSON","stringify","loadFragment","call","methodname","args","data","validationerrors","close","submit","document","location","reload","use","M","core_formchangechecker","reset_form_dirty_state","focus","getInstance"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/jquery-eu-cookie-law-popup.min.js.map b/admin/tool/policy/amd/build/jquery-eu-cookie-law-popup.min.js.map index e9557426c2c..392eda0da97 100644 --- a/admin/tool/policy/amd/build/jquery-eu-cookie-law-popup.min.js.map +++ b/admin/tool/policy/amd/build/jquery-eu-cookie-law-popup.min.js.map @@ -1 +1 @@ -{"version":3,"file":"jquery-eu-cookie-law-popup.min.js","sources":["../src/jquery-eu-cookie-law-popup.js"],"sourcesContent":["/**\r\n *\r\n * JQUERY EU COOKIE LAW POPUPS\r\n * version 1.1.1\r\n *\r\n * Code on Github:\r\n * https://github.com/wimagguc/jquery-eu-cookie-law-popup\r\n *\r\n * To see a live demo, go to:\r\n * http://www.wimagguc.com/2018/05/gdpr-compliance-with-the-jquery-eu-cookie-law-plugin/\r\n *\r\n * by Richard Dancsi\r\n * http://www.wimagguc.com/\r\n *\r\n */\r\n\r\ndefine(['jquery'], function($) {\r\n\r\n// for ie9 doesn't support debug console >>>\r\nif (!window.console) window.console = {};\r\nif (!window.console.log) window.console.log = function () { };\r\n// ^^^\r\n\r\n$.fn.euCookieLawPopup = (function() {\r\n\r\n\tvar _self = this;\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// PARAMETERS (MODIFY THIS PART) //////////////////////////////////////////////////////////////\r\n\t_self.params = {\r\n\t\tcookiePolicyUrl : '/?cookie-policy',\r\n\t\tpopupPosition : 'top',\r\n\t\tcolorStyle : 'default',\r\n\t\tcompactStyle : false,\r\n\t\tpopupTitle : 'This website is using cookies',\r\n\t\tpopupText : 'We use cookies to ensure that we give you the best experience on our website. If you continue without changing your settings, we\\'ll assume that you are happy to receive all cookies on this website.',\r\n\t\tbuttonContinueTitle : 'Continue',\r\n\t\tbuttonLearnmoreTitle : 'Learn more',\r\n\t\tbuttonLearnmoreOpenInNewWindow : true,\r\n\t\tagreementExpiresInDays : 30,\r\n\t\tautoAcceptCookiePolicy : false,\r\n\t\thtmlMarkup : null\r\n\t};\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// VARIABLES USED BY THE FUNCTION (DON'T MODIFY THIS PART) ////////////////////////////////////\r\n\t_self.vars = {\r\n\t\tINITIALISED : false,\r\n\t\tHTML_MARKUP : null,\r\n\t\tCOOKIE_NAME : 'EU_COOKIE_LAW_CONSENT'\r\n\t};\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// PRIVATE FUNCTIONS FOR MANIPULATING DATA ////////////////////////////////////////////////////\r\n\r\n\t// Overwrite default parameters if any of those is present\r\n\tvar parseParameters = function(object, markup, settings) {\r\n\r\n\t\tif (object) {\r\n\t\t\tvar className = $(object).attr('class') ? $(object).attr('class') : '';\r\n\t\t\tif (className.indexOf('eupopup-top') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'top';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-fixedtop') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'fixedtop';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-bottomright') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'bottomright';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-bottomleft') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'bottomleft';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-bottom') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'bottom';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-block') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'block';\r\n\t\t\t}\r\n\t\t\tif (className.indexOf('eupopup-color-default') > -1) {\r\n\t\t\t\t_self.params.colorStyle = 'default';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-color-inverse') > -1) {\r\n\t\t\t\t_self.params.colorStyle = 'inverse';\r\n\t\t\t}\r\n\t\t\tif (className.indexOf('eupopup-style-compact') > -1) {\r\n\t\t\t\t_self.params.compactStyle = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (markup) {\r\n\t\t\t_self.params.htmlMarkup = markup;\r\n\t\t}\r\n\r\n\t\tif (settings) {\r\n\t\t\tif (typeof settings.cookiePolicyUrl !== 'undefined') {\r\n\t\t\t\t_self.params.cookiePolicyUrl = settings.cookiePolicyUrl;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.popupPosition !== 'undefined') {\r\n\t\t\t\t_self.params.popupPosition = settings.popupPosition;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.colorStyle !== 'undefined') {\r\n\t\t\t\t_self.params.colorStyle = settings.colorStyle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.popupTitle !== 'undefined') {\r\n\t\t\t\t_self.params.popupTitle = settings.popupTitle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.popupText !== 'undefined') {\r\n\t\t\t\t_self.params.popupText = settings.popupText;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.buttonContinueTitle !== 'undefined') {\r\n\t\t\t\t_self.params.buttonContinueTitle = settings.buttonContinueTitle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.buttonLearnmoreTitle !== 'undefined') {\r\n\t\t\t\t_self.params.buttonLearnmoreTitle = settings.buttonLearnmoreTitle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.buttonLearnmoreOpenInNewWindow !== 'undefined') {\r\n\t\t\t\t_self.params.buttonLearnmoreOpenInNewWindow = settings.buttonLearnmoreOpenInNewWindow;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.agreementExpiresInDays !== 'undefined') {\r\n\t\t\t\t_self.params.agreementExpiresInDays = settings.agreementExpiresInDays;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.autoAcceptCookiePolicy !== 'undefined') {\r\n\t\t\t\t_self.params.autoAcceptCookiePolicy = settings.autoAcceptCookiePolicy;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.htmlMarkup !== 'undefined') {\r\n\t\t\t\t_self.params.htmlMarkup = settings.htmlMarkup;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tvar createHtmlMarkup = function() {\r\n\r\n\t\tif (_self.params.htmlMarkup) {\r\n\t\t\treturn _self.params.htmlMarkup;\r\n\t\t}\r\n\r\n\t\tvar html =\r\n\t\t\t'
' +\r\n\t\t\t\t'
' + _self.params.popupTitle + '
' +\r\n\t\t\t\t'
' + _self.params.popupText + '
' +\r\n\t\t\t\t'
' +\r\n\t\t\t\t '' + _self.params.buttonContinueTitle + '' +\r\n\t\t\t\t '' + _self.params.buttonLearnmoreTitle + '' +\r\n\t\t\t\t '
' +\r\n\t\t\t\t'
' +\r\n\t\t\t\t'x' +\r\n\t\t\t'
';\r\n\r\n\t\treturn html;\r\n\t};\r\n\r\n\t// Storing the consent in a cookie\r\n\tvar setUserAcceptsCookies = function(consent) {\r\n\t\tvar d = new Date();\r\n\t\tvar expiresInDays = _self.params.agreementExpiresInDays * 24 * 60 * 60 * 1000;\r\n\t\td.setTime( d.getTime() + expiresInDays );\r\n\t\tvar expires = \"expires=\" + d.toGMTString();\r\n\t\tdocument.cookie = _self.vars.COOKIE_NAME + '=' + consent + \"; \" + expires + \";path=/\";\r\n\r\n\t\t$(document).trigger(\"user_cookie_consent_changed\", {'consent' : consent});\r\n\t};\r\n\r\n\t// Let's see if we have a consent cookie already\r\n\tvar userAlreadyAcceptedCookies = function() {\r\n\t\tvar userAcceptedCookies = false;\r\n\t\tvar cookies = document.cookie.split(\";\");\r\n\t\tfor (var i = 0; i < cookies.length; i++) {\r\n\t\t\tvar c = cookies[i].trim();\r\n\t\t\tif (c.indexOf(_self.vars.COOKIE_NAME) !== -1) {\r\n\t\t\t\tuserAcceptedCookies = c.substring(_self.vars.COOKIE_NAME.length + 1, c.length);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn userAcceptedCookies;\r\n\t};\r\n\r\n\tvar hideContainer = function() {\r\n\t\t// $('.eupopup-container').slideUp(200);\r\n\t\t$('.eupopup-container').animate({\r\n\t\t\topacity: 0,\r\n\t\t\theight: 0\r\n\t\t}, 200, function() {\r\n\t\t\t$('.eupopup-container').hide(0);\r\n\t\t});\r\n\t};\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// PUBLIC FUNCTIONS //////////////////////////////////////////////////////////////////////////\r\n\tvar publicfunc = {\r\n\r\n\t\t// INITIALIZE EU COOKIE LAW POPUP /////////////////////////////////////////////////////////\r\n\t\tinit : function(settings) {\r\n\r\n\t\t\tparseParameters(\r\n\t\t\t\t$(\".eupopup\").first(),\r\n\t\t\t\t$(\".eupopup-markup\").html(),\r\n\t\t\t\tsettings);\r\n\r\n\t\t\t// No need to display this if user already accepted the policy\r\n\t\t\tif (userAlreadyAcceptedCookies()) {\r\n $(document).trigger(\"user_cookie_already_accepted\", {'consent': true});\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// We should initialise only once\r\n\t\t\tif (_self.vars.INITIALISED) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_self.vars.INITIALISED = true;\r\n\r\n\t\t\t// Markup and event listeners >>>\r\n\t\t\t_self.vars.HTML_MARKUP = createHtmlMarkup();\r\n\r\n\t\t\tif ($('.eupopup-block').length > 0) {\r\n\t\t\t\t$('.eupopup-block').append(_self.vars.HTML_MARKUP);\r\n\t\t\t} else {\r\n\t\t\t\t$('BODY').append(_self.vars.HTML_MARKUP);\r\n\t\t\t}\r\n\r\n\t\t\t$('.eupopup-button_1').click(function() {\r\n\t\t\t\tsetUserAcceptsCookies(true);\r\n\t\t\t\thideContainer();\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t\t$('.eupopup-closebutton').click(function() {\r\n\t\t\t\tsetUserAcceptsCookies(true);\r\n\t\t\t\thideContainer();\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t\t// ^^^ Markup and event listeners\r\n\r\n\t\t\t// Ready to start!\r\n\t\t\t$('.eupopup-container').show();\r\n\r\n\t\t\t// In case it's alright to just display the message once\r\n\t\t\tif (_self.params.autoAcceptCookiePolicy) {\r\n\t\t\t\tsetUserAcceptsCookies(true);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\treturn publicfunc;\r\n});\r\n});\r\n"],"names":["define","$","window","console","log","fn","euCookieLawPopup","_self","this","params","cookiePolicyUrl","popupPosition","colorStyle","compactStyle","popupTitle","popupText","buttonContinueTitle","buttonLearnmoreTitle","buttonLearnmoreOpenInNewWindow","agreementExpiresInDays","autoAcceptCookiePolicy","htmlMarkup","vars","INITIALISED","HTML_MARKUP","COOKIE_NAME","setUserAcceptsCookies","consent","d","Date","expiresInDays","setTime","getTime","expires","toGMTString","document","cookie","trigger","hideContainer","animate","opacity","height","hide","init","settings","object","markup","className","attr","indexOf","parseParameters","first","html","userAcceptedCookies","cookies","split","i","length","c","trim","substring","userAlreadyAcceptedCookies","append","click","show"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"jquery-eu-cookie-law-popup.min.js","sources":["../src/jquery-eu-cookie-law-popup.js"],"sourcesContent":["/**\r\n *\r\n * JQUERY EU COOKIE LAW POPUPS\r\n * version 1.1.1\r\n *\r\n * Code on Github:\r\n * https://github.com/wimagguc/jquery-eu-cookie-law-popup\r\n *\r\n * To see a live demo, go to:\r\n * http://www.wimagguc.com/2018/05/gdpr-compliance-with-the-jquery-eu-cookie-law-plugin/\r\n *\r\n * by Richard Dancsi\r\n * http://www.wimagguc.com/\r\n *\r\n */\r\n\r\ndefine(['jquery'], function($) {\r\n\r\n// for ie9 doesn't support debug console >>>\r\nif (!window.console) window.console = {};\r\nif (!window.console.log) window.console.log = function () { };\r\n// ^^^\r\n\r\n$.fn.euCookieLawPopup = (function() {\r\n\r\n\tvar _self = this;\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// PARAMETERS (MODIFY THIS PART) //////////////////////////////////////////////////////////////\r\n\t_self.params = {\r\n\t\tcookiePolicyUrl : '/?cookie-policy',\r\n\t\tpopupPosition : 'top',\r\n\t\tcolorStyle : 'default',\r\n\t\tcompactStyle : false,\r\n\t\tpopupTitle : 'This website is using cookies',\r\n\t\tpopupText : 'We use cookies to ensure that we give you the best experience on our website. If you continue without changing your settings, we\\'ll assume that you are happy to receive all cookies on this website.',\r\n\t\tbuttonContinueTitle : 'Continue',\r\n\t\tbuttonLearnmoreTitle : 'Learn more',\r\n\t\tbuttonLearnmoreOpenInNewWindow : true,\r\n\t\tagreementExpiresInDays : 30,\r\n\t\tautoAcceptCookiePolicy : false,\r\n\t\thtmlMarkup : null\r\n\t};\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// VARIABLES USED BY THE FUNCTION (DON'T MODIFY THIS PART) ////////////////////////////////////\r\n\t_self.vars = {\r\n\t\tINITIALISED : false,\r\n\t\tHTML_MARKUP : null,\r\n\t\tCOOKIE_NAME : 'EU_COOKIE_LAW_CONSENT'\r\n\t};\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// PRIVATE FUNCTIONS FOR MANIPULATING DATA ////////////////////////////////////////////////////\r\n\r\n\t// Overwrite default parameters if any of those is present\r\n\tvar parseParameters = function(object, markup, settings) {\r\n\r\n\t\tif (object) {\r\n\t\t\tvar className = $(object).attr('class') ? $(object).attr('class') : '';\r\n\t\t\tif (className.indexOf('eupopup-top') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'top';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-fixedtop') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'fixedtop';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-bottomright') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'bottomright';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-bottomleft') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'bottomleft';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-bottom') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'bottom';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-block') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'block';\r\n\t\t\t}\r\n\t\t\tif (className.indexOf('eupopup-color-default') > -1) {\r\n\t\t\t\t_self.params.colorStyle = 'default';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-color-inverse') > -1) {\r\n\t\t\t\t_self.params.colorStyle = 'inverse';\r\n\t\t\t}\r\n\t\t\tif (className.indexOf('eupopup-style-compact') > -1) {\r\n\t\t\t\t_self.params.compactStyle = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (markup) {\r\n\t\t\t_self.params.htmlMarkup = markup;\r\n\t\t}\r\n\r\n\t\tif (settings) {\r\n\t\t\tif (typeof settings.cookiePolicyUrl !== 'undefined') {\r\n\t\t\t\t_self.params.cookiePolicyUrl = settings.cookiePolicyUrl;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.popupPosition !== 'undefined') {\r\n\t\t\t\t_self.params.popupPosition = settings.popupPosition;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.colorStyle !== 'undefined') {\r\n\t\t\t\t_self.params.colorStyle = settings.colorStyle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.popupTitle !== 'undefined') {\r\n\t\t\t\t_self.params.popupTitle = settings.popupTitle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.popupText !== 'undefined') {\r\n\t\t\t\t_self.params.popupText = settings.popupText;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.buttonContinueTitle !== 'undefined') {\r\n\t\t\t\t_self.params.buttonContinueTitle = settings.buttonContinueTitle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.buttonLearnmoreTitle !== 'undefined') {\r\n\t\t\t\t_self.params.buttonLearnmoreTitle = settings.buttonLearnmoreTitle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.buttonLearnmoreOpenInNewWindow !== 'undefined') {\r\n\t\t\t\t_self.params.buttonLearnmoreOpenInNewWindow = settings.buttonLearnmoreOpenInNewWindow;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.agreementExpiresInDays !== 'undefined') {\r\n\t\t\t\t_self.params.agreementExpiresInDays = settings.agreementExpiresInDays;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.autoAcceptCookiePolicy !== 'undefined') {\r\n\t\t\t\t_self.params.autoAcceptCookiePolicy = settings.autoAcceptCookiePolicy;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.htmlMarkup !== 'undefined') {\r\n\t\t\t\t_self.params.htmlMarkup = settings.htmlMarkup;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tvar createHtmlMarkup = function() {\r\n\r\n\t\tif (_self.params.htmlMarkup) {\r\n\t\t\treturn _self.params.htmlMarkup;\r\n\t\t}\r\n\r\n\t\tvar html =\r\n\t\t\t'
' +\r\n\t\t\t\t'
' + _self.params.popupTitle + '
' +\r\n\t\t\t\t'
' + _self.params.popupText + '
' +\r\n\t\t\t\t'
' +\r\n\t\t\t\t '' + _self.params.buttonContinueTitle + '' +\r\n\t\t\t\t '' + _self.params.buttonLearnmoreTitle + '' +\r\n\t\t\t\t '
' +\r\n\t\t\t\t'
' +\r\n\t\t\t\t'x' +\r\n\t\t\t'
';\r\n\r\n\t\treturn html;\r\n\t};\r\n\r\n\t// Storing the consent in a cookie\r\n\tvar setUserAcceptsCookies = function(consent) {\r\n\t\tvar d = new Date();\r\n\t\tvar expiresInDays = _self.params.agreementExpiresInDays * 24 * 60 * 60 * 1000;\r\n\t\td.setTime( d.getTime() + expiresInDays );\r\n\t\tvar expires = \"expires=\" + d.toGMTString();\r\n\t\tdocument.cookie = _self.vars.COOKIE_NAME + '=' + consent + \"; \" + expires + \";path=/\";\r\n\r\n\t\t$(document).trigger(\"user_cookie_consent_changed\", {'consent' : consent});\r\n\t};\r\n\r\n\t// Let's see if we have a consent cookie already\r\n\tvar userAlreadyAcceptedCookies = function() {\r\n\t\tvar userAcceptedCookies = false;\r\n\t\tvar cookies = document.cookie.split(\";\");\r\n\t\tfor (var i = 0; i < cookies.length; i++) {\r\n\t\t\tvar c = cookies[i].trim();\r\n\t\t\tif (c.indexOf(_self.vars.COOKIE_NAME) !== -1) {\r\n\t\t\t\tuserAcceptedCookies = c.substring(_self.vars.COOKIE_NAME.length + 1, c.length);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn userAcceptedCookies;\r\n\t};\r\n\r\n\tvar hideContainer = function() {\r\n\t\t// $('.eupopup-container').slideUp(200);\r\n\t\t$('.eupopup-container').animate({\r\n\t\t\topacity: 0,\r\n\t\t\theight: 0\r\n\t\t}, 200, function() {\r\n\t\t\t$('.eupopup-container').hide(0);\r\n\t\t});\r\n\t};\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// PUBLIC FUNCTIONS //////////////////////////////////////////////////////////////////////////\r\n\tvar publicfunc = {\r\n\r\n\t\t// INITIALIZE EU COOKIE LAW POPUP /////////////////////////////////////////////////////////\r\n\t\tinit : function(settings) {\r\n\r\n\t\t\tparseParameters(\r\n\t\t\t\t$(\".eupopup\").first(),\r\n\t\t\t\t$(\".eupopup-markup\").html(),\r\n\t\t\t\tsettings);\r\n\r\n\t\t\t// No need to display this if user already accepted the policy\r\n\t\t\tif (userAlreadyAcceptedCookies()) {\r\n $(document).trigger(\"user_cookie_already_accepted\", {'consent': true});\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// We should initialise only once\r\n\t\t\tif (_self.vars.INITIALISED) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_self.vars.INITIALISED = true;\r\n\r\n\t\t\t// Markup and event listeners >>>\r\n\t\t\t_self.vars.HTML_MARKUP = createHtmlMarkup();\r\n\r\n\t\t\tif ($('.eupopup-block').length > 0) {\r\n\t\t\t\t$('.eupopup-block').append(_self.vars.HTML_MARKUP);\r\n\t\t\t} else {\r\n\t\t\t\t$('BODY').append(_self.vars.HTML_MARKUP);\r\n\t\t\t}\r\n\r\n\t\t\t$('.eupopup-button_1').click(function() {\r\n\t\t\t\tsetUserAcceptsCookies(true);\r\n\t\t\t\thideContainer();\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t\t$('.eupopup-closebutton').click(function() {\r\n\t\t\t\tsetUserAcceptsCookies(true);\r\n\t\t\t\thideContainer();\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t\t// ^^^ Markup and event listeners\r\n\r\n\t\t\t// Ready to start!\r\n\t\t\t$('.eupopup-container').show();\r\n\r\n\t\t\t// In case it's alright to just display the message once\r\n\t\t\tif (_self.params.autoAcceptCookiePolicy) {\r\n\t\t\t\tsetUserAcceptsCookies(true);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\treturn publicfunc;\r\n});\r\n});\r\n"],"names":["define","$","window","console","log","fn","euCookieLawPopup","_self","this","params","cookiePolicyUrl","popupPosition","colorStyle","compactStyle","popupTitle","popupText","buttonContinueTitle","buttonLearnmoreTitle","buttonLearnmoreOpenInNewWindow","agreementExpiresInDays","autoAcceptCookiePolicy","htmlMarkup","vars","INITIALISED","HTML_MARKUP","COOKIE_NAME","parseParameters","setUserAcceptsCookies","consent","d","Date","expiresInDays","setTime","getTime","expires","toGMTString","document","cookie","trigger","hideContainer","animate","opacity","height","hide","init","settings","object","markup","className","attr","indexOf","first","html","userAcceptedCookies","cookies","split","i","length","c","trim","substring","userAlreadyAcceptedCookies","append","click","show"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/managedocsactions.min.js.map b/admin/tool/policy/amd/build/managedocsactions.min.js.map index d2962520b4e..fff2fb3ad9e 100644 --- a/admin/tool/policy/amd/build/managedocsactions.min.js.map +++ b/admin/tool/policy/amd/build/managedocsactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"managedocsactions.min.js","sources":["../src/managedocsactions.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 * Adds support for confirmation via JS modal for some management actions at the Manage policies page.\n *\n * @module tool_policy/managedocsactions\n * @copyright 2018 David Mudrák \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/log',\n 'core/config',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'\n], function($, Log, Config, Str, ModalFactory, ModalEvents) {\n\n \"use strict\";\n\n /**\n * List of action selectors.\n *\n * @property {string} LINKS - Selector for all action links\n * @property {string} MAKE_CURRENT\n */\n var ACTION = {\n LINKS: '[data-action]',\n MAKE_CURRENT: '[data-action=\"makecurrent\"]',\n INACTIVATE: '[data-action=\"inactivate\"]',\n DELETE: '[data-action=\"delete\"]'\n };\n\n /**\n * @constructor\n * @param {Element} base - Management area wrapping element\n */\n function ManageDocsActions(base) {\n this.base = base;\n\n this.initEvents();\n }\n\n /**\n * Register event listeners.\n */\n ManageDocsActions.prototype.initEvents = function() {\n var self = this;\n\n self.base.on('click', ACTION.LINKS, function(e) {\n e.stopPropagation();\n\n var link = $(e.currentTarget);\n var promise;\n var strings;\n\n if (link.is(ACTION.MAKE_CURRENT)) {\n promise = Str.get_strings([\n {key: 'activating', component: 'tool_policy'},\n {key: 'activateconfirm', component: 'tool_policy', param: {\n name: link.closest('[data-policy-name]').attr('data-policy-name'),\n revision: link.closest('[data-policy-revision]').attr('data-policy-revision')\n }},\n {key: 'activateconfirmyes', component: 'tool_policy'}\n ]);\n\n } else if (link.is(ACTION.INACTIVATE)) {\n promise = Str.get_strings([\n {key: 'inactivating', component: 'tool_policy'},\n {key: 'inactivatingconfirm', component: 'tool_policy', param: {\n name: link.closest('[data-policy-name]').attr('data-policy-name'),\n revision: link.closest('[data-policy-revision]').attr('data-policy-revision')\n }},\n {key: 'inactivatingconfirmyes', component: 'tool_policy'}\n ]);\n\n } else if (link.is(ACTION.DELETE)) {\n promise = Str.get_strings([\n {key: 'deleting', component: 'tool_policy'},\n {key: 'deleteconfirm', component: 'tool_policy', param: {\n name: link.closest('[data-policy-name]').attr('data-policy-name'),\n revision: link.closest('[data-policy-revision]').attr('data-policy-revision')\n }},\n {key: 'delete', component: 'core'}\n ]);\n\n } else {\n Log.error('unknown action type detected', 'tool_policy/managedocsactions');\n return;\n }\n\n e.preventDefault();\n\n promise.then(function(strs) {\n strings = strs;\n return ModalFactory.create({\n title: strings[0],\n body: strings[1],\n type: ModalFactory.types.SAVE_CANCEL\n });\n\n }).then(function(modal) {\n modal.setSaveButtonText(strings[2]);\n modal.getRoot().on(ModalEvents.save, function() {\n window.location.href = link.attr('href') + '&sesskey=' + Config.sesskey + '&confirm=1';\n });\n\n modal.getRoot().on(ModalEvents.hidden, function() {\n modal.destroy();\n });\n\n modal.show();\n return true;\n\n }).catch(function(e) {\n Log.error(e);\n return false;\n });\n });\n };\n\n return {\n /**\n * Factory method returning instance of the ManageDocsActions\n *\n * @param {String} baseid - ID of the management area wrapping element\n * @return {ManageDocsActions}\n */\n init: function(baseid) {\n var base = $(document.getElementById(baseid));\n\n if (base.length) {\n return new ManageDocsActions(base);\n\n } else {\n throw new Error(\"managedocsactions: Invalid base element identifier\");\n }\n }\n };\n});\n"],"names":["define","$","Log","Config","Str","ModalFactory","ModalEvents","ACTION","ManageDocsActions","base","initEvents","prototype","this","on","e","stopPropagation","promise","strings","link","currentTarget","is","get_strings","key","component","param","name","closest","attr","revision","error","preventDefault","then","strs","create","title","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","save","window","location","href","sesskey","hidden","destroy","show","catch","init","baseid","document","getElementById","length","Error"],"mappings":";;;;;;;AAsBAA,uCAAO,CACH,SACA,WACA,cACA,WACA,qBACA,sBACD,SAASC,EAAGC,IAAKC,OAAQC,IAAKC,aAAcC,iBAUvCC,aACO,gBADPA,oBAEc,8BAFdA,kBAGY,6BAHZA,cAIQ,kCAOHC,kBAAkBC,WAClBA,KAAOA,UAEPC,oBAMTF,kBAAkBG,UAAUD,WAAa,WAC1BE,KAENH,KAAKI,GAAG,QAASN,cAAc,SAASO,GACzCA,EAAEC,sBAGEC,QACAC,QAFAC,KAAOjB,EAAEa,EAAEK,kBAIXD,KAAKE,GAAGb,qBACRS,QAAUZ,IAAIiB,YAAY,CACtB,CAACC,IAAK,aAAcC,UAAW,eAC/B,CAACD,IAAK,kBAAmBC,UAAW,cAAeC,MAAO,CACtDC,KAAMP,KAAKQ,QAAQ,sBAAsBC,KAAK,oBAC9CC,SAAUV,KAAKQ,QAAQ,0BAA0BC,KAAK,0BAE1D,CAACL,IAAK,qBAAsBC,UAAW,sBAGxC,GAAIL,KAAKE,GAAGb,mBACfS,QAAUZ,IAAIiB,YAAY,CACtB,CAACC,IAAK,eAAgBC,UAAW,eACjC,CAACD,IAAK,sBAAuBC,UAAW,cAAeC,MAAO,CAC1DC,KAAMP,KAAKQ,QAAQ,sBAAsBC,KAAK,oBAC9CC,SAAUV,KAAKQ,QAAQ,0BAA0BC,KAAK,0BAE1D,CAACL,IAAK,yBAA0BC,UAAW,qBAG5C,CAAA,IAAIL,KAAKE,GAAGb,2BAWfL,IAAI2B,MAAM,+BAAgC,iCAV1Cb,QAAUZ,IAAIiB,YAAY,CACtB,CAACC,IAAK,WAAYC,UAAW,eAC7B,CAACD,IAAK,gBAAiBC,UAAW,cAAeC,MAAO,CACpDC,KAAMP,KAAKQ,QAAQ,sBAAsBC,KAAK,oBAC9CC,SAAUV,KAAKQ,QAAQ,0BAA0BC,KAAK,0BAE1D,CAACL,IAAK,SAAUC,UAAW,UAQnCT,EAAEgB,iBAEFd,QAAQe,MAAK,SAASC,aAClBf,QAAUe,KACH3B,aAAa4B,OAAO,CACvBC,MAAOjB,QAAQ,GACfkB,KAAMlB,QAAQ,GACdmB,KAAM/B,aAAagC,MAAMC,iBAG9BP,MAAK,SAASQ,cACbA,MAAMC,kBAAkBvB,QAAQ,IAChCsB,MAAME,UAAU5B,GAAGP,YAAYoC,MAAM,WACjCC,OAAOC,SAASC,KAAO3B,KAAKS,KAAK,QAAU,YAAcxB,OAAO2C,QAAU,gBAG9EP,MAAME,UAAU5B,GAAGP,YAAYyC,QAAQ,WACnCR,MAAMS,aAGVT,MAAMU,QACC,KAERC,OAAM,SAASpC,UACdZ,IAAI2B,MAAMf,IACH,SAKZ,CAOHqC,KAAM,SAASC,YACP3C,KAAOR,EAAEoD,SAASC,eAAeF,YAEjC3C,KAAK8C,cACE,IAAI/C,kBAAkBC,YAGvB,IAAI+C,MAAM"} \ No newline at end of file +{"version":3,"file":"managedocsactions.min.js","sources":["../src/managedocsactions.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 * Adds support for confirmation via JS modal for some management actions at the Manage policies page.\n *\n * @module tool_policy/managedocsactions\n * @copyright 2018 David Mudrák \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/log',\n 'core/config',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'\n], function($, Log, Config, Str, ModalFactory, ModalEvents) {\n\n \"use strict\";\n\n /**\n * List of action selectors.\n *\n * @property {string} LINKS - Selector for all action links\n * @property {string} MAKE_CURRENT\n */\n var ACTION = {\n LINKS: '[data-action]',\n MAKE_CURRENT: '[data-action=\"makecurrent\"]',\n INACTIVATE: '[data-action=\"inactivate\"]',\n DELETE: '[data-action=\"delete\"]'\n };\n\n /**\n * @constructor\n * @param {Element} base - Management area wrapping element\n */\n function ManageDocsActions(base) {\n this.base = base;\n\n this.initEvents();\n }\n\n /**\n * Register event listeners.\n */\n ManageDocsActions.prototype.initEvents = function() {\n var self = this;\n\n self.base.on('click', ACTION.LINKS, function(e) {\n e.stopPropagation();\n\n var link = $(e.currentTarget);\n var promise;\n var strings;\n\n if (link.is(ACTION.MAKE_CURRENT)) {\n promise = Str.get_strings([\n {key: 'activating', component: 'tool_policy'},\n {key: 'activateconfirm', component: 'tool_policy', param: {\n name: link.closest('[data-policy-name]').attr('data-policy-name'),\n revision: link.closest('[data-policy-revision]').attr('data-policy-revision')\n }},\n {key: 'activateconfirmyes', component: 'tool_policy'}\n ]);\n\n } else if (link.is(ACTION.INACTIVATE)) {\n promise = Str.get_strings([\n {key: 'inactivating', component: 'tool_policy'},\n {key: 'inactivatingconfirm', component: 'tool_policy', param: {\n name: link.closest('[data-policy-name]').attr('data-policy-name'),\n revision: link.closest('[data-policy-revision]').attr('data-policy-revision')\n }},\n {key: 'inactivatingconfirmyes', component: 'tool_policy'}\n ]);\n\n } else if (link.is(ACTION.DELETE)) {\n promise = Str.get_strings([\n {key: 'deleting', component: 'tool_policy'},\n {key: 'deleteconfirm', component: 'tool_policy', param: {\n name: link.closest('[data-policy-name]').attr('data-policy-name'),\n revision: link.closest('[data-policy-revision]').attr('data-policy-revision')\n }},\n {key: 'delete', component: 'core'}\n ]);\n\n } else {\n Log.error('unknown action type detected', 'tool_policy/managedocsactions');\n return;\n }\n\n e.preventDefault();\n\n promise.then(function(strs) {\n strings = strs;\n return ModalFactory.create({\n title: strings[0],\n body: strings[1],\n type: ModalFactory.types.SAVE_CANCEL\n });\n\n }).then(function(modal) {\n modal.setSaveButtonText(strings[2]);\n modal.getRoot().on(ModalEvents.save, function() {\n window.location.href = link.attr('href') + '&sesskey=' + Config.sesskey + '&confirm=1';\n });\n\n modal.getRoot().on(ModalEvents.hidden, function() {\n modal.destroy();\n });\n\n modal.show();\n return true;\n\n }).catch(function(e) {\n Log.error(e);\n return false;\n });\n });\n };\n\n return {\n /**\n * Factory method returning instance of the ManageDocsActions\n *\n * @param {String} baseid - ID of the management area wrapping element\n * @return {ManageDocsActions}\n */\n init: function(baseid) {\n var base = $(document.getElementById(baseid));\n\n if (base.length) {\n return new ManageDocsActions(base);\n\n } else {\n throw new Error(\"managedocsactions: Invalid base element identifier\");\n }\n }\n };\n});\n"],"names":["define","$","Log","Config","Str","ModalFactory","ModalEvents","ACTION","ManageDocsActions","base","this","initEvents","prototype","on","e","stopPropagation","promise","strings","link","currentTarget","is","get_strings","key","component","param","name","closest","attr","revision","error","preventDefault","then","strs","create","title","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","save","window","location","href","sesskey","hidden","destroy","show","catch","init","baseid","document","getElementById","length","Error"],"mappings":";;;;;;;AAsBAA,OAAM,gCAAC,CACH,SACA,WACA,cACA,WACA,qBACA,sBACD,SAASC,EAAGC,IAAKC,OAAQC,IAAKC,aAAcC,aAU3C,IAAIC,aACO,gBADPA,oBAEc,8BAFdA,kBAGY,6BAHZA,cAIQ,yBAOHC,SAAAA,kBAAkBC,MAClBA,KAAAA,KAAOA,KAEZC,KAAKC,YACR,CAgFM,OA3EPH,kBAAkBI,UAAUD,WAAa,WAC1BD,KAEND,KAAKI,GAAG,QAASN,cAAc,SAASO,GACzCA,EAAEC,kBAEF,IACIC,QACAC,QAFAC,KAAOjB,EAAEa,EAAEK,eAIXD,GAAAA,KAAKE,GAAGb,qBACRS,QAAUZ,IAAIiB,YAAY,CACtB,CAACC,IAAK,aAAcC,UAAW,eAC/B,CAACD,IAAK,kBAAmBC,UAAW,cAAeC,MAAO,CACtDC,KAAMP,KAAKQ,QAAQ,sBAAsBC,KAAK,oBAC9CC,SAAUV,KAAKQ,QAAQ,0BAA0BC,KAAK,0BAE1D,CAACL,IAAK,qBAAsBC,UAAW,sBAGxC,GAAIL,KAAKE,GAAGb,mBACfS,QAAUZ,IAAIiB,YAAY,CACtB,CAACC,IAAK,eAAgBC,UAAW,eACjC,CAACD,IAAK,sBAAuBC,UAAW,cAAeC,MAAO,CAC1DC,KAAMP,KAAKQ,QAAQ,sBAAsBC,KAAK,oBAC9CC,SAAUV,KAAKQ,QAAQ,0BAA0BC,KAAK,0BAE1D,CAACL,IAAK,yBAA0BC,UAAW,qBAG5C,KAAIL,KAAKE,GAAGb,eAYf,YADAL,IAAI2B,MAAM,+BAAgC,iCAV1Cb,QAAUZ,IAAIiB,YAAY,CACtB,CAACC,IAAK,WAAYC,UAAW,eAC7B,CAACD,IAAK,gBAAiBC,UAAW,cAAeC,MAAO,CACpDC,KAAMP,KAAKQ,QAAQ,sBAAsBC,KAAK,oBAC9CC,SAAUV,KAAKQ,QAAQ,0BAA0BC,KAAK,0BAE1D,CAACL,IAAK,SAAUC,UAAW,SAMlC,CAEDT,EAAEgB,iBAEFd,QAAQe,MAAK,SAASC,MAEX3B,OADPY,QAAUe,KACH3B,aAAa4B,OAAO,CACvBC,MAAOjB,QAAQ,GACfkB,KAAMlB,QAAQ,GACdmB,KAAM/B,aAAagC,MAAMC,aAGhC,IAAEP,MAAK,SAASQ,OAWb,OAVAA,MAAMC,kBAAkBvB,QAAQ,IAChCsB,MAAME,UAAU5B,GAAGP,YAAYoC,MAAM,WACjCC,OAAOC,SAASC,KAAO3B,KAAKS,KAAK,QAAU,YAAcxB,OAAO2C,QAAU,YAC7E,IAEDP,MAAME,UAAU5B,GAAGP,YAAYyC,QAAQ,WACnCR,MAAMS,SACT,IAEDT,MAAMU,QACC,CAEV,IAAEC,OAAM,SAASpC,GAEd,OADAZ,IAAI2B,MAAMf,IACH,CACV,GACJ,GACJ,EAEM,CAOHqC,KAAM,SAASC,QACP3C,IAAAA,KAAOR,EAAEoD,SAASC,eAAeF,SAEjC3C,GAAAA,KAAK8C,OACL,OAAO,IAAI/C,kBAAkBC,MAG7B,MAAM,IAAI+C,MAAM,qDAEvB,EAER"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/policyactions.min.js.map b/admin/tool/policy/amd/build/policyactions.min.js.map index fb97f1b84ae..be59ab8c6f1 100644 --- a/admin/tool/policy/amd/build/policyactions.min.js.map +++ b/admin/tool/policy/amd/build/policyactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"policyactions.min.js","sources":["../src/policyactions.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 * Policy actions.\n *\n * @module tool_policy/policyactions\n * @copyright 2018 Sara Arjona (sara@moodle.com)\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, ModalFactory, ModalEvents) {\n\n /**\n * PolicyActions class.\n *\n * @param {jQuery} root\n */\n var PolicyActions = function(root) {\n this.registerEvents(root);\n };\n\n /**\n * Register event listeners.\n *\n * @param {jQuery} root\n */\n PolicyActions.prototype.registerEvents = function(root) {\n root.on(\"click\", function(e) {\n e.preventDefault();\n\n var versionid = $(this).data('versionid');\n var behalfid = $(this).data('behalfid');\n\n var params = {\n 'versionid': versionid,\n 'behalfid': behalfid\n };\n\n var request = {\n methodname: 'tool_policy_get_policy_version',\n args: params\n };\n\n var modalTitle = $.Deferred();\n var modalBody = $.Deferred();\n\n var modal = ModalFactory.create({\n title: modalTitle,\n body: modalBody,\n large: true\n })\n .then(function(modal) {\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n })\n .then(function(modal) {\n modal.show();\n\n return modal;\n })\n .catch(Notification.exception);\n\n // Make the request now that the modal is configured.\n var promises = Ajax.call([request]);\n $.when(promises[0]).then(function(data) {\n if (data.result.policy) {\n modalTitle.resolve(data.result.policy.name);\n modalBody.resolve(data.result.policy.content);\n\n return data;\n } else {\n throw new Error(data.warnings[0].message);\n }\n }).catch(function(message) {\n modal.then(function(modal) {\n modal.hide();\n modal.destroy();\n\n return modal;\n })\n .catch(Notification.exception);\n\n return Notification.addNotification({\n message: message,\n type: 'error'\n });\n });\n });\n\n };\n\n return /** @alias module:tool_policy/policyactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the actions helper.\n *\n * @method init\n * @param {object} root\n * @return {PolicyActions}\n */\n 'init': function(root) {\n root = $(root);\n return new PolicyActions(root);\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","ModalFactory","ModalEvents","PolicyActions","root","registerEvents","prototype","on","e","preventDefault","request","methodname","args","this","data","modalTitle","Deferred","modalBody","modal","create","title","body","large","then","getRoot","hidden","destroy","show","catch","exception","promises","call","when","result","policy","resolve","name","content","Error","warnings","message","hide","addNotification","type"],"mappings":";;;;;;;AAsBAA,mCAAO,CACH,SACA,YACA,oBACA,qBACA,sBACJ,SAASC,EAAGC,KAAMC,aAAcC,aAAcC,iBAOtCC,cAAgB,SAASC,WACpBC,eAAeD,cAQxBD,cAAcG,UAAUD,eAAiB,SAASD,MAC9CA,KAAKG,GAAG,SAAS,SAASC,GACtBA,EAAEC,qBAUEC,QAAU,CACVC,WAAY,iCACZC,KAPS,WAHGd,EAAEe,MAAMC,KAAK,sBACdhB,EAAEe,MAAMC,KAAK,cAYxBC,WAAajB,EAAEkB,WACfC,UAAYnB,EAAEkB,WAEdE,MAAQjB,aAAakB,OAAO,CAC5BC,MAAOL,WACPM,KAAMJ,UACNK,OAAO,IAEVC,MAAK,SAASL,cAEXA,MAAMM,UAAUjB,GAAGL,YAAYuB,QAAQ,WAEnCP,MAAMQ,aAGHR,SAEVK,MAAK,SAASL,cACXA,MAAMS,OAECT,SAEVU,MAAM5B,aAAa6B,WAGhBC,SAAW/B,KAAKgC,KAAK,CAACrB,UAC1BZ,EAAEkC,KAAKF,SAAS,IAAIP,MAAK,SAAST,SAC1BA,KAAKmB,OAAOC,cACZnB,WAAWoB,QAAQrB,KAAKmB,OAAOC,OAAOE,MACtCnB,UAAUkB,QAAQrB,KAAKmB,OAAOC,OAAOG,SAE9BvB,WAED,IAAIwB,MAAMxB,KAAKyB,SAAS,GAAGC,YAEtCZ,OAAM,SAASY,gBACdtB,MAAMK,MAAK,SAASL,cAChBA,MAAMuB,OACNvB,MAAMQ,UAECR,SAEVU,MAAM5B,aAAa6B,WAEb7B,aAAa0C,gBAAgB,CAChCF,QAASA,QACTG,KAAM,iBAOgC,MAU1C,SAASvC,aACbA,KAAON,EAAEM,MACF,IAAID,cAAcC"} \ No newline at end of file +{"version":3,"file":"policyactions.min.js","sources":["../src/policyactions.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 * Policy actions.\n *\n * @module tool_policy/policyactions\n * @copyright 2018 Sara Arjona (sara@moodle.com)\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, ModalFactory, ModalEvents) {\n\n /**\n * PolicyActions class.\n *\n * @param {jQuery} root\n */\n var PolicyActions = function(root) {\n this.registerEvents(root);\n };\n\n /**\n * Register event listeners.\n *\n * @param {jQuery} root\n */\n PolicyActions.prototype.registerEvents = function(root) {\n root.on(\"click\", function(e) {\n e.preventDefault();\n\n var versionid = $(this).data('versionid');\n var behalfid = $(this).data('behalfid');\n\n var params = {\n 'versionid': versionid,\n 'behalfid': behalfid\n };\n\n var request = {\n methodname: 'tool_policy_get_policy_version',\n args: params\n };\n\n var modalTitle = $.Deferred();\n var modalBody = $.Deferred();\n\n var modal = ModalFactory.create({\n title: modalTitle,\n body: modalBody,\n large: true\n })\n .then(function(modal) {\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n })\n .then(function(modal) {\n modal.show();\n\n return modal;\n })\n .catch(Notification.exception);\n\n // Make the request now that the modal is configured.\n var promises = Ajax.call([request]);\n $.when(promises[0]).then(function(data) {\n if (data.result.policy) {\n modalTitle.resolve(data.result.policy.name);\n modalBody.resolve(data.result.policy.content);\n\n return data;\n } else {\n throw new Error(data.warnings[0].message);\n }\n }).catch(function(message) {\n modal.then(function(modal) {\n modal.hide();\n modal.destroy();\n\n return modal;\n })\n .catch(Notification.exception);\n\n return Notification.addNotification({\n message: message,\n type: 'error'\n });\n });\n });\n\n };\n\n return /** @alias module:tool_policy/policyactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the actions helper.\n *\n * @method init\n * @param {object} root\n * @return {PolicyActions}\n */\n 'init': function(root) {\n root = $(root);\n return new PolicyActions(root);\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","ModalFactory","ModalEvents","PolicyActions","root","registerEvents","prototype","on","e","preventDefault","versionid","request","methodname","args","this","data","behalfid","modalTitle","Deferred","modalBody","modal","create","title","body","large","then","getRoot","hidden","destroy","show","catch","exception","promises","call","when","result","policy","resolve","name","content","Error","warnings","message","hide","addNotification","type","init"],"mappings":";;;;;;;AAsBAA,OAAM,4BAAC,CACH,SACA,YACA,oBACA,qBACA,sBACJ,SAASC,EAAGC,KAAMC,aAAcC,aAAcC,aAO1C,IAAIC,cAAgB,SAASC,MACpBC,KAAAA,eAAeD,KACvB,EA6EqD,OAtEtDD,cAAcG,UAAUD,eAAiB,SAASD,MAC9CA,KAAKG,GAAG,SAAS,SAASC,GACtBA,EAAEC,iBAEEC,IAQAC,QAAU,CACVC,WAAY,iCACZC,KAPS,CACTH,UAJYZ,EAAEgB,MAAMC,KAAK,aAKbC,SAJDlB,EAAEgB,MAAMC,KAAK,cAYxBE,WAAanB,EAAEoB,WACfC,UAAYrB,EAAEoB,WAEdE,MAAQnB,aAAaoB,OAAO,CAC5BC,MAAOL,WACPM,KAAMJ,UACNK,OAAO,IAEVC,MAAK,SAASL,OAOX,OALAA,MAAMM,UAAUnB,GAAGL,YAAYyB,QAAQ,WAEnCP,MAAMQ,SACT,IAEMR,KACV,IACAK,MAAK,SAASL,OAGX,OAFAA,MAAMS,OAECT,KAjBC,IAmBXU,MAAM9B,aAAa+B,WAGhBC,SAAWjC,KAAKkC,KAAK,CAACtB,UAC1Bb,EAAEoC,KAAKF,SAAS,IAAIP,MAAK,SAASV,MAC9B,GAAIA,KAAKoB,OAAOC,OAIZ,OAHAnB,WAAWoB,QAAQtB,KAAKoB,OAAOC,OAAOE,MACtCnB,UAAUkB,QAAQtB,KAAKoB,OAAOC,OAAOG,SAE9BxB,KAED,MAAA,IAAIyB,MAAMzB,KAAK0B,SAAS,GAAGC,QAExC,IAAEZ,OAAM,SAASY,SASP1C,OARPoB,MAAMK,MAAK,SAASL,OAIhB,OAHAA,MAAMuB,OACNvB,MAAMQ,UAECR,KAJX,IAMCU,MAAM9B,aAAa+B,WAEb/B,aAAa4C,gBAAgB,CAChCF,QAASA,QACTG,KAAM,SAEb,GACJ,GAEJ,EAEqD,CAU1CC,KAAA,SAAS1C,MAEb,OADAA,KAAON,EAAEM,MACF,IAAID,cAAcC,KAC5B,EAER"} \ No newline at end of file diff --git a/admin/tool/templatelibrary/amd/build/display.min.js.map b/admin/tool/templatelibrary/amd/build/display.min.js.map index d5de42358b0..bdbef02ab7a 100644 --- a/admin/tool/templatelibrary/amd/build/display.min.js.map +++ b/admin/tool/templatelibrary/amd/build/display.min.js.map @@ -1 +1 @@ -{"version":3,"file":"display.min.js","sources":["../src/display.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 adds ajax display functions to the template library page.\n *\n * @module tool_templatelibrary/display\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/log', 'core/notification', 'core/templates', 'core/config', 'core/str'],\n function($, ajax, log, notification, templates, config, str) {\n\n /**\n * Search through a template for a template docs comment.\n *\n * @param {String} templateSource The raw template\n * @param {String} templateName The name of the template used to search for docs tag\n * @return {String|boolean} the correct comment or false\n */\n var findDocsSection = function(templateSource, templateName) {\n\n if (!templateSource) {\n return false;\n }\n // Find the comment section marked with @template component/template.\n var marker = \"@template \" + templateName,\n i = 0,\n sections = [];\n\n sections = templateSource.match(/{{!([\\s\\S]*?)}}/g);\n\n // If no sections match - show the entire file.\n if (sections !== null) {\n for (i = 0; i < sections.length; i++) {\n var section = sections[i];\n var start = section.indexOf(marker);\n if (start !== -1) {\n // Remove {{! and }} from start and end.\n var offset = start + marker.length + 1;\n section = section.substr(offset, section.length - 2 - offset);\n return section;\n }\n }\n }\n // No matching comment.\n return false;\n };\n\n /**\n * Handle a template loaded response.\n *\n * @param {String} templateName The template name\n * @param {String} source The template source\n * @param {String} originalSource The original template source (not theme overridden)\n */\n var templateLoaded = function(templateName, source, originalSource) {\n str.get_string('templateselected', 'tool_templatelibrary', templateName).done(function(s) {\n $('[data-region=\"displaytemplateheader\"]').text(s);\n }).fail(notification.exception);\n\n // Find the comment section marked with @template component/template.\n var docs = findDocsSection(source, templateName);\n\n if (docs === false) {\n // Docs was not in theme template, try original.\n docs = findDocsSection(originalSource, templateName);\n }\n\n // If we found a docs section, limit the template library to showing this section.\n if (docs) {\n source = docs;\n }\n\n $('[data-region=\"displaytemplatesource\"]').text(source);\n\n // Now search the text for a json example.\n\n var example = source.match(/Example context \\(json\\):([\\s\\S]*)/);\n var context = false;\n if (example) {\n var rawJSON = example[1].trim();\n try {\n context = $.parseJSON(rawJSON);\n } catch (e) {\n log.debug('Could not parse json example context for template.');\n log.debug(e);\n }\n }\n if (context) {\n templates.render(templateName, context).done(function(html, js) {\n templates.replaceNodeContents($('[data-region=\"displaytemplateexample\"]'), html, js);\n }).fail(notification.exception);\n } else {\n str.get_string('templatehasnoexample', 'tool_templatelibrary').done(function(s) {\n $('[data-region=\"displaytemplateexample\"]').text(s);\n }).fail(notification.exception);\n }\n };\n\n /**\n * Load the a template source from Moodle.\n *\n * @param {String} templateName\n */\n var loadTemplate = function(templateName) {\n var parts = templateName.split('/');\n var component = parts.shift();\n var name = parts.join('/');\n\n var promises = ajax.call([{\n methodname: 'core_output_load_template',\n args: {\n component: component,\n template: name,\n themename: config.theme,\n includecomments: true\n }\n }, {\n methodname: 'tool_templatelibrary_load_canonical_template',\n args: {\n component: component,\n template: name\n }\n }], true, false);\n\n // When returns a new promise that is resolved when all the passed in promises are resolved.\n // The arguments to the done become the values of each resolved promise.\n $.when.apply($, promises)\n .done(function(source, originalSource) {\n templateLoaded(templateName, source, originalSource);\n })\n .fail(notification.exception);\n };\n\n // Add the event listeners.\n $('[data-region=\"list-templates\"]').on('click', '[data-templatename]', function(e) {\n var templatename = $(this).data('templatename');\n e.preventDefault();\n loadTemplate(templatename);\n });\n\n // This module does not expose anything.\n return {};\n});\n"],"names":["define","$","ajax","log","notification","templates","config","str","findDocsSection","templateSource","templateName","sections","marker","i","match","length","section","start","indexOf","offset","substr","loadTemplate","parts","split","component","shift","name","join","promises","call","methodname","args","template","themename","theme","includecomments","when","apply","done","source","originalSource","get_string","s","text","fail","exception","docs","example","context","rawJSON","trim","parseJSON","e","debug","render","html","js","replaceNodeContents","templateLoaded","on","templatename","this","data","preventDefault"],"mappings":";;;;;;;AAsBAA,sCAAO,CAAC,SAAU,YAAa,WAAY,oBAAqB,iBAAkB,cAAe,aAC1F,SAASC,EAAGC,KAAMC,IAAKC,aAAcC,UAAWC,OAAQC,SASvDC,gBAAkB,SAASC,eAAgBC,kBAEtCD,sBACM,MAKPE,SAFAC,OAAS,aAAeF,aACxBG,EAAI,KAMS,QAHjBF,SAAWF,eAAeK,MAAM,yBAIvBD,EAAI,EAAGA,EAAIF,SAASI,OAAQF,IAAK,KAC9BG,QAAUL,SAASE,GACnBI,MAAQD,QAAQE,QAAQN,YACb,IAAXK,MAAc,KAEVE,OAASF,MAAQL,OAAOG,OAAS,SACrCC,QAAUA,QAAQI,OAAOD,OAAQH,QAAQD,OAAS,EAAII,gBAM3D,GA2DPE,aAAe,SAASX,kBACpBY,MAAQZ,aAAaa,MAAM,KAC3BC,UAAYF,MAAMG,QAClBC,KAAOJ,MAAMK,KAAK,KAElBC,SAAW1B,KAAK2B,KAAK,CAAC,CACtBC,WAAY,4BACZC,KAAM,CACEP,UAAWA,UACXQ,SAAUN,KACVO,UAAW3B,OAAO4B,MAClBC,iBAAiB,IAE1B,CACCL,WAAY,+CACZC,KAAM,CACEP,UAAWA,UACXQ,SAAUN,SAElB,GAAM,GAIVzB,EAAEmC,KAAKC,MAAMpC,EAAG2B,UACXU,MAAK,SAASC,OAAQC,iBAzEV,SAAS9B,aAAc6B,OAAQC,gBAChDjC,IAAIkC,WAAW,mBAAoB,uBAAwB/B,cAAc4B,MAAK,SAASI,GACnFzC,EAAE,yCAAyC0C,KAAKD,MACjDE,KAAKxC,aAAayC,eAGjBC,KAAOtC,gBAAgB+B,OAAQ7B,eAEtB,IAAToC,OAEAA,KAAOtC,gBAAgBgC,eAAgB9B,eAIvCoC,OACAP,OAASO,MAGb7C,EAAE,yCAAyC0C,KAAKJ,YAI5CQ,QAAUR,OAAOzB,MAAM,sCACvBkC,SAAU,KACVD,QAAS,KACLE,QAAUF,QAAQ,GAAGG,WAErBF,QAAU/C,EAAEkD,UAAUF,SACxB,MAAOG,GACLjD,IAAIkD,MAAM,sDACVlD,IAAIkD,MAAMD,IAGdJ,QACA3C,UAAUiD,OAAO5C,aAAcsC,SAASV,MAAK,SAASiB,KAAMC,IACxDnD,UAAUoD,oBAAoBxD,EAAE,0CAA2CsD,KAAMC,OAClFZ,KAAKxC,aAAayC,WAErBtC,IAAIkC,WAAW,uBAAwB,wBAAwBH,MAAK,SAASI,GACzEzC,EAAE,0CAA0C0C,KAAKD,MAClDE,KAAKxC,aAAayC,WAkCnBa,CAAehD,aAAc6B,OAAQC,mBAEtCI,KAAKxC,aAAayC,mBAI3B5C,EAAE,kCAAkC0D,GAAG,QAAS,uBAAuB,SAASP,OACxEQ,aAAe3D,EAAE4D,MAAMC,KAAK,gBAChCV,EAAEW,iBACF1C,aAAauC,iBAIV"} \ No newline at end of file +{"version":3,"file":"display.min.js","sources":["../src/display.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 adds ajax display functions to the template library page.\n *\n * @module tool_templatelibrary/display\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/log', 'core/notification', 'core/templates', 'core/config', 'core/str'],\n function($, ajax, log, notification, templates, config, str) {\n\n /**\n * Search through a template for a template docs comment.\n *\n * @param {String} templateSource The raw template\n * @param {String} templateName The name of the template used to search for docs tag\n * @return {String|boolean} the correct comment or false\n */\n var findDocsSection = function(templateSource, templateName) {\n\n if (!templateSource) {\n return false;\n }\n // Find the comment section marked with @template component/template.\n var marker = \"@template \" + templateName,\n i = 0,\n sections = [];\n\n sections = templateSource.match(/{{!([\\s\\S]*?)}}/g);\n\n // If no sections match - show the entire file.\n if (sections !== null) {\n for (i = 0; i < sections.length; i++) {\n var section = sections[i];\n var start = section.indexOf(marker);\n if (start !== -1) {\n // Remove {{! and }} from start and end.\n var offset = start + marker.length + 1;\n section = section.substr(offset, section.length - 2 - offset);\n return section;\n }\n }\n }\n // No matching comment.\n return false;\n };\n\n /**\n * Handle a template loaded response.\n *\n * @param {String} templateName The template name\n * @param {String} source The template source\n * @param {String} originalSource The original template source (not theme overridden)\n */\n var templateLoaded = function(templateName, source, originalSource) {\n str.get_string('templateselected', 'tool_templatelibrary', templateName).done(function(s) {\n $('[data-region=\"displaytemplateheader\"]').text(s);\n }).fail(notification.exception);\n\n // Find the comment section marked with @template component/template.\n var docs = findDocsSection(source, templateName);\n\n if (docs === false) {\n // Docs was not in theme template, try original.\n docs = findDocsSection(originalSource, templateName);\n }\n\n // If we found a docs section, limit the template library to showing this section.\n if (docs) {\n source = docs;\n }\n\n $('[data-region=\"displaytemplatesource\"]').text(source);\n\n // Now search the text for a json example.\n\n var example = source.match(/Example context \\(json\\):([\\s\\S]*)/);\n var context = false;\n if (example) {\n var rawJSON = example[1].trim();\n try {\n context = $.parseJSON(rawJSON);\n } catch (e) {\n log.debug('Could not parse json example context for template.');\n log.debug(e);\n }\n }\n if (context) {\n templates.render(templateName, context).done(function(html, js) {\n templates.replaceNodeContents($('[data-region=\"displaytemplateexample\"]'), html, js);\n }).fail(notification.exception);\n } else {\n str.get_string('templatehasnoexample', 'tool_templatelibrary').done(function(s) {\n $('[data-region=\"displaytemplateexample\"]').text(s);\n }).fail(notification.exception);\n }\n };\n\n /**\n * Load the a template source from Moodle.\n *\n * @param {String} templateName\n */\n var loadTemplate = function(templateName) {\n var parts = templateName.split('/');\n var component = parts.shift();\n var name = parts.join('/');\n\n var promises = ajax.call([{\n methodname: 'core_output_load_template',\n args: {\n component: component,\n template: name,\n themename: config.theme,\n includecomments: true\n }\n }, {\n methodname: 'tool_templatelibrary_load_canonical_template',\n args: {\n component: component,\n template: name\n }\n }], true, false);\n\n // When returns a new promise that is resolved when all the passed in promises are resolved.\n // The arguments to the done become the values of each resolved promise.\n $.when.apply($, promises)\n .done(function(source, originalSource) {\n templateLoaded(templateName, source, originalSource);\n })\n .fail(notification.exception);\n };\n\n // Add the event listeners.\n $('[data-region=\"list-templates\"]').on('click', '[data-templatename]', function(e) {\n var templatename = $(this).data('templatename');\n e.preventDefault();\n loadTemplate(templatename);\n });\n\n // This module does not expose anything.\n return {};\n});\n"],"names":["define","$","ajax","log","notification","templates","config","str","findDocsSection","templateSource","templateName","marker","sections","i","match","length","section","start","indexOf","offset","substr","loadTemplate","parts","split","component","shift","name","join","promises","call","methodname","args","template","themename","theme","includecomments","when","apply","done","source","originalSource","get_string","s","text","fail","exception","docs","example","context","rawJSON","trim","parseJSON","e","debug","render","html","js","replaceNodeContents","templateLoaded","on","templatename","this","data","preventDefault"],"mappings":";;;;;;;AAsBAA,OAAO,+BAAA,CAAC,SAAU,YAAa,WAAY,oBAAqB,iBAAkB,cAAe,aAC1F,SAASC,EAAGC,KAAMC,IAAKC,aAAcC,UAAWC,OAAQC,KASvDC,IAAAA,gBAAkB,SAASC,eAAgBC,cAEvC,IAACD,eACD,OAAO,EAGPE,IAEAC,SAFAD,OAAS,aAAeD,aACxBG,EAAI,EAMJD,GAAa,QAHjBA,SAAWH,eAAeK,MAAM,qBAI5B,IAAKD,EAAI,EAAGA,EAAID,SAASG,OAAQF,IAAK,CAClC,IAAIG,QAAUJ,SAASC,GACnBI,MAAQD,QAAQE,QAAQP,QAC5B,IAAe,IAAXM,MAAc,CAEVE,IAAAA,OAASF,MAAQN,OAAOI,OAAS,EAErC,OADAC,QAAUA,QAAQI,OAAOD,OAAQH,QAAQD,OAAS,EAAII,OAEzD,CACJ,CAGL,OAAO,CACV,EA0DGE,aAAe,SAASX,cACxB,IAAIY,MAAQZ,aAAaa,MAAM,KAC3BC,UAAYF,MAAMG,QAClBC,KAAOJ,MAAMK,KAAK,KAElBC,SAAW1B,KAAK2B,KAAK,CAAC,CACtBC,WAAY,4BACZC,KAAM,CACEP,UAAWA,UACXQ,SAAUN,KACVO,UAAW3B,OAAO4B,MAClBC,iBAAiB,IAE1B,CACCL,WAAY,+CACZC,KAAM,CACEP,UAAWA,UACXQ,SAAUN,SAElB,GAAM,GAIVzB,EAAEmC,KAAKC,MAAMpC,EAAG2B,UACXU,MAAK,SAASC,OAAQC,iBAzEV,SAAS9B,aAAc6B,OAAQC,gBAChDjC,IAAIkC,WAAW,mBAAoB,uBAAwB/B,cAAc4B,MAAK,SAASI,GACnFzC,EAAE,yCAAyC0C,KAAKD,EADpD,IAEGE,KAAKxC,aAAayC,WAGrB,IAAIC,KAAOtC,gBAAgB+B,OAAQ7B,eAEtB,IAAToC,OAEAA,KAAOtC,gBAAgBgC,eAAgB9B,eAIvCoC,OACAP,OAASO,MAGb7C,EAAE,yCAAyC0C,KAAKJ,QAIhD,IAAIQ,QAAUR,OAAOzB,MAAM,sCACvBkC,SAAU,EACd,GAAID,QAAS,CACLE,IAAAA,QAAUF,QAAQ,GAAGG,OACrB,IACAF,QAAU/C,EAAEkD,UAAUF,QAD1B,CAEE,MAAOG,GACLjD,IAAIkD,MAAM,sDACVlD,IAAIkD,MAAMD,EACb,CACJ,CACGJ,QACA3C,UAAUiD,OAAO5C,aAAcsC,SAASV,MAAK,SAASiB,KAAMC,IACxDnD,UAAUoD,oBAAoBxD,EAAE,0CAA2CsD,KAAMC,GADrF,IAEGZ,KAAKxC,aAAayC,WAErBtC,IAAIkC,WAAW,uBAAwB,wBAAwBH,MAAK,SAASI,GACzEzC,EAAE,0CAA0C0C,KAAKD,EADrD,IAEGE,KAAKxC,aAAayC,UAE5B,CAgCSa,CAAehD,aAAc6B,OAAQC,eAF3C,IAIKI,KAAKxC,aAAayC,UAC1B,EAUD,OAPA5C,EAAE,kCAAkC0D,GAAG,QAAS,uBAAuB,SAASP,GACxEQ,IAAAA,aAAe3D,EAAE4D,MAAMC,KAAK,gBAChCV,EAAEW,iBACF1C,aAAauC,aAChB,IAGM,EACV"} \ No newline at end of file diff --git a/admin/tool/templatelibrary/amd/build/search.min.js.map b/admin/tool/templatelibrary/amd/build/search.min.js.map index 51ef5370a44..13f8a592d3e 100644 --- a/admin/tool/templatelibrary/amd/build/search.min.js.map +++ b/admin/tool/templatelibrary/amd/build/search.min.js.map @@ -1 +1 @@ -{"version":3,"file":"search.min.js","sources":["../src/search.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 adds ajax search functions to the template library page.\n *\n * @module tool_templatelibrary/search\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/log', 'core/notification', 'core/templates', 'core/config'],\n function($, ajax, log, notification, templates, config) {\n\n /**\n * The ajax call has returned with a new list of templates.\n *\n * @method reloadListTemplate\n * @param {String[]} templateList List of template ids.\n */\n var reloadListTemplate = function(templateList) {\n templates.render('tool_templatelibrary/search_results', {templates: templateList})\n .done(function(result, js) {\n templates.replaceNode($('[data-region=\"searchresults\"]'), result, js);\n }).fail(notification.exception);\n };\n\n /**\n * Get the current values for the form inputs and refresh the list of matching templates.\n *\n * @method refreshSearch\n * @param {String} themename The naeme of the theme.\n */\n var refreshSearch = function(themename) {\n var componentStr = $('[data-field=\"component\"]').val();\n var searchStr = $('[data-region=\"list-templates\"] [data-region=\"input\"]').val();\n\n if (searchStr !== '') {\n $('[data-region=\"list-templates\"] [data-action=\"clearsearch\"]').removeClass('d-none');\n } else {\n $('[data-region=\"list-templates\"] [data-action=\"clearsearch\"]').addClass('d-none');\n }\n\n // Trigger the search.\n ajax.call([\n {methodname: 'tool_templatelibrary_list_templates',\n args: {component: componentStr, search: searchStr, themename: themename},\n done: reloadListTemplate,\n fail: notification.exception}\n ], true, false);\n };\n\n var throttle = null;\n\n /**\n * Call the specified function after a delay. If this function is called again before the function is executed,\n * the function will only be executed once.\n *\n * @method queueRefresh\n * @param {function} callback\n * @param {Number} delay The time in milliseconds to delay.\n */\n var queueRefresh = function(callback, delay) {\n if (throttle !== null) {\n window.clearTimeout(throttle);\n }\n\n throttle = window.setTimeout(function() {\n callback();\n throttle = null;\n }, delay);\n };\n\n var changeHandler = function() {\n queueRefresh(refreshSearch.bind(this, config.theme), 400);\n };\n // Add change handlers to refresh the list.\n $('[data-region=\"list-templates\"]').on('change', '[data-field=\"component\"]', changeHandler);\n $('[data-region=\"list-templates\"]').on('input', '[data-region=\"input\"]', changeHandler);\n $('[data-action=\"clearsearch\"]').on('click', function() {\n $('[data-region=\"input\"]').val('');\n refreshSearch(config.theme);\n $(this).addClass('d-none');\n });\n\n refreshSearch(config.theme);\n return {};\n});\n"],"names":["define","$","ajax","log","notification","templates","config","reloadListTemplate","templateList","render","done","result","js","replaceNode","fail","exception","refreshSearch","themename","componentStr","val","searchStr","removeClass","addClass","call","methodname","args","component","search","throttle","changeHandler","callback","delay","bind","this","theme","window","clearTimeout","setTimeout","on"],"mappings":";;;;;;;AAsBAA,qCAAO,CAAC,SAAU,YAAa,WAAY,oBAAqB,iBAAkB,gBAC3E,SAASC,EAAGC,KAAMC,IAAKC,aAAcC,UAAWC,YAQ/CC,mBAAqB,SAASC,cAC9BH,UAAUI,OAAO,sCAAuC,CAACJ,UAAWG,eAC/DE,MAAK,SAASC,OAAQC,IACnBP,UAAUQ,YAAYZ,EAAE,iCAAkCU,OAAQC,OACnEE,KAAKV,aAAaW,YASzBC,cAAgB,SAASC,eACrBC,aAAejB,EAAE,4BAA4BkB,MAC7CC,UAAYnB,EAAE,wDAAwDkB,MAExD,KAAdC,UACAnB,EAAE,8DAA8DoB,YAAY,UAE5EpB,EAAE,8DAA8DqB,SAAS,UAI7EpB,KAAKqB,KAAK,CACN,CAACC,WAAY,sCACXC,KAAM,CAACC,UAAWR,aAAcS,OAAQP,UAAWH,UAAWA,WAC9DP,KAAMH,mBACNO,KAAMV,aAAaW,aACtB,GAAM,IAGTa,SAAW,KAqBXC,cAAgB,WAXD,IAASC,SAAUC,MAAVD,SAYXd,cAAcgB,KAAKC,KAAM3B,OAAO4B,OAZXH,MAYmB,IAXpC,OAAbH,UACAO,OAAOC,aAAaR,UAGxBA,SAAWO,OAAOE,YAAW,WACzBP,WACAF,SAAW,OACZG,eAOP9B,EAAE,kCAAkCqC,GAAG,SAAU,2BAA4BT,eAC7E5B,EAAE,kCAAkCqC,GAAG,QAAS,wBAAyBT,eACzE5B,EAAE,+BAA+BqC,GAAG,SAAS,WACzCrC,EAAE,yBAAyBkB,IAAI,IAC/BH,cAAcV,OAAO4B,OACrBjC,EAAEgC,MAAMX,SAAS,aAGrBN,cAAcV,OAAO4B,OACd"} \ No newline at end of file +{"version":3,"file":"search.min.js","sources":["../src/search.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 adds ajax search functions to the template library page.\n *\n * @module tool_templatelibrary/search\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/log', 'core/notification', 'core/templates', 'core/config'],\n function($, ajax, log, notification, templates, config) {\n\n /**\n * The ajax call has returned with a new list of templates.\n *\n * @method reloadListTemplate\n * @param {String[]} templateList List of template ids.\n */\n var reloadListTemplate = function(templateList) {\n templates.render('tool_templatelibrary/search_results', {templates: templateList})\n .done(function(result, js) {\n templates.replaceNode($('[data-region=\"searchresults\"]'), result, js);\n }).fail(notification.exception);\n };\n\n /**\n * Get the current values for the form inputs and refresh the list of matching templates.\n *\n * @method refreshSearch\n * @param {String} themename The naeme of the theme.\n */\n var refreshSearch = function(themename) {\n var componentStr = $('[data-field=\"component\"]').val();\n var searchStr = $('[data-region=\"list-templates\"] [data-region=\"input\"]').val();\n\n if (searchStr !== '') {\n $('[data-region=\"list-templates\"] [data-action=\"clearsearch\"]').removeClass('d-none');\n } else {\n $('[data-region=\"list-templates\"] [data-action=\"clearsearch\"]').addClass('d-none');\n }\n\n // Trigger the search.\n ajax.call([\n {methodname: 'tool_templatelibrary_list_templates',\n args: {component: componentStr, search: searchStr, themename: themename},\n done: reloadListTemplate,\n fail: notification.exception}\n ], true, false);\n };\n\n var throttle = null;\n\n /**\n * Call the specified function after a delay. If this function is called again before the function is executed,\n * the function will only be executed once.\n *\n * @method queueRefresh\n * @param {function} callback\n * @param {Number} delay The time in milliseconds to delay.\n */\n var queueRefresh = function(callback, delay) {\n if (throttle !== null) {\n window.clearTimeout(throttle);\n }\n\n throttle = window.setTimeout(function() {\n callback();\n throttle = null;\n }, delay);\n };\n\n var changeHandler = function() {\n queueRefresh(refreshSearch.bind(this, config.theme), 400);\n };\n // Add change handlers to refresh the list.\n $('[data-region=\"list-templates\"]').on('change', '[data-field=\"component\"]', changeHandler);\n $('[data-region=\"list-templates\"]').on('input', '[data-region=\"input\"]', changeHandler);\n $('[data-action=\"clearsearch\"]').on('click', function() {\n $('[data-region=\"input\"]').val('');\n refreshSearch(config.theme);\n $(this).addClass('d-none');\n });\n\n refreshSearch(config.theme);\n return {};\n});\n"],"names":["define","$","ajax","log","notification","templates","config","reloadListTemplate","templateList","render","done","result","js","replaceNode","fail","exception","refreshSearch","themename","componentStr","val","searchStr","removeClass","addClass","call","methodname","args","component","search","throttle","changeHandler","callback","delay","bind","this","theme","window","clearTimeout","setTimeout","on"],"mappings":";;;;;;;AAsBAA,OAAM,8BAAC,CAAC,SAAU,YAAa,WAAY,oBAAqB,iBAAkB,gBAC3E,SAASC,EAAGC,KAAMC,IAAKC,aAAcC,UAAWC,QAQnD,IAAIC,mBAAqB,SAASC,cAC9BH,UAAUI,OAAO,sCAAuC,CAACJ,UAAWG,eAC/DE,MAAK,SAASC,OAAQC,IACnBP,UAAUQ,YAAYZ,EAAE,iCAAkCU,OAAQC,GAF1E,IAGOE,KAAKV,aAAaW,UAC5B,EAQGC,cAAgB,SAASC,WACrBC,IAAAA,aAAejB,EAAE,4BAA4BkB,MAC7CC,UAAYnB,EAAE,wDAAwDkB,MAExD,KAAdC,UACAnB,EAAE,8DAA8DoB,YAAY,UAE5EpB,EAAE,8DAA8DqB,SAAS,UAI7EpB,KAAKqB,KAAK,CACN,CAACC,WAAY,sCACXC,KAAM,CAACC,UAAWR,aAAcS,OAAQP,UAAWH,UAAWA,WAC9DP,KAAMH,mBACNO,KAAMV,aAAaW,aACtB,GAAM,EACZ,EAEGa,SAAW,KAqBXC,cAAgB,WAXD,IAASC,SAAUC,MAAVD,SAYXd,cAAcgB,KAAKC,KAAM3B,OAAO4B,OAZXH,MAYmB,IAXpC,OAAbH,UACAO,OAAOC,aAAaR,UAGxBA,SAAWO,OAAOE,YAAW,WACzBP,WACAF,SAAW,IAFJ,GAGRG,MAKN,EAWD,OATA9B,EAAE,kCAAkCqC,GAAG,SAAU,2BAA4BT,eAC7E5B,EAAE,kCAAkCqC,GAAG,QAAS,wBAAyBT,eACzE5B,EAAE,+BAA+BqC,GAAG,SAAS,WACzCrC,EAAE,yBAAyBkB,IAAI,IAC/BH,cAAcV,OAAO4B,OACrBjC,EAAEgC,MAAMX,SAAS,SACpB,IAEDN,cAAcV,OAAO4B,OACd,EACV"} \ No newline at end of file diff --git a/admin/tool/usertours/amd/build/filter_cssselector.min.js.map b/admin/tool/usertours/amd/build/filter_cssselector.min.js.map index e29a30215d8..1079b7ac1d9 100644 --- a/admin/tool/usertours/amd/build/filter_cssselector.min.js.map +++ b/admin/tool/usertours/amd/build/filter_cssselector.min.js.map @@ -1 +1 @@ -{"version":3,"file":"filter_cssselector.min.js","sources":["../src/filter_cssselector.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 * CSS selector client side filter.\n *\n * @module tool_usertours/filter_cssselector\n * @copyright 2020 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Checks whether the configured CSS selector exists on this page.\n *\n * @param {array} tourConfig The tour configuration.\n * @returns {boolean}\n */\nexport const filterMatches = function(tourConfig) {\n let filterValues = tourConfig.filtervalues.cssselector;\n if (filterValues[0]) {\n return !!document.querySelector(filterValues[0]);\n }\n // If there is no CSS selector configured, this page matches.\n return true;\n};\n"],"names":["tourConfig","filterValues","filtervalues","cssselector","document","querySelector"],"mappings":"wLA6B6B,SAASA,gBAC9BC,aAAeD,WAAWE,aAAaC,mBACvCF,aAAa,MACJG,SAASC,cAAcJ,aAAa"} \ No newline at end of file +{"version":3,"file":"filter_cssselector.min.js","sources":["../src/filter_cssselector.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 * CSS selector client side filter.\n *\n * @module tool_usertours/filter_cssselector\n * @copyright 2020 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Checks whether the configured CSS selector exists on this page.\n *\n * @param {array} tourConfig The tour configuration.\n * @returns {boolean}\n */\nexport const filterMatches = function(tourConfig) {\n let filterValues = tourConfig.filtervalues.cssselector;\n if (filterValues[0]) {\n return !!document.querySelector(filterValues[0]);\n }\n // If there is no CSS selector configured, this page matches.\n return true;\n};\n"],"names":["tourConfig","filterValues","filtervalues","cssselector","document","querySelector"],"mappings":"wLA6B6B,SAASA,YAClC,IAAIC,aAAeD,WAAWE,aAAaC,YAC3C,OAAIF,aAAa,MACJG,SAASC,cAAcJ,aAAa,GAIpD"} \ No newline at end of file diff --git a/admin/tool/usertours/amd/build/managesteps.min.js.map b/admin/tool/usertours/amd/build/managesteps.min.js.map index c77c4ceae4e..bd497a9be0a 100644 --- a/admin/tool/usertours/amd/build/managesteps.min.js.map +++ b/admin/tool/usertours/amd/build/managesteps.min.js.map @@ -1 +1 @@ -{"version":3,"file":"managesteps.min.js","sources":["../src/managesteps.js"],"sourcesContent":["/**\n * Step management code.\n *\n * @module tool_usertours/managesteps\n * @copyright 2016 Andrew Nicols \n */\ndefine(\n['jquery', 'core/str', 'core/notification'],\nfunction($, str, notification) {\n var manager = {\n /**\n * Confirm removal of the specified step.\n *\n * @method removeStep\n * @param {EventFacade} e The EventFacade\n */\n removeStep: function(e) {\n e.preventDefault();\n var targetUrl = $(e.currentTarget).attr('href');\n str.get_strings([\n {\n key: 'confirmstepremovaltitle',\n component: 'tool_usertours'\n },\n {\n key: 'confirmstepremovalquestion',\n component: 'tool_usertours'\n },\n {\n key: 'yes',\n component: 'moodle'\n },\n {\n key: 'no',\n component: 'moodle'\n }\n ])\n .then(function(s) {\n notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location = targetUrl;\n });\n\n return;\n })\n .catch();\n },\n\n /**\n * Setup the step management UI.\n *\n * @method setup\n */\n setup: function() {\n\n $('body').delegate('[data-action=\"delete\"]', 'click', manager.removeStep);\n }\n };\n\n return /** @alias module:tool_usertours/managesteps */ {\n /**\n * Setup the step management UI.\n *\n * @method setup\n */\n setup: manager.setup\n };\n});\n"],"names":["define","$","str","notification","manager","removeStep","e","preventDefault","targetUrl","currentTarget","attr","get_strings","key","component","then","s","confirm","window","location","catch","setup","delegate"],"mappings":"AAMAA,oCACA,CAAC,SAAU,WAAY,sBACvB,SAASC,EAAGC,IAAKC,kBACTC,QAAU,CAOVC,WAAY,SAASC,GACjBA,EAAEC,qBACEC,UAAYP,EAAEK,EAAEG,eAAeC,KAAK,QACxCR,IAAIS,YAAY,CACZ,CACIC,IAAY,0BACZC,UAAY,kBAEhB,CACID,IAAY,6BACZC,UAAY,kBAEhB,CACID,IAAY,MACZC,UAAY,UAEhB,CACID,IAAY,KACZC,UAAY,YAGnBC,MAAK,SAASC,GACXZ,aAAaa,QAAQD,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAI,WACzCE,OAAOC,SAAWV,gBAKzBW,SAQLC,MAAO,WAEHnB,EAAE,QAAQoB,SAAS,yBAA0B,QAASjB,QAAQC,oBAIf,CAMnDe,MAAOhB,QAAQgB"} \ No newline at end of file +{"version":3,"file":"managesteps.min.js","sources":["../src/managesteps.js"],"sourcesContent":["/**\n * Step management code.\n *\n * @module tool_usertours/managesteps\n * @copyright 2016 Andrew Nicols \n */\ndefine(\n['jquery', 'core/str', 'core/notification'],\nfunction($, str, notification) {\n var manager = {\n /**\n * Confirm removal of the specified step.\n *\n * @method removeStep\n * @param {EventFacade} e The EventFacade\n */\n removeStep: function(e) {\n e.preventDefault();\n var targetUrl = $(e.currentTarget).attr('href');\n str.get_strings([\n {\n key: 'confirmstepremovaltitle',\n component: 'tool_usertours'\n },\n {\n key: 'confirmstepremovalquestion',\n component: 'tool_usertours'\n },\n {\n key: 'yes',\n component: 'moodle'\n },\n {\n key: 'no',\n component: 'moodle'\n }\n ])\n .then(function(s) {\n notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location = targetUrl;\n });\n\n return;\n })\n .catch();\n },\n\n /**\n * Setup the step management UI.\n *\n * @method setup\n */\n setup: function() {\n\n $('body').delegate('[data-action=\"delete\"]', 'click', manager.removeStep);\n }\n };\n\n return /** @alias module:tool_usertours/managesteps */ {\n /**\n * Setup the step management UI.\n *\n * @method setup\n */\n setup: manager.setup\n };\n});\n"],"names":["define","$","str","notification","manager","removeStep","e","preventDefault","targetUrl","currentTarget","attr","get_strings","key","component","then","s","confirm","window","location","catch","setup","delegate"],"mappings":"AAMAA,OACA,6BAAA,CAAC,SAAU,WAAY,sBACvB,SAASC,EAAGC,IAAKC,cACb,IAAIC,QAAU,CAOVC,WAAY,SAASC,GACjBA,EAAEC,iBACF,IAAIC,UAAYP,EAAEK,EAAEG,eAAeC,KAAK,QACxCR,IAAIS,YAAY,CACZ,CACIC,IAAY,0BACZC,UAAY,kBAEhB,CACID,IAAY,6BACZC,UAAY,kBAEhB,CACID,IAAY,MACZC,UAAY,UAEhB,CACID,IAAY,KACZC,UAAY,YAGnBC,MAAK,SAASC,GACXZ,aAAaa,QAAQD,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAI,WACzCE,OAAOC,SAAWV,SACrB,GAGJ,IACAW,OAnCK,EA2CVC,MAAO,WAEHnB,EAAE,QAAQoB,SAAS,yBAA0B,QAASjB,QAAQC,WACjE,GAGkD,MAAA,CAMnDe,MAAOhB,QAAQgB,MAEtB"} \ No newline at end of file diff --git a/admin/tool/usertours/amd/build/managetours.min.js.map b/admin/tool/usertours/amd/build/managetours.min.js.map index 0f20e06fe7a..8e543986d0d 100644 --- a/admin/tool/usertours/amd/build/managetours.min.js.map +++ b/admin/tool/usertours/amd/build/managetours.min.js.map @@ -1 +1 @@ -{"version":3,"file":"managetours.min.js","sources":["../src/managetours.js"],"sourcesContent":["/**\n * Tour management code.\n *\n * @module tool_usertours/managetours\n * @copyright 2016 Andrew Nicols \n */\ndefine(\n['jquery', 'core/ajax', 'core/str', 'core/notification'],\nfunction($, ajax, str, notification) {\n var manager = {\n /**\n * Confirm removal of the specified tour.\n *\n * @method removeTour\n * @param {EventFacade} e The EventFacade\n */\n removeTour: function(e) {\n e.preventDefault();\n var targetUrl = $(e.currentTarget).attr('href');\n str.get_strings([\n {\n key: 'confirmtourremovaltitle',\n component: 'tool_usertours'\n },\n {\n key: 'confirmtourremovalquestion',\n component: 'tool_usertours'\n },\n {\n key: 'yes',\n component: 'moodle'\n },\n {\n key: 'no',\n component: 'moodle'\n }\n ])\n .then(function(s) {\n notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location = targetUrl;\n });\n\n return;\n })\n .catch();\n },\n\n /**\n * Setup the tour management UI.\n *\n * @method setup\n */\n setup: function() {\n $('body').delegate('[data-action=\"delete\"]', 'click', manager.removeTour);\n }\n };\n\n return /** @alias module:tool_usertours/managetours */ {\n /**\n * Setup the tour management UI.\n *\n * @method setup\n */\n setup: manager.setup\n };\n});\n"],"names":["define","$","ajax","str","notification","manager","removeTour","e","preventDefault","targetUrl","currentTarget","attr","get_strings","key","component","then","s","confirm","window","location","catch","setup","delegate"],"mappings":"AAMAA,oCACA,CAAC,SAAU,YAAa,WAAY,sBACpC,SAASC,EAAGC,KAAMC,IAAKC,kBACfC,QAAU,CAOVC,WAAY,SAASC,GACjBA,EAAEC,qBACEC,UAAYR,EAAEM,EAAEG,eAAeC,KAAK,QACxCR,IAAIS,YAAY,CACZ,CACIC,IAAY,0BACZC,UAAY,kBAEhB,CACID,IAAY,6BACZC,UAAY,kBAEhB,CACID,IAAY,MACZC,UAAY,UAEhB,CACID,IAAY,KACZC,UAAY,YAGnBC,MAAK,SAASC,GACXZ,aAAaa,QAAQD,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAI,WACzCE,OAAOC,SAAWV,gBAKzBW,SAQLC,MAAO,WACHpB,EAAE,QAAQqB,SAAS,yBAA0B,QAASjB,QAAQC,oBAIf,CAMnDe,MAAOhB,QAAQgB"} \ No newline at end of file +{"version":3,"file":"managetours.min.js","sources":["../src/managetours.js"],"sourcesContent":["/**\n * Tour management code.\n *\n * @module tool_usertours/managetours\n * @copyright 2016 Andrew Nicols \n */\ndefine(\n['jquery', 'core/ajax', 'core/str', 'core/notification'],\nfunction($, ajax, str, notification) {\n var manager = {\n /**\n * Confirm removal of the specified tour.\n *\n * @method removeTour\n * @param {EventFacade} e The EventFacade\n */\n removeTour: function(e) {\n e.preventDefault();\n var targetUrl = $(e.currentTarget).attr('href');\n str.get_strings([\n {\n key: 'confirmtourremovaltitle',\n component: 'tool_usertours'\n },\n {\n key: 'confirmtourremovalquestion',\n component: 'tool_usertours'\n },\n {\n key: 'yes',\n component: 'moodle'\n },\n {\n key: 'no',\n component: 'moodle'\n }\n ])\n .then(function(s) {\n notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location = targetUrl;\n });\n\n return;\n })\n .catch();\n },\n\n /**\n * Setup the tour management UI.\n *\n * @method setup\n */\n setup: function() {\n $('body').delegate('[data-action=\"delete\"]', 'click', manager.removeTour);\n }\n };\n\n return /** @alias module:tool_usertours/managetours */ {\n /**\n * Setup the tour management UI.\n *\n * @method setup\n */\n setup: manager.setup\n };\n});\n"],"names":["define","$","ajax","str","notification","manager","removeTour","e","preventDefault","targetUrl","currentTarget","attr","get_strings","key","component","then","s","confirm","window","location","catch","setup","delegate"],"mappings":"AAMAA,oCACA,CAAC,SAAU,YAAa,WAAY,sBACpC,SAASC,EAAGC,KAAMC,IAAKC,cACnB,IAAIC,QAAU,CAOVC,WAAY,SAASC,GACjBA,EAAEC,iBACF,IAAIC,UAAYR,EAAEM,EAAEG,eAAeC,KAAK,QACxCR,IAAIS,YAAY,CACZ,CACIC,IAAY,0BACZC,UAAY,kBAEhB,CACID,IAAY,6BACZC,UAAY,kBAEhB,CACID,IAAY,MACZC,UAAY,UAEhB,CACID,IAAY,KACZC,UAAY,YAGnBC,MAAK,SAASC,GACXZ,aAAaa,QAAQD,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAI,WACzCE,OAAOC,SAAWV,SACrB,GAGJ,IACAW,OAnCK,EA2CVC,MAAO,WACHpB,EAAE,QAAQqB,SAAS,yBAA0B,QAASjB,QAAQC,WACjE,GAGkD,MAAA,CAMnDe,MAAOhB,QAAQgB,MAEtB"} \ No newline at end of file diff --git a/admin/tool/usertours/amd/build/tour.min.js.map b/admin/tool/usertours/amd/build/tour.min.js.map index 33650241af7..e913eee6177 100644 --- a/admin/tool/usertours/amd/build/tour.min.js.map +++ b/admin/tool/usertours/amd/build/tour.min.js.map @@ -1 +1 @@ -{"version":3,"file":"tour.min.js","sources":["../src/tour.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 * Manage user tours in Moodle.\n *\n * @module tool_usertours/tour\n * @copyright 2018 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport * as Aria from 'core/aria';\nimport Popper from 'core/popper';\n\n/**\n * A Tour.\n *\n * @class\n */\nexport default class Tour {\n /**\n * @param {object} config The configuration object.\n */\n constructor(config) {\n this.init(config);\n }\n\n /**\n * Initialise the tour.\n *\n * @method init\n * @param {Object} config The configuration object.\n * @chainable\n * @return {Object} this.\n */\n init(config) {\n // Unset all handlers.\n this.eventHandlers = {};\n\n // Reset the current tour states.\n this.reset();\n\n // Store the initial configuration.\n this.originalConfiguration = config || {};\n\n // Apply configuration.\n this.configure.apply(this, arguments);\n\n try {\n this.storage = window.sessionStorage;\n this.storageKey = 'tourstate_' + this.tourName;\n } catch (e) {\n this.storage = false;\n this.storageKey = '';\n }\n\n return this;\n }\n\n /**\n * Reset the current tour state.\n *\n * @method reset\n * @chainable\n * @return {Object} this.\n */\n reset() {\n // Hide the current step.\n this.hide();\n\n // Unset all handlers.\n this.eventHandlers = [];\n\n // Unset all listeners.\n this.resetStepListeners();\n\n // Unset the original configuration.\n this.originalConfiguration = {};\n\n // Reset the current step number and list of steps.\n this.steps = [];\n\n // Reset the current step number.\n this.currentStepNumber = 0;\n\n return this;\n }\n\n /**\n * Prepare tour configuration.\n *\n * @method configure\n * @param {Object} config The configuration object.\n * @chainable\n * @return {Object} this.\n */\n configure(config) {\n if (typeof config === 'object') {\n // Tour name.\n if (typeof config.tourName !== 'undefined') {\n this.tourName = config.tourName;\n }\n\n // Set up eventHandlers.\n if (config.eventHandlers) {\n for (let eventName in config.eventHandlers) {\n config.eventHandlers[eventName].forEach(function(handler) {\n this.addEventHandler(eventName, handler);\n }, this);\n }\n }\n\n // Reset the step configuration.\n this.resetStepDefaults(true);\n\n // Configure the steps.\n if (typeof config.steps === 'object') {\n this.steps = config.steps;\n }\n\n if (typeof config.template !== 'undefined') {\n this.templateContent = config.template;\n }\n }\n\n // Check that we have enough to start the tour.\n this.checkMinimumRequirements();\n\n return this;\n }\n\n /**\n * Check that the configuration meets the minimum requirements.\n *\n * @method checkMinimumRequirements\n */\n checkMinimumRequirements() {\n // Need a tourName.\n if (!this.tourName) {\n throw new Error(\"Tour Name required\");\n }\n\n // Need a minimum of one step.\n if (!this.steps || !this.steps.length) {\n throw new Error(\"Steps must be specified\");\n }\n }\n\n /**\n * Reset step default configuration.\n *\n * @method resetStepDefaults\n * @param {Boolean} loadOriginalConfiguration Whether to load the original configuration supplied with the Tour.\n * @chainable\n * @return {Object} this.\n */\n resetStepDefaults(loadOriginalConfiguration) {\n if (typeof loadOriginalConfiguration === 'undefined') {\n loadOriginalConfiguration = true;\n }\n\n this.stepDefaults = {};\n if (!loadOriginalConfiguration || typeof this.originalConfiguration.stepDefaults === 'undefined') {\n this.setStepDefaults({});\n } else {\n this.setStepDefaults(this.originalConfiguration.stepDefaults);\n }\n\n return this;\n }\n\n /**\n * Set the step defaults.\n *\n * @method setStepDefaults\n * @param {Object} stepDefaults The step defaults to apply to all steps\n * @chainable\n * @return {Object} this.\n */\n setStepDefaults(stepDefaults) {\n if (!this.stepDefaults) {\n this.stepDefaults = {};\n }\n $.extend(\n this.stepDefaults,\n {\n element: '',\n placement: 'top',\n delay: 0,\n moveOnClick: false,\n moveAfterTime: 0,\n orphan: false,\n direction: 1,\n },\n stepDefaults\n );\n\n return this;\n }\n\n /**\n * Retrieve the current step number.\n *\n * @method getCurrentStepNumber\n * @return {Integer} The current step number\n */\n getCurrentStepNumber() {\n return parseInt(this.currentStepNumber, 10);\n }\n\n /**\n * Store the current step number.\n *\n * @method setCurrentStepNumber\n * @param {Integer} stepNumber The current step number\n * @chainable\n */\n setCurrentStepNumber(stepNumber) {\n this.currentStepNumber = stepNumber;\n if (this.storage) {\n try {\n this.storage.setItem(this.storageKey, stepNumber);\n } catch (e) {\n if (e.code === DOMException.QUOTA_EXCEEDED_ERR) {\n this.storage.removeItem(this.storageKey);\n }\n }\n }\n }\n\n /**\n * Get the next step number after the currently displayed step.\n *\n * @method getNextStepNumber\n * @param {Integer} stepNumber The current step number\n * @return {Integer} The next step number to display\n */\n getNextStepNumber(stepNumber) {\n if (typeof stepNumber === 'undefined') {\n stepNumber = this.getCurrentStepNumber();\n }\n let nextStepNumber = stepNumber + 1;\n\n // Keep checking the remaining steps.\n while (nextStepNumber <= this.steps.length) {\n if (this.isStepPotentiallyVisible(this.getStepConfig(nextStepNumber))) {\n return nextStepNumber;\n }\n nextStepNumber++;\n }\n\n return null;\n }\n\n /**\n * Get the previous step number before the currently displayed step.\n *\n * @method getPreviousStepNumber\n * @param {Integer} stepNumber The current step number\n * @return {Integer} The previous step number to display\n */\n getPreviousStepNumber(stepNumber) {\n if (typeof stepNumber === 'undefined') {\n stepNumber = this.getCurrentStepNumber();\n }\n let previousStepNumber = stepNumber - 1;\n\n // Keep checking the remaining steps.\n while (previousStepNumber >= 0) {\n if (this.isStepPotentiallyVisible(this.getStepConfig(previousStepNumber))) {\n return previousStepNumber;\n }\n previousStepNumber--;\n }\n\n return null;\n }\n\n /**\n * Is the step the final step number?\n *\n * @method isLastStep\n * @param {Integer} stepNumber Step number to test\n * @return {Boolean} Whether the step is the final step\n */\n isLastStep(stepNumber) {\n let nextStepNumber = this.getNextStepNumber(stepNumber);\n\n return nextStepNumber === null;\n }\n\n /**\n * Is the step the first step number?\n *\n * @method isFirstStep\n * @param {Integer} stepNumber Step number to test\n * @return {Boolean} Whether the step is the first step\n */\n isFirstStep(stepNumber) {\n let previousStepNumber = this.getPreviousStepNumber(stepNumber);\n\n return previousStepNumber === null;\n }\n\n /**\n * Is this step potentially visible?\n *\n * @method isStepPotentiallyVisible\n * @param {Object} stepConfig The step configuration to normalise\n * @return {Boolean} Whether the step is the potentially visible\n */\n isStepPotentiallyVisible(stepConfig) {\n if (!stepConfig) {\n // Without step config, there can be no step.\n return false;\n }\n\n if (this.isStepActuallyVisible(stepConfig)) {\n // If it is actually visible, it is already potentially visible.\n return true;\n }\n\n if (typeof stepConfig.orphan !== 'undefined' && stepConfig.orphan) {\n // Orphan steps have no target. They are always visible.\n return true;\n }\n\n if (typeof stepConfig.delay !== 'undefined' && stepConfig.delay) {\n // Only return true if the activated has not been used yet.\n return true;\n }\n\n // Not theoretically, or actually visible.\n return false;\n }\n\n /**\n * Is this step actually visible?\n *\n * @method isStepActuallyVisible\n * @param {Object} stepConfig The step configuration to normalise\n * @return {Boolean} Whether the step is actually visible\n */\n isStepActuallyVisible(stepConfig) {\n if (!stepConfig) {\n // Without step config, there can be no step.\n return false;\n }\n\n let target = this.getStepTarget(stepConfig);\n if (target && target.length && target.is(':visible')) {\n // Without a target, there can be no step.\n return !!target.length;\n }\n\n return false;\n }\n\n /**\n * Go to the next step in the tour.\n *\n * @method next\n * @chainable\n * @return {Object} this.\n */\n next() {\n return this.gotoStep(this.getNextStepNumber());\n }\n\n /**\n * Go to the previous step in the tour.\n *\n * @method previous\n * @chainable\n * @return {Object} this.\n */\n previous() {\n return this.gotoStep(this.getPreviousStepNumber(), -1);\n }\n\n /**\n * Go to the specified step in the tour.\n *\n * @method gotoStep\n * @param {Integer} stepNumber The step number to display\n * @param {Integer} direction Next or previous step\n * @chainable\n * @return {Object} this.\n */\n gotoStep(stepNumber, direction) {\n if (stepNumber < 0) {\n return this.endTour();\n }\n\n let stepConfig = this.getStepConfig(stepNumber);\n if (stepConfig === null) {\n return this.endTour();\n }\n\n return this._gotoStep(stepConfig, direction);\n }\n\n _gotoStep(stepConfig, direction) {\n if (!stepConfig) {\n return this.endTour();\n }\n\n if (typeof stepConfig.delay !== 'undefined' && stepConfig.delay && !stepConfig.delayed) {\n stepConfig.delayed = true;\n window.setTimeout(this._gotoStep.bind(this), stepConfig.delay, stepConfig, direction);\n\n return this;\n } else if (!stepConfig.orphan && !this.isStepActuallyVisible(stepConfig)) {\n let fn = direction == -1 ? 'getPreviousStepNumber' : 'getNextStepNumber';\n return this.gotoStep(this[fn](stepConfig.stepNumber), direction);\n }\n\n this.hide();\n\n this.fireEventHandlers('beforeRender', stepConfig);\n this.renderStep(stepConfig);\n this.fireEventHandlers('afterRender', stepConfig);\n\n return this;\n }\n\n /**\n * Fetch the normalised step configuration for the specified step number.\n *\n * @method getStepConfig\n * @param {Integer} stepNumber The step number to fetch configuration for\n * @return {Object} The step configuration\n */\n getStepConfig(stepNumber) {\n if (stepNumber === null || stepNumber < 0 || stepNumber >= this.steps.length) {\n return null;\n }\n\n // Normalise the step configuration.\n let stepConfig = this.normalizeStepConfig(this.steps[stepNumber]);\n\n // Add the stepNumber to the stepConfig.\n stepConfig = $.extend(stepConfig, {stepNumber: stepNumber});\n\n return stepConfig;\n }\n\n /**\n * Normalise the supplied step configuration.\n *\n * @method normalizeStepConfig\n * @param {Object} stepConfig The step configuration to normalise\n * @return {Object} The normalised step configuration\n */\n normalizeStepConfig(stepConfig) {\n\n if (typeof stepConfig.reflex !== 'undefined' && typeof stepConfig.moveAfterClick === 'undefined') {\n stepConfig.moveAfterClick = stepConfig.reflex;\n }\n\n if (typeof stepConfig.element !== 'undefined' && typeof stepConfig.target === 'undefined') {\n stepConfig.target = stepConfig.element;\n }\n\n if (typeof stepConfig.content !== 'undefined' && typeof stepConfig.body === 'undefined') {\n stepConfig.body = stepConfig.content;\n }\n\n stepConfig = $.extend({}, this.stepDefaults, stepConfig);\n\n stepConfig = $.extend({}, {\n attachTo: stepConfig.target,\n attachPoint: 'after',\n }, stepConfig);\n\n if (stepConfig.attachTo) {\n stepConfig.attachTo = $(stepConfig.attachTo).first();\n }\n\n return stepConfig;\n }\n\n /**\n * Fetch the actual step target from the selector.\n *\n * This should not be called until after any delay has completed.\n *\n * @method getStepTarget\n * @param {Object} stepConfig The step configuration\n * @return {$}\n */\n getStepTarget(stepConfig) {\n if (stepConfig.target) {\n return $(stepConfig.target);\n }\n\n return null;\n }\n\n /**\n * Fire any event handlers for the specified event.\n *\n * @param {String} eventName The name of the event to handle\n * @param {Object} data Any data to pass to the event\n * @chainable\n * @return {Object} this.\n */\n fireEventHandlers(eventName, data) {\n if (typeof this.eventHandlers[eventName] === 'undefined') {\n return this;\n }\n\n this.eventHandlers[eventName].forEach(function(thisEvent) {\n thisEvent.call(this, data);\n }, this);\n\n return this;\n }\n\n /**\n * @method addEventHandler\n * @param {string} eventName The name of the event to listen for\n * @param {function} handler The event handler to call\n * @return {Object} this.\n */\n addEventHandler(eventName, handler) {\n if (typeof this.eventHandlers[eventName] === 'undefined') {\n this.eventHandlers[eventName] = [];\n }\n\n this.eventHandlers[eventName].push(handler);\n\n return this;\n }\n\n /**\n * Process listeners for the step being shown.\n *\n * @method processStepListeners\n * @param {object} stepConfig The configuration for the step\n * @chainable\n * @return {Object} this.\n */\n processStepListeners(stepConfig) {\n this.listeners.push(\n // Next/Previous buttons.\n {\n node: this.currentStepNode,\n args: ['click', '[data-role=\"next\"]', $.proxy(this.next, this)]\n }, {\n node: this.currentStepNode,\n args: ['click', '[data-role=\"previous\"]', $.proxy(this.previous, this)]\n },\n\n // Close and end tour buttons.\n {\n node: this.currentStepNode,\n args: ['click', '[data-role=\"end\"]', $.proxy(this.endTour, this)]\n },\n\n // Click backdrop and hide tour.\n {\n node: $('[data-flexitour=\"backdrop\"]'),\n args: ['click', $.proxy(this.hide, this)]\n },\n\n // Keypresses.\n {\n node: $('body'),\n args: ['keydown', $.proxy(this.handleKeyDown, this)]\n });\n\n if (stepConfig.moveOnClick) {\n var targetNode = this.getStepTarget(stepConfig);\n this.listeners.push({\n node: targetNode,\n args: ['click', $.proxy(function(e) {\n if ($(e.target).parents('[data-flexitour=\"container\"]').length === 0) {\n // Ignore clicks when they are in the flexitour.\n window.setTimeout($.proxy(this.next, this), 500);\n }\n }, this)]\n });\n }\n\n this.listeners.forEach(function(listener) {\n listener.node.on.apply(listener.node, listener.args);\n });\n\n return this;\n }\n\n /**\n * Reset step listeners.\n *\n * @method resetStepListeners\n * @chainable\n * @return {Object} this.\n */\n resetStepListeners() {\n // Stop listening to all external handlers.\n if (this.listeners) {\n this.listeners.forEach(function(listener) {\n listener.node.off.apply(listener.node, listener.args);\n });\n }\n this.listeners = [];\n\n return this;\n }\n\n /**\n * The standard step renderer.\n *\n * @method renderStep\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n renderStep(stepConfig) {\n // Store the current step configuration for later.\n this.currentStepConfig = stepConfig;\n this.setCurrentStepNumber(stepConfig.stepNumber);\n\n // Fetch the template and convert it to a $ object.\n let template = $(this.getTemplateContent());\n\n // Title.\n template.find('[data-placeholder=\"title\"]')\n .html(stepConfig.title);\n\n // Body.\n template.find('[data-placeholder=\"body\"]')\n .html(stepConfig.body);\n\n // Is this the first step?\n if (this.isFirstStep(stepConfig.stepNumber)) {\n template.find('[data-role=\"previous\"]').hide();\n } else {\n template.find('[data-role=\"previous\"]').prop('disabled', false);\n }\n\n // Is this the final step?\n if (this.isLastStep(stepConfig.stepNumber)) {\n template.find('[data-role=\"next\"]').hide();\n template.find('[data-role=\"end\"]').removeClass(\"btn-secondary\").addClass(\"btn-primary\");\n } else {\n template.find('[data-role=\"next\"]').prop('disabled', false);\n }\n\n template.find('[data-role=\"previous\"]').attr('role', 'button');\n template.find('[data-role=\"next\"]').attr('role', 'button');\n template.find('[data-role=\"end\"]').attr('role', 'button');\n\n // Replace the template with the updated version.\n stepConfig.template = template;\n\n // Add to the page.\n this.addStepToPage(stepConfig);\n\n // Process step listeners after adding to the page.\n // This uses the currentNode.\n this.processStepListeners(stepConfig);\n\n return this;\n }\n\n /**\n * Getter for the template content.\n *\n * @method getTemplateContent\n * @return {$}\n */\n getTemplateContent() {\n return $(this.templateContent).clone();\n }\n\n /**\n * Helper to add a step to the page.\n *\n * @method addStepToPage\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n addStepToPage(stepConfig) {\n // Create the stepNode from the template data.\n let currentStepNode = $('')\n .html(stepConfig.template)\n .hide();\n\n // The scroll animation occurs on the body or html.\n let animationTarget = $('body, html')\n .stop(true, true);\n\n if (this.isStepActuallyVisible(stepConfig)) {\n let targetNode = this.getStepTarget(stepConfig);\n\n targetNode.data('flexitour', 'target');\n\n let zIndex = this.calculateZIndex(targetNode);\n if (zIndex) {\n stepConfig.zIndex = zIndex + 1;\n }\n\n if (stepConfig.zIndex) {\n currentStepNode.css('zIndex', stepConfig.zIndex + 1);\n }\n\n // Add the backdrop.\n this.positionBackdrop(stepConfig);\n\n $(document.body).append(currentStepNode);\n this.currentStepNode = currentStepNode;\n\n // Ensure that the step node is positioned.\n // Some situations mean that the value is not properly calculated without this step.\n this.currentStepNode.css({\n top: 0,\n left: 0,\n });\n\n animationTarget\n .animate({\n scrollTop: this.calculateScrollTop(stepConfig),\n }).promise().then(function() {\n this.positionStep(stepConfig);\n this.revealStep(stepConfig);\n return;\n }.bind(this))\n .catch(function() {\n // Silently fail.\n });\n\n } else if (stepConfig.orphan) {\n stepConfig.isOrphan = true;\n\n // This will be appended to the body instead.\n stepConfig.attachTo = $('body').first();\n stepConfig.attachPoint = 'append';\n\n // Add the backdrop.\n this.positionBackdrop(stepConfig);\n\n // This is an orphaned step.\n currentStepNode.addClass('orphan');\n\n // It lives in the body.\n $(document.body).append(currentStepNode);\n this.currentStepNode = currentStepNode;\n\n this.currentStepNode.offset(this.calculateStepPositionInPage());\n this.currentStepNode.css('position', 'fixed');\n\n this.currentStepPopper = new Popper(\n $('body'),\n this.currentStepNode[0], {\n removeOnDestroy: true,\n placement: stepConfig.placement + '-start',\n arrowElement: '[data-role=\"arrow\"]',\n // Empty the modifiers. We've already placed the step and don't want it moved.\n modifiers: {\n hide: {\n enabled: false,\n },\n applyStyle: {\n onLoad: null,\n enabled: false,\n },\n }\n }\n );\n\n this.revealStep(stepConfig);\n }\n\n return this;\n }\n\n /**\n * Make the given step visible.\n *\n * @method revealStep\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n revealStep(stepConfig) {\n // Fade the step in.\n this.currentStepNode.fadeIn('', $.proxy(function() {\n // Announce via ARIA.\n this.announceStep(stepConfig);\n\n // Focus on the current step Node.\n this.currentStepNode.focus();\n window.setTimeout($.proxy(function() {\n // After a brief delay, focus again.\n // There seems to be an issue with Jaws where it only reads the dialogue title initially.\n // This second focus helps it to read the full dialogue.\n if (this.currentStepNode) {\n this.currentStepNode.focus();\n }\n }, this), 100);\n\n }, this));\n\n return this;\n }\n\n /**\n * Helper to announce the step on the page.\n *\n * @method announceStep\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n announceStep(stepConfig) {\n // Setup the step Dialogue as per:\n // * https://www.w3.org/TR/wai-aria-practices/#dialog_nonmodal\n // * https://www.w3.org/TR/wai-aria-practices/#dialog_modal\n\n // Generate an ID for the current step node.\n let stepId = 'tour-step-' + this.tourName + '-' + stepConfig.stepNumber;\n this.currentStepNode.attr('id', stepId);\n\n let bodyRegion = this.currentStepNode.find('[data-placeholder=\"body\"]').first();\n bodyRegion.attr('id', stepId + '-body');\n bodyRegion.attr('role', 'document');\n\n let headerRegion = this.currentStepNode.find('[data-placeholder=\"title\"]').first();\n headerRegion.attr('id', stepId + '-title');\n headerRegion.attr('aria-labelledby', stepId + '-body');\n\n // Generally, a modal dialog has a role of dialog.\n this.currentStepNode.attr('role', 'dialog');\n this.currentStepNode.attr('tabindex', 0);\n this.currentStepNode.attr('aria-labelledby', stepId + '-title');\n this.currentStepNode.attr('aria-describedby', stepId + '-body');\n\n // Configure ARIA attributes on the target.\n let target = this.getStepTarget(stepConfig);\n if (target) {\n if (!target.attr('tabindex')) {\n target.attr('tabindex', 0);\n }\n\n target\n .data('original-describedby', target.attr('aria-describedby'))\n .attr('aria-describedby', stepId + '-body')\n ;\n }\n\n this.accessibilityShow(stepConfig);\n\n return this;\n }\n\n /**\n * Handle key down events.\n *\n * @method handleKeyDown\n * @param {EventFacade} e\n */\n handleKeyDown(e) {\n let tabbableSelector = 'a[href], link[href], [draggable=true], [contenteditable=true], ';\n tabbableSelector += ':input:enabled, [tabindex], button:enabled';\n switch (e.keyCode) {\n case 27:\n this.endTour();\n break;\n\n // 9 == Tab - trap focus for items with a backdrop.\n case 9:\n // Tab must be handled on key up only in this instance.\n (function() {\n if (!this.currentStepConfig.hasBackdrop) {\n // Trapping tab focus is only handled for those steps with a backdrop.\n return;\n }\n\n // Find all tabbable locations.\n let activeElement = $(document.activeElement);\n let stepTarget = this.getStepTarget(this.currentStepConfig);\n let tabbableNodes = $(tabbableSelector);\n let dialogContainer = $('span[data-flexitour=\"container\"]');\n let currentIndex;\n // Filter out element which is not belong to target section or dialogue.\n if (stepTarget) {\n tabbableNodes = tabbableNodes.filter(function(index, element) {\n return stepTarget !== null\n && (stepTarget.has(element).length\n || dialogContainer.has(element).length\n || stepTarget.is(element)\n || dialogContainer.is(element));\n });\n }\n\n // Find index of focusing element.\n tabbableNodes.each(function(index, element) {\n if (activeElement.is(element)) {\n currentIndex = index;\n return false;\n }\n // Keep looping.\n return true;\n });\n\n let nextIndex;\n let nextNode;\n let focusRelevant;\n if (currentIndex != void 0) {\n let direction = 1;\n if (e.shiftKey) {\n direction = -1;\n }\n nextIndex = currentIndex;\n do {\n nextIndex += direction;\n nextNode = $(tabbableNodes[nextIndex]);\n } while (nextNode.length && nextNode.is(':disabled') || nextNode.is(':hidden'));\n if (nextNode.length) {\n // A new f\n focusRelevant = nextNode.closest(stepTarget).length;\n focusRelevant = focusRelevant || nextNode.closest(this.currentStepNode).length;\n } else {\n // Unable to find the target somehow.\n focusRelevant = false;\n }\n }\n\n if (focusRelevant) {\n nextNode.focus();\n } else {\n if (e.shiftKey) {\n // Focus on the last tabbable node in the step.\n this.currentStepNode.find(tabbableSelector).last().focus();\n } else {\n if (this.currentStepConfig.isOrphan) {\n // Focus on the step - there is no target.\n this.currentStepNode.focus();\n } else {\n // Focus on the step target.\n stepTarget.focus();\n }\n }\n }\n e.preventDefault();\n }).call(this);\n break;\n }\n }\n\n /**\n * Start the current tour.\n *\n * @method startTour\n * @param {Integer} startAt Which step number to start at. If not specified, starts at the last point.\n * @chainable\n * @return {Object} this.\n */\n startTour(startAt) {\n if (this.storage && typeof startAt === 'undefined') {\n let storageStartValue = this.storage.getItem(this.storageKey);\n if (storageStartValue) {\n let storageStartAt = parseInt(storageStartValue, 10);\n if (storageStartAt <= this.steps.length) {\n startAt = storageStartAt;\n }\n }\n }\n\n if (typeof startAt === 'undefined') {\n startAt = this.getCurrentStepNumber();\n }\n\n this.fireEventHandlers('beforeStart', startAt);\n this.gotoStep(startAt);\n this.fireEventHandlers('afterStart', startAt);\n\n return this;\n }\n\n /**\n * Restart the tour from the beginning, resetting the completionlag.\n *\n * @method restartTour\n * @chainable\n * @return {Object} this.\n */\n restartTour() {\n return this.startTour(0);\n }\n\n /**\n * End the current tour.\n *\n * @method endTour\n * @chainable\n * @return {Object} this.\n */\n endTour() {\n this.fireEventHandlers('beforeEnd');\n\n if (this.currentStepConfig) {\n let previousTarget = this.getStepTarget(this.currentStepConfig);\n if (previousTarget) {\n if (!previousTarget.attr('tabindex')) {\n previousTarget.attr('tabindex', '-1');\n }\n previousTarget.focus();\n }\n }\n\n this.hide(true);\n\n this.fireEventHandlers('afterEnd');\n\n return this;\n }\n\n /**\n * Hide any currently visible steps.\n *\n * @method hide\n * @param {Bool} transition Animate the visibility change\n * @chainable\n * @return {Object} this.\n */\n hide(transition) {\n this.fireEventHandlers('beforeHide');\n\n if (this.currentStepNode && this.currentStepNode.length) {\n this.currentStepNode.hide();\n if (this.currentStepPopper) {\n this.currentStepPopper.destroy();\n }\n }\n\n // Restore original target configuration.\n if (this.currentStepConfig) {\n let target = this.getStepTarget(this.currentStepConfig);\n if (target) {\n if (target.data('original-labelledby')) {\n target.attr('aria-labelledby', target.data('original-labelledby'));\n }\n\n if (target.data('original-describedby')) {\n target.attr('aria-describedby', target.data('original-describedby'));\n }\n\n if (target.data('original-tabindex')) {\n target.attr('tabindex', target.data('tabindex'));\n }\n }\n\n // Clear the step configuration.\n this.currentStepConfig = null;\n }\n\n let fadeTime = 0;\n if (transition) {\n fadeTime = 400;\n }\n\n // Remove the backdrop features.\n $('[data-flexitour=\"step-background\"]').remove();\n $('[data-flexitour=\"step-backdrop\"]').removeAttr('data-flexitour');\n $('[data-flexitour=\"backdrop\"]').fadeOut(fadeTime, function() {\n $(this).remove();\n });\n\n // Remove aria-describedby and tabindex attributes.\n if (this.currentStepNode && this.currentStepNode.length) {\n let stepId = this.currentStepNode.attr('id');\n if (stepId) {\n let currentStepElement = '[aria-describedby=\"' + stepId + '-body\"]';\n $(currentStepElement).removeAttr('tabindex');\n $(currentStepElement).removeAttr('aria-describedby');\n }\n }\n\n // Reset the listeners.\n this.resetStepListeners();\n\n this.accessibilityHide();\n\n this.fireEventHandlers('afterHide');\n\n this.currentStepNode = null;\n this.currentStepPopper = null;\n return this;\n }\n\n /**\n * Show the current steps.\n *\n * @method show\n * @chainable\n * @return {Object} this.\n */\n show() {\n // Show the current step.\n let startAt = this.getCurrentStepNumber();\n\n return this.gotoStep(startAt);\n }\n\n /**\n * Return the current step node.\n *\n * @method getStepContainer\n * @return {jQuery}\n */\n getStepContainer() {\n return $(this.currentStepNode);\n }\n\n /**\n * Calculate scrollTop.\n *\n * @method calculateScrollTop\n * @param {Object} stepConfig The step configuration of the step\n * @return {Number}\n */\n calculateScrollTop(stepConfig) {\n let scrollTop = $(window).scrollTop();\n let viewportHeight = $(window).height();\n let targetNode = this.getStepTarget(stepConfig);\n\n if (stepConfig.placement === 'top') {\n // If the placement is top, center scroll at the top of the target.\n scrollTop = targetNode.offset().top - (viewportHeight / 2);\n } else if (stepConfig.placement === 'bottom') {\n // If the placement is bottom, center scroll at the bottom of the target.\n scrollTop = targetNode.offset().top + targetNode.height() - (viewportHeight / 2);\n } else if (targetNode.height() <= (viewportHeight * 0.8)) {\n // If the placement is left/right, and the target fits in the viewport, centre screen on the target\n scrollTop = targetNode.offset().top - ((viewportHeight - targetNode.height()) / 2);\n } else {\n // If the placement is left/right, and the target is bigger than the viewport, set scrollTop to target.top + buffer\n // and change step attachmentTarget to top+.\n scrollTop = targetNode.offset().top - (viewportHeight * 0.2);\n }\n\n // Never scroll over the top.\n scrollTop = Math.max(0, scrollTop);\n\n // Never scroll beyond the bottom.\n scrollTop = Math.min($(document).height() - viewportHeight, scrollTop);\n\n return Math.ceil(scrollTop);\n }\n\n /**\n * Calculate dialogue position for page middle.\n *\n * @method calculateScrollTop\n * @return {Number}\n */\n calculateStepPositionInPage() {\n let viewportHeight = $(window).height();\n let stepHeight = this.currentStepNode.height();\n\n let viewportWidth = $(window).width();\n let stepWidth = this.currentStepNode.width();\n\n return {\n top: Math.ceil((viewportHeight - stepHeight) / 2),\n left: Math.ceil((viewportWidth - stepWidth) / 2)\n };\n }\n\n /**\n * Position the step on the page.\n *\n * @method positionStep\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n positionStep(stepConfig) {\n let content = this.currentStepNode;\n if (!content || !content.length) {\n // Unable to find the step node.\n return this;\n }\n\n stepConfig.placement = this.recalculatePlacement(stepConfig);\n let flipBehavior;\n switch (stepConfig.placement) {\n case 'left':\n flipBehavior = ['left', 'right', 'top', 'bottom'];\n break;\n case 'right':\n flipBehavior = ['right', 'left', 'top', 'bottom'];\n break;\n case 'top':\n flipBehavior = ['top', 'bottom', 'right', 'left'];\n break;\n case 'bottom':\n flipBehavior = ['bottom', 'top', 'right', 'left'];\n break;\n default:\n flipBehavior = 'flip';\n break;\n }\n\n let target = this.getStepTarget(stepConfig);\n var config = {\n placement: stepConfig.placement + '-start',\n removeOnDestroy: true,\n modifiers: {\n flip: {\n behaviour: flipBehavior,\n },\n arrow: {\n element: '[data-role=\"arrow\"]',\n },\n },\n onCreate: function(data) {\n recalculateArrowPosition(data);\n },\n onUpdate: function(data) {\n recalculateArrowPosition(data);\n },\n };\n\n let recalculateArrowPosition = function(data) {\n let placement = data.placement.split('-')[0];\n const isVertical = ['left', 'right'].indexOf(placement) !== -1;\n const arrowElement = data.instance.popper.querySelector('[data-role=\"arrow\"]');\n const stepElement = $(data.instance.popper.querySelector('[data-role=\"flexitour-step\"]'));\n if (isVertical) {\n let arrowHeight = parseFloat(window.getComputedStyle(arrowElement).height);\n let arrowOffset = parseFloat(window.getComputedStyle(arrowElement).top);\n let popperHeight = parseFloat(window.getComputedStyle(data.instance.popper).height);\n let popperOffset = parseFloat(window.getComputedStyle(data.instance.popper).top);\n let popperBorderWidth = parseFloat(stepElement.css('borderTopWidth'));\n let popperBorderRadiusWidth = parseFloat(stepElement.css('borderTopLeftRadius')) * 2;\n let arrowPos = arrowOffset + (arrowHeight / 2);\n let maxPos = popperHeight + popperOffset - popperBorderWidth - popperBorderRadiusWidth;\n let minPos = popperOffset + popperBorderWidth + popperBorderRadiusWidth;\n if (arrowPos >= maxPos || arrowPos <= minPos) {\n let newArrowPos = 0;\n if (arrowPos > (popperHeight / 2)) {\n newArrowPos = maxPos - arrowHeight;\n } else {\n newArrowPos = minPos + arrowHeight;\n }\n $(arrowElement).css('top', newArrowPos);\n }\n } else {\n let arrowWidth = parseFloat(window.getComputedStyle(arrowElement).width);\n let arrowOffset = parseFloat(window.getComputedStyle(arrowElement).left);\n let popperWidth = parseFloat(window.getComputedStyle(data.instance.popper).width);\n let popperOffset = parseFloat(window.getComputedStyle(data.instance.popper).left);\n let popperBorderWidth = parseFloat(stepElement.css('borderTopWidth'));\n let popperBorderRadiusWidth = parseFloat(stepElement.css('borderTopLeftRadius')) * 2;\n let arrowPos = arrowOffset + (arrowWidth / 2);\n let maxPos = popperWidth + popperOffset - popperBorderWidth - popperBorderRadiusWidth;\n let minPos = popperOffset + popperBorderWidth + popperBorderRadiusWidth;\n if (arrowPos >= maxPos || arrowPos <= minPos) {\n let newArrowPos = 0;\n if (arrowPos > (popperWidth / 2)) {\n newArrowPos = maxPos - arrowWidth;\n } else {\n newArrowPos = minPos + arrowWidth;\n }\n $(arrowElement).css('left', newArrowPos);\n }\n }\n };\n\n let background = $('[data-flexitour=\"step-background\"]');\n if (background.length) {\n target = background;\n }\n this.currentStepPopper = new Popper(target, content[0], config);\n\n return this;\n }\n\n /**\n * For left/right placement, checks that there is room for the step at current window size.\n *\n * If there is not enough room, changes placement to 'top'.\n *\n * @method recalculatePlacement\n * @param {Object} stepConfig The step configuration of the step\n * @return {String} The placement after recalculate\n */\n recalculatePlacement(stepConfig) {\n const buffer = 10;\n const arrowWidth = 16;\n let target = this.getStepTarget(stepConfig);\n let widthContent = this.currentStepNode.width() + arrowWidth;\n let targetOffsetLeft = target.offset().left - buffer;\n let targetOffsetRight = target.offset().left + target.width() + buffer;\n let placement = stepConfig.placement;\n\n if (['left', 'right'].indexOf(placement) !== -1) {\n if ((targetOffsetLeft < (widthContent + buffer)) &&\n ((targetOffsetRight + widthContent + buffer) > document.documentElement.clientWidth)) {\n placement = 'top';\n }\n }\n return placement;\n }\n\n /**\n * Add the backdrop.\n *\n * @method positionBackdrop\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n positionBackdrop(stepConfig) {\n if (stepConfig.backdrop) {\n this.currentStepConfig.hasBackdrop = true;\n let backdrop = $('
');\n\n if (stepConfig.zIndex) {\n if (stepConfig.attachPoint === 'append') {\n stepConfig.attachTo.append(backdrop);\n } else {\n backdrop.insertAfter(stepConfig.attachTo);\n }\n } else {\n $('body').append(backdrop);\n }\n\n if (this.isStepActuallyVisible(stepConfig)) {\n // The step has a visible target.\n // Punch a hole through the backdrop.\n let background = $('
');\n\n let targetNode = this.getStepTarget(stepConfig);\n\n let buffer = 10;\n\n let colorNode = targetNode;\n if (buffer) {\n colorNode = $('body');\n }\n\n background.css({\n width: targetNode.outerWidth() + buffer + buffer,\n height: targetNode.outerHeight() + buffer + buffer,\n left: targetNode.offset().left - buffer,\n top: targetNode.offset().top - buffer,\n backgroundColor: this.calculateInherittedBackgroundColor(colorNode),\n });\n\n if (targetNode.offset().left < buffer) {\n background.css({\n width: targetNode.outerWidth() + targetNode.offset().left + buffer,\n left: targetNode.offset().left,\n });\n }\n\n if (targetNode.offset().top < buffer) {\n background.css({\n height: targetNode.outerHeight() + targetNode.offset().top + buffer,\n top: targetNode.offset().top,\n });\n }\n\n let targetRadius = targetNode.css('borderRadius');\n if (targetRadius && targetRadius !== $('body').css('borderRadius')) {\n background.css('borderRadius', targetRadius);\n }\n\n let targetPosition = this.calculatePosition(targetNode);\n if (targetPosition === 'fixed') {\n background.css('top', 0);\n } else if (targetPosition === 'absolute') {\n background.css('position', 'fixed');\n }\n\n let fader = background.clone();\n fader.css({\n backgroundColor: backdrop.css('backgroundColor'),\n opacity: backdrop.css('opacity'),\n });\n fader.attr('data-flexitour', 'step-background-fader');\n\n if (stepConfig.zIndex) {\n if (stepConfig.attachPoint === 'append') {\n stepConfig.attachTo.append(background);\n } else {\n fader.insertAfter(stepConfig.attachTo);\n background.insertAfter(stepConfig.attachTo);\n }\n } else {\n $('body').append(fader);\n $('body').append(background);\n }\n\n // Add the backdrop data to the actual target.\n // This is the part which actually does the work.\n targetNode.attr('data-flexitour', 'step-backdrop');\n\n if (stepConfig.zIndex) {\n backdrop.css('zIndex', stepConfig.zIndex);\n background.css('zIndex', stepConfig.zIndex + 1);\n targetNode.css('zIndex', stepConfig.zIndex + 2);\n }\n\n fader.fadeOut('2000', function() {\n $(this).remove();\n });\n }\n }\n return this;\n }\n\n /**\n * Calculate the inheritted z-index.\n *\n * @method calculateZIndex\n * @param {jQuery} elem The element to calculate z-index for\n * @return {Number} Calculated z-index\n */\n calculateZIndex(elem) {\n elem = $(elem);\n while (elem.length && elem[0] !== document) {\n // Ignore z-index if position is set to a value where z-index is ignored by the browser\n // This makes behavior of this function consistent across browsers\n // WebKit always returns auto if the element is positioned.\n let position = elem.css(\"position\");\n if (position === \"absolute\" || position === \"relative\" || position === \"fixed\") {\n // IE returns 0 when zIndex is not specified\n // other browsers return a string\n // we ignore the case of nested elements with an explicit value of 0\n //
\n let value = parseInt(elem.css(\"zIndex\"), 10);\n if (!isNaN(value) && value !== 0) {\n return value;\n }\n }\n elem = elem.parent();\n }\n\n return 0;\n }\n\n /**\n * Calculate the inheritted background colour.\n *\n * @method calculateInherittedBackgroundColor\n * @param {jQuery} elem The element to calculate colour for\n * @return {String} Calculated background colour\n */\n calculateInherittedBackgroundColor(elem) {\n // Use a fake node to compare each element against.\n let fakeNode = $('
').hide();\n $('body').append(fakeNode);\n let fakeElemColor = fakeNode.css('backgroundColor');\n fakeNode.remove();\n\n elem = $(elem);\n while (elem.length && elem[0] !== document) {\n let color = elem.css('backgroundColor');\n if (color !== fakeElemColor) {\n return color;\n }\n elem = elem.parent();\n }\n\n return null;\n }\n\n /**\n * Calculate the inheritted position.\n *\n * @method calculatePosition\n * @param {jQuery} elem The element to calculate position for\n * @return {String} Calculated position\n */\n calculatePosition(elem) {\n elem = $(elem);\n while (elem.length && elem[0] !== document) {\n let position = elem.css('position');\n if (position !== 'static') {\n return position;\n }\n elem = elem.parent();\n }\n\n return null;\n }\n\n /**\n * Perform accessibility changes for step shown.\n *\n * This will add aria-hidden=\"true\" to all siblings and parent siblings.\n *\n * @method accessibilityShow\n */\n accessibilityShow() {\n let stateHolder = 'data-has-hidden';\n let attrName = 'aria-hidden';\n let hideFunction = function(child) {\n let flexitourRole = child.data('flexitour');\n if (flexitourRole) {\n switch (flexitourRole) {\n case 'container':\n case 'target':\n return;\n }\n }\n\n let hidden = child.attr(attrName);\n if (!hidden) {\n child.attr(stateHolder, true);\n Aria.hide(child);\n }\n };\n\n this.currentStepNode.siblings().each(function(index, node) {\n hideFunction($(node));\n });\n this.currentStepNode.parentsUntil('body').siblings().each(function(index, node) {\n hideFunction($(node));\n });\n }\n\n /**\n * Perform accessibility changes for step hidden.\n *\n * This will remove any newly added aria-hidden=\"true\".\n *\n * @method accessibilityHide\n */\n accessibilityHide() {\n let stateHolder = 'data-has-hidden';\n let showFunction = function(child) {\n let hidden = child.attr(stateHolder);\n if (typeof hidden !== 'undefined') {\n child.removeAttr(stateHolder);\n Aria.unhide(child);\n }\n };\n\n $('[' + stateHolder + ']').each(function(index, node) {\n showFunction($(node));\n });\n }\n}\n"],"names":["Tour","config","init","eventHandlers","reset","originalConfiguration","configure","apply","this","arguments","storage","window","sessionStorage","storageKey","tourName","e","hide","resetStepListeners","steps","currentStepNumber","_typeof","eventName","forEach","handler","addEventHandler","_this","resetStepDefaults","template","templateContent","checkMinimumRequirements","Error","length","loadOriginalConfiguration","stepDefaults","setStepDefaults","extend","element","placement","delay","moveOnClick","moveAfterTime","orphan","direction","parseInt","stepNumber","setItem","code","DOMException","QUOTA_EXCEEDED_ERR","removeItem","getCurrentStepNumber","nextStepNumber","isStepPotentiallyVisible","getStepConfig","previousStepNumber","getNextStepNumber","getPreviousStepNumber","stepConfig","isStepActuallyVisible","target","getStepTarget","is","gotoStep","endTour","_gotoStep","delayed","setTimeout","bind","fn","fireEventHandlers","renderStep","normalizeStepConfig","$","reflex","moveAfterClick","content","body","attachTo","attachPoint","first","data","thisEvent","call","push","listeners","node","currentStepNode","args","proxy","next","previous","handleKeyDown","targetNode","parents","listener","on","off","currentStepConfig","setCurrentStepNumber","getTemplateContent","find","html","title","isFirstStep","prop","isLastStep","removeClass","addClass","attr","addStepToPage","processStepListeners","clone","animationTarget","stop","zIndex","calculateZIndex","css","positionBackdrop","document","append","top","left","animate","scrollTop","calculateScrollTop","promise","then","positionStep","revealStep","catch","isOrphan","offset","calculateStepPositionInPage","currentStepPopper","Popper","removeOnDestroy","arrowElement","modifiers","enabled","applyStyle","onLoad","fadeIn","announceStep","focus","stepId","bodyRegion","headerRegion","accessibilityShow","tabbableSelector","keyCode","hasBackdrop","currentIndex","nextIndex","nextNode","focusRelevant","activeElement","stepTarget","tabbableNodes","dialogContainer","filter","index","has","each","shiftKey","closest","last","preventDefault","startAt","storageStartValue","getItem","storageStartAt","startTour","previousTarget","transition","destroy","fadeTime","remove","removeAttr","fadeOut","currentStepElement","accessibilityHide","viewportHeight","height","Math","max","min","ceil","stepHeight","viewportWidth","width","stepWidth","flipBehavior","recalculatePlacement","flip","behaviour","arrow","onCreate","recalculateArrowPosition","onUpdate","split","isVertical","indexOf","instance","popper","querySelector","stepElement","arrowHeight","parseFloat","getComputedStyle","arrowOffset","popperHeight","popperOffset","popperBorderWidth","popperBorderRadiusWidth","arrowPos","maxPos","minPos","newArrowPos","arrowWidth","popperWidth","background","widthContent","targetOffsetLeft","targetOffsetRight","documentElement","clientWidth","backdrop","insertAfter","colorNode","outerWidth","outerHeight","backgroundColor","calculateInherittedBackgroundColor","targetRadius","targetPosition","calculatePosition","fader","opacity","elem","position","value","isNaN","parent","fakeNode","fakeElemColor","color","hideFunction","child","flexitourRole","Aria","siblings","parentsUntil","unhide"],"mappings":"uzDAgCqBA,8BAILC,wJACHC,KAAKD,qGAWd,SAAKA,aAEIE,cAAgB,QAGhBC,aAGAC,sBAAwBJ,QAAU,QAGlCK,UAAUC,MAAMC,KAAMC,oBAGlBC,QAAUC,OAAOC,oBACjBC,WAAa,aAAeL,KAAKM,SACxC,MAAOC,QACAL,SAAU,OACVG,WAAa,UAGfL,0BAUX,uBAESQ,YAGAb,cAAgB,QAGhBc,0BAGAZ,sBAAwB,QAGxBa,MAAQ,QAGRC,kBAAoB,EAElBX,8BAWX,SAAUP,0BACgB,WAAlBmB,QAAOnB,QAAqB,SAEG,IAApBA,OAAOa,gBACTA,SAAWb,OAAOa,UAIvBb,OAAOE,cAAe,oBACbkB,WACLpB,OAAOE,cAAckB,WAAWC,SAAQ,SAASC,cACxCC,gBAAgBH,UAAWE,WACjCE,YAHF,IAAIJ,aAAapB,OAAOE,oBAApBkB,gBAQRK,mBAAkB,GAGK,WAAxBN,QAAOnB,OAAOiB,cACTA,MAAQjB,OAAOiB,YAGO,IAApBjB,OAAO0B,gBACTC,gBAAkB3B,OAAO0B,sBAKjCE,2BAEErB,6CAQX,eAESA,KAAKM,eACA,IAAIgB,MAAM,0BAIftB,KAAKU,QAAUV,KAAKU,MAAMa,aACrB,IAAID,MAAM,4DAYxB,SAAkBE,uCAC2B,IAA9BA,4BACPA,2BAA4B,QAG3BC,aAAe,GACfD,gCAAgF,IAA5CxB,KAAKH,sBAAsB4B,kBAG3DC,gBAAgB1B,KAAKH,sBAAsB4B,mBAF3CC,gBAAgB,IAKlB1B,oCAWX,SAAgByB,qBACPzB,KAAKyB,oBACDA,aAAe,oBAEtBE,OACE3B,KAAKyB,aACL,CACIG,QAAgB,GAChBC,UAAgB,MAChBC,MAAgB,EAChBC,aAAgB,EAChBC,cAAgB,EAChBC,QAAgB,EAChBC,UAAgB,GAEpBT,cAGGzB,yCASX,kBACWmC,SAASnC,KAAKW,kBAAmB,wCAU5C,SAAqByB,oBACZzB,kBAAoByB,WACrBpC,KAAKE,iBAEIA,QAAQmC,QAAQrC,KAAKK,WAAY+B,YACxC,MAAO7B,GACDA,EAAE+B,OAASC,aAAaC,yBACnBtC,QAAQuC,WAAWzC,KAAKK,8CAa7C,SAAkB+B,iBACY,IAAfA,aACPA,WAAapC,KAAK0C,gCAElBC,eAAiBP,WAAa,EAG3BO,gBAAkB3C,KAAKU,MAAMa,QAAQ,IACpCvB,KAAK4C,yBAAyB5C,KAAK6C,cAAcF,wBAC1CA,eAEXA,wBAGG,0CAUX,SAAsBP,iBACQ,IAAfA,aACPA,WAAapC,KAAK0C,gCAElBI,mBAAqBV,WAAa,EAG/BU,oBAAsB,GAAG,IACxB9C,KAAK4C,yBAAyB5C,KAAK6C,cAAcC,4BAC1CA,mBAEXA,4BAGG,+BAUX,SAAWV,mBAGmB,OAFLpC,KAAK+C,kBAAkBX,uCAYhD,SAAYA,mBAGsB,OAFLpC,KAAKgD,sBAAsBZ,oDAYxD,SAAyBa,qBAChBA,aAKDjD,KAAKkD,sBAAsBD,kBAKE,IAAtBA,WAAWhB,QAA0BgB,WAAWhB,aAK3B,IAArBgB,WAAWnB,OAAyBmB,WAAWnB,6CAgB9D,SAAsBmB,gBACbA,kBAEM,MAGPE,OAASnD,KAAKoD,cAAcH,qBAC5BE,QAAUA,OAAO5B,QAAU4B,OAAOE,GAAG,gBAE5BF,OAAO5B,2BAaxB,kBACWvB,KAAKsD,SAAStD,KAAK+C,6CAU9B,kBACW/C,KAAKsD,SAAStD,KAAKgD,yBAA0B,2BAYxD,SAASZ,WAAYF,cACbE,WAAa,SACNpC,KAAKuD,cAGZN,WAAajD,KAAK6C,cAAcT,mBACjB,OAAfa,WACOjD,KAAKuD,UAGTvD,KAAKwD,UAAUP,WAAYf,oCAGtC,SAAUe,WAAYf,eACbe,kBACMjD,KAAKuD,kBAGgB,IAArBN,WAAWnB,OAAyBmB,WAAWnB,QAAUmB,WAAWQ,eAC3ER,WAAWQ,SAAU,EACrBtD,OAAOuD,WAAW1D,KAAKwD,UAAUG,KAAK3D,MAAOiD,WAAWnB,MAAOmB,WAAYf,WAEpElC,KACJ,IAAKiD,WAAWhB,SAAWjC,KAAKkD,sBAAsBD,YAAa,KAClEW,IAAmB,GAAd1B,UAAkB,wBAA0B,2BAC9ClC,KAAKsD,SAAStD,KAAK4D,IAAIX,WAAWb,YAAaF,uBAGrD1B,YAEAqD,kBAAkB,eAAgBZ,iBAClCa,WAAWb,iBACXY,kBAAkB,cAAeZ,YAE/BjD,kCAUX,SAAcoC,eACS,OAAfA,YAAuBA,WAAa,GAAKA,YAAcpC,KAAKU,MAAMa,cAC3D,SAIP0B,WAAajD,KAAK+D,oBAAoB/D,KAAKU,MAAM0B,oBAGrDa,WAAae,gBAAErC,OAAOsB,WAAY,CAACb,WAAYA,gDAYnD,SAAoBa,wBAEiB,IAAtBA,WAAWgB,aAA+D,IAA9BhB,WAAWiB,iBAC9DjB,WAAWiB,eAAiBjB,WAAWgB,aAGT,IAAvBhB,WAAWrB,cAAwD,IAAtBqB,WAAWE,SAC/DF,WAAWE,OAASF,WAAWrB,cAGD,IAAvBqB,WAAWkB,cAAsD,IAApBlB,WAAWmB,OAC/DnB,WAAWmB,KAAOnB,WAAWkB,SAGjClB,WAAae,gBAAErC,OAAO,GAAI3B,KAAKyB,aAAcwB,aAE7CA,WAAae,gBAAErC,OAAO,GAAI,CACtB0C,SAAUpB,WAAWE,OACrBmB,YAAa,SACdrB,aAEYoB,WACXpB,WAAWoB,UAAW,mBAAEpB,WAAWoB,UAAUE,SAG1CtB,wCAYX,SAAcA,mBACNA,WAAWE,QACJ,mBAAEF,WAAWE,QAGjB,sCAWX,SAAkBtC,UAAW2D,kBACoB,IAAlCxE,KAAKL,cAAckB,iBAIzBlB,cAAckB,WAAWC,SAAQ,SAAS2D,WAC3CA,UAAUC,KAAK1E,KAAMwE,QACtBxE,MALQA,oCAgBf,SAAgBa,UAAWE,qBACsB,IAAlCf,KAAKL,cAAckB,kBACrBlB,cAAckB,WAAa,SAG/BlB,cAAckB,WAAW8D,KAAK5D,SAE5Bf,yCAWX,SAAqBiD,oBACZ2B,UAAUD,KAEf,CACIE,KAAM7E,KAAK8E,gBACXC,KAAM,CAAC,QAAS,qBAAsBf,gBAAEgB,MAAMhF,KAAKiF,KAAMjF,QAC1D,CACC6E,KAAM7E,KAAK8E,gBACXC,KAAM,CAAC,QAAS,yBAA0Bf,gBAAEgB,MAAMhF,KAAKkF,SAAUlF,QAIrE,CACI6E,KAAM7E,KAAK8E,gBACXC,KAAM,CAAC,QAAS,oBAAqBf,gBAAEgB,MAAMhF,KAAKuD,QAASvD,QAI/D,CACI6E,MAAM,mBAAE,+BACRE,KAAM,CAAC,QAASf,gBAAEgB,MAAMhF,KAAKQ,KAAMR,QAIvC,CACI6E,MAAM,mBAAE,QACRE,KAAM,CAAC,UAAWf,gBAAEgB,MAAMhF,KAAKmF,cAAenF,SAG9CiD,WAAWlB,YAAa,KACpBqD,WAAapF,KAAKoD,cAAcH,iBAC/B2B,UAAUD,KAAK,CAChBE,KAAMO,WACNL,KAAM,CAAC,QAASf,gBAAEgB,OAAM,SAASzE,GACsC,KAA/D,mBAAEA,EAAE4C,QAAQkC,QAAQ,gCAAgC9D,QAEpDpB,OAAOuD,WAAWM,gBAAEgB,MAAMhF,KAAKiF,KAAMjF,MAAO,OAEjDA,qBAIN4E,UAAU9D,SAAQ,SAASwE,UAC5BA,SAAST,KAAKU,GAAGxF,MAAMuF,SAAST,KAAMS,SAASP,SAG5C/E,uCAUX,kBAEQA,KAAK4E,gBACAA,UAAU9D,SAAQ,SAASwE,UAC5BA,SAAST,KAAKW,IAAIzF,MAAMuF,SAAST,KAAMS,SAASP,cAGnDH,UAAY,GAEV5E,+BAWX,SAAWiD,iBAEFwC,kBAAoBxC,gBACpByC,qBAAqBzC,WAAWb,gBAGjCjB,UAAW,mBAAEnB,KAAK2F,6BAGtBxE,SAASyE,KAAK,8BACTC,KAAK5C,WAAW6C,OAGrB3E,SAASyE,KAAK,6BACTC,KAAK5C,WAAWmB,MAGjBpE,KAAK+F,YAAY9C,WAAWb,YAC5BjB,SAASyE,KAAK,0BAA0BpF,OAExCW,SAASyE,KAAK,0BAA0BI,KAAK,YAAY,GAIzDhG,KAAKiG,WAAWhD,WAAWb,aAC3BjB,SAASyE,KAAK,sBAAsBpF,OACpCW,SAASyE,KAAK,qBAAqBM,YAAY,iBAAiBC,SAAS,gBAEzEhF,SAASyE,KAAK,sBAAsBI,KAAK,YAAY,GAGzD7E,SAASyE,KAAK,0BAA0BQ,KAAK,OAAQ,UACrDjF,SAASyE,KAAK,sBAAsBQ,KAAK,OAAQ,UACjDjF,SAASyE,KAAK,qBAAqBQ,KAAK,OAAQ,UAGhDnD,WAAW9B,SAAWA,cAGjBkF,cAAcpD,iBAIdqD,qBAAqBrD,YAEnBjD,uCASX,kBACW,mBAAEA,KAAKoB,iBAAiBmF,qCAWnC,SAActD,gBAEN6B,iBAAkB,mBAAE,4CACnBe,KAAK5C,WAAW9B,UAChBX,OAGDgG,iBAAkB,mBAAE,cACnBC,MAAK,GAAM,MAEZzG,KAAKkD,sBAAsBD,YAAa,KACpCmC,WAAapF,KAAKoD,cAAcH,YAEpCmC,WAAWZ,KAAK,YAAa,cAEzBkC,OAAS1G,KAAK2G,gBAAgBvB,YAC9BsB,SACAzD,WAAWyD,OAASA,OAAS,GAG7BzD,WAAWyD,QACX5B,gBAAgB8B,IAAI,SAAU3D,WAAWyD,OAAS,QAIjDG,iBAAiB5D,gCAEpB6D,SAAS1C,MAAM2C,OAAOjC,sBACnBA,gBAAkBA,qBAIlBA,gBAAgB8B,IAAI,CACrBI,IAAK,EACLC,KAAM,IAGVT,gBACKU,QAAQ,CACLC,UAAWnH,KAAKoH,mBAAmBnE,cACpCoE,UAAUC,KAAK,gBACLC,aAAatE,iBACbuE,WAAWvE,aAElBU,KAAK3D,OACNyH,OAAM,oBAIRxE,WAAWhB,SAClBgB,WAAWyE,UAAW,EAGtBzE,WAAWoB,UAAW,mBAAE,QAAQE,QAChCtB,WAAWqB,YAAc,cAGpBuC,iBAAiB5D,YAGtB6B,gBAAgBqB,SAAS,8BAGvBW,SAAS1C,MAAM2C,OAAOjC,sBACnBA,gBAAkBA,qBAElBA,gBAAgB6C,OAAO3H,KAAK4H,oCAC5B9C,gBAAgB8B,IAAI,WAAY,cAEhCiB,kBAAoB,IAAIC,iBACzB,mBAAE,QACF9H,KAAK8E,gBAAgB,GAAI,CACrBiD,iBAAiB,EACjBlG,UAAWoB,WAAWpB,UAAY,SAClCmG,aAAc,sBAEdC,UAAW,CACPzH,KAAM,CACF0H,SAAS,GAEbC,WAAY,CACRC,OAAQ,KACRF,SAAS,WAMpBV,WAAWvE,oBAGbjD,+BAWX,SAAWiD,wBAEF6B,gBAAgBuD,OAAO,GAAIrE,gBAAEgB,OAAM,gBAE3BsD,aAAarF,iBAGb6B,gBAAgByD,QACrBpI,OAAOuD,WAAWM,gBAAEgB,OAAM,WAIlBhF,KAAK8E,sBACAA,gBAAgByD,UAE1BvI,MAAO,OAEXA,OAEAA,iCAWX,SAAaiD,gBAMLuF,OAAS,aAAexI,KAAKM,SAAW,IAAM2C,WAAWb,gBACxD0C,gBAAgBsB,KAAK,KAAMoC,YAE5BC,WAAazI,KAAK8E,gBAAgBc,KAAK,6BAA6BrB,QACxEkE,WAAWrC,KAAK,KAAMoC,OAAS,SAC/BC,WAAWrC,KAAK,OAAQ,gBAEpBsC,aAAe1I,KAAK8E,gBAAgBc,KAAK,8BAA8BrB,QAC3EmE,aAAatC,KAAK,KAAMoC,OAAS,UACjCE,aAAatC,KAAK,kBAAmBoC,OAAS,cAGzC1D,gBAAgBsB,KAAK,OAAQ,eAC7BtB,gBAAgBsB,KAAK,WAAY,QACjCtB,gBAAgBsB,KAAK,kBAAmBoC,OAAS,eACjD1D,gBAAgBsB,KAAK,mBAAoBoC,OAAS,aAGnDrF,OAASnD,KAAKoD,cAAcH,mBAC5BE,SACKA,OAAOiD,KAAK,aACbjD,OAAOiD,KAAK,WAAY,GAG5BjD,OACKqB,KAAK,uBAAwBrB,OAAOiD,KAAK,qBACzCA,KAAK,mBAAoBoC,OAAS,eAItCG,kBAAkB1F,YAEhBjD,kCASX,SAAcO,OACNqI,iBAAmB,yEACvBA,kBAAoB,6CACZrI,EAAEsI,cACD,QACItF,qBAIJ,iBAGQvD,KAAKyF,kBAAkBqD,iBAUxBC,aAsBAC,UACAC,SACAC,cA5BAC,eAAgB,mBAAErC,SAASqC,eAC3BC,WAAapJ,KAAKoD,cAAcpD,KAAKyF,mBACrC4D,eAAgB,mBAAET,kBAClBU,iBAAkB,mBAAE,uCAGpBF,aACAC,cAAgBA,cAAcE,QAAO,SAASC,MAAO5H,gBAC3B,OAAfwH,aACCA,WAAWK,IAAI7H,SAASL,QACrB+H,gBAAgBG,IAAI7H,SAASL,QAC7B6H,WAAW/F,GAAGzB,UACd0H,gBAAgBjG,GAAGzB,cAKtCyH,cAAcK,MAAK,SAASF,MAAO5H,gBAC3BuH,cAAc9F,GAAGzB,WACjBmH,aAAeS,OACR,MASK,MAAhBT,aAAwB,KACpB7G,UAAY,EACZ3B,EAAEoJ,WACFzH,WAAa,GAEjB8G,UAAYD,gBAERC,WAAa9G,UACb+G,UAAW,mBAAEI,cAAcL,kBACtBC,SAAS1H,QAAU0H,SAAS5F,GAAG,cAAgB4F,SAAS5F,GAAG,YAIhE6F,gBAHAD,SAAS1H,UAET2H,cAAgBD,SAASW,QAAQR,YAAY7H,SACZ0H,SAASW,QAAQ5J,KAAK8E,iBAAiBvD,QAO5E2H,cACAD,SAASV,QAELhI,EAAEoJ,cAEG7E,gBAAgBc,KAAKgD,kBAAkBiB,OAAOtB,QAE/CvI,KAAKyF,kBAAkBiC,cAElB5C,gBAAgByD,QAGrBa,WAAWb,QAIvBhI,EAAEuJ,oBACHpF,KAAK1E,gCAapB,SAAU+J,YACF/J,KAAKE,cAA8B,IAAZ6J,QAAyB,KAC5CC,kBAAoBhK,KAAKE,QAAQ+J,QAAQjK,KAAKK,eAC9C2J,kBAAmB,KACfE,eAAiB/H,SAAS6H,kBAAmB,IAC7CE,gBAAkBlK,KAAKU,MAAMa,SAC7BwI,QAAUG,6BAKC,IAAZH,UACPA,QAAU/J,KAAK0C,6BAGdmB,kBAAkB,cAAekG,cACjCzG,SAASyG,cACTlG,kBAAkB,aAAckG,SAE9B/J,gCAUX,kBACWA,KAAKmK,UAAU,0BAU1B,mBACStG,kBAAkB,aAEnB7D,KAAKyF,kBAAmB,KACpB2E,eAAiBpK,KAAKoD,cAAcpD,KAAKyF,mBACzC2E,iBACKA,eAAehE,KAAK,aACrBgE,eAAehE,KAAK,WAAY,MAEpCgE,eAAe7B,qBAIlB/H,MAAK,QAELqD,kBAAkB,YAEhB7D,yBAWX,SAAKqK,oBACIxG,kBAAkB,cAEnB7D,KAAK8E,iBAAmB9E,KAAK8E,gBAAgBvD,cACxCuD,gBAAgBtE,OACjBR,KAAK6H,wBACAA,kBAAkByC,WAK3BtK,KAAKyF,kBAAmB,KACpBtC,OAASnD,KAAKoD,cAAcpD,KAAKyF,mBACjCtC,SACIA,OAAOqB,KAAK,wBACZrB,OAAOiD,KAAK,kBAAmBjD,OAAOqB,KAAK,wBAG3CrB,OAAOqB,KAAK,yBACZrB,OAAOiD,KAAK,mBAAoBjD,OAAOqB,KAAK,yBAG5CrB,OAAOqB,KAAK,sBACZrB,OAAOiD,KAAK,WAAYjD,OAAOqB,KAAK,mBAKvCiB,kBAAoB,SAGzB8E,SAAW,KACXF,aACAE,SAAW,yBAIb,sCAAsCC,6BACtC,oCAAoCC,WAAW,sCAC/C,+BAA+BC,QAAQH,UAAU,+BAC7CvK,MAAMwK,YAIRxK,KAAK8E,iBAAmB9E,KAAK8E,gBAAgBvD,OAAQ,KACjDiH,OAASxI,KAAK8E,gBAAgBsB,KAAK,SACnCoC,OAAQ,KACJmC,mBAAqB,sBAAwBnC,OAAS,8BACxDmC,oBAAoBF,WAAW,gCAC/BE,oBAAoBF,WAAW,iCAKpChK,0BAEAmK,yBAEA/G,kBAAkB,kBAElBiB,gBAAkB,UAClB+C,kBAAoB,KAClB7H,yBAUX,eAEQ+J,QAAU/J,KAAK0C,8BAEZ1C,KAAKsD,SAASyG,yCASzB,kBACW,mBAAE/J,KAAK8E,mDAUlB,SAAmB7B,gBACXkE,WAAY,mBAAEhH,QAAQgH,YACtB0D,gBAAiB,mBAAE1K,QAAQ2K,SAC3B1F,WAAapF,KAAKoD,cAAcH,mBAIhCkE,UAFyB,QAAzBlE,WAAWpB,UAECuD,WAAWuC,SAASX,IAAO6D,eAAiB,EACxB,WAAzB5H,WAAWpB,UAENuD,WAAWuC,SAASX,IAAM5B,WAAW0F,SAAYD,eAAiB,EACvEzF,WAAW0F,UAA8B,GAAjBD,eAEnBzF,WAAWuC,SAASX,KAAQ6D,eAAiBzF,WAAW0F,UAAY,EAIpE1F,WAAWuC,SAASX,IAAwB,GAAjB6D,eAI3C1D,UAAY4D,KAAKC,IAAI,EAAG7D,WAGxBA,UAAY4D,KAAKE,KAAI,mBAAEnE,UAAUgE,SAAWD,eAAgB1D,WAErD4D,KAAKG,KAAK/D,sDASrB,eACQ0D,gBAAiB,mBAAE1K,QAAQ2K,SAC3BK,WAAanL,KAAK8E,gBAAgBgG,SAElCM,eAAgB,mBAAEjL,QAAQkL,QAC1BC,UAAYtL,KAAK8E,gBAAgBuG,cAE9B,CACHrE,IAAK+D,KAAKG,MAAML,eAAiBM,YAAc,GAC/ClE,KAAM8D,KAAKG,MAAME,cAAgBE,WAAa,gCAYtD,SAAarI,gBAQLsI,aAPApH,QAAUnE,KAAK8E,oBACdX,UAAYA,QAAQ5C,cAEdvB,YAGXiD,WAAWpB,UAAY7B,KAAKwL,qBAAqBvI,YAEzCA,WAAWpB,eACV,OACD0J,aAAe,CAAC,OAAQ,QAAS,MAAO,oBAEvC,QACDA,aAAe,CAAC,QAAS,OAAQ,MAAO,oBAEvC,MACDA,aAAe,CAAC,MAAO,SAAU,QAAS,kBAEzC,SACDA,aAAe,CAAC,SAAU,MAAO,QAAS,sBAG1CA,aAAe,WAInBpI,OAASnD,KAAKoD,cAAcH,YAC5BxD,OAAS,CACToC,UAAWoB,WAAWpB,UAAY,SAClCkG,iBAAiB,EACjBE,UAAW,CACPwD,KAAM,CACFC,UAAWH,cAEfI,MAAO,CACH/J,QAAS,wBAGjBgK,SAAU,SAASpH,MACfqH,yBAAyBrH,OAE7BsH,SAAU,SAAStH,MACfqH,yBAAyBrH,QAI7BqH,yBAA2B,SAASrH,UAChC3C,UAAY2C,KAAK3C,UAAUkK,MAAM,KAAK,GACpCC,YAAuD,IAA1C,CAAC,OAAQ,SAASC,QAAQpK,WACvCmG,aAAexD,KAAK0H,SAASC,OAAOC,cAAc,uBAClDC,aAAc,mBAAE7H,KAAK0H,SAASC,OAAOC,cAAc,oCACrDJ,WAAY,KACRM,YAAcC,WAAWpM,OAAOqM,iBAAiBxE,cAAc8C,QAC/D2B,YAAcF,WAAWpM,OAAOqM,iBAAiBxE,cAAchB,KAC/D0F,aAAeH,WAAWpM,OAAOqM,iBAAiBhI,KAAK0H,SAASC,QAAQrB,QACxE6B,aAAeJ,WAAWpM,OAAOqM,iBAAiBhI,KAAK0H,SAASC,QAAQnF,KACxE4F,kBAAoBL,WAAWF,YAAYzF,IAAI,mBAC/CiG,wBAA+E,EAArDN,WAAWF,YAAYzF,IAAI,wBACrDkG,SAAWL,YAAeH,YAAc,EACxCS,OAASL,aAAeC,aAAeC,kBAAoBC,wBAC3DG,OAASL,aAAeC,kBAAoBC,2BAC5CC,UAAYC,QAAUD,UAAYE,OAAQ,KACtCC,YAAc,EAEdA,YADAH,SAAYJ,aAAe,EACbK,OAAST,YAETU,OAASV,gCAEzBtE,cAAcpB,IAAI,MAAOqG,kBAE5B,KACCC,WAAaX,WAAWpM,OAAOqM,iBAAiBxE,cAAcqD,OAC9DoB,aAAcF,WAAWpM,OAAOqM,iBAAiBxE,cAAcf,MAC/DkG,YAAcZ,WAAWpM,OAAOqM,iBAAiBhI,KAAK0H,SAASC,QAAQd,OACvEsB,cAAeJ,WAAWpM,OAAOqM,iBAAiBhI,KAAK0H,SAASC,QAAQlF,MACxE2F,mBAAoBL,WAAWF,YAAYzF,IAAI,mBAC/CiG,yBAA+E,EAArDN,WAAWF,YAAYzF,IAAI,wBACrDkG,UAAWL,aAAeS,WAAa,EACvCH,QAASI,YAAcR,cAAeC,mBAAoBC,yBAC1DG,QAASL,cAAeC,mBAAoBC,4BAC5CC,WAAYC,SAAUD,WAAYE,QAAQ,KACtCC,aAAc,EAEdA,aADAH,UAAYK,YAAc,EACZJ,QAASG,WAETF,QAASE,+BAEzBlF,cAAcpB,IAAI,OAAQqG,iBAKpCG,YAAa,mBAAE,6CACfA,WAAW7L,SACX4B,OAASiK,iBAERvF,kBAAoB,IAAIC,gBAAO3E,OAAQgB,QAAQ,GAAI1E,QAEjDO,yCAYX,SAAqBiD,gBAGbE,OAASnD,KAAKoD,cAAcH,YAC5BoK,aAAerN,KAAK8E,gBAAgBuG,QAFrB,GAGfiC,iBAAmBnK,OAAOwE,SAASV,KAJxB,GAKXsG,kBAAoBpK,OAAOwE,SAASV,KAAO9D,OAAOkI,QALvC,GAMXxJ,UAAYoB,WAAWpB,iBAEmB,IAA1C,CAAC,OAAQ,SAASoK,QAAQpK,YACrByL,iBAAoBD,aATd,IAULE,kBAAoBF,aAVf,GAUwCvG,SAAS0G,gBAAgBC,cACxE5L,UAAY,OAGbA,0CAWX,SAAiBoB,eACTA,WAAWyK,SAAU,MAChBjI,kBAAkBqD,aAAc,MACjC4E,UAAW,mBAAE,4CAEbzK,WAAWyD,OACoB,WAA3BzD,WAAWqB,YACXrB,WAAWoB,SAAS0C,OAAO2G,UAE3BA,SAASC,YAAY1K,WAAWoB,8BAGlC,QAAQ0C,OAAO2G,UAGjB1N,KAAKkD,sBAAsBD,YAAa,KAGpCmK,YAAa,mBAAE,gDAEfhI,WAAapF,KAAKoD,cAAcH,YAIhC2K,UAAYxI,WAEZwI,WAAY,mBAAE,QAGlBR,WAAWxG,IAAI,CACXyE,MAAOjG,WAAWyI,aART,GAAA,GAST/C,OAAQ1F,WAAW0I,cATV,GAAA,GAUT7G,KAAM7B,WAAWuC,SAASV,KAVjB,GAWTD,IAAK5B,WAAWuC,SAASX,IAXhB,GAYT+G,gBAAiB/N,KAAKgO,mCAAmCJ,aAGzDxI,WAAWuC,SAASV,KAfX,IAgBTmG,WAAWxG,IAAI,CACXyE,MAAOjG,WAAWyI,aAAezI,WAAWuC,SAASV,KAjBhD,GAkBLA,KAAM7B,WAAWuC,SAASV,OAI9B7B,WAAWuC,SAASX,IAtBX,IAuBToG,WAAWxG,IAAI,CACXkE,OAAQ1F,WAAW0I,cAAgB1I,WAAWuC,SAASX,IAxBlD,GAyBLA,IAAK5B,WAAWuC,SAASX,UAI7BiH,aAAe7I,WAAWwB,IAAI,gBAC9BqH,cAAgBA,gBAAiB,mBAAE,QAAQrH,IAAI,iBAC/CwG,WAAWxG,IAAI,eAAgBqH,kBAG/BC,eAAiBlO,KAAKmO,kBAAkB/I,YACrB,UAAnB8I,eACAd,WAAWxG,IAAI,MAAO,GACI,aAAnBsH,gBACPd,WAAWxG,IAAI,WAAY,aAG3BwH,MAAQhB,WAAW7G,QACvB6H,MAAMxH,IAAI,CACNmH,gBAAiBL,SAAS9G,IAAI,mBAC9ByH,QAASX,SAAS9G,IAAI,aAE1BwH,MAAMhI,KAAK,iBAAkB,yBAEzBnD,WAAWyD,OACoB,WAA3BzD,WAAWqB,YACXrB,WAAWoB,SAAS0C,OAAOqG,aAE3BgB,MAAMT,YAAY1K,WAAWoB,UAC7B+I,WAAWO,YAAY1K,WAAWoB,gCAGpC,QAAQ0C,OAAOqH,2BACf,QAAQrH,OAAOqG,aAKrBhI,WAAWgB,KAAK,iBAAkB,iBAE9BnD,WAAWyD,SACXgH,SAAS9G,IAAI,SAAU3D,WAAWyD,QAClC0G,WAAWxG,IAAI,SAAU3D,WAAWyD,OAAS,GAC7CtB,WAAWwB,IAAI,SAAU3D,WAAWyD,OAAS,IAGjD0H,MAAM1D,QAAQ,QAAQ,+BAChB1K,MAAMwK,oBAIbxK,oCAUX,SAAgBsO,UACZA,MAAO,mBAAEA,MACFA,KAAK/M,QAAU+M,KAAK,KAAOxH,UAAU,KAIpCyH,SAAWD,KAAK1H,IAAI,eACP,aAAb2H,UAAwC,aAAbA,UAAwC,UAAbA,SAAsB,KAKxEC,MAAQrM,SAASmM,KAAK1H,IAAI,UAAW,QACpC6H,MAAMD,QAAoB,IAAVA,aACVA,MAGfF,KAAOA,KAAKI,gBAGT,oDAUX,SAAmCJ,UAE3BK,UAAW,mBAAE,SAASnO,2BACxB,QAAQuG,OAAO4H,cACbC,cAAgBD,SAAS/H,IAAI,uBACjC+H,SAASnE,SAET8D,MAAO,mBAAEA,MACFA,KAAK/M,QAAU+M,KAAK,KAAOxH,UAAU,KACpC+H,MAAQP,KAAK1H,IAAI,sBACjBiI,QAAUD,qBACHC,MAEXP,KAAOA,KAAKI,gBAGT,sCAUX,SAAkBJ,UACdA,MAAO,mBAAEA,MACFA,KAAK/M,QAAU+M,KAAK,KAAOxH,UAAU,KACpCyH,SAAWD,KAAK1H,IAAI,eACP,WAAb2H,gBACOA,SAEXD,KAAOA,KAAKI,gBAGT,sCAUX,eAGQI,aAAe,SAASC,WACpBC,cAAgBD,MAAMvK,KAAK,gBAC3BwK,qBACQA,mBACC,gBACA,gBAKAD,MAAM3I,KAXR,iBAaP2I,MAAM3I,KAdI,mBAcc,GACxB6I,KAAKzO,KAAKuO,cAIbjK,gBAAgBoK,WAAWxF,MAAK,SAASF,MAAO3E,MACjDiK,cAAa,mBAAEjK,eAEdC,gBAAgBqK,aAAa,QAAQD,WAAWxF,MAAK,SAASF,MAAO3E,MACtEiK,cAAa,mBAAEjK,2CAWvB,+BAUM,qBAAyB6E,MAAK,SAASF,MAAO3E,MAR7B,IAASkK,WAEF,KAFEA,OASX,mBAAElK,OARIuB,KAFL,qBAIV2I,MAAMtE,WAJI,mBAKVwE,KAAKG,OAAOL"} \ No newline at end of file +{"version":3,"file":"tour.min.js","sources":["../src/tour.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 * Manage user tours in Moodle.\n *\n * @module tool_usertours/tour\n * @copyright 2018 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport * as Aria from 'core/aria';\nimport Popper from 'core/popper';\n\n/**\n * A Tour.\n *\n * @class\n */\nexport default class Tour {\n /**\n * @param {object} config The configuration object.\n */\n constructor(config) {\n this.init(config);\n }\n\n /**\n * Initialise the tour.\n *\n * @method init\n * @param {Object} config The configuration object.\n * @chainable\n * @return {Object} this.\n */\n init(config) {\n // Unset all handlers.\n this.eventHandlers = {};\n\n // Reset the current tour states.\n this.reset();\n\n // Store the initial configuration.\n this.originalConfiguration = config || {};\n\n // Apply configuration.\n this.configure.apply(this, arguments);\n\n try {\n this.storage = window.sessionStorage;\n this.storageKey = 'tourstate_' + this.tourName;\n } catch (e) {\n this.storage = false;\n this.storageKey = '';\n }\n\n return this;\n }\n\n /**\n * Reset the current tour state.\n *\n * @method reset\n * @chainable\n * @return {Object} this.\n */\n reset() {\n // Hide the current step.\n this.hide();\n\n // Unset all handlers.\n this.eventHandlers = [];\n\n // Unset all listeners.\n this.resetStepListeners();\n\n // Unset the original configuration.\n this.originalConfiguration = {};\n\n // Reset the current step number and list of steps.\n this.steps = [];\n\n // Reset the current step number.\n this.currentStepNumber = 0;\n\n return this;\n }\n\n /**\n * Prepare tour configuration.\n *\n * @method configure\n * @param {Object} config The configuration object.\n * @chainable\n * @return {Object} this.\n */\n configure(config) {\n if (typeof config === 'object') {\n // Tour name.\n if (typeof config.tourName !== 'undefined') {\n this.tourName = config.tourName;\n }\n\n // Set up eventHandlers.\n if (config.eventHandlers) {\n for (let eventName in config.eventHandlers) {\n config.eventHandlers[eventName].forEach(function(handler) {\n this.addEventHandler(eventName, handler);\n }, this);\n }\n }\n\n // Reset the step configuration.\n this.resetStepDefaults(true);\n\n // Configure the steps.\n if (typeof config.steps === 'object') {\n this.steps = config.steps;\n }\n\n if (typeof config.template !== 'undefined') {\n this.templateContent = config.template;\n }\n }\n\n // Check that we have enough to start the tour.\n this.checkMinimumRequirements();\n\n return this;\n }\n\n /**\n * Check that the configuration meets the minimum requirements.\n *\n * @method checkMinimumRequirements\n */\n checkMinimumRequirements() {\n // Need a tourName.\n if (!this.tourName) {\n throw new Error(\"Tour Name required\");\n }\n\n // Need a minimum of one step.\n if (!this.steps || !this.steps.length) {\n throw new Error(\"Steps must be specified\");\n }\n }\n\n /**\n * Reset step default configuration.\n *\n * @method resetStepDefaults\n * @param {Boolean} loadOriginalConfiguration Whether to load the original configuration supplied with the Tour.\n * @chainable\n * @return {Object} this.\n */\n resetStepDefaults(loadOriginalConfiguration) {\n if (typeof loadOriginalConfiguration === 'undefined') {\n loadOriginalConfiguration = true;\n }\n\n this.stepDefaults = {};\n if (!loadOriginalConfiguration || typeof this.originalConfiguration.stepDefaults === 'undefined') {\n this.setStepDefaults({});\n } else {\n this.setStepDefaults(this.originalConfiguration.stepDefaults);\n }\n\n return this;\n }\n\n /**\n * Set the step defaults.\n *\n * @method setStepDefaults\n * @param {Object} stepDefaults The step defaults to apply to all steps\n * @chainable\n * @return {Object} this.\n */\n setStepDefaults(stepDefaults) {\n if (!this.stepDefaults) {\n this.stepDefaults = {};\n }\n $.extend(\n this.stepDefaults,\n {\n element: '',\n placement: 'top',\n delay: 0,\n moveOnClick: false,\n moveAfterTime: 0,\n orphan: false,\n direction: 1,\n },\n stepDefaults\n );\n\n return this;\n }\n\n /**\n * Retrieve the current step number.\n *\n * @method getCurrentStepNumber\n * @return {Integer} The current step number\n */\n getCurrentStepNumber() {\n return parseInt(this.currentStepNumber, 10);\n }\n\n /**\n * Store the current step number.\n *\n * @method setCurrentStepNumber\n * @param {Integer} stepNumber The current step number\n * @chainable\n */\n setCurrentStepNumber(stepNumber) {\n this.currentStepNumber = stepNumber;\n if (this.storage) {\n try {\n this.storage.setItem(this.storageKey, stepNumber);\n } catch (e) {\n if (e.code === DOMException.QUOTA_EXCEEDED_ERR) {\n this.storage.removeItem(this.storageKey);\n }\n }\n }\n }\n\n /**\n * Get the next step number after the currently displayed step.\n *\n * @method getNextStepNumber\n * @param {Integer} stepNumber The current step number\n * @return {Integer} The next step number to display\n */\n getNextStepNumber(stepNumber) {\n if (typeof stepNumber === 'undefined') {\n stepNumber = this.getCurrentStepNumber();\n }\n let nextStepNumber = stepNumber + 1;\n\n // Keep checking the remaining steps.\n while (nextStepNumber <= this.steps.length) {\n if (this.isStepPotentiallyVisible(this.getStepConfig(nextStepNumber))) {\n return nextStepNumber;\n }\n nextStepNumber++;\n }\n\n return null;\n }\n\n /**\n * Get the previous step number before the currently displayed step.\n *\n * @method getPreviousStepNumber\n * @param {Integer} stepNumber The current step number\n * @return {Integer} The previous step number to display\n */\n getPreviousStepNumber(stepNumber) {\n if (typeof stepNumber === 'undefined') {\n stepNumber = this.getCurrentStepNumber();\n }\n let previousStepNumber = stepNumber - 1;\n\n // Keep checking the remaining steps.\n while (previousStepNumber >= 0) {\n if (this.isStepPotentiallyVisible(this.getStepConfig(previousStepNumber))) {\n return previousStepNumber;\n }\n previousStepNumber--;\n }\n\n return null;\n }\n\n /**\n * Is the step the final step number?\n *\n * @method isLastStep\n * @param {Integer} stepNumber Step number to test\n * @return {Boolean} Whether the step is the final step\n */\n isLastStep(stepNumber) {\n let nextStepNumber = this.getNextStepNumber(stepNumber);\n\n return nextStepNumber === null;\n }\n\n /**\n * Is the step the first step number?\n *\n * @method isFirstStep\n * @param {Integer} stepNumber Step number to test\n * @return {Boolean} Whether the step is the first step\n */\n isFirstStep(stepNumber) {\n let previousStepNumber = this.getPreviousStepNumber(stepNumber);\n\n return previousStepNumber === null;\n }\n\n /**\n * Is this step potentially visible?\n *\n * @method isStepPotentiallyVisible\n * @param {Object} stepConfig The step configuration to normalise\n * @return {Boolean} Whether the step is the potentially visible\n */\n isStepPotentiallyVisible(stepConfig) {\n if (!stepConfig) {\n // Without step config, there can be no step.\n return false;\n }\n\n if (this.isStepActuallyVisible(stepConfig)) {\n // If it is actually visible, it is already potentially visible.\n return true;\n }\n\n if (typeof stepConfig.orphan !== 'undefined' && stepConfig.orphan) {\n // Orphan steps have no target. They are always visible.\n return true;\n }\n\n if (typeof stepConfig.delay !== 'undefined' && stepConfig.delay) {\n // Only return true if the activated has not been used yet.\n return true;\n }\n\n // Not theoretically, or actually visible.\n return false;\n }\n\n /**\n * Is this step actually visible?\n *\n * @method isStepActuallyVisible\n * @param {Object} stepConfig The step configuration to normalise\n * @return {Boolean} Whether the step is actually visible\n */\n isStepActuallyVisible(stepConfig) {\n if (!stepConfig) {\n // Without step config, there can be no step.\n return false;\n }\n\n let target = this.getStepTarget(stepConfig);\n if (target && target.length && target.is(':visible')) {\n // Without a target, there can be no step.\n return !!target.length;\n }\n\n return false;\n }\n\n /**\n * Go to the next step in the tour.\n *\n * @method next\n * @chainable\n * @return {Object} this.\n */\n next() {\n return this.gotoStep(this.getNextStepNumber());\n }\n\n /**\n * Go to the previous step in the tour.\n *\n * @method previous\n * @chainable\n * @return {Object} this.\n */\n previous() {\n return this.gotoStep(this.getPreviousStepNumber(), -1);\n }\n\n /**\n * Go to the specified step in the tour.\n *\n * @method gotoStep\n * @param {Integer} stepNumber The step number to display\n * @param {Integer} direction Next or previous step\n * @chainable\n * @return {Object} this.\n */\n gotoStep(stepNumber, direction) {\n if (stepNumber < 0) {\n return this.endTour();\n }\n\n let stepConfig = this.getStepConfig(stepNumber);\n if (stepConfig === null) {\n return this.endTour();\n }\n\n return this._gotoStep(stepConfig, direction);\n }\n\n _gotoStep(stepConfig, direction) {\n if (!stepConfig) {\n return this.endTour();\n }\n\n if (typeof stepConfig.delay !== 'undefined' && stepConfig.delay && !stepConfig.delayed) {\n stepConfig.delayed = true;\n window.setTimeout(this._gotoStep.bind(this), stepConfig.delay, stepConfig, direction);\n\n return this;\n } else if (!stepConfig.orphan && !this.isStepActuallyVisible(stepConfig)) {\n let fn = direction == -1 ? 'getPreviousStepNumber' : 'getNextStepNumber';\n return this.gotoStep(this[fn](stepConfig.stepNumber), direction);\n }\n\n this.hide();\n\n this.fireEventHandlers('beforeRender', stepConfig);\n this.renderStep(stepConfig);\n this.fireEventHandlers('afterRender', stepConfig);\n\n return this;\n }\n\n /**\n * Fetch the normalised step configuration for the specified step number.\n *\n * @method getStepConfig\n * @param {Integer} stepNumber The step number to fetch configuration for\n * @return {Object} The step configuration\n */\n getStepConfig(stepNumber) {\n if (stepNumber === null || stepNumber < 0 || stepNumber >= this.steps.length) {\n return null;\n }\n\n // Normalise the step configuration.\n let stepConfig = this.normalizeStepConfig(this.steps[stepNumber]);\n\n // Add the stepNumber to the stepConfig.\n stepConfig = $.extend(stepConfig, {stepNumber: stepNumber});\n\n return stepConfig;\n }\n\n /**\n * Normalise the supplied step configuration.\n *\n * @method normalizeStepConfig\n * @param {Object} stepConfig The step configuration to normalise\n * @return {Object} The normalised step configuration\n */\n normalizeStepConfig(stepConfig) {\n\n if (typeof stepConfig.reflex !== 'undefined' && typeof stepConfig.moveAfterClick === 'undefined') {\n stepConfig.moveAfterClick = stepConfig.reflex;\n }\n\n if (typeof stepConfig.element !== 'undefined' && typeof stepConfig.target === 'undefined') {\n stepConfig.target = stepConfig.element;\n }\n\n if (typeof stepConfig.content !== 'undefined' && typeof stepConfig.body === 'undefined') {\n stepConfig.body = stepConfig.content;\n }\n\n stepConfig = $.extend({}, this.stepDefaults, stepConfig);\n\n stepConfig = $.extend({}, {\n attachTo: stepConfig.target,\n attachPoint: 'after',\n }, stepConfig);\n\n if (stepConfig.attachTo) {\n stepConfig.attachTo = $(stepConfig.attachTo).first();\n }\n\n return stepConfig;\n }\n\n /**\n * Fetch the actual step target from the selector.\n *\n * This should not be called until after any delay has completed.\n *\n * @method getStepTarget\n * @param {Object} stepConfig The step configuration\n * @return {$}\n */\n getStepTarget(stepConfig) {\n if (stepConfig.target) {\n return $(stepConfig.target);\n }\n\n return null;\n }\n\n /**\n * Fire any event handlers for the specified event.\n *\n * @param {String} eventName The name of the event to handle\n * @param {Object} data Any data to pass to the event\n * @chainable\n * @return {Object} this.\n */\n fireEventHandlers(eventName, data) {\n if (typeof this.eventHandlers[eventName] === 'undefined') {\n return this;\n }\n\n this.eventHandlers[eventName].forEach(function(thisEvent) {\n thisEvent.call(this, data);\n }, this);\n\n return this;\n }\n\n /**\n * @method addEventHandler\n * @param {string} eventName The name of the event to listen for\n * @param {function} handler The event handler to call\n * @return {Object} this.\n */\n addEventHandler(eventName, handler) {\n if (typeof this.eventHandlers[eventName] === 'undefined') {\n this.eventHandlers[eventName] = [];\n }\n\n this.eventHandlers[eventName].push(handler);\n\n return this;\n }\n\n /**\n * Process listeners for the step being shown.\n *\n * @method processStepListeners\n * @param {object} stepConfig The configuration for the step\n * @chainable\n * @return {Object} this.\n */\n processStepListeners(stepConfig) {\n this.listeners.push(\n // Next/Previous buttons.\n {\n node: this.currentStepNode,\n args: ['click', '[data-role=\"next\"]', $.proxy(this.next, this)]\n }, {\n node: this.currentStepNode,\n args: ['click', '[data-role=\"previous\"]', $.proxy(this.previous, this)]\n },\n\n // Close and end tour buttons.\n {\n node: this.currentStepNode,\n args: ['click', '[data-role=\"end\"]', $.proxy(this.endTour, this)]\n },\n\n // Click backdrop and hide tour.\n {\n node: $('[data-flexitour=\"backdrop\"]'),\n args: ['click', $.proxy(this.hide, this)]\n },\n\n // Keypresses.\n {\n node: $('body'),\n args: ['keydown', $.proxy(this.handleKeyDown, this)]\n });\n\n if (stepConfig.moveOnClick) {\n var targetNode = this.getStepTarget(stepConfig);\n this.listeners.push({\n node: targetNode,\n args: ['click', $.proxy(function(e) {\n if ($(e.target).parents('[data-flexitour=\"container\"]').length === 0) {\n // Ignore clicks when they are in the flexitour.\n window.setTimeout($.proxy(this.next, this), 500);\n }\n }, this)]\n });\n }\n\n this.listeners.forEach(function(listener) {\n listener.node.on.apply(listener.node, listener.args);\n });\n\n return this;\n }\n\n /**\n * Reset step listeners.\n *\n * @method resetStepListeners\n * @chainable\n * @return {Object} this.\n */\n resetStepListeners() {\n // Stop listening to all external handlers.\n if (this.listeners) {\n this.listeners.forEach(function(listener) {\n listener.node.off.apply(listener.node, listener.args);\n });\n }\n this.listeners = [];\n\n return this;\n }\n\n /**\n * The standard step renderer.\n *\n * @method renderStep\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n renderStep(stepConfig) {\n // Store the current step configuration for later.\n this.currentStepConfig = stepConfig;\n this.setCurrentStepNumber(stepConfig.stepNumber);\n\n // Fetch the template and convert it to a $ object.\n let template = $(this.getTemplateContent());\n\n // Title.\n template.find('[data-placeholder=\"title\"]')\n .html(stepConfig.title);\n\n // Body.\n template.find('[data-placeholder=\"body\"]')\n .html(stepConfig.body);\n\n // Is this the first step?\n if (this.isFirstStep(stepConfig.stepNumber)) {\n template.find('[data-role=\"previous\"]').hide();\n } else {\n template.find('[data-role=\"previous\"]').prop('disabled', false);\n }\n\n // Is this the final step?\n if (this.isLastStep(stepConfig.stepNumber)) {\n template.find('[data-role=\"next\"]').hide();\n template.find('[data-role=\"end\"]').removeClass(\"btn-secondary\").addClass(\"btn-primary\");\n } else {\n template.find('[data-role=\"next\"]').prop('disabled', false);\n }\n\n template.find('[data-role=\"previous\"]').attr('role', 'button');\n template.find('[data-role=\"next\"]').attr('role', 'button');\n template.find('[data-role=\"end\"]').attr('role', 'button');\n\n // Replace the template with the updated version.\n stepConfig.template = template;\n\n // Add to the page.\n this.addStepToPage(stepConfig);\n\n // Process step listeners after adding to the page.\n // This uses the currentNode.\n this.processStepListeners(stepConfig);\n\n return this;\n }\n\n /**\n * Getter for the template content.\n *\n * @method getTemplateContent\n * @return {$}\n */\n getTemplateContent() {\n return $(this.templateContent).clone();\n }\n\n /**\n * Helper to add a step to the page.\n *\n * @method addStepToPage\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n addStepToPage(stepConfig) {\n // Create the stepNode from the template data.\n let currentStepNode = $('')\n .html(stepConfig.template)\n .hide();\n\n // The scroll animation occurs on the body or html.\n let animationTarget = $('body, html')\n .stop(true, true);\n\n if (this.isStepActuallyVisible(stepConfig)) {\n let targetNode = this.getStepTarget(stepConfig);\n\n targetNode.data('flexitour', 'target');\n\n let zIndex = this.calculateZIndex(targetNode);\n if (zIndex) {\n stepConfig.zIndex = zIndex + 1;\n }\n\n if (stepConfig.zIndex) {\n currentStepNode.css('zIndex', stepConfig.zIndex + 1);\n }\n\n // Add the backdrop.\n this.positionBackdrop(stepConfig);\n\n $(document.body).append(currentStepNode);\n this.currentStepNode = currentStepNode;\n\n // Ensure that the step node is positioned.\n // Some situations mean that the value is not properly calculated without this step.\n this.currentStepNode.css({\n top: 0,\n left: 0,\n });\n\n animationTarget\n .animate({\n scrollTop: this.calculateScrollTop(stepConfig),\n }).promise().then(function() {\n this.positionStep(stepConfig);\n this.revealStep(stepConfig);\n return;\n }.bind(this))\n .catch(function() {\n // Silently fail.\n });\n\n } else if (stepConfig.orphan) {\n stepConfig.isOrphan = true;\n\n // This will be appended to the body instead.\n stepConfig.attachTo = $('body').first();\n stepConfig.attachPoint = 'append';\n\n // Add the backdrop.\n this.positionBackdrop(stepConfig);\n\n // This is an orphaned step.\n currentStepNode.addClass('orphan');\n\n // It lives in the body.\n $(document.body).append(currentStepNode);\n this.currentStepNode = currentStepNode;\n\n this.currentStepNode.offset(this.calculateStepPositionInPage());\n this.currentStepNode.css('position', 'fixed');\n\n this.currentStepPopper = new Popper(\n $('body'),\n this.currentStepNode[0], {\n removeOnDestroy: true,\n placement: stepConfig.placement + '-start',\n arrowElement: '[data-role=\"arrow\"]',\n // Empty the modifiers. We've already placed the step and don't want it moved.\n modifiers: {\n hide: {\n enabled: false,\n },\n applyStyle: {\n onLoad: null,\n enabled: false,\n },\n }\n }\n );\n\n this.revealStep(stepConfig);\n }\n\n return this;\n }\n\n /**\n * Make the given step visible.\n *\n * @method revealStep\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n revealStep(stepConfig) {\n // Fade the step in.\n this.currentStepNode.fadeIn('', $.proxy(function() {\n // Announce via ARIA.\n this.announceStep(stepConfig);\n\n // Focus on the current step Node.\n this.currentStepNode.focus();\n window.setTimeout($.proxy(function() {\n // After a brief delay, focus again.\n // There seems to be an issue with Jaws where it only reads the dialogue title initially.\n // This second focus helps it to read the full dialogue.\n if (this.currentStepNode) {\n this.currentStepNode.focus();\n }\n }, this), 100);\n\n }, this));\n\n return this;\n }\n\n /**\n * Helper to announce the step on the page.\n *\n * @method announceStep\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n announceStep(stepConfig) {\n // Setup the step Dialogue as per:\n // * https://www.w3.org/TR/wai-aria-practices/#dialog_nonmodal\n // * https://www.w3.org/TR/wai-aria-practices/#dialog_modal\n\n // Generate an ID for the current step node.\n let stepId = 'tour-step-' + this.tourName + '-' + stepConfig.stepNumber;\n this.currentStepNode.attr('id', stepId);\n\n let bodyRegion = this.currentStepNode.find('[data-placeholder=\"body\"]').first();\n bodyRegion.attr('id', stepId + '-body');\n bodyRegion.attr('role', 'document');\n\n let headerRegion = this.currentStepNode.find('[data-placeholder=\"title\"]').first();\n headerRegion.attr('id', stepId + '-title');\n headerRegion.attr('aria-labelledby', stepId + '-body');\n\n // Generally, a modal dialog has a role of dialog.\n this.currentStepNode.attr('role', 'dialog');\n this.currentStepNode.attr('tabindex', 0);\n this.currentStepNode.attr('aria-labelledby', stepId + '-title');\n this.currentStepNode.attr('aria-describedby', stepId + '-body');\n\n // Configure ARIA attributes on the target.\n let target = this.getStepTarget(stepConfig);\n if (target) {\n if (!target.attr('tabindex')) {\n target.attr('tabindex', 0);\n }\n\n target\n .data('original-describedby', target.attr('aria-describedby'))\n .attr('aria-describedby', stepId + '-body')\n ;\n }\n\n this.accessibilityShow(stepConfig);\n\n return this;\n }\n\n /**\n * Handle key down events.\n *\n * @method handleKeyDown\n * @param {EventFacade} e\n */\n handleKeyDown(e) {\n let tabbableSelector = 'a[href], link[href], [draggable=true], [contenteditable=true], ';\n tabbableSelector += ':input:enabled, [tabindex], button:enabled';\n switch (e.keyCode) {\n case 27:\n this.endTour();\n break;\n\n // 9 == Tab - trap focus for items with a backdrop.\n case 9:\n // Tab must be handled on key up only in this instance.\n (function() {\n if (!this.currentStepConfig.hasBackdrop) {\n // Trapping tab focus is only handled for those steps with a backdrop.\n return;\n }\n\n // Find all tabbable locations.\n let activeElement = $(document.activeElement);\n let stepTarget = this.getStepTarget(this.currentStepConfig);\n let tabbableNodes = $(tabbableSelector);\n let dialogContainer = $('span[data-flexitour=\"container\"]');\n let currentIndex;\n // Filter out element which is not belong to target section or dialogue.\n if (stepTarget) {\n tabbableNodes = tabbableNodes.filter(function(index, element) {\n return stepTarget !== null\n && (stepTarget.has(element).length\n || dialogContainer.has(element).length\n || stepTarget.is(element)\n || dialogContainer.is(element));\n });\n }\n\n // Find index of focusing element.\n tabbableNodes.each(function(index, element) {\n if (activeElement.is(element)) {\n currentIndex = index;\n return false;\n }\n // Keep looping.\n return true;\n });\n\n let nextIndex;\n let nextNode;\n let focusRelevant;\n if (currentIndex != void 0) {\n let direction = 1;\n if (e.shiftKey) {\n direction = -1;\n }\n nextIndex = currentIndex;\n do {\n nextIndex += direction;\n nextNode = $(tabbableNodes[nextIndex]);\n } while (nextNode.length && nextNode.is(':disabled') || nextNode.is(':hidden'));\n if (nextNode.length) {\n // A new f\n focusRelevant = nextNode.closest(stepTarget).length;\n focusRelevant = focusRelevant || nextNode.closest(this.currentStepNode).length;\n } else {\n // Unable to find the target somehow.\n focusRelevant = false;\n }\n }\n\n if (focusRelevant) {\n nextNode.focus();\n } else {\n if (e.shiftKey) {\n // Focus on the last tabbable node in the step.\n this.currentStepNode.find(tabbableSelector).last().focus();\n } else {\n if (this.currentStepConfig.isOrphan) {\n // Focus on the step - there is no target.\n this.currentStepNode.focus();\n } else {\n // Focus on the step target.\n stepTarget.focus();\n }\n }\n }\n e.preventDefault();\n }).call(this);\n break;\n }\n }\n\n /**\n * Start the current tour.\n *\n * @method startTour\n * @param {Integer} startAt Which step number to start at. If not specified, starts at the last point.\n * @chainable\n * @return {Object} this.\n */\n startTour(startAt) {\n if (this.storage && typeof startAt === 'undefined') {\n let storageStartValue = this.storage.getItem(this.storageKey);\n if (storageStartValue) {\n let storageStartAt = parseInt(storageStartValue, 10);\n if (storageStartAt <= this.steps.length) {\n startAt = storageStartAt;\n }\n }\n }\n\n if (typeof startAt === 'undefined') {\n startAt = this.getCurrentStepNumber();\n }\n\n this.fireEventHandlers('beforeStart', startAt);\n this.gotoStep(startAt);\n this.fireEventHandlers('afterStart', startAt);\n\n return this;\n }\n\n /**\n * Restart the tour from the beginning, resetting the completionlag.\n *\n * @method restartTour\n * @chainable\n * @return {Object} this.\n */\n restartTour() {\n return this.startTour(0);\n }\n\n /**\n * End the current tour.\n *\n * @method endTour\n * @chainable\n * @return {Object} this.\n */\n endTour() {\n this.fireEventHandlers('beforeEnd');\n\n if (this.currentStepConfig) {\n let previousTarget = this.getStepTarget(this.currentStepConfig);\n if (previousTarget) {\n if (!previousTarget.attr('tabindex')) {\n previousTarget.attr('tabindex', '-1');\n }\n previousTarget.focus();\n }\n }\n\n this.hide(true);\n\n this.fireEventHandlers('afterEnd');\n\n return this;\n }\n\n /**\n * Hide any currently visible steps.\n *\n * @method hide\n * @param {Bool} transition Animate the visibility change\n * @chainable\n * @return {Object} this.\n */\n hide(transition) {\n this.fireEventHandlers('beforeHide');\n\n if (this.currentStepNode && this.currentStepNode.length) {\n this.currentStepNode.hide();\n if (this.currentStepPopper) {\n this.currentStepPopper.destroy();\n }\n }\n\n // Restore original target configuration.\n if (this.currentStepConfig) {\n let target = this.getStepTarget(this.currentStepConfig);\n if (target) {\n if (target.data('original-labelledby')) {\n target.attr('aria-labelledby', target.data('original-labelledby'));\n }\n\n if (target.data('original-describedby')) {\n target.attr('aria-describedby', target.data('original-describedby'));\n }\n\n if (target.data('original-tabindex')) {\n target.attr('tabindex', target.data('tabindex'));\n }\n }\n\n // Clear the step configuration.\n this.currentStepConfig = null;\n }\n\n let fadeTime = 0;\n if (transition) {\n fadeTime = 400;\n }\n\n // Remove the backdrop features.\n $('[data-flexitour=\"step-background\"]').remove();\n $('[data-flexitour=\"step-backdrop\"]').removeAttr('data-flexitour');\n $('[data-flexitour=\"backdrop\"]').fadeOut(fadeTime, function() {\n $(this).remove();\n });\n\n // Remove aria-describedby and tabindex attributes.\n if (this.currentStepNode && this.currentStepNode.length) {\n let stepId = this.currentStepNode.attr('id');\n if (stepId) {\n let currentStepElement = '[aria-describedby=\"' + stepId + '-body\"]';\n $(currentStepElement).removeAttr('tabindex');\n $(currentStepElement).removeAttr('aria-describedby');\n }\n }\n\n // Reset the listeners.\n this.resetStepListeners();\n\n this.accessibilityHide();\n\n this.fireEventHandlers('afterHide');\n\n this.currentStepNode = null;\n this.currentStepPopper = null;\n return this;\n }\n\n /**\n * Show the current steps.\n *\n * @method show\n * @chainable\n * @return {Object} this.\n */\n show() {\n // Show the current step.\n let startAt = this.getCurrentStepNumber();\n\n return this.gotoStep(startAt);\n }\n\n /**\n * Return the current step node.\n *\n * @method getStepContainer\n * @return {jQuery}\n */\n getStepContainer() {\n return $(this.currentStepNode);\n }\n\n /**\n * Calculate scrollTop.\n *\n * @method calculateScrollTop\n * @param {Object} stepConfig The step configuration of the step\n * @return {Number}\n */\n calculateScrollTop(stepConfig) {\n let scrollTop = $(window).scrollTop();\n let viewportHeight = $(window).height();\n let targetNode = this.getStepTarget(stepConfig);\n\n if (stepConfig.placement === 'top') {\n // If the placement is top, center scroll at the top of the target.\n scrollTop = targetNode.offset().top - (viewportHeight / 2);\n } else if (stepConfig.placement === 'bottom') {\n // If the placement is bottom, center scroll at the bottom of the target.\n scrollTop = targetNode.offset().top + targetNode.height() - (viewportHeight / 2);\n } else if (targetNode.height() <= (viewportHeight * 0.8)) {\n // If the placement is left/right, and the target fits in the viewport, centre screen on the target\n scrollTop = targetNode.offset().top - ((viewportHeight - targetNode.height()) / 2);\n } else {\n // If the placement is left/right, and the target is bigger than the viewport, set scrollTop to target.top + buffer\n // and change step attachmentTarget to top+.\n scrollTop = targetNode.offset().top - (viewportHeight * 0.2);\n }\n\n // Never scroll over the top.\n scrollTop = Math.max(0, scrollTop);\n\n // Never scroll beyond the bottom.\n scrollTop = Math.min($(document).height() - viewportHeight, scrollTop);\n\n return Math.ceil(scrollTop);\n }\n\n /**\n * Calculate dialogue position for page middle.\n *\n * @method calculateScrollTop\n * @return {Number}\n */\n calculateStepPositionInPage() {\n let viewportHeight = $(window).height();\n let stepHeight = this.currentStepNode.height();\n\n let viewportWidth = $(window).width();\n let stepWidth = this.currentStepNode.width();\n\n return {\n top: Math.ceil((viewportHeight - stepHeight) / 2),\n left: Math.ceil((viewportWidth - stepWidth) / 2)\n };\n }\n\n /**\n * Position the step on the page.\n *\n * @method positionStep\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n positionStep(stepConfig) {\n let content = this.currentStepNode;\n if (!content || !content.length) {\n // Unable to find the step node.\n return this;\n }\n\n stepConfig.placement = this.recalculatePlacement(stepConfig);\n let flipBehavior;\n switch (stepConfig.placement) {\n case 'left':\n flipBehavior = ['left', 'right', 'top', 'bottom'];\n break;\n case 'right':\n flipBehavior = ['right', 'left', 'top', 'bottom'];\n break;\n case 'top':\n flipBehavior = ['top', 'bottom', 'right', 'left'];\n break;\n case 'bottom':\n flipBehavior = ['bottom', 'top', 'right', 'left'];\n break;\n default:\n flipBehavior = 'flip';\n break;\n }\n\n let target = this.getStepTarget(stepConfig);\n var config = {\n placement: stepConfig.placement + '-start',\n removeOnDestroy: true,\n modifiers: {\n flip: {\n behaviour: flipBehavior,\n },\n arrow: {\n element: '[data-role=\"arrow\"]',\n },\n },\n onCreate: function(data) {\n recalculateArrowPosition(data);\n },\n onUpdate: function(data) {\n recalculateArrowPosition(data);\n },\n };\n\n let recalculateArrowPosition = function(data) {\n let placement = data.placement.split('-')[0];\n const isVertical = ['left', 'right'].indexOf(placement) !== -1;\n const arrowElement = data.instance.popper.querySelector('[data-role=\"arrow\"]');\n const stepElement = $(data.instance.popper.querySelector('[data-role=\"flexitour-step\"]'));\n if (isVertical) {\n let arrowHeight = parseFloat(window.getComputedStyle(arrowElement).height);\n let arrowOffset = parseFloat(window.getComputedStyle(arrowElement).top);\n let popperHeight = parseFloat(window.getComputedStyle(data.instance.popper).height);\n let popperOffset = parseFloat(window.getComputedStyle(data.instance.popper).top);\n let popperBorderWidth = parseFloat(stepElement.css('borderTopWidth'));\n let popperBorderRadiusWidth = parseFloat(stepElement.css('borderTopLeftRadius')) * 2;\n let arrowPos = arrowOffset + (arrowHeight / 2);\n let maxPos = popperHeight + popperOffset - popperBorderWidth - popperBorderRadiusWidth;\n let minPos = popperOffset + popperBorderWidth + popperBorderRadiusWidth;\n if (arrowPos >= maxPos || arrowPos <= minPos) {\n let newArrowPos = 0;\n if (arrowPos > (popperHeight / 2)) {\n newArrowPos = maxPos - arrowHeight;\n } else {\n newArrowPos = minPos + arrowHeight;\n }\n $(arrowElement).css('top', newArrowPos);\n }\n } else {\n let arrowWidth = parseFloat(window.getComputedStyle(arrowElement).width);\n let arrowOffset = parseFloat(window.getComputedStyle(arrowElement).left);\n let popperWidth = parseFloat(window.getComputedStyle(data.instance.popper).width);\n let popperOffset = parseFloat(window.getComputedStyle(data.instance.popper).left);\n let popperBorderWidth = parseFloat(stepElement.css('borderTopWidth'));\n let popperBorderRadiusWidth = parseFloat(stepElement.css('borderTopLeftRadius')) * 2;\n let arrowPos = arrowOffset + (arrowWidth / 2);\n let maxPos = popperWidth + popperOffset - popperBorderWidth - popperBorderRadiusWidth;\n let minPos = popperOffset + popperBorderWidth + popperBorderRadiusWidth;\n if (arrowPos >= maxPos || arrowPos <= minPos) {\n let newArrowPos = 0;\n if (arrowPos > (popperWidth / 2)) {\n newArrowPos = maxPos - arrowWidth;\n } else {\n newArrowPos = minPos + arrowWidth;\n }\n $(arrowElement).css('left', newArrowPos);\n }\n }\n };\n\n let background = $('[data-flexitour=\"step-background\"]');\n if (background.length) {\n target = background;\n }\n this.currentStepPopper = new Popper(target, content[0], config);\n\n return this;\n }\n\n /**\n * For left/right placement, checks that there is room for the step at current window size.\n *\n * If there is not enough room, changes placement to 'top'.\n *\n * @method recalculatePlacement\n * @param {Object} stepConfig The step configuration of the step\n * @return {String} The placement after recalculate\n */\n recalculatePlacement(stepConfig) {\n const buffer = 10;\n const arrowWidth = 16;\n let target = this.getStepTarget(stepConfig);\n let widthContent = this.currentStepNode.width() + arrowWidth;\n let targetOffsetLeft = target.offset().left - buffer;\n let targetOffsetRight = target.offset().left + target.width() + buffer;\n let placement = stepConfig.placement;\n\n if (['left', 'right'].indexOf(placement) !== -1) {\n if ((targetOffsetLeft < (widthContent + buffer)) &&\n ((targetOffsetRight + widthContent + buffer) > document.documentElement.clientWidth)) {\n placement = 'top';\n }\n }\n return placement;\n }\n\n /**\n * Add the backdrop.\n *\n * @method positionBackdrop\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n * @return {Object} this.\n */\n positionBackdrop(stepConfig) {\n if (stepConfig.backdrop) {\n this.currentStepConfig.hasBackdrop = true;\n let backdrop = $('
');\n\n if (stepConfig.zIndex) {\n if (stepConfig.attachPoint === 'append') {\n stepConfig.attachTo.append(backdrop);\n } else {\n backdrop.insertAfter(stepConfig.attachTo);\n }\n } else {\n $('body').append(backdrop);\n }\n\n if (this.isStepActuallyVisible(stepConfig)) {\n // The step has a visible target.\n // Punch a hole through the backdrop.\n let background = $('
');\n\n let targetNode = this.getStepTarget(stepConfig);\n\n let buffer = 10;\n\n let colorNode = targetNode;\n if (buffer) {\n colorNode = $('body');\n }\n\n background.css({\n width: targetNode.outerWidth() + buffer + buffer,\n height: targetNode.outerHeight() + buffer + buffer,\n left: targetNode.offset().left - buffer,\n top: targetNode.offset().top - buffer,\n backgroundColor: this.calculateInherittedBackgroundColor(colorNode),\n });\n\n if (targetNode.offset().left < buffer) {\n background.css({\n width: targetNode.outerWidth() + targetNode.offset().left + buffer,\n left: targetNode.offset().left,\n });\n }\n\n if (targetNode.offset().top < buffer) {\n background.css({\n height: targetNode.outerHeight() + targetNode.offset().top + buffer,\n top: targetNode.offset().top,\n });\n }\n\n let targetRadius = targetNode.css('borderRadius');\n if (targetRadius && targetRadius !== $('body').css('borderRadius')) {\n background.css('borderRadius', targetRadius);\n }\n\n let targetPosition = this.calculatePosition(targetNode);\n if (targetPosition === 'fixed') {\n background.css('top', 0);\n } else if (targetPosition === 'absolute') {\n background.css('position', 'fixed');\n }\n\n let fader = background.clone();\n fader.css({\n backgroundColor: backdrop.css('backgroundColor'),\n opacity: backdrop.css('opacity'),\n });\n fader.attr('data-flexitour', 'step-background-fader');\n\n if (stepConfig.zIndex) {\n if (stepConfig.attachPoint === 'append') {\n stepConfig.attachTo.append(background);\n } else {\n fader.insertAfter(stepConfig.attachTo);\n background.insertAfter(stepConfig.attachTo);\n }\n } else {\n $('body').append(fader);\n $('body').append(background);\n }\n\n // Add the backdrop data to the actual target.\n // This is the part which actually does the work.\n targetNode.attr('data-flexitour', 'step-backdrop');\n\n if (stepConfig.zIndex) {\n backdrop.css('zIndex', stepConfig.zIndex);\n background.css('zIndex', stepConfig.zIndex + 1);\n targetNode.css('zIndex', stepConfig.zIndex + 2);\n }\n\n fader.fadeOut('2000', function() {\n $(this).remove();\n });\n }\n }\n return this;\n }\n\n /**\n * Calculate the inheritted z-index.\n *\n * @method calculateZIndex\n * @param {jQuery} elem The element to calculate z-index for\n * @return {Number} Calculated z-index\n */\n calculateZIndex(elem) {\n elem = $(elem);\n while (elem.length && elem[0] !== document) {\n // Ignore z-index if position is set to a value where z-index is ignored by the browser\n // This makes behavior of this function consistent across browsers\n // WebKit always returns auto if the element is positioned.\n let position = elem.css(\"position\");\n if (position === \"absolute\" || position === \"relative\" || position === \"fixed\") {\n // IE returns 0 when zIndex is not specified\n // other browsers return a string\n // we ignore the case of nested elements with an explicit value of 0\n //
\n let value = parseInt(elem.css(\"zIndex\"), 10);\n if (!isNaN(value) && value !== 0) {\n return value;\n }\n }\n elem = elem.parent();\n }\n\n return 0;\n }\n\n /**\n * Calculate the inheritted background colour.\n *\n * @method calculateInherittedBackgroundColor\n * @param {jQuery} elem The element to calculate colour for\n * @return {String} Calculated background colour\n */\n calculateInherittedBackgroundColor(elem) {\n // Use a fake node to compare each element against.\n let fakeNode = $('
').hide();\n $('body').append(fakeNode);\n let fakeElemColor = fakeNode.css('backgroundColor');\n fakeNode.remove();\n\n elem = $(elem);\n while (elem.length && elem[0] !== document) {\n let color = elem.css('backgroundColor');\n if (color !== fakeElemColor) {\n return color;\n }\n elem = elem.parent();\n }\n\n return null;\n }\n\n /**\n * Calculate the inheritted position.\n *\n * @method calculatePosition\n * @param {jQuery} elem The element to calculate position for\n * @return {String} Calculated position\n */\n calculatePosition(elem) {\n elem = $(elem);\n while (elem.length && elem[0] !== document) {\n let position = elem.css('position');\n if (position !== 'static') {\n return position;\n }\n elem = elem.parent();\n }\n\n return null;\n }\n\n /**\n * Perform accessibility changes for step shown.\n *\n * This will add aria-hidden=\"true\" to all siblings and parent siblings.\n *\n * @method accessibilityShow\n */\n accessibilityShow() {\n let stateHolder = 'data-has-hidden';\n let attrName = 'aria-hidden';\n let hideFunction = function(child) {\n let flexitourRole = child.data('flexitour');\n if (flexitourRole) {\n switch (flexitourRole) {\n case 'container':\n case 'target':\n return;\n }\n }\n\n let hidden = child.attr(attrName);\n if (!hidden) {\n child.attr(stateHolder, true);\n Aria.hide(child);\n }\n };\n\n this.currentStepNode.siblings().each(function(index, node) {\n hideFunction($(node));\n });\n this.currentStepNode.parentsUntil('body').siblings().each(function(index, node) {\n hideFunction($(node));\n });\n }\n\n /**\n * Perform accessibility changes for step hidden.\n *\n * This will remove any newly added aria-hidden=\"true\".\n *\n * @method accessibilityHide\n */\n accessibilityHide() {\n let stateHolder = 'data-has-hidden';\n let showFunction = function(child) {\n let hidden = child.attr(stateHolder);\n if (typeof hidden !== 'undefined') {\n child.removeAttr(stateHolder);\n Aria.unhide(child);\n }\n };\n\n $('[' + stateHolder + ']').each(function(index, node) {\n showFunction($(node));\n });\n }\n}\n"],"names":["_jquery","_interopRequireDefault","Aria","_interopRequireWildcard","_popper","Tour","config","_classCallCheck","this","init","value","eventHandlers","reset","originalConfiguration","configure","apply","arguments","storage","window","sessionStorage","storageKey","tourName","e","hide","resetStepListeners","steps","currentStepNumber","_this","_typeof","_loop","eventName","forEach","handler","addEventHandler","resetStepDefaults","template","templateContent","checkMinimumRequirements","Error","length","loadOriginalConfiguration","stepDefaults","setStepDefaults","$","extend","element","placement","delay","moveOnClick","moveAfterTime","orphan","direction","parseInt","stepNumber","setItem","code","DOMException","QUOTA_EXCEEDED_ERR","removeItem","getCurrentStepNumber","nextStepNumber","isStepPotentiallyVisible","getStepConfig","previousStepNumber","getNextStepNumber","getPreviousStepNumber","stepConfig","isStepActuallyVisible","target","getStepTarget","is","gotoStep","endTour","_gotoStep","delayed","setTimeout","bind","fn","fireEventHandlers","renderStep","normalizeStepConfig","reflex","moveAfterClick","content","body","attachTo","attachPoint","default","first","data","thisEvent","call","push","listeners","node","currentStepNode","args","proxy","next","previous","handleKeyDown","targetNode","parents","listener","on","off","currentStepConfig","setCurrentStepNumber","getTemplateContent","find","html","title","isFirstStep","prop","isLastStep","removeClass","addClass","attr","addStepToPage","processStepListeners","clone","animationTarget","stop","zIndex","calculateZIndex","css","positionBackdrop","document","append","top","left","animate","scrollTop","calculateScrollTop","promise","then","positionStep","revealStep","catch","isOrphan","offset","calculateStepPositionInPage","currentStepPopper","Popper","removeOnDestroy","arrowElement","modifiers","enabled","applyStyle","onLoad","fadeIn","announceStep","focus","stepId","bodyRegion","headerRegion","accessibilityShow","tabbableSelector","keyCode","hasBackdrop","currentIndex","nextIndex","nextNode","focusRelevant","activeElement","stepTarget","tabbableNodes","dialogContainer","filter","index","has","each","shiftKey","closest","last","preventDefault","startAt","storageStartValue","getItem","storageStartAt","startTour","previousTarget","transition","destroy","fadeTime","remove","removeAttr","fadeOut","currentStepElement","accessibilityHide","viewportHeight","height","Math","max","min","ceil","stepHeight","viewportWidth","width","stepWidth","flipBehavior","recalculatePlacement","flip","behaviour","arrow","onCreate","recalculateArrowPosition","onUpdate","split","isVertical","indexOf","instance","popper","querySelector","stepElement","arrowHeight","parseFloat","getComputedStyle","arrowOffset","popperHeight","popperOffset","popperBorderWidth","popperBorderRadiusWidth","arrowPos","maxPos","minPos","newArrowPos","arrowWidth","popperWidth","background","buffer","widthContent","targetOffsetLeft","targetOffsetRight","documentElement","clientWidth","backdrop","insertAfter","colorNode","outerWidth","outerHeight","backgroundColor","calculateInherittedBackgroundColor","targetRadius","targetPosition","calculatePosition","fader","opacity","elem","position","isNaN","parent","fakeNode","fakeElemColor","color","stateHolder","hideFunction","child","flexitourRole","siblings","parentsUntil","unhide"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/usertours/amd/build/usertours.min.js b/admin/tool/usertours/amd/build/usertours.min.js index 00924ce8200..82b04c1a1c3 100644 --- a/admin/tool/usertours/amd/build/usertours.min.js +++ b/admin/tool/usertours/amd/build/usertours.min.js @@ -1,3 +1,3 @@ -define("tool_usertours/usertours",["core/ajax","tool_usertours/tour","jquery","core/templates","core/str","core/log","core/notification"],(function(ajax,BootstrapTour,$,templates,str,log,notification){var usertours={tourId:null,currentTour:null,init:function(tourDetails,filters){for(var requirements=[],req=0;req\n */\ndefine(\n['core/ajax', 'tool_usertours/tour', 'jquery', 'core/templates', 'core/str', 'core/log', 'core/notification'],\nfunction(ajax, BootstrapTour, $, templates, str, log, notification) {\n var usertours = {\n tourId: null,\n\n currentTour: null,\n\n /**\n * Initialise the user tour for the current page.\n *\n * @method init\n * @param {Array} tourDetails The matching tours for this page.\n * @param {Array} filters The names of all client side filters.\n */\n init: function(tourDetails, filters) {\n let requirements = [];\n for (var req = 0; req < filters.length; req++) {\n requirements[req] = 'tool_usertours/filter_' + filters[req];\n }\n require(requirements, function() {\n // Run the client side filters to find the first matching tour.\n let matchingTour = null;\n for (let key in tourDetails) {\n let tour = tourDetails[key];\n for (let i = 0; i < filters.length; i++) {\n let filter = arguments[i];\n if (filter.filterMatches(tour)) {\n matchingTour = tour;\n } else {\n // If any filter doesn't match, move on to the next tour.\n matchingTour = null;\n break;\n }\n }\n // If all filters matched then use this tour.\n if (matchingTour) {\n break;\n }\n }\n\n if (matchingTour === null) {\n return;\n }\n\n // Only one tour per page is allowed.\n usertours.tourId = matchingTour.tourId;\n\n let startTour = matchingTour.startTour;\n if (typeof startTour === 'undefined') {\n startTour = true;\n }\n\n if (startTour) {\n // Fetch the tour configuration.\n usertours.fetchTour(usertours.tourId);\n }\n\n usertours.addResetLink();\n // Watch for the reset link.\n $('body').on('click', '[data-action=\"tool_usertours/resetpagetour\"]', function(e) {\n e.preventDefault();\n usertours.resetTourState(usertours.tourId);\n });\n });\n },\n\n /**\n * Fetch the configuration specified tour, and start the tour when it has been fetched.\n *\n * @method fetchTour\n * @param {Number} tourId The ID of the tour to start.\n */\n fetchTour: function(tourId) {\n M.util.js_pending('admin_usertour_fetchTour' + tourId);\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_fetch_and_start_tour',\n args: {\n tourid: tourId,\n context: M.cfg.contextid,\n pageurl: window.location.href,\n }\n }\n ])[0],\n templates.render('tool_usertours/tourstep', {})\n )\n .then(function(response, template) {\n // If we don't have any tour config (because it doesn't need showing for the current user), return early.\n if (!response.hasOwnProperty('tourconfig')) {\n return;\n }\n\n return usertours.startBootstrapTour(tourId, template[0], response.tourconfig);\n })\n .always(function() {\n M.util.js_complete('admin_usertour_fetchTour' + tourId);\n\n return;\n })\n .fail(notification.exception);\n },\n\n /**\n * Add a reset link to the page.\n *\n * @method addResetLink\n */\n addResetLink: function() {\n var ele;\n M.util.js_pending('admin_usertour_addResetLink');\n\n // Append the link to the most suitable place on the page\n // with fallback to legacy selectors and finally the body\n // if there is no better place.\n if ($('.tool_usertours-resettourcontainer').length) {\n ele = $('.tool_usertours-resettourcontainer');\n } else if ($('.logininfo').length) {\n ele = $('.logininfo');\n } else if ($('footer').length) {\n ele = $('footer');\n } else {\n ele = $('body');\n }\n templates.render('tool_usertours/resettour', {})\n .then(function(html, js) {\n templates.appendNodeContents(ele, html, js);\n\n return;\n })\n .always(function() {\n M.util.js_complete('admin_usertour_addResetLink');\n\n return;\n })\n .fail();\n },\n\n /**\n * Start the specified tour.\n *\n * @method startBootstrapTour\n * @param {Number} tourId The ID of the tour to start.\n * @param {String} template The template to use.\n * @param {Object} tourConfig The tour configuration.\n * @return {Object}\n */\n startBootstrapTour: function(tourId, template, tourConfig) {\n if (usertours.currentTour) {\n // End the current tour, but disable end tour handler.\n tourConfig.onEnd = null;\n usertours.currentTour.endTour();\n delete usertours.currentTour;\n }\n\n // Normalize for the new library.\n tourConfig.eventHandlers = {\n afterEnd: [usertours.markTourComplete],\n afterRender: [usertours.markStepShown],\n };\n\n // Sort out the tour name.\n tourConfig.tourName = tourConfig.name;\n delete tourConfig.name;\n\n // Add the template to the configuration.\n // This enables translations of the buttons.\n tourConfig.template = template;\n\n tourConfig.steps = tourConfig.steps.map(function(step) {\n if (typeof step.element !== 'undefined') {\n step.target = step.element;\n delete step.element;\n }\n\n if (typeof step.reflex !== 'undefined') {\n step.moveOnClick = !!step.reflex;\n delete step.reflex;\n }\n\n if (typeof step.content !== 'undefined') {\n step.body = step.content;\n delete step.content;\n }\n\n return step;\n });\n\n usertours.currentTour = new BootstrapTour(tourConfig);\n return usertours.currentTour.startTour();\n },\n\n /**\n * Mark the specified step as being shownd by the user.\n *\n * @method markStepShown\n */\n markStepShown: function() {\n var stepConfig = this.getStepConfig(this.getCurrentStepNumber());\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_step_shown',\n args: {\n tourid: usertours.tourId,\n context: M.cfg.contextid,\n pageurl: window.location.href,\n stepid: stepConfig.stepid,\n stepindex: this.getCurrentStepNumber(),\n }\n }\n ])[0]\n ).fail(log.error);\n },\n\n /**\n * Mark the specified tour as being completed by the user.\n *\n * @method markTourComplete\n */\n markTourComplete: function() {\n var stepConfig = this.getStepConfig(this.getCurrentStepNumber());\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_complete_tour',\n args: {\n tourid: usertours.tourId,\n context: M.cfg.contextid,\n pageurl: window.location.href,\n stepid: stepConfig.stepid,\n stepindex: this.getCurrentStepNumber(),\n }\n }\n ])[0]\n ).fail(log.error);\n },\n\n /**\n * Reset the state, and restart the the tour on the current page.\n *\n * @method resetTourState\n * @param {Number} tourId The ID of the tour to start.\n */\n resetTourState: function(tourId) {\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_reset_tour',\n args: {\n tourid: tourId,\n context: M.cfg.contextid,\n pageurl: window.location.href,\n }\n }\n ])[0]\n ).then(function(response) {\n if (response.startTour) {\n usertours.fetchTour(response.startTour);\n }\n return;\n }).fail(notification.exception);\n }\n };\n\n return /** @alias module:tool_usertours/usertours */ {\n /**\n * Initialise the user tour for the current page.\n *\n * @method init\n * @param {Number} tourId The ID of the tour to start.\n * @param {Bool} startTour Attempt to start the tour now.\n */\n init: usertours.init,\n\n /**\n * Reset the state, and restart the the tour on the current page.\n *\n * @method resetTourState\n * @param {Number} tourId The ID of the tour to restart.\n */\n resetTourState: usertours.resetTourState\n };\n});\n"],"names":["define","ajax","BootstrapTour","$","templates","str","log","notification","usertours","tourId","currentTour","init","tourDetails","filters","requirements","req","length","require","matchingTour","key","tour","i","filter","arguments","filterMatches","startTour","fetchTour","addResetLink","on","e","preventDefault","resetTourState","M","util","js_pending","when","call","methodname","args","tourid","context","cfg","contextid","pageurl","window","location","href","render","then","response","template","hasOwnProperty","startBootstrapTour","tourconfig","always","js_complete","fail","exception","ele","html","js","appendNodeContents","tourConfig","onEnd","endTour","eventHandlers","afterEnd","markTourComplete","afterRender","markStepShown","tourName","name","steps","map","step","element","target","reflex","moveOnClick","content","body","stepConfig","this","getStepConfig","getCurrentStepNumber","stepid","stepindex","error"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"usertours.min.js","sources":["../src/usertours.js"],"sourcesContent":["/**\n * User tour control library.\n *\n * @module tool_usertours/usertours\n * @copyright 2016 Andrew Nicols \n */\ndefine(\n['core/ajax', 'tool_usertours/tour', 'jquery', 'core/templates', 'core/str', 'core/log', 'core/notification'],\nfunction(ajax, BootstrapTour, $, templates, str, log, notification) {\n var usertours = {\n tourId: null,\n\n currentTour: null,\n\n /**\n * Initialise the user tour for the current page.\n *\n * @method init\n * @param {Array} tourDetails The matching tours for this page.\n * @param {Array} filters The names of all client side filters.\n */\n init: function(tourDetails, filters) {\n let requirements = [];\n for (var req = 0; req < filters.length; req++) {\n requirements[req] = 'tool_usertours/filter_' + filters[req];\n }\n require(requirements, function() {\n // Run the client side filters to find the first matching tour.\n let matchingTour = null;\n for (let key in tourDetails) {\n let tour = tourDetails[key];\n for (let i = 0; i < filters.length; i++) {\n let filter = arguments[i];\n if (filter.filterMatches(tour)) {\n matchingTour = tour;\n } else {\n // If any filter doesn't match, move on to the next tour.\n matchingTour = null;\n break;\n }\n }\n // If all filters matched then use this tour.\n if (matchingTour) {\n break;\n }\n }\n\n if (matchingTour === null) {\n return;\n }\n\n // Only one tour per page is allowed.\n usertours.tourId = matchingTour.tourId;\n\n let startTour = matchingTour.startTour;\n if (typeof startTour === 'undefined') {\n startTour = true;\n }\n\n if (startTour) {\n // Fetch the tour configuration.\n usertours.fetchTour(usertours.tourId);\n }\n\n usertours.addResetLink();\n // Watch for the reset link.\n $('body').on('click', '[data-action=\"tool_usertours/resetpagetour\"]', function(e) {\n e.preventDefault();\n usertours.resetTourState(usertours.tourId);\n });\n });\n },\n\n /**\n * Fetch the configuration specified tour, and start the tour when it has been fetched.\n *\n * @method fetchTour\n * @param {Number} tourId The ID of the tour to start.\n */\n fetchTour: function(tourId) {\n M.util.js_pending('admin_usertour_fetchTour' + tourId);\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_fetch_and_start_tour',\n args: {\n tourid: tourId,\n context: M.cfg.contextid,\n pageurl: window.location.href,\n }\n }\n ])[0],\n templates.render('tool_usertours/tourstep', {})\n )\n .then(function(response, template) {\n // If we don't have any tour config (because it doesn't need showing for the current user), return early.\n if (!response.hasOwnProperty('tourconfig')) {\n return;\n }\n\n return usertours.startBootstrapTour(tourId, template[0], response.tourconfig);\n })\n .always(function() {\n M.util.js_complete('admin_usertour_fetchTour' + tourId);\n\n return;\n })\n .fail(notification.exception);\n },\n\n /**\n * Add a reset link to the page.\n *\n * @method addResetLink\n */\n addResetLink: function() {\n var ele;\n M.util.js_pending('admin_usertour_addResetLink');\n\n // Append the link to the most suitable place on the page\n // with fallback to legacy selectors and finally the body\n // if there is no better place.\n if ($('.tool_usertours-resettourcontainer').length) {\n ele = $('.tool_usertours-resettourcontainer');\n } else if ($('.logininfo').length) {\n ele = $('.logininfo');\n } else if ($('footer').length) {\n ele = $('footer');\n } else {\n ele = $('body');\n }\n templates.render('tool_usertours/resettour', {})\n .then(function(html, js) {\n templates.appendNodeContents(ele, html, js);\n\n return;\n })\n .always(function() {\n M.util.js_complete('admin_usertour_addResetLink');\n\n return;\n })\n .fail();\n },\n\n /**\n * Start the specified tour.\n *\n * @method startBootstrapTour\n * @param {Number} tourId The ID of the tour to start.\n * @param {String} template The template to use.\n * @param {Object} tourConfig The tour configuration.\n * @return {Object}\n */\n startBootstrapTour: function(tourId, template, tourConfig) {\n if (usertours.currentTour) {\n // End the current tour, but disable end tour handler.\n tourConfig.onEnd = null;\n usertours.currentTour.endTour();\n delete usertours.currentTour;\n }\n\n // Normalize for the new library.\n tourConfig.eventHandlers = {\n afterEnd: [usertours.markTourComplete],\n afterRender: [usertours.markStepShown],\n };\n\n // Sort out the tour name.\n tourConfig.tourName = tourConfig.name;\n delete tourConfig.name;\n\n // Add the template to the configuration.\n // This enables translations of the buttons.\n tourConfig.template = template;\n\n tourConfig.steps = tourConfig.steps.map(function(step) {\n if (typeof step.element !== 'undefined') {\n step.target = step.element;\n delete step.element;\n }\n\n if (typeof step.reflex !== 'undefined') {\n step.moveOnClick = !!step.reflex;\n delete step.reflex;\n }\n\n if (typeof step.content !== 'undefined') {\n step.body = step.content;\n delete step.content;\n }\n\n return step;\n });\n\n usertours.currentTour = new BootstrapTour(tourConfig);\n return usertours.currentTour.startTour();\n },\n\n /**\n * Mark the specified step as being shownd by the user.\n *\n * @method markStepShown\n */\n markStepShown: function() {\n var stepConfig = this.getStepConfig(this.getCurrentStepNumber());\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_step_shown',\n args: {\n tourid: usertours.tourId,\n context: M.cfg.contextid,\n pageurl: window.location.href,\n stepid: stepConfig.stepid,\n stepindex: this.getCurrentStepNumber(),\n }\n }\n ])[0]\n ).fail(log.error);\n },\n\n /**\n * Mark the specified tour as being completed by the user.\n *\n * @method markTourComplete\n */\n markTourComplete: function() {\n var stepConfig = this.getStepConfig(this.getCurrentStepNumber());\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_complete_tour',\n args: {\n tourid: usertours.tourId,\n context: M.cfg.contextid,\n pageurl: window.location.href,\n stepid: stepConfig.stepid,\n stepindex: this.getCurrentStepNumber(),\n }\n }\n ])[0]\n ).fail(log.error);\n },\n\n /**\n * Reset the state, and restart the the tour on the current page.\n *\n * @method resetTourState\n * @param {Number} tourId The ID of the tour to start.\n */\n resetTourState: function(tourId) {\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_reset_tour',\n args: {\n tourid: tourId,\n context: M.cfg.contextid,\n pageurl: window.location.href,\n }\n }\n ])[0]\n ).then(function(response) {\n if (response.startTour) {\n usertours.fetchTour(response.startTour);\n }\n return;\n }).fail(notification.exception);\n }\n };\n\n return /** @alias module:tool_usertours/usertours */ {\n /**\n * Initialise the user tour for the current page.\n *\n * @method init\n * @param {Number} tourId The ID of the tour to start.\n * @param {Bool} startTour Attempt to start the tour now.\n */\n init: usertours.init,\n\n /**\n * Reset the state, and restart the the tour on the current page.\n *\n * @method resetTourState\n * @param {Number} tourId The ID of the tour to restart.\n */\n resetTourState: usertours.resetTourState\n };\n});\n"],"names":["define","ajax","BootstrapTour","$","templates","str","log","notification","usertours","tourId","currentTour","init","tourDetails","filters","requirements","req","length","require","matchingTour","key","tour","i","arguments","filterMatches","startTour","fetchTour","addResetLink","on","e","preventDefault","resetTourState","M","util","js_pending","when","call","methodname","args","tourid","context","cfg","contextid","pageurl","window","location","href","render","then","response","template","hasOwnProperty","startBootstrapTour","tourconfig","always","js_complete","fail","exception","ele","html","js","appendNodeContents","tourConfig","onEnd","endTour","eventHandlers","afterEnd","markTourComplete","afterRender","markStepShown","tourName","name","steps","map","step","element","target","reflex","moveOnClick","content","body","stepConfig","this","getStepConfig","getCurrentStepNumber","stepid","stepindex","error"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/xmldb/amd/build/move.min.js.map b/admin/tool/xmldb/amd/build/move.min.js.map index 9fb16fee00f..4849b979648 100644 --- a/admin/tool/xmldb/amd/build/move.min.js.map +++ b/admin/tool/xmldb/amd/build/move.min.js.map @@ -1 +1 @@ -{"version":3,"file":"move.min.js","sources":["../src/move.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\ndefine(['jquery', 'core/sortable_list', 'core/ajax', 'core/notification'], function($, SortableList, Ajax, Notification) {\n return {\n init: function(tableid, moveaction) {\n // Initialise sortable for the given list.\n var sort = new SortableList('#' + tableid + ' tbody');\n sort.getElementName = function(element) {\n return $.Deferred().resolve(element.attr('data-name'));\n };\n var origIndex;\n $('#' + tableid + ' tbody tr').on(SortableList.EVENTS.DRAGSTART, function(_, info) {\n // Remember position of the element in the beginning of dragging.\n origIndex = info.sourceList.children().index(info.element);\n // Resize the \"proxy\" element to be the same width as the main element.\n setTimeout(function() {\n $('.sortable-list-is-dragged').width(info.element.width());\n }, 501);\n }).on(SortableList.EVENTS.DROP, function(_, info) {\n // When a list element was moved send AJAX request to the server.\n var newIndex = info.targetList.children().index(info.element);\n var t = info.element.find('[data-action=' + moveaction + ']');\n if (info.positionChanged && t.length) {\n var request = {\n methodname: 'tool_xmldb_invoke_move_action',\n args: {\n action: moveaction,\n dir: t.attr('data-dir'),\n table: t.attr('data-table'),\n field: t.attr('data-field'),\n key: t.attr('data-key'),\n index: t.attr('data-index'),\n position: newIndex - origIndex\n }\n };\n Ajax.call([request])[0].fail(Notification.exception);\n }\n });\n }\n };\n});\n"],"names":["define","$","SortableList","Ajax","Notification","init","tableid","moveaction","origIndex","getElementName","element","Deferred","resolve","attr","on","EVENTS","DRAGSTART","_","info","sourceList","children","index","setTimeout","width","DROP","newIndex","targetList","t","find","positionChanged","length","request","methodname","args","action","dir","table","field","key","position","call","fail","exception"],"mappings":"AAeAA,yBAAO,CAAC,SAAU,qBAAsB,YAAa,sBAAsB,SAASC,EAAGC,aAAcC,KAAMC,oBAChG,CACHC,KAAM,SAASC,QAASC,gBAMhBC,UAJO,IAAIN,aAAa,IAAMI,QAAU,UACvCG,eAAiB,SAASC,gBACpBT,EAAEU,WAAWC,QAAQF,QAAQG,KAAK,eAG7CZ,EAAE,IAAMK,QAAU,aAAaQ,GAAGZ,aAAaa,OAAOC,WAAW,SAASC,EAAGC,MAEzEV,UAAYU,KAAKC,WAAWC,WAAWC,MAAMH,KAAKR,SAElDY,YAAW,WACPrB,EAAE,6BAA6BsB,MAAML,KAAKR,QAAQa,WACnD,QACJT,GAAGZ,aAAaa,OAAOS,MAAM,SAASP,EAAGC,UAEpCO,SAAWP,KAAKQ,WAAWN,WAAWC,MAAMH,KAAKR,SACjDiB,EAAIT,KAAKR,QAAQkB,KAAK,gBAAkBrB,WAAa,QACrDW,KAAKW,iBAAmBF,EAAEG,OAAQ,KAC9BC,QAAU,CACVC,WAAY,gCACZC,KAAM,CACFC,OAAQ3B,WACR4B,IAAKR,EAAEd,KAAK,YACZuB,MAAOT,EAAEd,KAAK,cACdwB,MAAOV,EAAEd,KAAK,cACdyB,IAAKX,EAAEd,KAAK,YACZQ,MAAOM,EAAEd,KAAK,cACd0B,SAAUd,SAAWjB,YAG7BL,KAAKqC,KAAK,CAACT,UAAU,GAAGU,KAAKrC,aAAasC"} \ No newline at end of file +{"version":3,"file":"move.min.js","sources":["../src/move.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\ndefine(['jquery', 'core/sortable_list', 'core/ajax', 'core/notification'], function($, SortableList, Ajax, Notification) {\n return {\n init: function(tableid, moveaction) {\n // Initialise sortable for the given list.\n var sort = new SortableList('#' + tableid + ' tbody');\n sort.getElementName = function(element) {\n return $.Deferred().resolve(element.attr('data-name'));\n };\n var origIndex;\n $('#' + tableid + ' tbody tr').on(SortableList.EVENTS.DRAGSTART, function(_, info) {\n // Remember position of the element in the beginning of dragging.\n origIndex = info.sourceList.children().index(info.element);\n // Resize the \"proxy\" element to be the same width as the main element.\n setTimeout(function() {\n $('.sortable-list-is-dragged').width(info.element.width());\n }, 501);\n }).on(SortableList.EVENTS.DROP, function(_, info) {\n // When a list element was moved send AJAX request to the server.\n var newIndex = info.targetList.children().index(info.element);\n var t = info.element.find('[data-action=' + moveaction + ']');\n if (info.positionChanged && t.length) {\n var request = {\n methodname: 'tool_xmldb_invoke_move_action',\n args: {\n action: moveaction,\n dir: t.attr('data-dir'),\n table: t.attr('data-table'),\n field: t.attr('data-field'),\n key: t.attr('data-key'),\n index: t.attr('data-index'),\n position: newIndex - origIndex\n }\n };\n Ajax.call([request])[0].fail(Notification.exception);\n }\n });\n }\n };\n});\n"],"names":["define","$","SortableList","Ajax","Notification","init","tableid","moveaction","sort","origIndex","getElementName","element","Deferred","resolve","attr","on","EVENTS","DRAGSTART","_","info","sourceList","children","index","setTimeout","width","DROP","newIndex","targetList","t","find","positionChanged","length","request","methodname","args","action","dir","table","field","key","position","call","fail","exception"],"mappings":"AAeAA,yBAAO,CAAC,SAAU,qBAAsB,YAAa,sBAAsB,SAASC,EAAGC,aAAcC,KAAMC,cAChG,MAAA,CACHC,KAAM,SAASC,QAASC,YAEhBC,IAIAC,UAJO,IAAIP,aAAa,IAAMI,QAAU,UACvCI,eAAiB,SAASC,SAC3B,OAAOV,EAAEW,WAAWC,QAAQF,QAAQG,KAAK,aAC5C,EAEDb,EAAE,IAAMK,QAAU,aAAaS,GAAGb,aAAac,OAAOC,WAAW,SAASC,EAAGC,MAEzEV,UAAYU,KAAKC,WAAWC,WAAWC,MAAMH,KAAKR,SAElDY,YAAW,WACPtB,EAAE,6BAA6BuB,MAAML,KAAKR,QAAQa,QAD5C,GAEP,IACN,IAAET,GAAGb,aAAac,OAAOS,MAAM,SAASP,EAAGC,MAExC,IAAIO,SAAWP,KAAKQ,WAAWN,WAAWC,MAAMH,KAAKR,SACjDiB,EAAIT,KAAKR,QAAQkB,KAAK,gBAAkBtB,WAAa,KACzD,GAAIY,KAAKW,iBAAmBF,EAAEG,OAAQ,CAClC,IAAIC,QAAU,CACVC,WAAY,gCACZC,KAAM,CACFC,OAAQ5B,WACR6B,IAAKR,EAAEd,KAAK,YACZuB,MAAOT,EAAEd,KAAK,cACdwB,MAAOV,EAAEd,KAAK,cACdyB,IAAKX,EAAEd,KAAK,YACZQ,MAAOM,EAAEd,KAAK,cACd0B,SAAUd,SAAWjB,YAG7BN,KAAKsC,KAAK,CAACT,UAAU,GAAGU,KAAKtC,aAAauC,UAC7C,CACJ,GACJ,EAER"} \ No newline at end of file diff --git a/backup/util/ui/amd/build/async_backup.min.js b/backup/util/ui/amd/build/async_backup.min.js index 77d77e3a4d6..9eda4208b90 100644 --- a/backup/util/ui/amd/build/async_backup.min.js +++ b/backup/util/ui/amd/build/async_backup.min.js @@ -7,6 +7,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @since 3.7 */ -define("core_backup/async_backup",["jquery","core/ajax","core/str","core/notification","core/templates"],(function($,ajax,Str,notification,Templates){var backupid,contextid,restoreurl,typeid,backupintervalid,allbackupintervalid,allcopyintervalid,Asyncbackup={},checkdelay=15e3;function updateElement(backupid,type,percentage){var percentagewidth=Math.round(percentage)+"%",elementbar=document.querySelectorAll("[data-"+type+"id="+CSS.escape(backupid)+"]")[0],percentagetext=percentage.toFixed(2)+"%";elementbar.setAttribute("aria-valuenow",percentagewidth),elementbar.style.width=percentagewidth,elementbar.innerHTML=percentagetext}function updateInterval(intervalid,callback,value){return clearInterval(intervalid),setInterval(callback,value)}function updateProgressAll(progress){progress.forEach((function(element){var percentage=100*element.progress,backupid=element.backupid,type=element.operation,elementbar=document.querySelectorAll("[data-"+type+"id="+CSS.escape(backupid)+"]")[0];800==element.status?(elementbar.classList.add("bg-success"),updateElement(backupid,type,percentage)):900==element.status?(elementbar.classList.add("bg-danger"),elementbar.classList.add("complete"),elementbar.classList.remove("bg-success"),updateElement(backupid,type,100)):1e3==element.status&&(elementbar.classList.add("bg-success"),elementbar.classList.add("complete"),updateElement(backupid,type,100),"backup"==type?function(backupid){var statuscell=$("#"+backupid+"_bar").parent().parent(),tablerow=statuscell.parent(),cellsiblings=statuscell.siblings(),timecell=cellsiblings[1],timevalue=$(timecell).text(),filenamecell=cellsiblings[0],filename=$(filenamecell).text();ajax.call([{methodname:"core_backup_get_async_backup_links_backup",args:{filename:filename,contextid:contextid}}])[0].done((function(response){var context={filename:filename,time:timevalue,size:response.filesize,fileurl:response.fileurl,restoreurl:response.restoreurl};Templates.render("core/async_backup_progress_row",context).then((function(html,js){Templates.replaceNodeContents(tablerow,html,js)})).fail((function(){notification.exception(new Error("Failed to load table row"))}))}))}(backupid):function(backupid){var statuscell=$("#"+backupid+"_bar").parent().parent(),tablerow=statuscell.parent(),cellsiblings=statuscell.siblings(),coursecell=cellsiblings[0],timecell=cellsiblings[1],timevalue=$(timecell).text();ajax.call([{methodname:"core_backup_get_async_backup_links_restore",args:{backupid:backupid,contextid:contextid}}])[0].done((function(response){var context={resourcename:$(coursecell).text(),restoreurl:response.restoreurl,time:timevalue};Templates.render("core/async_restore_progress_row",context).then((function(html,js){Templates.replaceNodeContents(tablerow,html,js)})).fail((function(){notification.exception(new Error("Failed to load table row"))}))}))}(backupid))}))}function updateProgressCopy(progress){progress.forEach((function(element){var percentage=100*element.progress,backupid=element.backupid,type=element.operation,elementbar=document.querySelectorAll("[data-"+type+"id="+CSS.escape(backupid)+"]")[0];if("restore"==type){var restorecell=elementbar.closest("tr").children[3];Str.get_string("restore").then((function(content){restorecell.innerHTML=content})).catch((function(){notification.exception(new Error("Failed to load string: restore"))}))}800==element.status?(elementbar.classList.add("bg-success"),updateElement(backupid,type,percentage)):900==element.status?(elementbar.classList.add("bg-danger"),elementbar.classList.add("complete"),elementbar.classList.remove("bg-success"),updateElement(backupid,type,100)):1e3==element.status&&"restore"==type&&(elementbar.classList.add("bg-success"),elementbar.classList.add("complete"),updateElement(backupid,type,100),function(backupid){var elementbar=document.querySelectorAll("[data-restoreid="+CSS.escape(backupid)+"]")[0],restorecourse=elementbar.closest("tr").children[1],coursename=restorecourse.innerHTML,courselink=document.createElement("a"),elementbarparent=elementbar.closest("td"),operation=elementbarparent.previousElementSibling;Str.get_string("complete").then((function(content){operation.innerHTML=content})).catch((function(){notification.exception(new Error("Failed to load string: complete"))})),Templates.render("core/async_copy_complete_cell",{}).then((function(html,js){Templates.replaceNodeContents(elementbarparent,html,js)})).fail((function(){notification.exception(new Error("Failed to load table cell"))})),ajax.call([{methodname:"core_backup_get_async_backup_links_restore",args:{backupid:backupid,contextid:0}}])[0].done((function(response){courselink.setAttribute("href",response.restoreurl),courselink.innerHTML=coursename,restorecourse.innerHTML=null,restorecourse.appendChild(courselink)})).fail((function(){notification.exception(new Error("Failed to update table row"))}))}(backupid))}))}function getBackupProgress(){ajax.call([{methodname:"core_backup_get_async_backup_progress",args:{backupids:[backupid],contextid:contextid}}],!0,!0,!1,2e3)[0].done((function(response){!function(progress){var stringRequests,percentage=100*progress.progress,type="backup",elementbar=document.querySelectorAll("[data-backupid="+CSS.escape(backupid)+"]")[0],elementstatus=$("#"+backupid+"_status"),elementdetail=$("#"+backupid+"_detail"),elementbutton=$("#"+backupid+"_button");if(800==progress.status){elementbar.classList.add("bg-success"),updateElement(backupid,type,percentage);var strProcessing="async"+typeid+"processing";Str.get_string(strProcessing,"backup").then((function(title){elementstatus.text(title)})).catch((function(){notification.exception(new Error("Failed to load string: backup "+strProcessing))}))}else if(900==progress.status)elementbar.classList.add("bg-danger"),elementbar.classList.remove("bg-success"),updateElement(backupid,type,100),stringRequests=[{key:"async"+typeid+"error",component:"backup"},{key:"async"+typeid+"errordetail",component:"backup"}],Str.get_strings(stringRequests).then((function(strings){elementstatus.text(strings[0]),elementdetail.text(strings[1])})).catch((function(){notification.exception(new Error("Failed to load string"))})),$(".backup_progress").children("span").removeClass("backup_stage_current"),$(".backup_progress").children("span").last().addClass("backup_stage_current"),clearInterval(backupintervalid);else if(1e3==progress.status){elementbar.classList.add("bg-success"),updateElement(backupid,type,100);var strComplete="async"+typeid+"complete";Str.get_string(strComplete,"backup").then((function(title){elementstatus.text(title)})).catch((function(){notification.exception(new Error("Failed to load string: backup "+strComplete))})),"restore"==typeid?ajax.call([{methodname:"core_backup_get_async_backup_links_restore",args:{backupid:backupid,contextid:contextid}}])[0].done((function(response){var strButton="async"+typeid+"completebutton",stringRequests=[{key:"async"+typeid+"completedetail",component:"backup",param:response.restoreurl},{key:strButton,component:"backup"}];Str.get_strings(stringRequests).then((function(strings){elementdetail.html(strings[0]),elementbutton.text(strings[1]),elementbutton.attr("href",response.restoreurl)})).catch((function(){notification.exception(new Error("Failed to load string"))}))})):(stringRequests=[{key:"async"+typeid+"completedetail",component:"backup",param:restoreurl},{key:"async"+typeid+"completebutton",component:"backup"}],Str.get_strings(stringRequests).then((function(strings){elementdetail.html(strings[0]),elementbutton.text(strings[1]),elementbutton.attr("href",restoreurl)})).catch((function(){notification.exception(new Error("Failed to load string"))}))),$(".backup_progress").children("span").removeClass("backup_stage_current"),$(".backup_progress").children("span").last().addClass("backup_stage_current"),clearInterval(backupintervalid)}}(response[0]),checkdelay=15e3,backupintervalid=updateInterval(backupintervalid,getBackupProgress,15e3)})).fail((function(){backupintervalid=updateInterval(backupintervalid,getBackupProgress,checkdelay*=1.5)}))}function getAllBackupProgress(){var backupids=[];$(".progress").find(".progress-bar").not(".complete").each((function(){backupids.push(this.id.substring(0,32))})),backupids.length>0?ajax.call([{methodname:"core_backup_get_async_backup_progress",args:{backupids:backupids,contextid:contextid}}],!0,!0,!1,2e3)[0].done((function(response){updateProgressAll(response),checkdelay=15e3,allbackupintervalid=updateInterval(allbackupintervalid,getAllBackupProgress,15e3)})).fail((function(){allbackupintervalid=updateInterval(allbackupintervalid,getAllBackupProgress,checkdelay*=1.5)})):clearInterval(allbackupintervalid)}function getAllCopyProgress(){var copyids=[];$(".progress").find(".progress-bar[data-operation][data-backupid][data-restoreid]").not(".complete").each((function(){var progressvars={backupid:this.dataset.backupid,restoreid:this.dataset.restoreid,operation:this.dataset.operation};copyids.push(progressvars)})),copyids.length>0?ajax.call([{methodname:"core_backup_get_copy_progress",args:{copies:copyids}}],!0,!0,!1,2e3)[0].done((function(response){updateProgressCopy(response),checkdelay=15e3,allcopyintervalid=updateInterval(allcopyintervalid,getAllCopyProgress,15e3)})).fail((function(){allcopyintervalid=updateInterval(allcopyintervalid,getAllCopyProgress,checkdelay*=1.5)})):clearInterval(allcopyintervalid)}return Asyncbackup.asyncBackupAllStatus=function(context){contextid=context,allbackupintervalid=setInterval(getAllBackupProgress,checkdelay)},Asyncbackup.asyncCopyAllStatus=function(){allcopyintervalid=setInterval(getAllCopyProgress,checkdelay)},Asyncbackup.asyncBackupStatus=function(backup,context,restore,type){backupid=backup,contextid=context,restoreurl=restore,typeid="backup"==type?"backup":"restore",$(".backup_progress").children("a").removeAttr("href"),backupintervalid=setInterval(getBackupProgress,checkdelay)},Asyncbackup})); +define("core_backup/async_backup",["jquery","core/ajax","core/str","core/notification","core/templates"],(function($,ajax,Str,notification,Templates){var backupid,contextid,restoreurl,typeid,backupintervalid,allbackupintervalid,allcopyintervalid,STATUS_EXECUTING=800,STATUS_FINISHED_ERR=900,STATUS_FINISHED_OK=1e3,Asyncbackup={},checkdelayoriginal=15e3,checkdelay=15e3,checkdelaymultipler=1.5,timeout=2e3;function updateElement(backupid,type,percentage){var percentagewidth=Math.round(percentage)+"%",elementbar=document.querySelectorAll("[data-"+type+"id="+CSS.escape(backupid)+"]")[0],percentagetext=percentage.toFixed(2)+"%";elementbar.setAttribute("aria-valuenow",percentagewidth),elementbar.style.width=percentagewidth,elementbar.innerHTML=percentagetext}function updateInterval(intervalid,callback,value){return clearInterval(intervalid),setInterval(callback,value)}function updateProgressAll(progress){progress.forEach((function(element){var percentage=100*element.progress,backupid=element.backupid,type=element.operation,elementbar=document.querySelectorAll("[data-"+type+"id="+CSS.escape(backupid)+"]")[0];element.status==STATUS_EXECUTING?(elementbar.classList.add("bg-success"),updateElement(backupid,type,percentage)):element.status==STATUS_FINISHED_ERR?(elementbar.classList.add("bg-danger"),elementbar.classList.add("complete"),elementbar.classList.remove("bg-success"),updateElement(backupid,type,100)):element.status==STATUS_FINISHED_OK&&(elementbar.classList.add("bg-success"),elementbar.classList.add("complete"),updateElement(backupid,type,100),"backup"==type?function(backupid){var statuscell=$("#"+backupid+"_bar").parent().parent(),tablerow=statuscell.parent(),cellsiblings=statuscell.siblings(),timecell=cellsiblings[1],timevalue=$(timecell).text(),filenamecell=cellsiblings[0],filename=$(filenamecell).text();ajax.call([{methodname:"core_backup_get_async_backup_links_backup",args:{filename:filename,contextid:contextid}}])[0].done((function(response){var context={filename:filename,time:timevalue,size:response.filesize,fileurl:response.fileurl,restoreurl:response.restoreurl};Templates.render("core/async_backup_progress_row",context).then((function(html,js){Templates.replaceNodeContents(tablerow,html,js)})).fail((function(){notification.exception(new Error("Failed to load table row"))}))}))}(backupid):function(backupid){var statuscell=$("#"+backupid+"_bar").parent().parent(),tablerow=statuscell.parent(),cellsiblings=statuscell.siblings(),coursecell=cellsiblings[0],timecell=cellsiblings[1],timevalue=$(timecell).text();ajax.call([{methodname:"core_backup_get_async_backup_links_restore",args:{backupid:backupid,contextid:contextid}}])[0].done((function(response){var context={resourcename:$(coursecell).text(),restoreurl:response.restoreurl,time:timevalue};Templates.render("core/async_restore_progress_row",context).then((function(html,js){Templates.replaceNodeContents(tablerow,html,js)})).fail((function(){notification.exception(new Error("Failed to load table row"))}))}))}(backupid))}))}function updateProgressCopy(progress){progress.forEach((function(element){var percentage=100*element.progress,backupid=element.backupid,type=element.operation,elementbar=document.querySelectorAll("[data-"+type+"id="+CSS.escape(backupid)+"]")[0];if("restore"==type){var restorecell=elementbar.closest("tr").children[3];Str.get_string("restore").then((function(content){restorecell.innerHTML=content})).catch((function(){notification.exception(new Error("Failed to load string: restore"))}))}element.status==STATUS_EXECUTING?(elementbar.classList.add("bg-success"),updateElement(backupid,type,percentage)):element.status==STATUS_FINISHED_ERR?(elementbar.classList.add("bg-danger"),elementbar.classList.add("complete"),elementbar.classList.remove("bg-success"),updateElement(backupid,type,100)):element.status==STATUS_FINISHED_OK&&"restore"==type&&(elementbar.classList.add("bg-success"),elementbar.classList.add("complete"),updateElement(backupid,type,100),function(backupid){var elementbar=document.querySelectorAll("[data-restoreid="+CSS.escape(backupid)+"]")[0],restorecourse=elementbar.closest("tr").children[1],coursename=restorecourse.innerHTML,courselink=document.createElement("a"),elementbarparent=elementbar.closest("td"),operation=elementbarparent.previousElementSibling;Str.get_string("complete").then((function(content){operation.innerHTML=content})).catch((function(){notification.exception(new Error("Failed to load string: complete"))})),Templates.render("core/async_copy_complete_cell",{}).then((function(html,js){Templates.replaceNodeContents(elementbarparent,html,js)})).fail((function(){notification.exception(new Error("Failed to load table cell"))})),ajax.call([{methodname:"core_backup_get_async_backup_links_restore",args:{backupid:backupid,contextid:0}}])[0].done((function(response){courselink.setAttribute("href",response.restoreurl),courselink.innerHTML=coursename,restorecourse.innerHTML=null,restorecourse.appendChild(courselink)})).fail((function(){notification.exception(new Error("Failed to update table row"))}))}(backupid))}))}function getBackupProgress(){ajax.call([{methodname:"core_backup_get_async_backup_progress",args:{backupids:[backupid],contextid:contextid}}],!0,!0,!1,timeout)[0].done((function(response){!function(progress){var stringRequests,percentage=100*progress.progress,type="backup",elementbar=document.querySelectorAll("[data-backupid="+CSS.escape(backupid)+"]")[0],elementstatus=$("#"+backupid+"_status"),elementdetail=$("#"+backupid+"_detail"),elementbutton=$("#"+backupid+"_button");if(progress.status==STATUS_EXECUTING){elementbar.classList.add("bg-success"),updateElement(backupid,type,percentage);var strProcessing="async"+typeid+"processing";Str.get_string(strProcessing,"backup").then((function(title){elementstatus.text(title)})).catch((function(){notification.exception(new Error("Failed to load string: backup "+strProcessing))}))}else if(progress.status==STATUS_FINISHED_ERR)elementbar.classList.add("bg-danger"),elementbar.classList.remove("bg-success"),updateElement(backupid,type,100),stringRequests=[{key:"async"+typeid+"error",component:"backup"},{key:"async"+typeid+"errordetail",component:"backup"}],Str.get_strings(stringRequests).then((function(strings){elementstatus.text(strings[0]),elementdetail.text(strings[1])})).catch((function(){notification.exception(new Error("Failed to load string"))})),$(".backup_progress").children("span").removeClass("backup_stage_current"),$(".backup_progress").children("span").last().addClass("backup_stage_current"),clearInterval(backupintervalid);else if(progress.status==STATUS_FINISHED_OK){elementbar.classList.add("bg-success"),updateElement(backupid,type,100);var strComplete="async"+typeid+"complete";Str.get_string(strComplete,"backup").then((function(title){elementstatus.text(title)})).catch((function(){notification.exception(new Error("Failed to load string: backup "+strComplete))})),"restore"==typeid?ajax.call([{methodname:"core_backup_get_async_backup_links_restore",args:{backupid:backupid,contextid:contextid}}])[0].done((function(response){var strButton="async"+typeid+"completebutton",stringRequests=[{key:"async"+typeid+"completedetail",component:"backup",param:response.restoreurl},{key:strButton,component:"backup"}];Str.get_strings(stringRequests).then((function(strings){elementdetail.html(strings[0]),elementbutton.text(strings[1]),elementbutton.attr("href",response.restoreurl)})).catch((function(){notification.exception(new Error("Failed to load string"))}))})):(stringRequests=[{key:"async"+typeid+"completedetail",component:"backup",param:restoreurl},{key:"async"+typeid+"completebutton",component:"backup"}],Str.get_strings(stringRequests).then((function(strings){elementdetail.html(strings[0]),elementbutton.text(strings[1]),elementbutton.attr("href",restoreurl)})).catch((function(){notification.exception(new Error("Failed to load string"))}))),$(".backup_progress").children("span").removeClass("backup_stage_current"),$(".backup_progress").children("span").last().addClass("backup_stage_current"),clearInterval(backupintervalid)}}(response[0]),checkdelay=checkdelayoriginal,backupintervalid=updateInterval(backupintervalid,getBackupProgress,checkdelayoriginal)})).fail((function(){backupintervalid=updateInterval(backupintervalid,getBackupProgress,checkdelay*=checkdelaymultipler)}))}function getAllBackupProgress(){var backupids=[];$(".progress").find(".progress-bar").not(".complete").each((function(){backupids.push(this.id.substring(0,32))})),backupids.length>0?ajax.call([{methodname:"core_backup_get_async_backup_progress",args:{backupids:backupids,contextid:contextid}}],!0,!0,!1,timeout)[0].done((function(response){updateProgressAll(response),checkdelay=checkdelayoriginal,allbackupintervalid=updateInterval(allbackupintervalid,getAllBackupProgress,checkdelayoriginal)})).fail((function(){allbackupintervalid=updateInterval(allbackupintervalid,getAllBackupProgress,checkdelay*=checkdelaymultipler)})):clearInterval(allbackupintervalid)}function getAllCopyProgress(){var copyids=[];$(".progress").find(".progress-bar[data-operation][data-backupid][data-restoreid]").not(".complete").each((function(){var progressvars={backupid:this.dataset.backupid,restoreid:this.dataset.restoreid,operation:this.dataset.operation};copyids.push(progressvars)})),copyids.length>0?ajax.call([{methodname:"core_backup_get_copy_progress",args:{copies:copyids}}],!0,!0,!1,timeout)[0].done((function(response){updateProgressCopy(response),checkdelay=checkdelayoriginal,allcopyintervalid=updateInterval(allcopyintervalid,getAllCopyProgress,checkdelayoriginal)})).fail((function(){allcopyintervalid=updateInterval(allcopyintervalid,getAllCopyProgress,checkdelay*=checkdelaymultipler)})):clearInterval(allcopyintervalid)}return Asyncbackup.asyncBackupAllStatus=function(context){contextid=context,allbackupintervalid=setInterval(getAllBackupProgress,checkdelay)},Asyncbackup.asyncCopyAllStatus=function(){allcopyintervalid=setInterval(getAllCopyProgress,checkdelay)},Asyncbackup.asyncBackupStatus=function(backup,context,restore,type){backupid=backup,contextid=context,restoreurl=restore,typeid="backup"==type?"backup":"restore",$(".backup_progress").children("a").removeAttr("href"),backupintervalid=setInterval(getBackupProgress,checkdelay)},Asyncbackup})); //# sourceMappingURL=async_backup.min.js.map \ No newline at end of file diff --git a/backup/util/ui/amd/build/async_backup.min.js.map b/backup/util/ui/amd/build/async_backup.min.js.map index 72f084eec81..609dfe55db1 100644 --- a/backup/util/ui/amd/build/async_backup.min.js.map +++ b/backup/util/ui/amd/build/async_backup.min.js.map @@ -1 +1 @@ -{"version":3,"file":"async_backup.min.js","sources":["../src/async_backup.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 updates the UI during an asynchronous\n * backup or restore process.\n *\n * @module core_backup/async_backup\n * @copyright 2018 Matt Porritt \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.7\n */\ndefine(['jquery', 'core/ajax', 'core/str', 'core/notification', 'core/templates'],\n function($, ajax, Str, notification, Templates) {\n\n /**\n * Module level constants.\n *\n * Using var instead of const as ES6 isn't fully supported yet.\n */\n var STATUS_EXECUTING = 800;\n var STATUS_FINISHED_ERR = 900;\n var STATUS_FINISHED_OK = 1000;\n\n /**\n * Module level variables.\n */\n var Asyncbackup = {};\n var checkdelayoriginal = 15000; // This is the default time to use.\n var checkdelay = 15000; // How often we should check for progress updates.\n var checkdelaymultipler = 1.5; // If a request fails this multiplier will be used to increase the checkdelay value\n var backupid; // The backup id to get the progress for.\n var contextid; // The course this backup progress is for.\n var restoreurl; // The URL to view course restores.\n var typeid; // The type of operation backup or restore.\n var backupintervalid; // The id of the setInterval function.\n var allbackupintervalid; // The id of the setInterval function.\n var allcopyintervalid; // The id of the setInterval function.\n var timeout = 2000; // Timeout for ajax requests.\n\n /**\n * Helper function to update UI components.\n *\n * @param {string} backupid The id to match elements on.\n * @param {string} type The type of operation, backup or restore.\n * @param {number} percentage The completion percentage to apply.\n */\n function updateElement(backupid, type, percentage) {\n var percentagewidth = Math.round(percentage) + '%';\n var elementbar = document.querySelectorAll(\"[data-\" + type + \"id=\" + CSS.escape(backupid) + \"]\")[0];\n var percentagetext = percentage.toFixed(2) + '%';\n\n // Set progress bar percentage indicators\n elementbar.setAttribute('aria-valuenow', percentagewidth);\n elementbar.style.width = percentagewidth;\n elementbar.innerHTML = percentagetext;\n }\n\n /**\n * Updates the interval we use to check for backup progress.\n *\n * @param {Number} intervalid The id of the interval\n * @param {Function} callback The function to use in setInterval\n * @param {Number} value The specified interval (in milliseconds)\n * @returns {Number}\n */\n function updateInterval(intervalid, callback, value) {\n clearInterval(intervalid);\n return setInterval(callback, value);\n }\n\n /**\n * Update backup table row when an async backup completes.\n *\n * @param {string} backupid The id to match elements on.\n */\n function updateBackupTableRow(backupid) {\n var statuscell = $('#' + backupid + '_bar').parent().parent();\n var tablerow = statuscell.parent();\n var cellsiblings = statuscell.siblings();\n var timecell = cellsiblings[1];\n var timevalue = $(timecell).text();\n var filenamecell = cellsiblings[0];\n var filename = $(filenamecell).text();\n\n ajax.call([{\n // Get the table data via webservice.\n methodname: 'core_backup_get_async_backup_links_backup',\n args: {\n 'filename': filename,\n 'contextid': contextid\n },\n }])[0].done(function(response) {\n // We have the data now update the UI.\n var context = {\n filename: filename,\n time: timevalue,\n size: response.filesize,\n fileurl: response.fileurl,\n restoreurl: response.restoreurl\n };\n\n Templates.render('core/async_backup_progress_row', context).then(function(html, js) {\n Templates.replaceNodeContents(tablerow, html, js);\n return;\n }).fail(function() {\n notification.exception(new Error('Failed to load table row'));\n return;\n });\n });\n }\n\n /**\n * Update restore table row when an async restore completes.\n *\n * @param {string} backupid The id to match elements on.\n */\n function updateRestoreTableRow(backupid) {\n var statuscell = $('#' + backupid + '_bar').parent().parent();\n var tablerow = statuscell.parent();\n var cellsiblings = statuscell.siblings();\n var coursecell = cellsiblings[0];\n var timecell = cellsiblings[1];\n var timevalue = $(timecell).text();\n\n ajax.call([{\n // Get the table data via webservice.\n methodname: 'core_backup_get_async_backup_links_restore',\n args: {\n 'backupid': backupid,\n 'contextid': contextid\n },\n }])[0].done(function(response) {\n // We have the data now update the UI.\n var resourcename = $(coursecell).text();\n var context = {\n resourcename: resourcename,\n restoreurl: response.restoreurl,\n time: timevalue\n };\n\n Templates.render('core/async_restore_progress_row', context).then(function(html, js) {\n Templates.replaceNodeContents(tablerow, html, js);\n return;\n }).fail(function() {\n notification.exception(new Error('Failed to load table row'));\n return;\n });\n });\n }\n\n /**\n * Update copy table row when an course copy completes.\n *\n * @param {string} backupid The id to match elements on.\n */\n function updateCopyTableRow(backupid) {\n var elementbar = document.querySelectorAll(\"[data-restoreid=\" + CSS.escape(backupid) + \"]\")[0];\n var restorecourse = elementbar.closest('tr').children[1];\n var coursename = restorecourse.innerHTML;\n var courselink = document.createElement('a');\n var elementbarparent = elementbar.closest('td');\n var operation = elementbarparent.previousElementSibling;\n\n // Replace the prgress bar.\n Str.get_string('complete').then(function(content) {\n operation.innerHTML = content;\n return;\n }).catch(function() {\n notification.exception(new Error('Failed to load string: complete'));\n return;\n });\n\n Templates.render('core/async_copy_complete_cell', {}).then(function(html, js) {\n Templates.replaceNodeContents(elementbarparent, html, js);\n return;\n }).fail(function() {\n notification.exception(new Error('Failed to load table cell'));\n return;\n });\n\n // Update the destination course name to a link to that course.\n ajax.call([{\n methodname: 'core_backup_get_async_backup_links_restore',\n args: {\n 'backupid': backupid,\n 'contextid': 0\n },\n }])[0].done(function(response) {\n courselink.setAttribute('href', response.restoreurl);\n courselink.innerHTML = coursename;\n restorecourse.innerHTML = null;\n restorecourse.appendChild(courselink);\n\n return;\n }).fail(function() {\n notification.exception(new Error('Failed to update table row'));\n return;\n });\n }\n\n /**\n * Update the Moodle user interface with the progress of\n * the backup process.\n *\n * @param {object} progress The progress and status of the process.\n */\n function updateProgress(progress) {\n var percentage = progress.progress * 100;\n var type = 'backup';\n var elementbar = document.querySelectorAll(\"[data-\" + type + \"id=\" + CSS.escape(backupid) + \"]\")[0];\n var elementstatus = $('#' + backupid + '_status');\n var elementdetail = $('#' + backupid + '_detail');\n var elementbutton = $('#' + backupid + '_button');\n var stringRequests;\n\n if (progress.status == STATUS_EXECUTING) {\n // Process is in progress.\n // Add in progress class color to bar.\n elementbar.classList.add('bg-success');\n\n updateElement(backupid, type, percentage);\n\n // Change heading.\n var strProcessing = 'async' + typeid + 'processing';\n Str.get_string(strProcessing, 'backup').then(function(title) {\n elementstatus.text(title);\n return;\n }).catch(function() {\n notification.exception(new Error('Failed to load string: backup ' + strProcessing));\n });\n\n } else if (progress.status == STATUS_FINISHED_ERR) {\n // Process completed with error.\n\n // Add in fail class color to bar.\n elementbar.classList.add('bg-danger');\n\n // Remove in progress class color to bar.\n elementbar.classList.remove('bg-success');\n\n updateElement(backupid, type, 100);\n\n // Change heading and text.\n var strStatus = 'async' + typeid + 'error';\n var strStatusDetail = 'async' + typeid + 'errordetail';\n stringRequests = [\n {key: strStatus, component: 'backup'},\n {key: strStatusDetail, component: 'backup'}\n ];\n Str.get_strings(stringRequests).then(function(strings) {\n elementstatus.text(strings[0]);\n elementdetail.text(strings[1]);\n\n return;\n })\n .catch(function() {\n notification.exception(new Error('Failed to load string'));\n return;\n });\n\n $('.backup_progress').children('span').removeClass('backup_stage_current');\n $('.backup_progress').children('span').last().addClass('backup_stage_current');\n\n // Stop checking when we either have an error or a completion.\n clearInterval(backupintervalid);\n\n } else if (progress.status == STATUS_FINISHED_OK) {\n // Process completed successfully.\n\n // Add in progress class color to bar\n elementbar.classList.add('bg-success');\n\n updateElement(backupid, type, 100);\n\n // Change heading and text\n var strComplete = 'async' + typeid + 'complete';\n Str.get_string(strComplete, 'backup').then(function(title) {\n elementstatus.text(title);\n return;\n }).catch(function() {\n notification.exception(new Error('Failed to load string: backup ' + strComplete));\n });\n\n if (typeid == 'restore') {\n ajax.call([{\n // Get the table data via webservice.\n methodname: 'core_backup_get_async_backup_links_restore',\n args: {\n 'backupid': backupid,\n 'contextid': contextid\n },\n }])[0].done(function(response) {\n var strDetail = 'async' + typeid + 'completedetail';\n var strButton = 'async' + typeid + 'completebutton';\n var stringRequests = [\n {key: strDetail, component: 'backup', param: response.restoreurl},\n {key: strButton, component: 'backup'}\n ];\n Str.get_strings(stringRequests).then(function(strings) {\n elementdetail.html(strings[0]);\n elementbutton.text(strings[1]);\n elementbutton.attr('href', response.restoreurl);\n\n return;\n })\n .catch(function() {\n notification.exception(new Error('Failed to load string'));\n return;\n });\n\n });\n } else {\n var strDetail = 'async' + typeid + 'completedetail';\n var strButton = 'async' + typeid + 'completebutton';\n stringRequests = [\n {key: strDetail, component: 'backup', param: restoreurl},\n {key: strButton, component: 'backup'}\n ];\n Str.get_strings(stringRequests).then(function(strings) {\n elementdetail.html(strings[0]);\n elementbutton.text(strings[1]);\n elementbutton.attr('href', restoreurl);\n\n return;\n })\n .catch(function() {\n notification.exception(new Error('Failed to load string'));\n return;\n });\n\n }\n\n $('.backup_progress').children('span').removeClass('backup_stage_current');\n $('.backup_progress').children('span').last().addClass('backup_stage_current');\n\n // Stop checking when we either have an error or a completion.\n clearInterval(backupintervalid);\n }\n }\n\n /**\n * Update the Moodle user interface with the progress of\n * all the pending processes for backup and restore operations.\n *\n * @param {object} progress The progress and status of the process.\n */\n function updateProgressAll(progress) {\n progress.forEach(function(element) {\n var percentage = element.progress * 100;\n var backupid = element.backupid;\n var type = element.operation;\n var elementbar = document.querySelectorAll(\"[data-\" + type + \"id=\" + CSS.escape(backupid) + \"]\")[0];\n\n if (element.status == STATUS_EXECUTING) {\n // Process is in element.\n\n // Add in element class color to bar\n elementbar.classList.add('bg-success');\n\n updateElement(backupid, type, percentage);\n\n } else if (element.status == STATUS_FINISHED_ERR) {\n // Process completed with error.\n\n // Add in fail class color to bar\n elementbar.classList.add('bg-danger');\n elementbar.classList.add('complete');\n\n // Remove in element class color to bar\n elementbar.classList.remove('bg-success');\n\n updateElement(backupid, type, 100);\n\n } else if (element.status == STATUS_FINISHED_OK) {\n // Process completed successfully.\n\n // Add in element class color to bar\n elementbar.classList.add('bg-success');\n elementbar.classList.add('complete');\n\n updateElement(backupid, type, 100);\n\n // We have a successful backup. Update the UI with download and file details.\n if (type == 'backup') {\n updateBackupTableRow(backupid);\n } else {\n updateRestoreTableRow(backupid);\n }\n\n }\n\n });\n }\n\n /**\n * Update the Moodle user interface with the progress of\n * all the pending processes for copy operations.\n *\n * @param {object} progress The progress and status of the process.\n */\n function updateProgressCopy(progress) {\n progress.forEach(function(element) {\n var percentage = element.progress * 100;\n var backupid = element.backupid;\n var type = element.operation;\n var elementbar = document.querySelectorAll(\"[data-\" + type + \"id=\" + CSS.escape(backupid) + \"]\")[0];\n\n if (type == 'restore') {\n let restorecell = elementbar.closest('tr').children[3];\n Str.get_string('restore').then(function(content) {\n restorecell.innerHTML = content;\n return;\n }).catch(function() {\n notification.exception(new Error('Failed to load string: restore'));\n });\n }\n\n if (element.status == STATUS_EXECUTING) {\n // Process is in element.\n\n // Add in element class color to bar\n elementbar.classList.add('bg-success');\n\n updateElement(backupid, type, percentage);\n\n } else if (element.status == STATUS_FINISHED_ERR) {\n // Process completed with error.\n\n // Add in fail class color to bar\n elementbar.classList.add('bg-danger');\n elementbar.classList.add('complete');\n\n // Remove in element class color to bar\n elementbar.classList.remove('bg-success');\n\n updateElement(backupid, type, 100);\n\n } else if ((element.status == STATUS_FINISHED_OK) && (type == 'restore')) {\n // Process completed successfully.\n\n // Add in element class color to bar\n elementbar.classList.add('bg-success');\n elementbar.classList.add('complete');\n\n updateElement(backupid, type, 100);\n\n // We have a successful copy. Update the UI link to copied course.\n updateCopyTableRow(backupid);\n }\n\n });\n }\n\n /**\n * Get the progress of the backup process via ajax.\n */\n function getBackupProgress() {\n ajax.call([{\n // Get the backup progress via webservice.\n methodname: 'core_backup_get_async_backup_progress',\n args: {\n 'backupids': [backupid],\n 'contextid': contextid\n },\n }], true, true, false, timeout)[0].done(function(response) {\n // We have the progress now update the UI.\n updateProgress(response[0]);\n checkdelay = checkdelayoriginal;\n backupintervalid = updateInterval(backupintervalid, getBackupProgress, checkdelayoriginal);\n }).fail(function() {\n checkdelay = checkdelay * checkdelaymultipler;\n backupintervalid = updateInterval(backupintervalid, getBackupProgress, checkdelay);\n });\n }\n\n /**\n * Get the progress of all backup processes via ajax.\n */\n function getAllBackupProgress() {\n var backupids = [];\n var progressbars = $('.progress').find('.progress-bar').not('.complete');\n\n progressbars.each(function() {\n backupids.push((this.id).substring(0, 32));\n });\n\n if (backupids.length > 0) {\n ajax.call([{\n // Get the backup progress via webservice.\n methodname: 'core_backup_get_async_backup_progress',\n args: {\n 'backupids': backupids,\n 'contextid': contextid\n },\n }], true, true, false, timeout)[0].done(function(response) {\n updateProgressAll(response);\n checkdelay = checkdelayoriginal;\n allbackupintervalid = updateInterval(allbackupintervalid, getAllBackupProgress, checkdelayoriginal);\n }).fail(function() {\n checkdelay = checkdelay * checkdelaymultipler;\n allbackupintervalid = updateInterval(allbackupintervalid, getAllBackupProgress, checkdelay);\n });\n } else {\n clearInterval(allbackupintervalid); // No more progress bars to update, stop checking.\n }\n }\n\n /**\n * Get the progress of all copy processes via ajax.\n */\n function getAllCopyProgress() {\n var copyids = [];\n var progressbars = $('.progress').find('.progress-bar[data-operation][data-backupid][data-restoreid]').not('.complete');\n\n progressbars.each(function() {\n let progressvars = {\n 'backupid': this.dataset.backupid,\n 'restoreid': this.dataset.restoreid,\n 'operation': this.dataset.operation,\n };\n copyids.push(progressvars);\n });\n\n if (copyids.length > 0) {\n ajax.call([{\n // Get the copy progress via webservice.\n methodname: 'core_backup_get_copy_progress',\n args: {\n 'copies': copyids\n },\n }], true, true, false, timeout)[0].done(function(response) {\n updateProgressCopy(response);\n checkdelay = checkdelayoriginal;\n allcopyintervalid = updateInterval(allcopyintervalid, getAllCopyProgress, checkdelayoriginal);\n }).fail(function() {\n checkdelay = checkdelay * checkdelaymultipler;\n allcopyintervalid = updateInterval(allcopyintervalid, getAllCopyProgress, checkdelay);\n });\n } else {\n clearInterval(allcopyintervalid); // No more progress bars to update, stop checking.\n }\n }\n\n /**\n * Get status updates for all backups.\n *\n * @public\n * @param {number} context The context id.\n */\n Asyncbackup.asyncBackupAllStatus = function(context) {\n contextid = context;\n allbackupintervalid = setInterval(getAllBackupProgress, checkdelay);\n };\n\n /**\n * Get status updates for all course copies.\n *\n * @public\n */\n Asyncbackup.asyncCopyAllStatus = function() {\n allcopyintervalid = setInterval(getAllCopyProgress, checkdelay);\n };\n\n /**\n * Get status updates for backup.\n *\n * @public\n * @param {string} backup The backup record id.\n * @param {number} context The context id.\n * @param {string} restore The restore link.\n * @param {string} type The operation type (backup or restore).\n */\n Asyncbackup.asyncBackupStatus = function(backup, context, restore, type) {\n backupid = backup;\n contextid = context;\n restoreurl = restore;\n\n if (type == 'backup') {\n typeid = 'backup';\n } else {\n typeid = 'restore';\n }\n\n // Remove the links from the progress bar, no going back now.\n $('.backup_progress').children('a').removeAttr('href');\n\n // Periodically check for progress updates and update the UI as required.\n backupintervalid = setInterval(getBackupProgress, checkdelay);\n\n };\n\n return Asyncbackup;\n});\n"],"names":["define","$","ajax","Str","notification","Templates","backupid","contextid","restoreurl","typeid","backupintervalid","allbackupintervalid","allcopyintervalid","Asyncbackup","checkdelay","updateElement","type","percentage","percentagewidth","Math","round","elementbar","document","querySelectorAll","CSS","escape","percentagetext","toFixed","setAttribute","style","width","innerHTML","updateInterval","intervalid","callback","value","clearInterval","setInterval","updateProgressAll","progress","forEach","element","operation","status","classList","add","remove","statuscell","parent","tablerow","cellsiblings","siblings","timecell","timevalue","text","filenamecell","filename","call","methodname","args","done","response","context","time","size","filesize","fileurl","render","then","html","js","replaceNodeContents","fail","exception","Error","updateBackupTableRow","coursecell","resourcename","updateRestoreTableRow","updateProgressCopy","restorecell","closest","children","get_string","content","catch","restorecourse","coursename","courselink","createElement","elementbarparent","previousElementSibling","appendChild","updateCopyTableRow","getBackupProgress","stringRequests","elementstatus","elementdetail","elementbutton","strProcessing","title","key","component","get_strings","strings","removeClass","last","addClass","strComplete","strButton","param","attr","updateProgress","getAllBackupProgress","backupids","find","not","each","push","this","id","substring","length","getAllCopyProgress","copyids","progressvars","dataset","restoreid","asyncBackupAllStatus","asyncCopyAllStatus","asyncBackupStatus","backup","restore","removeAttr"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"async_backup.min.js","sources":["../src/async_backup.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 updates the UI during an asynchronous\n * backup or restore process.\n *\n * @module core_backup/async_backup\n * @copyright 2018 Matt Porritt \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.7\n */\ndefine(['jquery', 'core/ajax', 'core/str', 'core/notification', 'core/templates'],\n function($, ajax, Str, notification, Templates) {\n\n /**\n * Module level constants.\n *\n * Using var instead of const as ES6 isn't fully supported yet.\n */\n var STATUS_EXECUTING = 800;\n var STATUS_FINISHED_ERR = 900;\n var STATUS_FINISHED_OK = 1000;\n\n /**\n * Module level variables.\n */\n var Asyncbackup = {};\n var checkdelayoriginal = 15000; // This is the default time to use.\n var checkdelay = 15000; // How often we should check for progress updates.\n var checkdelaymultipler = 1.5; // If a request fails this multiplier will be used to increase the checkdelay value\n var backupid; // The backup id to get the progress for.\n var contextid; // The course this backup progress is for.\n var restoreurl; // The URL to view course restores.\n var typeid; // The type of operation backup or restore.\n var backupintervalid; // The id of the setInterval function.\n var allbackupintervalid; // The id of the setInterval function.\n var allcopyintervalid; // The id of the setInterval function.\n var timeout = 2000; // Timeout for ajax requests.\n\n /**\n * Helper function to update UI components.\n *\n * @param {string} backupid The id to match elements on.\n * @param {string} type The type of operation, backup or restore.\n * @param {number} percentage The completion percentage to apply.\n */\n function updateElement(backupid, type, percentage) {\n var percentagewidth = Math.round(percentage) + '%';\n var elementbar = document.querySelectorAll(\"[data-\" + type + \"id=\" + CSS.escape(backupid) + \"]\")[0];\n var percentagetext = percentage.toFixed(2) + '%';\n\n // Set progress bar percentage indicators\n elementbar.setAttribute('aria-valuenow', percentagewidth);\n elementbar.style.width = percentagewidth;\n elementbar.innerHTML = percentagetext;\n }\n\n /**\n * Updates the interval we use to check for backup progress.\n *\n * @param {Number} intervalid The id of the interval\n * @param {Function} callback The function to use in setInterval\n * @param {Number} value The specified interval (in milliseconds)\n * @returns {Number}\n */\n function updateInterval(intervalid, callback, value) {\n clearInterval(intervalid);\n return setInterval(callback, value);\n }\n\n /**\n * Update backup table row when an async backup completes.\n *\n * @param {string} backupid The id to match elements on.\n */\n function updateBackupTableRow(backupid) {\n var statuscell = $('#' + backupid + '_bar').parent().parent();\n var tablerow = statuscell.parent();\n var cellsiblings = statuscell.siblings();\n var timecell = cellsiblings[1];\n var timevalue = $(timecell).text();\n var filenamecell = cellsiblings[0];\n var filename = $(filenamecell).text();\n\n ajax.call([{\n // Get the table data via webservice.\n methodname: 'core_backup_get_async_backup_links_backup',\n args: {\n 'filename': filename,\n 'contextid': contextid\n },\n }])[0].done(function(response) {\n // We have the data now update the UI.\n var context = {\n filename: filename,\n time: timevalue,\n size: response.filesize,\n fileurl: response.fileurl,\n restoreurl: response.restoreurl\n };\n\n Templates.render('core/async_backup_progress_row', context).then(function(html, js) {\n Templates.replaceNodeContents(tablerow, html, js);\n return;\n }).fail(function() {\n notification.exception(new Error('Failed to load table row'));\n return;\n });\n });\n }\n\n /**\n * Update restore table row when an async restore completes.\n *\n * @param {string} backupid The id to match elements on.\n */\n function updateRestoreTableRow(backupid) {\n var statuscell = $('#' + backupid + '_bar').parent().parent();\n var tablerow = statuscell.parent();\n var cellsiblings = statuscell.siblings();\n var coursecell = cellsiblings[0];\n var timecell = cellsiblings[1];\n var timevalue = $(timecell).text();\n\n ajax.call([{\n // Get the table data via webservice.\n methodname: 'core_backup_get_async_backup_links_restore',\n args: {\n 'backupid': backupid,\n 'contextid': contextid\n },\n }])[0].done(function(response) {\n // We have the data now update the UI.\n var resourcename = $(coursecell).text();\n var context = {\n resourcename: resourcename,\n restoreurl: response.restoreurl,\n time: timevalue\n };\n\n Templates.render('core/async_restore_progress_row', context).then(function(html, js) {\n Templates.replaceNodeContents(tablerow, html, js);\n return;\n }).fail(function() {\n notification.exception(new Error('Failed to load table row'));\n return;\n });\n });\n }\n\n /**\n * Update copy table row when an course copy completes.\n *\n * @param {string} backupid The id to match elements on.\n */\n function updateCopyTableRow(backupid) {\n var elementbar = document.querySelectorAll(\"[data-restoreid=\" + CSS.escape(backupid) + \"]\")[0];\n var restorecourse = elementbar.closest('tr').children[1];\n var coursename = restorecourse.innerHTML;\n var courselink = document.createElement('a');\n var elementbarparent = elementbar.closest('td');\n var operation = elementbarparent.previousElementSibling;\n\n // Replace the prgress bar.\n Str.get_string('complete').then(function(content) {\n operation.innerHTML = content;\n return;\n }).catch(function() {\n notification.exception(new Error('Failed to load string: complete'));\n return;\n });\n\n Templates.render('core/async_copy_complete_cell', {}).then(function(html, js) {\n Templates.replaceNodeContents(elementbarparent, html, js);\n return;\n }).fail(function() {\n notification.exception(new Error('Failed to load table cell'));\n return;\n });\n\n // Update the destination course name to a link to that course.\n ajax.call([{\n methodname: 'core_backup_get_async_backup_links_restore',\n args: {\n 'backupid': backupid,\n 'contextid': 0\n },\n }])[0].done(function(response) {\n courselink.setAttribute('href', response.restoreurl);\n courselink.innerHTML = coursename;\n restorecourse.innerHTML = null;\n restorecourse.appendChild(courselink);\n\n return;\n }).fail(function() {\n notification.exception(new Error('Failed to update table row'));\n return;\n });\n }\n\n /**\n * Update the Moodle user interface with the progress of\n * the backup process.\n *\n * @param {object} progress The progress and status of the process.\n */\n function updateProgress(progress) {\n var percentage = progress.progress * 100;\n var type = 'backup';\n var elementbar = document.querySelectorAll(\"[data-\" + type + \"id=\" + CSS.escape(backupid) + \"]\")[0];\n var elementstatus = $('#' + backupid + '_status');\n var elementdetail = $('#' + backupid + '_detail');\n var elementbutton = $('#' + backupid + '_button');\n var stringRequests;\n\n if (progress.status == STATUS_EXECUTING) {\n // Process is in progress.\n // Add in progress class color to bar.\n elementbar.classList.add('bg-success');\n\n updateElement(backupid, type, percentage);\n\n // Change heading.\n var strProcessing = 'async' + typeid + 'processing';\n Str.get_string(strProcessing, 'backup').then(function(title) {\n elementstatus.text(title);\n return;\n }).catch(function() {\n notification.exception(new Error('Failed to load string: backup ' + strProcessing));\n });\n\n } else if (progress.status == STATUS_FINISHED_ERR) {\n // Process completed with error.\n\n // Add in fail class color to bar.\n elementbar.classList.add('bg-danger');\n\n // Remove in progress class color to bar.\n elementbar.classList.remove('bg-success');\n\n updateElement(backupid, type, 100);\n\n // Change heading and text.\n var strStatus = 'async' + typeid + 'error';\n var strStatusDetail = 'async' + typeid + 'errordetail';\n stringRequests = [\n {key: strStatus, component: 'backup'},\n {key: strStatusDetail, component: 'backup'}\n ];\n Str.get_strings(stringRequests).then(function(strings) {\n elementstatus.text(strings[0]);\n elementdetail.text(strings[1]);\n\n return;\n })\n .catch(function() {\n notification.exception(new Error('Failed to load string'));\n return;\n });\n\n $('.backup_progress').children('span').removeClass('backup_stage_current');\n $('.backup_progress').children('span').last().addClass('backup_stage_current');\n\n // Stop checking when we either have an error or a completion.\n clearInterval(backupintervalid);\n\n } else if (progress.status == STATUS_FINISHED_OK) {\n // Process completed successfully.\n\n // Add in progress class color to bar\n elementbar.classList.add('bg-success');\n\n updateElement(backupid, type, 100);\n\n // Change heading and text\n var strComplete = 'async' + typeid + 'complete';\n Str.get_string(strComplete, 'backup').then(function(title) {\n elementstatus.text(title);\n return;\n }).catch(function() {\n notification.exception(new Error('Failed to load string: backup ' + strComplete));\n });\n\n if (typeid == 'restore') {\n ajax.call([{\n // Get the table data via webservice.\n methodname: 'core_backup_get_async_backup_links_restore',\n args: {\n 'backupid': backupid,\n 'contextid': contextid\n },\n }])[0].done(function(response) {\n var strDetail = 'async' + typeid + 'completedetail';\n var strButton = 'async' + typeid + 'completebutton';\n var stringRequests = [\n {key: strDetail, component: 'backup', param: response.restoreurl},\n {key: strButton, component: 'backup'}\n ];\n Str.get_strings(stringRequests).then(function(strings) {\n elementdetail.html(strings[0]);\n elementbutton.text(strings[1]);\n elementbutton.attr('href', response.restoreurl);\n\n return;\n })\n .catch(function() {\n notification.exception(new Error('Failed to load string'));\n return;\n });\n\n });\n } else {\n var strDetail = 'async' + typeid + 'completedetail';\n var strButton = 'async' + typeid + 'completebutton';\n stringRequests = [\n {key: strDetail, component: 'backup', param: restoreurl},\n {key: strButton, component: 'backup'}\n ];\n Str.get_strings(stringRequests).then(function(strings) {\n elementdetail.html(strings[0]);\n elementbutton.text(strings[1]);\n elementbutton.attr('href', restoreurl);\n\n return;\n })\n .catch(function() {\n notification.exception(new Error('Failed to load string'));\n return;\n });\n\n }\n\n $('.backup_progress').children('span').removeClass('backup_stage_current');\n $('.backup_progress').children('span').last().addClass('backup_stage_current');\n\n // Stop checking when we either have an error or a completion.\n clearInterval(backupintervalid);\n }\n }\n\n /**\n * Update the Moodle user interface with the progress of\n * all the pending processes for backup and restore operations.\n *\n * @param {object} progress The progress and status of the process.\n */\n function updateProgressAll(progress) {\n progress.forEach(function(element) {\n var percentage = element.progress * 100;\n var backupid = element.backupid;\n var type = element.operation;\n var elementbar = document.querySelectorAll(\"[data-\" + type + \"id=\" + CSS.escape(backupid) + \"]\")[0];\n\n if (element.status == STATUS_EXECUTING) {\n // Process is in element.\n\n // Add in element class color to bar\n elementbar.classList.add('bg-success');\n\n updateElement(backupid, type, percentage);\n\n } else if (element.status == STATUS_FINISHED_ERR) {\n // Process completed with error.\n\n // Add in fail class color to bar\n elementbar.classList.add('bg-danger');\n elementbar.classList.add('complete');\n\n // Remove in element class color to bar\n elementbar.classList.remove('bg-success');\n\n updateElement(backupid, type, 100);\n\n } else if (element.status == STATUS_FINISHED_OK) {\n // Process completed successfully.\n\n // Add in element class color to bar\n elementbar.classList.add('bg-success');\n elementbar.classList.add('complete');\n\n updateElement(backupid, type, 100);\n\n // We have a successful backup. Update the UI with download and file details.\n if (type == 'backup') {\n updateBackupTableRow(backupid);\n } else {\n updateRestoreTableRow(backupid);\n }\n\n }\n\n });\n }\n\n /**\n * Update the Moodle user interface with the progress of\n * all the pending processes for copy operations.\n *\n * @param {object} progress The progress and status of the process.\n */\n function updateProgressCopy(progress) {\n progress.forEach(function(element) {\n var percentage = element.progress * 100;\n var backupid = element.backupid;\n var type = element.operation;\n var elementbar = document.querySelectorAll(\"[data-\" + type + \"id=\" + CSS.escape(backupid) + \"]\")[0];\n\n if (type == 'restore') {\n let restorecell = elementbar.closest('tr').children[3];\n Str.get_string('restore').then(function(content) {\n restorecell.innerHTML = content;\n return;\n }).catch(function() {\n notification.exception(new Error('Failed to load string: restore'));\n });\n }\n\n if (element.status == STATUS_EXECUTING) {\n // Process is in element.\n\n // Add in element class color to bar\n elementbar.classList.add('bg-success');\n\n updateElement(backupid, type, percentage);\n\n } else if (element.status == STATUS_FINISHED_ERR) {\n // Process completed with error.\n\n // Add in fail class color to bar\n elementbar.classList.add('bg-danger');\n elementbar.classList.add('complete');\n\n // Remove in element class color to bar\n elementbar.classList.remove('bg-success');\n\n updateElement(backupid, type, 100);\n\n } else if ((element.status == STATUS_FINISHED_OK) && (type == 'restore')) {\n // Process completed successfully.\n\n // Add in element class color to bar\n elementbar.classList.add('bg-success');\n elementbar.classList.add('complete');\n\n updateElement(backupid, type, 100);\n\n // We have a successful copy. Update the UI link to copied course.\n updateCopyTableRow(backupid);\n }\n\n });\n }\n\n /**\n * Get the progress of the backup process via ajax.\n */\n function getBackupProgress() {\n ajax.call([{\n // Get the backup progress via webservice.\n methodname: 'core_backup_get_async_backup_progress',\n args: {\n 'backupids': [backupid],\n 'contextid': contextid\n },\n }], true, true, false, timeout)[0].done(function(response) {\n // We have the progress now update the UI.\n updateProgress(response[0]);\n checkdelay = checkdelayoriginal;\n backupintervalid = updateInterval(backupintervalid, getBackupProgress, checkdelayoriginal);\n }).fail(function() {\n checkdelay = checkdelay * checkdelaymultipler;\n backupintervalid = updateInterval(backupintervalid, getBackupProgress, checkdelay);\n });\n }\n\n /**\n * Get the progress of all backup processes via ajax.\n */\n function getAllBackupProgress() {\n var backupids = [];\n var progressbars = $('.progress').find('.progress-bar').not('.complete');\n\n progressbars.each(function() {\n backupids.push((this.id).substring(0, 32));\n });\n\n if (backupids.length > 0) {\n ajax.call([{\n // Get the backup progress via webservice.\n methodname: 'core_backup_get_async_backup_progress',\n args: {\n 'backupids': backupids,\n 'contextid': contextid\n },\n }], true, true, false, timeout)[0].done(function(response) {\n updateProgressAll(response);\n checkdelay = checkdelayoriginal;\n allbackupintervalid = updateInterval(allbackupintervalid, getAllBackupProgress, checkdelayoriginal);\n }).fail(function() {\n checkdelay = checkdelay * checkdelaymultipler;\n allbackupintervalid = updateInterval(allbackupintervalid, getAllBackupProgress, checkdelay);\n });\n } else {\n clearInterval(allbackupintervalid); // No more progress bars to update, stop checking.\n }\n }\n\n /**\n * Get the progress of all copy processes via ajax.\n */\n function getAllCopyProgress() {\n var copyids = [];\n var progressbars = $('.progress').find('.progress-bar[data-operation][data-backupid][data-restoreid]').not('.complete');\n\n progressbars.each(function() {\n let progressvars = {\n 'backupid': this.dataset.backupid,\n 'restoreid': this.dataset.restoreid,\n 'operation': this.dataset.operation,\n };\n copyids.push(progressvars);\n });\n\n if (copyids.length > 0) {\n ajax.call([{\n // Get the copy progress via webservice.\n methodname: 'core_backup_get_copy_progress',\n args: {\n 'copies': copyids\n },\n }], true, true, false, timeout)[0].done(function(response) {\n updateProgressCopy(response);\n checkdelay = checkdelayoriginal;\n allcopyintervalid = updateInterval(allcopyintervalid, getAllCopyProgress, checkdelayoriginal);\n }).fail(function() {\n checkdelay = checkdelay * checkdelaymultipler;\n allcopyintervalid = updateInterval(allcopyintervalid, getAllCopyProgress, checkdelay);\n });\n } else {\n clearInterval(allcopyintervalid); // No more progress bars to update, stop checking.\n }\n }\n\n /**\n * Get status updates for all backups.\n *\n * @public\n * @param {number} context The context id.\n */\n Asyncbackup.asyncBackupAllStatus = function(context) {\n contextid = context;\n allbackupintervalid = setInterval(getAllBackupProgress, checkdelay);\n };\n\n /**\n * Get status updates for all course copies.\n *\n * @public\n */\n Asyncbackup.asyncCopyAllStatus = function() {\n allcopyintervalid = setInterval(getAllCopyProgress, checkdelay);\n };\n\n /**\n * Get status updates for backup.\n *\n * @public\n * @param {string} backup The backup record id.\n * @param {number} context The context id.\n * @param {string} restore The restore link.\n * @param {string} type The operation type (backup or restore).\n */\n Asyncbackup.asyncBackupStatus = function(backup, context, restore, type) {\n backupid = backup;\n contextid = context;\n restoreurl = restore;\n\n if (type == 'backup') {\n typeid = 'backup';\n } else {\n typeid = 'restore';\n }\n\n // Remove the links from the progress bar, no going back now.\n $('.backup_progress').children('a').removeAttr('href');\n\n // Periodically check for progress updates and update the UI as required.\n backupintervalid = setInterval(getBackupProgress, checkdelay);\n\n };\n\n return Asyncbackup;\n});\n"],"names":["define","$","ajax","Str","notification","Templates","STATUS_EXECUTING","backupid","contextid","restoreurl","typeid","backupintervalid","allbackupintervalid","allcopyintervalid","STATUS_FINISHED_ERR","STATUS_FINISHED_OK","Asyncbackup","checkdelayoriginal","checkdelay","checkdelaymultipler","timeout","updateElement","type","percentage","percentagewidth","Math","round","elementbar","document","querySelectorAll","CSS","escape","percentagetext","toFixed","setAttribute","style","width","innerHTML","updateInterval","intervalid","callback","value","clearInterval","setInterval","updateProgressAll","progress","forEach","element","operation","status","classList","add","remove","updateBackupTableRow","statuscell","parent","tablerow","cellsiblings","siblings","timecell","timevalue","text","filenamecell","filename","call","methodname","args","done","response","context","time","size","filesize","fileurl","render","then","html","js","replaceNodeContents","fail","exception","Error","updateRestoreTableRow","coursecell","resourcename","updateProgressCopy","restorecell","closest","children","get_string","content","catch","updateCopyTableRow","restorecourse","coursename","courselink","createElement","elementbarparent","previousElementSibling","appendChild","getBackupProgress","backupids","updateProgress","stringRequests","elementstatus","elementdetail","elementbutton","strProcessing","title","key","component","get_strings","strings","removeClass","last","addClass","strComplete","strButton","param","attr","getAllBackupProgress","find","not","each","push","this","id","substring","length","getAllCopyProgress","copyids","progressvars","dataset","restoreid","asyncBackupAllStatus","asyncCopyAllStatus","asyncBackupStatus","backup","restore","removeAttr"],"mappings":"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"} \ No newline at end of file diff --git a/badges/amd/build/backpackactions.min.js.map b/badges/amd/build/backpackactions.min.js.map index 6abe8ab5d1d..49b0f1d728e 100644 --- a/badges/amd/build/backpackactions.min.js.map +++ b/badges/amd/build/backpackactions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"backpackactions.min.js","sources":["../src/backpackactions.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 * Action methods related to backpacks.\n *\n * @module core_badges/backpackactions\n * @copyright 2020 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport selectors from 'core_badges/selectors';\nimport {get_string as getString} from 'core/str';\nimport Pending from 'core/pending';\nimport ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport Config from 'core/config';\n\n/**\n * Set up the actions.\n *\n * @method init\n */\nexport const init = () => {\n const pendingPromise = new Pending();\n\n const root = $(selectors.elements.main);\n registerListenerEvents(root);\n\n pendingPromise.resolve();\n};\n\n/**\n * Register backpack related event listeners.\n *\n * @method registerListenerEvents\n * @param {Object} root The root element.\n */\nconst registerListenerEvents = (root) => {\n\n root.on('click', selectors.actions.deletebackpack, async(e) => {\n e.preventDefault();\n\n const link = $(e.currentTarget);\n const modal = await buildModal(link);\n\n displayModal(modal, link);\n });\n};\n\nconst buildModal = async(link) => {\n\n const backpackurl = link.closest(selectors.elements.backpackurl).attr('data-backpackurl');\n\n return ModalFactory.create({\n title: await getString('delexternalbackpack', 'core_badges'),\n body: await getString('delexternalbackpackconfirm', 'core_badges', backpackurl),\n type: ModalFactory.types.SAVE_CANCEL,\n });\n\n};\n\nconst displayModal = async(modal, link) => {\n modal.setSaveButtonText(await getString('delete', 'core'));\n\n modal.getRoot().on(ModalEvents.save, function() {\n window.location.href = link.attr('href') + '&sesskey=' + Config.sesskey + '&confirm=1';\n });\n\n modal.getRoot().on(ModalEvents.hidden, function() {\n modal.destroy();\n });\n\n modal.show();\n};\n"],"names":["pendingPromise","Pending","root","selectors","elements","main","registerListenerEvents","resolve","on","actions","deletebackpack","e","preventDefault","link","currentTarget","buildModal","modal","displayModal","backpackurl","closest","attr","ModalFactory","types","SAVE_CANCEL","title","body","type","create","setSaveButtonText","getRoot","ModalEvents","save","window","location","href","Config","sesskey","hidden","destroy","show"],"mappings":"4uCAoCoB,eACVA,eAAiB,IAAIC,iBAErBC,MAAO,mBAAEC,mBAAUC,SAASC,MAClCC,uBAAuBJ,MAEvBF,eAAeO,2BASbD,uBAAyB,SAACJ,eAE5BA,KAAKM,GAAG,QAASL,mBAAUM,QAAQC,gEAAgB,iBAAMC,8HACrDA,EAAEC,iBAEIC,MAAO,mBAAEF,EAAEG,+BACGC,WAAWF,aAAzBG,oBAENC,aAAaD,MAAOH,iHAItBE,6DAAa,kBAAMF,qIAEfK,YAAcL,KAAKM,QAAQhB,mBAAUC,SAASc,aAAaE,KAAK,iCAE/DC,yCACU,mBAAU,sBAAuB,2EAClC,mBAAU,6BAA8B,cAAeH,oEAC7DG,uBAAaC,MAAMC,0BAFzBC,mBACAC,kBACAC,0DAHgBC,sJAQlBV,+DAAe,kBAAMD,MAAOH,kIAC9BG,wBAA8B,mBAAU,SAAU,wDAA5CY,kDAENZ,MAAMa,UAAUrB,GAAGsB,sBAAYC,MAAM,WACjCC,OAAOC,SAASC,KAAOrB,KAAKO,KAAK,QAAU,YAAce,gBAAOC,QAAU,gBAG9EpB,MAAMa,UAAUrB,GAAGsB,sBAAYO,QAAQ,WACnCrB,MAAMsB,aAGVtB,MAAMuB"} \ No newline at end of file +{"version":3,"file":"backpackactions.min.js","sources":["../src/backpackactions.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 * Action methods related to backpacks.\n *\n * @module core_badges/backpackactions\n * @copyright 2020 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport selectors from 'core_badges/selectors';\nimport {get_string as getString} from 'core/str';\nimport Pending from 'core/pending';\nimport ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport Config from 'core/config';\n\n/**\n * Set up the actions.\n *\n * @method init\n */\nexport const init = () => {\n const pendingPromise = new Pending();\n\n const root = $(selectors.elements.main);\n registerListenerEvents(root);\n\n pendingPromise.resolve();\n};\n\n/**\n * Register backpack related event listeners.\n *\n * @method registerListenerEvents\n * @param {Object} root The root element.\n */\nconst registerListenerEvents = (root) => {\n\n root.on('click', selectors.actions.deletebackpack, async(e) => {\n e.preventDefault();\n\n const link = $(e.currentTarget);\n const modal = await buildModal(link);\n\n displayModal(modal, link);\n });\n};\n\nconst buildModal = async(link) => {\n\n const backpackurl = link.closest(selectors.elements.backpackurl).attr('data-backpackurl');\n\n return ModalFactory.create({\n title: await getString('delexternalbackpack', 'core_badges'),\n body: await getString('delexternalbackpackconfirm', 'core_badges', backpackurl),\n type: ModalFactory.types.SAVE_CANCEL,\n });\n\n};\n\nconst displayModal = async(modal, link) => {\n modal.setSaveButtonText(await getString('delete', 'core'));\n\n modal.getRoot().on(ModalEvents.save, function() {\n window.location.href = link.attr('href') + '&sesskey=' + Config.sesskey + '&confirm=1';\n });\n\n modal.getRoot().on(ModalEvents.hidden, function() {\n modal.destroy();\n });\n\n modal.show();\n};\n"],"names":["_jquery","_interopRequireDefault","_selectors","_pending","_modal_factory","_modal_events","_config","pendingPromise","Pending","root","default","selectors","elements","main","registerListenerEvents","resolve","_ref2","_ref3","_ref","on","actions","deletebackpack","_asyncToGenerator","regeneratorRuntime","mark","e","link","modal","wrap","_context","prev","next","buildModal","preventDefault","currentTarget","sent","displayModal","stop","_callee","_x","apply","this","arguments","backpackurl","_context2","closest","attr","t0","ModalFactory","_str","get_string","t1","t2","types","SAVE_CANCEL","t4","title","body","type","t3","abrupt","create","call","_callee2","_x2","_callee3","_context3","setSaveButtonText","getRoot","ModalEvents","save","window","location","href","Config","sesskey","hidden","destroy","show","_x3","_x4"],"mappings":"48BAuBAA,QAAAC,uBAAAD,SACAE,WAAAD,uBAAAC,YAEAC,SAAAF,uBAAAE,UACAC,eAAAH,uBAAAG,gBACAC,cAAAJ,uBAAAI,eACAC,QAAAL,uBAAAK,uBAOoB,WAChB,IAAMC,eAAiB,IAAIC,SAAAA,QAErBC,MAAO,EAAAT,QAAAU,SAAEC,mBAAUC,SAASC,MAClCC,uBAAuBL,MAEvBF,eAAeQ,SAClB,EAQD,IAYgBC,MAYKC,MAxBfH,uBAAyB,SAACL,MAE5B,IAAAS,KAAAT,KAAKU,GAAG,QAASR,WAAAA,QAAUS,QAAQC,gBAAnCH,KAAAI,kBAAAC,mBAAAC,MAAmD,iBAAMC,GAAN,IAAAC,KAAAC,MAAA,OAAAJ,mBAAAK,MAAA,SAAAC,UAAA,OAAA,OAAAA,SAAAC,KAAAD,SAAAE,MAAA,KAAA,EAI3BC,OAHpBP,EAAEQ,iBAEIP,MAAO,EAAA1B,QAAAU,SAAEe,EAAES,eAH8BL,SAAAE,KAAA,EAI3BC,WAAWN,MAJgB,KAAA,EAIzCC,MAJyCE,SAAAM,KAM/CC,aAAaT,MAAOD,MAN2B,KAAA,EAAA,IAAA,MAAA,OAAAG,SAAAQ,OAAA,GAAAC,QAAnD,KAAA,SAAAC,IAAA,OAAArB,KAAAsB,MAAAC,KAAAC,UAAA,GAQH,EAEKV,YAAUhB,MAAAM,kBAAAC,mBAAAC,MAAG,kBAAME,MAAN,IAAAiB,YAAA,OAAApB,mBAAAK,MAAA,SAAAgB,WAAA,OAAA,OAAAA,UAAAd,KAAAc,UAAAb,MAAA,KAAA,EAAA,OAETY,YAAcjB,KAAKmB,QAAQlC,WAAAA,QAAUC,SAAS+B,aAAaG,KAAK,oBAFvDF,UAAAG,GAIRC,eAJQtC,QAAAkC,UAAAb,KAAA,GAKE,EAAUkB,KAAAC,YAAA,sBAAuB,eALnC,KAAA,EAAA,OAAAN,UAAAO,GAAAP,UAAAT,KAAAS,UAAAb,KAAA,GAMC,mBAAU,6BAA8B,cAAeY,aANxD,KAAA,EAAA,OAAAC,UAAAQ,GAAAR,UAAAT,KAOLa,UAAAA,GAAAA,eAAAA,QAAaK,MAAMC,YAPdV,UAAAW,GAAA,CAKXC,MALWZ,UAAAO,GAMXM,KANWb,UAAAQ,GAOXM,KAPWd,UAAAe,IAAAf,UAAAgB,OAAA,SAAAhB,UAAAG,GAIKc,OAJLC,KAAAlB,UAAAG,GAAAH,UAAAW,KAAA,KAAA,GAAA,IAAA,MAAA,OAAAX,UAAAP,OAAA,GAAA0B,SAAH,KAAA,SAAAC,KAAA,OAAAhD,MAAAwB,MAAAC,KAAAC,UAAA,GAYVN,cAAenB,MAAAK,kBAAAC,mBAAAC,MAAA,SAAAyC,SAAMtC,MAAOD,MAAb,OAAAH,mBAAAK,MAAA,SAAAsC,WAAA,OAAA,OAAAA,UAAApC,KAAAoC,UAAAnC,MAAA,KAAA,EAAA,OAAAmC,UAAAnB,GACjBpB,MADiBuC,UAAAnC,KAAA,GACa,EAAUkB,KAAAC,YAAA,SAAU,QADjC,KAAA,EAAAgB,UAAAf,GAAAe,UAAA/B,KAAA+B,UAAAnB,GACXoB,kBADWL,KAAAI,UAAAnB,GAAAmB,UAAAf,IAGjBxB,MAAMyC,UAAUjD,GAAGkD,cAAAA,QAAYC,MAAM,WACjCC,OAAOC,SAASC,KAAO/C,KAAKoB,KAAK,QAAU,YAAc4B,QAAOC,QAAAA,QAAU,YAC7E,IAEDhD,MAAMyC,UAAUjD,GAAGkD,cAAAA,QAAYO,QAAQ,WACnCjD,MAAMkD,SACT,IAEDlD,MAAMmD,OAXW,KAAA,EAAA,IAAA,MAAA,OAAAZ,UAAA7B,OAAA,GAAA4B,SAAH,KAAA,SAAAc,IAAAC,KAAA,OAAA/D,MAAAuB,MAAAC,KAAAC,UAAA"} \ No newline at end of file diff --git a/badges/amd/build/selectors.min.js.map b/badges/amd/build/selectors.min.js.map index 089d275e2db..d8b25c738f8 100644 --- a/badges/amd/build/selectors.min.js.map +++ b/badges/amd/build/selectors.min.js.map @@ -1 +1 @@ -{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 * Define all of the selectors we will be using on the backpack interface.\n *\n * @module core_badges/selectors\n * @copyright 2020 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * A small helper function to build queryable data selectors.\n *\n * @method getDataSelector\n * @param {String} name\n * @param {String} value\n * @return {string}\n */\nconst getDataSelector = (name, value) => {\n return `[data-${name}=\"${value}\"]`;\n};\n\nexport default {\n actions: {\n deletebackpack: getDataSelector('action', 'deletebackpack'),\n },\n elements: {\n clearsearch: '.input-group-append .clear-icon',\n main: '#backpacklist',\n backpackurl: '[data-backpackurl]',\n },\n};\n"],"names":["name","value","actions","deletebackpack","elements","clearsearch","main","backpackurl"],"mappings":";;;;;;;;IA+ByBA,KAAMC,eAIhB,CACXC,QAAS,CACLC,gBANiBH,KAMe,SANTC,MAMmB,iCAL9BD,kBAASC,cAOzBG,SAAU,CACNC,YAAa,kCACbC,KAAM,gBACNC,YAAa"} \ No newline at end of file +{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 * Define all of the selectors we will be using on the backpack interface.\n *\n * @module core_badges/selectors\n * @copyright 2020 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * A small helper function to build queryable data selectors.\n *\n * @method getDataSelector\n * @param {String} name\n * @param {String} value\n * @return {string}\n */\nconst getDataSelector = (name, value) => {\n return `[data-${name}=\"${value}\"]`;\n};\n\nexport default {\n actions: {\n deletebackpack: getDataSelector('action', 'deletebackpack'),\n },\n elements: {\n clearsearch: '.input-group-append .clear-icon',\n main: '#backpacklist',\n backpackurl: '[data-backpackurl]',\n },\n};\n"],"names":["getDataSelector","name","value","_default","actions","deletebackpack","elements","clearsearch","main","backpackurl"],"mappings":";;;;;;;;AA+BMA,IAAmBC,KAAMC,MAIhBC,SAAA,CACXC,QAAS,CACLC,gBANiBJ,KAMe,SANTC,MAMmB,iBAL9BD,SAAAA,OAAAA,kBAASC,MAAzB,QAOAI,SAAU,CACNC,YAAa,kCACbC,KAAM,gBACNC,YAAa"} \ No newline at end of file diff --git a/blocks/accessreview/amd/build/module.min.js b/blocks/accessreview/amd/build/module.min.js index 9a812705d69..2ae8e6caa95 100644 --- a/blocks/accessreview/amd/build/module.min.js +++ b/blocks/accessreview/amd/build/module.min.js @@ -1,3 +1,3 @@ -function _typeof(obj){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof(obj)}define("block_accessreview/module",["exports","core/ajax","core/templates","core/notification"],(function(_exports,_ajax,Templates,_notification){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 _slicedToArray(arr,i){return function(arr){if(Array.isArray(arr))return arr}(arr)||function(arr,i){var _i=null==arr?null:"undefined"!=typeof Symbol&&arr[Symbol.iterator]||arr["@@iterator"];if(null==_i)return;var _s,_e,_arr=[],_n=!0,_d=!1;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}(arr,i)||function(o,minLen){if(!o)return;if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);"Object"===n&&o.constructor&&(n=o.constructor.name);if("Map"===n||"Set"===n)return Array.from(o);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}(arr,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i2&&void 0!==arguments[2]&&arguments[2];return Promise.all(fetchReviewData(courseId,updatePreference)).then((function(_ref2){var _document$querySelect,_document$querySelect2,_ref3=_slicedToArray(_ref2,2),sectionData=_ref3[0],moduleData=_ref3[1],_getErrorTotals=getErrorTotals(sectionData,moduleData),minViews=_getErrorTotals.minViews,viewDelta=_getErrorTotals.viewDelta;return sectionData.forEach((function(section){var element=document.querySelector("#section-".concat(section.section," .summary"));element&&renderTemplate(element,section.numerrors,section.numchecks,displayFormat,minViews,viewDelta)})),moduleData.forEach((function(module){var element=document.getElementById("module-".concat(module.cmid));element&&renderTemplate(element,module.numerrors,module.numchecks,displayFormat,minViews,viewDelta)})),(_document$querySelect=document.querySelector(".icon-accessmap").classList).remove.apply(_document$querySelect,["fa-eye-slash"]),(_document$querySelect2=document.querySelector(".icon-accessmap").classList).add.apply(_document$querySelect2,["fa-eye"]),{sectionData:sectionData,moduleData:moduleData}})).catch(_notification.exception)},toggleAccessMap=function(courseId,displayFormat){(toggleState=!toggleState)?showAccessMap(courseId,displayFormat,!0):function(){var _document$querySelect3,_document$querySelect4,updatePreference=arguments.length>0&&void 0!==arguments[0]&&arguments[0];document.querySelectorAll(".block_accessreview_view").forEach((function(node){return node.remove()}));var classList=["block_accessreview","block_accessreview_success","block_accessreview_warning","block_accessreview_danger","block_accessreview_view","alert"];document.querySelectorAll(".block_accessreview").forEach((function(node){var _node$classList;return(_node$classList=node.classList).remove.apply(_node$classList,classList)})),updatePreference&&setToggleStatePreference(!1),(_document$querySelect3=document.querySelector(".icon-accessmap").classList).remove.apply(_document$querySelect3,["fa-eye"]),(_document$querySelect4=document.querySelector(".icon-accessmap").classList).add.apply(_document$querySelect4,["fa-eye-slash"])}(!0)},getErrorTotals=function(sectionData,moduleData){var totals={totalErrors:0,totalUsers:0,minViews:0,maxViews:0,viewDelta:0};return[].concat(sectionData,moduleData).forEach((function(item){totals.totalErrors+=item.numerrors,item.numerrorstotals.maxViews&&(totals.maxViews=item.numerrors),totals.totalUsers+=item.numchecks})),totals.viewDelta=totals.maxViews-totals.minViews+1,totals},getTogglePreferenceParams=function(toggleState){return{methodname:"core_user_update_user_preferences",args:{preferences:[{type:"block_accessreviewtogglestate",value:toggleState}]}}},setToggleStatePreference=function(toggleState){return(0,_ajax.call)([getTogglePreferenceParams(toggleState)])},fetchReviewData=function(courseid){var updatePreference=arguments.length>1&&void 0!==arguments[1]&&arguments[1],calls=[{methodname:"block_accessreview_get_section_data",args:{courseid:courseid}},{methodname:"block_accessreview_get_module_data",args:{courseid:courseid}}];return updatePreference&&calls.push(getTogglePreferenceParams(!0)),(0,_ajax.call)(calls)};_exports.init=function(toggled,displayFormat,courseId){(toggleState=1==toggled)&&showAccessMap(courseId,displayFormat),function(courseId,displayFormat){document.addEventListener("click",(function(e){e.target.closest("#toggle-accessmap")&&(e.preventDefault(),toggleAccessMap(courseId,displayFormat))}))}(courseId,displayFormat)}})); +function _typeof(obj){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof(obj)}define("block_accessreview/module",["exports","core/ajax","core/templates","core/notification"],(function(_exports,_ajax,Templates,_notification){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 _slicedToArray(arr,i){return function(arr){if(Array.isArray(arr))return arr}(arr)||function(arr,i){var _i=null==arr?null:"undefined"!=typeof Symbol&&arr[Symbol.iterator]||arr["@@iterator"];if(null==_i)return;var _s,_e,_arr=[],_n=!0,_d=!1;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}(arr,i)||function(o,minLen){if(!o)return;if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);"Object"===n&&o.constructor&&(n=o.constructor.name);if("Map"===n||"Set"===n)return Array.from(o);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}(arr,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i2&&void 0!==arguments[2]&&arguments[2];return Promise.all(fetchReviewData(courseId,updatePreference)).then((function(_ref2){var _document$querySelect,_document$querySelect2,_ref3=_slicedToArray(_ref2,2),sectionData=_ref3[0],moduleData=_ref3[1],_getErrorTotals=getErrorTotals(sectionData,moduleData),minViews=_getErrorTotals.minViews,viewDelta=_getErrorTotals.viewDelta;return sectionData.forEach((function(section){var element=document.querySelector("#section-".concat(section.section," .summary"));element&&renderTemplate(element,section.numerrors,section.numchecks,displayFormat,minViews,viewDelta)})),moduleData.forEach((function(module){var element=document.getElementById("module-".concat(module.cmid));element&&renderTemplate(element,module.numerrors,module.numchecks,displayFormat,minViews,viewDelta)})),(_document$querySelect=document.querySelector(".icon-accessmap").classList).remove.apply(_document$querySelect,["fa-eye-slash"]),(_document$querySelect2=document.querySelector(".icon-accessmap").classList).add.apply(_document$querySelect2,["fa-eye"]),{sectionData:sectionData,moduleData:moduleData}})).catch(_notification.exception)},toggleAccessMap=function(courseId,displayFormat){(toggleState=!toggleState)?showAccessMap(courseId,displayFormat,!0):function(){var _document$querySelect3,_document$querySelect4,updatePreference=arguments.length>0&&void 0!==arguments[0]&&arguments[0];document.querySelectorAll(".block_accessreview_view").forEach((function(node){return node.remove()}));var classList=["block_accessreview","block_accessreview_success","block_accessreview_warning","block_accessreview_danger","block_accessreview_view","alert"];document.querySelectorAll(".block_accessreview").forEach((function(node){var _node$classList;return(_node$classList=node.classList).remove.apply(_node$classList,classList)})),updatePreference&&setToggleStatePreference(!1),(_document$querySelect3=document.querySelector(".icon-accessmap").classList).remove.apply(_document$querySelect3,["fa-eye"]),(_document$querySelect4=document.querySelector(".icon-accessmap").classList).add.apply(_document$querySelect4,["fa-eye-slash"])}(!0)},getErrorTotals=function(sectionData,moduleData){var totals={totalErrors:0,totalUsers:0,minViews:0,maxViews:0,viewDelta:0};return[].concat(sectionData,moduleData).forEach((function(item){totals.totalErrors+=item.numerrors,item.numerrorstotals.maxViews&&(totals.maxViews=item.numerrors),totals.totalUsers+=item.numchecks})),totals.viewDelta=totals.maxViews-totals.minViews+1,totals},getTogglePreferenceParams=function(toggleState){return{methodname:"core_user_update_user_preferences",args:{preferences:[{type:"block_accessreviewtogglestate",value:toggleState}]}}},setToggleStatePreference=function(toggleState){return(0,_ajax.call)([getTogglePreferenceParams(toggleState)])},fetchReviewData=function(courseid){var calls=[{methodname:"block_accessreview_get_section_data",args:{courseid:courseid}},{methodname:"block_accessreview_get_module_data",args:{courseid:courseid}}];return arguments.length>1&&void 0!==arguments[1]&&arguments[1]&&calls.push(getTogglePreferenceParams(!0)),(0,_ajax.call)(calls)};_exports.init=function(toggled,displayFormat,courseId){(toggleState=1==toggled)&&showAccessMap(courseId,displayFormat),function(courseId,displayFormat){document.addEventListener("click",(function(e){e.target.closest("#toggle-accessmap")&&(e.preventDefault(),toggleAccessMap(courseId,displayFormat))}))}(courseId,displayFormat)}})); //# sourceMappingURL=module.min.js.map \ No newline at end of file diff --git a/blocks/accessreview/amd/build/module.min.js.map b/blocks/accessreview/amd/build/module.min.js.map index 9140f46c0fe..3c8d5ca78a6 100644 --- a/blocks/accessreview/amd/build/module.min.js.map +++ b/blocks/accessreview/amd/build/module.min.js.map @@ -1 +1 @@ -{"version":3,"file":"module.min.js","sources":["../src/module.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 * Manager for the accessreview block.\n *\n * @module block_accessreview/module\n * @author Max Larkin \n * @copyright 2020 Brickfield Education Labs \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {call as fetchMany} from 'core/ajax';\nimport * as Templates from 'core/templates';\nimport {exception as displayError} from 'core/notification';\n\n/**\n * The number of colours used to represent the heatmap. (Indexed on 0.)\n * @type {number}\n */\nconst numColours = 2;\n\n/**\n * The toggle state of the heatmap.\n * @type {boolean}\n */\nlet toggleState = true;\n\n/**\n * Renders the HTML template onto a particular HTML element.\n * @param {HTMLElement} element The element to attach the HTML to.\n * @param {number} errorCount The number of errors on this module/section.\n * @param {number} checkCount The number of checks triggered on this module/section.\n * @param {String} displayFormat\n * @param {Number} minViews\n * @param {Number} viewDelta\n * @returns {Promise}\n */\nconst renderTemplate = (element, errorCount, checkCount, displayFormat, minViews, viewDelta) => {\n // Calculate a weight?\n const weight = parseInt((errorCount - minViews) / viewDelta * numColours);\n\n const context = {\n resultPassed: !errorCount,\n classList: '',\n passRate: {\n errorCount,\n checkCount,\n failureRate: Math.round(errorCount / checkCount * 100),\n },\n };\n\n if (!element) {\n return Promise.resolve();\n }\n\n const elementClassList = ['block_accessreview'];\n if (context.resultPassed) {\n elementClassList.push('block_accessreview_success');\n } else if (weight) {\n elementClassList.push('block_accessreview_danger');\n } else {\n elementClassList.push('block_accessreview_warning');\n }\n\n const showIcons = (displayFormat == 'showicons') || (displayFormat == 'showboth');\n const showBackground = (displayFormat == 'showbackground') || (displayFormat == 'showboth');\n\n if (showBackground && !showIcons) {\n // Only the background is displayed.\n // No need to display the template.\n // Note: The case where both the background and icons are shown is handled later to avoid jankiness.\n element.classList.add(...elementClassList, 'alert');\n\n return Promise.resolve();\n }\n\n if (showIcons && !showBackground) {\n context.classList = elementClassList.join(' ');\n }\n\n // The icons are displayed either with, or without, the background.\n return Templates.renderForPromise('block_accessreview/status', context)\n .then(({html, js}) => {\n Templates.appendNodeContents(element, html, js);\n\n if (showBackground) {\n element.classList.add(...elementClassList, 'alert');\n }\n\n return;\n })\n .catch();\n};\n\n/**\n * Applies the template to all sections and modules on the course page.\n *\n * @param {Number} courseId\n * @param {String} displayFormat\n * @param {Boolean} updatePreference\n * @returns {Promise}\n */\nconst showAccessMap = (courseId, displayFormat, updatePreference = false) => {\n // Get error data.\n return Promise.all(fetchReviewData(courseId, updatePreference))\n .then(([sectionData, moduleData]) => {\n // Get total data.\n const {minViews, viewDelta} = getErrorTotals(sectionData, moduleData);\n\n sectionData.forEach(section => {\n const element = document.querySelector(`#section-${section.section} .summary`);\n if (!element) {\n return;\n }\n\n renderTemplate(element, section.numerrors, section.numchecks, displayFormat, minViews, viewDelta);\n });\n\n moduleData.forEach(module => {\n const element = document.getElementById(`module-${module.cmid}`);\n if (!element) {\n return;\n }\n\n renderTemplate(element, module.numerrors, module.numchecks, displayFormat, minViews, viewDelta);\n });\n\n // Change the icon display.\n document.querySelector('.icon-accessmap').classList.remove(...['fa-eye-slash']);\n document.querySelector('.icon-accessmap').classList.add(...['fa-eye']);\n\n return {\n sectionData,\n moduleData,\n };\n })\n .catch(displayError);\n};\n\n\n/**\n * Hides or removes the templates from the HTML of the current page.\n *\n * @param {Boolean} updatePreference\n */\nconst hideAccessMap = (updatePreference = false) => {\n // Removes the added elements.\n document.querySelectorAll('.block_accessreview_view').forEach(node => node.remove());\n\n const classList = [\n 'block_accessreview',\n 'block_accessreview_success',\n 'block_accessreview_warning',\n 'block_accessreview_danger',\n 'block_accessreview_view',\n 'alert',\n ];\n\n // Removes the added classes.\n document.querySelectorAll('.block_accessreview').forEach(node => node.classList.remove(...classList));\n\n if (updatePreference) {\n setToggleStatePreference(false);\n }\n\n // Change the icon display.\n document.querySelector('.icon-accessmap').classList.remove(...['fa-eye']);\n document.querySelector('.icon-accessmap').classList.add(...['fa-eye-slash']);\n};\n\n\n/**\n * Toggles the heatmap on/off.\n *\n * @param {Number} courseId\n * @param {String} displayFormat\n */\nconst toggleAccessMap = (courseId, displayFormat) => {\n toggleState = !toggleState;\n if (!toggleState) {\n hideAccessMap(true);\n } else {\n showAccessMap(courseId, displayFormat, true);\n }\n};\n\n/**\n * Parses information on the errors, generating the min, max and totals.\n *\n * @param {Object[]} sectionData The error data for course sections.\n * @param {Object[]} moduleData The error data for course modules.\n * @returns {Object} An object representing the extra error information.\n */\nconst getErrorTotals = (sectionData, moduleData) => {\n const totals = {\n totalErrors: 0,\n totalUsers: 0,\n minViews: 0,\n maxViews: 0,\n viewDelta: 0,\n };\n\n [].concat(sectionData, moduleData).forEach(item => {\n totals.totalErrors += item.numerrors;\n if (item.numerrors < totals.minViews) {\n totals.minViews = item.numerrors;\n }\n\n if (item.numerrors > totals.maxViews) {\n totals.maxViews = item.numerrors;\n }\n totals.totalUsers += item.numchecks;\n });\n\n totals.viewDelta = totals.maxViews - totals.minViews + 1;\n\n return totals;\n};\n\nconst registerEventListeners = (courseId, displayFormat) => {\n document.addEventListener('click', e => {\n if (e.target.closest('#toggle-accessmap')) {\n e.preventDefault();\n toggleAccessMap(courseId, displayFormat);\n }\n });\n};\n\n/**\n * Set the user preference for the toggle value.\n *\n * @param {Boolean} toggleState\n * @returns {Promise}\n */\nconst getTogglePreferenceParams = toggleState => {\n return {\n methodname: 'core_user_update_user_preferences',\n args: {\n preferences: [{\n type: 'block_accessreviewtogglestate',\n value: toggleState,\n }],\n }\n };\n};\n\nconst setToggleStatePreference = toggleState => fetchMany([getTogglePreferenceParams(toggleState)]);\n\n/**\n * Fetch the review data.\n *\n * @param {Number} courseid\n * @param {Boolean} updatePreference\n * @returns {Promise[]}\n */\nconst fetchReviewData = (courseid, updatePreference = false) => {\n const calls = [\n {\n methodname: 'block_accessreview_get_section_data',\n args: {courseid}\n },\n {\n methodname: 'block_accessreview_get_module_data',\n args: {courseid}\n },\n ];\n\n if (updatePreference) {\n calls.push(getTogglePreferenceParams(true));\n }\n\n return fetchMany(calls);\n};\n\n/**\n * Setting up the access review module.\n * @param {number} toggled A number represnting the state of the review toggle.\n * @param {string} displayFormat A string representing the display format for icons.\n * @param {number} courseId The course ID.\n */\nexport const init = (toggled, displayFormat, courseId) => {\n // Settings consts.\n toggleState = toggled == 1;\n\n if (toggleState) {\n showAccessMap(courseId, displayFormat);\n }\n\n registerEventListeners(courseId, displayFormat);\n};\n"],"names":["toggleState","renderTemplate","element","errorCount","checkCount","displayFormat","minViews","viewDelta","weight","parseInt","context","resultPassed","classList","passRate","failureRate","Math","round","Promise","resolve","elementClassList","push","showIcons","showBackground","add","join","Templates","renderForPromise","then","html","js","appendNodeContents","catch","showAccessMap","courseId","updatePreference","all","fetchReviewData","sectionData","moduleData","getErrorTotals","forEach","section","document","querySelector","numerrors","numchecks","module","getElementById","cmid","remove","displayError","toggleAccessMap","querySelectorAll","node","setToggleStatePreference","hideAccessMap","totals","totalErrors","totalUsers","maxViews","concat","item","getTogglePreferenceParams","methodname","args","preferences","type","value","courseid","calls","toggled","addEventListener","e","target","closest","preventDefault","registerEventListeners"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"module.min.js","sources":["../src/module.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 * Manager for the accessreview block.\n *\n * @module block_accessreview/module\n * @author Max Larkin \n * @copyright 2020 Brickfield Education Labs \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {call as fetchMany} from 'core/ajax';\nimport * as Templates from 'core/templates';\nimport {exception as displayError} from 'core/notification';\n\n/**\n * The number of colours used to represent the heatmap. (Indexed on 0.)\n * @type {number}\n */\nconst numColours = 2;\n\n/**\n * The toggle state of the heatmap.\n * @type {boolean}\n */\nlet toggleState = true;\n\n/**\n * Renders the HTML template onto a particular HTML element.\n * @param {HTMLElement} element The element to attach the HTML to.\n * @param {number} errorCount The number of errors on this module/section.\n * @param {number} checkCount The number of checks triggered on this module/section.\n * @param {String} displayFormat\n * @param {Number} minViews\n * @param {Number} viewDelta\n * @returns {Promise}\n */\nconst renderTemplate = (element, errorCount, checkCount, displayFormat, minViews, viewDelta) => {\n // Calculate a weight?\n const weight = parseInt((errorCount - minViews) / viewDelta * numColours);\n\n const context = {\n resultPassed: !errorCount,\n classList: '',\n passRate: {\n errorCount,\n checkCount,\n failureRate: Math.round(errorCount / checkCount * 100),\n },\n };\n\n if (!element) {\n return Promise.resolve();\n }\n\n const elementClassList = ['block_accessreview'];\n if (context.resultPassed) {\n elementClassList.push('block_accessreview_success');\n } else if (weight) {\n elementClassList.push('block_accessreview_danger');\n } else {\n elementClassList.push('block_accessreview_warning');\n }\n\n const showIcons = (displayFormat == 'showicons') || (displayFormat == 'showboth');\n const showBackground = (displayFormat == 'showbackground') || (displayFormat == 'showboth');\n\n if (showBackground && !showIcons) {\n // Only the background is displayed.\n // No need to display the template.\n // Note: The case where both the background and icons are shown is handled later to avoid jankiness.\n element.classList.add(...elementClassList, 'alert');\n\n return Promise.resolve();\n }\n\n if (showIcons && !showBackground) {\n context.classList = elementClassList.join(' ');\n }\n\n // The icons are displayed either with, or without, the background.\n return Templates.renderForPromise('block_accessreview/status', context)\n .then(({html, js}) => {\n Templates.appendNodeContents(element, html, js);\n\n if (showBackground) {\n element.classList.add(...elementClassList, 'alert');\n }\n\n return;\n })\n .catch();\n};\n\n/**\n * Applies the template to all sections and modules on the course page.\n *\n * @param {Number} courseId\n * @param {String} displayFormat\n * @param {Boolean} updatePreference\n * @returns {Promise}\n */\nconst showAccessMap = (courseId, displayFormat, updatePreference = false) => {\n // Get error data.\n return Promise.all(fetchReviewData(courseId, updatePreference))\n .then(([sectionData, moduleData]) => {\n // Get total data.\n const {minViews, viewDelta} = getErrorTotals(sectionData, moduleData);\n\n sectionData.forEach(section => {\n const element = document.querySelector(`#section-${section.section} .summary`);\n if (!element) {\n return;\n }\n\n renderTemplate(element, section.numerrors, section.numchecks, displayFormat, minViews, viewDelta);\n });\n\n moduleData.forEach(module => {\n const element = document.getElementById(`module-${module.cmid}`);\n if (!element) {\n return;\n }\n\n renderTemplate(element, module.numerrors, module.numchecks, displayFormat, minViews, viewDelta);\n });\n\n // Change the icon display.\n document.querySelector('.icon-accessmap').classList.remove(...['fa-eye-slash']);\n document.querySelector('.icon-accessmap').classList.add(...['fa-eye']);\n\n return {\n sectionData,\n moduleData,\n };\n })\n .catch(displayError);\n};\n\n\n/**\n * Hides or removes the templates from the HTML of the current page.\n *\n * @param {Boolean} updatePreference\n */\nconst hideAccessMap = (updatePreference = false) => {\n // Removes the added elements.\n document.querySelectorAll('.block_accessreview_view').forEach(node => node.remove());\n\n const classList = [\n 'block_accessreview',\n 'block_accessreview_success',\n 'block_accessreview_warning',\n 'block_accessreview_danger',\n 'block_accessreview_view',\n 'alert',\n ];\n\n // Removes the added classes.\n document.querySelectorAll('.block_accessreview').forEach(node => node.classList.remove(...classList));\n\n if (updatePreference) {\n setToggleStatePreference(false);\n }\n\n // Change the icon display.\n document.querySelector('.icon-accessmap').classList.remove(...['fa-eye']);\n document.querySelector('.icon-accessmap').classList.add(...['fa-eye-slash']);\n};\n\n\n/**\n * Toggles the heatmap on/off.\n *\n * @param {Number} courseId\n * @param {String} displayFormat\n */\nconst toggleAccessMap = (courseId, displayFormat) => {\n toggleState = !toggleState;\n if (!toggleState) {\n hideAccessMap(true);\n } else {\n showAccessMap(courseId, displayFormat, true);\n }\n};\n\n/**\n * Parses information on the errors, generating the min, max and totals.\n *\n * @param {Object[]} sectionData The error data for course sections.\n * @param {Object[]} moduleData The error data for course modules.\n * @returns {Object} An object representing the extra error information.\n */\nconst getErrorTotals = (sectionData, moduleData) => {\n const totals = {\n totalErrors: 0,\n totalUsers: 0,\n minViews: 0,\n maxViews: 0,\n viewDelta: 0,\n };\n\n [].concat(sectionData, moduleData).forEach(item => {\n totals.totalErrors += item.numerrors;\n if (item.numerrors < totals.minViews) {\n totals.minViews = item.numerrors;\n }\n\n if (item.numerrors > totals.maxViews) {\n totals.maxViews = item.numerrors;\n }\n totals.totalUsers += item.numchecks;\n });\n\n totals.viewDelta = totals.maxViews - totals.minViews + 1;\n\n return totals;\n};\n\nconst registerEventListeners = (courseId, displayFormat) => {\n document.addEventListener('click', e => {\n if (e.target.closest('#toggle-accessmap')) {\n e.preventDefault();\n toggleAccessMap(courseId, displayFormat);\n }\n });\n};\n\n/**\n * Set the user preference for the toggle value.\n *\n * @param {Boolean} toggleState\n * @returns {Promise}\n */\nconst getTogglePreferenceParams = toggleState => {\n return {\n methodname: 'core_user_update_user_preferences',\n args: {\n preferences: [{\n type: 'block_accessreviewtogglestate',\n value: toggleState,\n }],\n }\n };\n};\n\nconst setToggleStatePreference = toggleState => fetchMany([getTogglePreferenceParams(toggleState)]);\n\n/**\n * Fetch the review data.\n *\n * @param {Number} courseid\n * @param {Boolean} updatePreference\n * @returns {Promise[]}\n */\nconst fetchReviewData = (courseid, updatePreference = false) => {\n const calls = [\n {\n methodname: 'block_accessreview_get_section_data',\n args: {courseid}\n },\n {\n methodname: 'block_accessreview_get_module_data',\n args: {courseid}\n },\n ];\n\n if (updatePreference) {\n calls.push(getTogglePreferenceParams(true));\n }\n\n return fetchMany(calls);\n};\n\n/**\n * Setting up the access review module.\n * @param {number} toggled A number represnting the state of the review toggle.\n * @param {string} displayFormat A string representing the display format for icons.\n * @param {number} courseId The course ID.\n */\nexport const init = (toggled, displayFormat, courseId) => {\n // Settings consts.\n toggleState = toggled == 1;\n\n if (toggleState) {\n showAccessMap(courseId, displayFormat);\n }\n\n registerEventListeners(courseId, displayFormat);\n};\n"],"names":["Templates","_interopRequireWildcard","numColours","toggleState","renderTemplate","element","errorCount","checkCount","displayFormat","minViews","viewDelta","weight","parseInt","context","resultPassed","classList","passRate","failureRate","Math","round","Promise","resolve","elementClassList","push","showIcons","_element$classList","showBackground","add","join","renderForPromise","then","_ref","html","_element$classList2","js","appendNodeContents","catch","showAccessMap","courseId","updatePreference","all","fetchReviewData","_ref2","_document$querySelect","_document$querySelect2","_ref3","_slicedToArray","sectionData","moduleData","_getErrorTotals","getErrorTotals","forEach","section","document","querySelector","numerrors","numchecks","module","getElementById","cmid","remove","apply","displayError","toggleAccessMap","_document$querySelect3","_document$querySelect4","querySelectorAll","node","_node$classList","setToggleStatePreference","hideAccessMap","totals","totalErrors","totalUsers","maxViews","concat","item","getTogglePreferenceParams","methodname","args","preferences","type","value","courseid","calls","_ajax","call","toggled","addEventListener","e","target","closest","preventDefault","registerEventListeners"],"mappings":"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"} \ No newline at end of file diff --git a/blocks/myoverview/amd/build/main.min.js.map b/blocks/myoverview/amd/build/main.min.js.map index d3ee96a314c..ce8748aef8b 100644 --- a/blocks/myoverview/amd/build/main.min.js.map +++ b/blocks/myoverview/amd/build/main.min.js.map @@ -1 +1 @@ -{"version":3,"file":"main.min.js","sources":["../src/main.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 * Javascript to initialise the myoverview block.\n *\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_myoverview/view',\n 'block_myoverview/view_nav'\n],\nfunction(\n $,\n View,\n ViewNav\n) {\n /**\n * Initialise all of the modules for the overview block.\n *\n * @param {object} root The root element for the overview block.\n */\n var init = function(root) {\n root = $(root);\n // Initialise the course navigation elements.\n ViewNav.init(root);\n // Initialise the courses view modules.\n View.init(root);\n };\n\n return {\n init: init\n };\n});\n"],"names":["define","$","View","ViewNav","init","root"],"mappings":";;;;;;AAsBAA,+BACA,CACI,SACA,wBACA,8BAEJ,SACIC,EACAC,KACAC,eAeO,CACHC,KATO,SAASC,MAChBA,KAAOJ,EAAEI,MAETF,QAAQC,KAAKC,MAEbH,KAAKE,KAAKC"} \ No newline at end of file +{"version":3,"file":"main.min.js","sources":["../src/main.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 * Javascript to initialise the myoverview block.\n *\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_myoverview/view',\n 'block_myoverview/view_nav'\n],\nfunction(\n $,\n View,\n ViewNav\n) {\n /**\n * Initialise all of the modules for the overview block.\n *\n * @param {object} root The root element for the overview block.\n */\n var init = function(root) {\n root = $(root);\n // Initialise the course navigation elements.\n ViewNav.init(root);\n // Initialise the courses view modules.\n View.init(root);\n };\n\n return {\n init: init\n };\n});\n"],"names":["define","$","View","ViewNav","init","root"],"mappings":";;;;;;AAsBAA,OACA,wBAAA,CACI,SACA,wBACA,8BAEJ,SACIC,EACAC,KACAC,SAeO,MAAA,CACHC,KATO,SAASC,MAChBA,KAAOJ,EAAEI,MAETF,QAAQC,KAAKC,MAEbH,KAAKE,KAAKC,KACb,EAKJ"} \ No newline at end of file diff --git a/blocks/myoverview/amd/build/repository.min.js.map b/blocks/myoverview/amd/build/repository.min.js.map index 9482e6007cd..6b3f6ba0999 100644 --- a/blocks/myoverview/amd/build/repository.min.js.map +++ b/blocks/myoverview/amd/build/repository.min.js.map @@ -1 +1 @@ -{"version":3,"file":"repository.min.js","sources":["../src/repository.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 javascript module to retrieve enrolled coruses from the server.\n *\n * @module block_myoverview/repository\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/ajax', 'core/notification'], function(Ajax, Notification) {\n\n /**\n * Retrieve a list of enrolled courses.\n *\n * Valid args are:\n * string classification future, inprogress, past\n * int limit number of records to retreive\n * int Offset offset for pagination\n * int sort sort by lastaccess or name\n *\n * @method getEnrolledCoursesByTimeline\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of courses\n */\n var getEnrolledCoursesByTimeline = function(args) {\n\n var request = {\n methodname: 'core_course_get_enrolled_courses_by_timeline_classification',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n return promise;\n };\n\n /**\n * Set the favourite state on a list of courses.\n *\n * Valid args are:\n * Array courses list of course id numbers.\n *\n * @param {Object} args Arguments send to the webservice.\n * @return {Promise} Resolve with warnings.\n */\n var setFavouriteCourses = function(args) {\n\n var request = {\n methodname: 'core_course_set_favourite_courses',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n return promise;\n };\n\n /**\n * Update the user preferences.\n *\n * @param {Object} args Arguments send to the webservice.\n *\n * Sample args:\n * {\n * preferences: [\n * {\n * type: 'block_example_user_sort_preference'\n * value: 'title'\n * }\n * ]\n * }\n */\n var updateUserPreferences = function(args) {\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: args\n };\n\n Ajax.call([request])[0]\n .fail(Notification.exception);\n };\n\n return {\n getEnrolledCoursesByTimeline: getEnrolledCoursesByTimeline,\n setFavouriteCourses: setFavouriteCourses,\n updateUserPreferences: updateUserPreferences\n };\n});\n"],"names":["define","Ajax","Notification","getEnrolledCoursesByTimeline","args","request","methodname","call","setFavouriteCourses","updateUserPreferences","fail","exception"],"mappings":";;;;;;;AAsBAA,qCAAO,CAAC,YAAa,sBAAsB,SAASC,KAAMC,oBAyE/C,CACHC,6BA3D+B,SAASC,UAEpCC,QAAU,CACVC,WAAY,8DACZF,KAAMA,aAGIH,KAAKM,KAAK,CAACF,UAAU,IAqDnCG,oBAvCsB,SAASJ,UAE3BC,QAAU,CACVC,WAAY,oCACZF,KAAMA,aAGIH,KAAKM,KAAK,CAACF,UAAU,IAiCnCI,sBAbwB,SAASL,UAC7BC,QAAU,CACVC,WAAY,oCACZF,KAAMA,MAGVH,KAAKM,KAAK,CAACF,UAAU,GAChBK,KAAKR,aAAaS"} \ No newline at end of file +{"version":3,"file":"repository.min.js","sources":["../src/repository.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 javascript module to retrieve enrolled coruses from the server.\n *\n * @module block_myoverview/repository\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/ajax', 'core/notification'], function(Ajax, Notification) {\n\n /**\n * Retrieve a list of enrolled courses.\n *\n * Valid args are:\n * string classification future, inprogress, past\n * int limit number of records to retreive\n * int Offset offset for pagination\n * int sort sort by lastaccess or name\n *\n * @method getEnrolledCoursesByTimeline\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of courses\n */\n var getEnrolledCoursesByTimeline = function(args) {\n\n var request = {\n methodname: 'core_course_get_enrolled_courses_by_timeline_classification',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n return promise;\n };\n\n /**\n * Set the favourite state on a list of courses.\n *\n * Valid args are:\n * Array courses list of course id numbers.\n *\n * @param {Object} args Arguments send to the webservice.\n * @return {Promise} Resolve with warnings.\n */\n var setFavouriteCourses = function(args) {\n\n var request = {\n methodname: 'core_course_set_favourite_courses',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n return promise;\n };\n\n /**\n * Update the user preferences.\n *\n * @param {Object} args Arguments send to the webservice.\n *\n * Sample args:\n * {\n * preferences: [\n * {\n * type: 'block_example_user_sort_preference'\n * value: 'title'\n * }\n * ]\n * }\n */\n var updateUserPreferences = function(args) {\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: args\n };\n\n Ajax.call([request])[0]\n .fail(Notification.exception);\n };\n\n return {\n getEnrolledCoursesByTimeline: getEnrolledCoursesByTimeline,\n setFavouriteCourses: setFavouriteCourses,\n updateUserPreferences: updateUserPreferences\n };\n});\n"],"names":["define","Ajax","Notification","getEnrolledCoursesByTimeline","args","request","methodname","call","setFavouriteCourses","updateUserPreferences","fail","exception"],"mappings":";;;;;;;AAsBAA,OAAM,8BAAC,CAAC,YAAa,sBAAsB,SAASC,KAAMC,cAyE/C,MAAA,CACHC,6BA3D+B,SAASC,MAExC,IAAIC,QAAU,CACVC,WAAY,8DACZF,KAAMA,MAKV,OAFcH,KAAKM,KAAK,CAACF,UAAU,EAGtC,EAkDGG,oBAvCsB,SAASJ,MAE/B,IAAIC,QAAU,CACVC,WAAY,oCACZF,KAAMA,MAKV,OAFcH,KAAKM,KAAK,CAACF,UAAU,EAGtC,EA8BGI,sBAbwB,SAASL,MACjC,IAAIC,QAAU,CACVC,WAAY,oCACZF,KAAMA,MAGVH,KAAKM,KAAK,CAACF,UAAU,GAChBK,KAAKR,aAAaS,UAC1B,EAOJ"} \ No newline at end of file diff --git a/blocks/myoverview/amd/build/selectors.min.js.map b/blocks/myoverview/amd/build/selectors.min.js.map index a3a28c5e344..8b672e12ab1 100644 --- a/blocks/myoverview/amd/build/selectors.min.js.map +++ b/blocks/myoverview/amd/build/selectors.min.js.map @@ -1 +1 @@ -{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 * Javascript to initialise the selectors for the myoverview block.\n *\n * @copyright 2018 Peter Dias \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine([], function() {\n return {\n courseView: {\n region: '[data-region=\"courses-view\"]',\n regionContent: '[data-region=\"course-view-content\"]'\n }\n };\n});\n"],"names":["define","courseView","region","regionContent"],"mappings":";;;;;;AAsBAA,oCAAO,IAAI,iBACA,CACHC,WAAY,CACRC,OAAQ,+BACRC,cAAe"} \ No newline at end of file +{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 * Javascript to initialise the selectors for the myoverview block.\n *\n * @copyright 2018 Peter Dias \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine([], function() {\n return {\n courseView: {\n region: '[data-region=\"courses-view\"]',\n regionContent: '[data-region=\"course-view-content\"]'\n }\n };\n});\n"],"names":["define","courseView","region","regionContent"],"mappings":";;;;;;AAsBAA,OAAM,6BAAC,IAAI,WACA,MAAA,CACHC,WAAY,CACRC,OAAQ,+BACRC,cAAe,uCAG1B"} \ No newline at end of file diff --git a/blocks/myoverview/amd/build/view.min.js.map b/blocks/myoverview/amd/build/view.min.js.map index aee6f3eac9e..b770cebb396 100644 --- a/blocks/myoverview/amd/build/view.min.js.map +++ b/blocks/myoverview/amd/build/view.min.js.map @@ -1 +1 @@ -{"version":3,"file":"view.min.js","sources":["../src/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 * Manage the courses view for the overview block.\n *\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_myoverview/repository',\n 'core/paged_content_factory',\n 'core/pubsub',\n 'core/custom_interaction_events',\n 'core/notification',\n 'core/templates',\n 'core_course/events',\n 'block_myoverview/selectors',\n 'core/paged_content_events',\n 'core/aria',\n],\nfunction(\n $,\n Repository,\n PagedContentFactory,\n PubSub,\n CustomEvents,\n Notification,\n Templates,\n CourseEvents,\n Selectors,\n PagedContentEvents,\n Aria\n) {\n\n var SELECTORS = {\n COURSE_REGION: '[data-region=\"course-view-content\"]',\n ACTION_HIDE_COURSE: '[data-action=\"hide-course\"]',\n ACTION_SHOW_COURSE: '[data-action=\"show-course\"]',\n ACTION_ADD_FAVOURITE: '[data-action=\"add-favourite\"]',\n ACTION_REMOVE_FAVOURITE: '[data-action=\"remove-favourite\"]',\n FAVOURITE_ICON: '[data-region=\"favourite-icon\"]',\n ICON_IS_FAVOURITE: '[data-region=\"is-favourite\"]',\n ICON_NOT_FAVOURITE: '[data-region=\"not-favourite\"]',\n PAGED_CONTENT_CONTAINER: '[data-region=\"page-container\"]'\n\n };\n\n var TEMPLATES = {\n COURSES_CARDS: 'block_myoverview/view-cards',\n COURSES_LIST: 'block_myoverview/view-list',\n COURSES_SUMMARY: 'block_myoverview/view-summary',\n NOCOURSES: 'core_course/no-courses'\n };\n\n var GROUPINGS = {\n GROUPING_ALLINCLUDINGHIDDEN: 'allincludinghidden',\n GROUPING_ALL: 'all',\n GROUPING_INPROGRESS: 'inprogress',\n GROUPING_FUTURE: 'future',\n GROUPING_PAST: 'past',\n GROUPING_FAVOURITES: 'favourites',\n GROUPING_HIDDEN: 'hidden'\n };\n\n var NUMCOURSES_PERPAGE = [12, 24, 48, 96, 0];\n\n var loadedPages = [];\n\n var courseOffset = 0;\n\n var lastPage = 0;\n\n var lastLimit = 0;\n\n var namespace = null;\n\n /**\n * Get filter values from DOM.\n *\n * @param {object} root The root element for the courses view.\n * @return {filters} Set filters.\n */\n var getFilterValues = function(root) {\n var courseRegion = root.find(Selectors.courseView.region);\n return {\n display: courseRegion.attr('data-display'),\n grouping: courseRegion.attr('data-grouping'),\n sort: courseRegion.attr('data-sort'),\n displaycategories: courseRegion.attr('data-displaycategories'),\n customfieldname: courseRegion.attr('data-customfieldname'),\n customfieldvalue: courseRegion.attr('data-customfieldvalue'),\n };\n };\n\n // We want the paged content controls below the paged content area.\n // and the controls should be ignored while data is loading.\n var DEFAULT_PAGED_CONTENT_CONFIG = {\n ignoreControlWhileLoading: true,\n controlPlacementBottom: true,\n persistentLimitKey: 'block_myoverview_user_paging_preference'\n };\n\n /**\n * Get enrolled courses from backend.\n *\n * @param {object} filters The filters for this view.\n * @param {int} limit The number of courses to show.\n * @return {promise} Resolved with an array of courses.\n */\n var getMyCourses = function(filters, limit) {\n\n return Repository.getEnrolledCoursesByTimeline({\n offset: courseOffset,\n limit: limit,\n classification: filters.grouping,\n sort: filters.sort,\n customfieldname: filters.customfieldname,\n customfieldvalue: filters.customfieldvalue\n });\n };\n\n /**\n * Get the container element for the favourite icon.\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n * @return {Object} The favourite icon container\n */\n var getFavouriteIconContainer = function(root, courseId) {\n return root.find(SELECTORS.FAVOURITE_ICON + '[data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Get the paged content container element.\n *\n * @param {Object} root The course overview container\n * @param {Number} index Rendered page index.\n * @return {Object} The rendered paged container.\n */\n var getPagedContentContainer = function(root, index) {\n return root.find('[data-region=\"paged-content-page\"][data-page=\"' + index + '\"]');\n };\n\n /**\n * Get the course id from a favourite element.\n *\n * @param {Object} root The favourite icon container element.\n * @return {Number} Course id.\n */\n var getCourseId = function(root) {\n return root.attr('data-course-id');\n };\n\n /**\n * Hide the favourite icon.\n *\n * @param {Object} root The favourite icon container element.\n * @param {Number} courseId Course id number.\n */\n var hideFavouriteIcon = function(root, courseId) {\n var iconContainer = getFavouriteIconContainer(root, courseId);\n\n var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);\n isFavouriteIcon.addClass('hidden');\n Aria.hide(isFavouriteIcon);\n\n var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);\n notFavourteIcon.removeClass('hidden');\n Aria.unhide(notFavourteIcon);\n };\n\n /**\n * Show the favourite icon.\n *\n * @param {Object} root The course overview container.\n * @param {Number} courseId Course id number.\n */\n var showFavouriteIcon = function(root, courseId) {\n var iconContainer = getFavouriteIconContainer(root, courseId);\n\n var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);\n isFavouriteIcon.removeClass('hidden');\n Aria.unhide(isFavouriteIcon);\n\n var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);\n notFavourteIcon.addClass('hidden');\n Aria.hide(notFavourteIcon);\n };\n\n /**\n * Get the action menu item\n *\n * @param {Object} root root The course overview container\n * @param {Number} courseId Course id.\n * @return {Object} The add to favourite menu item.\n */\n var getAddFavouriteMenuItem = function(root, courseId) {\n return root.find('[data-action=\"add-favourite\"][data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Get the action menu item\n *\n * @param {Object} root root The course overview container\n * @param {Number} courseId Course id.\n * @return {Object} The remove from favourites menu item.\n */\n var getRemoveFavouriteMenuItem = function(root, courseId) {\n return root.find('[data-action=\"remove-favourite\"][data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Add course to favourites\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n */\n var addToFavourites = function(root, courseId) {\n var removeAction = getRemoveFavouriteMenuItem(root, courseId);\n var addAction = getAddFavouriteMenuItem(root, courseId);\n\n setCourseFavouriteState(courseId, true).then(function(success) {\n if (success) {\n PubSub.publish(CourseEvents.favourited, courseId);\n removeAction.removeClass('hidden');\n addAction.addClass('hidden');\n showFavouriteIcon(root, courseId);\n } else {\n Notification.alert('Starring course failed', 'Could not change favourite state');\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Remove course from favourites\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n */\n var removeFromFavourites = function(root, courseId) {\n var removeAction = getRemoveFavouriteMenuItem(root, courseId);\n var addAction = getAddFavouriteMenuItem(root, courseId);\n\n setCourseFavouriteState(courseId, false).then(function(success) {\n if (success) {\n PubSub.publish(CourseEvents.unfavorited, courseId);\n removeAction.addClass('hidden');\n addAction.removeClass('hidden');\n hideFavouriteIcon(root, courseId);\n } else {\n Notification.alert('Starring course failed', 'Could not change favourite state');\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Get the action menu item\n *\n * @param {Object} root root The course overview container\n * @param {Number} courseId Course id.\n * @return {Object} The hide course menu item.\n */\n var getHideCourseMenuItem = function(root, courseId) {\n return root.find('[data-action=\"hide-course\"][data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Get the action menu item\n *\n * @param {Object} root root The course overview container\n * @param {Number} courseId Course id.\n * @return {Object} The show course menu item.\n */\n var getShowCourseMenuItem = function(root, courseId) {\n return root.find('[data-action=\"show-course\"][data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Hide course\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n */\n var hideCourse = function(root, courseId) {\n var hideAction = getHideCourseMenuItem(root, courseId);\n var showAction = getShowCourseMenuItem(root, courseId);\n var filters = getFilterValues(root);\n\n setCourseHiddenState(courseId, true);\n\n // Remove the course from this view as it is now hidden and thus not covered by this view anymore.\n // Do only if we are not in \"All\" view mode where really all courses are shown.\n if (filters.grouping != GROUPINGS.GROUPING_ALLINCLUDINGHIDDEN) {\n hideElement(root, courseId);\n }\n\n hideAction.addClass('hidden');\n showAction.removeClass('hidden');\n };\n\n /**\n * Show course\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n */\n var showCourse = function(root, courseId) {\n var hideAction = getHideCourseMenuItem(root, courseId);\n var showAction = getShowCourseMenuItem(root, courseId);\n var filters = getFilterValues(root);\n\n setCourseHiddenState(courseId, null);\n\n // Remove the course from this view as it is now shown again and thus not covered by this view anymore.\n // Do only if we are not in \"All\" view mode where really all courses are shown.\n if (filters.grouping != GROUPINGS.GROUPING_ALLINCLUDINGHIDDEN) {\n hideElement(root, courseId);\n }\n\n hideAction.removeClass('hidden');\n showAction.addClass('hidden');\n };\n\n /**\n * Set the courses hidden status and push to repository\n *\n * @param {Number} courseId Course id to favourite.\n * @param {Bool} status new hidden status.\n * @return {Promise} Repository promise.\n */\n var setCourseHiddenState = function(courseId, status) {\n\n // If the given status is not hidden, the preference has to be deleted with a null value.\n if (status === false) {\n status = null;\n }\n return Repository.updateUserPreferences({\n preferences: [\n {\n type: 'block_myoverview_hidden_course_' + courseId,\n value: status\n }\n ]\n });\n };\n\n /**\n * Reset the loadedPages dataset to take into account the hidden element\n *\n * @param {Object} root The course overview container\n * @param {Number} id The course id number\n */\n var hideElement = function(root, id) {\n var pagingBar = root.find('[data-region=\"paging-bar\"]');\n var jumpto = parseInt(pagingBar.attr('data-active-page-number'));\n\n // Get a reduced dataset for the current page.\n var courseList = loadedPages[jumpto];\n var reducedCourse = courseList.courses.reduce(function(accumulator, current) {\n if (id != current.id) {\n accumulator.push(current);\n }\n return accumulator;\n }, []);\n\n // Get the next page's data if loaded and pop the first element from it\n if (loadedPages[jumpto + 1] != undefined) {\n var newElement = loadedPages[jumpto + 1].courses.slice(0, 1);\n\n // Adjust the dataset for the reset of the pages that are loaded\n loadedPages.forEach(function(courseList, index) {\n if (index > jumpto) {\n var popElement = [];\n if (loadedPages[index + 1] != undefined) {\n popElement = loadedPages[index + 1].courses.slice(0, 1);\n }\n\n loadedPages[index].courses = $.merge(loadedPages[index].courses.slice(1), popElement);\n }\n });\n\n\n reducedCourse = $.merge(reducedCourse, newElement);\n }\n\n // Check if the next page is the last page and if it still has data associated to it\n if (lastPage == jumpto + 1 && loadedPages[jumpto + 1].courses.length == 0) {\n var pagedContentContainer = root.find('[data-region=\"paged-content-container\"]');\n PagedContentFactory.resetLastPageNumber($(pagedContentContainer).attr('id'), jumpto);\n }\n\n loadedPages[jumpto].courses = reducedCourse;\n\n // Reduce the course offset\n courseOffset--;\n\n // Render the paged content for the current\n var pagedContentPage = getPagedContentContainer(root, jumpto);\n renderCourses(root, loadedPages[jumpto]).then(function(html, js) {\n return Templates.replaceNodeContents(pagedContentPage, html, js);\n }).catch(Notification.exception);\n\n // Delete subsequent pages in order to trigger the callback\n loadedPages.forEach(function(courseList, index) {\n if (index > jumpto) {\n var page = getPagedContentContainer(root, index);\n page.remove();\n }\n });\n };\n\n /**\n * Set the courses favourite status and push to repository\n *\n * @param {Number} courseId Course id to favourite.\n * @param {Bool} status new favourite status.\n * @return {Promise} Repository promise.\n */\n var setCourseFavouriteState = function(courseId, status) {\n\n return Repository.setFavouriteCourses({\n courses: [\n {\n 'id': courseId,\n 'favourite': status\n }\n ]\n }).then(function(result) {\n if (result.warnings.length == 0) {\n loadedPages.forEach(function(courseList) {\n courseList.courses.forEach(function(course, index) {\n if (course.id == courseId) {\n courseList.courses[index].isfavourite = status;\n }\n });\n });\n return true;\n } else {\n return false;\n }\n }).catch(Notification.exception);\n };\n\n /**\n * Render the dashboard courses.\n *\n * @param {object} root The root element for the courses view.\n * @param {array} coursesData containing array of returned courses.\n * @return {promise} jQuery promise resolved after rendering is complete.\n */\n var renderCourses = function(root, coursesData) {\n\n var filters = getFilterValues(root);\n\n var currentTemplate = '';\n if (filters.display == 'card') {\n currentTemplate = TEMPLATES.COURSES_CARDS;\n } else if (filters.display == 'list') {\n currentTemplate = TEMPLATES.COURSES_LIST;\n } else {\n currentTemplate = TEMPLATES.COURSES_SUMMARY;\n }\n\n // Whether the course category should be displayed in the course item.\n coursesData.courses = coursesData.courses.map(function(course) {\n course.showcoursecategory = filters.displaycategories == 'on' ? true : false;\n return course;\n });\n\n if (coursesData.courses.length) {\n return Templates.render(currentTemplate, {\n courses: coursesData.courses,\n });\n } else {\n var nocoursesimg = root.find(Selectors.courseView.region).attr('data-nocoursesimg');\n return Templates.render(TEMPLATES.NOCOURSES, {\n nocoursesimg: nocoursesimg\n });\n }\n };\n\n /**\n * Return the callback to be passed to the subscribe event\n *\n * @param {Number} limit The paged limit that is passed through the event\n */\n var setLimit = function(limit) {\n this.find(Selectors.courseView.region).attr('data-paging', limit);\n };\n\n /**\n * Intialise the paged list and cards views on page load.\n * Returns an array of paged contents that we would like to handle here\n *\n * @param {object} root The root element for the courses view\n * @param {string} namespace The namespace for all the events attached\n */\n var registerPagedEventHandlers = function(root, namespace) {\n var event = namespace + PagedContentEvents.SET_ITEMS_PER_PAGE_LIMIT;\n PubSub.subscribe(event, setLimit.bind(root));\n };\n\n /**\n * Intialise the courses list and cards views on page load.\n *\n * @param {object} root The root element for the courses view.\n */\n var initializePagedContent = function(root) {\n namespace = \"block_myoverview_\" + root.attr('id') + \"_\" + Math.random();\n\n var pagingLimit = parseInt(root.find(Selectors.courseView.region).attr('data-paging'), 10);\n var itemsPerPage = NUMCOURSES_PERPAGE.map(function(value) {\n var active = false;\n if (value == pagingLimit) {\n active = true;\n }\n\n return {\n value: value,\n active: active\n };\n });\n\n // Filter out all pagination options which are too large for the amount of courses user is enrolled in.\n var totalCourseCount = parseInt(root.find(Selectors.courseView.region).attr('data-totalcoursecount'), 10);\n itemsPerPage = itemsPerPage.filter(function(pagingOption) {\n return pagingOption.value < totalCourseCount || pagingOption.value === 0;\n });\n\n var filters = getFilterValues(root);\n var config = $.extend({}, DEFAULT_PAGED_CONTENT_CONFIG);\n config.eventNamespace = namespace;\n\n var pagedContentPromise = PagedContentFactory.createWithLimit(\n itemsPerPage,\n function(pagesData, actions) {\n var promises = [];\n\n pagesData.forEach(function(pageData) {\n var currentPage = pageData.pageNumber;\n var limit = (pageData.limit > 0) ? pageData.limit : 0;\n\n // Reset local variables if limits have changed\n if (lastLimit != limit) {\n loadedPages = [];\n courseOffset = 0;\n lastPage = 0;\n }\n\n if (lastPage == currentPage) {\n // If we are on the last page and have it's data then load it from cache\n actions.allItemsLoaded(lastPage);\n promises.push(renderCourses(root, loadedPages[currentPage]));\n return;\n }\n\n lastLimit = limit;\n\n // Get 2 pages worth of data as we will need it for the hidden functionality.\n if (loadedPages[currentPage + 1] == undefined) {\n if (loadedPages[currentPage] == undefined) {\n limit *= 2;\n }\n }\n\n var pagePromise = getMyCourses(\n filters,\n limit\n ).then(function(coursesData) {\n var courses = coursesData.courses;\n var nextPageStart = 0;\n var pageCourses = [];\n\n // If current page's data is loaded make sure we max it to page limit\n if (loadedPages[currentPage] != undefined) {\n pageCourses = loadedPages[currentPage].courses;\n var currentPageLength = pageCourses.length;\n if (currentPageLength < pageData.limit) {\n nextPageStart = pageData.limit - currentPageLength;\n pageCourses = $.merge(loadedPages[currentPage].courses, courses.slice(0, nextPageStart));\n }\n } else {\n // When the page limit is zero, there is only one page of courses, no start for next page.\n nextPageStart = pageData.limit || false;\n pageCourses = (pageData.limit > 0) ? courses.slice(0, pageData.limit) : courses;\n }\n\n // Finished setting up the current page\n loadedPages[currentPage] = {\n courses: pageCourses\n };\n\n // Set up the next page (if there is more than one page).\n var remainingCourses = nextPageStart !== false ? courses.slice(nextPageStart, courses.length) : [];\n if (remainingCourses.length) {\n loadedPages[currentPage + 1] = {\n courses: remainingCourses\n };\n }\n\n // Set the last page to either the current or next page\n if (loadedPages[currentPage].courses.length < pageData.limit || !remainingCourses.length) {\n lastPage = currentPage;\n actions.allItemsLoaded(currentPage);\n } else if (loadedPages[currentPage + 1] != undefined\n && loadedPages[currentPage + 1].courses.length < pageData.limit) {\n lastPage = currentPage + 1;\n }\n\n courseOffset = coursesData.nextoffset;\n return renderCourses(root, loadedPages[currentPage]);\n })\n .catch(Notification.exception);\n\n promises.push(pagePromise);\n });\n\n return promises;\n },\n config\n );\n\n pagedContentPromise.then(function(html, js) {\n registerPagedEventHandlers(root, namespace);\n return Templates.replaceNodeContents(root.find(Selectors.courseView.region), html, js);\n }).catch(Notification.exception);\n };\n\n /**\n * Listen to, and handle events for the myoverview block.\n *\n * @param {Object} root The myoverview block container element.\n */\n var registerEventListeners = function(root) {\n CustomEvents.define(root, [\n CustomEvents.events.activate\n ]);\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_ADD_FAVOURITE, function(e, data) {\n var favourite = $(e.target).closest(SELECTORS.ACTION_ADD_FAVOURITE);\n var courseId = getCourseId(favourite);\n addToFavourites(root, courseId);\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_REMOVE_FAVOURITE, function(e, data) {\n var favourite = $(e.target).closest(SELECTORS.ACTION_REMOVE_FAVOURITE);\n var courseId = getCourseId(favourite);\n removeFromFavourites(root, courseId);\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.FAVOURITE_ICON, function(e, data) {\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_HIDE_COURSE, function(e, data) {\n var target = $(e.target).closest(SELECTORS.ACTION_HIDE_COURSE);\n var courseId = getCourseId(target);\n hideCourse(root, courseId);\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_SHOW_COURSE, function(e, data) {\n var target = $(e.target).closest(SELECTORS.ACTION_SHOW_COURSE);\n var courseId = getCourseId(target);\n showCourse(root, courseId);\n data.originalEvent.preventDefault();\n });\n };\n\n /**\n * Intialise the courses list and cards views on page load.\n *\n * @param {object} root The root element for the courses view.\n */\n var init = function(root) {\n root = $(root);\n loadedPages = [];\n lastPage = 0;\n courseOffset = 0;\n\n initializePagedContent(root);\n\n if (!root.attr('data-init')) {\n registerEventListeners(root);\n root.attr('data-init', true);\n }\n };\n\n /**\n * Reset the courses views to their original\n *\n * state on first page load.courseOffset\n *\n * This is called when configuration has changed for the event lists\n * to cause them to reload their data.\n *\n * @param {Object} root The root element for the timeline view.\n */\n var reset = function(root) {\n if (loadedPages.length > 0) {\n loadedPages.forEach(function(courseList, index) {\n var pagedContentPage = getPagedContentContainer(root, index);\n renderCourses(root, courseList).then(function(html, js) {\n return Templates.replaceNodeContents(pagedContentPage, html, js);\n }).catch(Notification.exception);\n });\n } else {\n init(root);\n }\n };\n\n return {\n init: init,\n reset: reset\n };\n});\n"],"names":["define","$","Repository","PagedContentFactory","PubSub","CustomEvents","Notification","Templates","CourseEvents","Selectors","PagedContentEvents","Aria","SELECTORS","TEMPLATES","GROUPINGS","NUMCOURSES_PERPAGE","loadedPages","courseOffset","lastPage","lastLimit","namespace","getFilterValues","root","courseRegion","find","courseView","region","display","attr","grouping","sort","displaycategories","customfieldname","customfieldvalue","DEFAULT_PAGED_CONTENT_CONFIG","ignoreControlWhileLoading","controlPlacementBottom","persistentLimitKey","getFavouriteIconContainer","courseId","getPagedContentContainer","index","getCourseId","getAddFavouriteMenuItem","getRemoveFavouriteMenuItem","addToFavourites","removeAction","addAction","setCourseFavouriteState","then","success","publish","favourited","removeClass","addClass","iconContainer","isFavouriteIcon","unhide","notFavourteIcon","hide","showFavouriteIcon","alert","catch","exception","removeFromFavourites","unfavorited","hideFavouriteIcon","getHideCourseMenuItem","getShowCourseMenuItem","setCourseHiddenState","status","updateUserPreferences","preferences","type","value","hideElement","id","pagingBar","jumpto","parseInt","reducedCourse","courses","reduce","accumulator","current","push","undefined","newElement","slice","forEach","courseList","popElement","merge","length","pagedContentContainer","resetLastPageNumber","pagedContentPage","renderCourses","html","js","replaceNodeContents","remove","setFavouriteCourses","result","warnings","course","isfavourite","coursesData","filters","currentTemplate","map","showcoursecategory","render","nocoursesimg","setLimit","limit","registerPagedEventHandlers","event","SET_ITEMS_PER_PAGE_LIMIT","subscribe","bind","initializePagedContent","Math","random","pagingLimit","itemsPerPage","active","totalCourseCount","filter","pagingOption","config","extend","eventNamespace","pagedContentPromise","createWithLimit","pagesData","actions","promises","pageData","currentPage","pageNumber","allItemsLoaded","pagePromise","getEnrolledCoursesByTimeline","offset","classification","getMyCourses","nextPageStart","pageCourses","currentPageLength","remainingCourses","nextoffset","registerEventListeners","events","activate","on","e","data","favourite","target","closest","originalEvent","preventDefault","hideAction","showAction","hideCourse","showCourse","init","reset"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"view.min.js","sources":["../src/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 * Manage the courses view for the overview block.\n *\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_myoverview/repository',\n 'core/paged_content_factory',\n 'core/pubsub',\n 'core/custom_interaction_events',\n 'core/notification',\n 'core/templates',\n 'core_course/events',\n 'block_myoverview/selectors',\n 'core/paged_content_events',\n 'core/aria',\n],\nfunction(\n $,\n Repository,\n PagedContentFactory,\n PubSub,\n CustomEvents,\n Notification,\n Templates,\n CourseEvents,\n Selectors,\n PagedContentEvents,\n Aria\n) {\n\n var SELECTORS = {\n COURSE_REGION: '[data-region=\"course-view-content\"]',\n ACTION_HIDE_COURSE: '[data-action=\"hide-course\"]',\n ACTION_SHOW_COURSE: '[data-action=\"show-course\"]',\n ACTION_ADD_FAVOURITE: '[data-action=\"add-favourite\"]',\n ACTION_REMOVE_FAVOURITE: '[data-action=\"remove-favourite\"]',\n FAVOURITE_ICON: '[data-region=\"favourite-icon\"]',\n ICON_IS_FAVOURITE: '[data-region=\"is-favourite\"]',\n ICON_NOT_FAVOURITE: '[data-region=\"not-favourite\"]',\n PAGED_CONTENT_CONTAINER: '[data-region=\"page-container\"]'\n\n };\n\n var TEMPLATES = {\n COURSES_CARDS: 'block_myoverview/view-cards',\n COURSES_LIST: 'block_myoverview/view-list',\n COURSES_SUMMARY: 'block_myoverview/view-summary',\n NOCOURSES: 'core_course/no-courses'\n };\n\n var GROUPINGS = {\n GROUPING_ALLINCLUDINGHIDDEN: 'allincludinghidden',\n GROUPING_ALL: 'all',\n GROUPING_INPROGRESS: 'inprogress',\n GROUPING_FUTURE: 'future',\n GROUPING_PAST: 'past',\n GROUPING_FAVOURITES: 'favourites',\n GROUPING_HIDDEN: 'hidden'\n };\n\n var NUMCOURSES_PERPAGE = [12, 24, 48, 96, 0];\n\n var loadedPages = [];\n\n var courseOffset = 0;\n\n var lastPage = 0;\n\n var lastLimit = 0;\n\n var namespace = null;\n\n /**\n * Get filter values from DOM.\n *\n * @param {object} root The root element for the courses view.\n * @return {filters} Set filters.\n */\n var getFilterValues = function(root) {\n var courseRegion = root.find(Selectors.courseView.region);\n return {\n display: courseRegion.attr('data-display'),\n grouping: courseRegion.attr('data-grouping'),\n sort: courseRegion.attr('data-sort'),\n displaycategories: courseRegion.attr('data-displaycategories'),\n customfieldname: courseRegion.attr('data-customfieldname'),\n customfieldvalue: courseRegion.attr('data-customfieldvalue'),\n };\n };\n\n // We want the paged content controls below the paged content area.\n // and the controls should be ignored while data is loading.\n var DEFAULT_PAGED_CONTENT_CONFIG = {\n ignoreControlWhileLoading: true,\n controlPlacementBottom: true,\n persistentLimitKey: 'block_myoverview_user_paging_preference'\n };\n\n /**\n * Get enrolled courses from backend.\n *\n * @param {object} filters The filters for this view.\n * @param {int} limit The number of courses to show.\n * @return {promise} Resolved with an array of courses.\n */\n var getMyCourses = function(filters, limit) {\n\n return Repository.getEnrolledCoursesByTimeline({\n offset: courseOffset,\n limit: limit,\n classification: filters.grouping,\n sort: filters.sort,\n customfieldname: filters.customfieldname,\n customfieldvalue: filters.customfieldvalue\n });\n };\n\n /**\n * Get the container element for the favourite icon.\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n * @return {Object} The favourite icon container\n */\n var getFavouriteIconContainer = function(root, courseId) {\n return root.find(SELECTORS.FAVOURITE_ICON + '[data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Get the paged content container element.\n *\n * @param {Object} root The course overview container\n * @param {Number} index Rendered page index.\n * @return {Object} The rendered paged container.\n */\n var getPagedContentContainer = function(root, index) {\n return root.find('[data-region=\"paged-content-page\"][data-page=\"' + index + '\"]');\n };\n\n /**\n * Get the course id from a favourite element.\n *\n * @param {Object} root The favourite icon container element.\n * @return {Number} Course id.\n */\n var getCourseId = function(root) {\n return root.attr('data-course-id');\n };\n\n /**\n * Hide the favourite icon.\n *\n * @param {Object} root The favourite icon container element.\n * @param {Number} courseId Course id number.\n */\n var hideFavouriteIcon = function(root, courseId) {\n var iconContainer = getFavouriteIconContainer(root, courseId);\n\n var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);\n isFavouriteIcon.addClass('hidden');\n Aria.hide(isFavouriteIcon);\n\n var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);\n notFavourteIcon.removeClass('hidden');\n Aria.unhide(notFavourteIcon);\n };\n\n /**\n * Show the favourite icon.\n *\n * @param {Object} root The course overview container.\n * @param {Number} courseId Course id number.\n */\n var showFavouriteIcon = function(root, courseId) {\n var iconContainer = getFavouriteIconContainer(root, courseId);\n\n var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);\n isFavouriteIcon.removeClass('hidden');\n Aria.unhide(isFavouriteIcon);\n\n var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);\n notFavourteIcon.addClass('hidden');\n Aria.hide(notFavourteIcon);\n };\n\n /**\n * Get the action menu item\n *\n * @param {Object} root root The course overview container\n * @param {Number} courseId Course id.\n * @return {Object} The add to favourite menu item.\n */\n var getAddFavouriteMenuItem = function(root, courseId) {\n return root.find('[data-action=\"add-favourite\"][data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Get the action menu item\n *\n * @param {Object} root root The course overview container\n * @param {Number} courseId Course id.\n * @return {Object} The remove from favourites menu item.\n */\n var getRemoveFavouriteMenuItem = function(root, courseId) {\n return root.find('[data-action=\"remove-favourite\"][data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Add course to favourites\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n */\n var addToFavourites = function(root, courseId) {\n var removeAction = getRemoveFavouriteMenuItem(root, courseId);\n var addAction = getAddFavouriteMenuItem(root, courseId);\n\n setCourseFavouriteState(courseId, true).then(function(success) {\n if (success) {\n PubSub.publish(CourseEvents.favourited, courseId);\n removeAction.removeClass('hidden');\n addAction.addClass('hidden');\n showFavouriteIcon(root, courseId);\n } else {\n Notification.alert('Starring course failed', 'Could not change favourite state');\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Remove course from favourites\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n */\n var removeFromFavourites = function(root, courseId) {\n var removeAction = getRemoveFavouriteMenuItem(root, courseId);\n var addAction = getAddFavouriteMenuItem(root, courseId);\n\n setCourseFavouriteState(courseId, false).then(function(success) {\n if (success) {\n PubSub.publish(CourseEvents.unfavorited, courseId);\n removeAction.addClass('hidden');\n addAction.removeClass('hidden');\n hideFavouriteIcon(root, courseId);\n } else {\n Notification.alert('Starring course failed', 'Could not change favourite state');\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Get the action menu item\n *\n * @param {Object} root root The course overview container\n * @param {Number} courseId Course id.\n * @return {Object} The hide course menu item.\n */\n var getHideCourseMenuItem = function(root, courseId) {\n return root.find('[data-action=\"hide-course\"][data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Get the action menu item\n *\n * @param {Object} root root The course overview container\n * @param {Number} courseId Course id.\n * @return {Object} The show course menu item.\n */\n var getShowCourseMenuItem = function(root, courseId) {\n return root.find('[data-action=\"show-course\"][data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Hide course\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n */\n var hideCourse = function(root, courseId) {\n var hideAction = getHideCourseMenuItem(root, courseId);\n var showAction = getShowCourseMenuItem(root, courseId);\n var filters = getFilterValues(root);\n\n setCourseHiddenState(courseId, true);\n\n // Remove the course from this view as it is now hidden and thus not covered by this view anymore.\n // Do only if we are not in \"All\" view mode where really all courses are shown.\n if (filters.grouping != GROUPINGS.GROUPING_ALLINCLUDINGHIDDEN) {\n hideElement(root, courseId);\n }\n\n hideAction.addClass('hidden');\n showAction.removeClass('hidden');\n };\n\n /**\n * Show course\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n */\n var showCourse = function(root, courseId) {\n var hideAction = getHideCourseMenuItem(root, courseId);\n var showAction = getShowCourseMenuItem(root, courseId);\n var filters = getFilterValues(root);\n\n setCourseHiddenState(courseId, null);\n\n // Remove the course from this view as it is now shown again and thus not covered by this view anymore.\n // Do only if we are not in \"All\" view mode where really all courses are shown.\n if (filters.grouping != GROUPINGS.GROUPING_ALLINCLUDINGHIDDEN) {\n hideElement(root, courseId);\n }\n\n hideAction.removeClass('hidden');\n showAction.addClass('hidden');\n };\n\n /**\n * Set the courses hidden status and push to repository\n *\n * @param {Number} courseId Course id to favourite.\n * @param {Bool} status new hidden status.\n * @return {Promise} Repository promise.\n */\n var setCourseHiddenState = function(courseId, status) {\n\n // If the given status is not hidden, the preference has to be deleted with a null value.\n if (status === false) {\n status = null;\n }\n return Repository.updateUserPreferences({\n preferences: [\n {\n type: 'block_myoverview_hidden_course_' + courseId,\n value: status\n }\n ]\n });\n };\n\n /**\n * Reset the loadedPages dataset to take into account the hidden element\n *\n * @param {Object} root The course overview container\n * @param {Number} id The course id number\n */\n var hideElement = function(root, id) {\n var pagingBar = root.find('[data-region=\"paging-bar\"]');\n var jumpto = parseInt(pagingBar.attr('data-active-page-number'));\n\n // Get a reduced dataset for the current page.\n var courseList = loadedPages[jumpto];\n var reducedCourse = courseList.courses.reduce(function(accumulator, current) {\n if (id != current.id) {\n accumulator.push(current);\n }\n return accumulator;\n }, []);\n\n // Get the next page's data if loaded and pop the first element from it\n if (loadedPages[jumpto + 1] != undefined) {\n var newElement = loadedPages[jumpto + 1].courses.slice(0, 1);\n\n // Adjust the dataset for the reset of the pages that are loaded\n loadedPages.forEach(function(courseList, index) {\n if (index > jumpto) {\n var popElement = [];\n if (loadedPages[index + 1] != undefined) {\n popElement = loadedPages[index + 1].courses.slice(0, 1);\n }\n\n loadedPages[index].courses = $.merge(loadedPages[index].courses.slice(1), popElement);\n }\n });\n\n\n reducedCourse = $.merge(reducedCourse, newElement);\n }\n\n // Check if the next page is the last page and if it still has data associated to it\n if (lastPage == jumpto + 1 && loadedPages[jumpto + 1].courses.length == 0) {\n var pagedContentContainer = root.find('[data-region=\"paged-content-container\"]');\n PagedContentFactory.resetLastPageNumber($(pagedContentContainer).attr('id'), jumpto);\n }\n\n loadedPages[jumpto].courses = reducedCourse;\n\n // Reduce the course offset\n courseOffset--;\n\n // Render the paged content for the current\n var pagedContentPage = getPagedContentContainer(root, jumpto);\n renderCourses(root, loadedPages[jumpto]).then(function(html, js) {\n return Templates.replaceNodeContents(pagedContentPage, html, js);\n }).catch(Notification.exception);\n\n // Delete subsequent pages in order to trigger the callback\n loadedPages.forEach(function(courseList, index) {\n if (index > jumpto) {\n var page = getPagedContentContainer(root, index);\n page.remove();\n }\n });\n };\n\n /**\n * Set the courses favourite status and push to repository\n *\n * @param {Number} courseId Course id to favourite.\n * @param {Bool} status new favourite status.\n * @return {Promise} Repository promise.\n */\n var setCourseFavouriteState = function(courseId, status) {\n\n return Repository.setFavouriteCourses({\n courses: [\n {\n 'id': courseId,\n 'favourite': status\n }\n ]\n }).then(function(result) {\n if (result.warnings.length == 0) {\n loadedPages.forEach(function(courseList) {\n courseList.courses.forEach(function(course, index) {\n if (course.id == courseId) {\n courseList.courses[index].isfavourite = status;\n }\n });\n });\n return true;\n } else {\n return false;\n }\n }).catch(Notification.exception);\n };\n\n /**\n * Render the dashboard courses.\n *\n * @param {object} root The root element for the courses view.\n * @param {array} coursesData containing array of returned courses.\n * @return {promise} jQuery promise resolved after rendering is complete.\n */\n var renderCourses = function(root, coursesData) {\n\n var filters = getFilterValues(root);\n\n var currentTemplate = '';\n if (filters.display == 'card') {\n currentTemplate = TEMPLATES.COURSES_CARDS;\n } else if (filters.display == 'list') {\n currentTemplate = TEMPLATES.COURSES_LIST;\n } else {\n currentTemplate = TEMPLATES.COURSES_SUMMARY;\n }\n\n // Whether the course category should be displayed in the course item.\n coursesData.courses = coursesData.courses.map(function(course) {\n course.showcoursecategory = filters.displaycategories == 'on' ? true : false;\n return course;\n });\n\n if (coursesData.courses.length) {\n return Templates.render(currentTemplate, {\n courses: coursesData.courses,\n });\n } else {\n var nocoursesimg = root.find(Selectors.courseView.region).attr('data-nocoursesimg');\n return Templates.render(TEMPLATES.NOCOURSES, {\n nocoursesimg: nocoursesimg\n });\n }\n };\n\n /**\n * Return the callback to be passed to the subscribe event\n *\n * @param {Number} limit The paged limit that is passed through the event\n */\n var setLimit = function(limit) {\n this.find(Selectors.courseView.region).attr('data-paging', limit);\n };\n\n /**\n * Intialise the paged list and cards views on page load.\n * Returns an array of paged contents that we would like to handle here\n *\n * @param {object} root The root element for the courses view\n * @param {string} namespace The namespace for all the events attached\n */\n var registerPagedEventHandlers = function(root, namespace) {\n var event = namespace + PagedContentEvents.SET_ITEMS_PER_PAGE_LIMIT;\n PubSub.subscribe(event, setLimit.bind(root));\n };\n\n /**\n * Intialise the courses list and cards views on page load.\n *\n * @param {object} root The root element for the courses view.\n */\n var initializePagedContent = function(root) {\n namespace = \"block_myoverview_\" + root.attr('id') + \"_\" + Math.random();\n\n var pagingLimit = parseInt(root.find(Selectors.courseView.region).attr('data-paging'), 10);\n var itemsPerPage = NUMCOURSES_PERPAGE.map(function(value) {\n var active = false;\n if (value == pagingLimit) {\n active = true;\n }\n\n return {\n value: value,\n active: active\n };\n });\n\n // Filter out all pagination options which are too large for the amount of courses user is enrolled in.\n var totalCourseCount = parseInt(root.find(Selectors.courseView.region).attr('data-totalcoursecount'), 10);\n itemsPerPage = itemsPerPage.filter(function(pagingOption) {\n return pagingOption.value < totalCourseCount || pagingOption.value === 0;\n });\n\n var filters = getFilterValues(root);\n var config = $.extend({}, DEFAULT_PAGED_CONTENT_CONFIG);\n config.eventNamespace = namespace;\n\n var pagedContentPromise = PagedContentFactory.createWithLimit(\n itemsPerPage,\n function(pagesData, actions) {\n var promises = [];\n\n pagesData.forEach(function(pageData) {\n var currentPage = pageData.pageNumber;\n var limit = (pageData.limit > 0) ? pageData.limit : 0;\n\n // Reset local variables if limits have changed\n if (lastLimit != limit) {\n loadedPages = [];\n courseOffset = 0;\n lastPage = 0;\n }\n\n if (lastPage == currentPage) {\n // If we are on the last page and have it's data then load it from cache\n actions.allItemsLoaded(lastPage);\n promises.push(renderCourses(root, loadedPages[currentPage]));\n return;\n }\n\n lastLimit = limit;\n\n // Get 2 pages worth of data as we will need it for the hidden functionality.\n if (loadedPages[currentPage + 1] == undefined) {\n if (loadedPages[currentPage] == undefined) {\n limit *= 2;\n }\n }\n\n var pagePromise = getMyCourses(\n filters,\n limit\n ).then(function(coursesData) {\n var courses = coursesData.courses;\n var nextPageStart = 0;\n var pageCourses = [];\n\n // If current page's data is loaded make sure we max it to page limit\n if (loadedPages[currentPage] != undefined) {\n pageCourses = loadedPages[currentPage].courses;\n var currentPageLength = pageCourses.length;\n if (currentPageLength < pageData.limit) {\n nextPageStart = pageData.limit - currentPageLength;\n pageCourses = $.merge(loadedPages[currentPage].courses, courses.slice(0, nextPageStart));\n }\n } else {\n // When the page limit is zero, there is only one page of courses, no start for next page.\n nextPageStart = pageData.limit || false;\n pageCourses = (pageData.limit > 0) ? courses.slice(0, pageData.limit) : courses;\n }\n\n // Finished setting up the current page\n loadedPages[currentPage] = {\n courses: pageCourses\n };\n\n // Set up the next page (if there is more than one page).\n var remainingCourses = nextPageStart !== false ? courses.slice(nextPageStart, courses.length) : [];\n if (remainingCourses.length) {\n loadedPages[currentPage + 1] = {\n courses: remainingCourses\n };\n }\n\n // Set the last page to either the current or next page\n if (loadedPages[currentPage].courses.length < pageData.limit || !remainingCourses.length) {\n lastPage = currentPage;\n actions.allItemsLoaded(currentPage);\n } else if (loadedPages[currentPage + 1] != undefined\n && loadedPages[currentPage + 1].courses.length < pageData.limit) {\n lastPage = currentPage + 1;\n }\n\n courseOffset = coursesData.nextoffset;\n return renderCourses(root, loadedPages[currentPage]);\n })\n .catch(Notification.exception);\n\n promises.push(pagePromise);\n });\n\n return promises;\n },\n config\n );\n\n pagedContentPromise.then(function(html, js) {\n registerPagedEventHandlers(root, namespace);\n return Templates.replaceNodeContents(root.find(Selectors.courseView.region), html, js);\n }).catch(Notification.exception);\n };\n\n /**\n * Listen to, and handle events for the myoverview block.\n *\n * @param {Object} root The myoverview block container element.\n */\n var registerEventListeners = function(root) {\n CustomEvents.define(root, [\n CustomEvents.events.activate\n ]);\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_ADD_FAVOURITE, function(e, data) {\n var favourite = $(e.target).closest(SELECTORS.ACTION_ADD_FAVOURITE);\n var courseId = getCourseId(favourite);\n addToFavourites(root, courseId);\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_REMOVE_FAVOURITE, function(e, data) {\n var favourite = $(e.target).closest(SELECTORS.ACTION_REMOVE_FAVOURITE);\n var courseId = getCourseId(favourite);\n removeFromFavourites(root, courseId);\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.FAVOURITE_ICON, function(e, data) {\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_HIDE_COURSE, function(e, data) {\n var target = $(e.target).closest(SELECTORS.ACTION_HIDE_COURSE);\n var courseId = getCourseId(target);\n hideCourse(root, courseId);\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_SHOW_COURSE, function(e, data) {\n var target = $(e.target).closest(SELECTORS.ACTION_SHOW_COURSE);\n var courseId = getCourseId(target);\n showCourse(root, courseId);\n data.originalEvent.preventDefault();\n });\n };\n\n /**\n * Intialise the courses list and cards views on page load.\n *\n * @param {object} root The root element for the courses view.\n */\n var init = function(root) {\n root = $(root);\n loadedPages = [];\n lastPage = 0;\n courseOffset = 0;\n\n initializePagedContent(root);\n\n if (!root.attr('data-init')) {\n registerEventListeners(root);\n root.attr('data-init', true);\n }\n };\n\n /**\n * Reset the courses views to their original\n *\n * state on first page load.courseOffset\n *\n * This is called when configuration has changed for the event lists\n * to cause them to reload their data.\n *\n * @param {Object} root The root element for the timeline view.\n */\n var reset = function(root) {\n if (loadedPages.length > 0) {\n loadedPages.forEach(function(courseList, index) {\n var pagedContentPage = getPagedContentContainer(root, index);\n renderCourses(root, courseList).then(function(html, js) {\n return Templates.replaceNodeContents(pagedContentPage, html, js);\n }).catch(Notification.exception);\n });\n } else {\n init(root);\n }\n };\n\n return {\n init: init,\n reset: reset\n };\n});\n"],"names":["define","$","Repository","PagedContentFactory","PubSub","CustomEvents","Notification","Templates","CourseEvents","Selectors","PagedContentEvents","Aria","SELECTORS","TEMPLATES","GROUPINGS","NUMCOURSES_PERPAGE","loadedPages","courseOffset","lastPage","lastLimit","namespace","getFilterValues","root","courseRegion","find","courseView","region","display","attr","grouping","sort","displaycategories","customfieldname","customfieldvalue","DEFAULT_PAGED_CONTENT_CONFIG","ignoreControlWhileLoading","controlPlacementBottom","persistentLimitKey","getFavouriteIconContainer","courseId","getPagedContentContainer","index","getCourseId","getAddFavouriteMenuItem","getRemoveFavouriteMenuItem","addToFavourites","removeAction","addAction","setCourseFavouriteState","then","success","publish","favourited","removeClass","addClass","iconContainer","isFavouriteIcon","unhide","notFavourteIcon","hide","showFavouriteIcon","alert","catch","exception","removeFromFavourites","unfavorited","hideFavouriteIcon","getHideCourseMenuItem","getShowCourseMenuItem","setCourseHiddenState","status","updateUserPreferences","preferences","type","value","hideElement","id","pagingBar","jumpto","parseInt","reducedCourse","courses","reduce","accumulator","current","push","undefined","newElement","slice","forEach","courseList","popElement","merge","length","pagedContentContainer","resetLastPageNumber","pagedContentPage","renderCourses","html","js","replaceNodeContents","remove","setFavouriteCourses","result","warnings","course","isfavourite","coursesData","filters","currentTemplate","map","showcoursecategory","render","nocoursesimg","setLimit","limit","this","registerPagedEventHandlers","event","SET_ITEMS_PER_PAGE_LIMIT","subscribe","bind","initializePagedContent","Math","random","pagingLimit","itemsPerPage","active","totalCourseCount","filter","pagingOption","config","extend","eventNamespace","pagedContentPromise","createWithLimit","pagesData","actions","promises","pageData","currentPage","pageNumber","allItemsLoaded","pagePromise","getEnrolledCoursesByTimeline","offset","classification","getMyCourses","nextPageStart","pageCourses","currentPageLength","remainingCourses","nextoffset","registerEventListeners","events","activate","on","e","data","favourite","target","closest","originalEvent","preventDefault","hideAction","showAction","hideCourse","showCourse","init","reset"],"mappings":"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"} \ No newline at end of file diff --git a/blocks/myoverview/amd/build/view_nav.min.js.map b/blocks/myoverview/amd/build/view_nav.min.js.map index f2e2b165c03..0c6baea776b 100644 --- a/blocks/myoverview/amd/build/view_nav.min.js.map +++ b/blocks/myoverview/amd/build/view_nav.min.js.map @@ -1 +1 @@ -{"version":3,"file":"view_nav.min.js","sources":["../src/view_nav.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 * Manage the timeline view navigation for the overview block.\n *\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/custom_interaction_events',\n 'block_myoverview/repository',\n 'block_myoverview/view',\n 'block_myoverview/selectors'\n],\nfunction(\n $,\n CustomEvents,\n Repository,\n View,\n Selectors\n) {\n\n var SELECTORS = {\n FILTERS: '[data-region=\"filter\"]',\n FILTER_OPTION: '[data-filter]',\n DISPLAY_OPTION: '[data-display-option]'\n };\n\n /**\n * Update the user preference for the block.\n *\n * @param {String} filter The type of filter: display/sort/grouping.\n * @param {String} value The current preferred value.\n */\n var updatePreferences = function(filter, value) {\n var type = null;\n if (filter == 'display') {\n type = 'block_myoverview_user_view_preference';\n } else if (filter == 'sort') {\n type = 'block_myoverview_user_sort_preference';\n } else if (filter == 'customfieldvalue') {\n type = 'block_myoverview_user_grouping_customfieldvalue_preference';\n } else {\n type = 'block_myoverview_user_grouping_preference';\n }\n\n Repository.updateUserPreferences({\n preferences: [\n {\n type: type,\n value: value\n }\n ]\n });\n };\n\n /**\n * Event listener for the Display filter (cards, list).\n *\n * @param {object} root The root element for the overview block\n */\n var registerSelector = function(root) {\n\n var Selector = root.find(SELECTORS.FILTERS);\n\n CustomEvents.define(Selector, [CustomEvents.events.activate]);\n Selector.on(\n CustomEvents.events.activate,\n SELECTORS.FILTER_OPTION,\n function(e, data) {\n var option = $(e.target);\n\n if (option.hasClass('active')) {\n // If it's already active then we don't need to do anything.\n return;\n }\n\n var filter = option.attr('data-filter');\n var pref = option.attr('data-pref');\n var customfieldvalue = option.attr('data-customfieldvalue');\n\n root.find(Selectors.courseView.region).attr('data-' + filter, option.attr('data-value'));\n updatePreferences(filter, pref);\n\n if (customfieldvalue) {\n root.find(Selectors.courseView.region).attr('data-customfieldvalue', customfieldvalue);\n updatePreferences('customfieldvalue', customfieldvalue);\n }\n\n // Reset the views.\n View.init(root);\n\n data.originalEvent.preventDefault();\n }\n );\n\n CustomEvents.define(Selector, [CustomEvents.events.activate]);\n Selector.on(\n CustomEvents.events.activate,\n SELECTORS.DISPLAY_OPTION,\n function(e, data) {\n var option = $(e.target);\n\n if (option.hasClass('active')) {\n return;\n }\n\n var filter = option.attr('data-display-option');\n var pref = option.attr('data-pref');\n\n root.find(Selectors.courseView.region).attr('data-display', option.attr('data-value'));\n updatePreferences(filter, pref);\n View.reset(root);\n data.originalEvent.preventDefault();\n }\n );\n };\n\n /**\n * Initialise the timeline view navigation by adding event listeners to\n * the navigation elements.\n *\n * @param {object} root The root element for the myoverview block\n */\n var init = function(root) {\n root = $(root);\n registerSelector(root);\n };\n\n return {\n init: init\n };\n});\n"],"names":["define","$","CustomEvents","Repository","View","Selectors","SELECTORS","updatePreferences","filter","value","type","updateUserPreferences","preferences","init","root","Selector","find","events","activate","on","e","data","option","target","hasClass","attr","pref","customfieldvalue","courseView","region","originalEvent","preventDefault","reset","registerSelector"],"mappings":";;;;;;AAsBAA,mCACA,CACI,SACA,iCACA,8BACA,wBACA,+BAEJ,SACIC,EACAC,aACAC,WACAC,KACAC,eAGIC,kBACS,yBADTA,wBAEe,gBAFfA,yBAGgB,wBAShBC,kBAAoB,SAASC,OAAQC,WACjCC,KAAO,KAEPA,KADU,WAAVF,OACO,wCACU,QAAVA,OACA,wCACU,oBAAVA,OACA,6DAEA,4CAGXL,WAAWQ,sBAAsB,CAC7BC,YAAa,CACT,CACIF,KAAMA,KACND,MAAOA,iBA+EhB,CACHI,KANO,SAASC,OA/DG,SAASA,UAExBC,SAAWD,KAAKE,KAAKV,mBAEzBJ,aAAaF,OAAOe,SAAU,CAACb,aAAae,OAAOC,WACnDH,SAASI,GACLjB,aAAae,OAAOC,SACpBZ,yBACA,SAASc,EAAGC,UACJC,OAASrB,EAAEmB,EAAEG,YAEbD,OAAOE,SAAS,eAKhBhB,OAASc,OAAOG,KAAK,eACrBC,KAAOJ,OAAOG,KAAK,aACnBE,iBAAmBL,OAAOG,KAAK,yBAEnCX,KAAKE,KAAKX,UAAUuB,WAAWC,QAAQJ,KAAK,QAAUjB,OAAQc,OAAOG,KAAK,eAC1ElB,kBAAkBC,OAAQkB,MAEtBC,mBACAb,KAAKE,KAAKX,UAAUuB,WAAWC,QAAQJ,KAAK,wBAAyBE,kBACrEpB,kBAAkB,mBAAoBoB,mBAI1CvB,KAAKS,KAAKC,MAEVO,KAAKS,cAAcC,qBAI3B7B,aAAaF,OAAOe,SAAU,CAACb,aAAae,OAAOC,WACnDH,SAASI,GACLjB,aAAae,OAAOC,SACpBZ,0BACA,SAASc,EAAGC,UACJC,OAASrB,EAAEmB,EAAEG,YAEbD,OAAOE,SAAS,eAIhBhB,OAASc,OAAOG,KAAK,uBACrBC,KAAOJ,OAAOG,KAAK,aAEvBX,KAAKE,KAAKX,UAAUuB,WAAWC,QAAQJ,KAAK,eAAgBH,OAAOG,KAAK,eACxElB,kBAAkBC,OAAQkB,MAC1BtB,KAAK4B,MAAMlB,MACXO,KAAKS,cAAcC,qBAa3BE,CADAnB,KAAOb,EAAEa"} \ No newline at end of file +{"version":3,"file":"view_nav.min.js","sources":["../src/view_nav.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 * Manage the timeline view navigation for the overview block.\n *\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/custom_interaction_events',\n 'block_myoverview/repository',\n 'block_myoverview/view',\n 'block_myoverview/selectors'\n],\nfunction(\n $,\n CustomEvents,\n Repository,\n View,\n Selectors\n) {\n\n var SELECTORS = {\n FILTERS: '[data-region=\"filter\"]',\n FILTER_OPTION: '[data-filter]',\n DISPLAY_OPTION: '[data-display-option]'\n };\n\n /**\n * Update the user preference for the block.\n *\n * @param {String} filter The type of filter: display/sort/grouping.\n * @param {String} value The current preferred value.\n */\n var updatePreferences = function(filter, value) {\n var type = null;\n if (filter == 'display') {\n type = 'block_myoverview_user_view_preference';\n } else if (filter == 'sort') {\n type = 'block_myoverview_user_sort_preference';\n } else if (filter == 'customfieldvalue') {\n type = 'block_myoverview_user_grouping_customfieldvalue_preference';\n } else {\n type = 'block_myoverview_user_grouping_preference';\n }\n\n Repository.updateUserPreferences({\n preferences: [\n {\n type: type,\n value: value\n }\n ]\n });\n };\n\n /**\n * Event listener for the Display filter (cards, list).\n *\n * @param {object} root The root element for the overview block\n */\n var registerSelector = function(root) {\n\n var Selector = root.find(SELECTORS.FILTERS);\n\n CustomEvents.define(Selector, [CustomEvents.events.activate]);\n Selector.on(\n CustomEvents.events.activate,\n SELECTORS.FILTER_OPTION,\n function(e, data) {\n var option = $(e.target);\n\n if (option.hasClass('active')) {\n // If it's already active then we don't need to do anything.\n return;\n }\n\n var filter = option.attr('data-filter');\n var pref = option.attr('data-pref');\n var customfieldvalue = option.attr('data-customfieldvalue');\n\n root.find(Selectors.courseView.region).attr('data-' + filter, option.attr('data-value'));\n updatePreferences(filter, pref);\n\n if (customfieldvalue) {\n root.find(Selectors.courseView.region).attr('data-customfieldvalue', customfieldvalue);\n updatePreferences('customfieldvalue', customfieldvalue);\n }\n\n // Reset the views.\n View.init(root);\n\n data.originalEvent.preventDefault();\n }\n );\n\n CustomEvents.define(Selector, [CustomEvents.events.activate]);\n Selector.on(\n CustomEvents.events.activate,\n SELECTORS.DISPLAY_OPTION,\n function(e, data) {\n var option = $(e.target);\n\n if (option.hasClass('active')) {\n return;\n }\n\n var filter = option.attr('data-display-option');\n var pref = option.attr('data-pref');\n\n root.find(Selectors.courseView.region).attr('data-display', option.attr('data-value'));\n updatePreferences(filter, pref);\n View.reset(root);\n data.originalEvent.preventDefault();\n }\n );\n };\n\n /**\n * Initialise the timeline view navigation by adding event listeners to\n * the navigation elements.\n *\n * @param {object} root The root element for the myoverview block\n */\n var init = function(root) {\n root = $(root);\n registerSelector(root);\n };\n\n return {\n init: init\n };\n});\n"],"names":["define","$","CustomEvents","Repository","View","Selectors","SELECTORS","updatePreferences","filter","value","type","updateUserPreferences","preferences","init","root","Selector","find","events","activate","on","e","data","option","target","hasClass","attr","pref","customfieldvalue","courseView","region","originalEvent","preventDefault","reset","registerSelector"],"mappings":";;;;;;AAsBAA,OAAM,4BACN,CACI,SACA,iCACA,8BACA,wBACA,+BAEJ,SACIC,EACAC,aACAC,WACAC,KACAC,WAGA,IAAIC,kBACS,yBADTA,wBAEe,gBAFfA,yBAGgB,wBAShBC,kBAAoB,SAASC,OAAQC,OACjCC,IAAAA,KAAO,KAEPA,KADU,WAAVF,OACO,wCACU,QAAVA,OACA,wCACU,oBAAVA,OACA,6DAEA,4CAGXL,WAAWQ,sBAAsB,CAC7BC,YAAa,CACT,CACIF,KAAMA,KACND,MAAOA,SAItB,EA2EM,MAAA,CACHI,KANO,SAASC,OA/DG,SAASA,MAExBC,IAAAA,SAAWD,KAAKE,KAAKV,mBAEzBJ,aAAaF,OAAOe,SAAU,CAACb,aAAae,OAAOC,WACnDH,SAASI,GACLjB,aAAae,OAAOC,SACpBZ,yBACA,SAASc,EAAGC,MACR,IAAIC,OAASrB,EAAEmB,EAAEG,QAEjB,IAAID,OAAOE,SAAS,UAApB,CAKA,IAAIhB,OAASc,OAAOG,KAAK,eACrBC,KAAOJ,OAAOG,KAAK,aACnBE,iBAAmBL,OAAOG,KAAK,yBAEnCX,KAAKE,KAAKX,UAAUuB,WAAWC,QAAQJ,KAAK,QAAUjB,OAAQc,OAAOG,KAAK,eAC1ElB,kBAAkBC,OAAQkB,MAEtBC,mBACAb,KAAKE,KAAKX,UAAUuB,WAAWC,QAAQJ,KAAK,wBAAyBE,kBACrEpB,kBAAkB,mBAAoBoB,mBAI1CvB,KAAKS,KAAKC,MAEVO,KAAKS,cAAcC,gBAjBlB,CAkBJ,IAGL7B,aAAaF,OAAOe,SAAU,CAACb,aAAae,OAAOC,WACnDH,SAASI,GACLjB,aAAae,OAAOC,SACpBZ,0BACA,SAASc,EAAGC,MACR,IAAIC,OAASrB,EAAEmB,EAAEG,QAEjB,IAAID,OAAOE,SAAS,UAApB,CAIA,IAAIhB,OAASc,OAAOG,KAAK,uBACrBC,KAAOJ,OAAOG,KAAK,aAEvBX,KAAKE,KAAKX,UAAUuB,WAAWC,QAAQJ,KAAK,eAAgBH,OAAOG,KAAK,eACxElB,kBAAkBC,OAAQkB,MAC1BtB,KAAK4B,MAAMlB,MACXO,KAAKS,cAAcC,gBARlB,CASJ,GAER,CAUGE,CADAnB,KAAOb,EAAEa,MAEZ,EAKJ"} \ No newline at end of file diff --git a/blocks/navigation/amd/build/ajax_response_renderer.min.js b/blocks/navigation/amd/build/ajax_response_renderer.min.js index 1ea6847d7d9..0278ceb64e8 100644 --- a/blocks/navigation/amd/build/ajax_response_renderer.min.js +++ b/blocks/navigation/amd/build/ajax_response_renderer.min.js @@ -6,6 +6,6 @@ function _typeof(obj){return _typeof="function"==typeof Symbol&&"symbol"==typeof * @module block_navigation/ajax_response_renderer * @copyright 2015 John Okely * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */}define("block_navigation/ajax_response_renderer",["jquery","core/templates","core/notification","core/url","core/aria"],(function($,Templates,Notification,Url,Aria){var NODETYPE_ACTIVITY=40,NODETYPE_RESOURCE=50;function buildDOM(rootElement,nodes){var ul=$("
    ");ul.attr("role","group"),Aria.hide(ul),$.each(nodes,(function(index,node){if("object"===_typeof(node)){var li=$("
  • "),p=$("

    "),id=node.id||node.key+"_tree_item",icon=null,isBranch=!(!node.expandable&&!node.haschildren);li.attr("role","treeitem"),p.addClass("tree_item"),p.attr("id",id),p.attr("tabindex","-1"),node.requiresajaxloading&&(li.attr("data-requires-ajax",!0),li.attr("data-node-id",node.id),li.attr("data-node-key",node.key),li.attr("data-node-type",node.type)),isBranch&&(li.addClass("collapsed contains_branch"),li.attr("aria-expanded",!1),p.addClass("branch"));var eleToAddIcon=null;if(node.link){var link=$('');eleToAddIcon=link,link.append(''+node.name+""),node.hidden&&link.addClass("dimmed"),p.append(link)}else{var span=$("");eleToAddIcon=span,span.append(''+node.name+""),node.hidden&&span.addClass("dimmed"),p.append(span)}!node.icon||isBranch&&node.type!==NODETYPE_ACTIVITY&&node.type!==NODETYPE_RESOURCE||(li.addClass("item_with_icon"),p.addClass("hasicon"),node.type===NODETYPE_ACTIVITY||node.type===NODETYPE_RESOURCE?((icon=$("")).attr("alt",node.icon.alt),icon.attr("title",node.icon.title),icon.attr("src",Url.imageUrl(node.icon.pix,node.icon.component)),$.each(node.icon.classes,(function(index,className){icon.addClass(className)})),eleToAddIcon.prepend(icon)):("moodle"==node.icon.component&&(node.icon.component="core"),Templates.renderPix(node.icon.pix,node.icon.component,node.icon.title).then((function(html){eleToAddIcon.prepend(html)})).catch(Notification.exception))),li.append(p),ul.append(li),node.children&&node.children.length?buildDOM(li,node.children):isBranch&&!node.requiresajaxloading&&(li.removeClass("contains_branch"),p.addClass("emptybranch"))}})),rootElement.append(ul);var id=rootElement.attr("id")+"_group";ul.attr("id",id),rootElement.attr("aria-owns",id),rootElement.attr("role","treeitem")}return{render:function(element,nodes){if(nodes.children&&nodes.children.length){buildDOM(element,nodes.children);var item=element.children("[role='treeitem']").first(),group=element.find("#"+item.attr("aria-owns"));item.attr("aria-expanded",!0),Aria.unhide(group)}else element.hasClass("contains_branch")&&(element.removeClass("contains_branch"),element.addClass("emptybranch"))}}})); + */}define("block_navigation/ajax_response_renderer",["jquery","core/templates","core/notification","core/url","core/aria"],(function($,Templates,Notification,Url,Aria){var NODETYPE={ACTIVITY:40,RESOURCE:50};function buildDOM(rootElement,nodes){var ul=$("
      ");ul.attr("role","group"),Aria.hide(ul),$.each(nodes,(function(index,node){if("object"===_typeof(node)){var li=$("
    • "),p=$("

      "),id=node.id||node.key+"_tree_item",icon=null,isBranch=!(!node.expandable&&!node.haschildren);li.attr("role","treeitem"),p.addClass("tree_item"),p.attr("id",id),p.attr("tabindex","-1"),node.requiresajaxloading&&(li.attr("data-requires-ajax",!0),li.attr("data-node-id",node.id),li.attr("data-node-key",node.key),li.attr("data-node-type",node.type)),isBranch&&(li.addClass("collapsed contains_branch"),li.attr("aria-expanded",!1),p.addClass("branch"));var eleToAddIcon=null;if(node.link){var link=$('');eleToAddIcon=link,link.append(''+node.name+""),node.hidden&&link.addClass("dimmed"),p.append(link)}else{var span=$("");eleToAddIcon=span,span.append(''+node.name+""),node.hidden&&span.addClass("dimmed"),p.append(span)}!node.icon||isBranch&&node.type!==NODETYPE.ACTIVITY&&node.type!==NODETYPE.RESOURCE||(li.addClass("item_with_icon"),p.addClass("hasicon"),node.type===NODETYPE.ACTIVITY||node.type===NODETYPE.RESOURCE?((icon=$("")).attr("alt",node.icon.alt),icon.attr("title",node.icon.title),icon.attr("src",Url.imageUrl(node.icon.pix,node.icon.component)),$.each(node.icon.classes,(function(index,className){icon.addClass(className)})),eleToAddIcon.prepend(icon)):("moodle"==node.icon.component&&(node.icon.component="core"),Templates.renderPix(node.icon.pix,node.icon.component,node.icon.title).then((function(html){eleToAddIcon.prepend(html)})).catch(Notification.exception))),li.append(p),ul.append(li),node.children&&node.children.length?buildDOM(li,node.children):isBranch&&!node.requiresajaxloading&&(li.removeClass("contains_branch"),p.addClass("emptybranch"))}})),rootElement.append(ul);var id=rootElement.attr("id")+"_group";ul.attr("id",id),rootElement.attr("aria-owns",id),rootElement.attr("role","treeitem")}return{render:function(element,nodes){if(nodes.children&&nodes.children.length){buildDOM(element,nodes.children);var item=element.children("[role='treeitem']").first(),group=element.find("#"+item.attr("aria-owns"));item.attr("aria-expanded",!0),Aria.unhide(group)}else element.hasClass("contains_branch")&&(element.removeClass("contains_branch"),element.addClass("emptybranch"))}}})); //# sourceMappingURL=ajax_response_renderer.min.js.map \ No newline at end of file diff --git a/blocks/navigation/amd/build/ajax_response_renderer.min.js.map b/blocks/navigation/amd/build/ajax_response_renderer.min.js.map index 6f3694e4c53..cd64692e20f 100644 --- a/blocks/navigation/amd/build/ajax_response_renderer.min.js.map +++ b/blocks/navigation/amd/build/ajax_response_renderer.min.js.map @@ -1 +1 @@ -{"version":3,"file":"ajax_response_renderer.min.js","sources":["../src/ajax_response_renderer.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 * Parse the response from the navblock ajax page and render the correct DOM\n * structure for the tree from it.\n *\n * @module block_navigation/ajax_response_renderer\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/templates',\n 'core/notification',\n 'core/url',\n 'core/aria',\n], function(\n $,\n Templates,\n Notification,\n Url,\n Aria\n) {\n\n // Mappings for the different types of nodes coming from the navigation.\n // Copied from lib/navigationlib.php navigation_node constants.\n var NODETYPE = {\n // @type int Activity (course module) = 40.\n ACTIVITY: 40,\n // @type int Resource (course module = 50.\n RESOURCE: 50,\n };\n\n /**\n * Build DOM.\n *\n * @method buildDOM\n * @param {Object} rootElement the root element of DOM.\n * @param {object} nodes jquery object representing the nodes to be build.\n */\n function buildDOM(rootElement, nodes) {\n var ul = $('
        ');\n ul.attr('role', 'group');\n Aria.hide(ul);\n\n $.each(nodes, function(index, node) {\n if (typeof node !== 'object') {\n return;\n }\n\n var li = $('
      • ');\n var p = $('

        ');\n var id = node.id || node.key + '_tree_item';\n var icon = null;\n var isBranch = (node.expandable || node.haschildren) ? true : false;\n\n li.attr('role', 'treeitem');\n p.addClass('tree_item');\n p.attr('id', id);\n // Negative tab index to allow it to receive focus.\n p.attr('tabindex', '-1');\n\n if (node.requiresajaxloading) {\n li.attr('data-requires-ajax', true);\n li.attr('data-node-id', node.id);\n li.attr('data-node-key', node.key);\n li.attr('data-node-type', node.type);\n }\n\n if (isBranch) {\n li.addClass('collapsed contains_branch');\n li.attr('aria-expanded', false);\n p.addClass('branch');\n }\n\n var eleToAddIcon = null;\n if (node.link) {\n var link = $('');\n\n eleToAddIcon = link;\n link.append('' + node.name + '');\n\n if (node.hidden) {\n link.addClass('dimmed');\n }\n\n p.append(link);\n } else {\n var span = $('');\n\n eleToAddIcon = span;\n span.append('' + node.name + '');\n\n if (node.hidden) {\n span.addClass('dimmed');\n }\n\n p.append(span);\n }\n\n if (node.icon && (!isBranch || node.type === NODETYPE.ACTIVITY || node.type === NODETYPE.RESOURCE)) {\n li.addClass('item_with_icon');\n p.addClass('hasicon');\n\n if (node.type === NODETYPE.ACTIVITY || node.type === NODETYPE.RESOURCE) {\n icon = $('');\n icon.attr('alt', node.icon.alt);\n icon.attr('title', node.icon.title);\n icon.attr('src', Url.imageUrl(node.icon.pix, node.icon.component));\n $.each(node.icon.classes, function(index, className) {\n icon.addClass(className);\n });\n eleToAddIcon.prepend(icon);\n } else {\n if (node.icon.component == 'moodle') {\n node.icon.component = 'core';\n }\n Templates.renderPix(node.icon.pix, node.icon.component, node.icon.title).then(function(html) {\n // Prepend.\n eleToAddIcon.prepend(html);\n return;\n }).catch(Notification.exception);\n }\n }\n\n li.append(p);\n ul.append(li);\n\n if (node.children && node.children.length) {\n buildDOM(li, node.children);\n } else if (isBranch && !node.requiresajaxloading) {\n li.removeClass('contains_branch');\n p.addClass('emptybranch');\n }\n });\n\n rootElement.append(ul);\n var id = rootElement.attr('id') + '_group';\n ul.attr('id', id);\n rootElement.attr('aria-owns', id);\n rootElement.attr('role', 'treeitem');\n }\n\n return {\n render: function(element, nodes) {\n // The first element of the response is the existing node so we start with processing the children.\n if (nodes.children && nodes.children.length) {\n buildDOM(element, nodes.children);\n\n var item = element.children(\"[role='treeitem']\").first();\n var group = element.find('#' + item.attr('aria-owns'));\n\n item.attr('aria-expanded', true);\n Aria.unhide(group);\n } else {\n if (element.hasClass('contains_branch')) {\n element.removeClass('contains_branch');\n element.addClass('emptybranch');\n }\n }\n }\n };\n});\n"],"names":["define","$","Templates","Notification","Url","Aria","NODETYPE","buildDOM","rootElement","nodes","ul","attr","hide","each","index","node","_typeof","li","p","id","key","icon","isBranch","expandable","haschildren","addClass","requiresajaxloading","type","eleToAddIcon","link","title","append","name","hidden","span","alt","imageUrl","pix","component","classes","className","prepend","renderPix","then","html","catch","exception","children","length","removeClass","render","element","item","first","group","find","unhide","hasClass"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"ajax_response_renderer.min.js","sources":["../src/ajax_response_renderer.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 * Parse the response from the navblock ajax page and render the correct DOM\n * structure for the tree from it.\n *\n * @module block_navigation/ajax_response_renderer\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/templates',\n 'core/notification',\n 'core/url',\n 'core/aria',\n], function(\n $,\n Templates,\n Notification,\n Url,\n Aria\n) {\n\n // Mappings for the different types of nodes coming from the navigation.\n // Copied from lib/navigationlib.php navigation_node constants.\n var NODETYPE = {\n // @type int Activity (course module) = 40.\n ACTIVITY: 40,\n // @type int Resource (course module = 50.\n RESOURCE: 50,\n };\n\n /**\n * Build DOM.\n *\n * @method buildDOM\n * @param {Object} rootElement the root element of DOM.\n * @param {object} nodes jquery object representing the nodes to be build.\n */\n function buildDOM(rootElement, nodes) {\n var ul = $('
          ');\n ul.attr('role', 'group');\n Aria.hide(ul);\n\n $.each(nodes, function(index, node) {\n if (typeof node !== 'object') {\n return;\n }\n\n var li = $('
        • ');\n var p = $('

          ');\n var id = node.id || node.key + '_tree_item';\n var icon = null;\n var isBranch = (node.expandable || node.haschildren) ? true : false;\n\n li.attr('role', 'treeitem');\n p.addClass('tree_item');\n p.attr('id', id);\n // Negative tab index to allow it to receive focus.\n p.attr('tabindex', '-1');\n\n if (node.requiresajaxloading) {\n li.attr('data-requires-ajax', true);\n li.attr('data-node-id', node.id);\n li.attr('data-node-key', node.key);\n li.attr('data-node-type', node.type);\n }\n\n if (isBranch) {\n li.addClass('collapsed contains_branch');\n li.attr('aria-expanded', false);\n p.addClass('branch');\n }\n\n var eleToAddIcon = null;\n if (node.link) {\n var link = $('');\n\n eleToAddIcon = link;\n link.append('' + node.name + '');\n\n if (node.hidden) {\n link.addClass('dimmed');\n }\n\n p.append(link);\n } else {\n var span = $('');\n\n eleToAddIcon = span;\n span.append('' + node.name + '');\n\n if (node.hidden) {\n span.addClass('dimmed');\n }\n\n p.append(span);\n }\n\n if (node.icon && (!isBranch || node.type === NODETYPE.ACTIVITY || node.type === NODETYPE.RESOURCE)) {\n li.addClass('item_with_icon');\n p.addClass('hasicon');\n\n if (node.type === NODETYPE.ACTIVITY || node.type === NODETYPE.RESOURCE) {\n icon = $('');\n icon.attr('alt', node.icon.alt);\n icon.attr('title', node.icon.title);\n icon.attr('src', Url.imageUrl(node.icon.pix, node.icon.component));\n $.each(node.icon.classes, function(index, className) {\n icon.addClass(className);\n });\n eleToAddIcon.prepend(icon);\n } else {\n if (node.icon.component == 'moodle') {\n node.icon.component = 'core';\n }\n Templates.renderPix(node.icon.pix, node.icon.component, node.icon.title).then(function(html) {\n // Prepend.\n eleToAddIcon.prepend(html);\n return;\n }).catch(Notification.exception);\n }\n }\n\n li.append(p);\n ul.append(li);\n\n if (node.children && node.children.length) {\n buildDOM(li, node.children);\n } else if (isBranch && !node.requiresajaxloading) {\n li.removeClass('contains_branch');\n p.addClass('emptybranch');\n }\n });\n\n rootElement.append(ul);\n var id = rootElement.attr('id') + '_group';\n ul.attr('id', id);\n rootElement.attr('aria-owns', id);\n rootElement.attr('role', 'treeitem');\n }\n\n return {\n render: function(element, nodes) {\n // The first element of the response is the existing node so we start with processing the children.\n if (nodes.children && nodes.children.length) {\n buildDOM(element, nodes.children);\n\n var item = element.children(\"[role='treeitem']\").first();\n var group = element.find('#' + item.attr('aria-owns'));\n\n item.attr('aria-expanded', true);\n Aria.unhide(group);\n } else {\n if (element.hasClass('contains_branch')) {\n element.removeClass('contains_branch');\n element.addClass('emptybranch');\n }\n }\n }\n };\n});\n"],"names":["define","$","Templates","Notification","Url","Aria","NODETYPE","ACTIVITY","RESOURCE","buildDOM","rootElement","nodes","ul","attr","hide","each","index","node","_typeof","li","p","id","key","icon","isBranch","expandable","haschildren","addClass","requiresajaxloading","type","eleToAddIcon","link","title","append","name","hidden","span","alt","imageUrl","pix","component","classes","className","prepend","renderPix","then","html","catch","exception","children","length","removeClass","render","element","item","first","group","find","unhide","hasClass"],"mappings":"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"} \ No newline at end of file diff --git a/blocks/navigation/amd/build/nav_loader.min.js.map b/blocks/navigation/amd/build/nav_loader.min.js.map index e53f935caea..731b684b6e4 100644 --- a/blocks/navigation/amd/build/nav_loader.min.js.map +++ b/blocks/navigation/amd/build/nav_loader.min.js.map @@ -1 +1 @@ -{"version":3,"file":"nav_loader.min.js","sources":["../src/nav_loader.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 * Load the nav tree items via ajax and render the response.\n *\n * @module block_navigation/nav_loader\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/config', 'block_navigation/ajax_response_renderer'],\n function($, ajax, config, renderer) {\n var URL = config.wwwroot + '/lib/ajax/getnavbranch.php';\n\n /**\n * Get the block instance id.\n *\n * @function getBlockInstanceId\n * @param {Element} element\n * @returns {String} the instance id\n */\n function getBlockInstanceId(element) {\n return element.closest('[data-block]').attr('data-instanceid');\n }\n\n return {\n load: function(element) {\n element = $(element);\n var promise = $.Deferred();\n var data = {\n elementid: element.attr('data-node-id'),\n id: element.attr('data-node-key'),\n type: element.attr('data-node-type'),\n sesskey: config.sesskey,\n instance: getBlockInstanceId(element)\n };\n var settings = {\n type: 'POST',\n dataType: 'json',\n data: data\n };\n\n $.ajax(URL, settings).done(function(nodes) {\n renderer.render(element, nodes);\n promise.resolve();\n });\n\n return promise;\n }\n };\n});\n"],"names":["define","$","ajax","config","renderer","URL","wwwroot","getBlockInstanceId","element","closest","attr","load","promise","Deferred","settings","type","dataType","data","elementid","id","sesskey","instance","done","nodes","render","resolve"],"mappings":";;;;;;;AAsBAA,qCAAO,CAAC,SAAU,YAAa,cAAe,4CAC1C,SAASC,EAAGC,KAAMC,OAAQC,cAClBC,IAAMF,OAAOG,QAAU,sCASlBC,mBAAmBC,gBACjBA,QAAQC,QAAQ,gBAAgBC,KAAK,yBAG7C,CACHC,KAAM,SAASH,SACXA,QAAUP,EAAEO,aACRI,QAAUX,EAAEY,WAQZC,SAAW,CACXC,KAAM,OACNC,SAAU,OACVC,KAVO,CACPC,UAAWV,QAAQE,KAAK,gBACxBS,GAAIX,QAAQE,KAAK,iBACjBK,KAAMP,QAAQE,KAAK,kBACnBU,QAASjB,OAAOiB,QAChBC,SAAUd,mBAAmBC,kBAQjCP,EAAEC,KAAKG,IAAKS,UAAUQ,MAAK,SAASC,OAChCnB,SAASoB,OAAOhB,QAASe,OACzBX,QAAQa,aAGLb"} \ No newline at end of file +{"version":3,"file":"nav_loader.min.js","sources":["../src/nav_loader.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 * Load the nav tree items via ajax and render the response.\n *\n * @module block_navigation/nav_loader\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/config', 'block_navigation/ajax_response_renderer'],\n function($, ajax, config, renderer) {\n var URL = config.wwwroot + '/lib/ajax/getnavbranch.php';\n\n /**\n * Get the block instance id.\n *\n * @function getBlockInstanceId\n * @param {Element} element\n * @returns {String} the instance id\n */\n function getBlockInstanceId(element) {\n return element.closest('[data-block]').attr('data-instanceid');\n }\n\n return {\n load: function(element) {\n element = $(element);\n var promise = $.Deferred();\n var data = {\n elementid: element.attr('data-node-id'),\n id: element.attr('data-node-key'),\n type: element.attr('data-node-type'),\n sesskey: config.sesskey,\n instance: getBlockInstanceId(element)\n };\n var settings = {\n type: 'POST',\n dataType: 'json',\n data: data\n };\n\n $.ajax(URL, settings).done(function(nodes) {\n renderer.render(element, nodes);\n promise.resolve();\n });\n\n return promise;\n }\n };\n});\n"],"names":["define","$","ajax","config","renderer","URL","wwwroot","getBlockInstanceId","element","closest","attr","load","promise","Deferred","settings","type","dataType","data","elementid","id","sesskey","instance","done","nodes","render","resolve"],"mappings":";;;;;;;AAsBAA,qCAAO,CAAC,SAAU,YAAa,cAAe,4CAC1C,SAASC,EAAGC,KAAMC,OAAQC,UACtB,IAAIC,IAAMF,OAAOG,QAAU,6BASlBC,SAAAA,mBAAmBC,SACjBA,OAAAA,QAAQC,QAAQ,gBAAgBC,KAAK,kBAC/C,CAEE,MAAA,CACHC,KAAM,SAASH,SACXA,QAAUP,EAAEO,SACZ,IAAII,QAAUX,EAAEY,WAQZC,SAAW,CACXC,KAAM,OACNC,SAAU,OACVC,KAVO,CACPC,UAAWV,QAAQE,KAAK,gBACxBS,GAAIX,QAAQE,KAAK,iBACjBK,KAAMP,QAAQE,KAAK,kBACnBU,QAASjB,OAAOiB,QAChBC,SAAUd,mBAAmBC,WAajC,OALAP,EAAEC,KAAKG,IAAKS,UAAUQ,MAAK,SAASC,OAChCnB,SAASoB,OAAOhB,QAASe,OACzBX,QAAQa,SACX,IAEMb,OACV,EAER"} \ No newline at end of file diff --git a/blocks/navigation/amd/build/navblock.min.js.map b/blocks/navigation/amd/build/navblock.min.js.map index e7a80eaee9d..01a5ec9bb52 100644 --- a/blocks/navigation/amd/build/navblock.min.js.map +++ b/blocks/navigation/amd/build/navblock.min.js.map @@ -1 +1 @@ -{"version":3,"file":"navblock.min.js","sources":["../src/navblock.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 * Load the navigation tree javascript.\n *\n * @module block_navigation/navblock\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/tree'], function($, Tree) {\n return {\n init: function(instanceid) {\n var navTree = new Tree(\".block_navigation .block_tree\");\n navTree.finishExpandingGroup = function(item) {\n Tree.prototype.finishExpandingGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n navTree.collapseGroup = function(item) {\n Tree.prototype.collapseGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n }\n };\n});\n"],"names":["define","$","Tree","init","instanceid","navTree","finishExpandingGroup","item","prototype","call","this","Y","use","Global","fire","M","core","globalEvents","BLOCK_CONTENT_UPDATED","collapseGroup"],"mappings":";;;;;;;AAsBAA,mCAAO,CAAC,SAAU,cAAc,SAASC,EAAGC,YACjC,CACHC,KAAM,SAASC,gBACPC,QAAU,IAAIH,KAAK,iCACvBG,QAAQC,qBAAuB,SAASC,MACpCL,KAAKM,UAAUF,qBAAqBG,KAAKC,KAAMH,MAC/CI,EAAEC,IAAI,qBAAqB,WACvBD,EAAEE,OAAOC,KAAKC,EAAEC,KAAKC,aAAaC,sBAAuB,CACrDd,WAAYA,iBAIxBC,QAAQc,cAAgB,SAASZ,MAC7BL,KAAKM,UAAUW,cAAcV,KAAKC,KAAMH,MACxCI,EAAEC,IAAI,qBAAqB,WACvBD,EAAEE,OAAOC,KAAKC,EAAEC,KAAKC,aAAaC,sBAAuB,CACrDd,WAAYA"} \ No newline at end of file +{"version":3,"file":"navblock.min.js","sources":["../src/navblock.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 * Load the navigation tree javascript.\n *\n * @module block_navigation/navblock\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/tree'], function($, Tree) {\n return {\n init: function(instanceid) {\n var navTree = new Tree(\".block_navigation .block_tree\");\n navTree.finishExpandingGroup = function(item) {\n Tree.prototype.finishExpandingGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n navTree.collapseGroup = function(item) {\n Tree.prototype.collapseGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n }\n };\n});\n"],"names":["define","$","Tree","init","instanceid","navTree","finishExpandingGroup","item","prototype","call","this","Y","use","Global","fire","M","core","globalEvents","BLOCK_CONTENT_UPDATED","collapseGroup"],"mappings":";;;;;;;AAsBAA,OAAM,4BAAC,CAAC,SAAU,cAAc,SAASC,EAAGC,MACjC,MAAA,CACHC,KAAM,SAASC,YACX,IAAIC,QAAU,IAAIH,KAAK,iCACvBG,QAAQC,qBAAuB,SAASC,MACpCL,KAAKM,UAAUF,qBAAqBG,KAAKC,KAAMH,MAC/CI,EAAEC,IAAI,qBAAqB,WACvBD,EAAEE,OAAOC,KAAKC,EAAEC,KAAKC,aAAaC,sBAAuB,CACrDd,WAAYA,YAEnB,GACJ,EACDC,QAAQc,cAAgB,SAASZ,MAC7BL,KAAKM,UAAUW,cAAcV,KAAKC,KAAMH,MACxCI,EAAEC,IAAI,qBAAqB,WACvBD,EAAEE,OAAOC,KAAKC,EAAEC,KAAKC,aAAaC,sBAAuB,CACrDd,WAAYA,YAEnB,GACJ,CACJ,EAER"} \ No newline at end of file diff --git a/blocks/navigation/amd/build/site_admin_loader.min.js.map b/blocks/navigation/amd/build/site_admin_loader.min.js.map index 4eecd6aaf71..8d60b4cd1de 100644 --- a/blocks/navigation/amd/build/site_admin_loader.min.js.map +++ b/blocks/navigation/amd/build/site_admin_loader.min.js.map @@ -1 +1 @@ -{"version":3,"file":"site_admin_loader.min.js","sources":["../src/site_admin_loader.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 * Load the site admin nav tree via ajax and render the response.\n *\n * @module block_navigation/site_admin_loader\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/config', 'block_navigation/ajax_response_renderer'],\n function($, ajax, config, renderer) {\n\n var SITE_ADMIN_NODE_TYPE = 71;\n var URL = config.wwwroot + '/lib/ajax/getsiteadminbranch.php';\n\n return {\n load: function(element) {\n element = $(element);\n var promise = $.Deferred();\n var data = {\n type: SITE_ADMIN_NODE_TYPE,\n sesskey: config.sesskey\n };\n var settings = {\n type: 'POST',\n dataType: 'json',\n data: data\n };\n\n $.ajax(URL, settings).done(function(nodes) {\n renderer.render(element, nodes);\n promise.resolve();\n });\n\n return promise;\n }\n };\n});\n"],"names":["define","$","ajax","config","renderer","URL","wwwroot","load","element","promise","Deferred","settings","type","dataType","data","sesskey","done","nodes","render","resolve"],"mappings":";;;;;;;AAsBAA,4CAAO,CAAC,SAAU,YAAa,cAAe,4CACtC,SAASC,EAAGC,KAAMC,OAAQC,cAG1BC,IAAMF,OAAOG,QAAU,yCAEpB,CACHC,KAAM,SAASC,SACXA,QAAUP,EAAEO,aACRC,QAAUR,EAAES,WAKZC,SAAW,CACXC,KAAM,OACNC,SAAU,OACVC,KAPO,CACPF,KARe,GASfG,QAASZ,OAAOY,iBAQpBd,EAAEC,KAAKG,IAAKM,UAAUK,MAAK,SAASC,OAChCb,SAASc,OAAOV,QAASS,OACzBR,QAAQU,aAGLV"} \ No newline at end of file +{"version":3,"file":"site_admin_loader.min.js","sources":["../src/site_admin_loader.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 * Load the site admin nav tree via ajax and render the response.\n *\n * @module block_navigation/site_admin_loader\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/config', 'block_navigation/ajax_response_renderer'],\n function($, ajax, config, renderer) {\n\n var SITE_ADMIN_NODE_TYPE = 71;\n var URL = config.wwwroot + '/lib/ajax/getsiteadminbranch.php';\n\n return {\n load: function(element) {\n element = $(element);\n var promise = $.Deferred();\n var data = {\n type: SITE_ADMIN_NODE_TYPE,\n sesskey: config.sesskey\n };\n var settings = {\n type: 'POST',\n dataType: 'json',\n data: data\n };\n\n $.ajax(URL, settings).done(function(nodes) {\n renderer.render(element, nodes);\n promise.resolve();\n });\n\n return promise;\n }\n };\n});\n"],"names":["define","$","ajax","config","renderer","SITE_ADMIN_NODE_TYPE","URL","wwwroot","load","element","promise","Deferred","settings","type","dataType","data","sesskey","done","nodes","render","resolve"],"mappings":";;;;;;;AAsBAA,4CAAO,CAAC,SAAU,YAAa,cAAe,4CACtC,SAASC,EAAGC,KAAMC,OAAQC,UAE1BC,IACAC,IAAMH,OAAOI,QAAU,mCAEpB,MAAA,CACHC,KAAM,SAASC,SACXA,QAAUR,EAAEQ,SACZ,IAAIC,QAAUT,EAAEU,WAKZC,SAAW,CACXC,KAAM,OACNC,SAAU,OACVC,KAPO,CACPF,KARe,GASfG,QAASb,OAAOa,UAapB,OALAf,EAAEC,KAAKI,IAAKM,UAAUK,MAAK,SAASC,OAChCd,SAASe,OAAOV,QAASS,OACzBR,QAAQU,SACX,IAEMV,OACV,EAER"} \ No newline at end of file diff --git a/blocks/online_users/amd/build/change_user_visibility.min.js.map b/blocks/online_users/amd/build/change_user_visibility.min.js.map index 683db00dfa2..99e17212c77 100644 --- a/blocks/online_users/amd/build/change_user_visibility.min.js.map +++ b/blocks/online_users/amd/build/change_user_visibility.min.js.map @@ -1 +1 @@ -{"version":3,"file":"change_user_visibility.min.js","sources":["../src/change_user_visibility.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 javascript module that handles the change of the user's visibility in the\n * online users block.\n *\n * @module block_online_users/change_user_visibility\n * @copyright 2018 Mihail Geshoski \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/str', 'core/notification'],\n function($, Ajax, Str, Notification) {\n\n /**\n * Selectors.\n *\n * @access private\n * @type {Object}\n */\n var SELECTORS = {\n CHANGE_VISIBILITY_LINK: '#change-user-visibility',\n CHANGE_VISIBILITY_ICON: '#change-user-visibility .icon'\n };\n\n /**\n * Change user visibility in the online users block.\n *\n * @method changeVisibility\n * @param {String} action\n * @param {String} userid\n * @private\n */\n var changeVisibility = function(action, userid) {\n\n var value = action == \"show\" ? 1 : 0;\n var preferences = [{\n 'name': 'block_online_users_uservisibility',\n 'value': value,\n 'userid': userid\n }];\n\n var request = {\n methodname: 'core_user_set_user_preferences',\n args: {\n preferences: preferences\n }\n };\n Ajax.call([request])[0].then(function(data) {\n if (data.saved) {\n var newAction = oppositeAction(action);\n changeVisibilityLinkAttr(newAction);\n changeVisibilityIconAttr(newAction);\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Get the opposite action.\n *\n * @method oppositeAction\n * @param {String} action\n * @return {String}\n * @private\n */\n var oppositeAction = function(action) {\n return action == 'show' ? 'hide' : 'show';\n };\n\n /**\n * Change the attribute values of the user visibility link in the online users block.\n *\n * @method changeVisibilityLinkAttr\n * @param {String} action\n * @private\n */\n var changeVisibilityLinkAttr = function(action) {\n getTitle(action).then(function(title) {\n $(SELECTORS.CHANGE_VISIBILITY_LINK).attr({\n 'data-action': action,\n 'title': title\n });\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Change the attribute values of the user visibility icon in the online users block.\n *\n * @method changeVisibilityIconAttr\n * @param {String} action\n * @private\n */\n var changeVisibilityIconAttr = function(action) {\n var icon = $(SELECTORS.CHANGE_VISIBILITY_ICON);\n getTitle(action).then(function(title) {\n // Add the proper title to the icon.\n $(icon).attr({\n 'title': title,\n 'aria-label': title\n });\n // If the icon is an image.\n if (icon.is(\"img\")) {\n $(icon).attr({\n 'src': M.util.image_url('t/' + action),\n 'alt': title\n });\n } else {\n // Add the new icon class and remove the old one.\n $(icon).addClass(getIconClass(action));\n $(icon).removeClass(getIconClass(oppositeAction(action)));\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Get the proper class for the user visibility icon in the online users block.\n *\n * @method getIconClass\n * @param {String} action\n * @return {String}\n * @private\n */\n var getIconClass = function(action) {\n return action == 'show' ? 'fa-eye-slash' : 'fa-eye';\n };\n\n /**\n * Get the title description of the user visibility link in the online users block.\n *\n * @method getTitle\n * @param {String} action\n * @return {object} jQuery promise\n * @private\n */\n var getTitle = function(action) {\n return Str.get_string('online_status:' + action, 'block_online_users');\n };\n\n return {\n // Public variables and functions.\n /**\n * Initialise change user visibility function.\n *\n * @method init\n */\n init: function() {\n $(SELECTORS.CHANGE_VISIBILITY_LINK).on('click', function(e) {\n e.preventDefault();\n var action = ($(this).attr('data-action'));\n var userid = ($(this).attr('data-userid'));\n changeVisibility(action, userid);\n });\n }\n };\n});\n"],"names":["define","$","Ajax","Str","Notification","SELECTORS","oppositeAction","action","changeVisibilityLinkAttr","getTitle","then","title","attr","catch","exception","changeVisibilityIconAttr","icon","is","M","util","image_url","addClass","getIconClass","removeClass","get_string","init","on","e","preventDefault","userid","request","methodname","args","preferences","call","data","saved","newAction","changeVisibility","this"],"mappings":";;;;;;;;AAuBAA,mDAAO,CAAC,SAAU,YAAa,WAAY,sBACnC,SAASC,EAAGC,KAAMC,IAAKC,kBAQvBC,iCACwB,0BADxBA,iCAEwB,gCA4CxBC,eAAiB,SAASC,cACT,QAAVA,OAAmB,OAAS,QAUnCC,yBAA2B,SAASD,QACpCE,SAASF,QAAQG,MAAK,SAASC,OAC3BV,EAAEI,kCAAkCO,KAAK,eACtBL,aACNI,WAGdE,MAAMT,aAAaU,YAUtBC,yBAA2B,SAASR,YAChCS,KAAOf,EAAEI,kCACbI,SAASF,QAAQG,MAAK,SAASC,OAE3BV,EAAEe,MAAMJ,KAAK,OACAD,mBACKA,QAGdK,KAAKC,GAAG,OACRhB,EAAEe,MAAMJ,KAAK,KACFM,EAAEC,KAAKC,UAAU,KAAOb,YACxBI,SAIXV,EAAEe,MAAMK,SAASC,aAAaf,SAC9BN,EAAEe,MAAMO,YAAYD,aAAahB,eAAeC,cAGrDM,MAAMT,aAAaU,YAWtBQ,aAAe,SAASf,cACP,QAAVA,OAAmB,eAAiB,UAW3CE,SAAW,SAASF,eACbJ,IAAIqB,WAAW,iBAAmBjB,OAAQ,6BAG9C,CAOHkB,KAAM,WACFxB,EAAEI,kCAAkCqB,GAAG,SAAS,SAASC,GACrDA,EAAEC,iBArHS,SAASrB,OAAQsB,YAShCC,QAAU,CACVC,WAAY,iCACZC,KAAM,CACFC,YATU,CAAC,MACP,0CAFU,QAAV1B,OAAmB,EAAI,SAIrBsB,WASd3B,KAAKgC,KAAK,CAACJ,UAAU,GAAGpB,MAAK,SAASyB,SAC9BA,KAAKC,MAAO,KACRC,UAAY/B,eAAeC,QAC/BC,yBAAyB6B,WACzBtB,yBAAyBsB,eAG9BxB,MAAMT,aAAaU,WAkGdwB,CAFcrC,EAAEsC,MAAM3B,KAAK,eACbX,EAAEsC,MAAM3B,KAAK"} \ No newline at end of file +{"version":3,"file":"change_user_visibility.min.js","sources":["../src/change_user_visibility.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 javascript module that handles the change of the user's visibility in the\n * online users block.\n *\n * @module block_online_users/change_user_visibility\n * @copyright 2018 Mihail Geshoski \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/str', 'core/notification'],\n function($, Ajax, Str, Notification) {\n\n /**\n * Selectors.\n *\n * @access private\n * @type {Object}\n */\n var SELECTORS = {\n CHANGE_VISIBILITY_LINK: '#change-user-visibility',\n CHANGE_VISIBILITY_ICON: '#change-user-visibility .icon'\n };\n\n /**\n * Change user visibility in the online users block.\n *\n * @method changeVisibility\n * @param {String} action\n * @param {String} userid\n * @private\n */\n var changeVisibility = function(action, userid) {\n\n var value = action == \"show\" ? 1 : 0;\n var preferences = [{\n 'name': 'block_online_users_uservisibility',\n 'value': value,\n 'userid': userid\n }];\n\n var request = {\n methodname: 'core_user_set_user_preferences',\n args: {\n preferences: preferences\n }\n };\n Ajax.call([request])[0].then(function(data) {\n if (data.saved) {\n var newAction = oppositeAction(action);\n changeVisibilityLinkAttr(newAction);\n changeVisibilityIconAttr(newAction);\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Get the opposite action.\n *\n * @method oppositeAction\n * @param {String} action\n * @return {String}\n * @private\n */\n var oppositeAction = function(action) {\n return action == 'show' ? 'hide' : 'show';\n };\n\n /**\n * Change the attribute values of the user visibility link in the online users block.\n *\n * @method changeVisibilityLinkAttr\n * @param {String} action\n * @private\n */\n var changeVisibilityLinkAttr = function(action) {\n getTitle(action).then(function(title) {\n $(SELECTORS.CHANGE_VISIBILITY_LINK).attr({\n 'data-action': action,\n 'title': title\n });\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Change the attribute values of the user visibility icon in the online users block.\n *\n * @method changeVisibilityIconAttr\n * @param {String} action\n * @private\n */\n var changeVisibilityIconAttr = function(action) {\n var icon = $(SELECTORS.CHANGE_VISIBILITY_ICON);\n getTitle(action).then(function(title) {\n // Add the proper title to the icon.\n $(icon).attr({\n 'title': title,\n 'aria-label': title\n });\n // If the icon is an image.\n if (icon.is(\"img\")) {\n $(icon).attr({\n 'src': M.util.image_url('t/' + action),\n 'alt': title\n });\n } else {\n // Add the new icon class and remove the old one.\n $(icon).addClass(getIconClass(action));\n $(icon).removeClass(getIconClass(oppositeAction(action)));\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Get the proper class for the user visibility icon in the online users block.\n *\n * @method getIconClass\n * @param {String} action\n * @return {String}\n * @private\n */\n var getIconClass = function(action) {\n return action == 'show' ? 'fa-eye-slash' : 'fa-eye';\n };\n\n /**\n * Get the title description of the user visibility link in the online users block.\n *\n * @method getTitle\n * @param {String} action\n * @return {object} jQuery promise\n * @private\n */\n var getTitle = function(action) {\n return Str.get_string('online_status:' + action, 'block_online_users');\n };\n\n return {\n // Public variables and functions.\n /**\n * Initialise change user visibility function.\n *\n * @method init\n */\n init: function() {\n $(SELECTORS.CHANGE_VISIBILITY_LINK).on('click', function(e) {\n e.preventDefault();\n var action = ($(this).attr('data-action'));\n var userid = ($(this).attr('data-userid'));\n changeVisibility(action, userid);\n });\n }\n };\n});\n"],"names":["define","$","Ajax","Str","Notification","SELECTORS","oppositeAction","action","changeVisibilityLinkAttr","getTitle","then","title","attr","catch","exception","changeVisibilityIconAttr","icon","is","M","util","image_url","addClass","getIconClass","removeClass","get_string","init","on","e","preventDefault","userid","value","request","methodname","args","preferences","name","call","data","saved","newAction","changeVisibility","this"],"mappings":";;;;;;;;AAuBAA,mDAAO,CAAC,SAAU,YAAa,WAAY,sBACnC,SAASC,EAAGC,KAAMC,IAAKC,cAQ3B,IAAIC,iCACwB,0BADxBA,iCAEwB,gCA4CxBC,eAAiB,SAASC,QAC1B,MAAiB,QAAVA,OAAmB,OAAS,MACtC,EASGC,yBAA2B,SAASD,QACpCE,SAASF,QAAQG,MAAK,SAASC,OAC3BV,EAAEI,kCAAkCO,KAAK,CACrC,cAAeL,OACNI,MAAAA,OAHjB,IAMGE,MAAMT,aAAaU,UACzB,EASGC,yBAA2B,SAASR,QACpC,IAAIS,KAAOf,EAAEI,kCACbI,SAASF,QAAQG,MAAK,SAASC,OAE3BV,EAAEe,MAAMJ,KAAK,CACTD,MAASA,MACKA,aAAAA,QAGdK,KAAKC,GAAG,OACRhB,EAAEe,MAAMJ,KAAK,CACFM,IAAAA,EAAEC,KAAKC,UAAU,KAAOb,QACxBI,IAAAA,SAIXV,EAAEe,MAAMK,SAASC,aAAaf,SAC9BN,EAAEe,MAAMO,YAAYD,aAAahB,eAAeC,UAfxD,IAkBGM,MAAMT,aAAaU,UACzB,EAUGQ,aAAe,SAASf,QACxB,MAAiB,QAAVA,OAAmB,eAAiB,QAC9C,EAUGE,SAAW,SAASF,QACbJ,OAAAA,IAAIqB,WAAW,iBAAmBjB,OAAQ,qBACpD,EAEM,MAAA,CAOHkB,KAAM,WACFxB,EAAEI,kCAAkCqB,GAAG,SAAS,SAASC,GACrDA,EAAEC,iBArHS,SAASrB,OAAQsB,QAEhCC,IAOAC,QAAU,CACVC,WAAY,iCACZC,KAAM,CACFC,YATU,CAAC,CACfC,KAAQ,oCACRL,MAHkB,QAAVvB,OAAmB,EAAI,EAIrBsB,OAAAA,WASd3B,KAAKkC,KAAK,CAACL,UAAU,GAAGrB,MAAK,SAAS2B,MAC9BA,GAAAA,KAAKC,MAAO,CACZ,IAAIC,UAAYjC,eAAeC,QAC/BC,yBAAyB+B,WACzBxB,yBAAyBwB,UAC5B,CALL,IAOG1B,MAAMT,aAAaU,UACzB,CAiGW0B,CAFcvC,EAAEwC,MAAM7B,KAAK,eACbX,EAAEwC,MAAM7B,KAAK,eAE9B,GACJ,EAER"} \ No newline at end of file diff --git a/blocks/private_files/amd/build/files_tree.min.js.map b/blocks/private_files/amd/build/files_tree.min.js.map index d2aeccfaebb..448f3105d85 100644 --- a/blocks/private_files/amd/build/files_tree.min.js.map +++ b/blocks/private_files/amd/build/files_tree.min.js.map @@ -1 +1 @@ -{"version":3,"file":"files_tree.min.js","sources":["../src/files_tree.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 * Changes the display of directories and files into a tree.\n *\n * @module block_private_files/files_tree\n * @copyright 2021 Shamim Rezaie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Tree from 'core/tree';\n\n/**\n * The init function that does the job.\n * It changes the display of directories and files into a tree.\n *\n * @param {string} blockId\n */\nexport const init = (blockId) => {\n new Tree(`#${blockId} [role=\"tree\"]`);\n};\n"],"names":["blockId","Tree"],"mappings":";;;;;;;oJA8BoB,SAACA,aACbC,yBAASD"} \ No newline at end of file +{"version":3,"file":"files_tree.min.js","sources":["../src/files_tree.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 * Changes the display of directories and files into a tree.\n *\n * @module block_private_files/files_tree\n * @copyright 2021 Shamim Rezaie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Tree from 'core/tree';\n\n/**\n * The init function that does the job.\n * It changes the display of directories and files into a tree.\n *\n * @param {string} blockId\n */\nexport const init = (blockId) => {\n new Tree(`#${blockId} [role=\"tree\"]`);\n};\n"],"names":["_tree","blockId","Tree"],"mappings":";;;;;;;kFAsBAA,WAAAA,uDAQoB,SAACC,SACbC,IAAAA,MAAAA,mBAASD,QAAb,kBACH"} \ No newline at end of file diff --git a/blocks/recentlyaccessedcourses/amd/build/main.min.js.map b/blocks/recentlyaccessedcourses/amd/build/main.min.js.map index 65962af3c27..20792321a26 100644 --- a/blocks/recentlyaccessedcourses/amd/build/main.min.js.map +++ b/blocks/recentlyaccessedcourses/amd/build/main.min.js.map @@ -1 +1 @@ -{"version":3,"file":"main.min.js","sources":["../src/main.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 * Javascript to initialise the Recently accessed courses block.\n *\n * @module block_recentlyaccessedcourses/main\n * @copyright 2018 Victor Deniz \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n [\n 'jquery',\n 'core/custom_interaction_events',\n 'core/notification',\n 'core/pubsub',\n 'core/paged_content_paging_bar',\n 'core/templates',\n 'core_course/events',\n 'core_course/repository',\n 'core/aria',\n ],\n function(\n $,\n CustomEvents,\n Notification,\n PubSub,\n PagedContentPagingBar,\n Templates,\n CourseEvents,\n CoursesRepository,\n Aria\n ) {\n\n // Constants.\n var NUM_COURSES_TOTAL = 10;\n var SELECTORS = {\n BLOCK_CONTAINER: '[data-region=\"recentlyaccessedcourses\"]',\n CARD_CONTAINER: '[data-region=\"card-deck\"]',\n COURSE_IS_FAVOURITE: '[data-region=\"is-favourite\"]',\n CONTENT: '[data-region=\"view-content\"]',\n EMPTY_MESSAGE: '[data-region=\"empty-message\"]',\n LOADING_PLACEHOLDER: '[data-region=\"loading-placeholder\"]',\n PAGING_BAR: '[data-region=\"paging-bar\"]',\n PAGING_BAR_NEXT: '[data-control=\"next\"]',\n PAGING_BAR_PREVIOUS: '[data-control=\"previous\"]'\n };\n // Module variables.\n var contentLoaded = false;\n var allCourses = [];\n var visibleCoursesId = null;\n var cardWidth = null;\n var viewIndex = 0;\n var availableVisibleCards = 1;\n\n /**\n * Show the empty message when no course are found.\n *\n * @param {object} root The root element for the courses view.\n */\n var showEmptyMessage = function(root) {\n root.find(SELECTORS.EMPTY_MESSAGE).removeClass('hidden');\n root.find(SELECTORS.LOADING_PLACEHOLDER).addClass('hidden');\n root.find(SELECTORS.CONTENT).addClass('hidden');\n };\n\n /**\n * Show the empty message when no course are found.\n *\n * @param {object} root The root element for the courses view.\n */\n var showContent = function(root) {\n root.find(SELECTORS.CONTENT).removeClass('hidden');\n root.find(SELECTORS.EMPTY_MESSAGE).addClass('hidden');\n root.find(SELECTORS.LOADING_PLACEHOLDER).addClass('hidden');\n };\n\n /**\n * Show the paging bar.\n *\n * @param {object} root The root element for the courses view.\n */\n var showPagingBar = function(root) {\n var pagingBar = root.find(SELECTORS.PAGING_BAR);\n pagingBar.css('opacity', 1);\n pagingBar.css('visibility', 'visible');\n Aria.unhide(pagingBar);\n };\n\n /**\n * Hide the paging bar.\n *\n * @param {object} root The root element for the courses view.\n */\n var hidePagingBar = function(root) {\n var pagingBar = root.find(SELECTORS.PAGING_BAR);\n pagingBar.css('opacity', 0);\n pagingBar.css('visibility', 'hidden');\n Aria.hide(pagingBar);\n };\n\n /**\n * Show the favourite indicator for the given course (if it's in the list).\n *\n * @param {object} root The root element for the courses view.\n * @param {number} courseId The id of the course to be favourited.\n */\n var favouriteCourse = function(root, courseId) {\n allCourses.forEach(function(course) {\n if (course.attr('data-course-id') == courseId) {\n course.find(SELECTORS.COURSE_IS_FAVOURITE).removeClass('hidden');\n }\n });\n };\n\n /**\n * Hide the favourite indicator for the given course (if it's in the list).\n *\n * @param {object} root The root element for the courses view.\n * @param {number} courseId The id of the course to be unfavourited.\n */\n var unfavouriteCourse = function(root, courseId) {\n allCourses.forEach(function(course) {\n if (course.attr('data-course-id') == courseId) {\n course.find(SELECTORS.COURSE_IS_FAVOURITE).addClass('hidden');\n }\n });\n };\n\n /**\n * Render the a list of courses.\n *\n * @param {array} courses containing array of courses.\n * @return {promise} Resolved with list of rendered courses as jQuery objects.\n */\n var renderAllCourses = function(courses) {\n var showcoursecategory = $(SELECTORS.BLOCK_CONTAINER).data('displaycoursecategory');\n var promises = courses.map(function(course) {\n course.showcoursecategory = showcoursecategory;\n return Templates.render('block_recentlyaccessedcourses/course-card', course);\n });\n\n return $.when.apply(null, promises).then(function() {\n var renderedCourses = [];\n\n promises.forEach(function(promise) {\n promise.then(function(html) {\n renderedCourses.push($(html));\n return;\n })\n .catch(Notification.exception);\n });\n\n return renderedCourses;\n });\n };\n\n /**\n * Fetch user's recently accessed courses and reload the content of the block.\n *\n * @param {int} userid User whose courses will be shown\n * @returns {promise} The updated content for the block.\n */\n var loadContent = function(userid) {\n return CoursesRepository.getLastAccessedCourses(userid, NUM_COURSES_TOTAL)\n .then(function(courses) {\n return renderAllCourses(courses);\n });\n };\n\n /**\n * Recalculate the number of courses that should be visible.\n *\n * @param {object} root The root element for the courses view.\n */\n var recalculateVisibleCourses = function(root) {\n var container = root.find(SELECTORS.CONTENT).find(SELECTORS.CARD_CONTAINER);\n var availableWidth = parseFloat(root.css('width'));\n var numberOfCourses = allCourses.length;\n var start = 0;\n\n if (!cardWidth) {\n container.html(allCourses[0]);\n // Render one card initially to calculate the width of the cards\n // including the margins.\n cardWidth = allCourses[0].outerWidth(true);\n }\n\n availableVisibleCards = Math.floor(availableWidth / cardWidth);\n\n if (viewIndex + availableVisibleCards < numberOfCourses) {\n start = viewIndex;\n } else {\n var overflow = (viewIndex + availableVisibleCards) - numberOfCourses;\n start = viewIndex - overflow;\n start = start >= 0 ? start : 0;\n }\n\n // At least show one card.\n if (availableVisibleCards === 0) {\n availableVisibleCards = 1;\n }\n\n var coursesToShow = allCourses.slice(start, start + availableVisibleCards);\n // Create an id for the list of courses we expect to be displayed.\n var newVisibleCoursesId = coursesToShow.reduce(function(carry, course) {\n return carry + course.attr('data-course-id');\n }, '');\n\n // Centre the courses if we have an overflow of courses.\n if (allCourses.length > coursesToShow.length) {\n container.addClass('justify-content-center');\n container.removeClass('justify-content-start');\n } else {\n container.removeClass('justify-content-center');\n container.addClass('justify-content-start');\n }\n\n // Don't bother updating the DOM unless the visible courses have changed.\n if (visibleCoursesId != newVisibleCoursesId) {\n var pagingBar = root.find(PagedContentPagingBar.rootSelector);\n container.html(coursesToShow);\n visibleCoursesId = newVisibleCoursesId;\n\n if (availableVisibleCards >= allCourses.length) {\n hidePagingBar(root);\n } else {\n showPagingBar(root);\n\n if (viewIndex === 0) {\n PagedContentPagingBar.disablePreviousControlButtons(pagingBar);\n } else {\n PagedContentPagingBar.enablePreviousControlButtons(pagingBar);\n }\n\n if (viewIndex + availableVisibleCards >= allCourses.length) {\n PagedContentPagingBar.disableNextControlButtons(pagingBar);\n } else {\n PagedContentPagingBar.enableNextControlButtons(pagingBar);\n }\n }\n }\n };\n\n /**\n * Register event listeners for the block.\n *\n * @param {object} root The root element for the recentlyaccessedcourses block.\n */\n var registerEventListeners = function(root) {\n var resizeTimeout = null;\n var drawerToggling = false;\n\n PubSub.subscribe(CourseEvents.favourited, function(courseId) {\n favouriteCourse(root, courseId);\n });\n\n PubSub.subscribe(CourseEvents.unfavorited, function(courseId) {\n unfavouriteCourse(root, courseId);\n });\n\n PubSub.subscribe('nav-drawer-toggle-start', function() {\n if (!contentLoaded || !allCourses.length || drawerToggling) {\n // Nothing to recalculate.\n return;\n }\n\n drawerToggling = true;\n var recalculationCount = 0;\n // This function is going to recalculate the number of courses while\n // the nav drawer is opening or closes (up to a maximum of 5 recalcs).\n var doRecalculation = function() {\n setTimeout(function() {\n recalculateVisibleCourses(root);\n recalculationCount++;\n\n if (recalculationCount < 5 && drawerToggling) {\n // If we haven't done too many recalculations and the drawer\n // is still toggling then recurse.\n doRecalculation();\n }\n }, 100);\n };\n\n // Start the recalculations.\n doRecalculation(root);\n });\n\n PubSub.subscribe('nav-drawer-toggle-end', function() {\n drawerToggling = false;\n });\n\n $(window).on('resize', function() {\n if (!contentLoaded || !allCourses.length) {\n // Nothing to reclculate.\n return;\n }\n\n // Resize events fire rapidly so recalculating the visible courses each\n // time can be expensive. Let's debounce them,\n if (!resizeTimeout) {\n resizeTimeout = setTimeout(function() {\n resizeTimeout = null;\n recalculateVisibleCourses(root);\n // The recalculateVisibleCourses function will execute at a rate of 15fps.\n }, 66);\n }\n });\n\n CustomEvents.define(root, [CustomEvents.events.activate]);\n root.on(CustomEvents.events.activate, SELECTORS.PAGING_BAR_NEXT, function(e, data) {\n var button = $(e.target).closest(SELECTORS.PAGING_BAR_NEXT);\n if (!button.hasClass('disabled')) {\n viewIndex = viewIndex + availableVisibleCards;\n recalculateVisibleCourses(root);\n }\n\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.PAGING_BAR_PREVIOUS, function(e, data) {\n var button = $(e.target).closest(SELECTORS.PAGING_BAR_PREVIOUS);\n if (!button.hasClass('disabled')) {\n viewIndex = viewIndex - availableVisibleCards;\n viewIndex = viewIndex < 0 ? 0 : viewIndex;\n recalculateVisibleCourses(root);\n }\n\n data.originalEvent.preventDefault();\n });\n };\n\n /**\n * Get and show the recent courses into the block.\n *\n * @param {int} userid User from which the courses will be obtained\n * @param {object} root The root element for the recentlyaccessedcourses block.\n */\n var init = function(userid, root) {\n root = $(root);\n\n registerEventListeners(root);\n loadContent(userid)\n .then(function(renderedCourses) {\n allCourses = renderedCourses;\n contentLoaded = true;\n\n if (allCourses.length) {\n showContent(root);\n recalculateVisibleCourses(root);\n } else {\n showEmptyMessage(root);\n }\n\n return;\n })\n .catch(Notification.exception);\n };\n\n return {\n init: init\n };\n });\n"],"names":["define","$","CustomEvents","Notification","PubSub","PagedContentPagingBar","Templates","CourseEvents","CoursesRepository","Aria","SELECTORS","contentLoaded","allCourses","visibleCoursesId","cardWidth","viewIndex","availableVisibleCards","loadContent","userid","getLastAccessedCourses","then","courses","showcoursecategory","data","promises","map","course","render","when","apply","renderedCourses","forEach","promise","html","push","catch","exception","renderAllCourses","recalculateVisibleCourses","root","container","find","availableWidth","parseFloat","css","numberOfCourses","length","start","outerWidth","Math","floor","coursesToShow","slice","newVisibleCoursesId","reduce","carry","attr","addClass","removeClass","pagingBar","rootSelector","hide","hidePagingBar","unhide","showPagingBar","disablePreviousControlButtons","enablePreviousControlButtons","disableNextControlButtons","enableNextControlButtons","registerEventListeners","resizeTimeout","drawerToggling","subscribe","favourited","courseId","favouriteCourse","unfavorited","unfavouriteCourse","recalculationCount","doRecalculation","setTimeout","window","on","events","activate","e","target","closest","hasClass","originalEvent","preventDefault","init","showContent","showEmptyMessage"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.min.js","sources":["../src/main.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 * Javascript to initialise the Recently accessed courses block.\n *\n * @module block_recentlyaccessedcourses/main\n * @copyright 2018 Victor Deniz \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n [\n 'jquery',\n 'core/custom_interaction_events',\n 'core/notification',\n 'core/pubsub',\n 'core/paged_content_paging_bar',\n 'core/templates',\n 'core_course/events',\n 'core_course/repository',\n 'core/aria',\n ],\n function(\n $,\n CustomEvents,\n Notification,\n PubSub,\n PagedContentPagingBar,\n Templates,\n CourseEvents,\n CoursesRepository,\n Aria\n ) {\n\n // Constants.\n var NUM_COURSES_TOTAL = 10;\n var SELECTORS = {\n BLOCK_CONTAINER: '[data-region=\"recentlyaccessedcourses\"]',\n CARD_CONTAINER: '[data-region=\"card-deck\"]',\n COURSE_IS_FAVOURITE: '[data-region=\"is-favourite\"]',\n CONTENT: '[data-region=\"view-content\"]',\n EMPTY_MESSAGE: '[data-region=\"empty-message\"]',\n LOADING_PLACEHOLDER: '[data-region=\"loading-placeholder\"]',\n PAGING_BAR: '[data-region=\"paging-bar\"]',\n PAGING_BAR_NEXT: '[data-control=\"next\"]',\n PAGING_BAR_PREVIOUS: '[data-control=\"previous\"]'\n };\n // Module variables.\n var contentLoaded = false;\n var allCourses = [];\n var visibleCoursesId = null;\n var cardWidth = null;\n var viewIndex = 0;\n var availableVisibleCards = 1;\n\n /**\n * Show the empty message when no course are found.\n *\n * @param {object} root The root element for the courses view.\n */\n var showEmptyMessage = function(root) {\n root.find(SELECTORS.EMPTY_MESSAGE).removeClass('hidden');\n root.find(SELECTORS.LOADING_PLACEHOLDER).addClass('hidden');\n root.find(SELECTORS.CONTENT).addClass('hidden');\n };\n\n /**\n * Show the empty message when no course are found.\n *\n * @param {object} root The root element for the courses view.\n */\n var showContent = function(root) {\n root.find(SELECTORS.CONTENT).removeClass('hidden');\n root.find(SELECTORS.EMPTY_MESSAGE).addClass('hidden');\n root.find(SELECTORS.LOADING_PLACEHOLDER).addClass('hidden');\n };\n\n /**\n * Show the paging bar.\n *\n * @param {object} root The root element for the courses view.\n */\n var showPagingBar = function(root) {\n var pagingBar = root.find(SELECTORS.PAGING_BAR);\n pagingBar.css('opacity', 1);\n pagingBar.css('visibility', 'visible');\n Aria.unhide(pagingBar);\n };\n\n /**\n * Hide the paging bar.\n *\n * @param {object} root The root element for the courses view.\n */\n var hidePagingBar = function(root) {\n var pagingBar = root.find(SELECTORS.PAGING_BAR);\n pagingBar.css('opacity', 0);\n pagingBar.css('visibility', 'hidden');\n Aria.hide(pagingBar);\n };\n\n /**\n * Show the favourite indicator for the given course (if it's in the list).\n *\n * @param {object} root The root element for the courses view.\n * @param {number} courseId The id of the course to be favourited.\n */\n var favouriteCourse = function(root, courseId) {\n allCourses.forEach(function(course) {\n if (course.attr('data-course-id') == courseId) {\n course.find(SELECTORS.COURSE_IS_FAVOURITE).removeClass('hidden');\n }\n });\n };\n\n /**\n * Hide the favourite indicator for the given course (if it's in the list).\n *\n * @param {object} root The root element for the courses view.\n * @param {number} courseId The id of the course to be unfavourited.\n */\n var unfavouriteCourse = function(root, courseId) {\n allCourses.forEach(function(course) {\n if (course.attr('data-course-id') == courseId) {\n course.find(SELECTORS.COURSE_IS_FAVOURITE).addClass('hidden');\n }\n });\n };\n\n /**\n * Render the a list of courses.\n *\n * @param {array} courses containing array of courses.\n * @return {promise} Resolved with list of rendered courses as jQuery objects.\n */\n var renderAllCourses = function(courses) {\n var showcoursecategory = $(SELECTORS.BLOCK_CONTAINER).data('displaycoursecategory');\n var promises = courses.map(function(course) {\n course.showcoursecategory = showcoursecategory;\n return Templates.render('block_recentlyaccessedcourses/course-card', course);\n });\n\n return $.when.apply(null, promises).then(function() {\n var renderedCourses = [];\n\n promises.forEach(function(promise) {\n promise.then(function(html) {\n renderedCourses.push($(html));\n return;\n })\n .catch(Notification.exception);\n });\n\n return renderedCourses;\n });\n };\n\n /**\n * Fetch user's recently accessed courses and reload the content of the block.\n *\n * @param {int} userid User whose courses will be shown\n * @returns {promise} The updated content for the block.\n */\n var loadContent = function(userid) {\n return CoursesRepository.getLastAccessedCourses(userid, NUM_COURSES_TOTAL)\n .then(function(courses) {\n return renderAllCourses(courses);\n });\n };\n\n /**\n * Recalculate the number of courses that should be visible.\n *\n * @param {object} root The root element for the courses view.\n */\n var recalculateVisibleCourses = function(root) {\n var container = root.find(SELECTORS.CONTENT).find(SELECTORS.CARD_CONTAINER);\n var availableWidth = parseFloat(root.css('width'));\n var numberOfCourses = allCourses.length;\n var start = 0;\n\n if (!cardWidth) {\n container.html(allCourses[0]);\n // Render one card initially to calculate the width of the cards\n // including the margins.\n cardWidth = allCourses[0].outerWidth(true);\n }\n\n availableVisibleCards = Math.floor(availableWidth / cardWidth);\n\n if (viewIndex + availableVisibleCards < numberOfCourses) {\n start = viewIndex;\n } else {\n var overflow = (viewIndex + availableVisibleCards) - numberOfCourses;\n start = viewIndex - overflow;\n start = start >= 0 ? start : 0;\n }\n\n // At least show one card.\n if (availableVisibleCards === 0) {\n availableVisibleCards = 1;\n }\n\n var coursesToShow = allCourses.slice(start, start + availableVisibleCards);\n // Create an id for the list of courses we expect to be displayed.\n var newVisibleCoursesId = coursesToShow.reduce(function(carry, course) {\n return carry + course.attr('data-course-id');\n }, '');\n\n // Centre the courses if we have an overflow of courses.\n if (allCourses.length > coursesToShow.length) {\n container.addClass('justify-content-center');\n container.removeClass('justify-content-start');\n } else {\n container.removeClass('justify-content-center');\n container.addClass('justify-content-start');\n }\n\n // Don't bother updating the DOM unless the visible courses have changed.\n if (visibleCoursesId != newVisibleCoursesId) {\n var pagingBar = root.find(PagedContentPagingBar.rootSelector);\n container.html(coursesToShow);\n visibleCoursesId = newVisibleCoursesId;\n\n if (availableVisibleCards >= allCourses.length) {\n hidePagingBar(root);\n } else {\n showPagingBar(root);\n\n if (viewIndex === 0) {\n PagedContentPagingBar.disablePreviousControlButtons(pagingBar);\n } else {\n PagedContentPagingBar.enablePreviousControlButtons(pagingBar);\n }\n\n if (viewIndex + availableVisibleCards >= allCourses.length) {\n PagedContentPagingBar.disableNextControlButtons(pagingBar);\n } else {\n PagedContentPagingBar.enableNextControlButtons(pagingBar);\n }\n }\n }\n };\n\n /**\n * Register event listeners for the block.\n *\n * @param {object} root The root element for the recentlyaccessedcourses block.\n */\n var registerEventListeners = function(root) {\n var resizeTimeout = null;\n var drawerToggling = false;\n\n PubSub.subscribe(CourseEvents.favourited, function(courseId) {\n favouriteCourse(root, courseId);\n });\n\n PubSub.subscribe(CourseEvents.unfavorited, function(courseId) {\n unfavouriteCourse(root, courseId);\n });\n\n PubSub.subscribe('nav-drawer-toggle-start', function() {\n if (!contentLoaded || !allCourses.length || drawerToggling) {\n // Nothing to recalculate.\n return;\n }\n\n drawerToggling = true;\n var recalculationCount = 0;\n // This function is going to recalculate the number of courses while\n // the nav drawer is opening or closes (up to a maximum of 5 recalcs).\n var doRecalculation = function() {\n setTimeout(function() {\n recalculateVisibleCourses(root);\n recalculationCount++;\n\n if (recalculationCount < 5 && drawerToggling) {\n // If we haven't done too many recalculations and the drawer\n // is still toggling then recurse.\n doRecalculation();\n }\n }, 100);\n };\n\n // Start the recalculations.\n doRecalculation(root);\n });\n\n PubSub.subscribe('nav-drawer-toggle-end', function() {\n drawerToggling = false;\n });\n\n $(window).on('resize', function() {\n if (!contentLoaded || !allCourses.length) {\n // Nothing to reclculate.\n return;\n }\n\n // Resize events fire rapidly so recalculating the visible courses each\n // time can be expensive. Let's debounce them,\n if (!resizeTimeout) {\n resizeTimeout = setTimeout(function() {\n resizeTimeout = null;\n recalculateVisibleCourses(root);\n // The recalculateVisibleCourses function will execute at a rate of 15fps.\n }, 66);\n }\n });\n\n CustomEvents.define(root, [CustomEvents.events.activate]);\n root.on(CustomEvents.events.activate, SELECTORS.PAGING_BAR_NEXT, function(e, data) {\n var button = $(e.target).closest(SELECTORS.PAGING_BAR_NEXT);\n if (!button.hasClass('disabled')) {\n viewIndex = viewIndex + availableVisibleCards;\n recalculateVisibleCourses(root);\n }\n\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.PAGING_BAR_PREVIOUS, function(e, data) {\n var button = $(e.target).closest(SELECTORS.PAGING_BAR_PREVIOUS);\n if (!button.hasClass('disabled')) {\n viewIndex = viewIndex - availableVisibleCards;\n viewIndex = viewIndex < 0 ? 0 : viewIndex;\n recalculateVisibleCourses(root);\n }\n\n data.originalEvent.preventDefault();\n });\n };\n\n /**\n * Get and show the recent courses into the block.\n *\n * @param {int} userid User from which the courses will be obtained\n * @param {object} root The root element for the recentlyaccessedcourses block.\n */\n var init = function(userid, root) {\n root = $(root);\n\n registerEventListeners(root);\n loadContent(userid)\n .then(function(renderedCourses) {\n allCourses = renderedCourses;\n contentLoaded = true;\n\n if (allCourses.length) {\n showContent(root);\n recalculateVisibleCourses(root);\n } else {\n showEmptyMessage(root);\n }\n\n return;\n })\n .catch(Notification.exception);\n };\n\n return {\n init: init\n };\n });\n"],"names":["define","$","CustomEvents","Notification","PubSub","PagedContentPagingBar","Templates","CourseEvents","CoursesRepository","Aria","NUM_COURSES_TOTAL","SELECTORS","contentLoaded","allCourses","visibleCoursesId","cardWidth","viewIndex","availableVisibleCards","loadContent","userid","getLastAccessedCourses","then","courses","renderAllCourses","showcoursecategory","data","promises","map","course","render","when","apply","renderedCourses","forEach","promise","html","push","catch","exception","recalculateVisibleCourses","root","container","find","availableWidth","parseFloat","css","numberOfCourses","length","start","outerWidth","Math","floor","coursesToShow","slice","newVisibleCoursesId","reduce","carry","attr","addClass","removeClass","pagingBar","rootSelector","hide","hidePagingBar","unhide","showPagingBar","disablePreviousControlButtons","enablePreviousControlButtons","disableNextControlButtons","enableNextControlButtons","registerEventListeners","resizeTimeout","drawerToggling","subscribe","favourited","courseId","favouriteCourse","unfavorited","unfavouriteCourse","recalculationCount","doRecalculation","setTimeout","window","on","events","activate","e","target","closest","hasClass","originalEvent","preventDefault","init","showContent","showEmptyMessage"],"mappings":"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"} \ No newline at end of file diff --git a/blocks/recentlyaccesseditems/amd/build/main.min.js.map b/blocks/recentlyaccesseditems/amd/build/main.min.js.map index dd50ff751b2..09acfac58af 100644 --- a/blocks/recentlyaccesseditems/amd/build/main.min.js.map +++ b/blocks/recentlyaccesseditems/amd/build/main.min.js.map @@ -1 +1 @@ -{"version":3,"file":"main.min.js","sources":["../src/main.js"],"sourcesContent":["\n// 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 * Javascript to initialise the Recently accessed items block.\n *\n * @module block_recentlyaccesseditems/main\n * @copyright 2018 Victor Deniz \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n [\n 'jquery',\n 'block_recentlyaccesseditems/repository',\n 'core/templates',\n 'core/notification'\n ],\n function(\n $,\n Repository,\n Templates,\n Notification\n ) {\n\n var NUM_ITEMS = 9;\n\n var SELECTORS = {\n CARDDECK_CONTAINER: '[data-region=\"recentlyaccesseditems-view\"]',\n CARDDECK: '[data-region=\"recentlyaccesseditems-view-content\"]',\n };\n\n /**\n * Get recent items from backend.\n *\n * @method getRecentItems\n * @param {int} limit Only return this many results\n * @return {array} Items user most recently has accessed\n */\n var getRecentItems = function(limit) {\n return Repository.getRecentItems(limit);\n };\n\n /**\n * Render the block content.\n *\n * @method renderItems\n * @param {object} root The root element for the items view.\n * @param {array} items containing array of returned items.\n * @return {promise} Resolved with HTML and JS strings\n */\n var renderItems = function(root, items) {\n if (items.length > 0) {\n return Templates.render('block_recentlyaccesseditems/view-cards', {\n items: items\n });\n } else {\n var noitemsimgurl = root.attr('data-noitemsimgurl');\n return Templates.render('block_recentlyaccesseditems/no-items', {\n noitemsimgurl: noitemsimgurl\n });\n }\n };\n\n /**\n * Get and show the recent items into the block.\n *\n * @param {object} root The root element for the items block.\n */\n var init = function(root) {\n root = $(root);\n\n var itemsContainer = root.find(SELECTORS.CARDDECK_CONTAINER);\n var itemsContent = root.find(SELECTORS.CARDDECK);\n\n var itemsPromise = getRecentItems(NUM_ITEMS);\n\n itemsPromise.then(function(items) {\n var pageContentPromise = renderItems(itemsContainer, items);\n\n pageContentPromise.then(function(html, js) {\n return Templates.replaceNodeContents(itemsContent, html, js);\n }).catch(Notification.exception);\n return itemsPromise;\n }).catch(Notification.exception);\n };\n\n return {\n init: init\n };\n });"],"names":["define","$","Repository","Templates","Notification","SELECTORS","init","root","limit","itemsContainer","find","itemsContent","itemsPromise","getRecentItems","then","items","pageContentPromise","length","render","noitemsimgurl","attr","renderItems","html","js","replaceNodeContents","catch","exception"],"mappings":";;;;;;;AAwBAA,0CACI,CACI,SACA,yCACA,iBACA,sBAEJ,SACIC,EACAC,WACAC,UACAC,kBAKIC,6BACoB,6CADpBA,mBAEU,2DA0DP,CACHC,KAnBO,SAASC,UA9BUC,MAiCtBC,gBAFJF,KAAON,EAAEM,OAEiBG,KAAKL,8BAC3BM,aAAeJ,KAAKG,KAAKL,oBAEzBO,cApCsBJ,MAdd,EAeLN,WAAWW,eAAeL,QAqCjCI,aAAaE,MAAK,SAASC,WACnBC,mBA3BM,SAAST,KAAMQ,UACzBA,MAAME,OAAS,SACRd,UAAUe,OAAO,yCAA0C,CAC9DH,MAAOA,YAGPI,cAAgBZ,KAAKa,KAAK,6BACvBjB,UAAUe,OAAO,uCAAwC,CAC5DC,cAAeA,gBAmBME,CAAYZ,eAAgBM,cAErDC,mBAAmBF,MAAK,SAASQ,KAAMC,WAC5BpB,UAAUqB,oBAAoBb,aAAcW,KAAMC,OAC1DE,MAAMrB,aAAasB,WACfd,gBACRa,MAAMrB,aAAasB"} \ No newline at end of file +{"version":3,"file":"main.min.js","sources":["../src/main.js"],"sourcesContent":["\n// 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 * Javascript to initialise the Recently accessed items block.\n *\n * @module block_recentlyaccesseditems/main\n * @copyright 2018 Victor Deniz \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n [\n 'jquery',\n 'block_recentlyaccesseditems/repository',\n 'core/templates',\n 'core/notification'\n ],\n function(\n $,\n Repository,\n Templates,\n Notification\n ) {\n\n var NUM_ITEMS = 9;\n\n var SELECTORS = {\n CARDDECK_CONTAINER: '[data-region=\"recentlyaccesseditems-view\"]',\n CARDDECK: '[data-region=\"recentlyaccesseditems-view-content\"]',\n };\n\n /**\n * Get recent items from backend.\n *\n * @method getRecentItems\n * @param {int} limit Only return this many results\n * @return {array} Items user most recently has accessed\n */\n var getRecentItems = function(limit) {\n return Repository.getRecentItems(limit);\n };\n\n /**\n * Render the block content.\n *\n * @method renderItems\n * @param {object} root The root element for the items view.\n * @param {array} items containing array of returned items.\n * @return {promise} Resolved with HTML and JS strings\n */\n var renderItems = function(root, items) {\n if (items.length > 0) {\n return Templates.render('block_recentlyaccesseditems/view-cards', {\n items: items\n });\n } else {\n var noitemsimgurl = root.attr('data-noitemsimgurl');\n return Templates.render('block_recentlyaccesseditems/no-items', {\n noitemsimgurl: noitemsimgurl\n });\n }\n };\n\n /**\n * Get and show the recent items into the block.\n *\n * @param {object} root The root element for the items block.\n */\n var init = function(root) {\n root = $(root);\n\n var itemsContainer = root.find(SELECTORS.CARDDECK_CONTAINER);\n var itemsContent = root.find(SELECTORS.CARDDECK);\n\n var itemsPromise = getRecentItems(NUM_ITEMS);\n\n itemsPromise.then(function(items) {\n var pageContentPromise = renderItems(itemsContainer, items);\n\n pageContentPromise.then(function(html, js) {\n return Templates.replaceNodeContents(itemsContent, html, js);\n }).catch(Notification.exception);\n return itemsPromise;\n }).catch(Notification.exception);\n };\n\n return {\n init: init\n };\n });"],"names":["define","$","Repository","Templates","Notification","NUM_ITEMS","SELECTORS","init","root","itemsContainer","limit","find","itemsContent","itemsPromise","getRecentItems","then","items","pageContentPromise","length","render","noitemsimgurl","attr","renderItems","html","js","replaceNodeContents","catch","exception"],"mappings":";;;;;;;AAwBAA,0CACI,CACI,SACA,yCACA,iBACA,sBAEJ,SACIC,EACAC,WACAC,UACAC,cAGIC,IAEAC,6BACoB,6CADpBA,mBAEU,qDA0DP,MAAA,CACHC,KAnBO,SAASC,MAGZC,IAjCsBC,MAiCtBD,gBAFJD,KAAOP,EAAEO,OAEiBG,KAAKL,8BAC3BM,aAAeJ,KAAKG,KAAKL,oBAEzBO,cApCsBH,MAdd,EAeLR,WAAWY,eAAeJ,QAqCjCG,aAAaE,MAAK,SAASC,OACvB,IAAIC,mBA3BM,SAAST,KAAMQ,OAC7B,GAAIA,MAAME,OAAS,EACf,OAAOf,UAAUgB,OAAO,yCAA0C,CAC9DH,MAAOA,QAGX,IAAII,cAAgBZ,KAAKa,KAAK,sBAC9B,OAAOlB,UAAUgB,OAAO,uCAAwC,CAC5DC,cAAeA,eAG1B,CAgBgCE,CAAYb,eAAgBO,OAKrD,OAHAC,mBAAmBF,MAAK,SAASQ,KAAMC,IAC5BrB,OAAAA,UAAUsB,oBAAoBb,aAAcW,KAAMC,GAD7D,IAEGE,MAAMtB,aAAauB,WACfd,YANX,IAOGa,MAAMtB,aAAauB,UACzB,EAKJ"} \ No newline at end of file diff --git a/blocks/recentlyaccesseditems/amd/build/repository.min.js.map b/blocks/recentlyaccesseditems/amd/build/repository.min.js.map index 07ca64dd574..97113d38494 100644 --- a/blocks/recentlyaccesseditems/amd/build/repository.min.js.map +++ b/blocks/recentlyaccesseditems/amd/build/repository.min.js.map @@ -1 +1 @@ -{"version":3,"file":"repository.min.js","sources":["../src/repository.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 javascript module to handle user ajax actions.\n *\n * @module block_recentlyaccesseditems/repository\n * @copyright 2018 Victor Deniz \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/ajax'], function(Ajax) {\n\n /**\n * Get the list of items that the user has most recently accessed.\n *\n * @method getRecentItems\n * @param {int} limit Only return this many results\n * @return {promise} Resolved with an array of items\n */\n var getRecentItems = function(limit) {\n var args = {};\n if (typeof limit !== 'undefined') {\n args.limit = limit;\n }\n var request = {\n methodname: 'block_recentlyaccesseditems_get_recent_items',\n args: args\n };\n return Ajax.call([request])[0];\n };\n return {\n getRecentItems: getRecentItems\n };\n});"],"names":["define","Ajax","getRecentItems","limit","args","request","methodname","call"],"mappings":";;;;;;;AAsBAA,gDAAO,CAAC,cAAc,SAASC,YAoBpB,CACHC,eAZiB,SAASC,WACtBC,KAAO,QACU,IAAVD,QACPC,KAAKD,MAAQA,WAEbE,QAAU,CACVC,WAAY,+CACZF,KAAMA,aAEHH,KAAKM,KAAK,CAACF,UAAU"} \ No newline at end of file +{"version":3,"file":"repository.min.js","sources":["../src/repository.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 javascript module to handle user ajax actions.\n *\n * @module block_recentlyaccesseditems/repository\n * @copyright 2018 Victor Deniz \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/ajax'], function(Ajax) {\n\n /**\n * Get the list of items that the user has most recently accessed.\n *\n * @method getRecentItems\n * @param {int} limit Only return this many results\n * @return {promise} Resolved with an array of items\n */\n var getRecentItems = function(limit) {\n var args = {};\n if (typeof limit !== 'undefined') {\n args.limit = limit;\n }\n var request = {\n methodname: 'block_recentlyaccesseditems_get_recent_items',\n args: args\n };\n return Ajax.call([request])[0];\n };\n return {\n getRecentItems: getRecentItems\n };\n});"],"names":["define","Ajax","getRecentItems","limit","args","request","methodname","call"],"mappings":";;;;;;;AAsBAA,gDAAO,CAAC,cAAc,SAASC,MAoBpB,MAAA,CACHC,eAZiB,SAASC,OACtBC,IAAAA,KAAO,CAAA,OACU,IAAVD,QACPC,KAAKD,MAAQA,OAEjB,IAAIE,QAAU,CACVC,WAAY,+CACZF,KAAMA,MAEHH,OAAAA,KAAKM,KAAK,CAACF,UAAU,EAC/B,EAIJ"} \ No newline at end of file diff --git a/blocks/settings/amd/build/settingsblock.min.js.map b/blocks/settings/amd/build/settingsblock.min.js.map index b8dbcc561c5..95dd5140439 100644 --- a/blocks/settings/amd/build/settingsblock.min.js.map +++ b/blocks/settings/amd/build/settingsblock.min.js.map @@ -1 +1 @@ -{"version":3,"file":"settingsblock.min.js","sources":["../src/settingsblock.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 * Load the settings block tree javscript\n *\n * @module block_settings/settingsblock\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/tree'], function($, Tree) {\n return {\n init: function(instanceid, siteAdminNodeId) {\n var adminTree = new Tree(\".block_settings .block_tree\");\n if (siteAdminNodeId) {\n var siteAdminNode = adminTree.treeRoot.find('#' + siteAdminNodeId);\n var siteAdminLink = siteAdminNode.children('a').first();\n siteAdminLink.replaceWith('' + siteAdminLink.html() + '');\n }\n adminTree.finishExpandingGroup = function(item) {\n Tree.prototype.finishExpandingGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n adminTree.collapseGroup = function(item) {\n Tree.prototype.collapseGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n }\n };\n});\n"],"names":["define","$","Tree","init","instanceid","siteAdminNodeId","adminTree","siteAdminLink","treeRoot","find","children","first","replaceWith","html","finishExpandingGroup","item","prototype","call","this","Y","use","Global","fire","M","core","globalEvents","BLOCK_CONTENT_UPDATED","collapseGroup"],"mappings":";;;;;;;AAsBAA,sCAAO,CAAC,SAAU,cAAc,SAASC,EAAGC,YACjC,CACHC,KAAM,SAASC,WAAYC,qBACnBC,UAAY,IAAIJ,KAAK,kCACrBG,gBAAiB,KAEbE,cADgBD,UAAUE,SAASC,KAAK,IAAMJ,iBAChBK,SAAS,KAAKC,QAChDJ,cAAcK,YAAY,sBAAwBL,cAAcM,OAAS,WAE7EP,UAAUQ,qBAAuB,SAASC,MACtCb,KAAKc,UAAUF,qBAAqBG,KAAKC,KAAMH,MAC/CI,EAAEC,IAAI,qBAAqB,WACvBD,EAAEE,OAAOC,KAAKC,EAAEC,KAAKC,aAAaC,sBAAuB,CACrDtB,WAAYA,iBAIxBE,UAAUqB,cAAgB,SAASZ,MAC/Bb,KAAKc,UAAUW,cAAcV,KAAKC,KAAMH,MACxCI,EAAEC,IAAI,qBAAqB,WACvBD,EAAEE,OAAOC,KAAKC,EAAEC,KAAKC,aAAaC,sBAAuB,CACrDtB,WAAYA"} \ No newline at end of file +{"version":3,"file":"settingsblock.min.js","sources":["../src/settingsblock.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 * Load the settings block tree javscript\n *\n * @module block_settings/settingsblock\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/tree'], function($, Tree) {\n return {\n init: function(instanceid, siteAdminNodeId) {\n var adminTree = new Tree(\".block_settings .block_tree\");\n if (siteAdminNodeId) {\n var siteAdminNode = adminTree.treeRoot.find('#' + siteAdminNodeId);\n var siteAdminLink = siteAdminNode.children('a').first();\n siteAdminLink.replaceWith('' + siteAdminLink.html() + '');\n }\n adminTree.finishExpandingGroup = function(item) {\n Tree.prototype.finishExpandingGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n adminTree.collapseGroup = function(item) {\n Tree.prototype.collapseGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n }\n };\n});\n"],"names":["define","$","Tree","init","instanceid","siteAdminNodeId","adminTree","siteAdminNode","siteAdminLink","treeRoot","find","children","first","replaceWith","html","finishExpandingGroup","item","prototype","call","this","Y","use","Global","fire","M","core","globalEvents","BLOCK_CONTENT_UPDATED","collapseGroup"],"mappings":";;;;;;;AAsBAA,OAAM,+BAAC,CAAC,SAAU,cAAc,SAASC,EAAGC,MACjC,MAAA,CACHC,KAAM,SAASC,WAAYC,iBACvB,IAAIC,UAAY,IAAIJ,KAAK,+BACzB,GAAIG,gBAAiB,CACbE,IACAC,cADgBF,UAAUG,SAASC,KAAK,IAAML,iBAChBM,SAAS,KAAKC,QAChDJ,cAAcK,YAAY,sBAAwBL,cAAcM,OAAS,UAC5E,CACDR,UAAUS,qBAAuB,SAASC,MACtCd,KAAKe,UAAUF,qBAAqBG,KAAKC,KAAMH,MAC/CI,EAAEC,IAAI,qBAAqB,WACvBD,EAAEE,OAAOC,KAAKC,EAAEC,KAAKC,aAAaC,sBAAuB,CACrDvB,WAAYA,YAEnB,GACJ,EACDE,UAAUsB,cAAgB,SAASZ,MAC/Bd,KAAKe,UAAUW,cAAcV,KAAKC,KAAMH,MACxCI,EAAEC,IAAI,qBAAqB,WACvBD,EAAEE,OAAOC,KAAKC,EAAEC,KAAKC,aAAaC,sBAAuB,CACrDvB,WAAYA,YAEnB,GACJ,CACJ,EAER"} \ No newline at end of file diff --git a/blocks/starredcourses/amd/build/main.min.js.map b/blocks/starredcourses/amd/build/main.min.js.map index 6f4db1059de..b399b9036ac 100644 --- a/blocks/starredcourses/amd/build/main.min.js.map +++ b/blocks/starredcourses/amd/build/main.min.js.map @@ -1 +1 @@ -{"version":3,"file":"main.min.js","sources":["../src/main.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 * Javascript to initialise the starred courses block.\n *\n * @module block_starredcourses/main\n * @copyright 2018 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/notification',\n 'block_starredcourses/repository',\n 'core/pubsub',\n 'core/templates',\n 'core_course/events'\n],\nfunction(\n $,\n Notification,\n Repository,\n PubSub,\n Templates,\n CourseEvents\n) {\n\n var SELECTORS = {\n BLOCK_CONTAINER: '[data-region=\"starred-courses\"]',\n STARRED_COURSES_REGION_VIEW: '[data-region=\"starred-courses-view\"]',\n STARRED_COURSES_REGION: '[data-region=\"starred-courses-view-content\"]'\n };\n\n /**\n * Render the starred courses.\n *\n * @method renderCourses\n * @param {object} root The root element for the starred view.\n * @param {array} courses containing array of returned courses.\n * @returns {promise} Resolved with HTML and JS strings\n */\n var renderCourses = function(root, courses) {\n if (courses.length > 0) {\n return Templates.render('core_course/view-cards', {\n courses: courses\n });\n } else {\n var nocoursesimg = root.find(SELECTORS.STARRED_COURSES_REGION_VIEW).attr('data-nocoursesimg');\n return Templates.render('block_starredcourses/no-courses', {\n nocoursesimg: nocoursesimg\n });\n }\n };\n\n /**\n * Fetch user's starred courses and reload the content of the block.\n *\n * @param {object} root The root element for the starred view.\n * @returns {promise} The updated content for the block.\n */\n var reloadContent = function(root) {\n var content = root.find(SELECTORS.STARRED_COURSES_REGION);\n\n var args = {\n limit: 0,\n offset: 0,\n };\n\n return Repository.getStarredCourses(args)\n .then(function(courses) {\n // Whether the course category should be displayed in the course item.\n var showcoursecategory = $(SELECTORS.BLOCK_CONTAINER).data('displaycoursecategory');\n courses = courses.map(function(course) {\n course.showcoursecategory = showcoursecategory;\n return course;\n });\n return renderCourses(root, courses);\n }).then(function(html, js) {\n return Templates.replaceNodeContents(content, html, js);\n }).catch(Notification.exception);\n };\n\n /**\n * Register event listeners for the block.\n *\n * @param {object} root The calendar root element\n */\n var registerEventListeners = function(root) {\n PubSub.subscribe(CourseEvents.favourited, function() {\n reloadContent(root);\n });\n\n PubSub.subscribe(CourseEvents.unfavorited, function() {\n reloadContent(root);\n });\n };\n\n /**\n * Initialise all of the modules for the starred courses block.\n *\n * @param {object} root The root element for the block.\n */\n var init = function(root) {\n root = $(root);\n\n registerEventListeners(root);\n reloadContent(root);\n };\n\n return {\n init: init\n };\n});\n"],"names":["define","$","Notification","Repository","PubSub","Templates","CourseEvents","SELECTORS","reloadContent","root","content","find","getStarredCourses","limit","offset","then","courses","showcoursecategory","data","map","course","length","render","nocoursesimg","attr","renderCourses","html","js","replaceNodeContents","catch","exception","init","subscribe","favourited","unfavorited","registerEventListeners"],"mappings":";;;;;;;AAuBAA,mCACA,CACI,SACA,oBACA,kCACA,cACA,iBACA,uBAEJ,SACIC,EACAC,aACAC,WACAC,OACAC,UACAC,kBAGIC,0BACiB,kCADjBA,sCAE6B,uCAF7BA,iCAGwB,+CA8BxBC,cAAgB,SAASC,UACrBC,QAAUD,KAAKE,KAAKJ,yCAOjBJ,WAAWS,kBALP,CACPC,MAAO,EACPC,OAAQ,IAIPC,MAAK,SAASC,aAEPC,mBAAqBhB,EAAEM,2BAA2BW,KAAK,gCAC3DF,QAAUA,QAAQG,KAAI,SAASC,eAC3BA,OAAOH,mBAAqBA,mBACrBG,UAjCH,SAASX,KAAMO,YAC3BA,QAAQK,OAAS,SACVhB,UAAUiB,OAAO,yBAA0B,CAC9CN,QAASA,cAGTO,aAAed,KAAKE,KAAKJ,uCAAuCiB,KAAK,4BAClEnB,UAAUiB,OAAO,kCAAmC,CACvDC,aAAcA,eA2BPE,CAAchB,KAAMO,YAC5BD,MAAK,SAASW,KAAMC,WACZtB,UAAUuB,oBAAoBlB,QAASgB,KAAMC,OACrDE,MAAM3B,aAAa4B,kBA8BvB,CACHC,KARO,SAAStB,OAfS,SAASA,MAClCL,OAAO4B,UAAU1B,aAAa2B,YAAY,WACtCzB,cAAcC,SAGlBL,OAAO4B,UAAU1B,aAAa4B,aAAa,WACvC1B,cAAcC,UAYlB0B,CAFA1B,KAAOR,EAAEQ,OAGTD,cAAcC"} \ No newline at end of file +{"version":3,"file":"main.min.js","sources":["../src/main.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 * Javascript to initialise the starred courses block.\n *\n * @module block_starredcourses/main\n * @copyright 2018 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/notification',\n 'block_starredcourses/repository',\n 'core/pubsub',\n 'core/templates',\n 'core_course/events'\n],\nfunction(\n $,\n Notification,\n Repository,\n PubSub,\n Templates,\n CourseEvents\n) {\n\n var SELECTORS = {\n BLOCK_CONTAINER: '[data-region=\"starred-courses\"]',\n STARRED_COURSES_REGION_VIEW: '[data-region=\"starred-courses-view\"]',\n STARRED_COURSES_REGION: '[data-region=\"starred-courses-view-content\"]'\n };\n\n /**\n * Render the starred courses.\n *\n * @method renderCourses\n * @param {object} root The root element for the starred view.\n * @param {array} courses containing array of returned courses.\n * @returns {promise} Resolved with HTML and JS strings\n */\n var renderCourses = function(root, courses) {\n if (courses.length > 0) {\n return Templates.render('core_course/view-cards', {\n courses: courses\n });\n } else {\n var nocoursesimg = root.find(SELECTORS.STARRED_COURSES_REGION_VIEW).attr('data-nocoursesimg');\n return Templates.render('block_starredcourses/no-courses', {\n nocoursesimg: nocoursesimg\n });\n }\n };\n\n /**\n * Fetch user's starred courses and reload the content of the block.\n *\n * @param {object} root The root element for the starred view.\n * @returns {promise} The updated content for the block.\n */\n var reloadContent = function(root) {\n var content = root.find(SELECTORS.STARRED_COURSES_REGION);\n\n var args = {\n limit: 0,\n offset: 0,\n };\n\n return Repository.getStarredCourses(args)\n .then(function(courses) {\n // Whether the course category should be displayed in the course item.\n var showcoursecategory = $(SELECTORS.BLOCK_CONTAINER).data('displaycoursecategory');\n courses = courses.map(function(course) {\n course.showcoursecategory = showcoursecategory;\n return course;\n });\n return renderCourses(root, courses);\n }).then(function(html, js) {\n return Templates.replaceNodeContents(content, html, js);\n }).catch(Notification.exception);\n };\n\n /**\n * Register event listeners for the block.\n *\n * @param {object} root The calendar root element\n */\n var registerEventListeners = function(root) {\n PubSub.subscribe(CourseEvents.favourited, function() {\n reloadContent(root);\n });\n\n PubSub.subscribe(CourseEvents.unfavorited, function() {\n reloadContent(root);\n });\n };\n\n /**\n * Initialise all of the modules for the starred courses block.\n *\n * @param {object} root The root element for the block.\n */\n var init = function(root) {\n root = $(root);\n\n registerEventListeners(root);\n reloadContent(root);\n };\n\n return {\n init: init\n };\n});\n"],"names":["define","$","Notification","Repository","PubSub","Templates","CourseEvents","SELECTORS","reloadContent","root","content","find","getStarredCourses","limit","offset","then","courses","showcoursecategory","data","map","course","length","render","nocoursesimg","attr","renderCourses","html","js","replaceNodeContents","catch","exception","init","subscribe","favourited","unfavorited","registerEventListeners"],"mappings":";;;;;;;AAuBAA,OAAM,4BACN,CACI,SACA,oBACA,kCACA,cACA,iBACA,uBAEJ,SACIC,EACAC,aACAC,WACAC,OACAC,UACAC,cAGA,IAAIC,0BACiB,kCADjBA,sCAE6B,uCAF7BA,iCAGwB,+CA8BxBC,cAAgB,SAASC,MACrBC,IAAAA,QAAUD,KAAKE,KAAKJ,kCAOjBJ,OAAAA,WAAWS,kBALP,CACPC,MAAO,EACPC,OAAQ,IAIPC,MAAK,SAASC,SAEX,IAAIC,mBAAqBhB,EAAEM,2BAA2BW,KAAK,yBAK3D,OAJAF,QAAUA,QAAQG,KAAI,SAASC,QAE3B,OADAA,OAAOH,mBAAqBA,mBACrBG,MACV,IAlCO,SAASX,KAAMO,SAC/B,GAAIA,QAAQK,OAAS,EACjB,OAAOhB,UAAUiB,OAAO,yBAA0B,CAC9CN,QAASA,UAGb,IAAIO,aAAed,KAAKE,KAAKJ,uCAAuCiB,KAAK,qBACzE,OAAOnB,UAAUiB,OAAO,kCAAmC,CACvDC,aAAcA,cAGzB,CAwBkBE,CAAchB,KAAMO,QAR5B,IASAD,MAAK,SAASW,KAAMC,IACZtB,OAAAA,UAAUuB,oBAAoBlB,QAASgB,KAAMC,GAVrD,IAWAE,MAAM3B,aAAa4B,UAC7B,EA6BM,MAAA,CACHC,KARO,SAAStB,OAfS,SAASA,MAClCL,OAAO4B,UAAU1B,aAAa2B,YAAY,WACtCzB,cAAcC,KACjB,IAEDL,OAAO4B,UAAU1B,aAAa4B,aAAa,WACvC1B,cAAcC,KACjB,GACJ,EAUG0B,CAFA1B,KAAOR,EAAEQ,OAGTD,cAAcC,KACjB,EAKJ"} \ No newline at end of file diff --git a/blocks/starredcourses/amd/build/repository.min.js.map b/blocks/starredcourses/amd/build/repository.min.js.map index e2d69161fdf..f7a11ca4efa 100644 --- a/blocks/starredcourses/amd/build/repository.min.js.map +++ b/blocks/starredcourses/amd/build/repository.min.js.map @@ -1 +1 @@ -{"version":3,"file":"repository.min.js","sources":["../src/repository.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 javascript module to retrieve user's starred courses.\n *\n * @module block_starredcourses/repository\n * @copyright 2018 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n /**\n * Retrieve a list of starred courses.\n *\n * Valid args are:\n * int limit number of records to retrieve\n * int offset the offset of records to retrieve\n *\n * @method getStarredCourses\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of courses\n */\n var getStarredCourses = function(args) {\n\n var request = {\n methodname: 'block_starredcourses_get_starred_courses',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n return {\n getStarredCourses: getStarredCourses\n };\n});\n"],"names":["define","$","Ajax","Notification","getStarredCourses","args","request","methodname","promise","call","fail","exception"],"mappings":";;;;;;;AAsBAA,yCAAO,CAAC,SAAU,YAAa,sBAAsB,SAASC,EAAGC,KAAMC,oBA2B5D,CACHC,kBAfoB,SAASC,UAEzBC,QAAU,CACVC,WAAY,2CACZF,KAAMA,MAGNG,QAAUN,KAAKO,KAAK,CAACH,UAAU,UAEnCE,QAAQE,KAAKP,aAAaQ,WAEnBH"} \ No newline at end of file +{"version":3,"file":"repository.min.js","sources":["../src/repository.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 javascript module to retrieve user's starred courses.\n *\n * @module block_starredcourses/repository\n * @copyright 2018 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n /**\n * Retrieve a list of starred courses.\n *\n * Valid args are:\n * int limit number of records to retrieve\n * int offset the offset of records to retrieve\n *\n * @method getStarredCourses\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of courses\n */\n var getStarredCourses = function(args) {\n\n var request = {\n methodname: 'block_starredcourses_get_starred_courses',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n return {\n getStarredCourses: getStarredCourses\n };\n});\n"],"names":["define","$","Ajax","Notification","getStarredCourses","args","request","methodname","promise","call","fail","exception"],"mappings":";;;;;;;AAsBAA,OAAO,kCAAA,CAAC,SAAU,YAAa,sBAAsB,SAASC,EAAGC,KAAMC,cA2B5D,MAAA,CACHC,kBAfoB,SAASC,MAE7B,IAAIC,QAAU,CACVC,WAAY,2CACZF,KAAMA,MAGNG,QAAUN,KAAKO,KAAK,CAACH,UAAU,GAInC,OAFAE,QAAQE,KAAKP,aAAaQ,WAEnBH,OACV,EAKJ"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/calendar_events_repository.min.js.map b/blocks/timeline/amd/build/calendar_events_repository.min.js.map index f8dfa0e612e..f33c2040326 100644 --- a/blocks/timeline/amd/build/calendar_events_repository.min.js.map +++ b/blocks/timeline/amd/build/calendar_events_repository.min.js.map @@ -1 +1 @@ -{"version":3,"file":"calendar_events_repository.min.js","sources":["../src/calendar_events_repository.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 javascript module to retrieve calendar events from the server.\n *\n * @module block_timeline/calendar_events_repository\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n var DEFAULT_LIMIT = 20;\n\n /**\n * Retrieve a list of calendar events for the logged in user for the\n * given course.\n *\n * Valid args are:\n * int courseid Only get events for this course\n * int starttime Only get events after this time\n * int endtime Only get events before this time\n * int limit Limit the number of results returned\n * int aftereventid Offset the result set from the given id\n *\n * @method queryByCourse\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of the calendar events\n */\n var queryByCourse = function(args) {\n if (!args.hasOwnProperty('limit')) {\n args.limit = DEFAULT_LIMIT;\n }\n\n args.limitnum = args.limit;\n delete args.limit;\n\n if (args.hasOwnProperty('starttime')) {\n args.timesortfrom = args.starttime;\n delete args.starttime;\n }\n\n if (args.hasOwnProperty('endtime')) {\n args.timesortto = args.endtime;\n delete args.endtime;\n }\n\n var request = {\n methodname: 'core_calendar_get_action_events_by_course',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n /**\n * Retrieve a list of calendar events for the given courses for the\n * logged in user.\n *\n * Valid args are:\n * array courseids Get events for these courses\n * int starttime Only get events after this time\n * int endtime Only get events before this time\n * int limit Limit the number of results returned\n *\n * @method queryByCourses\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of the calendar events\n */\n var queryByCourses = function(args) {\n if (!args.hasOwnProperty('limit')) {\n // This is intentionally smaller than the default limit.\n args.limit = 10;\n }\n\n args.limitnum = args.limit;\n delete args.limit;\n\n if (args.hasOwnProperty('starttime')) {\n args.timesortfrom = args.starttime;\n delete args.starttime;\n }\n\n if (args.hasOwnProperty('endtime')) {\n args.timesortto = args.endtime;\n delete args.endtime;\n }\n\n var request = {\n methodname: 'core_calendar_get_action_events_by_courses',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n /**\n * Retrieve a list of calendar events for the logged in user after the given\n * time.\n *\n * Valid args are:\n * int starttime Only get events after this time\n * int endtime Only get events before this time\n * int limit Limit the number of results returned\n * int aftereventid Offset the result set from the given id\n *\n * @method queryByTime\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of the calendar events\n */\n var queryByTime = function(args) {\n if (!args.hasOwnProperty('limit')) {\n args.limit = DEFAULT_LIMIT;\n }\n\n args.limitnum = args.limit;\n delete args.limit;\n\n if (args.hasOwnProperty('starttime')) {\n args.timesortfrom = args.starttime;\n delete args.starttime;\n }\n\n if (args.hasOwnProperty('endtime')) {\n args.timesortto = args.endtime;\n delete args.endtime;\n }\n // Don't show events related to courses that the user is suspended in.\n args.limittononsuspendedevents = true;\n\n var request = {\n methodname: 'core_calendar_get_action_events_by_timesort',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n return {\n queryByTime: queryByTime,\n queryByCourse: queryByCourse,\n queryByCourses: queryByCourses,\n };\n});\n"],"names":["define","$","Ajax","Notification","queryByTime","args","hasOwnProperty","limit","limitnum","timesortfrom","starttime","timesortto","endtime","limittononsuspendedevents","request","methodname","promise","call","fail","exception","queryByCourse","queryByCourses"],"mappings":";;;;;;;AAsBAA,mDAAO,CAAC,SAAU,YAAa,sBAAsB,SAASC,EAAGC,KAAMC,oBA4I5D,CACHC,YAjCc,SAASC,MAClBA,KAAKC,eAAe,WACrBD,KAAKE,MA5GO,IA+GhBF,KAAKG,SAAWH,KAAKE,aACdF,KAAKE,MAERF,KAAKC,eAAe,eACpBD,KAAKI,aAAeJ,KAAKK,iBAClBL,KAAKK,WAGZL,KAAKC,eAAe,aACpBD,KAAKM,WAAaN,KAAKO,eAChBP,KAAKO,SAGhBP,KAAKQ,2BAA4B,MAE7BC,QAAU,CACVC,WAAY,8CACZV,KAAMA,MAGNW,QAAUd,KAAKe,KAAK,CAACH,UAAU,UAEnCE,QAAQE,KAAKf,aAAagB,WAEnBH,SAKPI,cA3HgB,SAASf,MACpBA,KAAKC,eAAe,WACrBD,KAAKE,MAnBO,IAsBhBF,KAAKG,SAAWH,KAAKE,aACdF,KAAKE,MAERF,KAAKC,eAAe,eACpBD,KAAKI,aAAeJ,KAAKK,iBAClBL,KAAKK,WAGZL,KAAKC,eAAe,aACpBD,KAAKM,WAAaN,KAAKO,eAChBP,KAAKO,aAGZE,QAAU,CACVC,WAAY,4CACZV,KAAMA,MAGNW,QAAUd,KAAKe,KAAK,CAACH,UAAU,UAEnCE,QAAQE,KAAKf,aAAagB,WAEnBH,SAiGPK,eAhFiB,SAAShB,MACrBA,KAAKC,eAAe,WAErBD,KAAKE,MAAQ,IAGjBF,KAAKG,SAAWH,KAAKE,aACdF,KAAKE,MAERF,KAAKC,eAAe,eACpBD,KAAKI,aAAeJ,KAAKK,iBAClBL,KAAKK,WAGZL,KAAKC,eAAe,aACpBD,KAAKM,WAAaN,KAAKO,eAChBP,KAAKO,aAGZE,QAAU,CACVC,WAAY,6CACZV,KAAMA,MAGNW,QAAUd,KAAKe,KAAK,CAACH,UAAU,UAEnCE,QAAQE,KAAKf,aAAagB,WAEnBH"} \ No newline at end of file +{"version":3,"file":"calendar_events_repository.min.js","sources":["../src/calendar_events_repository.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 javascript module to retrieve calendar events from the server.\n *\n * @module block_timeline/calendar_events_repository\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n var DEFAULT_LIMIT = 20;\n\n /**\n * Retrieve a list of calendar events for the logged in user for the\n * given course.\n *\n * Valid args are:\n * int courseid Only get events for this course\n * int starttime Only get events after this time\n * int endtime Only get events before this time\n * int limit Limit the number of results returned\n * int aftereventid Offset the result set from the given id\n *\n * @method queryByCourse\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of the calendar events\n */\n var queryByCourse = function(args) {\n if (!args.hasOwnProperty('limit')) {\n args.limit = DEFAULT_LIMIT;\n }\n\n args.limitnum = args.limit;\n delete args.limit;\n\n if (args.hasOwnProperty('starttime')) {\n args.timesortfrom = args.starttime;\n delete args.starttime;\n }\n\n if (args.hasOwnProperty('endtime')) {\n args.timesortto = args.endtime;\n delete args.endtime;\n }\n\n var request = {\n methodname: 'core_calendar_get_action_events_by_course',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n /**\n * Retrieve a list of calendar events for the given courses for the\n * logged in user.\n *\n * Valid args are:\n * array courseids Get events for these courses\n * int starttime Only get events after this time\n * int endtime Only get events before this time\n * int limit Limit the number of results returned\n *\n * @method queryByCourses\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of the calendar events\n */\n var queryByCourses = function(args) {\n if (!args.hasOwnProperty('limit')) {\n // This is intentionally smaller than the default limit.\n args.limit = 10;\n }\n\n args.limitnum = args.limit;\n delete args.limit;\n\n if (args.hasOwnProperty('starttime')) {\n args.timesortfrom = args.starttime;\n delete args.starttime;\n }\n\n if (args.hasOwnProperty('endtime')) {\n args.timesortto = args.endtime;\n delete args.endtime;\n }\n\n var request = {\n methodname: 'core_calendar_get_action_events_by_courses',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n /**\n * Retrieve a list of calendar events for the logged in user after the given\n * time.\n *\n * Valid args are:\n * int starttime Only get events after this time\n * int endtime Only get events before this time\n * int limit Limit the number of results returned\n * int aftereventid Offset the result set from the given id\n *\n * @method queryByTime\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of the calendar events\n */\n var queryByTime = function(args) {\n if (!args.hasOwnProperty('limit')) {\n args.limit = DEFAULT_LIMIT;\n }\n\n args.limitnum = args.limit;\n delete args.limit;\n\n if (args.hasOwnProperty('starttime')) {\n args.timesortfrom = args.starttime;\n delete args.starttime;\n }\n\n if (args.hasOwnProperty('endtime')) {\n args.timesortto = args.endtime;\n delete args.endtime;\n }\n // Don't show events related to courses that the user is suspended in.\n args.limittononsuspendedevents = true;\n\n var request = {\n methodname: 'core_calendar_get_action_events_by_timesort',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n return {\n queryByTime: queryByTime,\n queryByCourse: queryByCourse,\n queryByCourses: queryByCourses,\n };\n});\n"],"names":["define","$","Ajax","Notification","queryByTime","args","hasOwnProperty","limit","limitnum","timesortfrom","starttime","timesortto","endtime","limittononsuspendedevents","request","methodname","promise","call","fail","exception","queryByCourse","queryByCourses"],"mappings":";;;;;;;AAsBAA,OAAO,4CAAA,CAAC,SAAU,YAAa,sBAAsB,SAASC,EAAGC,KAAMC,cA4I5D,MAAA,CACHC,YAjCc,SAASC,MAClBA,KAAKC,eAAe,WACrBD,KAAKE,MA5GO,IA+GhBF,KAAKG,SAAWH,KAAKE,aACdF,KAAKE,MAERF,KAAKC,eAAe,eACpBD,KAAKI,aAAeJ,KAAKK,iBAClBL,KAAKK,WAGZL,KAAKC,eAAe,aACpBD,KAAKM,WAAaN,KAAKO,eAChBP,KAAKO,SAGhBP,KAAKQ,2BAA4B,EAEjC,IAAIC,QAAU,CACVC,WAAY,8CACZV,KAAMA,MAGNW,QAAUd,KAAKe,KAAK,CAACH,UAAU,GAInC,OAFAE,QAAQE,KAAKf,aAAagB,WAEnBH,OACV,EAIGI,cA3HgB,SAASf,MACpBA,KAAKC,eAAe,WACrBD,KAAKE,MAnBO,IAsBhBF,KAAKG,SAAWH,KAAKE,aACdF,KAAKE,MAERF,KAAKC,eAAe,eACpBD,KAAKI,aAAeJ,KAAKK,iBAClBL,KAAKK,WAGZL,KAAKC,eAAe,aACpBD,KAAKM,WAAaN,KAAKO,eAChBP,KAAKO,SAGhB,IAAIE,QAAU,CACVC,WAAY,4CACZV,KAAMA,MAGNW,QAAUd,KAAKe,KAAK,CAACH,UAAU,GAInC,OAFAE,QAAQE,KAAKf,aAAagB,WAEnBH,OACV,EAgGGK,eAhFiB,SAAShB,MACrBA,KAAKC,eAAe,WAErBD,KAAKE,MAAQ,IAGjBF,KAAKG,SAAWH,KAAKE,aACdF,KAAKE,MAERF,KAAKC,eAAe,eACpBD,KAAKI,aAAeJ,KAAKK,iBAClBL,KAAKK,WAGZL,KAAKC,eAAe,aACpBD,KAAKM,WAAaN,KAAKO,eAChBP,KAAKO,SAGhB,IAAIE,QAAU,CACVC,WAAY,6CACZV,KAAMA,MAGNW,QAAUd,KAAKe,KAAK,CAACH,UAAU,GAInC,OAFAE,QAAQE,KAAKf,aAAagB,WAEnBH,OACV,EAqDJ"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/event_list.min.js.map b/blocks/timeline/amd/build/event_list.min.js.map index 51cd9b9c16d..f89a57a4441 100644 --- a/blocks/timeline/amd/build/event_list.min.js.map +++ b/blocks/timeline/amd/build/event_list.min.js.map @@ -1 +1 @@ -{"version":3,"file":"event_list.min.js","sources":["../src/event_list.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 * Javascript to load and render the list of calendar events for a\n * given day range.\n *\n * @module block_timeline/event_list\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'jquery',\n 'core/notification',\n 'core/templates',\n 'core/paged_content_factory',\n 'core/str',\n 'core/user_date',\n 'block_timeline/calendar_events_repository'\n],\nfunction(\n $,\n Notification,\n Templates,\n PagedContentFactory,\n Str,\n UserDate,\n CalendarEventsRepository\n) {\n\n var SECONDS_IN_DAY = 60 * 60 * 24;\n\n var SELECTORS = {\n EMPTY_MESSAGE: '[data-region=\"empty-message\"]',\n ROOT: '[data-region=\"event-list-container\"]',\n EVENT_LIST_CONTENT: '[data-region=\"event-list-content\"]',\n EVENT_LIST_LOADING_PLACEHOLDER: '[data-region=\"event-list-loading-placeholder\"]',\n };\n\n var TEMPLATES = {\n EVENT_LIST_CONTENT: 'block_timeline/event-list-content'\n };\n\n // We want the paged content controls below the paged content area\n // and the controls should be ignored while data is loading.\n var DEFAULT_PAGED_CONTENT_CONFIG = {\n ignoreControlWhileLoading: true,\n controlPlacementBottom: true,\n ariaLabels: {\n itemsperpagecomponents: 'ariaeventlistpagelimit, block_timeline',\n }\n };\n\n /**\n * Hide the content area and display the empty content message.\n *\n * @param {object} root The container element\n */\n var hideContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).addClass('hidden');\n root.find(SELECTORS.EMPTY_MESSAGE).removeClass('hidden');\n };\n\n /**\n * Show the content area and hide the empty content message.\n *\n * @param {object} root The container element\n */\n var showContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).removeClass('hidden');\n root.find(SELECTORS.EMPTY_MESSAGE).addClass('hidden');\n };\n\n /**\n * Empty the content area.\n *\n * @param {object} root The container element\n */\n var emptyContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).empty();\n };\n\n /**\n * Construct the template context from a list of calendar events. The events\n * are grouped by which day they are on. The day is calculated from the user's\n * midnight timestamp to ensure that the calculation is timezone agnostic.\n *\n * The return data structure will look like:\n * {\n * eventsbyday: [\n * {\n * dayTimestamp: 1533744000,\n * events: [\n * { ...event 1 data... },\n * { ...event 2 data... }\n * ]\n * },\n * {\n * dayTimestamp: 1533830400,\n * events: [\n * { ...event 3 data... },\n * { ...event 4 data... }\n * ]\n * }\n * ]\n * }\n *\n * Each day timestamp is the day's midnight in the user's timezone.\n *\n * @param {array} calendarEvents List of calendar events\n * @param {Number} midnight A timestamp representing midnight in the user's timezone\n * @return {object}\n */\n var buildTemplateContext = function(calendarEvents, midnight) {\n var eventsByDay = {};\n var templateContext = {\n eventsbyday: []\n };\n\n calendarEvents.forEach(function(calendarEvent) {\n var dayTimestamp = calendarEvent.timeusermidnight;\n if (eventsByDay[dayTimestamp]) {\n eventsByDay[dayTimestamp].push(calendarEvent);\n } else {\n eventsByDay[dayTimestamp] = [calendarEvent];\n }\n });\n\n Object.keys(eventsByDay).forEach(function(dayTimestamp) {\n var events = eventsByDay[dayTimestamp];\n templateContext.eventsbyday.push({\n past: dayTimestamp < midnight,\n dayTimestamp: dayTimestamp,\n events: events\n });\n });\n\n return templateContext;\n };\n\n /**\n * Render the HTML for the given calendar events.\n *\n * @param {array} calendarEvents A list of calendar events\n * @param {Number} midnight A timestamp representing midnight for the user\n * @return {promise} Resolved with HTML and JS strings.\n */\n var render = function(calendarEvents, midnight) {\n var templateContext = buildTemplateContext(calendarEvents, midnight);\n var templateName = TEMPLATES.EVENT_LIST_CONTENT;\n\n return Templates.render(templateName, templateContext);\n };\n\n /**\n * Retrieve a list of calendar events from the server for the given\n * constraints.\n *\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {Number} limit Limit the result set to this number of items\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @param {int|false} lastId The ID of the last seen event (if any)\n * @param {int|undefined} courseId Course ID to restrict events to\n * @return {Promise} A jquery promise\n */\n var load = function(midnight, limit, daysOffset, daysLimit, lastId, courseId) {\n var startTime = midnight + (daysOffset * SECONDS_IN_DAY);\n var endTime = daysLimit != undefined ? midnight + (daysLimit * SECONDS_IN_DAY) : false;\n\n var args = {\n starttime: startTime,\n limit: limit,\n };\n\n if (lastId) {\n args.aftereventid = lastId;\n }\n\n if (endTime) {\n args.endtime = endTime;\n }\n\n if (courseId) {\n // If we have a course id then we only want events from that course.\n args.courseid = courseId;\n return CalendarEventsRepository.queryByCourse(args);\n } else {\n // Otherwise we want events from any course.\n return CalendarEventsRepository.queryByTime(args);\n }\n };\n\n /**\n * Handle a single page request from the paged content. Uses the given page data to request\n * the events from the server.\n *\n * Checks the given preloadedPages before sending a request to the server to make sure we\n * don't load data unnecessarily.\n *\n * @param {object} pageData A single page data (see core/paged_content_pages for more info).\n * @param {object} actions Paged content actions (see core/paged_content_pages for more info).\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {object} lastIds The last event ID for each loaded page. Page number is key, id is value.\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {int|undefined} courseId Course ID to restrict events to\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @return {object} jQuery promise resolved with calendar events.\n */\n var loadEventsFromPageData = function(\n pageData,\n actions,\n midnight,\n lastIds,\n preloadedPages,\n courseId,\n daysOffset,\n daysLimit\n ) {\n var pageNumber = pageData.pageNumber;\n var limit = pageData.limit;\n var lastPageNumber = pageNumber;\n\n // This is here to protect us if, for some reason, the pages\n // are loaded out of order somehow and we don't have a reference\n // to the previous page. In that case, scan back to find the most\n // recent page we've seen.\n while (!lastIds.hasOwnProperty(lastPageNumber)) {\n lastPageNumber--;\n }\n // Use the last id of the most recent page.\n var lastId = lastIds[lastPageNumber];\n var eventsPromise = null;\n\n if (preloadedPages && preloadedPages.hasOwnProperty(pageNumber)) {\n // This page has been preloaded so use that rather than load the values\n // again.\n eventsPromise = preloadedPages[pageNumber];\n } else {\n // Load one more than the given limit so that we can tell if there\n // is more content to load after this.\n eventsPromise = load(midnight, limit + 1, daysOffset, daysLimit, lastId, courseId);\n }\n\n return eventsPromise.then(function(result) {\n if (!result.events.length) {\n // If we didn't get any events back then tell the paged content\n // that we're done loading.\n actions.allItemsLoaded(pageNumber);\n return [];\n }\n\n var calendarEvents = result.events.filter(function(event) {\n if (event.eventtype == \"open\" || event.eventtype == \"opensubmission\") {\n var dayTimestamp = UserDate.getUserMidnightForTimestamp(event.timesort, midnight);\n return dayTimestamp > midnight;\n }\n return true;\n });\n // We expect to receive limit + 1 events back from the server.\n // Any less means there are no more events to load.\n var loadedAll = calendarEvents.length <= limit;\n\n if (loadedAll) {\n // Tell the pagination that everything is loaded.\n actions.allItemsLoaded(pageNumber);\n } else {\n // Remove the last element from the array because it isn't\n // needed in this result set.\n calendarEvents.pop();\n }\n\n return calendarEvents;\n });\n };\n\n /**\n * Use the paged content factory to create a paged content element for showing\n * the event list. We only provide a page limit to the factory because we don't\n * know exactly how many pages we'll need. This creates a paging bar with just\n * next/previous buttons.\n *\n * This function specifies the callback for loading the event data that the user\n * is requesting.\n *\n * @param {int|array} pageLimit A single limit or list of limits as options for the paged content\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {object} firstLoad A jQuery promise to be resolved after the first set of data is loaded.\n * @param {int|undefined} courseId Course ID to restrict events to\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @param {string} paginationAriaLabel String to set as the aria label for the pagination bar.\n * @param {object} additionalConfig Additional config options to pass to pagedContentFactory\n * @return {object} jQuery promise.\n */\n var createPagedContent = function(\n pageLimit,\n preloadedPages,\n midnight,\n firstLoad,\n courseId,\n daysOffset,\n daysLimit,\n paginationAriaLabel,\n additionalConfig\n ) {\n // Remember the last event id we loaded on each page because we can't\n // use the offset value since the backend can skip events if the user doesn't\n // have the capability to see them. Instead we load the next page of events\n // based on the last seen event id.\n var lastIds = {'1': 0};\n var hasContent = false;\n var config = $.extend({}, DEFAULT_PAGED_CONTENT_CONFIG, additionalConfig);\n\n return Str.get_string(\n 'ariaeventlistpagelimit',\n 'block_timeline',\n $.isArray(pageLimit) ? pageLimit[0].value : pageLimit\n )\n .then(function(string) {\n config.ariaLabels.itemsperpage = string;\n config.ariaLabels.paginationnav = paginationAriaLabel;\n return string;\n })\n .then(function() {\n return PagedContentFactory.createWithLimit(\n pageLimit,\n function(pagesData, actions) {\n var promises = [];\n\n pagesData.forEach(function(pageData) {\n var pageNumber = pageData.pageNumber;\n // Load the page data.\n var pagePromise = loadEventsFromPageData(\n pageData,\n actions,\n midnight,\n lastIds,\n preloadedPages,\n courseId,\n daysOffset,\n daysLimit\n ).then(function(calendarEvents) {\n if (calendarEvents.length) {\n // Remember that we've loaded content.\n hasContent = true;\n // Remember the last id we've seen.\n var lastEventId = calendarEvents[calendarEvents.length - 1].id;\n // Record the id that the next page will need to start from.\n lastIds[pageNumber + 1] = lastEventId;\n // Get the HTML and JS for these calendar events.\n return render(calendarEvents, midnight);\n } else {\n return calendarEvents;\n }\n })\n .catch(Notification.exception);\n\n promises.push(pagePromise);\n });\n\n $.when.apply($, promises).then(function() {\n // Tell the calling code that the first page has been loaded\n // and whether it contains any content.\n firstLoad.resolve(hasContent);\n return;\n })\n .catch(function() {\n firstLoad.resolve(hasContent);\n });\n\n return promises;\n },\n config\n );\n });\n };\n\n /**\n * Create a paged content region for the calendar events in the given root element.\n * The content of the root element are replaced with a new paged content section\n * each time this function is called.\n *\n * This function will be called each time the offset or limit values are changed to\n * reload the event list region.\n *\n * @param {object} root The event list container element\n * @param {int|array} pageLimit A single limit or list of limits as options for the paged content\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {string} paginationAriaLabel String to set as the aria label for the pagination bar.\n * @param {object} additionalConfig Additional config options to pass to pagedContentFactory\n */\n var init = function(root, pageLimit, preloadedPages, paginationAriaLabel, additionalConfig) {\n root = $(root);\n\n // Create a promise that will be resolved once the first set of page\n // data has been loaded. This ensures that the loading placeholder isn't\n // hidden until we have all of the data back to prevent the page elements\n // jumping around.\n var firstLoad = $.Deferred();\n var eventListContent = root.find(SELECTORS.EVENT_LIST_CONTENT);\n var loadingPlaceholder = root.find(SELECTORS.EVENT_LIST_LOADING_PLACEHOLDER);\n var courseId = root.attr('data-course-id');\n var daysOffset = parseInt(root.attr('data-days-offset'), 10);\n var daysLimit = root.attr('data-days-limit');\n var midnight = parseInt(root.attr('data-midnight'), 10);\n\n // Make sure the content area and loading placeholder is visible.\n // This is because the init function can be called to re-initialise\n // an existing event list area.\n emptyContent(root);\n showContent(root);\n loadingPlaceholder.removeClass('hidden');\n\n // Days limit isn't mandatory.\n if (daysLimit != undefined) {\n daysLimit = parseInt(daysLimit, 10);\n }\n\n // Created the paged content element.\n return createPagedContent(pageLimit, preloadedPages, midnight, firstLoad, courseId, daysOffset, daysLimit,\n paginationAriaLabel, additionalConfig)\n .then(function(html, js) {\n html = $(html);\n // Hide the content for now.\n html.addClass('hidden');\n // Replace existing elements with the newly created paged content.\n // If we're reinitialising an existing event list this will replace\n // the old event list (including removing any event handlers).\n Templates.replaceNodeContents(eventListContent, html, js);\n\n firstLoad.then(function(hasContent) {\n // Prevent changing page elements too much by only showing the content\n // once we've loaded some data for the first time. This allows our\n // fancy loading placeholder to shine.\n html.removeClass('hidden');\n loadingPlaceholder.addClass('hidden');\n\n if (!hasContent) {\n // If we didn't get any data then show the empty data message.\n hideContent(root);\n }\n\n return hasContent;\n })\n .catch(function() {\n return false;\n });\n\n return html;\n })\n .catch(Notification.exception);\n };\n\n return {\n init: init,\n rootSelector: SELECTORS.ROOT,\n };\n});\n"],"names":["define","$","Notification","Templates","PagedContentFactory","Str","UserDate","CalendarEventsRepository","SELECTORS","TEMPLATES","DEFAULT_PAGED_CONTENT_CONFIG","ignoreControlWhileLoading","controlPlacementBottom","ariaLabels","itemsperpagecomponents","render","calendarEvents","midnight","templateContext","eventsByDay","eventsbyday","forEach","calendarEvent","dayTimestamp","timeusermidnight","push","Object","keys","events","past","buildTemplateContext","templateName","loadEventsFromPageData","pageData","actions","lastIds","preloadedPages","courseId","daysOffset","daysLimit","pageNumber","limit","lastPageNumber","hasOwnProperty","lastId","eventsPromise","endTime","undefined","args","starttime","aftereventid","endtime","courseid","queryByCourse","queryByTime","load","then","result","length","allItemsLoaded","filter","event","eventtype","getUserMidnightForTimestamp","timesort","pop","init","root","pageLimit","paginationAriaLabel","additionalConfig","firstLoad","Deferred","eventListContent","find","loadingPlaceholder","attr","parseInt","empty","emptyContent","removeClass","addClass","showContent","hasContent","config","extend","get_string","isArray","value","string","itemsperpage","paginationnav","createWithLimit","pagesData","promises","pagePromise","lastEventId","id","catch","exception","when","apply","resolve","createPagedContent","html","js","replaceNodeContents","hideContent","rootSelector"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"event_list.min.js","sources":["../src/event_list.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 * Javascript to load and render the list of calendar events for a\n * given day range.\n *\n * @module block_timeline/event_list\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'jquery',\n 'core/notification',\n 'core/templates',\n 'core/paged_content_factory',\n 'core/str',\n 'core/user_date',\n 'block_timeline/calendar_events_repository'\n],\nfunction(\n $,\n Notification,\n Templates,\n PagedContentFactory,\n Str,\n UserDate,\n CalendarEventsRepository\n) {\n\n var SECONDS_IN_DAY = 60 * 60 * 24;\n\n var SELECTORS = {\n EMPTY_MESSAGE: '[data-region=\"empty-message\"]',\n ROOT: '[data-region=\"event-list-container\"]',\n EVENT_LIST_CONTENT: '[data-region=\"event-list-content\"]',\n EVENT_LIST_LOADING_PLACEHOLDER: '[data-region=\"event-list-loading-placeholder\"]',\n };\n\n var TEMPLATES = {\n EVENT_LIST_CONTENT: 'block_timeline/event-list-content'\n };\n\n // We want the paged content controls below the paged content area\n // and the controls should be ignored while data is loading.\n var DEFAULT_PAGED_CONTENT_CONFIG = {\n ignoreControlWhileLoading: true,\n controlPlacementBottom: true,\n ariaLabels: {\n itemsperpagecomponents: 'ariaeventlistpagelimit, block_timeline',\n }\n };\n\n /**\n * Hide the content area and display the empty content message.\n *\n * @param {object} root The container element\n */\n var hideContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).addClass('hidden');\n root.find(SELECTORS.EMPTY_MESSAGE).removeClass('hidden');\n };\n\n /**\n * Show the content area and hide the empty content message.\n *\n * @param {object} root The container element\n */\n var showContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).removeClass('hidden');\n root.find(SELECTORS.EMPTY_MESSAGE).addClass('hidden');\n };\n\n /**\n * Empty the content area.\n *\n * @param {object} root The container element\n */\n var emptyContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).empty();\n };\n\n /**\n * Construct the template context from a list of calendar events. The events\n * are grouped by which day they are on. The day is calculated from the user's\n * midnight timestamp to ensure that the calculation is timezone agnostic.\n *\n * The return data structure will look like:\n * {\n * eventsbyday: [\n * {\n * dayTimestamp: 1533744000,\n * events: [\n * { ...event 1 data... },\n * { ...event 2 data... }\n * ]\n * },\n * {\n * dayTimestamp: 1533830400,\n * events: [\n * { ...event 3 data... },\n * { ...event 4 data... }\n * ]\n * }\n * ]\n * }\n *\n * Each day timestamp is the day's midnight in the user's timezone.\n *\n * @param {array} calendarEvents List of calendar events\n * @param {Number} midnight A timestamp representing midnight in the user's timezone\n * @return {object}\n */\n var buildTemplateContext = function(calendarEvents, midnight) {\n var eventsByDay = {};\n var templateContext = {\n eventsbyday: []\n };\n\n calendarEvents.forEach(function(calendarEvent) {\n var dayTimestamp = calendarEvent.timeusermidnight;\n if (eventsByDay[dayTimestamp]) {\n eventsByDay[dayTimestamp].push(calendarEvent);\n } else {\n eventsByDay[dayTimestamp] = [calendarEvent];\n }\n });\n\n Object.keys(eventsByDay).forEach(function(dayTimestamp) {\n var events = eventsByDay[dayTimestamp];\n templateContext.eventsbyday.push({\n past: dayTimestamp < midnight,\n dayTimestamp: dayTimestamp,\n events: events\n });\n });\n\n return templateContext;\n };\n\n /**\n * Render the HTML for the given calendar events.\n *\n * @param {array} calendarEvents A list of calendar events\n * @param {Number} midnight A timestamp representing midnight for the user\n * @return {promise} Resolved with HTML and JS strings.\n */\n var render = function(calendarEvents, midnight) {\n var templateContext = buildTemplateContext(calendarEvents, midnight);\n var templateName = TEMPLATES.EVENT_LIST_CONTENT;\n\n return Templates.render(templateName, templateContext);\n };\n\n /**\n * Retrieve a list of calendar events from the server for the given\n * constraints.\n *\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {Number} limit Limit the result set to this number of items\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @param {int|false} lastId The ID of the last seen event (if any)\n * @param {int|undefined} courseId Course ID to restrict events to\n * @return {Promise} A jquery promise\n */\n var load = function(midnight, limit, daysOffset, daysLimit, lastId, courseId) {\n var startTime = midnight + (daysOffset * SECONDS_IN_DAY);\n var endTime = daysLimit != undefined ? midnight + (daysLimit * SECONDS_IN_DAY) : false;\n\n var args = {\n starttime: startTime,\n limit: limit,\n };\n\n if (lastId) {\n args.aftereventid = lastId;\n }\n\n if (endTime) {\n args.endtime = endTime;\n }\n\n if (courseId) {\n // If we have a course id then we only want events from that course.\n args.courseid = courseId;\n return CalendarEventsRepository.queryByCourse(args);\n } else {\n // Otherwise we want events from any course.\n return CalendarEventsRepository.queryByTime(args);\n }\n };\n\n /**\n * Handle a single page request from the paged content. Uses the given page data to request\n * the events from the server.\n *\n * Checks the given preloadedPages before sending a request to the server to make sure we\n * don't load data unnecessarily.\n *\n * @param {object} pageData A single page data (see core/paged_content_pages for more info).\n * @param {object} actions Paged content actions (see core/paged_content_pages for more info).\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {object} lastIds The last event ID for each loaded page. Page number is key, id is value.\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {int|undefined} courseId Course ID to restrict events to\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @return {object} jQuery promise resolved with calendar events.\n */\n var loadEventsFromPageData = function(\n pageData,\n actions,\n midnight,\n lastIds,\n preloadedPages,\n courseId,\n daysOffset,\n daysLimit\n ) {\n var pageNumber = pageData.pageNumber;\n var limit = pageData.limit;\n var lastPageNumber = pageNumber;\n\n // This is here to protect us if, for some reason, the pages\n // are loaded out of order somehow and we don't have a reference\n // to the previous page. In that case, scan back to find the most\n // recent page we've seen.\n while (!lastIds.hasOwnProperty(lastPageNumber)) {\n lastPageNumber--;\n }\n // Use the last id of the most recent page.\n var lastId = lastIds[lastPageNumber];\n var eventsPromise = null;\n\n if (preloadedPages && preloadedPages.hasOwnProperty(pageNumber)) {\n // This page has been preloaded so use that rather than load the values\n // again.\n eventsPromise = preloadedPages[pageNumber];\n } else {\n // Load one more than the given limit so that we can tell if there\n // is more content to load after this.\n eventsPromise = load(midnight, limit + 1, daysOffset, daysLimit, lastId, courseId);\n }\n\n return eventsPromise.then(function(result) {\n if (!result.events.length) {\n // If we didn't get any events back then tell the paged content\n // that we're done loading.\n actions.allItemsLoaded(pageNumber);\n return [];\n }\n\n var calendarEvents = result.events.filter(function(event) {\n if (event.eventtype == \"open\" || event.eventtype == \"opensubmission\") {\n var dayTimestamp = UserDate.getUserMidnightForTimestamp(event.timesort, midnight);\n return dayTimestamp > midnight;\n }\n return true;\n });\n // We expect to receive limit + 1 events back from the server.\n // Any less means there are no more events to load.\n var loadedAll = calendarEvents.length <= limit;\n\n if (loadedAll) {\n // Tell the pagination that everything is loaded.\n actions.allItemsLoaded(pageNumber);\n } else {\n // Remove the last element from the array because it isn't\n // needed in this result set.\n calendarEvents.pop();\n }\n\n return calendarEvents;\n });\n };\n\n /**\n * Use the paged content factory to create a paged content element for showing\n * the event list. We only provide a page limit to the factory because we don't\n * know exactly how many pages we'll need. This creates a paging bar with just\n * next/previous buttons.\n *\n * This function specifies the callback for loading the event data that the user\n * is requesting.\n *\n * @param {int|array} pageLimit A single limit or list of limits as options for the paged content\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {object} firstLoad A jQuery promise to be resolved after the first set of data is loaded.\n * @param {int|undefined} courseId Course ID to restrict events to\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @param {string} paginationAriaLabel String to set as the aria label for the pagination bar.\n * @param {object} additionalConfig Additional config options to pass to pagedContentFactory\n * @return {object} jQuery promise.\n */\n var createPagedContent = function(\n pageLimit,\n preloadedPages,\n midnight,\n firstLoad,\n courseId,\n daysOffset,\n daysLimit,\n paginationAriaLabel,\n additionalConfig\n ) {\n // Remember the last event id we loaded on each page because we can't\n // use the offset value since the backend can skip events if the user doesn't\n // have the capability to see them. Instead we load the next page of events\n // based on the last seen event id.\n var lastIds = {'1': 0};\n var hasContent = false;\n var config = $.extend({}, DEFAULT_PAGED_CONTENT_CONFIG, additionalConfig);\n\n return Str.get_string(\n 'ariaeventlistpagelimit',\n 'block_timeline',\n $.isArray(pageLimit) ? pageLimit[0].value : pageLimit\n )\n .then(function(string) {\n config.ariaLabels.itemsperpage = string;\n config.ariaLabels.paginationnav = paginationAriaLabel;\n return string;\n })\n .then(function() {\n return PagedContentFactory.createWithLimit(\n pageLimit,\n function(pagesData, actions) {\n var promises = [];\n\n pagesData.forEach(function(pageData) {\n var pageNumber = pageData.pageNumber;\n // Load the page data.\n var pagePromise = loadEventsFromPageData(\n pageData,\n actions,\n midnight,\n lastIds,\n preloadedPages,\n courseId,\n daysOffset,\n daysLimit\n ).then(function(calendarEvents) {\n if (calendarEvents.length) {\n // Remember that we've loaded content.\n hasContent = true;\n // Remember the last id we've seen.\n var lastEventId = calendarEvents[calendarEvents.length - 1].id;\n // Record the id that the next page will need to start from.\n lastIds[pageNumber + 1] = lastEventId;\n // Get the HTML and JS for these calendar events.\n return render(calendarEvents, midnight);\n } else {\n return calendarEvents;\n }\n })\n .catch(Notification.exception);\n\n promises.push(pagePromise);\n });\n\n $.when.apply($, promises).then(function() {\n // Tell the calling code that the first page has been loaded\n // and whether it contains any content.\n firstLoad.resolve(hasContent);\n return;\n })\n .catch(function() {\n firstLoad.resolve(hasContent);\n });\n\n return promises;\n },\n config\n );\n });\n };\n\n /**\n * Create a paged content region for the calendar events in the given root element.\n * The content of the root element are replaced with a new paged content section\n * each time this function is called.\n *\n * This function will be called each time the offset or limit values are changed to\n * reload the event list region.\n *\n * @param {object} root The event list container element\n * @param {int|array} pageLimit A single limit or list of limits as options for the paged content\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {string} paginationAriaLabel String to set as the aria label for the pagination bar.\n * @param {object} additionalConfig Additional config options to pass to pagedContentFactory\n */\n var init = function(root, pageLimit, preloadedPages, paginationAriaLabel, additionalConfig) {\n root = $(root);\n\n // Create a promise that will be resolved once the first set of page\n // data has been loaded. This ensures that the loading placeholder isn't\n // hidden until we have all of the data back to prevent the page elements\n // jumping around.\n var firstLoad = $.Deferred();\n var eventListContent = root.find(SELECTORS.EVENT_LIST_CONTENT);\n var loadingPlaceholder = root.find(SELECTORS.EVENT_LIST_LOADING_PLACEHOLDER);\n var courseId = root.attr('data-course-id');\n var daysOffset = parseInt(root.attr('data-days-offset'), 10);\n var daysLimit = root.attr('data-days-limit');\n var midnight = parseInt(root.attr('data-midnight'), 10);\n\n // Make sure the content area and loading placeholder is visible.\n // This is because the init function can be called to re-initialise\n // an existing event list area.\n emptyContent(root);\n showContent(root);\n loadingPlaceholder.removeClass('hidden');\n\n // Days limit isn't mandatory.\n if (daysLimit != undefined) {\n daysLimit = parseInt(daysLimit, 10);\n }\n\n // Created the paged content element.\n return createPagedContent(pageLimit, preloadedPages, midnight, firstLoad, courseId, daysOffset, daysLimit,\n paginationAriaLabel, additionalConfig)\n .then(function(html, js) {\n html = $(html);\n // Hide the content for now.\n html.addClass('hidden');\n // Replace existing elements with the newly created paged content.\n // If we're reinitialising an existing event list this will replace\n // the old event list (including removing any event handlers).\n Templates.replaceNodeContents(eventListContent, html, js);\n\n firstLoad.then(function(hasContent) {\n // Prevent changing page elements too much by only showing the content\n // once we've loaded some data for the first time. This allows our\n // fancy loading placeholder to shine.\n html.removeClass('hidden');\n loadingPlaceholder.addClass('hidden');\n\n if (!hasContent) {\n // If we didn't get any data then show the empty data message.\n hideContent(root);\n }\n\n return hasContent;\n })\n .catch(function() {\n return false;\n });\n\n return html;\n })\n .catch(Notification.exception);\n };\n\n return {\n init: init,\n rootSelector: SELECTORS.ROOT,\n };\n});\n"],"names":["define","$","Notification","Templates","PagedContentFactory","Str","UserDate","CalendarEventsRepository","SELECTORS","TEMPLATES","DEFAULT_PAGED_CONTENT_CONFIG","ignoreControlWhileLoading","controlPlacementBottom","ariaLabels","itemsperpagecomponents","render","calendarEvents","midnight","templateContext","eventsByDay","eventsbyday","forEach","calendarEvent","dayTimestamp","timeusermidnight","push","Object","keys","events","past","buildTemplateContext","templateName","loadEventsFromPageData","pageData","actions","lastIds","preloadedPages","courseId","daysOffset","daysLimit","pageNumber","limit","lastPageNumber","hasOwnProperty","lastId","eventsPromise","endTime","undefined","args","starttime","aftereventid","endtime","courseid","queryByCourse","queryByTime","load","then","result","length","allItemsLoaded","filter","event","eventtype","getUserMidnightForTimestamp","timesort","pop","init","root","pageLimit","paginationAriaLabel","additionalConfig","firstLoad","Deferred","eventListContent","find","loadingPlaceholder","attr","parseInt","createPagedContent","empty","emptyContent","removeClass","addClass","showContent","hasContent","config","extend","get_string","isArray","value","string","itemsperpage","paginationnav","createWithLimit","pagesData","promises","pagePromise","lastEventId","id","catch","exception","when","apply","resolve","html","js","replaceNodeContents","hideContent","rootSelector"],"mappings":"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"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/main.min.js.map b/blocks/timeline/amd/build/main.min.js.map index b8a83abf783..c2c53ebefc4 100644 --- a/blocks/timeline/amd/build/main.min.js.map +++ b/blocks/timeline/amd/build/main.min.js.map @@ -1 +1 @@ -{"version":3,"file":"main.min.js","sources":["../src/main.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 * Javascript to initialise the timeline block.\n *\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_timeline/view_nav',\n 'block_timeline/view'\n],\nfunction(\n $,\n ViewNav,\n View\n) {\n\n var SELECTORS = {\n TIMELINE_VIEW: '[data-region=\"timeline-view\"]'\n };\n\n /**\n * Initialise all of the modules for the timeline block.\n *\n * @param {object} root The root element for the timeline block.\n */\n var init = function(root) {\n root = $(root);\n var viewRoot = root.find(SELECTORS.TIMELINE_VIEW);\n\n // Initialise the timeline navigation elements.\n ViewNav.init(root, viewRoot);\n // Initialise the timeline view modules.\n View.init(viewRoot);\n };\n\n return {\n init: init\n };\n});\n"],"names":["define","$","ViewNav","View","SELECTORS","init","root","viewRoot","find"],"mappings":";;;;;;AAsBAA,6BACA,CACI,SACA,0BACA,wBAEJ,SACIC,EACAC,QACAC,UAGIC,wBACe,sCAkBZ,CACHC,KAXO,SAASC,UAEZC,UADJD,KAAOL,EAAEK,OACWE,KAAKJ,yBAGzBF,QAAQG,KAAKC,KAAMC,UAEnBJ,KAAKE,KAAKE"} \ No newline at end of file +{"version":3,"file":"main.min.js","sources":["../src/main.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 * Javascript to initialise the timeline block.\n *\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_timeline/view_nav',\n 'block_timeline/view'\n],\nfunction(\n $,\n ViewNav,\n View\n) {\n\n var SELECTORS = {\n TIMELINE_VIEW: '[data-region=\"timeline-view\"]'\n };\n\n /**\n * Initialise all of the modules for the timeline block.\n *\n * @param {object} root The root element for the timeline block.\n */\n var init = function(root) {\n root = $(root);\n var viewRoot = root.find(SELECTORS.TIMELINE_VIEW);\n\n // Initialise the timeline navigation elements.\n ViewNav.init(root, viewRoot);\n // Initialise the timeline view modules.\n View.init(viewRoot);\n };\n\n return {\n init: init\n };\n});\n"],"names":["define","$","ViewNav","View","SELECTORS","init","root","viewRoot","find"],"mappings":";;;;;;AAsBAA,OACA,sBAAA,CACI,SACA,0BACA,wBAEJ,SACIC,EACAC,QACAC,MAGA,IAAIC,wBACe,gCAkBZ,MAAA,CACHC,KAXO,SAASC,MAEZC,IAAAA,UADJD,KAAOL,EAAEK,OACWE,KAAKJ,yBAGzBF,QAAQG,KAAKC,KAAMC,UAEnBJ,KAAKE,KAAKE,SACb,EAKJ"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/view.min.js.map b/blocks/timeline/amd/build/view.min.js.map index 515b6be786b..f0ca2ffb9c8 100644 --- a/blocks/timeline/amd/build/view.min.js.map +++ b/blocks/timeline/amd/build/view.min.js.map @@ -1 +1 @@ -{"version":3,"file":"view.min.js","sources":["../src/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 * Manage the timeline view for the timeline block.\n *\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_timeline/view_dates',\n 'block_timeline/view_courses',\n],\nfunction(\n $,\n ViewDates,\n ViewCourses\n) {\n\n var SELECTORS = {\n TIMELINE_DATES_VIEW: '[data-region=\"view-dates\"]',\n TIMELINE_COURSES_VIEW: '[data-region=\"view-courses\"]',\n };\n\n /**\n * Intialise the timeline dates and courses views on page load.\n * This function should only be called once per page load because\n * it can cause event listeners to be added to the page.\n *\n * @param {object} root The root element for the timeline view.\n */\n var init = function(root) {\n root = $(root);\n var datesViewRoot = root.find(SELECTORS.TIMELINE_DATES_VIEW);\n var coursesViewRoot = root.find(SELECTORS.TIMELINE_COURSES_VIEW);\n\n ViewDates.init(datesViewRoot);\n ViewCourses.init(coursesViewRoot);\n };\n\n /**\n * Reset the timeline dates and courses views to their original\n * state on first page load.\n *\n * This is called when configuration has changed for the event lists\n * to cause them to reload their data.\n *\n * @param {object} root The root element for the timeline view.\n */\n var reset = function(root) {\n var datesViewRoot = root.find(SELECTORS.TIMELINE_DATES_VIEW);\n var coursesViewRoot = root.find(SELECTORS.TIMELINE_COURSES_VIEW);\n ViewDates.reset(datesViewRoot);\n ViewCourses.reset(coursesViewRoot);\n };\n\n /**\n * Tell the timeline dates or courses view that it has been displayed.\n *\n * This is called each time one of the views is displayed and is used to\n * lazy load the data within it on first load.\n *\n * @param {object} root The root element for the timeline view.\n */\n var shown = function(root) {\n var datesViewRoot = root.find(SELECTORS.TIMELINE_DATES_VIEW);\n var coursesViewRoot = root.find(SELECTORS.TIMELINE_COURSES_VIEW);\n\n if (datesViewRoot.hasClass('active')) {\n ViewDates.shown(datesViewRoot);\n } else {\n ViewCourses.shown(coursesViewRoot);\n }\n };\n\n return {\n init: init,\n reset: reset,\n shown: shown,\n };\n});\n"],"names":["define","$","ViewDates","ViewCourses","SELECTORS","init","root","datesViewRoot","find","coursesViewRoot","reset","shown","hasClass"],"mappings":";;;;;;AAsBAA,6BACA,CACI,SACA,4BACA,gCAEJ,SACIC,EACAC,UACAC,iBAGIC,8BACqB,6BADrBA,gCAEuB,qCAsDpB,CACHC,KA7CO,SAASC,UAEZC,eADJD,KAAOL,EAAEK,OACgBE,KAAKJ,+BAC1BK,gBAAkBH,KAAKE,KAAKJ,iCAEhCF,UAAUG,KAAKE,eACfJ,YAAYE,KAAKI,kBAwCjBC,MA5BQ,SAASJ,UACbC,cAAgBD,KAAKE,KAAKJ,+BAC1BK,gBAAkBH,KAAKE,KAAKJ,iCAChCF,UAAUQ,MAAMH,eAChBJ,YAAYO,MAAMD,kBAyBlBE,MAdQ,SAASL,UACbC,cAAgBD,KAAKE,KAAKJ,+BAC1BK,gBAAkBH,KAAKE,KAAKJ,iCAE5BG,cAAcK,SAAS,UACvBV,UAAUS,MAAMJ,eAEhBJ,YAAYQ,MAAMF"} \ No newline at end of file +{"version":3,"file":"view.min.js","sources":["../src/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 * Manage the timeline view for the timeline block.\n *\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_timeline/view_dates',\n 'block_timeline/view_courses',\n],\nfunction(\n $,\n ViewDates,\n ViewCourses\n) {\n\n var SELECTORS = {\n TIMELINE_DATES_VIEW: '[data-region=\"view-dates\"]',\n TIMELINE_COURSES_VIEW: '[data-region=\"view-courses\"]',\n };\n\n /**\n * Intialise the timeline dates and courses views on page load.\n * This function should only be called once per page load because\n * it can cause event listeners to be added to the page.\n *\n * @param {object} root The root element for the timeline view.\n */\n var init = function(root) {\n root = $(root);\n var datesViewRoot = root.find(SELECTORS.TIMELINE_DATES_VIEW);\n var coursesViewRoot = root.find(SELECTORS.TIMELINE_COURSES_VIEW);\n\n ViewDates.init(datesViewRoot);\n ViewCourses.init(coursesViewRoot);\n };\n\n /**\n * Reset the timeline dates and courses views to their original\n * state on first page load.\n *\n * This is called when configuration has changed for the event lists\n * to cause them to reload their data.\n *\n * @param {object} root The root element for the timeline view.\n */\n var reset = function(root) {\n var datesViewRoot = root.find(SELECTORS.TIMELINE_DATES_VIEW);\n var coursesViewRoot = root.find(SELECTORS.TIMELINE_COURSES_VIEW);\n ViewDates.reset(datesViewRoot);\n ViewCourses.reset(coursesViewRoot);\n };\n\n /**\n * Tell the timeline dates or courses view that it has been displayed.\n *\n * This is called each time one of the views is displayed and is used to\n * lazy load the data within it on first load.\n *\n * @param {object} root The root element for the timeline view.\n */\n var shown = function(root) {\n var datesViewRoot = root.find(SELECTORS.TIMELINE_DATES_VIEW);\n var coursesViewRoot = root.find(SELECTORS.TIMELINE_COURSES_VIEW);\n\n if (datesViewRoot.hasClass('active')) {\n ViewDates.shown(datesViewRoot);\n } else {\n ViewCourses.shown(coursesViewRoot);\n }\n };\n\n return {\n init: init,\n reset: reset,\n shown: shown,\n };\n});\n"],"names":["define","$","ViewDates","ViewCourses","SELECTORS","init","root","datesViewRoot","find","coursesViewRoot","reset","shown","hasClass"],"mappings":";;;;;;AAsBAA,OACA,sBAAA,CACI,SACA,4BACA,gCAEJ,SACIC,EACAC,UACAC,aAGA,IAAIC,8BACqB,6BADrBA,gCAEuB,+BAsDpB,MAAA,CACHC,KA7CO,SAASC,MAEZC,IAAAA,eADJD,KAAOL,EAAEK,OACgBE,KAAKJ,+BAC1BK,gBAAkBH,KAAKE,KAAKJ,iCAEhCF,UAAUG,KAAKE,eACfJ,YAAYE,KAAKI,gBACpB,EAuCGC,MA5BQ,SAASJ,MACbC,IAAAA,cAAgBD,KAAKE,KAAKJ,+BAC1BK,gBAAkBH,KAAKE,KAAKJ,iCAChCF,UAAUQ,MAAMH,eAChBJ,YAAYO,MAAMD,gBACrB,EAwBGE,MAdQ,SAASL,MACbC,IAAAA,cAAgBD,KAAKE,KAAKJ,+BAC1BK,gBAAkBH,KAAKE,KAAKJ,iCAE5BG,cAAcK,SAAS,UACvBV,UAAUS,MAAMJ,eAEhBJ,YAAYQ,MAAMF,gBAEzB,EAOJ"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/view_courses.min.js.map b/blocks/timeline/amd/build/view_courses.min.js.map index 05525728555..1251cc5db82 100644 --- a/blocks/timeline/amd/build/view_courses.min.js.map +++ b/blocks/timeline/amd/build/view_courses.min.js.map @@ -1 +1 @@ -{"version":3,"file":"view_courses.min.js","sources":["../src/view_courses.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 * Manage the timeline courses view for the timeline block.\n *\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/str',\n 'core/templates',\n 'block_timeline/event_list',\n 'core_course/repository',\n 'block_timeline/calendar_events_repository'\n],\nfunction(\n $,\n Notification,\n CustomEvents,\n Str,\n Templates,\n EventList,\n CourseRepository,\n EventsRepository\n) {\n\n var SELECTORS = {\n MORE_COURSES_BUTTON: '[data-action=\"more-courses\"]',\n MORE_COURSES_BUTTON_CONTAINER: '[data-region=\"more-courses-button-container\"]',\n NO_COURSES_EMPTY_MESSAGE: '[data-region=\"no-courses-empty-message\"]',\n COURSES_LIST: '[data-region=\"courses-list\"]',\n COURSE_ITEMS_LOADING_PLACEHOLDER: '[data-region=\"course-items-loading-placeholder\"]',\n COURSE_EVENTS_CONTAINER: '[data-region=\"course-events-container\"]',\n COURSE_NAME: '[data-region=\"course-name\"]',\n LOADING_ICON: '.loading-icon'\n };\n\n var TEMPLATES = {\n COURSE_ITEMS: 'block_timeline/course-items',\n LOADING_ICON: 'core/loading'\n };\n\n var COURSE_CLASSIFICATION = 'all';\n var COURSE_SORT = 'fullname asc';\n var COURSE_EVENT_LIMIT = 5;\n var COURSE_LIMIT = 2;\n var SECONDS_IN_DAY = 60 * 60 * 24;\n\n /**\n * Hide the loading placeholder elements.\n *\n * @param {object} root The rool element.\n */\n var hideLoadingPlaceholder = function(root) {\n root.find(SELECTORS.COURSE_ITEMS_LOADING_PLACEHOLDER).addClass('hidden');\n };\n\n /**\n * Hide the \"more courses\" button.\n *\n * @param {object} root The rool element.\n */\n var hideMoreCoursesButton = function(root) {\n root.find(SELECTORS.MORE_COURSES_BUTTON_CONTAINER).addClass('hidden');\n };\n\n /**\n * Show the \"more courses\" button.\n *\n * @param {object} root The rool element.\n */\n var showMoreCoursesButton = function(root) {\n root.find(SELECTORS.MORE_COURSES_BUTTON_CONTAINER).removeClass('hidden');\n };\n\n /**\n * Disable the \"more courses\" button and show the loading spinner.\n *\n * @param {object} root The rool element.\n */\n var enableMoreCoursesButtonLoading = function(root) {\n var button = root.find(SELECTORS.MORE_COURSES_BUTTON);\n button.prop('disabled', true);\n Templates.render(TEMPLATES.LOADING_ICON, {})\n .then(function(html) {\n button.append(html);\n return html;\n })\n .catch(function() {\n // It's not important if this false so just do so silently.\n return false;\n });\n };\n\n /**\n * Enable the \"more courses\" button and remove the loading spinner.\n *\n * @param {object} root The rool element.\n */\n var disableMoreCoursesButtonLoading = function(root) {\n var button = root.find(SELECTORS.MORE_COURSES_BUTTON);\n button.prop('disabled', false);\n button.find(SELECTORS.LOADING_ICON).remove();\n };\n\n /**\n * Display the message for when there are no courses available.\n *\n * @param {object} root The rool element.\n */\n var showNoCoursesEmptyMessage = function(root) {\n root.find(SELECTORS.NO_COURSES_EMPTY_MESSAGE).removeClass('hidden');\n };\n\n /**\n * Render the course items HTML to the page.\n *\n * @param {object} root The rool element.\n * @param {string} html The course items HTML to render.\n */\n var renderCourseItemsHTML = function(root, html) {\n var container = root.find(SELECTORS.COURSES_LIST);\n Templates.appendNodeContents(container, html, '');\n };\n\n /**\n * Check if any courses have been loaded.\n *\n * @param {object} root The rool element.\n * @return {bool}\n */\n var hasLoadedCourses = function(root) {\n return root.find(SELECTORS.COURSE_EVENTS_CONTAINER).length > 0;\n };\n\n /**\n * Return the offset value for fetching courses.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getOffset = function(root) {\n return parseInt(root.attr('data-offset'), 10);\n };\n\n /**\n * Set the offset value for fetching courses.\n *\n * @param {object} root The rool element.\n * @param {Number} offset Offset value.\n */\n var setOffset = function(root, offset) {\n root.attr('data-offset', offset);\n };\n\n /**\n * Return the limit value for fetching courses.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getLimit = function(root) {\n return parseInt(root.attr('data-limit'), 10);\n };\n\n /**\n * Return the days offset value for fetching events.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getDaysOffset = function(root) {\n return parseInt(root.attr('data-days-offset'), 10);\n };\n\n /**\n * Return the days limit value for fetching events. The days\n * limit is optional so undefined will be returned if it isn't\n * set.\n *\n * @param {object} root The rool element.\n * @return {int|undefined}\n */\n var getDaysLimit = function(root) {\n var daysLimit = root.attr('data-days-limit');\n return daysLimit != undefined ? parseInt(daysLimit, 10) : undefined;\n };\n\n /**\n * Return the timestamp for the user's midnight.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getMidnight = function(root) {\n return parseInt(root.attr('data-midnight'), 10);\n };\n\n /**\n * Return the start time for fetching events. This is calculated\n * based on the user's midnight value so that timezones are\n * preserved.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getStartTime = function(root) {\n var midnight = getMidnight(root);\n var daysOffset = getDaysOffset(root);\n return midnight + (daysOffset * SECONDS_IN_DAY);\n };\n\n /**\n * Return the end time for fetching events. This is calculated\n * based on the user's midnight value so that timezones are\n * preserved.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getEndTime = function(root) {\n var midnight = getMidnight(root);\n var daysLimit = getDaysLimit(root);\n return daysLimit != undefined ? midnight + (daysLimit * SECONDS_IN_DAY) : false;\n };\n\n /**\n * Get a list of events for the given course ids. Returns a promise that will\n * be resolved with the events.\n *\n * @param {array} courseIds The list of course ids to fetch events for.\n * @param {Number} startTime Timestamp to fetch events from.\n * @param {Number} limit Limit to the number of events (this applies per course, not total)\n * @param {Number} endTime Timestamp to fetch events to.\n * @return {object} jQuery promise.\n */\n var getEventsForCourseIds = function(courseIds, startTime, limit, endTime) {\n var args = {\n courseids: courseIds,\n starttime: startTime,\n limit: limit\n };\n\n if (endTime) {\n args.endtime = endTime;\n }\n\n return EventsRepository.queryByCourses(args);\n };\n\n /**\n * Get the last time the events were reloaded.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getEventReloadTime = function(root) {\n return root.data('last-event-load-time');\n };\n\n /**\n * Set the last time the events were reloaded.\n *\n * @param {object} root The rool element.\n * @param {Number} time Timestamp in milliseconds.\n */\n var setEventReloadTime = function(root, time) {\n root.data('last-event-load-time', time);\n };\n\n /**\n * Check if events have begun reloading since the given\n * time.\n *\n * @param {object} root The rool element.\n * @param {Number} time Timestamp in milliseconds.\n * @return {bool}\n */\n var hasReloadedEventsSince = function(root, time) {\n return getEventReloadTime(root) > time;\n };\n\n /**\n * Send a request to the server to load the events for the courses.\n *\n * @param {array} courses List of course objects.\n * @param {Number} startTime Timestamp to load events after.\n * @param {int|undefined} endTime Timestamp to load events up until.\n * @return {object} jQuery promise resolved with the events.\n */\n var loadEventsForCourses = function(courses, startTime, endTime) {\n var courseIds = courses.map(function(course) {\n return course.id;\n });\n\n return getEventsForCourseIds(courseIds, startTime, COURSE_EVENT_LIMIT + 1, endTime);\n };\n\n /**\n * Render the courses in the DOM once the server has returned the courses.\n *\n * @param {array} courses List of course objects.\n * @param {object} root The root element\n * @param {Number} midnight The midnight timestamp in the user's timezone.\n * @param {Number} daysOffset Number of days from today to offset the events.\n * @param {Number} daysLimit Number of days from today to limit the events to.\n * @param {string} noEventsURL URL for the image to display for no events.\n * @return {object} jQuery promise resolved after rendering is complete.\n */\n var updateDisplayFromCourses = function(courses, root, midnight, daysOffset, daysLimit, noEventsURL) {\n // Render the courses template.\n return Templates.render(TEMPLATES.COURSE_ITEMS, {\n courses: courses,\n midnight: midnight,\n hasdaysoffset: true,\n hasdayslimit: daysLimit != undefined,\n daysoffset: daysOffset,\n dayslimit: daysLimit,\n nodayslimit: daysLimit == undefined,\n urls: {\n noevents: noEventsURL\n }\n }).then(function(html) {\n hideLoadingPlaceholder(root);\n\n if (html) {\n // Template rendering is complete and we have the HTML so we can\n // add it to the DOM.\n renderCourseItemsHTML(root, html);\n } else {\n if (!hasLoadedCourses(root)) {\n // There were no courses to render so show the empty placeholder\n // message for the user to tell them.\n showNoCoursesEmptyMessage(root);\n }\n }\n\n return html;\n })\n .then(function(html) {\n if (courses.length < COURSE_LIMIT) {\n // We know there aren't any more courses because we got back less\n // than we asked for so hide the button to request more.\n hideMoreCoursesButton(root);\n } else {\n // Make sure the button is visible if there are more courses to load.\n showMoreCoursesButton(root);\n }\n\n return html;\n })\n .catch(function() {\n hideLoadingPlaceholder(root);\n });\n };\n\n /**\n * Find all of the visible course blocks and initialise the event\n * list module to being loading the events for the course block.\n *\n * @param {object} root The root element for the timeline courses view.\n * @return {object} jQuery promise resolved with courses and events.\n */\n var loadMoreCourses = function(root) {\n var offset = getOffset(root);\n var limit = getLimit(root);\n\n // Start loading the next set of courses.\n return CourseRepository.getEnrolledCoursesByTimelineClassification(\n COURSE_CLASSIFICATION,\n limit,\n offset,\n COURSE_SORT\n ).then(function(result) {\n var startEventLoadingTime = Date.now();\n var courses = result.courses;\n var nextOffset = result.nextoffset;\n var daysOffset = getDaysOffset(root);\n var daysLimit = getDaysLimit(root);\n var midnight = getMidnight(root);\n var startTime = getStartTime(root);\n var endTime = getEndTime(root);\n var noEventsURL = root.attr('data-no-events-url');\n // Record the next offset if we want to request more courses.\n setOffset(root, nextOffset);\n // Load the events for these courses.\n var eventsPromise = loadEventsForCourses(courses, startTime, endTime);\n // Render the courses in the DOM.\n var renderPromise = updateDisplayFromCourses(courses, root, midnight, daysOffset, daysLimit, noEventsURL);\n\n return $.when(eventsPromise, renderPromise)\n .then(function(eventsByCourse) {\n if (hasReloadedEventsSince(root, startEventLoadingTime)) {\n // All of the events are being reloaded so ignore our results.\n return eventsByCourse;\n }\n\n // When we've got all of the courses and events we can render the events in the\n // correct course event list.\n courses.forEach(function(course) {\n var courseId = course.id;\n var events = [];\n var containerSelector = '[data-region=\"course-events-container\"][data-course-id=\"' + courseId + '\"]';\n var courseEventsContainer = root.find(containerSelector);\n var eventListRoot = courseEventsContainer.find(EventList.rootSelector);\n var courseGroups = eventsByCourse.groupedbycourse.filter(function(group) {\n return group.courseid == courseId;\n });\n\n if (courseGroups.length) {\n // Get the events for this course.\n events = courseGroups[0].events;\n }\n\n // Create a preloaded page to pass to the event list because we've already\n // loaded the first page of events.\n var pageOnePreload = $.Deferred().resolve({events: events}).promise();\n // Initialise the event list pagination area for this course.\n Str.get_string('ariaeventlistpaginationnavcourses', 'block_timeline', course.fullnamedisplay)\n .then(function(string) {\n EventList.init(eventListRoot, COURSE_EVENT_LIMIT, {'1': pageOnePreload}, string);\n return string;\n })\n .catch(function() {\n // An error is ok, just render with the default string.\n EventList.init(eventListRoot, COURSE_EVENT_LIMIT, {'1': pageOnePreload});\n });\n });\n\n return eventsByCourse;\n });\n }).catch(Notification.exception);\n };\n\n /**\n * Reload the events for all of the visible courses. These events will be loaded\n * in a single request to the server.\n *\n * @param {object} root The root element.\n * @return {object} jQuery promise resolved with courses and events.\n */\n var reloadCourseEvents = function(root) {\n var startReloadTime = Date.now();\n var startTime = getStartTime(root);\n var endTime = getEndTime(root);\n var courseEventsContainers = root.find(SELECTORS.COURSE_EVENTS_CONTAINER);\n var courseIds = courseEventsContainers.map(function() {\n return $(this).attr('data-course-id');\n }).get();\n\n // Record when we started our request.\n setEventReloadTime(root, startReloadTime);\n\n // Load all of the events for the given courses.\n return getEventsForCourseIds(courseIds, startTime, COURSE_EVENT_LIMIT + 1, endTime)\n .then(function(eventsByCourse) {\n if (hasReloadedEventsSince(root, startReloadTime)) {\n // A new reload has begun so ignore our results.\n return eventsByCourse;\n }\n\n courseEventsContainers.each(function(index, container) {\n container = $(container);\n var courseId = container.attr('data-course-id');\n var courseName = container.find(SELECTORS.COURSE_NAME).text();\n var eventListContainer = container.find(EventList.rootSelector);\n var pageDeferred = $.Deferred();\n var events = [];\n var courseGroups = eventsByCourse.groupedbycourse.filter(function(group) {\n return group.courseid == courseId;\n });\n\n if (courseGroups.length) {\n // Get the events just for this course.\n events = courseGroups[0].events;\n }\n\n pageDeferred.resolve({events: events});\n\n // Re-initialise the events list with the preloaded events we just got from\n // the server.\n Str.get_string('ariaeventlistpaginationnavcourses', 'block_timeline', courseName)\n .then(function(string) {\n EventList.init(eventListContainer, COURSE_EVENT_LIMIT, {'1': pageDeferred.promise()}, string);\n return string;\n })\n .catch(function() {\n // Ignore a failure to load the string. Just render with the default string.\n EventList.init(eventListContainer, COURSE_EVENT_LIMIT, {'1': pageDeferred.promise()});\n });\n });\n\n return eventsByCourse;\n }).catch(Notification.exception);\n };\n\n /**\n * Add event listeners to load more courses for the courses view.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var registerEventListeners = function(root) {\n CustomEvents.define(root, [CustomEvents.events.activate]);\n // Show more courses and load their events when the user clicks the \"more courses\"\n // button.\n root.on(CustomEvents.events.activate, SELECTORS.MORE_COURSES_BUTTON, function(e, data) {\n enableMoreCoursesButtonLoading(root);\n loadMoreCourses(root)\n .then(function() {\n disableMoreCoursesButtonLoading(root);\n return;\n })\n .catch(function() {\n disableMoreCoursesButtonLoading(root);\n });\n\n if (data) {\n data.originalEvent.preventDefault();\n data.originalEvent.stopPropagation();\n }\n e.stopPropagation();\n });\n };\n\n /**\n * Initialise the timeline courses view. Begin loading the events\n * if this view is active. Add the relevant event listeners.\n *\n * This function should only be called once per page load because it\n * is adding event listeners to the page.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var init = function(root) {\n root = $(root);\n\n setEventReloadTime(root, Date.now());\n\n if (root.hasClass('active')) {\n // Only load if this is active otherwise it will be lazy loaded later.\n loadMoreCourses(root);\n root.attr('data-seen', true);\n }\n\n registerEventListeners(root);\n };\n\n /**\n * Reset the element back to it's initial state. Begin loading the events again\n * if this view is active.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var reset = function(root) {\n root.removeAttr('data-seen');\n if (root.hasClass('active')) {\n shown(root);\n }\n };\n\n /**\n * If this is the first time this view has been displayed then begin loading\n * the events.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var shown = function(root) {\n if (!root.attr('data-seen')) {\n if (hasLoadedCourses(root)) {\n // This isn't the first time this view is shown so just reload the\n // events for the courses we've already loaded.\n reloadCourseEvents(root);\n } else {\n // We haven't loaded any courses yet so do that now.\n loadMoreCourses(root);\n }\n\n root.attr('data-seen', true);\n }\n };\n\n return {\n init: init,\n reset: reset,\n shown: shown\n };\n});\n"],"names":["define","$","Notification","CustomEvents","Str","Templates","EventList","CourseRepository","EventsRepository","SELECTORS","TEMPLATES","hideLoadingPlaceholder","root","find","addClass","disableMoreCoursesButtonLoading","button","prop","remove","hasLoadedCourses","length","getDaysOffset","parseInt","attr","getDaysLimit","daysLimit","undefined","getMidnight","getStartTime","getEndTime","midnight","getEventsForCourseIds","courseIds","startTime","limit","endTime","args","courseids","starttime","endtime","queryByCourses","setEventReloadTime","time","data","hasReloadedEventsSince","getEventReloadTime","updateDisplayFromCourses","courses","daysOffset","noEventsURL","render","hasdaysoffset","hasdayslimit","daysoffset","dayslimit","nodayslimit","urls","noevents","then","html","container","appendNodeContents","renderCourseItemsHTML","removeClass","showNoCoursesEmptyMessage","hideMoreCoursesButton","showMoreCoursesButton","catch","loadMoreCourses","offset","getOffset","getLimit","getEnrolledCoursesByTimelineClassification","result","startEventLoadingTime","Date","now","nextOffset","nextoffset","setOffset","eventsPromise","map","course","id","COURSE_EVENT_LIMIT","loadEventsForCourses","renderPromise","when","eventsByCourse","forEach","courseId","events","containerSelector","eventListRoot","rootSelector","courseGroups","groupedbycourse","filter","group","courseid","pageOnePreload","Deferred","resolve","promise","get_string","fullnamedisplay","string","init","exception","registerEventListeners","activate","on","e","append","enableMoreCoursesButtonLoading","originalEvent","preventDefault","stopPropagation","shown","startReloadTime","courseEventsContainers","this","get","each","index","courseName","text","eventListContainer","pageDeferred","reloadCourseEvents","hasClass","reset","removeAttr"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"view_courses.min.js","sources":["../src/view_courses.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 * Manage the timeline courses view for the timeline block.\n *\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/str',\n 'core/templates',\n 'block_timeline/event_list',\n 'core_course/repository',\n 'block_timeline/calendar_events_repository'\n],\nfunction(\n $,\n Notification,\n CustomEvents,\n Str,\n Templates,\n EventList,\n CourseRepository,\n EventsRepository\n) {\n\n var SELECTORS = {\n MORE_COURSES_BUTTON: '[data-action=\"more-courses\"]',\n MORE_COURSES_BUTTON_CONTAINER: '[data-region=\"more-courses-button-container\"]',\n NO_COURSES_EMPTY_MESSAGE: '[data-region=\"no-courses-empty-message\"]',\n COURSES_LIST: '[data-region=\"courses-list\"]',\n COURSE_ITEMS_LOADING_PLACEHOLDER: '[data-region=\"course-items-loading-placeholder\"]',\n COURSE_EVENTS_CONTAINER: '[data-region=\"course-events-container\"]',\n COURSE_NAME: '[data-region=\"course-name\"]',\n LOADING_ICON: '.loading-icon'\n };\n\n var TEMPLATES = {\n COURSE_ITEMS: 'block_timeline/course-items',\n LOADING_ICON: 'core/loading'\n };\n\n var COURSE_CLASSIFICATION = 'all';\n var COURSE_SORT = 'fullname asc';\n var COURSE_EVENT_LIMIT = 5;\n var COURSE_LIMIT = 2;\n var SECONDS_IN_DAY = 60 * 60 * 24;\n\n /**\n * Hide the loading placeholder elements.\n *\n * @param {object} root The rool element.\n */\n var hideLoadingPlaceholder = function(root) {\n root.find(SELECTORS.COURSE_ITEMS_LOADING_PLACEHOLDER).addClass('hidden');\n };\n\n /**\n * Hide the \"more courses\" button.\n *\n * @param {object} root The rool element.\n */\n var hideMoreCoursesButton = function(root) {\n root.find(SELECTORS.MORE_COURSES_BUTTON_CONTAINER).addClass('hidden');\n };\n\n /**\n * Show the \"more courses\" button.\n *\n * @param {object} root The rool element.\n */\n var showMoreCoursesButton = function(root) {\n root.find(SELECTORS.MORE_COURSES_BUTTON_CONTAINER).removeClass('hidden');\n };\n\n /**\n * Disable the \"more courses\" button and show the loading spinner.\n *\n * @param {object} root The rool element.\n */\n var enableMoreCoursesButtonLoading = function(root) {\n var button = root.find(SELECTORS.MORE_COURSES_BUTTON);\n button.prop('disabled', true);\n Templates.render(TEMPLATES.LOADING_ICON, {})\n .then(function(html) {\n button.append(html);\n return html;\n })\n .catch(function() {\n // It's not important if this false so just do so silently.\n return false;\n });\n };\n\n /**\n * Enable the \"more courses\" button and remove the loading spinner.\n *\n * @param {object} root The rool element.\n */\n var disableMoreCoursesButtonLoading = function(root) {\n var button = root.find(SELECTORS.MORE_COURSES_BUTTON);\n button.prop('disabled', false);\n button.find(SELECTORS.LOADING_ICON).remove();\n };\n\n /**\n * Display the message for when there are no courses available.\n *\n * @param {object} root The rool element.\n */\n var showNoCoursesEmptyMessage = function(root) {\n root.find(SELECTORS.NO_COURSES_EMPTY_MESSAGE).removeClass('hidden');\n };\n\n /**\n * Render the course items HTML to the page.\n *\n * @param {object} root The rool element.\n * @param {string} html The course items HTML to render.\n */\n var renderCourseItemsHTML = function(root, html) {\n var container = root.find(SELECTORS.COURSES_LIST);\n Templates.appendNodeContents(container, html, '');\n };\n\n /**\n * Check if any courses have been loaded.\n *\n * @param {object} root The rool element.\n * @return {bool}\n */\n var hasLoadedCourses = function(root) {\n return root.find(SELECTORS.COURSE_EVENTS_CONTAINER).length > 0;\n };\n\n /**\n * Return the offset value for fetching courses.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getOffset = function(root) {\n return parseInt(root.attr('data-offset'), 10);\n };\n\n /**\n * Set the offset value for fetching courses.\n *\n * @param {object} root The rool element.\n * @param {Number} offset Offset value.\n */\n var setOffset = function(root, offset) {\n root.attr('data-offset', offset);\n };\n\n /**\n * Return the limit value for fetching courses.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getLimit = function(root) {\n return parseInt(root.attr('data-limit'), 10);\n };\n\n /**\n * Return the days offset value for fetching events.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getDaysOffset = function(root) {\n return parseInt(root.attr('data-days-offset'), 10);\n };\n\n /**\n * Return the days limit value for fetching events. The days\n * limit is optional so undefined will be returned if it isn't\n * set.\n *\n * @param {object} root The rool element.\n * @return {int|undefined}\n */\n var getDaysLimit = function(root) {\n var daysLimit = root.attr('data-days-limit');\n return daysLimit != undefined ? parseInt(daysLimit, 10) : undefined;\n };\n\n /**\n * Return the timestamp for the user's midnight.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getMidnight = function(root) {\n return parseInt(root.attr('data-midnight'), 10);\n };\n\n /**\n * Return the start time for fetching events. This is calculated\n * based on the user's midnight value so that timezones are\n * preserved.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getStartTime = function(root) {\n var midnight = getMidnight(root);\n var daysOffset = getDaysOffset(root);\n return midnight + (daysOffset * SECONDS_IN_DAY);\n };\n\n /**\n * Return the end time for fetching events. This is calculated\n * based on the user's midnight value so that timezones are\n * preserved.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getEndTime = function(root) {\n var midnight = getMidnight(root);\n var daysLimit = getDaysLimit(root);\n return daysLimit != undefined ? midnight + (daysLimit * SECONDS_IN_DAY) : false;\n };\n\n /**\n * Get a list of events for the given course ids. Returns a promise that will\n * be resolved with the events.\n *\n * @param {array} courseIds The list of course ids to fetch events for.\n * @param {Number} startTime Timestamp to fetch events from.\n * @param {Number} limit Limit to the number of events (this applies per course, not total)\n * @param {Number} endTime Timestamp to fetch events to.\n * @return {object} jQuery promise.\n */\n var getEventsForCourseIds = function(courseIds, startTime, limit, endTime) {\n var args = {\n courseids: courseIds,\n starttime: startTime,\n limit: limit\n };\n\n if (endTime) {\n args.endtime = endTime;\n }\n\n return EventsRepository.queryByCourses(args);\n };\n\n /**\n * Get the last time the events were reloaded.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getEventReloadTime = function(root) {\n return root.data('last-event-load-time');\n };\n\n /**\n * Set the last time the events were reloaded.\n *\n * @param {object} root The rool element.\n * @param {Number} time Timestamp in milliseconds.\n */\n var setEventReloadTime = function(root, time) {\n root.data('last-event-load-time', time);\n };\n\n /**\n * Check if events have begun reloading since the given\n * time.\n *\n * @param {object} root The rool element.\n * @param {Number} time Timestamp in milliseconds.\n * @return {bool}\n */\n var hasReloadedEventsSince = function(root, time) {\n return getEventReloadTime(root) > time;\n };\n\n /**\n * Send a request to the server to load the events for the courses.\n *\n * @param {array} courses List of course objects.\n * @param {Number} startTime Timestamp to load events after.\n * @param {int|undefined} endTime Timestamp to load events up until.\n * @return {object} jQuery promise resolved with the events.\n */\n var loadEventsForCourses = function(courses, startTime, endTime) {\n var courseIds = courses.map(function(course) {\n return course.id;\n });\n\n return getEventsForCourseIds(courseIds, startTime, COURSE_EVENT_LIMIT + 1, endTime);\n };\n\n /**\n * Render the courses in the DOM once the server has returned the courses.\n *\n * @param {array} courses List of course objects.\n * @param {object} root The root element\n * @param {Number} midnight The midnight timestamp in the user's timezone.\n * @param {Number} daysOffset Number of days from today to offset the events.\n * @param {Number} daysLimit Number of days from today to limit the events to.\n * @param {string} noEventsURL URL for the image to display for no events.\n * @return {object} jQuery promise resolved after rendering is complete.\n */\n var updateDisplayFromCourses = function(courses, root, midnight, daysOffset, daysLimit, noEventsURL) {\n // Render the courses template.\n return Templates.render(TEMPLATES.COURSE_ITEMS, {\n courses: courses,\n midnight: midnight,\n hasdaysoffset: true,\n hasdayslimit: daysLimit != undefined,\n daysoffset: daysOffset,\n dayslimit: daysLimit,\n nodayslimit: daysLimit == undefined,\n urls: {\n noevents: noEventsURL\n }\n }).then(function(html) {\n hideLoadingPlaceholder(root);\n\n if (html) {\n // Template rendering is complete and we have the HTML so we can\n // add it to the DOM.\n renderCourseItemsHTML(root, html);\n } else {\n if (!hasLoadedCourses(root)) {\n // There were no courses to render so show the empty placeholder\n // message for the user to tell them.\n showNoCoursesEmptyMessage(root);\n }\n }\n\n return html;\n })\n .then(function(html) {\n if (courses.length < COURSE_LIMIT) {\n // We know there aren't any more courses because we got back less\n // than we asked for so hide the button to request more.\n hideMoreCoursesButton(root);\n } else {\n // Make sure the button is visible if there are more courses to load.\n showMoreCoursesButton(root);\n }\n\n return html;\n })\n .catch(function() {\n hideLoadingPlaceholder(root);\n });\n };\n\n /**\n * Find all of the visible course blocks and initialise the event\n * list module to being loading the events for the course block.\n *\n * @param {object} root The root element for the timeline courses view.\n * @return {object} jQuery promise resolved with courses and events.\n */\n var loadMoreCourses = function(root) {\n var offset = getOffset(root);\n var limit = getLimit(root);\n\n // Start loading the next set of courses.\n return CourseRepository.getEnrolledCoursesByTimelineClassification(\n COURSE_CLASSIFICATION,\n limit,\n offset,\n COURSE_SORT\n ).then(function(result) {\n var startEventLoadingTime = Date.now();\n var courses = result.courses;\n var nextOffset = result.nextoffset;\n var daysOffset = getDaysOffset(root);\n var daysLimit = getDaysLimit(root);\n var midnight = getMidnight(root);\n var startTime = getStartTime(root);\n var endTime = getEndTime(root);\n var noEventsURL = root.attr('data-no-events-url');\n // Record the next offset if we want to request more courses.\n setOffset(root, nextOffset);\n // Load the events for these courses.\n var eventsPromise = loadEventsForCourses(courses, startTime, endTime);\n // Render the courses in the DOM.\n var renderPromise = updateDisplayFromCourses(courses, root, midnight, daysOffset, daysLimit, noEventsURL);\n\n return $.when(eventsPromise, renderPromise)\n .then(function(eventsByCourse) {\n if (hasReloadedEventsSince(root, startEventLoadingTime)) {\n // All of the events are being reloaded so ignore our results.\n return eventsByCourse;\n }\n\n // When we've got all of the courses and events we can render the events in the\n // correct course event list.\n courses.forEach(function(course) {\n var courseId = course.id;\n var events = [];\n var containerSelector = '[data-region=\"course-events-container\"][data-course-id=\"' + courseId + '\"]';\n var courseEventsContainer = root.find(containerSelector);\n var eventListRoot = courseEventsContainer.find(EventList.rootSelector);\n var courseGroups = eventsByCourse.groupedbycourse.filter(function(group) {\n return group.courseid == courseId;\n });\n\n if (courseGroups.length) {\n // Get the events for this course.\n events = courseGroups[0].events;\n }\n\n // Create a preloaded page to pass to the event list because we've already\n // loaded the first page of events.\n var pageOnePreload = $.Deferred().resolve({events: events}).promise();\n // Initialise the event list pagination area for this course.\n Str.get_string('ariaeventlistpaginationnavcourses', 'block_timeline', course.fullnamedisplay)\n .then(function(string) {\n EventList.init(eventListRoot, COURSE_EVENT_LIMIT, {'1': pageOnePreload}, string);\n return string;\n })\n .catch(function() {\n // An error is ok, just render with the default string.\n EventList.init(eventListRoot, COURSE_EVENT_LIMIT, {'1': pageOnePreload});\n });\n });\n\n return eventsByCourse;\n });\n }).catch(Notification.exception);\n };\n\n /**\n * Reload the events for all of the visible courses. These events will be loaded\n * in a single request to the server.\n *\n * @param {object} root The root element.\n * @return {object} jQuery promise resolved with courses and events.\n */\n var reloadCourseEvents = function(root) {\n var startReloadTime = Date.now();\n var startTime = getStartTime(root);\n var endTime = getEndTime(root);\n var courseEventsContainers = root.find(SELECTORS.COURSE_EVENTS_CONTAINER);\n var courseIds = courseEventsContainers.map(function() {\n return $(this).attr('data-course-id');\n }).get();\n\n // Record when we started our request.\n setEventReloadTime(root, startReloadTime);\n\n // Load all of the events for the given courses.\n return getEventsForCourseIds(courseIds, startTime, COURSE_EVENT_LIMIT + 1, endTime)\n .then(function(eventsByCourse) {\n if (hasReloadedEventsSince(root, startReloadTime)) {\n // A new reload has begun so ignore our results.\n return eventsByCourse;\n }\n\n courseEventsContainers.each(function(index, container) {\n container = $(container);\n var courseId = container.attr('data-course-id');\n var courseName = container.find(SELECTORS.COURSE_NAME).text();\n var eventListContainer = container.find(EventList.rootSelector);\n var pageDeferred = $.Deferred();\n var events = [];\n var courseGroups = eventsByCourse.groupedbycourse.filter(function(group) {\n return group.courseid == courseId;\n });\n\n if (courseGroups.length) {\n // Get the events just for this course.\n events = courseGroups[0].events;\n }\n\n pageDeferred.resolve({events: events});\n\n // Re-initialise the events list with the preloaded events we just got from\n // the server.\n Str.get_string('ariaeventlistpaginationnavcourses', 'block_timeline', courseName)\n .then(function(string) {\n EventList.init(eventListContainer, COURSE_EVENT_LIMIT, {'1': pageDeferred.promise()}, string);\n return string;\n })\n .catch(function() {\n // Ignore a failure to load the string. Just render with the default string.\n EventList.init(eventListContainer, COURSE_EVENT_LIMIT, {'1': pageDeferred.promise()});\n });\n });\n\n return eventsByCourse;\n }).catch(Notification.exception);\n };\n\n /**\n * Add event listeners to load more courses for the courses view.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var registerEventListeners = function(root) {\n CustomEvents.define(root, [CustomEvents.events.activate]);\n // Show more courses and load their events when the user clicks the \"more courses\"\n // button.\n root.on(CustomEvents.events.activate, SELECTORS.MORE_COURSES_BUTTON, function(e, data) {\n enableMoreCoursesButtonLoading(root);\n loadMoreCourses(root)\n .then(function() {\n disableMoreCoursesButtonLoading(root);\n return;\n })\n .catch(function() {\n disableMoreCoursesButtonLoading(root);\n });\n\n if (data) {\n data.originalEvent.preventDefault();\n data.originalEvent.stopPropagation();\n }\n e.stopPropagation();\n });\n };\n\n /**\n * Initialise the timeline courses view. Begin loading the events\n * if this view is active. Add the relevant event listeners.\n *\n * This function should only be called once per page load because it\n * is adding event listeners to the page.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var init = function(root) {\n root = $(root);\n\n setEventReloadTime(root, Date.now());\n\n if (root.hasClass('active')) {\n // Only load if this is active otherwise it will be lazy loaded later.\n loadMoreCourses(root);\n root.attr('data-seen', true);\n }\n\n registerEventListeners(root);\n };\n\n /**\n * Reset the element back to it's initial state. Begin loading the events again\n * if this view is active.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var reset = function(root) {\n root.removeAttr('data-seen');\n if (root.hasClass('active')) {\n shown(root);\n }\n };\n\n /**\n * If this is the first time this view has been displayed then begin loading\n * the events.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var shown = function(root) {\n if (!root.attr('data-seen')) {\n if (hasLoadedCourses(root)) {\n // This isn't the first time this view is shown so just reload the\n // events for the courses we've already loaded.\n reloadCourseEvents(root);\n } else {\n // We haven't loaded any courses yet so do that now.\n loadMoreCourses(root);\n }\n\n root.attr('data-seen', true);\n }\n };\n\n return {\n init: init,\n reset: reset,\n shown: shown\n };\n});\n"],"names":["define","$","Notification","CustomEvents","Str","Templates","EventList","CourseRepository","EventsRepository","SELECTORS","TEMPLATES","hideLoadingPlaceholder","root","find","addClass","disableMoreCoursesButtonLoading","button","prop","remove","hasLoadedCourses","length","getDaysOffset","parseInt","attr","getDaysLimit","daysLimit","undefined","getMidnight","getStartTime","getEndTime","midnight","getEventsForCourseIds","courseIds","startTime","limit","endTime","args","courseids","starttime","endtime","queryByCourses","setEventReloadTime","time","data","hasReloadedEventsSince","getEventReloadTime","updateDisplayFromCourses","courses","daysOffset","noEventsURL","render","hasdaysoffset","hasdayslimit","daysoffset","dayslimit","nodayslimit","urls","noevents","then","html","container","appendNodeContents","renderCourseItemsHTML","removeClass","showNoCoursesEmptyMessage","hideMoreCoursesButton","showMoreCoursesButton","catch","loadMoreCourses","offset","getOffset","getLimit","getEnrolledCoursesByTimelineClassification","result","startEventLoadingTime","Date","now","nextOffset","nextoffset","setOffset","eventsPromise","map","course","id","COURSE_EVENT_LIMIT","loadEventsForCourses","renderPromise","when","eventsByCourse","forEach","courseId","events","containerSelector","eventListRoot","rootSelector","courseGroups","groupedbycourse","filter","group","courseid","pageOnePreload","Deferred","resolve","promise","get_string","fullnamedisplay","string","init","exception","registerEventListeners","activate","on","e","append","enableMoreCoursesButtonLoading","originalEvent","preventDefault","stopPropagation","shown","startReloadTime","courseEventsContainers","this","get","each","index","courseName","text","eventListContainer","pageDeferred","reloadCourseEvents","hasClass","reset","removeAttr"],"mappings":";;;;;;AAsBAA,OACA,8BAAA,CACI,SACA,oBACA,iCACA,WACA,iBACA,4BACA,yBACA,8CAEJ,SACIC,EACAC,aACAC,aACAC,IACAC,UACAC,UACAC,iBACAC,kBAGA,IAAIC,8BACqB,+BADrBA,wCAE+B,gDAF/BA,mCAG0B,2CAH1BA,uBAIc,+BAJdA,2CAKkC,mDALlCA,kCAMyB,0CANzBA,sBAOa,8BAPbA,uBAQc,gBAGdC,uBACc,8BADdA,uBAEc,eAcdC,uBAAyB,SAASC,MAClCA,KAAKC,KAAKJ,4CAA4CK,SAAS,SAClE,EA4CGC,gCAAkC,SAASH,MACvCI,IAAAA,OAASJ,KAAKC,KAAKJ,+BACvBO,OAAOC,KAAK,YAAY,GACxBD,OAAOH,KAAKJ,wBAAwBS,QACvC,EA4BGC,iBAAmB,SAASP,MACrBA,OAAAA,KAAKC,KAAKJ,mCAAmCW,OAAS,CAChE,EAsCGC,cAAgB,SAAST,MAClBU,OAAAA,SAASV,KAAKW,KAAK,oBAAqB,GAClD,EAUGC,aAAe,SAASZ,MACxB,IAAIa,UAAYb,KAAKW,KAAK,mBACnBE,OAAaC,MAAbD,UAAyBH,SAASG,UAAW,SAAMC,CAC7D,EAQGC,YAAc,SAASf,MAChBU,OAAAA,SAASV,KAAKW,KAAK,iBAAkB,GAC/C,EAUGK,aAAe,SAAShB,MAGxB,OAFee,YAAYf,MAjKV,MAkKAS,cAAcT,KAElC,EAUGiB,WAAa,SAASjB,MACtB,IAAIkB,SAAWH,YAAYf,MACvBa,UAAYD,aAAaZ,MACtBa,OAAaC,MAAbD,WAAyBK,SAjLf,MAiL2BL,SAC/C,EAYGM,sBAAwB,SAASC,UAAWC,UAAWC,MAAOC,SAC9D,IAAIC,KAAO,CACPC,UAAWL,UACXM,UAAWL,UACXC,MAAOA,OAOX,OAJIC,UACAC,KAAKG,QAAUJ,SAGZ3B,iBAAiBgC,eAAeJ,KAC1C,EAkBGK,mBAAqB,SAAS7B,KAAM8B,MACpC9B,KAAK+B,KAAK,uBAAwBD,KACrC,EAUGE,uBAAyB,SAAShC,KAAM8B,MACxC,OAvBqB,SAAS9B,MAC9B,OAAOA,KAAK+B,KAAK,uBACpB,CAqBUE,CAAmBjC,MAAQ8B,IACrC,EA6BGI,yBAA2B,SAASC,QAASnC,KAAMkB,SAAUkB,WAAYvB,UAAWwB,aAEpF,OAAO5C,UAAU6C,OAAOxC,uBAAwB,CAC5CqC,QAASA,QACTjB,SAAUA,SACVqB,eAAe,EACfC,aAA2B1B,MAAbD,UACd4B,WAAYL,WACZM,UAAW7B,UACX8B,YAA0B7B,MAAbD,UACb+B,KAAM,CACFC,SAAUR,eAEfS,MAAK,SAASC,MAeb,OAdAhD,uBAAuBC,MAEnB+C,KA7MgB,SAAS/C,KAAM+C,MACnCC,IAAAA,UAAYhD,KAAKC,KAAKJ,wBAC1BJ,UAAUwD,mBAAmBD,UAAWD,KAAM,GACjD,CA6MWG,CAAsBlD,KAAM+C,MAEvBxC,iBAAiBP,OA5NF,SAASA,MACrCA,KAAKC,KAAKJ,oCAAoCsD,YAAY,SAC7D,CA6NeC,CAA0BpD,MAI3B+C,IACV,IACAD,MAAK,SAASC,MAUX,OATIZ,QAAQ3B,OAvSD,EAiBS,SAASR,MACjCA,KAAKC,KAAKJ,yCAAyCK,SAAS,SAC/D,CAuRWmD,CAAsBrD,MAhRN,SAASA,MACjCA,KAAKC,KAAKJ,yCAAyCsD,YAAY,SAClE,CAiRWG,CAAsBtD,MAGnB+C,IACV,IACAQ,OAAM,WACHxD,uBAAuBC,KAC1B,GACJ,EASGwD,gBAAkB,SAASxD,MAC3B,IAAIyD,OA/NQ,SAASzD,MACdU,OAAAA,SAASV,KAAKW,KAAK,eAAgB,GAC7C,CA6NgB+C,CAAU1D,MACnBsB,MA5MO,SAAStB,MACbU,OAAAA,SAASV,KAAKW,KAAK,cAAe,GAC5C,CA0MegD,CAAS3D,MAGrB,OAAOL,iBAAiBiE,2CAtUA,MAwUpBtC,MACAmC,OAxUU,gBA0UZX,MAAK,SAASe,QACZ,IAAIC,sBAAwBC,KAAKC,MAC7B7B,QAAU0B,OAAO1B,QACjB8B,WAAaJ,OAAOK,WACpB9B,WAAa3B,cAAcT,MAC3Ba,UAAYD,aAAaZ,MACzBkB,SAAWH,YAAYf,MACvBqB,UAAYL,aAAahB,MACzBuB,QAAUN,WAAWjB,MACrBqC,YAAcrC,KAAKW,KAAK,uBAvOpB,SAASX,KAAMyD,QAC3BzD,KAAKW,KAAK,cAAe8C,OAC5B,CAuOOU,CAAUnE,KAAMiE,YAEZG,IAAAA,cAhGe,SAASjC,QAASd,UAAWE,SAChDH,IAAAA,UAAYe,QAAQkC,KAAI,SAASC,QAC1BA,OAAAA,OAAOC,EACjB,IAEMpD,OAAAA,sBAAsBC,UAAWC,UAAWmD,EAAwBjD,QAC9E,CA0F2BkD,CAAqBtC,QAASd,UAAWE,SAEzDmD,cAAgBxC,yBAAyBC,QAASnC,KAAMkB,SAAUkB,WAAYvB,UAAWwB,aAE7F,OAAOhD,EAAEsF,KAAKP,cAAeM,eACxB5B,MAAK,SAAS8B,gBACX,OAAI5C,uBAAuBhC,KAAM8D,wBAOjC3B,QAAQ0C,SAAQ,SAASP,QACrB,IAAIQ,SAAWR,OAAOC,GAClBQ,OAAS,GACTC,kBAAoB,2DAA6DF,SAAW,KAE5FG,cADwBjF,KAAKC,KAAK+E,mBACI/E,KAAKP,UAAUwF,cACrDC,aAAeP,eAAeQ,gBAAgBC,QAAO,SAASC,OAC9D,OAAOA,MAAMC,UAAYT,QAC5B,IAEGK,aAAa3E,SAEbuE,OAASI,aAAa,GAAGJ,QAK7B,IAAIS,eAAiBnG,EAAEoG,WAAWC,QAAQ,CAACX,OAAQA,SAASY,UAE5DnG,IAAIoG,WAAW,oCAAqC,iBAAkBtB,OAAOuB,iBACxE/C,MAAK,SAASgD,QAEX,OADApG,UAAUqG,KAAKd,cAxXlB,EAwXqD,CAAMO,EAAAA,gBAAiBM,QAClEA,MACV,IACAvC,OAAM,WAEH7D,UAAUqG,KAAKd,cA7XlB,EA6XqD,CAAMO,EAAAA,gBAC3D,GACR,IAjCUZ,cAoCd,GA9DF,IA+DJrB,MAAMjE,aAAa0G,UACzB,EAqEGC,uBAAyB,SAASjG,MAClCT,aAAaH,OAAOY,KAAM,CAACT,aAAawF,OAAOmB,WAG/ClG,KAAKmG,GAAG5G,aAAawF,OAAOmB,SAAUrG,+BAA+B,SAASuG,EAAGrE,OAzahD,SAAS/B,MACtCI,IAAAA,OAASJ,KAAKC,KAAKJ,+BACvBO,OAAOC,KAAK,YAAY,GACxBZ,UAAU6C,OAAOxC,uBAAwB,CAAA,GACpCgD,MAAK,SAASC,MAEX,OADA3C,OAAOiG,OAAOtD,MACPA,IACV,IACAQ,OAAM,WAEH,OAAO,CACV,GACR,CA8ZO+C,CAA+BtG,MAC/BwD,gBAAgBxD,MACX8C,MAAK,WACF3C,gCAAgCH,KAEnC,IACAuD,OAAM,WACHpD,gCAAgCH,KACnC,IAED+B,OACAA,KAAKwE,cAAcC,iBACnBzE,KAAKwE,cAAcE,mBAEvBL,EAAEK,iBACL,GACJ,EA4CGC,MAAQ,SAAS1G,MACZA,KAAKW,KAAK,eACPJ,iBAAiBP,MA/HJ,SAASA,MAC9B,IAAI2G,gBAAkB5C,KAAKC,MACvB3C,UAAYL,aAAahB,MACzBuB,QAAUN,WAAWjB,MACrB4G,uBAAyB5G,KAAKC,KAAKJ,mCACnCuB,UAAYwF,uBAAuBvC,KAAI,WAChChF,OAAAA,EAAEwH,MAAMlG,KAAK,iBACvB,IAAEmG,MAGHjF,mBAAmB7B,KAAM2G,iBAGlBxF,sBAAsBC,UAAWC,UAAWmD,EAAwBjD,SACtEuB,MAAK,SAAS8B,gBACX,OAAI5C,uBAAuBhC,KAAM2G,kBAKjCC,uBAAuBG,MAAK,SAASC,MAAOhE,WAExC,IAAI8B,UADJ9B,UAAY3D,EAAE2D,YACWrC,KAAK,kBAC1BsG,WAAajE,UAAU/C,KAAKJ,uBAAuBqH,OACnDC,mBAAqBnE,UAAU/C,KAAKP,UAAUwF,cAC9CkC,aAAe/H,EAAEoG,WACjBV,OAAS,GACTI,aAAeP,eAAeQ,gBAAgBC,QAAO,SAASC,OAC9D,OAAOA,MAAMC,UAAYT,QAC5B,IAEGK,aAAa3E,SAEbuE,OAASI,aAAa,GAAGJ,QAG7BqC,aAAa1B,QAAQ,CAACX,OAAQA,SAI9BvF,IAAIoG,WAAW,oCAAqC,iBAAkBqB,YACjEnE,MAAK,SAASgD,QAEX,OADApG,UAAUqG,KAAKoB,mBAvbd,EAubsD,CAAMC,EAAAA,aAAazB,WAAYG,QAC/EA,MACV,IACAvC,OAAM,WAEH7D,UAAUqG,KAAKoB,mBA5bd,EA4bsD,CAAMC,EAAAA,aAAazB,WAC7E,GACR,IAhCUf,cAJZ,IAuCArB,MAAMjE,aAAa0G,UAC7B,CA6EWqB,CAAmBrH,MAGnBwD,gBAAgBxD,MAGpBA,KAAKW,KAAK,aAAa,GAE9B,EAEM,MAAA,CACHoF,KAjDO,SAAS/F,MAChBA,KAAOX,EAAEW,MAET6B,mBAAmB7B,KAAM+D,KAAKC,OAE1BhE,KAAKsH,SAAS,YAEd9D,gBAAgBxD,MAChBA,KAAKW,KAAK,aAAa,IAG3BsF,uBAAuBjG,KAC1B,EAsCGuH,MA9BQ,SAASvH,MACjBA,KAAKwH,WAAW,aACZxH,KAAKsH,SAAS,WACdZ,MAAM1G,KAEb,EA0BG0G,MAAOA,MAEd"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/view_dates.min.js.map b/blocks/timeline/amd/build/view_dates.min.js.map index cc5fb05fc1a..099b5ab8cde 100644 --- a/blocks/timeline/amd/build/view_dates.min.js.map +++ b/blocks/timeline/amd/build/view_dates.min.js.map @@ -1 +1 @@ -{"version":3,"file":"view_dates.min.js","sources":["../src/view_dates.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 * Manage the timeline dates view for the timeline block.\n *\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/str',\n 'block_timeline/event_list',\n 'core/pubsub',\n 'core/paged_content_events'\n],\nfunction(\n $,\n Str,\n EventList,\n PubSub,\n PagedContentEvents\n) {\n\n var SELECTORS = {\n EVENT_LIST_CONTAINER: '[data-region=\"event-list-container\"]',\n };\n\n var DEFAULT_PAGE_LIMIT = [5, 10, 25];\n\n /**\n * Generate a paged content array of limits taking into account user preferences\n *\n * @param {object} root The root element for the timeline dates view.\n * @return {array} Array of limit objects\n */\n var getPagingLimits = function(root) {\n var limitPref = parseInt(root.data('limit'), 10);\n var isDefaultSet = false;\n var limits = DEFAULT_PAGE_LIMIT.map(function(value) {\n if (limitPref == value) {\n isDefaultSet = true;\n }\n\n return {\n value: value,\n active: limitPref == value\n };\n });\n\n if (!isDefaultSet) {\n limits[0].active = true;\n }\n\n return limits;\n };\n\n /**\n * Setup the listeners for the timeline block\n *\n * @param {string} root view dates container\n * @param {string} namespace The namespace for the paged content\n */\n var registerEventListeners = function(root, namespace) {\n var event = namespace + PagedContentEvents.SET_ITEMS_PER_PAGE_LIMIT;\n PubSub.subscribe(event, function(limit) {\n $(root).data('limit', limit);\n });\n };\n\n /**\n * Initialise the event list and being loading the events.\n *\n * @param {object} root The root element for the timeline dates view.\n */\n var load = function(root) {\n var eventListContainer = root.find(SELECTORS.EVENT_LIST_CONTAINER);\n var namespace = $(eventListContainer).attr('id') + \"user_block_timeline\" + Math.random();\n registerEventListeners(root, namespace);\n\n var limits = getPagingLimits(root);\n var config = {\n persistentLimitKey: \"block_timeline_user_limit_preference\",\n eventNamespace: namespace\n };\n Str.get_string('ariaeventlistpaginationnavdates', 'block_timeline')\n .then(function(string) {\n EventList.init(eventListContainer, limits, {}, string, config);\n return string;\n })\n .catch(function() {\n // Ignore if we can't load the string. Still init the event list.\n EventList.init(eventListContainer, limits, {}, \"\", config);\n });\n };\n\n /**\n * Initialise the timeline dates view. Begin loading the events\n * if this view is active.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var init = function(root) {\n root = $(root);\n if (root.hasClass('active')) {\n load(root);\n root.attr('data-seen', true);\n }\n };\n\n /**\n * Reset the view back to it's initial state. If this view is active then\n * beging loading the events.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var reset = function(root) {\n root.removeAttr('data-seen');\n if (root.hasClass('active')) {\n load(root);\n root.attr('data-seen', true);\n }\n };\n\n /**\n * Load the events if this is the first time the view is displayed.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var shown = function(root) {\n if (!root.attr('data-seen')) {\n load(root);\n root.attr('data-seen', true);\n }\n };\n\n return {\n init: init,\n reset: reset,\n shown: shown\n };\n});\n"],"names":["define","$","Str","EventList","PubSub","PagedContentEvents","SELECTORS","DEFAULT_PAGE_LIMIT","load","root","eventListContainer","find","namespace","attr","Math","random","event","SET_ITEMS_PER_PAGE_LIMIT","subscribe","limit","data","registerEventListeners","limits","limitPref","parseInt","isDefaultSet","map","value","active","getPagingLimits","config","persistentLimitKey","eventNamespace","get_string","then","string","init","catch","hasClass","reset","removeAttr","shown"],"mappings":";;;;;;AAsBAA,mCACA,CACI,SACA,WACA,4BACA,cACA,8BAEJ,SACIC,EACAC,IACAC,UACAC,OACAC,wBAGIC,+BACsB,uCAGtBC,mBAAqB,CAAC,EAAG,GAAI,IA+C7BC,KAAO,SAASC,UACZC,mBAAqBD,KAAKE,KAAKL,gCAC/BM,UAAYX,EAAES,oBAAoBG,KAAK,MAAQ,sBAAwBC,KAAKC,UAdvD,SAASN,KAAMG,eACpCI,MAAQJ,UAAYP,mBAAmBY,yBAC3Cb,OAAOc,UAAUF,OAAO,SAASG,OAC7BlB,EAAEQ,MAAMW,KAAK,QAASD,UAY1BE,CAAuBZ,KAAMG,eAEzBU,OA5Cc,SAASb,UACvBc,UAAYC,SAASf,KAAKW,KAAK,SAAU,IACzCK,cAAe,EACfH,OAASf,mBAAmBmB,KAAI,SAASC,cACrCJ,WAAaI,QACbF,cAAe,GAGZ,CACHE,MAAOA,MACPC,OAAQL,WAAaI,iBAIxBF,eACDH,OAAO,GAAGM,QAAS,GAGhBN,OA0BMO,CAAgBpB,MACzBqB,OAAS,CACTC,mBAAoB,uCACpBC,eAAgBpB,WAEpBV,IAAI+B,WAAW,kCAAmC,kBAC7CC,MAAK,SAASC,eACXhC,UAAUiC,KAAK1B,mBAAoBY,OAAQ,GAAIa,OAAQL,QAChDK,UAEVE,OAAM,WAEHlC,UAAUiC,KAAK1B,mBAAoBY,OAAQ,GAAI,GAAIQ,kBA4CxD,CACHM,KAnCO,SAAS3B,OAChBA,KAAOR,EAAEQ,OACA6B,SAAS,YACd9B,KAAKC,MACLA,KAAKI,KAAK,aAAa,KAgC3B0B,MAtBQ,SAAS9B,MACjBA,KAAK+B,WAAW,aACZ/B,KAAK6B,SAAS,YACd9B,KAAKC,MACLA,KAAKI,KAAK,aAAa,KAmB3B4B,MAVQ,SAAShC,MACZA,KAAKI,KAAK,eACXL,KAAKC,MACLA,KAAKI,KAAK,aAAa"} \ No newline at end of file +{"version":3,"file":"view_dates.min.js","sources":["../src/view_dates.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 * Manage the timeline dates view for the timeline block.\n *\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/str',\n 'block_timeline/event_list',\n 'core/pubsub',\n 'core/paged_content_events'\n],\nfunction(\n $,\n Str,\n EventList,\n PubSub,\n PagedContentEvents\n) {\n\n var SELECTORS = {\n EVENT_LIST_CONTAINER: '[data-region=\"event-list-container\"]',\n };\n\n var DEFAULT_PAGE_LIMIT = [5, 10, 25];\n\n /**\n * Generate a paged content array of limits taking into account user preferences\n *\n * @param {object} root The root element for the timeline dates view.\n * @return {array} Array of limit objects\n */\n var getPagingLimits = function(root) {\n var limitPref = parseInt(root.data('limit'), 10);\n var isDefaultSet = false;\n var limits = DEFAULT_PAGE_LIMIT.map(function(value) {\n if (limitPref == value) {\n isDefaultSet = true;\n }\n\n return {\n value: value,\n active: limitPref == value\n };\n });\n\n if (!isDefaultSet) {\n limits[0].active = true;\n }\n\n return limits;\n };\n\n /**\n * Setup the listeners for the timeline block\n *\n * @param {string} root view dates container\n * @param {string} namespace The namespace for the paged content\n */\n var registerEventListeners = function(root, namespace) {\n var event = namespace + PagedContentEvents.SET_ITEMS_PER_PAGE_LIMIT;\n PubSub.subscribe(event, function(limit) {\n $(root).data('limit', limit);\n });\n };\n\n /**\n * Initialise the event list and being loading the events.\n *\n * @param {object} root The root element for the timeline dates view.\n */\n var load = function(root) {\n var eventListContainer = root.find(SELECTORS.EVENT_LIST_CONTAINER);\n var namespace = $(eventListContainer).attr('id') + \"user_block_timeline\" + Math.random();\n registerEventListeners(root, namespace);\n\n var limits = getPagingLimits(root);\n var config = {\n persistentLimitKey: \"block_timeline_user_limit_preference\",\n eventNamespace: namespace\n };\n Str.get_string('ariaeventlistpaginationnavdates', 'block_timeline')\n .then(function(string) {\n EventList.init(eventListContainer, limits, {}, string, config);\n return string;\n })\n .catch(function() {\n // Ignore if we can't load the string. Still init the event list.\n EventList.init(eventListContainer, limits, {}, \"\", config);\n });\n };\n\n /**\n * Initialise the timeline dates view. Begin loading the events\n * if this view is active.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var init = function(root) {\n root = $(root);\n if (root.hasClass('active')) {\n load(root);\n root.attr('data-seen', true);\n }\n };\n\n /**\n * Reset the view back to it's initial state. If this view is active then\n * beging loading the events.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var reset = function(root) {\n root.removeAttr('data-seen');\n if (root.hasClass('active')) {\n load(root);\n root.attr('data-seen', true);\n }\n };\n\n /**\n * Load the events if this is the first time the view is displayed.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var shown = function(root) {\n if (!root.attr('data-seen')) {\n load(root);\n root.attr('data-seen', true);\n }\n };\n\n return {\n init: init,\n reset: reset,\n shown: shown\n };\n});\n"],"names":["define","$","Str","EventList","PubSub","PagedContentEvents","SELECTORS","DEFAULT_PAGE_LIMIT","load","root","eventListContainer","find","namespace","attr","Math","random","event","SET_ITEMS_PER_PAGE_LIMIT","subscribe","limit","data","registerEventListeners","limits","limitPref","parseInt","isDefaultSet","map","value","active","getPagingLimits","config","persistentLimitKey","eventNamespace","get_string","then","string","init","catch","hasClass","reset","removeAttr","shown"],"mappings":";;;;;;AAsBAA,OAAM,4BACN,CACI,SACA,WACA,4BACA,cACA,8BAEJ,SACIC,EACAC,IACAC,UACAC,OACAC,oBAGA,IAAIC,+BACsB,uCAGtBC,mBAAqB,CAAC,EAAG,GAAI,IA+C7BC,KAAO,SAASC,MACZC,IAAAA,mBAAqBD,KAAKE,KAAKL,gCAC/BM,UAAYX,EAAES,oBAAoBG,KAAK,MAAQ,sBAAwBC,KAAKC,UAdvD,SAASN,KAAMG,WACxC,IAAII,MAAQJ,UAAYP,mBAAmBY,yBAC3Cb,OAAOc,UAAUF,OAAO,SAASG,OAC7BlB,EAAEQ,MAAMW,KAAK,QAASD,MACzB,GACJ,CAUGE,CAAuBZ,KAAMG,WAE7B,IAAIU,OA5Cc,SAASb,MAC3B,IAAIc,UAAYC,SAASf,KAAKW,KAAK,SAAU,IACzCK,cAAe,EACfH,OAASf,mBAAmBmB,KAAI,SAASC,OAKlC,OAJHJ,WAAaI,QACbF,cAAe,GAGZ,CACHE,MAAOA,MACPC,OAAQL,WAAaI,MAE5B,IAMD,OAJKF,eACDH,OAAO,GAAGM,QAAS,GAGhBN,MACV,CAyBgBO,CAAgBpB,MACzBqB,OAAS,CACTC,mBAAoB,uCACpBC,eAAgBpB,WAEpBV,IAAI+B,WAAW,kCAAmC,kBAC7CC,MAAK,SAASC,QAEX,OADAhC,UAAUiC,KAAK1B,mBAAoBY,OAAQ,CAAA,EAAIa,OAAQL,QAChDK,MACV,IACAE,OAAM,WAEHlC,UAAUiC,KAAK1B,mBAAoBY,OAAQ,CAAA,EAAI,GAAIQ,OACtD,GACR,EA0CM,MAAA,CACHM,KAnCO,SAAS3B,OAChBA,KAAOR,EAAEQ,OACA6B,SAAS,YACd9B,KAAKC,MACLA,KAAKI,KAAK,aAAa,GAE9B,EA8BG0B,MAtBQ,SAAS9B,MACjBA,KAAK+B,WAAW,aACZ/B,KAAK6B,SAAS,YACd9B,KAAKC,MACLA,KAAKI,KAAK,aAAa,GAE9B,EAiBG4B,MAVQ,SAAShC,MACZA,KAAKI,KAAK,eACXL,KAAKC,MACLA,KAAKI,KAAK,aAAa,GAE9B,EAOJ"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/view_nav.min.js.map b/blocks/timeline/amd/build/view_nav.min.js.map index 069db0e407a..47cd1e04fc3 100644 --- a/blocks/timeline/amd/build/view_nav.min.js.map +++ b/blocks/timeline/amd/build/view_nav.min.js.map @@ -1 +1 @@ -{"version":3,"file":"view_nav.min.js","sources":["../src/view_nav.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 * Manage the timeline view navigation for the timeline block.\n *\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/custom_interaction_events',\n 'block_timeline/view',\n 'core/ajax',\n 'core/notification'\n],\nfunction(\n $,\n CustomEvents,\n View,\n Ajax,\n Notification\n) {\n\n var SELECTORS = {\n TIMELINE_DAY_FILTER: '[data-region=\"day-filter\"]',\n TIMELINE_DAY_FILTER_OPTION: '[data-from]',\n TIMELINE_VIEW_SELECTOR: '[data-region=\"view-selector\"]',\n DATA_DAYS_OFFSET: '[data-days-offset]',\n DATA_DAYS_LIMIT: '[data-days-limit]',\n };\n\n /**\n * Generic handler to persist user preferences\n *\n * @param {string} type The name of the attribute you're updating\n * @param {string} value The value of the attribute you're updating\n */\n var updateUserPreferences = function(type, value) {\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: {\n preferences: [\n {\n type: type,\n value: value\n }\n ]\n }\n };\n\n Ajax.call([request])[0]\n .fail(Notification.exception);\n };\n\n /**\n * Event listener for the day selector (\"Next 7 days\", \"Next 30 days\", etc).\n *\n * @param {object} root The root element for the timeline block\n * @param {object} timelineViewRoot The root element for the timeline view\n */\n var registerTimelineDaySelector = function(root, timelineViewRoot) {\n var timelineDaySelectorContainer = root.find(SELECTORS.TIMELINE_DAY_FILTER);\n\n CustomEvents.define(timelineDaySelectorContainer, [CustomEvents.events.activate]);\n timelineDaySelectorContainer.on(\n CustomEvents.events.activate,\n SELECTORS.TIMELINE_DAY_FILTER_OPTION,\n function(e, data) {\n // Update the user preference\n var filtername = $(e.currentTarget).data('filtername');\n var type = 'block_timeline_user_filter_preference';\n updateUserPreferences(type, filtername);\n\n var option = $(e.target).closest(SELECTORS.TIMELINE_DAY_FILTER_OPTION);\n\n if (option.attr('aria-current') == 'true') {\n // If it's already active then we don't need to do anything.\n return;\n }\n\n var daysOffset = option.attr('data-from');\n var daysLimit = option.attr('data-to');\n var elementsWithDaysOffset = root.find(SELECTORS.DATA_DAYS_OFFSET);\n\n elementsWithDaysOffset.attr('data-days-offset', daysOffset);\n\n if (daysLimit != undefined) {\n elementsWithDaysOffset.attr('data-days-limit', daysLimit);\n } else {\n elementsWithDaysOffset.removeAttr('data-days-limit');\n }\n\n // Reset the views to reinitialise the event lists now that we've\n // updated the day limits.\n View.reset(timelineViewRoot);\n\n data.originalEvent.preventDefault();\n }\n );\n };\n\n /**\n * Event listener for the \"sort\" button in the timeline navigation that allows for\n * changing between the timeline dates and courses views.\n *\n * On a view change we tell the timeline view module that the view has been shown\n * so that it can handle how to display the appropriate view.\n *\n * @param {object} root The root element for the timeline block\n * @param {object} timelineViewRoot The root element for the timeline view\n */\n var registerViewSelector = function(root, timelineViewRoot) {\n var viewSelector = root.find(SELECTORS.TIMELINE_VIEW_SELECTOR);\n\n // Listen for when the user changes tab so that we can show the first set of courses\n // and load their events when they request the sort by courses view for the first time.\n viewSelector.on('shown shown.bs.tab', function(e) {\n View.shown(timelineViewRoot);\n $(e.target).removeClass('active');\n });\n\n\n // Event selector for user_sort\n CustomEvents.define(viewSelector, [CustomEvents.events.activate]);\n viewSelector.on(CustomEvents.events.activate, \"[data-toggle='tab']\", function(e) {\n var filtername = $(e.currentTarget).data('filtername');\n var type = 'block_timeline_user_sort_preference';\n updateUserPreferences(type, filtername);\n });\n };\n\n /**\n * Initialise the timeline view navigation by adding event listeners to\n * the navigation elements.\n *\n * @param {object} root The root element for the timeline block\n * @param {object} timelineViewRoot The root element for the timeline view\n */\n var init = function(root, timelineViewRoot) {\n root = $(root);\n registerTimelineDaySelector(root, timelineViewRoot);\n registerViewSelector(root, timelineViewRoot);\n };\n\n return {\n init: init\n };\n});\n"],"names":["define","$","CustomEvents","View","Ajax","Notification","SELECTORS","updateUserPreferences","type","value","request","methodname","args","preferences","call","fail","exception","init","root","timelineViewRoot","timelineDaySelectorContainer","find","events","activate","on","e","data","filtername","currentTarget","option","target","closest","attr","daysOffset","daysLimit","elementsWithDaysOffset","undefined","removeAttr","reset","originalEvent","preventDefault","registerTimelineDaySelector","viewSelector","shown","removeClass","registerViewSelector"],"mappings":";;;;;;AAsBAA,iCACA,CACI,SACA,iCACA,sBACA,YACA,sBAEJ,SACIC,EACAC,aACAC,KACAC,KACAC,kBAGIC,8BACqB,6BADrBA,qCAE4B,cAF5BA,iCAGwB,gCAHxBA,2BAIkB,qBAUlBC,sBAAwB,SAASC,KAAMC,WACnCC,QAAU,CACVC,WAAY,oCACZC,KAAM,CACFC,YAAa,CACT,CACIL,KAAMA,KACNC,MAAOA,UAMvBL,KAAKU,KAAK,CAACJ,UAAU,GAChBK,KAAKV,aAAaW,kBA6FpB,CACHC,KAPO,SAASC,KAAMC,mBA9EQ,SAASD,KAAMC,sBACzCC,6BAA+BF,KAAKG,KAAKf,+BAE7CJ,aAAaF,OAAOoB,6BAA8B,CAAClB,aAAaoB,OAAOC,WACvEH,6BAA6BI,GACzBtB,aAAaoB,OAAOC,SACpBjB,sCACA,SAASmB,EAAGC,UAEJC,WAAa1B,EAAEwB,EAAEG,eAAeF,KAAK,cAEzCnB,sBADW,wCACiBoB,gBAExBE,OAAS5B,EAAEwB,EAAEK,QAAQC,QAAQzB,yCAEE,QAA/BuB,OAAOG,KAAK,qBAKZC,WAAaJ,OAAOG,KAAK,aACzBE,UAAYL,OAAOG,KAAK,WACxBG,uBAAyBjB,KAAKG,KAAKf,4BAEvC6B,uBAAuBH,KAAK,mBAAoBC,YAE/BG,MAAbF,UACAC,uBAAuBH,KAAK,kBAAmBE,WAE/CC,uBAAuBE,WAAW,mBAKtClC,KAAKmC,MAAMnB,kBAEXO,KAAKa,cAAcC,sBA4C3BC,CADAvB,KAAOjB,EAAEiB,MACyBC,kBA7BX,SAASD,KAAMC,sBAClCuB,aAAexB,KAAKG,KAAKf,kCAI7BoC,aAAalB,GAAG,sBAAsB,SAASC,GAC3CtB,KAAKwC,MAAMxB,kBACXlB,EAAEwB,EAAEK,QAAQc,YAAY,aAK5B1C,aAAaF,OAAO0C,aAAc,CAACxC,aAAaoB,OAAOC,WACvDmB,aAAalB,GAAGtB,aAAaoB,OAAOC,SAAU,uBAAuB,SAASE,OACtEE,WAAa1B,EAAEwB,EAAEG,eAAeF,KAAK,cAEzCnB,sBADW,sCACiBoB,eAchCkB,CAAqB3B,KAAMC"} \ No newline at end of file +{"version":3,"file":"view_nav.min.js","sources":["../src/view_nav.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 * Manage the timeline view navigation for the timeline block.\n *\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/custom_interaction_events',\n 'block_timeline/view',\n 'core/ajax',\n 'core/notification'\n],\nfunction(\n $,\n CustomEvents,\n View,\n Ajax,\n Notification\n) {\n\n var SELECTORS = {\n TIMELINE_DAY_FILTER: '[data-region=\"day-filter\"]',\n TIMELINE_DAY_FILTER_OPTION: '[data-from]',\n TIMELINE_VIEW_SELECTOR: '[data-region=\"view-selector\"]',\n DATA_DAYS_OFFSET: '[data-days-offset]',\n DATA_DAYS_LIMIT: '[data-days-limit]',\n };\n\n /**\n * Generic handler to persist user preferences\n *\n * @param {string} type The name of the attribute you're updating\n * @param {string} value The value of the attribute you're updating\n */\n var updateUserPreferences = function(type, value) {\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: {\n preferences: [\n {\n type: type,\n value: value\n }\n ]\n }\n };\n\n Ajax.call([request])[0]\n .fail(Notification.exception);\n };\n\n /**\n * Event listener for the day selector (\"Next 7 days\", \"Next 30 days\", etc).\n *\n * @param {object} root The root element for the timeline block\n * @param {object} timelineViewRoot The root element for the timeline view\n */\n var registerTimelineDaySelector = function(root, timelineViewRoot) {\n var timelineDaySelectorContainer = root.find(SELECTORS.TIMELINE_DAY_FILTER);\n\n CustomEvents.define(timelineDaySelectorContainer, [CustomEvents.events.activate]);\n timelineDaySelectorContainer.on(\n CustomEvents.events.activate,\n SELECTORS.TIMELINE_DAY_FILTER_OPTION,\n function(e, data) {\n // Update the user preference\n var filtername = $(e.currentTarget).data('filtername');\n var type = 'block_timeline_user_filter_preference';\n updateUserPreferences(type, filtername);\n\n var option = $(e.target).closest(SELECTORS.TIMELINE_DAY_FILTER_OPTION);\n\n if (option.attr('aria-current') == 'true') {\n // If it's already active then we don't need to do anything.\n return;\n }\n\n var daysOffset = option.attr('data-from');\n var daysLimit = option.attr('data-to');\n var elementsWithDaysOffset = root.find(SELECTORS.DATA_DAYS_OFFSET);\n\n elementsWithDaysOffset.attr('data-days-offset', daysOffset);\n\n if (daysLimit != undefined) {\n elementsWithDaysOffset.attr('data-days-limit', daysLimit);\n } else {\n elementsWithDaysOffset.removeAttr('data-days-limit');\n }\n\n // Reset the views to reinitialise the event lists now that we've\n // updated the day limits.\n View.reset(timelineViewRoot);\n\n data.originalEvent.preventDefault();\n }\n );\n };\n\n /**\n * Event listener for the \"sort\" button in the timeline navigation that allows for\n * changing between the timeline dates and courses views.\n *\n * On a view change we tell the timeline view module that the view has been shown\n * so that it can handle how to display the appropriate view.\n *\n * @param {object} root The root element for the timeline block\n * @param {object} timelineViewRoot The root element for the timeline view\n */\n var registerViewSelector = function(root, timelineViewRoot) {\n var viewSelector = root.find(SELECTORS.TIMELINE_VIEW_SELECTOR);\n\n // Listen for when the user changes tab so that we can show the first set of courses\n // and load their events when they request the sort by courses view for the first time.\n viewSelector.on('shown shown.bs.tab', function(e) {\n View.shown(timelineViewRoot);\n $(e.target).removeClass('active');\n });\n\n\n // Event selector for user_sort\n CustomEvents.define(viewSelector, [CustomEvents.events.activate]);\n viewSelector.on(CustomEvents.events.activate, \"[data-toggle='tab']\", function(e) {\n var filtername = $(e.currentTarget).data('filtername');\n var type = 'block_timeline_user_sort_preference';\n updateUserPreferences(type, filtername);\n });\n };\n\n /**\n * Initialise the timeline view navigation by adding event listeners to\n * the navigation elements.\n *\n * @param {object} root The root element for the timeline block\n * @param {object} timelineViewRoot The root element for the timeline view\n */\n var init = function(root, timelineViewRoot) {\n root = $(root);\n registerTimelineDaySelector(root, timelineViewRoot);\n registerViewSelector(root, timelineViewRoot);\n };\n\n return {\n init: init\n };\n});\n"],"names":["define","$","CustomEvents","View","Ajax","Notification","SELECTORS","updateUserPreferences","type","value","request","methodname","args","preferences","call","fail","exception","init","root","timelineViewRoot","timelineDaySelectorContainer","find","events","activate","on","e","data","filtername","currentTarget","option","target","closest","attr","daysOffset","daysLimit","elementsWithDaysOffset","undefined","removeAttr","reset","originalEvent","preventDefault","registerTimelineDaySelector","viewSelector","shown","removeClass","registerViewSelector"],"mappings":";;;;;;AAsBAA,OAAM,0BACN,CACI,SACA,iCACA,sBACA,YACA,sBAEJ,SACIC,EACAC,aACAC,KACAC,KACAC,cAGA,IAAIC,8BACqB,6BADrBA,qCAE4B,cAF5BA,iCAGwB,gCAHxBA,2BAIkB,qBAUlBC,sBAAwB,SAASC,KAAMC,OACvC,IAAIC,QAAU,CACVC,WAAY,oCACZC,KAAM,CACFC,YAAa,CACT,CACIL,KAAMA,KACNC,MAAOA,UAMvBL,KAAKU,KAAK,CAACJ,UAAU,GAChBK,KAAKV,aAAaW,UAC1B,EA4FM,MAAA,CACHC,KAPO,SAASC,KAAMC,mBA9EQ,SAASD,KAAMC,kBACzCC,IAAAA,6BAA+BF,KAAKG,KAAKf,+BAE7CJ,aAAaF,OAAOoB,6BAA8B,CAAClB,aAAaoB,OAAOC,WACvEH,6BAA6BI,GACzBtB,aAAaoB,OAAOC,SACpBjB,sCACA,SAASmB,EAAGC,MAER,IAAIC,WAAa1B,EAAEwB,EAAEG,eAAeF,KAAK,cAEzCnB,sBADW,wCACiBoB,YAE5B,IAAIE,OAAS5B,EAAEwB,EAAEK,QAAQC,QAAQzB,sCAEjC,GAAmC,QAA/BuB,OAAOG,KAAK,gBAAhB,CAKA,IAAIC,WAAaJ,OAAOG,KAAK,aACzBE,UAAYL,OAAOG,KAAK,WACxBG,uBAAyBjB,KAAKG,KAAKf,4BAEvC6B,uBAAuBH,KAAK,mBAAoBC,YAE/BG,MAAbF,UACAC,uBAAuBH,KAAK,kBAAmBE,WAE/CC,uBAAuBE,WAAW,mBAKtClC,KAAKmC,MAAMnB,kBAEXO,KAAKa,cAAcC,gBAlBlB,CAmBJ,GAER,EAyCGC,CADAvB,KAAOjB,EAAEiB,MACyBC,kBA7BX,SAASD,KAAMC,kBAClCuB,IAAAA,aAAexB,KAAKG,KAAKf,kCAI7BoC,aAAalB,GAAG,sBAAsB,SAASC,GAC3CtB,KAAKwC,MAAMxB,kBACXlB,EAAEwB,EAAEK,QAAQc,YAAY,SAC3B,IAID1C,aAAaF,OAAO0C,aAAc,CAACxC,aAAaoB,OAAOC,WACvDmB,aAAalB,GAAGtB,aAAaoB,OAAOC,SAAU,uBAAuB,SAASE,GAC1E,IAAIE,WAAa1B,EAAEwB,EAAEG,eAAeF,KAAK,cAEzCnB,sBADW,sCACiBoB,WAC/B,GACJ,CAYGkB,CAAqB3B,KAAMC,iBAC9B,EAKJ"} \ No newline at end of file diff --git a/calendar/amd/build/calendar.min.js.map b/calendar/amd/build/calendar.min.js.map index 18a4b80c864..b23ed622f02 100644 --- a/calendar/amd/build/calendar.min.js.map +++ b/calendar/amd/build/calendar.min.js.map @@ -1 +1 @@ -{"version":3,"file":"calendar.min.js","sources":["../src/calendar.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 is the highest level module for the calendar. It is\n * responsible for initialising all of the components required for\n * the calendar to run. It also coordinates the interaction between\n * components by listening for and responding to different events\n * triggered within the calendar UI.\n *\n * @module core_calendar/calendar\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/str',\n 'core/templates',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal_events',\n 'core/modal_factory',\n 'core_calendar/modal_event_form',\n 'core_calendar/summary_modal',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/view_manager',\n 'core_calendar/crud',\n 'core_calendar/selectors',\n ],\n function(\n $,\n Ajax,\n Str,\n Templates,\n Notification,\n CustomEvents,\n ModalEvents,\n ModalFactory,\n ModalEventForm,\n SummaryModal,\n CalendarRepository,\n CalendarEvents,\n CalendarViewManager,\n CalendarCrud,\n CalendarSelectors\n ) {\n\n var SELECTORS = {\n ROOT: \"[data-region='calendar']\",\n DAY: \"[data-region='day']\",\n NEW_EVENT_BUTTON: \"[data-action='new-event-button']\",\n DAY_CONTENT: \"[data-region='day-content']\",\n LOADING_ICON: '.loading-icon',\n VIEW_DAY_LINK: \"[data-action='view-day-link']\",\n CALENDAR_MONTH_WRAPPER: \".calendarwrapper\",\n TODAY: '.today',\n };\n\n /**\n * Handler for the drag and drop move event. Provides a loading indicator\n * while the request is sent to the server to update the event start date.\n *\n * Triggers a eventMoved calendar javascript event if the event was successfully\n * updated.\n *\n * @param {event} e The calendar move event\n * @param {int} eventId The event id being moved\n * @param {object|null} originElement The jQuery element for where the event is moving from\n * @param {object} destinationElement The jQuery element for where the event is moving to\n */\n var handleMoveEvent = function(e, eventId, originElement, destinationElement) {\n var originTimestamp = null;\n var destinationTimestamp = destinationElement.attr('data-day-timestamp');\n\n if (originElement) {\n originTimestamp = originElement.attr('data-day-timestamp');\n }\n\n // If the event has actually changed day.\n if (!originElement || originTimestamp != destinationTimestamp) {\n Templates.render('core/loading', {})\n .then(function(html, js) {\n // First we show some loading icons in each of the days being affected.\n destinationElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n Templates.appendNodeContents(destinationElement, html, js);\n\n if (originElement) {\n originElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n Templates.appendNodeContents(originElement, html, js);\n }\n return;\n })\n .then(function() {\n // Send a request to the server to make the change.\n return CalendarRepository.updateEventStartDay(eventId, destinationTimestamp);\n })\n .then(function() {\n // If the update was successful then broadcast an event letting the calendar\n // know that an event has been moved.\n $('body').trigger(CalendarEvents.eventMoved, [eventId, originElement, destinationElement]);\n return;\n })\n .always(function() {\n // Always remove the loading icons regardless of whether the update\n // request was successful or not.\n var destinationLoadingElement = destinationElement.find(SELECTORS.LOADING_ICON);\n destinationElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n Templates.replaceNode(destinationLoadingElement, '', '');\n\n if (originElement) {\n var originLoadingElement = originElement.find(SELECTORS.LOADING_ICON);\n originElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n Templates.replaceNode(originLoadingElement, '', '');\n }\n return;\n })\n .fail(Notification.exception);\n }\n };\n\n /**\n * Listen to and handle any calendar events fired by the calendar UI.\n *\n * @method registerCalendarEventListeners\n * @param {object} root The calendar root element\n * @param {object} eventFormModalPromise A promise reolved with the event form modal\n */\n var registerCalendarEventListeners = function(root, eventFormModalPromise) {\n var body = $('body');\n\n body.on(CalendarEvents.created, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.deleted, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.updated, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.editActionEvent, function(e, url) {\n // Action events needs to be edit directly on the course module.\n window.location.assign(url);\n });\n // Handle the event fired by the drag and drop code.\n body.on(CalendarEvents.moveEvent, handleMoveEvent);\n // When an event is successfully moved we should updated the UI.\n body.on(CalendarEvents.eventMoved, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n\n CalendarCrud.registerEditListeners(root, eventFormModalPromise);\n };\n\n /**\n * Register event listeners for the module.\n *\n * @param {object} root The calendar root element\n */\n var registerEventListeners = function(root) {\n // Listen the click on the day link to render the day view.\n root.on('click', SELECTORS.VIEW_DAY_LINK, function(e) {\n var dayLink = $(e.target);\n var year = dayLink.data('year'),\n month = dayLink.data('month'),\n day = dayLink.data('day'),\n courseId = dayLink.data('courseid'),\n categoryId = dayLink.data('categoryid');\n CalendarViewManager.refreshDayContent(root, year, month, day, courseId, categoryId, root,\n 'core_calendar/calendar_day').then(function() {\n e.preventDefault();\n var url = '?view=day&time=' + dayLink.data('timestamp');\n return window.history.pushState({}, '', url);\n }).fail(Notification.exception);\n });\n\n root.on('change', CalendarSelectors.elements.courseSelector, function() {\n var selectElement = $(this);\n var courseId = selectElement.val();\n CalendarViewManager.reloadCurrentMonth(root, courseId, null)\n .then(function() {\n // We need to get the selector again because the content has changed.\n return root.find(CalendarSelectors.elements.courseSelector).val(courseId);\n })\n .fail(Notification.exception);\n });\n\n var eventFormPromise = CalendarCrud.registerEventFormModal(root),\n contextId = $(SELECTORS.CALENDAR_MONTH_WRAPPER).data('context-id');\n registerCalendarEventListeners(root, eventFormPromise);\n\n if (contextId) {\n // Bind click events to calendar days.\n root.on('click', SELECTORS.DAY, function (e) {\n\n var target = $(e.target);\n\n if (!target.is(SELECTORS.VIEW_DAY_LINK)) {\n var startTime = $(this).attr('data-new-event-timestamp');\n eventFormPromise.then(function (modal) {\n var wrapper = target.closest(CalendarSelectors.wrapper);\n modal.setCourseId(wrapper.data('courseid'));\n\n var categoryId = wrapper.data('categoryid');\n if (typeof categoryId !== 'undefined') {\n modal.setCategoryId(categoryId);\n }\n\n modal.setContextId(wrapper.data('contextId'));\n modal.setStartTime(startTime);\n modal.show();\n return;\n })\n .fail(Notification.exception);\n\n e.preventDefault();\n }\n });\n }\n };\n\n return {\n init: function(root) {\n root = $(root);\n CalendarViewManager.init(root);\n registerEventListeners(root);\n }\n };\n});\n"],"names":["define","$","Ajax","Str","Templates","Notification","CustomEvents","ModalEvents","ModalFactory","ModalEventForm","SummaryModal","CalendarRepository","CalendarEvents","CalendarViewManager","CalendarCrud","CalendarSelectors","SELECTORS","handleMoveEvent","e","eventId","originElement","destinationElement","originTimestamp","destinationTimestamp","attr","render","then","html","js","find","addClass","appendNodeContents","updateEventStartDay","trigger","eventMoved","always","destinationLoadingElement","removeClass","replaceNode","originLoadingElement","fail","exception","registerEventListeners","root","on","dayLink","target","year","data","month","day","courseId","categoryId","refreshDayContent","preventDefault","url","window","history","pushState","elements","courseSelector","this","val","reloadCurrentMonth","eventFormPromise","registerEventFormModal","contextId","eventFormModalPromise","body","created","deleted","updated","editActionEvent","location","assign","moveEvent","registerEditListeners","registerCalendarEventListeners","is","startTime","modal","wrapper","closest","setCourseId","setCategoryId","setContextId","setStartTime","show","init"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"calendar.min.js","sources":["../src/calendar.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 is the highest level module for the calendar. It is\n * responsible for initialising all of the components required for\n * the calendar to run. It also coordinates the interaction between\n * components by listening for and responding to different events\n * triggered within the calendar UI.\n *\n * @module core_calendar/calendar\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/str',\n 'core/templates',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal_events',\n 'core/modal_factory',\n 'core_calendar/modal_event_form',\n 'core_calendar/summary_modal',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/view_manager',\n 'core_calendar/crud',\n 'core_calendar/selectors',\n ],\n function(\n $,\n Ajax,\n Str,\n Templates,\n Notification,\n CustomEvents,\n ModalEvents,\n ModalFactory,\n ModalEventForm,\n SummaryModal,\n CalendarRepository,\n CalendarEvents,\n CalendarViewManager,\n CalendarCrud,\n CalendarSelectors\n ) {\n\n var SELECTORS = {\n ROOT: \"[data-region='calendar']\",\n DAY: \"[data-region='day']\",\n NEW_EVENT_BUTTON: \"[data-action='new-event-button']\",\n DAY_CONTENT: \"[data-region='day-content']\",\n LOADING_ICON: '.loading-icon',\n VIEW_DAY_LINK: \"[data-action='view-day-link']\",\n CALENDAR_MONTH_WRAPPER: \".calendarwrapper\",\n TODAY: '.today',\n };\n\n /**\n * Handler for the drag and drop move event. Provides a loading indicator\n * while the request is sent to the server to update the event start date.\n *\n * Triggers a eventMoved calendar javascript event if the event was successfully\n * updated.\n *\n * @param {event} e The calendar move event\n * @param {int} eventId The event id being moved\n * @param {object|null} originElement The jQuery element for where the event is moving from\n * @param {object} destinationElement The jQuery element for where the event is moving to\n */\n var handleMoveEvent = function(e, eventId, originElement, destinationElement) {\n var originTimestamp = null;\n var destinationTimestamp = destinationElement.attr('data-day-timestamp');\n\n if (originElement) {\n originTimestamp = originElement.attr('data-day-timestamp');\n }\n\n // If the event has actually changed day.\n if (!originElement || originTimestamp != destinationTimestamp) {\n Templates.render('core/loading', {})\n .then(function(html, js) {\n // First we show some loading icons in each of the days being affected.\n destinationElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n Templates.appendNodeContents(destinationElement, html, js);\n\n if (originElement) {\n originElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n Templates.appendNodeContents(originElement, html, js);\n }\n return;\n })\n .then(function() {\n // Send a request to the server to make the change.\n return CalendarRepository.updateEventStartDay(eventId, destinationTimestamp);\n })\n .then(function() {\n // If the update was successful then broadcast an event letting the calendar\n // know that an event has been moved.\n $('body').trigger(CalendarEvents.eventMoved, [eventId, originElement, destinationElement]);\n return;\n })\n .always(function() {\n // Always remove the loading icons regardless of whether the update\n // request was successful or not.\n var destinationLoadingElement = destinationElement.find(SELECTORS.LOADING_ICON);\n destinationElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n Templates.replaceNode(destinationLoadingElement, '', '');\n\n if (originElement) {\n var originLoadingElement = originElement.find(SELECTORS.LOADING_ICON);\n originElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n Templates.replaceNode(originLoadingElement, '', '');\n }\n return;\n })\n .fail(Notification.exception);\n }\n };\n\n /**\n * Listen to and handle any calendar events fired by the calendar UI.\n *\n * @method registerCalendarEventListeners\n * @param {object} root The calendar root element\n * @param {object} eventFormModalPromise A promise reolved with the event form modal\n */\n var registerCalendarEventListeners = function(root, eventFormModalPromise) {\n var body = $('body');\n\n body.on(CalendarEvents.created, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.deleted, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.updated, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.editActionEvent, function(e, url) {\n // Action events needs to be edit directly on the course module.\n window.location.assign(url);\n });\n // Handle the event fired by the drag and drop code.\n body.on(CalendarEvents.moveEvent, handleMoveEvent);\n // When an event is successfully moved we should updated the UI.\n body.on(CalendarEvents.eventMoved, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n\n CalendarCrud.registerEditListeners(root, eventFormModalPromise);\n };\n\n /**\n * Register event listeners for the module.\n *\n * @param {object} root The calendar root element\n */\n var registerEventListeners = function(root) {\n // Listen the click on the day link to render the day view.\n root.on('click', SELECTORS.VIEW_DAY_LINK, function(e) {\n var dayLink = $(e.target);\n var year = dayLink.data('year'),\n month = dayLink.data('month'),\n day = dayLink.data('day'),\n courseId = dayLink.data('courseid'),\n categoryId = dayLink.data('categoryid');\n CalendarViewManager.refreshDayContent(root, year, month, day, courseId, categoryId, root,\n 'core_calendar/calendar_day').then(function() {\n e.preventDefault();\n var url = '?view=day&time=' + dayLink.data('timestamp');\n return window.history.pushState({}, '', url);\n }).fail(Notification.exception);\n });\n\n root.on('change', CalendarSelectors.elements.courseSelector, function() {\n var selectElement = $(this);\n var courseId = selectElement.val();\n CalendarViewManager.reloadCurrentMonth(root, courseId, null)\n .then(function() {\n // We need to get the selector again because the content has changed.\n return root.find(CalendarSelectors.elements.courseSelector).val(courseId);\n })\n .fail(Notification.exception);\n });\n\n var eventFormPromise = CalendarCrud.registerEventFormModal(root),\n contextId = $(SELECTORS.CALENDAR_MONTH_WRAPPER).data('context-id');\n registerCalendarEventListeners(root, eventFormPromise);\n\n if (contextId) {\n // Bind click events to calendar days.\n root.on('click', SELECTORS.DAY, function (e) {\n\n var target = $(e.target);\n\n if (!target.is(SELECTORS.VIEW_DAY_LINK)) {\n var startTime = $(this).attr('data-new-event-timestamp');\n eventFormPromise.then(function (modal) {\n var wrapper = target.closest(CalendarSelectors.wrapper);\n modal.setCourseId(wrapper.data('courseid'));\n\n var categoryId = wrapper.data('categoryid');\n if (typeof categoryId !== 'undefined') {\n modal.setCategoryId(categoryId);\n }\n\n modal.setContextId(wrapper.data('contextId'));\n modal.setStartTime(startTime);\n modal.show();\n return;\n })\n .fail(Notification.exception);\n\n e.preventDefault();\n }\n });\n }\n };\n\n return {\n init: function(root) {\n root = $(root);\n CalendarViewManager.init(root);\n registerEventListeners(root);\n }\n };\n});\n"],"names":["define","$","Ajax","Str","Templates","Notification","CustomEvents","ModalEvents","ModalFactory","ModalEventForm","SummaryModal","CalendarRepository","CalendarEvents","CalendarViewManager","CalendarCrud","CalendarSelectors","SELECTORS","handleMoveEvent","e","eventId","originElement","destinationElement","originTimestamp","destinationTimestamp","attr","render","then","html","js","find","addClass","appendNodeContents","updateEventStartDay","trigger","eventMoved","always","destinationLoadingElement","removeClass","replaceNode","originLoadingElement","fail","exception","registerEventListeners","root","on","dayLink","target","year","data","month","day","courseId","categoryId","refreshDayContent","preventDefault","url","window","history","pushState","elements","courseSelector","this","val","reloadCurrentMonth","eventFormPromise","registerEventFormModal","contextId","eventFormModalPromise","body","created","deleted","updated","editActionEvent","location","assign","moveEvent","registerEditListeners","registerCalendarEventListeners","is","startTime","modal","wrapper","closest","setCourseId","setCategoryId","setContextId","setStartTime","show","init"],"mappings":"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"} \ No newline at end of file diff --git a/calendar/amd/build/calendar_filter.min.js.map b/calendar/amd/build/calendar_filter.min.js.map index 14d1fe3be3c..38372a33a1c 100644 --- a/calendar/amd/build/calendar_filter.min.js.map +++ b/calendar/amd/build/calendar_filter.min.js.map @@ -1 +1 @@ -{"version":3,"file":"calendar_filter.min.js","sources":["../src/calendar_filter.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 is responsible for the calendar filter.\n *\n * @module core_calendar/calendar_filter\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core/str',\n 'core/templates',\n],\nfunction(\n $,\n CalendarSelectors,\n CalendarEvents,\n Str,\n Templates\n) {\n\n var registerEventListeners = function(root) {\n root.on('click', CalendarSelectors.eventFilterItem, function(e) {\n var target = $(e.currentTarget);\n\n toggleFilter(target);\n\n e.preventDefault();\n });\n\n $('body').on(CalendarEvents.viewUpdated, function() {\n var filters = root.find(CalendarSelectors.eventFilterItem);\n\n filters.each(function(i, filter) {\n filter = $(filter);\n if (filter.data('eventtype-hidden')) {\n var data = getFilterData(filter);\n fireFilterChangedEvent(data);\n }\n });\n });\n };\n\n var toggleFilter = function(target) {\n var data = getFilterData(target);\n\n // Toggle the hidden. We need to render the template before we change the value.\n data.hidden = !data.hidden;\n\n M.util.js_pending(\"core_calendar/calendar_filter:toggleFilter\");\n return Str.get_string('eventtype' + data.eventtype, 'calendar')\n .then(function(nameStr) {\n data.name = nameStr;\n data.icon = true;\n data.key = 'i/' + data.eventtype + 'event';\n data.component = 'core';\n\n return data;\n })\n .then(function(context) {\n return Templates.render('core_calendar/event_filter_key', context);\n })\n .then(function(html, js) {\n return Templates.replaceNode(target, html, js);\n })\n .then(function() {\n fireFilterChangedEvent(data);\n M.util.js_complete(\"core_calendar/calendar_filter:toggleFilter\");\n return;\n });\n };\n\n /**\n * Fire the filterChanged event for the specified data.\n *\n * @param {object} data The data to include\n */\n var fireFilterChangedEvent = function(data) {\n M.util.js_pending(\"month-mini-filterChanged\");\n $('body').trigger(CalendarEvents.filterChanged, {\n type: data.eventtype,\n hidden: data.hidden,\n });\n M.util.js_complete(\"month-mini-filterChanged\");\n };\n\n /**\n * Get the filter data for the specified target.\n *\n * @param {jQuery} target The target node\n * @return {Object}\n */\n var getFilterData = function(target) {\n return {\n eventtype: target.data('eventtype'),\n hidden: target.data('eventtype-hidden'),\n };\n };\n\n return {\n init: function(root) {\n root = $(root);\n\n registerEventListeners(root);\n }\n };\n});\n"],"names":["define","$","CalendarSelectors","CalendarEvents","Str","Templates","toggleFilter","target","data","getFilterData","hidden","M","util","js_pending","get_string","eventtype","then","nameStr","name","icon","key","component","context","render","html","js","replaceNode","fireFilterChangedEvent","js_complete","trigger","filterChanged","type","init","root","on","eventFilterItem","e","currentTarget","preventDefault","viewUpdated","find","each","i","filter","registerEventListeners"],"mappings":";;;;;;;AAsBAA,uCAAO,CACH,SACA,0BACA,uBACA,WACA,mBAEJ,SACIC,EACAC,kBACAC,eACAC,IACAC,eAyBIC,aAAe,SAASC,YACpBC,KAAOC,cAAcF,eAGzBC,KAAKE,QAAUF,KAAKE,OAEpBC,EAAEC,KAAKC,WAAW,8CACXT,IAAIU,WAAW,YAAcN,KAAKO,UAAW,YACnDC,MAAK,SAASC,gBACXT,KAAKU,KAAOD,QACZT,KAAKW,MAAO,EACZX,KAAKY,IAAM,KAAOZ,KAAKO,UAAY,QACnCP,KAAKa,UAAY,OAEVb,QAEVQ,MAAK,SAASM,gBACJjB,UAAUkB,OAAO,iCAAkCD,YAE7DN,MAAK,SAASQ,KAAMC,WACVpB,UAAUqB,YAAYnB,OAAQiB,KAAMC,OAE9CT,MAAK,WACFW,uBAAuBnB,MACvBG,EAAEC,KAAKgB,YAAY,kDAUvBD,uBAAyB,SAASnB,MAClCG,EAAEC,KAAKC,WAAW,4BAClBZ,EAAE,QAAQ4B,QAAQ1B,eAAe2B,cAAe,CAC5CC,KAAMvB,KAAKO,UACXL,OAAQF,KAAKE,SAEjBC,EAAEC,KAAKgB,YAAY,6BASnBnB,cAAgB,SAASF,cAClB,CACHQ,UAAWR,OAAOC,KAAK,aACvBE,OAAQH,OAAOC,KAAK,4BAIrB,CACHwB,KAAM,SAASC,OA/EU,SAASA,MAClCA,KAAKC,GAAG,QAAShC,kBAAkBiC,iBAAiB,SAASC,OACrD7B,OAASN,EAAEmC,EAAEC,eAEjB/B,aAAaC,QAEb6B,EAAEE,oBAGNrC,EAAE,QAAQiC,GAAG/B,eAAeoC,aAAa,WACvBN,KAAKO,KAAKtC,kBAAkBiC,iBAElCM,MAAK,SAASC,EAAGC,YACrBA,OAAS1C,EAAE0C,SACAnC,KAAK,oBAAqB,KAC7BA,KAAOC,cAAckC,QACzBhB,uBAAuBnB,aAkE/BoC,CAFAX,KAAOhC,EAAEgC"} \ No newline at end of file +{"version":3,"file":"calendar_filter.min.js","sources":["../src/calendar_filter.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 is responsible for the calendar filter.\n *\n * @module core_calendar/calendar_filter\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core/str',\n 'core/templates',\n],\nfunction(\n $,\n CalendarSelectors,\n CalendarEvents,\n Str,\n Templates\n) {\n\n var registerEventListeners = function(root) {\n root.on('click', CalendarSelectors.eventFilterItem, function(e) {\n var target = $(e.currentTarget);\n\n toggleFilter(target);\n\n e.preventDefault();\n });\n\n $('body').on(CalendarEvents.viewUpdated, function() {\n var filters = root.find(CalendarSelectors.eventFilterItem);\n\n filters.each(function(i, filter) {\n filter = $(filter);\n if (filter.data('eventtype-hidden')) {\n var data = getFilterData(filter);\n fireFilterChangedEvent(data);\n }\n });\n });\n };\n\n var toggleFilter = function(target) {\n var data = getFilterData(target);\n\n // Toggle the hidden. We need to render the template before we change the value.\n data.hidden = !data.hidden;\n\n M.util.js_pending(\"core_calendar/calendar_filter:toggleFilter\");\n return Str.get_string('eventtype' + data.eventtype, 'calendar')\n .then(function(nameStr) {\n data.name = nameStr;\n data.icon = true;\n data.key = 'i/' + data.eventtype + 'event';\n data.component = 'core';\n\n return data;\n })\n .then(function(context) {\n return Templates.render('core_calendar/event_filter_key', context);\n })\n .then(function(html, js) {\n return Templates.replaceNode(target, html, js);\n })\n .then(function() {\n fireFilterChangedEvent(data);\n M.util.js_complete(\"core_calendar/calendar_filter:toggleFilter\");\n return;\n });\n };\n\n /**\n * Fire the filterChanged event for the specified data.\n *\n * @param {object} data The data to include\n */\n var fireFilterChangedEvent = function(data) {\n M.util.js_pending(\"month-mini-filterChanged\");\n $('body').trigger(CalendarEvents.filterChanged, {\n type: data.eventtype,\n hidden: data.hidden,\n });\n M.util.js_complete(\"month-mini-filterChanged\");\n };\n\n /**\n * Get the filter data for the specified target.\n *\n * @param {jQuery} target The target node\n * @return {Object}\n */\n var getFilterData = function(target) {\n return {\n eventtype: target.data('eventtype'),\n hidden: target.data('eventtype-hidden'),\n };\n };\n\n return {\n init: function(root) {\n root = $(root);\n\n registerEventListeners(root);\n }\n };\n});\n"],"names":["define","$","CalendarSelectors","CalendarEvents","Str","Templates","toggleFilter","target","data","getFilterData","hidden","M","util","js_pending","get_string","eventtype","then","nameStr","name","icon","key","component","context","render","html","js","replaceNode","fireFilterChangedEvent","js_complete","trigger","filterChanged","type","init","root","on","eventFilterItem","e","currentTarget","preventDefault","viewUpdated","find","each","i","filter","registerEventListeners"],"mappings":";;;;;;;AAsBAA,OAAM,gCAAC,CACH,SACA,0BACA,uBACA,WACA,mBAEJ,SACIC,EACAC,kBACAC,eACAC,IACAC,WAGA,IAsBIC,aAAe,SAASC,QACxB,IAAIC,KAAOC,cAAcF,QAMzB,OAHAC,KAAKE,QAAUF,KAAKE,OAEpBC,EAAEC,KAAKC,WAAW,8CACXT,IAAIU,WAAW,YAAcN,KAAKO,UAAW,YACnDC,MAAK,SAASC,SAMX,OALAT,KAAKU,KAAOD,QACZT,KAAKW,MAAO,EACZX,KAAKY,IAAM,KAAOZ,KAAKO,UAAY,QACnCP,KAAKa,UAAY,OAEVb,IACV,IACAQ,MAAK,SAASM,SACX,OAAOjB,UAAUkB,OAAO,iCAAkCD,QAVvD,IAYNN,MAAK,SAASQ,KAAMC,IACVpB,OAAAA,UAAUqB,YAAYnB,OAAQiB,KAAMC,GAC9C,IACAT,MAAK,WACFW,uBAAuBnB,MACvBG,EAAEC,KAAKgB,YAAY,6CAEtB,GACJ,EAOGD,uBAAyB,SAASnB,MAClCG,EAAEC,KAAKC,WAAW,4BAClBZ,EAAE,QAAQ4B,QAAQ1B,eAAe2B,cAAe,CAC5CC,KAAMvB,KAAKO,UACXL,OAAQF,KAAKE,SAEjBC,EAAEC,KAAKgB,YAAY,2BACtB,EAQGnB,cAAgB,SAASF,QAClB,MAAA,CACHQ,UAAWR,OAAOC,KAAK,aACvBE,OAAQH,OAAOC,KAAK,oBAE3B,EAEM,MAAA,CACHwB,KAAM,SAASC,OA/EU,SAASA,MAClCA,KAAKC,GAAG,QAAShC,kBAAkBiC,iBAAiB,SAASC,GACzD,IAAI7B,OAASN,EAAEmC,EAAEC,eAEjB/B,aAAaC,QAEb6B,EAAEE,gBACL,IAEDrC,EAAE,QAAQiC,GAAG/B,eAAeoC,aAAa,WACvBN,KAAKO,KAAKtC,kBAAkBiC,iBAElCM,MAAK,SAASC,EAAGC,QAErB,IADAA,OAAS1C,EAAE0C,SACAnC,KAAK,oBAAqB,CACjC,IAAIA,KAAOC,cAAckC,QACzBhB,uBAAuBnB,KAC1B,CACJ,GACJ,GACJ,CA8DOoC,CAFAX,KAAOhC,EAAEgC,MAGZ,EAER"} \ No newline at end of file diff --git a/calendar/amd/build/calendar_mini.min.js.map b/calendar/amd/build/calendar_mini.min.js.map index 6aa3420722f..37059b772e7 100644 --- a/calendar/amd/build/calendar_mini.min.js.map +++ b/calendar/amd/build/calendar_mini.min.js.map @@ -1 +1 @@ -{"version":3,"file":"calendar_mini.min.js","sources":["../src/calendar_mini.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 is the highest level module for the calendar. It is\n * responsible for initialising all of the components required for\n * the calendar to run. It also coordinates the interaction between\n * components by listening for and responding to different events\n * triggered within the calendar UI.\n *\n * @module core_calendar/calendar_mini\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core_calendar/view_manager',\n],\nfunction(\n $,\n CalendarSelectors,\n CalendarEvents,\n CalendarViewManager\n) {\n\n /**\n * Listen to and handle any calendar events fired by the calendar UI.\n *\n * @method registerCalendarEventListeners\n * @param {object} root The calendar root element\n */\n var registerCalendarEventListeners = function(root) {\n var body = $('body');\n var namespace = '.' + root.attr('id');\n\n body.on(CalendarEvents.created + namespace, root, reloadMonth);\n body.on(CalendarEvents.deleted + namespace, root, reloadMonth);\n body.on(CalendarEvents.updated + namespace, root, reloadMonth);\n body.on(CalendarEvents.eventMoved + namespace, root, reloadMonth);\n };\n\n /**\n * Reload the month view in this month.\n *\n * @param {EventFacade} e\n */\n var reloadMonth = function(e) {\n var root = e.data;\n var body = $('body');\n var namespace = '.' + root.attr('id');\n\n if (root.is(':visible')) {\n CalendarViewManager.reloadCurrentMonth(root);\n } else {\n // The root has been removed.\n // Remove all events in the namespace.\n body.off(CalendarEvents.created + namespace);\n body.off(CalendarEvents.deleted + namespace);\n body.off(CalendarEvents.updated + namespace);\n body.off(CalendarEvents.eventMoved + namespace);\n }\n };\n\n var registerEventListeners = function(root) {\n $('body').on(CalendarEvents.filterChanged, function(e, data) {\n var daysWithEvent = root.find(CalendarSelectors.eventType[data.type]);\n\n daysWithEvent.toggleClass('calendar_event_' + data.type, !data.hidden);\n });\n\n var namespace = '.' + root.attr('id');\n $('body').on('change' + namespace, CalendarSelectors.elements.courseSelector, function() {\n if (root.is(':visible')) {\n var selectElement = $(this);\n var courseId = selectElement.val();\n var categoryId = null;\n\n CalendarViewManager.reloadCurrentMonth(root, courseId, categoryId);\n } else {\n $('body').off('change' + namespace);\n }\n });\n\n };\n\n return {\n init: function(root, loadOnInit) {\n root = $(root);\n\n CalendarViewManager.init(root);\n registerEventListeners(root);\n registerCalendarEventListeners(root);\n\n if (loadOnInit) {\n // The calendar hasn't yet loaded it's events so we\n // should load them as soon as we've initialised.\n CalendarViewManager.reloadCurrentMonth(root);\n }\n\n }\n };\n});\n"],"names":["define","$","CalendarSelectors","CalendarEvents","CalendarViewManager","reloadMonth","e","root","data","body","namespace","attr","is","reloadCurrentMonth","off","created","deleted","updated","eventMoved","init","loadOnInit","on","filterChanged","find","eventType","type","toggleClass","hidden","elements","courseSelector","courseId","this","val","registerEventListeners","registerCalendarEventListeners"],"mappings":";;;;;;;;;;;AA0BAA,qCAAO,CACH,SACA,0BACA,uBACA,+BAEJ,SACIC,EACAC,kBACAC,eACAC,yBAwBIC,YAAc,SAASC,OACnBC,KAAOD,EAAEE,KACTC,KAAOR,EAAE,QACTS,UAAY,IAAMH,KAAKI,KAAK,MAE5BJ,KAAKK,GAAG,YACRR,oBAAoBS,mBAAmBN,OAIvCE,KAAKK,IAAIX,eAAeY,QAAUL,WAClCD,KAAKK,IAAIX,eAAea,QAAUN,WAClCD,KAAKK,IAAIX,eAAec,QAAUP,WAClCD,KAAKK,IAAIX,eAAee,WAAaR,mBA0BtC,CACHS,KAAM,SAASZ,KAAMa,YACjBb,KAAON,EAAEM,MAETH,oBAAoBe,KAAKZ,MA1BJ,SAASA,MAClCN,EAAE,QAAQoB,GAAGlB,eAAemB,eAAe,SAAShB,EAAGE,MAC/BD,KAAKgB,KAAKrB,kBAAkBsB,UAAUhB,KAAKiB,OAEjDC,YAAY,kBAAoBlB,KAAKiB,MAAOjB,KAAKmB,eAG/DjB,UAAY,IAAMH,KAAKI,KAAK,MAChCV,EAAE,QAAQoB,GAAG,SAAWX,UAAWR,kBAAkB0B,SAASC,gBAAgB,cACtEtB,KAAKK,GAAG,YAAa,KAEjBkB,SADgB7B,EAAE8B,MACOC,MAG7B5B,oBAAoBS,mBAAmBN,KAAMuB,SAF5B,WAIjB7B,EAAE,QAAQa,IAAI,SAAWJ,cAW7BuB,CAAuB1B,MA3DM,SAASA,UACtCE,KAAOR,EAAE,QACTS,UAAY,IAAMH,KAAKI,KAAK,MAEhCF,KAAKY,GAAGlB,eAAeY,QAAUL,UAAWH,KAAMF,aAClDI,KAAKY,GAAGlB,eAAea,QAAUN,UAAWH,KAAMF,aAClDI,KAAKY,GAAGlB,eAAec,QAAUP,UAAWH,KAAMF,aAClDI,KAAKY,GAAGlB,eAAee,WAAaR,UAAWH,KAAMF,aAqDjD6B,CAA+B3B,MAE3Ba,YAGAhB,oBAAoBS,mBAAmBN"} \ No newline at end of file +{"version":3,"file":"calendar_mini.min.js","sources":["../src/calendar_mini.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 is the highest level module for the calendar. It is\n * responsible for initialising all of the components required for\n * the calendar to run. It also coordinates the interaction between\n * components by listening for and responding to different events\n * triggered within the calendar UI.\n *\n * @module core_calendar/calendar_mini\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core_calendar/view_manager',\n],\nfunction(\n $,\n CalendarSelectors,\n CalendarEvents,\n CalendarViewManager\n) {\n\n /**\n * Listen to and handle any calendar events fired by the calendar UI.\n *\n * @method registerCalendarEventListeners\n * @param {object} root The calendar root element\n */\n var registerCalendarEventListeners = function(root) {\n var body = $('body');\n var namespace = '.' + root.attr('id');\n\n body.on(CalendarEvents.created + namespace, root, reloadMonth);\n body.on(CalendarEvents.deleted + namespace, root, reloadMonth);\n body.on(CalendarEvents.updated + namespace, root, reloadMonth);\n body.on(CalendarEvents.eventMoved + namespace, root, reloadMonth);\n };\n\n /**\n * Reload the month view in this month.\n *\n * @param {EventFacade} e\n */\n var reloadMonth = function(e) {\n var root = e.data;\n var body = $('body');\n var namespace = '.' + root.attr('id');\n\n if (root.is(':visible')) {\n CalendarViewManager.reloadCurrentMonth(root);\n } else {\n // The root has been removed.\n // Remove all events in the namespace.\n body.off(CalendarEvents.created + namespace);\n body.off(CalendarEvents.deleted + namespace);\n body.off(CalendarEvents.updated + namespace);\n body.off(CalendarEvents.eventMoved + namespace);\n }\n };\n\n var registerEventListeners = function(root) {\n $('body').on(CalendarEvents.filterChanged, function(e, data) {\n var daysWithEvent = root.find(CalendarSelectors.eventType[data.type]);\n\n daysWithEvent.toggleClass('calendar_event_' + data.type, !data.hidden);\n });\n\n var namespace = '.' + root.attr('id');\n $('body').on('change' + namespace, CalendarSelectors.elements.courseSelector, function() {\n if (root.is(':visible')) {\n var selectElement = $(this);\n var courseId = selectElement.val();\n var categoryId = null;\n\n CalendarViewManager.reloadCurrentMonth(root, courseId, categoryId);\n } else {\n $('body').off('change' + namespace);\n }\n });\n\n };\n\n return {\n init: function(root, loadOnInit) {\n root = $(root);\n\n CalendarViewManager.init(root);\n registerEventListeners(root);\n registerCalendarEventListeners(root);\n\n if (loadOnInit) {\n // The calendar hasn't yet loaded it's events so we\n // should load them as soon as we've initialised.\n CalendarViewManager.reloadCurrentMonth(root);\n }\n\n }\n };\n});\n"],"names":["define","$","CalendarSelectors","CalendarEvents","CalendarViewManager","reloadMonth","e","root","data","body","namespace","attr","is","reloadCurrentMonth","off","created","deleted","updated","eventMoved","init","loadOnInit","on","filterChanged","find","eventType","type","toggleClass","hidden","elements","courseSelector","courseId","this","val","registerEventListeners","registerCalendarEventListeners"],"mappings":";;;;;;;;;;;AA0BAA,qCAAO,CACH,SACA,0BACA,uBACA,+BAEJ,SACIC,EACAC,kBACAC,eACAC,qBASA,IAeIC,YAAc,SAASC,GACvB,IAAIC,KAAOD,EAAEE,KACTC,KAAOR,EAAE,QACTS,UAAY,IAAMH,KAAKI,KAAK,MAE5BJ,KAAKK,GAAG,YACRR,oBAAoBS,mBAAmBN,OAIvCE,KAAKK,IAAIX,eAAeY,QAAUL,WAClCD,KAAKK,IAAIX,eAAea,QAAUN,WAClCD,KAAKK,IAAIX,eAAec,QAAUP,WAClCD,KAAKK,IAAIX,eAAee,WAAaR,WAE5C,EAwBM,MAAA,CACHS,KAAM,SAASZ,KAAMa,YACjBb,KAAON,EAAEM,MAETH,oBAAoBe,KAAKZ,MA1BJ,SAASA,MAClCN,EAAE,QAAQoB,GAAGlB,eAAemB,eAAe,SAAShB,EAAGE,MAC/BD,KAAKgB,KAAKrB,kBAAkBsB,UAAUhB,KAAKiB,OAEjDC,YAAY,kBAAoBlB,KAAKiB,MAAOjB,KAAKmB,OAClE,IAEGjB,IAAAA,UAAY,IAAMH,KAAKI,KAAK,MAChCV,EAAE,QAAQoB,GAAG,SAAWX,UAAWR,kBAAkB0B,SAASC,gBAAgB,WAC1E,GAAItB,KAAKK,GAAG,YAAa,CACrB,IACIkB,SADgB7B,EAAE8B,MACOC,MAG7B5B,oBAAoBS,mBAAmBN,KAAMuB,SAF5B,KAGpB,MACG7B,EAAE,QAAQa,IAAI,SAAWJ,UAEhC,GAEJ,CAOOuB,CAAuB1B,MA3DM,SAASA,MAC1C,IAAIE,KAAOR,EAAE,QACTS,UAAY,IAAMH,KAAKI,KAAK,MAEhCF,KAAKY,GAAGlB,eAAeY,QAAUL,UAAWH,KAAMF,aAClDI,KAAKY,GAAGlB,eAAea,QAAUN,UAAWH,KAAMF,aAClDI,KAAKY,GAAGlB,eAAec,QAAUP,UAAWH,KAAMF,aAClDI,KAAKY,GAAGlB,eAAee,WAAaR,UAAWH,KAAMF,YACxD,CAoDO6B,CAA+B3B,MAE3Ba,YAGAhB,oBAAoBS,mBAAmBN,KAG9C,EAER"} \ No newline at end of file diff --git a/calendar/amd/build/calendar_threemonth.min.js.map b/calendar/amd/build/calendar_threemonth.min.js.map index 9835592661b..c4a488145fc 100644 --- a/calendar/amd/build/calendar_threemonth.min.js.map +++ b/calendar/amd/build/calendar_threemonth.min.js.map @@ -1 +1 @@ -{"version":3,"file":"calendar_threemonth.min.js","sources":["../src/calendar_threemonth.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 handles display of multiple mini calendars in a view, and\n * movement through them.\n *\n * @module core_calendar/calendar_threemonth\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/notification',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core/templates',\n 'core_calendar/view_manager',\n],\nfunction(\n $,\n Notification,\n CalendarSelectors,\n CalendarEvents,\n Templates,\n CalendarViewManager\n) {\n\n /**\n * Listen to and handle any calendar events fired by the calendar UI.\n *\n * @method registerCalendarEventListeners\n * @param {object} root The calendar root element\n */\n var registerCalendarEventListeners = function(root) {\n var body = $('body');\n body.on([CalendarEvents.monthChanged, CalendarEvents.dayChanged].join(' '), function(e, year, month, courseId, categoryId) {\n // We have to use a queue here because the calling code is decoupled from these listeners.\n // It's possible for the event to be called multiple times before one call is fully resolved.\n root.queue(function(next) {\n return processRequest(e, year, month, courseId, categoryId)\n .then(function() {\n return next();\n })\n .fail(Notification.exception)\n ;\n });\n });\n\n var processRequest = function(e, year, month, courseId, categoryId) {\n var newCurrentMonth = root.find('[data-year=\"' + year + '\"][data-month=\"' + month + '\"]');\n var newParent = newCurrentMonth.closest(CalendarSelectors.calendarPeriods.month);\n var allMonths = root.find(CalendarSelectors.calendarPeriods.month);\n\n var previousMonth = $(allMonths[0]);\n var nextMonth = $(allMonths[2]);\n\n var placeHolder = $('');\n placeHolder.attr('data-template', 'core_calendar/threemonth_month');\n placeHolder.attr('data-includenavigation', false);\n placeHolder.attr('data-mini', true);\n var placeHolderContainer = $('
          ');\n placeHolderContainer.hide();\n placeHolderContainer.append(placeHolder);\n\n var requestYear;\n var requestMonth;\n var oldMonth;\n\n if (newParent.is(previousMonth)) {\n // Fetch the new previous month.\n placeHolderContainer.insertBefore(previousMonth);\n\n requestYear = previousMonth.data('previousYear');\n requestMonth = previousMonth.data('previousMonth');\n oldMonth = nextMonth;\n } else if (newParent.is(nextMonth)) {\n // Fetch the new next month.\n placeHolderContainer.insertAfter(nextMonth);\n requestYear = nextMonth.data('nextYear');\n requestMonth = nextMonth.data('nextMonth');\n oldMonth = previousMonth;\n } else {\n return $.Deferred().resolve();\n }\n\n return CalendarViewManager.refreshMonthContent(\n placeHolder,\n requestYear,\n requestMonth,\n courseId,\n categoryId,\n placeHolder\n )\n .then(function() {\n var slideUpPromise = $.Deferred();\n var slideDownPromise = $.Deferred();\n oldMonth.slideUp('fast', function() {\n $(this).remove();\n slideUpPromise.resolve();\n });\n placeHolderContainer.slideDown('fast', function() {\n slideDownPromise.resolve();\n });\n\n return $.when(slideUpPromise, slideDownPromise);\n });\n };\n\n // Listen for a click on the day link in the three month block to load the day view.\n root.on('click', CalendarSelectors.links.miniDayLink, function(e) {\n\n var miniDayLink = $(e.target);\n var year = miniDayLink.data('year'),\n month = miniDayLink.data('month'),\n day = miniDayLink.text(),\n courseId = miniDayLink.data('courseid'),\n categoryId = miniDayLink.data('categoryid'),\n calendarRoot = $('body').find(CalendarSelectors.calendarMain);\n CalendarViewManager.refreshDayContent(calendarRoot, year, month, day, courseId, categoryId,\n calendarRoot.find('[id^=\"calendar-\"][data-template^=\"core_calendar/\"]'), 'core_calendar/calendar_day');\n e.preventDefault();\n window.history.pushState({}, '', '?view=day');\n });\n };\n\n return {\n init: function(root) {\n root = $(root);\n\n registerCalendarEventListeners(root);\n }\n };\n});\n"],"names":["define","$","Notification","CalendarSelectors","CalendarEvents","Templates","CalendarViewManager","init","root","on","monthChanged","dayChanged","join","e","year","month","courseId","categoryId","queue","next","processRequest","then","fail","exception","newParent","find","closest","calendarPeriods","allMonths","previousMonth","nextMonth","placeHolder","attr","requestYear","requestMonth","oldMonth","placeHolderContainer","hide","append","is","insertBefore","data","Deferred","resolve","insertAfter","refreshMonthContent","slideUpPromise","slideDownPromise","slideUp","this","remove","slideDown","when","links","miniDayLink","target","day","text","calendarRoot","calendarMain","refreshDayContent","preventDefault","window","history","pushState","registerCalendarEventListeners"],"mappings":";;;;;;;;AAuBAA,2CAAO,CACH,SACA,oBACA,0BACA,uBACA,iBACA,+BAEJ,SACIC,EACAC,aACAC,kBACAC,eACAC,UACAC,2BAqGO,CACHC,KAAM,SAASC,OA7FkB,SAASA,MAC/BP,EAAE,QACRQ,GAAG,CAACL,eAAeM,aAAcN,eAAeO,YAAYC,KAAK,MAAM,SAASC,EAAGC,KAAMC,MAAOC,SAAUC,YAG3GT,KAAKU,OAAM,SAASC,aACTC,eAAeP,EAAGC,KAAMC,MAAOC,SAAUC,YAC/CI,MAAK,kBACKF,UAEVG,KAAKpB,aAAaqB,qBAKvBH,eAAiB,SAASP,EAAGC,KAAMC,MAAOC,SAAUC,gBAEhDO,UADkBhB,KAAKiB,KAAK,eAAiBX,KAAO,kBAAoBC,MAAQ,MACpDW,QAAQvB,kBAAkBwB,gBAAgBZ,OACtEa,UAAYpB,KAAKiB,KAAKtB,kBAAkBwB,gBAAgBZ,OAExDc,cAAgB5B,EAAE2B,UAAU,IAC5BE,UAAY7B,EAAE2B,UAAU,IAExBG,YAAc9B,EAAE,UACpB8B,YAAYC,KAAK,gBAAiB,kCAClCD,YAAYC,KAAK,0BAA0B,GAC3CD,YAAYC,KAAK,aAAa,OAK1BC,YACAC,aACAC,SANAC,qBAAuBnC,EAAE,YAC7BmC,qBAAqBC,OACrBD,qBAAqBE,OAAOP,aAMxBP,UAAUe,GAAGV,eAEbO,qBAAqBI,aAAaX,eAElCI,YAAcJ,cAAcY,KAAK,gBACjCP,aAAeL,cAAcY,KAAK,iBAClCN,SAAWL,cACR,CAAA,IAAIN,UAAUe,GAAGT,kBAOb7B,EAAEyC,WAAWC,UALpBP,qBAAqBQ,YAAYd,WACjCG,YAAcH,UAAUW,KAAK,YAC7BP,aAAeJ,UAAUW,KAAK,aAC9BN,SAAWN,qBAKRvB,oBAAoBuC,oBACvBd,YACAE,YACAC,aACAlB,SACAC,WACAc,aAEHV,MAAK,eACEyB,eAAiB7C,EAAEyC,WACnBK,iBAAmB9C,EAAEyC,kBACzBP,SAASa,QAAQ,QAAQ,WACrB/C,EAAEgD,MAAMC,SACRJ,eAAeH,aAEnBP,qBAAqBe,UAAU,QAAQ,WACnCJ,iBAAiBJ,aAGd1C,EAAEmD,KAAKN,eAAgBC,sBAKtCvC,KAAKC,GAAG,QAASN,kBAAkBkD,MAAMC,aAAa,SAASzC,OAEnDyC,YAAcrD,EAAEY,EAAE0C,QAClBzC,KAAOwC,YAAYb,KAAK,QACxB1B,MAAQuC,YAAYb,KAAK,SACzBe,IAAMF,YAAYG,OAClBzC,SAAWsC,YAAYb,KAAK,YAC5BxB,WAAaqC,YAAYb,KAAK,cAC9BiB,aAAezD,EAAE,QAAQwB,KAAKtB,kBAAkBwD,cACpDrD,oBAAoBsD,kBAAkBF,aAAc5C,KAAMC,MAAOyC,IAAKxC,SAAUC,WAC5EyC,aAAajC,KAAK,sDAAuD,8BAC7EZ,EAAEgD,iBACFC,OAAOC,QAAQC,UAAU,GAAI,GAAI,gBAQrCC,CAFAzD,KAAOP,EAAEO"} \ No newline at end of file +{"version":3,"file":"calendar_threemonth.min.js","sources":["../src/calendar_threemonth.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 handles display of multiple mini calendars in a view, and\n * movement through them.\n *\n * @module core_calendar/calendar_threemonth\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/notification',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core/templates',\n 'core_calendar/view_manager',\n],\nfunction(\n $,\n Notification,\n CalendarSelectors,\n CalendarEvents,\n Templates,\n CalendarViewManager\n) {\n\n /**\n * Listen to and handle any calendar events fired by the calendar UI.\n *\n * @method registerCalendarEventListeners\n * @param {object} root The calendar root element\n */\n var registerCalendarEventListeners = function(root) {\n var body = $('body');\n body.on([CalendarEvents.monthChanged, CalendarEvents.dayChanged].join(' '), function(e, year, month, courseId, categoryId) {\n // We have to use a queue here because the calling code is decoupled from these listeners.\n // It's possible for the event to be called multiple times before one call is fully resolved.\n root.queue(function(next) {\n return processRequest(e, year, month, courseId, categoryId)\n .then(function() {\n return next();\n })\n .fail(Notification.exception)\n ;\n });\n });\n\n var processRequest = function(e, year, month, courseId, categoryId) {\n var newCurrentMonth = root.find('[data-year=\"' + year + '\"][data-month=\"' + month + '\"]');\n var newParent = newCurrentMonth.closest(CalendarSelectors.calendarPeriods.month);\n var allMonths = root.find(CalendarSelectors.calendarPeriods.month);\n\n var previousMonth = $(allMonths[0]);\n var nextMonth = $(allMonths[2]);\n\n var placeHolder = $('');\n placeHolder.attr('data-template', 'core_calendar/threemonth_month');\n placeHolder.attr('data-includenavigation', false);\n placeHolder.attr('data-mini', true);\n var placeHolderContainer = $('
          ');\n placeHolderContainer.hide();\n placeHolderContainer.append(placeHolder);\n\n var requestYear;\n var requestMonth;\n var oldMonth;\n\n if (newParent.is(previousMonth)) {\n // Fetch the new previous month.\n placeHolderContainer.insertBefore(previousMonth);\n\n requestYear = previousMonth.data('previousYear');\n requestMonth = previousMonth.data('previousMonth');\n oldMonth = nextMonth;\n } else if (newParent.is(nextMonth)) {\n // Fetch the new next month.\n placeHolderContainer.insertAfter(nextMonth);\n requestYear = nextMonth.data('nextYear');\n requestMonth = nextMonth.data('nextMonth');\n oldMonth = previousMonth;\n } else {\n return $.Deferred().resolve();\n }\n\n return CalendarViewManager.refreshMonthContent(\n placeHolder,\n requestYear,\n requestMonth,\n courseId,\n categoryId,\n placeHolder\n )\n .then(function() {\n var slideUpPromise = $.Deferred();\n var slideDownPromise = $.Deferred();\n oldMonth.slideUp('fast', function() {\n $(this).remove();\n slideUpPromise.resolve();\n });\n placeHolderContainer.slideDown('fast', function() {\n slideDownPromise.resolve();\n });\n\n return $.when(slideUpPromise, slideDownPromise);\n });\n };\n\n // Listen for a click on the day link in the three month block to load the day view.\n root.on('click', CalendarSelectors.links.miniDayLink, function(e) {\n\n var miniDayLink = $(e.target);\n var year = miniDayLink.data('year'),\n month = miniDayLink.data('month'),\n day = miniDayLink.text(),\n courseId = miniDayLink.data('courseid'),\n categoryId = miniDayLink.data('categoryid'),\n calendarRoot = $('body').find(CalendarSelectors.calendarMain);\n CalendarViewManager.refreshDayContent(calendarRoot, year, month, day, courseId, categoryId,\n calendarRoot.find('[id^=\"calendar-\"][data-template^=\"core_calendar/\"]'), 'core_calendar/calendar_day');\n e.preventDefault();\n window.history.pushState({}, '', '?view=day');\n });\n };\n\n return {\n init: function(root) {\n root = $(root);\n\n registerCalendarEventListeners(root);\n }\n };\n});\n"],"names":["define","$","Notification","CalendarSelectors","CalendarEvents","Templates","CalendarViewManager","init","root","on","monthChanged","dayChanged","join","e","year","month","courseId","categoryId","queue","next","processRequest","then","fail","exception","newParent","find","closest","calendarPeriods","allMonths","previousMonth","nextMonth","placeHolder","attr","requestYear","requestMonth","oldMonth","placeHolderContainer","hide","append","is","insertBefore","data","Deferred","resolve","insertAfter","refreshMonthContent","slideUpPromise","slideDownPromise","slideUp","this","remove","slideDown","when","links","miniDayLink","target","day","text","calendarRoot","calendarMain","refreshDayContent","preventDefault","window","history","pushState","registerCalendarEventListeners"],"mappings":";;;;;;;;AAuBAA,OAAM,oCAAC,CACH,SACA,oBACA,0BACA,uBACA,iBACA,+BAEJ,SACIC,EACAC,aACAC,kBACAC,eACAC,UACAC,qBAqGO,MAAA,CACHC,KAAM,SAASC,OA7FkB,SAASA,MAC/BP,EAAE,QACRQ,GAAG,CAACL,eAAeM,aAAcN,eAAeO,YAAYC,KAAK,MAAM,SAASC,EAAGC,KAAMC,MAAOC,SAAUC,YAG3GT,KAAKU,OAAM,SAASC,MAChB,OAAOC,eAAeP,EAAGC,KAAMC,MAAOC,SAAUC,YAC/CI,MAAK,WACF,OAAOF,MAFJ,IAING,KAAKpB,aAAaqB,UAEtB,GACJ,IAED,IAAIH,eAAiB,SAASP,EAAGC,KAAMC,MAAOC,SAAUC,YACpD,IACIO,UADkBhB,KAAKiB,KAAK,eAAiBX,KAAO,kBAAoBC,MAAQ,MACpDW,QAAQvB,kBAAkBwB,gBAAgBZ,OACtEa,UAAYpB,KAAKiB,KAAKtB,kBAAkBwB,gBAAgBZ,OAExDc,cAAgB5B,EAAE2B,UAAU,IAC5BE,UAAY7B,EAAE2B,UAAU,IAExBG,YAAc9B,EAAE,UACpB8B,YAAYC,KAAK,gBAAiB,kCAClCD,YAAYC,KAAK,0BAA0B,GAC3CD,YAAYC,KAAK,aAAa,GAC9B,IAIIC,YACAC,aACAC,SANAC,qBAAuBnC,EAAE,SAQ7B,GAPAmC,qBAAqBC,OACrBD,qBAAqBE,OAAOP,aAMxBP,UAAUe,GAAGV,eAEbO,qBAAqBI,aAAaX,eAElCI,YAAcJ,cAAcY,KAAK,gBACjCP,aAAeL,cAAcY,KAAK,iBAClCN,SAAWL,cACR,KAAIN,UAAUe,GAAGT,WAOpB,OAAO7B,EAAEyC,WAAWC,UALpBP,qBAAqBQ,YAAYd,WACjCG,YAAcH,UAAUW,KAAK,YAC7BP,aAAeJ,UAAUW,KAAK,aAC9BN,SAAWN,aAGd,CAED,OAAOvB,oBAAoBuC,oBACvBd,YACAE,YACAC,aACAlB,SACAC,WACAc,aAEHV,MAAK,WACF,IAAIyB,eAAiB7C,EAAEyC,WACnBK,iBAAmB9C,EAAEyC,WASzB,OARAP,SAASa,QAAQ,QAAQ,WACrB/C,EAAEgD,MAAMC,SACRJ,eAAeH,SAClB,IACDP,qBAAqBe,UAAU,QAAQ,WACnCJ,iBAAiBJ,SACpB,IAEM1C,EAAEmD,KAAKN,eAAgBC,iBACjC,GACJ,EAGDvC,KAAKC,GAAG,QAASN,kBAAkBkD,MAAMC,aAAa,SAASzC,GAEvD,IAAIyC,YAAcrD,EAAEY,EAAE0C,QAClBzC,KAAOwC,YAAYb,KAAK,QACxB1B,MAAQuC,YAAYb,KAAK,SACzBe,IAAMF,YAAYG,OAClBzC,SAAWsC,YAAYb,KAAK,YAC5BxB,WAAaqC,YAAYb,KAAK,cAC9BiB,aAAezD,EAAE,QAAQwB,KAAKtB,kBAAkBwD,cACpDrD,oBAAoBsD,kBAAkBF,aAAc5C,KAAMC,MAAOyC,IAAKxC,SAAUC,WAC5EyC,aAAajC,KAAK,sDAAuD,8BAC7EZ,EAAEgD,iBACFC,OAAOC,QAAQC,UAAU,CAAzB,EAA6B,GAAI,YACxC,GACJ,CAMOC,CAFAzD,KAAOP,EAAEO,MAGZ,EAER"} \ No newline at end of file diff --git a/calendar/amd/build/calendar_view.min.js.map b/calendar/amd/build/calendar_view.min.js.map index 2101d5d4ffd..5de945d1dde 100644 --- a/calendar/amd/build/calendar_view.min.js.map +++ b/calendar/amd/build/calendar_view.min.js.map @@ -1 +1 @@ -{"version":3,"file":"calendar_view.min.js","sources":["../src/calendar_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 is responsible for handle calendar day and upcoming view.\n *\n * @module core_calendar/calendar\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/str',\n 'core/notification',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core_calendar/view_manager',\n 'core_calendar/repository',\n 'core/modal_factory',\n 'core_calendar/modal_event_form',\n 'core/modal_events',\n 'core_calendar/crud'\n ],\n function(\n $,\n Str,\n Notification,\n CalendarSelectors,\n CalendarEvents,\n CalendarViewManager,\n CalendarRepository,\n ModalFactory,\n ModalEventForm,\n ModalEvents,\n CalendarCrud\n ) {\n\n var registerEventListeners = function(root, type) {\n var body = $('body');\n\n CalendarCrud.registerRemove(root);\n\n var reloadFunction = 'reloadCurrent' + type.charAt(0).toUpperCase() + type.slice(1);\n\n body.on(CalendarEvents.created, function() {\n CalendarViewManager[reloadFunction](root);\n });\n body.on(CalendarEvents.deleted, function() {\n CalendarViewManager[reloadFunction](root);\n });\n body.on(CalendarEvents.updated, function() {\n CalendarViewManager[reloadFunction](root);\n });\n\n root.on('change', CalendarSelectors.courseSelector, function() {\n var selectElement = $(this);\n var courseId = selectElement.val();\n CalendarViewManager[reloadFunction](root, courseId, null)\n .then(function() {\n // We need to get the selector again because the content has changed.\n return root.find(CalendarSelectors.courseSelector).val(courseId);\n })\n .then(function() {\n window.history.pushState({}, '', '?view=upcoming&course=' + courseId);\n\n return;\n })\n .fail(Notification.exception);\n });\n\n body.on(CalendarEvents.filterChanged, function(e, data) {\n var daysWithEvent = root.find(CalendarSelectors.eventType[data.type]);\n if (data.hidden == true) {\n daysWithEvent.addClass('hidden');\n } else {\n daysWithEvent.removeClass('hidden');\n }\n });\n\n var eventFormPromise = CalendarCrud.registerEventFormModal(root);\n CalendarCrud.registerEditListeners(root, eventFormPromise);\n };\n\n return {\n init: function(root, type) {\n root = $(root);\n\n CalendarViewManager.init(root, type);\n registerEventListeners(root, type);\n }\n };\n });\n"],"names":["define","$","Str","Notification","CalendarSelectors","CalendarEvents","CalendarViewManager","CalendarRepository","ModalFactory","ModalEventForm","ModalEvents","CalendarCrud","init","root","type","body","registerRemove","reloadFunction","charAt","toUpperCase","slice","on","created","deleted","updated","courseSelector","courseId","this","val","then","find","window","history","pushState","fail","exception","filterChanged","e","data","daysWithEvent","eventType","hidden","addClass","removeClass","eventFormPromise","registerEventFormModal","registerEditListeners","registerEventListeners"],"mappings":";;;;;;;AAsBAA,qCAAO,CACC,SACA,WACA,oBACA,0BACA,uBACA,6BACA,2BACA,qBACA,iCACA,oBACA,uBAEJ,SACIC,EACAC,IACAC,aACAC,kBACAC,eACAC,oBACAC,mBACAC,aACAC,eACAC,YACAC,oBAiDO,CACHC,KAAM,SAASC,KAAMC,MACjBD,KAAOZ,EAAEY,MAETP,oBAAoBM,KAAKC,KAAMC,MAlDV,SAASD,KAAMC,UACpCC,KAAOd,EAAE,QAEbU,aAAaK,eAAeH,UAExBI,eAAiB,gBAAkBH,KAAKI,OAAO,GAAGC,cAAgBL,KAAKM,MAAM,GAEjFL,KAAKM,GAAGhB,eAAeiB,SAAS,WAC5BhB,oBAAoBW,gBAAgBJ,SAExCE,KAAKM,GAAGhB,eAAekB,SAAS,WAC5BjB,oBAAoBW,gBAAgBJ,SAExCE,KAAKM,GAAGhB,eAAemB,SAAS,WAC5BlB,oBAAoBW,gBAAgBJ,SAGxCA,KAAKQ,GAAG,SAAUjB,kBAAkBqB,gBAAgB,eAE5CC,SADgBzB,EAAE0B,MACOC,MAC7BtB,oBAAoBW,gBAAgBJ,KAAMa,SAAU,MAC/CG,MAAK,kBAEKhB,KAAKiB,KAAK1B,kBAAkBqB,gBAAgBG,IAAIF,aAE1DG,MAAK,WACFE,OAAOC,QAAQC,UAAU,GAAI,GAAI,yBAA2BP,aAI/DQ,KAAK/B,aAAagC,cAG3BpB,KAAKM,GAAGhB,eAAe+B,eAAe,SAASC,EAAGC,UAC1CC,cAAgB1B,KAAKiB,KAAK1B,kBAAkBoC,UAAUF,KAAKxB,OAC5C,GAAfwB,KAAKG,OACLF,cAAcG,SAAS,UAEvBH,cAAcI,YAAY,iBAI9BC,iBAAmBjC,aAAakC,uBAAuBhC,MAC3DF,aAAamC,sBAAsBjC,KAAM+B,kBAQrCG,CAAuBlC,KAAMC"} \ No newline at end of file +{"version":3,"file":"calendar_view.min.js","sources":["../src/calendar_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 is responsible for handle calendar day and upcoming view.\n *\n * @module core_calendar/calendar\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/str',\n 'core/notification',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core_calendar/view_manager',\n 'core_calendar/repository',\n 'core/modal_factory',\n 'core_calendar/modal_event_form',\n 'core/modal_events',\n 'core_calendar/crud'\n ],\n function(\n $,\n Str,\n Notification,\n CalendarSelectors,\n CalendarEvents,\n CalendarViewManager,\n CalendarRepository,\n ModalFactory,\n ModalEventForm,\n ModalEvents,\n CalendarCrud\n ) {\n\n var registerEventListeners = function(root, type) {\n var body = $('body');\n\n CalendarCrud.registerRemove(root);\n\n var reloadFunction = 'reloadCurrent' + type.charAt(0).toUpperCase() + type.slice(1);\n\n body.on(CalendarEvents.created, function() {\n CalendarViewManager[reloadFunction](root);\n });\n body.on(CalendarEvents.deleted, function() {\n CalendarViewManager[reloadFunction](root);\n });\n body.on(CalendarEvents.updated, function() {\n CalendarViewManager[reloadFunction](root);\n });\n\n root.on('change', CalendarSelectors.courseSelector, function() {\n var selectElement = $(this);\n var courseId = selectElement.val();\n CalendarViewManager[reloadFunction](root, courseId, null)\n .then(function() {\n // We need to get the selector again because the content has changed.\n return root.find(CalendarSelectors.courseSelector).val(courseId);\n })\n .then(function() {\n window.history.pushState({}, '', '?view=upcoming&course=' + courseId);\n\n return;\n })\n .fail(Notification.exception);\n });\n\n body.on(CalendarEvents.filterChanged, function(e, data) {\n var daysWithEvent = root.find(CalendarSelectors.eventType[data.type]);\n if (data.hidden == true) {\n daysWithEvent.addClass('hidden');\n } else {\n daysWithEvent.removeClass('hidden');\n }\n });\n\n var eventFormPromise = CalendarCrud.registerEventFormModal(root);\n CalendarCrud.registerEditListeners(root, eventFormPromise);\n };\n\n return {\n init: function(root, type) {\n root = $(root);\n\n CalendarViewManager.init(root, type);\n registerEventListeners(root, type);\n }\n };\n });\n"],"names":["define","$","Str","Notification","CalendarSelectors","CalendarEvents","CalendarViewManager","CalendarRepository","ModalFactory","ModalEventForm","ModalEvents","CalendarCrud","init","root","type","body","registerRemove","reloadFunction","charAt","toUpperCase","slice","on","created","deleted","updated","courseSelector","courseId","this","val","then","find","window","history","pushState","fail","exception","filterChanged","e","data","daysWithEvent","eventType","hidden","addClass","removeClass","eventFormPromise","registerEventFormModal","registerEditListeners","registerEventListeners"],"mappings":";;;;;;;AAsBAA,OAAM,8BAAC,CACC,SACA,WACA,oBACA,0BACA,uBACA,6BACA,2BACA,qBACA,iCACA,oBACA,uBAEJ,SACIC,EACAC,IACAC,aACAC,kBACAC,eACAC,oBACAC,mBACAC,aACAC,eACAC,YACAC,cAiDO,MAAA,CACHC,KAAM,SAASC,KAAMC,MACjBD,KAAOZ,EAAEY,MAETP,oBAAoBM,KAAKC,KAAMC,MAlDV,SAASD,KAAMC,MACxC,IAAIC,KAAOd,EAAE,QAEbU,aAAaK,eAAeH,MAE5B,IAAII,eAAiB,gBAAkBH,KAAKI,OAAO,GAAGC,cAAgBL,KAAKM,MAAM,GAEjFL,KAAKM,GAAGhB,eAAeiB,SAAS,WAC5BhB,oBAAoBW,gBAAgBJ,KACvC,IACDE,KAAKM,GAAGhB,eAAekB,SAAS,WAC5BjB,oBAAoBW,gBAAgBJ,KACvC,IACDE,KAAKM,GAAGhB,eAAemB,SAAS,WAC5BlB,oBAAoBW,gBAAgBJ,KACvC,IAEDA,KAAKQ,GAAG,SAAUjB,kBAAkBqB,gBAAgB,WAChD,IACIC,SADgBzB,EAAE0B,MACOC,MAC7BtB,oBAAoBW,gBAAgBJ,KAAMa,SAAU,MAC/CG,MAAK,WAEKhB,OAAAA,KAAKiB,KAAK1B,kBAAkBqB,gBAAgBG,IAAIF,SAC1D,IACAG,MAAK,WACFE,OAAOC,QAAQC,UAAU,CAAA,EAAI,GAAI,yBAA2BP,SANpE,IAUKQ,KAAK/B,aAAagC,UAC1B,IAEDpB,KAAKM,GAAGhB,eAAe+B,eAAe,SAASC,EAAGC,MAC9C,IAAIC,cAAgB1B,KAAKiB,KAAK1B,kBAAkBoC,UAAUF,KAAKxB,OAC5C,GAAfwB,KAAKG,OACLF,cAAcG,SAAS,UAEvBH,cAAcI,YAAY,SAEjC,IAED,IAAIC,iBAAmBjC,aAAakC,uBAAuBhC,MAC3DF,aAAamC,sBAAsBjC,KAAM+B,iBAC5C,CAOOG,CAAuBlC,KAAMC,KAChC,EAER"} \ No newline at end of file diff --git a/calendar/amd/build/crud.min.js.map b/calendar/amd/build/crud.min.js.map index 9a72b365090..f39a2d50ede 100644 --- a/calendar/amd/build/crud.min.js.map +++ b/calendar/amd/build/crud.min.js.map @@ -1 +1 @@ -{"version":3,"file":"crud.min.js","sources":["../src/crud.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 to handle CRUD operations within the UI.\n *\n * @module core_calendar/crud\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/str',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_registry',\n 'core/modal_factory',\n 'core/modal_events',\n 'core_calendar/modal_event_form',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/modal_delete',\n 'core_calendar/selectors',\n 'core/pending',\n],\nfunction(\n $,\n Str,\n Notification,\n CustomEvents,\n Modal,\n ModalRegistry,\n ModalFactory,\n ModalEvents,\n ModalEventForm,\n CalendarRepository,\n CalendarEvents,\n ModalDelete,\n CalendarSelectors,\n Pending\n) {\n\n /**\n * Prepares the action for the summary modal's delete action.\n *\n * @param {Number} eventId The ID of the event.\n * @param {string} eventTitle The event title.\n * @param {Number} eventCount The number of events in the series.\n * @return {Promise}\n */\n function confirmDeletion(eventId, eventTitle, eventCount) {\n var pendingPromise = new Pending('core_calendar/crud:confirmDeletion');\n var deleteStrings = [\n {\n key: 'deleteevent',\n component: 'calendar'\n },\n ];\n\n eventCount = parseInt(eventCount, 10);\n var deletePromise;\n var isRepeatedEvent = eventCount > 1;\n if (isRepeatedEvent) {\n deleteStrings.push({\n key: 'confirmeventseriesdelete',\n component: 'calendar',\n param: {\n name: eventTitle,\n count: eventCount,\n },\n });\n\n deletePromise = ModalFactory.create(\n {\n type: ModalDelete.TYPE\n }\n );\n } else {\n deleteStrings.push({\n key: 'confirmeventdelete',\n component: 'calendar',\n param: eventTitle\n });\n\n\n deletePromise = ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n });\n }\n\n var stringsPromise = Str.get_strings(deleteStrings);\n\n var finalPromise = $.when(stringsPromise, deletePromise)\n .then(function(strings, deleteModal) {\n deleteModal.setRemoveOnClose(true);\n deleteModal.setTitle(strings[0]);\n deleteModal.setBody(strings[1]);\n if (!isRepeatedEvent) {\n deleteModal.setSaveButtonText(strings[0]);\n }\n\n deleteModal.show();\n\n deleteModal.getRoot().on(ModalEvents.save, function() {\n var pendingPromise = new Pending('calendar/crud:initModal:deletedevent');\n CalendarRepository.deleteEvent(eventId, false)\n .then(function() {\n $('body').trigger(CalendarEvents.deleted, [eventId, false]);\n return;\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n });\n\n deleteModal.getRoot().on(CalendarEvents.deleteAll, function() {\n var pendingPromise = new Pending('calendar/crud:initModal:deletedallevent');\n CalendarRepository.deleteEvent(eventId, true)\n .then(function() {\n $('body').trigger(CalendarEvents.deleted, [eventId, true]);\n return;\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n });\n\n return deleteModal;\n })\n .then(function(modal) {\n pendingPromise.resolve();\n\n return modal;\n })\n .catch(Notification.exception);\n\n return finalPromise;\n }\n\n /**\n * Create the event form modal for creating new events and\n * editing existing events.\n *\n * @method registerEventFormModal\n * @param {object} root The calendar root element\n * @return {object} The create modal promise\n */\n var registerEventFormModal = function(root) {\n var eventFormPromise = ModalFactory.create({\n type: ModalEventForm.TYPE,\n large: true\n });\n\n // Bind click event on the new event button.\n root.on('click', CalendarSelectors.actions.create, function(e) {\n eventFormPromise.then(function(modal) {\n var wrapper = root.find(CalendarSelectors.wrapper);\n\n var categoryId = wrapper.data('categoryid');\n if (typeof categoryId !== 'undefined') {\n modal.setCategoryId(categoryId);\n }\n\n // Attempt to find the cell for today.\n // If it can't be found, then use the start time of the first day on the calendar.\n var today = root.find(CalendarSelectors.today);\n var firstDay = root.find(CalendarSelectors.day);\n if (!today.length && firstDay.length) {\n modal.setStartTime(firstDay.data('newEventTimestamp'));\n }\n\n modal.setContextId(wrapper.data('contextId'));\n modal.setCourseId(wrapper.data('courseid'));\n modal.show();\n return;\n })\n .fail(Notification.exception);\n\n e.preventDefault();\n });\n\n root.on('click', CalendarSelectors.actions.edit, function(e) {\n e.preventDefault();\n var target = $(e.currentTarget),\n calendarWrapper = target.closest(CalendarSelectors.wrapper),\n eventWrapper = target.closest(CalendarSelectors.eventItem);\n\n eventFormPromise.then(function(modal) {\n // When something within the calendar tells us the user wants\n // to edit an event then show the event form modal.\n modal.setEventId(eventWrapper.data('eventId'));\n\n modal.setContextId(calendarWrapper.data('contextId'));\n modal.setCourseId(eventWrapper.data('courseId'));\n modal.show();\n\n e.stopImmediatePropagation();\n return;\n }).fail(Notification.exception);\n });\n\n\n return eventFormPromise;\n };\n /**\n * Register the listeners required to remove the event.\n *\n * @param {jQuery} root\n */\n function registerRemove(root) {\n root.on('click', CalendarSelectors.actions.remove, function(e) {\n // Fetch the event title, count, and pass them into the new dialogue.\n var eventSource = $(this).closest(CalendarSelectors.eventItem);\n var eventId = eventSource.data('eventId'),\n eventTitle = eventSource.data('eventTitle'),\n eventCount = eventSource.data('eventCount');\n confirmDeletion(eventId, eventTitle, eventCount);\n\n e.preventDefault();\n });\n }\n\n /**\n * Register the listeners required to edit the event.\n *\n * @param {jQuery} root\n * @param {Promise} eventFormModalPromise\n * @returns {Promise}\n */\n function registerEditListeners(root, eventFormModalPromise) {\n var pendingPromise = new Pending('core_calendar/crud:registerEditListeners');\n\n return eventFormModalPromise\n .then(function(modal) {\n // When something within the calendar tells us the user wants\n // to edit an event then show the event form modal.\n $('body').on(CalendarEvents.editEvent, function(e, eventId) {\n var calendarWrapper = root.find(CalendarSelectors.wrapper);\n modal.setEventId(eventId);\n modal.setContextId(calendarWrapper.data('contextId'));\n modal.show();\n\n e.stopImmediatePropagation();\n });\n return modal;\n })\n .then(function(modal) {\n pendingPromise.resolve();\n\n return modal;\n })\n .catch(Notification.exception);\n }\n\n return {\n registerRemove: registerRemove,\n registerEditListeners: registerEditListeners,\n registerEventFormModal: registerEventFormModal\n };\n});\n"],"names":["define","$","Str","Notification","CustomEvents","Modal","ModalRegistry","ModalFactory","ModalEvents","ModalEventForm","CalendarRepository","CalendarEvents","ModalDelete","CalendarSelectors","Pending","registerRemove","root","on","actions","remove","e","eventSource","this","closest","eventItem","eventId","eventTitle","eventCount","deletePromise","pendingPromise","deleteStrings","key","component","isRepeatedEvent","parseInt","push","param","name","count","create","type","TYPE","types","SAVE_CANCEL","stringsPromise","get_strings","when","then","strings","deleteModal","setRemoveOnClose","setTitle","setBody","setSaveButtonText","show","getRoot","save","deleteEvent","trigger","deleted","resolve","catch","exception","deleteAll","modal","confirmDeletion","data","preventDefault","registerEditListeners","eventFormModalPromise","editEvent","calendarWrapper","find","wrapper","setEventId","setContextId","stopImmediatePropagation","registerEventFormModal","eventFormPromise","large","categoryId","setCategoryId","today","firstDay","day","length","setStartTime","setCourseId","fail","edit","target","currentTarget","eventWrapper"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"crud.min.js","sources":["../src/crud.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 to handle CRUD operations within the UI.\n *\n * @module core_calendar/crud\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/str',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_registry',\n 'core/modal_factory',\n 'core/modal_events',\n 'core_calendar/modal_event_form',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/modal_delete',\n 'core_calendar/selectors',\n 'core/pending',\n],\nfunction(\n $,\n Str,\n Notification,\n CustomEvents,\n Modal,\n ModalRegistry,\n ModalFactory,\n ModalEvents,\n ModalEventForm,\n CalendarRepository,\n CalendarEvents,\n ModalDelete,\n CalendarSelectors,\n Pending\n) {\n\n /**\n * Prepares the action for the summary modal's delete action.\n *\n * @param {Number} eventId The ID of the event.\n * @param {string} eventTitle The event title.\n * @param {Number} eventCount The number of events in the series.\n * @return {Promise}\n */\n function confirmDeletion(eventId, eventTitle, eventCount) {\n var pendingPromise = new Pending('core_calendar/crud:confirmDeletion');\n var deleteStrings = [\n {\n key: 'deleteevent',\n component: 'calendar'\n },\n ];\n\n eventCount = parseInt(eventCount, 10);\n var deletePromise;\n var isRepeatedEvent = eventCount > 1;\n if (isRepeatedEvent) {\n deleteStrings.push({\n key: 'confirmeventseriesdelete',\n component: 'calendar',\n param: {\n name: eventTitle,\n count: eventCount,\n },\n });\n\n deletePromise = ModalFactory.create(\n {\n type: ModalDelete.TYPE\n }\n );\n } else {\n deleteStrings.push({\n key: 'confirmeventdelete',\n component: 'calendar',\n param: eventTitle\n });\n\n\n deletePromise = ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n });\n }\n\n var stringsPromise = Str.get_strings(deleteStrings);\n\n var finalPromise = $.when(stringsPromise, deletePromise)\n .then(function(strings, deleteModal) {\n deleteModal.setRemoveOnClose(true);\n deleteModal.setTitle(strings[0]);\n deleteModal.setBody(strings[1]);\n if (!isRepeatedEvent) {\n deleteModal.setSaveButtonText(strings[0]);\n }\n\n deleteModal.show();\n\n deleteModal.getRoot().on(ModalEvents.save, function() {\n var pendingPromise = new Pending('calendar/crud:initModal:deletedevent');\n CalendarRepository.deleteEvent(eventId, false)\n .then(function() {\n $('body').trigger(CalendarEvents.deleted, [eventId, false]);\n return;\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n });\n\n deleteModal.getRoot().on(CalendarEvents.deleteAll, function() {\n var pendingPromise = new Pending('calendar/crud:initModal:deletedallevent');\n CalendarRepository.deleteEvent(eventId, true)\n .then(function() {\n $('body').trigger(CalendarEvents.deleted, [eventId, true]);\n return;\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n });\n\n return deleteModal;\n })\n .then(function(modal) {\n pendingPromise.resolve();\n\n return modal;\n })\n .catch(Notification.exception);\n\n return finalPromise;\n }\n\n /**\n * Create the event form modal for creating new events and\n * editing existing events.\n *\n * @method registerEventFormModal\n * @param {object} root The calendar root element\n * @return {object} The create modal promise\n */\n var registerEventFormModal = function(root) {\n var eventFormPromise = ModalFactory.create({\n type: ModalEventForm.TYPE,\n large: true\n });\n\n // Bind click event on the new event button.\n root.on('click', CalendarSelectors.actions.create, function(e) {\n eventFormPromise.then(function(modal) {\n var wrapper = root.find(CalendarSelectors.wrapper);\n\n var categoryId = wrapper.data('categoryid');\n if (typeof categoryId !== 'undefined') {\n modal.setCategoryId(categoryId);\n }\n\n // Attempt to find the cell for today.\n // If it can't be found, then use the start time of the first day on the calendar.\n var today = root.find(CalendarSelectors.today);\n var firstDay = root.find(CalendarSelectors.day);\n if (!today.length && firstDay.length) {\n modal.setStartTime(firstDay.data('newEventTimestamp'));\n }\n\n modal.setContextId(wrapper.data('contextId'));\n modal.setCourseId(wrapper.data('courseid'));\n modal.show();\n return;\n })\n .fail(Notification.exception);\n\n e.preventDefault();\n });\n\n root.on('click', CalendarSelectors.actions.edit, function(e) {\n e.preventDefault();\n var target = $(e.currentTarget),\n calendarWrapper = target.closest(CalendarSelectors.wrapper),\n eventWrapper = target.closest(CalendarSelectors.eventItem);\n\n eventFormPromise.then(function(modal) {\n // When something within the calendar tells us the user wants\n // to edit an event then show the event form modal.\n modal.setEventId(eventWrapper.data('eventId'));\n\n modal.setContextId(calendarWrapper.data('contextId'));\n modal.setCourseId(eventWrapper.data('courseId'));\n modal.show();\n\n e.stopImmediatePropagation();\n return;\n }).fail(Notification.exception);\n });\n\n\n return eventFormPromise;\n };\n /**\n * Register the listeners required to remove the event.\n *\n * @param {jQuery} root\n */\n function registerRemove(root) {\n root.on('click', CalendarSelectors.actions.remove, function(e) {\n // Fetch the event title, count, and pass them into the new dialogue.\n var eventSource = $(this).closest(CalendarSelectors.eventItem);\n var eventId = eventSource.data('eventId'),\n eventTitle = eventSource.data('eventTitle'),\n eventCount = eventSource.data('eventCount');\n confirmDeletion(eventId, eventTitle, eventCount);\n\n e.preventDefault();\n });\n }\n\n /**\n * Register the listeners required to edit the event.\n *\n * @param {jQuery} root\n * @param {Promise} eventFormModalPromise\n * @returns {Promise}\n */\n function registerEditListeners(root, eventFormModalPromise) {\n var pendingPromise = new Pending('core_calendar/crud:registerEditListeners');\n\n return eventFormModalPromise\n .then(function(modal) {\n // When something within the calendar tells us the user wants\n // to edit an event then show the event form modal.\n $('body').on(CalendarEvents.editEvent, function(e, eventId) {\n var calendarWrapper = root.find(CalendarSelectors.wrapper);\n modal.setEventId(eventId);\n modal.setContextId(calendarWrapper.data('contextId'));\n modal.show();\n\n e.stopImmediatePropagation();\n });\n return modal;\n })\n .then(function(modal) {\n pendingPromise.resolve();\n\n return modal;\n })\n .catch(Notification.exception);\n }\n\n return {\n registerRemove: registerRemove,\n registerEditListeners: registerEditListeners,\n registerEventFormModal: registerEventFormModal\n };\n});\n"],"names":["define","$","Str","Notification","CustomEvents","Modal","ModalRegistry","ModalFactory","ModalEvents","ModalEventForm","CalendarRepository","CalendarEvents","ModalDelete","CalendarSelectors","Pending","registerRemove","root","on","actions","remove","e","eventSource","this","closest","eventItem","eventId","eventTitle","eventCount","deletePromise","pendingPromise","deleteStrings","key","component","isRepeatedEvent","parseInt","push","param","name","count","create","type","TYPE","types","SAVE_CANCEL","stringsPromise","get_strings","when","then","strings","deleteModal","setRemoveOnClose","setTitle","setBody","setSaveButtonText","show","getRoot","save","deleteEvent","trigger","deleted","resolve","catch","exception","deleteAll","modal","confirmDeletion","data","preventDefault","registerEditListeners","eventFormModalPromise","editEvent","calendarWrapper","find","wrapper","setEventId","setContextId","stopImmediatePropagation","registerEventFormModal","eventFormPromise","large","categoryId","setCategoryId","today","firstDay","day","length","setStartTime","setCourseId","fail","edit","target","currentTarget","eventWrapper"],"mappings":"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"} \ No newline at end of file diff --git a/calendar/amd/build/drag_drop_data_store.min.js.map b/calendar/amd/build/drag_drop_data_store.min.js.map index bbba73e8937..517e73ec0ab 100644 --- a/calendar/amd/build/drag_drop_data_store.min.js.map +++ b/calendar/amd/build/drag_drop_data_store.min.js.map @@ -1 +1 @@ -{"version":3,"file":"drag_drop_data_store.min.js","sources":["../src/drag_drop_data_store.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 javascript module to store calendar drag and drop data.\n *\n * This module is unfortunately required because of the limitations\n * of the HTML5 drag and drop API and it's ability to provide data\n * between the different stages of the drag/drop lifecycle.\n *\n * @module core_calendar/drag_drop_data_store\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n /* @var {int|null} eventId The id of the event being dragged */\n var eventId = null;\n /* @var {int|null} durationDays How many days the event spans */\n var durationDays = null;\n /* @var {int|null} minTimestart The earliest valid timestart */\n var minTimestart = null;\n /* @var {int|null} maxTimestart The latest valid tiemstart */\n var maxTimestart = null;\n /* @var {string|null} minError Error message for min timestamp violation */\n var minError = null;\n /* @var {string|null} maxError Error message for max timestamp violation */\n var maxError = null;\n\n /**\n * Store the id of the event being dragged.\n *\n * @param {int} id The event id\n */\n var setEventId = function(id) {\n eventId = id;\n };\n\n /**\n * Get the stored event id.\n *\n * @return {int|null}\n */\n var getEventId = function() {\n return eventId;\n };\n\n /**\n * Check if the store has an event id.\n *\n * @return {bool}\n */\n var hasEventId = function() {\n return eventId !== null;\n };\n\n /**\n * Store the duration (in days) of the event being dragged.\n *\n * @param {int} days Number of days the event spans\n */\n var setDurationDays = function(days) {\n durationDays = days;\n };\n\n /**\n * Get the stored number of days.\n *\n * @return {int|null}\n */\n var getDurationDays = function() {\n return durationDays;\n };\n\n /**\n * Store the minimum timestart valid for an event being dragged.\n *\n * @param {int} timestamp The unix timstamp\n */\n var setMinTimestart = function(timestamp) {\n minTimestart = timestamp;\n };\n\n /**\n * Get the minimum valid timestart.\n *\n * @return {int|null}\n */\n var getMinTimestart = function() {\n return minTimestart;\n };\n\n /**\n * Check if a minimum timestamp is set.\n *\n * @return {bool}\n */\n var hasMinTimestart = function() {\n return minTimestart !== null;\n };\n\n /**\n * Store the maximum timestart valid for an event being dragged.\n *\n * @param {int} timestamp The unix timstamp\n */\n var setMaxTimestart = function(timestamp) {\n maxTimestart = timestamp;\n };\n\n /**\n * Get the maximum valid timestart.\n *\n * @return {int|null}\n */\n var getMaxTimestart = function() {\n return maxTimestart;\n };\n\n /**\n * Check if a maximum timestamp is set.\n *\n * @return {bool}\n */\n var hasMaxTimestart = function() {\n return maxTimestart !== null;\n };\n\n /**\n * Store the error string to display if trying to drag an event\n * earlier than the minimum allowed date.\n *\n * @param {string} message The error message\n */\n var setMinError = function(message) {\n minError = message;\n };\n\n /**\n * Get the error message for a minimum time start violation.\n *\n * @return {string|null}\n */\n var getMinError = function() {\n return minError;\n };\n\n /**\n * Store the error string to display if trying to drag an event\n * later than the maximum allowed date.\n *\n * @param {string} message The error message\n */\n var setMaxError = function(message) {\n maxError = message;\n };\n\n /**\n * Get the error message for a maximum time start violation.\n *\n * @return {string|null}\n */\n var getMaxError = function() {\n return maxError;\n };\n\n /**\n * Reset all of the stored values.\n */\n var clearAll = function() {\n setEventId(null);\n setDurationDays(null);\n setMinTimestart(null);\n setMaxTimestart(null);\n setMinError(null);\n setMaxError(null);\n };\n\n return {\n setEventId: setEventId,\n getEventId: getEventId,\n hasEventId: hasEventId,\n setDurationDays: setDurationDays,\n getDurationDays: getDurationDays,\n setMinTimestart: setMinTimestart,\n getMinTimestart: getMinTimestart,\n hasMinTimestart: hasMinTimestart,\n setMaxTimestart: setMaxTimestart,\n getMaxTimestart: getMaxTimestart,\n hasMaxTimestart: hasMaxTimestart,\n setMinError: setMinError,\n getMinError: getMinError,\n setMaxError: setMaxError,\n getMaxError: getMaxError,\n clearAll: clearAll\n };\n});\n"],"names":["define","eventId","durationDays","minTimestart","maxTimestart","minError","maxError","setEventId","id","setDurationDays","days","setMinTimestart","timestamp","setMaxTimestart","setMinError","message","setMaxError","getEventId","hasEventId","getDurationDays","getMinTimestart","hasMinTimestart","getMaxTimestart","hasMaxTimestart","getMinError","getMaxError","clearAll"],"mappings":";;;;;;;;;;;AA0BAA,4CAAO,IAAI,eAEHC,QAAU,KAEVC,aAAe,KAEfC,aAAe,KAEfC,aAAe,KAEfC,SAAW,KAEXC,SAAW,KAOXC,WAAa,SAASC,IACtBP,QAAUO,IA0BVC,gBAAkB,SAASC,MAC3BR,aAAeQ,MAiBfC,gBAAkB,SAASC,WAC3BT,aAAeS,WA0BfC,gBAAkB,SAASD,WAC3BR,aAAeQ,WA2BfE,YAAc,SAASC,SACvBV,SAAWU,SAkBXC,YAAc,SAASD,SACvBT,SAAWS,eAwBR,CACHR,WAAYA,WACZU,WAzIa,kBACNhB,SAyIPiB,WAjIa,kBACM,OAAZjB,SAiIPQ,gBAAiBA,gBACjBU,gBAjHkB,kBACXjB,cAiHPS,gBAAiBA,gBACjBS,gBAjGkB,kBACXjB,cAiGPkB,gBAzFkB,kBACM,OAAjBlB,cAyFPU,gBAAiBA,gBACjBS,gBAzEkB,kBACXlB,cAyEPmB,gBAjEkB,kBACM,OAAjBnB,cAiEPU,YAAaA,YACbU,YAhDc,kBACPnB,UAgDPW,YAAaA,YACbS,YA/Bc,kBACPnB,UA+BPoB,SAzBW,WACXnB,WAAW,MACXE,gBAAgB,MAChBE,gBAAgB,MAChBE,gBAAgB,MAChBC,YAAY,MACZE,YAAY"} \ No newline at end of file +{"version":3,"file":"drag_drop_data_store.min.js","sources":["../src/drag_drop_data_store.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 javascript module to store calendar drag and drop data.\n *\n * This module is unfortunately required because of the limitations\n * of the HTML5 drag and drop API and it's ability to provide data\n * between the different stages of the drag/drop lifecycle.\n *\n * @module core_calendar/drag_drop_data_store\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n /* @var {int|null} eventId The id of the event being dragged */\n var eventId = null;\n /* @var {int|null} durationDays How many days the event spans */\n var durationDays = null;\n /* @var {int|null} minTimestart The earliest valid timestart */\n var minTimestart = null;\n /* @var {int|null} maxTimestart The latest valid tiemstart */\n var maxTimestart = null;\n /* @var {string|null} minError Error message for min timestamp violation */\n var minError = null;\n /* @var {string|null} maxError Error message for max timestamp violation */\n var maxError = null;\n\n /**\n * Store the id of the event being dragged.\n *\n * @param {int} id The event id\n */\n var setEventId = function(id) {\n eventId = id;\n };\n\n /**\n * Get the stored event id.\n *\n * @return {int|null}\n */\n var getEventId = function() {\n return eventId;\n };\n\n /**\n * Check if the store has an event id.\n *\n * @return {bool}\n */\n var hasEventId = function() {\n return eventId !== null;\n };\n\n /**\n * Store the duration (in days) of the event being dragged.\n *\n * @param {int} days Number of days the event spans\n */\n var setDurationDays = function(days) {\n durationDays = days;\n };\n\n /**\n * Get the stored number of days.\n *\n * @return {int|null}\n */\n var getDurationDays = function() {\n return durationDays;\n };\n\n /**\n * Store the minimum timestart valid for an event being dragged.\n *\n * @param {int} timestamp The unix timstamp\n */\n var setMinTimestart = function(timestamp) {\n minTimestart = timestamp;\n };\n\n /**\n * Get the minimum valid timestart.\n *\n * @return {int|null}\n */\n var getMinTimestart = function() {\n return minTimestart;\n };\n\n /**\n * Check if a minimum timestamp is set.\n *\n * @return {bool}\n */\n var hasMinTimestart = function() {\n return minTimestart !== null;\n };\n\n /**\n * Store the maximum timestart valid for an event being dragged.\n *\n * @param {int} timestamp The unix timstamp\n */\n var setMaxTimestart = function(timestamp) {\n maxTimestart = timestamp;\n };\n\n /**\n * Get the maximum valid timestart.\n *\n * @return {int|null}\n */\n var getMaxTimestart = function() {\n return maxTimestart;\n };\n\n /**\n * Check if a maximum timestamp is set.\n *\n * @return {bool}\n */\n var hasMaxTimestart = function() {\n return maxTimestart !== null;\n };\n\n /**\n * Store the error string to display if trying to drag an event\n * earlier than the minimum allowed date.\n *\n * @param {string} message The error message\n */\n var setMinError = function(message) {\n minError = message;\n };\n\n /**\n * Get the error message for a minimum time start violation.\n *\n * @return {string|null}\n */\n var getMinError = function() {\n return minError;\n };\n\n /**\n * Store the error string to display if trying to drag an event\n * later than the maximum allowed date.\n *\n * @param {string} message The error message\n */\n var setMaxError = function(message) {\n maxError = message;\n };\n\n /**\n * Get the error message for a maximum time start violation.\n *\n * @return {string|null}\n */\n var getMaxError = function() {\n return maxError;\n };\n\n /**\n * Reset all of the stored values.\n */\n var clearAll = function() {\n setEventId(null);\n setDurationDays(null);\n setMinTimestart(null);\n setMaxTimestart(null);\n setMinError(null);\n setMaxError(null);\n };\n\n return {\n setEventId: setEventId,\n getEventId: getEventId,\n hasEventId: hasEventId,\n setDurationDays: setDurationDays,\n getDurationDays: getDurationDays,\n setMinTimestart: setMinTimestart,\n getMinTimestart: getMinTimestart,\n hasMinTimestart: hasMinTimestart,\n setMaxTimestart: setMaxTimestart,\n getMaxTimestart: getMaxTimestart,\n hasMaxTimestart: hasMaxTimestart,\n setMinError: setMinError,\n getMinError: getMinError,\n setMaxError: setMaxError,\n getMaxError: getMaxError,\n clearAll: clearAll\n };\n});\n"],"names":["define","eventId","durationDays","minTimestart","maxTimestart","minError","maxError","setEventId","id","setDurationDays","days","setMinTimestart","timestamp","setMaxTimestart","setMinError","message","setMaxError","getEventId","hasEventId","getDurationDays","getMinTimestart","hasMinTimestart","getMaxTimestart","hasMaxTimestart","getMinError","getMaxError","clearAll"],"mappings":";;;;;;;;;;;AA0BAA,OAAM,qCAAC,IAAI,WAEHC,IAAAA,QAAU,KAEVC,aAAe,KAEfC,aAAe,KAEfC,aAAe,KAEfC,SAAW,KAEXC,SAAW,KAOXC,WAAa,SAASC,IACtBP,QAAUO,EACb,EAyBGC,gBAAkB,SAASC,MAC3BR,aAAeQ,IAClB,EAgBGC,gBAAkB,SAASC,WAC3BT,aAAeS,SAClB,EAyBGC,gBAAkB,SAASD,WAC3BR,aAAeQ,SAClB,EA0BGE,YAAc,SAASC,SACvBV,SAAWU,OACd,EAiBGC,YAAc,SAASD,SACvBT,SAAWS,OACd,EAuBM,MAAA,CACHR,WAAYA,WACZU,WAzIa,WACb,OAAOhB,OACV,EAwIGiB,WAjIa,WACNjB,OAAY,OAAZA,OACV,EAgIGQ,gBAAiBA,gBACjBU,gBAjHkB,WAClB,OAAOjB,YACV,EAgHGS,gBAAiBA,gBACjBS,gBAjGkB,WAClB,OAAOjB,YACV,EAgGGkB,gBAzFkB,WACXlB,OAAiB,OAAjBA,YACV,EAwFGU,gBAAiBA,gBACjBS,gBAzEkB,WAClB,OAAOlB,YACV,EAwEGmB,gBAjEkB,WACXnB,OAAiB,OAAjBA,YACV,EAgEGU,YAAaA,YACbU,YAhDc,WACd,OAAOnB,QACV,EA+CGW,YAAaA,YACbS,YA/Bc,WACd,OAAOnB,QACV,EA8BGoB,SAzBW,WACXnB,WAAW,MACXE,gBAAgB,MAChBE,gBAAgB,MAChBE,gBAAgB,MAChBC,YAAY,MACZE,YAAY,KACf,EAoBJ"} \ No newline at end of file diff --git a/calendar/amd/build/event_form.min.js.map b/calendar/amd/build/event_form.min.js.map index 901d1783599..ba169fd2ed1 100644 --- a/calendar/amd/build/event_form.min.js.map +++ b/calendar/amd/build/event_form.min.js.map @@ -1 +1 @@ -{"version":3,"file":"event_form.min.js","sources":["../src/event_form.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 javascript module to enhance the event form.\n *\n * @module core_calendar/event_form\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core_calendar/repository'], function($, CalendarRepository) {\n\n var SELECTORS = {\n EVENT_GROUP_COURSE_ID: '[name=\"groupcourseid\"]',\n EVENT_GROUP_ID: '[name=\"groupid\"]',\n SELECT_OPTION: 'option'\n };\n\n /**\n * Listen for when the user changes the group course when configuring\n * a group event and filter the options in the group select to only\n * show the groups available within the course the user has selected.\n *\n * @method addCourseGroupSelectListeners\n * @param {object} formElement The root form element\n */\n var addCourseGroupSelectListeners = function(formElement) {\n var courseGroupSelect = formElement.find(SELECTORS.EVENT_GROUP_COURSE_ID);\n\n var loadGroupSelectOptions = function(groups) {\n var groupSelect = formElement.find(SELECTORS.EVENT_GROUP_ID),\n groupSelectOptions = groupSelect.find(SELECTORS.SELECT_OPTION),\n courseGroups = $(groups);\n\n // Let's clear all options first.\n groupSelectOptions.remove();\n groupSelect.prop(\"disabled\", false);\n courseGroups.each(function(id, group) {\n $(groupSelect).append($(\"\").attr(\"value\", group.id).text(group.name));\n });\n };\n\n // If the user choose a course in the selector do a WS request to get groups.\n courseGroupSelect.on('change', function() {\n var courseId = formElement.find(SELECTORS.EVENT_GROUP_COURSE_ID).val();\n CalendarRepository.getCourseGroupsData(courseId)\n .then(function(groups) {\n return loadGroupSelectOptions(groups);\n })\n .catch(Notification.exception);\n });\n };\n\n /**\n * Initialise all of the form enhancements.\n *\n * @method init\n * @param {string} formId The value of the form's id attribute\n */\n var init = function(formId) {\n var formElement = $('#' + formId);\n addCourseGroupSelectListeners(formElement);\n };\n\n return {\n init: init,\n };\n});\n"],"names":["define","$","CalendarRepository","SELECTORS","addCourseGroupSelectListeners","formElement","courseGroupSelect","find","on","courseId","val","getCourseGroupsData","then","groups","groupSelect","groupSelectOptions","courseGroups","remove","prop","each","id","group","append","attr","text","name","loadGroupSelectOptions","catch","Notification","exception","init","formId"],"mappings":";;;;;;;AAsBAA,kCAAO,CAAC,SAAU,6BAA6B,SAASC,EAAGC,wBAEnDC,gCACuB,yBADvBA,yBAEgB,mBAFhBA,wBAGe,SAWfC,8BAAgC,SAASC,iBACrCC,kBAAoBD,YAAYE,KAAKJ,iCAgBzCG,kBAAkBE,GAAG,UAAU,eACvBC,SAAWJ,YAAYE,KAAKJ,iCAAiCO,MACjER,mBAAmBS,oBAAoBF,UAClCG,MAAK,SAASC,eAjBM,SAASA,YAC9BC,YAAcT,YAAYE,KAAKJ,0BAC/BY,mBAAqBD,YAAYP,KAAKJ,yBACtCa,aAAef,EAAEY,QAGrBE,mBAAmBE,SACnBH,YAAYI,KAAK,YAAY,GAC7BF,aAAaG,MAAK,SAASC,GAAIC,OAC3BpB,EAAEa,aAAaQ,OAAOrB,EAAE,qBAAqBsB,KAAK,QAASF,MAAMD,IAAII,KAAKH,MAAMI,UASrEC,CAAuBb,WAEjCc,MAAMC,aAAaC,qBAezB,CACHC,KANO,SAASC,YACZ1B,YAAcJ,EAAE,IAAM8B,QAC1B3B,8BAA8BC"} \ No newline at end of file +{"version":3,"file":"event_form.min.js","sources":["../src/event_form.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 javascript module to enhance the event form.\n *\n * @module core_calendar/event_form\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core_calendar/repository'], function($, CalendarRepository) {\n\n var SELECTORS = {\n EVENT_GROUP_COURSE_ID: '[name=\"groupcourseid\"]',\n EVENT_GROUP_ID: '[name=\"groupid\"]',\n SELECT_OPTION: 'option'\n };\n\n /**\n * Listen for when the user changes the group course when configuring\n * a group event and filter the options in the group select to only\n * show the groups available within the course the user has selected.\n *\n * @method addCourseGroupSelectListeners\n * @param {object} formElement The root form element\n */\n var addCourseGroupSelectListeners = function(formElement) {\n var courseGroupSelect = formElement.find(SELECTORS.EVENT_GROUP_COURSE_ID);\n\n var loadGroupSelectOptions = function(groups) {\n var groupSelect = formElement.find(SELECTORS.EVENT_GROUP_ID),\n groupSelectOptions = groupSelect.find(SELECTORS.SELECT_OPTION),\n courseGroups = $(groups);\n\n // Let's clear all options first.\n groupSelectOptions.remove();\n groupSelect.prop(\"disabled\", false);\n courseGroups.each(function(id, group) {\n $(groupSelect).append($(\"\").attr(\"value\", group.id).text(group.name));\n });\n };\n\n // If the user choose a course in the selector do a WS request to get groups.\n courseGroupSelect.on('change', function() {\n var courseId = formElement.find(SELECTORS.EVENT_GROUP_COURSE_ID).val();\n CalendarRepository.getCourseGroupsData(courseId)\n .then(function(groups) {\n return loadGroupSelectOptions(groups);\n })\n .catch(Notification.exception);\n });\n };\n\n /**\n * Initialise all of the form enhancements.\n *\n * @method init\n * @param {string} formId The value of the form's id attribute\n */\n var init = function(formId) {\n var formElement = $('#' + formId);\n addCourseGroupSelectListeners(formElement);\n };\n\n return {\n init: init,\n };\n});\n"],"names":["define","$","CalendarRepository","SELECTORS","addCourseGroupSelectListeners","formElement","courseGroupSelect","find","on","courseId","val","getCourseGroupsData","then","groups","loadGroupSelectOptions","groupSelect","groupSelectOptions","courseGroups","remove","prop","each","id","group","append","attr","text","name","catch","Notification","exception","init","formId"],"mappings":";;;;;;;AAsBAA,OAAM,2BAAC,CAAC,SAAU,6BAA6B,SAASC,EAAGC,oBAEvD,IAAIC,gCACuB,yBADvBA,yBAEgB,mBAFhBA,wBAGe,SAWfC,8BAAgC,SAASC,aACrCC,IAAAA,kBAAoBD,YAAYE,KAAKJ,iCAgBzCG,kBAAkBE,GAAG,UAAU,WACvBC,IAAAA,SAAWJ,YAAYE,KAAKJ,iCAAiCO,MACjER,mBAAmBS,oBAAoBF,UAClCG,MAAK,SAASC,QACJC,OAlBU,SAASD,QAC9BE,IAAAA,YAAcV,YAAYE,KAAKJ,0BAC/Ba,mBAAqBD,YAAYR,KAAKJ,yBACtCc,aAAehB,EAAEY,QAGrBG,mBAAmBE,SACnBH,YAAYI,KAAK,YAAY,GAC7BF,aAAaG,MAAK,SAASC,GAAIC,OAC3BrB,EAAEc,aAAaQ,OAAOtB,EAAE,qBAAqBuB,KAAK,QAASF,MAAMD,IAAII,KAAKH,MAAMI,MACnF,GACJ,CAOkBZ,CAAuBD,OAFtC,IAIKc,MAAMC,aAAaC,UAC3B,GACJ,EAaM,MAAA,CACHC,KANO,SAASC,QAChB,IAAI1B,YAAcJ,EAAE,IAAM8B,QAC1B3B,8BAA8BC,YACjC,EAKJ"} \ No newline at end of file diff --git a/calendar/amd/build/events.min.js.map b/calendar/amd/build/events.min.js.map index 086b906a873..89d8416951f 100644 --- a/calendar/amd/build/events.min.js.map +++ b/calendar/amd/build/events.min.js.map @@ -1 +1 @@ -{"version":3,"file":"events.min.js","sources":["../src/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 * Contain the events the calendar component can fire.\n *\n * @module core_calendar/events\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n created: 'calendar-events:created',\n deleted: 'calendar-events:deleted',\n deleteAll: 'calendar-events:delete_all',\n updated: 'calendar-events:updated',\n editEvent: 'calendar-events:edit_event',\n editActionEvent: 'calendar-events:edit_action_event',\n eventMoved: 'calendar-events:event_moved',\n dayChanged: 'calendar-events:day_changed',\n monthChanged: 'calendar-events:month_changed',\n moveEvent: 'calendar-events:move_event',\n filterChanged: 'calendar-events:filter_changed',\n viewUpdated: 'calendar-events:view_updated',\n };\n});\n"],"names":["define","created","deleted","deleteAll","updated","editEvent","editActionEvent","eventMoved","dayChanged","monthChanged","moveEvent","filterChanged","viewUpdated"],"mappings":";;;;;;;AAsBAA,8BAAO,IAAI,iBACA,CACHC,QAAS,0BACTC,QAAS,0BACTC,UAAW,6BACXC,QAAS,0BACTC,UAAW,6BACXC,gBAAiB,oCACjBC,WAAY,8BACZC,WAAY,8BACZC,aAAc,gCACdC,UAAW,6BACXC,cAAe,iCACfC,YAAa"} \ No newline at end of file +{"version":3,"file":"events.min.js","sources":["../src/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 * Contain the events the calendar component can fire.\n *\n * @module core_calendar/events\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n created: 'calendar-events:created',\n deleted: 'calendar-events:deleted',\n deleteAll: 'calendar-events:delete_all',\n updated: 'calendar-events:updated',\n editEvent: 'calendar-events:edit_event',\n editActionEvent: 'calendar-events:edit_action_event',\n eventMoved: 'calendar-events:event_moved',\n dayChanged: 'calendar-events:day_changed',\n monthChanged: 'calendar-events:month_changed',\n moveEvent: 'calendar-events:move_event',\n filterChanged: 'calendar-events:filter_changed',\n viewUpdated: 'calendar-events:view_updated',\n };\n});\n"],"names":["define","created","deleted","deleteAll","updated","editEvent","editActionEvent","eventMoved","dayChanged","monthChanged","moveEvent","filterChanged","viewUpdated"],"mappings":";;;;;;;AAsBAA,OAAM,uBAAC,IAAI,WACA,MAAA,CACHC,QAAS,0BACTC,QAAS,0BACTC,UAAW,6BACXC,QAAS,0BACTC,UAAW,6BACXC,gBAAiB,oCACjBC,WAAY,8BACZC,WAAY,8BACZC,aAAc,gCACdC,UAAW,6BACXC,cAAe,iCACfC,YAAa,+BAEpB"} \ No newline at end of file diff --git a/calendar/amd/build/modal_delete.min.js.map b/calendar/amd/build/modal_delete.min.js.map index 8aee0d38d16..071b3e619bb 100644 --- a/calendar/amd/build/modal_delete.min.js.map +++ b/calendar/amd/build/modal_delete.min.js.map @@ -1 +1 @@ -{"version":3,"file":"modal_delete.min.js","sources":["../src/modal_delete.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 * Contain the logic for the delete modal.\n *\n * @module core_calendar/modal_delete\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_events',\n 'core/modal_registry',\n 'core_calendar/events',\n],\nfunction(\n $,\n Notification,\n CustomEvents,\n Modal,\n ModalEvents,\n ModalRegistry,\n CalendarEvents\n) {\n\n var registered = false;\n var SELECTORS = {\n DELETE_ONE_BUTTON: '[data-action=\"deleteone\"]',\n DELETE_ALL_BUTTON: '[data-action=\"deleteall\"]',\n CANCEL_BUTTON: '[data-action=\"cancel\"]',\n };\n\n /**\n * Constructor for the Modal.\n *\n * @class\n * @param {object} root The root jQuery element for the modal\n */\n var ModalDelete = function(root) {\n Modal.call(this, root);\n\n this.setRemoveOnClose(true);\n };\n\n ModalDelete.TYPE = 'core_calendar-modal_delete';\n ModalDelete.prototype = Object.create(Modal.prototype);\n ModalDelete.prototype.constructor = ModalDelete;\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalDelete.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.DELETE_ONE_BUTTON, function(e, data) {\n var saveEvent = $.Event(ModalEvents.save);\n this.getRoot().trigger(saveEvent, this);\n\n if (!saveEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.DELETE_ALL_BUTTON, function(e, data) {\n var saveEvent = $.Event(CalendarEvents.deleteAll);\n this.getRoot().trigger(saveEvent, this);\n\n if (!saveEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.CANCEL_BUTTON, function(e, data) {\n var cancelEvent = $.Event(ModalEvents.cancel);\n this.getRoot().trigger(cancelEvent, this);\n\n if (!cancelEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalDelete.TYPE, ModalDelete, 'calendar/event_delete_modal');\n registered = true;\n }\n\n return ModalDelete;\n});\n"],"names":["define","$","Notification","CustomEvents","Modal","ModalEvents","ModalRegistry","CalendarEvents","registered","SELECTORS","ModalDelete","root","call","this","setRemoveOnClose","TYPE","prototype","Object","create","constructor","registerEventListeners","getModal","on","events","activate","e","data","saveEvent","Event","save","getRoot","trigger","isDefaultPrevented","hide","originalEvent","preventDefault","bind","deleteAll","cancelEvent","cancel","register"],"mappings":";;;;;;;AAsBAA,oCAAO,CACH,SACA,oBACA,iCACA,aACA,oBACA,sBACA,yBAEJ,SACIC,EACAC,aACAC,aACAC,MACAC,YACAC,cACAC,oBAGIC,YAAa,EACbC,4BACmB,4BADnBA,4BAEmB,4BAFnBA,wBAGe,yBASfC,YAAc,SAASC,MACvBP,MAAMQ,KAAKC,KAAMF,WAEZG,kBAAiB,WAG1BJ,YAAYK,KAAO,8BACnBL,YAAYM,UAAYC,OAAOC,OAAOd,MAAMY,YACtBG,YAAcT,YAOpCA,YAAYM,UAAUI,uBAAyB,WAE3ChB,MAAMY,UAAUI,uBAAuBR,KAAKC,WAEvCQ,WAAWC,GAAGnB,aAAaoB,OAAOC,SAAUf,4BAA6B,SAASgB,EAAGC,UAClFC,UAAY1B,EAAE2B,MAAMvB,YAAYwB,WAC/BC,UAAUC,QAAQJ,UAAWd,MAE7Bc,UAAUK,4BACNC,OACLP,KAAKQ,cAAcC,mBAEzBC,KAAKvB,YAEFQ,WAAWC,GAAGnB,aAAaoB,OAAOC,SAAUf,4BAA6B,SAASgB,EAAGC,UAClFC,UAAY1B,EAAE2B,MAAMrB,eAAe8B,gBAClCP,UAAUC,QAAQJ,UAAWd,MAE7Bc,UAAUK,4BACNC,OACLP,KAAKQ,cAAcC,mBAEzBC,KAAKvB,YAEFQ,WAAWC,GAAGnB,aAAaoB,OAAOC,SAAUf,wBAAyB,SAASgB,EAAGC,UAC9EY,YAAcrC,EAAE2B,MAAMvB,YAAYkC,aACjCT,UAAUC,QAAQO,YAAazB,MAE/ByB,YAAYN,4BACRC,OACLP,KAAKQ,cAAcC,mBAEzBC,KAAKvB,QAKNL,aACDF,cAAckC,SAAS9B,YAAYK,KAAML,YAAa,+BACtDF,YAAa,GAGVE"} \ No newline at end of file +{"version":3,"file":"modal_delete.min.js","sources":["../src/modal_delete.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 * Contain the logic for the delete modal.\n *\n * @module core_calendar/modal_delete\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_events',\n 'core/modal_registry',\n 'core_calendar/events',\n],\nfunction(\n $,\n Notification,\n CustomEvents,\n Modal,\n ModalEvents,\n ModalRegistry,\n CalendarEvents\n) {\n\n var registered = false;\n var SELECTORS = {\n DELETE_ONE_BUTTON: '[data-action=\"deleteone\"]',\n DELETE_ALL_BUTTON: '[data-action=\"deleteall\"]',\n CANCEL_BUTTON: '[data-action=\"cancel\"]',\n };\n\n /**\n * Constructor for the Modal.\n *\n * @class\n * @param {object} root The root jQuery element for the modal\n */\n var ModalDelete = function(root) {\n Modal.call(this, root);\n\n this.setRemoveOnClose(true);\n };\n\n ModalDelete.TYPE = 'core_calendar-modal_delete';\n ModalDelete.prototype = Object.create(Modal.prototype);\n ModalDelete.prototype.constructor = ModalDelete;\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalDelete.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.DELETE_ONE_BUTTON, function(e, data) {\n var saveEvent = $.Event(ModalEvents.save);\n this.getRoot().trigger(saveEvent, this);\n\n if (!saveEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.DELETE_ALL_BUTTON, function(e, data) {\n var saveEvent = $.Event(CalendarEvents.deleteAll);\n this.getRoot().trigger(saveEvent, this);\n\n if (!saveEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.CANCEL_BUTTON, function(e, data) {\n var cancelEvent = $.Event(ModalEvents.cancel);\n this.getRoot().trigger(cancelEvent, this);\n\n if (!cancelEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalDelete.TYPE, ModalDelete, 'calendar/event_delete_modal');\n registered = true;\n }\n\n return ModalDelete;\n});\n"],"names":["define","$","Notification","CustomEvents","Modal","ModalEvents","ModalRegistry","CalendarEvents","registered","SELECTORS","ModalDelete","root","call","this","setRemoveOnClose","TYPE","prototype","Object","create","constructor","registerEventListeners","getModal","on","events","activate","e","data","saveEvent","Event","save","getRoot","trigger","isDefaultPrevented","hide","originalEvent","preventDefault","bind","deleteAll","cancelEvent","cancel","register"],"mappings":";;;;;;;AAsBAA,OAAO,6BAAA,CACH,SACA,oBACA,iCACA,aACA,oBACA,sBACA,yBAEJ,SACIC,EACAC,aACAC,aACAC,MACAC,YACAC,cACAC,gBAGIC,IAAAA,YAAa,EACbC,4BACmB,4BADnBA,4BAEmB,4BAFnBA,wBAGe,yBASfC,YAAc,SAASC,MACvBP,MAAMQ,KAAKC,KAAMF,MAEZG,KAAAA,kBAAiB,EACzB,EAqDD,OAnDAJ,YAAYK,KAAO,8BACnBL,YAAYM,UAAYC,OAAOC,OAAOd,MAAMY,YACtBG,YAAcT,YAOpCA,YAAYM,UAAUI,uBAAyB,WAE3ChB,MAAMY,UAAUI,uBAAuBR,KAAKC,MAE5CA,KAAKQ,WAAWC,GAAGnB,aAAaoB,OAAOC,SAAUf,4BAA6B,SAASgB,EAAGC,MAClFC,IAAAA,UAAY1B,EAAE2B,MAAMvB,YAAYwB,MACpChB,KAAKiB,UAAUC,QAAQJ,UAAWd,MAE7Bc,UAAUK,uBACXnB,KAAKoB,OACLP,KAAKQ,cAAcC,iBAE1B,EAACC,KAAKvB,OAEPA,KAAKQ,WAAWC,GAAGnB,aAAaoB,OAAOC,SAAUf,4BAA6B,SAASgB,EAAGC,MAClFC,IAAAA,UAAY1B,EAAE2B,MAAMrB,eAAe8B,WACvCxB,KAAKiB,UAAUC,QAAQJ,UAAWd,MAE7Bc,UAAUK,uBACXnB,KAAKoB,OACLP,KAAKQ,cAAcC,iBAE1B,EAACC,KAAKvB,OAEPA,KAAKQ,WAAWC,GAAGnB,aAAaoB,OAAOC,SAAUf,wBAAyB,SAASgB,EAAGC,MAC9EY,IAAAA,YAAcrC,EAAE2B,MAAMvB,YAAYkC,QACtC1B,KAAKiB,UAAUC,QAAQO,YAAazB,MAE/ByB,YAAYN,uBACbnB,KAAKoB,OACLP,KAAKQ,cAAcC,iBAE1B,EAACC,KAAKvB,MACV,EAIIL,aACDF,cAAckC,SAAS9B,YAAYK,KAAML,YAAa,+BACtDF,YAAa,GAGVE,WACV"} \ No newline at end of file diff --git a/calendar/amd/build/modal_event_form.min.js.map b/calendar/amd/build/modal_event_form.min.js.map index 5b4d3f65ae9..b7a5568ab5f 100644 --- a/calendar/amd/build/modal_event_form.min.js.map +++ b/calendar/amd/build/modal_event_form.min.js.map @@ -1 +1 @@ -{"version":3,"file":"modal_event_form.min.js","sources":["../src/modal_event_form.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 * Contain the logic for the quick add or update event modal.\n *\n * @module core_calendar/modal_quick_add_event\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/event',\n 'core/str',\n 'core/notification',\n 'core/templates',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_registry',\n 'core/fragment',\n 'core_calendar/events',\n 'core_calendar/repository'\n ],\n function(\n $,\n Event,\n Str,\n Notification,\n Templates,\n CustomEvents,\n Modal,\n ModalRegistry,\n Fragment,\n CalendarEvents,\n Repository\n ) {\n\n var registered = false;\n var SELECTORS = {\n SAVE_BUTTON: '[data-action=\"save\"]',\n LOADING_ICON_CONTAINER: '[data-region=\"loading-icon-container\"]',\n };\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var ModalEventForm = function(root) {\n Modal.call(this, root);\n this.eventId = null;\n this.startTime = null;\n this.courseId = null;\n this.categoryId = null;\n this.contextId = null;\n this.reloadingBody = false;\n this.reloadingTitle = false;\n this.saveButton = this.getFooter().find(SELECTORS.SAVE_BUTTON);\n };\n\n ModalEventForm.TYPE = 'core_calendar-modal_event_form';\n ModalEventForm.prototype = Object.create(Modal.prototype);\n ModalEventForm.prototype.constructor = ModalEventForm;\n\n /**\n * Set the context id to the given value.\n *\n * @method setContextId\n * @param {Number} id The event id\n */\n ModalEventForm.prototype.setContextId = function(id) {\n this.contextId = id;\n };\n\n /**\n * Retrieve the current context id, if any.\n *\n * @method getContextId\n * @return {Number|null} The event id\n */\n ModalEventForm.prototype.getContextId = function() {\n return this.contextId;\n };\n\n /**\n * Set the course id to the given value.\n *\n * @method setCourseId\n * @param {int} id The event id\n */\n ModalEventForm.prototype.setCourseId = function(id) {\n this.courseId = id;\n };\n\n /**\n * Retrieve the current course id, if any.\n *\n * @method getCourseId\n * @return {int|null} The event id\n */\n ModalEventForm.prototype.getCourseId = function() {\n return this.courseId;\n };\n\n /**\n * Set the category id to the given value.\n *\n * @method setCategoryId\n * @param {int} id The event id\n */\n ModalEventForm.prototype.setCategoryId = function(id) {\n this.categoryId = id;\n };\n\n /**\n * Retrieve the current category id, if any.\n *\n * @method getCategoryId\n * @return {int|null} The event id\n */\n ModalEventForm.prototype.getCategoryId = function() {\n return this.categoryId;\n };\n\n /**\n * Check if the modal has an course id.\n *\n * @method hasCourseId\n * @return {bool}\n */\n ModalEventForm.prototype.hasCourseId = function() {\n return this.courseId !== null;\n };\n\n /**\n * Check if the modal has an category id.\n *\n * @method hasCategoryId\n * @return {bool}\n */\n ModalEventForm.prototype.hasCategoryId = function() {\n return this.categoryId !== null;\n };\n\n /**\n * Set the event id to the given value.\n *\n * @method setEventId\n * @param {int} id The event id\n */\n ModalEventForm.prototype.setEventId = function(id) {\n this.eventId = id;\n };\n\n /**\n * Retrieve the current event id, if any.\n *\n * @method getEventId\n * @return {int|null} The event id\n */\n ModalEventForm.prototype.getEventId = function() {\n return this.eventId;\n };\n\n /**\n * Check if the modal has an event id.\n *\n * @method hasEventId\n * @return {bool}\n */\n ModalEventForm.prototype.hasEventId = function() {\n return this.eventId !== null;\n };\n\n /**\n * Set the start time to the given value.\n *\n * @method setStartTime\n * @param {int} time The start time\n */\n ModalEventForm.prototype.setStartTime = function(time) {\n this.startTime = time;\n };\n\n /**\n * Retrieve the current start time, if any.\n *\n * @method getStartTime\n * @return {int|null} The start time\n */\n ModalEventForm.prototype.getStartTime = function() {\n return this.startTime;\n };\n\n /**\n * Check if the modal has start time.\n *\n * @method hasStartTime\n * @return {bool}\n */\n ModalEventForm.prototype.hasStartTime = function() {\n return this.startTime !== null;\n };\n\n /**\n * Get the form element from the modal.\n *\n * @method getForm\n * @return {object}\n */\n ModalEventForm.prototype.getForm = function() {\n return this.getBody().find('form');\n };\n\n /**\n * Disable the buttons in the footer.\n *\n * @method disableButtons\n */\n ModalEventForm.prototype.disableButtons = function() {\n this.saveButton.prop('disabled', true);\n };\n\n /**\n * Enable the buttons in the footer.\n *\n * @method enableButtons\n */\n ModalEventForm.prototype.enableButtons = function() {\n this.saveButton.prop('disabled', false);\n };\n\n /**\n * Reload the title for the modal to the appropriate value\n * depending on whether we are creating a new event or\n * editing an existing event.\n *\n * @method reloadTitleContent\n * @return {object} A promise resolved with the new title text\n */\n ModalEventForm.prototype.reloadTitleContent = function() {\n if (this.reloadingTitle) {\n return this.titlePromise;\n }\n\n this.reloadingTitle = true;\n\n if (this.hasEventId()) {\n this.titlePromise = Str.get_string('editevent', 'calendar');\n } else {\n this.titlePromise = Str.get_string('newevent', 'calendar');\n }\n\n this.titlePromise.then(function(string) {\n this.setTitle(string);\n return string;\n }.bind(this))\n .always(function() {\n this.reloadingTitle = false;\n return;\n }.bind(this))\n .fail(Notification.exception);\n\n return this.titlePromise;\n };\n\n /**\n * Send a request to the server to get the event_form in a fragment\n * and render the result in the body of the modal.\n *\n * If serialised form data is provided then it will be sent in the\n * request to the server to have the form rendered with the data. This\n * is used when the form had a server side error and we need the server\n * to re-render it for us to display the error to the user.\n *\n * @method reloadBodyContent\n * @param {string} formData The serialised form data\n * @return {object} A promise resolved with the fragment html and js from\n */\n ModalEventForm.prototype.reloadBodyContent = function(formData) {\n if (this.reloadingBody) {\n return this.bodyPromise;\n }\n\n this.reloadingBody = true;\n this.disableButtons();\n\n var args = {};\n\n if (this.hasEventId()) {\n args.eventid = this.getEventId();\n }\n\n if (this.hasStartTime()) {\n args.starttime = this.getStartTime();\n }\n\n if (this.hasCourseId()) {\n args.courseid = this.getCourseId();\n }\n\n if (this.hasCategoryId()) {\n args.categoryid = this.getCategoryId();\n }\n\n if (typeof formData !== 'undefined') {\n args.formdata = formData;\n }\n\n this.bodyPromise = Fragment.loadFragment('calendar', 'event_form', this.getContextId(), args);\n\n this.setBody(this.bodyPromise);\n\n this.bodyPromise.then(function() {\n this.enableButtons();\n return;\n }.bind(this))\n .fail(Notification.exception)\n .always(function() {\n this.reloadingBody = false;\n return;\n }.bind(this))\n .fail(Notification.exception);\n\n return this.bodyPromise;\n };\n\n /**\n * Reload both the title and body content.\n *\n * @method reloadAllContent\n * @return {object} promise\n */\n ModalEventForm.prototype.reloadAllContent = function() {\n return $.when(this.reloadTitleContent(), this.reloadBodyContent());\n };\n\n /**\n * Kick off a reload the modal content before showing it. This\n * is to allow us to re-use the same modal for creating and\n * editing different events within the page.\n *\n * We do the reload when showing the modal rather than hiding it\n * to save a request to the server if the user closes the modal\n * and never re-opens it.\n *\n * @method show\n */\n ModalEventForm.prototype.show = function() {\n this.reloadAllContent();\n Modal.prototype.show.call(this);\n };\n\n /**\n * Clear the event id from the modal when it's closed so\n * that it is loaded fresh next time it's displayed.\n *\n * The event id will be set by the calling code if it wants\n * to edit a specific event.\n *\n * @method hide\n */\n ModalEventForm.prototype.hide = function() {\n Modal.prototype.hide.call(this);\n this.setEventId(null);\n this.setStartTime(null);\n this.setCourseId(null);\n this.setCategoryId(null);\n };\n\n /**\n * Get the serialised form data.\n *\n * @method getFormData\n * @return {string} serialised form data\n */\n ModalEventForm.prototype.getFormData = function() {\n return this.getForm().serialize();\n };\n\n /**\n * Send the form data to the server to create or update\n * an event.\n *\n * If there is a server side validation error then we re-request the\n * rendered form (with the data) from the server in order to get the\n * server side errors to display.\n *\n * On success the modal is hidden and the page is reloaded so that the\n * new event will display.\n *\n * @method save\n * @return {object} A promise\n */\n ModalEventForm.prototype.save = function() {\n var invalid,\n loadingContainer = this.saveButton.find(SELECTORS.LOADING_ICON_CONTAINER);\n\n // Now the change events have run, see if there are any \"invalid\" form fields.\n invalid = this.getForm().find('[aria-invalid=\"true\"]');\n\n // If we found invalid fields, focus on the first one and do not submit via ajax.\n if (invalid.length) {\n invalid.first().focus();\n return;\n }\n\n loadingContainer.removeClass('hidden');\n this.disableButtons();\n\n var formData = this.getFormData();\n // Send the form data to the server for processing.\n return Repository.submitCreateUpdateForm(formData)\n .then(function(response) {\n if (response.validationerror) {\n // If there was a server side validation error then\n // we need to re-request the rendered form from the server\n // in order to display the error for the user.\n this.reloadBodyContent(formData);\n return;\n } else {\n // Check whether this was a new event or not.\n // The hide function unsets the form data so grab this before the hide.\n var isExisting = this.hasEventId();\n\n // No problemo! Our work here is done.\n this.hide();\n\n // Trigger the appropriate calendar event so that the view can be updated.\n if (isExisting) {\n $('body').trigger(CalendarEvents.updated, [response.event]);\n } else {\n $('body').trigger(CalendarEvents.created, [response.event]);\n }\n }\n\n return;\n }.bind(this))\n .always(function() {\n // Regardless of success or error we should always stop\n // the loading icon and re-enable the buttons.\n loadingContainer.addClass('hidden');\n this.enableButtons();\n\n return;\n }.bind(this))\n .fail(Notification.exception);\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalEventForm.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n // When the user clicks the save button we trigger the form submission. We need to\n // trigger an actual submission because there is some JS code in the form that is\n // listening for this event and doing some stuff (e.g. saving draft areas etc).\n this.getModal().on(CustomEvents.events.activate, SELECTORS.SAVE_BUTTON, function(e, data) {\n this.getForm().submit();\n data.originalEvent.preventDefault();\n e.stopPropagation();\n }.bind(this));\n\n // Catch the submit event before it is actually processed by the browser and\n // prevent the submission. We'll take it from here.\n this.getModal().on('submit', function(e) {\n Event.notifyFormSubmitAjax(this.getForm()[0]);\n\n this.save();\n\n // Stop the form from actually submitting and prevent it's\n // propagation because we have already handled the event.\n e.preventDefault();\n e.stopPropagation();\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalEventForm.TYPE, ModalEventForm, 'calendar/modal_event_form');\n registered = true;\n }\n\n return ModalEventForm;\n});\n"],"names":["define","$","Event","Str","Notification","Templates","CustomEvents","Modal","ModalRegistry","Fragment","CalendarEvents","Repository","registered","SELECTORS","ModalEventForm","root","call","this","eventId","startTime","courseId","categoryId","contextId","reloadingBody","reloadingTitle","saveButton","getFooter","find","TYPE","prototype","Object","create","constructor","setContextId","id","getContextId","setCourseId","getCourseId","setCategoryId","getCategoryId","hasCourseId","hasCategoryId","setEventId","getEventId","hasEventId","setStartTime","time","getStartTime","hasStartTime","getForm","getBody","disableButtons","prop","enableButtons","reloadTitleContent","titlePromise","get_string","then","string","setTitle","bind","always","fail","exception","reloadBodyContent","formData","bodyPromise","args","eventid","starttime","courseid","categoryid","formdata","loadFragment","setBody","reloadAllContent","when","show","hide","getFormData","serialize","save","invalid","loadingContainer","length","removeClass","submitCreateUpdateForm","response","validationerror","isExisting","trigger","updated","event","created","addClass","first","focus","registerEventListeners","getModal","on","events","activate","e","data","submit","originalEvent","preventDefault","stopPropagation","notifyFormSubmitAjax","register"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"modal_event_form.min.js","sources":["../src/modal_event_form.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 * Contain the logic for the quick add or update event modal.\n *\n * @module core_calendar/modal_quick_add_event\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/event',\n 'core/str',\n 'core/notification',\n 'core/templates',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_registry',\n 'core/fragment',\n 'core_calendar/events',\n 'core_calendar/repository'\n ],\n function(\n $,\n Event,\n Str,\n Notification,\n Templates,\n CustomEvents,\n Modal,\n ModalRegistry,\n Fragment,\n CalendarEvents,\n Repository\n ) {\n\n var registered = false;\n var SELECTORS = {\n SAVE_BUTTON: '[data-action=\"save\"]',\n LOADING_ICON_CONTAINER: '[data-region=\"loading-icon-container\"]',\n };\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var ModalEventForm = function(root) {\n Modal.call(this, root);\n this.eventId = null;\n this.startTime = null;\n this.courseId = null;\n this.categoryId = null;\n this.contextId = null;\n this.reloadingBody = false;\n this.reloadingTitle = false;\n this.saveButton = this.getFooter().find(SELECTORS.SAVE_BUTTON);\n };\n\n ModalEventForm.TYPE = 'core_calendar-modal_event_form';\n ModalEventForm.prototype = Object.create(Modal.prototype);\n ModalEventForm.prototype.constructor = ModalEventForm;\n\n /**\n * Set the context id to the given value.\n *\n * @method setContextId\n * @param {Number} id The event id\n */\n ModalEventForm.prototype.setContextId = function(id) {\n this.contextId = id;\n };\n\n /**\n * Retrieve the current context id, if any.\n *\n * @method getContextId\n * @return {Number|null} The event id\n */\n ModalEventForm.prototype.getContextId = function() {\n return this.contextId;\n };\n\n /**\n * Set the course id to the given value.\n *\n * @method setCourseId\n * @param {int} id The event id\n */\n ModalEventForm.prototype.setCourseId = function(id) {\n this.courseId = id;\n };\n\n /**\n * Retrieve the current course id, if any.\n *\n * @method getCourseId\n * @return {int|null} The event id\n */\n ModalEventForm.prototype.getCourseId = function() {\n return this.courseId;\n };\n\n /**\n * Set the category id to the given value.\n *\n * @method setCategoryId\n * @param {int} id The event id\n */\n ModalEventForm.prototype.setCategoryId = function(id) {\n this.categoryId = id;\n };\n\n /**\n * Retrieve the current category id, if any.\n *\n * @method getCategoryId\n * @return {int|null} The event id\n */\n ModalEventForm.prototype.getCategoryId = function() {\n return this.categoryId;\n };\n\n /**\n * Check if the modal has an course id.\n *\n * @method hasCourseId\n * @return {bool}\n */\n ModalEventForm.prototype.hasCourseId = function() {\n return this.courseId !== null;\n };\n\n /**\n * Check if the modal has an category id.\n *\n * @method hasCategoryId\n * @return {bool}\n */\n ModalEventForm.prototype.hasCategoryId = function() {\n return this.categoryId !== null;\n };\n\n /**\n * Set the event id to the given value.\n *\n * @method setEventId\n * @param {int} id The event id\n */\n ModalEventForm.prototype.setEventId = function(id) {\n this.eventId = id;\n };\n\n /**\n * Retrieve the current event id, if any.\n *\n * @method getEventId\n * @return {int|null} The event id\n */\n ModalEventForm.prototype.getEventId = function() {\n return this.eventId;\n };\n\n /**\n * Check if the modal has an event id.\n *\n * @method hasEventId\n * @return {bool}\n */\n ModalEventForm.prototype.hasEventId = function() {\n return this.eventId !== null;\n };\n\n /**\n * Set the start time to the given value.\n *\n * @method setStartTime\n * @param {int} time The start time\n */\n ModalEventForm.prototype.setStartTime = function(time) {\n this.startTime = time;\n };\n\n /**\n * Retrieve the current start time, if any.\n *\n * @method getStartTime\n * @return {int|null} The start time\n */\n ModalEventForm.prototype.getStartTime = function() {\n return this.startTime;\n };\n\n /**\n * Check if the modal has start time.\n *\n * @method hasStartTime\n * @return {bool}\n */\n ModalEventForm.prototype.hasStartTime = function() {\n return this.startTime !== null;\n };\n\n /**\n * Get the form element from the modal.\n *\n * @method getForm\n * @return {object}\n */\n ModalEventForm.prototype.getForm = function() {\n return this.getBody().find('form');\n };\n\n /**\n * Disable the buttons in the footer.\n *\n * @method disableButtons\n */\n ModalEventForm.prototype.disableButtons = function() {\n this.saveButton.prop('disabled', true);\n };\n\n /**\n * Enable the buttons in the footer.\n *\n * @method enableButtons\n */\n ModalEventForm.prototype.enableButtons = function() {\n this.saveButton.prop('disabled', false);\n };\n\n /**\n * Reload the title for the modal to the appropriate value\n * depending on whether we are creating a new event or\n * editing an existing event.\n *\n * @method reloadTitleContent\n * @return {object} A promise resolved with the new title text\n */\n ModalEventForm.prototype.reloadTitleContent = function() {\n if (this.reloadingTitle) {\n return this.titlePromise;\n }\n\n this.reloadingTitle = true;\n\n if (this.hasEventId()) {\n this.titlePromise = Str.get_string('editevent', 'calendar');\n } else {\n this.titlePromise = Str.get_string('newevent', 'calendar');\n }\n\n this.titlePromise.then(function(string) {\n this.setTitle(string);\n return string;\n }.bind(this))\n .always(function() {\n this.reloadingTitle = false;\n return;\n }.bind(this))\n .fail(Notification.exception);\n\n return this.titlePromise;\n };\n\n /**\n * Send a request to the server to get the event_form in a fragment\n * and render the result in the body of the modal.\n *\n * If serialised form data is provided then it will be sent in the\n * request to the server to have the form rendered with the data. This\n * is used when the form had a server side error and we need the server\n * to re-render it for us to display the error to the user.\n *\n * @method reloadBodyContent\n * @param {string} formData The serialised form data\n * @return {object} A promise resolved with the fragment html and js from\n */\n ModalEventForm.prototype.reloadBodyContent = function(formData) {\n if (this.reloadingBody) {\n return this.bodyPromise;\n }\n\n this.reloadingBody = true;\n this.disableButtons();\n\n var args = {};\n\n if (this.hasEventId()) {\n args.eventid = this.getEventId();\n }\n\n if (this.hasStartTime()) {\n args.starttime = this.getStartTime();\n }\n\n if (this.hasCourseId()) {\n args.courseid = this.getCourseId();\n }\n\n if (this.hasCategoryId()) {\n args.categoryid = this.getCategoryId();\n }\n\n if (typeof formData !== 'undefined') {\n args.formdata = formData;\n }\n\n this.bodyPromise = Fragment.loadFragment('calendar', 'event_form', this.getContextId(), args);\n\n this.setBody(this.bodyPromise);\n\n this.bodyPromise.then(function() {\n this.enableButtons();\n return;\n }.bind(this))\n .fail(Notification.exception)\n .always(function() {\n this.reloadingBody = false;\n return;\n }.bind(this))\n .fail(Notification.exception);\n\n return this.bodyPromise;\n };\n\n /**\n * Reload both the title and body content.\n *\n * @method reloadAllContent\n * @return {object} promise\n */\n ModalEventForm.prototype.reloadAllContent = function() {\n return $.when(this.reloadTitleContent(), this.reloadBodyContent());\n };\n\n /**\n * Kick off a reload the modal content before showing it. This\n * is to allow us to re-use the same modal for creating and\n * editing different events within the page.\n *\n * We do the reload when showing the modal rather than hiding it\n * to save a request to the server if the user closes the modal\n * and never re-opens it.\n *\n * @method show\n */\n ModalEventForm.prototype.show = function() {\n this.reloadAllContent();\n Modal.prototype.show.call(this);\n };\n\n /**\n * Clear the event id from the modal when it's closed so\n * that it is loaded fresh next time it's displayed.\n *\n * The event id will be set by the calling code if it wants\n * to edit a specific event.\n *\n * @method hide\n */\n ModalEventForm.prototype.hide = function() {\n Modal.prototype.hide.call(this);\n this.setEventId(null);\n this.setStartTime(null);\n this.setCourseId(null);\n this.setCategoryId(null);\n };\n\n /**\n * Get the serialised form data.\n *\n * @method getFormData\n * @return {string} serialised form data\n */\n ModalEventForm.prototype.getFormData = function() {\n return this.getForm().serialize();\n };\n\n /**\n * Send the form data to the server to create or update\n * an event.\n *\n * If there is a server side validation error then we re-request the\n * rendered form (with the data) from the server in order to get the\n * server side errors to display.\n *\n * On success the modal is hidden and the page is reloaded so that the\n * new event will display.\n *\n * @method save\n * @return {object} A promise\n */\n ModalEventForm.prototype.save = function() {\n var invalid,\n loadingContainer = this.saveButton.find(SELECTORS.LOADING_ICON_CONTAINER);\n\n // Now the change events have run, see if there are any \"invalid\" form fields.\n invalid = this.getForm().find('[aria-invalid=\"true\"]');\n\n // If we found invalid fields, focus on the first one and do not submit via ajax.\n if (invalid.length) {\n invalid.first().focus();\n return;\n }\n\n loadingContainer.removeClass('hidden');\n this.disableButtons();\n\n var formData = this.getFormData();\n // Send the form data to the server for processing.\n return Repository.submitCreateUpdateForm(formData)\n .then(function(response) {\n if (response.validationerror) {\n // If there was a server side validation error then\n // we need to re-request the rendered form from the server\n // in order to display the error for the user.\n this.reloadBodyContent(formData);\n return;\n } else {\n // Check whether this was a new event or not.\n // The hide function unsets the form data so grab this before the hide.\n var isExisting = this.hasEventId();\n\n // No problemo! Our work here is done.\n this.hide();\n\n // Trigger the appropriate calendar event so that the view can be updated.\n if (isExisting) {\n $('body').trigger(CalendarEvents.updated, [response.event]);\n } else {\n $('body').trigger(CalendarEvents.created, [response.event]);\n }\n }\n\n return;\n }.bind(this))\n .always(function() {\n // Regardless of success or error we should always stop\n // the loading icon and re-enable the buttons.\n loadingContainer.addClass('hidden');\n this.enableButtons();\n\n return;\n }.bind(this))\n .fail(Notification.exception);\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalEventForm.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n // When the user clicks the save button we trigger the form submission. We need to\n // trigger an actual submission because there is some JS code in the form that is\n // listening for this event and doing some stuff (e.g. saving draft areas etc).\n this.getModal().on(CustomEvents.events.activate, SELECTORS.SAVE_BUTTON, function(e, data) {\n this.getForm().submit();\n data.originalEvent.preventDefault();\n e.stopPropagation();\n }.bind(this));\n\n // Catch the submit event before it is actually processed by the browser and\n // prevent the submission. We'll take it from here.\n this.getModal().on('submit', function(e) {\n Event.notifyFormSubmitAjax(this.getForm()[0]);\n\n this.save();\n\n // Stop the form from actually submitting and prevent it's\n // propagation because we have already handled the event.\n e.preventDefault();\n e.stopPropagation();\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalEventForm.TYPE, ModalEventForm, 'calendar/modal_event_form');\n registered = true;\n }\n\n return ModalEventForm;\n});\n"],"names":["define","$","Event","Str","Notification","Templates","CustomEvents","Modal","ModalRegistry","Fragment","CalendarEvents","Repository","registered","SELECTORS","ModalEventForm","root","call","this","eventId","startTime","courseId","categoryId","contextId","reloadingBody","reloadingTitle","saveButton","getFooter","find","TYPE","prototype","Object","create","constructor","setContextId","id","getContextId","setCourseId","getCourseId","setCategoryId","getCategoryId","hasCourseId","hasCategoryId","setEventId","getEventId","hasEventId","setStartTime","time","getStartTime","hasStartTime","getForm","getBody","disableButtons","prop","enableButtons","reloadTitleContent","titlePromise","get_string","then","string","setTitle","bind","always","fail","exception","reloadBodyContent","formData","bodyPromise","args","eventid","starttime","courseid","categoryid","formdata","loadFragment","setBody","reloadAllContent","when","show","hide","getFormData","serialize","save","invalid","loadingContainer","length","removeClass","submitCreateUpdateForm","response","validationerror","isExisting","trigger","updated","event","created","addClass","first","focus","registerEventListeners","getModal","on","events","activate","e","data","submit","originalEvent","preventDefault","stopPropagation","notifyFormSubmitAjax","register"],"mappings":"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"} \ No newline at end of file diff --git a/calendar/amd/build/month_navigation_drag_drop.min.js.map b/calendar/amd/build/month_navigation_drag_drop.min.js.map index d10b3363d11..1b8d4d1321a 100644 --- a/calendar/amd/build/month_navigation_drag_drop.min.js.map +++ b/calendar/amd/build/month_navigation_drag_drop.min.js.map @@ -1 +1 @@ -{"version":3,"file":"month_navigation_drag_drop.min.js","sources":["../src/month_navigation_drag_drop.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 javascript module to handle calendar drag and drop in the calendar\n * month view navigation.\n *\n * This code is run each time the calendar month view is re-rendered. We\n * only register the event handlers once per page load so that the in place\n * DOM updates that happen on month change don't continue to register handlers.\n *\n * @module core_calendar/month_navigation_drag_drop\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core_calendar/drag_drop_data_store',\n ],\n function(\n $,\n DataStore\n ) {\n\n var SELECTORS = {\n DRAGGABLE: '[draggable=\"true\"][data-region=\"event-item\"]',\n DROP_ZONE: '[data-drop-zone=\"nav-link\"]',\n };\n var HOVER_CLASS = 'bg-primary text-white';\n var TARGET_CLASS = 'drop-target';\n var HOVER_TIME = 1000; // 1 second hover to change month.\n\n // We store some static variables at the module level because this\n // module is called each time the calendar month view is reloaded but\n // we want some actions to only occur ones.\n\n /* @var {bool} registered If the event listeners have been added */\n var registered = false;\n /* @var {int} hoverTimer The timeout id of any timeout waiting for hover */\n var hoverTimer = null;\n /* @var {object} root The root nav element we're operating on */\n var root = null;\n\n /**\n * Add or remove the appropriate styling to indicate whether\n * the drop target is being hovered over.\n *\n * @param {object} target The target drop zone element\n * @param {bool} hovered If the element is hovered over ot not\n */\n var updateHoverState = function(target, hovered) {\n if (hovered) {\n target.addClass(HOVER_CLASS);\n } else {\n target.removeClass(HOVER_CLASS);\n }\n };\n\n /**\n * Add some styling to the UI to indicate that the nav links\n * are an acceptable drop target.\n */\n var addDropZoneIndicator = function() {\n root.find(SELECTORS.DROP_ZONE).addClass(TARGET_CLASS);\n };\n\n /**\n * Remove the styling from the nav links.\n */\n var removeDropZoneIndicator = function() {\n root.find(SELECTORS.DROP_ZONE).removeClass(TARGET_CLASS);\n };\n\n /**\n * Get the drop zone target from the event, if one is found.\n *\n * @param {event} e Javascript event\n * @return {object|null}\n */\n var getTargetFromEvent = function(e) {\n var target = $(e.target).closest(SELECTORS.DROP_ZONE);\n return (target.length) ? target : null;\n };\n\n /**\n * This will add a visual indicator to the calendar UI to\n * indicate which nav link is a valid drop zone.\n *\n * @param {Event} e\n */\n var dragstartHandler = function(e) {\n // Make sure the drag event is for a calendar event.\n var eventElement = $(e.target).closest(SELECTORS.DRAGGABLE);\n\n if (eventElement.length) {\n addDropZoneIndicator();\n }\n };\n\n /**\n * Update the hover state of the target nav element when\n * the user is dragging an event over it.\n *\n * This will add a visual indicator to the calendar UI to\n * indicate which nav link is being hovered.\n *\n * @param {event} e The dragover event\n */\n var dragoverHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n e.preventDefault();\n var target = getTargetFromEvent(e);\n\n if (!target) {\n return;\n }\n\n // If we're not draggin a calendar event then\n // ignore it.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n if (!hoverTimer) {\n hoverTimer = setTimeout(function() {\n target.click();\n hoverTimer = null;\n }, HOVER_TIME);\n }\n\n updateHoverState(target, true);\n removeDropZoneIndicator();\n };\n\n /**\n * Update the hover state of the target nav element that was\n * previously dragged over but has is no longer a drag target.\n *\n * This will remove the visual indicator from the calendar UI\n * that was added by the dragoverHandler.\n *\n * @param {event} e The dragstart event\n */\n var dragleaveHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n var target = getTargetFromEvent(e);\n\n if (!target) {\n return;\n }\n\n if (hoverTimer) {\n clearTimeout(hoverTimer);\n hoverTimer = null;\n }\n\n updateHoverState(target, false);\n addDropZoneIndicator();\n e.preventDefault();\n };\n\n /**\n * Remove the visual indicator from the calendar UI that was\n * added by the dragoverHandler.\n *\n * @param {event} e The drop event\n */\n var dropHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n removeDropZoneIndicator();\n var target = getTargetFromEvent(e);\n\n if (!target) {\n return;\n }\n\n updateHoverState(target, false);\n e.preventDefault();\n };\n\n return {\n /**\n * Initialise the event handlers for the drag events.\n *\n * @param {object} rootElement The element containing calendar nav links\n */\n init: function(rootElement) {\n // Only register the handlers once on the first load.\n if (!registered) {\n // These handlers are only added the first time the module\n // is loaded because we don't want to have a new listener\n // added each time the \"init\" function is called otherwise we'll\n // end up with lots of stale handlers.\n document.addEventListener('dragstart', dragstartHandler, false);\n document.addEventListener('dragover', dragoverHandler, false);\n document.addEventListener('dragleave', dragleaveHandler, false);\n document.addEventListener('drop', dropHandler, false);\n document.addEventListener('dragend', removeDropZoneIndicator, false);\n registered = true;\n }\n\n // Update the module variable to operate on the given\n // root element.\n root = $(rootElement);\n\n // If we're currently dragging then add the indicators.\n if (DataStore.hasEventId()) {\n addDropZoneIndicator();\n }\n },\n };\n});\n"],"names":["define","$","DataStore","SELECTORS","registered","hoverTimer","root","updateHoverState","target","hovered","addClass","removeClass","addDropZoneIndicator","find","removeDropZoneIndicator","getTargetFromEvent","e","closest","length","dragstartHandler","dragoverHandler","hasEventId","preventDefault","setTimeout","click","dragleaveHandler","clearTimeout","dropHandler","init","rootElement","document","addEventListener"],"mappings":";;;;;;;;;;;;AA2BAA,kDAAO,CACK,SACA,uCAEJ,SACIC,EACAC,eAGJC,oBACW,+CADXA,oBAEW,8BAWXC,YAAa,EAEbC,WAAa,KAEbC,KAAO,KASPC,iBAAmB,SAASC,OAAQC,SAChCA,QACAD,OAAOE,SAxBG,yBA0BVF,OAAOG,YA1BG,0BAkCdC,qBAAuB,WACvBN,KAAKO,KAAKV,qBAAqBO,SAlChB,gBAwCfI,wBAA0B,WAC1BR,KAAKO,KAAKV,qBAAqBQ,YAzChB,gBAkDfI,mBAAqB,SAASC,OAC1BR,OAASP,EAAEe,EAAER,QAAQS,QAAQd,4BACzBK,OAAOU,OAAUV,OAAS,MASlCW,iBAAmB,SAASH,GAETf,EAAEe,EAAER,QAAQS,QAAQd,qBAEtBe,QACbN,wBAaJQ,gBAAkB,SAASJ,MAEtBd,UAAUmB,cAIfL,EAAEM,qBACEd,OAASO,mBAAmBC,GAE3BR,QAMAN,UAAUmB,eAIVhB,aACDA,WAAakB,YAAW,WACpBf,OAAOgB,QACPnB,WAAa,OApGR,MAwGbE,iBAAiBC,QAAQ,GACzBM,6BAYAW,iBAAmB,SAAST,MAEvBd,UAAUmB,kBAIXb,OAASO,mBAAmBC,GAE3BR,SAIDH,aACAqB,aAAarB,YACbA,WAAa,MAGjBE,iBAAiBC,QAAQ,GACzBI,uBACAI,EAAEM,oBASFK,YAAc,SAASX,MAElBd,UAAUmB,cAIfP,8BACIN,OAASO,mBAAmBC,GAE3BR,SAILD,iBAAiBC,QAAQ,GACzBQ,EAAEM,0BAGC,CAMHM,KAAM,SAASC,aAENzB,aAKD0B,SAASC,iBAAiB,YAAaZ,kBAAkB,GACzDW,SAASC,iBAAiB,WAAYX,iBAAiB,GACvDU,SAASC,iBAAiB,YAAaN,kBAAkB,GACzDK,SAASC,iBAAiB,OAAQJ,aAAa,GAC/CG,SAASC,iBAAiB,UAAWjB,yBAAyB,GAC9DV,YAAa,GAKjBE,KAAOL,EAAE4B,aAGL3B,UAAUmB,cACVT"} \ No newline at end of file +{"version":3,"file":"month_navigation_drag_drop.min.js","sources":["../src/month_navigation_drag_drop.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 javascript module to handle calendar drag and drop in the calendar\n * month view navigation.\n *\n * This code is run each time the calendar month view is re-rendered. We\n * only register the event handlers once per page load so that the in place\n * DOM updates that happen on month change don't continue to register handlers.\n *\n * @module core_calendar/month_navigation_drag_drop\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core_calendar/drag_drop_data_store',\n ],\n function(\n $,\n DataStore\n ) {\n\n var SELECTORS = {\n DRAGGABLE: '[draggable=\"true\"][data-region=\"event-item\"]',\n DROP_ZONE: '[data-drop-zone=\"nav-link\"]',\n };\n var HOVER_CLASS = 'bg-primary text-white';\n var TARGET_CLASS = 'drop-target';\n var HOVER_TIME = 1000; // 1 second hover to change month.\n\n // We store some static variables at the module level because this\n // module is called each time the calendar month view is reloaded but\n // we want some actions to only occur ones.\n\n /* @var {bool} registered If the event listeners have been added */\n var registered = false;\n /* @var {int} hoverTimer The timeout id of any timeout waiting for hover */\n var hoverTimer = null;\n /* @var {object} root The root nav element we're operating on */\n var root = null;\n\n /**\n * Add or remove the appropriate styling to indicate whether\n * the drop target is being hovered over.\n *\n * @param {object} target The target drop zone element\n * @param {bool} hovered If the element is hovered over ot not\n */\n var updateHoverState = function(target, hovered) {\n if (hovered) {\n target.addClass(HOVER_CLASS);\n } else {\n target.removeClass(HOVER_CLASS);\n }\n };\n\n /**\n * Add some styling to the UI to indicate that the nav links\n * are an acceptable drop target.\n */\n var addDropZoneIndicator = function() {\n root.find(SELECTORS.DROP_ZONE).addClass(TARGET_CLASS);\n };\n\n /**\n * Remove the styling from the nav links.\n */\n var removeDropZoneIndicator = function() {\n root.find(SELECTORS.DROP_ZONE).removeClass(TARGET_CLASS);\n };\n\n /**\n * Get the drop zone target from the event, if one is found.\n *\n * @param {event} e Javascript event\n * @return {object|null}\n */\n var getTargetFromEvent = function(e) {\n var target = $(e.target).closest(SELECTORS.DROP_ZONE);\n return (target.length) ? target : null;\n };\n\n /**\n * This will add a visual indicator to the calendar UI to\n * indicate which nav link is a valid drop zone.\n *\n * @param {Event} e\n */\n var dragstartHandler = function(e) {\n // Make sure the drag event is for a calendar event.\n var eventElement = $(e.target).closest(SELECTORS.DRAGGABLE);\n\n if (eventElement.length) {\n addDropZoneIndicator();\n }\n };\n\n /**\n * Update the hover state of the target nav element when\n * the user is dragging an event over it.\n *\n * This will add a visual indicator to the calendar UI to\n * indicate which nav link is being hovered.\n *\n * @param {event} e The dragover event\n */\n var dragoverHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n e.preventDefault();\n var target = getTargetFromEvent(e);\n\n if (!target) {\n return;\n }\n\n // If we're not draggin a calendar event then\n // ignore it.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n if (!hoverTimer) {\n hoverTimer = setTimeout(function() {\n target.click();\n hoverTimer = null;\n }, HOVER_TIME);\n }\n\n updateHoverState(target, true);\n removeDropZoneIndicator();\n };\n\n /**\n * Update the hover state of the target nav element that was\n * previously dragged over but has is no longer a drag target.\n *\n * This will remove the visual indicator from the calendar UI\n * that was added by the dragoverHandler.\n *\n * @param {event} e The dragstart event\n */\n var dragleaveHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n var target = getTargetFromEvent(e);\n\n if (!target) {\n return;\n }\n\n if (hoverTimer) {\n clearTimeout(hoverTimer);\n hoverTimer = null;\n }\n\n updateHoverState(target, false);\n addDropZoneIndicator();\n e.preventDefault();\n };\n\n /**\n * Remove the visual indicator from the calendar UI that was\n * added by the dragoverHandler.\n *\n * @param {event} e The drop event\n */\n var dropHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n removeDropZoneIndicator();\n var target = getTargetFromEvent(e);\n\n if (!target) {\n return;\n }\n\n updateHoverState(target, false);\n e.preventDefault();\n };\n\n return {\n /**\n * Initialise the event handlers for the drag events.\n *\n * @param {object} rootElement The element containing calendar nav links\n */\n init: function(rootElement) {\n // Only register the handlers once on the first load.\n if (!registered) {\n // These handlers are only added the first time the module\n // is loaded because we don't want to have a new listener\n // added each time the \"init\" function is called otherwise we'll\n // end up with lots of stale handlers.\n document.addEventListener('dragstart', dragstartHandler, false);\n document.addEventListener('dragover', dragoverHandler, false);\n document.addEventListener('dragleave', dragleaveHandler, false);\n document.addEventListener('drop', dropHandler, false);\n document.addEventListener('dragend', removeDropZoneIndicator, false);\n registered = true;\n }\n\n // Update the module variable to operate on the given\n // root element.\n root = $(rootElement);\n\n // If we're currently dragging then add the indicators.\n if (DataStore.hasEventId()) {\n addDropZoneIndicator();\n }\n },\n };\n});\n"],"names":["define","$","DataStore","SELECTORS","registered","hoverTimer","root","updateHoverState","target","hovered","addClass","removeClass","addDropZoneIndicator","find","removeDropZoneIndicator","getTargetFromEvent","e","closest","length","dragstartHandler","dragoverHandler","hasEventId","preventDefault","setTimeout","click","dragleaveHandler","clearTimeout","dropHandler","init","rootElement","document","addEventListener"],"mappings":";;;;;;;;;;;;AA2BAA,OAAM,2CAAC,CACK,SACA,uCAEJ,SACIC,EACAC,WAGR,IAAIC,oBACW,+CADXA,oBAEW,8BAWXC,YAAa,EAEbC,WAAa,KAEbC,KAAO,KASPC,iBAAmB,SAASC,OAAQC,SAChCA,QACAD,OAAOE,SAxBG,yBA0BVF,OAAOG,YA1BG,wBA4BjB,EAMGC,qBAAuB,WACvBN,KAAKO,KAAKV,qBAAqBO,SAlChB,cAmClB,EAKGI,wBAA0B,WAC1BR,KAAKO,KAAKV,qBAAqBQ,YAzChB,cA0ClB,EAQGI,mBAAqB,SAASC,GAC9B,IAAIR,OAASP,EAAEe,EAAER,QAAQS,QAAQd,qBACjC,OAAQK,OAAOU,OAAUV,OAAS,IACrC,EAQGW,iBAAmB,SAASH,GAETf,EAAEe,EAAER,QAAQS,QAAQd,qBAEtBe,QACbN,sBAEP,EAWGQ,gBAAkB,SAASJ,GAE3B,GAAKd,UAAUmB,aAAf,CAIAL,EAAEM,iBACF,IAAId,OAASO,mBAAmBC,GAE3BR,QAMAN,UAAUmB,eAIVhB,aACDA,WAAakB,YAAW,WACpBf,OAAOgB,QACPnB,WAAa,IAFM,GAlGd,MAwGbE,iBAAiBC,QAAQ,GACzBM,0BAvBC,CAwBJ,EAWGW,iBAAmB,SAAST,GAE5B,GAAKd,UAAUmB,aAAf,CAIA,IAAIb,OAASO,mBAAmBC,GAE3BR,SAIDH,aACAqB,aAAarB,YACbA,WAAa,MAGjBE,iBAAiBC,QAAQ,GACzBI,uBACAI,EAAEM,iBAfD,CAgBJ,EAQGK,YAAc,SAASX,GAEvB,GAAKd,UAAUmB,aAAf,CAIAP,0BACA,IAAIN,OAASO,mBAAmBC,GAE3BR,SAILD,iBAAiBC,QAAQ,GACzBQ,EAAEM,iBAVD,CAWJ,EAEM,MAAA,CAMHM,KAAM,SAASC,aAENzB,aAKD0B,SAASC,iBAAiB,YAAaZ,kBAAkB,GACzDW,SAASC,iBAAiB,WAAYX,iBAAiB,GACvDU,SAASC,iBAAiB,YAAaN,kBAAkB,GACzDK,SAASC,iBAAiB,OAAQJ,aAAa,GAC/CG,SAASC,iBAAiB,UAAWjB,yBAAyB,GAC9DV,YAAa,GAKjBE,KAAOL,EAAE4B,aAGL3B,UAAUmB,cACVT,sBAEP,EAER"} \ No newline at end of file diff --git a/calendar/amd/build/month_view_drag_drop.min.js.map b/calendar/amd/build/month_view_drag_drop.min.js.map index b13e7b6e7c8..e6ad1e9aa21 100644 --- a/calendar/amd/build/month_view_drag_drop.min.js.map +++ b/calendar/amd/build/month_view_drag_drop.min.js.map @@ -1 +1 @@ -{"version":3,"file":"month_view_drag_drop.min.js","sources":["../src/month_view_drag_drop.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 javascript module to handle calendar drag and drop in the calendar\n * month view.\n *\n * @module core_calendar/month_view_drag_drop\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/notification',\n 'core/str',\n 'core_calendar/events',\n 'core_calendar/drag_drop_data_store'\n ],\n function(\n $,\n Notification,\n Str,\n CalendarEvents,\n DataStore\n ) {\n\n var SELECTORS = {\n ROOT: \"[data-region='calendar']\",\n DRAGGABLE: '[draggable=\"true\"][data-region=\"event-item\"]',\n DROP_ZONE: '[data-drop-zone=\"month-view-day\"]',\n WEEK: '[data-region=\"month-view-week\"]',\n };\n var INVALID_DROP_ZONE_CLASS = 'bg-faded';\n var INVALID_HOVER_CLASS = 'bg-danger text-white';\n var VALID_HOVER_CLASS = 'bg-primary text-white';\n var ALL_CLASSES = INVALID_DROP_ZONE_CLASS + ' ' + INVALID_HOVER_CLASS + ' ' + VALID_HOVER_CLASS;\n /* @var {bool} registered If the event listeners have been added */\n var registered = false;\n\n /**\n * Get the correct drop zone element from the given javascript\n * event.\n *\n * @param {event} e The javascript event\n * @return {object|null}\n */\n var getDropZoneFromEvent = function(e) {\n var dropZone = $(e.target).closest(SELECTORS.DROP_ZONE);\n return (dropZone.length) ? dropZone : null;\n };\n\n /**\n * Determine if the given dropzone element is within the acceptable\n * time range.\n *\n * The drop zone timestamp is midnight on that day so we should check\n * that the event's acceptable timestart value\n *\n * @param {object} dropZone The drop zone day from the calendar\n * @return {bool}\n */\n var isValidDropZone = function(dropZone) {\n var dropTimestamp = dropZone.attr('data-day-timestamp');\n var minTimestart = DataStore.getMinTimestart();\n var maxTimestart = DataStore.getMaxTimestart();\n\n if (minTimestart && minTimestart > dropTimestamp) {\n return false;\n }\n\n if (maxTimestart && maxTimestart < dropTimestamp) {\n return false;\n }\n\n return true;\n };\n\n /**\n * Get the error string to display for a given drop zone element\n * if it is invalid.\n *\n * @param {object} dropZone The drop zone day from the calendar\n * @return {string}\n */\n var getDropZoneError = function(dropZone) {\n var dropTimestamp = dropZone.attr('data-day-timestamp');\n var minTimestart = DataStore.getMinTimestart();\n var maxTimestart = DataStore.getMaxTimestart();\n\n if (minTimestart && minTimestart > dropTimestamp) {\n return DataStore.getMinError();\n }\n\n if (maxTimestart && maxTimestart < dropTimestamp) {\n return DataStore.getMaxError();\n }\n\n return null;\n };\n\n /**\n * Remove all of the styling from each of the drop zones in the calendar.\n */\n var clearAllDropZonesState = function() {\n $(SELECTORS.ROOT).find(SELECTORS.DROP_ZONE).each(function(index, dropZone) {\n dropZone = $(dropZone);\n dropZone.removeClass(ALL_CLASSES);\n });\n };\n\n /**\n * Update the hover state for the event in the calendar to reflect\n * which days the event will be moved to.\n *\n * If the drop zone is not being hovered then it will apply some\n * styling to reflect whether the drop zone is a valid or invalid\n * drop place for the current dragging event.\n *\n * This funciton supports events spanning multiple days and will\n * recurse to highlight (or remove highlight) each of the days\n * that the event will be moved to.\n *\n * For example: An event with a duration of 3 days will have\n * 3 days highlighted when it's dragged elsewhere in the calendar.\n * The current drag target and the 2 days following it (including\n * wrapping to the next week if necessary).\n *\n * @param {string|object} dropZone The drag target element\n * @param {bool} hovered If the target is hovered or not\n * @param {Number} count How many days to highlight (default to duration)\n */\n var updateHoverState = function(dropZone, hovered, count) {\n if (typeof count === 'undefined') {\n // This is how many days we need to highlight.\n count = DataStore.getDurationDays();\n }\n\n var valid = isValidDropZone(dropZone);\n dropZone.removeClass(ALL_CLASSES);\n\n if (hovered) {\n\n if (valid) {\n dropZone.addClass(VALID_HOVER_CLASS);\n } else {\n dropZone.addClass(INVALID_HOVER_CLASS);\n }\n } else {\n dropZone.removeClass(VALID_HOVER_CLASS + ' ' + INVALID_HOVER_CLASS);\n\n if (!valid) {\n dropZone.addClass(INVALID_DROP_ZONE_CLASS);\n }\n }\n\n count--;\n\n // If we've still got days to highlight then we should\n // find the next day.\n if (count > 0) {\n var nextDropZone = dropZone.next();\n\n // If there are no more days in this week then we\n // need to move down to the next week in the calendar.\n if (!nextDropZone.length) {\n var nextWeek = dropZone.closest(SELECTORS.WEEK).next();\n\n if (nextWeek.length) {\n nextDropZone = nextWeek.children(SELECTORS.DROP_ZONE).first();\n }\n }\n\n // If we found another day then let's recursively\n // update it's hover state.\n if (nextDropZone.length) {\n updateHoverState(nextDropZone, hovered, count);\n }\n }\n };\n\n /**\n * Find all of the calendar event drop zones in the calendar and update the display\n * for the user to indicate which zones are valid and invalid.\n */\n var updateAllDropZonesState = function() {\n $(SELECTORS.ROOT).find(SELECTORS.DROP_ZONE).each(function(index, dropZone) {\n dropZone = $(dropZone);\n\n if (!isValidDropZone(dropZone)) {\n updateHoverState(dropZone, false);\n }\n });\n };\n\n\n /**\n * Set up the module level variables to track which event is being\n * dragged and how many days it spans.\n *\n * @param {event} e The dragstart event\n */\n var dragstartHandler = function(e) {\n var target = $(e.target);\n var draggableElement = target.closest(SELECTORS.DRAGGABLE);\n\n if (!draggableElement.length) {\n return;\n }\n\n var eventElement = draggableElement.find('[data-event-id]');\n var eventId = eventElement.attr('data-event-id');\n var minTimestart = draggableElement.attr('data-min-day-timestamp');\n var maxTimestart = draggableElement.attr('data-max-day-timestamp');\n var minError = draggableElement.attr('data-min-day-error');\n var maxError = draggableElement.attr('data-max-day-error');\n var eventsSelector = SELECTORS.ROOT + ' [data-event-id=\"' + eventId + '\"]';\n var duration = $(eventsSelector).length;\n\n DataStore.setEventId(eventId);\n DataStore.setDurationDays(duration);\n\n if (minTimestart) {\n DataStore.setMinTimestart(minTimestart);\n }\n\n if (maxTimestart) {\n DataStore.setMaxTimestart(maxTimestart);\n }\n\n if (minError) {\n DataStore.setMinError(minError);\n }\n\n if (maxError) {\n DataStore.setMaxError(maxError);\n }\n\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.dropEffect = \"move\";\n // Firefox requires a value to be set here or the drag won't\n // work and the dragover handler won't fire.\n e.dataTransfer.setData('text/plain', eventId);\n e.dropEffect = \"move\";\n\n updateAllDropZonesState();\n };\n\n /**\n * Update the hover state of the target day element when\n * the user is dragging an event over it.\n *\n * This will add a visual indicator to the calendar UI to\n * indicate which day(s) the event will be moved to.\n *\n * @param {event} e The dragstart event\n */\n var dragoverHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n e.preventDefault();\n\n var dropZone = getDropZoneFromEvent(e);\n\n if (!dropZone) {\n return;\n }\n\n updateHoverState(dropZone, true);\n };\n\n /**\n * Update the hover state of the target day element that was\n * previously dragged over but has is no longer a drag target.\n *\n * This will remove the visual indicator from the calendar UI\n * that was added by the dragoverHandler.\n *\n * @param {event} e The dragstart event\n */\n var dragleaveHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n var dropZone = getDropZoneFromEvent(e);\n\n if (!dropZone) {\n return;\n }\n\n updateHoverState(dropZone, false);\n e.preventDefault();\n };\n\n /**\n * Determines the event element, origin day, and destination day\n * once the user drops the calendar event. These three bits of data\n * are provided as the payload to the \"moveEvent\" calendar javascript\n * event that is fired.\n *\n * This will remove the visual indicator from the calendar UI\n * that was added by the dragoverHandler.\n *\n * @param {event} e The dragstart event\n */\n var dropHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n var dropZone = getDropZoneFromEvent(e);\n\n if (!dropZone) {\n DataStore.clearAll();\n clearAllDropZonesState();\n return;\n }\n\n if (isValidDropZone(dropZone)) {\n var eventId = DataStore.getEventId();\n var eventElementSelector = SELECTORS.ROOT + ' [data-event-id=\"' + eventId + '\"]';\n var eventElement = $(eventElementSelector);\n var origin = null;\n\n if (eventElement.length) {\n origin = eventElement.closest(SELECTORS.DROP_ZONE);\n }\n\n $('body').trigger(CalendarEvents.moveEvent, [eventId, origin, dropZone]);\n } else {\n // If the drop zone is not valid then there is not need for us to\n // try to process it. Instead we can just show an error to the user.\n var message = getDropZoneError(dropZone);\n Str.get_string('errorinvaliddate', 'calendar').then(function(string) {\n Notification.exception({\n name: string,\n message: message || string\n });\n });\n }\n\n DataStore.clearAll();\n clearAllDropZonesState();\n\n e.preventDefault();\n };\n\n /**\n * Clear the data store and remove the drag indicators from the UI\n * when the drag event has finished.\n */\n var dragendHandler = function() {\n DataStore.clearAll();\n clearAllDropZonesState();\n };\n\n /**\n * Re-render the drop zones in the new month to highlight\n * which areas are or aren't acceptable to drop the calendar\n * event.\n */\n var calendarMonthChangedHandler = function() {\n updateAllDropZonesState();\n };\n\n return {\n /**\n * Initialise the event handlers for the drag events.\n */\n init: function() {\n if (!registered) {\n // These handlers are only added the first time the module\n // is loaded because we don't want to have a new listener\n // added each time the \"init\" function is called otherwise we'll\n // end up with lots of stale handlers.\n document.addEventListener('dragstart', dragstartHandler, false);\n document.addEventListener('dragover', dragoverHandler, false);\n document.addEventListener('dragleave', dragleaveHandler, false);\n document.addEventListener('drop', dropHandler, false);\n document.addEventListener('dragend', dragendHandler, false);\n $('body').on(CalendarEvents.monthChanged, calendarMonthChangedHandler);\n registered = true;\n }\n },\n };\n});\n"],"names":["define","$","Notification","Str","CalendarEvents","DataStore","SELECTORS","ALL_CLASSES","INVALID_DROP_ZONE_CLASS","registered","getDropZoneFromEvent","e","dropZone","target","closest","length","isValidDropZone","dropTimestamp","attr","minTimestart","getMinTimestart","maxTimestart","getMaxTimestart","clearAllDropZonesState","find","each","index","removeClass","updateHoverState","hovered","count","getDurationDays","valid","addClass","VALID_HOVER_CLASS","nextDropZone","next","nextWeek","children","first","updateAllDropZonesState","dragstartHandler","draggableElement","eventId","minError","maxError","duration","setEventId","setDurationDays","setMinTimestart","setMaxTimestart","setMinError","setMaxError","dataTransfer","effectAllowed","dropEffect","setData","dragoverHandler","hasEventId","preventDefault","dragleaveHandler","dropHandler","clearAll","getEventId","eventElement","origin","trigger","moveEvent","message","getMinError","getMaxError","getDropZoneError","get_string","then","string","exception","name","dragendHandler","calendarMonthChangedHandler","init","document","addEventListener","on","monthChanged"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"month_view_drag_drop.min.js","sources":["../src/month_view_drag_drop.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 javascript module to handle calendar drag and drop in the calendar\n * month view.\n *\n * @module core_calendar/month_view_drag_drop\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/notification',\n 'core/str',\n 'core_calendar/events',\n 'core_calendar/drag_drop_data_store'\n ],\n function(\n $,\n Notification,\n Str,\n CalendarEvents,\n DataStore\n ) {\n\n var SELECTORS = {\n ROOT: \"[data-region='calendar']\",\n DRAGGABLE: '[draggable=\"true\"][data-region=\"event-item\"]',\n DROP_ZONE: '[data-drop-zone=\"month-view-day\"]',\n WEEK: '[data-region=\"month-view-week\"]',\n };\n var INVALID_DROP_ZONE_CLASS = 'bg-faded';\n var INVALID_HOVER_CLASS = 'bg-danger text-white';\n var VALID_HOVER_CLASS = 'bg-primary text-white';\n var ALL_CLASSES = INVALID_DROP_ZONE_CLASS + ' ' + INVALID_HOVER_CLASS + ' ' + VALID_HOVER_CLASS;\n /* @var {bool} registered If the event listeners have been added */\n var registered = false;\n\n /**\n * Get the correct drop zone element from the given javascript\n * event.\n *\n * @param {event} e The javascript event\n * @return {object|null}\n */\n var getDropZoneFromEvent = function(e) {\n var dropZone = $(e.target).closest(SELECTORS.DROP_ZONE);\n return (dropZone.length) ? dropZone : null;\n };\n\n /**\n * Determine if the given dropzone element is within the acceptable\n * time range.\n *\n * The drop zone timestamp is midnight on that day so we should check\n * that the event's acceptable timestart value\n *\n * @param {object} dropZone The drop zone day from the calendar\n * @return {bool}\n */\n var isValidDropZone = function(dropZone) {\n var dropTimestamp = dropZone.attr('data-day-timestamp');\n var minTimestart = DataStore.getMinTimestart();\n var maxTimestart = DataStore.getMaxTimestart();\n\n if (minTimestart && minTimestart > dropTimestamp) {\n return false;\n }\n\n if (maxTimestart && maxTimestart < dropTimestamp) {\n return false;\n }\n\n return true;\n };\n\n /**\n * Get the error string to display for a given drop zone element\n * if it is invalid.\n *\n * @param {object} dropZone The drop zone day from the calendar\n * @return {string}\n */\n var getDropZoneError = function(dropZone) {\n var dropTimestamp = dropZone.attr('data-day-timestamp');\n var minTimestart = DataStore.getMinTimestart();\n var maxTimestart = DataStore.getMaxTimestart();\n\n if (minTimestart && minTimestart > dropTimestamp) {\n return DataStore.getMinError();\n }\n\n if (maxTimestart && maxTimestart < dropTimestamp) {\n return DataStore.getMaxError();\n }\n\n return null;\n };\n\n /**\n * Remove all of the styling from each of the drop zones in the calendar.\n */\n var clearAllDropZonesState = function() {\n $(SELECTORS.ROOT).find(SELECTORS.DROP_ZONE).each(function(index, dropZone) {\n dropZone = $(dropZone);\n dropZone.removeClass(ALL_CLASSES);\n });\n };\n\n /**\n * Update the hover state for the event in the calendar to reflect\n * which days the event will be moved to.\n *\n * If the drop zone is not being hovered then it will apply some\n * styling to reflect whether the drop zone is a valid or invalid\n * drop place for the current dragging event.\n *\n * This funciton supports events spanning multiple days and will\n * recurse to highlight (or remove highlight) each of the days\n * that the event will be moved to.\n *\n * For example: An event with a duration of 3 days will have\n * 3 days highlighted when it's dragged elsewhere in the calendar.\n * The current drag target and the 2 days following it (including\n * wrapping to the next week if necessary).\n *\n * @param {string|object} dropZone The drag target element\n * @param {bool} hovered If the target is hovered or not\n * @param {Number} count How many days to highlight (default to duration)\n */\n var updateHoverState = function(dropZone, hovered, count) {\n if (typeof count === 'undefined') {\n // This is how many days we need to highlight.\n count = DataStore.getDurationDays();\n }\n\n var valid = isValidDropZone(dropZone);\n dropZone.removeClass(ALL_CLASSES);\n\n if (hovered) {\n\n if (valid) {\n dropZone.addClass(VALID_HOVER_CLASS);\n } else {\n dropZone.addClass(INVALID_HOVER_CLASS);\n }\n } else {\n dropZone.removeClass(VALID_HOVER_CLASS + ' ' + INVALID_HOVER_CLASS);\n\n if (!valid) {\n dropZone.addClass(INVALID_DROP_ZONE_CLASS);\n }\n }\n\n count--;\n\n // If we've still got days to highlight then we should\n // find the next day.\n if (count > 0) {\n var nextDropZone = dropZone.next();\n\n // If there are no more days in this week then we\n // need to move down to the next week in the calendar.\n if (!nextDropZone.length) {\n var nextWeek = dropZone.closest(SELECTORS.WEEK).next();\n\n if (nextWeek.length) {\n nextDropZone = nextWeek.children(SELECTORS.DROP_ZONE).first();\n }\n }\n\n // If we found another day then let's recursively\n // update it's hover state.\n if (nextDropZone.length) {\n updateHoverState(nextDropZone, hovered, count);\n }\n }\n };\n\n /**\n * Find all of the calendar event drop zones in the calendar and update the display\n * for the user to indicate which zones are valid and invalid.\n */\n var updateAllDropZonesState = function() {\n $(SELECTORS.ROOT).find(SELECTORS.DROP_ZONE).each(function(index, dropZone) {\n dropZone = $(dropZone);\n\n if (!isValidDropZone(dropZone)) {\n updateHoverState(dropZone, false);\n }\n });\n };\n\n\n /**\n * Set up the module level variables to track which event is being\n * dragged and how many days it spans.\n *\n * @param {event} e The dragstart event\n */\n var dragstartHandler = function(e) {\n var target = $(e.target);\n var draggableElement = target.closest(SELECTORS.DRAGGABLE);\n\n if (!draggableElement.length) {\n return;\n }\n\n var eventElement = draggableElement.find('[data-event-id]');\n var eventId = eventElement.attr('data-event-id');\n var minTimestart = draggableElement.attr('data-min-day-timestamp');\n var maxTimestart = draggableElement.attr('data-max-day-timestamp');\n var minError = draggableElement.attr('data-min-day-error');\n var maxError = draggableElement.attr('data-max-day-error');\n var eventsSelector = SELECTORS.ROOT + ' [data-event-id=\"' + eventId + '\"]';\n var duration = $(eventsSelector).length;\n\n DataStore.setEventId(eventId);\n DataStore.setDurationDays(duration);\n\n if (minTimestart) {\n DataStore.setMinTimestart(minTimestart);\n }\n\n if (maxTimestart) {\n DataStore.setMaxTimestart(maxTimestart);\n }\n\n if (minError) {\n DataStore.setMinError(minError);\n }\n\n if (maxError) {\n DataStore.setMaxError(maxError);\n }\n\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.dropEffect = \"move\";\n // Firefox requires a value to be set here or the drag won't\n // work and the dragover handler won't fire.\n e.dataTransfer.setData('text/plain', eventId);\n e.dropEffect = \"move\";\n\n updateAllDropZonesState();\n };\n\n /**\n * Update the hover state of the target day element when\n * the user is dragging an event over it.\n *\n * This will add a visual indicator to the calendar UI to\n * indicate which day(s) the event will be moved to.\n *\n * @param {event} e The dragstart event\n */\n var dragoverHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n e.preventDefault();\n\n var dropZone = getDropZoneFromEvent(e);\n\n if (!dropZone) {\n return;\n }\n\n updateHoverState(dropZone, true);\n };\n\n /**\n * Update the hover state of the target day element that was\n * previously dragged over but has is no longer a drag target.\n *\n * This will remove the visual indicator from the calendar UI\n * that was added by the dragoverHandler.\n *\n * @param {event} e The dragstart event\n */\n var dragleaveHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n var dropZone = getDropZoneFromEvent(e);\n\n if (!dropZone) {\n return;\n }\n\n updateHoverState(dropZone, false);\n e.preventDefault();\n };\n\n /**\n * Determines the event element, origin day, and destination day\n * once the user drops the calendar event. These three bits of data\n * are provided as the payload to the \"moveEvent\" calendar javascript\n * event that is fired.\n *\n * This will remove the visual indicator from the calendar UI\n * that was added by the dragoverHandler.\n *\n * @param {event} e The dragstart event\n */\n var dropHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n var dropZone = getDropZoneFromEvent(e);\n\n if (!dropZone) {\n DataStore.clearAll();\n clearAllDropZonesState();\n return;\n }\n\n if (isValidDropZone(dropZone)) {\n var eventId = DataStore.getEventId();\n var eventElementSelector = SELECTORS.ROOT + ' [data-event-id=\"' + eventId + '\"]';\n var eventElement = $(eventElementSelector);\n var origin = null;\n\n if (eventElement.length) {\n origin = eventElement.closest(SELECTORS.DROP_ZONE);\n }\n\n $('body').trigger(CalendarEvents.moveEvent, [eventId, origin, dropZone]);\n } else {\n // If the drop zone is not valid then there is not need for us to\n // try to process it. Instead we can just show an error to the user.\n var message = getDropZoneError(dropZone);\n Str.get_string('errorinvaliddate', 'calendar').then(function(string) {\n Notification.exception({\n name: string,\n message: message || string\n });\n });\n }\n\n DataStore.clearAll();\n clearAllDropZonesState();\n\n e.preventDefault();\n };\n\n /**\n * Clear the data store and remove the drag indicators from the UI\n * when the drag event has finished.\n */\n var dragendHandler = function() {\n DataStore.clearAll();\n clearAllDropZonesState();\n };\n\n /**\n * Re-render the drop zones in the new month to highlight\n * which areas are or aren't acceptable to drop the calendar\n * event.\n */\n var calendarMonthChangedHandler = function() {\n updateAllDropZonesState();\n };\n\n return {\n /**\n * Initialise the event handlers for the drag events.\n */\n init: function() {\n if (!registered) {\n // These handlers are only added the first time the module\n // is loaded because we don't want to have a new listener\n // added each time the \"init\" function is called otherwise we'll\n // end up with lots of stale handlers.\n document.addEventListener('dragstart', dragstartHandler, false);\n document.addEventListener('dragover', dragoverHandler, false);\n document.addEventListener('dragleave', dragleaveHandler, false);\n document.addEventListener('drop', dropHandler, false);\n document.addEventListener('dragend', dragendHandler, false);\n $('body').on(CalendarEvents.monthChanged, calendarMonthChangedHandler);\n registered = true;\n }\n },\n };\n});\n"],"names":["define","$","Notification","Str","CalendarEvents","DataStore","SELECTORS","ALL_CLASSES","INVALID_DROP_ZONE_CLASS","registered","getDropZoneFromEvent","e","dropZone","target","closest","length","isValidDropZone","dropTimestamp","attr","minTimestart","getMinTimestart","maxTimestart","getMaxTimestart","clearAllDropZonesState","find","each","index","removeClass","updateHoverState","hovered","count","getDurationDays","valid","addClass","VALID_HOVER_CLASS","nextDropZone","next","nextWeek","children","first","updateAllDropZonesState","dragstartHandler","draggableElement","eventId","minError","maxError","duration","setEventId","setDurationDays","setMinTimestart","setMaxTimestart","setMinError","setMaxError","dataTransfer","effectAllowed","dropEffect","setData","dragoverHandler","hasEventId","preventDefault","dragleaveHandler","dropHandler","clearAll","getEventId","eventElement","origin","trigger","moveEvent","message","getMinError","getMaxError","getDropZoneError","get_string","then","string","exception","name","dragendHandler","calendarMonthChangedHandler","init","document","addEventListener","on","monthChanged"],"mappings":";;;;;;;;AAuBAA,OAAM,qCAAC,CACK,SACA,oBACA,WACA,uBACA,uCAEJ,SACIC,EACAC,aACAC,IACAC,eACAC,WAGR,IAAIC,eACM,2BADNA,oBAEW,+CAFXA,oBAGW,oCAHXA,eAIM,kCAKNC,YAAcC,sDAEdC,YAAa,EASbC,qBAAuB,SAASC,GAChC,IAAIC,SAAWX,EAAEU,EAAEE,QAAQC,QAAQR,qBACnC,OAAQM,SAASG,OAAUH,SAAW,IACzC,EAYGI,gBAAkB,SAASJ,UAC3B,IAAIK,cAAgBL,SAASM,KAAK,sBAC9BC,aAAed,UAAUe,kBACzBC,aAAehB,UAAUiB,kBAE7B,QAAIH,cAAgBA,aAAeF,kBAI/BI,cAAgBA,aAAeJ,cAKtC,EA4BGM,uBAAyB,WACzBtB,EAAEK,gBAAgBkB,KAAKlB,qBAAqBmB,MAAK,SAASC,MAAOd,WAC7DA,SAAWX,EAAEW,WACJe,YAAYpB,YACxB,GACJ,EAuBGqB,iBAAmB,SAAnBA,iBAA4BhB,SAAUiB,QAASC,YAC1B,IAAVA,QAEPA,MAAQzB,UAAU0B,mBAGtB,IAAIC,MAAQhB,gBAAgBJ,UAsBxBkB,GArBJlB,SAASe,YAAYpB,aAEjBsB,QAEIG,MACApB,SAASqB,SA7GG,yBA+GZrB,SAASqB,SAhHK,yBAmHlBrB,SAASe,YAAYO,8CAEhBF,OACDpB,SAASqB,SAvHS,eA2H1BH,MAIY,EAAG,CACX,IAAIK,aAAevB,SAASwB,OAI5B,IAAKD,aAAapB,OAAQ,CAClBsB,IAAAA,SAAWzB,SAASE,QAAQR,gBAAgB8B,OAE5CC,SAAStB,SACToB,aAAeE,SAASC,SAAShC,qBAAqBiC,QAE7D,CAIGJ,aAAapB,QACba,iBAAiBO,aAAcN,QAASC,MAE/C,CACJ,EAMGU,wBAA0B,WAC1BvC,EAAEK,gBAAgBkB,KAAKlB,qBAAqBmB,MAAK,SAASC,MAAOd,UAC7DA,SAAWX,EAAEW,UAERI,gBAAgBJ,WACjBgB,iBAAiBhB,UAAU,EAElC,GACJ,EASG6B,iBAAmB,SAAS9B,GAC5B,IACI+B,iBADSzC,EAAEU,EAAEE,QACaC,QAAQR,qBAEtC,GAAKoC,iBAAiB3B,OAAtB,CAIA,IACI4B,QADeD,iBAAiBlB,KAAK,mBACdN,KAAK,iBAC5BC,aAAeuB,iBAAiBxB,KAAK,0BACrCG,aAAeqB,iBAAiBxB,KAAK,0BACrC0B,SAAWF,iBAAiBxB,KAAK,sBACjC2B,SAAWH,iBAAiBxB,KAAK,sBAEjC4B,SAAW7C,EADMK,eAAiB,oBAAsBqC,QAAU,MACrC5B,OAEjCV,UAAU0C,WAAWJ,SACrBtC,UAAU2C,gBAAgBF,UAEtB3B,cACAd,UAAU4C,gBAAgB9B,cAG1BE,cACAhB,UAAU6C,gBAAgB7B,cAG1BuB,UACAvC,UAAU8C,YAAYP,UAGtBC,UACAxC,UAAU+C,YAAYP,UAG1BlC,EAAE0C,aAAaC,cAAgB,OAC/B3C,EAAE0C,aAAaE,WAAa,OAG5B5C,EAAE0C,aAAaG,QAAQ,aAAcb,SACrChC,EAAE4C,WAAa,OAEff,yBArCC,CAsCJ,EAWGiB,gBAAkB,SAAS9C,GAE3B,GAAKN,UAAUqD,aAAf,CAIA/C,EAAEgD,iBAEF,IAAI/C,SAAWF,qBAAqBC,GAE/BC,UAILgB,iBAAiBhB,UAAU,EAV1B,CAWJ,EAWGgD,iBAAmB,SAASjD,GAE5B,GAAKN,UAAUqD,aAAf,CAIA,IAAI9C,SAAWF,qBAAqBC,GAE/BC,WAILgB,iBAAiBhB,UAAU,GAC3BD,EAAEgD,iBATD,CAUJ,EAaGE,YAAc,SAASlD,GAEvB,GAAKN,UAAUqD,aAAf,CAIA,IAAI9C,SAAWF,qBAAqBC,GAEhC,IAACC,SAGD,OAFAP,UAAUyD,gBACVvC,yBAIJ,GAAIP,gBAAgBJ,UAAW,CAC3B,IAAI+B,QAAUtC,UAAU0D,aAEpBC,aAAe/D,EADQK,eAAiB,oBAAsBqC,QAAU,MAExEsB,OAAS,KAETD,aAAajD,SACbkD,OAASD,aAAalD,QAAQR,sBAGlCL,EAAE,QAAQiE,QAAQ9D,eAAe+D,UAAW,CAACxB,QAASsB,OAAQrD,UACjE,KAAM,CAGH,IAAIwD,QA7PW,SAASxD,UAC5B,IAAIK,cAAgBL,SAASM,KAAK,sBAC9BC,aAAed,UAAUe,kBACzBC,aAAehB,UAAUiB,kBAE7B,OAAIH,cAAgBA,aAAeF,cACxBZ,UAAUgE,cAGjBhD,cAAgBA,aAAeJ,cACxBZ,UAAUiE,cAGd,IACV,CA+OqBC,CAAiB3D,UAC/BT,IAAIqE,WAAW,mBAAoB,YAAYC,MAAK,SAASC,QACzDxE,aAAayE,UAAU,CACnBC,KAAMF,OACNN,QAASA,SAAWM,QAE3B,GACJ,CAEDrE,UAAUyD,WACVvC,yBAEAZ,EAAEgD,gBApCD,CAqCJ,EAMGkB,eAAiB,WACjBxE,UAAUyD,WACVvC,wBACH,EAOGuD,4BAA8B,WAC9BtC,yBACH,EAEM,MAAA,CAIHuC,KAAM,WACGtE,aAKDuE,SAASC,iBAAiB,YAAaxC,kBAAkB,GACzDuC,SAASC,iBAAiB,WAAYxB,iBAAiB,GACvDuB,SAASC,iBAAiB,YAAarB,kBAAkB,GACzDoB,SAASC,iBAAiB,OAAQpB,aAAa,GAC/CmB,SAASC,iBAAiB,UAAWJ,gBAAgB,GACrD5E,EAAE,QAAQiF,GAAG9E,eAAe+E,aAAcL,6BAC1CrE,YAAa,EAEpB,EAER"} \ No newline at end of file diff --git a/calendar/amd/build/repository.min.js b/calendar/amd/build/repository.min.js index d8a5eebce22..9ed7c0e955c 100644 --- a/calendar/amd/build/repository.min.js +++ b/calendar/amd/build/repository.min.js @@ -5,6 +5,6 @@ define("core_calendar/repository",["exports","core/ajax"],(function(_exports,_aj * @module core_calendar/repository * @copyright 2017 Simey Lameze * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.updateEventStartDay=_exports.submitCreateUpdateForm=_exports.getEventById=_exports.getCourseGroupsData=_exports.getCalendarUpcomingData=_exports.getCalendarMonthData=_exports.getCalendarDayData=_exports.deleteEvent=void 0,_ajax=(obj=_ajax)&&obj.__esModule?obj:{default:obj};_exports.deleteEvent=function(eventId){var deleteSeries=arguments.length>1&&void 0!==arguments[1]&&arguments[1],request={methodname:"core_calendar_delete_calendar_events",args:{events:[{eventid:eventId,repeat:deleteSeries}]}};return _ajax.default.call([request])[0]};_exports.getEventById=function(eventId){var request={methodname:"core_calendar_get_calendar_event_by_id",args:{eventid:eventId}};return _ajax.default.call([request])[0]};_exports.submitCreateUpdateForm=function(formData){var request={methodname:"core_calendar_submit_create_update_form",args:{formdata:formData}};return _ajax.default.call([request])[0]};_exports.getCalendarMonthData=function(year,month,courseId,categoryId,includeNavigation,mini){var day=arguments.length>6&&void 0!==arguments[6]?arguments[6]:1,request={methodname:"core_calendar_get_calendar_monthly_view",args:{year:year,month:month,courseid:courseId,categoryid:categoryId,includenavigation:includeNavigation,mini:mini,day:day}};return _ajax.default.call([request])[0]};_exports.getCalendarDayData=function(year,month,day,courseId,categoryId){var request={methodname:"core_calendar_get_calendar_day_view",args:{year:year,month:month,day:day,courseid:courseId,categoryid:categoryId}};return _ajax.default.call([request])[0]};_exports.updateEventStartDay=function(eventId,dayTimestamp){var request={methodname:"core_calendar_update_event_start_day",args:{eventid:eventId,daytimestamp:dayTimestamp}};return _ajax.default.call([request])[0]};_exports.getCalendarUpcomingData=function(courseId,categoryId){var request={methodname:"core_calendar_get_calendar_upcoming_view",args:{courseid:courseId,categoryid:categoryId}};return _ajax.default.call([request])[0]};_exports.getCourseGroupsData=function(courseId){var request={methodname:"core_group_get_course_groups",args:{courseid:courseId}};return _ajax.default.call([request])[0]}})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.updateEventStartDay=_exports.submitCreateUpdateForm=_exports.getEventById=_exports.getCourseGroupsData=_exports.getCalendarUpcomingData=_exports.getCalendarMonthData=_exports.getCalendarDayData=_exports.deleteEvent=void 0,_ajax=(obj=_ajax)&&obj.__esModule?obj:{default:obj};_exports.deleteEvent=function(eventId){var request={methodname:"core_calendar_delete_calendar_events",args:{events:[{eventid:eventId,repeat:arguments.length>1&&void 0!==arguments[1]&&arguments[1]}]}};return _ajax.default.call([request])[0]};_exports.getEventById=function(eventId){var request={methodname:"core_calendar_get_calendar_event_by_id",args:{eventid:eventId}};return _ajax.default.call([request])[0]};_exports.submitCreateUpdateForm=function(formData){var request={methodname:"core_calendar_submit_create_update_form",args:{formdata:formData}};return _ajax.default.call([request])[0]};_exports.getCalendarMonthData=function(year,month,courseId,categoryId,includeNavigation,mini){var request={methodname:"core_calendar_get_calendar_monthly_view",args:{year:year,month:month,courseid:courseId,categoryid:categoryId,includenavigation:includeNavigation,mini:mini,day:arguments.length>6&&void 0!==arguments[6]?arguments[6]:1}};return _ajax.default.call([request])[0]};_exports.getCalendarDayData=function(year,month,day,courseId,categoryId){var request={methodname:"core_calendar_get_calendar_day_view",args:{year:year,month:month,day:day,courseid:courseId,categoryid:categoryId}};return _ajax.default.call([request])[0]};_exports.updateEventStartDay=function(eventId,dayTimestamp){var request={methodname:"core_calendar_update_event_start_day",args:{eventid:eventId,daytimestamp:dayTimestamp}};return _ajax.default.call([request])[0]};_exports.getCalendarUpcomingData=function(courseId,categoryId){var request={methodname:"core_calendar_get_calendar_upcoming_view",args:{courseid:courseId,categoryid:categoryId}};return _ajax.default.call([request])[0]};_exports.getCourseGroupsData=function(courseId){var request={methodname:"core_group_get_course_groups",args:{courseid:courseId}};return _ajax.default.call([request])[0]}})); //# sourceMappingURL=repository.min.js.map \ No newline at end of file diff --git a/calendar/amd/build/repository.min.js.map b/calendar/amd/build/repository.min.js.map index a37dd8e7cd5..c960d64a7b8 100644 --- a/calendar/amd/build/repository.min.js.map +++ b/calendar/amd/build/repository.min.js.map @@ -1 +1 @@ -{"version":3,"file":"repository.min.js","sources":["../src/repository.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 javascript module to handle calendar ajax actions.\n *\n * @module core_calendar/repository\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Ajax from 'core/ajax';\n\n/**\n * Delete a calendar event.\n *\n * @method deleteEvent\n * @param {number} eventId The event id.\n * @param {boolean} deleteSeries Whether to delete all events in the series\n * @return {promise} Resolved with requested calendar event\n */\nexport const deleteEvent = (eventId, deleteSeries = false) => {\n const request = {\n methodname: 'core_calendar_delete_calendar_events',\n args: {\n events: [{\n eventid: eventId,\n repeat: deleteSeries,\n }]\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get a calendar event by id.\n *\n * @method getEventById\n * @param {number} eventId The event id.\n * @return {promise} Resolved with requested calendar event\n */\nexport const getEventById = (eventId) => {\n\n const request = {\n methodname: 'core_calendar_get_calendar_event_by_id',\n args: {\n eventid: eventId\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Submit the form data for the event form.\n *\n * @method submitCreateUpdateForm\n * @param {string} formData The URL encoded values from the form\n * @return {promise} Resolved with the new or edited event\n */\nexport const submitCreateUpdateForm = (formData) => {\n const request = {\n methodname: 'core_calendar_submit_create_update_form',\n args: {\n formdata: formData\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get calendar data for the month view.\n *\n * @method getCalendarMonthData\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} courseId The course id.\n * @param {number} categoryId The category id.\n * @param {boolean} includeNavigation Whether to include navigation.\n * @param {boolean} mini Whether the month is in mini view.\n * @param {number} day Day (optional)\n * @return {promise} Resolved with the month view data.\n */\nexport const getCalendarMonthData = (year, month, courseId, categoryId, includeNavigation, mini, day = 1) => {\n const request = {\n methodname: 'core_calendar_get_calendar_monthly_view',\n args: {\n year,\n month,\n courseid: courseId,\n categoryid: categoryId,\n includenavigation: includeNavigation,\n mini,\n day,\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get calendar data for the day view.\n *\n * @method getCalendarDayData\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} day Day\n * @param {number} courseId The course id.\n * @param {number} categoryId The id of the category whose events are shown\n * @return {promise} Resolved with the day view data.\n */\nexport const getCalendarDayData = (year, month, day, courseId, categoryId) => {\n const request = {\n methodname: 'core_calendar_get_calendar_day_view',\n args: {\n year,\n month,\n day,\n courseid: courseId,\n categoryid: categoryId,\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Change the start day for the given event id. The day timestamp\n * only has to be any time during the target day because only the\n * date information is extracted, the time of the day is ignored.\n *\n * @param {int} eventId The id of the event to update\n * @param {int} dayTimestamp A timestamp for some time during the target day\n * @return {promise}\n */\nexport const updateEventStartDay = (eventId, dayTimestamp) => {\n const request = {\n methodname: 'core_calendar_update_event_start_day',\n args: {\n eventid: eventId,\n daytimestamp: dayTimestamp\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get calendar upcoming data.\n *\n * @method getCalendarUpcomingData\n * @param {number} courseId The course id.\n * @param {number} categoryId The category id.\n * @return {promise} Resolved with the month view data.\n */\nexport const getCalendarUpcomingData = (courseId, categoryId) => {\n const request = {\n methodname: 'core_calendar_get_calendar_upcoming_view',\n args: {\n courseid: courseId,\n categoryid: categoryId,\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get the groups by course id.\n *\n * @param {Number} courseId The course id to fetch the groups from.\n * @return {promise} Resolved with the course groups.\n */\nexport const getCourseGroupsData = (courseId) => {\n const request = {\n methodname: 'core_group_get_course_groups',\n args: {\n courseid: courseId\n }\n };\n\n return Ajax.call([request])[0];\n};\n"],"names":["eventId","deleteSeries","request","methodname","args","events","eventid","repeat","Ajax","call","formData","formdata","year","month","courseId","categoryId","includeNavigation","mini","day","courseid","categoryid","includenavigation","dayTimestamp","daytimestamp"],"mappings":";;;;;;;6WAgC2B,SAACA,aAASC,qEAC3BC,QAAU,CACZC,WAAY,uCACZC,KAAM,CACFC,OAAQ,CAAC,CACLC,QAASN,QACTO,OAAQN,wBAKbO,cAAKC,KAAK,CAACP,UAAU,0BAUJ,SAACF,aAEnBE,QAAU,CACZC,WAAY,yCACZC,KAAM,CACFE,QAASN,iBAIVQ,cAAKC,KAAK,CAACP,UAAU,oCAUM,SAACQ,cAC7BR,QAAU,CACZC,WAAY,0CACZC,KAAM,CACFO,SAAUD,kBAIXF,cAAKC,KAAK,CAACP,UAAU,kCAgBI,SAACU,KAAMC,MAAOC,SAAUC,WAAYC,kBAAmBC,UAAMC,2DAAM,EAC7FhB,QAAU,CACZC,WAAY,0CACZC,KAAM,CACFQ,KAAAA,KACAC,MAAAA,MACAM,SAAUL,SACVM,WAAYL,WACZM,kBAAmBL,kBACnBC,KAAAA,KACAC,IAAAA,aAIDV,cAAKC,KAAK,CAACP,UAAU,gCAcE,SAACU,KAAMC,MAAOK,IAAKJ,SAAUC,gBACrDb,QAAU,CACZC,WAAY,sCACZC,KAAM,CACFQ,KAAAA,KACAC,MAAAA,MACAK,IAAAA,IACAC,SAAUL,SACVM,WAAYL,oBAIbP,cAAKC,KAAK,CAACP,UAAU,iCAYG,SAACF,QAASsB,kBACnCpB,QAAU,CACZC,WAAY,uCACZC,KAAM,CACFE,QAASN,QACTuB,aAAcD,sBAIfd,cAAKC,KAAK,CAACP,UAAU,qCAWO,SAACY,SAAUC,gBACxCb,QAAU,CACZC,WAAY,2CACZC,KAAM,CACFe,SAAUL,SACVM,WAAYL,oBAIbP,cAAKC,KAAK,CAACP,UAAU,iCASG,SAACY,cAC1BZ,QAAU,CACZC,WAAY,+BACZC,KAAM,CACFe,SAAUL,kBAIXN,cAAKC,KAAK,CAACP,UAAU"} \ No newline at end of file +{"version":3,"file":"repository.min.js","sources":["../src/repository.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 javascript module to handle calendar ajax actions.\n *\n * @module core_calendar/repository\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Ajax from 'core/ajax';\n\n/**\n * Delete a calendar event.\n *\n * @method deleteEvent\n * @param {number} eventId The event id.\n * @param {boolean} deleteSeries Whether to delete all events in the series\n * @return {promise} Resolved with requested calendar event\n */\nexport const deleteEvent = (eventId, deleteSeries = false) => {\n const request = {\n methodname: 'core_calendar_delete_calendar_events',\n args: {\n events: [{\n eventid: eventId,\n repeat: deleteSeries,\n }]\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get a calendar event by id.\n *\n * @method getEventById\n * @param {number} eventId The event id.\n * @return {promise} Resolved with requested calendar event\n */\nexport const getEventById = (eventId) => {\n\n const request = {\n methodname: 'core_calendar_get_calendar_event_by_id',\n args: {\n eventid: eventId\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Submit the form data for the event form.\n *\n * @method submitCreateUpdateForm\n * @param {string} formData The URL encoded values from the form\n * @return {promise} Resolved with the new or edited event\n */\nexport const submitCreateUpdateForm = (formData) => {\n const request = {\n methodname: 'core_calendar_submit_create_update_form',\n args: {\n formdata: formData\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get calendar data for the month view.\n *\n * @method getCalendarMonthData\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} courseId The course id.\n * @param {number} categoryId The category id.\n * @param {boolean} includeNavigation Whether to include navigation.\n * @param {boolean} mini Whether the month is in mini view.\n * @param {number} day Day (optional)\n * @return {promise} Resolved with the month view data.\n */\nexport const getCalendarMonthData = (year, month, courseId, categoryId, includeNavigation, mini, day = 1) => {\n const request = {\n methodname: 'core_calendar_get_calendar_monthly_view',\n args: {\n year,\n month,\n courseid: courseId,\n categoryid: categoryId,\n includenavigation: includeNavigation,\n mini,\n day,\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get calendar data for the day view.\n *\n * @method getCalendarDayData\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} day Day\n * @param {number} courseId The course id.\n * @param {number} categoryId The id of the category whose events are shown\n * @return {promise} Resolved with the day view data.\n */\nexport const getCalendarDayData = (year, month, day, courseId, categoryId) => {\n const request = {\n methodname: 'core_calendar_get_calendar_day_view',\n args: {\n year,\n month,\n day,\n courseid: courseId,\n categoryid: categoryId,\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Change the start day for the given event id. The day timestamp\n * only has to be any time during the target day because only the\n * date information is extracted, the time of the day is ignored.\n *\n * @param {int} eventId The id of the event to update\n * @param {int} dayTimestamp A timestamp for some time during the target day\n * @return {promise}\n */\nexport const updateEventStartDay = (eventId, dayTimestamp) => {\n const request = {\n methodname: 'core_calendar_update_event_start_day',\n args: {\n eventid: eventId,\n daytimestamp: dayTimestamp\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get calendar upcoming data.\n *\n * @method getCalendarUpcomingData\n * @param {number} courseId The course id.\n * @param {number} categoryId The category id.\n * @return {promise} Resolved with the month view data.\n */\nexport const getCalendarUpcomingData = (courseId, categoryId) => {\n const request = {\n methodname: 'core_calendar_get_calendar_upcoming_view',\n args: {\n courseid: courseId,\n categoryid: categoryId,\n }\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get the groups by course id.\n *\n * @param {Number} courseId The course id to fetch the groups from.\n * @return {promise} Resolved with the course groups.\n */\nexport const getCourseGroupsData = (courseId) => {\n const request = {\n methodname: 'core_group_get_course_groups',\n args: {\n courseid: courseId\n }\n };\n\n return Ajax.call([request])[0];\n};\n"],"names":["_ajax","eventId","deleteSeries","request","methodname","args","events","eventid","repeat","Ajax","call","formData","formdata","year","month","courseId","categoryId","includeNavigation","mini","day","courseid","categoryid","includenavigation","dayTimestamp","daytimestamp"],"mappings":";;;;;;;oSAsBAA,WAAAA,8DAU2B,SAACC,SAASC,IAC3BC,QAAU,CACZC,WAAY,uCACZC,KAAM,CACFC,OAAQ,CAAC,CACLC,QAASN,QACTO,mEAKLC,OAAAA,MAAAA,QAAKC,KAAK,CAACP,UAAU,EAC/B,wBAS2B,SAACF,SAEzB,IAAME,QAAU,CACZC,WAAY,yCACZC,KAAM,CACFE,QAASN,UAIVQ,OAAAA,MAAAA,QAAKC,KAAK,CAACP,UAAU,EAC/B,kCASqC,SAACQ,UACnC,IAAMR,QAAU,CACZC,WAAY,0CACZC,KAAM,CACFO,SAAUD,WAIXF,OAAAA,MAAAA,QAAKC,KAAK,CAACP,UAAU,EAC/B,gCAemC,SAACU,KAAMC,MAAOC,SAAUC,WAAYC,kBAAmBC,MAAMC,IACvFhB,QAAU,CACZC,WAAY,0CACZC,KAAM,CACFQ,KAAAA,KACAC,MAAAA,MACAM,SAAUL,SACVM,WAAYL,WACZM,kBAAmBL,kBACnBC,KAAAA,KACAC,2DAV2F,IAc5FV,OAAAA,MAAAA,QAAKC,KAAK,CAACP,UAAU,EAC/B,8BAaiC,SAACU,KAAMC,MAAOK,IAAKJ,SAAUC,YAC3D,IAAMb,QAAU,CACZC,WAAY,sCACZC,KAAM,CACFQ,KAAAA,KACAC,MAAAA,MACAK,IAAAA,IACAC,SAAUL,SACVM,WAAYL,aAIbP,OAAAA,MAAAA,QAAKC,KAAK,CAACP,UAAU,EAC/B,+BAWkC,SAACF,QAASsB,cACzC,IAAMpB,QAAU,CACZC,WAAY,uCACZC,KAAM,CACFE,QAASN,QACTuB,aAAcD,eAIfd,OAAAA,MAAAA,QAAKC,KAAK,CAACP,UAAU,EAC/B,mCAUsC,SAACY,SAAUC,YAC9C,IAAMb,QAAU,CACZC,WAAY,2CACZC,KAAM,CACFe,SAAUL,SACVM,WAAYL,aAIbP,OAAAA,MAAAA,QAAKC,KAAK,CAACP,UAAU,EAC/B,+BAQkC,SAACY,UAChC,IAAMZ,QAAU,CACZC,WAAY,+BACZC,KAAM,CACFe,SAAUL,WAIXN,OAAAA,MAAAA,QAAKC,KAAK,CAACP,UAAU,EAC/B"} \ No newline at end of file diff --git a/calendar/amd/build/selectors.min.js.map b/calendar/amd/build/selectors.min.js.map index 45a1c14735d..34968b64124 100644 --- a/calendar/amd/build/selectors.min.js.map +++ b/calendar/amd/build/selectors.min.js.map @@ -1 +1 @@ -{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 is responsible for the calendar filter.\n *\n * @module core_calendar/calendar_selectors\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n eventFilterItem: \"[data-action='filter-event-type']\",\n eventType: {\n site: \"[data-eventtype-site]\",\n category: \"[data-eventtype-category]\",\n course: \"[data-eventtype-course]\",\n group: \"[data-eventtype-group]\",\n user: \"[data-eventtype-user]\",\n other: \"[data-eventtype-other]\",\n },\n popoverType: {\n site: \"[data-popover-eventtype-site]\",\n category: \"[data-popover-eventtype-category]\",\n course: \"[data-popover-eventtype-course]\",\n group: \"[data-popover-eventtype-group]\",\n user: \"[data-popover-eventtype-user]\",\n other: \"[data-popover-eventtype-other]\",\n },\n calendarPeriods: {\n month: \"[data-period='month']\",\n },\n courseSelector: 'select[name=\"course\"]',\n viewSelector: 'div[data-region=\"view-selector\"]',\n actions: {\n create: '[data-action=\"new-event-button\"]',\n edit: '[data-action=\"edit\"]',\n remove: '[data-action=\"delete\"]',\n viewEvent: '[data-action=\"view-event\"]',\n },\n elements: {\n courseSelector: 'select[name=\"course\"]',\n },\n today: '.today',\n day: '[data-region=\"day\"]',\n calendarMain: '[data-region=\"calendar\"]',\n wrapper: '.calendarwrapper',\n eventItem: '[data-type=\"event\"]',\n links: {\n navLink: '.calendarwrapper .arrow_link',\n eventLink: \"[data-region='event-item']\",\n miniDayLink: \"[data-region='mini-day-link']\",\n },\n containers: {\n loadingIcon: '[data-region=\"overlay-icon-container\"]',\n },\n };\n});\n"],"names":["define","eventFilterItem","eventType","site","category","course","group","user","other","popoverType","calendarPeriods","month","courseSelector","viewSelector","actions","create","edit","remove","viewEvent","elements","today","day","calendarMain","wrapper","eventItem","links","navLink","eventLink","miniDayLink","containers","loadingIcon"],"mappings":";;;;;;;AAsBAA,iCAAO,IAAI,iBACA,CACHC,gBAAiB,oCACjBC,UAAW,CACPC,KAAM,wBACNC,SAAU,4BACVC,OAAQ,0BACRC,MAAO,yBACPC,KAAM,wBACNC,MAAO,0BAEXC,YAAa,CACTN,KAAM,gCACNC,SAAU,oCACVC,OAAQ,kCACRC,MAAO,iCACPC,KAAM,gCACNC,MAAO,kCAEXE,gBAAiB,CACbC,MAAO,yBAEXC,eAAgB,wBAChBC,aAAc,mCACdC,QAAS,CACLC,OAAQ,mCACRC,KAAM,uBACNC,OAAQ,yBACRC,UAAW,8BAEfC,SAAU,CACNP,eAAgB,yBAEpBQ,MAAO,SACPC,IAAK,sBACLC,aAAc,2BACdC,QAAS,mBACTC,UAAW,sBACXC,MAAO,CACHC,QAAS,+BACTC,UAAW,6BACXC,YAAa,iCAEjBC,WAAY,CACRC,YAAa"} \ No newline at end of file +{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 is responsible for the calendar filter.\n *\n * @module core_calendar/calendar_selectors\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n eventFilterItem: \"[data-action='filter-event-type']\",\n eventType: {\n site: \"[data-eventtype-site]\",\n category: \"[data-eventtype-category]\",\n course: \"[data-eventtype-course]\",\n group: \"[data-eventtype-group]\",\n user: \"[data-eventtype-user]\",\n other: \"[data-eventtype-other]\",\n },\n popoverType: {\n site: \"[data-popover-eventtype-site]\",\n category: \"[data-popover-eventtype-category]\",\n course: \"[data-popover-eventtype-course]\",\n group: \"[data-popover-eventtype-group]\",\n user: \"[data-popover-eventtype-user]\",\n other: \"[data-popover-eventtype-other]\",\n },\n calendarPeriods: {\n month: \"[data-period='month']\",\n },\n courseSelector: 'select[name=\"course\"]',\n viewSelector: 'div[data-region=\"view-selector\"]',\n actions: {\n create: '[data-action=\"new-event-button\"]',\n edit: '[data-action=\"edit\"]',\n remove: '[data-action=\"delete\"]',\n viewEvent: '[data-action=\"view-event\"]',\n },\n elements: {\n courseSelector: 'select[name=\"course\"]',\n },\n today: '.today',\n day: '[data-region=\"day\"]',\n calendarMain: '[data-region=\"calendar\"]',\n wrapper: '.calendarwrapper',\n eventItem: '[data-type=\"event\"]',\n links: {\n navLink: '.calendarwrapper .arrow_link',\n eventLink: \"[data-region='event-item']\",\n miniDayLink: \"[data-region='mini-day-link']\",\n },\n containers: {\n loadingIcon: '[data-region=\"overlay-icon-container\"]',\n },\n };\n});\n"],"names":["define","eventFilterItem","eventType","site","category","course","group","user","other","popoverType","calendarPeriods","month","courseSelector","viewSelector","actions","create","edit","remove","viewEvent","elements","today","day","calendarMain","wrapper","eventItem","links","navLink","eventLink","miniDayLink","containers","loadingIcon"],"mappings":";;;;;;;AAsBAA,OAAM,0BAAC,IAAI,WACA,MAAA,CACHC,gBAAiB,oCACjBC,UAAW,CACPC,KAAM,wBACNC,SAAU,4BACVC,OAAQ,0BACRC,MAAO,yBACPC,KAAM,wBACNC,MAAO,0BAEXC,YAAa,CACTN,KAAM,gCACNC,SAAU,oCACVC,OAAQ,kCACRC,MAAO,iCACPC,KAAM,gCACNC,MAAO,kCAEXE,gBAAiB,CACbC,MAAO,yBAEXC,eAAgB,wBAChBC,aAAc,mCACdC,QAAS,CACLC,OAAQ,mCACRC,KAAM,uBACNC,OAAQ,yBACRC,UAAW,8BAEfC,SAAU,CACNP,eAAgB,yBAEpBQ,MAAO,SACPC,IAAK,sBACLC,aAAc,2BACdC,QAAS,mBACTC,UAAW,sBACXC,MAAO,CACHC,QAAS,+BACTC,UAAW,6BACXC,YAAa,iCAEjBC,WAAY,CACRC,YAAa,0CAGxB"} \ No newline at end of file diff --git a/calendar/amd/build/summary_modal.min.js.map b/calendar/amd/build/summary_modal.min.js.map index 423c4ada941..9369dfece8b 100644 --- a/calendar/amd/build/summary_modal.min.js.map +++ b/calendar/amd/build/summary_modal.min.js.map @@ -1 +1 @@ -{"version":3,"file":"summary_modal.min.js","sources":["../src/summary_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 * A javascript module to handle summary modal.\n *\n * @module core_calendar/summary_modal\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/str',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_registry',\n 'core/modal_factory',\n 'core/modal_events',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/crud',\n],\nfunction(\n $,\n Str,\n Notification,\n CustomEvents,\n Modal,\n ModalRegistry,\n ModalFactory,\n ModalEvents,\n CalendarRepository,\n CalendarEvents,\n CalendarCrud\n) {\n\n var registered = false;\n var SELECTORS = {\n ROOT: \"[data-region='summary-modal-container']\",\n EDIT_BUTTON: '[data-action=\"edit\"]',\n DELETE_BUTTON: '[data-action=\"delete\"]',\n };\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var ModalEventSummary = function(root) {\n Modal.call(this, root);\n };\n\n ModalEventSummary.TYPE = 'core_calendar-event_summary';\n ModalEventSummary.prototype = Object.create(Modal.prototype);\n ModalEventSummary.prototype.constructor = ModalEventSummary;\n\n /**\n * Get the edit button element from the footer. The button is cached\n * as it's not expected to change.\n *\n * @method getEditButton\n * @return {object} button element\n */\n ModalEventSummary.prototype.getEditButton = function() {\n if (typeof this.editButton == 'undefined') {\n this.editButton = this.getFooter().find(SELECTORS.EDIT_BUTTON);\n }\n\n return this.editButton;\n };\n\n /**\n * Get the delete button element from the footer. The button is cached\n * as it's not expected to change.\n *\n * @method getDeleteButton\n * @return {object} button element\n */\n ModalEventSummary.prototype.getDeleteButton = function() {\n if (typeof this.deleteButton == 'undefined') {\n this.deleteButton = this.getFooter().find(SELECTORS.DELETE_BUTTON);\n }\n\n return this.deleteButton;\n };\n\n /**\n * Get the id for the event being shown in this modal. This value is\n * not cached because it will change depending on which event is\n * being displayed.\n *\n * @method getEventId\n * @return {int}\n */\n ModalEventSummary.prototype.getEventId = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-event-id');\n };\n\n /**\n * Get the title for the event being shown in this modal. This value is\n * not cached because it will change depending on which event is\n * being displayed.\n *\n * @method getEventTitle\n * @return {String}\n */\n ModalEventSummary.prototype.getEventTitle = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-event-title');\n };\n\n /**\n * Get the number of events in the series for the event being shown in\n * this modal. This value is not cached because it will change\n * depending on which event is being displayed.\n *\n * @method getEventCount\n * @return {int}\n */\n ModalEventSummary.prototype.getEventCount = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-event-count');\n };\n\n /**\n * Get the url for the event being shown in this modal.\n *\n * @method getEventUrl\n * @return {String}\n */\n ModalEventSummary.prototype.getEditUrl = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-edit-url');\n };\n\n /**\n * Is this an action event.\n *\n * @method getEventUrl\n * @return {String}\n */\n ModalEventSummary.prototype.isActionEvent = function() {\n return (this.getBody().find(SELECTORS.ROOT).attr('data-action-event') == 'true');\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalEventSummary.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n // We have to wait for the modal to finish rendering in order to ensure that\n // the data-event-title property is available to use as the modal title.\n M.util.js_pending('core_calendar/summary_modal:registerEventListeners:bodyRendered');\n this.getRoot().on(ModalEvents.bodyRendered, function() {\n this.getModal().data({\n eventTitle: this.getEventTitle(),\n eventId: this.getEventId(),\n eventCount: this.getEventCount(),\n })\n .attr('data-type', 'event');\n CalendarCrud.registerRemove(this.getModal());\n M.util.js_complete('core_calendar/summary_modal:registerEventListeners:bodyRendered');\n }.bind(this));\n\n $('body').on(CalendarEvents.deleted, function() {\n // Close the dialogue on delete.\n this.hide();\n }.bind(this));\n\n CustomEvents.define(this.getEditButton(), [\n CustomEvents.events.activate\n ]);\n\n this.getEditButton().on(CustomEvents.events.activate, function(e, data) {\n if (this.isActionEvent()) {\n // Action events cannot be edited on the event form and must be redirected to the module UI.\n $('body').trigger(CalendarEvents.editActionEvent, [this.getEditUrl()]);\n } else {\n // When the edit button is clicked we fire an event for the calendar UI to handle.\n // We don't care how the UI chooses to handle it.\n $('body').trigger(CalendarEvents.editEvent, [this.getEventId()]);\n }\n\n // There is nothing else for us to do so let's hide.\n this.hide();\n\n // We've handled this event so no need to propagate it.\n e.preventDefault();\n e.stopPropagation();\n data.originalEvent.preventDefault();\n data.originalEvent.stopPropagation();\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalEventSummary.TYPE, ModalEventSummary, 'core_calendar/event_summary_modal');\n registered = true;\n }\n\n return ModalEventSummary;\n});\n"],"names":["define","$","Str","Notification","CustomEvents","Modal","ModalRegistry","ModalFactory","ModalEvents","CalendarRepository","CalendarEvents","CalendarCrud","registered","SELECTORS","ModalEventSummary","root","call","this","TYPE","prototype","Object","create","constructor","getEditButton","editButton","getFooter","find","getDeleteButton","deleteButton","getEventId","getBody","attr","getEventTitle","getEventCount","getEditUrl","isActionEvent","registerEventListeners","M","util","js_pending","getRoot","on","bodyRendered","getModal","data","eventTitle","eventId","eventCount","registerRemove","js_complete","bind","deleted","hide","events","activate","e","trigger","editActionEvent","editEvent","preventDefault","stopPropagation","originalEvent","register"],"mappings":";;;;;;;AAsBAA,qCAAO,CACH,SACA,WACA,oBACA,iCACA,aACA,sBACA,qBACA,oBACA,2BACA,uBACA,uBAEJ,SACIC,EACAC,IACAC,aACAC,aACAC,MACAC,cACAC,aACAC,YACAC,mBACAC,eACAC,kBAGIC,YAAa,EACbC,eACM,0CADNA,sBAEa,uBAFbA,wBAGe,yBAQfC,kBAAoB,SAASC,MAC7BV,MAAMW,KAAKC,KAAMF,cAGrBD,kBAAkBI,KAAO,+BACzBJ,kBAAkBK,UAAYC,OAAOC,OAAOhB,MAAMc,YACtBG,YAAcR,kBAS1CA,kBAAkBK,UAAUI,cAAgB,uBACV,IAAnBN,KAAKO,kBACPA,WAAaP,KAAKQ,YAAYC,KAAKb,wBAGrCI,KAAKO,YAUhBV,kBAAkBK,UAAUQ,gBAAkB,uBACV,IAArBV,KAAKW,oBACPA,aAAeX,KAAKQ,YAAYC,KAAKb,0BAGvCI,KAAKW,cAWhBd,kBAAkBK,UAAUU,WAAa,kBAC9BZ,KAAKa,UAAUJ,KAAKb,gBAAgBkB,KAAK,kBAWpDjB,kBAAkBK,UAAUa,cAAgB,kBACjCf,KAAKa,UAAUJ,KAAKb,gBAAgBkB,KAAK,qBAWpDjB,kBAAkBK,UAAUc,cAAgB,kBACjChB,KAAKa,UAAUJ,KAAKb,gBAAgBkB,KAAK,qBASpDjB,kBAAkBK,UAAUe,WAAa,kBAC9BjB,KAAKa,UAAUJ,KAAKb,gBAAgBkB,KAAK,kBASpDjB,kBAAkBK,UAAUgB,cAAgB,iBACiC,QAAjElB,KAAKa,UAAUJ,KAAKb,gBAAgBkB,KAAK,sBAQrDjB,kBAAkBK,UAAUiB,uBAAyB,WAEjD/B,MAAMc,UAAUiB,uBAAuBpB,KAAKC,MAI5CoB,EAAEC,KAAKC,WAAW,wEACbC,UAAUC,GAAGjC,YAAYkC,aAAc,gBACnCC,WAAWC,KAAK,CACjBC,WAAY5B,KAAKe,gBACjBc,QAAS7B,KAAKY,aACdkB,WAAY9B,KAAKgB,kBAEpBF,KAAK,YAAa,SACnBpB,aAAaqC,eAAe/B,KAAK0B,YACjCN,EAAEC,KAAKW,YAAY,oEACrBC,KAAKjC,OAEPhB,EAAE,QAAQwC,GAAG/B,eAAeyC,QAAS,gBAE5BC,QACPF,KAAKjC,OAEPb,aAAaJ,OAAOiB,KAAKM,gBAAiB,CACtCnB,aAAaiD,OAAOC,gBAGnB/B,gBAAgBkB,GAAGrC,aAAaiD,OAAOC,SAAU,SAASC,EAAGX,MAC1D3B,KAAKkB,gBAELlC,EAAE,QAAQuD,QAAQ9C,eAAe+C,gBAAiB,CAACxC,KAAKiB,eAIxDjC,EAAE,QAAQuD,QAAQ9C,eAAegD,UAAW,CAACzC,KAAKY,oBAIjDuB,OAGLG,EAAEI,iBACFJ,EAAEK,kBACFhB,KAAKiB,cAAcF,iBACnBf,KAAKiB,cAAcD,mBACrBV,KAAKjC,QAKNL,aACDN,cAAcwD,SAAShD,kBAAkBI,KAAMJ,kBAAmB,qCAClEF,YAAa,GAGVE"} \ No newline at end of file +{"version":3,"file":"summary_modal.min.js","sources":["../src/summary_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 * A javascript module to handle summary modal.\n *\n * @module core_calendar/summary_modal\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/str',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_registry',\n 'core/modal_factory',\n 'core/modal_events',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/crud',\n],\nfunction(\n $,\n Str,\n Notification,\n CustomEvents,\n Modal,\n ModalRegistry,\n ModalFactory,\n ModalEvents,\n CalendarRepository,\n CalendarEvents,\n CalendarCrud\n) {\n\n var registered = false;\n var SELECTORS = {\n ROOT: \"[data-region='summary-modal-container']\",\n EDIT_BUTTON: '[data-action=\"edit\"]',\n DELETE_BUTTON: '[data-action=\"delete\"]',\n };\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var ModalEventSummary = function(root) {\n Modal.call(this, root);\n };\n\n ModalEventSummary.TYPE = 'core_calendar-event_summary';\n ModalEventSummary.prototype = Object.create(Modal.prototype);\n ModalEventSummary.prototype.constructor = ModalEventSummary;\n\n /**\n * Get the edit button element from the footer. The button is cached\n * as it's not expected to change.\n *\n * @method getEditButton\n * @return {object} button element\n */\n ModalEventSummary.prototype.getEditButton = function() {\n if (typeof this.editButton == 'undefined') {\n this.editButton = this.getFooter().find(SELECTORS.EDIT_BUTTON);\n }\n\n return this.editButton;\n };\n\n /**\n * Get the delete button element from the footer. The button is cached\n * as it's not expected to change.\n *\n * @method getDeleteButton\n * @return {object} button element\n */\n ModalEventSummary.prototype.getDeleteButton = function() {\n if (typeof this.deleteButton == 'undefined') {\n this.deleteButton = this.getFooter().find(SELECTORS.DELETE_BUTTON);\n }\n\n return this.deleteButton;\n };\n\n /**\n * Get the id for the event being shown in this modal. This value is\n * not cached because it will change depending on which event is\n * being displayed.\n *\n * @method getEventId\n * @return {int}\n */\n ModalEventSummary.prototype.getEventId = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-event-id');\n };\n\n /**\n * Get the title for the event being shown in this modal. This value is\n * not cached because it will change depending on which event is\n * being displayed.\n *\n * @method getEventTitle\n * @return {String}\n */\n ModalEventSummary.prototype.getEventTitle = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-event-title');\n };\n\n /**\n * Get the number of events in the series for the event being shown in\n * this modal. This value is not cached because it will change\n * depending on which event is being displayed.\n *\n * @method getEventCount\n * @return {int}\n */\n ModalEventSummary.prototype.getEventCount = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-event-count');\n };\n\n /**\n * Get the url for the event being shown in this modal.\n *\n * @method getEventUrl\n * @return {String}\n */\n ModalEventSummary.prototype.getEditUrl = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-edit-url');\n };\n\n /**\n * Is this an action event.\n *\n * @method getEventUrl\n * @return {String}\n */\n ModalEventSummary.prototype.isActionEvent = function() {\n return (this.getBody().find(SELECTORS.ROOT).attr('data-action-event') == 'true');\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalEventSummary.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n // We have to wait for the modal to finish rendering in order to ensure that\n // the data-event-title property is available to use as the modal title.\n M.util.js_pending('core_calendar/summary_modal:registerEventListeners:bodyRendered');\n this.getRoot().on(ModalEvents.bodyRendered, function() {\n this.getModal().data({\n eventTitle: this.getEventTitle(),\n eventId: this.getEventId(),\n eventCount: this.getEventCount(),\n })\n .attr('data-type', 'event');\n CalendarCrud.registerRemove(this.getModal());\n M.util.js_complete('core_calendar/summary_modal:registerEventListeners:bodyRendered');\n }.bind(this));\n\n $('body').on(CalendarEvents.deleted, function() {\n // Close the dialogue on delete.\n this.hide();\n }.bind(this));\n\n CustomEvents.define(this.getEditButton(), [\n CustomEvents.events.activate\n ]);\n\n this.getEditButton().on(CustomEvents.events.activate, function(e, data) {\n if (this.isActionEvent()) {\n // Action events cannot be edited on the event form and must be redirected to the module UI.\n $('body').trigger(CalendarEvents.editActionEvent, [this.getEditUrl()]);\n } else {\n // When the edit button is clicked we fire an event for the calendar UI to handle.\n // We don't care how the UI chooses to handle it.\n $('body').trigger(CalendarEvents.editEvent, [this.getEventId()]);\n }\n\n // There is nothing else for us to do so let's hide.\n this.hide();\n\n // We've handled this event so no need to propagate it.\n e.preventDefault();\n e.stopPropagation();\n data.originalEvent.preventDefault();\n data.originalEvent.stopPropagation();\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalEventSummary.TYPE, ModalEventSummary, 'core_calendar/event_summary_modal');\n registered = true;\n }\n\n return ModalEventSummary;\n});\n"],"names":["define","$","Str","Notification","CustomEvents","Modal","ModalRegistry","ModalFactory","ModalEvents","CalendarRepository","CalendarEvents","CalendarCrud","registered","SELECTORS","ModalEventSummary","root","call","this","TYPE","prototype","Object","create","constructor","getEditButton","editButton","getFooter","find","getDeleteButton","deleteButton","getEventId","getBody","attr","getEventTitle","getEventCount","getEditUrl","isActionEvent","registerEventListeners","M","util","js_pending","getRoot","on","bodyRendered","getModal","data","eventTitle","eventId","eventCount","registerRemove","js_complete","bind","deleted","hide","events","activate","e","trigger","editActionEvent","editEvent","preventDefault","stopPropagation","originalEvent","register"],"mappings":";;;;;;;AAsBAA,OAAM,8BAAC,CACH,SACA,WACA,oBACA,iCACA,aACA,sBACA,qBACA,oBACA,2BACA,uBACA,uBAEJ,SACIC,EACAC,IACAC,aACAC,aACAC,MACAC,cACAC,aACAC,YACAC,mBACAC,eACAC,cAGIC,IAAAA,YAAa,EACbC,eACM,0CADNA,sBAEa,uBAFbA,wBAGe,yBAQfC,kBAAoB,SAASC,MAC7BV,MAAMW,KAAKC,KAAMF,KACpB,EAwJD,OAtJAD,kBAAkBI,KAAO,+BACzBJ,kBAAkBK,UAAYC,OAAOC,OAAOhB,MAAMc,YACtBG,YAAcR,kBAS1CA,kBAAkBK,UAAUI,cAAgB,WAKxC,YAJ8B,IAAnBN,KAAKO,aACPA,KAAAA,WAAaP,KAAKQ,YAAYC,KAAKb,wBAGrCI,KAAKO,UACf,EASDV,kBAAkBK,UAAUQ,gBAAkB,WAK1C,YAJgC,IAArBV,KAAKW,eACPA,KAAAA,aAAeX,KAAKQ,YAAYC,KAAKb,0BAGvCI,KAAKW,YACf,EAUDd,kBAAkBK,UAAUU,WAAa,WACrC,OAAOZ,KAAKa,UAAUJ,KAAKb,gBAAgBkB,KAAK,gBACnD,EAUDjB,kBAAkBK,UAAUa,cAAgB,WACxC,OAAOf,KAAKa,UAAUJ,KAAKb,gBAAgBkB,KAAK,mBACnD,EAUDjB,kBAAkBK,UAAUc,cAAgB,WACxC,OAAOhB,KAAKa,UAAUJ,KAAKb,gBAAgBkB,KAAK,mBACnD,EAQDjB,kBAAkBK,UAAUe,WAAa,WACrC,OAAOjB,KAAKa,UAAUJ,KAAKb,gBAAgBkB,KAAK,gBACnD,EAQDjB,kBAAkBK,UAAUgB,cAAgB,WACxC,MAAyE,QAAjElB,KAAKa,UAAUJ,KAAKb,gBAAgBkB,KAAK,oBACpD,EAODjB,kBAAkBK,UAAUiB,uBAAyB,WAEjD/B,MAAMc,UAAUiB,uBAAuBpB,KAAKC,MAI5CoB,EAAEC,KAAKC,WAAW,mEACbC,KAAAA,UAAUC,GAAGjC,YAAYkC,aAAc,WACnCC,KAAAA,WAAWC,KAAK,CACjBC,WAAY5B,KAAKe,gBACjBc,QAAS7B,KAAKY,aACdkB,WAAY9B,KAAKgB,kBAEpBF,KAAK,YAAa,SACnBpB,aAAaqC,eAAe/B,KAAK0B,YACjCN,EAAEC,KAAKW,YAAY,kEACtB,EAACC,KAAKjC,OAEPhB,EAAE,QAAQwC,GAAG/B,eAAeyC,QAAS,WAEjClC,KAAKmC,MACR,EAACF,KAAKjC,OAEPb,aAAaJ,OAAOiB,KAAKM,gBAAiB,CACtCnB,aAAaiD,OAAOC,WAGxBrC,KAAKM,gBAAgBkB,GAAGrC,aAAaiD,OAAOC,SAAU,SAASC,EAAGX,MAC1D3B,KAAKkB,gBAELlC,EAAE,QAAQuD,QAAQ9C,eAAe+C,gBAAiB,CAACxC,KAAKiB,eAIxDjC,EAAE,QAAQuD,QAAQ9C,eAAegD,UAAW,CAACzC,KAAKY,eAItDZ,KAAKmC,OAGLG,EAAEI,iBACFJ,EAAEK,kBACFhB,KAAKiB,cAAcF,iBACnBf,KAAKiB,cAAcD,iBACtB,EAACV,KAAKjC,MACV,EAIIL,aACDN,cAAcwD,SAAShD,kBAAkBI,KAAMJ,kBAAmB,qCAClEF,YAAa,GAGVE,iBACV"} \ No newline at end of file diff --git a/calendar/amd/build/view_manager.min.js b/calendar/amd/build/view_manager.min.js index 306794a3cce..88f57493f7f 100644 --- a/calendar/amd/build/view_manager.min.js +++ b/calendar/amd/build/view_manager.min.js @@ -5,6 +5,6 @@ function _typeof(obj){return _typeof="function"==typeof Symbol&&"symbol"==typeof * @module core_calendar/view_manager * @copyright 2017 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.reloadCurrentUpcoming=_exports.reloadCurrentMonth=_exports.reloadCurrentDay=_exports.refreshMonthContent=_exports.refreshDayContent=_exports.init=_exports.changeMonth=_exports.changeDay=void 0,_jquery=_interopRequireDefault(_jquery),_templates=_interopRequireDefault(_templates),_notification=_interopRequireDefault(_notification),CalendarRepository=_interopRequireWildcard(CalendarRepository),_events=_interopRequireDefault(_events),CalendarSelectors=_interopRequireWildcard(CalendarSelectors),_modal_factory=_interopRequireDefault(_modal_factory),_modal_events=_interopRequireDefault(_modal_events),_summary_modal=_interopRequireDefault(_summary_modal),_custom_interaction_events=_interopRequireDefault(_custom_interaction_events),_pending=_interopRequireDefault(_pending);var refreshMonthContent=function(root,year,month,courseId,categoryId){var target=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,template=arguments.length>6&&void 0!==arguments[6]?arguments[6]:"",day=arguments.length>7&&void 0!==arguments[7]?arguments[7]:1;startLoading(root),target=target||root.find(CalendarSelectors.wrapper),template=template||root.attr("data-template"),M.util.js_pending([root.get("id"),year,month,courseId].join("-"));var includenavigation=root.data("includenavigation"),mini=root.data("mini");return CalendarRepository.getCalendarMonthData(year,month,courseId,categoryId,includenavigation,mini,day).then((function(context){return context.viewingmonth=!0,_templates.default.render(template,context)})).then((function(html,js){return _templates.default.replaceNode(target,html,js)})).then((function(){document.querySelector("body").dispatchEvent(new CustomEvent(_events.default.viewUpdated))})).always((function(){return M.util.js_complete([root.get("id"),year,month,courseId].join("-")),stopLoading(root)})).fail(_notification.default.exception)};_exports.refreshMonthContent=refreshMonthContent;var changeMonth=function(root,url,year,month,courseId,categoryId){var day=arguments.length>6&&void 0!==arguments[6]?arguments[6]:1;return refreshMonthContent(root,year,month,courseId,categoryId,null,"",day).then((function(){url.length&&"#"!==url&&window.history.pushState({},"",url);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return args})).then((function(){(0,_jquery.default)("body").trigger(_events.default.monthChanged,[year,month,courseId,categoryId]);for(var _len2=arguments.length,args=new Array(_len2),_key2=0;_key2<_len2;_key2++)args[_key2]=arguments[_key2];return args}))};_exports.changeMonth=changeMonth;_exports.reloadCurrentMonth=function(root){var courseId=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,categoryId=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,year=root.find(CalendarSelectors.wrapper).data("year"),month=root.find(CalendarSelectors.wrapper).data("month"),day=root.find(CalendarSelectors.wrapper).data("day");return courseId=courseId||root.find(CalendarSelectors.wrapper).data("courseid"),categoryId=categoryId||root.find(CalendarSelectors.wrapper).data("categoryid"),refreshMonthContent(root,year,month,courseId,categoryId,null,"",day)};var refreshDayContent=function(root,year,month,day,courseId,categoryId){var target=arguments.length>6&&void 0!==arguments[6]?arguments[6]:null,template=arguments.length>7&&void 0!==arguments[7]?arguments[7]:"";startLoading(root),target&&0!=target.length||(target=root.find(CalendarSelectors.wrapper)),template=template||root.attr("data-template"),M.util.js_pending([root.get("id"),year,month,day,courseId,categoryId].join("-"));var includenavigation=root.data("includenavigation");return CalendarRepository.getCalendarDayData(year,month,day,courseId,categoryId,includenavigation).then((function(context){return context.viewingday=!0,_templates.default.render(template,context)})).then((function(html,js){return _templates.default.replaceNode(target,html,js)})).then((function(){document.querySelector("body").dispatchEvent(new CustomEvent(_events.default.viewUpdated))})).always((function(){return M.util.js_complete([root.get("id"),year,month,day,courseId,categoryId].join("-")),stopLoading(root)})).fail(_notification.default.exception)};_exports.refreshDayContent=refreshDayContent;_exports.reloadCurrentDay=function(root){var courseId=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,categoryId=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,wrapper=root.find(CalendarSelectors.wrapper),year=wrapper.data("year"),month=wrapper.data("month"),day=wrapper.data("day");return courseId=courseId||root.find(CalendarSelectors.wrapper).data("courseid"),categoryId=categoryId||root.find(CalendarSelectors.wrapper).data("categoryid"),refreshDayContent(root,year,month,day,courseId,categoryId)};var changeDay=function(root,url,year,month,day,courseId,categoryId){return refreshDayContent(root,year,month,day,courseId,categoryId).then((function(){url.length&&"#"!==url&&window.history.pushState({},"",url);for(var _len3=arguments.length,args=new Array(_len3),_key3=0;_key3<_len3;_key3++)args[_key3]=arguments[_key3];return args})).then((function(){(0,_jquery.default)("body").trigger(_events.default.dayChanged,[year,month,courseId,categoryId]);for(var _len4=arguments.length,args=new Array(_len4),_key4=0;_key4<_len4;_key4++)args[_key4]=arguments[_key4];return args}))};_exports.changeDay=changeDay;var startLoading=function(root){root.find(CalendarSelectors.containers.loadingIcon).removeClass("hidden")},stopLoading=function(root){root.find(CalendarSelectors.containers.loadingIcon).addClass("hidden")},reloadCurrentUpcoming=function(root){var courseId=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,categoryId=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,target=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,template=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"";return startLoading(root),target=target||root.find(CalendarSelectors.wrapper),template=template||root.attr("data-template"),courseId=courseId||root.find(CalendarSelectors.wrapper).data("courseid"),categoryId=categoryId||root.find(CalendarSelectors.wrapper).data("categoryid"),CalendarRepository.getCalendarUpcomingData(courseId,categoryId).then((function(context){return context.viewingupcoming=!0,_templates.default.render(template,context)})).then((function(html,js){return _templates.default.replaceNode(target,html,js)})).then((function(){document.querySelector("body").dispatchEvent(new CustomEvent(_events.default.viewUpdated))})).always((function(){return stopLoading(root)})).fail(_notification.default.exception)};_exports.reloadCurrentUpcoming=reloadCurrentUpcoming;var renderEventSummaryModal=function(eventId){var pendingPromise=new _pending.default("core_calendar/view_manager:renderEventSummaryModal");return CalendarRepository.getEventById(eventId).then((function(getEventResponse){if(!getEventResponse.event)throw new Error("Error encountered while trying to fetch calendar event with ID: "+eventId);return getEventResponse.event})).then((function(eventData){var eventType,modalParams={title:eventData.name,type:_summary_modal.default.TYPE,body:_templates.default.render("core_calendar/event_summary_body",eventData),templateContext:{canedit:eventData.canedit,candelete:eventData.candelete,headerclasses:(eventType=eventData.normalisedeventtype,"calendar_event_"+eventType),isactionevent:eventData.isactionevent,url:eventData.url,action:eventData.action}};return _modal_factory.default.create(modalParams)})).then((function(modal){return modal.getRoot().on(_modal_events.default.hidden,(function(){modal.destroy()})),modal.show(),modal})).then((function(modal){return pendingPromise.resolve(),modal})).catch(_notification.default.exception)};_exports.init=function(root,view){!function(root){(root=(0,_jquery.default)(root)).on("click",CalendarSelectors.links.eventLink,(function(e){var target=e.target,eventLink=null,eventId=null,pendingPromise=new _pending.default("core_calendar/view_manager:eventLink:click");(eventId=(eventLink=target.matches(CalendarSelectors.actions.viewEvent)?target:target.closest(CalendarSelectors.actions.viewEvent))?eventLink.dataset.eventId:target.querySelector(CalendarSelectors.actions.viewEvent).dataset.eventId)?(e.preventDefault(),e.stopPropagation(),renderEventSummaryModal(eventId).then(pendingPromise.resolve).catch()):pendingPromise.resolve()})),root.on("click",CalendarSelectors.links.navLink,(function(e){var wrapper=root.find(CalendarSelectors.wrapper),view=wrapper.data("view"),courseId=wrapper.data("courseid"),categoryId=wrapper.data("categoryid"),link=e.currentTarget;"month"===view?(changeMonth(root,link.href,link.dataset.year,link.dataset.month,courseId,categoryId,link.dataset.day),e.preventDefault()):"day"===view&&(changeDay(root,link.href,link.dataset.year,link.dataset.month,link.dataset.day,courseId,categoryId),e.preventDefault())}));var viewSelector=root.find(CalendarSelectors.viewSelector);_custom_interaction_events.default.define(viewSelector,[_custom_interaction_events.default.events.activate]),viewSelector.on(_custom_interaction_events.default.events.activate,(function(e){e.preventDefault();var option=e.target;if(!option.classList.contains("active")){var view=option.dataset.view,year=option.dataset.year,month=option.dataset.month,day=option.dataset.day,courseId=option.dataset.courseid,categoryId=option.dataset.categoryid;"month"==view?refreshMonthContent(root,year,month,courseId,categoryId,root,"core_calendar/calendar_month",day).then((function(){return window.history.pushState({},"","?view=month")})).fail(_notification.default.exception):"day"==view?refreshDayContent(root,year,month,day,courseId,categoryId,root,"core_calendar/calendar_day").then((function(){return window.history.pushState({},"","?view=day")})).fail(_notification.default.exception):"upcoming"==view&&reloadCurrentUpcoming(root,courseId,categoryId,root,"core_calendar/calendar_upcoming").then((function(){return window.history.pushState({},"","?view=upcoming")})).fail(_notification.default.exception)}}))}(root)}})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.reloadCurrentUpcoming=_exports.reloadCurrentMonth=_exports.reloadCurrentDay=_exports.refreshMonthContent=_exports.refreshDayContent=_exports.init=_exports.changeMonth=_exports.changeDay=void 0,_jquery=_interopRequireDefault(_jquery),_templates=_interopRequireDefault(_templates),_notification=_interopRequireDefault(_notification),CalendarRepository=_interopRequireWildcard(CalendarRepository),_events=_interopRequireDefault(_events),CalendarSelectors=_interopRequireWildcard(CalendarSelectors),_modal_factory=_interopRequireDefault(_modal_factory),_modal_events=_interopRequireDefault(_modal_events),_summary_modal=_interopRequireDefault(_summary_modal),_custom_interaction_events=_interopRequireDefault(_custom_interaction_events),_pending=_interopRequireDefault(_pending);var refreshMonthContent=function(root,year,month,courseId,categoryId){var target=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,template=arguments.length>6&&void 0!==arguments[6]?arguments[6]:"",day=arguments.length>7&&void 0!==arguments[7]?arguments[7]:1;startLoading(root),target=target||root.find(CalendarSelectors.wrapper),template=template||root.attr("data-template"),M.util.js_pending([root.get("id"),year,month,courseId].join("-"));var includenavigation=root.data("includenavigation"),mini=root.data("mini");return CalendarRepository.getCalendarMonthData(year,month,courseId,categoryId,includenavigation,mini,day).then((function(context){return context.viewingmonth=!0,_templates.default.render(template,context)})).then((function(html,js){return _templates.default.replaceNode(target,html,js)})).then((function(){document.querySelector("body").dispatchEvent(new CustomEvent(_events.default.viewUpdated))})).always((function(){return M.util.js_complete([root.get("id"),year,month,courseId].join("-")),stopLoading(root)})).fail(_notification.default.exception)};_exports.refreshMonthContent=refreshMonthContent;var changeMonth=function(root,url,year,month,courseId,categoryId){return refreshMonthContent(root,year,month,courseId,categoryId,null,"",arguments.length>6&&void 0!==arguments[6]?arguments[6]:1).then((function(){url.length&&"#"!==url&&window.history.pushState({},"",url);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return args})).then((function(){(0,_jquery.default)("body").trigger(_events.default.monthChanged,[year,month,courseId,categoryId]);for(var _len2=arguments.length,args=new Array(_len2),_key2=0;_key2<_len2;_key2++)args[_key2]=arguments[_key2];return args}))};_exports.changeMonth=changeMonth;_exports.reloadCurrentMonth=function(root){var courseId=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,categoryId=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,year=root.find(CalendarSelectors.wrapper).data("year"),month=root.find(CalendarSelectors.wrapper).data("month"),day=root.find(CalendarSelectors.wrapper).data("day");return courseId=courseId||root.find(CalendarSelectors.wrapper).data("courseid"),categoryId=categoryId||root.find(CalendarSelectors.wrapper).data("categoryid"),refreshMonthContent(root,year,month,courseId,categoryId,null,"",day)};var refreshDayContent=function(root,year,month,day,courseId,categoryId){var target=arguments.length>6&&void 0!==arguments[6]?arguments[6]:null,template=arguments.length>7&&void 0!==arguments[7]?arguments[7]:"";startLoading(root),target&&0!=target.length||(target=root.find(CalendarSelectors.wrapper)),template=template||root.attr("data-template"),M.util.js_pending([root.get("id"),year,month,day,courseId,categoryId].join("-"));var includenavigation=root.data("includenavigation");return CalendarRepository.getCalendarDayData(year,month,day,courseId,categoryId,includenavigation).then((function(context){return context.viewingday=!0,_templates.default.render(template,context)})).then((function(html,js){return _templates.default.replaceNode(target,html,js)})).then((function(){document.querySelector("body").dispatchEvent(new CustomEvent(_events.default.viewUpdated))})).always((function(){return M.util.js_complete([root.get("id"),year,month,day,courseId,categoryId].join("-")),stopLoading(root)})).fail(_notification.default.exception)};_exports.refreshDayContent=refreshDayContent;_exports.reloadCurrentDay=function(root){var courseId=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,categoryId=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,wrapper=root.find(CalendarSelectors.wrapper),year=wrapper.data("year"),month=wrapper.data("month"),day=wrapper.data("day");return courseId=courseId||root.find(CalendarSelectors.wrapper).data("courseid"),categoryId=categoryId||root.find(CalendarSelectors.wrapper).data("categoryid"),refreshDayContent(root,year,month,day,courseId,categoryId)};var changeDay=function(root,url,year,month,day,courseId,categoryId){return refreshDayContent(root,year,month,day,courseId,categoryId).then((function(){url.length&&"#"!==url&&window.history.pushState({},"",url);for(var _len3=arguments.length,args=new Array(_len3),_key3=0;_key3<_len3;_key3++)args[_key3]=arguments[_key3];return args})).then((function(){(0,_jquery.default)("body").trigger(_events.default.dayChanged,[year,month,courseId,categoryId]);for(var _len4=arguments.length,args=new Array(_len4),_key4=0;_key4<_len4;_key4++)args[_key4]=arguments[_key4];return args}))};_exports.changeDay=changeDay;var startLoading=function(root){root.find(CalendarSelectors.containers.loadingIcon).removeClass("hidden")},stopLoading=function(root){root.find(CalendarSelectors.containers.loadingIcon).addClass("hidden")},reloadCurrentUpcoming=function(root){var courseId=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,categoryId=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,target=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,template=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"";return startLoading(root),target=target||root.find(CalendarSelectors.wrapper),template=template||root.attr("data-template"),courseId=courseId||root.find(CalendarSelectors.wrapper).data("courseid"),categoryId=categoryId||root.find(CalendarSelectors.wrapper).data("categoryid"),CalendarRepository.getCalendarUpcomingData(courseId,categoryId).then((function(context){return context.viewingupcoming=!0,_templates.default.render(template,context)})).then((function(html,js){return _templates.default.replaceNode(target,html,js)})).then((function(){document.querySelector("body").dispatchEvent(new CustomEvent(_events.default.viewUpdated))})).always((function(){return stopLoading(root)})).fail(_notification.default.exception)};_exports.reloadCurrentUpcoming=reloadCurrentUpcoming;var renderEventSummaryModal=function(eventId){var pendingPromise=new _pending.default("core_calendar/view_manager:renderEventSummaryModal");return CalendarRepository.getEventById(eventId).then((function(getEventResponse){if(!getEventResponse.event)throw new Error("Error encountered while trying to fetch calendar event with ID: "+eventId);return getEventResponse.event})).then((function(eventData){var eventType,modalParams={title:eventData.name,type:_summary_modal.default.TYPE,body:_templates.default.render("core_calendar/event_summary_body",eventData),templateContext:{canedit:eventData.canedit,candelete:eventData.candelete,headerclasses:(eventType=eventData.normalisedeventtype,"calendar_event_"+eventType),isactionevent:eventData.isactionevent,url:eventData.url,action:eventData.action}};return _modal_factory.default.create(modalParams)})).then((function(modal){return modal.getRoot().on(_modal_events.default.hidden,(function(){modal.destroy()})),modal.show(),modal})).then((function(modal){return pendingPromise.resolve(),modal})).catch(_notification.default.exception)};_exports.init=function(root,view){!function(root){(root=(0,_jquery.default)(root)).on("click",CalendarSelectors.links.eventLink,(function(e){var target=e.target,eventLink=null,eventId=null,pendingPromise=new _pending.default("core_calendar/view_manager:eventLink:click");(eventId=(eventLink=target.matches(CalendarSelectors.actions.viewEvent)?target:target.closest(CalendarSelectors.actions.viewEvent))?eventLink.dataset.eventId:target.querySelector(CalendarSelectors.actions.viewEvent).dataset.eventId)?(e.preventDefault(),e.stopPropagation(),renderEventSummaryModal(eventId).then(pendingPromise.resolve).catch()):pendingPromise.resolve()})),root.on("click",CalendarSelectors.links.navLink,(function(e){var wrapper=root.find(CalendarSelectors.wrapper),view=wrapper.data("view"),courseId=wrapper.data("courseid"),categoryId=wrapper.data("categoryid"),link=e.currentTarget;"month"===view?(changeMonth(root,link.href,link.dataset.year,link.dataset.month,courseId,categoryId,link.dataset.day),e.preventDefault()):"day"===view&&(changeDay(root,link.href,link.dataset.year,link.dataset.month,link.dataset.day,courseId,categoryId),e.preventDefault())}));var viewSelector=root.find(CalendarSelectors.viewSelector);_custom_interaction_events.default.define(viewSelector,[_custom_interaction_events.default.events.activate]),viewSelector.on(_custom_interaction_events.default.events.activate,(function(e){e.preventDefault();var option=e.target;if(!option.classList.contains("active")){var view=option.dataset.view,year=option.dataset.year,month=option.dataset.month,day=option.dataset.day,courseId=option.dataset.courseid,categoryId=option.dataset.categoryid;"month"==view?refreshMonthContent(root,year,month,courseId,categoryId,root,"core_calendar/calendar_month",day).then((function(){return window.history.pushState({},"","?view=month")})).fail(_notification.default.exception):"day"==view?refreshDayContent(root,year,month,day,courseId,categoryId,root,"core_calendar/calendar_day").then((function(){return window.history.pushState({},"","?view=day")})).fail(_notification.default.exception):"upcoming"==view&&reloadCurrentUpcoming(root,courseId,categoryId,root,"core_calendar/calendar_upcoming").then((function(){return window.history.pushState({},"","?view=upcoming")})).fail(_notification.default.exception)}}))}(root)}})); //# sourceMappingURL=view_manager.min.js.map \ No newline at end of file diff --git a/calendar/amd/build/view_manager.min.js.map b/calendar/amd/build/view_manager.min.js.map index 477da8e9965..4700c31a5ca 100644 --- a/calendar/amd/build/view_manager.min.js.map +++ b/calendar/amd/build/view_manager.min.js.map @@ -1 +1 @@ -{"version":3,"file":"view_manager.min.js","sources":["../src/view_manager.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 javascript module to handler calendar view changes.\n *\n * @module core_calendar/view_manager\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport Templates from 'core/templates';\nimport Notification from 'core/notification';\nimport * as CalendarRepository from 'core_calendar/repository';\nimport CalendarEvents from 'core_calendar/events';\nimport * as CalendarSelectors from 'core_calendar/selectors';\nimport ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport SummaryModal from 'core_calendar/summary_modal';\nimport CustomEvents from 'core/custom_interaction_events';\nimport Pending from 'core/pending';\n\n/**\n * Register event listeners for the module.\n *\n * @param {object} root The root element.\n */\nconst registerEventListeners = (root) => {\n root = $(root);\n\n // Bind click events to event links.\n root.on('click', CalendarSelectors.links.eventLink, (e) => {\n const target = e.target;\n let eventLink = null;\n let eventId = null;\n const pendingPromise = new Pending('core_calendar/view_manager:eventLink:click');\n\n if (target.matches(CalendarSelectors.actions.viewEvent)) {\n eventLink = target;\n } else {\n eventLink = target.closest(CalendarSelectors.actions.viewEvent);\n }\n\n if (eventLink) {\n eventId = eventLink.dataset.eventId;\n } else {\n eventId = target.querySelector(CalendarSelectors.actions.viewEvent).dataset.eventId;\n }\n\n if (eventId) {\n // A link was found. Show the modal.\n\n e.preventDefault();\n // We've handled the event so stop it from bubbling\n // and causing the day click handler to fire.\n e.stopPropagation();\n\n renderEventSummaryModal(eventId)\n .then(pendingPromise.resolve)\n .catch();\n } else {\n pendingPromise.resolve();\n }\n });\n\n root.on('click', CalendarSelectors.links.navLink, (e) => {\n const wrapper = root.find(CalendarSelectors.wrapper);\n const view = wrapper.data('view');\n const courseId = wrapper.data('courseid');\n const categoryId = wrapper.data('categoryid');\n const link = e.currentTarget;\n\n if (view === 'month') {\n changeMonth(root, link.href, link.dataset.year, link.dataset.month, courseId, categoryId, link.dataset.day);\n e.preventDefault();\n } else if (view === 'day') {\n changeDay(root, link.href, link.dataset.year, link.dataset.month, link.dataset.day, courseId, categoryId);\n e.preventDefault();\n }\n });\n\n const viewSelector = root.find(CalendarSelectors.viewSelector);\n CustomEvents.define(viewSelector, [CustomEvents.events.activate]);\n viewSelector.on(\n CustomEvents.events.activate,\n (e) => {\n e.preventDefault();\n\n const option = e.target;\n if (option.classList.contains('active')) {\n return;\n }\n\n const view = option.dataset.view,\n year = option.dataset.year,\n month = option.dataset.month,\n day = option.dataset.day,\n courseId = option.dataset.courseid,\n categoryId = option.dataset.categoryid;\n\n if (view == 'month') {\n refreshMonthContent(root, year, month, courseId, categoryId, root, 'core_calendar/calendar_month', day)\n .then(() => {\n return window.history.pushState({}, '', '?view=month');\n }).fail(Notification.exception);\n } else if (view == 'day') {\n refreshDayContent(root, year, month, day, courseId, categoryId, root, 'core_calendar/calendar_day')\n .then(() => {\n return window.history.pushState({}, '', '?view=day');\n }).fail(Notification.exception);\n } else if (view == 'upcoming') {\n reloadCurrentUpcoming(root, courseId, categoryId, root, 'core_calendar/calendar_upcoming')\n .then(() => {\n return window.history.pushState({}, '', '?view=upcoming');\n }).fail(Notification.exception);\n }\n }\n );\n};\n\n/**\n * Refresh the month content.\n *\n * @param {object} root The root element.\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} courseId The id of the course whose events are shown\n * @param {number} categoryId The id of the category whose events are shown\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @param {string} template The template to be rendered.\n * @param {number} day Day (optional)\n * @return {promise}\n */\nexport const refreshMonthContent = (root, year, month, courseId, categoryId, target = null, template = '', day = 1) => {\n startLoading(root);\n\n target = target || root.find(CalendarSelectors.wrapper);\n template = template || root.attr('data-template');\n M.util.js_pending([root.get('id'), year, month, courseId].join('-'));\n const includenavigation = root.data('includenavigation');\n const mini = root.data('mini');\n return CalendarRepository.getCalendarMonthData(year, month, courseId, categoryId, includenavigation, mini, day)\n .then(context => {\n context.viewingmonth = true;\n return Templates.render(template, context);\n })\n .then((html, js) => {\n return Templates.replaceNode(target, html, js);\n })\n .then(() => {\n document.querySelector('body').dispatchEvent(new CustomEvent(CalendarEvents.viewUpdated));\n return;\n })\n .always(() => {\n M.util.js_complete([root.get('id'), year, month, courseId].join('-'));\n return stopLoading(root);\n })\n .fail(Notification.exception);\n};\n\n/**\n * Handle changes to the current calendar view.\n *\n * @param {object} root The container element\n * @param {string} url The calendar url to be shown\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} courseId The id of the course whose events are shown\n * @param {number} categoryId The id of the category whose events are shown\n * @param {number} day Day (optional)\n * @return {promise}\n */\nexport const changeMonth = (root, url, year, month, courseId, categoryId, day = 1) => {\n return refreshMonthContent(root, year, month, courseId, categoryId, null, '', day)\n .then((...args) => {\n if (url.length && url !== '#') {\n window.history.pushState({}, '', url);\n }\n return args;\n })\n .then((...args) => {\n $('body').trigger(CalendarEvents.monthChanged, [year, month, courseId, categoryId]);\n return args;\n });\n};\n\n/**\n * Reload the current month view data.\n *\n * @param {object} root The container element.\n * @param {number} courseId The course id.\n * @param {number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\nexport const reloadCurrentMonth = (root, courseId = 0, categoryId = 0) => {\n const year = root.find(CalendarSelectors.wrapper).data('year');\n const month = root.find(CalendarSelectors.wrapper).data('month');\n const day = root.find(CalendarSelectors.wrapper).data('day');\n\n courseId = courseId || root.find(CalendarSelectors.wrapper).data('courseid');\n categoryId = categoryId || root.find(CalendarSelectors.wrapper).data('categoryid');\n\n return refreshMonthContent(root, year, month, courseId, categoryId, null, '', day);\n};\n\n\n/**\n * Refresh the day content.\n *\n * @param {object} root The root element.\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} day Day\n * @param {number} courseId The id of the course whose events are shown\n * @param {number} categoryId The id of the category whose events are shown\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @param {string} template The template to be rendered.\n *\n * @return {promise}\n */\nexport const refreshDayContent = (root, year, month, day, courseId, categoryId, target = null, template = '') => {\n startLoading(root);\n\n if (!target || target.length == 0){\n target = root.find(CalendarSelectors.wrapper);\n }\n template = template || root.attr('data-template');\n M.util.js_pending([root.get('id'), year, month, day, courseId, categoryId].join('-'));\n const includenavigation = root.data('includenavigation');\n return CalendarRepository.getCalendarDayData(year, month, day, courseId, categoryId, includenavigation)\n .then((context) => {\n context.viewingday = true;\n return Templates.render(template, context);\n })\n .then((html, js) => {\n return Templates.replaceNode(target, html, js);\n })\n .then(() => {\n document.querySelector('body').dispatchEvent(new CustomEvent(CalendarEvents.viewUpdated));\n return;\n })\n .always(() => {\n M.util.js_complete([root.get('id'), year, month, day, courseId, categoryId].join('-'));\n return stopLoading(root);\n })\n .fail(Notification.exception);\n};\n\n/**\n * Reload the current day view data.\n *\n * @param {object} root The container element.\n * @param {number} courseId The course id.\n * @param {number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\nexport const reloadCurrentDay = (root, courseId = 0, categoryId = 0) => {\n const wrapper = root.find(CalendarSelectors.wrapper);\n const year = wrapper.data('year');\n const month = wrapper.data('month');\n const day = wrapper.data('day');\n\n courseId = courseId || root.find(CalendarSelectors.wrapper).data('courseid');\n categoryId = categoryId || root.find(CalendarSelectors.wrapper).data('categoryid');\n\n return refreshDayContent(root, year, month, day, courseId, categoryId);\n};\n\n/**\n * Handle changes to the current calendar view.\n *\n * @param {object} root The root element.\n * @param {String} url The calendar url to be shown\n * @param {Number} year Year\n * @param {Number} month Month\n * @param {Number} day Day\n * @param {Number} courseId The id of the course whose events are shown\n * @param {Number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\nexport const changeDay = (root, url, year, month, day, courseId, categoryId) => {\n return refreshDayContent(root, year, month, day, courseId, categoryId)\n .then((...args) => {\n if (url.length && url !== '#') {\n window.history.pushState({}, '', url);\n }\n return args;\n })\n .then((...args) => {\n $('body').trigger(CalendarEvents.dayChanged, [year, month, courseId, categoryId]);\n return args;\n });\n};\n\n/**\n * Set the element state to loading.\n *\n * @param {object} root The container element\n * @method startLoading\n */\nconst startLoading = (root) => {\n const loadingIconContainer = root.find(CalendarSelectors.containers.loadingIcon);\n\n loadingIconContainer.removeClass('hidden');\n};\n\n/**\n * Remove the loading state from the element.\n *\n * @param {object} root The container element\n * @method stopLoading\n */\nconst stopLoading = (root) => {\n const loadingIconContainer = root.find(CalendarSelectors.containers.loadingIcon);\n\n loadingIconContainer.addClass('hidden');\n};\n\n/**\n * Reload the current month view data.\n *\n * @param {object} root The container element.\n * @param {number} courseId The course id.\n * @param {number} categoryId The id of the category whose events are shown\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @param {string} template The template to be rendered.\n * @return {promise}\n */\nexport const reloadCurrentUpcoming = (root, courseId = 0, categoryId = 0, target = null, template = '') => {\n startLoading(root);\n\n target = target || root.find(CalendarSelectors.wrapper);\n template = template || root.attr('data-template');\n courseId = courseId || root.find(CalendarSelectors.wrapper).data('courseid');\n categoryId = categoryId || root.find(CalendarSelectors.wrapper).data('categoryid');\n\n return CalendarRepository.getCalendarUpcomingData(courseId, categoryId)\n .then((context) => {\n context.viewingupcoming = true;\n return Templates.render(template, context);\n })\n .then((html, js) => {\n return Templates.replaceNode(target, html, js);\n })\n .then(() => {\n document.querySelector('body').dispatchEvent(new CustomEvent(CalendarEvents.viewUpdated));\n return;\n })\n .always(function() {\n return stopLoading(root);\n })\n .fail(Notification.exception);\n};\n\n/**\n * Get the CSS class to apply for the given event type.\n *\n * @param {string} eventType The calendar event type\n * @return {string}\n */\nconst getEventTypeClassFromType = (eventType) => {\n return 'calendar_event_' + eventType;\n};\n\n/**\n * Render the event summary modal.\n *\n * @param {Number} eventId The calendar event id.\n * @returns {Promise}\n */\nconst renderEventSummaryModal = (eventId) => {\n const pendingPromise = new Pending('core_calendar/view_manager:renderEventSummaryModal');\n\n // Calendar repository promise.\n return CalendarRepository.getEventById(eventId)\n .then((getEventResponse) => {\n if (!getEventResponse.event) {\n throw new Error('Error encountered while trying to fetch calendar event with ID: ' + eventId);\n }\n\n return getEventResponse.event;\n })\n .then(eventData => {\n // Build the modal parameters from the event data.\n const modalParams = {\n title: eventData.name,\n type: SummaryModal.TYPE,\n body: Templates.render('core_calendar/event_summary_body', eventData),\n templateContext: {\n canedit: eventData.canedit,\n candelete: eventData.candelete,\n headerclasses: getEventTypeClassFromType(eventData.normalisedeventtype),\n isactionevent: eventData.isactionevent,\n url: eventData.url,\n action: eventData.action\n }\n };\n\n // Create the modal.\n return ModalFactory.create(modalParams);\n })\n .then(modal => {\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Finally, render the modal!\n modal.show();\n\n return modal;\n })\n .then(modal => {\n pendingPromise.resolve();\n\n return modal;\n })\n .catch(Notification.exception);\n};\n\nexport const init = (root, view) => {\n registerEventListeners(root, view);\n};\n"],"names":["refreshMonthContent","root","year","month","courseId","categoryId","target","template","day","startLoading","find","CalendarSelectors","wrapper","attr","M","util","js_pending","get","join","includenavigation","data","mini","CalendarRepository","getCalendarMonthData","then","context","viewingmonth","Templates","render","html","js","replaceNode","document","querySelector","dispatchEvent","CustomEvent","CalendarEvents","viewUpdated","always","js_complete","stopLoading","fail","Notification","exception","changeMonth","url","length","window","history","pushState","args","trigger","monthChanged","refreshDayContent","getCalendarDayData","viewingday","changeDay","dayChanged","containers","loadingIcon","removeClass","addClass","reloadCurrentUpcoming","getCalendarUpcomingData","viewingupcoming","renderEventSummaryModal","eventId","pendingPromise","Pending","getEventById","getEventResponse","event","Error","eventData","eventType","modalParams","title","name","type","SummaryModal","TYPE","body","templateContext","canedit","candelete","headerclasses","normalisedeventtype","isactionevent","action","ModalFactory","create","modal","getRoot","on","ModalEvents","hidden","destroy","show","resolve","catch","view","links","eventLink","e","matches","actions","viewEvent","closest","dataset","preventDefault","stopPropagation","navLink","link","currentTarget","href","viewSelector","define","CustomEvents","events","activate","option","classList","contains","courseid","categoryid","registerEventListeners"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"view_manager.min.js","sources":["../src/view_manager.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 javascript module to handler calendar view changes.\n *\n * @module core_calendar/view_manager\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport Templates from 'core/templates';\nimport Notification from 'core/notification';\nimport * as CalendarRepository from 'core_calendar/repository';\nimport CalendarEvents from 'core_calendar/events';\nimport * as CalendarSelectors from 'core_calendar/selectors';\nimport ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport SummaryModal from 'core_calendar/summary_modal';\nimport CustomEvents from 'core/custom_interaction_events';\nimport Pending from 'core/pending';\n\n/**\n * Register event listeners for the module.\n *\n * @param {object} root The root element.\n */\nconst registerEventListeners = (root) => {\n root = $(root);\n\n // Bind click events to event links.\n root.on('click', CalendarSelectors.links.eventLink, (e) => {\n const target = e.target;\n let eventLink = null;\n let eventId = null;\n const pendingPromise = new Pending('core_calendar/view_manager:eventLink:click');\n\n if (target.matches(CalendarSelectors.actions.viewEvent)) {\n eventLink = target;\n } else {\n eventLink = target.closest(CalendarSelectors.actions.viewEvent);\n }\n\n if (eventLink) {\n eventId = eventLink.dataset.eventId;\n } else {\n eventId = target.querySelector(CalendarSelectors.actions.viewEvent).dataset.eventId;\n }\n\n if (eventId) {\n // A link was found. Show the modal.\n\n e.preventDefault();\n // We've handled the event so stop it from bubbling\n // and causing the day click handler to fire.\n e.stopPropagation();\n\n renderEventSummaryModal(eventId)\n .then(pendingPromise.resolve)\n .catch();\n } else {\n pendingPromise.resolve();\n }\n });\n\n root.on('click', CalendarSelectors.links.navLink, (e) => {\n const wrapper = root.find(CalendarSelectors.wrapper);\n const view = wrapper.data('view');\n const courseId = wrapper.data('courseid');\n const categoryId = wrapper.data('categoryid');\n const link = e.currentTarget;\n\n if (view === 'month') {\n changeMonth(root, link.href, link.dataset.year, link.dataset.month, courseId, categoryId, link.dataset.day);\n e.preventDefault();\n } else if (view === 'day') {\n changeDay(root, link.href, link.dataset.year, link.dataset.month, link.dataset.day, courseId, categoryId);\n e.preventDefault();\n }\n });\n\n const viewSelector = root.find(CalendarSelectors.viewSelector);\n CustomEvents.define(viewSelector, [CustomEvents.events.activate]);\n viewSelector.on(\n CustomEvents.events.activate,\n (e) => {\n e.preventDefault();\n\n const option = e.target;\n if (option.classList.contains('active')) {\n return;\n }\n\n const view = option.dataset.view,\n year = option.dataset.year,\n month = option.dataset.month,\n day = option.dataset.day,\n courseId = option.dataset.courseid,\n categoryId = option.dataset.categoryid;\n\n if (view == 'month') {\n refreshMonthContent(root, year, month, courseId, categoryId, root, 'core_calendar/calendar_month', day)\n .then(() => {\n return window.history.pushState({}, '', '?view=month');\n }).fail(Notification.exception);\n } else if (view == 'day') {\n refreshDayContent(root, year, month, day, courseId, categoryId, root, 'core_calendar/calendar_day')\n .then(() => {\n return window.history.pushState({}, '', '?view=day');\n }).fail(Notification.exception);\n } else if (view == 'upcoming') {\n reloadCurrentUpcoming(root, courseId, categoryId, root, 'core_calendar/calendar_upcoming')\n .then(() => {\n return window.history.pushState({}, '', '?view=upcoming');\n }).fail(Notification.exception);\n }\n }\n );\n};\n\n/**\n * Refresh the month content.\n *\n * @param {object} root The root element.\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} courseId The id of the course whose events are shown\n * @param {number} categoryId The id of the category whose events are shown\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @param {string} template The template to be rendered.\n * @param {number} day Day (optional)\n * @return {promise}\n */\nexport const refreshMonthContent = (root, year, month, courseId, categoryId, target = null, template = '', day = 1) => {\n startLoading(root);\n\n target = target || root.find(CalendarSelectors.wrapper);\n template = template || root.attr('data-template');\n M.util.js_pending([root.get('id'), year, month, courseId].join('-'));\n const includenavigation = root.data('includenavigation');\n const mini = root.data('mini');\n return CalendarRepository.getCalendarMonthData(year, month, courseId, categoryId, includenavigation, mini, day)\n .then(context => {\n context.viewingmonth = true;\n return Templates.render(template, context);\n })\n .then((html, js) => {\n return Templates.replaceNode(target, html, js);\n })\n .then(() => {\n document.querySelector('body').dispatchEvent(new CustomEvent(CalendarEvents.viewUpdated));\n return;\n })\n .always(() => {\n M.util.js_complete([root.get('id'), year, month, courseId].join('-'));\n return stopLoading(root);\n })\n .fail(Notification.exception);\n};\n\n/**\n * Handle changes to the current calendar view.\n *\n * @param {object} root The container element\n * @param {string} url The calendar url to be shown\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} courseId The id of the course whose events are shown\n * @param {number} categoryId The id of the category whose events are shown\n * @param {number} day Day (optional)\n * @return {promise}\n */\nexport const changeMonth = (root, url, year, month, courseId, categoryId, day = 1) => {\n return refreshMonthContent(root, year, month, courseId, categoryId, null, '', day)\n .then((...args) => {\n if (url.length && url !== '#') {\n window.history.pushState({}, '', url);\n }\n return args;\n })\n .then((...args) => {\n $('body').trigger(CalendarEvents.monthChanged, [year, month, courseId, categoryId]);\n return args;\n });\n};\n\n/**\n * Reload the current month view data.\n *\n * @param {object} root The container element.\n * @param {number} courseId The course id.\n * @param {number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\nexport const reloadCurrentMonth = (root, courseId = 0, categoryId = 0) => {\n const year = root.find(CalendarSelectors.wrapper).data('year');\n const month = root.find(CalendarSelectors.wrapper).data('month');\n const day = root.find(CalendarSelectors.wrapper).data('day');\n\n courseId = courseId || root.find(CalendarSelectors.wrapper).data('courseid');\n categoryId = categoryId || root.find(CalendarSelectors.wrapper).data('categoryid');\n\n return refreshMonthContent(root, year, month, courseId, categoryId, null, '', day);\n};\n\n\n/**\n * Refresh the day content.\n *\n * @param {object} root The root element.\n * @param {number} year Year\n * @param {number} month Month\n * @param {number} day Day\n * @param {number} courseId The id of the course whose events are shown\n * @param {number} categoryId The id of the category whose events are shown\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @param {string} template The template to be rendered.\n *\n * @return {promise}\n */\nexport const refreshDayContent = (root, year, month, day, courseId, categoryId, target = null, template = '') => {\n startLoading(root);\n\n if (!target || target.length == 0){\n target = root.find(CalendarSelectors.wrapper);\n }\n template = template || root.attr('data-template');\n M.util.js_pending([root.get('id'), year, month, day, courseId, categoryId].join('-'));\n const includenavigation = root.data('includenavigation');\n return CalendarRepository.getCalendarDayData(year, month, day, courseId, categoryId, includenavigation)\n .then((context) => {\n context.viewingday = true;\n return Templates.render(template, context);\n })\n .then((html, js) => {\n return Templates.replaceNode(target, html, js);\n })\n .then(() => {\n document.querySelector('body').dispatchEvent(new CustomEvent(CalendarEvents.viewUpdated));\n return;\n })\n .always(() => {\n M.util.js_complete([root.get('id'), year, month, day, courseId, categoryId].join('-'));\n return stopLoading(root);\n })\n .fail(Notification.exception);\n};\n\n/**\n * Reload the current day view data.\n *\n * @param {object} root The container element.\n * @param {number} courseId The course id.\n * @param {number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\nexport const reloadCurrentDay = (root, courseId = 0, categoryId = 0) => {\n const wrapper = root.find(CalendarSelectors.wrapper);\n const year = wrapper.data('year');\n const month = wrapper.data('month');\n const day = wrapper.data('day');\n\n courseId = courseId || root.find(CalendarSelectors.wrapper).data('courseid');\n categoryId = categoryId || root.find(CalendarSelectors.wrapper).data('categoryid');\n\n return refreshDayContent(root, year, month, day, courseId, categoryId);\n};\n\n/**\n * Handle changes to the current calendar view.\n *\n * @param {object} root The root element.\n * @param {String} url The calendar url to be shown\n * @param {Number} year Year\n * @param {Number} month Month\n * @param {Number} day Day\n * @param {Number} courseId The id of the course whose events are shown\n * @param {Number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\nexport const changeDay = (root, url, year, month, day, courseId, categoryId) => {\n return refreshDayContent(root, year, month, day, courseId, categoryId)\n .then((...args) => {\n if (url.length && url !== '#') {\n window.history.pushState({}, '', url);\n }\n return args;\n })\n .then((...args) => {\n $('body').trigger(CalendarEvents.dayChanged, [year, month, courseId, categoryId]);\n return args;\n });\n};\n\n/**\n * Set the element state to loading.\n *\n * @param {object} root The container element\n * @method startLoading\n */\nconst startLoading = (root) => {\n const loadingIconContainer = root.find(CalendarSelectors.containers.loadingIcon);\n\n loadingIconContainer.removeClass('hidden');\n};\n\n/**\n * Remove the loading state from the element.\n *\n * @param {object} root The container element\n * @method stopLoading\n */\nconst stopLoading = (root) => {\n const loadingIconContainer = root.find(CalendarSelectors.containers.loadingIcon);\n\n loadingIconContainer.addClass('hidden');\n};\n\n/**\n * Reload the current month view data.\n *\n * @param {object} root The container element.\n * @param {number} courseId The course id.\n * @param {number} categoryId The id of the category whose events are shown\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @param {string} template The template to be rendered.\n * @return {promise}\n */\nexport const reloadCurrentUpcoming = (root, courseId = 0, categoryId = 0, target = null, template = '') => {\n startLoading(root);\n\n target = target || root.find(CalendarSelectors.wrapper);\n template = template || root.attr('data-template');\n courseId = courseId || root.find(CalendarSelectors.wrapper).data('courseid');\n categoryId = categoryId || root.find(CalendarSelectors.wrapper).data('categoryid');\n\n return CalendarRepository.getCalendarUpcomingData(courseId, categoryId)\n .then((context) => {\n context.viewingupcoming = true;\n return Templates.render(template, context);\n })\n .then((html, js) => {\n return Templates.replaceNode(target, html, js);\n })\n .then(() => {\n document.querySelector('body').dispatchEvent(new CustomEvent(CalendarEvents.viewUpdated));\n return;\n })\n .always(function() {\n return stopLoading(root);\n })\n .fail(Notification.exception);\n};\n\n/**\n * Get the CSS class to apply for the given event type.\n *\n * @param {string} eventType The calendar event type\n * @return {string}\n */\nconst getEventTypeClassFromType = (eventType) => {\n return 'calendar_event_' + eventType;\n};\n\n/**\n * Render the event summary modal.\n *\n * @param {Number} eventId The calendar event id.\n * @returns {Promise}\n */\nconst renderEventSummaryModal = (eventId) => {\n const pendingPromise = new Pending('core_calendar/view_manager:renderEventSummaryModal');\n\n // Calendar repository promise.\n return CalendarRepository.getEventById(eventId)\n .then((getEventResponse) => {\n if (!getEventResponse.event) {\n throw new Error('Error encountered while trying to fetch calendar event with ID: ' + eventId);\n }\n\n return getEventResponse.event;\n })\n .then(eventData => {\n // Build the modal parameters from the event data.\n const modalParams = {\n title: eventData.name,\n type: SummaryModal.TYPE,\n body: Templates.render('core_calendar/event_summary_body', eventData),\n templateContext: {\n canedit: eventData.canedit,\n candelete: eventData.candelete,\n headerclasses: getEventTypeClassFromType(eventData.normalisedeventtype),\n isactionevent: eventData.isactionevent,\n url: eventData.url,\n action: eventData.action\n }\n };\n\n // Create the modal.\n return ModalFactory.create(modalParams);\n })\n .then(modal => {\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Finally, render the modal!\n modal.show();\n\n return modal;\n })\n .then(modal => {\n pendingPromise.resolve();\n\n return modal;\n })\n .catch(Notification.exception);\n};\n\nexport const init = (root, view) => {\n registerEventListeners(root, view);\n};\n"],"names":["_jquery","_interopRequireDefault","_templates","_notification","CalendarRepository","_interopRequireWildcard","_events","CalendarSelectors","_modal_factory","_modal_events","_summary_modal","_custom_interaction_events","_pending","refreshMonthContent","root","year","month","courseId","categoryId","target","template","day","startLoading","find","wrapper","attr","M","util","js_pending","get","join","includenavigation","data","mini","getCalendarMonthData","then","context","viewingmonth","Templates","render","html","js","replaceNode","document","querySelector","dispatchEvent","CustomEvent","CalendarEvents","viewUpdated","always","stopLoading","js_complete","fail","Notification","exception","changeMonth","url","length","window","history","pushState","_len","arguments","args","Array","_key","default","trigger","monthChanged","_len2","_key2","refreshDayContent","getCalendarDayData","viewingday","changeDay","_len3","_key3","dayChanged","_len4","_key4","containers","loadingIcon","removeClass","addClass","reloadCurrentUpcoming","getCalendarUpcomingData","viewingupcoming","renderEventSummaryModal","eventId","pendingPromise","Pending","getEventById","getEventResponse","event","Error","eventData","eventType","modalParams","title","name","type","SummaryModal","TYPE","body","templateContext","canedit","candelete","headerclasses","normalisedeventtype","isactionevent","action","ModalFactory","create","modal","getRoot","on","ModalEvents","hidden","destroy","show","resolve","catch","view","links","eventLink","e","matches","actions","viewEvent","closest","dataset","preventDefault","stopPropagation","navLink","link","currentTarget","href","viewSelector","define","CustomEvents","events","activate","option","classList","contains","courseid","categoryid","registerEventListeners"],"mappings":"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"} \ No newline at end of file diff --git a/contentbank/amd/build/actions.min.js.map b/contentbank/amd/build/actions.min.js.map index 838fd731c85..db637e34dcf 100644 --- a/contentbank/amd/build/actions.min.js.map +++ b/contentbank/amd/build/actions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"actions.min.js","sources":["../src/actions.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 manage content bank actions, such as delete or rename.\n *\n * @module core_contentbank/actions\n * @copyright 2020 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/templates',\n 'core/url',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, Str, Templates, Url, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{DELETE_CONTENT: string}}\n */\n var ACTIONS = {\n DELETE_CONTENT: '[data-action=\"deletecontent\"]',\n RENAME_CONTENT: '[data-action=\"renamecontent\"]',\n SET_CONTENT_VISIBILITY: '[data-action=\"setcontentvisibility\"]',\n };\n\n /**\n * Actions class.\n */\n var Actions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n Actions.prototype.registerEvents = function() {\n $(ACTIONS.DELETE_CONTENT).click(function(e) {\n e.preventDefault();\n\n var contentname = $(this).data('contentname');\n var contentuses = $(this).data('uses');\n var contentid = $(this).data('contentid');\n var contextid = $(this).data('contextid');\n\n var strings = [\n {\n key: 'deletecontent',\n component: 'core_contentbank'\n },\n {\n key: 'deletecontentconfirm',\n component: 'core_contentbank',\n param: {\n name: contentname,\n }\n },\n {\n key: 'deletecontentconfirmlinked',\n component: 'core_contentbank',\n },\n {\n key: 'delete',\n component: 'core'\n },\n ];\n\n var deleteButtonText = '';\n Str.get_strings(strings).then(function(langStrings) {\n var modalTitle = langStrings[0];\n var modalContent = langStrings[1];\n if (contentuses > 0) {\n modalContent += ' ' + langStrings[2];\n }\n deleteButtonText = langStrings[3];\n\n return ModalFactory.create({\n title: modalTitle,\n body: modalContent,\n type: ModalFactory.types.SAVE_CANCEL,\n large: true\n });\n }).done(function(modal) {\n modal.setSaveButtonText(deleteButtonText);\n modal.getRoot().on(ModalEvents.save, function() {\n // The action is now confirmed, sending an action for it.\n return deleteContent(contentid, contextid);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Show the modal.\n modal.show();\n\n return;\n }).catch(Notification.exception);\n });\n\n $(ACTIONS.RENAME_CONTENT).click(function(e) {\n e.preventDefault();\n\n var contentname = $(this).data('contentname');\n var contentid = $(this).data('contentid');\n\n var strings = [\n {\n key: 'renamecontent',\n component: 'core_contentbank'\n },\n {\n key: 'rename',\n component: 'core_contentbank'\n },\n ];\n\n var saveButtonText = '';\n Str.get_strings(strings).then(function(langStrings) {\n var modalTitle = langStrings[0];\n saveButtonText = langStrings[1];\n\n return ModalFactory.create({\n title: modalTitle,\n body: Templates.render('core_contentbank/renamecontent', {'contentid': contentid, 'name': contentname}),\n type: ModalFactory.types.SAVE_CANCEL\n });\n }).then(function(modal) {\n modal.setSaveButtonText(saveButtonText);\n modal.getRoot().on(ModalEvents.save, function(e) {\n // The action is now confirmed, sending an action for it.\n var newname = $(\"#newname\").val().trim();\n if (newname) {\n renameContent(contentid, newname);\n } else {\n var errorStrings = [\n {\n key: 'error',\n },\n {\n key: 'emptynamenotallowed',\n component: 'core_contentbank',\n },\n ];\n Str.get_strings(errorStrings).then(function(langStrings) {\n Notification.alert(langStrings[0], langStrings[1]);\n }).catch(Notification.exception);\n e.preventDefault();\n }\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Show the modal.\n modal.show();\n\n return;\n }).catch(Notification.exception);\n });\n\n $(ACTIONS.SET_CONTENT_VISIBILITY).click(function(e) {\n e.preventDefault();\n\n var contentid = $(this).data('contentid');\n var visibility = $(this).data('visibility');\n\n setContentVisibility(contentid, visibility);\n });\n };\n\n /**\n * Delete content from the content bank.\n *\n * @param {int} contentid The content to delete.\n * @param {int} contextid The contextid where the content belongs.\n */\n function deleteContent(contentid, contextid) {\n var request = {\n methodname: 'core_contentbank_delete_content',\n args: {\n contentids: {contentid}\n }\n };\n\n var requestType = 'success';\n Ajax.call([request])[0].then(function(data) {\n if (data.result) {\n return 'contentdeleted';\n }\n requestType = 'error';\n return 'contentnotdeleted';\n\n }).done(function(message) {\n var params = {\n contextid: contextid\n };\n if (requestType == 'success') {\n params.statusmsg = message;\n } else {\n params.errormsg = message;\n }\n // Redirect to the main content bank page and display the message as a notification.\n window.location.href = Url.relativeUrl('contentbank/index.php', params, false);\n }).fail(Notification.exception);\n }\n\n /**\n * Rename content in the content bank.\n *\n * @param {int} contentid The content to rename.\n * @param {string} name The new name for the content.\n */\n function renameContent(contentid, name) {\n var request = {\n methodname: 'core_contentbank_rename_content',\n args: {\n contentid: contentid,\n name: name\n }\n };\n var requestType = 'success';\n Ajax.call([request])[0].then(function(data) {\n if (data.result) {\n return 'contentrenamed';\n }\n requestType = 'error';\n return data.warnings[0].message;\n\n }).then(function(message) {\n var params = null;\n if (requestType == 'success') {\n params = {\n id: contentid,\n statusmsg: message\n };\n // Redirect to the content view page and display the message as a notification.\n window.location.href = Url.relativeUrl('contentbank/view.php', params, false);\n } else {\n // Fetch error notifications.\n Notification.addNotification({\n message: message,\n type: 'error'\n });\n Notification.fetchNotifications();\n }\n return;\n }).catch(Notification.exception);\n }\n\n /**\n * Set content visibility in the content bank.\n *\n * @param {int} contentid The content to modify\n * @param {int} visibility The new visibility value\n */\n function setContentVisibility(contentid, visibility) {\n var request = {\n methodname: 'core_contentbank_set_content_visibility',\n args: {\n contentid: contentid,\n visibility: visibility\n }\n };\n var requestType = 'success';\n Ajax.call([request])[0].then(function(data) {\n if (data.result) {\n return 'contentvisibilitychanged';\n }\n requestType = 'error';\n return data.warnings[0].message;\n\n }).then(function(message) {\n var params = null;\n if (requestType == 'success') {\n params = {\n id: contentid,\n statusmsg: message\n };\n // Redirect to the content view page and display the message as a notification.\n window.location.href = Url.relativeUrl('contentbank/view.php', params, false);\n } else {\n // Fetch error notifications.\n Notification.addNotification({\n message: message,\n type: 'error'\n });\n Notification.fetchNotifications();\n }\n return;\n }).catch(Notification.exception);\n }\n\n return /** @alias module:core_contentbank/actions */ {\n // Public variables and functions.\n\n /**\n * Initialise the contentbank actions.\n *\n * @method init\n * @return {Actions}\n */\n 'init': function() {\n return new Actions();\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","Str","Templates","Url","ModalFactory","ModalEvents","ACTIONS","Actions","registerEvents","prototype","click","e","preventDefault","contentname","this","data","contentuses","contentid","contextid","strings","key","component","param","name","deleteButtonText","get_strings","then","langStrings","modalTitle","modalContent","create","title","body","type","types","SAVE_CANCEL","large","done","modal","setSaveButtonText","getRoot","on","save","request","methodname","args","contentids","requestType","call","result","message","params","statusmsg","errormsg","window","location","href","relativeUrl","fail","exception","deleteContent","hidden","destroy","show","catch","saveButtonText","render","newname","val","trim","warnings","id","addNotification","fetchNotifications","renameContent","alert","visibility","setContentVisibility"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"actions.min.js","sources":["../src/actions.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 manage content bank actions, such as delete or rename.\n *\n * @module core_contentbank/actions\n * @copyright 2020 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/templates',\n 'core/url',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, Str, Templates, Url, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{DELETE_CONTENT: string}}\n */\n var ACTIONS = {\n DELETE_CONTENT: '[data-action=\"deletecontent\"]',\n RENAME_CONTENT: '[data-action=\"renamecontent\"]',\n SET_CONTENT_VISIBILITY: '[data-action=\"setcontentvisibility\"]',\n };\n\n /**\n * Actions class.\n */\n var Actions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n Actions.prototype.registerEvents = function() {\n $(ACTIONS.DELETE_CONTENT).click(function(e) {\n e.preventDefault();\n\n var contentname = $(this).data('contentname');\n var contentuses = $(this).data('uses');\n var contentid = $(this).data('contentid');\n var contextid = $(this).data('contextid');\n\n var strings = [\n {\n key: 'deletecontent',\n component: 'core_contentbank'\n },\n {\n key: 'deletecontentconfirm',\n component: 'core_contentbank',\n param: {\n name: contentname,\n }\n },\n {\n key: 'deletecontentconfirmlinked',\n component: 'core_contentbank',\n },\n {\n key: 'delete',\n component: 'core'\n },\n ];\n\n var deleteButtonText = '';\n Str.get_strings(strings).then(function(langStrings) {\n var modalTitle = langStrings[0];\n var modalContent = langStrings[1];\n if (contentuses > 0) {\n modalContent += ' ' + langStrings[2];\n }\n deleteButtonText = langStrings[3];\n\n return ModalFactory.create({\n title: modalTitle,\n body: modalContent,\n type: ModalFactory.types.SAVE_CANCEL,\n large: true\n });\n }).done(function(modal) {\n modal.setSaveButtonText(deleteButtonText);\n modal.getRoot().on(ModalEvents.save, function() {\n // The action is now confirmed, sending an action for it.\n return deleteContent(contentid, contextid);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Show the modal.\n modal.show();\n\n return;\n }).catch(Notification.exception);\n });\n\n $(ACTIONS.RENAME_CONTENT).click(function(e) {\n e.preventDefault();\n\n var contentname = $(this).data('contentname');\n var contentid = $(this).data('contentid');\n\n var strings = [\n {\n key: 'renamecontent',\n component: 'core_contentbank'\n },\n {\n key: 'rename',\n component: 'core_contentbank'\n },\n ];\n\n var saveButtonText = '';\n Str.get_strings(strings).then(function(langStrings) {\n var modalTitle = langStrings[0];\n saveButtonText = langStrings[1];\n\n return ModalFactory.create({\n title: modalTitle,\n body: Templates.render('core_contentbank/renamecontent', {'contentid': contentid, 'name': contentname}),\n type: ModalFactory.types.SAVE_CANCEL\n });\n }).then(function(modal) {\n modal.setSaveButtonText(saveButtonText);\n modal.getRoot().on(ModalEvents.save, function(e) {\n // The action is now confirmed, sending an action for it.\n var newname = $(\"#newname\").val().trim();\n if (newname) {\n renameContent(contentid, newname);\n } else {\n var errorStrings = [\n {\n key: 'error',\n },\n {\n key: 'emptynamenotallowed',\n component: 'core_contentbank',\n },\n ];\n Str.get_strings(errorStrings).then(function(langStrings) {\n Notification.alert(langStrings[0], langStrings[1]);\n }).catch(Notification.exception);\n e.preventDefault();\n }\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Show the modal.\n modal.show();\n\n return;\n }).catch(Notification.exception);\n });\n\n $(ACTIONS.SET_CONTENT_VISIBILITY).click(function(e) {\n e.preventDefault();\n\n var contentid = $(this).data('contentid');\n var visibility = $(this).data('visibility');\n\n setContentVisibility(contentid, visibility);\n });\n };\n\n /**\n * Delete content from the content bank.\n *\n * @param {int} contentid The content to delete.\n * @param {int} contextid The contextid where the content belongs.\n */\n function deleteContent(contentid, contextid) {\n var request = {\n methodname: 'core_contentbank_delete_content',\n args: {\n contentids: {contentid}\n }\n };\n\n var requestType = 'success';\n Ajax.call([request])[0].then(function(data) {\n if (data.result) {\n return 'contentdeleted';\n }\n requestType = 'error';\n return 'contentnotdeleted';\n\n }).done(function(message) {\n var params = {\n contextid: contextid\n };\n if (requestType == 'success') {\n params.statusmsg = message;\n } else {\n params.errormsg = message;\n }\n // Redirect to the main content bank page and display the message as a notification.\n window.location.href = Url.relativeUrl('contentbank/index.php', params, false);\n }).fail(Notification.exception);\n }\n\n /**\n * Rename content in the content bank.\n *\n * @param {int} contentid The content to rename.\n * @param {string} name The new name for the content.\n */\n function renameContent(contentid, name) {\n var request = {\n methodname: 'core_contentbank_rename_content',\n args: {\n contentid: contentid,\n name: name\n }\n };\n var requestType = 'success';\n Ajax.call([request])[0].then(function(data) {\n if (data.result) {\n return 'contentrenamed';\n }\n requestType = 'error';\n return data.warnings[0].message;\n\n }).then(function(message) {\n var params = null;\n if (requestType == 'success') {\n params = {\n id: contentid,\n statusmsg: message\n };\n // Redirect to the content view page and display the message as a notification.\n window.location.href = Url.relativeUrl('contentbank/view.php', params, false);\n } else {\n // Fetch error notifications.\n Notification.addNotification({\n message: message,\n type: 'error'\n });\n Notification.fetchNotifications();\n }\n return;\n }).catch(Notification.exception);\n }\n\n /**\n * Set content visibility in the content bank.\n *\n * @param {int} contentid The content to modify\n * @param {int} visibility The new visibility value\n */\n function setContentVisibility(contentid, visibility) {\n var request = {\n methodname: 'core_contentbank_set_content_visibility',\n args: {\n contentid: contentid,\n visibility: visibility\n }\n };\n var requestType = 'success';\n Ajax.call([request])[0].then(function(data) {\n if (data.result) {\n return 'contentvisibilitychanged';\n }\n requestType = 'error';\n return data.warnings[0].message;\n\n }).then(function(message) {\n var params = null;\n if (requestType == 'success') {\n params = {\n id: contentid,\n statusmsg: message\n };\n // Redirect to the content view page and display the message as a notification.\n window.location.href = Url.relativeUrl('contentbank/view.php', params, false);\n } else {\n // Fetch error notifications.\n Notification.addNotification({\n message: message,\n type: 'error'\n });\n Notification.fetchNotifications();\n }\n return;\n }).catch(Notification.exception);\n }\n\n return /** @alias module:core_contentbank/actions */ {\n // Public variables and functions.\n\n /**\n * Initialise the contentbank actions.\n *\n * @method init\n * @return {Actions}\n */\n 'init': function() {\n return new Actions();\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","Str","Templates","Url","ModalFactory","ModalEvents","ACTIONS","Actions","this","registerEvents","prototype","click","e","preventDefault","contentname","data","contentuses","contentid","contextid","strings","key","component","param","name","deleteButtonText","get_strings","then","langStrings","modalTitle","modalContent","create","title","body","type","types","SAVE_CANCEL","large","done","modal","setSaveButtonText","getRoot","on","save","request","methodname","args","contentids","requestType","call","result","message","params","statusmsg","errormsg","window","location","href","relativeUrl","fail","exception","deleteContent","hidden","destroy","show","catch","saveButtonText","render","newname","val","trim","warnings","id","addNotification","fetchNotifications","renameContent","alert","visibility","setContentVisibility","init"],"mappings":"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"} \ No newline at end of file diff --git a/contentbank/amd/build/search.min.js.map b/contentbank/amd/build/search.min.js.map index 2a57772d1a7..df49d4b96fd 100644 --- a/contentbank/amd/build/search.min.js.map +++ b/contentbank/amd/build/search.min.js.map @@ -1 +1 @@ -{"version":3,"file":"search.min.js","sources":["../src/search.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 * Search methods for finding contents in the content bank.\n *\n * @module core_contentbank/search\n * @copyright 2020 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport selectors from 'core_contentbank/selectors';\nimport {get_string as getString} from 'core/str';\nimport Pending from 'core/pending';\nimport {debounce} from 'core/utils';\n\n/**\n * Set up the search.\n *\n * @method init\n */\nexport const init = () => {\n const pendingPromise = new Pending();\n\n const root = $(selectors.regions.contentbank);\n registerListenerEvents(root);\n\n pendingPromise.resolve();\n};\n\n/**\n * Register contentbank search related event listeners.\n *\n * @method registerListenerEvents\n * @param {Object} root The root element for the contentbank.\n */\nconst registerListenerEvents = (root) => {\n\n const searchInput = root.find(selectors.elements.searchinput)[0];\n\n root.on('click', selectors.actions.search, function(e) {\n e.preventDefault();\n toggleSearchResultsView(root, searchInput.value);\n });\n\n root.on('click', selectors.actions.clearSearch, function(e) {\n e.preventDefault();\n searchInput.value = \"\";\n searchInput.focus();\n toggleSearchResultsView(root, searchInput.value);\n });\n\n // The search input is also triggered.\n searchInput.addEventListener('input', debounce(() => {\n // Display the search results.\n toggleSearchResultsView(root, searchInput.value);\n }, 300));\n\n};\n\n/**\n * Toggle (display/hide) the search results depending on the value of the search query.\n *\n * @method toggleSearchResultsView\n * @param {HTMLElement} body The root element for the contentbank.\n * @param {String} searchQuery The search query.\n */\nconst toggleSearchResultsView = async(body, searchQuery) => {\n const clearSearchButton = body.find(selectors.actions.clearSearch)[0];\n\n const navbarBreadcrumb = body.find(selectors.elements.cbnavbarbreadcrumb)[0];\n const navbarTotal = body.find(selectors.elements.cbnavbartotalsearch)[0];\n // Update the results.\n const filteredContents = filterContents(body, searchQuery);\n if (searchQuery.length > 0) {\n // As the search query is present, search results should be displayed.\n\n // Display the \"clear\" search button in the activity chooser search bar.\n clearSearchButton.classList.remove('d-none');\n\n // Change the cb-navbar to display total items found.\n navbarBreadcrumb.classList.add('d-none');\n navbarTotal.innerHTML = await getString('itemsfound', 'core_contentbank', filteredContents.length);\n navbarTotal.classList.remove('d-none');\n } else {\n // As search query is not present, the search results should be removed.\n\n // Hide the \"clear\" search button in the activity chooser search bar.\n clearSearchButton.classList.add('d-none');\n\n // Display again the breadcrumb in the navbar.\n navbarBreadcrumb.classList.remove('d-none');\n navbarTotal.classList.add('d-none');\n }\n};\n\n/**\n * Return the list of contents which have a name that matches the given search term.\n *\n * @method filterContents\n * @param {HTMLElement} body The root element for the contentbank.\n * @param {String} searchTerm The search term to match.\n * @return {Array}\n */\nconst filterContents = (body, searchTerm) => {\n const contents = Array.from(body.find(selectors.elements.listitem));\n const searchResults = [];\n contents.forEach((content) => {\n const contentName = content.getAttribute('data-name');\n if (searchTerm === '' || contentName.toLowerCase().includes(searchTerm.toLowerCase())) {\n // The content matches the search criteria so it should be displayed and hightlighted.\n searchResults.push(content);\n const contentNameElement = content.querySelector(selectors.regions.cbcontentname);\n contentNameElement.innerHTML = highlight(contentName, searchTerm);\n content.classList.remove('d-none');\n } else {\n content.classList.add('d-none');\n }\n });\n\n return searchResults;\n};\n\n/**\n * Highlight a given string in a text.\n *\n * @method highlight\n * @param {String} text The whole text.\n * @param {String} highlightText The piece of text to highlight.\n * @return {String}\n */\nconst highlight = (text, highlightText) => {\n let result = text;\n if (highlightText !== '') {\n const pos = text.toLowerCase().indexOf(highlightText.toLowerCase());\n if (pos > -1) {\n result = text.substr(0, pos) + '' + text.substr(pos, highlightText.length) + '' +\n text.substr(pos + highlightText.length);\n }\n }\n\n return result;\n};\n"],"names":["pendingPromise","Pending","root","selectors","regions","contentbank","registerListenerEvents","resolve","searchInput","find","elements","searchinput","on","actions","search","e","preventDefault","toggleSearchResultsView","value","clearSearch","focus","addEventListener","body","searchQuery","clearSearchButton","navbarBreadcrumb","cbnavbarbreadcrumb","navbarTotal","cbnavbartotalsearch","filteredContents","filterContents","length","classList","remove","add","innerHTML","searchTerm","contents","Array","from","listitem","searchResults","forEach","content","contentName","getAttribute","toLowerCase","includes","push","querySelector","cbcontentname","highlight","text","highlightText","result","pos","indexOf","substr"],"mappings":"8rBAkCoB,eACVA,eAAiB,IAAIC,iBAErBC,MAAO,mBAAEC,mBAAUC,QAAQC,aACjCC,uBAAuBJ,MAEvBF,eAAeO,uBASbD,uBAAyB,SAACJ,UAEtBM,YAAcN,KAAKO,KAAKN,mBAAUO,SAASC,aAAa,GAE9DT,KAAKU,GAAG,QAAST,mBAAUU,QAAQC,QAAQ,SAASC,GAChDA,EAAEC,iBACFC,wBAAwBf,KAAMM,YAAYU,UAG9ChB,KAAKU,GAAG,QAAST,mBAAUU,QAAQM,aAAa,SAASJ,GACrDA,EAAEC,iBACFR,YAAYU,MAAQ,GACpBV,YAAYY,QACZH,wBAAwBf,KAAMM,YAAYU,UAI9CV,YAAYa,iBAAiB,SAAS,oBAAS,WAE3CJ,wBAAwBf,KAAMM,YAAYU,SAC3C,OAWDD,qDAA0B,iBAAMK,KAAMC,yLAClCC,kBAAoBF,KAAKb,KAAKN,mBAAUU,QAAQM,aAAa,GAE7DM,iBAAmBH,KAAKb,KAAKN,mBAAUO,SAASgB,oBAAoB,GACpEC,YAAcL,KAAKb,KAAKN,mBAAUO,SAASkB,qBAAqB,GAEhEC,iBAAmBC,eAAeR,KAAMC,eAC1CA,YAAYQ,OAAS,kCAIrBP,kBAAkBQ,UAAUC,OAAO,UAGnCR,iBAAiBO,UAAUE,IAAI,2BACD,mBAAU,aAAc,mBAAoBL,iBAAiBE,eAA3FJ,YAAYQ,wBACZR,YAAYK,UAAUC,OAAO,yCAK7BT,kBAAkBQ,UAAUE,IAAI,UAGhCT,iBAAiBO,UAAUC,OAAO,UAClCN,YAAYK,UAAUE,IAAI,2aAY5BJ,eAAiB,SAACR,KAAMc,gBACpBC,SAAWC,MAAMC,KAAKjB,KAAKb,KAAKN,mBAAUO,SAAS8B,WACnDC,cAAgB,UACtBJ,SAASK,SAAQ,SAACC,aACRC,YAAcD,QAAQE,aAAa,aACtB,KAAfT,YAAqBQ,YAAYE,cAAcC,SAASX,WAAWU,gBAEnEL,cAAcO,KAAKL,SACQA,QAAQM,cAAc9C,mBAAUC,QAAQ8C,eAChDf,UAAYgB,UAAUP,YAAaR,YACtDO,QAAQX,UAAUC,OAAO,WAEzBU,QAAQX,UAAUE,IAAI,aAIvBO,eAWLU,UAAY,SAACC,KAAMC,mBACjBC,OAASF,QACS,KAAlBC,cAAsB,KAChBE,IAAMH,KAAKN,cAAcU,QAAQH,cAAcP,eACjDS,KAAO,IACPD,OAASF,KAAKK,OAAO,EAAGF,KAAO,2BAA6BH,KAAKK,OAAOF,IAAKF,cAActB,QAAU,UACjGqB,KAAKK,OAAOF,IAAMF,cAActB,gBAIrCuB"} \ No newline at end of file +{"version":3,"file":"search.min.js","sources":["../src/search.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 * Search methods for finding contents in the content bank.\n *\n * @module core_contentbank/search\n * @copyright 2020 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport selectors from 'core_contentbank/selectors';\nimport {get_string as getString} from 'core/str';\nimport Pending from 'core/pending';\nimport {debounce} from 'core/utils';\n\n/**\n * Set up the search.\n *\n * @method init\n */\nexport const init = () => {\n const pendingPromise = new Pending();\n\n const root = $(selectors.regions.contentbank);\n registerListenerEvents(root);\n\n pendingPromise.resolve();\n};\n\n/**\n * Register contentbank search related event listeners.\n *\n * @method registerListenerEvents\n * @param {Object} root The root element for the contentbank.\n */\nconst registerListenerEvents = (root) => {\n\n const searchInput = root.find(selectors.elements.searchinput)[0];\n\n root.on('click', selectors.actions.search, function(e) {\n e.preventDefault();\n toggleSearchResultsView(root, searchInput.value);\n });\n\n root.on('click', selectors.actions.clearSearch, function(e) {\n e.preventDefault();\n searchInput.value = \"\";\n searchInput.focus();\n toggleSearchResultsView(root, searchInput.value);\n });\n\n // The search input is also triggered.\n searchInput.addEventListener('input', debounce(() => {\n // Display the search results.\n toggleSearchResultsView(root, searchInput.value);\n }, 300));\n\n};\n\n/**\n * Toggle (display/hide) the search results depending on the value of the search query.\n *\n * @method toggleSearchResultsView\n * @param {HTMLElement} body The root element for the contentbank.\n * @param {String} searchQuery The search query.\n */\nconst toggleSearchResultsView = async(body, searchQuery) => {\n const clearSearchButton = body.find(selectors.actions.clearSearch)[0];\n\n const navbarBreadcrumb = body.find(selectors.elements.cbnavbarbreadcrumb)[0];\n const navbarTotal = body.find(selectors.elements.cbnavbartotalsearch)[0];\n // Update the results.\n const filteredContents = filterContents(body, searchQuery);\n if (searchQuery.length > 0) {\n // As the search query is present, search results should be displayed.\n\n // Display the \"clear\" search button in the activity chooser search bar.\n clearSearchButton.classList.remove('d-none');\n\n // Change the cb-navbar to display total items found.\n navbarBreadcrumb.classList.add('d-none');\n navbarTotal.innerHTML = await getString('itemsfound', 'core_contentbank', filteredContents.length);\n navbarTotal.classList.remove('d-none');\n } else {\n // As search query is not present, the search results should be removed.\n\n // Hide the \"clear\" search button in the activity chooser search bar.\n clearSearchButton.classList.add('d-none');\n\n // Display again the breadcrumb in the navbar.\n navbarBreadcrumb.classList.remove('d-none');\n navbarTotal.classList.add('d-none');\n }\n};\n\n/**\n * Return the list of contents which have a name that matches the given search term.\n *\n * @method filterContents\n * @param {HTMLElement} body The root element for the contentbank.\n * @param {String} searchTerm The search term to match.\n * @return {Array}\n */\nconst filterContents = (body, searchTerm) => {\n const contents = Array.from(body.find(selectors.elements.listitem));\n const searchResults = [];\n contents.forEach((content) => {\n const contentName = content.getAttribute('data-name');\n if (searchTerm === '' || contentName.toLowerCase().includes(searchTerm.toLowerCase())) {\n // The content matches the search criteria so it should be displayed and hightlighted.\n searchResults.push(content);\n const contentNameElement = content.querySelector(selectors.regions.cbcontentname);\n contentNameElement.innerHTML = highlight(contentName, searchTerm);\n content.classList.remove('d-none');\n } else {\n content.classList.add('d-none');\n }\n });\n\n return searchResults;\n};\n\n/**\n * Highlight a given string in a text.\n *\n * @method highlight\n * @param {String} text The whole text.\n * @param {String} highlightText The piece of text to highlight.\n * @return {String}\n */\nconst highlight = (text, highlightText) => {\n let result = text;\n if (highlightText !== '') {\n const pos = text.toLowerCase().indexOf(highlightText.toLowerCase());\n if (pos > -1) {\n result = text.substr(0, pos) + '' + text.substr(pos, highlightText.length) + '' +\n text.substr(pos + highlightText.length);\n }\n }\n\n return result;\n};\n"],"names":["_jquery","_interopRequireDefault","_selectors","_pending","pendingPromise","Pending","root","default","selectors","regions","contentbank","registerListenerEvents","resolve","_ref","searchInput","find","elements","searchinput","on","actions","search","e","preventDefault","toggleSearchResultsView","value","clearSearch","focus","addEventListener","regeneratorRuntime","mark","_callee","body","searchQuery","clearSearchButton","navbarBreadcrumb","navbarTotal","filteredContents","wrap","_context","prev","next","cbnavbarbreadcrumb","cbnavbartotalsearch","filterContents","length","classList","remove","add","_str","get_string","innerHTML","sent","stop","_x","_x2","apply","this","arguments","searchTerm","contents","Array","from","listitem","searchResults","forEach","content","contentName","getAttribute","toLowerCase","includes","push","querySelector","cbcontentname","highlight","text","highlightText","result","pos","indexOf","substr"],"mappings":"gjBAuBAA,QAAAC,uBAAAD,SACAE,WAAAD,uBAAAC,YAEAC,SAAAF,uBAAAE,wBAQoB,WAChB,IAAMC,eAAiB,IAAIC,SAAAA,QAErBC,MAAO,EAAAN,QAAAO,SAAEC,mBAAUC,QAAQC,aACjCC,uBAAuBL,MAEvBF,eAAeQ,SAClB,EAQD,OA+BgCC,KA/B1BF,uBAAyB,SAACL,MAE5B,IAAMQ,YAAcR,KAAKS,KAAKP,WAAUQ,QAAAA,SAASC,aAAa,GAE9DX,KAAKY,GAAG,QAASV,WAAUW,QAAAA,QAAQC,QAAQ,SAASC,GAChDA,EAAEC,iBACFC,wBAAwBjB,KAAMQ,YAAYU,MAC7C,IAEDlB,KAAKY,GAAG,QAASV,WAAUW,QAAAA,QAAQM,aAAa,SAASJ,GACrDA,EAAEC,iBACFR,YAAYU,MAAQ,GACpBV,YAAYY,QACZH,wBAAwBjB,KAAMQ,YAAYU,MAC7C,IAGDV,YAAYa,iBAAiB,SAAS,oBAAS,WAE3CJ,wBAAwBjB,KAAMQ,YAAYU,MAC7C,GAAE,KAEN,EASKD,4BAA0BK,mBAAAC,MAAA,SAAAC,QAAMC,KAAMC,aAAZ,IAAAC,kBAAAC,iBAAAC,YAAAC,iBAAA,OAAAR,mBAAAS,MAAA,SAAAC,UAAA,OAAA,OAAAA,SAAAC,KAAAD,SAAAE,MAAA,KAAA,EAAA,GACtBP,kBAAoBF,KAAKhB,KAAKP,WAAUW,QAAAA,QAAQM,aAAa,GAE7DS,iBAAmBH,KAAKhB,KAAKP,WAAUQ,QAAAA,SAASyB,oBAAoB,GACpEN,YAAcJ,KAAKhB,KAAKP,WAAUQ,QAAAA,SAAS0B,qBAAqB,GAEhEN,iBAAmBO,eAAeZ,KAAMC,eAC1CA,YAAYY,OAAS,GAPG,CAAAN,SAAAE,KAAA,GAAA,KAAA,CAeM,OAJ9BP,kBAAkBY,UAAUC,OAAO,UAGnCZ,iBAAiBW,UAAUE,IAAI,UAdPT,SAAAE,KAAA,GAeM,EAAAQ,KAAAC,YAAU,aAAc,mBAAoBb,iBAAiBQ,QAfnE,KAAA,EAexBT,YAAYe,UAfYZ,SAAAa,KAgBxBhB,YAAYU,UAAUC,OAAO,UAhBLR,SAAAE,KAAA,GAAA,MAAA,KAAA,GAqBxBP,kBAAkBY,UAAUE,IAAI,UAGhCb,iBAAiBW,UAAUC,OAAO,UAClCX,YAAYU,UAAUE,IAAI,UAzBF,KAAA,GAAA,IAAA,MAAA,OAAAT,SAAAc,OAAA,GAAAtB,QAAH,IAAGjB,oTAAH,SAAAwC,GAAAC,KAAA,OAAAzC,KAAA0C,MAAAC,KAAAC,UAAA,GAqCvBd,eAAiB,SAACZ,KAAM2B,YAC1B,IAAMC,SAAWC,MAAMC,KAAK9B,KAAKhB,KAAKP,WAAUQ,QAAAA,SAAS8C,WACnDC,cAAgB,GActB,OAbAJ,SAASK,SAAQ,SAACC,SACd,IAAMC,YAAcD,QAAQE,aAAa,aACtB,KAAfT,YAAqBQ,YAAYE,cAAcC,SAASX,WAAWU,gBAEnEL,cAAcO,KAAKL,SACQA,QAAQM,cAAc/D,WAAUC,QAAAA,QAAQ+D,eAChDtB,UAAYuB,UAAUP,YAAaR,YACtDO,QAAQpB,UAAUC,OAAO,WAEzBmB,QAAQpB,UAAUE,IAAI,SAE7B,IAEMgB,aACV,EAUKU,UAAY,SAACC,KAAMC,eACjBC,IAAAA,OAASF,KACTC,GAAkB,KAAlBA,cAAsB,CACtB,IAAME,IAAMH,KAAKN,cAAcU,QAAQH,cAAcP,eACjDS,KAAO,IACPD,OAASF,KAAKK,OAAO,EAAGF,KAAO,2BAA6BH,KAAKK,OAAOF,IAAKF,cAAc/B,QAAU,UACjG8B,KAAKK,OAAOF,IAAMF,cAAc/B,QAE3C,CAED,OAAOgC,MACV"} \ No newline at end of file diff --git a/contentbank/amd/build/selectors.min.js.map b/contentbank/amd/build/selectors.min.js.map index afe405ed031..50f428f4982 100644 --- a/contentbank/amd/build/selectors.min.js.map +++ b/contentbank/amd/build/selectors.min.js.map @@ -1 +1 @@ -{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 * Define all of the selectors we will be using on the contentbank interface.\n *\n * @module core_contentbank/selectors\n * @copyright 2020 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * A small helper function to build queryable data selectors.\n *\n * @method getDataSelector\n * @param {String} name\n * @param {String} value\n * @return {string}\n */\nconst getDataSelector = (name, value) => {\n return `[data-${name}=\"${value}\"]`;\n};\n\nexport default {\n regions: {\n cbcontentname: getDataSelector('region', 'cb-content-name'),\n contentbank: getDataSelector('region', 'contentbank'),\n filearea: getDataSelector('region', 'filearea')\n },\n actions: {\n search: getDataSelector('action', 'searchcontent'),\n clearSearch: getDataSelector('action', 'clearsearch'),\n viewgrid: getDataSelector('action', 'viewgrid'),\n viewlist: getDataSelector('action', 'viewlist'),\n sortname: getDataSelector('action', 'sortname'),\n sortuses: getDataSelector('action', 'sortuses'),\n sortdate: getDataSelector('action', 'sortdate'),\n sortsize: getDataSelector('action', 'sortsize'),\n sorttype: getDataSelector('action', 'sorttype'),\n sortauthor: getDataSelector('action', 'sortauthor'),\n },\n elements: {\n listitem: '.cb-listitem',\n heading: '.cb-heading',\n cell: '.cb-column',\n cbnavbarbreadcrumb: '.cb-navbar-breadbrumb',\n cbnavbartotalsearch: '.cb-navbar-totalsearch',\n searchinput: '#searchinput',\n sortbutton: '.cb-btnsort'\n },\n};\n"],"names":["getDataSelector","name","value","regions","cbcontentname","contentbank","filearea","actions","search","clearSearch","viewgrid","viewlist","sortname","sortuses","sortdate","sortsize","sorttype","sortauthor","elements","listitem","heading","cell","cbnavbarbreadcrumb","cbnavbartotalsearch","searchinput","sortbutton"],"mappings":";;;;;;;;IA+BMA,gBAAkB,SAACC,KAAMC,6BACXD,kBAASC,sBAGd,CACXC,QAAS,CACLC,cAAeJ,gBAAgB,SAAU,mBACzCK,YAAaL,gBAAgB,SAAU,eACvCM,SAAUN,gBAAgB,SAAU,aAExCO,QAAS,CACLC,OAAQR,gBAAgB,SAAU,iBAClCS,YAAaT,gBAAgB,SAAU,eACvCU,SAAUV,gBAAgB,SAAU,YACpCW,SAAUX,gBAAgB,SAAU,YACpCY,SAAUZ,gBAAgB,SAAU,YACpCa,SAAUb,gBAAgB,SAAU,YACpCc,SAAUd,gBAAgB,SAAU,YACpCe,SAAUf,gBAAgB,SAAU,YACpCgB,SAAUhB,gBAAgB,SAAU,YACpCiB,WAAYjB,gBAAgB,SAAU,eAE1CkB,SAAU,CACNC,SAAU,eACVC,QAAS,cACTC,KAAM,aACNC,mBAAoB,wBACpBC,oBAAqB,yBACrBC,YAAa,eACbC,WAAY"} \ No newline at end of file +{"version":3,"file":"selectors.min.js","sources":["../src/selectors.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 * Define all of the selectors we will be using on the contentbank interface.\n *\n * @module core_contentbank/selectors\n * @copyright 2020 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * A small helper function to build queryable data selectors.\n *\n * @method getDataSelector\n * @param {String} name\n * @param {String} value\n * @return {string}\n */\nconst getDataSelector = (name, value) => {\n return `[data-${name}=\"${value}\"]`;\n};\n\nexport default {\n regions: {\n cbcontentname: getDataSelector('region', 'cb-content-name'),\n contentbank: getDataSelector('region', 'contentbank'),\n filearea: getDataSelector('region', 'filearea')\n },\n actions: {\n search: getDataSelector('action', 'searchcontent'),\n clearSearch: getDataSelector('action', 'clearsearch'),\n viewgrid: getDataSelector('action', 'viewgrid'),\n viewlist: getDataSelector('action', 'viewlist'),\n sortname: getDataSelector('action', 'sortname'),\n sortuses: getDataSelector('action', 'sortuses'),\n sortdate: getDataSelector('action', 'sortdate'),\n sortsize: getDataSelector('action', 'sortsize'),\n sorttype: getDataSelector('action', 'sorttype'),\n sortauthor: getDataSelector('action', 'sortauthor'),\n },\n elements: {\n listitem: '.cb-listitem',\n heading: '.cb-heading',\n cell: '.cb-column',\n cbnavbarbreadcrumb: '.cb-navbar-breadbrumb',\n cbnavbartotalsearch: '.cb-navbar-totalsearch',\n searchinput: '#searchinput',\n sortbutton: '.cb-btnsort'\n },\n};\n"],"names":["getDataSelector","name","value","_default","regions","cbcontentname","contentbank","filearea","actions","search","clearSearch","viewgrid","viewlist","sortname","sortuses","sortdate","sortsize","sorttype","sortauthor","elements","listitem","heading","cell","cbnavbarbreadcrumb","cbnavbartotalsearch","searchinput","sortbutton"],"mappings":";;;;;;;;AA+BMA,IAAAA,gBAAkB,SAACC,KAAMC,OACXD,MAAAA,SAAAA,OAAAA,kBAASC,MAAzB,KACH,EAEcC,SAAA,CACXC,QAAS,CACLC,cAAeL,gBAAgB,SAAU,mBACzCM,YAAaN,gBAAgB,SAAU,eACvCO,SAAUP,gBAAgB,SAAU,aAExCQ,QAAS,CACLC,OAAQT,gBAAgB,SAAU,iBAClCU,YAAaV,gBAAgB,SAAU,eACvCW,SAAUX,gBAAgB,SAAU,YACpCY,SAAUZ,gBAAgB,SAAU,YACpCa,SAAUb,gBAAgB,SAAU,YACpCc,SAAUd,gBAAgB,SAAU,YACpCe,SAAUf,gBAAgB,SAAU,YACpCgB,SAAUhB,gBAAgB,SAAU,YACpCiB,SAAUjB,gBAAgB,SAAU,YACpCkB,WAAYlB,gBAAgB,SAAU,eAE1CmB,SAAU,CACNC,SAAU,eACVC,QAAS,cACTC,KAAM,aACNC,mBAAoB,wBACpBC,oBAAqB,yBACrBC,YAAa,eACbC,WAAY"} \ No newline at end of file diff --git a/contentbank/amd/build/sort.min.js.map b/contentbank/amd/build/sort.min.js.map index 6078b9f9546..cca62af5cb0 100644 --- a/contentbank/amd/build/sort.min.js.map +++ b/contentbank/amd/build/sort.min.js.map @@ -1 +1 @@ -{"version":3,"file":"sort.min.js","sources":["../src/sort.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 * Content bank UI actions.\n *\n * @module core_contentbank/sort\n * @copyright 2020 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport selectors from './selectors';\nimport {get_string as getString} from 'core/str';\nimport Prefetch from 'core/prefetch';\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\n\n/**\n * Set up the contentbank views.\n *\n * @method init\n */\nexport const init = () => {\n const contentBank = document.querySelector(selectors.regions.contentbank);\n Prefetch.prefetchStrings('contentbank', ['contentname', 'uses', 'lastmodified', 'size', 'type', 'author']);\n Prefetch.prefetchStrings('moodle', ['sortbyx', 'sortbyxreverse']);\n registerListenerEvents(contentBank);\n};\n\n/**\n * Register contentbank related event listeners.\n *\n * @method registerListenerEvents\n * @param {HTMLElement} contentBank The DOM node of the content bank\n */\nconst registerListenerEvents = (contentBank) => {\n\n contentBank.addEventListener('click', e => {\n const viewList = contentBank.querySelector(selectors.actions.viewlist);\n const viewGrid = contentBank.querySelector(selectors.actions.viewgrid);\n const fileArea = contentBank.querySelector(selectors.regions.filearea);\n const shownItems = fileArea.querySelectorAll(selectors.elements.listitem);\n\n // View as Grid button.\n if (e.target.closest(selectors.actions.viewgrid)) {\n contentBank.classList.remove('view-list');\n contentBank.classList.add('view-grid');\n if (fileArea && shownItems) {\n fileArea.setAttribute('role', 'list');\n shownItems.forEach(listItem => {\n listItem.setAttribute('role', 'listitem');\n listItem.querySelectorAll(selectors.elements.cell).forEach(cell => cell.removeAttribute('role'));\n });\n\n const heading = fileArea.querySelector(selectors.elements.heading);\n heading.removeAttribute('role');\n heading.querySelectorAll(selectors.elements.cell).forEach(cell => cell.removeAttribute('role'));\n }\n viewGrid.classList.add('active');\n viewList.classList.remove('active');\n setViewListPreference(false);\n\n return;\n }\n\n // View as List button.\n if (e.target.closest(selectors.actions.viewlist)) {\n contentBank.classList.remove('view-grid');\n contentBank.classList.add('view-list');\n if (fileArea && shownItems) {\n fileArea.setAttribute('role', 'table');\n shownItems.forEach(listItem => {\n listItem.setAttribute('role', 'row');\n listItem.querySelectorAll(selectors.elements.cell).forEach(cell => cell.setAttribute('role', 'cell'));\n });\n\n const heading = fileArea.querySelector(selectors.elements.heading);\n heading.setAttribute('role', 'row');\n heading.querySelectorAll(selectors.elements.cell).forEach(cell => cell.setAttribute('role', 'columnheader'));\n }\n viewList.classList.add('active');\n viewGrid.classList.remove('active');\n setViewListPreference(true);\n\n return;\n }\n\n if (fileArea && shownItems) {\n\n // Sort by file name alphabetical\n const sortByName = e.target.closest(selectors.actions.sortname);\n if (sortByName) {\n const ascending = updateSortButtons(contentBank, sortByName);\n updateSortOrder(fileArea, shownItems, 'data-file', ascending);\n return;\n }\n\n // Sort by uses.\n const sortByUses = e.target.closest(selectors.actions.sortuses);\n if (sortByUses) {\n const ascending = updateSortButtons(contentBank, sortByUses);\n updateSortOrder(fileArea, shownItems, 'data-uses', ascending);\n return;\n }\n\n // Sort by date.\n const sortByDate = e.target.closest(selectors.actions.sortdate);\n if (sortByDate) {\n const ascending = updateSortButtons(contentBank, sortByDate);\n updateSortOrder(fileArea, shownItems, 'data-timemodified', ascending);\n return;\n }\n\n // Sort by size.\n const sortBySize = e.target.closest(selectors.actions.sortsize);\n if (sortBySize) {\n const ascending = updateSortButtons(contentBank, sortBySize);\n updateSortOrder(fileArea, shownItems, 'data-bytes', ascending);\n return;\n }\n\n // Sort by type.\n const sortByType = e.target.closest(selectors.actions.sorttype);\n if (sortByType) {\n const ascending = updateSortButtons(contentBank, sortByType);\n updateSortOrder(fileArea, shownItems, 'data-type', ascending);\n return;\n }\n\n // Sort by author.\n const sortByAuthor = e.target.closest(selectors.actions.sortauthor);\n if (sortByAuthor) {\n const ascending = updateSortButtons(contentBank, sortByAuthor);\n updateSortOrder(fileArea, shownItems, 'data-author', ascending);\n }\n return;\n }\n });\n};\n\n\n/**\n * Set the contentbank user preference in list view\n *\n * @param {Bool} viewList view ContentBank as list.\n * @return {Promise} Repository promise.\n */\nconst setViewListPreference = function(viewList) {\n\n // If the given status is not hidden, the preference has to be deleted with a null value.\n if (viewList === false) {\n viewList = null;\n }\n\n const request = {\n methodname: 'core_user_update_user_preferences',\n args: {\n preferences: [\n {\n type: 'core_contentbank_view_list',\n value: viewList\n }\n ]\n }\n };\n\n return Ajax.call([request])[0].catch(Notification.exception);\n};\n\n/**\n * Update the sort button view.\n *\n * @method updateSortButtons\n * @param {HTMLElement} contentBank The DOM node of the contentbank button\n * @param {HTMLElement} sortButton The DOM node of the sort button\n * @return {Bool} sort ascending\n */\nconst updateSortButtons = (contentBank, sortButton) => {\n const sortButtons = contentBank.querySelectorAll(selectors.elements.sortbutton);\n\n sortButtons.forEach((button) => {\n if (button !== sortButton) {\n button.classList.remove('dir-asc');\n button.classList.remove('dir-desc');\n button.classList.add('dir-none');\n\n button.closest(selectors.elements.cell).setAttribute('aria-sort', 'none');\n\n updateButtonTitle(button, false);\n }\n });\n\n let ascending = true;\n\n if (sortButton.classList.contains('dir-none')) {\n sortButton.classList.remove('dir-none');\n sortButton.classList.add('dir-asc');\n sortButton.closest(selectors.elements.cell).setAttribute('aria-sort', 'ascending');\n } else if (sortButton.classList.contains('dir-asc')) {\n sortButton.classList.remove('dir-asc');\n sortButton.classList.add('dir-desc');\n sortButton.closest(selectors.elements.cell).setAttribute('aria-sort', 'descending');\n ascending = false;\n } else if (sortButton.classList.contains('dir-desc')) {\n sortButton.classList.remove('dir-desc');\n sortButton.classList.add('dir-asc');\n sortButton.closest(selectors.elements.cell).setAttribute('aria-sort', 'ascending');\n }\n\n updateButtonTitle(sortButton, ascending);\n\n return ascending;\n};\n\n/**\n * Update the button title.\n *\n * @method updateButtonTitle\n * @param {HTMLElement} button Button to update\n * @param {Bool} ascending Sort direction\n * @return {Promise} string promise\n */\nconst updateButtonTitle = (button, ascending) => {\n\n const sortString = (ascending ? 'sortbyxreverse' : 'sortbyx');\n\n return getString(button.dataset.string, 'contentbank')\n .then(columnName => {\n return getString(sortString, 'core', columnName);\n })\n .then(sortByString => {\n button.setAttribute('title', sortByString);\n return sortByString;\n })\n .catch();\n};\n\n/**\n * Update the sort order of the itemlist and update the DOM\n *\n * @method updateSortOrder\n * @param {HTMLElement} fileArea the Dom container for the itemlist\n * @param {Array} itemList Nodelist of Dom elements\n * @param {String} attribute the attribut to sort on\n * @param {Bool} ascending Sort Ascending\n */\nconst updateSortOrder = (fileArea, itemList, attribute, ascending) => {\n const sortList = [].slice.call(itemList).sort(function(a, b) {\n\n let aa = a.getAttribute(attribute);\n let bb = b.getAttribute(attribute);\n if (!isNaN(aa)) {\n aa = parseInt(aa);\n bb = parseInt(bb);\n }\n\n if (ascending) {\n return aa > bb ? 1 : -1;\n } else {\n return aa < bb ? 1 : -1;\n }\n });\n sortList.forEach(listItem => fileArea.appendChild(listItem));\n};\n"],"names":["contentBank","document","querySelector","selectors","regions","contentbank","prefetchStrings","registerListenerEvents","addEventListener","e","viewList","actions","viewlist","viewGrid","viewgrid","fileArea","filearea","shownItems","querySelectorAll","elements","listitem","target","closest","classList","remove","add","setAttribute","forEach","listItem","cell","removeAttribute","heading","setViewListPreference","sortByName","sortname","ascending","updateSortButtons","updateSortOrder","sortByUses","sortuses","sortByDate","sortdate","sortBySize","sortsize","sortByType","sorttype","sortByAuthor","sortauthor","request","methodname","args","preferences","type","value","Ajax","call","catch","Notification","exception","sortButton","sortbutton","button","updateButtonTitle","contains","sortString","dataset","string","then","columnName","sortByString","itemList","attribute","slice","sort","a","b","aa","getAttribute","bb","isNaN","parseInt","appendChild"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sort.min.js","sources":["../src/sort.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 * Content bank UI actions.\n *\n * @module core_contentbank/sort\n * @copyright 2020 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport selectors from './selectors';\nimport {get_string as getString} from 'core/str';\nimport Prefetch from 'core/prefetch';\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\n\n/**\n * Set up the contentbank views.\n *\n * @method init\n */\nexport const init = () => {\n const contentBank = document.querySelector(selectors.regions.contentbank);\n Prefetch.prefetchStrings('contentbank', ['contentname', 'uses', 'lastmodified', 'size', 'type', 'author']);\n Prefetch.prefetchStrings('moodle', ['sortbyx', 'sortbyxreverse']);\n registerListenerEvents(contentBank);\n};\n\n/**\n * Register contentbank related event listeners.\n *\n * @method registerListenerEvents\n * @param {HTMLElement} contentBank The DOM node of the content bank\n */\nconst registerListenerEvents = (contentBank) => {\n\n contentBank.addEventListener('click', e => {\n const viewList = contentBank.querySelector(selectors.actions.viewlist);\n const viewGrid = contentBank.querySelector(selectors.actions.viewgrid);\n const fileArea = contentBank.querySelector(selectors.regions.filearea);\n const shownItems = fileArea.querySelectorAll(selectors.elements.listitem);\n\n // View as Grid button.\n if (e.target.closest(selectors.actions.viewgrid)) {\n contentBank.classList.remove('view-list');\n contentBank.classList.add('view-grid');\n if (fileArea && shownItems) {\n fileArea.setAttribute('role', 'list');\n shownItems.forEach(listItem => {\n listItem.setAttribute('role', 'listitem');\n listItem.querySelectorAll(selectors.elements.cell).forEach(cell => cell.removeAttribute('role'));\n });\n\n const heading = fileArea.querySelector(selectors.elements.heading);\n heading.removeAttribute('role');\n heading.querySelectorAll(selectors.elements.cell).forEach(cell => cell.removeAttribute('role'));\n }\n viewGrid.classList.add('active');\n viewList.classList.remove('active');\n setViewListPreference(false);\n\n return;\n }\n\n // View as List button.\n if (e.target.closest(selectors.actions.viewlist)) {\n contentBank.classList.remove('view-grid');\n contentBank.classList.add('view-list');\n if (fileArea && shownItems) {\n fileArea.setAttribute('role', 'table');\n shownItems.forEach(listItem => {\n listItem.setAttribute('role', 'row');\n listItem.querySelectorAll(selectors.elements.cell).forEach(cell => cell.setAttribute('role', 'cell'));\n });\n\n const heading = fileArea.querySelector(selectors.elements.heading);\n heading.setAttribute('role', 'row');\n heading.querySelectorAll(selectors.elements.cell).forEach(cell => cell.setAttribute('role', 'columnheader'));\n }\n viewList.classList.add('active');\n viewGrid.classList.remove('active');\n setViewListPreference(true);\n\n return;\n }\n\n if (fileArea && shownItems) {\n\n // Sort by file name alphabetical\n const sortByName = e.target.closest(selectors.actions.sortname);\n if (sortByName) {\n const ascending = updateSortButtons(contentBank, sortByName);\n updateSortOrder(fileArea, shownItems, 'data-file', ascending);\n return;\n }\n\n // Sort by uses.\n const sortByUses = e.target.closest(selectors.actions.sortuses);\n if (sortByUses) {\n const ascending = updateSortButtons(contentBank, sortByUses);\n updateSortOrder(fileArea, shownItems, 'data-uses', ascending);\n return;\n }\n\n // Sort by date.\n const sortByDate = e.target.closest(selectors.actions.sortdate);\n if (sortByDate) {\n const ascending = updateSortButtons(contentBank, sortByDate);\n updateSortOrder(fileArea, shownItems, 'data-timemodified', ascending);\n return;\n }\n\n // Sort by size.\n const sortBySize = e.target.closest(selectors.actions.sortsize);\n if (sortBySize) {\n const ascending = updateSortButtons(contentBank, sortBySize);\n updateSortOrder(fileArea, shownItems, 'data-bytes', ascending);\n return;\n }\n\n // Sort by type.\n const sortByType = e.target.closest(selectors.actions.sorttype);\n if (sortByType) {\n const ascending = updateSortButtons(contentBank, sortByType);\n updateSortOrder(fileArea, shownItems, 'data-type', ascending);\n return;\n }\n\n // Sort by author.\n const sortByAuthor = e.target.closest(selectors.actions.sortauthor);\n if (sortByAuthor) {\n const ascending = updateSortButtons(contentBank, sortByAuthor);\n updateSortOrder(fileArea, shownItems, 'data-author', ascending);\n }\n return;\n }\n });\n};\n\n\n/**\n * Set the contentbank user preference in list view\n *\n * @param {Bool} viewList view ContentBank as list.\n * @return {Promise} Repository promise.\n */\nconst setViewListPreference = function(viewList) {\n\n // If the given status is not hidden, the preference has to be deleted with a null value.\n if (viewList === false) {\n viewList = null;\n }\n\n const request = {\n methodname: 'core_user_update_user_preferences',\n args: {\n preferences: [\n {\n type: 'core_contentbank_view_list',\n value: viewList\n }\n ]\n }\n };\n\n return Ajax.call([request])[0].catch(Notification.exception);\n};\n\n/**\n * Update the sort button view.\n *\n * @method updateSortButtons\n * @param {HTMLElement} contentBank The DOM node of the contentbank button\n * @param {HTMLElement} sortButton The DOM node of the sort button\n * @return {Bool} sort ascending\n */\nconst updateSortButtons = (contentBank, sortButton) => {\n const sortButtons = contentBank.querySelectorAll(selectors.elements.sortbutton);\n\n sortButtons.forEach((button) => {\n if (button !== sortButton) {\n button.classList.remove('dir-asc');\n button.classList.remove('dir-desc');\n button.classList.add('dir-none');\n\n button.closest(selectors.elements.cell).setAttribute('aria-sort', 'none');\n\n updateButtonTitle(button, false);\n }\n });\n\n let ascending = true;\n\n if (sortButton.classList.contains('dir-none')) {\n sortButton.classList.remove('dir-none');\n sortButton.classList.add('dir-asc');\n sortButton.closest(selectors.elements.cell).setAttribute('aria-sort', 'ascending');\n } else if (sortButton.classList.contains('dir-asc')) {\n sortButton.classList.remove('dir-asc');\n sortButton.classList.add('dir-desc');\n sortButton.closest(selectors.elements.cell).setAttribute('aria-sort', 'descending');\n ascending = false;\n } else if (sortButton.classList.contains('dir-desc')) {\n sortButton.classList.remove('dir-desc');\n sortButton.classList.add('dir-asc');\n sortButton.closest(selectors.elements.cell).setAttribute('aria-sort', 'ascending');\n }\n\n updateButtonTitle(sortButton, ascending);\n\n return ascending;\n};\n\n/**\n * Update the button title.\n *\n * @method updateButtonTitle\n * @param {HTMLElement} button Button to update\n * @param {Bool} ascending Sort direction\n * @return {Promise} string promise\n */\nconst updateButtonTitle = (button, ascending) => {\n\n const sortString = (ascending ? 'sortbyxreverse' : 'sortbyx');\n\n return getString(button.dataset.string, 'contentbank')\n .then(columnName => {\n return getString(sortString, 'core', columnName);\n })\n .then(sortByString => {\n button.setAttribute('title', sortByString);\n return sortByString;\n })\n .catch();\n};\n\n/**\n * Update the sort order of the itemlist and update the DOM\n *\n * @method updateSortOrder\n * @param {HTMLElement} fileArea the Dom container for the itemlist\n * @param {Array} itemList Nodelist of Dom elements\n * @param {String} attribute the attribut to sort on\n * @param {Bool} ascending Sort Ascending\n */\nconst updateSortOrder = (fileArea, itemList, attribute, ascending) => {\n const sortList = [].slice.call(itemList).sort(function(a, b) {\n\n let aa = a.getAttribute(attribute);\n let bb = b.getAttribute(attribute);\n if (!isNaN(aa)) {\n aa = parseInt(aa);\n bb = parseInt(bb);\n }\n\n if (ascending) {\n return aa > bb ? 1 : -1;\n } else {\n return aa < bb ? 1 : -1;\n }\n });\n sortList.forEach(listItem => fileArea.appendChild(listItem));\n};\n"],"names":["_selectors","_interopRequireDefault","_prefetch","_ajax","_notification","contentBank","document","querySelector","selectors","regions","contentbank","Prefetch","prefetchStrings","registerListenerEvents","addEventListener","e","viewList","actions","viewlist","viewGrid","viewgrid","fileArea","filearea","shownItems","querySelectorAll","elements","listitem","target","closest","classList","remove","add","setAttribute","forEach","listItem","cell","removeAttribute","heading","setViewListPreference","sortByName","sortname","ascending","updateSortButtons","updateSortOrder","sortByUses","sortuses","sortByDate","sortdate","sortBySize","sortsize","sortByType","sorttype","sortByAuthor","sortauthor","request","methodname","args","preferences","type","value","Ajax","call","catch","Notification","exception","sortButton","sortbutton","button","updateButtonTitle","contains","sortString","dataset","string","then","columnName","sortByString","itemList","attribute","slice","sort","a","b","aa","getAttribute","bb","isNaN","parseInt","appendChild"],"mappings":"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"} \ No newline at end of file diff --git a/contentbank/amd/build/upload.min.js.map b/contentbank/amd/build/upload.min.js.map index b40edcaab09..3937f230a21 100644 --- a/contentbank/amd/build/upload.min.js.map +++ b/contentbank/amd/build/upload.min.js.map @@ -1 +1 @@ -{"version":3,"file":"upload.min.js","sources":["../src/upload.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 handle AJAX interactions with content bank upload files.\n *\n * @module core_contentbank/upload\n * @copyright 2021 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport ModalForm from 'core_form/modalform';\nimport {get_string as getString} from 'core/str';\n\n/**\n * Initialize upload files to the content bank form as Modal form.\n *\n * @param {String} elementSelector\n * @param {String} formClass\n * @param {Integer} contextId\n * @param {Integer} contentId\n */\nexport const initModal = (elementSelector, formClass, contextId, contentId) => {\n const element = document.querySelector(elementSelector);\n element.addEventListener('click', function(e) {\n e.preventDefault();\n const form = new ModalForm({\n formClass,\n args: {\n contextid: contextId,\n id: contentId,\n },\n modalConfig: {title: getString('upload', 'contentbank')},\n returnFocus: e.target,\n });\n form.addEventListener(form.events.FORM_SUBMITTED, (event) => {\n document.location = event.detail.returnurl;\n });\n form.show();\n });\n};\n"],"names":["elementSelector","formClass","contextId","contentId","document","querySelector","addEventListener","e","preventDefault","form","ModalForm","args","contextid","id","modalConfig","title","returnFocus","target","events","FORM_SUBMITTED","event","location","detail","returnurl","show"],"mappings":";;;;;;;wKAiCyB,SAACA,gBAAiBC,UAAWC,UAAWC,WAC7CC,SAASC,cAAcL,iBAC/BM,iBAAiB,SAAS,SAASC,GACvCA,EAAEC,qBACIC,KAAO,IAAIC,mBAAU,CACvBT,UAAAA,UACAU,KAAM,CACFC,UAAWV,UACXW,GAAIV,WAERW,YAAa,CAACC,OAAO,mBAAU,SAAU,gBACzCC,YAAaT,EAAEU,SAEnBR,KAAKH,iBAAiBG,KAAKS,OAAOC,gBAAgB,SAACC,OAC/ChB,SAASiB,SAAWD,MAAME,OAAOC,aAErCd,KAAKe"} \ No newline at end of file +{"version":3,"file":"upload.min.js","sources":["../src/upload.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 handle AJAX interactions with content bank upload files.\n *\n * @module core_contentbank/upload\n * @copyright 2021 Sara Arjona \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport ModalForm from 'core_form/modalform';\nimport {get_string as getString} from 'core/str';\n\n/**\n * Initialize upload files to the content bank form as Modal form.\n *\n * @param {String} elementSelector\n * @param {String} formClass\n * @param {Integer} contextId\n * @param {Integer} contentId\n */\nexport const initModal = (elementSelector, formClass, contextId, contentId) => {\n const element = document.querySelector(elementSelector);\n element.addEventListener('click', function(e) {\n e.preventDefault();\n const form = new ModalForm({\n formClass,\n args: {\n contextid: contextId,\n id: contentId,\n },\n modalConfig: {title: getString('upload', 'contentbank')},\n returnFocus: e.target,\n });\n form.addEventListener(form.events.FORM_SUBMITTED, (event) => {\n document.location = event.detail.returnurl;\n });\n form.show();\n });\n};\n"],"names":["_modalform","elementSelector","formClass","contextId","contentId","document","querySelector","addEventListener","e","preventDefault","form","ModalForm","args","contextid","id","modalConfig","title","_str","get_string","returnFocus","target","events","FORM_SUBMITTED","event","location","detail","returnurl","show"],"mappings":";;;;;;;uFAsBAA,gBAAAA,iEAWyB,SAACC,gBAAiBC,UAAWC,UAAWC,WAC7CC,SAASC,cAAcL,iBAC/BM,iBAAiB,SAAS,SAASC,GACvCA,EAAEC,iBACF,IAAMC,KAAO,IAAIC,WAAAA,QAAU,CACvBT,UAAAA,UACAU,KAAM,CACFC,UAAWV,UACXW,GAAIV,WAERW,YAAa,CAACC,OAAO,EAAUC,KAAAC,YAAA,SAAU,gBACzCC,YAAaX,EAAEY,SAEnBV,KAAKH,iBAAiBG,KAAKW,OAAOC,gBAAgB,SAACC,OAC/ClB,SAASmB,SAAWD,MAAME,OAAOC,SACpC,IACDhB,KAAKiB,MACR,GACJ"} \ No newline at end of file diff --git a/course/amd/build/actions.min.js.map b/course/amd/build/actions.min.js.map index 117e6e41f31..7eafa8e09ff 100644 --- a/course/amd/build/actions.min.js.map +++ b/course/amd/build/actions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"actions.min.js","sources":["../src/actions.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 * Various actions on modules and sections in the editing mode - hiding, duplicating, deleting, etc.\n *\n * @module core_course/actions\n * @copyright 2016 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.3\n */\ndefine(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str', 'core/url', 'core/yui',\n 'core/modal_factory', 'core/modal_events', 'core/key_codes', 'core/log'],\n function($, ajax, templates, notification, str, url, Y, ModalFactory, ModalEvents, KeyCodes, log) {\n var CSS = {\n EDITINPROGRESS: 'editinprogress',\n SECTIONDRAGGABLE: 'sectiondraggable',\n EDITINGMOVE: 'editing_move'\n };\n var SELECTOR = {\n ACTIVITYLI: 'li.activity',\n ACTIONAREA: '.actions',\n ACTIVITYACTION: 'a.cm-edit-action',\n MENU: '.moodle-actionmenu[data-enhance=moodle-core-actionmenu]',\n TOGGLE: '.toggle-display,.dropdown-toggle',\n SECTIONLI: 'li.section',\n SECTIONACTIONMENU: '.section_action_menu',\n ADDSECTIONS: '#changenumsections [data-add-sections]'\n };\n\n Y.use('moodle-course-coursebase', function() {\n var courseformatselector = M.course.format.get_section_selector();\n if (courseformatselector) {\n SELECTOR.SECTIONLI = courseformatselector;\n }\n });\n\n /**\n * Wrapper for Y.Moodle.core_course.util.cm.getId\n *\n * @param {JQuery} element\n * @returns {Integer}\n */\n var getModuleId = function(element) {\n var id;\n Y.use('moodle-course-util', function(Y) {\n id = Y.Moodle.core_course.util.cm.getId(Y.Node(element.get(0)));\n });\n return id;\n };\n\n /**\n * Wrapper for Y.Moodle.core_course.util.cm.getName\n *\n * @param {JQuery} element\n * @returns {String}\n */\n var getModuleName = function(element) {\n var name;\n Y.use('moodle-course-util', function(Y) {\n name = Y.Moodle.core_course.util.cm.getName(Y.Node(element.get(0)));\n });\n return name;\n };\n\n /**\n * Wrapper for M.util.add_spinner for an activity\n *\n * @param {JQuery} activity\n * @returns {Node}\n */\n var addActivitySpinner = function(activity) {\n activity.addClass(CSS.EDITINPROGRESS);\n var actionarea = activity.find(SELECTOR.ACTIONAREA).get(0);\n if (actionarea) {\n var spinner = M.util.add_spinner(Y, Y.Node(actionarea));\n spinner.show();\n return spinner;\n }\n return null;\n };\n\n /**\n * Wrapper for M.util.add_spinner for a section\n *\n * @param {JQuery} sectionelement\n * @returns {Node}\n */\n var addSectionSpinner = function(sectionelement) {\n sectionelement.addClass(CSS.EDITINPROGRESS);\n var actionarea = sectionelement.find(SELECTOR.SECTIONACTIONMENU).get(0);\n if (actionarea) {\n var spinner = M.util.add_spinner(Y, Y.Node(actionarea));\n spinner.show();\n return spinner;\n }\n return null;\n };\n\n /**\n * Wrapper for M.util.add_lightbox\n *\n * @param {JQuery} sectionelement\n * @returns {Node}\n */\n var addSectionLightbox = function(sectionelement) {\n var lightbox = M.util.add_lightbox(Y, Y.Node(sectionelement.get(0)));\n lightbox.show();\n return lightbox;\n };\n\n /**\n * Removes the spinner element\n *\n * @param {JQuery} element\n * @param {Node} spinner\n * @param {Number} delay\n */\n var removeSpinner = function(element, spinner, delay) {\n window.setTimeout(function() {\n element.removeClass(CSS.EDITINPROGRESS);\n if (spinner) {\n spinner.hide();\n }\n }, delay);\n };\n\n /**\n * Removes the lightbox element\n *\n * @param {Node} lightbox lighbox YUI element returned by addSectionLightbox\n * @param {Number} delay\n */\n var removeLightbox = function(lightbox, delay) {\n if (lightbox) {\n window.setTimeout(function() {\n lightbox.hide();\n }, delay);\n }\n };\n\n /**\n * Initialise action menu for the element (section or module)\n *\n * @param {String} elementid CSS id attribute of the element\n */\n var initActionMenu = function(elementid) {\n // Initialise action menu in the new activity.\n Y.use('moodle-course-coursebase', function() {\n M.course.coursebase.invoke_function('setup_for_resource', '#' + elementid);\n });\n if (M.core.actionmenu && M.core.actionmenu.newDOMNode) {\n M.core.actionmenu.newDOMNode(Y.one('#' + elementid));\n }\n };\n\n /**\n * Returns focus to the element that was clicked or \"Edit\" link if element is no longer visible.\n *\n * @param {String} elementId CSS id attribute of the element\n * @param {String} action data-action property of the element that was clicked\n */\n var focusActionItem = function(elementId, action) {\n var mainelement = $('#' + elementId);\n var selector = '[data-action=' + action + ']';\n if (action === 'groupsseparate' || action === 'groupsvisible' || action === 'groupsnone') {\n // New element will have different data-action.\n selector = '[data-action=groupsseparate],[data-action=groupsvisible],[data-action=groupsnone]';\n }\n if (mainelement.find(selector).is(':visible')) {\n mainelement.find(selector).focus();\n } else {\n // Element not visible, focus the \"Edit\" link.\n mainelement.find(SELECTOR.MENU).find(SELECTOR.TOGGLE).focus();\n }\n };\n\n /**\n * Find next after the element\n *\n * @param {JQuery} mainElement element that is about to be deleted\n * @returns {JQuery}\n */\n var findNextFocusable = function(mainElement) {\n var tabables = $(\"a:visible\");\n var isInside = false;\n var foundElement = null;\n tabables.each(function() {\n if ($.contains(mainElement[0], this)) {\n isInside = true;\n } else if (isInside) {\n foundElement = this;\n return false; // Returning false in .each() is equivalent to \"break;\" inside the loop in php.\n }\n });\n return foundElement;\n };\n\n /**\n * Performs an action on a module (moving, deleting, duplicating, hiding, etc.)\n *\n * @param {JQuery} moduleElement activity element we perform action on\n * @param {Number} cmid\n * @param {JQuery} target the element (menu item) that was clicked\n */\n var editModule = function(moduleElement, cmid, target) {\n var action = target.attr('data-action');\n var spinner = addActivitySpinner(moduleElement);\n var promises = ajax.call([{\n methodname: 'core_course_edit_module',\n args: {id: cmid,\n action: action,\n sectionreturn: target.attr('data-sectionreturn') ? target.attr('data-sectionreturn') : 0\n }\n }], true);\n\n var lightbox;\n if (action === 'duplicate') {\n lightbox = addSectionLightbox(target.closest(SELECTOR.SECTIONLI));\n }\n $.when.apply($, promises)\n .done(function(data) {\n var elementToFocus = findNextFocusable(moduleElement);\n moduleElement.replaceWith(data);\n // Initialise action menu for activity(ies) added as a result of this.\n $('
          ' + data + '
          ').find(SELECTOR.ACTIVITYLI).each(function(index) {\n initActionMenu($(this).attr('id'));\n if (index === 0) {\n focusActionItem($(this).attr('id'), action);\n elementToFocus = null;\n }\n });\n // In case of activity deletion focus the next focusable element.\n if (elementToFocus) {\n elementToFocus.focus();\n }\n // Remove spinner and lightbox with a delay.\n removeSpinner(moduleElement, spinner, 400);\n removeLightbox(lightbox, 400);\n // Trigger event that can be observed by course formats.\n moduleElement.trigger($.Event('coursemoduleedited', {ajaxreturn: data, action: action}));\n }).fail(function(ex) {\n // Remove spinner and lightbox.\n removeSpinner(moduleElement, spinner);\n removeLightbox(lightbox);\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursemoduleeditfailed', {exception: ex, action: action});\n moduleElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n notification.exception(ex);\n }\n });\n };\n\n /**\n * Requests html for the module via WS core_course_get_module and updates the module on the course page\n *\n * Used after d&d of the module to another section\n *\n * @param {JQuery} activityElement\n * @param {Number} cmid\n * @param {Number} sectionreturn\n */\n var refreshModule = function(activityElement, cmid, sectionreturn) {\n var spinner = addActivitySpinner(activityElement);\n var promises = ajax.call([{\n methodname: 'core_course_get_module',\n args: {id: cmid, sectionreturn: sectionreturn}\n }], true);\n\n $.when.apply($, promises)\n .done(function(data) {\n removeSpinner(activityElement, spinner, 400);\n replaceActivityHtmlWith(data);\n }).fail(function() {\n removeSpinner(activityElement, spinner);\n });\n };\n\n /**\n * Displays the delete confirmation to delete a module\n *\n * @param {JQuery} mainelement activity element we perform action on\n * @param {function} onconfirm function to execute on confirm\n */\n var confirmDeleteModule = function(mainelement, onconfirm) {\n var modtypename = mainelement.attr('class').match(/modtype_([^\\s]*)/)[1];\n var modulename = getModuleName(mainelement);\n\n str.get_string('pluginname', modtypename).done(function(pluginname) {\n var plugindata = {\n type: pluginname,\n name: modulename\n };\n str.get_strings([\n {key: 'confirm'},\n {key: modulename === null ? 'deletechecktype' : 'deletechecktypename', param: plugindata},\n {key: 'yes'},\n {key: 'no'}\n ]).done(function(s) {\n notification.confirm(s[0], s[1], s[2], s[3], onconfirm);\n }\n );\n });\n };\n\n /**\n * Displays the delete confirmation to delete a section\n *\n * @param {String} message confirmation message\n * @param {function} onconfirm function to execute on confirm\n */\n var confirmEditSection = function(message, onconfirm) {\n str.get_strings([\n {key: 'confirm'}, // TODO link text\n {key: 'yes'},\n {key: 'no'}\n ]).done(function(s) {\n notification.confirm(s[0], message, s[1], s[2], onconfirm);\n }\n );\n };\n\n /**\n * Replaces an action menu item with another one (for example Show->Hide, Set marker->Remove marker)\n *\n * @param {JQuery} actionitem\n * @param {String} image new image name (\"i/show\", \"i/hide\", etc.)\n * @param {String} stringname new string for the action menu item\n * @param {String} stringcomponent\n * @param {String} newaction new value for data-action attribute of the link\n * @return {Promise} promise which is resolved when the replacement has completed\n */\n var replaceActionItem = function(actionitem, image, stringname,\n stringcomponent, newaction) {\n\n var stringRequests = [{key: stringname, component: stringcomponent}];\n // Do not provide an icon with duplicate, different text to the menu item.\n\n return str.get_strings(stringRequests).then(function(strings) {\n actionitem.find('span.menu-action-text').html(strings[0]);\n\n return templates.renderPix(image, 'core');\n }).then(function(pixhtml) {\n actionitem.find('.icon').replaceWith(pixhtml);\n actionitem.attr('data-action', newaction);\n return;\n }).catch(notification.exception);\n };\n\n /**\n * Default post-processing for section AJAX edit actions.\n *\n * This can be overridden in course formats by listening to event coursesectionedited:\n *\n * $('body').on('coursesectionedited', 'li.section', function(e) {\n * var action = e.action,\n * sectionElement = $(e.target),\n * data = e.ajaxreturn;\n * // ... Do some processing here.\n * e.preventDefault(); // Prevent default handler.\n * });\n *\n * @param {JQuery} sectionElement\n * @param {JQuery} actionItem\n * @param {Object} data\n * @param {String} courseformat\n */\n var defaultEditSectionHandler = function(sectionElement, actionItem, data, courseformat) {\n var action = actionItem.attr('data-action');\n if (action === 'hide' || action === 'show') {\n if (action === 'hide') {\n sectionElement.addClass('hidden');\n replaceActionItem(actionItem, 'i/show',\n 'showfromothers', 'format_' + courseformat, 'show');\n } else {\n sectionElement.removeClass('hidden');\n replaceActionItem(actionItem, 'i/hide',\n 'hidefromothers', 'format_' + courseformat, 'hide');\n }\n // Replace the modules with new html (that indicates that they are now hidden or not hidden).\n if (data.modules !== undefined) {\n for (var i in data.modules) {\n replaceActivityHtmlWith(data.modules[i]);\n }\n }\n // Replace the section availability information.\n if (data.section_availability !== undefined) {\n sectionElement.find('.section_availability').first().replaceWith(data.section_availability);\n }\n } else if (action === 'setmarker') {\n var oldmarker = $(SELECTOR.SECTIONLI + '.current'),\n oldActionItem = oldmarker.find(SELECTOR.SECTIONACTIONMENU + ' ' + 'a[data-action=removemarker]');\n oldmarker.removeClass('current');\n replaceActionItem(oldActionItem, 'i/marker',\n 'highlight', 'core', 'setmarker');\n sectionElement.addClass('current');\n replaceActionItem(actionItem, 'i/marked',\n 'highlightoff', 'core', 'removemarker');\n } else if (action === 'removemarker') {\n sectionElement.removeClass('current');\n replaceActionItem(actionItem, 'i/marker',\n 'highlight', 'core', 'setmarker');\n }\n };\n\n /**\n * Replaces the course module with the new html (used to update module after it was edited or its visibility was changed).\n *\n * @param {String} activityHTML\n */\n var replaceActivityHtmlWith = function(activityHTML) {\n $('
          ' + activityHTML + '
          ').find(SELECTOR.ACTIVITYLI).each(function() {\n // Extract id from the new activity html.\n var id = $(this).attr('id');\n // Find the existing element with the same id and replace its contents with new html.\n $(SELECTOR.ACTIVITYLI + '#' + id).replaceWith(activityHTML);\n // Initialise action menu.\n initActionMenu(id);\n });\n };\n\n /**\n * Performs an action on a module (moving, deleting, duplicating, hiding, etc.)\n *\n * @param {JQuery} sectionElement section element we perform action on\n * @param {Nunmber} sectionid\n * @param {JQuery} target the element (menu item) that was clicked\n * @param {String} courseformat\n */\n var editSection = function(sectionElement, sectionid, target, courseformat) {\n var action = target.attr('data-action'),\n sectionreturn = target.attr('data-sectionreturn') ? target.attr('data-sectionreturn') : 0;\n var spinner = addSectionSpinner(sectionElement);\n var promises = ajax.call([{\n methodname: 'core_course_edit_section',\n args: {id: sectionid, action: action, sectionreturn: sectionreturn}\n }], true);\n\n var lightbox = addSectionLightbox(sectionElement);\n $.when.apply($, promises)\n .done(function(dataencoded) {\n var data = $.parseJSON(dataencoded);\n removeSpinner(sectionElement, spinner);\n removeLightbox(lightbox);\n sectionElement.find(SELECTOR.SECTIONACTIONMENU).find(SELECTOR.TOGGLE).focus();\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursesectionedited', {ajaxreturn: data, action: action});\n sectionElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n defaultEditSectionHandler(sectionElement, target, data, courseformat);\n }\n }).fail(function(ex) {\n // Remove spinner and lightbox.\n removeSpinner(sectionElement, spinner);\n removeLightbox(lightbox);\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursesectioneditfailed', {exception: ex, action: action});\n sectionElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n notification.exception(ex);\n }\n });\n };\n\n // Register a function to be executed after D&D of an activity.\n Y.use('moodle-course-coursebase', function() {\n M.course.coursebase.register_module({\n // Ignore camelcase eslint rule for the next line because it is an expected name of the callback.\n // eslint-disable-next-line camelcase\n set_visibility_resource_ui: function(args) {\n var mainelement = $(args.element.getDOMNode());\n var cmid = getModuleId(mainelement);\n if (cmid) {\n var sectionreturn = mainelement.find('.' + CSS.EDITINGMOVE).attr('data-sectionreturn');\n refreshModule(mainelement, cmid, sectionreturn);\n }\n }\n });\n });\n\n return /** @alias module:core_course/actions */ {\n\n /**\n * Initialises course page\n *\n * @method init\n * @param {String} courseformat name of the current course format (for fetching strings)\n */\n initCoursePage: function(courseformat) {\n\n // Add a handler for course module actions.\n $('body').on('click keypress', SELECTOR.ACTIVITYLI + ' ' +\n SELECTOR.ACTIVITYACTION + '[data-action]', function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n var actionItem = $(this),\n moduleElement = actionItem.closest(SELECTOR.ACTIVITYLI),\n action = actionItem.attr('data-action'),\n moduleId = getModuleId(moduleElement);\n switch (action) {\n case 'moveleft':\n case 'moveright':\n case 'delete':\n case 'duplicate':\n case 'hide':\n case 'stealth':\n case 'show':\n case 'groupsseparate':\n case 'groupsvisible':\n case 'groupsnone':\n break;\n default:\n // Nothing to do here!\n return;\n }\n if (!moduleId) {\n return;\n }\n e.preventDefault();\n if (action === 'delete') {\n // Deleting requires confirmation.\n confirmDeleteModule(moduleElement, function() {\n editModule(moduleElement, moduleId, actionItem);\n });\n } else {\n editModule(moduleElement, moduleId, actionItem);\n }\n });\n\n // Add a handler for section show/hide actions.\n $('body').on('click keypress', SELECTOR.SECTIONLI + ' ' +\n SELECTOR.SECTIONACTIONMENU + '[data-sectionid] ' +\n 'a[data-action]', function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n var actionItem = $(this),\n sectionElement = actionItem.closest(SELECTOR.SECTIONLI),\n sectionId = actionItem.closest(SELECTOR.SECTIONACTIONMENU).attr('data-sectionid');\n e.preventDefault();\n if (actionItem.attr('data-confirm')) {\n // Action requires confirmation.\n confirmEditSection(actionItem.attr('data-confirm'), function() {\n editSection(sectionElement, sectionId, actionItem, courseformat);\n });\n } else {\n editSection(sectionElement, sectionId, actionItem, courseformat);\n }\n });\n\n // Add a handler for \"Add sections\" link to ask for a number of sections to add.\n str.get_string('numberweeks').done(function(strNumberSections) {\n var trigger = $(SELECTOR.ADDSECTIONS),\n modalTitle = trigger.attr('data-add-sections'),\n newSections = trigger.attr('data-new-sections');\n var modalBody = $('
          ' +\n '
          ');\n modalBody.find('label').html(strNumberSections);\n ModalFactory.create({\n title: modalTitle,\n type: ModalFactory.types.SAVE_CANCEL,\n body: modalBody.html()\n }, trigger)\n .done(function(modal) {\n var numSections = $(modal.getBody()).find('#add_section_numsections'),\n addSections = function() {\n // Check if value of the \"Number of sections\" is a valid positive integer and redirect\n // to adding a section script.\n if ('' + parseInt(numSections.val()) === numSections.val() && parseInt(numSections.val()) >= 1) {\n document.location = trigger.attr('href') + '&numsections=' + parseInt(numSections.val());\n }\n };\n modal.setSaveButtonText(modalTitle);\n modal.getRoot().on(ModalEvents.shown, function() {\n // When modal is shown focus and select the input and add a listener to keypress of \"Enter\".\n numSections.focus().select().on('keydown', function(e) {\n if (e.keyCode === KeyCodes.enter) {\n addSections();\n }\n });\n });\n modal.getRoot().on(ModalEvents.save, function(e) {\n // When modal \"Add\" button is pressed.\n e.preventDefault();\n addSections();\n });\n });\n });\n },\n\n /**\n * Replaces a section action menu item with another one (for example Show->Hide, Set marker->Remove marker)\n *\n * This method can be used by course formats in their listener to the coursesectionedited event\n *\n * @deprecated since Moodle 3.9\n * @param {JQuery} sectionelement\n * @param {String} selector CSS selector inside the section element, for example \"a[data-action=show]\"\n * @param {String} image new image name (\"i/show\", \"i/hide\", etc.)\n * @param {String} stringname new string for the action menu item\n * @param {String} stringcomponent\n * @param {String} newaction new value for data-action attribute of the link\n */\n replaceSectionActionItem: function(sectionelement, selector, image, stringname,\n stringcomponent, newaction) {\n log.debug('replaceSectionActionItem() is deprecated and will be removed.');\n var actionitem = sectionelement.find(SELECTOR.SECTIONACTIONMENU + ' ' + selector);\n replaceActionItem(actionitem, image, stringname, stringcomponent, newaction);\n }\n };\n });\n"],"names":["define","$","ajax","templates","notification","str","url","Y","ModalFactory","ModalEvents","KeyCodes","log","CSS","SELECTOR","ACTIVITYLI","ACTIONAREA","ACTIVITYACTION","MENU","TOGGLE","SECTIONLI","SECTIONACTIONMENU","ADDSECTIONS","use","courseformatselector","M","course","format","get_section_selector","getModuleId","element","id","Moodle","core_course","util","cm","getId","Node","get","addActivitySpinner","activity","addClass","actionarea","find","spinner","add_spinner","show","addSectionLightbox","sectionelement","lightbox","add_lightbox","removeSpinner","delay","window","setTimeout","removeClass","hide","removeLightbox","initActionMenu","elementid","coursebase","invoke_function","core","actionmenu","newDOMNode","one","editModule","moduleElement","cmid","target","action","attr","promises","call","methodname","args","sectionreturn","closest","when","apply","done","data","mainElement","tabables","isInside","foundElement","elementToFocus","each","contains","this","replaceWith","index","elementId","mainelement","selector","is","focus","focusActionItem","trigger","Event","ajaxreturn","fail","ex","e","exception","isDefaultPrevented","confirmDeleteModule","onconfirm","name","modtypename","match","modulename","getName","get_string","pluginname","plugindata","type","get_strings","key","param","s","confirm","replaceActionItem","actionitem","image","stringname","stringcomponent","newaction","stringRequests","component","then","strings","html","renderPix","pixhtml","catch","replaceActivityHtmlWith","activityHTML","editSection","sectionElement","sectionid","courseformat","addSectionSpinner","dataencoded","parseJSON","actionItem","undefined","modules","i","section_availability","first","oldmarker","oldActionItem","defaultEditSectionHandler","register_module","set_visibility_resource_ui","getDOMNode","activityElement","refreshModule","initCoursePage","on","keyCode","moduleId","preventDefault","message","sectionId","strNumberSections","modalTitle","newSections","modalBody","create","title","types","SAVE_CANCEL","body","modal","numSections","getBody","addSections","parseInt","val","document","location","setSaveButtonText","getRoot","shown","select","enter","save","replaceSectionActionItem","debug"],"mappings":";;;;;;;;AAuBAA,6BAAO,CAAC,SAAU,YAAa,iBAAkB,oBAAqB,WAAY,WAAY,WACtF,qBAAsB,oBAAqB,iBAAkB,aACjE,SAASC,EAAGC,KAAMC,UAAWC,aAAcC,IAAKC,IAAKC,EAAGC,aAAcC,YAAaC,SAAUC,SACrFC,mBACgB,iBADhBA,gBAGa,eAEbC,SAAW,CACXC,WAAY,cACZC,WAAY,WACZC,eAAgB,mBAChBC,KAAM,0DACNC,OAAQ,mCACRC,UAAW,aACXC,kBAAmB,uBACnBC,YAAa,0CAGjBd,EAAEe,IAAI,4BAA4B,eAC1BC,qBAAuBC,EAAEC,OAAOC,OAAOC,uBACvCJ,uBACAV,SAASM,UAAYI,6BAUzBK,YAAc,SAASC,aACnBC,UACJvB,EAAEe,IAAI,sBAAsB,SAASf,GACjCuB,GAAKvB,EAAEwB,OAAOC,YAAYC,KAAKC,GAAGC,MAAM5B,EAAE6B,KAAKP,QAAQQ,IAAI,QAExDP,IAuBPQ,mBAAqB,SAASC,UAC9BA,SAASC,SAAS5B,wBACd6B,WAAaF,SAASG,KAAK7B,SAASE,YAAYsB,IAAI,MACpDI,WAAY,KACRE,QAAUnB,EAAES,KAAKW,YAAYrC,EAAGA,EAAE6B,KAAKK,oBAC3CE,QAAQE,OACDF,eAEJ,MA0BPG,mBAAqB,SAASC,oBAC1BC,SAAWxB,EAAES,KAAKgB,aAAa1C,EAAGA,EAAE6B,KAAKW,eAAeV,IAAI,YAChEW,SAASH,OACFG,UAUPE,cAAgB,SAASrB,QAASc,QAASQ,OAC3CC,OAAOC,YAAW,WACdxB,QAAQyB,YAAY1C,oBAChB+B,SACAA,QAAQY,SAEbJ,QASHK,eAAiB,SAASR,SAAUG,OAChCH,UACAI,OAAOC,YAAW,WACdL,SAASO,SACVJ,QASPM,eAAiB,SAASC,WAE1BnD,EAAEe,IAAI,4BAA4B,WAC9BE,EAAEC,OAAOkC,WAAWC,gBAAgB,qBAAsB,IAAMF,cAEhElC,EAAEqC,KAAKC,YAActC,EAAEqC,KAAKC,WAAWC,YACvCvC,EAAEqC,KAAKC,WAAWC,WAAWxD,EAAEyD,IAAI,IAAMN,aAqD7CO,WAAa,SAASC,cAAeC,KAAMC,YAWvCpB,SAVAqB,OAASD,OAAOE,KAAK,eACrB3B,QAAUL,mBAAmB4B,eAC7BK,SAAWrE,KAAKsE,KAAK,CAAC,CACtBC,WAAY,0BACZC,KAAM,CAAC5C,GAAIqC,KACPE,OAAQA,OACRM,cAAeP,OAAOE,KAAK,sBAAwBF,OAAOE,KAAK,sBAAwB,MAE3F,GAGW,cAAXD,SACArB,SAAWF,mBAAmBsB,OAAOQ,QAAQ/D,SAASM,aAE1DlB,EAAE4E,KAAKC,MAAM7E,EAAGsE,UACXQ,MAAK,SAASC,UAtCUC,YACzBC,SACAC,SACAC,aAoCQC,gBAvCiBJ,YAuCkBf,cAtC3CgB,SAAWjF,EAAE,aACbkF,UAAW,EACXC,aAAe,KACnBF,SAASI,MAAK,cACNrF,EAAEsF,SAASN,YAAY,GAAIO,MAC3BL,UAAW,OACR,GAAIA,gBACPC,aAAeI,MACR,KAGRJ,cA4BClB,cAAcuB,YAAYT,MAE1B/E,EAAE,QAAU+E,KAAO,UAAUtC,KAAK7B,SAASC,YAAYwE,MAAK,SAASI,OACjEjC,eAAexD,EAAEuF,MAAMlB,KAAK,OACd,IAAVoB,SAjEE,SAASC,UAAWtB,YAClCuB,YAAc3F,EAAE,IAAM0F,WACtBE,SAAW,gBAAkBxB,OAAS,IAC3B,mBAAXA,QAA0C,kBAAXA,QAAyC,eAAXA,SAE7DwB,SAAW,qFAEXD,YAAYlD,KAAKmD,UAAUC,GAAG,YAC9BF,YAAYlD,KAAKmD,UAAUE,QAG3BH,YAAYlD,KAAK7B,SAASI,MAAMyB,KAAK7B,SAASK,QAAQ6E,QAuD1CC,CAAgB/F,EAAEuF,MAAMlB,KAAK,MAAOD,QACpCgB,eAAiB,SAIrBA,gBACAA,eAAeU,QAGnB7C,cAAcgB,cAAevB,QAAS,KACtCa,eAAeR,SAAU,KAEzBkB,cAAc+B,QAAQhG,EAAEiG,MAAM,qBAAsB,CAACC,WAAYnB,KAAMX,OAAQA,aAChF+B,MAAK,SAASC,IAEbnD,cAAcgB,cAAevB,SAC7Ba,eAAeR,cAEXsD,EAAIrG,EAAEiG,MAAM,yBAA0B,CAACK,UAAWF,GAAIhC,OAAQA,SAClEH,cAAc+B,QAAQK,GACjBA,EAAEE,sBACHpG,aAAamG,UAAUF,QAoCnCI,oBAAsB,SAASb,YAAac,eApOnB7E,QACrB8E,KAoOAC,YAAchB,YAAYtB,KAAK,SAASuC,MAAM,oBAAoB,GAClEC,YAtOqBjF,QAsOM+D,YApO/BrF,EAAEe,IAAI,sBAAsB,SAASf,GACjCoG,KAAOpG,EAAEwB,OAAOC,YAAYC,KAAKC,GAAG6E,QAAQxG,EAAE6B,KAAKP,QAAQQ,IAAI,QAE5DsE,MAmOPtG,IAAI2G,WAAW,aAAcJ,aAAa7B,MAAK,SAASkC,gBAChDC,WAAa,CACbC,KAAMF,WACNN,KAAMG,YAEVzG,IAAI+G,YAAY,CACZ,CAACC,IAAK,WACN,CAACA,IAAoB,OAAfP,WAAsB,kBAAoB,sBAAuBQ,MAAOJ,YAC9E,CAACG,IAAK,OACN,CAACA,IAAK,QACPtC,MAAK,SAASwC,GACTnH,aAAaoH,QAAQD,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIb,kBAiCzDe,kBAAoB,SAASC,WAAYC,MAAOC,WACjBC,gBAAiBC,eAE5CC,eAAiB,CAAC,CAACV,IAAKO,WAAYI,UAAWH,yBAG5CxH,IAAI+G,YAAYW,gBAAgBE,MAAK,SAASC,gBACjDR,WAAWhF,KAAK,yBAAyByF,KAAKD,QAAQ,IAE/C/H,UAAUiI,UAAUT,MAAO,WACnCM,MAAK,SAASI,SACbX,WAAWhF,KAAK,SAAS+C,YAAY4C,SACrCX,WAAWpD,KAAK,cAAewD,cAEhCQ,MAAMlI,aAAamG,YAgEtBgC,wBAA0B,SAASC,cACnCvI,EAAE,QAAUuI,aAAe,UAAU9F,KAAK7B,SAASC,YAAYwE,MAAK,eAE5DxD,GAAK7B,EAAEuF,MAAMlB,KAAK,MAEtBrE,EAAEY,SAASC,WAAa,IAAMgB,IAAI2D,YAAY+C,cAE9C/E,eAAe3B,QAYnB2G,YAAc,SAASC,eAAgBC,UAAWvE,OAAQwE,kBACtDvE,OAASD,OAAOE,KAAK,eACrBK,cAAgBP,OAAOE,KAAK,sBAAwBF,OAAOE,KAAK,sBAAwB,EACxF3B,QAzVgB,SAASI,gBAC7BA,eAAeP,SAAS5B,wBACpB6B,WAAaM,eAAeL,KAAK7B,SAASO,mBAAmBiB,IAAI,MACjEI,WAAY,KACRE,QAAUnB,EAAES,KAAKW,YAAYrC,EAAGA,EAAE6B,KAAKK,oBAC3CE,QAAQE,OACDF,eAEJ,KAiVOkG,CAAkBH,gBAC5BnE,SAAWrE,KAAKsE,KAAK,CAAC,CACtBC,WAAY,2BACZC,KAAM,CAAC5C,GAAI6G,UAAWtE,OAAQA,OAAQM,cAAeA,kBACrD,GAEA3B,SAAWF,mBAAmB4F,gBAClCzI,EAAE4E,KAAKC,MAAM7E,EAAGsE,UACXQ,MAAK,SAAS+D,iBACP9D,KAAO/E,EAAE8I,UAAUD,aACvB5F,cAAcwF,eAAgB/F,SAC9Ba,eAAeR,UACf0F,eAAehG,KAAK7B,SAASO,mBAAmBsB,KAAK7B,SAASK,QAAQ6E,YAElEO,EAAIrG,EAAEiG,MAAM,sBAAuB,CAACC,WAAYnB,KAAMX,OAAQA,SAClEqE,eAAezC,QAAQK,GAClBA,EAAEE,sBAjFa,SAASkC,eAAgBM,WAAYhE,KAAM4D,kBACnEvE,OAAS2E,WAAW1E,KAAK,kBACd,SAAXD,QAAgC,SAAXA,OAAmB,IACzB,SAAXA,QACAqE,eAAelG,SAAS,UACxBiF,kBAAkBuB,WAAY,SAC1B,iBAAkB,UAAYJ,aAAc,UAEhDF,eAAepF,YAAY,UAC3BmE,kBAAkBuB,WAAY,SAC1B,iBAAkB,UAAYJ,aAAc,cAG/BK,IAAjBjE,KAAKkE,YACA,IAAIC,KAAKnE,KAAKkE,QACfX,wBAAwBvD,KAAKkE,QAAQC,SAIXF,IAA9BjE,KAAKoE,sBACLV,eAAehG,KAAK,yBAAyB2G,QAAQ5D,YAAYT,KAAKoE,2BAEvE,GAAe,cAAX/E,OAAwB,KAC3BiF,UAAYrJ,EAAEY,SAASM,UAAY,YACnCoI,cAAgBD,UAAU5G,KAAK7B,SAASO,kBAATP,gCACnCyI,UAAUhG,YAAY,WACtBmE,kBAAkB8B,cAAe,WAC7B,YAAa,OAAQ,aACzBb,eAAelG,SAAS,WACxBiF,kBAAkBuB,WAAY,WAC1B,eAAgB,OAAQ,oBACV,iBAAX3E,SACPqE,eAAepF,YAAY,WAC3BmE,kBAAkBuB,WAAY,WAC1B,YAAa,OAAQ,cAgDjBQ,CAA0Bd,eAAgBtE,OAAQY,KAAM4D,iBAE7DxC,MAAK,SAASC,IAEbnD,cAAcwF,eAAgB/F,SAC9Ba,eAAeR,cAEXsD,EAAIrG,EAAEiG,MAAM,0BAA2B,CAACK,UAAWF,GAAIhC,OAAQA,SACnEqE,eAAezC,QAAQK,GAClBA,EAAEE,sBACHpG,aAAamG,UAAUF,eAMvC9F,EAAEe,IAAI,4BAA4B,WAC9BE,EAAEC,OAAOkC,WAAW8F,gBAAgB,CAGhCC,2BAA4B,SAAShF,UAC7BkB,YAAc3F,EAAEyE,KAAK7C,QAAQ8H,cAC7BxF,KAAOvC,YAAYgE,gBACnBzB,KAAM,KACFQ,cAAgBiB,YAAYlD,KAAK,IAAM9B,iBAAiB0D,KAAK,uBAnN7D,SAASsF,gBAAiBzF,KAAMQ,mBAC5ChC,QAAUL,mBAAmBsH,iBAC7BrF,SAAWrE,KAAKsE,KAAK,CAAC,CACtBC,WAAY,yBACZC,KAAM,CAAC5C,GAAIqC,KAAMQ,cAAeA,kBAChC,GAEJ1E,EAAE4E,KAAKC,MAAM7E,EAAGsE,UACXQ,MAAK,SAASC,MACX9B,cAAc0G,gBAAiBjH,QAAS,KACxC4F,wBAAwBvD,SACzBoB,MAAK,WACJlD,cAAc0G,gBAAiBjH,YAwM3BkH,CAAcjE,YAAazB,KAAMQ,sBAMD,CAQ5CmF,eAAgB,SAASlB,cAGrB3I,EAAE,QAAQ8J,GAAG,iBAAkBlJ,SAASC,WAAa,IAC7CD,SAASG,eAAiB,iBAAiB,SAASsF,MACzC,aAAXA,EAAEa,MAAqC,KAAdb,EAAE0D,aAG3BhB,WAAa/I,EAAEuF,MACftB,cAAgB8E,WAAWpE,QAAQ/D,SAASC,YAC5CuD,OAAS2E,WAAW1E,KAAK,eACzB2F,SAAWrI,YAAYsC,sBACnBG,YACC,eACA,gBACA,aACA,gBACA,WACA,cACA,WACA,qBACA,oBACA,kCAMJ4F,WAGL3D,EAAE4D,iBACa,WAAX7F,OAEAoC,oBAAoBvC,eAAe,WAC/BD,WAAWC,cAAe+F,SAAUjB,eAGxC/E,WAAWC,cAAe+F,SAAUjB,iBAK5C/I,EAAE,QAAQ8J,GAAG,iBAAkBlJ,SAASM,UAAY,IACxCN,SAASO,kBADUP,mCAED,SAASyF,MACpB,aAAXA,EAAEa,MAAqC,KAAdb,EAAE0D,aA/NTG,QAASzD,UAkO3BsC,WAAa/I,EAAEuF,MACfkD,eAAiBM,WAAWpE,QAAQ/D,SAASM,WAC7CiJ,UAAYpB,WAAWpE,QAAQ/D,SAASO,mBAAmBkD,KAAK,kBACpEgC,EAAE4D,iBACElB,WAAW1E,KAAK,iBAtOE6F,QAwOCnB,WAAW1E,KAAK,gBAxORoC,UAwOyB,WAChD+B,YAAYC,eAAgB0B,UAAWpB,WAAYJ,eAxOnEvI,IAAI+G,YAAY,CACZ,CAACC,IAAK,WACN,CAACA,IAAK,OACN,CAACA,IAAK,QACPtC,MAAK,SAASwC,GACTnH,aAAaoH,QAAQD,EAAE,GAAI4C,QAAS5C,EAAE,GAAIA,EAAE,GAAIb,eAsO5C+B,YAAYC,eAAgB0B,UAAWpB,WAAYJ,kBAK3DvI,IAAI2G,WAAW,eAAejC,MAAK,SAASsF,uBACpCpE,QAAUhG,EAAEY,SAASQ,aACrBiJ,WAAarE,QAAQ3B,KAAK,qBAC1BiG,YAActE,QAAQ3B,KAAK,qBAC3BkG,UAAYvK,EAAE,qHACsDsK,YAAc,sBACtFC,UAAU9H,KAAK,SAASyF,KAAKkC,mBAC7B7J,aAAaiK,OAAO,CAChBC,MAAOJ,WACPnD,KAAM3G,aAAamK,MAAMC,YACzBC,KAAML,UAAUrC,QACjBlC,SACFlB,MAAK,SAAS+F,WACPC,YAAc9K,EAAE6K,MAAME,WAAWtI,KAAK,4BAC1CuI,YAAc,WAGN,GAAKC,SAASH,YAAYI,SAAWJ,YAAYI,OAASD,SAASH,YAAYI,QAAU,IACzFC,SAASC,SAAWpF,QAAQ3B,KAAK,QAAU,gBAAkB4G,SAASH,YAAYI,SAG1FL,MAAMQ,kBAAkBhB,YACxBQ,MAAMS,UAAUxB,GAAGtJ,YAAY+K,OAAO,WAElCT,YAAYhF,QAAQ0F,SAAS1B,GAAG,WAAW,SAASzD,GAC5CA,EAAE0D,UAAYtJ,SAASgL,OACvBT,oBAIZH,MAAMS,UAAUxB,GAAGtJ,YAAYkL,MAAM,SAASrF,GAE1CA,EAAE4D,iBACFe,wBAmBhBW,yBAA0B,SAAS7I,eAAgB8C,SAAU8B,MAAOC,WAC5BC,gBAAiBC,WACrDnH,IAAIkL,MAAM,qEACNnE,WAAa3E,eAAeL,KAAK7B,SAASO,kBAAoB,IAAMyE,UACxE4B,kBAAkBC,WAAYC,MAAOC,WAAYC,gBAAiBC"} \ No newline at end of file +{"version":3,"file":"actions.min.js","sources":["../src/actions.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 * Various actions on modules and sections in the editing mode - hiding, duplicating, deleting, etc.\n *\n * @module core_course/actions\n * @copyright 2016 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.3\n */\ndefine(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str', 'core/url', 'core/yui',\n 'core/modal_factory', 'core/modal_events', 'core/key_codes', 'core/log'],\n function($, ajax, templates, notification, str, url, Y, ModalFactory, ModalEvents, KeyCodes, log) {\n var CSS = {\n EDITINPROGRESS: 'editinprogress',\n SECTIONDRAGGABLE: 'sectiondraggable',\n EDITINGMOVE: 'editing_move'\n };\n var SELECTOR = {\n ACTIVITYLI: 'li.activity',\n ACTIONAREA: '.actions',\n ACTIVITYACTION: 'a.cm-edit-action',\n MENU: '.moodle-actionmenu[data-enhance=moodle-core-actionmenu]',\n TOGGLE: '.toggle-display,.dropdown-toggle',\n SECTIONLI: 'li.section',\n SECTIONACTIONMENU: '.section_action_menu',\n ADDSECTIONS: '#changenumsections [data-add-sections]'\n };\n\n Y.use('moodle-course-coursebase', function() {\n var courseformatselector = M.course.format.get_section_selector();\n if (courseformatselector) {\n SELECTOR.SECTIONLI = courseformatselector;\n }\n });\n\n /**\n * Wrapper for Y.Moodle.core_course.util.cm.getId\n *\n * @param {JQuery} element\n * @returns {Integer}\n */\n var getModuleId = function(element) {\n var id;\n Y.use('moodle-course-util', function(Y) {\n id = Y.Moodle.core_course.util.cm.getId(Y.Node(element.get(0)));\n });\n return id;\n };\n\n /**\n * Wrapper for Y.Moodle.core_course.util.cm.getName\n *\n * @param {JQuery} element\n * @returns {String}\n */\n var getModuleName = function(element) {\n var name;\n Y.use('moodle-course-util', function(Y) {\n name = Y.Moodle.core_course.util.cm.getName(Y.Node(element.get(0)));\n });\n return name;\n };\n\n /**\n * Wrapper for M.util.add_spinner for an activity\n *\n * @param {JQuery} activity\n * @returns {Node}\n */\n var addActivitySpinner = function(activity) {\n activity.addClass(CSS.EDITINPROGRESS);\n var actionarea = activity.find(SELECTOR.ACTIONAREA).get(0);\n if (actionarea) {\n var spinner = M.util.add_spinner(Y, Y.Node(actionarea));\n spinner.show();\n return spinner;\n }\n return null;\n };\n\n /**\n * Wrapper for M.util.add_spinner for a section\n *\n * @param {JQuery} sectionelement\n * @returns {Node}\n */\n var addSectionSpinner = function(sectionelement) {\n sectionelement.addClass(CSS.EDITINPROGRESS);\n var actionarea = sectionelement.find(SELECTOR.SECTIONACTIONMENU).get(0);\n if (actionarea) {\n var spinner = M.util.add_spinner(Y, Y.Node(actionarea));\n spinner.show();\n return spinner;\n }\n return null;\n };\n\n /**\n * Wrapper for M.util.add_lightbox\n *\n * @param {JQuery} sectionelement\n * @returns {Node}\n */\n var addSectionLightbox = function(sectionelement) {\n var lightbox = M.util.add_lightbox(Y, Y.Node(sectionelement.get(0)));\n lightbox.show();\n return lightbox;\n };\n\n /**\n * Removes the spinner element\n *\n * @param {JQuery} element\n * @param {Node} spinner\n * @param {Number} delay\n */\n var removeSpinner = function(element, spinner, delay) {\n window.setTimeout(function() {\n element.removeClass(CSS.EDITINPROGRESS);\n if (spinner) {\n spinner.hide();\n }\n }, delay);\n };\n\n /**\n * Removes the lightbox element\n *\n * @param {Node} lightbox lighbox YUI element returned by addSectionLightbox\n * @param {Number} delay\n */\n var removeLightbox = function(lightbox, delay) {\n if (lightbox) {\n window.setTimeout(function() {\n lightbox.hide();\n }, delay);\n }\n };\n\n /**\n * Initialise action menu for the element (section or module)\n *\n * @param {String} elementid CSS id attribute of the element\n */\n var initActionMenu = function(elementid) {\n // Initialise action menu in the new activity.\n Y.use('moodle-course-coursebase', function() {\n M.course.coursebase.invoke_function('setup_for_resource', '#' + elementid);\n });\n if (M.core.actionmenu && M.core.actionmenu.newDOMNode) {\n M.core.actionmenu.newDOMNode(Y.one('#' + elementid));\n }\n };\n\n /**\n * Returns focus to the element that was clicked or \"Edit\" link if element is no longer visible.\n *\n * @param {String} elementId CSS id attribute of the element\n * @param {String} action data-action property of the element that was clicked\n */\n var focusActionItem = function(elementId, action) {\n var mainelement = $('#' + elementId);\n var selector = '[data-action=' + action + ']';\n if (action === 'groupsseparate' || action === 'groupsvisible' || action === 'groupsnone') {\n // New element will have different data-action.\n selector = '[data-action=groupsseparate],[data-action=groupsvisible],[data-action=groupsnone]';\n }\n if (mainelement.find(selector).is(':visible')) {\n mainelement.find(selector).focus();\n } else {\n // Element not visible, focus the \"Edit\" link.\n mainelement.find(SELECTOR.MENU).find(SELECTOR.TOGGLE).focus();\n }\n };\n\n /**\n * Find next
          after the element\n *\n * @param {JQuery} mainElement element that is about to be deleted\n * @returns {JQuery}\n */\n var findNextFocusable = function(mainElement) {\n var tabables = $(\"a:visible\");\n var isInside = false;\n var foundElement = null;\n tabables.each(function() {\n if ($.contains(mainElement[0], this)) {\n isInside = true;\n } else if (isInside) {\n foundElement = this;\n return false; // Returning false in .each() is equivalent to \"break;\" inside the loop in php.\n }\n });\n return foundElement;\n };\n\n /**\n * Performs an action on a module (moving, deleting, duplicating, hiding, etc.)\n *\n * @param {JQuery} moduleElement activity element we perform action on\n * @param {Number} cmid\n * @param {JQuery} target the element (menu item) that was clicked\n */\n var editModule = function(moduleElement, cmid, target) {\n var action = target.attr('data-action');\n var spinner = addActivitySpinner(moduleElement);\n var promises = ajax.call([{\n methodname: 'core_course_edit_module',\n args: {id: cmid,\n action: action,\n sectionreturn: target.attr('data-sectionreturn') ? target.attr('data-sectionreturn') : 0\n }\n }], true);\n\n var lightbox;\n if (action === 'duplicate') {\n lightbox = addSectionLightbox(target.closest(SELECTOR.SECTIONLI));\n }\n $.when.apply($, promises)\n .done(function(data) {\n var elementToFocus = findNextFocusable(moduleElement);\n moduleElement.replaceWith(data);\n // Initialise action menu for activity(ies) added as a result of this.\n $('
          ' + data + '
          ').find(SELECTOR.ACTIVITYLI).each(function(index) {\n initActionMenu($(this).attr('id'));\n if (index === 0) {\n focusActionItem($(this).attr('id'), action);\n elementToFocus = null;\n }\n });\n // In case of activity deletion focus the next focusable element.\n if (elementToFocus) {\n elementToFocus.focus();\n }\n // Remove spinner and lightbox with a delay.\n removeSpinner(moduleElement, spinner, 400);\n removeLightbox(lightbox, 400);\n // Trigger event that can be observed by course formats.\n moduleElement.trigger($.Event('coursemoduleedited', {ajaxreturn: data, action: action}));\n }).fail(function(ex) {\n // Remove spinner and lightbox.\n removeSpinner(moduleElement, spinner);\n removeLightbox(lightbox);\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursemoduleeditfailed', {exception: ex, action: action});\n moduleElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n notification.exception(ex);\n }\n });\n };\n\n /**\n * Requests html for the module via WS core_course_get_module and updates the module on the course page\n *\n * Used after d&d of the module to another section\n *\n * @param {JQuery} activityElement\n * @param {Number} cmid\n * @param {Number} sectionreturn\n */\n var refreshModule = function(activityElement, cmid, sectionreturn) {\n var spinner = addActivitySpinner(activityElement);\n var promises = ajax.call([{\n methodname: 'core_course_get_module',\n args: {id: cmid, sectionreturn: sectionreturn}\n }], true);\n\n $.when.apply($, promises)\n .done(function(data) {\n removeSpinner(activityElement, spinner, 400);\n replaceActivityHtmlWith(data);\n }).fail(function() {\n removeSpinner(activityElement, spinner);\n });\n };\n\n /**\n * Displays the delete confirmation to delete a module\n *\n * @param {JQuery} mainelement activity element we perform action on\n * @param {function} onconfirm function to execute on confirm\n */\n var confirmDeleteModule = function(mainelement, onconfirm) {\n var modtypename = mainelement.attr('class').match(/modtype_([^\\s]*)/)[1];\n var modulename = getModuleName(mainelement);\n\n str.get_string('pluginname', modtypename).done(function(pluginname) {\n var plugindata = {\n type: pluginname,\n name: modulename\n };\n str.get_strings([\n {key: 'confirm'},\n {key: modulename === null ? 'deletechecktype' : 'deletechecktypename', param: plugindata},\n {key: 'yes'},\n {key: 'no'}\n ]).done(function(s) {\n notification.confirm(s[0], s[1], s[2], s[3], onconfirm);\n }\n );\n });\n };\n\n /**\n * Displays the delete confirmation to delete a section\n *\n * @param {String} message confirmation message\n * @param {function} onconfirm function to execute on confirm\n */\n var confirmEditSection = function(message, onconfirm) {\n str.get_strings([\n {key: 'confirm'}, // TODO link text\n {key: 'yes'},\n {key: 'no'}\n ]).done(function(s) {\n notification.confirm(s[0], message, s[1], s[2], onconfirm);\n }\n );\n };\n\n /**\n * Replaces an action menu item with another one (for example Show->Hide, Set marker->Remove marker)\n *\n * @param {JQuery} actionitem\n * @param {String} image new image name (\"i/show\", \"i/hide\", etc.)\n * @param {String} stringname new string for the action menu item\n * @param {String} stringcomponent\n * @param {String} newaction new value for data-action attribute of the link\n * @return {Promise} promise which is resolved when the replacement has completed\n */\n var replaceActionItem = function(actionitem, image, stringname,\n stringcomponent, newaction) {\n\n var stringRequests = [{key: stringname, component: stringcomponent}];\n // Do not provide an icon with duplicate, different text to the menu item.\n\n return str.get_strings(stringRequests).then(function(strings) {\n actionitem.find('span.menu-action-text').html(strings[0]);\n\n return templates.renderPix(image, 'core');\n }).then(function(pixhtml) {\n actionitem.find('.icon').replaceWith(pixhtml);\n actionitem.attr('data-action', newaction);\n return;\n }).catch(notification.exception);\n };\n\n /**\n * Default post-processing for section AJAX edit actions.\n *\n * This can be overridden in course formats by listening to event coursesectionedited:\n *\n * $('body').on('coursesectionedited', 'li.section', function(e) {\n * var action = e.action,\n * sectionElement = $(e.target),\n * data = e.ajaxreturn;\n * // ... Do some processing here.\n * e.preventDefault(); // Prevent default handler.\n * });\n *\n * @param {JQuery} sectionElement\n * @param {JQuery} actionItem\n * @param {Object} data\n * @param {String} courseformat\n */\n var defaultEditSectionHandler = function(sectionElement, actionItem, data, courseformat) {\n var action = actionItem.attr('data-action');\n if (action === 'hide' || action === 'show') {\n if (action === 'hide') {\n sectionElement.addClass('hidden');\n replaceActionItem(actionItem, 'i/show',\n 'showfromothers', 'format_' + courseformat, 'show');\n } else {\n sectionElement.removeClass('hidden');\n replaceActionItem(actionItem, 'i/hide',\n 'hidefromothers', 'format_' + courseformat, 'hide');\n }\n // Replace the modules with new html (that indicates that they are now hidden or not hidden).\n if (data.modules !== undefined) {\n for (var i in data.modules) {\n replaceActivityHtmlWith(data.modules[i]);\n }\n }\n // Replace the section availability information.\n if (data.section_availability !== undefined) {\n sectionElement.find('.section_availability').first().replaceWith(data.section_availability);\n }\n } else if (action === 'setmarker') {\n var oldmarker = $(SELECTOR.SECTIONLI + '.current'),\n oldActionItem = oldmarker.find(SELECTOR.SECTIONACTIONMENU + ' ' + 'a[data-action=removemarker]');\n oldmarker.removeClass('current');\n replaceActionItem(oldActionItem, 'i/marker',\n 'highlight', 'core', 'setmarker');\n sectionElement.addClass('current');\n replaceActionItem(actionItem, 'i/marked',\n 'highlightoff', 'core', 'removemarker');\n } else if (action === 'removemarker') {\n sectionElement.removeClass('current');\n replaceActionItem(actionItem, 'i/marker',\n 'highlight', 'core', 'setmarker');\n }\n };\n\n /**\n * Replaces the course module with the new html (used to update module after it was edited or its visibility was changed).\n *\n * @param {String} activityHTML\n */\n var replaceActivityHtmlWith = function(activityHTML) {\n $('
          ' + activityHTML + '
          ').find(SELECTOR.ACTIVITYLI).each(function() {\n // Extract id from the new activity html.\n var id = $(this).attr('id');\n // Find the existing element with the same id and replace its contents with new html.\n $(SELECTOR.ACTIVITYLI + '#' + id).replaceWith(activityHTML);\n // Initialise action menu.\n initActionMenu(id);\n });\n };\n\n /**\n * Performs an action on a module (moving, deleting, duplicating, hiding, etc.)\n *\n * @param {JQuery} sectionElement section element we perform action on\n * @param {Nunmber} sectionid\n * @param {JQuery} target the element (menu item) that was clicked\n * @param {String} courseformat\n */\n var editSection = function(sectionElement, sectionid, target, courseformat) {\n var action = target.attr('data-action'),\n sectionreturn = target.attr('data-sectionreturn') ? target.attr('data-sectionreturn') : 0;\n var spinner = addSectionSpinner(sectionElement);\n var promises = ajax.call([{\n methodname: 'core_course_edit_section',\n args: {id: sectionid, action: action, sectionreturn: sectionreturn}\n }], true);\n\n var lightbox = addSectionLightbox(sectionElement);\n $.when.apply($, promises)\n .done(function(dataencoded) {\n var data = $.parseJSON(dataencoded);\n removeSpinner(sectionElement, spinner);\n removeLightbox(lightbox);\n sectionElement.find(SELECTOR.SECTIONACTIONMENU).find(SELECTOR.TOGGLE).focus();\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursesectionedited', {ajaxreturn: data, action: action});\n sectionElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n defaultEditSectionHandler(sectionElement, target, data, courseformat);\n }\n }).fail(function(ex) {\n // Remove spinner and lightbox.\n removeSpinner(sectionElement, spinner);\n removeLightbox(lightbox);\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursesectioneditfailed', {exception: ex, action: action});\n sectionElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n notification.exception(ex);\n }\n });\n };\n\n // Register a function to be executed after D&D of an activity.\n Y.use('moodle-course-coursebase', function() {\n M.course.coursebase.register_module({\n // Ignore camelcase eslint rule for the next line because it is an expected name of the callback.\n // eslint-disable-next-line camelcase\n set_visibility_resource_ui: function(args) {\n var mainelement = $(args.element.getDOMNode());\n var cmid = getModuleId(mainelement);\n if (cmid) {\n var sectionreturn = mainelement.find('.' + CSS.EDITINGMOVE).attr('data-sectionreturn');\n refreshModule(mainelement, cmid, sectionreturn);\n }\n }\n });\n });\n\n return /** @alias module:core_course/actions */ {\n\n /**\n * Initialises course page\n *\n * @method init\n * @param {String} courseformat name of the current course format (for fetching strings)\n */\n initCoursePage: function(courseformat) {\n\n // Add a handler for course module actions.\n $('body').on('click keypress', SELECTOR.ACTIVITYLI + ' ' +\n SELECTOR.ACTIVITYACTION + '[data-action]', function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n var actionItem = $(this),\n moduleElement = actionItem.closest(SELECTOR.ACTIVITYLI),\n action = actionItem.attr('data-action'),\n moduleId = getModuleId(moduleElement);\n switch (action) {\n case 'moveleft':\n case 'moveright':\n case 'delete':\n case 'duplicate':\n case 'hide':\n case 'stealth':\n case 'show':\n case 'groupsseparate':\n case 'groupsvisible':\n case 'groupsnone':\n break;\n default:\n // Nothing to do here!\n return;\n }\n if (!moduleId) {\n return;\n }\n e.preventDefault();\n if (action === 'delete') {\n // Deleting requires confirmation.\n confirmDeleteModule(moduleElement, function() {\n editModule(moduleElement, moduleId, actionItem);\n });\n } else {\n editModule(moduleElement, moduleId, actionItem);\n }\n });\n\n // Add a handler for section show/hide actions.\n $('body').on('click keypress', SELECTOR.SECTIONLI + ' ' +\n SELECTOR.SECTIONACTIONMENU + '[data-sectionid] ' +\n 'a[data-action]', function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n var actionItem = $(this),\n sectionElement = actionItem.closest(SELECTOR.SECTIONLI),\n sectionId = actionItem.closest(SELECTOR.SECTIONACTIONMENU).attr('data-sectionid');\n e.preventDefault();\n if (actionItem.attr('data-confirm')) {\n // Action requires confirmation.\n confirmEditSection(actionItem.attr('data-confirm'), function() {\n editSection(sectionElement, sectionId, actionItem, courseformat);\n });\n } else {\n editSection(sectionElement, sectionId, actionItem, courseformat);\n }\n });\n\n // Add a handler for \"Add sections\" link to ask for a number of sections to add.\n str.get_string('numberweeks').done(function(strNumberSections) {\n var trigger = $(SELECTOR.ADDSECTIONS),\n modalTitle = trigger.attr('data-add-sections'),\n newSections = trigger.attr('data-new-sections');\n var modalBody = $('
          ' +\n '
          ');\n modalBody.find('label').html(strNumberSections);\n ModalFactory.create({\n title: modalTitle,\n type: ModalFactory.types.SAVE_CANCEL,\n body: modalBody.html()\n }, trigger)\n .done(function(modal) {\n var numSections = $(modal.getBody()).find('#add_section_numsections'),\n addSections = function() {\n // Check if value of the \"Number of sections\" is a valid positive integer and redirect\n // to adding a section script.\n if ('' + parseInt(numSections.val()) === numSections.val() && parseInt(numSections.val()) >= 1) {\n document.location = trigger.attr('href') + '&numsections=' + parseInt(numSections.val());\n }\n };\n modal.setSaveButtonText(modalTitle);\n modal.getRoot().on(ModalEvents.shown, function() {\n // When modal is shown focus and select the input and add a listener to keypress of \"Enter\".\n numSections.focus().select().on('keydown', function(e) {\n if (e.keyCode === KeyCodes.enter) {\n addSections();\n }\n });\n });\n modal.getRoot().on(ModalEvents.save, function(e) {\n // When modal \"Add\" button is pressed.\n e.preventDefault();\n addSections();\n });\n });\n });\n },\n\n /**\n * Replaces a section action menu item with another one (for example Show->Hide, Set marker->Remove marker)\n *\n * This method can be used by course formats in their listener to the coursesectionedited event\n *\n * @deprecated since Moodle 3.9\n * @param {JQuery} sectionelement\n * @param {String} selector CSS selector inside the section element, for example \"a[data-action=show]\"\n * @param {String} image new image name (\"i/show\", \"i/hide\", etc.)\n * @param {String} stringname new string for the action menu item\n * @param {String} stringcomponent\n * @param {String} newaction new value for data-action attribute of the link\n */\n replaceSectionActionItem: function(sectionelement, selector, image, stringname,\n stringcomponent, newaction) {\n log.debug('replaceSectionActionItem() is deprecated and will be removed.');\n var actionitem = sectionelement.find(SELECTOR.SECTIONACTIONMENU + ' ' + selector);\n replaceActionItem(actionitem, image, stringname, stringcomponent, newaction);\n }\n };\n });\n"],"names":["define","$","ajax","templates","notification","str","url","Y","ModalFactory","ModalEvents","KeyCodes","log","CSS","SELECTOR","ACTIVITYLI","ACTIONAREA","ACTIVITYACTION","MENU","TOGGLE","SECTIONLI","SECTIONACTIONMENU","ADDSECTIONS","use","courseformatselector","M","course","format","get_section_selector","getModuleId","element","id","Moodle","core_course","util","cm","getId","Node","get","addActivitySpinner","activity","addClass","actionarea","find","spinner","add_spinner","show","addSectionLightbox","sectionelement","lightbox","add_lightbox","removeSpinner","delay","window","setTimeout","removeClass","hide","removeLightbox","initActionMenu","elementid","coursebase","invoke_function","core","actionmenu","newDOMNode","one","editModule","moduleElement","cmid","target","action","attr","promises","call","methodname","args","sectionreturn","closest","when","apply","done","data","mainElement","tabables","isInside","foundElement","elementToFocus","each","contains","this","replaceWith","index","elementId","mainelement","selector","is","focus","focusActionItem","trigger","Event","ajaxreturn","fail","ex","e","exception","isDefaultPrevented","confirmDeleteModule","onconfirm","name","modtypename","match","modulename","getName","get_string","pluginname","plugindata","type","get_strings","key","param","s","confirm","replaceActionItem","actionitem","image","stringname","stringcomponent","newaction","stringRequests","component","then","strings","html","renderPix","pixhtml","catch","replaceActivityHtmlWith","activityHTML","editSection","sectionElement","sectionid","courseformat","addSectionSpinner","dataencoded","parseJSON","actionItem","undefined","modules","i","section_availability","first","oldmarker","oldActionItem","defaultEditSectionHandler","register_module","set_visibility_resource_ui","getDOMNode","activityElement","refreshModule","initCoursePage","on","keyCode","moduleId","preventDefault","message","sectionId","strNumberSections","modalTitle","newSections","modalBody","create","title","types","SAVE_CANCEL","body","modal","numSections","getBody","addSections","parseInt","val","document","location","setSaveButtonText","getRoot","shown","select","enter","save","replaceSectionActionItem","debug"],"mappings":"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"} \ No newline at end of file diff --git a/course/amd/build/activitychooser.min.js.map b/course/amd/build/activitychooser.min.js.map index 9896e62bfaf..4d0e47418dd 100644 --- a/course/amd/build/activitychooser.min.js.map +++ b/course/amd/build/activitychooser.min.js.map @@ -1 +1 @@ -{"version":3,"file":"activitychooser.min.js","sources":["../src/activitychooser.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 type of dialogue used as for choosing modules in a course.\n *\n * @module core_course/activitychooser\n * @copyright 2020 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport * as ChooserDialogue from 'core_course/local/activitychooser/dialogue';\nimport * as Repository from 'core_course/local/activitychooser/repository';\nimport selectors from 'core_course/local/activitychooser/selectors';\nimport CustomEvents from 'core/custom_interaction_events';\nimport * as Templates from 'core/templates';\nimport * as ModalFactory from 'core/modal_factory';\nimport {get_string as getString} from 'core/str';\nimport Pending from 'core/pending';\n\n// Set up some JS module wide constants that can be added to in the future.\n\n// Tab config options.\nconst ALLACTIVITIESRESOURCES = 0;\nconst ONLYALL = 1;\nconst ACTIVITIESRESOURCES = 2;\n\n// Module types.\nconst ACTIVITY = 0;\nconst RESOURCE = 1;\n\n/**\n * Set up the activity chooser.\n *\n * @method init\n * @param {Number} courseId Course ID to use later on in fetchModules()\n * @param {Object} chooserConfig Any PHP config settings that we may need to reference\n */\nexport const init = (courseId, chooserConfig) => {\n const pendingPromise = new Pending();\n\n registerListenerEvents(courseId, chooserConfig);\n\n pendingPromise.resolve();\n};\n\n/**\n * Once a selection has been made make the modal & module information and pass it along\n *\n * @method registerListenerEvents\n * @param {Number} courseId\n * @param {Object} chooserConfig Any PHP config settings that we may need to reference\n */\nconst registerListenerEvents = (courseId, chooserConfig) => {\n const events = [\n 'click',\n CustomEvents.events.activate,\n CustomEvents.events.keyboardActivate\n ];\n\n const fetchModuleData = (() => {\n let innerPromise = null;\n\n return () => {\n if (!innerPromise) {\n innerPromise = new Promise((resolve) => {\n resolve(Repository.activityModules(courseId));\n });\n }\n\n return innerPromise;\n };\n })();\n\n const fetchFooterData = (() => {\n let footerInnerPromise = null;\n\n return (sectionId) => {\n if (!footerInnerPromise) {\n footerInnerPromise = new Promise((resolve) => {\n resolve(Repository.fetchFooterData(courseId, sectionId));\n });\n }\n\n return footerInnerPromise;\n };\n })();\n\n CustomEvents.define(document, events);\n\n // Display module chooser event listeners.\n events.forEach((event) => {\n document.addEventListener(event, async(e) => {\n if (e.target.closest(selectors.elements.sectionmodchooser)) {\n let caller;\n // We need to know who called this.\n // Standard courses use the ID in the main section info.\n const sectionDiv = e.target.closest(selectors.elements.section);\n // Front page courses need some special handling.\n const button = e.target.closest(selectors.elements.sectionmodchooser);\n\n // If we don't have a section ID use the fallback ID.\n // We always want the sectionDiv caller first as it keeps track of section ID's after DnD changes.\n // The button attribute is always just a fallback for us as the section div is not always available.\n // A YUI change could be done maybe to only update the button attribute but we are going for minimal change here.\n if (sectionDiv !== null && sectionDiv.hasAttribute('data-sectionid')) {\n // We check for attributes just in case of outdated contrib course formats.\n caller = sectionDiv;\n } else {\n caller = button;\n }\n\n // We want to show the modal instantly but loading whilst waiting for our data.\n let bodyPromiseResolver;\n const bodyPromise = new Promise(resolve => {\n bodyPromiseResolver = resolve;\n });\n\n const footerData = await fetchFooterData(caller.dataset.sectionid);\n const sectionModal = buildModal(bodyPromise, footerData);\n\n // Now we have a modal we should start fetching data.\n // If an error occurs while fetching the data, display the error within the modal.\n const data = await fetchModuleData().catch(async(e) => {\n const errorTemplateData = {\n 'errormessage': e.message\n };\n bodyPromiseResolver(await Templates.render('core_course/local/activitychooser/error', errorTemplateData));\n });\n\n // Early return if there is no module data.\n if (!data) {\n return;\n }\n\n // Apply the section id to all the module instance links.\n const builtModuleData = sectionIdMapper(data, caller.dataset.sectionid, caller.dataset.sectionreturnid);\n\n ChooserDialogue.displayChooser(\n sectionModal,\n builtModuleData,\n partiallyAppliedFavouriteManager(data, caller.dataset.sectionid),\n footerData,\n );\n\n bodyPromiseResolver(await Templates.render(\n 'core_course/activitychooser',\n templateDataBuilder(builtModuleData, chooserConfig)\n ));\n }\n });\n });\n};\n\n/**\n * Given the web service data and an ID we want to make a deep copy\n * of the WS data then add on the section ID to the addoption URL\n *\n * @method sectionIdMapper\n * @param {Object} webServiceData Our original data from the Web service call\n * @param {Number} id The ID of the section we need to append to the links\n * @param {Number|null} sectionreturnid The ID of the section return we need to append to the links\n * @return {Array} [modules] with URL's built\n */\nconst sectionIdMapper = (webServiceData, id, sectionreturnid) => {\n // We need to take a fresh deep copy of the original data as an object is a reference type.\n const newData = JSON.parse(JSON.stringify(webServiceData));\n newData.content_items.forEach((module) => {\n module.link += '§ion=' + id + '&sr=' + (sectionreturnid ?? 0);\n });\n return newData.content_items;\n};\n\n/**\n * Given an array of modules we want to figure out where & how to place them into our template object\n *\n * @method templateDataBuilder\n * @param {Array} data our modules to manipulate into a Templatable object\n * @param {Object} chooserConfig Any PHP config settings that we may need to reference\n * @return {Object} Our built object ready to render out\n */\nconst templateDataBuilder = (data, chooserConfig) => {\n // Setup of various bits and pieces we need to mutate before throwing it to the wolves.\n let activities = [];\n let resources = [];\n let showAll = true;\n let showActivities = false;\n let showResources = false;\n\n // Tab mode can be the following [All, Resources & Activities, All & Activities & Resources].\n const tabMode = parseInt(chooserConfig.tabmode);\n\n // Filter the incoming data to find favourite & recommended modules.\n const favourites = data.filter(mod => mod.favourite === true);\n const recommended = data.filter(mod => mod.recommended === true);\n\n // Both of these modes need Activity & Resource tabs.\n if ((tabMode === ALLACTIVITIESRESOURCES || tabMode === ACTIVITIESRESOURCES) && tabMode !== ONLYALL) {\n // Filter the incoming data to find activities then resources.\n activities = data.filter(mod => mod.archetype === ACTIVITY);\n resources = data.filter(mod => mod.archetype === RESOURCE);\n showActivities = true;\n showResources = true;\n\n // We want all of the previous information but no 'All' tab.\n if (tabMode === ACTIVITIESRESOURCES) {\n showAll = false;\n }\n }\n\n // Given the results of the above filters lets figure out what tab to set active.\n // We have some favourites.\n const favouritesFirst = !!favourites.length;\n // We are in tabMode 2 without any favourites.\n const activitiesFirst = showAll === false && favouritesFirst === false;\n // We have nothing fallback to show all modules.\n const fallback = showAll === true && favouritesFirst === false;\n\n return {\n 'default': data,\n showAll: showAll,\n activities: activities,\n showActivities: showActivities,\n activitiesFirst: activitiesFirst,\n resources: resources,\n showResources: showResources,\n favourites: favourites,\n recommended: recommended,\n favouritesFirst: favouritesFirst,\n fallback: fallback,\n };\n};\n\n/**\n * Given an object we want to build a modal ready to show\n *\n * @method buildModal\n * @param {Promise} bodyPromise\n * @param {String|Boolean} footer Either a footer to add or nothing\n * @return {Object} The modal ready to display immediately and render body in later.\n */\nconst buildModal = (bodyPromise, footer) => {\n return ModalFactory.create({\n type: ModalFactory.types.DEFAULT,\n title: getString('addresourceoractivity'),\n body: bodyPromise,\n footer: footer.customfootertemplate,\n large: true,\n scrollable: false,\n templateContext: {\n classes: 'modchooser'\n }\n })\n .then(modal => {\n modal.show();\n return modal;\n });\n};\n\n/**\n * A small helper function to handle the case where there are no more favourites\n * and we need to mess a bit with the available tabs in the chooser\n *\n * @method nullFavouriteDomManager\n * @param {HTMLElement} favouriteTabNav Dom node of the favourite tab nav\n * @param {HTMLElement} modalBody Our current modals' body\n */\nconst nullFavouriteDomManager = (favouriteTabNav, modalBody) => {\n favouriteTabNav.tabIndex = -1;\n favouriteTabNav.classList.add('d-none');\n // Need to set active to an available tab.\n if (favouriteTabNav.classList.contains('active')) {\n favouriteTabNav.classList.remove('active');\n favouriteTabNav.setAttribute('aria-selected', 'false');\n const favouriteTab = modalBody.querySelector(selectors.regions.favouriteTab);\n favouriteTab.classList.remove('active');\n const defaultTabNav = modalBody.querySelector(selectors.regions.defaultTabNav);\n const activitiesTabNav = modalBody.querySelector(selectors.regions.activityTabNav);\n if (defaultTabNav.classList.contains('d-none') === false) {\n defaultTabNav.classList.add('active');\n defaultTabNav.setAttribute('aria-selected', 'true');\n defaultTabNav.tabIndex = 0;\n defaultTabNav.focus();\n const defaultTab = modalBody.querySelector(selectors.regions.defaultTab);\n defaultTab.classList.add('active');\n } else {\n activitiesTabNav.classList.add('active');\n activitiesTabNav.setAttribute('aria-selected', 'true');\n activitiesTabNav.tabIndex = 0;\n activitiesTabNav.focus();\n const activitiesTab = modalBody.querySelector(selectors.regions.activityTab);\n activitiesTab.classList.add('active');\n }\n\n }\n};\n\n/**\n * Export a curried function where the builtModules has been applied.\n * We have our array of modules so we can rerender the favourites area and have all of the items sorted.\n *\n * @method partiallyAppliedFavouriteManager\n * @param {Array} moduleData This is our raw WS data that we need to manipulate\n * @param {Number} sectionId We need this to add the sectionID to the URL's in the faves area after rerender\n * @return {Function} partially applied function so we can manipulate DOM nodes easily & update our internal array\n */\nconst partiallyAppliedFavouriteManager = (moduleData, sectionId) => {\n /**\n * Curried function that is being returned.\n *\n * @param {String} internal Internal name of the module to manage\n * @param {Boolean} favourite Is the caller adding a favourite or removing one?\n * @param {HTMLElement} modalBody What we need to update whilst we are here\n */\n return async(internal, favourite, modalBody) => {\n const favouriteArea = modalBody.querySelector(selectors.render.favourites);\n\n // eslint-disable-next-line max-len\n const favouriteButtons = modalBody.querySelectorAll(`[data-internal=\"${internal}\"] ${selectors.actions.optionActions.manageFavourite}`);\n const favouriteTabNav = modalBody.querySelector(selectors.regions.favouriteTabNav);\n const result = moduleData.content_items.find(({name}) => name === internal);\n const newFaves = {};\n if (result) {\n if (favourite) {\n result.favourite = true;\n\n // eslint-disable-next-line camelcase\n newFaves.content_items = moduleData.content_items.filter(mod => mod.favourite === true);\n\n const builtFaves = sectionIdMapper(newFaves, sectionId);\n\n const {html, js} = await Templates.renderForPromise('core_course/local/activitychooser/favourites',\n {favourites: builtFaves});\n\n await Templates.replaceNodeContents(favouriteArea, html, js);\n\n Array.from(favouriteButtons).forEach((element) => {\n element.classList.remove('text-muted');\n element.classList.add('text-primary');\n element.dataset.favourited = 'true';\n element.setAttribute('aria-pressed', true);\n element.firstElementChild.classList.remove('fa-star-o');\n element.firstElementChild.classList.add('fa-star');\n });\n\n favouriteTabNav.classList.remove('d-none');\n } else {\n result.favourite = false;\n\n const nodeToRemove = favouriteArea.querySelector(`[data-internal=\"${internal}\"]`);\n\n nodeToRemove.parentNode.removeChild(nodeToRemove);\n\n Array.from(favouriteButtons).forEach((element) => {\n element.classList.add('text-muted');\n element.classList.remove('text-primary');\n element.dataset.favourited = 'false';\n element.setAttribute('aria-pressed', false);\n element.firstElementChild.classList.remove('fa-star');\n element.firstElementChild.classList.add('fa-star-o');\n });\n const newFaves = moduleData.content_items.filter(mod => mod.favourite === true);\n\n if (newFaves.length === 0) {\n nullFavouriteDomManager(favouriteTabNav, modalBody);\n }\n }\n }\n };\n};\n"],"names":["courseId","chooserConfig","pendingPromise","Pending","registerListenerEvents","resolve","innerPromise","footerInnerPromise","events","CustomEvents","activate","keyboardActivate","fetchModuleData","Promise","Repository","activityModules","fetchFooterData","sectionId","define","document","forEach","event","addEventListener","e","target","closest","selectors","elements","sectionmodchooser","sectionDiv","section","button","caller","hasAttribute","bodyPromise","bodyPromiseResolver","dataset","sectionid","footerData","sectionModal","buildModal","catch","errorTemplateData","message","Templates","render","data","builtModuleData","sectionIdMapper","sectionreturnid","ChooserDialogue","displayChooser","partiallyAppliedFavouriteManager","templateDataBuilder","webServiceData","id","newData","JSON","parse","stringify","content_items","module","link","activities","resources","showAll","showActivities","showResources","tabMode","parseInt","tabmode","favourites","filter","mod","favourite","recommended","archetype","favouritesFirst","length","activitiesFirst","fallback","footer","ModalFactory","create","type","types","DEFAULT","title","body","customfootertemplate","large","scrollable","templateContext","classes","then","modal","show","nullFavouriteDomManager","favouriteTabNav","modalBody","tabIndex","classList","add","contains","remove","setAttribute","querySelector","regions","favouriteTab","defaultTabNav","activitiesTabNav","activityTabNav","focus","defaultTab","activityTab","moduleData","internal","favouriteArea","favouriteButtons","querySelectorAll","actions","optionActions","manageFavourite","result","find","name","newFaves","builtFaves","renderForPromise","html","js","replaceNodeContents","Array","from","element","favourited","firstElementChild","nodeToRemove","parentNode","removeChild"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"activitychooser.min.js","sources":["../src/activitychooser.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 type of dialogue used as for choosing modules in a course.\n *\n * @module core_course/activitychooser\n * @copyright 2020 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport * as ChooserDialogue from 'core_course/local/activitychooser/dialogue';\nimport * as Repository from 'core_course/local/activitychooser/repository';\nimport selectors from 'core_course/local/activitychooser/selectors';\nimport CustomEvents from 'core/custom_interaction_events';\nimport * as Templates from 'core/templates';\nimport * as ModalFactory from 'core/modal_factory';\nimport {get_string as getString} from 'core/str';\nimport Pending from 'core/pending';\n\n// Set up some JS module wide constants that can be added to in the future.\n\n// Tab config options.\nconst ALLACTIVITIESRESOURCES = 0;\nconst ONLYALL = 1;\nconst ACTIVITIESRESOURCES = 2;\n\n// Module types.\nconst ACTIVITY = 0;\nconst RESOURCE = 1;\n\n/**\n * Set up the activity chooser.\n *\n * @method init\n * @param {Number} courseId Course ID to use later on in fetchModules()\n * @param {Object} chooserConfig Any PHP config settings that we may need to reference\n */\nexport const init = (courseId, chooserConfig) => {\n const pendingPromise = new Pending();\n\n registerListenerEvents(courseId, chooserConfig);\n\n pendingPromise.resolve();\n};\n\n/**\n * Once a selection has been made make the modal & module information and pass it along\n *\n * @method registerListenerEvents\n * @param {Number} courseId\n * @param {Object} chooserConfig Any PHP config settings that we may need to reference\n */\nconst registerListenerEvents = (courseId, chooserConfig) => {\n const events = [\n 'click',\n CustomEvents.events.activate,\n CustomEvents.events.keyboardActivate\n ];\n\n const fetchModuleData = (() => {\n let innerPromise = null;\n\n return () => {\n if (!innerPromise) {\n innerPromise = new Promise((resolve) => {\n resolve(Repository.activityModules(courseId));\n });\n }\n\n return innerPromise;\n };\n })();\n\n const fetchFooterData = (() => {\n let footerInnerPromise = null;\n\n return (sectionId) => {\n if (!footerInnerPromise) {\n footerInnerPromise = new Promise((resolve) => {\n resolve(Repository.fetchFooterData(courseId, sectionId));\n });\n }\n\n return footerInnerPromise;\n };\n })();\n\n CustomEvents.define(document, events);\n\n // Display module chooser event listeners.\n events.forEach((event) => {\n document.addEventListener(event, async(e) => {\n if (e.target.closest(selectors.elements.sectionmodchooser)) {\n let caller;\n // We need to know who called this.\n // Standard courses use the ID in the main section info.\n const sectionDiv = e.target.closest(selectors.elements.section);\n // Front page courses need some special handling.\n const button = e.target.closest(selectors.elements.sectionmodchooser);\n\n // If we don't have a section ID use the fallback ID.\n // We always want the sectionDiv caller first as it keeps track of section ID's after DnD changes.\n // The button attribute is always just a fallback for us as the section div is not always available.\n // A YUI change could be done maybe to only update the button attribute but we are going for minimal change here.\n if (sectionDiv !== null && sectionDiv.hasAttribute('data-sectionid')) {\n // We check for attributes just in case of outdated contrib course formats.\n caller = sectionDiv;\n } else {\n caller = button;\n }\n\n // We want to show the modal instantly but loading whilst waiting for our data.\n let bodyPromiseResolver;\n const bodyPromise = new Promise(resolve => {\n bodyPromiseResolver = resolve;\n });\n\n const footerData = await fetchFooterData(caller.dataset.sectionid);\n const sectionModal = buildModal(bodyPromise, footerData);\n\n // Now we have a modal we should start fetching data.\n // If an error occurs while fetching the data, display the error within the modal.\n const data = await fetchModuleData().catch(async(e) => {\n const errorTemplateData = {\n 'errormessage': e.message\n };\n bodyPromiseResolver(await Templates.render('core_course/local/activitychooser/error', errorTemplateData));\n });\n\n // Early return if there is no module data.\n if (!data) {\n return;\n }\n\n // Apply the section id to all the module instance links.\n const builtModuleData = sectionIdMapper(data, caller.dataset.sectionid, caller.dataset.sectionreturnid);\n\n ChooserDialogue.displayChooser(\n sectionModal,\n builtModuleData,\n partiallyAppliedFavouriteManager(data, caller.dataset.sectionid),\n footerData,\n );\n\n bodyPromiseResolver(await Templates.render(\n 'core_course/activitychooser',\n templateDataBuilder(builtModuleData, chooserConfig)\n ));\n }\n });\n });\n};\n\n/**\n * Given the web service data and an ID we want to make a deep copy\n * of the WS data then add on the section ID to the addoption URL\n *\n * @method sectionIdMapper\n * @param {Object} webServiceData Our original data from the Web service call\n * @param {Number} id The ID of the section we need to append to the links\n * @param {Number|null} sectionreturnid The ID of the section return we need to append to the links\n * @return {Array} [modules] with URL's built\n */\nconst sectionIdMapper = (webServiceData, id, sectionreturnid) => {\n // We need to take a fresh deep copy of the original data as an object is a reference type.\n const newData = JSON.parse(JSON.stringify(webServiceData));\n newData.content_items.forEach((module) => {\n module.link += '§ion=' + id + '&sr=' + (sectionreturnid ?? 0);\n });\n return newData.content_items;\n};\n\n/**\n * Given an array of modules we want to figure out where & how to place them into our template object\n *\n * @method templateDataBuilder\n * @param {Array} data our modules to manipulate into a Templatable object\n * @param {Object} chooserConfig Any PHP config settings that we may need to reference\n * @return {Object} Our built object ready to render out\n */\nconst templateDataBuilder = (data, chooserConfig) => {\n // Setup of various bits and pieces we need to mutate before throwing it to the wolves.\n let activities = [];\n let resources = [];\n let showAll = true;\n let showActivities = false;\n let showResources = false;\n\n // Tab mode can be the following [All, Resources & Activities, All & Activities & Resources].\n const tabMode = parseInt(chooserConfig.tabmode);\n\n // Filter the incoming data to find favourite & recommended modules.\n const favourites = data.filter(mod => mod.favourite === true);\n const recommended = data.filter(mod => mod.recommended === true);\n\n // Both of these modes need Activity & Resource tabs.\n if ((tabMode === ALLACTIVITIESRESOURCES || tabMode === ACTIVITIESRESOURCES) && tabMode !== ONLYALL) {\n // Filter the incoming data to find activities then resources.\n activities = data.filter(mod => mod.archetype === ACTIVITY);\n resources = data.filter(mod => mod.archetype === RESOURCE);\n showActivities = true;\n showResources = true;\n\n // We want all of the previous information but no 'All' tab.\n if (tabMode === ACTIVITIESRESOURCES) {\n showAll = false;\n }\n }\n\n // Given the results of the above filters lets figure out what tab to set active.\n // We have some favourites.\n const favouritesFirst = !!favourites.length;\n // We are in tabMode 2 without any favourites.\n const activitiesFirst = showAll === false && favouritesFirst === false;\n // We have nothing fallback to show all modules.\n const fallback = showAll === true && favouritesFirst === false;\n\n return {\n 'default': data,\n showAll: showAll,\n activities: activities,\n showActivities: showActivities,\n activitiesFirst: activitiesFirst,\n resources: resources,\n showResources: showResources,\n favourites: favourites,\n recommended: recommended,\n favouritesFirst: favouritesFirst,\n fallback: fallback,\n };\n};\n\n/**\n * Given an object we want to build a modal ready to show\n *\n * @method buildModal\n * @param {Promise} bodyPromise\n * @param {String|Boolean} footer Either a footer to add or nothing\n * @return {Object} The modal ready to display immediately and render body in later.\n */\nconst buildModal = (bodyPromise, footer) => {\n return ModalFactory.create({\n type: ModalFactory.types.DEFAULT,\n title: getString('addresourceoractivity'),\n body: bodyPromise,\n footer: footer.customfootertemplate,\n large: true,\n scrollable: false,\n templateContext: {\n classes: 'modchooser'\n }\n })\n .then(modal => {\n modal.show();\n return modal;\n });\n};\n\n/**\n * A small helper function to handle the case where there are no more favourites\n * and we need to mess a bit with the available tabs in the chooser\n *\n * @method nullFavouriteDomManager\n * @param {HTMLElement} favouriteTabNav Dom node of the favourite tab nav\n * @param {HTMLElement} modalBody Our current modals' body\n */\nconst nullFavouriteDomManager = (favouriteTabNav, modalBody) => {\n favouriteTabNav.tabIndex = -1;\n favouriteTabNav.classList.add('d-none');\n // Need to set active to an available tab.\n if (favouriteTabNav.classList.contains('active')) {\n favouriteTabNav.classList.remove('active');\n favouriteTabNav.setAttribute('aria-selected', 'false');\n const favouriteTab = modalBody.querySelector(selectors.regions.favouriteTab);\n favouriteTab.classList.remove('active');\n const defaultTabNav = modalBody.querySelector(selectors.regions.defaultTabNav);\n const activitiesTabNav = modalBody.querySelector(selectors.regions.activityTabNav);\n if (defaultTabNav.classList.contains('d-none') === false) {\n defaultTabNav.classList.add('active');\n defaultTabNav.setAttribute('aria-selected', 'true');\n defaultTabNav.tabIndex = 0;\n defaultTabNav.focus();\n const defaultTab = modalBody.querySelector(selectors.regions.defaultTab);\n defaultTab.classList.add('active');\n } else {\n activitiesTabNav.classList.add('active');\n activitiesTabNav.setAttribute('aria-selected', 'true');\n activitiesTabNav.tabIndex = 0;\n activitiesTabNav.focus();\n const activitiesTab = modalBody.querySelector(selectors.regions.activityTab);\n activitiesTab.classList.add('active');\n }\n\n }\n};\n\n/**\n * Export a curried function where the builtModules has been applied.\n * We have our array of modules so we can rerender the favourites area and have all of the items sorted.\n *\n * @method partiallyAppliedFavouriteManager\n * @param {Array} moduleData This is our raw WS data that we need to manipulate\n * @param {Number} sectionId We need this to add the sectionID to the URL's in the faves area after rerender\n * @return {Function} partially applied function so we can manipulate DOM nodes easily & update our internal array\n */\nconst partiallyAppliedFavouriteManager = (moduleData, sectionId) => {\n /**\n * Curried function that is being returned.\n *\n * @param {String} internal Internal name of the module to manage\n * @param {Boolean} favourite Is the caller adding a favourite or removing one?\n * @param {HTMLElement} modalBody What we need to update whilst we are here\n */\n return async(internal, favourite, modalBody) => {\n const favouriteArea = modalBody.querySelector(selectors.render.favourites);\n\n // eslint-disable-next-line max-len\n const favouriteButtons = modalBody.querySelectorAll(`[data-internal=\"${internal}\"] ${selectors.actions.optionActions.manageFavourite}`);\n const favouriteTabNav = modalBody.querySelector(selectors.regions.favouriteTabNav);\n const result = moduleData.content_items.find(({name}) => name === internal);\n const newFaves = {};\n if (result) {\n if (favourite) {\n result.favourite = true;\n\n // eslint-disable-next-line camelcase\n newFaves.content_items = moduleData.content_items.filter(mod => mod.favourite === true);\n\n const builtFaves = sectionIdMapper(newFaves, sectionId);\n\n const {html, js} = await Templates.renderForPromise('core_course/local/activitychooser/favourites',\n {favourites: builtFaves});\n\n await Templates.replaceNodeContents(favouriteArea, html, js);\n\n Array.from(favouriteButtons).forEach((element) => {\n element.classList.remove('text-muted');\n element.classList.add('text-primary');\n element.dataset.favourited = 'true';\n element.setAttribute('aria-pressed', true);\n element.firstElementChild.classList.remove('fa-star-o');\n element.firstElementChild.classList.add('fa-star');\n });\n\n favouriteTabNav.classList.remove('d-none');\n } else {\n result.favourite = false;\n\n const nodeToRemove = favouriteArea.querySelector(`[data-internal=\"${internal}\"]`);\n\n nodeToRemove.parentNode.removeChild(nodeToRemove);\n\n Array.from(favouriteButtons).forEach((element) => {\n element.classList.add('text-muted');\n element.classList.remove('text-primary');\n element.dataset.favourited = 'false';\n element.setAttribute('aria-pressed', false);\n element.firstElementChild.classList.remove('fa-star');\n element.firstElementChild.classList.add('fa-star-o');\n });\n const newFaves = moduleData.content_items.filter(mod => mod.favourite === true);\n\n if (newFaves.length === 0) {\n nullFavouriteDomManager(favouriteTabNav, modalBody);\n }\n }\n }\n };\n};\n"],"names":["ChooserDialogue","_interopRequireWildcard","Repository","_selectors","_interopRequireDefault","_custom_interaction_events","Templates","ModalFactory","_pending","courseId","chooserConfig","pendingPromise","Pending","registerListenerEvents","resolve","innerPromise","footerInnerPromise","events","CustomEvents","activate","keyboardActivate","fetchModuleData","Promise","activityModules","fetchFooterData","sectionId","define","document","forEach","event","_ref","addEventListener","_asyncToGenerator","regeneratorRuntime","mark","e","caller","sectionDiv","button","bodyPromiseResolver","bodyPromise","footerData","sectionModal","data","builtModuleData","wrap","_context2","prev","next","target","closest","selectors","elements","sectionmodchooser","section","hasAttribute","dataset","sectionid","sent","buildModal","catch","_ref2","errorTemplateData","_context","errormessage","message","t0","render","t1","stop","_callee","_x2","apply","this","arguments","abrupt","sectionIdMapper","sectionreturnid","displayChooser","partiallyAppliedFavouriteManager","templateDataBuilder","_callee2","_x","webServiceData","id","newData","JSON","parse","stringify","content_items","module","link","activities","resources","showAll","showActivities","showResources","tabMode","parseInt","tabmode","favourites","filter","mod","favourite","recommended","archetype","favouritesFirst","length","default","activitiesFirst","fallback","footer","create","type","types","DEFAULT","title","_str","get_string","body","customfootertemplate","large","scrollable","templateContext","classes","then","modal","show","nullFavouriteDomManager","favouriteTabNav","modalBody","tabIndex","classList","add","contains","remove","setAttribute","querySelector","regions","favouriteTab","defaultTabNav","activitiesTabNav","activityTabNav","focus","defaultTab","activityTab","moduleData","_ref3","internal","favouriteArea","favouriteButtons","result","newFaves","builtFaves","_yield$Templates$rend","html","js","nodeToRemove","_context3","querySelectorAll","actions","optionActions","manageFavourite","find","_ref4","name","renderForPromise","replaceNodeContents","Array","from","element","favourited","firstElementChild","concat","parentNode","removeChild","_callee3","_x3","_x4","_x5"],"mappings":"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"} \ No newline at end of file diff --git a/course/amd/build/copy_modal.min.js.map b/course/amd/build/copy_modal.min.js.map index c7adc406ac3..d14cf0606b4 100644 --- a/course/amd/build/copy_modal.min.js.map +++ b/course/amd/build/copy_modal.min.js.map @@ -1 +1 @@ -{"version":3,"file":"copy_modal.min.js","sources":["../src/copy_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 provides the course copy modal from the course and\n * category management screen.\n *\n * @module core_course/copy_modal\n * @copyright 2020 onward The Moodle Users Association \n * @author Matt Porritt \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.9\n */\n\ndefine(['jquery', 'core/str', 'core/modal_factory', 'core/modal_events',\n 'core/ajax', 'core/fragment', 'core/notification', 'core/config'],\n function($, Str, ModalFactory, ModalEvents, ajax, Fragment, Notification, Config) {\n\n /**\n * Module level variables.\n */\n var CopyModal = {};\n var contextid;\n var course;\n var modalObj;\n var spinner = '

          '\n + ''\n + '

          ';\n\n /**\n * Creates the modal for the course copy form\n *\n * @private\n */\n function createModal() {\n // Get the Title String.\n Str.get_string('loading').then(function(title) {\n // Create the Modal.\n ModalFactory.create({\n type: ModalFactory.types.DEFAULT,\n title: title,\n body: spinner,\n large: true\n })\n .done(function(modal) {\n modalObj = modal;\n // Explicitly handle form click events.\n modalObj.getRoot().on('click', '#id_submitreturn', processModalForm);\n modalObj.getRoot().on('click', '#id_submitdisplay', function(e) {\n e.formredirect = true;\n processModalForm(e);\n\n });\n modalObj.getRoot().on('click', '#id_cancel', function(e) {\n e.preventDefault();\n modalObj.setBody(spinner);\n modalObj.hide();\n });\n });\n return;\n }).catch(function() {\n Notification.exception(new Error('Failed to load string: loading'));\n });\n }\n\n /**\n * Updates the body of the modal window.\n *\n * @param {Object} formdata\n * @private\n */\n function updateModalBody(formdata) {\n if (typeof formdata === \"undefined\") {\n formdata = {};\n }\n\n var params = {\n 'jsonformdata': JSON.stringify(formdata),\n 'courseid': course.id\n };\n\n modalObj.setBody(spinner);\n Str.get_string('copycoursetitle', 'backup', course.shortname).then(function(title) {\n modalObj.setTitle(title);\n modalObj.setBody(Fragment.loadFragment('course', 'new_base_form', contextid, params));\n return;\n }).catch(function() {\n Notification.exception(new Error('Failed to load string: copycoursetitle'));\n });\n }\n\n /**\n * Updates Moodle form with selected information.\n *\n * @param {Object} e\n * @private\n */\n function processModalForm(e) {\n e.preventDefault(); // Stop modal from closing.\n\n // Form data.\n var copyform = modalObj.getRoot().find('form').serialize();\n var formjson = JSON.stringify(copyform);\n\n // Handle invalid form fields for better UX.\n var invalid = $.merge(\n modalObj.getRoot().find('[aria-invalid=\"true\"]'),\n modalObj.getRoot().find('.error')\n );\n\n if (invalid.length) {\n invalid.first().focus();\n return;\n }\n\n // Submit form via ajax.\n ajax.call([{\n methodname: 'core_backup_submit_copy_form',\n args: {\n jsonformdata: formjson\n },\n }])[0].done(function() {\n // For submission succeeded.\n modalObj.setBody(spinner);\n modalObj.hide();\n\n if (e.formredirect == true) {\n // We are redirecting to copy progress display.\n let redirect = Config.wwwroot + \"/backup/copyprogress.php?id=\" + course.id;\n window.location.assign(redirect);\n }\n\n }).fail(function() {\n // Form submission failed server side, redisplay with errors.\n updateModalBody(copyform);\n });\n }\n\n /**\n * Initialise the class.\n *\n * @method\n * @param {Object} context\n * @public\n */\n CopyModal.init = function(context) {\n contextid = context;\n // Setup the initial Modal.\n createModal();\n\n // Setup the click handlers on the copy buttons.\n $('.action-copy').on('click', function(e) {\n e.preventDefault(); // Stop. Hammer time.\n let url = new URL(this.getAttribute('href'));\n let params = new URLSearchParams(url.search);\n let courseid = params.get('id');\n\n ajax.call([{ // Get the course information.\n methodname: 'core_course_get_courses',\n args: {\n 'options': {'ids': [courseid]},\n },\n }])[0].done(function(response) {\n // We have the course info get the modal content.\n course = response[0];\n updateModalBody();\n\n }).fail(function() {\n Notification.exception(new Error('Failed to load course'));\n });\n\n modalObj.show();\n });\n\n };\n\n return CopyModal;\n});\n"],"names":["define","$","Str","ModalFactory","ModalEvents","ajax","Fragment","Notification","Config","contextid","course","modalObj","CopyModal","spinner","updateModalBody","formdata","params","JSON","stringify","id","setBody","get_string","shortname","then","title","setTitle","loadFragment","catch","exception","Error","processModalForm","e","preventDefault","copyform","getRoot","find","serialize","formjson","invalid","merge","length","first","focus","call","methodname","args","jsonformdata","done","hide","formredirect","redirect","wwwroot","window","location","assign","fail","init","context","create","type","types","DEFAULT","body","large","modal","on","url","URL","this","getAttribute","courseid","URLSearchParams","search","get","response","show"],"mappings":";;;;;;;;;;AA0BAA,gCAAO,CAAC,SAAU,WAAY,qBAAsB,oBAC5C,YAAa,gBAAiB,oBAAqB,gBACnD,SAASC,EAAGC,IAAKC,aAAcC,YAAaC,KAAMC,SAAUC,aAAcC,YAM1EC,UACAC,OACAC,SAHAC,UAAY,GAIZC,QAAU,yFA8CLC,gBAAgBC,eACG,IAAbA,WACPA,SAAW,QAGXC,OAAS,cACWC,KAAKC,UAAUH,mBACnBL,OAAOS,IAG3BR,SAASS,QAAQP,SACjBX,IAAImB,WAAW,kBAAmB,SAAUX,OAAOY,WAAWC,MAAK,SAASC,OACxEb,SAASc,SAASD,OAClBb,SAASS,QAAQd,SAASoB,aAAa,SAAU,gBAAiBjB,UAAWO,YAE9EW,OAAM,WACLpB,aAAaqB,UAAU,IAAIC,MAAM,uDAUhCC,iBAAiBC,GACtBA,EAAEC,qBAGEC,SAAWtB,SAASuB,UAAUC,KAAK,QAAQC,YAC3CC,SAAWpB,KAAKC,UAAUe,UAG1BK,QAAUrC,EAAEsC,MACR5B,SAASuB,UAAUC,KAAK,yBACxBxB,SAASuB,UAAUC,KAAK,WAG5BG,QAAQE,OACRF,QAAQG,QAAQC,QAKpBrC,KAAKsC,KAAK,CAAC,CACPC,WAAY,+BACZC,KAAM,CACFC,aAAcT,aAElB,GAAGU,MAAK,cAERpC,SAASS,QAAQP,SACjBF,SAASqC,OAEa,GAAlBjB,EAAEkB,aAAsB,KAEpBC,SAAW1C,OAAO2C,QAAU,+BAAiCzC,OAAOS,GACxEiC,OAAOC,SAASC,OAAOJ,cAG5BK,MAAK,WAEJzC,gBAAgBmB,oBAWxBrB,UAAU4C,KAAO,SAASC,SACtBhD,UAAYgD,QA9GZvD,IAAImB,WAAW,WAAWE,MAAK,SAASC,OAEpCrB,aAAauD,OAAO,CAChBC,KAAMxD,aAAayD,MAAMC,QACzBrC,MAAOA,MACPsC,KAAMjD,QACNkD,OAAO,IAEVhB,MAAK,SAASiB,QACXrD,SAAWqD,OAEF9B,UAAU+B,GAAG,QAAS,mBAAoBnC,kBACnDnB,SAASuB,UAAU+B,GAAG,QAAS,qBAAqB,SAASlC,GACzDA,EAAEkB,cAAe,EACjBnB,iBAAiBC,MAGrBpB,SAASuB,UAAU+B,GAAG,QAAS,cAAc,SAASlC,GAClDA,EAAEC,iBACFrB,SAASS,QAAQP,SACjBF,SAASqC,gBAIlBrB,OAAM,WACLpB,aAAaqB,UAAU,IAAIC,MAAM,sCA0FrC5B,EAAE,gBAAgBgE,GAAG,SAAS,SAASlC,GACnCA,EAAEC,qBACEkC,IAAM,IAAIC,IAAIC,KAAKC,aAAa,SAEhCC,SADS,IAAIC,gBAAgBL,IAAIM,QACfC,IAAI,MAE1BpE,KAAKsC,KAAK,CAAC,CACPC,WAAY,0BACZC,KAAM,SACS,KAAQ,CAACyB,eAExB,GAAGvB,MAAK,SAAS2B,UAEjBhE,OAASgE,SAAS,GAClB5D,qBAEDyC,MAAK,WACJhD,aAAaqB,UAAU,IAAIC,MAAM,6BAGrClB,SAASgE,WAKV/D"} \ No newline at end of file +{"version":3,"file":"copy_modal.min.js","sources":["../src/copy_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 provides the course copy modal from the course and\n * category management screen.\n *\n * @module core_course/copy_modal\n * @copyright 2020 onward The Moodle Users Association \n * @author Matt Porritt \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.9\n */\n\ndefine(['jquery', 'core/str', 'core/modal_factory', 'core/modal_events',\n 'core/ajax', 'core/fragment', 'core/notification', 'core/config'],\n function($, Str, ModalFactory, ModalEvents, ajax, Fragment, Notification, Config) {\n\n /**\n * Module level variables.\n */\n var CopyModal = {};\n var contextid;\n var course;\n var modalObj;\n var spinner = '

          '\n + ''\n + '

          ';\n\n /**\n * Creates the modal for the course copy form\n *\n * @private\n */\n function createModal() {\n // Get the Title String.\n Str.get_string('loading').then(function(title) {\n // Create the Modal.\n ModalFactory.create({\n type: ModalFactory.types.DEFAULT,\n title: title,\n body: spinner,\n large: true\n })\n .done(function(modal) {\n modalObj = modal;\n // Explicitly handle form click events.\n modalObj.getRoot().on('click', '#id_submitreturn', processModalForm);\n modalObj.getRoot().on('click', '#id_submitdisplay', function(e) {\n e.formredirect = true;\n processModalForm(e);\n\n });\n modalObj.getRoot().on('click', '#id_cancel', function(e) {\n e.preventDefault();\n modalObj.setBody(spinner);\n modalObj.hide();\n });\n });\n return;\n }).catch(function() {\n Notification.exception(new Error('Failed to load string: loading'));\n });\n }\n\n /**\n * Updates the body of the modal window.\n *\n * @param {Object} formdata\n * @private\n */\n function updateModalBody(formdata) {\n if (typeof formdata === \"undefined\") {\n formdata = {};\n }\n\n var params = {\n 'jsonformdata': JSON.stringify(formdata),\n 'courseid': course.id\n };\n\n modalObj.setBody(spinner);\n Str.get_string('copycoursetitle', 'backup', course.shortname).then(function(title) {\n modalObj.setTitle(title);\n modalObj.setBody(Fragment.loadFragment('course', 'new_base_form', contextid, params));\n return;\n }).catch(function() {\n Notification.exception(new Error('Failed to load string: copycoursetitle'));\n });\n }\n\n /**\n * Updates Moodle form with selected information.\n *\n * @param {Object} e\n * @private\n */\n function processModalForm(e) {\n e.preventDefault(); // Stop modal from closing.\n\n // Form data.\n var copyform = modalObj.getRoot().find('form').serialize();\n var formjson = JSON.stringify(copyform);\n\n // Handle invalid form fields for better UX.\n var invalid = $.merge(\n modalObj.getRoot().find('[aria-invalid=\"true\"]'),\n modalObj.getRoot().find('.error')\n );\n\n if (invalid.length) {\n invalid.first().focus();\n return;\n }\n\n // Submit form via ajax.\n ajax.call([{\n methodname: 'core_backup_submit_copy_form',\n args: {\n jsonformdata: formjson\n },\n }])[0].done(function() {\n // For submission succeeded.\n modalObj.setBody(spinner);\n modalObj.hide();\n\n if (e.formredirect == true) {\n // We are redirecting to copy progress display.\n let redirect = Config.wwwroot + \"/backup/copyprogress.php?id=\" + course.id;\n window.location.assign(redirect);\n }\n\n }).fail(function() {\n // Form submission failed server side, redisplay with errors.\n updateModalBody(copyform);\n });\n }\n\n /**\n * Initialise the class.\n *\n * @method\n * @param {Object} context\n * @public\n */\n CopyModal.init = function(context) {\n contextid = context;\n // Setup the initial Modal.\n createModal();\n\n // Setup the click handlers on the copy buttons.\n $('.action-copy').on('click', function(e) {\n e.preventDefault(); // Stop. Hammer time.\n let url = new URL(this.getAttribute('href'));\n let params = new URLSearchParams(url.search);\n let courseid = params.get('id');\n\n ajax.call([{ // Get the course information.\n methodname: 'core_course_get_courses',\n args: {\n 'options': {'ids': [courseid]},\n },\n }])[0].done(function(response) {\n // We have the course info get the modal content.\n course = response[0];\n updateModalBody();\n\n }).fail(function() {\n Notification.exception(new Error('Failed to load course'));\n });\n\n modalObj.show();\n });\n\n };\n\n return CopyModal;\n});\n"],"names":["define","$","Str","ModalFactory","ModalEvents","ajax","Fragment","Notification","Config","CopyModal","contextid","course","modalObj","spinner","updateModalBody","formdata","params","jsonformdata","JSON","stringify","courseid","id","setBody","get_string","shortname","then","title","setTitle","loadFragment","catch","exception","Error","processModalForm","e","preventDefault","copyform","getRoot","find","serialize","formjson","invalid","merge","length","first","focus","call","methodname","args","done","hide","formredirect","redirect","wwwroot","window","location","assign","fail","init","context","create","type","types","DEFAULT","body","large","modal","on","url","URL","this","getAttribute","URLSearchParams","search","get","options","ids","response","show"],"mappings":";;;;;;;;;;AA0BAA,OAAO,yBAAA,CAAC,SAAU,WAAY,qBAAsB,oBAC5C,YAAa,gBAAiB,oBAAqB,gBACnD,SAASC,EAAGC,IAAKC,aAAcC,YAAaC,KAAMC,SAAUC,aAAcC,QAK1EC,IACAC,UACAC,OACAC,SAHAH,UAAY,CAAA,EAIZI,QAAU,gFA8CLC,SAAAA,gBAAgBC,eACG,IAAbA,WACPA,SAAW,CAAA,GAGf,IAAIC,OAAS,CACLC,aAAgBC,KAAKC,UAAUJ,UAC/BK,SAAYT,OAAOU,IAG3BT,SAASU,QAAQT,SACjBX,IAAIqB,WAAW,kBAAmB,SAAUZ,OAAOa,WAAWC,MAAK,SAASC,OACxEd,SAASe,SAASD,OAClBd,SAASU,QAAQhB,SAASsB,aAAa,SAAU,gBAAiBlB,UAAWM,QAEhF,IAAEa,OAAM,WACLtB,aAAauB,UAAU,IAAIC,MAAM,0CACpC,GACJ,CAQQC,SAAAA,iBAAiBC,GACtBA,EAAEC,iBAGEC,IAAAA,SAAWvB,SAASwB,UAAUC,KAAK,QAAQC,YAC3CC,SAAWrB,KAAKC,UAAUgB,UAG1BK,QAAUvC,EAAEwC,MACR7B,SAASwB,UAAUC,KAAK,yBACxBzB,SAASwB,UAAUC,KAAK,WAG5BG,QAAQE,OACRF,QAAQG,QAAQC,QAKpBvC,KAAKwC,KAAK,CAAC,CACPC,WAAY,+BACZC,KAAM,CACF9B,aAAcsB,aAElB,GAAGS,MAAK,WAKR,GAHApC,SAASU,QAAQT,SACjBD,SAASqC,OAEa,GAAlBhB,EAAEiB,aAAsB,CAEpBC,IAAAA,SAAW3C,OAAO4C,QAAU,+BAAiCzC,OAAOU,GACxEgC,OAAOC,SAASC,OAAOJ,SAC1B,CAEJ,IAAEK,MAAK,WAEJ1C,gBAAgBqB,SACnB,GACJ,CAwCD,OA/BA1B,UAAUgD,KAAO,SAASC,SACtBhD,UAAYgD,QA9GZxD,IAAIqB,WAAW,WAAWE,MAAK,SAASC,OAEpCvB,aAAawD,OAAO,CAChBC,KAAMzD,aAAa0D,MAAMC,QACzBpC,MAAOA,MACPqC,KAAMlD,QACNmD,OAAO,IAEVhB,MAAK,SAASiB,QACXrD,SAAWqD,OAEF7B,UAAU8B,GAAG,QAAS,mBAAoBlC,kBACnDpB,SAASwB,UAAU8B,GAAG,QAAS,qBAAqB,SAASjC,GACzDA,EAAEiB,cAAe,EACjBlB,iBAAiBC,EAEpB,IACDrB,SAASwB,UAAU8B,GAAG,QAAS,cAAc,SAASjC,GAClDA,EAAEC,iBACFtB,SAASU,QAAQT,SACjBD,SAASqC,MACZ,GACJ,GAEJ,IAAEpB,OAAM,WACLtB,aAAauB,UAAU,IAAIC,MAAM,kCACpC,IAyFD9B,EAAE,gBAAgBiE,GAAG,SAAS,SAASjC,GACnCA,EAAEC,iBACEiC,IAAAA,IAAM,IAAIC,IAAIC,KAAKC,aAAa,SAEhClD,SADS,IAAImD,gBAAgBJ,IAAIK,QACfC,IAAI,MAE1BpE,KAAKwC,KAAK,CAAC,CACPC,WAAY,0BACZC,KAAM,CACS2B,QAAA,CAACC,IAAO,CAACvD,eAExB,GAAG4B,MAAK,SAAS4B,UAEjBjE,OAASiE,SAAS,GAClB9D,iBAEH,IAAE0C,MAAK,WACJjD,aAAauB,UAAU,IAAIC,MAAM,yBACpC,IAEDnB,SAASiE,MACZ,GAEJ,EAEMpE,SACV"} \ No newline at end of file diff --git a/course/amd/build/downloadcontent.min.js.map b/course/amd/build/downloadcontent.min.js.map index 187a4fe54c5..18b0baa258c 100644 --- a/course/amd/build/downloadcontent.min.js.map +++ b/course/amd/build/downloadcontent.min.js.map @@ -1 +1 @@ -{"version":3,"file":"downloadcontent.min.js","sources":["../src/downloadcontent.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 * Functions related to downloading course content.\n *\n * @module core_course/downloadcontent\n * @copyright 2020 Michael Hawkins \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Config from 'core/config';\nimport CustomEvents from 'core/custom_interaction_events';\nimport * as ModalFactory from 'core/modal_factory';\nimport jQuery from 'jquery';\nimport Pending from 'core/pending';\nimport {enter, space} from 'core/key_codes';\n\n/**\n * Set up listener to trigger the download course content modal.\n *\n * @return {void}\n */\nexport const init = () => {\n const pendingPromise = new Pending();\n\n // Add event listeners for click and enter/space keys.\n jQuery('[data-downloadcourse]').on('click keydown', (e) => {\n if (e.type === 'click' || e.which === enter || e.which === space) {\n e.preventDefault();\n displayDownloadConfirmation(e.currentTarget);\n }\n });\n\n pendingPromise.resolve();\n};\n\n/**\n * Display the download course content modal.\n *\n * @method displayDownloadConfirmation\n * @param {Object} downloadModalTrigger The DOM element that triggered the download modal.\n * @return {void}\n */\nconst displayDownloadConfirmation = (downloadModalTrigger) => {\n ModalFactory.create({\n title: downloadModalTrigger.dataset.downloadTitle,\n type: ModalFactory.types.SAVE_CANCEL,\n body: `

          ${downloadModalTrigger.dataset.downloadBody}

          `,\n buttons: {\n save: downloadModalTrigger.dataset.downloadButtonText\n },\n templateContext: {\n classes: 'downloadcoursecontentmodal'\n }\n })\n .then(modal => {\n // Display the modal.\n modal.show();\n\n const saveButton = document.querySelector('.modal .downloadcoursecontentmodal [data-action=\"save\"]');\n const cancelButton = document.querySelector('.modal .downloadcoursecontentmodal [data-action=\"cancel\"]');\n const modalContainer = document.querySelector('.modal[data-region=\"modal-container\"]');\n\n // Create listener to trigger the download when the \"Download\" button is pressed.\n jQuery(saveButton).on(CustomEvents.events.activate, (e) => downloadContent(e, downloadModalTrigger, modal));\n\n // Create listener to destroy the modal when closing modal by cancelling.\n jQuery(cancelButton).on(CustomEvents.events.activate, () => {\n modal.destroy();\n });\n\n // Create listener to destroy the modal when closing modal by clicking outside of it.\n if (modalContainer.querySelector('.downloadcoursecontentmodal')) {\n jQuery(modalContainer).on(CustomEvents.events.activate, () => {\n modal.destroy();\n });\n }\n });\n};\n\n/**\n * Trigger downloading of course content.\n *\n * @method downloadContent\n * @param {Event} e The event triggering the download.\n * @param {Object} downloadModalTrigger The DOM element that triggered the download modal.\n * @param {Object} modal The modal object.\n * @return {void}\n */\nconst downloadContent = (e, downloadModalTrigger, modal) => {\n e.preventDefault();\n\n // Create a form to submit the file download request, so we can avoid sending sesskey over GET.\n const downloadForm = document.createElement('form');\n downloadForm.action = downloadModalTrigger.dataset.downloadLink;\n downloadForm.method = 'POST';\n // Open download in a new tab, so current course view is not disrupted.\n downloadForm.target = '_blank';\n const downloadSesskey = document.createElement('input');\n downloadSesskey.name = 'sesskey';\n downloadSesskey.value = Config.sesskey;\n downloadForm.appendChild(downloadSesskey);\n downloadForm.style.display = 'none';\n\n document.body.appendChild(downloadForm);\n downloadForm.submit();\n document.body.removeChild(downloadForm);\n\n // Destroy the modal to prevent duplicates if reopened later.\n modal.destroy();\n};\n"],"names":["pendingPromise","Pending","on","e","type","which","enter","space","preventDefault","displayDownloadConfirmation","currentTarget","resolve","downloadModalTrigger","ModalFactory","create","title","dataset","downloadTitle","types","SAVE_CANCEL","body","downloadBody","buttons","save","downloadButtonText","templateContext","classes","then","modal","show","saveButton","document","querySelector","cancelButton","modalContainer","CustomEvents","events","activate","downloadContent","destroy","downloadForm","createElement","action","downloadLink","method","target","downloadSesskey","name","value","Config","sesskey","appendChild","style","display","submit","removeChild"],"mappings":";;;;;;;m9BAmCoB,eACVA,eAAiB,IAAIC,qCAGpB,yBAAyBC,GAAG,iBAAiB,SAACC,GAClC,UAAXA,EAAEC,MAAoBD,EAAEE,QAAUC,kBAASH,EAAEE,QAAUE,mBACvDJ,EAAEK,iBACFC,4BAA4BN,EAAEO,mBAItCV,eAAeW,eAUbF,4BAA8B,SAACG,sBACjCC,aAAaC,OAAO,CAChBC,MAAOH,qBAAqBI,QAAQC,cACpCb,KAAMS,aAAaK,MAAMC,YACzBC,kBAAYR,qBAAqBI,QAAQK,qBACzCC,QAAS,CACLC,KAAMX,qBAAqBI,QAAQQ,oBAEvCC,gBAAiB,CACbC,QAAS,gCAGhBC,MAAK,SAAAC,OAEFA,MAAMC,WAEAC,WAAaC,SAASC,cAAc,2DACpCC,aAAeF,SAASC,cAAc,6DACtCE,eAAiBH,SAASC,cAAc,6DAGvCF,YAAY5B,GAAGiC,mCAAaC,OAAOC,UAAU,SAAClC,UAAMmC,gBAAgBnC,EAAGS,qBAAsBgB,8BAG7FK,cAAc/B,GAAGiC,mCAAaC,OAAOC,UAAU,WAClDT,MAAMW,aAINL,eAAeF,cAAc,oDACtBE,gBAAgBhC,GAAGiC,mCAAaC,OAAOC,UAAU,WACpDT,MAAMW,iBAehBD,gBAAkB,SAACnC,EAAGS,qBAAsBgB,OAC9CzB,EAAEK,qBAGIgC,aAAeT,SAASU,cAAc,QAC5CD,aAAaE,OAAS9B,qBAAqBI,QAAQ2B,aACnDH,aAAaI,OAAS,OAEtBJ,aAAaK,OAAS,aAChBC,gBAAkBf,SAASU,cAAc,SAC/CK,gBAAgBC,KAAO,UACvBD,gBAAgBE,MAAQC,gBAAOC,QAC/BV,aAAaW,YAAYL,iBACzBN,aAAaY,MAAMC,QAAU,OAE7BtB,SAASX,KAAK+B,YAAYX,cAC1BA,aAAac,SACbvB,SAASX,KAAKmC,YAAYf,cAG1BZ,MAAMW"} \ No newline at end of file +{"version":3,"file":"downloadcontent.min.js","sources":["../src/downloadcontent.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 * Functions related to downloading course content.\n *\n * @module core_course/downloadcontent\n * @copyright 2020 Michael Hawkins \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Config from 'core/config';\nimport CustomEvents from 'core/custom_interaction_events';\nimport * as ModalFactory from 'core/modal_factory';\nimport jQuery from 'jquery';\nimport Pending from 'core/pending';\nimport {enter, space} from 'core/key_codes';\n\n/**\n * Set up listener to trigger the download course content modal.\n *\n * @return {void}\n */\nexport const init = () => {\n const pendingPromise = new Pending();\n\n // Add event listeners for click and enter/space keys.\n jQuery('[data-downloadcourse]').on('click keydown', (e) => {\n if (e.type === 'click' || e.which === enter || e.which === space) {\n e.preventDefault();\n displayDownloadConfirmation(e.currentTarget);\n }\n });\n\n pendingPromise.resolve();\n};\n\n/**\n * Display the download course content modal.\n *\n * @method displayDownloadConfirmation\n * @param {Object} downloadModalTrigger The DOM element that triggered the download modal.\n * @return {void}\n */\nconst displayDownloadConfirmation = (downloadModalTrigger) => {\n ModalFactory.create({\n title: downloadModalTrigger.dataset.downloadTitle,\n type: ModalFactory.types.SAVE_CANCEL,\n body: `

          ${downloadModalTrigger.dataset.downloadBody}

          `,\n buttons: {\n save: downloadModalTrigger.dataset.downloadButtonText\n },\n templateContext: {\n classes: 'downloadcoursecontentmodal'\n }\n })\n .then(modal => {\n // Display the modal.\n modal.show();\n\n const saveButton = document.querySelector('.modal .downloadcoursecontentmodal [data-action=\"save\"]');\n const cancelButton = document.querySelector('.modal .downloadcoursecontentmodal [data-action=\"cancel\"]');\n const modalContainer = document.querySelector('.modal[data-region=\"modal-container\"]');\n\n // Create listener to trigger the download when the \"Download\" button is pressed.\n jQuery(saveButton).on(CustomEvents.events.activate, (e) => downloadContent(e, downloadModalTrigger, modal));\n\n // Create listener to destroy the modal when closing modal by cancelling.\n jQuery(cancelButton).on(CustomEvents.events.activate, () => {\n modal.destroy();\n });\n\n // Create listener to destroy the modal when closing modal by clicking outside of it.\n if (modalContainer.querySelector('.downloadcoursecontentmodal')) {\n jQuery(modalContainer).on(CustomEvents.events.activate, () => {\n modal.destroy();\n });\n }\n });\n};\n\n/**\n * Trigger downloading of course content.\n *\n * @method downloadContent\n * @param {Event} e The event triggering the download.\n * @param {Object} downloadModalTrigger The DOM element that triggered the download modal.\n * @param {Object} modal The modal object.\n * @return {void}\n */\nconst downloadContent = (e, downloadModalTrigger, modal) => {\n e.preventDefault();\n\n // Create a form to submit the file download request, so we can avoid sending sesskey over GET.\n const downloadForm = document.createElement('form');\n downloadForm.action = downloadModalTrigger.dataset.downloadLink;\n downloadForm.method = 'POST';\n // Open download in a new tab, so current course view is not disrupted.\n downloadForm.target = '_blank';\n const downloadSesskey = document.createElement('input');\n downloadSesskey.name = 'sesskey';\n downloadSesskey.value = Config.sesskey;\n downloadForm.appendChild(downloadSesskey);\n downloadForm.style.display = 'none';\n\n document.body.appendChild(downloadForm);\n downloadForm.submit();\n document.body.removeChild(downloadForm);\n\n // Destroy the modal to prevent duplicates if reopened later.\n modal.destroy();\n};\n"],"names":["_config","_interopRequireDefault","_custom_interaction_events","ModalFactory","_interopRequireWildcard","_jquery","_pending","pendingPromise","Pending","default","on","e","type","which","enter","space","preventDefault","displayDownloadConfirmation","currentTarget","resolve","downloadModalTrigger","create","title","dataset","downloadTitle","types","SAVE_CANCEL","body","downloadBody","buttons","save","downloadButtonText","templateContext","classes","then","modal","show","saveButton","document","querySelector","cancelButton","modalContainer","CustomEvents","events","activate","downloadContent","destroy","downloadForm","createElement","action","downloadLink","method","target","downloadSesskey","name","value","Config","sesskey","appendChild","style","display","submit","removeChild"],"mappings":";;;;;;;kFAuBAA,QAAAC,uBAAAD,SACAE,2BAAAD,uBAAAC,4BACAC,4pBAAAC,CAAAD,cACAE,QAAAJ,uBAAAI,SACAC,SAAAL,uBAAAK,wBAQoB,WAChB,IAAMC,eAAiB,IAAIC,SAAAA,SAGpB,EAAAH,QAAAI,SAAA,yBAAyBC,GAAG,iBAAiB,SAACC,GAClC,UAAXA,EAAEC,MAAoBD,EAAEE,QAAUC,kBAASH,EAAEE,QAAUE,mBACvDJ,EAAEK,iBACFC,4BAA4BN,EAAEO,eAErC,IAEDX,eAAeY,SAClB,EASD,IAAMF,4BAA8B,SAACG,sBACjCjB,aAAakB,OAAO,CAChBC,MAAOF,qBAAqBG,QAAQC,cACpCZ,KAAMT,aAAasB,MAAMC,YACzBC,KAAYP,MAAAA,OAAAA,qBAAqBG,QAAQK,aAHzB,QAIhBC,QAAS,CACLC,KAAMV,qBAAqBG,QAAQQ,oBAEvCC,gBAAiB,CACbC,QAAS,gCAGhBC,MAAK,SAAAC,OAEFA,MAAMC,OAEN,IAAMC,WAAaC,SAASC,cAAc,2DACpCC,aAAeF,SAASC,cAAc,6DACtCE,eAAiBH,SAASC,cAAc,0CAGvCF,EAAAA,QAAAA,SAAAA,YAAY3B,GAAGgC,2BAAAA,QAAaC,OAAOC,UAAU,SAACjC,GAAD,OAAOkC,gBAAgBlC,EAAGS,qBAAsBe,MAAhD,KAG7CK,EAAAA,QAAAA,SAAAA,cAAc9B,GAAGgC,mCAAaC,OAAOC,UAAU,WAClDT,MAAMW,SACT,IAGGL,eAAeF,cAAc,iCACtBE,EAAAA,QAAAA,SAAAA,gBAAgB/B,GAAGgC,mCAAaC,OAAOC,UAAU,WACpDT,MAAMW,SACT,GAER,GACJ,EAWKD,gBAAkB,SAAClC,EAAGS,qBAAsBe,OAC9CxB,EAAEK,iBAGF,IAAM+B,aAAeT,SAASU,cAAc,QAC5CD,aAAaE,OAAS7B,qBAAqBG,QAAQ2B,aACnDH,aAAaI,OAAS,OAEtBJ,aAAaK,OAAS,SACtB,IAAMC,gBAAkBf,SAASU,cAAc,SAC/CK,gBAAgBC,KAAO,UACvBD,gBAAgBE,MAAQC,gBAAOC,QAC/BV,aAAaW,YAAYL,iBACzBN,aAAaY,MAAMC,QAAU,OAE7BtB,SAASX,KAAK+B,YAAYX,cAC1BA,aAAac,SACbvB,SAASX,KAAKmC,YAAYf,cAG1BZ,MAAMW,SACT"} \ No newline at end of file diff --git a/course/amd/build/local/activitychooser/dialogue.min.js.map b/course/amd/build/local/activitychooser/dialogue.min.js.map index 795023c92f1..e0aa1fb7d2c 100644 --- a/course/amd/build/local/activitychooser/dialogue.min.js.map +++ b/course/amd/build/local/activitychooser/dialogue.min.js.map @@ -1 +1 @@ -{"version":3,"file":"dialogue.min.js","sources":["../../../src/local/activitychooser/dialogue.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 type of dialogue used as for choosing options.\n *\n * @module core_course/local/chooser/dialogue\n * @copyright 2019 Mihail Geshoski \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport * as ModalEvents from 'core/modal_events';\nimport selectors from 'core_course/local/activitychooser/selectors';\nimport * as Templates from 'core/templates';\nimport {end, arrowLeft, arrowRight, home, enter, space} from 'core/key_codes';\nimport {addIconToContainer} from 'core/loadingicon';\nimport * as Repository from 'core_course/local/activitychooser/repository';\nimport Notification from 'core/notification';\nimport {debounce} from 'core/utils';\nconst getPlugin = pluginName => import(pluginName);\n\n/**\n * Given an event from the main module 'page' navigate to it's help section via a carousel.\n *\n * @method showModuleHelp\n * @param {jQuery} carousel Our initialized carousel to manipulate\n * @param {Object} moduleData Data of the module to carousel to\n * @param {jQuery} modal We need to figure out if the current modal has a footer.\n */\nconst showModuleHelp = (carousel, moduleData, modal = null) => {\n // If we have a real footer then we need to change temporarily.\n if (modal !== null && moduleData.showFooter === true) {\n modal.setFooter(Templates.render('core_course/local/activitychooser/footer_partial', moduleData));\n }\n const help = carousel.find(selectors.regions.help)[0];\n help.innerHTML = '';\n help.classList.add('m-auto');\n\n // Add a spinner.\n const spinnerPromise = addIconToContainer(help);\n\n // Used later...\n let transitionPromiseResolver = null;\n const transitionPromise = new Promise(resolve => {\n transitionPromiseResolver = resolve;\n });\n\n // Build up the html & js ready to place into the help section.\n const contentPromise = Templates.renderForPromise('core_course/local/activitychooser/help', moduleData);\n\n // Wait for the content to be ready, and for the transition to be complet.\n Promise.all([contentPromise, spinnerPromise, transitionPromise])\n .then(([{html, js}]) => Templates.replaceNodeContents(help, html, js))\n .then(() => {\n help.querySelector(selectors.regions.chooserSummary.header).focus();\n return help;\n })\n .catch(Notification.exception);\n\n // Move to the next slide, and resolve the transition promise when it's done.\n carousel.one('slid.bs.carousel', () => {\n transitionPromiseResolver();\n });\n // Trigger the transition between 'pages'.\n carousel.carousel('next');\n};\n\n/**\n * Given a user wants to change the favourite state of a module we either add or remove the status.\n * We also propergate this change across our map of modals.\n *\n * @method manageFavouriteState\n * @param {HTMLElement} modalBody The DOM node of the modal to manipulate\n * @param {HTMLElement} caller\n * @param {Function} partialFavourite Partially applied function we need to manage favourite status\n */\nconst manageFavouriteState = async(modalBody, caller, partialFavourite) => {\n const isFavourite = caller.dataset.favourited;\n const id = caller.dataset.id;\n const name = caller.dataset.name;\n const internal = caller.dataset.internal;\n // Switch on fave or not.\n if (isFavourite === 'true') {\n await Repository.unfavouriteModule(name, id);\n\n partialFavourite(internal, false, modalBody);\n } else {\n await Repository.favouriteModule(name, id);\n\n partialFavourite(internal, true, modalBody);\n }\n\n};\n\n/**\n * Register chooser related event listeners.\n *\n * @method registerListenerEvents\n * @param {Promise} modal Our modal that we are working with\n * @param {Map} mappedModules A map of all of the modules we are working with with K: mod_name V: {Object}\n * @param {Function} partialFavourite Partially applied function we need to manage favourite status\n * @param {Object} footerData Our base footer object.\n */\nconst registerListenerEvents = (modal, mappedModules, partialFavourite, footerData) => {\n const bodyClickListener = async(e) => {\n if (e.target.closest(selectors.actions.optionActions.showSummary)) {\n const carousel = $(modal.getBody()[0].querySelector(selectors.regions.carousel));\n\n const module = e.target.closest(selectors.regions.chooserOption.container);\n const moduleName = module.dataset.modname;\n const moduleData = mappedModules.get(moduleName);\n // We need to know if the overall modal has a footer so we know when to show a real / vs fake footer.\n moduleData.showFooter = modal.hasFooterContent();\n showModuleHelp(carousel, moduleData, modal);\n }\n\n if (e.target.closest(selectors.actions.optionActions.manageFavourite)) {\n const caller = e.target.closest(selectors.actions.optionActions.manageFavourite);\n await manageFavouriteState(modal.getBody()[0], caller, partialFavourite);\n const activeSectionId = modal.getBody()[0].querySelector(selectors.elements.activetab).getAttribute(\"href\");\n const sectionChooserOptions = modal.getBody()[0]\n .querySelector(selectors.regions.getSectionChooserOptions(activeSectionId));\n const firstChooserOption = sectionChooserOptions\n .querySelector(selectors.regions.chooserOption.container);\n toggleFocusableChooserOption(firstChooserOption, true);\n initChooserOptionsKeyboardNavigation(modal.getBody()[0], mappedModules, sectionChooserOptions, modal);\n }\n\n // From the help screen go back to the module overview.\n if (e.target.matches(selectors.actions.closeOption)) {\n const carousel = $(modal.getBody()[0].querySelector(selectors.regions.carousel));\n\n // Trigger the transition between 'pages'.\n carousel.carousel('prev');\n carousel.on('slid.bs.carousel', () => {\n const allModules = modal.getBody()[0].querySelector(selectors.regions.modules);\n const caller = allModules.querySelector(selectors.regions.getModuleSelector(e.target.dataset.modname));\n caller.focus();\n });\n }\n\n // The \"clear search\" button is triggered.\n if (e.target.closest(selectors.actions.clearSearch)) {\n // Clear the entered search query in the search bar and hide the search results container.\n const searchInput = modal.getBody()[0].querySelector(selectors.actions.search);\n searchInput.value = \"\";\n searchInput.focus();\n toggleSearchResultsView(modal, mappedModules, searchInput.value);\n }\n };\n\n // We essentially have two types of footer.\n // A fake one that is handled within the template for chooser_help and then all of the stuff for\n // modal.footer. We need to ensure we know exactly what type of footer we are using so we know what we\n // need to manage. The below code handles a real footer going to a mnet carousel item.\n const footerClickListener = async(e) => {\n if (footerData.footer === true) {\n const footerjs = await getPlugin(footerData.customfooterjs);\n await footerjs.footerClickListener(e, footerData, modal);\n }\n };\n\n modal.getBodyPromise()\n\n // The return value of getBodyPromise is a jquery object containing the body NodeElement.\n .then(body => body[0])\n\n // Set up the carousel.\n .then(body => {\n $(body.querySelector(selectors.regions.carousel))\n .carousel({\n interval: false,\n pause: true,\n keyboard: false\n });\n\n return body;\n })\n\n // Add the listener for clicks on the body.\n .then(body => {\n body.addEventListener('click', bodyClickListener);\n return body;\n })\n\n // Add a listener for an input change in the activity chooser's search bar.\n .then(body => {\n const searchInput = body.querySelector(selectors.actions.search);\n // The search input is triggered.\n searchInput.addEventListener('input', debounce(() => {\n // Display the search results.\n toggleSearchResultsView(modal, mappedModules, searchInput.value);\n }, 300));\n return body;\n })\n\n // Register event listeners related to the keyboard navigation controls.\n .then(body => {\n // Get the active chooser options section.\n const activeSectionId = body.querySelector(selectors.elements.activetab).getAttribute(\"href\");\n const sectionChooserOptions = body.querySelector(selectors.regions.getSectionChooserOptions(activeSectionId));\n const firstChooserOption = sectionChooserOptions.querySelector(selectors.regions.chooserOption.container);\n\n toggleFocusableChooserOption(firstChooserOption, true);\n initChooserOptionsKeyboardNavigation(body, mappedModules, sectionChooserOptions, modal);\n\n return body;\n })\n .catch();\n\n modal.getFooterPromise()\n\n // The return value of getBodyPromise is a jquery object containing the body NodeElement.\n .then(footer => footer[0])\n // Add the listener for clicks on the footer.\n .then(footer => {\n footer.addEventListener('click', footerClickListener);\n return footer;\n })\n .catch();\n};\n\n/**\n * Initialise the keyboard navigation controls for the chooser options.\n *\n * @method initChooserOptionsKeyboardNavigation\n * @param {HTMLElement} body Our modal that we are working with\n * @param {Map} mappedModules A map of all of the modules we are working with with K: mod_name V: {Object}\n * @param {HTMLElement} chooserOptionsContainer The section that contains the chooser items\n * @param {Object} modal Our created modal for the section\n */\nconst initChooserOptionsKeyboardNavigation = (body, mappedModules, chooserOptionsContainer, modal = null) => {\n const chooserOptions = chooserOptionsContainer.querySelectorAll(selectors.regions.chooserOption.container);\n\n Array.from(chooserOptions).forEach((element) => {\n return element.addEventListener('keydown', (e) => {\n\n // Check for enter/ space triggers for showing the help.\n if (e.keyCode === enter || e.keyCode === space) {\n if (e.target.matches(selectors.actions.optionActions.showSummary)) {\n e.preventDefault();\n const module = e.target.closest(selectors.regions.chooserOption.container);\n const moduleName = module.dataset.modname;\n const moduleData = mappedModules.get(moduleName);\n const carousel = $(body.querySelector(selectors.regions.carousel));\n carousel.carousel({\n interval: false,\n pause: true,\n keyboard: false\n });\n\n // We need to know if the overall modal has a footer so we know when to show a real / vs fake footer.\n moduleData.showFooter = modal.hasFooterContent();\n showModuleHelp(carousel, moduleData, modal);\n }\n }\n\n // Next.\n if (e.keyCode === arrowRight) {\n e.preventDefault();\n const currentOption = e.target.closest(selectors.regions.chooserOption.container);\n const nextOption = currentOption.nextElementSibling;\n const firstOption = chooserOptionsContainer.firstElementChild;\n const toFocusOption = clickErrorHandler(nextOption, firstOption);\n focusChooserOption(toFocusOption, currentOption);\n }\n\n // Previous.\n if (e.keyCode === arrowLeft) {\n e.preventDefault();\n const currentOption = e.target.closest(selectors.regions.chooserOption.container);\n const previousOption = currentOption.previousElementSibling;\n const lastOption = chooserOptionsContainer.lastElementChild;\n const toFocusOption = clickErrorHandler(previousOption, lastOption);\n focusChooserOption(toFocusOption, currentOption);\n }\n\n if (e.keyCode === home) {\n e.preventDefault();\n const currentOption = e.target.closest(selectors.regions.chooserOption.container);\n const firstOption = chooserOptionsContainer.firstElementChild;\n focusChooserOption(firstOption, currentOption);\n }\n\n if (e.keyCode === end) {\n e.preventDefault();\n const currentOption = e.target.closest(selectors.regions.chooserOption.container);\n const lastOption = chooserOptionsContainer.lastElementChild;\n focusChooserOption(lastOption, currentOption);\n }\n });\n });\n};\n\n/**\n * Focus on a chooser option element and remove the previous chooser element from the focus order\n *\n * @method focusChooserOption\n * @param {HTMLElement} currentChooserOption The current chooser option element that we want to focus\n * @param {HTMLElement|null} previousChooserOption The previous focused option element\n */\nconst focusChooserOption = (currentChooserOption, previousChooserOption = null) => {\n if (previousChooserOption !== null) {\n toggleFocusableChooserOption(previousChooserOption, false);\n }\n\n toggleFocusableChooserOption(currentChooserOption, true);\n currentChooserOption.focus();\n};\n\n/**\n * Add or remove a chooser option from the focus order.\n *\n * @method toggleFocusableChooserOption\n * @param {HTMLElement} chooserOption The chooser option element which should be added or removed from the focus order\n * @param {Boolean} isFocusable Whether the chooser element is focusable or not\n */\nconst toggleFocusableChooserOption = (chooserOption, isFocusable) => {\n const chooserOptionLink = chooserOption.querySelector(selectors.actions.addChooser);\n const chooserOptionHelp = chooserOption.querySelector(selectors.actions.optionActions.showSummary);\n const chooserOptionFavourite = chooserOption.querySelector(selectors.actions.optionActions.manageFavourite);\n\n if (isFocusable) {\n // Set tabindex to 0 to add current chooser option element to the focus order.\n chooserOption.tabIndex = 0;\n chooserOptionLink.tabIndex = 0;\n chooserOptionHelp.tabIndex = 0;\n chooserOptionFavourite.tabIndex = 0;\n } else {\n // Set tabindex to -1 to remove the previous chooser option element from the focus order.\n chooserOption.tabIndex = -1;\n chooserOptionLink.tabIndex = -1;\n chooserOptionHelp.tabIndex = -1;\n chooserOptionFavourite.tabIndex = -1;\n }\n};\n\n/**\n * Small error handling function to make sure the navigated to object exists\n *\n * @method clickErrorHandler\n * @param {HTMLElement} item What we want to check exists\n * @param {HTMLElement} fallback If we dont match anything fallback the focus\n * @return {HTMLElement}\n */\nconst clickErrorHandler = (item, fallback) => {\n if (item !== null) {\n return item;\n } else {\n return fallback;\n }\n};\n\n/**\n * Render the search results in a defined container\n *\n * @method renderSearchResults\n * @param {HTMLElement} searchResultsContainer The container where the data should be rendered\n * @param {Object} searchResultsData Data containing the module items that satisfy the search criteria\n */\nconst renderSearchResults = async(searchResultsContainer, searchResultsData) => {\n const templateData = {\n 'searchresultsnumber': searchResultsData.length,\n 'searchresults': searchResultsData\n };\n // Build up the html & js ready to place into the help section.\n const {html, js} = await Templates.renderForPromise('core_course/local/activitychooser/search_results', templateData);\n await Templates.replaceNodeContents(searchResultsContainer, html, js);\n};\n\n/**\n * Toggle (display/hide) the search results depending on the value of the search query\n *\n * @method toggleSearchResultsView\n * @param {Object} modal Our created modal for the section\n * @param {Map} mappedModules A map of all of the modules we are working with with K: mod_name V: {Object}\n * @param {String} searchQuery The search query\n */\nconst toggleSearchResultsView = async(modal, mappedModules, searchQuery) => {\n const modalBody = modal.getBody()[0];\n const searchResultsContainer = modalBody.querySelector(selectors.regions.searchResults);\n const chooserContainer = modalBody.querySelector(selectors.regions.chooser);\n const clearSearchButton = modalBody.querySelector(selectors.actions.clearSearch);\n\n if (searchQuery.length > 0) { // Search query is present.\n const searchResultsData = searchModules(mappedModules, searchQuery);\n await renderSearchResults(searchResultsContainer, searchResultsData);\n const searchResultItemsContainer = searchResultsContainer.querySelector(selectors.regions.searchResultItems);\n const firstSearchResultItem = searchResultItemsContainer.querySelector(selectors.regions.chooserOption.container);\n if (firstSearchResultItem) {\n // Set the first result item to be focusable.\n toggleFocusableChooserOption(firstSearchResultItem, true);\n // Register keyboard events on the created search result items.\n initChooserOptionsKeyboardNavigation(modalBody, mappedModules, searchResultItemsContainer, modal);\n }\n // Display the \"clear\" search button in the activity chooser search bar.\n clearSearchButton.classList.remove('d-none');\n // Hide the default chooser options container.\n chooserContainer.setAttribute('hidden', 'hidden');\n // Display the search results container.\n searchResultsContainer.removeAttribute('hidden');\n } else { // Search query is not present.\n // Hide the \"clear\" search button in the activity chooser search bar.\n clearSearchButton.classList.add('d-none');\n // Hide the search results container.\n searchResultsContainer.setAttribute('hidden', 'hidden');\n // Display the default chooser options container.\n chooserContainer.removeAttribute('hidden');\n }\n};\n\n/**\n * Return the list of modules which have a name or description that matches the given search term.\n *\n * @method searchModules\n * @param {Array} modules List of available modules\n * @param {String} searchTerm The search term to match\n * @return {Array}\n */\nconst searchModules = (modules, searchTerm) => {\n if (searchTerm === '') {\n return modules;\n }\n searchTerm = searchTerm.toLowerCase();\n const searchResults = [];\n modules.forEach((activity) => {\n const activityName = activity.title.toLowerCase();\n const activityDesc = activity.help.toLowerCase();\n if (activityName.includes(searchTerm) || activityDesc.includes(searchTerm)) {\n searchResults.push(activity);\n }\n });\n\n return searchResults;\n};\n\n/**\n * Set up our tabindex information across the chooser.\n *\n * @method setupKeyboardAccessibility\n * @param {Promise} modal Our created modal for the section\n * @param {Map} mappedModules A map of all of the built module information\n */\nconst setupKeyboardAccessibility = (modal, mappedModules) => {\n modal.getModal()[0].tabIndex = -1;\n\n modal.getBodyPromise().then(body => {\n $(selectors.elements.tab).on('shown.bs.tab', (e) => {\n const activeSectionId = e.target.getAttribute(\"href\");\n const activeSectionChooserOptions = body[0]\n .querySelector(selectors.regions.getSectionChooserOptions(activeSectionId));\n const firstChooserOption = activeSectionChooserOptions\n .querySelector(selectors.regions.chooserOption.container);\n const prevActiveSectionId = e.relatedTarget.getAttribute(\"href\");\n const prevActiveSectionChooserOptions = body[0]\n .querySelector(selectors.regions.getSectionChooserOptions(prevActiveSectionId));\n\n // Disable the focus of every chooser option in the previous active section.\n disableFocusAllChooserOptions(prevActiveSectionChooserOptions);\n // Enable the focus of the first chooser option in the current active section.\n toggleFocusableChooserOption(firstChooserOption, true);\n initChooserOptionsKeyboardNavigation(body[0], mappedModules, activeSectionChooserOptions, modal);\n });\n return;\n }).catch(Notification.exception);\n};\n\n/**\n * Disable the focus of all chooser options in a specific container (section).\n *\n * @method disableFocusAllChooserOptions\n * @param {HTMLElement} sectionChooserOptions The section that contains the chooser items\n */\nconst disableFocusAllChooserOptions = (sectionChooserOptions) => {\n const allChooserOptions = sectionChooserOptions.querySelectorAll(selectors.regions.chooserOption.container);\n allChooserOptions.forEach((chooserOption) => {\n toggleFocusableChooserOption(chooserOption, false);\n });\n};\n\n/**\n * Display the module chooser.\n *\n * @method displayChooser\n * @param {Promise} modalPromise Our created modal for the section\n * @param {Array} sectionModules An array of all of the built module information\n * @param {Function} partialFavourite Partially applied function we need to manage favourite status\n * @param {Object} footerData Our base footer object.\n */\nexport const displayChooser = (modalPromise, sectionModules, partialFavourite, footerData) => {\n // Make a map so we can quickly fetch a specific module's object for either rendering or searching.\n const mappedModules = new Map();\n sectionModules.forEach((module) => {\n mappedModules.set(module.componentname + '_' + module.link, module);\n });\n\n // Register event listeners.\n modalPromise.then(modal => {\n registerListenerEvents(modal, mappedModules, partialFavourite, footerData);\n\n // We want to focus on the first chooser option element as soon as the modal is opened.\n setupKeyboardAccessibility(modal, mappedModules);\n\n // We want to focus on the action select when the dialog is closed.\n modal.getRoot().on(ModalEvents.hidden, () => {\n modal.destroy();\n });\n\n return modal;\n }).catch();\n};\n"],"names":["getPlugin","pluginName","showModuleHelp","carousel","moduleData","modal","showFooter","setFooter","Templates","render","help","find","selectors","regions","innerHTML","classList","add","spinnerPromise","transitionPromiseResolver","transitionPromise","Promise","resolve","contentPromise","renderForPromise","all","then","html","js","replaceNodeContents","querySelector","chooserSummary","header","focus","catch","Notification","exception","one","manageFavouriteState","modalBody","caller","partialFavourite","isFavourite","dataset","favourited","id","name","internal","Repository","unfavouriteModule","favouriteModule","initChooserOptionsKeyboardNavigation","body","mappedModules","chooserOptionsContainer","chooserOptions","querySelectorAll","chooserOption","container","Array","from","forEach","element","addEventListener","e","keyCode","enter","space","target","matches","actions","optionActions","showSummary","preventDefault","moduleName","closest","modname","get","interval","pause","keyboard","hasFooterContent","arrowRight","currentOption","nextOption","nextElementSibling","firstOption","firstElementChild","toFocusOption","clickErrorHandler","focusChooserOption","arrowLeft","previousOption","previousElementSibling","lastOption","lastElementChild","home","end","currentChooserOption","previousChooserOption","toggleFocusableChooserOption","isFocusable","chooserOptionLink","addChooser","chooserOptionHelp","chooserOptionFavourite","manageFavourite","tabIndex","item","fallback","renderSearchResults","searchResultsContainer","searchResultsData","templateData","length","toggleSearchResultsView","searchQuery","getBody","searchResults","chooserContainer","chooser","clearSearchButton","clearSearch","searchModules","searchResultItemsContainer","searchResultItems","firstSearchResultItem","remove","setAttribute","removeAttribute","modules","searchTerm","toLowerCase","activity","activityName","title","activityDesc","includes","push","disableFocusAllChooserOptions","sectionChooserOptions","modalPromise","sectionModules","footerData","Map","module","set","componentname","link","bodyClickListener","activeSectionId","elements","activetab","getAttribute","getSectionChooserOptions","firstChooserOption","closeOption","on","getModuleSelector","searchInput","search","value","footerClickListener","footer","customfooterjs","footerjs","getBodyPromise","getFooterPromise","registerListenerEvents","getModal","tab","activeSectionChooserOptions","prevActiveSectionId","relatedTarget","prevActiveSectionChooserOptions","setupKeyboardAccessibility","getRoot","ModalEvents","hidden","destroy"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"dialogue.min.js","sources":["../../../src/local/activitychooser/dialogue.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 type of dialogue used as for choosing options.\n *\n * @module core_course/local/chooser/dialogue\n * @copyright 2019 Mihail Geshoski \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport * as ModalEvents from 'core/modal_events';\nimport selectors from 'core_course/local/activitychooser/selectors';\nimport * as Templates from 'core/templates';\nimport {end, arrowLeft, arrowRight, home, enter, space} from 'core/key_codes';\nimport {addIconToContainer} from 'core/loadingicon';\nimport * as Repository from 'core_course/local/activitychooser/repository';\nimport Notification from 'core/notification';\nimport {debounce} from 'core/utils';\nconst getPlugin = pluginName => import(pluginName);\n\n/**\n * Given an event from the main module 'page' navigate to it's help section via a carousel.\n *\n * @method showModuleHelp\n * @param {jQuery} carousel Our initialized carousel to manipulate\n * @param {Object} moduleData Data of the module to carousel to\n * @param {jQuery} modal We need to figure out if the current modal has a footer.\n */\nconst showModuleHelp = (carousel, moduleData, modal = null) => {\n // If we have a real footer then we need to change temporarily.\n if (modal !== null && moduleData.showFooter === true) {\n modal.setFooter(Templates.render('core_course/local/activitychooser/footer_partial', moduleData));\n }\n const help = carousel.find(selectors.regions.help)[0];\n help.innerHTML = '';\n help.classList.add('m-auto');\n\n // Add a spinner.\n const spinnerPromise = addIconToContainer(help);\n\n // Used later...\n let transitionPromiseResolver = null;\n const transitionPromise = new Promise(resolve => {\n transitionPromiseResolver = resolve;\n });\n\n // Build up the html & js ready to place into the help section.\n const contentPromise = Templates.renderForPromise('core_course/local/activitychooser/help', moduleData);\n\n // Wait for the content to be ready, and for the transition to be complet.\n Promise.all([contentPromise, spinnerPromise, transitionPromise])\n .then(([{html, js}]) => Templates.replaceNodeContents(help, html, js))\n .then(() => {\n help.querySelector(selectors.regions.chooserSummary.header).focus();\n return help;\n })\n .catch(Notification.exception);\n\n // Move to the next slide, and resolve the transition promise when it's done.\n carousel.one('slid.bs.carousel', () => {\n transitionPromiseResolver();\n });\n // Trigger the transition between 'pages'.\n carousel.carousel('next');\n};\n\n/**\n * Given a user wants to change the favourite state of a module we either add or remove the status.\n * We also propergate this change across our map of modals.\n *\n * @method manageFavouriteState\n * @param {HTMLElement} modalBody The DOM node of the modal to manipulate\n * @param {HTMLElement} caller\n * @param {Function} partialFavourite Partially applied function we need to manage favourite status\n */\nconst manageFavouriteState = async(modalBody, caller, partialFavourite) => {\n const isFavourite = caller.dataset.favourited;\n const id = caller.dataset.id;\n const name = caller.dataset.name;\n const internal = caller.dataset.internal;\n // Switch on fave or not.\n if (isFavourite === 'true') {\n await Repository.unfavouriteModule(name, id);\n\n partialFavourite(internal, false, modalBody);\n } else {\n await Repository.favouriteModule(name, id);\n\n partialFavourite(internal, true, modalBody);\n }\n\n};\n\n/**\n * Register chooser related event listeners.\n *\n * @method registerListenerEvents\n * @param {Promise} modal Our modal that we are working with\n * @param {Map} mappedModules A map of all of the modules we are working with with K: mod_name V: {Object}\n * @param {Function} partialFavourite Partially applied function we need to manage favourite status\n * @param {Object} footerData Our base footer object.\n */\nconst registerListenerEvents = (modal, mappedModules, partialFavourite, footerData) => {\n const bodyClickListener = async(e) => {\n if (e.target.closest(selectors.actions.optionActions.showSummary)) {\n const carousel = $(modal.getBody()[0].querySelector(selectors.regions.carousel));\n\n const module = e.target.closest(selectors.regions.chooserOption.container);\n const moduleName = module.dataset.modname;\n const moduleData = mappedModules.get(moduleName);\n // We need to know if the overall modal has a footer so we know when to show a real / vs fake footer.\n moduleData.showFooter = modal.hasFooterContent();\n showModuleHelp(carousel, moduleData, modal);\n }\n\n if (e.target.closest(selectors.actions.optionActions.manageFavourite)) {\n const caller = e.target.closest(selectors.actions.optionActions.manageFavourite);\n await manageFavouriteState(modal.getBody()[0], caller, partialFavourite);\n const activeSectionId = modal.getBody()[0].querySelector(selectors.elements.activetab).getAttribute(\"href\");\n const sectionChooserOptions = modal.getBody()[0]\n .querySelector(selectors.regions.getSectionChooserOptions(activeSectionId));\n const firstChooserOption = sectionChooserOptions\n .querySelector(selectors.regions.chooserOption.container);\n toggleFocusableChooserOption(firstChooserOption, true);\n initChooserOptionsKeyboardNavigation(modal.getBody()[0], mappedModules, sectionChooserOptions, modal);\n }\n\n // From the help screen go back to the module overview.\n if (e.target.matches(selectors.actions.closeOption)) {\n const carousel = $(modal.getBody()[0].querySelector(selectors.regions.carousel));\n\n // Trigger the transition between 'pages'.\n carousel.carousel('prev');\n carousel.on('slid.bs.carousel', () => {\n const allModules = modal.getBody()[0].querySelector(selectors.regions.modules);\n const caller = allModules.querySelector(selectors.regions.getModuleSelector(e.target.dataset.modname));\n caller.focus();\n });\n }\n\n // The \"clear search\" button is triggered.\n if (e.target.closest(selectors.actions.clearSearch)) {\n // Clear the entered search query in the search bar and hide the search results container.\n const searchInput = modal.getBody()[0].querySelector(selectors.actions.search);\n searchInput.value = \"\";\n searchInput.focus();\n toggleSearchResultsView(modal, mappedModules, searchInput.value);\n }\n };\n\n // We essentially have two types of footer.\n // A fake one that is handled within the template for chooser_help and then all of the stuff for\n // modal.footer. We need to ensure we know exactly what type of footer we are using so we know what we\n // need to manage. The below code handles a real footer going to a mnet carousel item.\n const footerClickListener = async(e) => {\n if (footerData.footer === true) {\n const footerjs = await getPlugin(footerData.customfooterjs);\n await footerjs.footerClickListener(e, footerData, modal);\n }\n };\n\n modal.getBodyPromise()\n\n // The return value of getBodyPromise is a jquery object containing the body NodeElement.\n .then(body => body[0])\n\n // Set up the carousel.\n .then(body => {\n $(body.querySelector(selectors.regions.carousel))\n .carousel({\n interval: false,\n pause: true,\n keyboard: false\n });\n\n return body;\n })\n\n // Add the listener for clicks on the body.\n .then(body => {\n body.addEventListener('click', bodyClickListener);\n return body;\n })\n\n // Add a listener for an input change in the activity chooser's search bar.\n .then(body => {\n const searchInput = body.querySelector(selectors.actions.search);\n // The search input is triggered.\n searchInput.addEventListener('input', debounce(() => {\n // Display the search results.\n toggleSearchResultsView(modal, mappedModules, searchInput.value);\n }, 300));\n return body;\n })\n\n // Register event listeners related to the keyboard navigation controls.\n .then(body => {\n // Get the active chooser options section.\n const activeSectionId = body.querySelector(selectors.elements.activetab).getAttribute(\"href\");\n const sectionChooserOptions = body.querySelector(selectors.regions.getSectionChooserOptions(activeSectionId));\n const firstChooserOption = sectionChooserOptions.querySelector(selectors.regions.chooserOption.container);\n\n toggleFocusableChooserOption(firstChooserOption, true);\n initChooserOptionsKeyboardNavigation(body, mappedModules, sectionChooserOptions, modal);\n\n return body;\n })\n .catch();\n\n modal.getFooterPromise()\n\n // The return value of getBodyPromise is a jquery object containing the body NodeElement.\n .then(footer => footer[0])\n // Add the listener for clicks on the footer.\n .then(footer => {\n footer.addEventListener('click', footerClickListener);\n return footer;\n })\n .catch();\n};\n\n/**\n * Initialise the keyboard navigation controls for the chooser options.\n *\n * @method initChooserOptionsKeyboardNavigation\n * @param {HTMLElement} body Our modal that we are working with\n * @param {Map} mappedModules A map of all of the modules we are working with with K: mod_name V: {Object}\n * @param {HTMLElement} chooserOptionsContainer The section that contains the chooser items\n * @param {Object} modal Our created modal for the section\n */\nconst initChooserOptionsKeyboardNavigation = (body, mappedModules, chooserOptionsContainer, modal = null) => {\n const chooserOptions = chooserOptionsContainer.querySelectorAll(selectors.regions.chooserOption.container);\n\n Array.from(chooserOptions).forEach((element) => {\n return element.addEventListener('keydown', (e) => {\n\n // Check for enter/ space triggers for showing the help.\n if (e.keyCode === enter || e.keyCode === space) {\n if (e.target.matches(selectors.actions.optionActions.showSummary)) {\n e.preventDefault();\n const module = e.target.closest(selectors.regions.chooserOption.container);\n const moduleName = module.dataset.modname;\n const moduleData = mappedModules.get(moduleName);\n const carousel = $(body.querySelector(selectors.regions.carousel));\n carousel.carousel({\n interval: false,\n pause: true,\n keyboard: false\n });\n\n // We need to know if the overall modal has a footer so we know when to show a real / vs fake footer.\n moduleData.showFooter = modal.hasFooterContent();\n showModuleHelp(carousel, moduleData, modal);\n }\n }\n\n // Next.\n if (e.keyCode === arrowRight) {\n e.preventDefault();\n const currentOption = e.target.closest(selectors.regions.chooserOption.container);\n const nextOption = currentOption.nextElementSibling;\n const firstOption = chooserOptionsContainer.firstElementChild;\n const toFocusOption = clickErrorHandler(nextOption, firstOption);\n focusChooserOption(toFocusOption, currentOption);\n }\n\n // Previous.\n if (e.keyCode === arrowLeft) {\n e.preventDefault();\n const currentOption = e.target.closest(selectors.regions.chooserOption.container);\n const previousOption = currentOption.previousElementSibling;\n const lastOption = chooserOptionsContainer.lastElementChild;\n const toFocusOption = clickErrorHandler(previousOption, lastOption);\n focusChooserOption(toFocusOption, currentOption);\n }\n\n if (e.keyCode === home) {\n e.preventDefault();\n const currentOption = e.target.closest(selectors.regions.chooserOption.container);\n const firstOption = chooserOptionsContainer.firstElementChild;\n focusChooserOption(firstOption, currentOption);\n }\n\n if (e.keyCode === end) {\n e.preventDefault();\n const currentOption = e.target.closest(selectors.regions.chooserOption.container);\n const lastOption = chooserOptionsContainer.lastElementChild;\n focusChooserOption(lastOption, currentOption);\n }\n });\n });\n};\n\n/**\n * Focus on a chooser option element and remove the previous chooser element from the focus order\n *\n * @method focusChooserOption\n * @param {HTMLElement} currentChooserOption The current chooser option element that we want to focus\n * @param {HTMLElement|null} previousChooserOption The previous focused option element\n */\nconst focusChooserOption = (currentChooserOption, previousChooserOption = null) => {\n if (previousChooserOption !== null) {\n toggleFocusableChooserOption(previousChooserOption, false);\n }\n\n toggleFocusableChooserOption(currentChooserOption, true);\n currentChooserOption.focus();\n};\n\n/**\n * Add or remove a chooser option from the focus order.\n *\n * @method toggleFocusableChooserOption\n * @param {HTMLElement} chooserOption The chooser option element which should be added or removed from the focus order\n * @param {Boolean} isFocusable Whether the chooser element is focusable or not\n */\nconst toggleFocusableChooserOption = (chooserOption, isFocusable) => {\n const chooserOptionLink = chooserOption.querySelector(selectors.actions.addChooser);\n const chooserOptionHelp = chooserOption.querySelector(selectors.actions.optionActions.showSummary);\n const chooserOptionFavourite = chooserOption.querySelector(selectors.actions.optionActions.manageFavourite);\n\n if (isFocusable) {\n // Set tabindex to 0 to add current chooser option element to the focus order.\n chooserOption.tabIndex = 0;\n chooserOptionLink.tabIndex = 0;\n chooserOptionHelp.tabIndex = 0;\n chooserOptionFavourite.tabIndex = 0;\n } else {\n // Set tabindex to -1 to remove the previous chooser option element from the focus order.\n chooserOption.tabIndex = -1;\n chooserOptionLink.tabIndex = -1;\n chooserOptionHelp.tabIndex = -1;\n chooserOptionFavourite.tabIndex = -1;\n }\n};\n\n/**\n * Small error handling function to make sure the navigated to object exists\n *\n * @method clickErrorHandler\n * @param {HTMLElement} item What we want to check exists\n * @param {HTMLElement} fallback If we dont match anything fallback the focus\n * @return {HTMLElement}\n */\nconst clickErrorHandler = (item, fallback) => {\n if (item !== null) {\n return item;\n } else {\n return fallback;\n }\n};\n\n/**\n * Render the search results in a defined container\n *\n * @method renderSearchResults\n * @param {HTMLElement} searchResultsContainer The container where the data should be rendered\n * @param {Object} searchResultsData Data containing the module items that satisfy the search criteria\n */\nconst renderSearchResults = async(searchResultsContainer, searchResultsData) => {\n const templateData = {\n 'searchresultsnumber': searchResultsData.length,\n 'searchresults': searchResultsData\n };\n // Build up the html & js ready to place into the help section.\n const {html, js} = await Templates.renderForPromise('core_course/local/activitychooser/search_results', templateData);\n await Templates.replaceNodeContents(searchResultsContainer, html, js);\n};\n\n/**\n * Toggle (display/hide) the search results depending on the value of the search query\n *\n * @method toggleSearchResultsView\n * @param {Object} modal Our created modal for the section\n * @param {Map} mappedModules A map of all of the modules we are working with with K: mod_name V: {Object}\n * @param {String} searchQuery The search query\n */\nconst toggleSearchResultsView = async(modal, mappedModules, searchQuery) => {\n const modalBody = modal.getBody()[0];\n const searchResultsContainer = modalBody.querySelector(selectors.regions.searchResults);\n const chooserContainer = modalBody.querySelector(selectors.regions.chooser);\n const clearSearchButton = modalBody.querySelector(selectors.actions.clearSearch);\n\n if (searchQuery.length > 0) { // Search query is present.\n const searchResultsData = searchModules(mappedModules, searchQuery);\n await renderSearchResults(searchResultsContainer, searchResultsData);\n const searchResultItemsContainer = searchResultsContainer.querySelector(selectors.regions.searchResultItems);\n const firstSearchResultItem = searchResultItemsContainer.querySelector(selectors.regions.chooserOption.container);\n if (firstSearchResultItem) {\n // Set the first result item to be focusable.\n toggleFocusableChooserOption(firstSearchResultItem, true);\n // Register keyboard events on the created search result items.\n initChooserOptionsKeyboardNavigation(modalBody, mappedModules, searchResultItemsContainer, modal);\n }\n // Display the \"clear\" search button in the activity chooser search bar.\n clearSearchButton.classList.remove('d-none');\n // Hide the default chooser options container.\n chooserContainer.setAttribute('hidden', 'hidden');\n // Display the search results container.\n searchResultsContainer.removeAttribute('hidden');\n } else { // Search query is not present.\n // Hide the \"clear\" search button in the activity chooser search bar.\n clearSearchButton.classList.add('d-none');\n // Hide the search results container.\n searchResultsContainer.setAttribute('hidden', 'hidden');\n // Display the default chooser options container.\n chooserContainer.removeAttribute('hidden');\n }\n};\n\n/**\n * Return the list of modules which have a name or description that matches the given search term.\n *\n * @method searchModules\n * @param {Array} modules List of available modules\n * @param {String} searchTerm The search term to match\n * @return {Array}\n */\nconst searchModules = (modules, searchTerm) => {\n if (searchTerm === '') {\n return modules;\n }\n searchTerm = searchTerm.toLowerCase();\n const searchResults = [];\n modules.forEach((activity) => {\n const activityName = activity.title.toLowerCase();\n const activityDesc = activity.help.toLowerCase();\n if (activityName.includes(searchTerm) || activityDesc.includes(searchTerm)) {\n searchResults.push(activity);\n }\n });\n\n return searchResults;\n};\n\n/**\n * Set up our tabindex information across the chooser.\n *\n * @method setupKeyboardAccessibility\n * @param {Promise} modal Our created modal for the section\n * @param {Map} mappedModules A map of all of the built module information\n */\nconst setupKeyboardAccessibility = (modal, mappedModules) => {\n modal.getModal()[0].tabIndex = -1;\n\n modal.getBodyPromise().then(body => {\n $(selectors.elements.tab).on('shown.bs.tab', (e) => {\n const activeSectionId = e.target.getAttribute(\"href\");\n const activeSectionChooserOptions = body[0]\n .querySelector(selectors.regions.getSectionChooserOptions(activeSectionId));\n const firstChooserOption = activeSectionChooserOptions\n .querySelector(selectors.regions.chooserOption.container);\n const prevActiveSectionId = e.relatedTarget.getAttribute(\"href\");\n const prevActiveSectionChooserOptions = body[0]\n .querySelector(selectors.regions.getSectionChooserOptions(prevActiveSectionId));\n\n // Disable the focus of every chooser option in the previous active section.\n disableFocusAllChooserOptions(prevActiveSectionChooserOptions);\n // Enable the focus of the first chooser option in the current active section.\n toggleFocusableChooserOption(firstChooserOption, true);\n initChooserOptionsKeyboardNavigation(body[0], mappedModules, activeSectionChooserOptions, modal);\n });\n return;\n }).catch(Notification.exception);\n};\n\n/**\n * Disable the focus of all chooser options in a specific container (section).\n *\n * @method disableFocusAllChooserOptions\n * @param {HTMLElement} sectionChooserOptions The section that contains the chooser items\n */\nconst disableFocusAllChooserOptions = (sectionChooserOptions) => {\n const allChooserOptions = sectionChooserOptions.querySelectorAll(selectors.regions.chooserOption.container);\n allChooserOptions.forEach((chooserOption) => {\n toggleFocusableChooserOption(chooserOption, false);\n });\n};\n\n/**\n * Display the module chooser.\n *\n * @method displayChooser\n * @param {Promise} modalPromise Our created modal for the section\n * @param {Array} sectionModules An array of all of the built module information\n * @param {Function} partialFavourite Partially applied function we need to manage favourite status\n * @param {Object} footerData Our base footer object.\n */\nexport const displayChooser = (modalPromise, sectionModules, partialFavourite, footerData) => {\n // Make a map so we can quickly fetch a specific module's object for either rendering or searching.\n const mappedModules = new Map();\n sectionModules.forEach((module) => {\n mappedModules.set(module.componentname + '_' + module.link, module);\n });\n\n // Register event listeners.\n modalPromise.then(modal => {\n registerListenerEvents(modal, mappedModules, partialFavourite, footerData);\n\n // We want to focus on the first chooser option element as soon as the modal is opened.\n setupKeyboardAccessibility(modal, mappedModules);\n\n // We want to focus on the action select when the dialog is closed.\n modal.getRoot().on(ModalEvents.hidden, () => {\n modal.destroy();\n });\n\n return modal;\n }).catch();\n};\n"],"names":["_jquery","_interopRequireDefault","ModalEvents","_interopRequireWildcard","_selectors","Templates","Repository","_notification","_ref3","_ref6","_ref7","getPlugin","pluginName","_systemImportTransformerGlobalIdentifier","define","amd","Promise","resolve","reject","require","showModuleHelp","carousel","moduleData","modal","showFooter","setFooter","render","help","find","selectors","regions","innerHTML","classList","add","spinnerPromise","transitionPromiseResolver","transitionPromise","contentPromise","renderForPromise","all","then","_ref","_ref2$","_slicedToArray","html","js","replaceNodeContents","querySelector","chooserSummary","header","focus","catch","Notification","exception","one","manageFavouriteState","_asyncToGenerator","regeneratorRuntime","mark","modalBody","caller","partialFavourite","isFavourite","id","name","internal","wrap","_context","prev","next","dataset","favourited","unfavouriteModule","favouriteModule","stop","_callee","_x","_x2","_x3","apply","this","arguments","initChooserOptionsKeyboardNavigation","body","mappedModules","chooserOptionsContainer","chooserOptions","querySelectorAll","chooserOption","container","Array","from","forEach","element","addEventListener","e","keyCode","enter","space","target","matches","actions","optionActions","showSummary","preventDefault","moduleName","closest","modname","get","interval","pause","keyboard","hasFooterContent","arrowRight","currentOption","nextOption","nextElementSibling","firstOption","firstElementChild","toFocusOption","clickErrorHandler","focusChooserOption","arrowLeft","previousOption","previousElementSibling","lastOption","lastElementChild","home","end","currentChooserOption","previousChooserOption","toggleFocusableChooserOption","isFocusable","chooserOptionLink","addChooser","chooserOptionHelp","chooserOptionFavourite","manageFavourite","tabIndex","item","fallback","renderSearchResults","_callee4","searchResultsContainer","searchResultsData","templateData","_yield$Templates$rend","_context4","length","sent","_x6","_x7","toggleSearchResultsView","searchQuery","chooserContainer","clearSearchButton","searchResultItemsContainer","firstSearchResultItem","_context5","getBody","searchResults","chooser","clearSearch","searchModules","searchResultItems","remove","setAttribute","removeAttribute","_callee5","_x8","_x9","_x10","modules","searchTerm","toLowerCase","activity","activityName","title","activityDesc","includes","push","disableFocusAllChooserOptions","sectionChooserOptions","modalPromise","sectionModules","footerData","Map","module","set","componentname","link","_ref4","_ref5","bodyClickListener","activeSectionId","firstChooserOption","_carousel","searchInput","_context2","default","elements","activetab","getAttribute","getSectionChooserOptions","closeOption","on","getModuleSelector","search","value","_callee2","_x4","footerClickListener","footerjs","_context3","footer","customfooterjs","_callee3","_x5","getBodyPromise","getFooterPromise","registerListenerEvents","getModal","tab","activeSectionChooserOptions","prevActiveSectionId","relatedTarget","prevActiveSectionChooserOptions","setupKeyboardAccessibility","getRoot","hidden","destroy"],"mappings":"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"} \ No newline at end of file diff --git a/course/amd/build/local/activitychooser/repository.min.js.map b/course/amd/build/local/activitychooser/repository.min.js.map index 0632a2a0792..81ab28c0b67 100644 --- a/course/amd/build/local/activitychooser/repository.min.js.map +++ b/course/amd/build/local/activitychooser/repository.min.js.map @@ -1 +1 @@ -{"version":3,"file":"repository.min.js","sources":["../../../src/local/activitychooser/repository.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 core_course/repository\n * @copyright 2019 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport ajax from 'core/ajax';\n\n/**\n * Fetch all the information on modules we'll need in the activity chooser.\n *\n * @method activityModules\n * @param {Number} courseid What course to fetch the modules for\n * @return {object} jQuery promise\n */\nexport const activityModules = (courseid) => {\n const request = {\n methodname: 'core_course_get_course_content_items',\n args: {\n courseid: courseid,\n },\n };\n return ajax.call([request])[0];\n};\n\n/**\n * Given a module name, module ID & the current course we want to specify that the module\n * is a users' favourite.\n *\n * @method favouriteModule\n * @param {String} modName Frankenstyle name of the component to add favourite\n * @param {int} modID ID of the module. Mainly for LTI cases where they have same / similar names\n * @return {object} jQuery promise\n */\nexport const favouriteModule = (modName, modID) => {\n const request = {\n methodname: 'core_course_add_content_item_to_user_favourites',\n args: {\n componentname: modName,\n contentitemid: modID,\n },\n };\n return ajax.call([request])[0];\n};\n\n/**\n * Given a module name, module ID & the current course we want to specify that the module\n * is no longer a users' favourite.\n *\n * @method unfavouriteModule\n * @param {String} modName Frankenstyle name of the component to add favourite\n * @param {int} modID ID of the module. Mainly for LTI cases where they have same / similar names\n * @return {object} jQuery promise\n */\nexport const unfavouriteModule = (modName, modID) => {\n const request = {\n methodname: 'core_course_remove_content_item_from_user_favourites',\n args: {\n componentname: modName,\n contentitemid: modID,\n },\n };\n return ajax.call([request])[0];\n};\n\n/**\n * Fetch all the information on modules we'll need in the activity chooser.\n *\n * @method fetchFooterData\n * @param {Number} courseid What course to fetch the data for\n * @param {Number} sectionid What section to fetch the data for\n * @return {object} jQuery promise\n */\nexport const fetchFooterData = (courseid, sectionid) => {\n const request = {\n methodname: 'core_course_get_activity_chooser_footer',\n args: {\n courseid: courseid,\n sectionid: sectionid,\n },\n };\n return ajax.call([request])[0];\n};\n"],"names":["courseid","request","methodname","args","ajax","call","modName","modID","componentname","contentitemid","sectionid"],"mappings":";;;;;;uPA8B+B,SAACA,cACtBC,QAAU,CACZC,WAAY,uCACZC,KAAM,CACFH,SAAUA,kBAGXI,cAAKC,KAAK,CAACJ,UAAU,6BAYD,SAACK,QAASC,WAC/BN,QAAU,CACZC,WAAY,kDACZC,KAAM,CACFK,cAAeF,QACfG,cAAeF,eAGhBH,cAAKC,KAAK,CAACJ,UAAU,+BAYC,SAACK,QAASC,WACjCN,QAAU,CACZC,WAAY,uDACZC,KAAM,CACFK,cAAeF,QACfG,cAAeF,eAGhBH,cAAKC,KAAK,CAACJ,UAAU,6BAWD,SAACD,SAAUU,eAChCT,QAAU,CACZC,WAAY,0CACZC,KAAM,CACFH,SAAUA,SACVU,UAAWA,mBAGZN,cAAKC,KAAK,CAACJ,UAAU"} \ No newline at end of file +{"version":3,"file":"repository.min.js","sources":["../../../src/local/activitychooser/repository.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 core_course/repository\n * @copyright 2019 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport ajax from 'core/ajax';\n\n/**\n * Fetch all the information on modules we'll need in the activity chooser.\n *\n * @method activityModules\n * @param {Number} courseid What course to fetch the modules for\n * @return {object} jQuery promise\n */\nexport const activityModules = (courseid) => {\n const request = {\n methodname: 'core_course_get_course_content_items',\n args: {\n courseid: courseid,\n },\n };\n return ajax.call([request])[0];\n};\n\n/**\n * Given a module name, module ID & the current course we want to specify that the module\n * is a users' favourite.\n *\n * @method favouriteModule\n * @param {String} modName Frankenstyle name of the component to add favourite\n * @param {int} modID ID of the module. Mainly for LTI cases where they have same / similar names\n * @return {object} jQuery promise\n */\nexport const favouriteModule = (modName, modID) => {\n const request = {\n methodname: 'core_course_add_content_item_to_user_favourites',\n args: {\n componentname: modName,\n contentitemid: modID,\n },\n };\n return ajax.call([request])[0];\n};\n\n/**\n * Given a module name, module ID & the current course we want to specify that the module\n * is no longer a users' favourite.\n *\n * @method unfavouriteModule\n * @param {String} modName Frankenstyle name of the component to add favourite\n * @param {int} modID ID of the module. Mainly for LTI cases where they have same / similar names\n * @return {object} jQuery promise\n */\nexport const unfavouriteModule = (modName, modID) => {\n const request = {\n methodname: 'core_course_remove_content_item_from_user_favourites',\n args: {\n componentname: modName,\n contentitemid: modID,\n },\n };\n return ajax.call([request])[0];\n};\n\n/**\n * Fetch all the information on modules we'll need in the activity chooser.\n *\n * @method fetchFooterData\n * @param {Number} courseid What course to fetch the data for\n * @param {Number} sectionid What section to fetch the data for\n * @return {object} jQuery promise\n */\nexport const fetchFooterData = (courseid, sectionid) => {\n const request = {\n methodname: 'core_course_get_activity_chooser_footer',\n args: {\n courseid: courseid,\n sectionid: sectionid,\n },\n };\n return ajax.call([request])[0];\n};\n"],"names":["_ajax","courseid","request","methodname","args","ajax","call","modName","modID","componentname","contentitemid","sectionid"],"mappings":";;;;;;0KAqBAA,WAAAA,kEAS+B,SAACC,UAC5B,IAAMC,QAAU,CACZC,WAAY,uCACZC,KAAM,CACFH,SAAUA,WAGXI,OAAAA,MAAAA,QAAKC,KAAK,CAACJ,UAAU,EAC/B,2BAW8B,SAACK,QAASC,OACrC,IAAMN,QAAU,CACZC,WAAY,kDACZC,KAAM,CACFK,cAAeF,QACfG,cAAeF,QAGhBH,OAAAA,MAAAA,QAAKC,KAAK,CAACJ,UAAU,EAC/B,6BAWgC,SAACK,QAASC,OACvC,IAAMN,QAAU,CACZC,WAAY,uDACZC,KAAM,CACFK,cAAeF,QACfG,cAAeF,QAGhBH,OAAAA,MAAAA,QAAKC,KAAK,CAACJ,UAAU,EAC/B,2BAU8B,SAACD,SAAUU,WACtC,IAAMT,QAAU,CACZC,WAAY,0CACZC,KAAM,CACFH,SAAUA,SACVU,UAAWA,YAGZN,OAAAA,MAAAA,QAAKC,KAAK,CAACJ,UAAU,EAC/B"} \ No newline at end of file diff --git a/course/amd/build/local/activitychooser/selectors.min.js.map b/course/amd/build/local/activitychooser/selectors.min.js.map index 3f72018c9fb..e9f3ca409f1 100644 --- a/course/amd/build/local/activitychooser/selectors.min.js.map +++ b/course/amd/build/local/activitychooser/selectors.min.js.map @@ -1 +1 @@ -{"version":3,"file":"selectors.min.js","sources":["../../../src/local/activitychooser/selectors.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 * Define all of the selectors we will be using on the grading interface.\n *\n * @module core_course/local/chooser/selectors\n * @copyright 2019 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * A small helper function to build queryable data selectors.\n * @method getDataSelector\n * @param {String} name\n * @param {String} value\n * @return {string}\n */\nconst getDataSelector = (name, value) => {\n return `[data-${name}=\"${value}\"]`;\n};\n\nexport default {\n regions: {\n chooser: getDataSelector('region', 'chooser-container'),\n getSectionChooserOptions: containerid => `${containerid} ${getDataSelector('region', 'chooser-options-container')}`,\n chooserOption: {\n container: getDataSelector('region', 'chooser-option-container'),\n actions: getDataSelector('region', 'chooser-option-actions-container'),\n info: getDataSelector('region', 'chooser-option-info-container'),\n },\n chooserSummary: {\n container: getDataSelector('region', 'chooser-option-summary-container'),\n content: getDataSelector('region', 'chooser-option-summary-content-container'),\n header: getDataSelector('region', 'summary-header'),\n actions: getDataSelector('region', 'chooser-option-summary-actions-container'),\n },\n carousel: getDataSelector('region', 'carousel'),\n help: getDataSelector('region', 'help'),\n modules: getDataSelector('region', 'modules'),\n favouriteTabNav: getDataSelector('region', 'favourite-tab-nav'),\n defaultTabNav: getDataSelector('region', 'default-tab-nav'),\n activityTabNav: getDataSelector('region', 'activity-tab-nav'),\n favouriteTab: getDataSelector('region', 'favourites'),\n recommendedTab: getDataSelector('region', 'recommended'),\n defaultTab: getDataSelector('region', 'default'),\n activityTab: getDataSelector('region', 'activity'),\n resourceTab: getDataSelector('region', 'resources'),\n getModuleSelector: modname => `[role=\"menuitem\"][data-modname=\"${modname}\"]`,\n searchResults: getDataSelector('region', 'search-results-container'),\n searchResultItems: getDataSelector('region', 'search-result-items-container'),\n },\n actions: {\n optionActions: {\n showSummary: getDataSelector('action', 'show-option-summary'),\n manageFavourite: getDataSelector('action', 'manage-module-favourite'),\n },\n addChooser: getDataSelector('action', 'add-chooser-option'),\n closeOption: getDataSelector('action', 'close-chooser-option-summary'),\n hide: getDataSelector('action', 'hide'),\n search: getDataSelector('action', 'search'),\n clearSearch: getDataSelector('action', 'clearsearch'),\n },\n render: {\n favourites: getDataSelector('render', 'favourites-area'),\n },\n elements: {\n section: '.section',\n sectionmodchooser: 'button.section-modchooser-link',\n sitemenu: '.block_site_main_menu',\n sitetopic: 'div.sitetopic',\n tab: 'a[data-toggle=\"tab\"]',\n activetab: 'a[data-toggle=\"tab\"][aria-selected=\"true\"]',\n visibletabs: 'a[data-toggle=\"tab\"]:not(.d-none)'\n },\n};\n"],"names":["getDataSelector","name","value","regions","chooser","getSectionChooserOptions","containerid","chooserOption","container","actions","info","chooserSummary","content","header","carousel","help","modules","favouriteTabNav","defaultTabNav","activityTabNav","favouriteTab","recommendedTab","defaultTab","activityTab","resourceTab","getModuleSelector","modname","searchResults","searchResultItems","optionActions","showSummary","manageFavourite","addChooser","closeOption","hide","search","clearSearch","render","favourites","elements","section","sectionmodchooser","sitemenu","sitetopic","tab","activetab","visibletabs"],"mappings":";;;;;;;;IA8BMA,gBAAkB,SAACC,KAAMC,6BACXD,kBAASC,sBAGd,CACXC,QAAS,CACLC,QAASJ,gBAAgB,SAAU,qBACnCK,yBAA0B,SAAAC,6BAAkBA,wBAAeN,gBAAgB,SAAU,+BACrFO,cAAe,CACXC,UAAWR,gBAAgB,SAAU,4BACrCS,QAAST,gBAAgB,SAAU,oCACnCU,KAAMV,gBAAgB,SAAU,kCAEpCW,eAAgB,CACZH,UAAWR,gBAAgB,SAAU,oCACrCY,QAASZ,gBAAgB,SAAU,4CACnCa,OAAQb,gBAAgB,SAAU,kBAClCS,QAAST,gBAAgB,SAAU,6CAEvCc,SAAUd,gBAAgB,SAAU,YACpCe,KAAMf,gBAAgB,SAAU,QAChCgB,QAAShB,gBAAgB,SAAU,WACnCiB,gBAAiBjB,gBAAgB,SAAU,qBAC3CkB,cAAelB,gBAAgB,SAAU,mBACzCmB,eAAgBnB,gBAAgB,SAAU,oBAC1CoB,aAAcpB,gBAAgB,SAAU,cACxCqB,eAAgBrB,gBAAgB,SAAU,eAC1CsB,WAAYtB,gBAAgB,SAAU,WACtCuB,YAAavB,gBAAgB,SAAU,YACvCwB,YAAaxB,gBAAgB,SAAU,aACvCyB,kBAAmB,SAAAC,yDAA8CA,eACjEC,cAAe3B,gBAAgB,SAAU,4BACzC4B,kBAAmB5B,gBAAgB,SAAU,kCAEjDS,QAAS,CACLoB,cAAe,CACXC,YAAa9B,gBAAgB,SAAU,uBACvC+B,gBAAiB/B,gBAAgB,SAAU,4BAE/CgC,WAAYhC,gBAAgB,SAAU,sBACtCiC,YAAajC,gBAAgB,SAAU,gCACvCkC,KAAMlC,gBAAgB,SAAU,QAChCmC,OAAQnC,gBAAgB,SAAU,UAClCoC,YAAapC,gBAAgB,SAAU,gBAE3CqC,OAAQ,CACJC,WAAYtC,gBAAgB,SAAU,oBAE1CuC,SAAU,CACNC,QAAS,WACTC,kBAAmB,iCACnBC,SAAU,wBACVC,UAAW,gBACXC,IAAK,uBACLC,UAAW,6CACXC,YAAa"} \ No newline at end of file +{"version":3,"file":"selectors.min.js","sources":["../../../src/local/activitychooser/selectors.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 * Define all of the selectors we will be using on the grading interface.\n *\n * @module core_course/local/chooser/selectors\n * @copyright 2019 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * A small helper function to build queryable data selectors.\n * @method getDataSelector\n * @param {String} name\n * @param {String} value\n * @return {string}\n */\nconst getDataSelector = (name, value) => {\n return `[data-${name}=\"${value}\"]`;\n};\n\nexport default {\n regions: {\n chooser: getDataSelector('region', 'chooser-container'),\n getSectionChooserOptions: containerid => `${containerid} ${getDataSelector('region', 'chooser-options-container')}`,\n chooserOption: {\n container: getDataSelector('region', 'chooser-option-container'),\n actions: getDataSelector('region', 'chooser-option-actions-container'),\n info: getDataSelector('region', 'chooser-option-info-container'),\n },\n chooserSummary: {\n container: getDataSelector('region', 'chooser-option-summary-container'),\n content: getDataSelector('region', 'chooser-option-summary-content-container'),\n header: getDataSelector('region', 'summary-header'),\n actions: getDataSelector('region', 'chooser-option-summary-actions-container'),\n },\n carousel: getDataSelector('region', 'carousel'),\n help: getDataSelector('region', 'help'),\n modules: getDataSelector('region', 'modules'),\n favouriteTabNav: getDataSelector('region', 'favourite-tab-nav'),\n defaultTabNav: getDataSelector('region', 'default-tab-nav'),\n activityTabNav: getDataSelector('region', 'activity-tab-nav'),\n favouriteTab: getDataSelector('region', 'favourites'),\n recommendedTab: getDataSelector('region', 'recommended'),\n defaultTab: getDataSelector('region', 'default'),\n activityTab: getDataSelector('region', 'activity'),\n resourceTab: getDataSelector('region', 'resources'),\n getModuleSelector: modname => `[role=\"menuitem\"][data-modname=\"${modname}\"]`,\n searchResults: getDataSelector('region', 'search-results-container'),\n searchResultItems: getDataSelector('region', 'search-result-items-container'),\n },\n actions: {\n optionActions: {\n showSummary: getDataSelector('action', 'show-option-summary'),\n manageFavourite: getDataSelector('action', 'manage-module-favourite'),\n },\n addChooser: getDataSelector('action', 'add-chooser-option'),\n closeOption: getDataSelector('action', 'close-chooser-option-summary'),\n hide: getDataSelector('action', 'hide'),\n search: getDataSelector('action', 'search'),\n clearSearch: getDataSelector('action', 'clearsearch'),\n },\n render: {\n favourites: getDataSelector('render', 'favourites-area'),\n },\n elements: {\n section: '.section',\n sectionmodchooser: 'button.section-modchooser-link',\n sitemenu: '.block_site_main_menu',\n sitetopic: 'div.sitetopic',\n tab: 'a[data-toggle=\"tab\"]',\n activetab: 'a[data-toggle=\"tab\"][aria-selected=\"true\"]',\n visibletabs: 'a[data-toggle=\"tab\"]:not(.d-none)'\n },\n};\n"],"names":["getDataSelector","name","value","_default","regions","chooser","getSectionChooserOptions","containerid","concat","chooserOption","container","actions","info","chooserSummary","content","header","carousel","help","modules","favouriteTabNav","defaultTabNav","activityTabNav","favouriteTab","recommendedTab","defaultTab","activityTab","resourceTab","getModuleSelector","modname","searchResults","searchResultItems","optionActions","showSummary","manageFavourite","addChooser","closeOption","hide","search","clearSearch","render","favourites","elements","section","sectionmodchooser","sitemenu","sitetopic","tab","activetab","visibletabs"],"mappings":";;;;;;;;AA8BMA,IAAAA,gBAAkB,SAACC,KAAMC,OACXD,MAAAA,SAAAA,OAAAA,kBAASC,MAAzB,KACH,EAEcC,SAAA,CACXC,QAAS,CACLC,QAASL,gBAAgB,SAAU,qBACnCM,yBAA0B,SAAAC,aAAW,MAAA,GAAAC,OAAOD,YAAeP,KAAAA,OAAAA,gBAAgB,SAAU,6BAFhF,EAGLS,cAAe,CACXC,UAAWV,gBAAgB,SAAU,4BACrCW,QAASX,gBAAgB,SAAU,oCACnCY,KAAMZ,gBAAgB,SAAU,kCAEpCa,eAAgB,CACZH,UAAWV,gBAAgB,SAAU,oCACrCc,QAASd,gBAAgB,SAAU,4CACnCe,OAAQf,gBAAgB,SAAU,kBAClCW,QAASX,gBAAgB,SAAU,6CAEvCgB,SAAUhB,gBAAgB,SAAU,YACpCiB,KAAMjB,gBAAgB,SAAU,QAChCkB,QAASlB,gBAAgB,SAAU,WACnCmB,gBAAiBnB,gBAAgB,SAAU,qBAC3CoB,cAAepB,gBAAgB,SAAU,mBACzCqB,eAAgBrB,gBAAgB,SAAU,oBAC1CsB,aAActB,gBAAgB,SAAU,cACxCuB,eAAgBvB,gBAAgB,SAAU,eAC1CwB,WAAYxB,gBAAgB,SAAU,WACtCyB,YAAazB,gBAAgB,SAAU,YACvC0B,YAAa1B,gBAAgB,SAAU,aACvC2B,kBAAmB,SAAAC,SAAO,MAAA,mCAAApB,OAAuCoB,QAAvC,KAzBrB,EA0BLC,cAAe7B,gBAAgB,SAAU,4BACzC8B,kBAAmB9B,gBAAgB,SAAU,kCAEjDW,QAAS,CACLoB,cAAe,CACXC,YAAahC,gBAAgB,SAAU,uBACvCiC,gBAAiBjC,gBAAgB,SAAU,4BAE/CkC,WAAYlC,gBAAgB,SAAU,sBACtCmC,YAAanC,gBAAgB,SAAU,gCACvCoC,KAAMpC,gBAAgB,SAAU,QAChCqC,OAAQrC,gBAAgB,SAAU,UAClCsC,YAAatC,gBAAgB,SAAU,gBAE3CuC,OAAQ,CACJC,WAAYxC,gBAAgB,SAAU,oBAE1CyC,SAAU,CACNC,QAAS,WACTC,kBAAmB,iCACnBC,SAAU,wBACVC,UAAW,gBACXC,IAAK,uBACLC,UAAW,6CACXC,YAAa"} \ No newline at end of file diff --git a/course/amd/build/manual_completion_toggle.min.js.map b/course/amd/build/manual_completion_toggle.min.js.map index 43bdf5f180c..3faad9268f3 100644 --- a/course/amd/build/manual_completion_toggle.min.js.map +++ b/course/amd/build/manual_completion_toggle.min.js.map @@ -1 +1 @@ -{"version":3,"file":"manual_completion_toggle.min.js","sources":["../src/manual_completion_toggle.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 * Provides the functionality for toggling the manual completion state of a course module through\n * the manual completion button.\n *\n * @module core_course/manual_completion_toggle\n * @copyright 2021 Jun Pataleta \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Templates from 'core/templates';\nimport Notification from 'core/notification';\nimport {toggleManualCompletion} from 'core_course/repository';\nimport * as CourseEvents from 'core_course/events';\n\n/**\n * Selectors in the manual completion template.\n *\n * @type {{MANUAL_TOGGLE: string}}\n */\nconst SELECTORS = {\n MANUAL_TOGGLE: 'button[data-action=toggle-manual-completion]',\n};\n\n/**\n * Toggle type values for the data-toggletype attribute in the core_course/completion_manual template.\n *\n * @type {{TOGGLE_UNDO: string, TOGGLE_MARK_DONE: string}}\n */\nconst TOGGLE_TYPES = {\n TOGGLE_MARK_DONE: 'manual:mark-done',\n TOGGLE_UNDO: 'manual:undo',\n};\n\n/**\n * Whether the event listener has already been registered for this module.\n *\n * @type {boolean}\n */\nlet registered = false;\n\n/**\n * Registers the click event listener for the manual completion toggle button.\n */\nexport const init = () => {\n if (registered) {\n return;\n }\n document.addEventListener('click', (e) => {\n const toggleButton = e.target.closest(SELECTORS.MANUAL_TOGGLE);\n if (toggleButton) {\n e.preventDefault();\n toggleManualCompletionState(toggleButton).catch(Notification.exception);\n }\n });\n registered = true;\n};\n\n/**\n * Toggles the manual completion state of the module for the given user.\n *\n * @param {HTMLElement} toggleButton\n * @returns {Promise}\n */\nconst toggleManualCompletionState = async(toggleButton) => {\n // Make a copy of the original content of the button.\n const originalInnerHtml = toggleButton.innerHTML;\n\n // Disable the button to prevent double clicks.\n toggleButton.setAttribute('disabled', 'disabled');\n\n // Get button data.\n const toggleType = toggleButton.getAttribute('data-toggletype');\n const cmid = toggleButton.getAttribute('data-cmid');\n const activityname = toggleButton.getAttribute('data-activityname');\n // Get the target completion state.\n const completed = toggleType === TOGGLE_TYPES.TOGGLE_MARK_DONE;\n\n // Replace the button contents with the loading icon.\n const loadingHtml = await Templates.render('core/loading', {});\n await Templates.replaceNodeContents(toggleButton, loadingHtml, '');\n\n try {\n // Call the webservice to update the manual completion status.\n await toggleManualCompletion(cmid, completed);\n\n // All good so far. Refresh the manual completion button to reflect its new state by re-rendering the template.\n const templateContext = {\n cmid: cmid,\n activityname: activityname,\n overallcomplete: completed,\n overallincomplete: !completed,\n istrackeduser: true, // We know that we're tracking completion for this user given the presence of this button.\n };\n const renderObject = await Templates.renderForPromise('core_course/completion_manual', templateContext);\n\n // Replace the toggle button with the newly loaded template.\n const replacedNode = await Templates.replaceNode(toggleButton, renderObject.html, renderObject.js);\n const newToggleButton = replacedNode.pop();\n\n // Build manualCompletionToggled custom event.\n const withAvailability = toggleButton.getAttribute('data-withavailability');\n const toggledEvent = new CustomEvent(CourseEvents.manualCompletionToggled, {\n bubbles: true,\n detail: {\n cmid,\n activityname,\n completed,\n withAvailability,\n }\n });\n // Dispatch the manualCompletionToggled custom event.\n newToggleButton.dispatchEvent(toggledEvent);\n\n } catch (exception) {\n // In case of an error, revert the original state and appearance of the button.\n toggleButton.removeAttribute('disabled');\n toggleButton.innerHTML = originalInnerHtml;\n\n // Show the exception.\n Notification.exception(exception);\n }\n};\n"],"names":["SELECTORS","TOGGLE_TYPES","registered","document","addEventListener","e","toggleButton","target","closest","preventDefault","toggleManualCompletionState","catch","Notification","exception","originalInnerHtml","innerHTML","setAttribute","toggleType","getAttribute","cmid","activityname","completed","Templates","render","loadingHtml","replaceNodeContents","templateContext","overallcomplete","overallincomplete","istrackeduser","renderForPromise","renderObject","replaceNode","html","js","replacedNode","newToggleButton","pop","withAvailability","toggledEvent","CustomEvent","CourseEvents","manualCompletionToggled","bubbles","detail","dispatchEvent","removeAttribute"],"mappings":"23DAkCMA,wBACa,+CAQbC,8BACgB,mBASlBC,YAAa,gBAKG,WACZA,aAGJC,SAASC,iBAAiB,SAAS,SAACC,OAC1BC,aAAeD,EAAEE,OAAOC,QAAQR,yBAClCM,eACAD,EAAEI,iBACFC,4BAA4BJ,cAAcK,MAAMC,sBAAaC,eAGrEX,YAAa,gBASXQ,yDAA8B,iBAAMJ,2RAEhCQ,kBAAoBR,aAAaS,UAGvCT,aAAaU,aAAa,WAAY,YAGhCC,WAAaX,aAAaY,aAAa,mBACvCC,KAAOb,aAAaY,aAAa,aACjCE,aAAed,aAAaY,aAAa,qBAEzCG,UAAYJ,aAAehB,8CAGPqB,mBAAUC,OAAO,eAAgB,kBAArDC,2CACAF,mBAAUG,oBAAoBnB,aAAckB,YAAa,sDAIrD,sCAAuBL,KAAME,0BAG7BK,gBAAkB,CACpBP,KAAMA,KACNC,aAAcA,aACdO,gBAAiBN,UACjBO,mBAAoBP,UACpBQ,eAAe,oBAEQP,mBAAUQ,iBAAiB,gCAAiCJ,gCAAjFK,4CAGqBT,mBAAUU,YAAY1B,aAAcyB,aAAaE,KAAMF,aAAaG,YAAzFC,2BACAC,gBAAkBD,aAAaE,MAG/BC,iBAAmBhC,aAAaY,aAAa,yBAC7CqB,aAAe,IAAIC,YAAYC,aAAaC,wBAAyB,CACvEC,SAAS,EACTC,OAAQ,CACJzB,KAAAA,KACAC,aAAAA,aACAC,UAAAA,UACAiB,iBAAAA,oBAIRF,gBAAgBS,cAAcN,6FAI9BjC,aAAawC,gBAAgB,YAC7BxC,aAAaS,UAAYD,wCAGZD"} \ No newline at end of file +{"version":3,"file":"manual_completion_toggle.min.js","sources":["../src/manual_completion_toggle.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 * Provides the functionality for toggling the manual completion state of a course module through\n * the manual completion button.\n *\n * @module core_course/manual_completion_toggle\n * @copyright 2021 Jun Pataleta \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Templates from 'core/templates';\nimport Notification from 'core/notification';\nimport {toggleManualCompletion} from 'core_course/repository';\nimport * as CourseEvents from 'core_course/events';\n\n/**\n * Selectors in the manual completion template.\n *\n * @type {{MANUAL_TOGGLE: string}}\n */\nconst SELECTORS = {\n MANUAL_TOGGLE: 'button[data-action=toggle-manual-completion]',\n};\n\n/**\n * Toggle type values for the data-toggletype attribute in the core_course/completion_manual template.\n *\n * @type {{TOGGLE_UNDO: string, TOGGLE_MARK_DONE: string}}\n */\nconst TOGGLE_TYPES = {\n TOGGLE_MARK_DONE: 'manual:mark-done',\n TOGGLE_UNDO: 'manual:undo',\n};\n\n/**\n * Whether the event listener has already been registered for this module.\n *\n * @type {boolean}\n */\nlet registered = false;\n\n/**\n * Registers the click event listener for the manual completion toggle button.\n */\nexport const init = () => {\n if (registered) {\n return;\n }\n document.addEventListener('click', (e) => {\n const toggleButton = e.target.closest(SELECTORS.MANUAL_TOGGLE);\n if (toggleButton) {\n e.preventDefault();\n toggleManualCompletionState(toggleButton).catch(Notification.exception);\n }\n });\n registered = true;\n};\n\n/**\n * Toggles the manual completion state of the module for the given user.\n *\n * @param {HTMLElement} toggleButton\n * @returns {Promise}\n */\nconst toggleManualCompletionState = async(toggleButton) => {\n // Make a copy of the original content of the button.\n const originalInnerHtml = toggleButton.innerHTML;\n\n // Disable the button to prevent double clicks.\n toggleButton.setAttribute('disabled', 'disabled');\n\n // Get button data.\n const toggleType = toggleButton.getAttribute('data-toggletype');\n const cmid = toggleButton.getAttribute('data-cmid');\n const activityname = toggleButton.getAttribute('data-activityname');\n // Get the target completion state.\n const completed = toggleType === TOGGLE_TYPES.TOGGLE_MARK_DONE;\n\n // Replace the button contents with the loading icon.\n const loadingHtml = await Templates.render('core/loading', {});\n await Templates.replaceNodeContents(toggleButton, loadingHtml, '');\n\n try {\n // Call the webservice to update the manual completion status.\n await toggleManualCompletion(cmid, completed);\n\n // All good so far. Refresh the manual completion button to reflect its new state by re-rendering the template.\n const templateContext = {\n cmid: cmid,\n activityname: activityname,\n overallcomplete: completed,\n overallincomplete: !completed,\n istrackeduser: true, // We know that we're tracking completion for this user given the presence of this button.\n };\n const renderObject = await Templates.renderForPromise('core_course/completion_manual', templateContext);\n\n // Replace the toggle button with the newly loaded template.\n const replacedNode = await Templates.replaceNode(toggleButton, renderObject.html, renderObject.js);\n const newToggleButton = replacedNode.pop();\n\n // Build manualCompletionToggled custom event.\n const withAvailability = toggleButton.getAttribute('data-withavailability');\n const toggledEvent = new CustomEvent(CourseEvents.manualCompletionToggled, {\n bubbles: true,\n detail: {\n cmid,\n activityname,\n completed,\n withAvailability,\n }\n });\n // Dispatch the manualCompletionToggled custom event.\n newToggleButton.dispatchEvent(toggledEvent);\n\n } catch (exception) {\n // In case of an error, revert the original state and appearance of the button.\n toggleButton.removeAttribute('disabled');\n toggleButton.innerHTML = originalInnerHtml;\n\n // Show the exception.\n Notification.exception(exception);\n }\n};\n"],"names":["_templates","_interopRequireDefault","_notification","CourseEvents","_interopRequireWildcard","SELECTORS","TOGGLE_TYPES","registered","document","addEventListener","e","toggleButton","target","closest","preventDefault","toggleManualCompletionState","catch","Notification","exception","_ref","regeneratorRuntime","mark","originalInnerHtml","toggleType","cmid","activityname","completed","loadingHtml","templateContext","renderObject","replacedNode","newToggleButton","withAvailability","toggledEvent","wrap","_context","prev","next","innerHTML","setAttribute","getAttribute","Templates","render","sent","replaceNodeContents","overallcomplete","overallincomplete","istrackeduser","renderForPromise","replaceNode","html","js","pop","CustomEvent","manualCompletionToggled","bubbles","detail","dispatchEvent","t0","removeAttribute","stop","_callee","_x","apply","this","arguments"],"mappings":"0mCAwBAA,WAAAC,uBAAAD,YACAE,cAAAD,uBAAAC,eAEAC,4pBAAAC,CAAAD,cAOA,IAAME,wBACa,+CAQbC,8BACgB,mBASlBC,YAAa,gBAKG,WACZA,aAGJC,SAASC,iBAAiB,SAAS,SAACC,GAC1BC,IAAAA,aAAeD,EAAEE,OAAOC,QAAQR,yBAClCM,eACAD,EAAEI,iBACFC,4BAA4BJ,cAAcK,MAAMC,sBAAaC,WAEpE,IACDX,YAAa,EAChB,EAQD,OAAiCY,KAA3BJ,gCAA2BK,mBAAAC,MAAG,iBAAMV,cAAN,IAAAW,kBAAAC,WAAAC,KAAAC,aAAAC,UAAAC,YAAAC,gBAAAC,aAAAC,aAAAC,gBAAAC,iBAAAC,aAAA,OAAAb,mBAAAc,MAAA,SAAAC,UAAA,OAAA,OAAAA,SAAAC,KAAAD,SAAAE,MAAA,KAAA,EAAA,OAE1Bf,kBAAoBX,aAAa2B,UAGvC3B,aAAa4B,aAAa,WAAY,YAGhChB,WAAaZ,aAAa6B,aAAa,mBACvChB,KAAOb,aAAa6B,aAAa,aACjCf,aAAed,aAAa6B,aAAa,qBAEzCd,UAAYH,aAAejB,8BAZD6B,SAAAE,KAAA,EAeNI,mBAAUC,OAAO,eAAgB,CAAjC,GAfM,KAAA,EAgB1BD,OADAd,YAf0BQ,SAAAQ,KAAAR,SAAAE,KAAA,GAgB1BI,WAAAA,QAAUG,oBAAoBjC,aAAcgB,YAAa,IAhB/B,KAAA,GAAA,OAAAQ,SAAAC,KAAA,GAAAD,SAAAE,KAAA,IAoBtB,EAAuBb,YAAAA,wBAAAA,KAAME,WApBP,KAAA,GAAA,OAuBtBE,gBAAkB,CACpBJ,KAAMA,KACNC,aAAcA,aACdoB,gBAAiBnB,UACjBoB,mBAAoBpB,UACpBqB,eAAe,GA5BSZ,SAAAE,KAAA,GA8BDI,mBAAUO,iBAAiB,gCAAiCpB,iBA9B3D,KAAA,GAAA,OA8BtBC,aA9BsBM,SAAAQ,KAAAR,SAAAE,KAAA,GAiCDI,WAAUQ,QAAAA,YAAYtC,aAAckB,aAAaqB,KAAMrB,aAAasB,IAjCnE,KAAA,GAiCtBrB,aAjCsBK,SAAAQ,KAkCtBZ,gBAAkBD,aAAasB,MAG/BpB,iBAAmBrB,aAAa6B,aAAa,yBAC7CP,aAAe,IAAIoB,YAAYlD,aAAamD,wBAAyB,CACvEC,SAAS,EACTC,OAAQ,CACJhC,KAAAA,KACAC,aAAAA,aACAC,UAAAA,UACAM,iBAAAA,oBAIRD,gBAAgB0B,cAAcxB,cAhDFE,SAAAE,KAAA,GAAA,MAAA,KAAA,GAAAF,SAAAC,KAAA,GAAAD,SAAAuB,GAAAvB,SAAA,MAAA,IAoD5BxB,aAAagD,gBAAgB,YAC7BhD,aAAa2B,UAAYhB,kBAGzBL,cAAAA,QAAaC,UAAbiB,SAAAuB,IAxD4B,KAAA,GAAA,IAAA,MAAA,OAAAvB,SAAAyB,OAAA,GAAAC,QAAA,KAAA,CAAA,CAAA,GAAA,KAAH,IAAA1C,oTAAA,SAAA2C,IAAA,OAAA3C,KAAA4C,MAAAC,KAAAC,UAAA"} \ No newline at end of file diff --git a/course/amd/build/recommendations.min.js.map b/course/amd/build/recommendations.min.js.map index efa89fb81af..e63786f4a58 100644 --- a/course/amd/build/recommendations.min.js.map +++ b/course/amd/build/recommendations.min.js.map @@ -1 +1 @@ -{"version":3,"file":"recommendations.min.js","sources":["../src/recommendations.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 javascript module to handle toggling activity chooser recommendations.\n *\n * @module core_course/recommendations\n * @copyright 2020 Adrian Greeve \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\n\n/**\n * Do an ajax call to toggle the recommendation\n *\n * @param {object} e The event\n * @return {void}\n */\nconst toggleRecommendation = (e) => {\n let data = {\n methodname: 'core_course_toggle_activity_recommendation',\n args: {\n area: e.currentTarget.dataset.area,\n id: e.currentTarget.dataset.id\n }\n };\n Ajax.call([data])[0].fail(Notification.exception);\n};\n\n/**\n * Initialisation function\n *\n * @return {void}\n */\nexport const init = () => {\n const checkboxelements = document.querySelectorAll(\"[data-area]\");\n checkboxelements.forEach((checkbox) => {\n checkbox.addEventListener('change', toggleRecommendation);\n });\n};\n"],"names":["toggleRecommendation","e","data","methodname","args","area","currentTarget","dataset","id","call","fail","Notification","exception","document","querySelectorAll","forEach","checkbox","addEventListener"],"mappings":";;;;;;;8KAgCMA,qBAAuB,SAACC,OACtBC,KAAO,CACPC,WAAY,6CACZC,KAAM,CACFC,KAAMJ,EAAEK,cAAcC,QAAQF,KAC9BG,GAAIP,EAAEK,cAAcC,QAAQC,mBAG/BC,KAAK,CAACP,OAAO,GAAGQ,KAAKC,sBAAaC,0BAQvB,WACSC,SAASC,iBAAiB,eAClCC,SAAQ,SAACC,UACtBA,SAASC,iBAAiB,SAAUjB"} \ No newline at end of file +{"version":3,"file":"recommendations.min.js","sources":["../src/recommendations.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 javascript module to handle toggling activity chooser recommendations.\n *\n * @module core_course/recommendations\n * @copyright 2020 Adrian Greeve \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\n\n/**\n * Do an ajax call to toggle the recommendation\n *\n * @param {object} e The event\n * @return {void}\n */\nconst toggleRecommendation = (e) => {\n let data = {\n methodname: 'core_course_toggle_activity_recommendation',\n args: {\n area: e.currentTarget.dataset.area,\n id: e.currentTarget.dataset.id\n }\n };\n Ajax.call([data])[0].fail(Notification.exception);\n};\n\n/**\n * Initialisation function\n *\n * @return {void}\n */\nexport const init = () => {\n const checkboxelements = document.querySelectorAll(\"[data-area]\");\n checkboxelements.forEach((checkbox) => {\n checkbox.addEventListener('change', toggleRecommendation);\n });\n};\n"],"names":["_ajax","_interopRequireDefault","_notification","toggleRecommendation","e","data","methodname","args","area","currentTarget","dataset","id","call","fail","Notification","exception","document","querySelectorAll","forEach","checkbox","addEventListener"],"mappings":";;;;;;;kFAuBAA,MAAAC,uBAAAD,OACAE,cAAAD,uBAAAC,eAQA,IAAMC,qBAAuB,SAACC,GAC1B,IAAIC,KAAO,CACPC,WAAY,6CACZC,KAAM,CACFC,KAAMJ,EAAEK,cAAcC,QAAQF,KAC9BG,GAAIP,EAAEK,cAAcC,QAAQC,KAG/BC,MAAAA,QAAAA,KAAK,CAACP,OAAO,GAAGQ,KAAKC,cAAAA,QAAaC,UAC1C,gBAOmB,WACSC,SAASC,iBAAiB,eAClCC,SAAQ,SAACC,UACtBA,SAASC,iBAAiB,SAAUjB,qBACvC,GACJ"} \ No newline at end of file diff --git a/course/amd/build/repository.min.js b/course/amd/build/repository.min.js index 4768dc908e0..d0f365c7105 100644 --- a/course/amd/build/repository.min.js +++ b/course/amd/build/repository.min.js @@ -5,6 +5,6 @@ define("core_course/repository",["exports","core/ajax"],(function(_exports,_ajax * @module core_course/repository * @copyright 2018 Ryan Wyllie * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_ajax=(obj=_ajax)&&obj.__esModule?obj:{default:obj};var _default={getEnrolledCoursesByTimelineClassification:function(classification,limit,offset,sort){var args={classification:classification};void 0!==limit&&(args.limit=limit),void 0!==offset&&(args.offset=offset),void 0!==sort&&(args.sort=sort);var request={methodname:"core_course_get_enrolled_courses_by_timeline_classification",args:args};return _ajax.default.call([request])[0]},getLastAccessedCourses:function(userid,limit,offset,sort){var args={};void 0!==userid&&(args.userid=userid),void 0!==limit&&(args.limit=limit),void 0!==offset&&(args.offset=offset),void 0!==sort&&(args.sort=sort);var request={methodname:"core_course_get_recent_courses",args:args};return _ajax.default.call([request])[0]},getUsersFromCourseModuleID:function(cmid,groupID){var onlyActive=arguments.length>2&&void 0!==arguments[2]&&arguments[2],request={methodname:"core_course_get_enrolled_users_by_cmid",args:{cmid:cmid,groupid:groupID,onlyactive:onlyActive}};return _ajax.default.call([request])[0]},toggleManualCompletion:function(cmid,completed){var request={methodname:"core_completion_update_activity_completion_status_manually",args:{cmid:cmid,completed:completed}};return _ajax.default.call([request])[0]}};return _exports.default=_default,_exports.default})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_ajax=(obj=_ajax)&&obj.__esModule?obj:{default:obj};var _default={getEnrolledCoursesByTimelineClassification:function(classification,limit,offset,sort){var args={classification:classification};void 0!==limit&&(args.limit=limit),void 0!==offset&&(args.offset=offset),void 0!==sort&&(args.sort=sort);var request={methodname:"core_course_get_enrolled_courses_by_timeline_classification",args:args};return _ajax.default.call([request])[0]},getLastAccessedCourses:function(userid,limit,offset,sort){var args={};void 0!==userid&&(args.userid=userid),void 0!==limit&&(args.limit=limit),void 0!==offset&&(args.offset=offset),void 0!==sort&&(args.sort=sort);var request={methodname:"core_course_get_recent_courses",args:args};return _ajax.default.call([request])[0]},getUsersFromCourseModuleID:function(cmid,groupID){var request={methodname:"core_course_get_enrolled_users_by_cmid",args:{cmid:cmid,groupid:groupID,onlyactive:arguments.length>2&&void 0!==arguments[2]&&arguments[2]}};return _ajax.default.call([request])[0]},toggleManualCompletion:function(cmid,completed){var request={methodname:"core_completion_update_activity_completion_status_manually",args:{cmid:cmid,completed:completed}};return _ajax.default.call([request])[0]}};return _exports.default=_default,_exports.default})); //# sourceMappingURL=repository.min.js.map \ No newline at end of file diff --git a/course/amd/build/repository.min.js.map b/course/amd/build/repository.min.js.map index 169b1848e94..8f992f502c7 100644 --- a/course/amd/build/repository.min.js.map +++ b/course/amd/build/repository.min.js.map @@ -1 +1 @@ -{"version":3,"file":"repository.min.js","sources":["../src/repository.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 javascript module to handle course ajax actions.\n *\n * @module core_course/repository\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\n\n/**\n * Get the list of courses that the logged in user is enrolled in for a given\n * timeline classification.\n *\n * @param {string} classification past, inprogress, or future\n * @param {int} limit Only return this many results\n * @param {int} offset Skip this many results from the start of the result set\n * @param {string} sort Column to sort by and direction, e.g. 'shortname asc'\n * @return {object} jQuery promise resolved with courses.\n */\nconst getEnrolledCoursesByTimelineClassification = (classification, limit, offset, sort) => {\n const args = {\n classification: classification\n };\n\n if (typeof limit !== 'undefined') {\n args.limit = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.offset = offset;\n }\n\n if (typeof sort !== 'undefined') {\n args.sort = sort;\n }\n\n const request = {\n methodname: 'core_course_get_enrolled_courses_by_timeline_classification',\n args: args\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get the list of courses that the user has most recently accessed.\n *\n * @method getLastAccessedCourses\n * @param {int} userid User from which the courses will be obtained\n * @param {int} limit Only return this many results\n * @param {int} offset Skip this many results from the start of the result set\n * @param {string} sort Column to sort by and direction, e.g. 'shortname asc'\n * @return {promise} Resolved with an array of courses\n */\nconst getLastAccessedCourses = (userid, limit, offset, sort) => {\n const args = {};\n\n if (typeof userid !== 'undefined') {\n args.userid = userid;\n }\n\n if (typeof limit !== 'undefined') {\n args.limit = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.offset = offset;\n }\n\n if (typeof sort !== 'undefined') {\n args.sort = sort;\n }\n\n const request = {\n methodname: 'core_course_get_recent_courses',\n args: args\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get the list of users enrolled in this cmid.\n *\n * @param {Number} cmid Course Module from which the users will be obtained\n * @param {Number} groupID Group ID from which the users will be obtained\n * @param {Boolean} onlyActive Whether to fetch only the active enrolled users or all enrolled users in the course.\n * @returns {Promise} Promise containing a list of users\n */\nconst getEnrolledUsersFromCourseModuleID = (cmid, groupID, onlyActive = false) => {\n var request = {\n methodname: 'core_course_get_enrolled_users_by_cmid',\n args: {\n cmid: cmid,\n groupid: groupID,\n onlyactive: onlyActive,\n },\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Toggle the completion state of an activity with manual completion.\n *\n * @param {Number} cmid The course module ID.\n * @param {Boolean} completed Whether to set as complete or not.\n * @returns {object} jQuery promise\n */\nconst toggleManualCompletion = (cmid, completed) => {\n const request = {\n methodname: 'core_completion_update_activity_completion_status_manually',\n args: {\n cmid,\n completed,\n }\n };\n return Ajax.call([request])[0];\n};\n\nexport default {\n getEnrolledCoursesByTimelineClassification,\n getLastAccessedCourses,\n getUsersFromCourseModuleID: getEnrolledUsersFromCourseModuleID,\n toggleManualCompletion,\n};\n"],"names":["getEnrolledCoursesByTimelineClassification","classification","limit","offset","sort","args","request","methodname","Ajax","call","getLastAccessedCourses","userid","getUsersFromCourseModuleID","cmid","groupID","onlyActive","groupid","onlyactive","toggleManualCompletion","completed"],"mappings":";;;;;;;sJAwIe,CACXA,2CAtG+C,SAACC,eAAgBC,MAAOC,OAAQC,UACzEC,KAAO,CACTJ,eAAgBA,qBAGC,IAAVC,QACPG,KAAKH,MAAQA,YAGK,IAAXC,SACPE,KAAKF,OAASA,aAGE,IAATC,OACPC,KAAKD,KAAOA,UAGVE,QAAU,CACZC,WAAY,8DACZF,KAAMA,aAGHG,cAAKC,KAAK,CAACH,UAAU,IAiF5BI,uBApE2B,SAACC,OAAQT,MAAOC,OAAQC,UAC7CC,KAAO,QAES,IAAXM,SACPN,KAAKM,OAASA,aAGG,IAAVT,QACPG,KAAKH,MAAQA,YAGK,IAAXC,SACPE,KAAKF,OAASA,aAGE,IAATC,OACPC,KAAKD,KAAOA,UAGVE,QAAU,CACZC,WAAY,iCACZF,KAAMA,aAGHG,cAAKC,KAAK,CAACH,UAAU,IA6C5BM,2BAlCuC,SAACC,KAAMC,aAASC,mEACnDT,QAAU,CACVC,WAAY,yCACZF,KAAM,CACFQ,KAAMA,KACNG,QAASF,QACTG,WAAYF,oBAIbP,cAAKC,KAAK,CAACH,UAAU,IAyB5BY,uBAf2B,SAACL,KAAMM,eAC5Bb,QAAU,CACZC,WAAY,6DACZF,KAAM,CACFQ,KAAAA,KACAM,UAAAA,mBAGDX,cAAKC,KAAK,CAACH,UAAU"} \ No newline at end of file +{"version":3,"file":"repository.min.js","sources":["../src/repository.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 javascript module to handle course ajax actions.\n *\n * @module core_course/repository\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\n\n/**\n * Get the list of courses that the logged in user is enrolled in for a given\n * timeline classification.\n *\n * @param {string} classification past, inprogress, or future\n * @param {int} limit Only return this many results\n * @param {int} offset Skip this many results from the start of the result set\n * @param {string} sort Column to sort by and direction, e.g. 'shortname asc'\n * @return {object} jQuery promise resolved with courses.\n */\nconst getEnrolledCoursesByTimelineClassification = (classification, limit, offset, sort) => {\n const args = {\n classification: classification\n };\n\n if (typeof limit !== 'undefined') {\n args.limit = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.offset = offset;\n }\n\n if (typeof sort !== 'undefined') {\n args.sort = sort;\n }\n\n const request = {\n methodname: 'core_course_get_enrolled_courses_by_timeline_classification',\n args: args\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get the list of courses that the user has most recently accessed.\n *\n * @method getLastAccessedCourses\n * @param {int} userid User from which the courses will be obtained\n * @param {int} limit Only return this many results\n * @param {int} offset Skip this many results from the start of the result set\n * @param {string} sort Column to sort by and direction, e.g. 'shortname asc'\n * @return {promise} Resolved with an array of courses\n */\nconst getLastAccessedCourses = (userid, limit, offset, sort) => {\n const args = {};\n\n if (typeof userid !== 'undefined') {\n args.userid = userid;\n }\n\n if (typeof limit !== 'undefined') {\n args.limit = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.offset = offset;\n }\n\n if (typeof sort !== 'undefined') {\n args.sort = sort;\n }\n\n const request = {\n methodname: 'core_course_get_recent_courses',\n args: args\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Get the list of users enrolled in this cmid.\n *\n * @param {Number} cmid Course Module from which the users will be obtained\n * @param {Number} groupID Group ID from which the users will be obtained\n * @param {Boolean} onlyActive Whether to fetch only the active enrolled users or all enrolled users in the course.\n * @returns {Promise} Promise containing a list of users\n */\nconst getEnrolledUsersFromCourseModuleID = (cmid, groupID, onlyActive = false) => {\n var request = {\n methodname: 'core_course_get_enrolled_users_by_cmid',\n args: {\n cmid: cmid,\n groupid: groupID,\n onlyactive: onlyActive,\n },\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Toggle the completion state of an activity with manual completion.\n *\n * @param {Number} cmid The course module ID.\n * @param {Boolean} completed Whether to set as complete or not.\n * @returns {object} jQuery promise\n */\nconst toggleManualCompletion = (cmid, completed) => {\n const request = {\n methodname: 'core_completion_update_activity_completion_status_manually',\n args: {\n cmid,\n completed,\n }\n };\n return Ajax.call([request])[0];\n};\n\nexport default {\n getEnrolledCoursesByTimelineClassification,\n getLastAccessedCourses,\n getUsersFromCourseModuleID: getEnrolledUsersFromCourseModuleID,\n toggleManualCompletion,\n};\n"],"names":["_ajax","_default","getEnrolledCoursesByTimelineClassification","classification","limit","offset","sort","args","request","methodname","Ajax","call","getLastAccessedCourses","userid","getUsersFromCourseModuleID","cmid","groupID","onlyActive","groupid","onlyactive","toggleManualCompletion","completed"],"mappings":";;;;;;;qFAuBAA,WAAAA,yCAYA,IAqGeC,SAAA,CACXC,2CAtG+C,SAACC,eAAgBC,MAAOC,OAAQC,MAC/E,IAAMC,KAAO,CACTJ,eAAgBA,qBAGC,IAAVC,QACPG,KAAKH,MAAQA,YAGK,IAAXC,SACPE,KAAKF,OAASA,aAGE,IAATC,OACPC,KAAKD,KAAOA,MAGhB,IAAME,QAAU,CACZC,WAAY,8DACZF,KAAMA,MAGHG,OAAAA,MAAAA,QAAKC,KAAK,CAACH,UAAU,EAC/B,EAgFGI,uBApE2B,SAACC,OAAQT,MAAOC,OAAQC,MAC7CC,IAAAA,KAAO,CAAA,OAES,IAAXM,SACPN,KAAKM,OAASA,aAGG,IAAVT,QACPG,KAAKH,MAAQA,YAGK,IAAXC,SACPE,KAAKF,OAASA,aAGE,IAATC,OACPC,KAAKD,KAAOA,MAGhB,IAAME,QAAU,CACZC,WAAY,iCACZF,KAAMA,MAGHG,OAAAA,MAAAA,QAAKC,KAAK,CAACH,UAAU,EAC/B,EA4CGM,2BAlCuC,SAACC,KAAMC,SAASC,IACnDT,QAAU,CACVC,WAAY,yCACZF,KAAM,CACFQ,KAAMA,KACNG,QAASF,QACTG,qEAIDT,OAAAA,MAAAA,QAAKC,KAAK,CAACH,UAAU,EAC/B,EAwBGY,uBAf2B,SAACL,KAAMM,WAClC,IAAMb,QAAU,CACZC,WAAY,6DACZF,KAAM,CACFQ,KAAAA,KACAM,UAAAA,YAGDX,OAAAA,MAAAA,QAAKC,KAAK,CAACH,UAAU,EAC/B"} \ No newline at end of file diff --git a/course/amd/build/view.min.js.map b/course/amd/build/view.min.js.map index 058aeb8ea13..d7a02630bde 100644 --- a/course/amd/build/view.min.js.map +++ b/course/amd/build/view.min.js.map @@ -1 +1 @@ -{"version":3,"file":"view.min.js","sources":["../src/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 * JS module for the course homepage.\n *\n * @module core_course/view\n * @copyright 2021 Jun Pataleta \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport * as CourseEvents from 'core_course/events';\n\n/**\n * Whether the event listener has already been registered for this module.\n *\n * @type {boolean}\n */\nlet registered = false;\n\n/**\n * Function to intialise and register event listeners for this module.\n */\nexport const init = () => {\n if (registered) {\n return;\n }\n // Listen for toggled manual completion states of activities.\n document.addEventListener(CourseEvents.manualCompletionToggled, (e) => {\n const withAvailability = parseInt(e.detail.withAvailability);\n if (withAvailability) {\n // Reload the page when the toggled manual completion button has availability conditions linked to it.\n window.location.reload();\n }\n });\n registered = true;\n};\n"],"names":["registered","document","addEventListener","CourseEvents","manualCompletionToggled","e","parseInt","detail","withAvailability","window","location","reload"],"mappings":";;;;;;;wBA8BIA,YAAa,gBAKG,WACZA,aAIJC,SAASC,iBAAiBC,aAAaC,yBAAyB,SAACC,GACpCC,SAASD,EAAEE,OAAOC,mBAGvCC,OAAOC,SAASC,YAGxBX,YAAa"} \ No newline at end of file +{"version":3,"file":"view.min.js","sources":["../src/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 * JS module for the course homepage.\n *\n * @module core_course/view\n * @copyright 2021 Jun Pataleta \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport * as CourseEvents from 'core_course/events';\n\n/**\n * Whether the event listener has already been registered for this module.\n *\n * @type {boolean}\n */\nlet registered = false;\n\n/**\n * Function to intialise and register event listeners for this module.\n */\nexport const init = () => {\n if (registered) {\n return;\n }\n // Listen for toggled manual completion states of activities.\n document.addEventListener(CourseEvents.manualCompletionToggled, (e) => {\n const withAvailability = parseInt(e.detail.withAvailability);\n if (withAvailability) {\n // Reload the page when the toggled manual completion button has availability conditions linked to it.\n window.location.reload();\n }\n });\n registered = true;\n};\n"],"names":["CourseEvents","_interopRequireWildcard","registered","document","addEventListener","manualCompletionToggled","e","parseInt","detail","withAvailability","window","location","reload"],"mappings":"ssBAuBAA;;;;;;;KAAAC,CAAAD,cAOIE,IAAAA,YAAa,gBAKG,WACZA,aAIJC,SAASC,iBAAiBJ,aAAaK,yBAAyB,SAACC,GACpCC,SAASD,EAAEE,OAAOC,mBAGvCC,OAAOC,SAASC,QAEvB,IACDV,YAAa,EAChB"} \ No newline at end of file diff --git a/customfield/amd/build/form.min.js.map b/customfield/amd/build/form.min.js.map index 2a015d607cc..517dccccd4c 100644 --- a/customfield/amd/build/form.min.js.map +++ b/customfield/amd/build/form.min.js.map @@ -1 +1 @@ -{"version":3,"file":"form.min.js","sources":["../src/form.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 * Custom Field interaction management for Moodle.\n *\n * @module core_customfield/form\n * @copyright 2018 Toni Barbera\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport 'core/inplace_editable';\nimport {call as fetchMany} from 'core/ajax';\nimport {\n get_string as getString,\n get_strings as getStrings,\n} from 'core/str';\nimport ModalForm from 'core_form/modalform';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport SortableList from 'core/sortable_list';\nimport Templates from 'core/templates';\nimport jQuery from 'jquery';\n\n/**\n * Display confirmation dialogue\n *\n * @param {Number} id\n * @param {String} type\n * @param {String} component\n * @param {String} area\n * @param {Number} itemid\n */\nconst confirmDelete = (id, type, component, area, itemid) => {\n const pendingPromise = new Pending('core_customfield/form:confirmDelete');\n\n getStrings([\n {'key': 'confirm'},\n {'key': 'confirmdelete' + type, component: 'core_customfield'},\n {'key': 'yes'},\n {'key': 'no'},\n ])\n .then(strings => {\n return Notification.confirm(strings[0], strings[1], strings[2], strings[3], function() {\n const pendingDeletePromise = new Pending('core_customfield/form:confirmDelete');\n fetchMany([\n {\n methodname: (type === 'field') ? 'core_customfield_delete_field' : 'core_customfield_delete_category',\n args: {id},\n },\n {methodname: 'core_customfield_reload_template', args: {component, area, itemid}}\n ])[1]\n .then(response => Templates.render('core_customfield/list', response))\n .then((html, js) => Templates.replaceNode(jQuery('[data-region=\"list-page\"]'), html, js))\n .then(pendingDeletePromise.resolve)\n .catch(Notification.exception);\n });\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n};\n\n\n/**\n * Creates a new custom fields category with default name and updates the list\n *\n * @param {String} component\n * @param {String} area\n * @param {Number} itemid\n */\nconst createNewCategory = (component, area, itemid) => {\n const pendingPromise = new Pending('core_customfield/form:createNewCategory');\n const promises = fetchMany([\n {methodname: 'core_customfield_create_category', args: {component, area, itemid}},\n {methodname: 'core_customfield_reload_template', args: {component, area, itemid}}\n ]);\n\n promises[1].then(response => Templates.render('core_customfield/list', response))\n .then((html, js) => Templates.replaceNode(jQuery('[data-region=\"list-page\"]'), html, js))\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n};\n\n/**\n * Create new custom field\n *\n * @param {HTMLElement} element\n * @param {String} component\n * @param {String} area\n * @param {Number} itemid\n */\nconst createNewField = (element, component, area, itemid) => {\n const pendingPromise = new Pending('core_customfield/form:createNewField');\n\n const returnFocus = element.closest(\".action-menu\").querySelector(\".dropdown-toggle\");\n const form = new ModalForm({\n formClass: \"core_customfield\\\\field_config_form\",\n args: {\n categoryid: element.getAttribute('data-categoryid'),\n type: element.getAttribute('data-type'),\n },\n modalConfig: {\n title: getString('addingnewcustomfield', 'core_customfield', element.getAttribute('data-typename')),\n },\n returnFocus,\n });\n\n form.addEventListener(form.events.FORM_SUBMITTED, () => {\n const pendingCreatedPromise = new Pending('core_customfield/form:createdNewField');\n const promises = fetchMany([\n {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n ]);\n\n promises[0].then(response => Templates.render('core_customfield/list', response))\n .then((html, js) => Templates.replaceNode(jQuery('[data-region=\"list-page\"]'), html, js))\n .then(() => pendingCreatedPromise.resolve())\n .catch(() => window.location.reload());\n });\n\n form.show();\n\n pendingPromise.resolve();\n};\n\n/**\n * Edit custom field\n *\n * @param {HTMLElement} element\n * @param {String} component\n * @param {String} area\n * @param {Number} itemid\n */\nconst editField = (element, component, area, itemid) => {\n const pendingPromise = new Pending('core_customfield/form:editField');\n\n const form = new ModalForm({\n formClass: \"core_customfield\\\\field_config_form\",\n args: {\n id: element.getAttribute('data-id'),\n },\n modalConfig: {\n title: getString('editingfield', 'core_customfield', element.getAttribute('data-name')),\n },\n returnFocus: element,\n });\n\n form.addEventListener(form.events.FORM_SUBMITTED, () => {\n const pendingCreatedPromise = new Pending('core_customfield/form:createdNewField');\n const promises = fetchMany([\n {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n ]);\n\n promises[0].then(response => Templates.render('core_customfield/list', response))\n .then((html, js) => Templates.replaceNode(jQuery('[data-region=\"list-page\"]'), html, js))\n .then(() => pendingCreatedPromise.resolve())\n .catch(() => window.location.reload());\n });\n\n form.show();\n\n pendingPromise.resolve();\n};\n\n/**\n * Fetch the category name from an inplace editable, given a child node of that field.\n *\n * @param {NodeElement} nodeElement\n * @returns {String}\n */\nconst getCategoryNameFor = nodeElement => nodeElement\n .closest('[data-category-id]')\n .find('[data-inplaceeditable][data-itemtype=category][data-component=core_customfield]')\n .attr('data-value');\n\nconst setupSortableLists = rootNode => {\n // Sort category.\n const sortCat = new SortableList(\n '#customfield_catlist .categorieslist',\n {\n moveHandlerSelector: '.movecategory [data-drag-type=move]',\n }\n );\n sortCat.getElementName = nodeElement => Promise.resolve(getCategoryNameFor(nodeElement));\n\n // Note: The sortable list currently uses jQuery events.\n jQuery('[data-category-id]').on(SortableList.EVENTS.DROP, (evt, info) => {\n if (info.positionChanged) {\n const pendingPromise = new Pending('core_customfield/form:categoryid:on:sortablelist-drop');\n fetchMany([{\n methodname: 'core_customfield_move_category',\n args: {\n id: info.element.data('category-id'),\n beforeid: info.targetNextElement.data('category-id')\n }\n\n }])[0]\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n }\n evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n });\n\n // Sort fields.\n var sort = new SortableList(\n '#customfield_catlist .fieldslist tbody',\n {\n moveHandlerSelector: '.movefield [data-drag-type=move]',\n }\n );\n\n sort.getDestinationName = (parentElement, afterElement) => {\n if (!afterElement.length) {\n return getString('totopofcategory', 'customfield', getCategoryNameFor(parentElement));\n } else if (afterElement.attr('data-field-name')) {\n return getString('afterfield', 'customfield', afterElement.attr('data-field-name'));\n } else {\n return Promise.resolve('');\n }\n };\n\n jQuery('[data-field-name]').on(SortableList.EVENTS.DROP, (evt, info) => {\n if (info.positionChanged) {\n const pendingPromise = new Pending('core_customfield/form:fieldname:on:sortablelist-drop');\n fetchMany([{\n methodname: 'core_customfield_move_field',\n args: {\n id: info.element.data('field-id'),\n beforeid: info.targetNextElement.data('field-id'),\n categoryid: Number(info.targetList.closest('[data-category-id]').attr('data-category-id'))\n },\n }])[0]\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n }\n evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n });\n\n jQuery('[data-field-name]').on(SortableList.EVENTS.DRAG, evt => {\n var pendingPromise = new Pending('core_customfield/form:fieldname:on:sortablelist-drag');\n\n evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n\n // Refreshing fields tables.\n Templates.render('core_customfield/nofields', {})\n .then(html => {\n rootNode.querySelectorAll('.categorieslist > *')\n .forEach(category => {\n const fields = category.querySelectorAll('.field:not(.sortable-list-is-dragged)');\n const noFields = category.querySelector('.nofields');\n\n if (!fields.length && !noFields) {\n category.querySelector('tbody').innerHTML = html;\n } else if (fields.length && noFields) {\n noFields.remove();\n }\n });\n return;\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n });\n\n jQuery('[data-category-id], [data-field-name]').on(SortableList.EVENTS.DRAGSTART, (evt, info) => {\n setTimeout(() => {\n jQuery('.sortable-list-is-dragged').width(info.element.width());\n }, 501);\n });\n};\n\n/**\n * Initialise the custom fields manager.\n */\nexport const init = () => {\n const rootNode = document.querySelector('#customfield_catlist');\n\n const component = rootNode.dataset.component;\n const area = rootNode.dataset.area;\n const itemid = rootNode.dataset.itemid;\n\n rootNode.addEventListener('click', e => {\n const roleHolder = e.target.closest('[data-role]');\n if (!roleHolder) {\n return;\n }\n\n if (roleHolder.dataset.role === 'deletefield') {\n e.preventDefault();\n\n confirmDelete(roleHolder.dataset.id, 'field', component, area, itemid);\n return;\n }\n\n if (roleHolder.dataset.role === 'deletecategory') {\n e.preventDefault();\n\n confirmDelete(roleHolder.dataset.id, 'category', component, area, itemid);\n return;\n }\n\n if (roleHolder.dataset.role === 'addnewcategory') {\n e.preventDefault();\n createNewCategory(component, area, itemid);\n\n return;\n }\n\n if (roleHolder.dataset.role === 'addfield') {\n e.preventDefault();\n createNewField(roleHolder, component, area, itemid);\n\n return;\n }\n\n if (roleHolder.dataset.role === 'editfield') {\n e.preventDefault();\n editField(roleHolder, component, area, itemid);\n\n return;\n }\n });\n\n setupSortableLists(rootNode, component, area, itemid);\n};\n"],"names":["confirmDelete","id","type","component","area","itemid","pendingPromise","Pending","then","strings","Notification","confirm","pendingDeletePromise","methodname","args","response","Templates","render","html","js","replaceNode","resolve","catch","exception","getCategoryNameFor","nodeElement","closest","find","attr","rootNode","document","querySelector","dataset","addEventListener","e","roleHolder","target","role","preventDefault","createNewCategory","element","returnFocus","form","ModalForm","formClass","categoryid","getAttribute","modalConfig","title","events","FORM_SUBMITTED","pendingCreatedPromise","window","location","reload","show","createNewField","editField","SortableList","moveHandlerSelector","getElementName","Promise","on","EVENTS","DROP","evt","info","positionChanged","data","beforeid","targetNextElement","stopPropagation","getDestinationName","parentElement","afterElement","length","Number","targetList","DRAG","querySelectorAll","forEach","category","fields","noFields","remove","innerHTML","DRAGSTART","setTimeout","width","setupSortableLists"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"form.min.js","sources":["../src/form.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 * Custom Field interaction management for Moodle.\n *\n * @module core_customfield/form\n * @copyright 2018 Toni Barbera\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport 'core/inplace_editable';\nimport {call as fetchMany} from 'core/ajax';\nimport {\n get_string as getString,\n get_strings as getStrings,\n} from 'core/str';\nimport ModalForm from 'core_form/modalform';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport SortableList from 'core/sortable_list';\nimport Templates from 'core/templates';\nimport jQuery from 'jquery';\n\n/**\n * Display confirmation dialogue\n *\n * @param {Number} id\n * @param {String} type\n * @param {String} component\n * @param {String} area\n * @param {Number} itemid\n */\nconst confirmDelete = (id, type, component, area, itemid) => {\n const pendingPromise = new Pending('core_customfield/form:confirmDelete');\n\n getStrings([\n {'key': 'confirm'},\n {'key': 'confirmdelete' + type, component: 'core_customfield'},\n {'key': 'yes'},\n {'key': 'no'},\n ])\n .then(strings => {\n return Notification.confirm(strings[0], strings[1], strings[2], strings[3], function() {\n const pendingDeletePromise = new Pending('core_customfield/form:confirmDelete');\n fetchMany([\n {\n methodname: (type === 'field') ? 'core_customfield_delete_field' : 'core_customfield_delete_category',\n args: {id},\n },\n {methodname: 'core_customfield_reload_template', args: {component, area, itemid}}\n ])[1]\n .then(response => Templates.render('core_customfield/list', response))\n .then((html, js) => Templates.replaceNode(jQuery('[data-region=\"list-page\"]'), html, js))\n .then(pendingDeletePromise.resolve)\n .catch(Notification.exception);\n });\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n};\n\n\n/**\n * Creates a new custom fields category with default name and updates the list\n *\n * @param {String} component\n * @param {String} area\n * @param {Number} itemid\n */\nconst createNewCategory = (component, area, itemid) => {\n const pendingPromise = new Pending('core_customfield/form:createNewCategory');\n const promises = fetchMany([\n {methodname: 'core_customfield_create_category', args: {component, area, itemid}},\n {methodname: 'core_customfield_reload_template', args: {component, area, itemid}}\n ]);\n\n promises[1].then(response => Templates.render('core_customfield/list', response))\n .then((html, js) => Templates.replaceNode(jQuery('[data-region=\"list-page\"]'), html, js))\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n};\n\n/**\n * Create new custom field\n *\n * @param {HTMLElement} element\n * @param {String} component\n * @param {String} area\n * @param {Number} itemid\n */\nconst createNewField = (element, component, area, itemid) => {\n const pendingPromise = new Pending('core_customfield/form:createNewField');\n\n const returnFocus = element.closest(\".action-menu\").querySelector(\".dropdown-toggle\");\n const form = new ModalForm({\n formClass: \"core_customfield\\\\field_config_form\",\n args: {\n categoryid: element.getAttribute('data-categoryid'),\n type: element.getAttribute('data-type'),\n },\n modalConfig: {\n title: getString('addingnewcustomfield', 'core_customfield', element.getAttribute('data-typename')),\n },\n returnFocus,\n });\n\n form.addEventListener(form.events.FORM_SUBMITTED, () => {\n const pendingCreatedPromise = new Pending('core_customfield/form:createdNewField');\n const promises = fetchMany([\n {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n ]);\n\n promises[0].then(response => Templates.render('core_customfield/list', response))\n .then((html, js) => Templates.replaceNode(jQuery('[data-region=\"list-page\"]'), html, js))\n .then(() => pendingCreatedPromise.resolve())\n .catch(() => window.location.reload());\n });\n\n form.show();\n\n pendingPromise.resolve();\n};\n\n/**\n * Edit custom field\n *\n * @param {HTMLElement} element\n * @param {String} component\n * @param {String} area\n * @param {Number} itemid\n */\nconst editField = (element, component, area, itemid) => {\n const pendingPromise = new Pending('core_customfield/form:editField');\n\n const form = new ModalForm({\n formClass: \"core_customfield\\\\field_config_form\",\n args: {\n id: element.getAttribute('data-id'),\n },\n modalConfig: {\n title: getString('editingfield', 'core_customfield', element.getAttribute('data-name')),\n },\n returnFocus: element,\n });\n\n form.addEventListener(form.events.FORM_SUBMITTED, () => {\n const pendingCreatedPromise = new Pending('core_customfield/form:createdNewField');\n const promises = fetchMany([\n {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n ]);\n\n promises[0].then(response => Templates.render('core_customfield/list', response))\n .then((html, js) => Templates.replaceNode(jQuery('[data-region=\"list-page\"]'), html, js))\n .then(() => pendingCreatedPromise.resolve())\n .catch(() => window.location.reload());\n });\n\n form.show();\n\n pendingPromise.resolve();\n};\n\n/**\n * Fetch the category name from an inplace editable, given a child node of that field.\n *\n * @param {NodeElement} nodeElement\n * @returns {String}\n */\nconst getCategoryNameFor = nodeElement => nodeElement\n .closest('[data-category-id]')\n .find('[data-inplaceeditable][data-itemtype=category][data-component=core_customfield]')\n .attr('data-value');\n\nconst setupSortableLists = rootNode => {\n // Sort category.\n const sortCat = new SortableList(\n '#customfield_catlist .categorieslist',\n {\n moveHandlerSelector: '.movecategory [data-drag-type=move]',\n }\n );\n sortCat.getElementName = nodeElement => Promise.resolve(getCategoryNameFor(nodeElement));\n\n // Note: The sortable list currently uses jQuery events.\n jQuery('[data-category-id]').on(SortableList.EVENTS.DROP, (evt, info) => {\n if (info.positionChanged) {\n const pendingPromise = new Pending('core_customfield/form:categoryid:on:sortablelist-drop');\n fetchMany([{\n methodname: 'core_customfield_move_category',\n args: {\n id: info.element.data('category-id'),\n beforeid: info.targetNextElement.data('category-id')\n }\n\n }])[0]\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n }\n evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n });\n\n // Sort fields.\n var sort = new SortableList(\n '#customfield_catlist .fieldslist tbody',\n {\n moveHandlerSelector: '.movefield [data-drag-type=move]',\n }\n );\n\n sort.getDestinationName = (parentElement, afterElement) => {\n if (!afterElement.length) {\n return getString('totopofcategory', 'customfield', getCategoryNameFor(parentElement));\n } else if (afterElement.attr('data-field-name')) {\n return getString('afterfield', 'customfield', afterElement.attr('data-field-name'));\n } else {\n return Promise.resolve('');\n }\n };\n\n jQuery('[data-field-name]').on(SortableList.EVENTS.DROP, (evt, info) => {\n if (info.positionChanged) {\n const pendingPromise = new Pending('core_customfield/form:fieldname:on:sortablelist-drop');\n fetchMany([{\n methodname: 'core_customfield_move_field',\n args: {\n id: info.element.data('field-id'),\n beforeid: info.targetNextElement.data('field-id'),\n categoryid: Number(info.targetList.closest('[data-category-id]').attr('data-category-id'))\n },\n }])[0]\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n }\n evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n });\n\n jQuery('[data-field-name]').on(SortableList.EVENTS.DRAG, evt => {\n var pendingPromise = new Pending('core_customfield/form:fieldname:on:sortablelist-drag');\n\n evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n\n // Refreshing fields tables.\n Templates.render('core_customfield/nofields', {})\n .then(html => {\n rootNode.querySelectorAll('.categorieslist > *')\n .forEach(category => {\n const fields = category.querySelectorAll('.field:not(.sortable-list-is-dragged)');\n const noFields = category.querySelector('.nofields');\n\n if (!fields.length && !noFields) {\n category.querySelector('tbody').innerHTML = html;\n } else if (fields.length && noFields) {\n noFields.remove();\n }\n });\n return;\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n });\n\n jQuery('[data-category-id], [data-field-name]').on(SortableList.EVENTS.DRAGSTART, (evt, info) => {\n setTimeout(() => {\n jQuery('.sortable-list-is-dragged').width(info.element.width());\n }, 501);\n });\n};\n\n/**\n * Initialise the custom fields manager.\n */\nexport const init = () => {\n const rootNode = document.querySelector('#customfield_catlist');\n\n const component = rootNode.dataset.component;\n const area = rootNode.dataset.area;\n const itemid = rootNode.dataset.itemid;\n\n rootNode.addEventListener('click', e => {\n const roleHolder = e.target.closest('[data-role]');\n if (!roleHolder) {\n return;\n }\n\n if (roleHolder.dataset.role === 'deletefield') {\n e.preventDefault();\n\n confirmDelete(roleHolder.dataset.id, 'field', component, area, itemid);\n return;\n }\n\n if (roleHolder.dataset.role === 'deletecategory') {\n e.preventDefault();\n\n confirmDelete(roleHolder.dataset.id, 'category', component, area, itemid);\n return;\n }\n\n if (roleHolder.dataset.role === 'addnewcategory') {\n e.preventDefault();\n createNewCategory(component, area, itemid);\n\n return;\n }\n\n if (roleHolder.dataset.role === 'addfield') {\n e.preventDefault();\n createNewField(roleHolder, component, area, itemid);\n\n return;\n }\n\n if (roleHolder.dataset.role === 'editfield') {\n e.preventDefault();\n editField(roleHolder, component, area, itemid);\n\n return;\n }\n });\n\n setupSortableLists(rootNode, component, area, itemid);\n};\n"],"names":["_modalform","_interopRequireDefault","_notification","_pending","_sortable_list","_templates","_jquery","confirmDelete","id","type","component","area","itemid","pendingPromise","Pending","default","_str","get_strings","key","then","strings","Notification","confirm","pendingDeletePromise","_ajax","call","methodname","args","response","Templates","render","html","js","replaceNode","resolve","catch","exception","getCategoryNameFor","nodeElement","closest","find","attr","rootNode","document","querySelector","dataset","addEventListener","e","roleHolder","target","role","preventDefault","createNewCategory","element","returnFocus","form","ModalForm","formClass","categoryid","getAttribute","modalConfig","title","get_string","events","FORM_SUBMITTED","pendingCreatedPromise","window","location","reload","show","createNewField","editField","SortableList","moveHandlerSelector","getElementName","Promise","on","EVENTS","DROP","evt","info","positionChanged","data","beforeid","targetNextElement","stopPropagation","getDestinationName","parentElement","afterElement","length","Number","targetList","DRAG","querySelectorAll","forEach","category","fields","noFields","remove","innerHTML","DRAGSTART","setTimeout","width","setupSortableLists"],"mappings":"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"} \ No newline at end of file diff --git a/enrol/manual/amd/build/form-potential-user-selector.min.js.map b/enrol/manual/amd/build/form-potential-user-selector.min.js.map index d1b597c55a4..e3b27f4fe20 100644 --- a/enrol/manual/amd/build/form-potential-user-selector.min.js.map +++ b/enrol/manual/amd/build/form-potential-user-selector.min.js.map @@ -1 +1 @@ -{"version":3,"file":"form-potential-user-selector.min.js","sources":["../src/form-potential-user-selector.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 * Potential user selector module.\n *\n * @module enrol_manual/form-potential-user-selector\n * @copyright 2016 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates', 'core/str'], function($, Ajax, Templates, Str) {\n\n return /** @alias module:enrol_manual/form-potential-user-selector */ {\n\n processResults: function(selector, results) {\n var users = [];\n if ($.isArray(results)) {\n $.each(results, function(index, user) {\n users.push({\n value: user.id,\n label: user._label\n });\n });\n return users;\n\n } else {\n return results;\n }\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n var courseid = $(selector).attr('courseid');\n var userfields = $(selector).attr('userfields').split(',');\n if (typeof courseid === \"undefined\") {\n courseid = '1';\n }\n var enrolid = $(selector).attr('enrolid');\n if (typeof enrolid === \"undefined\") {\n enrolid = '';\n }\n var perpage = parseInt($(selector).attr('perpage'));\n if (isNaN(perpage)) {\n perpage = 100;\n }\n\n promise = Ajax.call([{\n methodname: 'core_enrol_get_potential_users',\n args: {\n courseid: courseid,\n enrolid: enrolid,\n search: query,\n searchanywhere: true,\n page: 0,\n perpage: perpage + 1\n }\n }]);\n\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n if (results.length <= perpage) {\n // Render the label.\n const profileRegex = /^profile_field_(.*)$/;\n $.each(results, function(index, user) {\n var ctx = user,\n identity = [];\n $.each(userfields, function(i, k) {\n const result = profileRegex.exec(k);\n if (result) {\n if (user.customfields) {\n user.customfields.forEach(function(customfield) {\n if (customfield.shortname === result[1]) {\n ctx.hasidentity = true;\n identity.push(customfield.value);\n }\n\n });\n }\n } else {\n if (typeof user[k] !== 'undefined' && user[k] !== '') {\n ctx.hasidentity = true;\n identity.push(user[k]);\n }\n }\n });\n ctx.identity = identity.join(', ');\n promises.push(Templates.render('enrol_manual/form-user-selector-suggestion', ctx));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results, function(index, user) {\n user._label = args[i];\n i++;\n });\n success(results);\n return;\n });\n\n } else {\n return Str.get_string('toomanyuserstoshow', 'core', '>' + perpage).then(function(toomanyuserstoshow) {\n success(toomanyuserstoshow);\n return;\n });\n }\n\n }).fail(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","Templates","Str","processResults","selector","results","users","isArray","each","index","user","push","value","id","label","_label","transport","query","success","failure","courseid","attr","userfields","split","enrolid","perpage","parseInt","isNaN","call","methodname","args","search","searchanywhere","page","then","promises","i","length","profileRegex","ctx","identity","k","result","exec","customfields","forEach","customfield","shortname","hasidentity","join","render","when","apply","arguments","get_string","toomanyuserstoshow","fail"],"mappings":";;;;;;;AAuBAA,mDAAO,CAAC,SAAU,YAAa,iBAAkB,aAAa,SAASC,EAAGC,KAAMC,UAAWC,WAEjB,CAElEC,eAAgB,SAASC,SAAUC,aAC3BC,MAAQ,UACRP,EAAEQ,QAAQF,UACVN,EAAES,KAAKH,SAAS,SAASI,MAAOC,MAC5BJ,MAAMK,KAAK,CACPC,MAAOF,KAAKG,GACZC,MAAOJ,KAAKK,YAGbT,OAGAD,SAIfW,UAAW,SAASZ,SAAUa,MAAOC,QAASC,aAEtCC,SAAWrB,EAAEK,UAAUiB,KAAK,YAC5BC,WAAavB,EAAEK,UAAUiB,KAAK,cAAcE,MAAM,UAC9B,IAAbH,WACPA,SAAW,SAEXI,QAAUzB,EAAEK,UAAUiB,KAAK,gBACR,IAAZG,UACPA,QAAU,QAEVC,QAAUC,SAAS3B,EAAEK,UAAUiB,KAAK,YACpCM,MAAMF,WACNA,QAAU,KAGJzB,KAAK4B,KAAK,CAAC,CACjBC,WAAY,iCACZC,KAAM,CACFV,SAAUA,SACVI,QAASA,QACTO,OAAQd,MACRe,gBAAgB,EAChBC,KAAM,EACNR,QAASA,QAAU,MAInB,GAAGS,MAAK,SAAS7B,aACjB8B,SAAW,GACXC,EAAI,KAEJ/B,QAAQgC,QAAUZ,QAAS,KAErBa,aAAe,8BACrBvC,EAAES,KAAKH,SAAS,SAASI,MAAOC,UACxB6B,IAAM7B,KACN8B,SAAW,GACfzC,EAAES,KAAKc,YAAY,SAASc,EAAGK,OACrBC,OAASJ,aAAaK,KAAKF,GAC7BC,OACIhC,KAAKkC,cACLlC,KAAKkC,aAAaC,SAAQ,SAASC,aAC3BA,YAAYC,YAAcL,OAAO,KACjCH,IAAIS,aAAc,EAClBR,SAAS7B,KAAKmC,YAAYlC,gBAMf,IAAZF,KAAK+B,IAAkC,KAAZ/B,KAAK+B,KACvCF,IAAIS,aAAc,EAClBR,SAAS7B,KAAKD,KAAK+B,QAI/BF,IAAIC,SAAWA,SAASS,KAAK,MAC7Bd,SAASxB,KAAKV,UAAUiD,OAAO,6CAA8CX,SAI1ExC,EAAEoD,KAAKC,MAAMrD,EAAEoD,KAAMhB,UAAUD,MAAK,eACnCJ,KAAOuB,UACXtD,EAAES,KAAKH,SAAS,SAASI,MAAOC,MAC5BA,KAAKK,OAASe,KAAKM,GACnBA,OAEJlB,QAAQb,mBAKLH,IAAIoD,WAAW,qBAAsB,OAAQ,IAAM7B,SAASS,MAAK,SAASqB,oBAC7ErC,QAAQqC,0BAKjBC,KAAKrC"} \ No newline at end of file +{"version":3,"file":"form-potential-user-selector.min.js","sources":["../src/form-potential-user-selector.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 * Potential user selector module.\n *\n * @module enrol_manual/form-potential-user-selector\n * @copyright 2016 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates', 'core/str'], function($, Ajax, Templates, Str) {\n\n return /** @alias module:enrol_manual/form-potential-user-selector */ {\n\n processResults: function(selector, results) {\n var users = [];\n if ($.isArray(results)) {\n $.each(results, function(index, user) {\n users.push({\n value: user.id,\n label: user._label\n });\n });\n return users;\n\n } else {\n return results;\n }\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n var courseid = $(selector).attr('courseid');\n var userfields = $(selector).attr('userfields').split(',');\n if (typeof courseid === \"undefined\") {\n courseid = '1';\n }\n var enrolid = $(selector).attr('enrolid');\n if (typeof enrolid === \"undefined\") {\n enrolid = '';\n }\n var perpage = parseInt($(selector).attr('perpage'));\n if (isNaN(perpage)) {\n perpage = 100;\n }\n\n promise = Ajax.call([{\n methodname: 'core_enrol_get_potential_users',\n args: {\n courseid: courseid,\n enrolid: enrolid,\n search: query,\n searchanywhere: true,\n page: 0,\n perpage: perpage + 1\n }\n }]);\n\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n if (results.length <= perpage) {\n // Render the label.\n const profileRegex = /^profile_field_(.*)$/;\n $.each(results, function(index, user) {\n var ctx = user,\n identity = [];\n $.each(userfields, function(i, k) {\n const result = profileRegex.exec(k);\n if (result) {\n if (user.customfields) {\n user.customfields.forEach(function(customfield) {\n if (customfield.shortname === result[1]) {\n ctx.hasidentity = true;\n identity.push(customfield.value);\n }\n\n });\n }\n } else {\n if (typeof user[k] !== 'undefined' && user[k] !== '') {\n ctx.hasidentity = true;\n identity.push(user[k]);\n }\n }\n });\n ctx.identity = identity.join(', ');\n promises.push(Templates.render('enrol_manual/form-user-selector-suggestion', ctx));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results, function(index, user) {\n user._label = args[i];\n i++;\n });\n success(results);\n return;\n });\n\n } else {\n return Str.get_string('toomanyuserstoshow', 'core', '>' + perpage).then(function(toomanyuserstoshow) {\n success(toomanyuserstoshow);\n return;\n });\n }\n\n }).fail(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","Templates","Str","processResults","selector","results","users","isArray","each","index","user","push","value","id","label","_label","transport","query","success","failure","courseid","attr","userfields","split","enrolid","perpage","parseInt","isNaN","call","methodname","args","search","searchanywhere","page","then","promises","i","length","profileRegex","ctx","identity","k","result","exec","customfields","forEach","customfield","shortname","hasidentity","join","render","when","apply","arguments","get_string","toomanyuserstoshow","fail"],"mappings":";;;;;;;AAuBAA,mDAAO,CAAC,SAAU,YAAa,iBAAkB,aAAa,SAASC,EAAGC,KAAMC,UAAWC,KAEjB,MAAA,CAElEC,eAAgB,SAASC,SAAUC,SAC3BC,IAAAA,MAAQ,GACZ,OAAIP,EAAEQ,QAAQF,UACVN,EAAES,KAAKH,SAAS,SAASI,MAAOC,MAC5BJ,MAAMK,KAAK,CACPC,MAAOF,KAAKG,GACZC,MAAOJ,KAAKK,QAEnB,IACMT,OAGAD,OAdmD,EAkBlEW,UAAW,SAASZ,SAAUa,MAAOC,QAASC,SAC1C,IACIC,SAAWrB,EAAEK,UAAUiB,KAAK,YAC5BC,WAAavB,EAAEK,UAAUiB,KAAK,cAAcE,MAAM,UAC9B,IAAbH,WACPA,SAAW,KAEXI,IAAAA,QAAUzB,EAAEK,UAAUiB,KAAK,gBACR,IAAZG,UACPA,QAAU,IAEd,IAAIC,QAAUC,SAAS3B,EAAEK,UAAUiB,KAAK,YACpCM,MAAMF,WACNA,QAAU,KAGJzB,KAAK4B,KAAK,CAAC,CACjBC,WAAY,iCACZC,KAAM,CACFV,SAAUA,SACVI,QAASA,QACTO,OAAQd,MACRe,gBAAgB,EAChBC,KAAM,EACNR,QAASA,QAAU,MAInB,GAAGS,MAAK,SAAS7B,SACjB8B,IAAAA,SAAW,GACXC,EAAI,EAER,GAAI/B,QAAQgC,QAAUZ,QAAS,CAErBa,IAAAA,aAAe,uBA4BrB,OA3BAvC,EAAES,KAAKH,SAAS,SAASI,MAAOC,MACxB6B,IAAAA,IAAM7B,KACN8B,SAAW,GACfzC,EAAES,KAAKc,YAAY,SAASc,EAAGK,GAC3B,IAAMC,OAASJ,aAAaK,KAAKF,GAC7BC,OACIhC,KAAKkC,cACLlC,KAAKkC,aAAaC,SAAQ,SAASC,aAC3BA,YAAYC,YAAcL,OAAO,KACjCH,IAAIS,aAAc,EAClBR,SAAS7B,KAAKmC,YAAYlC,OAGjC,SAGkB,IAAZF,KAAK+B,IAAkC,KAAZ/B,KAAK+B,KACvCF,IAAIS,aAAc,EAClBR,SAAS7B,KAAKD,KAAK+B,IAG9B,IACDF,IAAIC,SAAWA,SAASS,KAAK,MAC7Bd,SAASxB,KAAKV,UAAUiD,OAAO,6CAA8CX,KAChF,IAGMxC,EAAEoD,KAAKC,MAAMrD,EAAEoD,KAAMhB,UAAUD,MAAK,WACnCJ,IAAAA,KAAOuB,UACXtD,EAAES,KAAKH,SAAS,SAASI,MAAOC,MAC5BA,KAAKK,OAASe,KAAKM,GACnBA,GACH,IACDlB,QAAQb,QAEX,GAEJ,CACG,OAAOH,IAAIoD,WAAW,qBAAsB,OAAQ,IAAM7B,SAASS,MAAK,SAASqB,oBAC7ErC,QAAQqC,mBAEX,GAGR,IAAEC,KAAKrC,QACX,EAIR"} \ No newline at end of file diff --git a/enrol/manual/amd/build/quickenrolment.min.js.map b/enrol/manual/amd/build/quickenrolment.min.js.map index b6232cd7c34..8947d1150ec 100644 --- a/enrol/manual/amd/build/quickenrolment.min.js.map +++ b/enrol/manual/amd/build/quickenrolment.min.js.map @@ -1 +1 @@ -{"version":3,"file":"quickenrolment.min.js","sources":["../src/quickenrolment.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 * Quick enrolment AMD module.\n *\n * @module enrol_manual/quickenrolment\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport * as DynamicTable from 'core_table/dynamic';\nimport * as Str from 'core/str';\nimport * as Toast from 'core/toast';\nimport Config from 'core/config';\nimport Fragment from 'core/fragment';\nimport ModalEvents from 'core/modal_events';\nimport ModalFactory from 'core/modal_factory';\nimport Notification from 'core/notification';\nimport jQuery from 'jquery';\nimport Pending from 'core/pending';\nimport Prefetch from 'core/prefetch';\n\nconst Selectors = {\n cohortSelector: \"#id_cohortlist\",\n triggerButtons: \".enrolusersbutton.enrol_manual_plugin [type='submit']\",\n unwantedHiddenFields: \"input[value='_qf__force_multiselect_submission']\",\n buttonWrapper: '[data-region=\"wrapper\"]',\n};\n\n/**\n * Get the content of the body for the specified context.\n *\n * @param {Number} contextId\n * @returns {Promise}\n */\nconst getBodyForContext = contextId => {\n return Fragment.loadFragment('enrol_manual', 'enrol_users_form', contextId, {});\n};\n\n/**\n * Get the dynamic table for the button.\n *\n * @param {HTMLElement} element\n * @returns {HTMLElement}\n */\nconst getDynamicTableForElement = element => {\n const wrapper = element.closest(Selectors.buttonWrapper);\n\n return DynamicTable.getTableFromId(wrapper.dataset.tableUniqueid);\n};\n\n/**\n * Register the event listeners for this contextid.\n *\n * @param {Number} contextId\n */\nconst registerEventListeners = contextId => {\n document.addEventListener('click', e => {\n if (e.target.closest(Selectors.triggerButtons)) {\n e.preventDefault();\n\n showModal(getDynamicTableForElement(e.target), contextId);\n\n return;\n }\n });\n};\n\n/**\n * Display the modal for this contextId.\n *\n * @param {HTMLElement} dynamicTable The table to beb refreshed when changes are made\n * @param {Number} contextId\n * @returns {Promise}\n */\nconst showModal = (dynamicTable, contextId) => {\n const pendingPromise = new Pending('enrol_manual/quickenrolment:showModal');\n\n return ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n large: true,\n title: Str.get_string('enrolusers', 'enrol_manual'),\n body: getBodyForContext(contextId),\n buttons: {\n save: Str.get_string('enrolusers', 'enrol_manual'),\n }\n })\n .then(modal => {\n modal.getRoot().on(ModalEvents.save, e => {\n // Trigger a form submission, so that any mform elements can do final tricks before the form submission\n // is processed.\n // The actual submit even tis captured in the next handler.\n\n e.preventDefault();\n modal.getRoot().find('form').submit();\n });\n\n modal.getRoot().on('submit', 'form', e => {\n e.preventDefault();\n\n submitFormAjax(dynamicTable, modal);\n });\n\n modal.getRoot().on(ModalEvents.hidden, () => {\n modal.destroy();\n });\n\n modal.show();\n\n return modal;\n })\n .then(modal => Promise.all([modal, modal.getBodyPromise()]))\n .then(([modal, body]) => {\n if (body.get(0).querySelector(Selectors.cohortSelector)) {\n return modal.setSaveButtonText(Str.get_string('enroluserscohorts', 'enrol_manual')).then(() => modal);\n }\n\n return modal;\n })\n .then(modal => {\n pendingPromise.resolve();\n\n return modal;\n })\n .catch(Notification.exception);\n};\n\n/**\n * Submit the form via ajax.\n *\n * @param {HTMLElement} dynamicTable\n * @param {Object} modal\n */\nconst submitFormAjax = (dynamicTable, modal) => {\n // Note: We use a jQuery object here so that we can use its serialize functionality.\n const form = modal.getRoot().find('form');\n\n // Before send the data through AJAX, we need to parse and remove some unwanted hidden fields.\n // This hidden fields are added automatically by mforms and when it reaches the AJAX we get an error.\n form.get(0).querySelectorAll(Selectors.unwantedHiddenFields).forEach(hiddenField => hiddenField.remove());\n\n modal.hide();\n modal.destroy();\n\n jQuery.ajax(\n `${Config.wwwroot}/enrol/manual/ajax.php?${form.serialize()}`,\n {\n type: 'GET',\n processData: false,\n contentType: \"application/json\",\n }\n )\n .then(response => {\n if (response.error) {\n throw new Error(response.error);\n }\n\n return response.count;\n })\n .then(count => {\n return Promise.all([\n Str.get_string('totalenrolledusers', 'enrol', count),\n DynamicTable.refreshTableContent(dynamicTable),\n ]);\n })\n .then(([notificationBody]) => notificationBody)\n .then(notificationBody => Toast.add(notificationBody))\n .catch(error => {\n Notification.addNotification({\n message: error.message,\n type: 'error',\n });\n });\n};\n\n/**\n * Set up quick enrolment for the manual enrolment plugin.\n *\n * @param {Number} contextid The context id to setup for\n */\nexport const init = ({contextid}) => {\n registerEventListeners(contextid);\n\n Prefetch.prefetchStrings('enrol_manual', [\n 'enrolusers',\n 'enroluserscohorts',\n ]);\n\n Prefetch.prefetchString('enrol', 'totalenrolledusers');\n};\n"],"names":["Selectors","getBodyForContext","contextId","Fragment","loadFragment","registerEventListeners","document","addEventListener","e","target","closest","preventDefault","showModal","element","wrapper","DynamicTable","getTableFromId","dataset","tableUniqueid","dynamicTable","pendingPromise","Pending","ModalFactory","create","type","types","SAVE_CANCEL","large","title","Str","get_string","body","buttons","save","then","modal","getRoot","on","ModalEvents","find","submit","submitFormAjax","hidden","destroy","show","Promise","all","getBodyPromise","get","querySelector","setSaveButtonText","resolve","catch","Notification","exception","form","querySelectorAll","forEach","hiddenField","remove","hide","ajax","Config","wwwroot","serialize","processData","contentType","response","error","Error","count","refreshTableContent","notificationBody","Toast","add","addNotification","message","contextid","prefetchStrings","prefetchString"],"mappings":"yyGAkCMA,yBACc,iBADdA,yBAEc,wDAFdA,+BAGoB,mDAHpBA,wBAIa,0BASbC,kBAAoB,SAAAC,kBACfC,kBAASC,aAAa,eAAgB,mBAAoBF,UAAW,KAoB1EG,uBAAyB,SAAAH,WAC3BI,SAASC,iBAAiB,SAAS,SAAAC,MAC3BA,EAAEC,OAAOC,QAAQV,iCACjBQ,EAAEG,sBAEFC,WAhBsBC,QAgBcL,EAAEC,OAfxCK,QAAUD,QAAQH,QAAQV,yBAEzBe,aAAaC,eAAeF,QAAQG,QAAQC,gBAaIhB,WAhBzB,IAAAW,QACxBC,YA6BJF,UAAY,SAACO,aAAcjB,eACvBkB,eAAiB,IAAIC,iBAAQ,gDAE5BC,uBAAaC,OAAO,CACvBC,KAAMF,uBAAaG,MAAMC,YACzBC,OAAO,EACPC,MAAOC,IAAIC,WAAW,aAAc,gBACpCC,KAAM9B,kBAAkBC,WACxB8B,QAAS,CACLC,KAAMJ,IAAIC,WAAW,aAAc,mBAG1CI,MAAK,SAAAC,cACFA,MAAMC,UAAUC,GAAGC,sBAAYL,MAAM,SAAAzB,GAKjCA,EAAEG,iBACFwB,MAAMC,UAAUG,KAAK,QAAQC,YAGjCL,MAAMC,UAAUC,GAAG,SAAU,QAAQ,SAAA7B,GACjCA,EAAEG,iBAEF8B,eAAetB,aAAcgB,UAGjCA,MAAMC,UAAUC,GAAGC,sBAAYI,QAAQ,WACnCP,MAAMQ,aAGVR,MAAMS,OAECT,SAEVD,MAAK,SAAAC,cAASU,QAAQC,IAAI,CAACX,MAAOA,MAAMY,sBACxCb,MAAK,gDAAEC,+BACKa,IAAI,GAAGC,cAAcjD,0BACnBmC,MAAMe,kBAAkBrB,IAAIC,WAAW,oBAAqB,iBAAiBI,MAAK,kBAAMC,SAG5FA,SAEVD,MAAK,SAAAC,cACFf,eAAe+B,UAERhB,SAEViB,MAAMC,sBAAaC,YASlBb,eAAiB,SAACtB,aAAcgB,WAE5BoB,KAAOpB,MAAMC,UAAUG,KAAK,QAIlCgB,KAAKP,IAAI,GAAGQ,iBAAiBxD,gCAAgCyD,SAAQ,SAAAC,oBAAeA,YAAYC,YAEhGxB,MAAMyB,OACNzB,MAAMQ,0BAECkB,eACAC,gBAAOC,0CAAiCR,KAAKS,aAChD,CACIxC,KAAM,MACNyC,aAAa,EACbC,YAAa,qBAGpBhC,MAAK,SAAAiC,aACEA,SAASC,YACH,IAAIC,MAAMF,SAASC,cAGtBD,SAASG,SAEnBpC,MAAK,SAAAoC,cACKzB,QAAQC,IAAI,CACfjB,IAAIC,WAAW,qBAAsB,QAASwC,OAC9CvD,aAAawD,oBAAoBpD,mBAGxCe,MAAK,qDACLA,MAAK,SAAAsC,yBAAoBC,MAAMC,IAAIF,qBACnCpB,OAAM,SAAAgB,6BACUO,gBAAgB,CACzBC,QAASR,MAAMQ,QACfpD,KAAM,4BAUE,oBAAEqD,gBAAAA,UAClBxE,uBAAuBwE,6BAEdC,gBAAgB,eAAgB,CACrC,aACA,wCAGKC,eAAe,QAAS"} \ No newline at end of file +{"version":3,"file":"quickenrolment.min.js","sources":["../src/quickenrolment.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 * Quick enrolment AMD module.\n *\n * @module enrol_manual/quickenrolment\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport * as DynamicTable from 'core_table/dynamic';\nimport * as Str from 'core/str';\nimport * as Toast from 'core/toast';\nimport Config from 'core/config';\nimport Fragment from 'core/fragment';\nimport ModalEvents from 'core/modal_events';\nimport ModalFactory from 'core/modal_factory';\nimport Notification from 'core/notification';\nimport jQuery from 'jquery';\nimport Pending from 'core/pending';\nimport Prefetch from 'core/prefetch';\n\nconst Selectors = {\n cohortSelector: \"#id_cohortlist\",\n triggerButtons: \".enrolusersbutton.enrol_manual_plugin [type='submit']\",\n unwantedHiddenFields: \"input[value='_qf__force_multiselect_submission']\",\n buttonWrapper: '[data-region=\"wrapper\"]',\n};\n\n/**\n * Get the content of the body for the specified context.\n *\n * @param {Number} contextId\n * @returns {Promise}\n */\nconst getBodyForContext = contextId => {\n return Fragment.loadFragment('enrol_manual', 'enrol_users_form', contextId, {});\n};\n\n/**\n * Get the dynamic table for the button.\n *\n * @param {HTMLElement} element\n * @returns {HTMLElement}\n */\nconst getDynamicTableForElement = element => {\n const wrapper = element.closest(Selectors.buttonWrapper);\n\n return DynamicTable.getTableFromId(wrapper.dataset.tableUniqueid);\n};\n\n/**\n * Register the event listeners for this contextid.\n *\n * @param {Number} contextId\n */\nconst registerEventListeners = contextId => {\n document.addEventListener('click', e => {\n if (e.target.closest(Selectors.triggerButtons)) {\n e.preventDefault();\n\n showModal(getDynamicTableForElement(e.target), contextId);\n\n return;\n }\n });\n};\n\n/**\n * Display the modal for this contextId.\n *\n * @param {HTMLElement} dynamicTable The table to beb refreshed when changes are made\n * @param {Number} contextId\n * @returns {Promise}\n */\nconst showModal = (dynamicTable, contextId) => {\n const pendingPromise = new Pending('enrol_manual/quickenrolment:showModal');\n\n return ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n large: true,\n title: Str.get_string('enrolusers', 'enrol_manual'),\n body: getBodyForContext(contextId),\n buttons: {\n save: Str.get_string('enrolusers', 'enrol_manual'),\n }\n })\n .then(modal => {\n modal.getRoot().on(ModalEvents.save, e => {\n // Trigger a form submission, so that any mform elements can do final tricks before the form submission\n // is processed.\n // The actual submit even tis captured in the next handler.\n\n e.preventDefault();\n modal.getRoot().find('form').submit();\n });\n\n modal.getRoot().on('submit', 'form', e => {\n e.preventDefault();\n\n submitFormAjax(dynamicTable, modal);\n });\n\n modal.getRoot().on(ModalEvents.hidden, () => {\n modal.destroy();\n });\n\n modal.show();\n\n return modal;\n })\n .then(modal => Promise.all([modal, modal.getBodyPromise()]))\n .then(([modal, body]) => {\n if (body.get(0).querySelector(Selectors.cohortSelector)) {\n return modal.setSaveButtonText(Str.get_string('enroluserscohorts', 'enrol_manual')).then(() => modal);\n }\n\n return modal;\n })\n .then(modal => {\n pendingPromise.resolve();\n\n return modal;\n })\n .catch(Notification.exception);\n};\n\n/**\n * Submit the form via ajax.\n *\n * @param {HTMLElement} dynamicTable\n * @param {Object} modal\n */\nconst submitFormAjax = (dynamicTable, modal) => {\n // Note: We use a jQuery object here so that we can use its serialize functionality.\n const form = modal.getRoot().find('form');\n\n // Before send the data through AJAX, we need to parse and remove some unwanted hidden fields.\n // This hidden fields are added automatically by mforms and when it reaches the AJAX we get an error.\n form.get(0).querySelectorAll(Selectors.unwantedHiddenFields).forEach(hiddenField => hiddenField.remove());\n\n modal.hide();\n modal.destroy();\n\n jQuery.ajax(\n `${Config.wwwroot}/enrol/manual/ajax.php?${form.serialize()}`,\n {\n type: 'GET',\n processData: false,\n contentType: \"application/json\",\n }\n )\n .then(response => {\n if (response.error) {\n throw new Error(response.error);\n }\n\n return response.count;\n })\n .then(count => {\n return Promise.all([\n Str.get_string('totalenrolledusers', 'enrol', count),\n DynamicTable.refreshTableContent(dynamicTable),\n ]);\n })\n .then(([notificationBody]) => notificationBody)\n .then(notificationBody => Toast.add(notificationBody))\n .catch(error => {\n Notification.addNotification({\n message: error.message,\n type: 'error',\n });\n });\n};\n\n/**\n * Set up quick enrolment for the manual enrolment plugin.\n *\n * @param {Number} contextid The context id to setup for\n */\nexport const init = ({contextid}) => {\n registerEventListeners(contextid);\n\n Prefetch.prefetchStrings('enrol_manual', [\n 'enrolusers',\n 'enroluserscohorts',\n ]);\n\n Prefetch.prefetchString('enrol', 'totalenrolledusers');\n};\n"],"names":["DynamicTable","_interopRequireWildcard","Str","Toast","_config","_interopRequireDefault","_fragment","_modal_events","_modal_factory","_notification","_jquery","_pending","_prefetch","Selectors","getBodyForContext","contextId","Fragment","loadFragment","registerEventListeners","document","addEventListener","e","target","closest","preventDefault","showModal","element","wrapper","getTableFromId","dataset","tableUniqueid","dynamicTable","pendingPromise","Pending","default","ModalFactory","create","type","types","SAVE_CANCEL","large","title","get_string","body","buttons","save","then","modal","getRoot","on","ModalEvents","find","submit","submitFormAjax","hidden","destroy","show","Promise","all","getBodyPromise","_ref","_ref2","_slicedToArray","get","querySelector","setSaveButtonText","resolve","catch","Notification","exception","form","querySelectorAll","forEach","hiddenField","remove","hide","ajax","Config","wwwroot","serialize","processData","contentType","response","error","Error","count","refreshTableContent","_ref3","notificationBody","add","addNotification","message","_ref5","contextid","prefetchStrings","Prefetch","prefetchString"],"mappings":"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"} \ No newline at end of file diff --git a/grade/amd/build/edittree_index.min.js.map b/grade/amd/build/edittree_index.min.js.map index 7fcedd49beb..83725a9a783 100644 --- a/grade/amd/build/edittree_index.min.js.map +++ b/grade/amd/build/edittree_index.min.js.map @@ -1 +1 @@ -{"version":3,"file":"edittree_index.min.js","sources":["../src/edittree_index.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 * Enhance the gradebook tree setup with various facilities.\n *\n * @module core_grades/edittree_index\n * @copyright 2016 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n], function($) {\n /**\n * Enhance the edittree functionality.\n *\n * @method edittree\n */\n var edittree = function() {\n // Watch for the weight override checkboxes.\n $('body').on('change', '.weightoverride', edittree.toggleWeightInput);\n\n // Watch changes to the bulk move menu and submit.\n $('#menumoveafter').on('change', function() {\n var form = $(this).closest('form'),\n bulkmove = form.find('#bulkmoveinput');\n\n bulkmove.val(1);\n form.submit();\n });\n };\n\n /**\n * Toggle the weight input field based on its checkbox.\n *\n * @method toggleWeightInput\n * @param {EventFacade} e\n * @private\n */\n edittree.toggleWeightInput = function(e) {\n e.preventDefault();\n var node = $(this),\n row = node.closest('tr');\n\n $('input[name=\"weight_' + row.data('itemid') + '\"]').prop('disabled', !node.prop('checked'));\n };\n\n return /** @alias module:core_grades/edittree_index */ {\n enhance: edittree\n };\n});\n"],"names":["define","$","edittree","on","toggleWeightInput","form","this","closest","find","val","submit","e","preventDefault","node","row","data","prop","enhance"],"mappings":";;;;;;;AAsBAA,oCAAO,CACH,WACD,SAASC,OAMJC,SAAW,SAAXA,WAEAD,EAAE,QAAQE,GAAG,SAAU,kBAAmBD,SAASE,mBAGnDH,EAAE,kBAAkBE,GAAG,UAAU,eACzBE,KAAOJ,EAAEK,MAAMC,QAAQ,QACZF,KAAKG,KAAK,kBAEhBC,IAAI,GACbJ,KAAKK,oBAWbR,SAASE,kBAAoB,SAASO,GAClCA,EAAEC,qBACEC,KAAOZ,EAAEK,MACTQ,IAAMD,KAAKN,QAAQ,MAEvBN,EAAE,sBAAwBa,IAAIC,KAAK,UAAY,MAAMC,KAAK,YAAaH,KAAKG,KAAK,aAG9B,CACnDC,QAASf"} \ No newline at end of file +{"version":3,"file":"edittree_index.min.js","sources":["../src/edittree_index.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 * Enhance the gradebook tree setup with various facilities.\n *\n * @module core_grades/edittree_index\n * @copyright 2016 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n], function($) {\n /**\n * Enhance the edittree functionality.\n *\n * @method edittree\n */\n var edittree = function() {\n // Watch for the weight override checkboxes.\n $('body').on('change', '.weightoverride', edittree.toggleWeightInput);\n\n // Watch changes to the bulk move menu and submit.\n $('#menumoveafter').on('change', function() {\n var form = $(this).closest('form'),\n bulkmove = form.find('#bulkmoveinput');\n\n bulkmove.val(1);\n form.submit();\n });\n };\n\n /**\n * Toggle the weight input field based on its checkbox.\n *\n * @method toggleWeightInput\n * @param {EventFacade} e\n * @private\n */\n edittree.toggleWeightInput = function(e) {\n e.preventDefault();\n var node = $(this),\n row = node.closest('tr');\n\n $('input[name=\"weight_' + row.data('itemid') + '\"]').prop('disabled', !node.prop('checked'));\n };\n\n return /** @alias module:core_grades/edittree_index */ {\n enhance: edittree\n };\n});\n"],"names":["define","$","edittree","on","toggleWeightInput","form","this","closest","find","val","submit","e","preventDefault","node","row","data","prop","enhance"],"mappings":";;;;;;;AAsBAA,oCAAO,CACH,WACD,SAASC,GAMR,IAAIC,SAAW,SAAXA,WAEAD,EAAE,QAAQE,GAAG,SAAU,kBAAmBD,SAASE,mBAGnDH,EAAE,kBAAkBE,GAAG,UAAU,WACzBE,IAAAA,KAAOJ,EAAEK,MAAMC,QAAQ,QACZF,KAAKG,KAAK,kBAEhBC,IAAI,GACbJ,KAAKK,QACR,GACJ,EAiBsD,OARvDR,SAASE,kBAAoB,SAASO,GAClCA,EAAEC,iBACF,IAAIC,KAAOZ,EAAEK,MACTQ,IAAMD,KAAKN,QAAQ,MAEvBN,EAAE,sBAAwBa,IAAIC,KAAK,UAAY,MAAMC,KAAK,YAAaH,KAAKG,KAAK,WACpF,EAEsD,CACnDC,QAASf,SAEhB"} \ No newline at end of file diff --git a/grade/amd/build/grades/grader/gradingpanel/comparison.min.js.map b/grade/amd/build/grades/grader/gradingpanel/comparison.min.js.map index ef89d48eea3..5eb92950c44 100644 --- a/grade/amd/build/grades/grader/gradingpanel/comparison.min.js.map +++ b/grade/amd/build/grades/grader/gradingpanel/comparison.min.js.map @@ -1 +1 @@ -{"version":3,"file":"comparison.min.js","sources":["../../../../src/grades/grader/gradingpanel/comparison.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 * Compare a given form's values and its previously set data attributes.\n *\n * @module core_grades/grades/grader/gradingpanel/comparison\n * @copyright 2019 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nexport const fillInitialValues = (form) => {\n Array.prototype.forEach.call(form.elements, (input) => {\n if (input.type === 'submit' || input.type === 'button') {\n return;\n } else if (input.type === 'radio' || input.type === 'checkbox') {\n input.dataset.initialValue = JSON.stringify(input.checked);\n } else if (typeof input.value !== 'undefined') {\n input.dataset.initialValue = JSON.stringify(input.value);\n } else if (input.type === 'select-one') {\n Array.prototype.forEach.call(input.options, (option) => {\n option.dataset.initialValue = JSON.stringify(option.selected);\n });\n }\n });\n};\n\n\n/**\n * Compare the form data with the initial form data from when the form was set up.\n *\n * If values have changed, return a truthy value.\n *\n * @param {HTMLElement} form\n * @return {Boolean}\n */\nexport const compareData = (form) => {\n const result = Array.prototype.some.call(form.elements, (input) => {\n if (input.type === 'submit' || input.type === 'button') {\n return false;\n } else if (input.type === 'radio' || input.type === 'checkbox') {\n if (typeof input.dataset.initialValue !== 'undefined') {\n return input.dataset.initialValue !== JSON.stringify(input.checked);\n }\n } else if (typeof input.value !== 'undefined') {\n if (typeof input.dataset.initialValue !== 'undefined') {\n return input.dataset.initialValue !== JSON.stringify(input.value);\n }\n } else if (input.type === 'select-one') {\n return Array.prototype.some.call(input.options, (option) => {\n if (typeof option.dataset.initialValue !== 'undefined') {\n return option.dataset.initialValue !== JSON.stringify(option.selected);\n }\n\n return false;\n });\n }\n\n // No value found to check. Assume that there were changes.\n return true;\n });\n\n // Fill the initial values again as the form may not be reloaded.\n fillInitialValues(form);\n\n return result;\n};\n"],"names":["fillInitialValues","form","Array","prototype","forEach","call","elements","input","type","dataset","initialValue","JSON","stringify","checked","value","options","option","selected","result","some"],"mappings":";;;;;;;;IAuBaA,kBAAoB,SAACC,MAC9BC,MAAMC,UAAUC,QAAQC,KAAKJ,KAAKK,UAAU,SAACC,OACtB,WAAfA,MAAMC,MAAoC,WAAfD,MAAMC,OAEX,UAAfD,MAAMC,MAAmC,aAAfD,MAAMC,KACvCD,MAAME,QAAQC,aAAeC,KAAKC,UAAUL,MAAMM,cACpB,IAAhBN,MAAMO,MACpBP,MAAME,QAAQC,aAAeC,KAAKC,UAAUL,MAAMO,OAC5B,eAAfP,MAAMC,MACbN,MAAMC,UAAUC,QAAQC,KAAKE,MAAMQ,SAAS,SAACC,QACzCA,OAAOP,QAAQC,aAAeC,KAAKC,UAAUI,OAAOC,oFAezC,SAAChB,UAClBiB,OAAShB,MAAMC,UAAUgB,KAAKd,KAAKJ,KAAKK,UAAU,SAACC,UAClC,WAAfA,MAAMC,MAAoC,WAAfD,MAAMC,YAC1B,EACJ,GAAmB,UAAfD,MAAMC,MAAmC,aAAfD,MAAMC,cACG,IAA/BD,MAAME,QAAQC,oBACdH,MAAME,QAAQC,eAAiBC,KAAKC,UAAUL,MAAMM,cAE5D,QAA2B,IAAhBN,MAAMO,eACsB,IAA/BP,MAAME,QAAQC,oBACdH,MAAME,QAAQC,eAAiBC,KAAKC,UAAUL,MAAMO,YAE5D,GAAmB,eAAfP,MAAMC,YACNN,MAAMC,UAAUgB,KAAKd,KAAKE,MAAMQ,SAAS,SAACC,oBACF,IAAhCA,OAAOP,QAAQC,cACfM,OAAOP,QAAQC,eAAiBC,KAAKC,UAAUI,OAAOC,oBAQlE,YAIXjB,kBAAkBC,MAEXiB"} \ No newline at end of file +{"version":3,"file":"comparison.min.js","sources":["../../../../src/grades/grader/gradingpanel/comparison.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 * Compare a given form's values and its previously set data attributes.\n *\n * @module core_grades/grades/grader/gradingpanel/comparison\n * @copyright 2019 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nexport const fillInitialValues = (form) => {\n Array.prototype.forEach.call(form.elements, (input) => {\n if (input.type === 'submit' || input.type === 'button') {\n return;\n } else if (input.type === 'radio' || input.type === 'checkbox') {\n input.dataset.initialValue = JSON.stringify(input.checked);\n } else if (typeof input.value !== 'undefined') {\n input.dataset.initialValue = JSON.stringify(input.value);\n } else if (input.type === 'select-one') {\n Array.prototype.forEach.call(input.options, (option) => {\n option.dataset.initialValue = JSON.stringify(option.selected);\n });\n }\n });\n};\n\n\n/**\n * Compare the form data with the initial form data from when the form was set up.\n *\n * If values have changed, return a truthy value.\n *\n * @param {HTMLElement} form\n * @return {Boolean}\n */\nexport const compareData = (form) => {\n const result = Array.prototype.some.call(form.elements, (input) => {\n if (input.type === 'submit' || input.type === 'button') {\n return false;\n } else if (input.type === 'radio' || input.type === 'checkbox') {\n if (typeof input.dataset.initialValue !== 'undefined') {\n return input.dataset.initialValue !== JSON.stringify(input.checked);\n }\n } else if (typeof input.value !== 'undefined') {\n if (typeof input.dataset.initialValue !== 'undefined') {\n return input.dataset.initialValue !== JSON.stringify(input.value);\n }\n } else if (input.type === 'select-one') {\n return Array.prototype.some.call(input.options, (option) => {\n if (typeof option.dataset.initialValue !== 'undefined') {\n return option.dataset.initialValue !== JSON.stringify(option.selected);\n }\n\n return false;\n });\n }\n\n // No value found to check. Assume that there were changes.\n return true;\n });\n\n // Fill the initial values again as the form may not be reloaded.\n fillInitialValues(form);\n\n return result;\n};\n"],"names":["fillInitialValues","form","Array","prototype","forEach","call","elements","input","type","dataset","initialValue","JSON","stringify","checked","value","options","option","selected","result","some"],"mappings":";;;;;;;;AAuBO,IAAMA,kBAAoB,SAACC,MAC9BC,MAAMC,UAAUC,QAAQC,KAAKJ,KAAKK,UAAU,SAACC,OACtB,WAAfA,MAAMC,MAAoC,WAAfD,MAAMC,OAEX,UAAfD,MAAMC,MAAmC,aAAfD,MAAMC,KACvCD,MAAME,QAAQC,aAAeC,KAAKC,UAAUL,MAAMM,cACpB,IAAhBN,MAAMO,MACpBP,MAAME,QAAQC,aAAeC,KAAKC,UAAUL,MAAMO,OAC5B,eAAfP,MAAMC,MACbN,MAAMC,UAAUC,QAAQC,KAAKE,MAAMQ,SAAS,SAACC,QACzCA,OAAOP,QAAQC,aAAeC,KAAKC,UAAUI,OAAOC,SACvD,IAET,GACH,oEAW0B,SAAChB,MACxB,IAAMiB,OAAShB,MAAMC,UAAUgB,KAAKd,KAAKJ,KAAKK,UAAU,SAACC,OACjDA,GAAe,WAAfA,MAAMC,MAAoC,WAAfD,MAAMC,KACjC,OAAO,EACJ,GAAmB,UAAfD,MAAMC,MAAmC,aAAfD,MAAMC,MACnC,QAAsC,IAA/BD,MAAME,QAAQC,aACrB,OAAOH,MAAME,QAAQC,eAAiBC,KAAKC,UAAUL,MAAMM,cAE5D,QAA2B,IAAhBN,MAAMO,OAChB,QAAsC,IAA/BP,MAAME,QAAQC,aACrB,OAAOH,MAAME,QAAQC,eAAiBC,KAAKC,UAAUL,MAAMO,YAE5D,GAAmB,eAAfP,MAAMC,KACb,OAAON,MAAMC,UAAUgB,KAAKd,KAAKE,MAAMQ,SAAS,SAACC,QACzC,YAAuC,IAAhCA,OAAOP,QAAQC,cACfM,OAAOP,QAAQC,eAAiBC,KAAKC,UAAUI,OAAOC,SAIpE,IAIL,OAAO,CACV,IAKD,OAFAjB,kBAAkBC,MAEXiB,MACV"} \ No newline at end of file diff --git a/grade/amd/build/grades/grader/gradingpanel/normalise.min.js.map b/grade/amd/build/grades/grader/gradingpanel/normalise.min.js.map index dfa192bffc9..a7f68e472a7 100644 --- a/grade/amd/build/grades/grader/gradingpanel/normalise.min.js.map +++ b/grade/amd/build/grades/grader/gradingpanel/normalise.min.js.map @@ -1 +1 @@ -{"version":3,"file":"normalise.min.js","sources":["../../../../src/grades/grader/gradingpanel/normalise.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 * Error handling and normalisation of provided data.\n *\n * @module core_grades/grades/grader/gradingpanel/normalise\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Normalise a resultset for consumption by the grader.\n *\n * @param {Object} result The result returned from a grading web service\n * @return {Object}\n */\nexport const normaliseResult = result => {\n return {\n result,\n failed: !!result.warnings.length,\n success: !result.warnings.length,\n error: null,\n };\n};\n\n/**\n * Return the resultset used to describe an invalid result.\n *\n * @return {Object}\n */\nexport const invalidResult = () => {\n return {\n success: false,\n failed: false,\n result: {},\n error: null,\n };\n};\n\n/**\n * Return the resultset used to describe a failed update.\n *\n * @param {Object} error\n * @return {Object}\n */\nexport const failedUpdate = error => {\n return {\n success: false,\n failed: true,\n result: {},\n error,\n };\n};\n"],"names":["result","failed","warnings","length","success","error"],"mappings":"wPA6B+B,SAAAA,cACpB,CACHA,OAAAA,OACAC,SAAUD,OAAOE,SAASC,OAC1BC,SAAUJ,OAAOE,SAASC,OAC1BE,MAAO,8BASc,iBAClB,CACHD,SAAS,EACTH,QAAQ,EACRD,OAAQ,GACRK,MAAO,6BAUa,SAAAA,aACjB,CACHD,SAAS,EACTH,QAAQ,EACRD,OAAQ,GACRK,MAAAA"} \ No newline at end of file +{"version":3,"file":"normalise.min.js","sources":["../../../../src/grades/grader/gradingpanel/normalise.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 * Error handling and normalisation of provided data.\n *\n * @module core_grades/grades/grader/gradingpanel/normalise\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Normalise a resultset for consumption by the grader.\n *\n * @param {Object} result The result returned from a grading web service\n * @return {Object}\n */\nexport const normaliseResult = result => {\n return {\n result,\n failed: !!result.warnings.length,\n success: !result.warnings.length,\n error: null,\n };\n};\n\n/**\n * Return the resultset used to describe an invalid result.\n *\n * @return {Object}\n */\nexport const invalidResult = () => {\n return {\n success: false,\n failed: false,\n result: {},\n error: null,\n };\n};\n\n/**\n * Return the resultset used to describe a failed update.\n *\n * @param {Object} error\n * @return {Object}\n */\nexport const failedUpdate = error => {\n return {\n success: false,\n failed: true,\n result: {},\n error,\n };\n};\n"],"names":["result","failed","warnings","length","success","error"],"mappings":"wPA6B+B,SAAAA,QACpB,MAAA,CACHA,OAAAA,OACAC,SAAUD,OAAOE,SAASC,OAC1BC,SAAUJ,OAAOE,SAASC,OAC1BE,MAAO,KAEd,yBAO4B,WAClB,MAAA,CACHD,SAAS,EACTH,QAAQ,EACRD,OAAQ,CAHL,EAIHK,MAAO,KAEd,wBAQ2B,SAAAA,OACjB,MAAA,CACHD,SAAS,EACTH,QAAQ,EACRD,OAAQ,CAHL,EAIHK,MAAAA,MAEP"} \ No newline at end of file diff --git a/grade/amd/build/grades/grader/gradingpanel/point.min.js.map b/grade/amd/build/grades/grader/gradingpanel/point.min.js.map index 1e1f60f2532..95502923146 100644 --- a/grade/amd/build/grades/grader/gradingpanel/point.min.js.map +++ b/grade/amd/build/grades/grader/gradingpanel/point.min.js.map @@ -1 +1 @@ -{"version":3,"file":"point.min.js","sources":["../../../../src/grades/grader/gradingpanel/point.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 * Grading panel for simple direct grading.\n *\n * @module core_grades/grades/grader/gradingpanel/point\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {saveGrade, fetchGrade} from './repository';\nimport {compareData} from 'core_grades/grades/grader/gradingpanel/comparison';\n// Note: We use jQuery.serializer here until we can rewrite Ajax to use XHR.send()\nimport jQuery from 'jquery';\nimport {invalidResult} from './normalise';\n\n/**\n * Fetch the current grade for a user.\n *\n * @param {object} args\n * @param {String} args.component\n * @param {Number} args.context\n * @param {String} args.itemname\n * @param {Number} args.userId\n * @param {Element} args.rootNode\n * @returns {Object}\n */\nexport const fetchCurrentGrade = (...args) => fetchGrade('point')(...args);\n\n/**\n * Store a new grade for a user.\n *\n * @param {String} component\n * @param {Number} context\n * @param {String} itemname\n * @param {Number} userId\n * @param {Boolean} notifyUser\n * @param {Element} rootNode\n * @returns {Object}\n */\nexport const storeCurrentGrade = async(component, context, itemname, userId, notifyUser, rootNode) => {\n const form = rootNode.querySelector('form');\n const grade = form.querySelector('input[name=\"grade\"]');\n\n if (!grade.checkValidity() || !grade.value.trim()) {\n return invalidResult;\n }\n\n if (compareData(form) === true) {\n return await saveGrade('point')(component, context, itemname, userId, notifyUser, jQuery(form).serialize());\n } else {\n return '';\n }\n};\n"],"names":["storeCurrentGrade","component","context","itemname","userId","notifyUser","rootNode","form","querySelector","grade","checkValidity","value","trim","invalidResult","serialize"],"mappings":"soBAwCiC,kBAAa,0BAAW,8CAa5CA,+CAAoB,iBAAMC,UAAWC,QAASC,SAAUC,OAAQC,WAAYC,iIAC/EC,KAAOD,SAASE,cAAc,SAC9BC,MAAQF,KAAKC,cAAc,wBAEtBE,iBAAoBD,MAAME,MAAMC,8DAChCC,qCAGe,KAAtB,2BAAYN,sDACC,yBAAU,QAAV,CAAmBN,UAAWC,QAASC,SAAUC,OAAQC,YAAY,mBAAOE,MAAMO,2GAExF"} \ No newline at end of file +{"version":3,"file":"point.min.js","sources":["../../../../src/grades/grader/gradingpanel/point.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 * Grading panel for simple direct grading.\n *\n * @module core_grades/grades/grader/gradingpanel/point\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {saveGrade, fetchGrade} from './repository';\nimport {compareData} from 'core_grades/grades/grader/gradingpanel/comparison';\n// Note: We use jQuery.serializer here until we can rewrite Ajax to use XHR.send()\nimport jQuery from 'jquery';\nimport {invalidResult} from './normalise';\n\n/**\n * Fetch the current grade for a user.\n *\n * @param {object} args\n * @param {String} args.component\n * @param {Number} args.context\n * @param {String} args.itemname\n * @param {Number} args.userId\n * @param {Element} args.rootNode\n * @returns {Object}\n */\nexport const fetchCurrentGrade = (...args) => fetchGrade('point')(...args);\n\n/**\n * Store a new grade for a user.\n *\n * @param {String} component\n * @param {Number} context\n * @param {String} itemname\n * @param {Number} userId\n * @param {Boolean} notifyUser\n * @param {Element} rootNode\n * @returns {Object}\n */\nexport const storeCurrentGrade = async(component, context, itemname, userId, notifyUser, rootNode) => {\n const form = rootNode.querySelector('form');\n const grade = form.querySelector('input[name=\"grade\"]');\n\n if (!grade.checkValidity() || !grade.value.trim()) {\n return invalidResult;\n }\n\n if (compareData(form) === true) {\n return await saveGrade('point')(component, context, itemname, userId, notifyUser, jQuery(form).serialize());\n } else {\n return '';\n }\n};\n"],"names":["_jquery","_repository","fetchGrade","apply","arguments","_ref","storeCurrentGrade","regeneratorRuntime","mark","_callee","component","context","itemname","userId","notifyUser","rootNode","form","grade","wrap","_context","prev","next","querySelector","checkValidity","value","trim","abrupt","invalidResult","_comparison","compareData","default","serialize","sent","stop","_x","_x2","_x3","_x4","_x5","_x6","this"],"mappings":"mjBA0BAA,aAAAA,sEAciC,WAAa,OAAA,EAAAC,YAAAC,YAAW,SAAxBC,WAAA,EAAAC,UAAA,EAa1B,OAA0BC,KAApBC,sBAAoBC,mBAAAC,MAAA,SAAAC,QAAMC,UAAWC,QAASC,SAAUC,OAAQC,WAAYC,UAAxD,IAAAC,KAAAC,MAAA,OAAAV,mBAAAW,MAAA,SAAAC,UAAA,OAAA,OAAAA,SAAAC,KAAAD,SAAAE,MAAA,KAAA,EAAA,GACvBL,KAAOD,SAASO,cAAc,SAC9BL,MAAQD,KAAKM,cAAc,wBAEtBC,iBAAoBN,MAAMO,MAAMC,OAJd,CAAAN,SAAAE,KAAA,EAAA,KAAA,CAAA,OAAAF,SAAAO,OAAA,SAKlBC,WALkBA,eAAA,KAAA,EAQzB,IAAsB,KAAtB,EAAAC,YAAAC,aAAYb,MARa,CAAAG,SAAAE,KAAA,GAAA,KAAA,CAAA,OAAAF,SAAAE,KAAA,GASZ,yBAAU,QAAV,CAAmBX,UAAWC,QAASC,SAAUC,OAAQC,YAAY,EAAAd,QAAA8B,SAAOd,MAAMe,aATtE,KAAA,EAAA,OAAAZ,SAAAO,OAAA,SAAAP,SAAAa,MAAA,KAAA,GAAA,OAAAb,SAAAO,OAAA,SAWlB,IAXkB,KAAA,GAAA,IAAA,MAAA,OAAAP,SAAAc,OAAA,GAAAxB,QAAH,IAAGJ,oTAAH,SAAA6B,GAAAC,IAAAC,IAAAC,IAAAC,IAAAC,KAAA,OAAAlC,KAAAF,MAAAqC,KAAApC,UAAA"} \ No newline at end of file diff --git a/grade/amd/build/grades/grader/gradingpanel/repository.min.js.map b/grade/amd/build/grades/grader/gradingpanel/repository.min.js.map index 4a6861c549e..9a955405cde 100644 --- a/grade/amd/build/grades/grader/gradingpanel/repository.min.js.map +++ b/grade/amd/build/grades/grader/gradingpanel/repository.min.js.map @@ -1 +1 @@ -{"version":3,"file":"repository.min.js","sources":["../../../../src/grades/grader/gradingpanel/repository.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 * Repository for simple direct grading panel.\n *\n * @module core_grades/grades/grader/gradingpanel/repository\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {call as fetchMany} from 'core/ajax';\nimport {normaliseResult} from './normalise';\n\nexport const fetchGrade = type => (component, contextid, itemname, gradeduserid) => {\n return fetchMany([{\n methodname: `core_grades_grader_gradingpanel_${type}_fetch`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n },\n }])[0];\n};\n\nexport const saveGrade = type => async(component, contextid, itemname, gradeduserid, notifyUser, formdata) => {\n return normaliseResult(await fetchMany([{\n methodname: `core_grades_grader_gradingpanel_${type}_store`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n notifyuser: notifyUser,\n formdata,\n },\n }])[0]);\n};\n"],"names":["type","component","contextid","itemname","gradeduserid","methodname","args","notifyUser","formdata","normaliseResult","notifyuser"],"mappings":"2dAyB0B,SAAAA,aAAQ,SAACC,UAAWC,UAAWC,SAAUC,qBACxD,cAAU,CAAC,CACdC,qDAA+CL,eAC/CM,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,iBAEJ,wBAGiB,SAAAJ,yCAAQ,iBAAMC,UAAWC,UAAWC,SAAUC,aAAcG,WAAYC,kIACtFC,4CAAsB,cAAU,CAAC,CACpCJ,qDAA+CL,eAC/CM,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,aACAM,WAAYH,WACZC,SAAAA,aAEJ"} \ No newline at end of file +{"version":3,"file":"repository.min.js","sources":["../../../../src/grades/grader/gradingpanel/repository.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 * Repository for simple direct grading panel.\n *\n * @module core_grades/grades/grader/gradingpanel/repository\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {call as fetchMany} from 'core/ajax';\nimport {normaliseResult} from './normalise';\n\nexport const fetchGrade = type => (component, contextid, itemname, gradeduserid) => {\n return fetchMany([{\n methodname: `core_grades_grader_gradingpanel_${type}_fetch`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n },\n }])[0];\n};\n\nexport const saveGrade = type => async(component, contextid, itemname, gradeduserid, notifyUser, formdata) => {\n return normaliseResult(await fetchMany([{\n methodname: `core_grades_grader_gradingpanel_${type}_store`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n notifyuser: notifyUser,\n formdata,\n },\n }])[0]);\n};\n"],"names":["type","component","contextid","itemname","gradeduserid","methodname","args","regeneratorRuntime","mark","_callee","notifyUser","formdata","wrap","_context","prev","next","t0","normaliseResult","notifyuser","t1","sent","abrupt","stop","_ref","_x","_x2","_x3","_x4","_x5","_x6","apply","this","arguments"],"mappings":"2dAyB0B,SAAAA,MAAQ,OAAA,SAACC,UAAWC,UAAWC,SAAUC,cAC/D,OAAO,cAAU,CAAC,CACdC,WAA+CL,mCAAAA,OAAAA,KADjC,UAEdM,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,iBAEJ,EACP,CAV6B,qBAYL,SAAAJ,MAAI,UAAIO,mBAAAC,MAAA,SAAAC,QAAMR,UAAWC,UAAWC,SAAUC,aAAcM,WAAYC,UAAhE,OAAAJ,mBAAAK,MAAA,SAAAC,UAAA,OAAA,OAAAA,SAAAC,KAAAD,SAAAE,MAAA,KAAA,EAAA,OAAAF,SAAAG,GACtBC,WADsBA,gBAAAJ,SAAAE,KAAA,GACA,cAAU,CAAC,CACpCV,WAA+CL,mCAAAA,OAAAA,KADX,UAEpCM,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,aACAc,WAAYR,WACZC,SAAAA,aAEJ,GAXyB,KAAA,EAAA,OAAAE,SAAAM,GAAAN,SAAAO,KAAAP,SAAAQ,OAAA,UAAA,EAAAR,SAAAG,IAAAH,SAAAM,KAAA,KAAA,EAAA,IAAA,MAAA,OAAAN,SAAAS,OAAA,GAAAb,QAAJ,IAAIc,oTAAJ,SAAAC,GAAAC,IAAAC,IAAAC,IAAAC,IAAAC,KAAA,OAAAN,KAAAO,MAAAC,KAAAC,UAAA,EAAA,OAAIT,IAAJ"} \ No newline at end of file diff --git a/grade/amd/build/grades/grader/gradingpanel/scale.min.js.map b/grade/amd/build/grades/grader/gradingpanel/scale.min.js.map index 0c1956c435a..708f7ef5b89 100644 --- a/grade/amd/build/grades/grader/gradingpanel/scale.min.js.map +++ b/grade/amd/build/grades/grader/gradingpanel/scale.min.js.map @@ -1 +1 @@ -{"version":3,"file":"scale.min.js","sources":["../../../../src/grades/grader/gradingpanel/scale.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 * Grading panel for simple direct grading.\n *\n * @module core_grades/grades/grader/gradingpanel/scale\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {saveGrade, fetchGrade} from './repository';\nimport {compareData} from 'core_grades/grades/grader/gradingpanel/comparison';\n// Note: We use jQuery.serializer here until we can rewrite Ajax to use XHR.send()\nimport jQuery from 'jquery';\nimport {invalidResult} from './normalise';\n\nexport const fetchCurrentGrade = (...args) => fetchGrade('scale')(...args);\n\nexport const storeCurrentGrade = (component, context, itemname, userId, notifyUser, rootNode) => {\n const form = rootNode.querySelector('form');\n const grade = form.querySelector('select[name=\"grade\"]');\n\n if (!grade.checkValidity() || !grade.value.trim()) {\n return invalidResult;\n }\n\n if (compareData(form) === true) {\n return saveGrade('scale')(component, context, itemname, userId, notifyUser, jQuery(form).serialize());\n } else {\n return '';\n }\n};\n"],"names":["component","context","itemname","userId","notifyUser","rootNode","form","querySelector","grade","checkValidity","value","trim","serialize","invalidResult"],"mappings":";;;;;;;6MA6BiC,kBAAa,0BAAW,6DAExB,SAACA,UAAWC,QAASC,SAAUC,OAAQC,WAAYC,cAC1EC,KAAOD,SAASE,cAAc,QAC9BC,MAAQF,KAAKC,cAAc,+BAE5BC,MAAMC,iBAAoBD,MAAME,MAAMC,QAIjB,KAAtB,2BAAYL,OACL,yBAAU,QAAV,CAAmBN,UAAWC,QAASC,SAAUC,OAAQC,YAAY,mBAAOE,MAAMM,aAElF,GANAC"} \ No newline at end of file +{"version":3,"file":"scale.min.js","sources":["../../../../src/grades/grader/gradingpanel/scale.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 * Grading panel for simple direct grading.\n *\n * @module core_grades/grades/grader/gradingpanel/scale\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {saveGrade, fetchGrade} from './repository';\nimport {compareData} from 'core_grades/grades/grader/gradingpanel/comparison';\n// Note: We use jQuery.serializer here until we can rewrite Ajax to use XHR.send()\nimport jQuery from 'jquery';\nimport {invalidResult} from './normalise';\n\nexport const fetchCurrentGrade = (...args) => fetchGrade('scale')(...args);\n\nexport const storeCurrentGrade = (component, context, itemname, userId, notifyUser, rootNode) => {\n const form = rootNode.querySelector('form');\n const grade = form.querySelector('select[name=\"grade\"]');\n\n if (!grade.checkValidity() || !grade.value.trim()) {\n return invalidResult;\n }\n\n if (compareData(form) === true) {\n return saveGrade('scale')(component, context, itemname, userId, notifyUser, jQuery(form).serialize());\n } else {\n return '';\n }\n};\n"],"names":["_jquery","_repository","fetchGrade","apply","arguments","component","context","itemname","userId","notifyUser","rootNode","form","querySelector","grade","checkValidity","value","trim","default","serialize","invalidResult"],"mappings":";;;;;;;0HA0BAA,aAAAA,sEAGiC,WAAa,OAAA,EAAAC,YAAAC,YAAW,SAAxBC,WAAA,EAAAC,UAAA,6BAEA,SAACC,UAAWC,QAASC,SAAUC,OAAQC,WAAYC,UAChF,IAAMC,KAAOD,SAASE,cAAc,QAC9BC,MAAQF,KAAKC,cAAc,wBAEjC,OAAKC,MAAMC,iBAAoBD,MAAME,MAAMC,QAIjB,KAAtB,EAAYL,YAAAA,aAAAA,OACL,yBAAU,QAAV,CAAmBN,UAAWC,QAASC,SAAUC,OAAQC,YAAY,EAAAT,QAAAiB,SAAON,MAAMO,aAElF,GANAC,WAAPA,aAQP"} \ No newline at end of file diff --git a/grade/grading/form/guide/amd/build/comment_chooser.min.js.map b/grade/grading/form/guide/amd/build/comment_chooser.min.js.map index a29415b08cb..607b53a7622 100644 --- a/grade/grading/form/guide/amd/build/comment_chooser.min.js.map +++ b/grade/grading/form/guide/amd/build/comment_chooser.min.js.map @@ -1 +1 @@ -{"version":3,"file":"comment_chooser.min.js","sources":["../src/comment_chooser.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 * AMD code for the frequently used comments chooser for the marking guide grading form.\n *\n * @module gradingform_guide/comment_chooser\n * @copyright 2015 Jun Pataleta \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/yui'], function($, templates, notification) {\n\n // Private variables and functions.\n\n return /** @alias module:gradingform_guide/comment_chooser */ {\n // Public variables and functions.\n /**\n * Initialises the module.\n *\n * Basically, it performs the binding and handling of the button click event for\n * the 'Insert frequently used comment' button.\n *\n * @param {Integer} criterionId The criterion ID.\n * @param {String} buttonId The element ID of the button which the handler will be bound to.\n * @param {String} remarkId The element ID of the remark text area where the text of the selected comment will be copied to.\n * @param {Array} commentOptions The array of frequently used comments to be used as options.\n */\n initialise: function(criterionId, buttonId, remarkId, commentOptions) {\n /**\n * Display the chooser dialog using the compiled HTML from the mustache template\n * and binds onclick events for the generated comment options.\n *\n * @param {String} compiledSource The compiled HTML from the mustache template\n * @param {Array} comments Array containing comments.\n */\n function displayChooserDialog(compiledSource, comments) {\n var titleLabel = '';\n var cancelButtonId = 'comment-chooser-' + criterionId + '-cancel';\n var cancelButton = '';\n\n // Set dialog's body content.\n var chooserDialog = new M.core.dialogue({\n modal: true,\n headerContent: titleLabel,\n bodyContent: compiledSource,\n footerContent: cancelButton,\n focusAfterHide: '#' + remarkId,\n id: \"comments-chooser-dialog-\" + criterionId\n });\n\n // Bind click event to the cancel button.\n $(\"#\" + cancelButtonId).click(function() {\n chooserDialog.hide();\n });\n\n // Loop over each comment item and bind click events.\n $.each(comments, function(index, comment) {\n var commentOptionId = '#comment-option-' + criterionId + '-' + comment.id;\n\n // Delegate click event for the generated option link.\n $(commentOptionId).click(function() {\n var remarkTextArea = $('#' + remarkId);\n var remarkText = remarkTextArea.val();\n\n // Add line break if the current value of the remark text is not empty.\n if (remarkText.trim() !== '') {\n remarkText += '\\n';\n }\n remarkText += comment.description;\n\n remarkTextArea.val(remarkText);\n\n chooserDialog.hide();\n });\n\n // Handle keypress on list items.\n $(document).off('keypress', commentOptionId).on('keypress', commentOptionId, function() {\n var keyCode = event.which || event.keyCode;\n\n // Enter or space key.\n if (keyCode == 13 || keyCode == 32) {\n // Trigger click event.\n $(commentOptionId).click();\n }\n });\n });\n\n // Destroy the dialog when it is hidden to allow the grading section to\n // be loaded as a fragment multiple times within the same page.\n chooserDialog.after('visibleChange', function(e) {\n // Going from visible to hidden.\n if (e.prevVal && !e.newVal) {\n this.destroy();\n }\n }, chooserDialog);\n\n // Show dialog.\n chooserDialog.show();\n }\n\n /**\n * Generates the comments chooser dialog from the grading_form/comment_chooser mustache template.\n */\n function generateCommentsChooser() {\n // Template context.\n var context = {\n criterionId: criterionId,\n comments: commentOptions\n };\n\n // Render the template and display the comment chooser dialog.\n templates.render('gradingform_guide/comment_chooser', context)\n .done(function(compiledSource) {\n displayChooserDialog(compiledSource, commentOptions);\n })\n .fail(notification.exception);\n }\n\n // Bind click event for the comments chooser button.\n $(\"#\" + buttonId).click(function(e) {\n e.preventDefault();\n generateCommentsChooser();\n });\n }\n };\n});\n"],"names":["define","$","templates","notification","initialise","criterionId","buttonId","remarkId","commentOptions","generateCommentsChooser","context","comments","render","done","compiledSource","titleLabel","M","util","get_string","cancelButtonId","cancelButton","chooserDialog","core","dialogue","modal","headerContent","bodyContent","footerContent","focusAfterHide","id","click","hide","each","index","comment","commentOptionId","remarkTextArea","remarkText","val","trim","description","document","off","on","keyCode","event","which","after","e","prevVal","newVal","destroy","show","displayChooserDialog","fail","exception","preventDefault"],"mappings":";;;;;;;AAsBAA,2CAAO,CAAC,SAAU,iBAAkB,oBAAqB,aAAa,SAASC,EAAGC,UAAWC,oBAI3B,CAa1DC,WAAY,SAASC,YAAaC,SAAUC,SAAUC,yBA4EzCC,8BAEDC,QAAU,CACVL,YAAaA,YACbM,SAAUH,gBAIdN,UAAUU,OAAO,oCAAqCF,SACjDG,MAAK,SAASC,0BA7EOA,eAAgBH,cACtCI,WAAa,UAAYC,EAAEC,KAAKC,WAAW,gBAAiB,qBAAuB,WACnFC,eAAiB,mBAAqBd,YAAc,UACpDe,aAAe,eAAiBD,eAAiB,KAAOH,EAAEC,KAAKC,WAAW,SAAU,UAAY,YAGhGG,cAAgB,IAAIL,EAAEM,KAAKC,SAAS,CACpCC,OAAO,EACPC,cAAeV,WACfW,YAAaZ,eACba,cAAeP,aACfQ,eAAgB,IAAMrB,SACtBsB,GAAI,2BAA6BxB,cAIrCJ,EAAE,IAAMkB,gBAAgBW,OAAM,WAC1BT,cAAcU,UAIlB9B,EAAE+B,KAAKrB,UAAU,SAASsB,MAAOC,aACzBC,gBAAkB,mBAAqB9B,YAAc,IAAM6B,QAAQL,GAGvE5B,EAAEkC,iBAAiBL,OAAM,eACjBM,eAAiBnC,EAAE,IAAMM,UACzB8B,WAAaD,eAAeE,MAGN,KAAtBD,WAAWE,SACXF,YAAc,MAElBA,YAAcH,QAAQM,YAEtBJ,eAAeE,IAAID,YAEnBhB,cAAcU,UAIlB9B,EAAEwC,UAAUC,IAAI,WAAYP,iBAAiBQ,GAAG,WAAYR,iBAAiB,eACrES,QAAUC,MAAMC,OAASD,MAAMD,QAGpB,IAAXA,SAA4B,IAAXA,SAEjB3C,EAAEkC,iBAAiBL,cAO/BT,cAAc0B,MAAM,iBAAiB,SAASC,GAEtCA,EAAEC,UAAYD,EAAEE,aACXC,YAEV9B,eAGHA,cAAc+B,OAgBNC,CAAqBvC,eAAgBN,mBAExC8C,KAAKnD,aAAaoD,WAI3BtD,EAAE,IAAMK,UAAUwB,OAAM,SAASkB,GAC7BA,EAAEQ,iBACF/C"} \ No newline at end of file +{"version":3,"file":"comment_chooser.min.js","sources":["../src/comment_chooser.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 * AMD code for the frequently used comments chooser for the marking guide grading form.\n *\n * @module gradingform_guide/comment_chooser\n * @copyright 2015 Jun Pataleta \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/yui'], function($, templates, notification) {\n\n // Private variables and functions.\n\n return /** @alias module:gradingform_guide/comment_chooser */ {\n // Public variables and functions.\n /**\n * Initialises the module.\n *\n * Basically, it performs the binding and handling of the button click event for\n * the 'Insert frequently used comment' button.\n *\n * @param {Integer} criterionId The criterion ID.\n * @param {String} buttonId The element ID of the button which the handler will be bound to.\n * @param {String} remarkId The element ID of the remark text area where the text of the selected comment will be copied to.\n * @param {Array} commentOptions The array of frequently used comments to be used as options.\n */\n initialise: function(criterionId, buttonId, remarkId, commentOptions) {\n /**\n * Display the chooser dialog using the compiled HTML from the mustache template\n * and binds onclick events for the generated comment options.\n *\n * @param {String} compiledSource The compiled HTML from the mustache template\n * @param {Array} comments Array containing comments.\n */\n function displayChooserDialog(compiledSource, comments) {\n var titleLabel = '';\n var cancelButtonId = 'comment-chooser-' + criterionId + '-cancel';\n var cancelButton = '';\n\n // Set dialog's body content.\n var chooserDialog = new M.core.dialogue({\n modal: true,\n headerContent: titleLabel,\n bodyContent: compiledSource,\n footerContent: cancelButton,\n focusAfterHide: '#' + remarkId,\n id: \"comments-chooser-dialog-\" + criterionId\n });\n\n // Bind click event to the cancel button.\n $(\"#\" + cancelButtonId).click(function() {\n chooserDialog.hide();\n });\n\n // Loop over each comment item and bind click events.\n $.each(comments, function(index, comment) {\n var commentOptionId = '#comment-option-' + criterionId + '-' + comment.id;\n\n // Delegate click event for the generated option link.\n $(commentOptionId).click(function() {\n var remarkTextArea = $('#' + remarkId);\n var remarkText = remarkTextArea.val();\n\n // Add line break if the current value of the remark text is not empty.\n if (remarkText.trim() !== '') {\n remarkText += '\\n';\n }\n remarkText += comment.description;\n\n remarkTextArea.val(remarkText);\n\n chooserDialog.hide();\n });\n\n // Handle keypress on list items.\n $(document).off('keypress', commentOptionId).on('keypress', commentOptionId, function() {\n var keyCode = event.which || event.keyCode;\n\n // Enter or space key.\n if (keyCode == 13 || keyCode == 32) {\n // Trigger click event.\n $(commentOptionId).click();\n }\n });\n });\n\n // Destroy the dialog when it is hidden to allow the grading section to\n // be loaded as a fragment multiple times within the same page.\n chooserDialog.after('visibleChange', function(e) {\n // Going from visible to hidden.\n if (e.prevVal && !e.newVal) {\n this.destroy();\n }\n }, chooserDialog);\n\n // Show dialog.\n chooserDialog.show();\n }\n\n /**\n * Generates the comments chooser dialog from the grading_form/comment_chooser mustache template.\n */\n function generateCommentsChooser() {\n // Template context.\n var context = {\n criterionId: criterionId,\n comments: commentOptions\n };\n\n // Render the template and display the comment chooser dialog.\n templates.render('gradingform_guide/comment_chooser', context)\n .done(function(compiledSource) {\n displayChooserDialog(compiledSource, commentOptions);\n })\n .fail(notification.exception);\n }\n\n // Bind click event for the comments chooser button.\n $(\"#\" + buttonId).click(function(e) {\n e.preventDefault();\n generateCommentsChooser();\n });\n }\n };\n});\n"],"names":["define","$","templates","notification","initialise","criterionId","buttonId","remarkId","commentOptions","generateCommentsChooser","context","comments","render","done","compiledSource","titleLabel","M","util","get_string","cancelButtonId","cancelButton","chooserDialog","core","dialogue","modal","headerContent","bodyContent","footerContent","focusAfterHide","id","click","hide","each","index","comment","commentOptionId","remarkTextArea","remarkText","val","trim","description","document","off","on","keyCode","event","which","after","e","prevVal","newVal","this","destroy","show","displayChooserDialog","fail","exception","preventDefault"],"mappings":";;;;;;;AAsBAA,2CAAO,CAAC,SAAU,iBAAkB,oBAAqB,aAAa,SAASC,EAAGC,UAAWC,cAI3B,MAAA,CAa1DC,WAAY,SAASC,YAAaC,SAAUC,SAAUC,gBA4ElD,SAASC,0BAEL,IAAIC,QAAU,CACVL,YAAaA,YACbM,SAAUH,gBAIdN,UAAUU,OAAO,oCAAqCF,SACjDG,MAAK,SAASC,iBA7EvB,SAA8BA,eAAgBH,UAC1C,IAAII,WAAa,UAAYC,EAAEC,KAAKC,WAAW,gBAAiB,qBAAuB,WACnFC,eAAiB,mBAAqBd,YAAc,UACpDe,aAAe,eAAiBD,eAAiB,KAAOH,EAAEC,KAAKC,WAAW,SAAU,UAAY,YAGhGG,cAAgB,IAAIL,EAAEM,KAAKC,SAAS,CACpCC,OAAO,EACPC,cAAeV,WACfW,YAAaZ,eACba,cAAeP,aACfQ,eAAgB,IAAMrB,SACtBsB,GAAI,2BAA6BxB,cAIrCJ,EAAE,IAAMkB,gBAAgBW,OAAM,WAC1BT,cAAcU,MACjB,IAGD9B,EAAE+B,KAAKrB,UAAU,SAASsB,MAAOC,SACzBC,IAAAA,gBAAkB,mBAAqB9B,YAAc,IAAM6B,QAAQL,GAGvE5B,EAAEkC,iBAAiBL,OAAM,WACrB,IAAIM,eAAiBnC,EAAE,IAAMM,UACzB8B,WAAaD,eAAeE,MAGN,KAAtBD,WAAWE,SACXF,YAAc,MAElBA,YAAcH,QAAQM,YAEtBJ,eAAeE,IAAID,YAEnBhB,cAAcU,MACjB,IAGD9B,EAAEwC,UAAUC,IAAI,WAAYP,iBAAiBQ,GAAG,WAAYR,iBAAiB,WACrES,IAAAA,QAAUC,MAAMC,OAASD,MAAMD,QAGpB,IAAXA,SAA4B,IAAXA,SAEjB3C,EAAEkC,iBAAiBL,OAE1B,GACJ,IAIDT,cAAc0B,MAAM,iBAAiB,SAASC,GAEtCA,EAAEC,UAAYD,EAAEE,QAChBC,KAAKC,SAHb,GAKG/B,eAGHA,cAAcgC,MACjB,CAeWC,CAAqBxC,eAAgBN,eAF7C,IAIK+C,KAAKpD,aAAaqD,UAC1B,CAGDvD,EAAE,IAAMK,UAAUwB,OAAM,SAASkB,GAC7BA,EAAES,iBACFhD,yBACH,GACJ,EAER"} \ No newline at end of file diff --git a/grade/grading/form/guide/amd/build/grades/grader/gradingpanel.min.js.map b/grade/grading/form/guide/amd/build/grades/grader/gradingpanel.min.js.map index 905deecec32..c66b59e484d 100644 --- a/grade/grading/form/guide/amd/build/grades/grader/gradingpanel.min.js.map +++ b/grade/grading/form/guide/amd/build/grades/grader/gradingpanel.min.js.map @@ -1 +1 @@ -{"version":3,"file":"gradingpanel.min.js","sources":["../../../src/grades/grader/gradingpanel.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 * Grading panel for gradingform_guide.\n *\n * @module gradingform_guide/grades/grader/gradingpanel\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {call as fetchMany} from 'core/ajax';\nimport {normaliseResult} from 'core_grades/grades/grader/gradingpanel/normalise';\nimport {compareData} from 'core_grades/grades/grader/gradingpanel/comparison';\n\n// Note: We use jQuery.serializer here until we can rewrite Ajax to use XHR.send()\nimport jQuery from 'jquery';\n\n/**\n * For a given component, contextid, itemname & gradeduserid we can fetch the currently assigned grade.\n *\n * @param {String} component\n * @param {Number} contextid\n * @param {String} itemname\n * @param {Number} gradeduserid\n *\n * @returns {Promise}\n */\nexport const fetchCurrentGrade = (component, contextid, itemname, gradeduserid) => {\n return fetchMany([{\n methodname: `gradingform_guide_grader_gradingpanel_fetch`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n },\n }])[0];\n};\n\n/**\n * For a given component, contextid, itemname & gradeduserid we can store the currently assigned grade in a given form.\n *\n * @param {String} component\n * @param {Number} contextid\n * @param {String} itemname\n * @param {Number} gradeduserid\n * @param {Boolean} notifyUser\n * @param {HTMLElement} rootNode\n *\n * @returns {Promise}\n */\nexport const storeCurrentGrade = async(component, contextid, itemname, gradeduserid, notifyUser, rootNode) => {\n const form = rootNode.querySelector('form');\n\n if (compareData(form) === true) {\n return normaliseResult(await fetchMany([{\n methodname: `gradingform_guide_grader_gradingpanel_store`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n notifyuser: notifyUser,\n formdata: jQuery(form).serialize(),\n },\n }])[0]);\n } else {\n return '';\n }\n};\n"],"names":["component","contextid","itemname","gradeduserid","methodname","args","storeCurrentGrade","notifyUser","rootNode","form","querySelector","normaliseResult","notifyuser","formdata","serialize"],"mappings":"kqBAwCiC,SAACA,UAAWC,UAAWC,SAAUC,qBACvD,cAAU,CAAC,CACdC,yDACAC,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,iBAEJ,gBAeKG,+CAAoB,iBAAMN,UAAWC,UAAWC,SAAUC,aAAcI,WAAYC,2HACvFC,KAAOD,SAASE,cAAc,SAEV,KAAtB,2BAAYD,gDACLE,4CAAsB,cAAU,CAAC,CACpCP,yDACAC,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,aACAS,WAAYL,WACZM,UAAU,mBAAOJ,MAAMK,gBAE3B,yIAEG"} \ No newline at end of file +{"version":3,"file":"gradingpanel.min.js","sources":["../../../src/grades/grader/gradingpanel.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 * Grading panel for gradingform_guide.\n *\n * @module gradingform_guide/grades/grader/gradingpanel\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {call as fetchMany} from 'core/ajax';\nimport {normaliseResult} from 'core_grades/grades/grader/gradingpanel/normalise';\nimport {compareData} from 'core_grades/grades/grader/gradingpanel/comparison';\n\n// Note: We use jQuery.serializer here until we can rewrite Ajax to use XHR.send()\nimport jQuery from 'jquery';\n\n/**\n * For a given component, contextid, itemname & gradeduserid we can fetch the currently assigned grade.\n *\n * @param {String} component\n * @param {Number} contextid\n * @param {String} itemname\n * @param {Number} gradeduserid\n *\n * @returns {Promise}\n */\nexport const fetchCurrentGrade = (component, contextid, itemname, gradeduserid) => {\n return fetchMany([{\n methodname: `gradingform_guide_grader_gradingpanel_fetch`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n },\n }])[0];\n};\n\n/**\n * For a given component, contextid, itemname & gradeduserid we can store the currently assigned grade in a given form.\n *\n * @param {String} component\n * @param {Number} contextid\n * @param {String} itemname\n * @param {Number} gradeduserid\n * @param {Boolean} notifyUser\n * @param {HTMLElement} rootNode\n *\n * @returns {Promise}\n */\nexport const storeCurrentGrade = async(component, contextid, itemname, gradeduserid, notifyUser, rootNode) => {\n const form = rootNode.querySelector('form');\n\n if (compareData(form) === true) {\n return normaliseResult(await fetchMany([{\n methodname: `gradingform_guide_grader_gradingpanel_store`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n notifyuser: notifyUser,\n formdata: jQuery(form).serialize(),\n },\n }])[0]);\n } else {\n return '';\n }\n};\n"],"names":["_jquery","component","contextid","itemname","gradeduserid","methodname","args","_ref","storeCurrentGrade","regeneratorRuntime","mark","_callee","notifyUser","rootNode","form","wrap","_context","prev","next","querySelector","_comparison","compareData","t0","normaliseResult","notifyuser","formdata","serialize","t1","sent","abrupt","stop","_x","_x2","_x3","_x4","_x5","_x6","apply","this","arguments"],"mappings":"+kBA4BAA,aAAAA,sEAYiC,SAACC,UAAWC,UAAWC,SAAUC,cAC9D,OAAO,cAAU,CAAC,CACdC,WADc,8CAEdC,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,iBAEJ,EACP,EAcM,OAA0BG,KAApBC,sBAAoBC,mBAAAC,MAAA,SAAAC,QAAMV,UAAWC,UAAWC,SAAUC,aAAcQ,WAAYC,UAAhE,IAAAC,KAAA,OAAAL,mBAAAM,MAAA,SAAAC,UAAA,OAAA,OAAAA,SAAAC,KAAAD,SAAAE,MAAA,KAAA,EAGzB,GAFEJ,KAAOD,SAASM,cAAc,SAEV,KAAtB,EAAAC,YAAAC,aAAYP,MAHa,CAAAE,SAAAE,KAAA,EAAA,KAAA,CAAA,OAAAF,SAAAM,GAIlBC,WAJkBA,gBAAAP,SAAAE,KAAA,GAII,cAAU,CAAC,CACpCb,WADoC,8CAEpCC,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,aACAoB,WAAYZ,WACZa,UAAU,EAAOX,QAAAA,SAAAA,MAAMY,gBAE3B,GAdqB,KAAA,EAAA,OAAAV,SAAAW,GAAAX,SAAAY,KAAAZ,SAAAa,OAAA,UAAA,EAAAb,SAAAM,IAAAN,SAAAW,KAAA,KAAA,EAAA,OAAAX,SAAAa,OAAA,SAgBlB,IAhBkB,KAAA,GAAA,IAAA,MAAA,OAAAb,SAAAc,OAAA,GAAAnB,QAAH,IAAGJ,oTAAH,SAAAwB,GAAAC,IAAAC,IAAAC,IAAAC,IAAAC,KAAA,OAAA7B,KAAA8B,MAAAC,KAAAC,UAAA"} \ No newline at end of file diff --git a/grade/grading/form/guide/amd/build/grades/grader/gradingpanel/comments.min.js.map b/grade/grading/form/guide/amd/build/grades/grader/gradingpanel/comments.min.js.map index 03e3386d32c..b4c7d9574ae 100644 --- a/grade/grading/form/guide/amd/build/grades/grader/gradingpanel/comments.min.js.map +++ b/grade/grading/form/guide/amd/build/grades/grader/gradingpanel/comments.min.js.map @@ -1 +1 @@ -{"version":3,"file":"comments.min.js","sources":["../../../../src/grades/grader/gradingpanel/comments.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 * Grading panel frequently used comments selector.\n *\n * @module gradingform_guide/grades/grader/gradingpanel/comments\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Selectors from './comments/selectors';\n\n/**\n * Manage the frequently used comments in the Marking Guide form.\n *\n * @param {String} rootId\n */\nexport const init = (rootId) => {\n const rootNode = document.querySelector(`#${rootId}`);\n\n rootNode.addEventListener('click', (e) => {\n if (!e.target.matches(Selectors.frequentComment)) {\n return;\n }\n\n e.preventDefault();\n\n const clicked = e.target.closest(Selectors.frequentComment);\n const criterion = clicked.closest(Selectors.criterion);\n const remark = criterion.querySelector(Selectors.remark);\n\n if (!remark) {\n return;\n }\n\n // Either append the comment to an existing comment or set it as the comment.\n if (remark.value.trim()) {\n remark.value += `\\n${clicked.innerHTML}`;\n } else {\n remark.value += clicked.innerHTML;\n }\n });\n};\n"],"names":["rootId","document","querySelector","addEventListener","e","target","matches","Selectors","frequentComment","preventDefault","clicked","closest","remark","criterion","value","trim","innerHTML"],"mappings":";;;;;;;8JA8BoB,SAACA,QACAC,SAASC,yBAAkBF,SAEnCG,iBAAiB,SAAS,SAACC,MAC3BA,EAAEC,OAAOC,QAAQC,mBAAUC,kBAIhCJ,EAAEK,qBAEIC,QAAUN,EAAEC,OAAOM,QAAQJ,mBAAUC,iBAErCI,OADYF,QAAQC,QAAQJ,mBAAUM,WACnBX,cAAcK,mBAAUK,QAE5CA,SAKDA,OAAOE,MAAMC,OACbH,OAAOE,mBAAcJ,QAAQM,WAE7BJ,OAAOE,OAASJ,QAAQM"} \ No newline at end of file +{"version":3,"file":"comments.min.js","sources":["../../../../src/grades/grader/gradingpanel/comments.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 * Grading panel frequently used comments selector.\n *\n * @module gradingform_guide/grades/grader/gradingpanel/comments\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Selectors from './comments/selectors';\n\n/**\n * Manage the frequently used comments in the Marking Guide form.\n *\n * @param {String} rootId\n */\nexport const init = (rootId) => {\n const rootNode = document.querySelector(`#${rootId}`);\n\n rootNode.addEventListener('click', (e) => {\n if (!e.target.matches(Selectors.frequentComment)) {\n return;\n }\n\n e.preventDefault();\n\n const clicked = e.target.closest(Selectors.frequentComment);\n const criterion = clicked.closest(Selectors.criterion);\n const remark = criterion.querySelector(Selectors.remark);\n\n if (!remark) {\n return;\n }\n\n // Either append the comment to an existing comment or set it as the comment.\n if (remark.value.trim()) {\n remark.value += `\\n${clicked.innerHTML}`;\n } else {\n remark.value += clicked.innerHTML;\n }\n });\n};\n"],"names":["_selectors","rootId","document","querySelector","concat","addEventListener","e","target","matches","Selectors","frequentComment","preventDefault","clicked","closest","remark","criterion","value","trim","innerHTML"],"mappings":";;;;;;;kFAuBAA,gBAAAA,4DAOoB,SAACC,QACAC,SAASC,cAAT,IAAAC,OAA2BH,SAEnCI,iBAAiB,SAAS,SAACC,GAC5B,GAACA,EAAEC,OAAOC,QAAQC,WAAAA,QAAUC,iBAA5B,CAIJJ,EAAEK,iBAEIC,IAAAA,QAAUN,EAAEC,OAAOM,QAAQJ,WAAUC,QAAAA,iBAErCI,OADYF,QAAQC,QAAQJ,WAAAA,QAAUM,WACnBZ,cAAcM,WAAAA,QAAUK,QAE5CA,SAKDA,OAAOE,MAAMC,OACbH,OAAOE,OAAcJ,KAAAA,OAAAA,QAAQM,WAE7BJ,OAAOE,OAASJ,QAAQM,UAhB3B,CAkBJ,GACJ"} \ No newline at end of file diff --git a/grade/grading/form/rubric/amd/build/grades/grader/gradingpanel.min.js.map b/grade/grading/form/rubric/amd/build/grades/grader/gradingpanel.min.js.map index ad7b3dc1948..2061f7241bb 100644 --- a/grade/grading/form/rubric/amd/build/grades/grader/gradingpanel.min.js.map +++ b/grade/grading/form/rubric/amd/build/grades/grader/gradingpanel.min.js.map @@ -1 +1 @@ -{"version":3,"file":"gradingpanel.min.js","sources":["../../../src/grades/grader/gradingpanel.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 * Grading panel for gradingform_rubric.\n *\n * @module gradingform_rubric/grades/grader/gradingpanel\n * @copyright 2019 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {call as fetchMany} from 'core/ajax';\nimport {normaliseResult} from 'core_grades/grades/grader/gradingpanel/normalise';\nimport {compareData} from 'core_grades/grades/grader/gradingpanel/comparison';\n\n// Note: We use jQuery.serializer here until we can rewrite Ajax to use XHR.send()\nimport jQuery from 'jquery';\n\n/**\n * For a given component, contextid, itemname & gradeduserid we can fetch the currently assigned grade.\n *\n * @param {String} component\n * @param {Number} contextid\n * @param {String} itemname\n * @param {Number} gradeduserid\n *\n * @returns {Promise}\n */\nexport const fetchCurrentGrade = (component, contextid, itemname, gradeduserid) => {\n return fetchMany([{\n methodname: `gradingform_rubric_grader_gradingpanel_fetch`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n },\n }])[0];\n};\n\n/**\n * For a given component, contextid, itemname & gradeduserid we can store the currently assigned grade in a given form.\n *\n * @param {String} component\n * @param {Number} contextid\n * @param {String} itemname\n * @param {Number} gradeduserid\n * @param {Boolean} notifyUser\n * @param {HTMLElement} rootNode\n *\n * @returns {Promise}\n */\nexport const storeCurrentGrade = async(component, contextid, itemname, gradeduserid, notifyUser, rootNode) => {\n const form = rootNode.querySelector('form');\n\n if (compareData(form) === true) {\n return normaliseResult(await fetchMany([{\n methodname: `gradingform_rubric_grader_gradingpanel_store`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n notifyuser: notifyUser,\n formdata: jQuery(form).serialize(),\n },\n }])[0]);\n } else {\n return '';\n }\n};\n"],"names":["component","contextid","itemname","gradeduserid","methodname","args","storeCurrentGrade","notifyUser","rootNode","form","querySelector","normaliseResult","notifyuser","formdata","serialize"],"mappings":"mqBAwCiC,SAACA,UAAWC,UAAWC,SAAUC,qBACvD,cAAU,CAAC,CACdC,0DACAC,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,iBAEJ,gBAeKG,+CAAoB,iBAAMN,UAAWC,UAAWC,SAAUC,aAAcI,WAAYC,2HACvFC,KAAOD,SAASE,cAAc,SAEV,KAAtB,2BAAYD,gDACLE,4CAAsB,cAAU,CAAC,CACpCP,0DACAC,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,aACAS,WAAYL,WACZM,UAAU,mBAAOJ,MAAMK,gBAE3B,yIAEG"} \ No newline at end of file +{"version":3,"file":"gradingpanel.min.js","sources":["../../../src/grades/grader/gradingpanel.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 * Grading panel for gradingform_rubric.\n *\n * @module gradingform_rubric/grades/grader/gradingpanel\n * @copyright 2019 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {call as fetchMany} from 'core/ajax';\nimport {normaliseResult} from 'core_grades/grades/grader/gradingpanel/normalise';\nimport {compareData} from 'core_grades/grades/grader/gradingpanel/comparison';\n\n// Note: We use jQuery.serializer here until we can rewrite Ajax to use XHR.send()\nimport jQuery from 'jquery';\n\n/**\n * For a given component, contextid, itemname & gradeduserid we can fetch the currently assigned grade.\n *\n * @param {String} component\n * @param {Number} contextid\n * @param {String} itemname\n * @param {Number} gradeduserid\n *\n * @returns {Promise}\n */\nexport const fetchCurrentGrade = (component, contextid, itemname, gradeduserid) => {\n return fetchMany([{\n methodname: `gradingform_rubric_grader_gradingpanel_fetch`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n },\n }])[0];\n};\n\n/**\n * For a given component, contextid, itemname & gradeduserid we can store the currently assigned grade in a given form.\n *\n * @param {String} component\n * @param {Number} contextid\n * @param {String} itemname\n * @param {Number} gradeduserid\n * @param {Boolean} notifyUser\n * @param {HTMLElement} rootNode\n *\n * @returns {Promise}\n */\nexport const storeCurrentGrade = async(component, contextid, itemname, gradeduserid, notifyUser, rootNode) => {\n const form = rootNode.querySelector('form');\n\n if (compareData(form) === true) {\n return normaliseResult(await fetchMany([{\n methodname: `gradingform_rubric_grader_gradingpanel_store`,\n args: {\n component,\n contextid,\n itemname,\n gradeduserid,\n notifyuser: notifyUser,\n formdata: jQuery(form).serialize(),\n },\n }])[0]);\n } else {\n return '';\n }\n};\n"],"names":["_jquery","component","contextid","itemname","gradeduserid","methodname","args","_ref","storeCurrentGrade","regeneratorRuntime","mark","_callee","notifyUser","rootNode","form","wrap","_context","prev","next","querySelector","_comparison","compareData","t0","normaliseResult","notifyuser","formdata","serialize","t1","sent","abrupt","stop","_x","_x2","_x3","_x4","_x5","_x6","apply","this","arguments"],"mappings":"glBA4BAA,aAAAA,sEAYiC,SAACC,UAAWC,UAAWC,SAAUC,cAC9D,OAAO,cAAU,CAAC,CACdC,WADc,+CAEdC,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,iBAEJ,EACP,EAcM,OAA0BG,KAApBC,sBAAoBC,mBAAAC,MAAA,SAAAC,QAAMV,UAAWC,UAAWC,SAAUC,aAAcQ,WAAYC,UAAhE,IAAAC,KAAA,OAAAL,mBAAAM,MAAA,SAAAC,UAAA,OAAA,OAAAA,SAAAC,KAAAD,SAAAE,MAAA,KAAA,EAGzB,GAFEJ,KAAOD,SAASM,cAAc,SAEV,KAAtB,EAAAC,YAAAC,aAAYP,MAHa,CAAAE,SAAAE,KAAA,EAAA,KAAA,CAAA,OAAAF,SAAAM,GAIlBC,WAJkBA,gBAAAP,SAAAE,KAAA,GAII,cAAU,CAAC,CACpCb,WADoC,+CAEpCC,KAAM,CACFL,UAAAA,UACAC,UAAAA,UACAC,SAAAA,SACAC,aAAAA,aACAoB,WAAYZ,WACZa,UAAU,EAAOX,QAAAA,SAAAA,MAAMY,gBAE3B,GAdqB,KAAA,EAAA,OAAAV,SAAAW,GAAAX,SAAAY,KAAAZ,SAAAa,OAAA,UAAA,EAAAb,SAAAM,IAAAN,SAAAW,KAAA,KAAA,EAAA,OAAAX,SAAAa,OAAA,SAgBlB,IAhBkB,KAAA,GAAA,IAAA,MAAA,OAAAb,SAAAc,OAAA,GAAAnB,QAAH,IAAGJ,oTAAH,SAAAwB,GAAAC,IAAAC,IAAAC,IAAAC,IAAAC,KAAA,OAAA7B,KAAA8B,MAAAC,KAAAC,UAAA"} \ No newline at end of file diff --git a/h5p/amd/build/editor_display.min.js.map b/h5p/amd/build/editor_display.min.js.map index 74c9dda03f8..4531019cdf8 100644 --- a/h5p/amd/build/editor_display.min.js.map +++ b/h5p/amd/build/editor_display.min.js.map @@ -1 +1 @@ -{"version":3,"file":"editor_display.min.js","sources":["../src/editor_display.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 handles the display of the H5P authoring tool.\n *\n * @module core_h5p/editor_display\n * @copyright 2020 Victor Deniz \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\n/* global H5PEditor */\n\n/**\n * Display the H5P authoring tool.\n *\n * @param {String} elementId Root element.\n */\nexport const init = (elementId) => {\n const editorwrapper = $('#' + elementId);\n const editor = $('.h5p-editor');\n const mform = editor.closest(\"form\");\n const editorupload = $(\"h5p-editor-upload\");\n const h5plibrary = $('input[name=\"h5plibrary\"]');\n const h5pparams = $('input[name=\"h5pparams\"]');\n const inputname = $('input[name=\"name\"]');\n const h5paction = $('input[name=\"h5paction\"]');\n\n // Cancel validation and submission of form if clicking cancel button.\n const cancelSubmitCallback = function($button) {\n return $button.is('[name=\"cancel\"]');\n };\n\n h5paction.val(\"create\");\n\n H5PEditor.init(\n mform,\n h5paction,\n editorupload,\n editorwrapper,\n editor,\n h5plibrary,\n h5pparams,\n '',\n inputname,\n cancelSubmitCallback\n );\n document.querySelector('#' + elementId + ' iframe').setAttribute('name', 'h5p-editor');\n};\n"],"names":["elementId","editorwrapper","editor","mform","closest","editorupload","h5plibrary","h5pparams","inputname","h5paction","val","H5PEditor","init","$button","is","document","querySelector","setAttribute"],"mappings":";;;;;;;wJA+BoB,SAACA,eACXC,eAAgB,mBAAE,IAAMD,WACxBE,QAAS,mBAAE,eACXC,MAAQD,OAAOE,QAAQ,QACvBC,cAAe,mBAAE,qBACjBC,YAAa,mBAAE,4BACfC,WAAY,mBAAE,2BACdC,WAAY,mBAAE,sBACdC,WAAY,mBAAE,2BAOpBA,UAAUC,IAAI,UAEdC,UAAUC,KACNT,MACAM,UACAJ,aACAJ,cACAC,OACAI,WACAC,UACA,GACAC,WAfyB,SAASK,gBAC3BA,QAAQC,GAAG,sBAiBtBC,SAASC,cAAc,IAAMhB,UAAY,WAAWiB,aAAa,OAAQ"} \ No newline at end of file +{"version":3,"file":"editor_display.min.js","sources":["../src/editor_display.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 handles the display of the H5P authoring tool.\n *\n * @module core_h5p/editor_display\n * @copyright 2020 Victor Deniz \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\n/* global H5PEditor */\n\n/**\n * Display the H5P authoring tool.\n *\n * @param {String} elementId Root element.\n */\nexport const init = (elementId) => {\n const editorwrapper = $('#' + elementId);\n const editor = $('.h5p-editor');\n const mform = editor.closest(\"form\");\n const editorupload = $(\"h5p-editor-upload\");\n const h5plibrary = $('input[name=\"h5plibrary\"]');\n const h5pparams = $('input[name=\"h5pparams\"]');\n const inputname = $('input[name=\"name\"]');\n const h5paction = $('input[name=\"h5paction\"]');\n\n // Cancel validation and submission of form if clicking cancel button.\n const cancelSubmitCallback = function($button) {\n return $button.is('[name=\"cancel\"]');\n };\n\n h5paction.val(\"create\");\n\n H5PEditor.init(\n mform,\n h5paction,\n editorupload,\n editorwrapper,\n editor,\n h5plibrary,\n h5pparams,\n '',\n inputname,\n cancelSubmitCallback\n );\n document.querySelector('#' + elementId + ' iframe').setAttribute('name', 'h5p-editor');\n};\n"],"names":["_jquery","elementId","editorwrapper","default","editor","mform","closest","editorupload","h5plibrary","h5pparams","inputname","h5paction","val","H5PEditor","init","$button","is","document","querySelector","setAttribute"],"mappings":";;;;;;;kFAuBAA,aAAAA,yDAQoB,SAACC,WACjB,IAAMC,eAAgB,EAAEF,QAAAG,SAAA,IAAMF,WACxBG,QAAS,EAAEJ,QAAAG,SAAA,eACXE,MAAQD,OAAOE,QAAQ,QACvBC,cAAe,EAAEP,QAAAG,SAAA,qBACjBK,YAAa,EAAER,QAAAG,SAAA,4BACfM,WAAY,EAAET,QAAAG,SAAA,2BACdO,WAAY,EAAEV,QAAAG,SAAA,sBACdQ,WAAY,EAAEX,QAAAG,SAAA,2BAOpBQ,UAAUC,IAAI,UAEdC,UAAUC,KACNT,MACAM,UACAJ,aACAL,cACAE,OACAI,WACAC,UACA,GACAC,WAfyB,SAASK,SAClC,OAAOA,QAAQC,GAAG,kBACrB,IAgBDC,SAASC,cAAc,IAAMjB,UAAY,WAAWkB,aAAa,OAAQ,aAC5E"} \ No newline at end of file diff --git a/lib/amd/build/adapter.min.js b/lib/amd/build/adapter.min.js index 73b32655b22..0f4db6c5465 100644 --- a/lib/amd/build/adapter.min.js +++ b/lib/amd/build/adapter.min.js @@ -1,3 +1,3 @@ -function _typeof2(obj){return _typeof2="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof2(obj)}define("core/adapter",[],(function(){return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,(function(e){var n=t[o][1][e];return s(n||e)}),l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o0&&void 0!==arguments[0]?arguments[0]:{},window=_ref.window,options=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{shimChrome:!0,shimFirefox:!0,shimEdge:!0,shimSafari:!0},logging=utils.log,browserDetails=utils.detectBrowser(window),adapter={browserDetails:browserDetails,commonShim:commonShim,extractVersion:utils.extractVersion,disableLog:utils.disableLog,disableWarnings:utils.disableWarnings};switch(browserDetails.browser){case"chrome":if(!chromeShim||!chromeShim.shimPeerConnection||!options.shimChrome)return logging("Chrome shim is not included in this adapter release."),adapter;logging("adapter.js shimming chrome."),adapter.browserShim=chromeShim,chromeShim.shimGetUserMedia(window),chromeShim.shimMediaStream(window),chromeShim.shimPeerConnection(window),chromeShim.shimOnTrack(window),chromeShim.shimAddTrackRemoveTrack(window),chromeShim.shimGetSendersWithDtmf(window),chromeShim.shimGetStats(window),chromeShim.shimSenderReceiverGetStats(window),chromeShim.fixNegotiationNeeded(window),commonShim.shimRTCIceCandidate(window),commonShim.shimConnectionState(window),commonShim.shimMaxMessageSize(window),commonShim.shimSendThrowTypeError(window),commonShim.removeAllowExtmapMixed(window);break;case"firefox":if(!firefoxShim||!firefoxShim.shimPeerConnection||!options.shimFirefox)return logging("Firefox shim is not included in this adapter release."),adapter;logging("adapter.js shimming firefox."),adapter.browserShim=firefoxShim,firefoxShim.shimGetUserMedia(window),firefoxShim.shimPeerConnection(window),firefoxShim.shimOnTrack(window),firefoxShim.shimRemoveStream(window),firefoxShim.shimSenderGetStats(window),firefoxShim.shimReceiverGetStats(window),firefoxShim.shimRTCDataChannel(window),firefoxShim.shimAddTransceiver(window),firefoxShim.shimCreateOffer(window),firefoxShim.shimCreateAnswer(window),commonShim.shimRTCIceCandidate(window),commonShim.shimConnectionState(window),commonShim.shimMaxMessageSize(window),commonShim.shimSendThrowTypeError(window);break;case"edge":if(!edgeShim||!edgeShim.shimPeerConnection||!options.shimEdge)return logging("MS edge shim is not included in this adapter release."),adapter;logging("adapter.js shimming edge."),adapter.browserShim=edgeShim,edgeShim.shimGetUserMedia(window),edgeShim.shimGetDisplayMedia(window),edgeShim.shimPeerConnection(window),edgeShim.shimReplaceTrack(window),commonShim.shimMaxMessageSize(window),commonShim.shimSendThrowTypeError(window);break;case"safari":if(!safariShim||!options.shimSafari)return logging("Safari shim is not included in this adapter release."),adapter;logging("adapter.js shimming safari."),adapter.browserShim=safariShim,safariShim.shimRTCIceServerUrls(window),safariShim.shimCreateOfferLegacy(window),safariShim.shimCallbacksAPI(window),safariShim.shimLocalStreamsAPI(window),safariShim.shimRemoteStreamsAPI(window),safariShim.shimTrackEventTransceiver(window),safariShim.shimGetUserMedia(window),commonShim.shimRTCIceCandidate(window),commonShim.shimMaxMessageSize(window),commonShim.shimSendThrowTypeError(window),commonShim.removeAllowExtmapMixed(window);break;default:logging("Unsupported browser!")}return adapter};var utils=_interopRequireWildcard(require("./utils")),chromeShim=_interopRequireWildcard(require("./chrome/chrome_shim")),edgeShim=_interopRequireWildcard(require("./edge/edge_shim")),firefoxShim=_interopRequireWildcard(require("./firefox/firefox_shim")),safariShim=_interopRequireWildcard(require("./safari/safari_shim")),commonShim=_interopRequireWildcard(require("./common_shim"));function _interopRequireWildcard(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}},{"./chrome/chrome_shim":3,"./common_shim":6,"./edge/edge_shim":7,"./firefox/firefox_shim":11,"./safari/safari_shim":14,"./utils":15}],3:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=exports.shimGetUserMedia=void 0;var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)},_getusermedia=require("./getusermedia");Object.defineProperty(exports,"shimGetUserMedia",{enumerable:!0,get:function(){return _getusermedia.shimGetUserMedia}});var _getdisplaymedia=require("./getdisplaymedia");Object.defineProperty(exports,"shimGetDisplayMedia",{enumerable:!0,get:function(){return _getdisplaymedia.shimGetDisplayMedia}}),exports.shimMediaStream=function(window){window.MediaStream=window.MediaStream||window.webkitMediaStream},exports.shimOnTrack=function(window){if("object"===(void 0===window?"undefined":_typeof(window))&&window.RTCPeerConnection&&!("ontrack"in window.RTCPeerConnection.prototype)){Object.defineProperty(window.RTCPeerConnection.prototype,"ontrack",{get:function(){return this._ontrack},set:function(f){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=f)},enumerable:!0,configurable:!0});var origSetRemoteDescription=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(){var _this=this;return this._ontrackpoly||(this._ontrackpoly=function(e){e.stream.addEventListener("addtrack",(function(te){var receiver=void 0;receiver=window.RTCPeerConnection.prototype.getReceivers?_this.getReceivers().find((function(r){return r.track&&r.track.id===te.track.id})):{track:te.track};var event=new Event("track");event.track=te.track,event.receiver=receiver,event.transceiver={receiver:receiver},event.streams=[e.stream],_this.dispatchEvent(event)})),e.stream.getTracks().forEach((function(track){var receiver=void 0;receiver=window.RTCPeerConnection.prototype.getReceivers?_this.getReceivers().find((function(r){return r.track&&r.track.id===track.id})):{track:track};var event=new Event("track");event.track=track,event.receiver=receiver,event.transceiver={receiver:receiver},event.streams=[e.stream],_this.dispatchEvent(event)}))},this.addEventListener("addstream",this._ontrackpoly)),origSetRemoteDescription.apply(this,arguments)}}else utils.wrapPeerConnectionEvent(window,"track",(function(e){return e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e}))},exports.shimGetSendersWithDtmf=function(window){if("object"===(void 0===window?"undefined":_typeof(window))&&window.RTCPeerConnection&&!("getSenders"in window.RTCPeerConnection.prototype)&&"createDTMFSender"in window.RTCPeerConnection.prototype){var shimSenderWithDtmf=function(pc,track){return{track:track,get dtmf(){return void 0===this._dtmf&&("audio"===track.kind?this._dtmf=pc.createDTMFSender(track):this._dtmf=null),this._dtmf},_pc:pc}};if(!window.RTCPeerConnection.prototype.getSenders){window.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};var origAddTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addTrack=function(track,stream){var sender=origAddTrack.apply(this,arguments);return sender||(sender=shimSenderWithDtmf(this,track),this._senders.push(sender)),sender};var origRemoveTrack=window.RTCPeerConnection.prototype.removeTrack;window.RTCPeerConnection.prototype.removeTrack=function(sender){origRemoveTrack.apply(this,arguments);var idx=this._senders.indexOf(sender);-1!==idx&&this._senders.splice(idx,1)}}var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var _this2=this;this._senders=this._senders||[],origAddStream.apply(this,[stream]),stream.getTracks().forEach((function(track){_this2._senders.push(shimSenderWithDtmf(_this2,track))}))};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;window.RTCPeerConnection.prototype.removeStream=function(stream){var _this3=this;this._senders=this._senders||[],origRemoveStream.apply(this,[stream]),stream.getTracks().forEach((function(track){var sender=_this3._senders.find((function(s){return s.track===track}));sender&&_this3._senders.splice(_this3._senders.indexOf(sender),1)}))}}else if("object"===(void 0===window?"undefined":_typeof(window))&&window.RTCPeerConnection&&"getSenders"in window.RTCPeerConnection.prototype&&"createDTMFSender"in window.RTCPeerConnection.prototype&&window.RTCRtpSender&&!("dtmf"in window.RTCRtpSender.prototype)){var origGetSenders=window.RTCPeerConnection.prototype.getSenders;window.RTCPeerConnection.prototype.getSenders=function(){var _this4=this,senders=origGetSenders.apply(this,[]);return senders.forEach((function(sender){return sender._pc=_this4})),senders},Object.defineProperty(window.RTCRtpSender.prototype,"dtmf",{get:function(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}},exports.shimGetStats=function(window){if(!window.RTCPeerConnection)return;var origGetStats=window.RTCPeerConnection.prototype.getStats;window.RTCPeerConnection.prototype.getStats=function(){var _this5=this,_arguments=Array.prototype.slice.call(arguments),selector=_arguments[0],onSucc=_arguments[1],onErr=_arguments[2];if(arguments.length>0&&"function"==typeof selector)return origGetStats.apply(this,arguments);if(0===origGetStats.length&&(0===arguments.length||"function"!=typeof selector))return origGetStats.apply(this,[]);var fixChromeStats_=function(response){var standardReport={};return response.result().forEach((function(report){var standardStats={id:report.id,timestamp:report.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[report.type]||report.type};report.names().forEach((function(name){standardStats[name]=report.stat(name)})),standardReport[standardStats.id]=standardStats})),standardReport},makeMapStats=function(stats){return new Map(Object.keys(stats).map((function(key){return[key,stats[key]]})))};if(arguments.length>=2){var successCallbackWrapper_=function(response){onSucc(makeMapStats(fixChromeStats_(response)))};return origGetStats.apply(this,[successCallbackWrapper_,selector])}return new Promise((function(resolve,reject){origGetStats.apply(_this5,[function(response){resolve(makeMapStats(fixChromeStats_(response)))},reject])})).then(onSucc,onErr)}},exports.shimSenderReceiverGetStats=function(window){if(!("object"===(void 0===window?"undefined":_typeof(window))&&window.RTCPeerConnection&&window.RTCRtpSender&&window.RTCRtpReceiver))return;if(!("getStats"in window.RTCRtpSender.prototype)){var origGetSenders=window.RTCPeerConnection.prototype.getSenders;origGetSenders&&(window.RTCPeerConnection.prototype.getSenders=function(){var _this6=this,senders=origGetSenders.apply(this,[]);return senders.forEach((function(sender){return sender._pc=_this6})),senders});var origAddTrack=window.RTCPeerConnection.prototype.addTrack;origAddTrack&&(window.RTCPeerConnection.prototype.addTrack=function(){var sender=origAddTrack.apply(this,arguments);return sender._pc=this,sender}),window.RTCRtpSender.prototype.getStats=function(){var sender=this;return this._pc.getStats().then((function(result){return utils.filterStats(result,sender.track,!0)}))}}if(!("getStats"in window.RTCRtpReceiver.prototype)){var origGetReceivers=window.RTCPeerConnection.prototype.getReceivers;origGetReceivers&&(window.RTCPeerConnection.prototype.getReceivers=function(){var _this7=this,receivers=origGetReceivers.apply(this,[]);return receivers.forEach((function(receiver){return receiver._pc=_this7})),receivers}),utils.wrapPeerConnectionEvent(window,"track",(function(e){return e.receiver._pc=e.srcElement,e})),window.RTCRtpReceiver.prototype.getStats=function(){var receiver=this;return this._pc.getStats().then((function(result){return utils.filterStats(result,receiver.track,!1)}))}}if(!("getStats"in window.RTCRtpSender.prototype)||!("getStats"in window.RTCRtpReceiver.prototype))return;var origGetStats=window.RTCPeerConnection.prototype.getStats;window.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof window.MediaStreamTrack){var track=arguments[0],sender=void 0,receiver=void 0,err=void 0;return this.getSenders().forEach((function(s){s.track===track&&(sender?err=!0:sender=s)})),this.getReceivers().forEach((function(r){return r.track===track&&(receiver?err=!0:receiver=r),r.track===track})),err||sender&&receiver?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):sender?sender.getStats():receiver?receiver.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return origGetStats.apply(this,arguments)}},exports.shimAddTrackRemoveTrackWithNative=shimAddTrackRemoveTrackWithNative,exports.shimAddTrackRemoveTrack=function(window){if(!window.RTCPeerConnection)return;var browserDetails=utils.detectBrowser(window);if(window.RTCPeerConnection.prototype.addTrack&&browserDetails.version>=65)return shimAddTrackRemoveTrackWithNative(window);var origGetLocalStreams=window.RTCPeerConnection.prototype.getLocalStreams;window.RTCPeerConnection.prototype.getLocalStreams=function(){var _this11=this,nativeStreams=origGetLocalStreams.apply(this);return this._reverseStreams=this._reverseStreams||{},nativeStreams.map((function(stream){return _this11._reverseStreams[stream.id]}))};var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var _this12=this;if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},stream.getTracks().forEach((function(track){if(_this12.getSenders().find((function(s){return s.track===track})))throw new DOMException("Track already exists.","InvalidAccessError")})),!this._reverseStreams[stream.id]){var newStream=new window.MediaStream(stream.getTracks());this._streams[stream.id]=newStream,this._reverseStreams[newStream.id]=stream,stream=newStream}origAddStream.apply(this,[stream])};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;function replaceInternalStreamId(pc,description){var sdp=description.sdp;return Object.keys(pc._reverseStreams||[]).forEach((function(internalId){var externalStream=pc._reverseStreams[internalId],internalStream=pc._streams[externalStream.id];sdp=sdp.replace(new RegExp(internalStream.id,"g"),externalStream.id)})),new RTCSessionDescription({type:description.type,sdp:sdp})}function replaceExternalStreamId(pc,description){var sdp=description.sdp;return Object.keys(pc._reverseStreams||[]).forEach((function(internalId){var externalStream=pc._reverseStreams[internalId],internalStream=pc._streams[externalStream.id];sdp=sdp.replace(new RegExp(externalStream.id,"g"),internalStream.id)})),new RTCSessionDescription({type:description.type,sdp:sdp})}window.RTCPeerConnection.prototype.removeStream=function(stream){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},origRemoveStream.apply(this,[this._streams[stream.id]||stream]),delete this._reverseStreams[this._streams[stream.id]?this._streams[stream.id].id:stream.id],delete this._streams[stream.id]},window.RTCPeerConnection.prototype.addTrack=function(track,stream){var _this13=this;if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");var streams=[].slice.call(arguments,1);if(1!==streams.length||!streams[0].getTracks().find((function(t){return t===track})))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");var alreadyExists=this.getSenders().find((function(s){return s.track===track}));if(alreadyExists)throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};var oldStream=this._streams[stream.id];if(oldStream)oldStream.addTrack(track),Promise.resolve().then((function(){_this13.dispatchEvent(new Event("negotiationneeded"))}));else{var newStream=new window.MediaStream([track]);this._streams[stream.id]=newStream,this._reverseStreams[newStream.id]=stream,this.addStream(newStream)}return this.getSenders().find((function(s){return s.track===track}))},["createOffer","createAnswer"].forEach((function(method){var nativeMethod=window.RTCPeerConnection.prototype[method],methodObj=_defineProperty({},method,(function(){var _this14=this,args=arguments,isLegacyCall=arguments.length&&"function"==typeof arguments[0];return isLegacyCall?nativeMethod.apply(this,[function(description){var desc=replaceInternalStreamId(_this14,description);args[0].apply(null,[desc])},function(err){args[1]&&args[1].apply(null,err)},arguments[2]]):nativeMethod.apply(this,arguments).then((function(description){return replaceInternalStreamId(_this14,description)}))}));window.RTCPeerConnection.prototype[method]=methodObj[method]}));var origSetLocalDescription=window.RTCPeerConnection.prototype.setLocalDescription;window.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=replaceExternalStreamId(this,arguments[0]),origSetLocalDescription.apply(this,arguments)):origSetLocalDescription.apply(this,arguments)};var origLocalDescription=Object.getOwnPropertyDescriptor(window.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(window.RTCPeerConnection.prototype,"localDescription",{get:function(){var description=origLocalDescription.get.apply(this);return""===description.type?description:replaceInternalStreamId(this,description)}}),window.RTCPeerConnection.prototype.removeTrack=function(sender){var _this15=this;if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!sender._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(sender._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{};var stream=void 0;Object.keys(this._streams).forEach((function(streamid){_this15._streams[streamid].getTracks().find((function(track){return sender.track===track}))&&(stream=_this15._streams[streamid])})),stream&&(1===stream.getTracks().length?this.removeStream(this._reverseStreams[stream.id]):stream.removeTrack(sender.track),this.dispatchEvent(new Event("negotiationneeded")))}},exports.shimPeerConnection=function(window){var browserDetails=utils.detectBrowser(window);!window.RTCPeerConnection&&window.webkitRTCPeerConnection&&(window.RTCPeerConnection=window.webkitRTCPeerConnection);if(!window.RTCPeerConnection)return;browserDetails.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(method){var nativeMethod=window.RTCPeerConnection.prototype[method],methodObj=_defineProperty({},method,(function(){return arguments[0]=new("addIceCandidate"===method?window.RTCIceCandidate:window.RTCSessionDescription)(arguments[0]),nativeMethod.apply(this,arguments)}));window.RTCPeerConnection.prototype[method]=methodObj[method]}));var nativeAddIceCandidate=window.RTCPeerConnection.prototype.addIceCandidate;window.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?browserDetails.version<78&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():nativeAddIceCandidate.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())}},exports.fixNegotiationNeeded=function(window){utils.wrapPeerConnectionEvent(window,"negotiationneeded",(function(e){if("stable"===e.target.signalingState)return e}))};var utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils.js"));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}function shimAddTrackRemoveTrackWithNative(window){window.RTCPeerConnection.prototype.getLocalStreams=function(){var _this8=this;return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((function(streamId){return _this8._shimmedLocalStreams[streamId][0]}))};var origAddTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addTrack=function(track,stream){if(!stream)return origAddTrack.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};var sender=origAddTrack.apply(this,arguments);return this._shimmedLocalStreams[stream.id]?-1===this._shimmedLocalStreams[stream.id].indexOf(sender)&&this._shimmedLocalStreams[stream.id].push(sender):this._shimmedLocalStreams[stream.id]=[stream,sender],sender};var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var _this9=this;this._shimmedLocalStreams=this._shimmedLocalStreams||{},stream.getTracks().forEach((function(track){if(_this9.getSenders().find((function(s){return s.track===track})))throw new DOMException("Track already exists.","InvalidAccessError")}));var existingSenders=this.getSenders();origAddStream.apply(this,arguments);var newSenders=this.getSenders().filter((function(newSender){return-1===existingSenders.indexOf(newSender)}));this._shimmedLocalStreams[stream.id]=[stream].concat(newSenders)};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;window.RTCPeerConnection.prototype.removeStream=function(stream){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[stream.id],origRemoveStream.apply(this,arguments)};var origRemoveTrack=window.RTCPeerConnection.prototype.removeTrack;window.RTCPeerConnection.prototype.removeTrack=function(sender){var _this10=this;return this._shimmedLocalStreams=this._shimmedLocalStreams||{},sender&&Object.keys(this._shimmedLocalStreams).forEach((function(streamId){var idx=_this10._shimmedLocalStreams[streamId].indexOf(sender);-1!==idx&&_this10._shimmedLocalStreams[streamId].splice(idx,1),1===_this10._shimmedLocalStreams[streamId].length&&delete _this10._shimmedLocalStreams[streamId]})),origRemoveTrack.apply(this,arguments)}}},{"../utils.js":15,"./getdisplaymedia":4,"./getusermedia":5}],4:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=function(window,getSourceId){if(window.navigator.mediaDevices&&"getDisplayMedia"in window.navigator.mediaDevices)return;if(!window.navigator.mediaDevices)return;if("function"!=typeof getSourceId)return void console.error("shimGetDisplayMedia: getSourceId argument is not a function");window.navigator.mediaDevices.getDisplayMedia=function(constraints){return getSourceId(constraints).then((function(sourceId){var widthSpecified=constraints.video&&constraints.video.width,heightSpecified=constraints.video&&constraints.video.height,frameRateSpecified=constraints.video&&constraints.video.frameRate;return constraints.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:sourceId,maxFrameRate:frameRateSpecified||3}},widthSpecified&&(constraints.video.mandatory.maxWidth=widthSpecified),heightSpecified&&(constraints.video.mandatory.maxHeight=heightSpecified),window.navigator.mediaDevices.getUserMedia(constraints)}))}}},{}],5:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0});var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)};exports.shimGetUserMedia=function(window){var navigator=window&&window.navigator;if(!navigator.mediaDevices)return;var browserDetails=utils.detectBrowser(window),constraintsToChrome_=function(c){if("object"!==(void 0===c?"undefined":_typeof(c))||c.mandatory||c.optional)return c;var cc={};return Object.keys(c).forEach((function(key){if("require"!==key&&"advanced"!==key&&"mediaSource"!==key){var r="object"===_typeof(c[key])?c[key]:{ideal:c[key]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);var oldname_=function(prefix,name){return prefix?prefix+name.charAt(0).toUpperCase()+name.slice(1):"deviceId"===name?"sourceId":name};if(void 0!==r.ideal){cc.optional=cc.optional||[];var oc={};"number"==typeof r.ideal?(oc[oldname_("min",key)]=r.ideal,cc.optional.push(oc),(oc={})[oldname_("max",key)]=r.ideal,cc.optional.push(oc)):(oc[oldname_("",key)]=r.ideal,cc.optional.push(oc))}void 0!==r.exact&&"number"!=typeof r.exact?(cc.mandatory=cc.mandatory||{},cc.mandatory[oldname_("",key)]=r.exact):["min","max"].forEach((function(mix){void 0!==r[mix]&&(cc.mandatory=cc.mandatory||{},cc.mandatory[oldname_(mix,key)]=r[mix])}))}})),c.advanced&&(cc.optional=(cc.optional||[]).concat(c.advanced)),cc},shimConstraints_=function(constraints,func){if(browserDetails.version>=61)return func(constraints);if((constraints=JSON.parse(JSON.stringify(constraints)))&&"object"===_typeof(constraints.audio)){var remap=function(obj,a,b){a in obj&&!(b in obj)&&(obj[b]=obj[a],delete obj[a])};remap((constraints=JSON.parse(JSON.stringify(constraints))).audio,"autoGainControl","googAutoGainControl"),remap(constraints.audio,"noiseSuppression","googNoiseSuppression"),constraints.audio=constraintsToChrome_(constraints.audio)}if(constraints&&"object"===_typeof(constraints.video)){var face=constraints.video.facingMode;face=face&&("object"===(void 0===face?"undefined":_typeof(face))?face:{ideal:face});var getSupportedFacingModeLies=browserDetails.version<66;if(face&&("user"===face.exact||"environment"===face.exact||"user"===face.ideal||"environment"===face.ideal)&&(!navigator.mediaDevices.getSupportedConstraints||!navigator.mediaDevices.getSupportedConstraints().facingMode||getSupportedFacingModeLies)){delete constraints.video.facingMode;var matches=void 0;if("environment"===face.exact||"environment"===face.ideal?matches=["back","rear"]:"user"!==face.exact&&"user"!==face.ideal||(matches=["front"]),matches)return navigator.mediaDevices.enumerateDevices().then((function(devices){var dev=(devices=devices.filter((function(d){return"videoinput"===d.kind}))).find((function(d){return matches.some((function(match){return d.label.toLowerCase().includes(match)}))}));return!dev&&devices.length&&matches.includes("back")&&(dev=devices[devices.length-1]),dev&&(constraints.video.deviceId=face.exact?{exact:dev.deviceId}:{ideal:dev.deviceId}),constraints.video=constraintsToChrome_(constraints.video),logging("chrome: "+JSON.stringify(constraints)),func(constraints)}))}constraints.video=constraintsToChrome_(constraints.video)}return logging("chrome: "+JSON.stringify(constraints)),func(constraints)},shimError_=function(e){return browserDetails.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}};if(navigator.getUserMedia=function(constraints,onSuccess,onError){shimConstraints_(constraints,(function(c){navigator.webkitGetUserMedia(c,onSuccess,(function(e){onError&&onError(shimError_(e))}))}))}.bind(navigator),navigator.mediaDevices.getUserMedia){var origGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);navigator.mediaDevices.getUserMedia=function(cs){return shimConstraints_(cs,(function(c){return origGetUserMedia(c).then((function(stream){if(c.audio&&!stream.getAudioTracks().length||c.video&&!stream.getVideoTracks().length)throw stream.getTracks().forEach((function(track){track.stop()})),new DOMException("","NotFoundError");return stream}),(function(e){return Promise.reject(shimError_(e))}))}))}}};var utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils.js"));var logging=utils.log},{"../utils.js":15}],6:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0});var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)};exports.shimRTCIceCandidate=function(window){if(!window.RTCIceCandidate||window.RTCIceCandidate&&"foundation"in window.RTCIceCandidate.prototype)return;var NativeRTCIceCandidate=window.RTCIceCandidate;window.RTCIceCandidate=function(args){if("object"===(void 0===args?"undefined":_typeof(args))&&args.candidate&&0===args.candidate.indexOf("a=")&&((args=JSON.parse(JSON.stringify(args))).candidate=args.candidate.substr(2)),args.candidate&&args.candidate.length){var nativeCandidate=new NativeRTCIceCandidate(args),parsedCandidate=_sdp2.default.parseCandidate(args.candidate),augmentedCandidate=Object.assign(nativeCandidate,parsedCandidate);return augmentedCandidate.toJSON=function(){return{candidate:augmentedCandidate.candidate,sdpMid:augmentedCandidate.sdpMid,sdpMLineIndex:augmentedCandidate.sdpMLineIndex,usernameFragment:augmentedCandidate.usernameFragment}},augmentedCandidate}return new NativeRTCIceCandidate(args)},window.RTCIceCandidate.prototype=NativeRTCIceCandidate.prototype,utils.wrapPeerConnectionEvent(window,"icecandidate",(function(e){return e.candidate&&Object.defineProperty(e,"candidate",{value:new window.RTCIceCandidate(e.candidate),writable:"false"}),e}))},exports.shimMaxMessageSize=function(window){if(!window.RTCPeerConnection)return;var browserDetails=utils.detectBrowser(window);"sctp"in window.RTCPeerConnection.prototype||Object.defineProperty(window.RTCPeerConnection.prototype,"sctp",{get:function(){return void 0===this._sctp?null:this._sctp}});var sctpInDescription=function(description){if(!description||!description.sdp)return!1;var sections=_sdp2.default.splitSections(description.sdp);return sections.shift(),sections.some((function(mediaSection){var mLine=_sdp2.default.parseMLine(mediaSection);return mLine&&"application"===mLine.kind&&-1!==mLine.protocol.indexOf("SCTP")}))},getRemoteFirefoxVersion=function(description){var match=description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===match||match.length<2)return-1;var version=parseInt(match[1],10);return version!=version?-1:version},getCanSendMaxMessageSize=function(remoteIsFirefox){var canSendMaxMessageSize=65536;return"firefox"===browserDetails.browser&&(canSendMaxMessageSize=browserDetails.version<57?-1===remoteIsFirefox?16384:2147483637:browserDetails.version<60?57===browserDetails.version?65535:65536:2147483637),canSendMaxMessageSize},getMaxMessageSize=function(description,remoteIsFirefox){var maxMessageSize=65536;"firefox"===browserDetails.browser&&57===browserDetails.version&&(maxMessageSize=65535);var match=_sdp2.default.matchPrefix(description.sdp,"a=max-message-size:");return match.length>0?maxMessageSize=parseInt(match[0].substr(19),10):"firefox"===browserDetails.browser&&-1!==remoteIsFirefox&&(maxMessageSize=2147483637),maxMessageSize},origSetRemoteDescription=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===browserDetails.browser&&browserDetails.version>=76){var _getConfiguration=this.getConfiguration(),sdpSemantics=_getConfiguration.sdpSemantics;"plan-b"===sdpSemantics&&Object.defineProperty(this,"sctp",{get:function(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0})}if(sctpInDescription(arguments[0])){var isFirefox=getRemoteFirefoxVersion(arguments[0]),canSendMMS=getCanSendMaxMessageSize(isFirefox),remoteMMS=getMaxMessageSize(arguments[0],isFirefox),maxMessageSize=void 0;maxMessageSize=0===canSendMMS&&0===remoteMMS?Number.POSITIVE_INFINITY:0===canSendMMS||0===remoteMMS?Math.max(canSendMMS,remoteMMS):Math.min(canSendMMS,remoteMMS);var sctp={};Object.defineProperty(sctp,"maxMessageSize",{get:function(){return maxMessageSize}}),this._sctp=sctp}return origSetRemoteDescription.apply(this,arguments)}},exports.shimSendThrowTypeError=function(window){if(!window.RTCPeerConnection||!("createDataChannel"in window.RTCPeerConnection.prototype))return;function wrapDcSend(dc,pc){var origDataChannelSend=dc.send;dc.send=function(){var data=arguments[0],length=data.length||data.size||data.byteLength;if("open"===dc.readyState&&pc.sctp&&length>pc.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+pc.sctp.maxMessageSize+" bytes)");return origDataChannelSend.apply(dc,arguments)}}var origCreateDataChannel=window.RTCPeerConnection.prototype.createDataChannel;window.RTCPeerConnection.prototype.createDataChannel=function(){var dataChannel=origCreateDataChannel.apply(this,arguments);return wrapDcSend(dataChannel,this),dataChannel},utils.wrapPeerConnectionEvent(window,"datachannel",(function(e){return wrapDcSend(e.channel,e.target),e}))},exports.shimConnectionState=function(window){if(!window.RTCPeerConnection||"connectionState"in window.RTCPeerConnection.prototype)return;var proto=window.RTCPeerConnection.prototype;Object.defineProperty(proto,"connectionState",{get:function(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(proto,"onconnectionstatechange",{get:function(){return this._onconnectionstatechange||null},set:function(cb){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),cb&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=cb)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((function(method){var origMethod=proto[method];proto[method]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=function(e){var pc=e.target;if(pc._lastConnectionState!==pc.connectionState){pc._lastConnectionState=pc.connectionState;var newEvent=new Event("connectionstatechange",e);pc.dispatchEvent(newEvent)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),origMethod.apply(this,arguments)}}))},exports.removeAllowExtmapMixed=function(window){if(!window.RTCPeerConnection)return;var browserDetails=utils.detectBrowser(window);if("chrome"===browserDetails.browser&&browserDetails.version>=71)return;var nativeSRD=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(desc){return desc&&desc.sdp&&-1!==desc.sdp.indexOf("\na=extmap-allow-mixed")&&(desc.sdp=desc.sdp.split("\n").filter((function(line){return"a=extmap-allow-mixed"!==line.trim()})).join("\n")),nativeSRD.apply(this,arguments)}};var obj,_sdp=require("sdp"),_sdp2=(obj=_sdp)&&obj.__esModule?obj:{default:obj},utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("./utils"))},{"./utils":15,sdp:17}],7:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=exports.shimGetUserMedia=void 0;var _getusermedia=require("./getusermedia");Object.defineProperty(exports,"shimGetUserMedia",{enumerable:!0,get:function(){return _getusermedia.shimGetUserMedia}});var _getdisplaymedia=require("./getdisplaymedia");Object.defineProperty(exports,"shimGetDisplayMedia",{enumerable:!0,get:function(){return _getdisplaymedia.shimGetDisplayMedia}}),exports.shimPeerConnection=function(window){var browserDetails=utils.detectBrowser(window);if(window.RTCIceGatherer&&(window.RTCIceCandidate||(window.RTCIceCandidate=function(args){return args}),window.RTCSessionDescription||(window.RTCSessionDescription=function(args){return args}),browserDetails.version<15025)){var origMSTEnabled=Object.getOwnPropertyDescriptor(window.MediaStreamTrack.prototype,"enabled");Object.defineProperty(window.MediaStreamTrack.prototype,"enabled",{set:function(value){origMSTEnabled.set.call(this,value);var ev=new Event("enabled");ev.enabled=value,this.dispatchEvent(ev)}})}window.RTCRtpSender&&!("dtmf"in window.RTCRtpSender.prototype)&&Object.defineProperty(window.RTCRtpSender.prototype,"dtmf",{get:function(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=new window.RTCDtmfSender(this):"video"===this.track.kind&&(this._dtmf=null)),this._dtmf}});window.RTCDtmfSender&&!window.RTCDTMFSender&&(window.RTCDTMFSender=window.RTCDtmfSender);var RTCPeerConnectionShim=(0,_rtcpeerconnectionShim2.default)(window,browserDetails.version);window.RTCPeerConnection=function(config){return config&&config.iceServers&&(config.iceServers=(0,_filtericeservers.filterIceServers)(config.iceServers,browserDetails.version),utils.log("ICE servers after filtering:",config.iceServers)),new RTCPeerConnectionShim(config)},window.RTCPeerConnection.prototype=RTCPeerConnectionShim.prototype},exports.shimReplaceTrack=function(window){window.RTCRtpSender&&!("replaceTrack"in window.RTCRtpSender.prototype)&&(window.RTCRtpSender.prototype.replaceTrack=window.RTCRtpSender.prototype.setTrack)};var obj,utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils")),_filtericeservers=require("./filtericeservers"),_rtcpeerconnectionShim=require("rtcpeerconnection-shim"),_rtcpeerconnectionShim2=(obj=_rtcpeerconnectionShim)&&obj.__esModule?obj:{default:obj}},{"../utils":15,"./filtericeservers":8,"./getdisplaymedia":9,"./getusermedia":10,"rtcpeerconnection-shim":16}],8:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.filterIceServers=function(iceServers,edgeVersion){var hasTurn=!1;return(iceServers=JSON.parse(JSON.stringify(iceServers))).filter((function(server){if(server&&(server.urls||server.url)){var urls=server.urls||server.url;server.url&&!server.urls&&utils.deprecated("RTCIceServer.url","RTCIceServer.urls");var isString="string"==typeof urls;return isString&&(urls=[urls]),urls=urls.filter((function(url){if(0===url.indexOf("stun:"))return!1;var validTurn=url.startsWith("turn")&&!url.startsWith("turn:[")&&url.includes("transport=udp");return validTurn&&!hasTurn?(hasTurn=!0,!0):validTurn&&!hasTurn})),delete server.url,server.urls=isString?urls[0]:urls,!!urls.length}}))};var utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils"))},{"../utils":15}],9:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=function(window){if(!("getDisplayMedia"in window.navigator))return;if(!window.navigator.mediaDevices)return;if(window.navigator.mediaDevices&&"getDisplayMedia"in window.navigator.mediaDevices)return;window.navigator.mediaDevices.getDisplayMedia=window.navigator.getDisplayMedia.bind(window.navigator)}},{}],10:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetUserMedia=function(window){var navigator=window&&window.navigator,origGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);navigator.mediaDevices.getUserMedia=function(c){return origGetUserMedia(c).catch((function(e){return Promise.reject(function(e){return{name:{PermissionDeniedError:"NotAllowedError"}[e.name]||e.name,message:e.message,constraint:e.constraint,toString:function(){return this.name}}}(e))}))}}},{}],11:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=exports.shimGetUserMedia=void 0;var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)},_getusermedia=require("./getusermedia");Object.defineProperty(exports,"shimGetUserMedia",{enumerable:!0,get:function(){return _getusermedia.shimGetUserMedia}});var _getdisplaymedia=require("./getdisplaymedia");Object.defineProperty(exports,"shimGetDisplayMedia",{enumerable:!0,get:function(){return _getdisplaymedia.shimGetDisplayMedia}}),exports.shimOnTrack=function(window){"object"===(void 0===window?"undefined":_typeof(window))&&window.RTCTrackEvent&&"receiver"in window.RTCTrackEvent.prototype&&!("transceiver"in window.RTCTrackEvent.prototype)&&Object.defineProperty(window.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})},exports.shimPeerConnection=function(window){var browserDetails=utils.detectBrowser(window);if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection&&!window.mozRTCPeerConnection)return;!window.RTCPeerConnection&&window.mozRTCPeerConnection&&(window.RTCPeerConnection=window.mozRTCPeerConnection);browserDetails.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(method){var nativeMethod=window.RTCPeerConnection.prototype[method],methodObj=function(obj,key,value){key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value;return obj}({},method,(function(){return arguments[0]=new("addIceCandidate"===method?window.RTCIceCandidate:window.RTCSessionDescription)(arguments[0]),nativeMethod.apply(this,arguments)}));window.RTCPeerConnection.prototype[method]=methodObj[method]}));if(browserDetails.version<68){var nativeAddIceCandidate=window.RTCPeerConnection.prototype.addIceCandidate;window.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?arguments[0]&&""===arguments[0].candidate?Promise.resolve():nativeAddIceCandidate.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())}}var modernStatsTypes={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},nativeGetStats=window.RTCPeerConnection.prototype.getStats;window.RTCPeerConnection.prototype.getStats=function(){var _arguments=Array.prototype.slice.call(arguments),selector=_arguments[0],onSucc=_arguments[1],onErr=_arguments[2];return nativeGetStats.apply(this,[selector||null]).then((function(stats){if(browserDetails.version<53&&!onSucc)try{stats.forEach((function(stat){stat.type=modernStatsTypes[stat.type]||stat.type}))}catch(e){if("TypeError"!==e.name)throw e;stats.forEach((function(stat,i){stats.set(i,Object.assign({},stat,{type:modernStatsTypes[stat.type]||stat.type}))}))}return stats})).then(onSucc,onErr)}},exports.shimSenderGetStats=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection||!window.RTCRtpSender)return;if(window.RTCRtpSender&&"getStats"in window.RTCRtpSender.prototype)return;var origGetSenders=window.RTCPeerConnection.prototype.getSenders;origGetSenders&&(window.RTCPeerConnection.prototype.getSenders=function(){var _this=this,senders=origGetSenders.apply(this,[]);return senders.forEach((function(sender){return sender._pc=_this})),senders});var origAddTrack=window.RTCPeerConnection.prototype.addTrack;origAddTrack&&(window.RTCPeerConnection.prototype.addTrack=function(){var sender=origAddTrack.apply(this,arguments);return sender._pc=this,sender});window.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}},exports.shimReceiverGetStats=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection||!window.RTCRtpSender)return;if(window.RTCRtpSender&&"getStats"in window.RTCRtpReceiver.prototype)return;var origGetReceivers=window.RTCPeerConnection.prototype.getReceivers;origGetReceivers&&(window.RTCPeerConnection.prototype.getReceivers=function(){var _this2=this,receivers=origGetReceivers.apply(this,[]);return receivers.forEach((function(receiver){return receiver._pc=_this2})),receivers});utils.wrapPeerConnectionEvent(window,"track",(function(e){return e.receiver._pc=e.srcElement,e})),window.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}},exports.shimRemoveStream=function(window){if(!window.RTCPeerConnection||"removeStream"in window.RTCPeerConnection.prototype)return;window.RTCPeerConnection.prototype.removeStream=function(stream){var _this3=this;utils.deprecated("removeStream","removeTrack"),this.getSenders().forEach((function(sender){sender.track&&stream.getTracks().includes(sender.track)&&_this3.removeTrack(sender)}))}},exports.shimRTCDataChannel=function(window){window.DataChannel&&!window.RTCDataChannel&&(window.RTCDataChannel=window.DataChannel)},exports.shimAddTransceiver=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;var origAddTransceiver=window.RTCPeerConnection.prototype.addTransceiver;origAddTransceiver&&(window.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];var initParameters=arguments[1],shouldPerformCheck=initParameters&&"sendEncodings"in initParameters;shouldPerformCheck&&initParameters.sendEncodings.forEach((function(encodingParam){if("rid"in encodingParam){if(!/^[a-z0-9]{0,16}$/i.test(encodingParam.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in encodingParam&&!(parseFloat(encodingParam.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in encodingParam&&!(parseFloat(encodingParam.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));var transceiver=origAddTransceiver.apply(this,arguments);if(shouldPerformCheck){var sender=transceiver.sender,params=sender.getParameters();"encodings"in params||(params.encodings=initParameters.sendEncodings,this.setParametersPromises.push(sender.setParameters(params).catch((function(){}))))}return transceiver})},exports.shimCreateOffer=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;var origCreateOffer=window.RTCPeerConnection.prototype.createOffer;window.RTCPeerConnection.prototype.createOffer=function(){var _this4=this,_arguments2=arguments;return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((function(){return origCreateOffer.apply(_this4,_arguments2)})).finally((function(){_this4.setParametersPromises=[]})):origCreateOffer.apply(this,arguments)}},exports.shimCreateAnswer=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;var origCreateAnswer=window.RTCPeerConnection.prototype.createAnswer;window.RTCPeerConnection.prototype.createAnswer=function(){var _this5=this,_arguments3=arguments;return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((function(){return origCreateAnswer.apply(_this5,_arguments3)})).finally((function(){_this5.setParametersPromises=[]})):origCreateAnswer.apply(this,arguments)}};var utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils"))},{"../utils":15,"./getdisplaymedia":12,"./getusermedia":13}],12:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=function(window,preferredMediaSource){if(window.navigator.mediaDevices&&"getDisplayMedia"in window.navigator.mediaDevices)return;if(!window.navigator.mediaDevices)return;window.navigator.mediaDevices.getDisplayMedia=function(constraints){if(!constraints||!constraints.video){var err=new DOMException("getDisplayMedia without video constraints is undefined");return err.name="NotFoundError",err.code=8,Promise.reject(err)}return!0===constraints.video?constraints.video={mediaSource:preferredMediaSource}:constraints.video.mediaSource=preferredMediaSource,window.navigator.mediaDevices.getUserMedia(constraints)}}},{}],13:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0});var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)};exports.shimGetUserMedia=function(window){var browserDetails=utils.detectBrowser(window),navigator=window&&window.navigator,MediaStreamTrack=window&&window.MediaStreamTrack;if(navigator.getUserMedia=function(constraints,onSuccess,onError){utils.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),navigator.mediaDevices.getUserMedia(constraints).then(onSuccess,onError)},!(browserDetails.version>55&&"autoGainControl"in navigator.mediaDevices.getSupportedConstraints())){var remap=function(obj,a,b){a in obj&&!(b in obj)&&(obj[b]=obj[a],delete obj[a])},nativeGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);if(navigator.mediaDevices.getUserMedia=function(c){return"object"===(void 0===c?"undefined":_typeof(c))&&"object"===_typeof(c.audio)&&(c=JSON.parse(JSON.stringify(c)),remap(c.audio,"autoGainControl","mozAutoGainControl"),remap(c.audio,"noiseSuppression","mozNoiseSuppression")),nativeGetUserMedia(c)},MediaStreamTrack&&MediaStreamTrack.prototype.getSettings){var nativeGetSettings=MediaStreamTrack.prototype.getSettings;MediaStreamTrack.prototype.getSettings=function(){var obj=nativeGetSettings.apply(this,arguments);return remap(obj,"mozAutoGainControl","autoGainControl"),remap(obj,"mozNoiseSuppression","noiseSuppression"),obj}}if(MediaStreamTrack&&MediaStreamTrack.prototype.applyConstraints){var nativeApplyConstraints=MediaStreamTrack.prototype.applyConstraints;MediaStreamTrack.prototype.applyConstraints=function(c){return"audio"===this.kind&&"object"===(void 0===c?"undefined":_typeof(c))&&(c=JSON.parse(JSON.stringify(c)),remap(c,"autoGainControl","mozAutoGainControl"),remap(c,"noiseSuppression","mozNoiseSuppression")),nativeApplyConstraints.apply(this,[c])}}}};var utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils"))},{"../utils":15}],14:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0});var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)};exports.shimLocalStreamsAPI=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;"getLocalStreams"in window.RTCPeerConnection.prototype||(window.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams});if(!("addStream"in window.RTCPeerConnection.prototype)){var _addTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addStream=function(stream){var _this=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(stream)||this._localStreams.push(stream),stream.getAudioTracks().forEach((function(track){return _addTrack.call(_this,track,stream)})),stream.getVideoTracks().forEach((function(track){return _addTrack.call(_this,track,stream)}))},window.RTCPeerConnection.prototype.addTrack=function(track){var stream=arguments[1];return stream&&(this._localStreams?this._localStreams.includes(stream)||this._localStreams.push(stream):this._localStreams=[stream]),_addTrack.apply(this,arguments)}}"removeStream"in window.RTCPeerConnection.prototype||(window.RTCPeerConnection.prototype.removeStream=function(stream){var _this2=this;this._localStreams||(this._localStreams=[]);var index=this._localStreams.indexOf(stream);if(-1!==index){this._localStreams.splice(index,1);var tracks=stream.getTracks();this.getSenders().forEach((function(sender){tracks.includes(sender.track)&&_this2.removeTrack(sender)}))}})},exports.shimRemoteStreamsAPI=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;"getRemoteStreams"in window.RTCPeerConnection.prototype||(window.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]});if(!("onaddstream"in window.RTCPeerConnection.prototype)){Object.defineProperty(window.RTCPeerConnection.prototype,"onaddstream",{get:function(){return this._onaddstream},set:function(f){var _this3=this;this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=f),this.addEventListener("track",this._onaddstreampoly=function(e){e.streams.forEach((function(stream){if(_this3._remoteStreams||(_this3._remoteStreams=[]),!_this3._remoteStreams.includes(stream)){_this3._remoteStreams.push(stream);var event=new Event("addstream");event.stream=stream,_this3.dispatchEvent(event)}}))})}});var origSetRemoteDescription=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(){var pc=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(e){e.streams.forEach((function(stream){if(pc._remoteStreams||(pc._remoteStreams=[]),!(pc._remoteStreams.indexOf(stream)>=0)){pc._remoteStreams.push(stream);var event=new Event("addstream");event.stream=stream,pc.dispatchEvent(event)}}))}),origSetRemoteDescription.apply(pc,arguments)}}},exports.shimCallbacksAPI=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;var prototype=window.RTCPeerConnection.prototype,origCreateOffer=prototype.createOffer,origCreateAnswer=prototype.createAnswer,setLocalDescription=prototype.setLocalDescription,setRemoteDescription=prototype.setRemoteDescription,addIceCandidate=prototype.addIceCandidate;prototype.createOffer=function(successCallback,failureCallback){var options=arguments.length>=2?arguments[2]:arguments[0],promise=origCreateOffer.apply(this,[options]);return failureCallback?(promise.then(successCallback,failureCallback),Promise.resolve()):promise},prototype.createAnswer=function(successCallback,failureCallback){var options=arguments.length>=2?arguments[2]:arguments[0],promise=origCreateAnswer.apply(this,[options]);return failureCallback?(promise.then(successCallback,failureCallback),Promise.resolve()):promise};var withCallback=function(description,successCallback,failureCallback){var promise=setLocalDescription.apply(this,[description]);return failureCallback?(promise.then(successCallback,failureCallback),Promise.resolve()):promise};prototype.setLocalDescription=withCallback,withCallback=function(description,successCallback,failureCallback){var promise=setRemoteDescription.apply(this,[description]);return failureCallback?(promise.then(successCallback,failureCallback),Promise.resolve()):promise},prototype.setRemoteDescription=withCallback,withCallback=function(candidate,successCallback,failureCallback){var promise=addIceCandidate.apply(this,[candidate]);return failureCallback?(promise.then(successCallback,failureCallback),Promise.resolve()):promise},prototype.addIceCandidate=withCallback},exports.shimGetUserMedia=function(window){var navigator=window&&window.navigator;if(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){var mediaDevices=navigator.mediaDevices,_getUserMedia=mediaDevices.getUserMedia.bind(mediaDevices);navigator.mediaDevices.getUserMedia=function(constraints){return _getUserMedia(shimConstraints(constraints))}}!navigator.getUserMedia&&navigator.mediaDevices&&navigator.mediaDevices.getUserMedia&&(navigator.getUserMedia=function(constraints,cb,errcb){navigator.mediaDevices.getUserMedia(constraints).then(cb,errcb)}.bind(navigator))},exports.shimConstraints=shimConstraints,exports.shimRTCIceServerUrls=function(window){var OrigPeerConnection=window.RTCPeerConnection;window.RTCPeerConnection=function(pcConfig,pcConstraints){if(pcConfig&&pcConfig.iceServers){for(var newIceServers=[],i=0;i=pos&&parseInt(match[pos],10)}function isObject(val){return"[object Object]"===Object.prototype.toString.call(val)}function walkStats(stats,base,resultSet){base&&!resultSet.has(base.id)&&(resultSet.set(base.id,base),Object.keys(base).forEach((function(name){name.endsWith("Id")?walkStats(stats,stats.get(base[name]),resultSet):name.endsWith("Ids")&&base[name].forEach((function(id){walkStats(stats,stats.get(id),resultSet)}))})))}},{}],16:[function(require,module,exports){var SDPUtils=require("sdp");function writeMediaSection(transceiver,caps,type,stream,dtlsRole){var sdp=SDPUtils.writeRtpDescription(transceiver.kind,caps);if(sdp+=SDPUtils.writeIceParameters(transceiver.iceGatherer.getLocalParameters()),sdp+=SDPUtils.writeDtlsParameters(transceiver.dtlsTransport.getLocalParameters(),"offer"===type?"actpass":dtlsRole||"active"),sdp+="a=mid:"+transceiver.mid+"\r\n",transceiver.rtpSender&&transceiver.rtpReceiver?sdp+="a=sendrecv\r\n":transceiver.rtpSender?sdp+="a=sendonly\r\n":transceiver.rtpReceiver?sdp+="a=recvonly\r\n":sdp+="a=inactive\r\n",transceiver.rtpSender){var trackId=transceiver.rtpSender._initialTrackId||transceiver.rtpSender.track.id;transceiver.rtpSender._initialTrackId=trackId;var msid="msid:"+(stream?stream.id:"-")+" "+trackId+"\r\n";sdp+="a="+msid,sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].ssrc+" "+msid,transceiver.sendEncodingParameters[0].rtx&&(sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].rtx.ssrc+" "+msid,sdp+="a=ssrc-group:FID "+transceiver.sendEncodingParameters[0].ssrc+" "+transceiver.sendEncodingParameters[0].rtx.ssrc+"\r\n")}return sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].ssrc+" cname:"+SDPUtils.localCName+"\r\n",transceiver.rtpSender&&transceiver.sendEncodingParameters[0].rtx&&(sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].rtx.ssrc+" cname:"+SDPUtils.localCName+"\r\n"),sdp}function getCommonCapabilities(localCapabilities,remoteCapabilities){var commonCapabilities={codecs:[],headerExtensions:[],fecMechanisms:[]},findCodecByPayloadType=function(pt,codecs){pt=parseInt(pt,10);for(var i=0;i=14393&&-1===url.indexOf("?transport=udp"):(hasTurn=!0,!0)})),delete server.url,server.urls=isString?urls[0]:urls,!!urls.length}}))}(config.iceServers||[],edgeVersion),this._iceGatherers=[],config.iceCandidatePoolSize)for(var i=config.iceCandidatePoolSize;i>0;i--)this._iceGatherers.push(new window.RTCIceGatherer({iceServers:config.iceServers,gatherPolicy:config.iceTransportPolicy}));else config.iceCandidatePoolSize=0;this._config=config,this.transceivers=[],this._sdpSessionId=SDPUtils.generateSessionId(),this._sdpSessionVersion=0,this._dtlsRole=void 0,this._isClosed=!1};Object.defineProperty(RTCPeerConnection.prototype,"localDescription",{configurable:!0,get:function(){return this._localDescription}}),Object.defineProperty(RTCPeerConnection.prototype,"remoteDescription",{configurable:!0,get:function(){return this._remoteDescription}}),RTCPeerConnection.prototype.onicecandidate=null,RTCPeerConnection.prototype.onaddstream=null,RTCPeerConnection.prototype.ontrack=null,RTCPeerConnection.prototype.onremovestream=null,RTCPeerConnection.prototype.onsignalingstatechange=null,RTCPeerConnection.prototype.oniceconnectionstatechange=null,RTCPeerConnection.prototype.onconnectionstatechange=null,RTCPeerConnection.prototype.onicegatheringstatechange=null,RTCPeerConnection.prototype.onnegotiationneeded=null,RTCPeerConnection.prototype.ondatachannel=null,RTCPeerConnection.prototype._dispatchEvent=function(name,event){this._isClosed||(this.dispatchEvent(event),"function"==typeof this["on"+name]&&this["on"+name](event))},RTCPeerConnection.prototype._emitGatheringStateChange=function(){var event=new Event("icegatheringstatechange");this._dispatchEvent("icegatheringstatechange",event)},RTCPeerConnection.prototype.getConfiguration=function(){return this._config},RTCPeerConnection.prototype.getLocalStreams=function(){return this.localStreams},RTCPeerConnection.prototype.getRemoteStreams=function(){return this.remoteStreams},RTCPeerConnection.prototype._createTransceiver=function(kind,doNotAdd){var hasBundleTransport=this.transceivers.length>0,transceiver={track:null,iceGatherer:null,iceTransport:null,dtlsTransport:null,localCapabilities:null,remoteCapabilities:null,rtpSender:null,rtpReceiver:null,kind:kind,mid:null,sendEncodingParameters:null,recvEncodingParameters:null,stream:null,associatedRemoteMediaStreams:[],wantReceive:!0};if(this.usingBundle&&hasBundleTransport)transceiver.iceTransport=this.transceivers[0].iceTransport,transceiver.dtlsTransport=this.transceivers[0].dtlsTransport;else{var transports=this._createIceAndDtlsTransports();transceiver.iceTransport=transports.iceTransport,transceiver.dtlsTransport=transports.dtlsTransport}return doNotAdd||this.transceivers.push(transceiver),transceiver},RTCPeerConnection.prototype.addTrack=function(track,stream){if(this._isClosed)throw makeError("InvalidStateError","Attempted to call addTrack on a closed peerconnection.");var transceiver;if(this.transceivers.find((function(s){return s.track===track})))throw makeError("InvalidAccessError","Track already exists.");for(var i=0;i=15025)stream.getTracks().forEach((function(track){pc.addTrack(track,stream)}));else{var clonedStream=stream.clone();stream.getTracks().forEach((function(track,idx){var clonedTrack=clonedStream.getTracks()[idx];track.addEventListener("enabled",(function(event){clonedTrack.enabled=event.enabled}))})),clonedStream.getTracks().forEach((function(track){pc.addTrack(track,clonedStream)}))}},RTCPeerConnection.prototype.removeTrack=function(sender){if(this._isClosed)throw makeError("InvalidStateError","Attempted to call removeTrack on a closed peerconnection.");if(!(sender instanceof window.RTCRtpSender))throw new TypeError("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.");var transceiver=this.transceivers.find((function(t){return t.rtpSender===sender}));if(!transceiver)throw makeError("InvalidAccessError","Sender was not created by this connection.");var stream=transceiver.stream;transceiver.rtpSender.stop(),transceiver.rtpSender=null,transceiver.track=null,transceiver.stream=null,-1===this.transceivers.map((function(t){return t.stream})).indexOf(stream)&&this.localStreams.indexOf(stream)>-1&&this.localStreams.splice(this.localStreams.indexOf(stream),1),this._maybeFireNegotiationNeeded()},RTCPeerConnection.prototype.removeStream=function(stream){var pc=this;stream.getTracks().forEach((function(track){var sender=pc.getSenders().find((function(s){return s.track===track}));sender&&pc.removeTrack(sender)}))},RTCPeerConnection.prototype.getSenders=function(){return this.transceivers.filter((function(transceiver){return!!transceiver.rtpSender})).map((function(transceiver){return transceiver.rtpSender}))},RTCPeerConnection.prototype.getReceivers=function(){return this.transceivers.filter((function(transceiver){return!!transceiver.rtpReceiver})).map((function(transceiver){return transceiver.rtpReceiver}))},RTCPeerConnection.prototype._createIceGatherer=function(sdpMLineIndex,usingBundle){var pc=this;if(usingBundle&&sdpMLineIndex>0)return this.transceivers[0].iceGatherer;if(this._iceGatherers.length)return this._iceGatherers.shift();var iceGatherer=new window.RTCIceGatherer({iceServers:this._config.iceServers,gatherPolicy:this._config.iceTransportPolicy});return Object.defineProperty(iceGatherer,"state",{value:"new",writable:!0}),this.transceivers[sdpMLineIndex].bufferedCandidateEvents=[],this.transceivers[sdpMLineIndex].bufferCandidates=function(event){var end=!event.candidate||0===Object.keys(event.candidate).length;iceGatherer.state=end?"completed":"gathering",null!==pc.transceivers[sdpMLineIndex].bufferedCandidateEvents&&pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event)},iceGatherer.addEventListener("localcandidate",this.transceivers[sdpMLineIndex].bufferCandidates),iceGatherer},RTCPeerConnection.prototype._gather=function(mid,sdpMLineIndex){var pc=this,iceGatherer=this.transceivers[sdpMLineIndex].iceGatherer;if(!iceGatherer.onlocalcandidate){var bufferedCandidateEvents=this.transceivers[sdpMLineIndex].bufferedCandidateEvents;this.transceivers[sdpMLineIndex].bufferedCandidateEvents=null,iceGatherer.removeEventListener("localcandidate",this.transceivers[sdpMLineIndex].bufferCandidates),iceGatherer.onlocalcandidate=function(evt){if(!(pc.usingBundle&&sdpMLineIndex>0)){var event=new Event("icecandidate");event.candidate={sdpMid:mid,sdpMLineIndex:sdpMLineIndex};var cand=evt.candidate,end=!cand||0===Object.keys(cand).length;if(end)"new"!==iceGatherer.state&&"gathering"!==iceGatherer.state||(iceGatherer.state="completed");else{"new"===iceGatherer.state&&(iceGatherer.state="gathering"),cand.component=1,cand.ufrag=iceGatherer.getLocalParameters().usernameFragment;var serializedCandidate=SDPUtils.writeCandidate(cand);event.candidate=Object.assign(event.candidate,SDPUtils.parseCandidate(serializedCandidate)),event.candidate.candidate=serializedCandidate,event.candidate.toJSON=function(){return{candidate:event.candidate.candidate,sdpMid:event.candidate.sdpMid,sdpMLineIndex:event.candidate.sdpMLineIndex,usernameFragment:event.candidate.usernameFragment}}}var sections=SDPUtils.getMediaSections(pc._localDescription.sdp);sections[event.candidate.sdpMLineIndex]+=end?"a=end-of-candidates\r\n":"a="+event.candidate.candidate+"\r\n",pc._localDescription.sdp=SDPUtils.getDescription(pc._localDescription.sdp)+sections.join("");var complete=pc.transceivers.every((function(transceiver){return transceiver.iceGatherer&&"completed"===transceiver.iceGatherer.state}));"gathering"!==pc.iceGatheringState&&(pc.iceGatheringState="gathering",pc._emitGatheringStateChange()),end||pc._dispatchEvent("icecandidate",event),complete&&(pc._dispatchEvent("icecandidate",new Event("icecandidate")),pc.iceGatheringState="complete",pc._emitGatheringStateChange())}},window.setTimeout((function(){bufferedCandidateEvents.forEach((function(e){iceGatherer.onlocalcandidate(e)}))}),0)}},RTCPeerConnection.prototype._createIceAndDtlsTransports=function(){var pc=this,iceTransport=new window.RTCIceTransport(null);iceTransport.onicestatechange=function(){pc._updateIceConnectionState(),pc._updateConnectionState()};var dtlsTransport=new window.RTCDtlsTransport(iceTransport);return dtlsTransport.ondtlsstatechange=function(){pc._updateConnectionState()},dtlsTransport.onerror=function(){Object.defineProperty(dtlsTransport,"state",{value:"failed",writable:!0}),pc._updateConnectionState()},{iceTransport:iceTransport,dtlsTransport:dtlsTransport}},RTCPeerConnection.prototype._disposeIceAndDtlsTransports=function(sdpMLineIndex){var iceGatherer=this.transceivers[sdpMLineIndex].iceGatherer;iceGatherer&&(delete iceGatherer.onlocalcandidate,delete this.transceivers[sdpMLineIndex].iceGatherer);var iceTransport=this.transceivers[sdpMLineIndex].iceTransport;iceTransport&&(delete iceTransport.onicestatechange,delete this.transceivers[sdpMLineIndex].iceTransport);var dtlsTransport=this.transceivers[sdpMLineIndex].dtlsTransport;dtlsTransport&&(delete dtlsTransport.ondtlsstatechange,delete dtlsTransport.onerror,delete this.transceivers[sdpMLineIndex].dtlsTransport)},RTCPeerConnection.prototype._transceive=function(transceiver,send,recv){var params=getCommonCapabilities(transceiver.localCapabilities,transceiver.remoteCapabilities);send&&transceiver.rtpSender&&(params.encodings=transceiver.sendEncodingParameters,params.rtcp={cname:SDPUtils.localCName,compound:transceiver.rtcpParameters.compound},transceiver.recvEncodingParameters.length&&(params.rtcp.ssrc=transceiver.recvEncodingParameters[0].ssrc),transceiver.rtpSender.send(params)),recv&&transceiver.rtpReceiver&¶ms.codecs.length>0&&("video"===transceiver.kind&&transceiver.recvEncodingParameters&&edgeVersion<15019&&transceiver.recvEncodingParameters.forEach((function(p){delete p.rtx})),transceiver.recvEncodingParameters.length?params.encodings=transceiver.recvEncodingParameters:params.encodings=[{}],params.rtcp={compound:transceiver.rtcpParameters.compound},transceiver.rtcpParameters.cname&&(params.rtcp.cname=transceiver.rtcpParameters.cname),transceiver.sendEncodingParameters.length&&(params.rtcp.ssrc=transceiver.sendEncodingParameters[0].ssrc),transceiver.rtpReceiver.receive(params))},RTCPeerConnection.prototype.setLocalDescription=function(description){var sections,sessionpart,pc=this;if(-1===["offer","answer"].indexOf(description.type))return Promise.reject(makeError("TypeError",'Unsupported type "'+description.type+'"'));if(!isActionAllowedInSignalingState("setLocalDescription",description.type,pc.signalingState)||pc._isClosed)return Promise.reject(makeError("InvalidStateError","Can not set local "+description.type+" in state "+pc.signalingState));if("offer"===description.type)sections=SDPUtils.splitSections(description.sdp),sessionpart=sections.shift(),sections.forEach((function(mediaSection,sdpMLineIndex){var caps=SDPUtils.parseRtpParameters(mediaSection);pc.transceivers[sdpMLineIndex].localCapabilities=caps})),pc.transceivers.forEach((function(transceiver,sdpMLineIndex){pc._gather(transceiver.mid,sdpMLineIndex)}));else if("answer"===description.type){sections=SDPUtils.splitSections(pc._remoteDescription.sdp),sessionpart=sections.shift();var isIceLite=SDPUtils.matchPrefix(sessionpart,"a=ice-lite").length>0;sections.forEach((function(mediaSection,sdpMLineIndex){var transceiver=pc.transceivers[sdpMLineIndex],iceGatherer=transceiver.iceGatherer,iceTransport=transceiver.iceTransport,dtlsTransport=transceiver.dtlsTransport,localCapabilities=transceiver.localCapabilities,remoteCapabilities=transceiver.remoteCapabilities;if(!(SDPUtils.isRejected(mediaSection)&&0===SDPUtils.matchPrefix(mediaSection,"a=bundle-only").length)&&!transceiver.rejected){var remoteIceParameters=SDPUtils.getIceParameters(mediaSection,sessionpart),remoteDtlsParameters=SDPUtils.getDtlsParameters(mediaSection,sessionpart);isIceLite&&(remoteDtlsParameters.role="server"),pc.usingBundle&&0!==sdpMLineIndex||(pc._gather(transceiver.mid,sdpMLineIndex),"new"===iceTransport.state&&iceTransport.start(iceGatherer,remoteIceParameters,isIceLite?"controlling":"controlled"),"new"===dtlsTransport.state&&dtlsTransport.start(remoteDtlsParameters));var params=getCommonCapabilities(localCapabilities,remoteCapabilities);pc._transceive(transceiver,params.codecs.length>0,!1)}}))}return pc._localDescription={type:description.type,sdp:description.sdp},"offer"===description.type?pc._updateSignalingState("have-local-offer"):pc._updateSignalingState("stable"),Promise.resolve()},RTCPeerConnection.prototype.setRemoteDescription=function(description){var pc=this;if(-1===["offer","answer"].indexOf(description.type))return Promise.reject(makeError("TypeError",'Unsupported type "'+description.type+'"'));if(!isActionAllowedInSignalingState("setRemoteDescription",description.type,pc.signalingState)||pc._isClosed)return Promise.reject(makeError("InvalidStateError","Can not set remote "+description.type+" in state "+pc.signalingState));var streams={};pc.remoteStreams.forEach((function(stream){streams[stream.id]=stream}));var receiverList=[],sections=SDPUtils.splitSections(description.sdp),sessionpart=sections.shift(),isIceLite=SDPUtils.matchPrefix(sessionpart,"a=ice-lite").length>0,usingBundle=SDPUtils.matchPrefix(sessionpart,"a=group:BUNDLE ").length>0;pc.usingBundle=usingBundle;var iceOptions=SDPUtils.matchPrefix(sessionpart,"a=ice-options:")[0];return pc.canTrickleIceCandidates=!!iceOptions&&iceOptions.substr(14).split(" ").indexOf("trickle")>=0,sections.forEach((function(mediaSection,sdpMLineIndex){var lines=SDPUtils.splitLines(mediaSection),kind=SDPUtils.getKind(mediaSection),rejected=SDPUtils.isRejected(mediaSection)&&0===SDPUtils.matchPrefix(mediaSection,"a=bundle-only").length,protocol=lines[0].substr(2).split(" ")[2],direction=SDPUtils.getDirection(mediaSection,sessionpart),remoteMsid=SDPUtils.parseMsid(mediaSection),mid=SDPUtils.getMid(mediaSection)||SDPUtils.generateIdentifier();if(rejected||"application"===kind&&("DTLS/SCTP"===protocol||"UDP/DTLS/SCTP"===protocol))pc.transceivers[sdpMLineIndex]={mid:mid,kind:kind,protocol:protocol,rejected:!0};else{var transceiver,iceGatherer,iceTransport,dtlsTransport,rtpReceiver,sendEncodingParameters,recvEncodingParameters,localCapabilities,track;!rejected&&pc.transceivers[sdpMLineIndex]&&pc.transceivers[sdpMLineIndex].rejected&&(pc.transceivers[sdpMLineIndex]=pc._createTransceiver(kind,!0));var remoteIceParameters,remoteDtlsParameters,remoteCapabilities=SDPUtils.parseRtpParameters(mediaSection);rejected||(remoteIceParameters=SDPUtils.getIceParameters(mediaSection,sessionpart),(remoteDtlsParameters=SDPUtils.getDtlsParameters(mediaSection,sessionpart)).role="client"),recvEncodingParameters=SDPUtils.parseRtpEncodingParameters(mediaSection);var rtcpParameters=SDPUtils.parseRtcpParameters(mediaSection),isComplete=SDPUtils.matchPrefix(mediaSection,"a=end-of-candidates",sessionpart).length>0,cands=SDPUtils.matchPrefix(mediaSection,"a=candidate:").map((function(cand){return SDPUtils.parseCandidate(cand)})).filter((function(cand){return 1===cand.component}));if(("offer"===description.type||"answer"===description.type)&&!rejected&&usingBundle&&sdpMLineIndex>0&&pc.transceivers[sdpMLineIndex]&&(pc._disposeIceAndDtlsTransports(sdpMLineIndex),pc.transceivers[sdpMLineIndex].iceGatherer=pc.transceivers[0].iceGatherer,pc.transceivers[sdpMLineIndex].iceTransport=pc.transceivers[0].iceTransport,pc.transceivers[sdpMLineIndex].dtlsTransport=pc.transceivers[0].dtlsTransport,pc.transceivers[sdpMLineIndex].rtpSender&&pc.transceivers[sdpMLineIndex].rtpSender.setTransport(pc.transceivers[0].dtlsTransport),pc.transceivers[sdpMLineIndex].rtpReceiver&&pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(pc.transceivers[0].dtlsTransport)),"offer"!==description.type||rejected){if("answer"===description.type&&!rejected){iceGatherer=(transceiver=pc.transceivers[sdpMLineIndex]).iceGatherer,iceTransport=transceiver.iceTransport,dtlsTransport=transceiver.dtlsTransport,rtpReceiver=transceiver.rtpReceiver,sendEncodingParameters=transceiver.sendEncodingParameters,localCapabilities=transceiver.localCapabilities,pc.transceivers[sdpMLineIndex].recvEncodingParameters=recvEncodingParameters,pc.transceivers[sdpMLineIndex].remoteCapabilities=remoteCapabilities,pc.transceivers[sdpMLineIndex].rtcpParameters=rtcpParameters,cands.length&&"new"===iceTransport.state&&(!isIceLite&&!isComplete||usingBundle&&0!==sdpMLineIndex?cands.forEach((function(candidate){maybeAddCandidate(transceiver.iceTransport,candidate)})):iceTransport.setRemoteCandidates(cands)),usingBundle&&0!==sdpMLineIndex||("new"===iceTransport.state&&iceTransport.start(iceGatherer,remoteIceParameters,"controlling"),"new"===dtlsTransport.state&&dtlsTransport.start(remoteDtlsParameters)),!getCommonCapabilities(transceiver.localCapabilities,transceiver.remoteCapabilities).codecs.filter((function(c){return"rtx"===c.name.toLowerCase()})).length&&transceiver.sendEncodingParameters[0].rtx&&delete transceiver.sendEncodingParameters[0].rtx,pc._transceive(transceiver,"sendrecv"===direction||"recvonly"===direction,"sendrecv"===direction||"sendonly"===direction),!rtpReceiver||"sendrecv"!==direction&&"sendonly"!==direction?delete transceiver.rtpReceiver:(track=rtpReceiver.track,remoteMsid?(streams[remoteMsid.stream]||(streams[remoteMsid.stream]=new window.MediaStream),addTrackToStreamAndFireEvent(track,streams[remoteMsid.stream]),receiverList.push([track,rtpReceiver,streams[remoteMsid.stream]])):(streams.default||(streams.default=new window.MediaStream),addTrackToStreamAndFireEvent(track,streams.default),receiverList.push([track,rtpReceiver,streams.default])))}}else{(transceiver=pc.transceivers[sdpMLineIndex]||pc._createTransceiver(kind)).mid=mid,transceiver.iceGatherer||(transceiver.iceGatherer=pc._createIceGatherer(sdpMLineIndex,usingBundle)),cands.length&&"new"===transceiver.iceTransport.state&&(!isComplete||usingBundle&&0!==sdpMLineIndex?cands.forEach((function(candidate){maybeAddCandidate(transceiver.iceTransport,candidate)})):transceiver.iceTransport.setRemoteCandidates(cands)),localCapabilities=window.RTCRtpReceiver.getCapabilities(kind),edgeVersion<15019&&(localCapabilities.codecs=localCapabilities.codecs.filter((function(codec){return"rtx"!==codec.name}))),sendEncodingParameters=transceiver.sendEncodingParameters||[{ssrc:1001*(2*sdpMLineIndex+2)}];var stream,isNewTrack=!1;if("sendrecv"===direction||"sendonly"===direction){if(isNewTrack=!transceiver.rtpReceiver,rtpReceiver=transceiver.rtpReceiver||new window.RTCRtpReceiver(transceiver.dtlsTransport,kind),isNewTrack)track=rtpReceiver.track,remoteMsid&&"-"===remoteMsid.stream||(remoteMsid?(streams[remoteMsid.stream]||(streams[remoteMsid.stream]=new window.MediaStream,Object.defineProperty(streams[remoteMsid.stream],"id",{get:function(){return remoteMsid.stream}})),Object.defineProperty(track,"id",{get:function(){return remoteMsid.track}}),stream=streams[remoteMsid.stream]):(streams.default||(streams.default=new window.MediaStream),stream=streams.default)),stream&&(addTrackToStreamAndFireEvent(track,stream),transceiver.associatedRemoteMediaStreams.push(stream)),receiverList.push([track,rtpReceiver,stream])}else transceiver.rtpReceiver&&transceiver.rtpReceiver.track&&(transceiver.associatedRemoteMediaStreams.forEach((function(s){var nativeTrack=s.getTracks().find((function(t){return t.id===transceiver.rtpReceiver.track.id}));nativeTrack&&function(track,stream){stream.removeTrack(track),stream.dispatchEvent(new window.MediaStreamTrackEvent("removetrack",{track:track}))}(nativeTrack,s)})),transceiver.associatedRemoteMediaStreams=[]);transceiver.localCapabilities=localCapabilities,transceiver.remoteCapabilities=remoteCapabilities,transceiver.rtpReceiver=rtpReceiver,transceiver.rtcpParameters=rtcpParameters,transceiver.sendEncodingParameters=sendEncodingParameters,transceiver.recvEncodingParameters=recvEncodingParameters,pc._transceive(pc.transceivers[sdpMLineIndex],!1,isNewTrack)}}})),void 0===pc._dtlsRole&&(pc._dtlsRole="offer"===description.type?"active":"passive"),pc._remoteDescription={type:description.type,sdp:description.sdp},"offer"===description.type?pc._updateSignalingState("have-remote-offer"):pc._updateSignalingState("stable"),Object.keys(streams).forEach((function(sid){var stream=streams[sid];if(stream.getTracks().length){if(-1===pc.remoteStreams.indexOf(stream)){pc.remoteStreams.push(stream);var event=new Event("addstream");event.stream=stream,window.setTimeout((function(){pc._dispatchEvent("addstream",event)}))}receiverList.forEach((function(item){var track=item[0],receiver=item[1];stream.id===item[2].id&&fireAddTrack(pc,track,receiver,[stream])}))}})),receiverList.forEach((function(item){item[2]||fireAddTrack(pc,item[0],item[1],[])})),window.setTimeout((function(){pc&&pc.transceivers&&pc.transceivers.forEach((function(transceiver){transceiver.iceTransport&&"new"===transceiver.iceTransport.state&&transceiver.iceTransport.getRemoteCandidates().length>0&&(console.warn("Timeout for addRemoteCandidate. Consider sending an end-of-candidates notification"),transceiver.iceTransport.addRemoteCandidate({}))}))}),4e3),Promise.resolve()},RTCPeerConnection.prototype.close=function(){this.transceivers.forEach((function(transceiver){transceiver.iceTransport&&transceiver.iceTransport.stop(),transceiver.dtlsTransport&&transceiver.dtlsTransport.stop(),transceiver.rtpSender&&transceiver.rtpSender.stop(),transceiver.rtpReceiver&&transceiver.rtpReceiver.stop()})),this._isClosed=!0,this._updateSignalingState("closed")},RTCPeerConnection.prototype._updateSignalingState=function(newState){this.signalingState=newState;var event=new Event("signalingstatechange");this._dispatchEvent("signalingstatechange",event)},RTCPeerConnection.prototype._maybeFireNegotiationNeeded=function(){var pc=this;"stable"===this.signalingState&&!0!==this.needNegotiation&&(this.needNegotiation=!0,window.setTimeout((function(){if(pc.needNegotiation){pc.needNegotiation=!1;var event=new Event("negotiationneeded");pc._dispatchEvent("negotiationneeded",event)}}),0))},RTCPeerConnection.prototype._updateIceConnectionState=function(){var newState,states={new:0,closed:0,checking:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach((function(transceiver){transceiver.iceTransport&&!transceiver.rejected&&states[transceiver.iceTransport.state]++})),newState="new",states.failed>0?newState="failed":states.checking>0?newState="checking":states.disconnected>0?newState="disconnected":states.new>0?newState="new":states.connected>0?newState="connected":states.completed>0&&(newState="completed"),newState!==this.iceConnectionState){this.iceConnectionState=newState;var event=new Event("iceconnectionstatechange");this._dispatchEvent("iceconnectionstatechange",event)}},RTCPeerConnection.prototype._updateConnectionState=function(){var newState,states={new:0,closed:0,connecting:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach((function(transceiver){transceiver.iceTransport&&transceiver.dtlsTransport&&!transceiver.rejected&&(states[transceiver.iceTransport.state]++,states[transceiver.dtlsTransport.state]++)})),states.connected+=states.completed,newState="new",states.failed>0?newState="failed":states.connecting>0?newState="connecting":states.disconnected>0?newState="disconnected":states.new>0?newState="new":states.connected>0&&(newState="connected"),newState!==this.connectionState){this.connectionState=newState;var event=new Event("connectionstatechange");this._dispatchEvent("connectionstatechange",event)}},RTCPeerConnection.prototype.createOffer=function(){var pc=this;if(pc._isClosed)return Promise.reject(makeError("InvalidStateError","Can not call createOffer after close"));var numAudioTracks=pc.transceivers.filter((function(t){return"audio"===t.kind})).length,numVideoTracks=pc.transceivers.filter((function(t){return"video"===t.kind})).length,offerOptions=arguments[0];if(offerOptions){if(offerOptions.mandatory||offerOptions.optional)throw new TypeError("Legacy mandatory/optional constraints not supported.");void 0!==offerOptions.offerToReceiveAudio&&(numAudioTracks=!0===offerOptions.offerToReceiveAudio?1:!1===offerOptions.offerToReceiveAudio?0:offerOptions.offerToReceiveAudio),void 0!==offerOptions.offerToReceiveVideo&&(numVideoTracks=!0===offerOptions.offerToReceiveVideo?1:!1===offerOptions.offerToReceiveVideo?0:offerOptions.offerToReceiveVideo)}for(pc.transceivers.forEach((function(transceiver){"audio"===transceiver.kind?--numAudioTracks<0&&(transceiver.wantReceive=!1):"video"===transceiver.kind&&--numVideoTracks<0&&(transceiver.wantReceive=!1)}));numAudioTracks>0||numVideoTracks>0;)numAudioTracks>0&&(pc._createTransceiver("audio"),numAudioTracks--),numVideoTracks>0&&(pc._createTransceiver("video"),numVideoTracks--);var sdp=SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,pc._sdpSessionVersion++);pc.transceivers.forEach((function(transceiver,sdpMLineIndex){var track=transceiver.track,kind=transceiver.kind,mid=transceiver.mid||SDPUtils.generateIdentifier();transceiver.mid=mid,transceiver.iceGatherer||(transceiver.iceGatherer=pc._createIceGatherer(sdpMLineIndex,pc.usingBundle));var localCapabilities=window.RTCRtpSender.getCapabilities(kind);edgeVersion<15019&&(localCapabilities.codecs=localCapabilities.codecs.filter((function(codec){return"rtx"!==codec.name}))),localCapabilities.codecs.forEach((function(codec){"H264"===codec.name&&void 0===codec.parameters["level-asymmetry-allowed"]&&(codec.parameters["level-asymmetry-allowed"]="1"),transceiver.remoteCapabilities&&transceiver.remoteCapabilities.codecs&&transceiver.remoteCapabilities.codecs.forEach((function(remoteCodec){codec.name.toLowerCase()===remoteCodec.name.toLowerCase()&&codec.clockRate===remoteCodec.clockRate&&(codec.preferredPayloadType=remoteCodec.payloadType)}))})),localCapabilities.headerExtensions.forEach((function(hdrExt){(transceiver.remoteCapabilities&&transceiver.remoteCapabilities.headerExtensions||[]).forEach((function(rHdrExt){hdrExt.uri===rHdrExt.uri&&(hdrExt.id=rHdrExt.id)}))}));var sendEncodingParameters=transceiver.sendEncodingParameters||[{ssrc:1001*(2*sdpMLineIndex+1)}];track&&edgeVersion>=15019&&"video"===kind&&!sendEncodingParameters[0].rtx&&(sendEncodingParameters[0].rtx={ssrc:sendEncodingParameters[0].ssrc+1}),transceiver.wantReceive&&(transceiver.rtpReceiver=new window.RTCRtpReceiver(transceiver.dtlsTransport,kind)),transceiver.localCapabilities=localCapabilities,transceiver.sendEncodingParameters=sendEncodingParameters})),"max-compat"!==pc._config.bundlePolicy&&(sdp+="a=group:BUNDLE "+pc.transceivers.map((function(t){return t.mid})).join(" ")+"\r\n"),sdp+="a=ice-options:trickle\r\n",pc.transceivers.forEach((function(transceiver,sdpMLineIndex){sdp+=writeMediaSection(transceiver,transceiver.localCapabilities,"offer",transceiver.stream,pc._dtlsRole),sdp+="a=rtcp-rsize\r\n",!transceiver.iceGatherer||"new"===pc.iceGatheringState||0!==sdpMLineIndex&&pc.usingBundle||(transceiver.iceGatherer.getLocalCandidates().forEach((function(cand){cand.component=1,sdp+="a="+SDPUtils.writeCandidate(cand)+"\r\n"})),"completed"===transceiver.iceGatherer.state&&(sdp+="a=end-of-candidates\r\n"))}));var desc=new window.RTCSessionDescription({type:"offer",sdp:sdp});return Promise.resolve(desc)},RTCPeerConnection.prototype.createAnswer=function(){var pc=this;if(pc._isClosed)return Promise.reject(makeError("InvalidStateError","Can not call createAnswer after close"));if("have-remote-offer"!==pc.signalingState&&"have-local-pranswer"!==pc.signalingState)return Promise.reject(makeError("InvalidStateError","Can not call createAnswer in signalingState "+pc.signalingState));var sdp=SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,pc._sdpSessionVersion++);pc.usingBundle&&(sdp+="a=group:BUNDLE "+pc.transceivers.map((function(t){return t.mid})).join(" ")+"\r\n"),sdp+="a=ice-options:trickle\r\n";var mediaSectionsInOffer=SDPUtils.getMediaSections(pc._remoteDescription.sdp).length;pc.transceivers.forEach((function(transceiver,sdpMLineIndex){if(!(sdpMLineIndex+1>mediaSectionsInOffer)){if(transceiver.rejected)return"application"===transceiver.kind?"DTLS/SCTP"===transceiver.protocol?sdp+="m=application 0 DTLS/SCTP 5000\r\n":sdp+="m=application 0 "+transceiver.protocol+" webrtc-datachannel\r\n":"audio"===transceiver.kind?sdp+="m=audio 0 UDP/TLS/RTP/SAVPF 0\r\na=rtpmap:0 PCMU/8000\r\n":"video"===transceiver.kind&&(sdp+="m=video 0 UDP/TLS/RTP/SAVPF 120\r\na=rtpmap:120 VP8/90000\r\n"),void(sdp+="c=IN IP4 0.0.0.0\r\na=inactive\r\na=mid:"+transceiver.mid+"\r\n");var localTrack;if(transceiver.stream)"audio"===transceiver.kind?localTrack=transceiver.stream.getAudioTracks()[0]:"video"===transceiver.kind&&(localTrack=transceiver.stream.getVideoTracks()[0]),localTrack&&edgeVersion>=15019&&"video"===transceiver.kind&&!transceiver.sendEncodingParameters[0].rtx&&(transceiver.sendEncodingParameters[0].rtx={ssrc:transceiver.sendEncodingParameters[0].ssrc+1});var commonCapabilities=getCommonCapabilities(transceiver.localCapabilities,transceiver.remoteCapabilities);!commonCapabilities.codecs.filter((function(c){return"rtx"===c.name.toLowerCase()})).length&&transceiver.sendEncodingParameters[0].rtx&&delete transceiver.sendEncodingParameters[0].rtx,sdp+=writeMediaSection(transceiver,commonCapabilities,"answer",transceiver.stream,pc._dtlsRole),transceiver.rtcpParameters&&transceiver.rtcpParameters.reducedSize&&(sdp+="a=rtcp-rsize\r\n")}}));var desc=new window.RTCSessionDescription({type:"answer",sdp:sdp});return Promise.resolve(desc)},RTCPeerConnection.prototype.addIceCandidate=function(candidate){var sections,pc=this;return candidate&&void 0===candidate.sdpMLineIndex&&!candidate.sdpMid?Promise.reject(new TypeError("sdpMLineIndex or sdpMid required")):new Promise((function(resolve,reject){if(!pc._remoteDescription)return reject(makeError("InvalidStateError","Can not add ICE candidate without a remote description"));if(candidate&&""!==candidate.candidate){var sdpMLineIndex=candidate.sdpMLineIndex;if(candidate.sdpMid)for(var i=0;i0?SDPUtils.parseCandidate(candidate.candidate):{};if("tcp"===cand.protocol&&(0===cand.port||9===cand.port))return resolve();if(cand.component&&1!==cand.component)return resolve();if((0===sdpMLineIndex||sdpMLineIndex>0&&transceiver.iceTransport!==pc.transceivers[0].iceTransport)&&!maybeAddCandidate(transceiver.iceTransport,cand))return reject(makeError("OperationError","Can not add ICE candidate"));var candidateString=candidate.candidate.trim();0===candidateString.indexOf("a=")&&(candidateString=candidateString.substr(2)),(sections=SDPUtils.getMediaSections(pc._remoteDescription.sdp))[sdpMLineIndex]+="a="+(cand.type?candidateString:"end-of-candidates")+"\r\n",pc._remoteDescription.sdp=SDPUtils.getDescription(pc._remoteDescription.sdp)+sections.join("")}else for(var j=0;j0?parts[0].split("/")[1]:"sendrecv",uri:parts[1]}},SDPUtils.writeExtmap=function(headerExtension){return"a=extmap:"+(headerExtension.id||headerExtension.preferredId)+(headerExtension.direction&&"sendrecv"!==headerExtension.direction?"/"+headerExtension.direction:"")+" "+headerExtension.uri+"\r\n"},SDPUtils.parseFmtp=function(line){for(var kv,parsed={},parts=line.substr(line.indexOf(" ")+1).split(";"),j=0;j-1?(parts.attribute=line.substr(sp+1,colon-sp-1),parts.value=line.substr(colon+1)):parts.attribute=line.substr(sp+1),parts},SDPUtils.parseSsrcGroup=function(line){var parts=line.substr(13).split(" ");return{semantics:parts.shift(),ssrcs:parts.map((function(ssrc){return parseInt(ssrc,10)}))}},SDPUtils.getMid=function(mediaSection){var mid=SDPUtils.matchPrefix(mediaSection,"a=mid:")[0];if(mid)return mid.substr(6)},SDPUtils.parseFingerprint=function(line){var parts=line.substr(14).split(" ");return{algorithm:parts[0].toLowerCase(),value:parts[1]}},SDPUtils.getDtlsParameters=function(mediaSection,sessionpart){return{role:"auto",fingerprints:SDPUtils.matchPrefix(mediaSection+sessionpart,"a=fingerprint:").map(SDPUtils.parseFingerprint)}},SDPUtils.writeDtlsParameters=function(params,setupType){var sdp="a=setup:"+setupType+"\r\n";return params.fingerprints.forEach((function(fp){sdp+="a=fingerprint:"+fp.algorithm+" "+fp.value+"\r\n"})),sdp},SDPUtils.parseCryptoLine=function(line){var parts=line.substr(9).split(" ");return{tag:parseInt(parts[0],10),cryptoSuite:parts[1],keyParams:parts[2],sessionParams:parts.slice(3)}},SDPUtils.writeCryptoLine=function(parameters){return"a=crypto:"+parameters.tag+" "+parameters.cryptoSuite+" "+("object"===_typeof2(parameters.keyParams)?SDPUtils.writeCryptoKeyParams(parameters.keyParams):parameters.keyParams)+(parameters.sessionParams?" "+parameters.sessionParams.join(" "):"")+"\r\n"},SDPUtils.parseCryptoKeyParams=function(keyParams){if(0!==keyParams.indexOf("inline:"))return null;var parts=keyParams.substr(7).split("|");return{keyMethod:"inline",keySalt:parts[0],lifeTime:parts[1],mkiValue:parts[2]?parts[2].split(":")[0]:void 0,mkiLength:parts[2]?parts[2].split(":")[1]:void 0}},SDPUtils.writeCryptoKeyParams=function(keyParams){return keyParams.keyMethod+":"+keyParams.keySalt+(keyParams.lifeTime?"|"+keyParams.lifeTime:"")+(keyParams.mkiValue&&keyParams.mkiLength?"|"+keyParams.mkiValue+":"+keyParams.mkiLength:"")},SDPUtils.getCryptoParameters=function(mediaSection,sessionpart){return SDPUtils.matchPrefix(mediaSection+sessionpart,"a=crypto:").map(SDPUtils.parseCryptoLine)},SDPUtils.getIceParameters=function(mediaSection,sessionpart){var ufrag=SDPUtils.matchPrefix(mediaSection+sessionpart,"a=ice-ufrag:")[0],pwd=SDPUtils.matchPrefix(mediaSection+sessionpart,"a=ice-pwd:")[0];return ufrag&&pwd?{usernameFragment:ufrag.substr(12),password:pwd.substr(10)}:null},SDPUtils.writeIceParameters=function(params){return"a=ice-ufrag:"+params.usernameFragment+"\r\na=ice-pwd:"+params.password+"\r\n"},SDPUtils.parseRtpParameters=function(mediaSection){for(var description={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},mline=SDPUtils.splitLines(mediaSection)[0].split(" "),i=3;i0?"9":"0",sdp+=" UDP/TLS/RTP/SAVPF ",sdp+=caps.codecs.map((function(codec){return void 0!==codec.preferredPayloadType?codec.preferredPayloadType:codec.payloadType})).join(" ")+"\r\n",sdp+="c=IN IP4 0.0.0.0\r\n",sdp+="a=rtcp:9 IN IP4 0.0.0.0\r\n",caps.codecs.forEach((function(codec){sdp+=SDPUtils.writeRtpMap(codec),sdp+=SDPUtils.writeFmtp(codec),sdp+=SDPUtils.writeRtcpFb(codec)}));var maxptime=0;return caps.codecs.forEach((function(codec){codec.maxptime>maxptime&&(maxptime=codec.maxptime)})),maxptime>0&&(sdp+="a=maxptime:"+maxptime+"\r\n"),sdp+="a=rtcp-mux\r\n",caps.headerExtensions&&caps.headerExtensions.forEach((function(extension){sdp+=SDPUtils.writeExtmap(extension)})),sdp},SDPUtils.parseRtpEncodingParameters=function(mediaSection){var secondarySsrc,encodingParameters=[],description=SDPUtils.parseRtpParameters(mediaSection),hasRed=-1!==description.fecMechanisms.indexOf("RED"),hasUlpfec=-1!==description.fecMechanisms.indexOf("ULPFEC"),ssrcs=SDPUtils.matchPrefix(mediaSection,"a=ssrc:").map((function(line){return SDPUtils.parseSsrcMedia(line)})).filter((function(parts){return"cname"===parts.attribute})),primarySsrc=ssrcs.length>0&&ssrcs[0].ssrc,flows=SDPUtils.matchPrefix(mediaSection,"a=ssrc-group:FID").map((function(line){return line.substr(17).split(" ").map((function(part){return parseInt(part,10)}))}));flows.length>0&&flows[0].length>1&&flows[0][0]===primarySsrc&&(secondarySsrc=flows[0][1]),description.codecs.forEach((function(codec){if("RTX"===codec.name.toUpperCase()&&codec.parameters.apt){var encParam={ssrc:primarySsrc,codecPayloadType:parseInt(codec.parameters.apt,10)};primarySsrc&&secondarySsrc&&(encParam.rtx={ssrc:secondarySsrc}),encodingParameters.push(encParam),hasRed&&((encParam=JSON.parse(JSON.stringify(encParam))).fec={ssrc:primarySsrc,mechanism:hasUlpfec?"red+ulpfec":"red"},encodingParameters.push(encParam))}})),0===encodingParameters.length&&primarySsrc&&encodingParameters.push({ssrc:primarySsrc});var bandwidth=SDPUtils.matchPrefix(mediaSection,"b=");return bandwidth.length&&(bandwidth=0===bandwidth[0].indexOf("b=TIAS:")?parseInt(bandwidth[0].substr(7),10):0===bandwidth[0].indexOf("b=AS:")?1e3*parseInt(bandwidth[0].substr(5),10)*.95-16e3:void 0,encodingParameters.forEach((function(params){params.maxBitrate=bandwidth}))),encodingParameters},SDPUtils.parseRtcpParameters=function(mediaSection){var rtcpParameters={},remoteSsrc=SDPUtils.matchPrefix(mediaSection,"a=ssrc:").map((function(line){return SDPUtils.parseSsrcMedia(line)})).filter((function(obj){return"cname"===obj.attribute}))[0];remoteSsrc&&(rtcpParameters.cname=remoteSsrc.value,rtcpParameters.ssrc=remoteSsrc.ssrc);var rsize=SDPUtils.matchPrefix(mediaSection,"a=rtcp-rsize");rtcpParameters.reducedSize=rsize.length>0,rtcpParameters.compound=0===rsize.length;var mux=SDPUtils.matchPrefix(mediaSection,"a=rtcp-mux");return rtcpParameters.mux=mux.length>0,rtcpParameters},SDPUtils.parseMsid=function(mediaSection){var parts,spec=SDPUtils.matchPrefix(mediaSection,"a=msid:");if(1===spec.length)return{stream:(parts=spec[0].substr(7).split(" "))[0],track:parts[1]};var planB=SDPUtils.matchPrefix(mediaSection,"a=ssrc:").map((function(line){return SDPUtils.parseSsrcMedia(line)})).filter((function(msidParts){return"msid"===msidParts.attribute}));return planB.length>0?{stream:(parts=planB[0].value.split(" "))[0],track:parts[1]}:void 0},SDPUtils.parseSctpDescription=function(mediaSection){var maxMessageSize,mline=SDPUtils.parseMLine(mediaSection),maxSizeLine=SDPUtils.matchPrefix(mediaSection,"a=max-message-size:");maxSizeLine.length>0&&(maxMessageSize=parseInt(maxSizeLine[0].substr(19),10)),isNaN(maxMessageSize)&&(maxMessageSize=65536);var sctpPort=SDPUtils.matchPrefix(mediaSection,"a=sctp-port:");if(sctpPort.length>0)return{port:parseInt(sctpPort[0].substr(12),10),protocol:mline.fmt,maxMessageSize:maxMessageSize};if(SDPUtils.matchPrefix(mediaSection,"a=sctpmap:").length>0){var parts=SDPUtils.matchPrefix(mediaSection,"a=sctpmap:")[0].substr(10).split(" ");return{port:parseInt(parts[0],10),protocol:parts[1],maxMessageSize:maxMessageSize}}},SDPUtils.writeSctpDescription=function(media,sctp){var output=[];return output="DTLS/SCTP"!==media.protocol?["m="+media.kind+" 9 "+media.protocol+" "+sctp.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+sctp.port+"\r\n"]:["m="+media.kind+" 9 "+media.protocol+" "+sctp.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+sctp.port+" "+sctp.protocol+" 65535\r\n"],void 0!==sctp.maxMessageSize&&output.push("a=max-message-size:"+sctp.maxMessageSize+"\r\n"),output.join("")},SDPUtils.generateSessionId=function(){return Math.random().toString().substr(2,21)},SDPUtils.writeSessionBoilerplate=function(sessId,sessVer,sessUser){var version=void 0!==sessVer?sessVer:2;return"v=0\r\no="+(sessUser||"thisisadapterortc")+" "+(sessId||SDPUtils.generateSessionId())+" "+version+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},SDPUtils.writeMediaSection=function(transceiver,caps,type,stream){var sdp=SDPUtils.writeRtpDescription(transceiver.kind,caps);if(sdp+=SDPUtils.writeIceParameters(transceiver.iceGatherer.getLocalParameters()),sdp+=SDPUtils.writeDtlsParameters(transceiver.dtlsTransport.getLocalParameters(),"offer"===type?"actpass":"active"),sdp+="a=mid:"+transceiver.mid+"\r\n",transceiver.direction?sdp+="a="+transceiver.direction+"\r\n":transceiver.rtpSender&&transceiver.rtpReceiver?sdp+="a=sendrecv\r\n":transceiver.rtpSender?sdp+="a=sendonly\r\n":transceiver.rtpReceiver?sdp+="a=recvonly\r\n":sdp+="a=inactive\r\n",transceiver.rtpSender){var msid="msid:"+stream.id+" "+transceiver.rtpSender.track.id+"\r\n";sdp+="a="+msid,sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].ssrc+" "+msid,transceiver.sendEncodingParameters[0].rtx&&(sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].rtx.ssrc+" "+msid,sdp+="a=ssrc-group:FID "+transceiver.sendEncodingParameters[0].ssrc+" "+transceiver.sendEncodingParameters[0].rtx.ssrc+"\r\n")}return sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].ssrc+" cname:"+SDPUtils.localCName+"\r\n",transceiver.rtpSender&&transceiver.sendEncodingParameters[0].rtx&&(sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].rtx.ssrc+" cname:"+SDPUtils.localCName+"\r\n"),sdp},SDPUtils.getDirection=function(mediaSection,sessionpart){for(var lines=SDPUtils.splitLines(mediaSection),i=0;i0&&void 0!==arguments[0]?arguments[0]:{},window=_ref.window,options=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{shimChrome:!0,shimFirefox:!0,shimEdge:!0,shimSafari:!0},logging=utils.log,browserDetails=utils.detectBrowser(window),adapter={browserDetails:browserDetails,commonShim:commonShim,extractVersion:utils.extractVersion,disableLog:utils.disableLog,disableWarnings:utils.disableWarnings};switch(browserDetails.browser){case"chrome":if(!chromeShim||!chromeShim.shimPeerConnection||!options.shimChrome)return logging("Chrome shim is not included in this adapter release."),adapter;logging("adapter.js shimming chrome."),adapter.browserShim=chromeShim,chromeShim.shimGetUserMedia(window),chromeShim.shimMediaStream(window),chromeShim.shimPeerConnection(window),chromeShim.shimOnTrack(window),chromeShim.shimAddTrackRemoveTrack(window),chromeShim.shimGetSendersWithDtmf(window),chromeShim.shimGetStats(window),chromeShim.shimSenderReceiverGetStats(window),chromeShim.fixNegotiationNeeded(window),commonShim.shimRTCIceCandidate(window),commonShim.shimConnectionState(window),commonShim.shimMaxMessageSize(window),commonShim.shimSendThrowTypeError(window),commonShim.removeAllowExtmapMixed(window);break;case"firefox":if(!firefoxShim||!firefoxShim.shimPeerConnection||!options.shimFirefox)return logging("Firefox shim is not included in this adapter release."),adapter;logging("adapter.js shimming firefox."),adapter.browserShim=firefoxShim,firefoxShim.shimGetUserMedia(window),firefoxShim.shimPeerConnection(window),firefoxShim.shimOnTrack(window),firefoxShim.shimRemoveStream(window),firefoxShim.shimSenderGetStats(window),firefoxShim.shimReceiverGetStats(window),firefoxShim.shimRTCDataChannel(window),firefoxShim.shimAddTransceiver(window),firefoxShim.shimCreateOffer(window),firefoxShim.shimCreateAnswer(window),commonShim.shimRTCIceCandidate(window),commonShim.shimConnectionState(window),commonShim.shimMaxMessageSize(window),commonShim.shimSendThrowTypeError(window);break;case"edge":if(!edgeShim||!edgeShim.shimPeerConnection||!options.shimEdge)return logging("MS edge shim is not included in this adapter release."),adapter;logging("adapter.js shimming edge."),adapter.browserShim=edgeShim,edgeShim.shimGetUserMedia(window),edgeShim.shimGetDisplayMedia(window),edgeShim.shimPeerConnection(window),edgeShim.shimReplaceTrack(window),commonShim.shimMaxMessageSize(window),commonShim.shimSendThrowTypeError(window);break;case"safari":if(!safariShim||!options.shimSafari)return logging("Safari shim is not included in this adapter release."),adapter;logging("adapter.js shimming safari."),adapter.browserShim=safariShim,safariShim.shimRTCIceServerUrls(window),safariShim.shimCreateOfferLegacy(window),safariShim.shimCallbacksAPI(window),safariShim.shimLocalStreamsAPI(window),safariShim.shimRemoteStreamsAPI(window),safariShim.shimTrackEventTransceiver(window),safariShim.shimGetUserMedia(window),commonShim.shimRTCIceCandidate(window),commonShim.shimMaxMessageSize(window),commonShim.shimSendThrowTypeError(window),commonShim.removeAllowExtmapMixed(window);break;default:logging("Unsupported browser!")}return adapter};var utils=_interopRequireWildcard(require("./utils")),chromeShim=_interopRequireWildcard(require("./chrome/chrome_shim")),edgeShim=_interopRequireWildcard(require("./edge/edge_shim")),firefoxShim=_interopRequireWildcard(require("./firefox/firefox_shim")),safariShim=_interopRequireWildcard(require("./safari/safari_shim")),commonShim=_interopRequireWildcard(require("./common_shim"));function _interopRequireWildcard(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}},{"./chrome/chrome_shim":3,"./common_shim":6,"./edge/edge_shim":7,"./firefox/firefox_shim":11,"./safari/safari_shim":14,"./utils":15}],3:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=exports.shimGetUserMedia=void 0;var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)},_getusermedia=require("./getusermedia");Object.defineProperty(exports,"shimGetUserMedia",{enumerable:!0,get:function(){return _getusermedia.shimGetUserMedia}});var _getdisplaymedia=require("./getdisplaymedia");Object.defineProperty(exports,"shimGetDisplayMedia",{enumerable:!0,get:function(){return _getdisplaymedia.shimGetDisplayMedia}}),exports.shimMediaStream=function(window){window.MediaStream=window.MediaStream||window.webkitMediaStream},exports.shimOnTrack=function(window){if("object"===(void 0===window?"undefined":_typeof(window))&&window.RTCPeerConnection&&!("ontrack"in window.RTCPeerConnection.prototype)){Object.defineProperty(window.RTCPeerConnection.prototype,"ontrack",{get:function(){return this._ontrack},set:function(f){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=f)},enumerable:!0,configurable:!0});var origSetRemoteDescription=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(){var _this=this;return this._ontrackpoly||(this._ontrackpoly=function(e){e.stream.addEventListener("addtrack",(function(te){var receiver=void 0;receiver=window.RTCPeerConnection.prototype.getReceivers?_this.getReceivers().find((function(r){return r.track&&r.track.id===te.track.id})):{track:te.track};var event=new Event("track");event.track=te.track,event.receiver=receiver,event.transceiver={receiver:receiver},event.streams=[e.stream],_this.dispatchEvent(event)})),e.stream.getTracks().forEach((function(track){var receiver=void 0;receiver=window.RTCPeerConnection.prototype.getReceivers?_this.getReceivers().find((function(r){return r.track&&r.track.id===track.id})):{track:track};var event=new Event("track");event.track=track,event.receiver=receiver,event.transceiver={receiver:receiver},event.streams=[e.stream],_this.dispatchEvent(event)}))},this.addEventListener("addstream",this._ontrackpoly)),origSetRemoteDescription.apply(this,arguments)}}else utils.wrapPeerConnectionEvent(window,"track",(function(e){return e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e}))},exports.shimGetSendersWithDtmf=function(window){if("object"===(void 0===window?"undefined":_typeof(window))&&window.RTCPeerConnection&&!("getSenders"in window.RTCPeerConnection.prototype)&&"createDTMFSender"in window.RTCPeerConnection.prototype){var shimSenderWithDtmf=function(pc,track){return{track:track,get dtmf(){return void 0===this._dtmf&&("audio"===track.kind?this._dtmf=pc.createDTMFSender(track):this._dtmf=null),this._dtmf},_pc:pc}};if(!window.RTCPeerConnection.prototype.getSenders){window.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};var origAddTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addTrack=function(track,stream){var sender=origAddTrack.apply(this,arguments);return sender||(sender=shimSenderWithDtmf(this,track),this._senders.push(sender)),sender};var origRemoveTrack=window.RTCPeerConnection.prototype.removeTrack;window.RTCPeerConnection.prototype.removeTrack=function(sender){origRemoveTrack.apply(this,arguments);var idx=this._senders.indexOf(sender);-1!==idx&&this._senders.splice(idx,1)}}var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var _this2=this;this._senders=this._senders||[],origAddStream.apply(this,[stream]),stream.getTracks().forEach((function(track){_this2._senders.push(shimSenderWithDtmf(_this2,track))}))};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;window.RTCPeerConnection.prototype.removeStream=function(stream){var _this3=this;this._senders=this._senders||[],origRemoveStream.apply(this,[stream]),stream.getTracks().forEach((function(track){var sender=_this3._senders.find((function(s){return s.track===track}));sender&&_this3._senders.splice(_this3._senders.indexOf(sender),1)}))}}else if("object"===(void 0===window?"undefined":_typeof(window))&&window.RTCPeerConnection&&"getSenders"in window.RTCPeerConnection.prototype&&"createDTMFSender"in window.RTCPeerConnection.prototype&&window.RTCRtpSender&&!("dtmf"in window.RTCRtpSender.prototype)){var origGetSenders=window.RTCPeerConnection.prototype.getSenders;window.RTCPeerConnection.prototype.getSenders=function(){var _this4=this,senders=origGetSenders.apply(this,[]);return senders.forEach((function(sender){return sender._pc=_this4})),senders},Object.defineProperty(window.RTCRtpSender.prototype,"dtmf",{get:function(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}},exports.shimGetStats=function(window){if(!window.RTCPeerConnection)return;var origGetStats=window.RTCPeerConnection.prototype.getStats;window.RTCPeerConnection.prototype.getStats=function(){var _this5=this,_arguments=Array.prototype.slice.call(arguments),selector=_arguments[0],onSucc=_arguments[1],onErr=_arguments[2];if(arguments.length>0&&"function"==typeof selector)return origGetStats.apply(this,arguments);if(0===origGetStats.length&&(0===arguments.length||"function"!=typeof selector))return origGetStats.apply(this,[]);var fixChromeStats_=function(response){var standardReport={};return response.result().forEach((function(report){var standardStats={id:report.id,timestamp:report.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[report.type]||report.type};report.names().forEach((function(name){standardStats[name]=report.stat(name)})),standardReport[standardStats.id]=standardStats})),standardReport},makeMapStats=function(stats){return new Map(Object.keys(stats).map((function(key){return[key,stats[key]]})))};if(arguments.length>=2){return origGetStats.apply(this,[function(response){onSucc(makeMapStats(fixChromeStats_(response)))},selector])}return new Promise((function(resolve,reject){origGetStats.apply(_this5,[function(response){resolve(makeMapStats(fixChromeStats_(response)))},reject])})).then(onSucc,onErr)}},exports.shimSenderReceiverGetStats=function(window){if(!("object"===(void 0===window?"undefined":_typeof(window))&&window.RTCPeerConnection&&window.RTCRtpSender&&window.RTCRtpReceiver))return;if(!("getStats"in window.RTCRtpSender.prototype)){var origGetSenders=window.RTCPeerConnection.prototype.getSenders;origGetSenders&&(window.RTCPeerConnection.prototype.getSenders=function(){var _this6=this,senders=origGetSenders.apply(this,[]);return senders.forEach((function(sender){return sender._pc=_this6})),senders});var origAddTrack=window.RTCPeerConnection.prototype.addTrack;origAddTrack&&(window.RTCPeerConnection.prototype.addTrack=function(){var sender=origAddTrack.apply(this,arguments);return sender._pc=this,sender}),window.RTCRtpSender.prototype.getStats=function(){var sender=this;return this._pc.getStats().then((function(result){return utils.filterStats(result,sender.track,!0)}))}}if(!("getStats"in window.RTCRtpReceiver.prototype)){var origGetReceivers=window.RTCPeerConnection.prototype.getReceivers;origGetReceivers&&(window.RTCPeerConnection.prototype.getReceivers=function(){var _this7=this,receivers=origGetReceivers.apply(this,[]);return receivers.forEach((function(receiver){return receiver._pc=_this7})),receivers}),utils.wrapPeerConnectionEvent(window,"track",(function(e){return e.receiver._pc=e.srcElement,e})),window.RTCRtpReceiver.prototype.getStats=function(){var receiver=this;return this._pc.getStats().then((function(result){return utils.filterStats(result,receiver.track,!1)}))}}if(!("getStats"in window.RTCRtpSender.prototype)||!("getStats"in window.RTCRtpReceiver.prototype))return;var origGetStats=window.RTCPeerConnection.prototype.getStats;window.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof window.MediaStreamTrack){var track=arguments[0],sender=void 0,receiver=void 0,err=void 0;return this.getSenders().forEach((function(s){s.track===track&&(sender?err=!0:sender=s)})),this.getReceivers().forEach((function(r){return r.track===track&&(receiver?err=!0:receiver=r),r.track===track})),err||sender&&receiver?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):sender?sender.getStats():receiver?receiver.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return origGetStats.apply(this,arguments)}},exports.shimAddTrackRemoveTrackWithNative=shimAddTrackRemoveTrackWithNative,exports.shimAddTrackRemoveTrack=function(window){if(!window.RTCPeerConnection)return;var browserDetails=utils.detectBrowser(window);if(window.RTCPeerConnection.prototype.addTrack&&browserDetails.version>=65)return shimAddTrackRemoveTrackWithNative(window);var origGetLocalStreams=window.RTCPeerConnection.prototype.getLocalStreams;window.RTCPeerConnection.prototype.getLocalStreams=function(){var _this11=this,nativeStreams=origGetLocalStreams.apply(this);return this._reverseStreams=this._reverseStreams||{},nativeStreams.map((function(stream){return _this11._reverseStreams[stream.id]}))};var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var _this12=this;if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},stream.getTracks().forEach((function(track){if(_this12.getSenders().find((function(s){return s.track===track})))throw new DOMException("Track already exists.","InvalidAccessError")})),!this._reverseStreams[stream.id]){var newStream=new window.MediaStream(stream.getTracks());this._streams[stream.id]=newStream,this._reverseStreams[newStream.id]=stream,stream=newStream}origAddStream.apply(this,[stream])};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;function replaceInternalStreamId(pc,description){var sdp=description.sdp;return Object.keys(pc._reverseStreams||[]).forEach((function(internalId){var externalStream=pc._reverseStreams[internalId],internalStream=pc._streams[externalStream.id];sdp=sdp.replace(new RegExp(internalStream.id,"g"),externalStream.id)})),new RTCSessionDescription({type:description.type,sdp:sdp})}window.RTCPeerConnection.prototype.removeStream=function(stream){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},origRemoveStream.apply(this,[this._streams[stream.id]||stream]),delete this._reverseStreams[this._streams[stream.id]?this._streams[stream.id].id:stream.id],delete this._streams[stream.id]},window.RTCPeerConnection.prototype.addTrack=function(track,stream){var _this13=this;if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");var streams=[].slice.call(arguments,1);if(1!==streams.length||!streams[0].getTracks().find((function(t){return t===track})))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find((function(s){return s.track===track})))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};var oldStream=this._streams[stream.id];if(oldStream)oldStream.addTrack(track),Promise.resolve().then((function(){_this13.dispatchEvent(new Event("negotiationneeded"))}));else{var newStream=new window.MediaStream([track]);this._streams[stream.id]=newStream,this._reverseStreams[newStream.id]=stream,this.addStream(newStream)}return this.getSenders().find((function(s){return s.track===track}))},["createOffer","createAnswer"].forEach((function(method){var nativeMethod=window.RTCPeerConnection.prototype[method],methodObj=_defineProperty({},method,(function(){var _this14=this,args=arguments;return arguments.length&&"function"==typeof arguments[0]?nativeMethod.apply(this,[function(description){var desc=replaceInternalStreamId(_this14,description);args[0].apply(null,[desc])},function(err){args[1]&&args[1].apply(null,err)},arguments[2]]):nativeMethod.apply(this,arguments).then((function(description){return replaceInternalStreamId(_this14,description)}))}));window.RTCPeerConnection.prototype[method]=methodObj[method]}));var origSetLocalDescription=window.RTCPeerConnection.prototype.setLocalDescription;window.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=(pc=this,sdp=(description=arguments[0]).sdp,Object.keys(pc._reverseStreams||[]).forEach((function(internalId){var externalStream=pc._reverseStreams[internalId],internalStream=pc._streams[externalStream.id];sdp=sdp.replace(new RegExp(externalStream.id,"g"),internalStream.id)})),new RTCSessionDescription({type:description.type,sdp:sdp})),origSetLocalDescription.apply(this,arguments)):origSetLocalDescription.apply(this,arguments);var pc,description,sdp};var origLocalDescription=Object.getOwnPropertyDescriptor(window.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(window.RTCPeerConnection.prototype,"localDescription",{get:function(){var description=origLocalDescription.get.apply(this);return""===description.type?description:replaceInternalStreamId(this,description)}}),window.RTCPeerConnection.prototype.removeTrack=function(sender){var _this15=this;if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!sender._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(sender._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{};var stream=void 0;Object.keys(this._streams).forEach((function(streamid){_this15._streams[streamid].getTracks().find((function(track){return sender.track===track}))&&(stream=_this15._streams[streamid])})),stream&&(1===stream.getTracks().length?this.removeStream(this._reverseStreams[stream.id]):stream.removeTrack(sender.track),this.dispatchEvent(new Event("negotiationneeded")))}},exports.shimPeerConnection=function(window){var browserDetails=utils.detectBrowser(window);!window.RTCPeerConnection&&window.webkitRTCPeerConnection&&(window.RTCPeerConnection=window.webkitRTCPeerConnection);if(!window.RTCPeerConnection)return;browserDetails.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(method){var nativeMethod=window.RTCPeerConnection.prototype[method],methodObj=_defineProperty({},method,(function(){return arguments[0]=new("addIceCandidate"===method?window.RTCIceCandidate:window.RTCSessionDescription)(arguments[0]),nativeMethod.apply(this,arguments)}));window.RTCPeerConnection.prototype[method]=methodObj[method]}));var nativeAddIceCandidate=window.RTCPeerConnection.prototype.addIceCandidate;window.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?browserDetails.version<78&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():nativeAddIceCandidate.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())}},exports.fixNegotiationNeeded=function(window){utils.wrapPeerConnectionEvent(window,"negotiationneeded",(function(e){if("stable"===e.target.signalingState)return e}))};var utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils.js"));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}function shimAddTrackRemoveTrackWithNative(window){window.RTCPeerConnection.prototype.getLocalStreams=function(){var _this8=this;return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((function(streamId){return _this8._shimmedLocalStreams[streamId][0]}))};var origAddTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addTrack=function(track,stream){if(!stream)return origAddTrack.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};var sender=origAddTrack.apply(this,arguments);return this._shimmedLocalStreams[stream.id]?-1===this._shimmedLocalStreams[stream.id].indexOf(sender)&&this._shimmedLocalStreams[stream.id].push(sender):this._shimmedLocalStreams[stream.id]=[stream,sender],sender};var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var _this9=this;this._shimmedLocalStreams=this._shimmedLocalStreams||{},stream.getTracks().forEach((function(track){if(_this9.getSenders().find((function(s){return s.track===track})))throw new DOMException("Track already exists.","InvalidAccessError")}));var existingSenders=this.getSenders();origAddStream.apply(this,arguments);var newSenders=this.getSenders().filter((function(newSender){return-1===existingSenders.indexOf(newSender)}));this._shimmedLocalStreams[stream.id]=[stream].concat(newSenders)};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;window.RTCPeerConnection.prototype.removeStream=function(stream){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[stream.id],origRemoveStream.apply(this,arguments)};var origRemoveTrack=window.RTCPeerConnection.prototype.removeTrack;window.RTCPeerConnection.prototype.removeTrack=function(sender){var _this10=this;return this._shimmedLocalStreams=this._shimmedLocalStreams||{},sender&&Object.keys(this._shimmedLocalStreams).forEach((function(streamId){var idx=_this10._shimmedLocalStreams[streamId].indexOf(sender);-1!==idx&&_this10._shimmedLocalStreams[streamId].splice(idx,1),1===_this10._shimmedLocalStreams[streamId].length&&delete _this10._shimmedLocalStreams[streamId]})),origRemoveTrack.apply(this,arguments)}}},{"../utils.js":15,"./getdisplaymedia":4,"./getusermedia":5}],4:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=function(window,getSourceId){if(window.navigator.mediaDevices&&"getDisplayMedia"in window.navigator.mediaDevices)return;if(!window.navigator.mediaDevices)return;if("function"!=typeof getSourceId)return void console.error("shimGetDisplayMedia: getSourceId argument is not a function");window.navigator.mediaDevices.getDisplayMedia=function(constraints){return getSourceId(constraints).then((function(sourceId){var widthSpecified=constraints.video&&constraints.video.width,heightSpecified=constraints.video&&constraints.video.height,frameRateSpecified=constraints.video&&constraints.video.frameRate;return constraints.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:sourceId,maxFrameRate:frameRateSpecified||3}},widthSpecified&&(constraints.video.mandatory.maxWidth=widthSpecified),heightSpecified&&(constraints.video.mandatory.maxHeight=heightSpecified),window.navigator.mediaDevices.getUserMedia(constraints)}))}}},{}],5:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0});var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)};exports.shimGetUserMedia=function(window){var navigator=window&&window.navigator;if(!navigator.mediaDevices)return;var browserDetails=utils.detectBrowser(window),constraintsToChrome_=function(c){if("object"!==(void 0===c?"undefined":_typeof(c))||c.mandatory||c.optional)return c;var cc={};return Object.keys(c).forEach((function(key){if("require"!==key&&"advanced"!==key&&"mediaSource"!==key){var r="object"===_typeof(c[key])?c[key]:{ideal:c[key]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);var oldname_=function(prefix,name){return prefix?prefix+name.charAt(0).toUpperCase()+name.slice(1):"deviceId"===name?"sourceId":name};if(void 0!==r.ideal){cc.optional=cc.optional||[];var oc={};"number"==typeof r.ideal?(oc[oldname_("min",key)]=r.ideal,cc.optional.push(oc),(oc={})[oldname_("max",key)]=r.ideal,cc.optional.push(oc)):(oc[oldname_("",key)]=r.ideal,cc.optional.push(oc))}void 0!==r.exact&&"number"!=typeof r.exact?(cc.mandatory=cc.mandatory||{},cc.mandatory[oldname_("",key)]=r.exact):["min","max"].forEach((function(mix){void 0!==r[mix]&&(cc.mandatory=cc.mandatory||{},cc.mandatory[oldname_(mix,key)]=r[mix])}))}})),c.advanced&&(cc.optional=(cc.optional||[]).concat(c.advanced)),cc},shimConstraints_=function(constraints,func){if(browserDetails.version>=61)return func(constraints);if((constraints=JSON.parse(JSON.stringify(constraints)))&&"object"===_typeof(constraints.audio)){var remap=function(obj,a,b){a in obj&&!(b in obj)&&(obj[b]=obj[a],delete obj[a])};remap((constraints=JSON.parse(JSON.stringify(constraints))).audio,"autoGainControl","googAutoGainControl"),remap(constraints.audio,"noiseSuppression","googNoiseSuppression"),constraints.audio=constraintsToChrome_(constraints.audio)}if(constraints&&"object"===_typeof(constraints.video)){var face=constraints.video.facingMode;face=face&&("object"===(void 0===face?"undefined":_typeof(face))?face:{ideal:face});var getSupportedFacingModeLies=browserDetails.version<66;if(face&&("user"===face.exact||"environment"===face.exact||"user"===face.ideal||"environment"===face.ideal)&&(!navigator.mediaDevices.getSupportedConstraints||!navigator.mediaDevices.getSupportedConstraints().facingMode||getSupportedFacingModeLies)){delete constraints.video.facingMode;var matches=void 0;if("environment"===face.exact||"environment"===face.ideal?matches=["back","rear"]:"user"!==face.exact&&"user"!==face.ideal||(matches=["front"]),matches)return navigator.mediaDevices.enumerateDevices().then((function(devices){var dev=(devices=devices.filter((function(d){return"videoinput"===d.kind}))).find((function(d){return matches.some((function(match){return d.label.toLowerCase().includes(match)}))}));return!dev&&devices.length&&matches.includes("back")&&(dev=devices[devices.length-1]),dev&&(constraints.video.deviceId=face.exact?{exact:dev.deviceId}:{ideal:dev.deviceId}),constraints.video=constraintsToChrome_(constraints.video),logging("chrome: "+JSON.stringify(constraints)),func(constraints)}))}constraints.video=constraintsToChrome_(constraints.video)}return logging("chrome: "+JSON.stringify(constraints)),func(constraints)},shimError_=function(e){return browserDetails.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}};if(navigator.getUserMedia=function(constraints,onSuccess,onError){shimConstraints_(constraints,(function(c){navigator.webkitGetUserMedia(c,onSuccess,(function(e){onError&&onError(shimError_(e))}))}))}.bind(navigator),navigator.mediaDevices.getUserMedia){var origGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);navigator.mediaDevices.getUserMedia=function(cs){return shimConstraints_(cs,(function(c){return origGetUserMedia(c).then((function(stream){if(c.audio&&!stream.getAudioTracks().length||c.video&&!stream.getVideoTracks().length)throw stream.getTracks().forEach((function(track){track.stop()})),new DOMException("","NotFoundError");return stream}),(function(e){return Promise.reject(shimError_(e))}))}))}}};var utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils.js"));var logging=utils.log},{"../utils.js":15}],6:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0});var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)};exports.shimRTCIceCandidate=function(window){if(!window.RTCIceCandidate||window.RTCIceCandidate&&"foundation"in window.RTCIceCandidate.prototype)return;var NativeRTCIceCandidate=window.RTCIceCandidate;window.RTCIceCandidate=function(args){if("object"===(void 0===args?"undefined":_typeof(args))&&args.candidate&&0===args.candidate.indexOf("a=")&&((args=JSON.parse(JSON.stringify(args))).candidate=args.candidate.substr(2)),args.candidate&&args.candidate.length){var nativeCandidate=new NativeRTCIceCandidate(args),parsedCandidate=_sdp2.default.parseCandidate(args.candidate),augmentedCandidate=Object.assign(nativeCandidate,parsedCandidate);return augmentedCandidate.toJSON=function(){return{candidate:augmentedCandidate.candidate,sdpMid:augmentedCandidate.sdpMid,sdpMLineIndex:augmentedCandidate.sdpMLineIndex,usernameFragment:augmentedCandidate.usernameFragment}},augmentedCandidate}return new NativeRTCIceCandidate(args)},window.RTCIceCandidate.prototype=NativeRTCIceCandidate.prototype,utils.wrapPeerConnectionEvent(window,"icecandidate",(function(e){return e.candidate&&Object.defineProperty(e,"candidate",{value:new window.RTCIceCandidate(e.candidate),writable:"false"}),e}))},exports.shimMaxMessageSize=function(window){if(!window.RTCPeerConnection)return;var browserDetails=utils.detectBrowser(window);"sctp"in window.RTCPeerConnection.prototype||Object.defineProperty(window.RTCPeerConnection.prototype,"sctp",{get:function(){return void 0===this._sctp?null:this._sctp}});var sctpInDescription=function(description){if(!description||!description.sdp)return!1;var sections=_sdp2.default.splitSections(description.sdp);return sections.shift(),sections.some((function(mediaSection){var mLine=_sdp2.default.parseMLine(mediaSection);return mLine&&"application"===mLine.kind&&-1!==mLine.protocol.indexOf("SCTP")}))},getRemoteFirefoxVersion=function(description){var match=description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===match||match.length<2)return-1;var version=parseInt(match[1],10);return version!=version?-1:version},getCanSendMaxMessageSize=function(remoteIsFirefox){var canSendMaxMessageSize=65536;return"firefox"===browserDetails.browser&&(canSendMaxMessageSize=browserDetails.version<57?-1===remoteIsFirefox?16384:2147483637:browserDetails.version<60?57===browserDetails.version?65535:65536:2147483637),canSendMaxMessageSize},getMaxMessageSize=function(description,remoteIsFirefox){var maxMessageSize=65536;"firefox"===browserDetails.browser&&57===browserDetails.version&&(maxMessageSize=65535);var match=_sdp2.default.matchPrefix(description.sdp,"a=max-message-size:");return match.length>0?maxMessageSize=parseInt(match[0].substr(19),10):"firefox"===browserDetails.browser&&-1!==remoteIsFirefox&&(maxMessageSize=2147483637),maxMessageSize},origSetRemoteDescription=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(){(this._sctp=null,"chrome"===browserDetails.browser&&browserDetails.version>=76)&&("plan-b"===this.getConfiguration().sdpSemantics&&Object.defineProperty(this,"sctp",{get:function(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0}));if(sctpInDescription(arguments[0])){var isFirefox=getRemoteFirefoxVersion(arguments[0]),canSendMMS=getCanSendMaxMessageSize(isFirefox),remoteMMS=getMaxMessageSize(arguments[0],isFirefox),maxMessageSize=void 0;maxMessageSize=0===canSendMMS&&0===remoteMMS?Number.POSITIVE_INFINITY:0===canSendMMS||0===remoteMMS?Math.max(canSendMMS,remoteMMS):Math.min(canSendMMS,remoteMMS);var sctp={};Object.defineProperty(sctp,"maxMessageSize",{get:function(){return maxMessageSize}}),this._sctp=sctp}return origSetRemoteDescription.apply(this,arguments)}},exports.shimSendThrowTypeError=function(window){if(!window.RTCPeerConnection||!("createDataChannel"in window.RTCPeerConnection.prototype))return;function wrapDcSend(dc,pc){var origDataChannelSend=dc.send;dc.send=function(){var data=arguments[0],length=data.length||data.size||data.byteLength;if("open"===dc.readyState&&pc.sctp&&length>pc.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+pc.sctp.maxMessageSize+" bytes)");return origDataChannelSend.apply(dc,arguments)}}var origCreateDataChannel=window.RTCPeerConnection.prototype.createDataChannel;window.RTCPeerConnection.prototype.createDataChannel=function(){var dataChannel=origCreateDataChannel.apply(this,arguments);return wrapDcSend(dataChannel,this),dataChannel},utils.wrapPeerConnectionEvent(window,"datachannel",(function(e){return wrapDcSend(e.channel,e.target),e}))},exports.shimConnectionState=function(window){if(!window.RTCPeerConnection||"connectionState"in window.RTCPeerConnection.prototype)return;var proto=window.RTCPeerConnection.prototype;Object.defineProperty(proto,"connectionState",{get:function(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(proto,"onconnectionstatechange",{get:function(){return this._onconnectionstatechange||null},set:function(cb){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),cb&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=cb)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((function(method){var origMethod=proto[method];proto[method]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=function(e){var pc=e.target;if(pc._lastConnectionState!==pc.connectionState){pc._lastConnectionState=pc.connectionState;var newEvent=new Event("connectionstatechange",e);pc.dispatchEvent(newEvent)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),origMethod.apply(this,arguments)}}))},exports.removeAllowExtmapMixed=function(window){if(!window.RTCPeerConnection)return;var browserDetails=utils.detectBrowser(window);if("chrome"===browserDetails.browser&&browserDetails.version>=71)return;var nativeSRD=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(desc){return desc&&desc.sdp&&-1!==desc.sdp.indexOf("\na=extmap-allow-mixed")&&(desc.sdp=desc.sdp.split("\n").filter((function(line){return"a=extmap-allow-mixed"!==line.trim()})).join("\n")),nativeSRD.apply(this,arguments)}};var obj,_sdp=require("sdp"),_sdp2=(obj=_sdp)&&obj.__esModule?obj:{default:obj},utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("./utils"))},{"./utils":15,sdp:17}],7:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=exports.shimGetUserMedia=void 0;var _getusermedia=require("./getusermedia");Object.defineProperty(exports,"shimGetUserMedia",{enumerable:!0,get:function(){return _getusermedia.shimGetUserMedia}});var _getdisplaymedia=require("./getdisplaymedia");Object.defineProperty(exports,"shimGetDisplayMedia",{enumerable:!0,get:function(){return _getdisplaymedia.shimGetDisplayMedia}}),exports.shimPeerConnection=function(window){var browserDetails=utils.detectBrowser(window);if(window.RTCIceGatherer&&(window.RTCIceCandidate||(window.RTCIceCandidate=function(args){return args}),window.RTCSessionDescription||(window.RTCSessionDescription=function(args){return args}),browserDetails.version<15025)){var origMSTEnabled=Object.getOwnPropertyDescriptor(window.MediaStreamTrack.prototype,"enabled");Object.defineProperty(window.MediaStreamTrack.prototype,"enabled",{set:function(value){origMSTEnabled.set.call(this,value);var ev=new Event("enabled");ev.enabled=value,this.dispatchEvent(ev)}})}window.RTCRtpSender&&!("dtmf"in window.RTCRtpSender.prototype)&&Object.defineProperty(window.RTCRtpSender.prototype,"dtmf",{get:function(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=new window.RTCDtmfSender(this):"video"===this.track.kind&&(this._dtmf=null)),this._dtmf}});window.RTCDtmfSender&&!window.RTCDTMFSender&&(window.RTCDTMFSender=window.RTCDtmfSender);var RTCPeerConnectionShim=(0,_rtcpeerconnectionShim2.default)(window,browserDetails.version);window.RTCPeerConnection=function(config){return config&&config.iceServers&&(config.iceServers=(0,_filtericeservers.filterIceServers)(config.iceServers,browserDetails.version),utils.log("ICE servers after filtering:",config.iceServers)),new RTCPeerConnectionShim(config)},window.RTCPeerConnection.prototype=RTCPeerConnectionShim.prototype},exports.shimReplaceTrack=function(window){window.RTCRtpSender&&!("replaceTrack"in window.RTCRtpSender.prototype)&&(window.RTCRtpSender.prototype.replaceTrack=window.RTCRtpSender.prototype.setTrack)};var obj,utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils")),_filtericeservers=require("./filtericeservers"),_rtcpeerconnectionShim=require("rtcpeerconnection-shim"),_rtcpeerconnectionShim2=(obj=_rtcpeerconnectionShim)&&obj.__esModule?obj:{default:obj}},{"../utils":15,"./filtericeservers":8,"./getdisplaymedia":9,"./getusermedia":10,"rtcpeerconnection-shim":16}],8:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.filterIceServers=function(iceServers,edgeVersion){var hasTurn=!1;return(iceServers=JSON.parse(JSON.stringify(iceServers))).filter((function(server){if(server&&(server.urls||server.url)){var urls=server.urls||server.url;server.url&&!server.urls&&utils.deprecated("RTCIceServer.url","RTCIceServer.urls");var isString="string"==typeof urls;return isString&&(urls=[urls]),urls=urls.filter((function(url){if(0===url.indexOf("stun:"))return!1;var validTurn=url.startsWith("turn")&&!url.startsWith("turn:[")&&url.includes("transport=udp");return validTurn&&!hasTurn?(hasTurn=!0,!0):validTurn&&!hasTurn})),delete server.url,server.urls=isString?urls[0]:urls,!!urls.length}}))};var utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils"))},{"../utils":15}],9:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=function(window){if(!("getDisplayMedia"in window.navigator))return;if(!window.navigator.mediaDevices)return;if(window.navigator.mediaDevices&&"getDisplayMedia"in window.navigator.mediaDevices)return;window.navigator.mediaDevices.getDisplayMedia=window.navigator.getDisplayMedia.bind(window.navigator)}},{}],10:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetUserMedia=function(window){var navigator=window&&window.navigator,origGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);navigator.mediaDevices.getUserMedia=function(c){return origGetUserMedia(c).catch((function(e){return Promise.reject(function(e){return{name:{PermissionDeniedError:"NotAllowedError"}[e.name]||e.name,message:e.message,constraint:e.constraint,toString:function(){return this.name}}}(e))}))}}},{}],11:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=exports.shimGetUserMedia=void 0;var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)},_getusermedia=require("./getusermedia");Object.defineProperty(exports,"shimGetUserMedia",{enumerable:!0,get:function(){return _getusermedia.shimGetUserMedia}});var _getdisplaymedia=require("./getdisplaymedia");Object.defineProperty(exports,"shimGetDisplayMedia",{enumerable:!0,get:function(){return _getdisplaymedia.shimGetDisplayMedia}}),exports.shimOnTrack=function(window){"object"===(void 0===window?"undefined":_typeof(window))&&window.RTCTrackEvent&&"receiver"in window.RTCTrackEvent.prototype&&!("transceiver"in window.RTCTrackEvent.prototype)&&Object.defineProperty(window.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})},exports.shimPeerConnection=function(window){var browserDetails=utils.detectBrowser(window);if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection&&!window.mozRTCPeerConnection)return;!window.RTCPeerConnection&&window.mozRTCPeerConnection&&(window.RTCPeerConnection=window.mozRTCPeerConnection);browserDetails.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(method){var nativeMethod=window.RTCPeerConnection.prototype[method],methodObj=function(obj,key,value){key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value;return obj}({},method,(function(){return arguments[0]=new("addIceCandidate"===method?window.RTCIceCandidate:window.RTCSessionDescription)(arguments[0]),nativeMethod.apply(this,arguments)}));window.RTCPeerConnection.prototype[method]=methodObj[method]}));if(browserDetails.version<68){var nativeAddIceCandidate=window.RTCPeerConnection.prototype.addIceCandidate;window.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?arguments[0]&&""===arguments[0].candidate?Promise.resolve():nativeAddIceCandidate.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())}}var modernStatsTypes={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},nativeGetStats=window.RTCPeerConnection.prototype.getStats;window.RTCPeerConnection.prototype.getStats=function(){var _arguments=Array.prototype.slice.call(arguments),selector=_arguments[0],onSucc=_arguments[1],onErr=_arguments[2];return nativeGetStats.apply(this,[selector||null]).then((function(stats){if(browserDetails.version<53&&!onSucc)try{stats.forEach((function(stat){stat.type=modernStatsTypes[stat.type]||stat.type}))}catch(e){if("TypeError"!==e.name)throw e;stats.forEach((function(stat,i){stats.set(i,Object.assign({},stat,{type:modernStatsTypes[stat.type]||stat.type}))}))}return stats})).then(onSucc,onErr)}},exports.shimSenderGetStats=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection||!window.RTCRtpSender)return;if(window.RTCRtpSender&&"getStats"in window.RTCRtpSender.prototype)return;var origGetSenders=window.RTCPeerConnection.prototype.getSenders;origGetSenders&&(window.RTCPeerConnection.prototype.getSenders=function(){var _this=this,senders=origGetSenders.apply(this,[]);return senders.forEach((function(sender){return sender._pc=_this})),senders});var origAddTrack=window.RTCPeerConnection.prototype.addTrack;origAddTrack&&(window.RTCPeerConnection.prototype.addTrack=function(){var sender=origAddTrack.apply(this,arguments);return sender._pc=this,sender});window.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}},exports.shimReceiverGetStats=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection||!window.RTCRtpSender)return;if(window.RTCRtpSender&&"getStats"in window.RTCRtpReceiver.prototype)return;var origGetReceivers=window.RTCPeerConnection.prototype.getReceivers;origGetReceivers&&(window.RTCPeerConnection.prototype.getReceivers=function(){var _this2=this,receivers=origGetReceivers.apply(this,[]);return receivers.forEach((function(receiver){return receiver._pc=_this2})),receivers});utils.wrapPeerConnectionEvent(window,"track",(function(e){return e.receiver._pc=e.srcElement,e})),window.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}},exports.shimRemoveStream=function(window){if(!window.RTCPeerConnection||"removeStream"in window.RTCPeerConnection.prototype)return;window.RTCPeerConnection.prototype.removeStream=function(stream){var _this3=this;utils.deprecated("removeStream","removeTrack"),this.getSenders().forEach((function(sender){sender.track&&stream.getTracks().includes(sender.track)&&_this3.removeTrack(sender)}))}},exports.shimRTCDataChannel=function(window){window.DataChannel&&!window.RTCDataChannel&&(window.RTCDataChannel=window.DataChannel)},exports.shimAddTransceiver=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;var origAddTransceiver=window.RTCPeerConnection.prototype.addTransceiver;origAddTransceiver&&(window.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];var initParameters=arguments[1],shouldPerformCheck=initParameters&&"sendEncodings"in initParameters;shouldPerformCheck&&initParameters.sendEncodings.forEach((function(encodingParam){if("rid"in encodingParam){if(!/^[a-z0-9]{0,16}$/i.test(encodingParam.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in encodingParam&&!(parseFloat(encodingParam.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in encodingParam&&!(parseFloat(encodingParam.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));var transceiver=origAddTransceiver.apply(this,arguments);if(shouldPerformCheck){var sender=transceiver.sender,params=sender.getParameters();"encodings"in params||(params.encodings=initParameters.sendEncodings,this.setParametersPromises.push(sender.setParameters(params).catch((function(){}))))}return transceiver})},exports.shimCreateOffer=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;var origCreateOffer=window.RTCPeerConnection.prototype.createOffer;window.RTCPeerConnection.prototype.createOffer=function(){var _this4=this,_arguments2=arguments;return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((function(){return origCreateOffer.apply(_this4,_arguments2)})).finally((function(){_this4.setParametersPromises=[]})):origCreateOffer.apply(this,arguments)}},exports.shimCreateAnswer=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;var origCreateAnswer=window.RTCPeerConnection.prototype.createAnswer;window.RTCPeerConnection.prototype.createAnswer=function(){var _this5=this,_arguments3=arguments;return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((function(){return origCreateAnswer.apply(_this5,_arguments3)})).finally((function(){_this5.setParametersPromises=[]})):origCreateAnswer.apply(this,arguments)}};var utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils"))},{"../utils":15,"./getdisplaymedia":12,"./getusermedia":13}],12:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=function(window,preferredMediaSource){if(window.navigator.mediaDevices&&"getDisplayMedia"in window.navigator.mediaDevices)return;if(!window.navigator.mediaDevices)return;window.navigator.mediaDevices.getDisplayMedia=function(constraints){if(!constraints||!constraints.video){var err=new DOMException("getDisplayMedia without video constraints is undefined");return err.name="NotFoundError",err.code=8,Promise.reject(err)}return!0===constraints.video?constraints.video={mediaSource:preferredMediaSource}:constraints.video.mediaSource=preferredMediaSource,window.navigator.mediaDevices.getUserMedia(constraints)}}},{}],13:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0});var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)};exports.shimGetUserMedia=function(window){var browserDetails=utils.detectBrowser(window),navigator=window&&window.navigator,MediaStreamTrack=window&&window.MediaStreamTrack;if(navigator.getUserMedia=function(constraints,onSuccess,onError){utils.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),navigator.mediaDevices.getUserMedia(constraints).then(onSuccess,onError)},!(browserDetails.version>55&&"autoGainControl"in navigator.mediaDevices.getSupportedConstraints())){var remap=function(obj,a,b){a in obj&&!(b in obj)&&(obj[b]=obj[a],delete obj[a])},nativeGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);if(navigator.mediaDevices.getUserMedia=function(c){return"object"===(void 0===c?"undefined":_typeof(c))&&"object"===_typeof(c.audio)&&(c=JSON.parse(JSON.stringify(c)),remap(c.audio,"autoGainControl","mozAutoGainControl"),remap(c.audio,"noiseSuppression","mozNoiseSuppression")),nativeGetUserMedia(c)},MediaStreamTrack&&MediaStreamTrack.prototype.getSettings){var nativeGetSettings=MediaStreamTrack.prototype.getSettings;MediaStreamTrack.prototype.getSettings=function(){var obj=nativeGetSettings.apply(this,arguments);return remap(obj,"mozAutoGainControl","autoGainControl"),remap(obj,"mozNoiseSuppression","noiseSuppression"),obj}}if(MediaStreamTrack&&MediaStreamTrack.prototype.applyConstraints){var nativeApplyConstraints=MediaStreamTrack.prototype.applyConstraints;MediaStreamTrack.prototype.applyConstraints=function(c){return"audio"===this.kind&&"object"===(void 0===c?"undefined":_typeof(c))&&(c=JSON.parse(JSON.stringify(c)),remap(c,"autoGainControl","mozAutoGainControl"),remap(c,"noiseSuppression","mozNoiseSuppression")),nativeApplyConstraints.apply(this,[c])}}}};var utils=function(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}(require("../utils"))},{"../utils":15}],14:[function(require,module,exports){Object.defineProperty(exports,"__esModule",{value:!0});var _typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(obj){return _typeof2(obj)}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":_typeof2(obj)};exports.shimLocalStreamsAPI=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;"getLocalStreams"in window.RTCPeerConnection.prototype||(window.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams});if(!("addStream"in window.RTCPeerConnection.prototype)){var _addTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addStream=function(stream){var _this=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(stream)||this._localStreams.push(stream),stream.getAudioTracks().forEach((function(track){return _addTrack.call(_this,track,stream)})),stream.getVideoTracks().forEach((function(track){return _addTrack.call(_this,track,stream)}))},window.RTCPeerConnection.prototype.addTrack=function(track){var stream=arguments[1];return stream&&(this._localStreams?this._localStreams.includes(stream)||this._localStreams.push(stream):this._localStreams=[stream]),_addTrack.apply(this,arguments)}}"removeStream"in window.RTCPeerConnection.prototype||(window.RTCPeerConnection.prototype.removeStream=function(stream){var _this2=this;this._localStreams||(this._localStreams=[]);var index=this._localStreams.indexOf(stream);if(-1!==index){this._localStreams.splice(index,1);var tracks=stream.getTracks();this.getSenders().forEach((function(sender){tracks.includes(sender.track)&&_this2.removeTrack(sender)}))}})},exports.shimRemoteStreamsAPI=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;"getRemoteStreams"in window.RTCPeerConnection.prototype||(window.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]});if(!("onaddstream"in window.RTCPeerConnection.prototype)){Object.defineProperty(window.RTCPeerConnection.prototype,"onaddstream",{get:function(){return this._onaddstream},set:function(f){var _this3=this;this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=f),this.addEventListener("track",this._onaddstreampoly=function(e){e.streams.forEach((function(stream){if(_this3._remoteStreams||(_this3._remoteStreams=[]),!_this3._remoteStreams.includes(stream)){_this3._remoteStreams.push(stream);var event=new Event("addstream");event.stream=stream,_this3.dispatchEvent(event)}}))})}});var origSetRemoteDescription=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(){var pc=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(e){e.streams.forEach((function(stream){if(pc._remoteStreams||(pc._remoteStreams=[]),!(pc._remoteStreams.indexOf(stream)>=0)){pc._remoteStreams.push(stream);var event=new Event("addstream");event.stream=stream,pc.dispatchEvent(event)}}))}),origSetRemoteDescription.apply(pc,arguments)}}},exports.shimCallbacksAPI=function(window){if("object"!==(void 0===window?"undefined":_typeof(window))||!window.RTCPeerConnection)return;var prototype=window.RTCPeerConnection.prototype,origCreateOffer=prototype.createOffer,origCreateAnswer=prototype.createAnswer,setLocalDescription=prototype.setLocalDescription,setRemoteDescription=prototype.setRemoteDescription,addIceCandidate=prototype.addIceCandidate;prototype.createOffer=function(successCallback,failureCallback){var options=arguments.length>=2?arguments[2]:arguments[0],promise=origCreateOffer.apply(this,[options]);return failureCallback?(promise.then(successCallback,failureCallback),Promise.resolve()):promise},prototype.createAnswer=function(successCallback,failureCallback){var options=arguments.length>=2?arguments[2]:arguments[0],promise=origCreateAnswer.apply(this,[options]);return failureCallback?(promise.then(successCallback,failureCallback),Promise.resolve()):promise};var withCallback=function(description,successCallback,failureCallback){var promise=setLocalDescription.apply(this,[description]);return failureCallback?(promise.then(successCallback,failureCallback),Promise.resolve()):promise};prototype.setLocalDescription=withCallback,withCallback=function(description,successCallback,failureCallback){var promise=setRemoteDescription.apply(this,[description]);return failureCallback?(promise.then(successCallback,failureCallback),Promise.resolve()):promise},prototype.setRemoteDescription=withCallback,withCallback=function(candidate,successCallback,failureCallback){var promise=addIceCandidate.apply(this,[candidate]);return failureCallback?(promise.then(successCallback,failureCallback),Promise.resolve()):promise},prototype.addIceCandidate=withCallback},exports.shimGetUserMedia=function(window){var navigator=window&&window.navigator;if(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){var mediaDevices=navigator.mediaDevices,_getUserMedia=mediaDevices.getUserMedia.bind(mediaDevices);navigator.mediaDevices.getUserMedia=function(constraints){return _getUserMedia(shimConstraints(constraints))}}!navigator.getUserMedia&&navigator.mediaDevices&&navigator.mediaDevices.getUserMedia&&(navigator.getUserMedia=function(constraints,cb,errcb){navigator.mediaDevices.getUserMedia(constraints).then(cb,errcb)}.bind(navigator))},exports.shimConstraints=shimConstraints,exports.shimRTCIceServerUrls=function(window){var OrigPeerConnection=window.RTCPeerConnection;window.RTCPeerConnection=function(pcConfig,pcConstraints){if(pcConfig&&pcConfig.iceServers){for(var newIceServers=[],i=0;i=pos&&parseInt(match[pos],10)}function isObject(val){return"[object Object]"===Object.prototype.toString.call(val)}function walkStats(stats,base,resultSet){base&&!resultSet.has(base.id)&&(resultSet.set(base.id,base),Object.keys(base).forEach((function(name){name.endsWith("Id")?walkStats(stats,stats.get(base[name]),resultSet):name.endsWith("Ids")&&base[name].forEach((function(id){walkStats(stats,stats.get(id),resultSet)}))})))}},{}],16:[function(require,module,exports){var SDPUtils=require("sdp");function writeMediaSection(transceiver,caps,type,stream,dtlsRole){var sdp=SDPUtils.writeRtpDescription(transceiver.kind,caps);if(sdp+=SDPUtils.writeIceParameters(transceiver.iceGatherer.getLocalParameters()),sdp+=SDPUtils.writeDtlsParameters(transceiver.dtlsTransport.getLocalParameters(),"offer"===type?"actpass":dtlsRole||"active"),sdp+="a=mid:"+transceiver.mid+"\r\n",transceiver.rtpSender&&transceiver.rtpReceiver?sdp+="a=sendrecv\r\n":transceiver.rtpSender?sdp+="a=sendonly\r\n":transceiver.rtpReceiver?sdp+="a=recvonly\r\n":sdp+="a=inactive\r\n",transceiver.rtpSender){var trackId=transceiver.rtpSender._initialTrackId||transceiver.rtpSender.track.id;transceiver.rtpSender._initialTrackId=trackId;var msid="msid:"+(stream?stream.id:"-")+" "+trackId+"\r\n";sdp+="a="+msid,sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].ssrc+" "+msid,transceiver.sendEncodingParameters[0].rtx&&(sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].rtx.ssrc+" "+msid,sdp+="a=ssrc-group:FID "+transceiver.sendEncodingParameters[0].ssrc+" "+transceiver.sendEncodingParameters[0].rtx.ssrc+"\r\n")}return sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].ssrc+" cname:"+SDPUtils.localCName+"\r\n",transceiver.rtpSender&&transceiver.sendEncodingParameters[0].rtx&&(sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].rtx.ssrc+" cname:"+SDPUtils.localCName+"\r\n"),sdp}function getCommonCapabilities(localCapabilities,remoteCapabilities){var commonCapabilities={codecs:[],headerExtensions:[],fecMechanisms:[]},findCodecByPayloadType=function(pt,codecs){pt=parseInt(pt,10);for(var i=0;i=14393&&-1===url.indexOf("?transport=udp"):(hasTurn=!0,!0)})),delete server.url,server.urls=isString?urls[0]:urls,!!urls.length}}))}(config.iceServers||[],edgeVersion),this._iceGatherers=[],config.iceCandidatePoolSize)for(var i=config.iceCandidatePoolSize;i>0;i--)this._iceGatherers.push(new window.RTCIceGatherer({iceServers:config.iceServers,gatherPolicy:config.iceTransportPolicy}));else config.iceCandidatePoolSize=0;this._config=config,this.transceivers=[],this._sdpSessionId=SDPUtils.generateSessionId(),this._sdpSessionVersion=0,this._dtlsRole=void 0,this._isClosed=!1};Object.defineProperty(RTCPeerConnection.prototype,"localDescription",{configurable:!0,get:function(){return this._localDescription}}),Object.defineProperty(RTCPeerConnection.prototype,"remoteDescription",{configurable:!0,get:function(){return this._remoteDescription}}),RTCPeerConnection.prototype.onicecandidate=null,RTCPeerConnection.prototype.onaddstream=null,RTCPeerConnection.prototype.ontrack=null,RTCPeerConnection.prototype.onremovestream=null,RTCPeerConnection.prototype.onsignalingstatechange=null,RTCPeerConnection.prototype.oniceconnectionstatechange=null,RTCPeerConnection.prototype.onconnectionstatechange=null,RTCPeerConnection.prototype.onicegatheringstatechange=null,RTCPeerConnection.prototype.onnegotiationneeded=null,RTCPeerConnection.prototype.ondatachannel=null,RTCPeerConnection.prototype._dispatchEvent=function(name,event){this._isClosed||(this.dispatchEvent(event),"function"==typeof this["on"+name]&&this["on"+name](event))},RTCPeerConnection.prototype._emitGatheringStateChange=function(){var event=new Event("icegatheringstatechange");this._dispatchEvent("icegatheringstatechange",event)},RTCPeerConnection.prototype.getConfiguration=function(){return this._config},RTCPeerConnection.prototype.getLocalStreams=function(){return this.localStreams},RTCPeerConnection.prototype.getRemoteStreams=function(){return this.remoteStreams},RTCPeerConnection.prototype._createTransceiver=function(kind,doNotAdd){var hasBundleTransport=this.transceivers.length>0,transceiver={track:null,iceGatherer:null,iceTransport:null,dtlsTransport:null,localCapabilities:null,remoteCapabilities:null,rtpSender:null,rtpReceiver:null,kind:kind,mid:null,sendEncodingParameters:null,recvEncodingParameters:null,stream:null,associatedRemoteMediaStreams:[],wantReceive:!0};if(this.usingBundle&&hasBundleTransport)transceiver.iceTransport=this.transceivers[0].iceTransport,transceiver.dtlsTransport=this.transceivers[0].dtlsTransport;else{var transports=this._createIceAndDtlsTransports();transceiver.iceTransport=transports.iceTransport,transceiver.dtlsTransport=transports.dtlsTransport}return doNotAdd||this.transceivers.push(transceiver),transceiver},RTCPeerConnection.prototype.addTrack=function(track,stream){if(this._isClosed)throw makeError("InvalidStateError","Attempted to call addTrack on a closed peerconnection.");var transceiver;if(this.transceivers.find((function(s){return s.track===track})))throw makeError("InvalidAccessError","Track already exists.");for(var i=0;i=15025)stream.getTracks().forEach((function(track){pc.addTrack(track,stream)}));else{var clonedStream=stream.clone();stream.getTracks().forEach((function(track,idx){var clonedTrack=clonedStream.getTracks()[idx];track.addEventListener("enabled",(function(event){clonedTrack.enabled=event.enabled}))})),clonedStream.getTracks().forEach((function(track){pc.addTrack(track,clonedStream)}))}},RTCPeerConnection.prototype.removeTrack=function(sender){if(this._isClosed)throw makeError("InvalidStateError","Attempted to call removeTrack on a closed peerconnection.");if(!(sender instanceof window.RTCRtpSender))throw new TypeError("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.");var transceiver=this.transceivers.find((function(t){return t.rtpSender===sender}));if(!transceiver)throw makeError("InvalidAccessError","Sender was not created by this connection.");var stream=transceiver.stream;transceiver.rtpSender.stop(),transceiver.rtpSender=null,transceiver.track=null,transceiver.stream=null,-1===this.transceivers.map((function(t){return t.stream})).indexOf(stream)&&this.localStreams.indexOf(stream)>-1&&this.localStreams.splice(this.localStreams.indexOf(stream),1),this._maybeFireNegotiationNeeded()},RTCPeerConnection.prototype.removeStream=function(stream){var pc=this;stream.getTracks().forEach((function(track){var sender=pc.getSenders().find((function(s){return s.track===track}));sender&&pc.removeTrack(sender)}))},RTCPeerConnection.prototype.getSenders=function(){return this.transceivers.filter((function(transceiver){return!!transceiver.rtpSender})).map((function(transceiver){return transceiver.rtpSender}))},RTCPeerConnection.prototype.getReceivers=function(){return this.transceivers.filter((function(transceiver){return!!transceiver.rtpReceiver})).map((function(transceiver){return transceiver.rtpReceiver}))},RTCPeerConnection.prototype._createIceGatherer=function(sdpMLineIndex,usingBundle){var pc=this;if(usingBundle&&sdpMLineIndex>0)return this.transceivers[0].iceGatherer;if(this._iceGatherers.length)return this._iceGatherers.shift();var iceGatherer=new window.RTCIceGatherer({iceServers:this._config.iceServers,gatherPolicy:this._config.iceTransportPolicy});return Object.defineProperty(iceGatherer,"state",{value:"new",writable:!0}),this.transceivers[sdpMLineIndex].bufferedCandidateEvents=[],this.transceivers[sdpMLineIndex].bufferCandidates=function(event){var end=!event.candidate||0===Object.keys(event.candidate).length;iceGatherer.state=end?"completed":"gathering",null!==pc.transceivers[sdpMLineIndex].bufferedCandidateEvents&&pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event)},iceGatherer.addEventListener("localcandidate",this.transceivers[sdpMLineIndex].bufferCandidates),iceGatherer},RTCPeerConnection.prototype._gather=function(mid,sdpMLineIndex){var pc=this,iceGatherer=this.transceivers[sdpMLineIndex].iceGatherer;if(!iceGatherer.onlocalcandidate){var bufferedCandidateEvents=this.transceivers[sdpMLineIndex].bufferedCandidateEvents;this.transceivers[sdpMLineIndex].bufferedCandidateEvents=null,iceGatherer.removeEventListener("localcandidate",this.transceivers[sdpMLineIndex].bufferCandidates),iceGatherer.onlocalcandidate=function(evt){if(!(pc.usingBundle&&sdpMLineIndex>0)){var event=new Event("icecandidate");event.candidate={sdpMid:mid,sdpMLineIndex:sdpMLineIndex};var cand=evt.candidate,end=!cand||0===Object.keys(cand).length;if(end)"new"!==iceGatherer.state&&"gathering"!==iceGatherer.state||(iceGatherer.state="completed");else{"new"===iceGatherer.state&&(iceGatherer.state="gathering"),cand.component=1,cand.ufrag=iceGatherer.getLocalParameters().usernameFragment;var serializedCandidate=SDPUtils.writeCandidate(cand);event.candidate=Object.assign(event.candidate,SDPUtils.parseCandidate(serializedCandidate)),event.candidate.candidate=serializedCandidate,event.candidate.toJSON=function(){return{candidate:event.candidate.candidate,sdpMid:event.candidate.sdpMid,sdpMLineIndex:event.candidate.sdpMLineIndex,usernameFragment:event.candidate.usernameFragment}}}var sections=SDPUtils.getMediaSections(pc._localDescription.sdp);sections[event.candidate.sdpMLineIndex]+=end?"a=end-of-candidates\r\n":"a="+event.candidate.candidate+"\r\n",pc._localDescription.sdp=SDPUtils.getDescription(pc._localDescription.sdp)+sections.join("");var complete=pc.transceivers.every((function(transceiver){return transceiver.iceGatherer&&"completed"===transceiver.iceGatherer.state}));"gathering"!==pc.iceGatheringState&&(pc.iceGatheringState="gathering",pc._emitGatheringStateChange()),end||pc._dispatchEvent("icecandidate",event),complete&&(pc._dispatchEvent("icecandidate",new Event("icecandidate")),pc.iceGatheringState="complete",pc._emitGatheringStateChange())}},window.setTimeout((function(){bufferedCandidateEvents.forEach((function(e){iceGatherer.onlocalcandidate(e)}))}),0)}},RTCPeerConnection.prototype._createIceAndDtlsTransports=function(){var pc=this,iceTransport=new window.RTCIceTransport(null);iceTransport.onicestatechange=function(){pc._updateIceConnectionState(),pc._updateConnectionState()};var dtlsTransport=new window.RTCDtlsTransport(iceTransport);return dtlsTransport.ondtlsstatechange=function(){pc._updateConnectionState()},dtlsTransport.onerror=function(){Object.defineProperty(dtlsTransport,"state",{value:"failed",writable:!0}),pc._updateConnectionState()},{iceTransport:iceTransport,dtlsTransport:dtlsTransport}},RTCPeerConnection.prototype._disposeIceAndDtlsTransports=function(sdpMLineIndex){var iceGatherer=this.transceivers[sdpMLineIndex].iceGatherer;iceGatherer&&(delete iceGatherer.onlocalcandidate,delete this.transceivers[sdpMLineIndex].iceGatherer);var iceTransport=this.transceivers[sdpMLineIndex].iceTransport;iceTransport&&(delete iceTransport.onicestatechange,delete this.transceivers[sdpMLineIndex].iceTransport);var dtlsTransport=this.transceivers[sdpMLineIndex].dtlsTransport;dtlsTransport&&(delete dtlsTransport.ondtlsstatechange,delete dtlsTransport.onerror,delete this.transceivers[sdpMLineIndex].dtlsTransport)},RTCPeerConnection.prototype._transceive=function(transceiver,send,recv){var params=getCommonCapabilities(transceiver.localCapabilities,transceiver.remoteCapabilities);send&&transceiver.rtpSender&&(params.encodings=transceiver.sendEncodingParameters,params.rtcp={cname:SDPUtils.localCName,compound:transceiver.rtcpParameters.compound},transceiver.recvEncodingParameters.length&&(params.rtcp.ssrc=transceiver.recvEncodingParameters[0].ssrc),transceiver.rtpSender.send(params)),recv&&transceiver.rtpReceiver&¶ms.codecs.length>0&&("video"===transceiver.kind&&transceiver.recvEncodingParameters&&edgeVersion<15019&&transceiver.recvEncodingParameters.forEach((function(p){delete p.rtx})),transceiver.recvEncodingParameters.length?params.encodings=transceiver.recvEncodingParameters:params.encodings=[{}],params.rtcp={compound:transceiver.rtcpParameters.compound},transceiver.rtcpParameters.cname&&(params.rtcp.cname=transceiver.rtcpParameters.cname),transceiver.sendEncodingParameters.length&&(params.rtcp.ssrc=transceiver.sendEncodingParameters[0].ssrc),transceiver.rtpReceiver.receive(params))},RTCPeerConnection.prototype.setLocalDescription=function(description){var sections,sessionpart,pc=this;if(-1===["offer","answer"].indexOf(description.type))return Promise.reject(makeError("TypeError",'Unsupported type "'+description.type+'"'));if(!isActionAllowedInSignalingState("setLocalDescription",description.type,pc.signalingState)||pc._isClosed)return Promise.reject(makeError("InvalidStateError","Can not set local "+description.type+" in state "+pc.signalingState));if("offer"===description.type)sections=SDPUtils.splitSections(description.sdp),sessionpart=sections.shift(),sections.forEach((function(mediaSection,sdpMLineIndex){var caps=SDPUtils.parseRtpParameters(mediaSection);pc.transceivers[sdpMLineIndex].localCapabilities=caps})),pc.transceivers.forEach((function(transceiver,sdpMLineIndex){pc._gather(transceiver.mid,sdpMLineIndex)}));else if("answer"===description.type){sections=SDPUtils.splitSections(pc._remoteDescription.sdp),sessionpart=sections.shift();var isIceLite=SDPUtils.matchPrefix(sessionpart,"a=ice-lite").length>0;sections.forEach((function(mediaSection,sdpMLineIndex){var transceiver=pc.transceivers[sdpMLineIndex],iceGatherer=transceiver.iceGatherer,iceTransport=transceiver.iceTransport,dtlsTransport=transceiver.dtlsTransport,localCapabilities=transceiver.localCapabilities,remoteCapabilities=transceiver.remoteCapabilities;if(!(SDPUtils.isRejected(mediaSection)&&0===SDPUtils.matchPrefix(mediaSection,"a=bundle-only").length)&&!transceiver.rejected){var remoteIceParameters=SDPUtils.getIceParameters(mediaSection,sessionpart),remoteDtlsParameters=SDPUtils.getDtlsParameters(mediaSection,sessionpart);isIceLite&&(remoteDtlsParameters.role="server"),pc.usingBundle&&0!==sdpMLineIndex||(pc._gather(transceiver.mid,sdpMLineIndex),"new"===iceTransport.state&&iceTransport.start(iceGatherer,remoteIceParameters,isIceLite?"controlling":"controlled"),"new"===dtlsTransport.state&&dtlsTransport.start(remoteDtlsParameters));var params=getCommonCapabilities(localCapabilities,remoteCapabilities);pc._transceive(transceiver,params.codecs.length>0,!1)}}))}return pc._localDescription={type:description.type,sdp:description.sdp},"offer"===description.type?pc._updateSignalingState("have-local-offer"):pc._updateSignalingState("stable"),Promise.resolve()},RTCPeerConnection.prototype.setRemoteDescription=function(description){var pc=this;if(-1===["offer","answer"].indexOf(description.type))return Promise.reject(makeError("TypeError",'Unsupported type "'+description.type+'"'));if(!isActionAllowedInSignalingState("setRemoteDescription",description.type,pc.signalingState)||pc._isClosed)return Promise.reject(makeError("InvalidStateError","Can not set remote "+description.type+" in state "+pc.signalingState));var streams={};pc.remoteStreams.forEach((function(stream){streams[stream.id]=stream}));var receiverList=[],sections=SDPUtils.splitSections(description.sdp),sessionpart=sections.shift(),isIceLite=SDPUtils.matchPrefix(sessionpart,"a=ice-lite").length>0,usingBundle=SDPUtils.matchPrefix(sessionpart,"a=group:BUNDLE ").length>0;pc.usingBundle=usingBundle;var iceOptions=SDPUtils.matchPrefix(sessionpart,"a=ice-options:")[0];return pc.canTrickleIceCandidates=!!iceOptions&&iceOptions.substr(14).split(" ").indexOf("trickle")>=0,sections.forEach((function(mediaSection,sdpMLineIndex){var lines=SDPUtils.splitLines(mediaSection),kind=SDPUtils.getKind(mediaSection),rejected=SDPUtils.isRejected(mediaSection)&&0===SDPUtils.matchPrefix(mediaSection,"a=bundle-only").length,protocol=lines[0].substr(2).split(" ")[2],direction=SDPUtils.getDirection(mediaSection,sessionpart),remoteMsid=SDPUtils.parseMsid(mediaSection),mid=SDPUtils.getMid(mediaSection)||SDPUtils.generateIdentifier();if(rejected||"application"===kind&&("DTLS/SCTP"===protocol||"UDP/DTLS/SCTP"===protocol))pc.transceivers[sdpMLineIndex]={mid:mid,kind:kind,protocol:protocol,rejected:!0};else{var transceiver,iceGatherer,iceTransport,dtlsTransport,rtpReceiver,sendEncodingParameters,recvEncodingParameters,localCapabilities,track;!rejected&&pc.transceivers[sdpMLineIndex]&&pc.transceivers[sdpMLineIndex].rejected&&(pc.transceivers[sdpMLineIndex]=pc._createTransceiver(kind,!0));var remoteIceParameters,remoteDtlsParameters,remoteCapabilities=SDPUtils.parseRtpParameters(mediaSection);rejected||(remoteIceParameters=SDPUtils.getIceParameters(mediaSection,sessionpart),(remoteDtlsParameters=SDPUtils.getDtlsParameters(mediaSection,sessionpart)).role="client"),recvEncodingParameters=SDPUtils.parseRtpEncodingParameters(mediaSection);var rtcpParameters=SDPUtils.parseRtcpParameters(mediaSection),isComplete=SDPUtils.matchPrefix(mediaSection,"a=end-of-candidates",sessionpart).length>0,cands=SDPUtils.matchPrefix(mediaSection,"a=candidate:").map((function(cand){return SDPUtils.parseCandidate(cand)})).filter((function(cand){return 1===cand.component}));if(("offer"===description.type||"answer"===description.type)&&!rejected&&usingBundle&&sdpMLineIndex>0&&pc.transceivers[sdpMLineIndex]&&(pc._disposeIceAndDtlsTransports(sdpMLineIndex),pc.transceivers[sdpMLineIndex].iceGatherer=pc.transceivers[0].iceGatherer,pc.transceivers[sdpMLineIndex].iceTransport=pc.transceivers[0].iceTransport,pc.transceivers[sdpMLineIndex].dtlsTransport=pc.transceivers[0].dtlsTransport,pc.transceivers[sdpMLineIndex].rtpSender&&pc.transceivers[sdpMLineIndex].rtpSender.setTransport(pc.transceivers[0].dtlsTransport),pc.transceivers[sdpMLineIndex].rtpReceiver&&pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(pc.transceivers[0].dtlsTransport)),"offer"!==description.type||rejected){if("answer"===description.type&&!rejected){iceGatherer=(transceiver=pc.transceivers[sdpMLineIndex]).iceGatherer,iceTransport=transceiver.iceTransport,dtlsTransport=transceiver.dtlsTransport,rtpReceiver=transceiver.rtpReceiver,sendEncodingParameters=transceiver.sendEncodingParameters,localCapabilities=transceiver.localCapabilities,pc.transceivers[sdpMLineIndex].recvEncodingParameters=recvEncodingParameters,pc.transceivers[sdpMLineIndex].remoteCapabilities=remoteCapabilities,pc.transceivers[sdpMLineIndex].rtcpParameters=rtcpParameters,cands.length&&"new"===iceTransport.state&&(!isIceLite&&!isComplete||usingBundle&&0!==sdpMLineIndex?cands.forEach((function(candidate){maybeAddCandidate(transceiver.iceTransport,candidate)})):iceTransport.setRemoteCandidates(cands)),usingBundle&&0!==sdpMLineIndex||("new"===iceTransport.state&&iceTransport.start(iceGatherer,remoteIceParameters,"controlling"),"new"===dtlsTransport.state&&dtlsTransport.start(remoteDtlsParameters)),!getCommonCapabilities(transceiver.localCapabilities,transceiver.remoteCapabilities).codecs.filter((function(c){return"rtx"===c.name.toLowerCase()})).length&&transceiver.sendEncodingParameters[0].rtx&&delete transceiver.sendEncodingParameters[0].rtx,pc._transceive(transceiver,"sendrecv"===direction||"recvonly"===direction,"sendrecv"===direction||"sendonly"===direction),!rtpReceiver||"sendrecv"!==direction&&"sendonly"!==direction?delete transceiver.rtpReceiver:(track=rtpReceiver.track,remoteMsid?(streams[remoteMsid.stream]||(streams[remoteMsid.stream]=new window.MediaStream),addTrackToStreamAndFireEvent(track,streams[remoteMsid.stream]),receiverList.push([track,rtpReceiver,streams[remoteMsid.stream]])):(streams.default||(streams.default=new window.MediaStream),addTrackToStreamAndFireEvent(track,streams.default),receiverList.push([track,rtpReceiver,streams.default])))}}else{(transceiver=pc.transceivers[sdpMLineIndex]||pc._createTransceiver(kind)).mid=mid,transceiver.iceGatherer||(transceiver.iceGatherer=pc._createIceGatherer(sdpMLineIndex,usingBundle)),cands.length&&"new"===transceiver.iceTransport.state&&(!isComplete||usingBundle&&0!==sdpMLineIndex?cands.forEach((function(candidate){maybeAddCandidate(transceiver.iceTransport,candidate)})):transceiver.iceTransport.setRemoteCandidates(cands)),localCapabilities=window.RTCRtpReceiver.getCapabilities(kind),edgeVersion<15019&&(localCapabilities.codecs=localCapabilities.codecs.filter((function(codec){return"rtx"!==codec.name}))),sendEncodingParameters=transceiver.sendEncodingParameters||[{ssrc:1001*(2*sdpMLineIndex+2)}];var stream,isNewTrack=!1;if("sendrecv"===direction||"sendonly"===direction){if(isNewTrack=!transceiver.rtpReceiver,rtpReceiver=transceiver.rtpReceiver||new window.RTCRtpReceiver(transceiver.dtlsTransport,kind),isNewTrack)track=rtpReceiver.track,remoteMsid&&"-"===remoteMsid.stream||(remoteMsid?(streams[remoteMsid.stream]||(streams[remoteMsid.stream]=new window.MediaStream,Object.defineProperty(streams[remoteMsid.stream],"id",{get:function(){return remoteMsid.stream}})),Object.defineProperty(track,"id",{get:function(){return remoteMsid.track}}),stream=streams[remoteMsid.stream]):(streams.default||(streams.default=new window.MediaStream),stream=streams.default)),stream&&(addTrackToStreamAndFireEvent(track,stream),transceiver.associatedRemoteMediaStreams.push(stream)),receiverList.push([track,rtpReceiver,stream])}else transceiver.rtpReceiver&&transceiver.rtpReceiver.track&&(transceiver.associatedRemoteMediaStreams.forEach((function(s){var nativeTrack=s.getTracks().find((function(t){return t.id===transceiver.rtpReceiver.track.id}));nativeTrack&&function(track,stream){stream.removeTrack(track),stream.dispatchEvent(new window.MediaStreamTrackEvent("removetrack",{track:track}))}(nativeTrack,s)})),transceiver.associatedRemoteMediaStreams=[]);transceiver.localCapabilities=localCapabilities,transceiver.remoteCapabilities=remoteCapabilities,transceiver.rtpReceiver=rtpReceiver,transceiver.rtcpParameters=rtcpParameters,transceiver.sendEncodingParameters=sendEncodingParameters,transceiver.recvEncodingParameters=recvEncodingParameters,pc._transceive(pc.transceivers[sdpMLineIndex],!1,isNewTrack)}}})),void 0===pc._dtlsRole&&(pc._dtlsRole="offer"===description.type?"active":"passive"),pc._remoteDescription={type:description.type,sdp:description.sdp},"offer"===description.type?pc._updateSignalingState("have-remote-offer"):pc._updateSignalingState("stable"),Object.keys(streams).forEach((function(sid){var stream=streams[sid];if(stream.getTracks().length){if(-1===pc.remoteStreams.indexOf(stream)){pc.remoteStreams.push(stream);var event=new Event("addstream");event.stream=stream,window.setTimeout((function(){pc._dispatchEvent("addstream",event)}))}receiverList.forEach((function(item){var track=item[0],receiver=item[1];stream.id===item[2].id&&fireAddTrack(pc,track,receiver,[stream])}))}})),receiverList.forEach((function(item){item[2]||fireAddTrack(pc,item[0],item[1],[])})),window.setTimeout((function(){pc&&pc.transceivers&&pc.transceivers.forEach((function(transceiver){transceiver.iceTransport&&"new"===transceiver.iceTransport.state&&transceiver.iceTransport.getRemoteCandidates().length>0&&(console.warn("Timeout for addRemoteCandidate. Consider sending an end-of-candidates notification"),transceiver.iceTransport.addRemoteCandidate({}))}))}),4e3),Promise.resolve()},RTCPeerConnection.prototype.close=function(){this.transceivers.forEach((function(transceiver){transceiver.iceTransport&&transceiver.iceTransport.stop(),transceiver.dtlsTransport&&transceiver.dtlsTransport.stop(),transceiver.rtpSender&&transceiver.rtpSender.stop(),transceiver.rtpReceiver&&transceiver.rtpReceiver.stop()})),this._isClosed=!0,this._updateSignalingState("closed")},RTCPeerConnection.prototype._updateSignalingState=function(newState){this.signalingState=newState;var event=new Event("signalingstatechange");this._dispatchEvent("signalingstatechange",event)},RTCPeerConnection.prototype._maybeFireNegotiationNeeded=function(){var pc=this;"stable"===this.signalingState&&!0!==this.needNegotiation&&(this.needNegotiation=!0,window.setTimeout((function(){if(pc.needNegotiation){pc.needNegotiation=!1;var event=new Event("negotiationneeded");pc._dispatchEvent("negotiationneeded",event)}}),0))},RTCPeerConnection.prototype._updateIceConnectionState=function(){var newState,states={new:0,closed:0,checking:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach((function(transceiver){transceiver.iceTransport&&!transceiver.rejected&&states[transceiver.iceTransport.state]++})),newState="new",states.failed>0?newState="failed":states.checking>0?newState="checking":states.disconnected>0?newState="disconnected":states.new>0?newState="new":states.connected>0?newState="connected":states.completed>0&&(newState="completed"),newState!==this.iceConnectionState){this.iceConnectionState=newState;var event=new Event("iceconnectionstatechange");this._dispatchEvent("iceconnectionstatechange",event)}},RTCPeerConnection.prototype._updateConnectionState=function(){var newState,states={new:0,closed:0,connecting:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach((function(transceiver){transceiver.iceTransport&&transceiver.dtlsTransport&&!transceiver.rejected&&(states[transceiver.iceTransport.state]++,states[transceiver.dtlsTransport.state]++)})),states.connected+=states.completed,newState="new",states.failed>0?newState="failed":states.connecting>0?newState="connecting":states.disconnected>0?newState="disconnected":states.new>0?newState="new":states.connected>0&&(newState="connected"),newState!==this.connectionState){this.connectionState=newState;var event=new Event("connectionstatechange");this._dispatchEvent("connectionstatechange",event)}},RTCPeerConnection.prototype.createOffer=function(){var pc=this;if(pc._isClosed)return Promise.reject(makeError("InvalidStateError","Can not call createOffer after close"));var numAudioTracks=pc.transceivers.filter((function(t){return"audio"===t.kind})).length,numVideoTracks=pc.transceivers.filter((function(t){return"video"===t.kind})).length,offerOptions=arguments[0];if(offerOptions){if(offerOptions.mandatory||offerOptions.optional)throw new TypeError("Legacy mandatory/optional constraints not supported.");void 0!==offerOptions.offerToReceiveAudio&&(numAudioTracks=!0===offerOptions.offerToReceiveAudio?1:!1===offerOptions.offerToReceiveAudio?0:offerOptions.offerToReceiveAudio),void 0!==offerOptions.offerToReceiveVideo&&(numVideoTracks=!0===offerOptions.offerToReceiveVideo?1:!1===offerOptions.offerToReceiveVideo?0:offerOptions.offerToReceiveVideo)}for(pc.transceivers.forEach((function(transceiver){"audio"===transceiver.kind?--numAudioTracks<0&&(transceiver.wantReceive=!1):"video"===transceiver.kind&&--numVideoTracks<0&&(transceiver.wantReceive=!1)}));numAudioTracks>0||numVideoTracks>0;)numAudioTracks>0&&(pc._createTransceiver("audio"),numAudioTracks--),numVideoTracks>0&&(pc._createTransceiver("video"),numVideoTracks--);var sdp=SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,pc._sdpSessionVersion++);pc.transceivers.forEach((function(transceiver,sdpMLineIndex){var track=transceiver.track,kind=transceiver.kind,mid=transceiver.mid||SDPUtils.generateIdentifier();transceiver.mid=mid,transceiver.iceGatherer||(transceiver.iceGatherer=pc._createIceGatherer(sdpMLineIndex,pc.usingBundle));var localCapabilities=window.RTCRtpSender.getCapabilities(kind);edgeVersion<15019&&(localCapabilities.codecs=localCapabilities.codecs.filter((function(codec){return"rtx"!==codec.name}))),localCapabilities.codecs.forEach((function(codec){"H264"===codec.name&&void 0===codec.parameters["level-asymmetry-allowed"]&&(codec.parameters["level-asymmetry-allowed"]="1"),transceiver.remoteCapabilities&&transceiver.remoteCapabilities.codecs&&transceiver.remoteCapabilities.codecs.forEach((function(remoteCodec){codec.name.toLowerCase()===remoteCodec.name.toLowerCase()&&codec.clockRate===remoteCodec.clockRate&&(codec.preferredPayloadType=remoteCodec.payloadType)}))})),localCapabilities.headerExtensions.forEach((function(hdrExt){(transceiver.remoteCapabilities&&transceiver.remoteCapabilities.headerExtensions||[]).forEach((function(rHdrExt){hdrExt.uri===rHdrExt.uri&&(hdrExt.id=rHdrExt.id)}))}));var sendEncodingParameters=transceiver.sendEncodingParameters||[{ssrc:1001*(2*sdpMLineIndex+1)}];track&&edgeVersion>=15019&&"video"===kind&&!sendEncodingParameters[0].rtx&&(sendEncodingParameters[0].rtx={ssrc:sendEncodingParameters[0].ssrc+1}),transceiver.wantReceive&&(transceiver.rtpReceiver=new window.RTCRtpReceiver(transceiver.dtlsTransport,kind)),transceiver.localCapabilities=localCapabilities,transceiver.sendEncodingParameters=sendEncodingParameters})),"max-compat"!==pc._config.bundlePolicy&&(sdp+="a=group:BUNDLE "+pc.transceivers.map((function(t){return t.mid})).join(" ")+"\r\n"),sdp+="a=ice-options:trickle\r\n",pc.transceivers.forEach((function(transceiver,sdpMLineIndex){sdp+=writeMediaSection(transceiver,transceiver.localCapabilities,"offer",transceiver.stream,pc._dtlsRole),sdp+="a=rtcp-rsize\r\n",!transceiver.iceGatherer||"new"===pc.iceGatheringState||0!==sdpMLineIndex&&pc.usingBundle||(transceiver.iceGatherer.getLocalCandidates().forEach((function(cand){cand.component=1,sdp+="a="+SDPUtils.writeCandidate(cand)+"\r\n"})),"completed"===transceiver.iceGatherer.state&&(sdp+="a=end-of-candidates\r\n"))}));var desc=new window.RTCSessionDescription({type:"offer",sdp:sdp});return Promise.resolve(desc)},RTCPeerConnection.prototype.createAnswer=function(){var pc=this;if(pc._isClosed)return Promise.reject(makeError("InvalidStateError","Can not call createAnswer after close"));if("have-remote-offer"!==pc.signalingState&&"have-local-pranswer"!==pc.signalingState)return Promise.reject(makeError("InvalidStateError","Can not call createAnswer in signalingState "+pc.signalingState));var sdp=SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,pc._sdpSessionVersion++);pc.usingBundle&&(sdp+="a=group:BUNDLE "+pc.transceivers.map((function(t){return t.mid})).join(" ")+"\r\n"),sdp+="a=ice-options:trickle\r\n";var mediaSectionsInOffer=SDPUtils.getMediaSections(pc._remoteDescription.sdp).length;pc.transceivers.forEach((function(transceiver,sdpMLineIndex){if(!(sdpMLineIndex+1>mediaSectionsInOffer)){if(transceiver.rejected)return"application"===transceiver.kind?"DTLS/SCTP"===transceiver.protocol?sdp+="m=application 0 DTLS/SCTP 5000\r\n":sdp+="m=application 0 "+transceiver.protocol+" webrtc-datachannel\r\n":"audio"===transceiver.kind?sdp+="m=audio 0 UDP/TLS/RTP/SAVPF 0\r\na=rtpmap:0 PCMU/8000\r\n":"video"===transceiver.kind&&(sdp+="m=video 0 UDP/TLS/RTP/SAVPF 120\r\na=rtpmap:120 VP8/90000\r\n"),void(sdp+="c=IN IP4 0.0.0.0\r\na=inactive\r\na=mid:"+transceiver.mid+"\r\n");var localTrack;if(transceiver.stream)"audio"===transceiver.kind?localTrack=transceiver.stream.getAudioTracks()[0]:"video"===transceiver.kind&&(localTrack=transceiver.stream.getVideoTracks()[0]),localTrack&&edgeVersion>=15019&&"video"===transceiver.kind&&!transceiver.sendEncodingParameters[0].rtx&&(transceiver.sendEncodingParameters[0].rtx={ssrc:transceiver.sendEncodingParameters[0].ssrc+1});var commonCapabilities=getCommonCapabilities(transceiver.localCapabilities,transceiver.remoteCapabilities);!commonCapabilities.codecs.filter((function(c){return"rtx"===c.name.toLowerCase()})).length&&transceiver.sendEncodingParameters[0].rtx&&delete transceiver.sendEncodingParameters[0].rtx,sdp+=writeMediaSection(transceiver,commonCapabilities,"answer",transceiver.stream,pc._dtlsRole),transceiver.rtcpParameters&&transceiver.rtcpParameters.reducedSize&&(sdp+="a=rtcp-rsize\r\n")}}));var desc=new window.RTCSessionDescription({type:"answer",sdp:sdp});return Promise.resolve(desc)},RTCPeerConnection.prototype.addIceCandidate=function(candidate){var sections,pc=this;return candidate&&void 0===candidate.sdpMLineIndex&&!candidate.sdpMid?Promise.reject(new TypeError("sdpMLineIndex or sdpMid required")):new Promise((function(resolve,reject){if(!pc._remoteDescription)return reject(makeError("InvalidStateError","Can not add ICE candidate without a remote description"));if(candidate&&""!==candidate.candidate){var sdpMLineIndex=candidate.sdpMLineIndex;if(candidate.sdpMid)for(var i=0;i0?SDPUtils.parseCandidate(candidate.candidate):{};if("tcp"===cand.protocol&&(0===cand.port||9===cand.port))return resolve();if(cand.component&&1!==cand.component)return resolve();if((0===sdpMLineIndex||sdpMLineIndex>0&&transceiver.iceTransport!==pc.transceivers[0].iceTransport)&&!maybeAddCandidate(transceiver.iceTransport,cand))return reject(makeError("OperationError","Can not add ICE candidate"));var candidateString=candidate.candidate.trim();0===candidateString.indexOf("a=")&&(candidateString=candidateString.substr(2)),(sections=SDPUtils.getMediaSections(pc._remoteDescription.sdp))[sdpMLineIndex]+="a="+(cand.type?candidateString:"end-of-candidates")+"\r\n",pc._remoteDescription.sdp=SDPUtils.getDescription(pc._remoteDescription.sdp)+sections.join("")}else for(var j=0;j0?parts[0].split("/")[1]:"sendrecv",uri:parts[1]}},SDPUtils.writeExtmap=function(headerExtension){return"a=extmap:"+(headerExtension.id||headerExtension.preferredId)+(headerExtension.direction&&"sendrecv"!==headerExtension.direction?"/"+headerExtension.direction:"")+" "+headerExtension.uri+"\r\n"},SDPUtils.parseFmtp=function(line){for(var kv,parsed={},parts=line.substr(line.indexOf(" ")+1).split(";"),j=0;j-1?(parts.attribute=line.substr(sp+1,colon-sp-1),parts.value=line.substr(colon+1)):parts.attribute=line.substr(sp+1),parts},SDPUtils.parseSsrcGroup=function(line){var parts=line.substr(13).split(" ");return{semantics:parts.shift(),ssrcs:parts.map((function(ssrc){return parseInt(ssrc,10)}))}},SDPUtils.getMid=function(mediaSection){var mid=SDPUtils.matchPrefix(mediaSection,"a=mid:")[0];if(mid)return mid.substr(6)},SDPUtils.parseFingerprint=function(line){var parts=line.substr(14).split(" ");return{algorithm:parts[0].toLowerCase(),value:parts[1]}},SDPUtils.getDtlsParameters=function(mediaSection,sessionpart){return{role:"auto",fingerprints:SDPUtils.matchPrefix(mediaSection+sessionpart,"a=fingerprint:").map(SDPUtils.parseFingerprint)}},SDPUtils.writeDtlsParameters=function(params,setupType){var sdp="a=setup:"+setupType+"\r\n";return params.fingerprints.forEach((function(fp){sdp+="a=fingerprint:"+fp.algorithm+" "+fp.value+"\r\n"})),sdp},SDPUtils.parseCryptoLine=function(line){var parts=line.substr(9).split(" ");return{tag:parseInt(parts[0],10),cryptoSuite:parts[1],keyParams:parts[2],sessionParams:parts.slice(3)}},SDPUtils.writeCryptoLine=function(parameters){return"a=crypto:"+parameters.tag+" "+parameters.cryptoSuite+" "+("object"===_typeof2(parameters.keyParams)?SDPUtils.writeCryptoKeyParams(parameters.keyParams):parameters.keyParams)+(parameters.sessionParams?" "+parameters.sessionParams.join(" "):"")+"\r\n"},SDPUtils.parseCryptoKeyParams=function(keyParams){if(0!==keyParams.indexOf("inline:"))return null;var parts=keyParams.substr(7).split("|");return{keyMethod:"inline",keySalt:parts[0],lifeTime:parts[1],mkiValue:parts[2]?parts[2].split(":")[0]:void 0,mkiLength:parts[2]?parts[2].split(":")[1]:void 0}},SDPUtils.writeCryptoKeyParams=function(keyParams){return keyParams.keyMethod+":"+keyParams.keySalt+(keyParams.lifeTime?"|"+keyParams.lifeTime:"")+(keyParams.mkiValue&&keyParams.mkiLength?"|"+keyParams.mkiValue+":"+keyParams.mkiLength:"")},SDPUtils.getCryptoParameters=function(mediaSection,sessionpart){return SDPUtils.matchPrefix(mediaSection+sessionpart,"a=crypto:").map(SDPUtils.parseCryptoLine)},SDPUtils.getIceParameters=function(mediaSection,sessionpart){var ufrag=SDPUtils.matchPrefix(mediaSection+sessionpart,"a=ice-ufrag:")[0],pwd=SDPUtils.matchPrefix(mediaSection+sessionpart,"a=ice-pwd:")[0];return ufrag&&pwd?{usernameFragment:ufrag.substr(12),password:pwd.substr(10)}:null},SDPUtils.writeIceParameters=function(params){return"a=ice-ufrag:"+params.usernameFragment+"\r\na=ice-pwd:"+params.password+"\r\n"},SDPUtils.parseRtpParameters=function(mediaSection){for(var description={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},mline=SDPUtils.splitLines(mediaSection)[0].split(" "),i=3;i0?"9":"0",sdp+=" UDP/TLS/RTP/SAVPF ",sdp+=caps.codecs.map((function(codec){return void 0!==codec.preferredPayloadType?codec.preferredPayloadType:codec.payloadType})).join(" ")+"\r\n",sdp+="c=IN IP4 0.0.0.0\r\n",sdp+="a=rtcp:9 IN IP4 0.0.0.0\r\n",caps.codecs.forEach((function(codec){sdp+=SDPUtils.writeRtpMap(codec),sdp+=SDPUtils.writeFmtp(codec),sdp+=SDPUtils.writeRtcpFb(codec)}));var maxptime=0;return caps.codecs.forEach((function(codec){codec.maxptime>maxptime&&(maxptime=codec.maxptime)})),maxptime>0&&(sdp+="a=maxptime:"+maxptime+"\r\n"),sdp+="a=rtcp-mux\r\n",caps.headerExtensions&&caps.headerExtensions.forEach((function(extension){sdp+=SDPUtils.writeExtmap(extension)})),sdp},SDPUtils.parseRtpEncodingParameters=function(mediaSection){var secondarySsrc,encodingParameters=[],description=SDPUtils.parseRtpParameters(mediaSection),hasRed=-1!==description.fecMechanisms.indexOf("RED"),hasUlpfec=-1!==description.fecMechanisms.indexOf("ULPFEC"),ssrcs=SDPUtils.matchPrefix(mediaSection,"a=ssrc:").map((function(line){return SDPUtils.parseSsrcMedia(line)})).filter((function(parts){return"cname"===parts.attribute})),primarySsrc=ssrcs.length>0&&ssrcs[0].ssrc,flows=SDPUtils.matchPrefix(mediaSection,"a=ssrc-group:FID").map((function(line){return line.substr(17).split(" ").map((function(part){return parseInt(part,10)}))}));flows.length>0&&flows[0].length>1&&flows[0][0]===primarySsrc&&(secondarySsrc=flows[0][1]),description.codecs.forEach((function(codec){if("RTX"===codec.name.toUpperCase()&&codec.parameters.apt){var encParam={ssrc:primarySsrc,codecPayloadType:parseInt(codec.parameters.apt,10)};primarySsrc&&secondarySsrc&&(encParam.rtx={ssrc:secondarySsrc}),encodingParameters.push(encParam),hasRed&&((encParam=JSON.parse(JSON.stringify(encParam))).fec={ssrc:primarySsrc,mechanism:hasUlpfec?"red+ulpfec":"red"},encodingParameters.push(encParam))}})),0===encodingParameters.length&&primarySsrc&&encodingParameters.push({ssrc:primarySsrc});var bandwidth=SDPUtils.matchPrefix(mediaSection,"b=");return bandwidth.length&&(bandwidth=0===bandwidth[0].indexOf("b=TIAS:")?parseInt(bandwidth[0].substr(7),10):0===bandwidth[0].indexOf("b=AS:")?1e3*parseInt(bandwidth[0].substr(5),10)*.95-16e3:void 0,encodingParameters.forEach((function(params){params.maxBitrate=bandwidth}))),encodingParameters},SDPUtils.parseRtcpParameters=function(mediaSection){var rtcpParameters={},remoteSsrc=SDPUtils.matchPrefix(mediaSection,"a=ssrc:").map((function(line){return SDPUtils.parseSsrcMedia(line)})).filter((function(obj){return"cname"===obj.attribute}))[0];remoteSsrc&&(rtcpParameters.cname=remoteSsrc.value,rtcpParameters.ssrc=remoteSsrc.ssrc);var rsize=SDPUtils.matchPrefix(mediaSection,"a=rtcp-rsize");rtcpParameters.reducedSize=rsize.length>0,rtcpParameters.compound=0===rsize.length;var mux=SDPUtils.matchPrefix(mediaSection,"a=rtcp-mux");return rtcpParameters.mux=mux.length>0,rtcpParameters},SDPUtils.parseMsid=function(mediaSection){var parts,spec=SDPUtils.matchPrefix(mediaSection,"a=msid:");if(1===spec.length)return{stream:(parts=spec[0].substr(7).split(" "))[0],track:parts[1]};var planB=SDPUtils.matchPrefix(mediaSection,"a=ssrc:").map((function(line){return SDPUtils.parseSsrcMedia(line)})).filter((function(msidParts){return"msid"===msidParts.attribute}));return planB.length>0?{stream:(parts=planB[0].value.split(" "))[0],track:parts[1]}:void 0},SDPUtils.parseSctpDescription=function(mediaSection){var maxMessageSize,mline=SDPUtils.parseMLine(mediaSection),maxSizeLine=SDPUtils.matchPrefix(mediaSection,"a=max-message-size:");maxSizeLine.length>0&&(maxMessageSize=parseInt(maxSizeLine[0].substr(19),10)),isNaN(maxMessageSize)&&(maxMessageSize=65536);var sctpPort=SDPUtils.matchPrefix(mediaSection,"a=sctp-port:");if(sctpPort.length>0)return{port:parseInt(sctpPort[0].substr(12),10),protocol:mline.fmt,maxMessageSize:maxMessageSize};if(SDPUtils.matchPrefix(mediaSection,"a=sctpmap:").length>0){var parts=SDPUtils.matchPrefix(mediaSection,"a=sctpmap:")[0].substr(10).split(" ");return{port:parseInt(parts[0],10),protocol:parts[1],maxMessageSize:maxMessageSize}}},SDPUtils.writeSctpDescription=function(media,sctp){var output=[];return output="DTLS/SCTP"!==media.protocol?["m="+media.kind+" 9 "+media.protocol+" "+sctp.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+sctp.port+"\r\n"]:["m="+media.kind+" 9 "+media.protocol+" "+sctp.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+sctp.port+" "+sctp.protocol+" 65535\r\n"],void 0!==sctp.maxMessageSize&&output.push("a=max-message-size:"+sctp.maxMessageSize+"\r\n"),output.join("")},SDPUtils.generateSessionId=function(){return Math.random().toString().substr(2,21)},SDPUtils.writeSessionBoilerplate=function(sessId,sessVer,sessUser){var version=void 0!==sessVer?sessVer:2;return"v=0\r\no="+(sessUser||"thisisadapterortc")+" "+(sessId||SDPUtils.generateSessionId())+" "+version+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},SDPUtils.writeMediaSection=function(transceiver,caps,type,stream){var sdp=SDPUtils.writeRtpDescription(transceiver.kind,caps);if(sdp+=SDPUtils.writeIceParameters(transceiver.iceGatherer.getLocalParameters()),sdp+=SDPUtils.writeDtlsParameters(transceiver.dtlsTransport.getLocalParameters(),"offer"===type?"actpass":"active"),sdp+="a=mid:"+transceiver.mid+"\r\n",transceiver.direction?sdp+="a="+transceiver.direction+"\r\n":transceiver.rtpSender&&transceiver.rtpReceiver?sdp+="a=sendrecv\r\n":transceiver.rtpSender?sdp+="a=sendonly\r\n":transceiver.rtpReceiver?sdp+="a=recvonly\r\n":sdp+="a=inactive\r\n",transceiver.rtpSender){var msid="msid:"+stream.id+" "+transceiver.rtpSender.track.id+"\r\n";sdp+="a="+msid,sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].ssrc+" "+msid,transceiver.sendEncodingParameters[0].rtx&&(sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].rtx.ssrc+" "+msid,sdp+="a=ssrc-group:FID "+transceiver.sendEncodingParameters[0].ssrc+" "+transceiver.sendEncodingParameters[0].rtx.ssrc+"\r\n")}return sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].ssrc+" cname:"+SDPUtils.localCName+"\r\n",transceiver.rtpSender&&transceiver.sendEncodingParameters[0].rtx&&(sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].rtx.ssrc+" cname:"+SDPUtils.localCName+"\r\n"),sdp},SDPUtils.getDirection=function(mediaSection,sessionpart){for(var lines=SDPUtils.splitLines(mediaSection),i=0;i 0 && arguments[0] !== undefined ? arguments[0] : {},\n window = _ref.window;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n shimChrome: true,\n shimFirefox: true,\n shimEdge: true,\n shimSafari: true\n };\n\n // Utils.\n var logging = utils.log;\n var browserDetails = utils.detectBrowser(window);\n\n var adapter = {\n browserDetails: browserDetails,\n commonShim: commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection || !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n chromeShim.shimGetUserMedia(window);\n chromeShim.shimMediaStream(window);\n chromeShim.shimPeerConnection(window);\n chromeShim.shimOnTrack(window);\n chromeShim.shimAddTrackRemoveTrack(window);\n chromeShim.shimGetSendersWithDtmf(window);\n chromeShim.shimGetStats(window);\n chromeShim.shimSenderReceiverGetStats(window);\n chromeShim.fixNegotiationNeeded(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimConnectionState(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n commonShim.removeAllowExtmapMixed(window);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection || !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n firefoxShim.shimGetUserMedia(window);\n firefoxShim.shimPeerConnection(window);\n firefoxShim.shimOnTrack(window);\n firefoxShim.shimRemoveStream(window);\n firefoxShim.shimSenderGetStats(window);\n firefoxShim.shimReceiverGetStats(window);\n firefoxShim.shimRTCDataChannel(window);\n firefoxShim.shimAddTransceiver(window);\n firefoxShim.shimCreateOffer(window);\n firefoxShim.shimCreateAnswer(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimConnectionState(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n break;\n case 'edge':\n if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n logging('MS edge shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming edge.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = edgeShim;\n\n edgeShim.shimGetUserMedia(window);\n edgeShim.shimGetDisplayMedia(window);\n edgeShim.shimPeerConnection(window);\n edgeShim.shimReplaceTrack(window);\n\n // the edge shim implements the full RTCIceCandidate object.\n\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n safariShim.shimRTCIceServerUrls(window);\n safariShim.shimCreateOfferLegacy(window);\n safariShim.shimCallbacksAPI(window);\n safariShim.shimLocalStreamsAPI(window);\n safariShim.shimRemoteStreamsAPI(window);\n safariShim.shimTrackEventTransceiver(window);\n safariShim.shimGetUserMedia(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n commonShim.removeAllowExtmapMixed(window);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n\n// Browser shims.\n\n},{\"./chrome/chrome_shim\":3,\"./common_shim\":6,\"./edge/edge_shim\":7,\"./firefox/firefox_shim\":11,\"./safari/safari_shim\":14,\"./utils\":15}],3:[function(require,module,exports){\n\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = exports.shimGetUserMedia = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _getusermedia = require('./getusermedia');\n\nObject.defineProperty(exports, 'shimGetUserMedia', {\n enumerable: true,\n get: function get() {\n return _getusermedia.shimGetUserMedia;\n }\n});\n\nvar _getdisplaymedia = require('./getdisplaymedia');\n\nObject.defineProperty(exports, 'shimGetDisplayMedia', {\n enumerable: true,\n get: function get() {\n return _getdisplaymedia.shimGetDisplayMedia;\n }\n});\nexports.shimMediaStream = shimMediaStream;\nexports.shimOnTrack = shimOnTrack;\nexports.shimGetSendersWithDtmf = shimGetSendersWithDtmf;\nexports.shimGetStats = shimGetStats;\nexports.shimSenderReceiverGetStats = shimSenderReceiverGetStats;\nexports.shimAddTrackRemoveTrackWithNative = shimAddTrackRemoveTrackWithNative;\nexports.shimAddTrackRemoveTrack = shimAddTrackRemoveTrack;\nexports.shimPeerConnection = shimPeerConnection;\nexports.fixNegotiationNeeded = fixNegotiationNeeded;\n\nvar _utils = require('../utils.js');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nfunction shimOnTrack(window) {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && !('ontrack' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get: function get() {\n return this._ontrack;\n },\n set: function set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n\n enumerable: true,\n configurable: true\n });\n var origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {\n var _this = this;\n\n if (!this._ontrackpoly) {\n this._ontrackpoly = function (e) {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', function (te) {\n var receiver = void 0;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = _this.getReceivers().find(function (r) {\n return r.track && r.track.id === te.track.id;\n });\n } else {\n receiver = { track: te.track };\n }\n\n var event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = { receiver: receiver };\n event.streams = [e.stream];\n _this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(function (track) {\n var receiver = void 0;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = _this.getReceivers().find(function (r) {\n return r.track && r.track.id === track.id;\n });\n } else {\n receiver = { track: track };\n }\n var event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = { receiver: receiver };\n event.streams = [e.stream];\n _this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', function (e) {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver', { value: { receiver: e.receiver } });\n }\n return e;\n });\n }\n}\n\nfunction shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && !('getSenders' in window.RTCPeerConnection.prototype) && 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n var shimSenderWithDtmf = function shimSenderWithDtmf(pc, track) {\n return {\n track: track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {\n var sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n var idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n var _this2 = this;\n\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(function (track) {\n _this2._senders.push(shimSenderWithDtmf(_this2, track));\n });\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n var _this3 = this;\n\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(function (track) {\n var sender = _this3._senders.find(function (s) {\n return s.track === track;\n });\n if (sender) {\n // remove sender\n _this3._senders.splice(_this3._senders.indexOf(sender), 1);\n }\n });\n };\n } else if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && 'getSenders' in window.RTCPeerConnection.prototype && 'createDTMFSender' in window.RTCPeerConnection.prototype && window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n var _this4 = this;\n\n var senders = origGetSenders.apply(this, []);\n senders.forEach(function (sender) {\n return sender._pc = _this4;\n });\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get: function get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nfunction shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n var origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n var _this5 = this;\n\n var _arguments = Array.prototype.slice.call(arguments),\n selector = _arguments[0],\n onSucc = _arguments[1],\n onErr = _arguments[2];\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n\n\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 || typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n var fixChromeStats_ = function fixChromeStats_(response) {\n var standardReport = {};\n var reports = response.result();\n reports.forEach(function (report) {\n var standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(function (name) {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n var makeMapStats = function makeMapStats(stats) {\n return new Map(Object.keys(stats).map(function (key) {\n return [key, stats[key]];\n }));\n };\n\n if (arguments.length >= 2) {\n var successCallbackWrapper_ = function successCallbackWrapper_(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_, selector]);\n }\n\n // promise-support\n return new Promise(function (resolve, reject) {\n origGetStats.apply(_this5, [function (response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nfunction shimSenderReceiverGetStats(window) {\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n var _this6 = this;\n\n var senders = origGetSenders.apply(this, []);\n senders.forEach(function (sender) {\n return sender._pc = _this6;\n });\n return senders;\n };\n }\n\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n var sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n var sender = this;\n return this._pc.getStats().then(function (result) {\n return (\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true)\n );\n });\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n var _this7 = this;\n\n var receivers = origGetReceivers.apply(this, []);\n receivers.forEach(function (receiver) {\n return receiver._pc = _this7;\n });\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', function (e) {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n var receiver = this;\n return this._pc.getStats().then(function (result) {\n return utils.filterStats(result, receiver.track, false);\n });\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype && 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n var origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 && arguments[0] instanceof window.MediaStreamTrack) {\n var track = arguments[0];\n var sender = void 0;\n var receiver = void 0;\n var err = void 0;\n this.getSenders().forEach(function (s) {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(function (r) {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || sender && receiver) {\n return Promise.reject(new DOMException('There are more than one sender or receiver for the track.', 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException('There is no sender or receiver for the track.', 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nfunction shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {\n var _this8 = this;\n\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams).map(function (streamId) {\n return _this8._shimmedLocalStreams[streamId][0];\n });\n };\n\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n var sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n var _this9 = this;\n\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(function (track) {\n var alreadyExists = _this9.getSenders().find(function (s) {\n return s.track === track;\n });\n if (alreadyExists) {\n throw new DOMException('Track already exists.', 'InvalidAccessError');\n }\n });\n var existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n var newSenders = this.getSenders().filter(function (newSender) {\n return existingSenders.indexOf(newSender) === -1;\n });\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n var _this10 = this;\n\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(function (streamId) {\n var idx = _this10._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n _this10._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (_this10._shimmedLocalStreams[streamId].length === 1) {\n delete _this10._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nfunction shimAddTrackRemoveTrack(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n var browserDetails = utils.detectBrowser(window);\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack && browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n var origGetLocalStreams = window.RTCPeerConnection.prototype.getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {\n var _this11 = this;\n\n var nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(function (stream) {\n return _this11._reverseStreams[stream.id];\n });\n };\n\n var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n var _this12 = this;\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(function (track) {\n var alreadyExists = _this12.getSenders().find(function (s) {\n return s.track === track;\n });\n if (alreadyExists) {\n throw new DOMException('Track already exists.', 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n var newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [this._streams[stream.id] || stream]);\n delete this._reverseStreams[this._streams[stream.id] ? this._streams[stream.id].id : stream.id];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {\n var _this13 = this;\n\n if (this.signalingState === 'closed') {\n throw new DOMException('The RTCPeerConnection\\'s signalingState is \\'closed\\'.', 'InvalidStateError');\n }\n var streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 || !streams[0].getTracks().find(function (t) {\n return t === track;\n })) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException('The adapter.js addTrack polyfill only supports a single ' + ' stream which is associated with the specified track.', 'NotSupportedError');\n }\n\n var alreadyExists = this.getSenders().find(function (s) {\n return s.track === track;\n });\n if (alreadyExists) {\n throw new DOMException('Track already exists.', 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n var oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(function () {\n _this13.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n var newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(function (s) {\n return s.track === track;\n });\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n var sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(function (internalId) {\n var externalStream = pc._reverseStreams[internalId];\n var internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'), externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp: sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n var sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(function (internalId) {\n var externalStream = pc._reverseStreams[internalId];\n var internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'), internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp: sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function (method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n var methodObj = _defineProperty({}, method, function () {\n var _this14 = this;\n\n var args = arguments;\n var isLegacyCall = arguments.length && typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [function (description) {\n var desc = replaceInternalStreamId(_this14, description);\n args[0].apply(null, [desc]);\n }, function (err) {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]]);\n }\n return nativeMethod.apply(this, arguments).then(function (description) {\n return replaceInternalStreamId(_this14, description);\n });\n });\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n var origSetLocalDescription = window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n var origLocalDescription = Object.getOwnPropertyDescriptor(window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype, 'localDescription', {\n get: function get() {\n var description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n var _this15 = this;\n\n if (this.signalingState === 'closed') {\n throw new DOMException('The RTCPeerConnection\\'s signalingState is \\'closed\\'.', 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' + 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n var isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.', 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n var stream = void 0;\n Object.keys(this._streams).forEach(function (streamid) {\n var hasTrack = _this15._streams[streamid].getTracks().find(function (track) {\n return sender.track === track;\n });\n if (hasTrack) {\n stream = _this15._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nfunction shimPeerConnection(window) {\n var browserDetails = utils.detectBrowser(window);\n\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'].forEach(function (method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n var methodObj = _defineProperty({}, method, function () {\n arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n });\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n // support for addIceCandidate(null or undefined)\n var nativeAddIceCandidate = window.RTCPeerConnection.prototype.addIceCandidate;\n window.RTCPeerConnection.prototype.addIceCandidate = function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions. Native support planned for Chrome M77.\n if (browserDetails.version < 78 && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n\nfunction fixNegotiationNeeded(window) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', function (e) {\n var pc = e.target;\n if (pc.signalingState !== 'stable') {\n return;\n }\n return e;\n });\n}\n\n},{\"../utils.js\":15,\"./getdisplaymedia\":4,\"./getusermedia\":5}],4:[function(require,module,exports){\n/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = shimGetDisplayMedia;\nfunction shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!window.navigator.mediaDevices) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' + 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) {\n return getSourceId(constraints).then(function (sourceId) {\n var widthSpecified = constraints.video && constraints.video.width;\n var heightSpecified = constraints.video && constraints.video.height;\n var frameRateSpecified = constraints.video && constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n\n},{}],5:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.shimGetUserMedia = shimGetUserMedia;\n\nvar _utils = require('../utils.js');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar logging = utils.log;\n\nfunction shimGetUserMedia(window) {\n var navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n var browserDetails = utils.detectBrowser(window);\n\n var constraintsToChrome_ = function constraintsToChrome_(c) {\n if ((typeof c === 'undefined' ? 'undefined' : _typeof(c)) !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n var cc = {};\n Object.keys(c).forEach(function (key) {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n var r = _typeof(c[key]) === 'object' ? c[key] : { ideal: c[key] };\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n var oldname_ = function oldname_(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return name === 'deviceId' ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n var oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(function (mix) {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n var shimConstraints_ = function shimConstraints_(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && _typeof(constraints.audio) === 'object') {\n var remap = function remap(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && _typeof(constraints.video) === 'object') {\n // Shim facingMode for mobile & surface pro.\n var face = constraints.video.facingMode;\n face = face && ((typeof face === 'undefined' ? 'undefined' : _typeof(face)) === 'object' ? face : { ideal: face });\n var getSupportedFacingModeLies = browserDetails.version < 66;\n\n if (face && (face.exact === 'user' || face.exact === 'environment' || face.ideal === 'user' || face.ideal === 'environment') && !(navigator.mediaDevices.getSupportedConstraints && navigator.mediaDevices.getSupportedConstraints().facingMode && !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n var matches = void 0;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices().then(function (devices) {\n devices = devices.filter(function (d) {\n return d.kind === 'videoinput';\n });\n var dev = devices.find(function (d) {\n return matches.some(function (match) {\n return d.label.toLowerCase().includes(match);\n });\n });\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact ? { exact: dev.deviceId } : { ideal: dev.deviceId };\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n var shimError_ = function shimError_(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString: function toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n var getUserMedia_ = function getUserMedia_(constraints, onSuccess, onError) {\n shimConstraints_(constraints, function (c) {\n navigator.webkitGetUserMedia(c, onSuccess, function (e) {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n if (navigator.mediaDevices.getUserMedia) {\n var origGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function (cs) {\n return shimConstraints_(cs, function (c) {\n return origGetUserMedia(c).then(function (stream) {\n if (c.audio && !stream.getAudioTracks().length || c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(function (track) {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, function (e) {\n return Promise.reject(shimError_(e));\n });\n });\n };\n }\n}\n\n},{\"../utils.js\":15}],6:[function(require,module,exports){\n/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.shimRTCIceCandidate = shimRTCIceCandidate;\nexports.shimMaxMessageSize = shimMaxMessageSize;\nexports.shimSendThrowTypeError = shimSendThrowTypeError;\nexports.shimConnectionState = shimConnectionState;\nexports.removeAllowExtmapMixed = removeAllowExtmapMixed;\n\nvar _sdp = require('sdp');\n\nvar _sdp2 = _interopRequireDefault(_sdp);\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || window.RTCIceCandidate && 'foundation' in window.RTCIceCandidate.prototype) {\n return;\n }\n\n var NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if ((typeof args === 'undefined' ? 'undefined' : _typeof(args)) === 'object' && args.candidate && args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substr(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n var nativeCandidate = new NativeRTCIceCandidate(args);\n var parsedCandidate = _sdp2.default.parseCandidate(args.candidate);\n var augmentedCandidate = Object.assign(nativeCandidate, parsedCandidate);\n\n // Add a serializer that does not serialize the extra attributes.\n augmentedCandidate.toJSON = function toJSON() {\n return {\n candidate: augmentedCandidate.candidate,\n sdpMid: augmentedCandidate.sdpMid,\n sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n usernameFragment: augmentedCandidate.usernameFragment\n };\n };\n return augmentedCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', function (e) {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nfunction shimMaxMessageSize(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n var browserDetails = utils.detectBrowser(window);\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get: function get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n var sctpInDescription = function sctpInDescription(description) {\n if (!description || !description.sdp) {\n return false;\n }\n var sections = _sdp2.default.splitSections(description.sdp);\n sections.shift();\n return sections.some(function (mediaSection) {\n var mLine = _sdp2.default.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application' && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n var getRemoteFirefoxVersion = function getRemoteFirefoxVersion(description) {\n // TODO: Is there a better solution for detecting Firefox?\n var match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n var version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n var getCanSendMaxMessageSize = function getCanSendMaxMessageSize(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n var canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize = browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n var getMaxMessageSize = function getMaxMessageSize(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n var maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox' && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n var match = _sdp2.default.matchPrefix(description.sdp, 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substr(19), 10);\n } else if (browserDetails.browser === 'firefox' && remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n var origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n var _getConfiguration = this.getConfiguration(),\n sdpSemantics = _getConfiguration.sdpSemantics;\n\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get: function get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n\n enumerable: true,\n configurable: true\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n var isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n var canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n var remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n var maxMessageSize = void 0;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n var sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get: function get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nfunction shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection && 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n var origDataChannelSend = dc.send;\n dc.send = function send() {\n var data = arguments[0];\n var length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' && pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' + pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n var origCreateDataChannel = window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel = function createDataChannel() {\n var dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', function (e) {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nfunction shimConnectionState(window) {\n if (!window.RTCPeerConnection || 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n var proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get: function get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get: function get() {\n return this._onconnectionstatechange || null;\n },\n set: function set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange', this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange', this._onconnectionstatechange = cb);\n }\n },\n\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach(function (method) {\n var origMethod = proto[method];\n proto[method] = function () {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = function (e) {\n var pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n var newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange', this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nfunction removeAllowExtmapMixed(window) {\n /* remove a=extmap-allow-mixed for Chrome < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n var browserDetails = utils.detectBrowser(window);\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n var nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n desc.sdp = desc.sdp.split('\\n').filter(function (line) {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\n},{\"./utils\":15,\"sdp\":17}],7:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = exports.shimGetUserMedia = undefined;\n\nvar _getusermedia = require('./getusermedia');\n\nObject.defineProperty(exports, 'shimGetUserMedia', {\n enumerable: true,\n get: function get() {\n return _getusermedia.shimGetUserMedia;\n }\n});\n\nvar _getdisplaymedia = require('./getdisplaymedia');\n\nObject.defineProperty(exports, 'shimGetDisplayMedia', {\n enumerable: true,\n get: function get() {\n return _getdisplaymedia.shimGetDisplayMedia;\n }\n});\nexports.shimPeerConnection = shimPeerConnection;\nexports.shimReplaceTrack = shimReplaceTrack;\n\nvar _utils = require('../utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _filtericeservers = require('./filtericeservers');\n\nvar _rtcpeerconnectionShim = require('rtcpeerconnection-shim');\n\nvar _rtcpeerconnectionShim2 = _interopRequireDefault(_rtcpeerconnectionShim);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction shimPeerConnection(window) {\n var browserDetails = utils.detectBrowser(window);\n\n if (window.RTCIceGatherer) {\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n return args;\n };\n }\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = function RTCSessionDescription(args) {\n return args;\n };\n }\n // this adds an additional event listener to MediaStrackTrack that signals\n // when a tracks enabled property was changed. Workaround for a bug in\n // addStream, see below. No longer required in 15025+\n if (browserDetails.version < 15025) {\n var origMSTEnabled = Object.getOwnPropertyDescriptor(window.MediaStreamTrack.prototype, 'enabled');\n Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n set: function set(value) {\n origMSTEnabled.set.call(this, value);\n var ev = new Event('enabled');\n ev.enabled = value;\n this.dispatchEvent(ev);\n }\n });\n }\n }\n\n // ORTC defines the DTMF sender a bit different.\n // https://github.com/w3c/ortc/issues/714\n if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get: function get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = new window.RTCDtmfSender(this);\n } else if (this.track.kind === 'video') {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n // Edge currently only implements the RTCDtmfSender, not the\n // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n window.RTCDTMFSender = window.RTCDtmfSender;\n }\n\n var RTCPeerConnectionShim = (0, _rtcpeerconnectionShim2.default)(window, browserDetails.version);\n window.RTCPeerConnection = function RTCPeerConnection(config) {\n if (config && config.iceServers) {\n config.iceServers = (0, _filtericeservers.filterIceServers)(config.iceServers, browserDetails.version);\n utils.log('ICE servers after filtering:', config.iceServers);\n }\n return new RTCPeerConnectionShim(config);\n };\n window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n}\n\nfunction shimReplaceTrack(window) {\n // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n if (window.RTCRtpSender && !('replaceTrack' in window.RTCRtpSender.prototype)) {\n window.RTCRtpSender.prototype.replaceTrack = window.RTCRtpSender.prototype.setTrack;\n }\n}\n\n},{\"../utils\":15,\"./filtericeservers\":8,\"./getdisplaymedia\":9,\"./getusermedia\":10,\"rtcpeerconnection-shim\":16}],8:[function(require,module,exports){\n/*\n * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.filterIceServers = filterIceServers;\n\nvar _utils = require('../utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n var hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(function (server) {\n if (server && (server.urls || server.url)) {\n var urls = server.urls || server.url;\n if (server.url && !server.urls) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n }\n var isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(function (url) {\n // filter STUN unconditionally.\n if (url.indexOf('stun:') === 0) {\n return false;\n }\n\n var validTurn = url.startsWith('turn') && !url.startsWith('turn:[') && url.includes('transport=udp');\n if (validTurn && !hasTurn) {\n hasTurn = true;\n return true;\n }\n return validTurn && !hasTurn;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n\n},{\"../utils\":15}],9:[function(require,module,exports){\n/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = shimGetDisplayMedia;\nfunction shimGetDisplayMedia(window) {\n if (!('getDisplayMedia' in window.navigator)) {\n return;\n }\n if (!window.navigator.mediaDevices) {\n return;\n }\n if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia = window.navigator.getDisplayMedia.bind(window.navigator);\n}\n\n},{}],10:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetUserMedia = shimGetUserMedia;\nfunction shimGetUserMedia(window) {\n var navigator = window && window.navigator;\n\n var shimError_ = function shimError_(e) {\n return {\n name: { PermissionDeniedError: 'NotAllowedError' }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint,\n toString: function toString() {\n return this.name;\n }\n };\n };\n\n // getUserMedia error shim.\n var origGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function (c) {\n return origGetUserMedia(c).catch(function (e) {\n return Promise.reject(shimError_(e));\n });\n };\n}\n\n},{}],11:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = exports.shimGetUserMedia = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _getusermedia = require('./getusermedia');\n\nObject.defineProperty(exports, 'shimGetUserMedia', {\n enumerable: true,\n get: function get() {\n return _getusermedia.shimGetUserMedia;\n }\n});\n\nvar _getdisplaymedia = require('./getdisplaymedia');\n\nObject.defineProperty(exports, 'shimGetDisplayMedia', {\n enumerable: true,\n get: function get() {\n return _getdisplaymedia.shimGetDisplayMedia;\n }\n});\nexports.shimOnTrack = shimOnTrack;\nexports.shimPeerConnection = shimPeerConnection;\nexports.shimSenderGetStats = shimSenderGetStats;\nexports.shimReceiverGetStats = shimReceiverGetStats;\nexports.shimRemoveStream = shimRemoveStream;\nexports.shimRTCDataChannel = shimRTCDataChannel;\nexports.shimAddTransceiver = shimAddTransceiver;\nexports.shimCreateOffer = shimCreateOffer;\nexports.shimCreateAnswer = shimCreateAnswer;\n\nvar _utils = require('../utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction shimOnTrack(window) {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get: function get() {\n return { receiver: this.receiver };\n }\n });\n }\n}\n\nfunction shimPeerConnection(window) {\n var browserDetails = utils.detectBrowser(window);\n\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) !== 'object' || !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'].forEach(function (method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n var methodObj = _defineProperty({}, method, function () {\n arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n });\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n // support for addIceCandidate(null or undefined)\n // as well as ignoring {sdpMid, candidate: \"\"}\n if (browserDetails.version < 68) {\n var nativeAddIceCandidate = window.RTCPeerConnection.prototype.addIceCandidate;\n window.RTCPeerConnection.prototype.addIceCandidate = function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n if (arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n }\n\n var modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n var nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n var _arguments = Array.prototype.slice.call(arguments),\n selector = _arguments[0],\n onSucc = _arguments[1],\n onErr = _arguments[2];\n\n return nativeGetStats.apply(this, [selector || null]).then(function (stats) {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(function (stat) {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach(function (stat, i) {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n }).then(onSucc, onErr);\n };\n}\n\nfunction shimSenderGetStats(window) {\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n var _this = this;\n\n var senders = origGetSenders.apply(this, []);\n senders.forEach(function (sender) {\n return sender._pc = _this;\n });\n return senders;\n };\n }\n\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n var sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) : Promise.resolve(new Map());\n };\n}\n\nfunction shimReceiverGetStats(window) {\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n var _this2 = this;\n\n var receivers = origGetReceivers.apply(this, []);\n receivers.forEach(function (receiver) {\n return receiver._pc = _this2;\n });\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', function (e) {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nfunction shimRemoveStream(window) {\n if (!window.RTCPeerConnection || 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n var _this3 = this;\n\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(function (sender) {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n _this3.removeTrack(sender);\n }\n });\n };\n}\n\nfunction shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nfunction shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection)) {\n return;\n }\n var origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver = function addTransceiver() {\n this.setParametersPromises = [];\n var initParameters = arguments[1];\n var shouldPerformCheck = initParameters && 'sendEncodings' in initParameters;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n initParameters.sendEncodings.forEach(function (encodingParam) {\n if ('rid' in encodingParam) {\n var ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n var transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n var sender = transceiver.sender;\n\n var params = sender.getParameters();\n if (!('encodings' in params)) {\n params.encodings = initParameters.sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params).catch(function () {}));\n }\n }\n return transceiver;\n };\n }\n}\n\nfunction shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection)) {\n return;\n }\n var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n var _this4 = this,\n _arguments2 = arguments;\n\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises).then(function () {\n return origCreateOffer.apply(_this4, _arguments2);\n }).finally(function () {\n _this4.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nfunction shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection)) {\n return;\n }\n var origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n var _this5 = this,\n _arguments3 = arguments;\n\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises).then(function () {\n return origCreateAnswer.apply(_this5, _arguments3);\n }).finally(function () {\n _this5.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n\n},{\"../utils\":15,\"./getdisplaymedia\":12,\"./getusermedia\":13}],12:[function(require,module,exports){\n/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = shimGetDisplayMedia;\nfunction shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!window.navigator.mediaDevices) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n var err = new DOMException('getDisplayMedia without video ' + 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = { mediaSource: preferredMediaSource };\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n\n},{}],13:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.shimGetUserMedia = shimGetUserMedia;\n\nvar _utils = require('../utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction shimGetUserMedia(window) {\n var browserDetails = utils.detectBrowser(window);\n var navigator = window && window.navigator;\n var MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function (constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia', 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 && 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n var remap = function remap(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n var nativeGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function (c) {\n if ((typeof c === 'undefined' ? 'undefined' : _typeof(c)) === 'object' && _typeof(c.audio) === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n var nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function () {\n var obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n var nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function (c) {\n if (this.kind === 'audio' && (typeof c === 'undefined' ? 'undefined' : _typeof(c)) === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n\n},{\"../utils\":15}],14:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.shimLocalStreamsAPI = shimLocalStreamsAPI;\nexports.shimRemoteStreamsAPI = shimRemoteStreamsAPI;\nexports.shimCallbacksAPI = shimCallbacksAPI;\nexports.shimGetUserMedia = shimGetUserMedia;\nexports.shimConstraints = shimConstraints;\nexports.shimRTCIceServerUrls = shimRTCIceServerUrls;\nexports.shimTrackEventTransceiver = shimTrackEventTransceiver;\nexports.shimCreateOfferLegacy = shimCreateOfferLegacy;\n\nvar _utils = require('../utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction shimLocalStreamsAPI(window) {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n var _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n var _this = this;\n\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(function (track) {\n return _addTrack.call(_this, track, stream);\n });\n stream.getVideoTracks().forEach(function (track) {\n return _addTrack.call(_this, track, stream);\n });\n };\n\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track) {\n var stream = arguments[1];\n if (stream) {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n var _this2 = this;\n\n if (!this._localStreams) {\n this._localStreams = [];\n }\n var index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n var tracks = stream.getTracks();\n this.getSenders().forEach(function (sender) {\n if (tracks.includes(sender.track)) {\n _this2.removeTrack(sender);\n }\n });\n };\n }\n}\n\nfunction shimRemoteStreamsAPI(window) {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams = function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get: function get() {\n return this._onaddstream;\n },\n set: function set(f) {\n var _this3 = this;\n\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = function (e) {\n e.streams.forEach(function (stream) {\n if (!_this3._remoteStreams) {\n _this3._remoteStreams = [];\n }\n if (_this3._remoteStreams.includes(stream)) {\n return;\n }\n _this3._remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n _this3.dispatchEvent(event);\n });\n });\n }\n });\n var origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {\n var pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function (e) {\n e.streams.forEach(function (stream) {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nfunction shimCallbacksAPI(window) {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n var prototype = window.RTCPeerConnection.prototype;\n var origCreateOffer = prototype.createOffer;\n var origCreateAnswer = prototype.createAnswer;\n var setLocalDescription = prototype.setLocalDescription;\n var setRemoteDescription = prototype.setRemoteDescription;\n var addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer = function createOffer(successCallback, failureCallback) {\n var options = arguments.length >= 2 ? arguments[2] : arguments[0];\n var promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer = function createAnswer(successCallback, failureCallback) {\n var options = arguments.length >= 2 ? arguments[2] : arguments[0];\n var promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n var withCallback = function withCallback(description, successCallback, failureCallback) {\n var promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function withCallback(description, successCallback, failureCallback) {\n var promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function withCallback(candidate, successCallback, failureCallback) {\n var promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nfunction shimGetUserMedia(window) {\n var navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n var mediaDevices = navigator.mediaDevices;\n var _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = function (constraints) {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints).then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nfunction shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({}, constraints, { video: utils.compactObject(constraints.video) });\n }\n\n return constraints;\n}\n\nfunction shimRTCIceServerUrls(window) {\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n var OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection = function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n var newIceServers = [];\n for (var i = 0; i < pcConfig.iceServers.length; i++) {\n var server = pcConfig.iceServers[i];\n if (!server.hasOwnProperty('urls') && server.hasOwnProperty('url')) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in window.RTCPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get: function get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nfunction shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get: function get() {\n return { receiver: this.receiver };\n }\n });\n }\n}\n\nfunction shimCreateOfferLegacy(window) {\n var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio;\n }\n var audioTransceiver = this.getTransceivers().find(function (transceiver) {\n return transceiver.receiver.track.kind === 'audio';\n });\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true && !audioTransceiver) {\n this.addTransceiver('audio');\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo;\n }\n var videoTransceiver = this.getTransceivers().find(function (transceiver) {\n return transceiver.receiver.track.kind === 'video';\n });\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true && !videoTransceiver) {\n this.addTransceiver('video');\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\n},{\"../utils\":15}],15:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.extractVersion = extractVersion;\nexports.wrapPeerConnectionEvent = wrapPeerConnectionEvent;\nexports.disableLog = disableLog;\nexports.disableWarnings = disableWarnings;\nexports.log = log;\nexports.deprecated = deprecated;\nexports.detectBrowser = detectBrowser;\nexports.compactObject = compactObject;\nexports.walkStats = walkStats;\nexports.filterStats = filterStats;\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar logDisabled_ = true;\nvar deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nfunction extractVersion(uastring, expr, pos) {\n var match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nfunction wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n var proto = window.RTCPeerConnection.prototype;\n var nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function (nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n var wrappedCallback = function wrappedCallback(e) {\n var modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n cb(modifiedEvent);\n }\n };\n this._eventMap = this._eventMap || {};\n this._eventMap[cb] = wrappedCallback;\n return nativeAddEventListener.apply(this, [nativeEventName, wrappedCallback]);\n };\n\n var nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function (nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap || !this._eventMap[cb]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n var unwrappedCb = this._eventMap[cb];\n delete this._eventMap[cb];\n return nativeRemoveEventListener.apply(this, [nativeEventName, unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get: function get() {\n return this['_on' + eventNameToWrap];\n },\n set: function set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap, this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap, this['_on' + eventNameToWrap] = cb);\n }\n },\n\n enumerable: true,\n configurable: true\n });\n}\n\nfunction disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + (typeof bool === 'undefined' ? 'undefined' : _typeof(bool)) + '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return bool ? 'adapter.js logging disabled' : 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nfunction disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + (typeof bool === 'undefined' ? 'undefined' : _typeof(bool)) + '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nfunction log() {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nfunction deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod + ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nfunction detectBrowser(window) {\n var navigator = window.navigator;\n\n // Returned result object.\n\n var result = { browser: null, version: null };\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n if (navigator.mozGetUserMedia) {\n // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent, /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia || window.isSecureContext === false && window.webkitRTCPeerConnection && !window.RTCIceGatherer) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent, /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (navigator.mediaDevices && navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) {\n // Edge.\n result.browser = 'edge';\n result.version = extractVersion(navigator.userAgent, /Edge\\/(\\d+).(\\d+)$/, 2);\n } else if (window.RTCPeerConnection && navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) {\n // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent, /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver && 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else {\n // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nfunction compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function (accumulator, key) {\n var isObj = isObject(data[key]);\n var value = isObj ? compactObject(data[key]) : data[key];\n var isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, _defineProperty({}, key, value));\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nfunction walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(function (name) {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(function (id) {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nfunction filterStats(result, track, outbound) {\n var streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n var filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n var trackStats = [];\n result.forEach(function (value) {\n if (value.type === 'track' && value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(function (trackStat) {\n result.forEach(function (stats) {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n},{}],16:[function(require,module,exports){\n/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n return {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n var trackId = transceiver.rtpSender._initialTrackId ||\n transceiver.rtpSender.track.id;\n transceiver.rtpSender._initialTrackId = trackId;\n // spec.\n var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n trackId + '\\r\\n';\n sdp += 'a=' + msid;\n // for Chrome. Legacy should no longer be required.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n\n // RTX\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n var hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(function(server) {\n if (server && (server.urls || server.url)) {\n var urls = server.urls || server.url;\n if (server.url && !server.urls) {\n console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n }\n var isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(function(url) {\n var validTurn = url.indexOf('turn:') === 0 &&\n url.indexOf('transport=udp') !== -1 &&\n url.indexOf('turn:[') === -1 &&\n !hasTurn;\n\n if (validTurn) {\n hasTurn = true;\n return true;\n }\n return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n url.indexOf('?transport=udp') === -1;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n var commonCapabilities = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: []\n };\n\n var findCodecByPayloadType = function(pt, codecs) {\n pt = parseInt(pt, 10);\n for (var i = 0; i < codecs.length; i++) {\n if (codecs[i].payloadType === pt ||\n codecs[i].preferredPayloadType === pt) {\n return codecs[i];\n }\n }\n };\n\n var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n return lCodec && rCodec &&\n lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n };\n\n localCapabilities.codecs.forEach(function(lCodec) {\n for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n var rCodec = remoteCapabilities.codecs[i];\n if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n lCodec.clockRate === rCodec.clockRate) {\n if (lCodec.name.toLowerCase() === 'rtx' &&\n lCodec.parameters && rCodec.parameters.apt) {\n // for RTX we need to find the local rtx that has a apt\n // which points to the same local codec as the remote one.\n if (!rtxCapabilityMatches(lCodec, rCodec,\n localCapabilities.codecs, remoteCapabilities.codecs)) {\n continue;\n }\n }\n rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n // number of channels is the highest common number of channels\n rCodec.numChannels = Math.min(lCodec.numChannels,\n rCodec.numChannels);\n // push rCodec so we reply with offerer payload type\n commonCapabilities.codecs.push(rCodec);\n\n // determine common feedback mechanisms\n rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n if (lCodec.rtcpFeedback[j].type === fb.type &&\n lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n return true;\n }\n }\n return false;\n });\n // FIXME: also need to determine .parameters\n // see https://github.com/openpeer/ortc/issues/569\n break;\n }\n }\n });\n\n localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n i++) {\n var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n if (lHeaderExtension.uri === rHeaderExtension.uri) {\n commonCapabilities.headerExtensions.push(rHeaderExtension);\n break;\n }\n }\n });\n\n // FIXME: fecMechanisms\n return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n return {\n offer: {\n setLocalDescription: ['stable', 'have-local-offer'],\n setRemoteDescription: ['stable', 'have-remote-offer']\n },\n answer: {\n setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n }\n }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n // Edge's internal representation adds some fields therefore\n // not all fieldѕ are taken into account.\n var alreadyAdded = iceTransport.getRemoteCandidates()\n .find(function(remoteCandidate) {\n return candidate.foundation === remoteCandidate.foundation &&\n candidate.ip === remoteCandidate.ip &&\n candidate.port === remoteCandidate.port &&\n candidate.priority === remoteCandidate.priority &&\n candidate.protocol === remoteCandidate.protocol &&\n candidate.type === remoteCandidate.type;\n });\n if (!alreadyAdded) {\n iceTransport.addRemoteCandidate(candidate);\n }\n return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n var e = new Error(description);\n e.name = name;\n // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n e.code = {\n NotSupportedError: 9,\n InvalidStateError: 11,\n InvalidAccessError: 15,\n TypeError: undefined,\n OperationError: undefined\n }[name];\n return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n // https://w3c.github.io/mediacapture-main/#mediastream\n // Helper function to add the track to the stream and\n // dispatch the event ourselves.\n function addTrackToStreamAndFireEvent(track, stream) {\n stream.addTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n {track: track}));\n }\n\n function removeTrackFromStreamAndFireEvent(track, stream) {\n stream.removeTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n {track: track}));\n }\n\n function fireAddTrack(pc, track, receiver, streams) {\n var trackEvent = new Event('track');\n trackEvent.track = track;\n trackEvent.receiver = receiver;\n trackEvent.transceiver = {receiver: receiver};\n trackEvent.streams = streams;\n window.setTimeout(function() {\n pc._dispatchEvent('track', trackEvent);\n });\n }\n\n var RTCPeerConnection = function(config) {\n var pc = this;\n\n var _eventTarget = document.createDocumentFragment();\n ['addEventListener', 'removeEventListener', 'dispatchEvent']\n .forEach(function(method) {\n pc[method] = _eventTarget[method].bind(_eventTarget);\n });\n\n this.canTrickleIceCandidates = null;\n\n this.needNegotiation = false;\n\n this.localStreams = [];\n this.remoteStreams = [];\n\n this._localDescription = null;\n this._remoteDescription = null;\n\n this.signalingState = 'stable';\n this.iceConnectionState = 'new';\n this.connectionState = 'new';\n this.iceGatheringState = 'new';\n\n config = JSON.parse(JSON.stringify(config || {}));\n\n this.usingBundle = config.bundlePolicy === 'max-bundle';\n if (config.rtcpMuxPolicy === 'negotiate') {\n throw(makeError('NotSupportedError',\n 'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n } else if (!config.rtcpMuxPolicy) {\n config.rtcpMuxPolicy = 'require';\n }\n\n switch (config.iceTransportPolicy) {\n case 'all':\n case 'relay':\n break;\n default:\n config.iceTransportPolicy = 'all';\n break;\n }\n\n switch (config.bundlePolicy) {\n case 'balanced':\n case 'max-compat':\n case 'max-bundle':\n break;\n default:\n config.bundlePolicy = 'balanced';\n break;\n }\n\n config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n this._iceGatherers = [];\n if (config.iceCandidatePoolSize) {\n for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n this._iceGatherers.push(new window.RTCIceGatherer({\n iceServers: config.iceServers,\n gatherPolicy: config.iceTransportPolicy\n }));\n }\n } else {\n config.iceCandidatePoolSize = 0;\n }\n\n this._config = config;\n\n // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n // everything that is needed to describe a SDP m-line.\n this.transceivers = [];\n\n this._sdpSessionId = SDPUtils.generateSessionId();\n this._sdpSessionVersion = 0;\n\n this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n this._isClosed = false;\n };\n\n Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n configurable: true,\n get: function() {\n return this._localDescription;\n }\n });\n Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n configurable: true,\n get: function() {\n return this._remoteDescription;\n }\n });\n\n // set up event handlers on prototype\n RTCPeerConnection.prototype.onicecandidate = null;\n RTCPeerConnection.prototype.onaddstream = null;\n RTCPeerConnection.prototype.ontrack = null;\n RTCPeerConnection.prototype.onremovestream = null;\n RTCPeerConnection.prototype.onsignalingstatechange = null;\n RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n RTCPeerConnection.prototype.onconnectionstatechange = null;\n RTCPeerConnection.prototype.onicegatheringstatechange = null;\n RTCPeerConnection.prototype.onnegotiationneeded = null;\n RTCPeerConnection.prototype.ondatachannel = null;\n\n RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n if (this._isClosed) {\n return;\n }\n this.dispatchEvent(event);\n if (typeof this['on' + name] === 'function') {\n this['on' + name](event);\n }\n };\n\n RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n var event = new Event('icegatheringstatechange');\n this._dispatchEvent('icegatheringstatechange', event);\n };\n\n RTCPeerConnection.prototype.getConfiguration = function() {\n return this._config;\n };\n\n RTCPeerConnection.prototype.getLocalStreams = function() {\n return this.localStreams;\n };\n\n RTCPeerConnection.prototype.getRemoteStreams = function() {\n return this.remoteStreams;\n };\n\n // internal helper to create a transceiver object.\n // (which is not yet the same as the WebRTC 1.0 transceiver)\n RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n var hasBundleTransport = this.transceivers.length > 0;\n var transceiver = {\n track: null,\n iceGatherer: null,\n iceTransport: null,\n dtlsTransport: null,\n localCapabilities: null,\n remoteCapabilities: null,\n rtpSender: null,\n rtpReceiver: null,\n kind: kind,\n mid: null,\n sendEncodingParameters: null,\n recvEncodingParameters: null,\n stream: null,\n associatedRemoteMediaStreams: [],\n wantReceive: true\n };\n if (this.usingBundle && hasBundleTransport) {\n transceiver.iceTransport = this.transceivers[0].iceTransport;\n transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n } else {\n var transports = this._createIceAndDtlsTransports();\n transceiver.iceTransport = transports.iceTransport;\n transceiver.dtlsTransport = transports.dtlsTransport;\n }\n if (!doNotAdd) {\n this.transceivers.push(transceiver);\n }\n return transceiver;\n };\n\n RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call addTrack on a closed peerconnection.');\n }\n\n var alreadyExists = this.transceivers.find(function(s) {\n return s.track === track;\n });\n\n if (alreadyExists) {\n throw makeError('InvalidAccessError', 'Track already exists.');\n }\n\n var transceiver;\n for (var i = 0; i < this.transceivers.length; i++) {\n if (!this.transceivers[i].track &&\n this.transceivers[i].kind === track.kind) {\n transceiver = this.transceivers[i];\n }\n }\n if (!transceiver) {\n transceiver = this._createTransceiver(track.kind);\n }\n\n this._maybeFireNegotiationNeeded();\n\n if (this.localStreams.indexOf(stream) === -1) {\n this.localStreams.push(stream);\n }\n\n transceiver.track = track;\n transceiver.stream = stream;\n transceiver.rtpSender = new window.RTCRtpSender(track,\n transceiver.dtlsTransport);\n return transceiver.rtpSender;\n };\n\n RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n if (edgeVersion >= 15025) {\n stream.getTracks().forEach(function(track) {\n pc.addTrack(track, stream);\n });\n } else {\n // Clone is necessary for local demos mostly, attaching directly\n // to two different senders does not work (build 10547).\n // Fixed in 15025 (or earlier)\n var clonedStream = stream.clone();\n stream.getTracks().forEach(function(track, idx) {\n var clonedTrack = clonedStream.getTracks()[idx];\n track.addEventListener('enabled', function(event) {\n clonedTrack.enabled = event.enabled;\n });\n });\n clonedStream.getTracks().forEach(function(track) {\n pc.addTrack(track, clonedStream);\n });\n }\n };\n\n RTCPeerConnection.prototype.removeTrack = function(sender) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call removeTrack on a closed peerconnection.');\n }\n\n if (!(sender instanceof window.RTCRtpSender)) {\n throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.');\n }\n\n var transceiver = this.transceivers.find(function(t) {\n return t.rtpSender === sender;\n });\n\n if (!transceiver) {\n throw makeError('InvalidAccessError',\n 'Sender was not created by this connection.');\n }\n var stream = transceiver.stream;\n\n transceiver.rtpSender.stop();\n transceiver.rtpSender = null;\n transceiver.track = null;\n transceiver.stream = null;\n\n // remove the stream from the set of local streams\n var localStreams = this.transceivers.map(function(t) {\n return t.stream;\n });\n if (localStreams.indexOf(stream) === -1 &&\n this.localStreams.indexOf(stream) > -1) {\n this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n }\n\n this._maybeFireNegotiationNeeded();\n };\n\n RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n stream.getTracks().forEach(function(track) {\n var sender = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (sender) {\n pc.removeTrack(sender);\n }\n });\n };\n\n RTCPeerConnection.prototype.getSenders = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpSender;\n })\n .map(function(transceiver) {\n return transceiver.rtpSender;\n });\n };\n\n RTCPeerConnection.prototype.getReceivers = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpReceiver;\n })\n .map(function(transceiver) {\n return transceiver.rtpReceiver;\n });\n };\n\n\n RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n usingBundle) {\n var pc = this;\n if (usingBundle && sdpMLineIndex > 0) {\n return this.transceivers[0].iceGatherer;\n } else if (this._iceGatherers.length) {\n return this._iceGatherers.shift();\n }\n var iceGatherer = new window.RTCIceGatherer({\n iceServers: this._config.iceServers,\n gatherPolicy: this._config.iceTransportPolicy\n });\n Object.defineProperty(iceGatherer, 'state',\n {value: 'new', writable: true}\n );\n\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n var end = !event.candidate || Object.keys(event.candidate).length === 0;\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n iceGatherer.state = end ? 'completed' : 'gathering';\n if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n }\n };\n iceGatherer.addEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n return iceGatherer;\n };\n\n // start gathering from an RTCIceGatherer.\n RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n var pc = this;\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer.onlocalcandidate) {\n return;\n }\n var bufferedCandidateEvents =\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n iceGatherer.removeEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n iceGatherer.onlocalcandidate = function(evt) {\n if (pc.usingBundle && sdpMLineIndex > 0) {\n // if we know that we use bundle we can drop candidates with\n // ѕdpMLineIndex > 0. If we don't do this then our state gets\n // confused since we dispose the extra ice gatherer.\n return;\n }\n var event = new Event('icecandidate');\n event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n var cand = evt.candidate;\n // Edge emits an empty object for RTCIceCandidateComplete‥\n var end = !cand || Object.keys(cand).length === 0;\n if (end) {\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n iceGatherer.state = 'completed';\n }\n } else {\n if (iceGatherer.state === 'new') {\n iceGatherer.state = 'gathering';\n }\n // RTCIceCandidate doesn't have a component, needs to be added\n cand.component = 1;\n // also the usernameFragment. TODO: update SDP to take both variants.\n cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n var serializedCandidate = SDPUtils.writeCandidate(cand);\n event.candidate = Object.assign(event.candidate,\n SDPUtils.parseCandidate(serializedCandidate));\n\n event.candidate.candidate = serializedCandidate;\n event.candidate.toJSON = function() {\n return {\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment\n };\n };\n }\n\n // update local description.\n var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n if (!end) {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=' + event.candidate.candidate + '\\r\\n';\n } else {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=end-of-candidates\\r\\n';\n }\n pc._localDescription.sdp =\n SDPUtils.getDescription(pc._localDescription.sdp) +\n sections.join('');\n var complete = pc.transceivers.every(function(transceiver) {\n return transceiver.iceGatherer &&\n transceiver.iceGatherer.state === 'completed';\n });\n\n if (pc.iceGatheringState !== 'gathering') {\n pc.iceGatheringState = 'gathering';\n pc._emitGatheringStateChange();\n }\n\n // Emit candidate. Also emit null candidate when all gatherers are\n // complete.\n if (!end) {\n pc._dispatchEvent('icecandidate', event);\n }\n if (complete) {\n pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n pc.iceGatheringState = 'complete';\n pc._emitGatheringStateChange();\n }\n };\n\n // emit already gathered candidates.\n window.setTimeout(function() {\n bufferedCandidateEvents.forEach(function(e) {\n iceGatherer.onlocalcandidate(e);\n });\n }, 0);\n };\n\n // Create ICE transport and DTLS transport.\n RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n var pc = this;\n var iceTransport = new window.RTCIceTransport(null);\n iceTransport.onicestatechange = function() {\n pc._updateIceConnectionState();\n pc._updateConnectionState();\n };\n\n var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n dtlsTransport.ondtlsstatechange = function() {\n pc._updateConnectionState();\n };\n dtlsTransport.onerror = function() {\n // onerror does not set state to failed by itself.\n Object.defineProperty(dtlsTransport, 'state',\n {value: 'failed', writable: true});\n pc._updateConnectionState();\n };\n\n return {\n iceTransport: iceTransport,\n dtlsTransport: dtlsTransport\n };\n };\n\n // Destroy ICE gatherer, ICE transport and DTLS transport.\n // Without triggering the callbacks.\n RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n sdpMLineIndex) {\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer) {\n delete iceGatherer.onlocalcandidate;\n delete this.transceivers[sdpMLineIndex].iceGatherer;\n }\n var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n if (iceTransport) {\n delete iceTransport.onicestatechange;\n delete this.transceivers[sdpMLineIndex].iceTransport;\n }\n var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n if (dtlsTransport) {\n delete dtlsTransport.ondtlsstatechange;\n delete dtlsTransport.onerror;\n delete this.transceivers[sdpMLineIndex].dtlsTransport;\n }\n };\n\n // Start the RTP Sender and Receiver for a transceiver.\n RTCPeerConnection.prototype._transceive = function(transceiver,\n send, recv) {\n var params = getCommonCapabilities(transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n if (send && transceiver.rtpSender) {\n params.encodings = transceiver.sendEncodingParameters;\n params.rtcp = {\n cname: SDPUtils.localCName,\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.recvEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n }\n transceiver.rtpSender.send(params);\n }\n if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n // remove RTX field in Edge 14942\n if (transceiver.kind === 'video'\n && transceiver.recvEncodingParameters\n && edgeVersion < 15019) {\n transceiver.recvEncodingParameters.forEach(function(p) {\n delete p.rtx;\n });\n }\n if (transceiver.recvEncodingParameters.length) {\n params.encodings = transceiver.recvEncodingParameters;\n } else {\n params.encodings = [{}];\n }\n params.rtcp = {\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.rtcpParameters.cname) {\n params.rtcp.cname = transceiver.rtcpParameters.cname;\n }\n if (transceiver.sendEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n }\n transceiver.rtpReceiver.receive(params);\n }\n };\n\n RTCPeerConnection.prototype.setLocalDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setLocalDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set local ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var sections;\n var sessionpart;\n if (description.type === 'offer') {\n // VERY limited support for SDP munging. Limited to:\n // * changing the order of codecs\n sections = SDPUtils.splitSections(description.sdp);\n sessionpart = sections.shift();\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var caps = SDPUtils.parseRtpParameters(mediaSection);\n pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n });\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n });\n } else if (description.type === 'answer') {\n sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var transceiver = pc.transceivers[sdpMLineIndex];\n var iceGatherer = transceiver.iceGatherer;\n var iceTransport = transceiver.iceTransport;\n var dtlsTransport = transceiver.dtlsTransport;\n var localCapabilities = transceiver.localCapabilities;\n var remoteCapabilities = transceiver.remoteCapabilities;\n\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n if (!rejected && !transceiver.rejected) {\n var remoteIceParameters = SDPUtils.getIceParameters(\n mediaSection, sessionpart);\n var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n mediaSection, sessionpart);\n if (isIceLite) {\n remoteDtlsParameters.role = 'server';\n }\n\n if (!pc.usingBundle || sdpMLineIndex === 0) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n isIceLite ? 'controlling' : 'controlled');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // Calculate intersection of capabilities.\n var params = getCommonCapabilities(localCapabilities,\n remoteCapabilities);\n\n // Start the RTCRtpSender. The RTCRtpReceiver for this\n // transceiver has already been started in setRemoteDescription.\n pc._transceive(transceiver,\n params.codecs.length > 0,\n false);\n }\n });\n }\n\n pc._localDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-local-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setRemoteDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set remote ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var streams = {};\n pc.remoteStreams.forEach(function(stream) {\n streams[stream.id] = stream;\n });\n var receiverList = [];\n var sections = SDPUtils.splitSections(description.sdp);\n var sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n var usingBundle = SDPUtils.matchPrefix(sessionpart,\n 'a=group:BUNDLE ').length > 0;\n pc.usingBundle = usingBundle;\n var iceOptions = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-options:')[0];\n if (iceOptions) {\n pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n .indexOf('trickle') >= 0;\n } else {\n pc.canTrickleIceCandidates = false;\n }\n\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var lines = SDPUtils.splitLines(mediaSection);\n var kind = SDPUtils.getKind(mediaSection);\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n var protocol = lines[0].substr(2).split(' ')[2];\n\n var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n // Reject datachannels which are not implemented yet.\n if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n protocol === 'UDP/DTLS/SCTP'))) {\n // TODO: this is dangerous in the case where a non-rejected m-line\n // becomes rejected.\n pc.transceivers[sdpMLineIndex] = {\n mid: mid,\n kind: kind,\n protocol: protocol,\n rejected: true\n };\n return;\n }\n\n if (!rejected && pc.transceivers[sdpMLineIndex] &&\n pc.transceivers[sdpMLineIndex].rejected) {\n // recycle a rejected transceiver.\n pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n }\n\n var transceiver;\n var iceGatherer;\n var iceTransport;\n var dtlsTransport;\n var rtpReceiver;\n var sendEncodingParameters;\n var recvEncodingParameters;\n var localCapabilities;\n\n var track;\n // FIXME: ensure the mediaSection has rtcp-mux set.\n var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n var remoteIceParameters;\n var remoteDtlsParameters;\n if (!rejected) {\n remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters.role = 'client';\n }\n recvEncodingParameters =\n SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n var isComplete = SDPUtils.matchPrefix(mediaSection,\n 'a=end-of-candidates', sessionpart).length > 0;\n var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n .map(function(cand) {\n return SDPUtils.parseCandidate(cand);\n })\n .filter(function(cand) {\n return cand.component === 1;\n });\n\n // Check if we can use BUNDLE and dispose transports.\n if ((description.type === 'offer' || description.type === 'answer') &&\n !rejected && usingBundle && sdpMLineIndex > 0 &&\n pc.transceivers[sdpMLineIndex]) {\n pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n pc.transceivers[sdpMLineIndex].iceGatherer =\n pc.transceivers[0].iceGatherer;\n pc.transceivers[sdpMLineIndex].iceTransport =\n pc.transceivers[0].iceTransport;\n pc.transceivers[sdpMLineIndex].dtlsTransport =\n pc.transceivers[0].dtlsTransport;\n if (pc.transceivers[sdpMLineIndex].rtpSender) {\n pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n }\n if (description.type === 'offer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex] ||\n pc._createTransceiver(kind);\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n usingBundle);\n }\n\n if (cands.length && transceiver.iceTransport.state === 'new') {\n if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n transceiver.iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n\n sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 2) * 1001\n }];\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n var isNewTrack = false;\n if (direction === 'sendrecv' || direction === 'sendonly') {\n isNewTrack = !transceiver.rtpReceiver;\n rtpReceiver = transceiver.rtpReceiver ||\n new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n if (isNewTrack) {\n var stream;\n track = rtpReceiver.track;\n // FIXME: does not work with Plan B.\n if (remoteMsid && remoteMsid.stream === '-') {\n // no-op. a stream id of '-' means: no associated stream.\n } else if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n Object.defineProperty(streams[remoteMsid.stream], 'id', {\n get: function() {\n return remoteMsid.stream;\n }\n });\n }\n Object.defineProperty(track, 'id', {\n get: function() {\n return remoteMsid.track;\n }\n });\n stream = streams[remoteMsid.stream];\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n stream = streams.default;\n }\n if (stream) {\n addTrackToStreamAndFireEvent(track, stream);\n transceiver.associatedRemoteMediaStreams.push(stream);\n }\n receiverList.push([track, rtpReceiver, stream]);\n }\n } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n var nativeTrack = s.getTracks().find(function(t) {\n return t.id === transceiver.rtpReceiver.track.id;\n });\n if (nativeTrack) {\n removeTrackFromStreamAndFireEvent(nativeTrack, s);\n }\n });\n transceiver.associatedRemoteMediaStreams = [];\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.remoteCapabilities = remoteCapabilities;\n transceiver.rtpReceiver = rtpReceiver;\n transceiver.rtcpParameters = rtcpParameters;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n transceiver.recvEncodingParameters = recvEncodingParameters;\n\n // Start the RTCRtpReceiver now. The RTPSender is started in\n // setLocalDescription.\n pc._transceive(pc.transceivers[sdpMLineIndex],\n false,\n isNewTrack);\n } else if (description.type === 'answer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex];\n iceGatherer = transceiver.iceGatherer;\n iceTransport = transceiver.iceTransport;\n dtlsTransport = transceiver.dtlsTransport;\n rtpReceiver = transceiver.rtpReceiver;\n sendEncodingParameters = transceiver.sendEncodingParameters;\n localCapabilities = transceiver.localCapabilities;\n\n pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n recvEncodingParameters;\n pc.transceivers[sdpMLineIndex].remoteCapabilities =\n remoteCapabilities;\n pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n if (cands.length && iceTransport.state === 'new') {\n if ((isIceLite || isComplete) &&\n (!usingBundle || sdpMLineIndex === 0)) {\n iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n if (!usingBundle || sdpMLineIndex === 0) {\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n 'controlling');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // If the offer contained RTX but the answer did not,\n // remove RTX from sendEncodingParameters.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n pc._transceive(transceiver,\n direction === 'sendrecv' || direction === 'recvonly',\n direction === 'sendrecv' || direction === 'sendonly');\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n if (rtpReceiver &&\n (direction === 'sendrecv' || direction === 'sendonly')) {\n track = rtpReceiver.track;\n if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams.default);\n receiverList.push([track, rtpReceiver, streams.default]);\n }\n } else {\n // FIXME: actually the receiver should be created later.\n delete transceiver.rtpReceiver;\n }\n }\n });\n\n if (pc._dtlsRole === undefined) {\n pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n }\n\n pc._remoteDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-remote-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n Object.keys(streams).forEach(function(sid) {\n var stream = streams[sid];\n if (stream.getTracks().length) {\n if (pc.remoteStreams.indexOf(stream) === -1) {\n pc.remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n window.setTimeout(function() {\n pc._dispatchEvent('addstream', event);\n });\n }\n\n receiverList.forEach(function(item) {\n var track = item[0];\n var receiver = item[1];\n if (stream.id !== item[2].id) {\n return;\n }\n fireAddTrack(pc, track, receiver, [stream]);\n });\n }\n });\n receiverList.forEach(function(item) {\n if (item[2]) {\n return;\n }\n fireAddTrack(pc, item[0], item[1], []);\n });\n\n // check whether addIceCandidate({}) was called within four seconds after\n // setRemoteDescription.\n window.setTimeout(function() {\n if (!(pc && pc.transceivers)) {\n return;\n }\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport &&\n transceiver.iceTransport.state === 'new' &&\n transceiver.iceTransport.getRemoteCandidates().length > 0) {\n console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n 'an end-of-candidates notification');\n transceiver.iceTransport.addRemoteCandidate({});\n }\n });\n }, 4000);\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.close = function() {\n this.transceivers.forEach(function(transceiver) {\n /* not yet\n if (transceiver.iceGatherer) {\n transceiver.iceGatherer.close();\n }\n */\n if (transceiver.iceTransport) {\n transceiver.iceTransport.stop();\n }\n if (transceiver.dtlsTransport) {\n transceiver.dtlsTransport.stop();\n }\n if (transceiver.rtpSender) {\n transceiver.rtpSender.stop();\n }\n if (transceiver.rtpReceiver) {\n transceiver.rtpReceiver.stop();\n }\n });\n // FIXME: clean up tracks, local streams, remote streams, etc\n this._isClosed = true;\n this._updateSignalingState('closed');\n };\n\n // Update the signaling state.\n RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n this.signalingState = newState;\n var event = new Event('signalingstatechange');\n this._dispatchEvent('signalingstatechange', event);\n };\n\n // Determine whether to fire the negotiationneeded event.\n RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n var pc = this;\n if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n return;\n }\n this.needNegotiation = true;\n window.setTimeout(function() {\n if (pc.needNegotiation) {\n pc.needNegotiation = false;\n var event = new Event('negotiationneeded');\n pc._dispatchEvent('negotiationneeded', event);\n }\n }, 0);\n };\n\n // Update the ice connection state.\n RTCPeerConnection.prototype._updateIceConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n checking: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n }\n });\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.checking > 0) {\n newState = 'checking';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n } else if (states.completed > 0) {\n newState = 'completed';\n }\n\n if (newState !== this.iceConnectionState) {\n this.iceConnectionState = newState;\n var event = new Event('iceconnectionstatechange');\n this._dispatchEvent('iceconnectionstatechange', event);\n }\n };\n\n // Update the connection state.\n RTCPeerConnection.prototype._updateConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n connecting: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && transceiver.dtlsTransport &&\n !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n states[transceiver.dtlsTransport.state]++;\n }\n });\n // ICETransport.completed and connected are the same for this purpose.\n states.connected += states.completed;\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.connecting > 0) {\n newState = 'connecting';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n }\n\n if (newState !== this.connectionState) {\n this.connectionState = newState;\n var event = new Event('connectionstatechange');\n this._dispatchEvent('connectionstatechange', event);\n }\n };\n\n RTCPeerConnection.prototype.createOffer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createOffer after close'));\n }\n\n var numAudioTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'audio';\n }).length;\n var numVideoTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'video';\n }).length;\n\n // Determine number of audio and video tracks we need to send/recv.\n var offerOptions = arguments[0];\n if (offerOptions) {\n // Reject Chrome legacy constraints.\n if (offerOptions.mandatory || offerOptions.optional) {\n throw new TypeError(\n 'Legacy mandatory/optional constraints not supported.');\n }\n if (offerOptions.offerToReceiveAudio !== undefined) {\n if (offerOptions.offerToReceiveAudio === true) {\n numAudioTracks = 1;\n } else if (offerOptions.offerToReceiveAudio === false) {\n numAudioTracks = 0;\n } else {\n numAudioTracks = offerOptions.offerToReceiveAudio;\n }\n }\n if (offerOptions.offerToReceiveVideo !== undefined) {\n if (offerOptions.offerToReceiveVideo === true) {\n numVideoTracks = 1;\n } else if (offerOptions.offerToReceiveVideo === false) {\n numVideoTracks = 0;\n } else {\n numVideoTracks = offerOptions.offerToReceiveVideo;\n }\n }\n }\n\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.kind === 'audio') {\n numAudioTracks--;\n if (numAudioTracks < 0) {\n transceiver.wantReceive = false;\n }\n } else if (transceiver.kind === 'video') {\n numVideoTracks--;\n if (numVideoTracks < 0) {\n transceiver.wantReceive = false;\n }\n }\n });\n\n // Create M-lines for recvonly streams.\n while (numAudioTracks > 0 || numVideoTracks > 0) {\n if (numAudioTracks > 0) {\n pc._createTransceiver('audio');\n numAudioTracks--;\n }\n if (numVideoTracks > 0) {\n pc._createTransceiver('video');\n numVideoTracks--;\n }\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n // For each track, create an ice gatherer, ice transport,\n // dtls transport, potentially rtpsender and rtpreceiver.\n var track = transceiver.track;\n var kind = transceiver.kind;\n var mid = transceiver.mid || SDPUtils.generateIdentifier();\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n pc.usingBundle);\n }\n\n var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n localCapabilities.codecs.forEach(function(codec) {\n // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n // by adding level-asymmetry-allowed=1\n if (codec.name === 'H264' &&\n codec.parameters['level-asymmetry-allowed'] === undefined) {\n codec.parameters['level-asymmetry-allowed'] = '1';\n }\n\n // for subsequent offers, we might have to re-use the payload\n // type of the last offer.\n if (transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.codecs) {\n transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n codec.clockRate === remoteCodec.clockRate) {\n codec.preferredPayloadType = remoteCodec.payloadType;\n }\n });\n }\n });\n localCapabilities.headerExtensions.forEach(function(hdrExt) {\n var remoteExtensions = transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.headerExtensions || [];\n remoteExtensions.forEach(function(rHdrExt) {\n if (hdrExt.uri === rHdrExt.uri) {\n hdrExt.id = rHdrExt.id;\n }\n });\n });\n\n // generate an ssrc now, to be used later in rtpSender.send\n var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 1) * 1001\n }];\n if (track) {\n // add RTX\n if (edgeVersion >= 15019 && kind === 'video' &&\n !sendEncodingParameters[0].rtx) {\n sendEncodingParameters[0].rtx = {\n ssrc: sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n\n if (transceiver.wantReceive) {\n transceiver.rtpReceiver = new window.RTCRtpReceiver(\n transceiver.dtlsTransport, kind);\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n });\n\n // always offer BUNDLE and dispose on return if not supported.\n if (pc._config.bundlePolicy !== 'max-compat') {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n 'offer', transceiver.stream, pc._dtlsRole);\n sdp += 'a=rtcp-rsize\\r\\n';\n\n if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n (sdpMLineIndex === 0 || !pc.usingBundle)) {\n transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n cand.component = 1;\n sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n });\n\n if (transceiver.iceGatherer.state === 'completed') {\n sdp += 'a=end-of-candidates\\r\\n';\n }\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'offer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.createAnswer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer after close'));\n }\n\n if (!(pc.signalingState === 'have-remote-offer' ||\n pc.signalingState === 'have-local-pranswer')) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer in signalingState ' + pc.signalingState));\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n if (pc.usingBundle) {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n var mediaSectionsInOffer = SDPUtils.getMediaSections(\n pc._remoteDescription.sdp).length;\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n return;\n }\n if (transceiver.rejected) {\n if (transceiver.kind === 'application') {\n if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n } else {\n sdp += 'm=application 0 ' + transceiver.protocol +\n ' webrtc-datachannel\\r\\n';\n }\n } else if (transceiver.kind === 'audio') {\n sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n 'a=rtpmap:0 PCMU/8000\\r\\n';\n } else if (transceiver.kind === 'video') {\n sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n 'a=rtpmap:120 VP8/90000\\r\\n';\n }\n sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n 'a=inactive\\r\\n' +\n 'a=mid:' + transceiver.mid + '\\r\\n';\n return;\n }\n\n // FIXME: look at direction.\n if (transceiver.stream) {\n var localTrack;\n if (transceiver.kind === 'audio') {\n localTrack = transceiver.stream.getAudioTracks()[0];\n } else if (transceiver.kind === 'video') {\n localTrack = transceiver.stream.getVideoTracks()[0];\n }\n if (localTrack) {\n // add RTX\n if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n !transceiver.sendEncodingParameters[0].rtx) {\n transceiver.sendEncodingParameters[0].rtx = {\n ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n }\n\n // Calculate intersection of capabilities.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n sdp += writeMediaSection(transceiver, commonCapabilities,\n 'answer', transceiver.stream, pc._dtlsRole);\n if (transceiver.rtcpParameters &&\n transceiver.rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'answer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n var pc = this;\n var sections;\n if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n candidate.sdpMid)) {\n return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n }\n\n // TODO: needs to go into ops queue.\n return new Promise(function(resolve, reject) {\n if (!pc._remoteDescription) {\n return reject(makeError('InvalidStateError',\n 'Can not add ICE candidate without a remote description'));\n } else if (!candidate || candidate.candidate === '') {\n for (var j = 0; j < pc.transceivers.length; j++) {\n if (pc.transceivers[j].rejected) {\n continue;\n }\n pc.transceivers[j].iceTransport.addRemoteCandidate({});\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[j] += 'a=end-of-candidates\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n if (pc.usingBundle) {\n break;\n }\n }\n } else {\n var sdpMLineIndex = candidate.sdpMLineIndex;\n if (candidate.sdpMid) {\n for (var i = 0; i < pc.transceivers.length; i++) {\n if (pc.transceivers[i].mid === candidate.sdpMid) {\n sdpMLineIndex = i;\n break;\n }\n }\n }\n var transceiver = pc.transceivers[sdpMLineIndex];\n if (transceiver) {\n if (transceiver.rejected) {\n return resolve();\n }\n var cand = Object.keys(candidate.candidate).length > 0 ?\n SDPUtils.parseCandidate(candidate.candidate) : {};\n // Ignore Chrome's invalid candidates since Edge does not like them.\n if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n return resolve();\n }\n // Ignore RTCP candidates, we assume RTCP-MUX.\n if (cand.component && cand.component !== 1) {\n return resolve();\n }\n // when using bundle, avoid adding candidates to the wrong\n // ice transport. And avoid adding candidates added in the SDP.\n if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n\n // update the remoteDescription.\n var candidateString = candidate.candidate.trim();\n if (candidateString.indexOf('a=') === 0) {\n candidateString = candidateString.substr(2);\n }\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[sdpMLineIndex] += 'a=' +\n (cand.type ? candidateString : 'end-of-candidates')\n + '\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n } else {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n resolve();\n });\n };\n\n RTCPeerConnection.prototype.getStats = function(selector) {\n if (selector && selector instanceof window.MediaStreamTrack) {\n var senderOrReceiver = null;\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.rtpSender &&\n transceiver.rtpSender.track === selector) {\n senderOrReceiver = transceiver.rtpSender;\n } else if (transceiver.rtpReceiver &&\n transceiver.rtpReceiver.track === selector) {\n senderOrReceiver = transceiver.rtpReceiver;\n }\n });\n if (!senderOrReceiver) {\n throw makeError('InvalidAccessError', 'Invalid selector.');\n }\n return senderOrReceiver.getStats();\n }\n\n var promises = [];\n this.transceivers.forEach(function(transceiver) {\n ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n 'dtlsTransport'].forEach(function(method) {\n if (transceiver[method]) {\n promises.push(transceiver[method].getStats());\n }\n });\n });\n return Promise.all(promises).then(function(allStats) {\n var results = new Map();\n allStats.forEach(function(stats) {\n stats.forEach(function(stat) {\n results.set(stat.id, stat);\n });\n });\n return results;\n });\n };\n\n // fix low-level stat names and return Map instead of object.\n var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n 'RTCIceTransport', 'RTCDtlsTransport'];\n ortcObjects.forEach(function(ortcObjectName) {\n var obj = window[ortcObjectName];\n if (obj && obj.prototype && obj.prototype.getStats) {\n var nativeGetstats = obj.prototype.getStats;\n obj.prototype.getStats = function() {\n return nativeGetstats.apply(this)\n .then(function(nativeStats) {\n var mapStats = new Map();\n Object.keys(nativeStats).forEach(function(id) {\n nativeStats[id].type = fixStatsType(nativeStats[id]);\n mapStats.set(id, nativeStats[id]);\n });\n return mapStats;\n });\n };\n }\n });\n\n // legacy callback shims. Should be moved to adapter.js some days.\n var methods = ['createOffer', 'createAnswer'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[0] === 'function' ||\n typeof args[1] === 'function') { // legacy\n return nativeMethod.apply(this, [arguments[2]])\n .then(function(description) {\n if (typeof args[0] === 'function') {\n args[0].apply(null, [description]);\n }\n }, function(error) {\n if (typeof args[1] === 'function') {\n args[1].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function' ||\n typeof args[2] === 'function') { // legacy\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n }, function(error) {\n if (typeof args[2] === 'function') {\n args[2].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // getStats is special. It doesn't have a spec legacy method yet we support\n // getStats(something, cb) without error callbacks.\n ['getStats'].forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function') {\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n return RTCPeerConnection;\n};\n\n},{\"sdp\":17}],17:[function(require,module,exports){\n/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(function(line) {\n return line.trim();\n });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n var parts = blob.split('\\nm=');\n return parts.map(function(part, index) {\n return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(function(line) {\n return line.indexOf(prefix) === 0;\n });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n var parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n var candidate = {\n foundation: parts[0],\n component: parseInt(parts[1], 10),\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7]\n };\n\n for (var i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compability.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag\n candidate[parts[i]] = parts[i + 1];\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n var sdp = [];\n sdp.push(candidate.foundation);\n sdp.push(candidate.component);\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n var type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n payloadType: parseInt(parts.shift(), 10) // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n var channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1]\n };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n var parsed = {};\n var kv;\n var parts = line.substr(line.indexOf(' ') + 1).split(';');\n for (var j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n var line = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n var params = [];\n Object.keys(codec.parameters).forEach(function(param) {\n if (codec.parameters[param]) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' ')\n };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n var lines = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(function(fb) {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n var sp = line.indexOf(' ');\n var parts = {\n ssrc: parseInt(line.substr(7, sp - 7), 10)\n };\n var colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substr(sp + 1, colon - sp - 1);\n parts.value = line.substr(colon + 1);\n } else {\n parts.attribute = line.substr(sp + 1);\n }\n return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n var parts = line.substr(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(function(ssrc) {\n return parseInt(ssrc, 10);\n })\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substr(6);\n }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n var parts = line.substr(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1]\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role.\n // Note2: 'algorithm' is not case sensitive except in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint)\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n var sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(function(fp) {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n var parts = keyParams.substr(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES paramters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substr(12),\n password: pwd.substr(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n var description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: []\n };\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n var pt = mline[i];\n var rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n var codec = SDPUtils.parseRtpMap(rtpmapline);\n var fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp: is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n var sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' UDP/TLS/RTP/SAVPF ';\n sdp += caps.codecs.map(function(codec) {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(function(codec) {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n var maxptime = 0;\n caps.codecs.forEach(function(codec) {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n sdp += 'a=rtcp-mux\\r\\n';\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(function(extension) {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n var encodingParameters = [];\n var description = SDPUtils.parseRtpParameters(mediaSection);\n var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(parts) {\n return parts.attribute === 'cname';\n });\n var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n var secondarySsrc;\n\n var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(function(line) {\n var parts = line.substr(17).split(' ');\n return parts.map(function(part) {\n return parseInt(part, 10);\n });\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(function(codec) {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n var encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10)\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substr(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(function(params) {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n var rtcpParameters = {};\n\n // Gets the first SSRC. Note tha with RTX there might be multiple\n // SSRCs.\n var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(obj) {\n return obj.attribute === 'cname';\n })[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n var parts;\n var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substr(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(msidParts) {\n return msidParts.attribute === 'msid';\n });\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n var mline = SDPUtils.parseMLine(mediaSection);\n var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n var maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substr(12), 10),\n protocol: mline.fmt,\n maxMessageSize: maxMessageSize\n };\n }\n var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0]\n .substr(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize: maxMessageSize\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n var output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n'\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n'\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n var sessionId;\n var version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n var user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.direction) {\n sdp += 'a=' + transceiver.direction + '\\r\\n';\n } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n // spec.\n var msid = 'msid:' + stream.id + ' ' +\n transceiver.rtpSender.track.id + '\\r\\n';\n sdp += 'a=' + msid;\n\n // for Chrome.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n var lines = SDPUtils.splitLines(mediaSection);\n for (var i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substr(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var parts = lines[0].substr(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' ')\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n var parts = line.substr(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5]\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n var lines = SDPUtils.splitLines(blob);\n for (var i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n\n},{}]},{},[1])(1)\n});"],"names":["define","e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","module","adapter","adapterFactory","window","Object","defineProperty","value","_ref","arguments","undefined","options","shimChrome","shimFirefox","shimEdge","shimSafari","logging","utils","log","browserDetails","detectBrowser","commonShim","extractVersion","disableLog","disableWarnings","browser","chromeShim","shimPeerConnection","browserShim","shimGetUserMedia","shimMediaStream","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimGetStats","shimSenderReceiverGetStats","fixNegotiationNeeded","shimRTCIceCandidate","shimConnectionState","shimMaxMessageSize","shimSendThrowTypeError","removeAllowExtmapMixed","firefoxShim","shimRemoveStream","shimSenderGetStats","shimReceiverGetStats","shimRTCDataChannel","shimAddTransceiver","shimCreateOffer","shimCreateAnswer","edgeShim","shimGetDisplayMedia","shimReplaceTrack","safariShim","shimRTCIceServerUrls","shimCreateOfferLegacy","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","_interopRequireWildcard","obj","__esModule","newObj","key","prototype","hasOwnProperty","default","_typeof","Symbol","_typeof2","iterator","constructor","_getusermedia","enumerable","get","_getdisplaymedia","MediaStream","webkitMediaStream","RTCPeerConnection","this","_ontrack","set","removeEventListener","addEventListener","configurable","origSetRemoteDescription","setRemoteDescription","_this","_ontrackpoly","stream","te","receiver","getReceivers","find","track","id","event","Event","transceiver","streams","dispatchEvent","getTracks","forEach","apply","wrapPeerConnectionEvent","shimSenderWithDtmf","pc","dtmf","_dtmf","kind","createDTMFSender","_pc","getSenders","_senders","slice","origAddTrack","addTrack","sender","push","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","_this2","origRemoveStream","removeStream","_this3","RTCRtpSender","origGetSenders","_this4","senders","origGetStats","getStats","_this5","_arguments","Array","selector","onSucc","onErr","fixChromeStats_","response","standardReport","result","report","standardStats","timestamp","type","localcandidate","remotecandidate","names","name","stat","makeMapStats","stats","Map","keys","map","successCallbackWrapper_","Promise","resolve","reject","then","RTCRtpReceiver","_this6","filterStats","origGetReceivers","_this7","receivers","srcElement","MediaStreamTrack","err","DOMException","shimAddTrackRemoveTrackWithNative","version","origGetLocalStreams","getLocalStreams","_this11","nativeStreams","_reverseStreams","_this12","_streams","newStream","replaceInternalStreamId","description","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","replaceExternalStreamId","_this13","signalingState","alreadyExists","oldStream","method","nativeMethod","methodObj","_defineProperty","_this14","args","isLegacyCall","desc","origSetLocalDescription","setLocalDescription","origLocalDescription","getOwnPropertyDescriptor","_this15","streamid","webkitRTCPeerConnection","RTCIceCandidate","nativeAddIceCandidate","addIceCandidate","candidate","target","writable","_this8","_shimmedLocalStreams","streamId","_this9","existingSenders","newSenders","filter","newSender","concat","_this10","getSourceId","navigator","mediaDevices","console","error","getDisplayMedia","constraints","sourceId","widthSpecified","video","width","heightSpecified","height","frameRateSpecified","frameRate","mandatory","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","getUserMedia","constraintsToChrome_","c","optional","cc","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","oc","mix","advanced","shimConstraints_","func","JSON","parse","stringify","audio","remap","b","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","devices","dev","d","some","match","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","toString","onSuccess","onError","webkitGetUserMedia","bind","origGetUserMedia","cs","getAudioTracks","getVideoTracks","stop","NativeRTCIceCandidate","substr","nativeCandidate","parsedCandidate","_sdp2","parseCandidate","augmentedCandidate","assign","toJSON","sdpMid","sdpMLineIndex","usernameFragment","_sctp","sctpInDescription","sections","splitSections","shift","mediaSection","mLine","parseMLine","protocol","getRemoteFirefoxVersion","parseInt","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","matchPrefix","_getConfiguration","getConfiguration","sdpSemantics","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","Math","sctp","wrapDcSend","dc","origDataChannelSend","send","data","size","byteLength","readyState","TypeError","origCreateDataChannel","createDataChannel","dataChannel","channel","proto","completed","checking","iceConnectionState","_onconnectionstatechange","cb","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","nativeSRD","split","line","trim","join","_sdp","RTCIceGatherer","origMSTEnabled","ev","enabled","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","_rtcpeerconnectionShim2","config","iceServers","_filtericeservers","filterIceServers","replaceTrack","setTrack","_rtcpeerconnectionShim","edgeVersion","hasTurn","server","urls","url","deprecated","isString","validTurn","startsWith","catch","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","nativeGetStats","DataChannel","RTCDataChannel","origAddTransceiver","addTransceiver","setParametersPromises","initParameters","shouldPerformCheck","sendEncodings","encodingParam","test","rid","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","params","getParameters","encodings","setParameters","origCreateOffer","createOffer","_arguments2","all","finally","origCreateAnswer","createAnswer","_arguments3","preferredMediaSource","mediaSource","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","_localStreams","_addTrack","index","tracks","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","successCallback","failureCallback","promise","withCallback","_getUserMedia","shimConstraints","errcb","OrigPeerConnection","pcConfig","pcConstraints","newIceServers","generateCertificate","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","direction","setDirection","offerToReceiveVideo","videoTransceiver","compactObject","eventNameToWrap","wrapper","nativeAddEventListener","nativeEventName","wrappedCallback","modifiedEvent","_eventMap","nativeRemoveEventListener","unwrappedCb","bool","logDisabled_","deprecationWarnings_","oldMethod","newMethod","warn","mozGetUserMedia","userAgent","isSecureContext","supportsUnifiedPlan","RTCRtpTransceiver","isObject","reduce","accumulator","isObj","isEmptyObject","walkStats","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","uastring","expr","pos","val","base","resultSet","has","endsWith","SDPUtils","writeMediaSection","caps","dtlsRole","writeRtpDescription","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","_initialTrackId","msid","sendEncodingParameters","ssrc","rtx","localCName","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","clockRate","numChannels","rtcpFeedback","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","offer","answer","maybeAddCandidate","iceTransport","alreadyAdded","getRemoteCandidates","remoteCandidate","foundation","ip","port","priority","addRemoteCandidate","makeError","NotSupportedError","InvalidAccessError","OperationError","addTrackToStreamAndFireEvent","MediaStreamTrackEvent","fireAddTrack","trackEvent","setTimeout","_dispatchEvent","_eventTarget","document","createDocumentFragment","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","_iceGatherers","iceCandidatePoolSize","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","_emitGatheringStateChange","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","_maybeFireNegotiationNeeded","clonedStream","clone","clonedTrack","_createIceGatherer","bufferedCandidateEvents","bufferCandidates","end","state","_gather","onlocalcandidate","evt","cand","component","ufrag","serializedCandidate","writeCandidate","getMediaSections","getDescription","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","recv","rtcp","cname","compound","rtcpParameters","p","receive","sessionpart","parseRtpParameters","isIceLite","isRejected","rejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","receiverList","iceOptions","lines","splitLines","getKind","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","getCapabilities","codec","isNewTrack","nativeTrack","removeTrackFromStreamAndFireEvent","sid","item","close","newState","states","closed","connected","disconnected","failed","new","connecting","numAudioTracks","numVideoTracks","writeSessionBoilerplate","remoteCodec","hdrExt","rHdrExt","getLocalCandidates","mediaSectionsInOffer","localTrack","reducedSize","candidateString","senderOrReceiver","promises","allStats","results","ortcObjectName","nativeGetstats","nativeStats","mapStats","methods","random","blob","part","parts","substring","address","relatedAddress","relatedPort","tcpType","parseIceOptions","parseRtpMap","parsed","channels","writeRtpMap","parseExtmap","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","param","parseRtcpFb","writeRtcpFb","parseSsrcMedia","sp","colon","attribute","parseSsrcGroup","semantics","ssrcs","parseFingerprint","algorithm","fingerprints","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","pwd","password","mline","rtpmapline","fmtps","maxptime","extension","secondarySsrc","encodingParameters","hasRed","hasUlpfec","primarySsrc","flows","encParam","codecPayloadType","fec","mechanism","bandwidth","maxBitrate","remoteSsrc","rsize","mux","spec","planB","msidParts","parseSctpDescription","maxSizeLine","isNaN","sctpPort","fmt","writeSctpDescription","media","output","sessId","sessVer","sessUser","parseOLine","username","sessionId","sessionVersion","netType","addressType","isValidSDP"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"adapter.min.js","sources":["../src/adapter.js"],"sourcesContent":["/**\n * Description of import/upgrade into Moodle:\n *\n * 1. Visit https://github.com/webrtc/adapter/releases.\n * 2. Check if the version has been updated from what is listed in lib/thirdpartylibs.xml in the Moodle wwwroot.\n * 3. If it has -\n * 1. Download the source code.\n * 2. Copy the content of the file release/adapter.js from the archive (ignore the first line).\n * 3. Replace the content below \"return (function e(t,n,r) ..\" in this file with the content you copied.\n * 4. Ensure to update lib/thirdpartylibs.xml with any changes.\n */\n\n// ESLint directives.\n/* eslint-disable */\n\n// JSHint directives.\n/* jshint ignore:start */\n\ndefine([], function() {\nreturn (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 0 && arguments[0] !== undefined ? arguments[0] : {},\n window = _ref.window;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n shimChrome: true,\n shimFirefox: true,\n shimEdge: true,\n shimSafari: true\n };\n\n // Utils.\n var logging = utils.log;\n var browserDetails = utils.detectBrowser(window);\n\n var adapter = {\n browserDetails: browserDetails,\n commonShim: commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection || !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n chromeShim.shimGetUserMedia(window);\n chromeShim.shimMediaStream(window);\n chromeShim.shimPeerConnection(window);\n chromeShim.shimOnTrack(window);\n chromeShim.shimAddTrackRemoveTrack(window);\n chromeShim.shimGetSendersWithDtmf(window);\n chromeShim.shimGetStats(window);\n chromeShim.shimSenderReceiverGetStats(window);\n chromeShim.fixNegotiationNeeded(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimConnectionState(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n commonShim.removeAllowExtmapMixed(window);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection || !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n firefoxShim.shimGetUserMedia(window);\n firefoxShim.shimPeerConnection(window);\n firefoxShim.shimOnTrack(window);\n firefoxShim.shimRemoveStream(window);\n firefoxShim.shimSenderGetStats(window);\n firefoxShim.shimReceiverGetStats(window);\n firefoxShim.shimRTCDataChannel(window);\n firefoxShim.shimAddTransceiver(window);\n firefoxShim.shimCreateOffer(window);\n firefoxShim.shimCreateAnswer(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimConnectionState(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n break;\n case 'edge':\n if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n logging('MS edge shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming edge.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = edgeShim;\n\n edgeShim.shimGetUserMedia(window);\n edgeShim.shimGetDisplayMedia(window);\n edgeShim.shimPeerConnection(window);\n edgeShim.shimReplaceTrack(window);\n\n // the edge shim implements the full RTCIceCandidate object.\n\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n safariShim.shimRTCIceServerUrls(window);\n safariShim.shimCreateOfferLegacy(window);\n safariShim.shimCallbacksAPI(window);\n safariShim.shimLocalStreamsAPI(window);\n safariShim.shimRemoteStreamsAPI(window);\n safariShim.shimTrackEventTransceiver(window);\n safariShim.shimGetUserMedia(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n commonShim.removeAllowExtmapMixed(window);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n\n// Browser shims.\n\n},{\"./chrome/chrome_shim\":3,\"./common_shim\":6,\"./edge/edge_shim\":7,\"./firefox/firefox_shim\":11,\"./safari/safari_shim\":14,\"./utils\":15}],3:[function(require,module,exports){\n\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = exports.shimGetUserMedia = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _getusermedia = require('./getusermedia');\n\nObject.defineProperty(exports, 'shimGetUserMedia', {\n enumerable: true,\n get: function get() {\n return _getusermedia.shimGetUserMedia;\n }\n});\n\nvar _getdisplaymedia = require('./getdisplaymedia');\n\nObject.defineProperty(exports, 'shimGetDisplayMedia', {\n enumerable: true,\n get: function get() {\n return _getdisplaymedia.shimGetDisplayMedia;\n }\n});\nexports.shimMediaStream = shimMediaStream;\nexports.shimOnTrack = shimOnTrack;\nexports.shimGetSendersWithDtmf = shimGetSendersWithDtmf;\nexports.shimGetStats = shimGetStats;\nexports.shimSenderReceiverGetStats = shimSenderReceiverGetStats;\nexports.shimAddTrackRemoveTrackWithNative = shimAddTrackRemoveTrackWithNative;\nexports.shimAddTrackRemoveTrack = shimAddTrackRemoveTrack;\nexports.shimPeerConnection = shimPeerConnection;\nexports.fixNegotiationNeeded = fixNegotiationNeeded;\n\nvar _utils = require('../utils.js');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nfunction shimOnTrack(window) {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && !('ontrack' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get: function get() {\n return this._ontrack;\n },\n set: function set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n\n enumerable: true,\n configurable: true\n });\n var origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {\n var _this = this;\n\n if (!this._ontrackpoly) {\n this._ontrackpoly = function (e) {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', function (te) {\n var receiver = void 0;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = _this.getReceivers().find(function (r) {\n return r.track && r.track.id === te.track.id;\n });\n } else {\n receiver = { track: te.track };\n }\n\n var event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = { receiver: receiver };\n event.streams = [e.stream];\n _this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(function (track) {\n var receiver = void 0;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = _this.getReceivers().find(function (r) {\n return r.track && r.track.id === track.id;\n });\n } else {\n receiver = { track: track };\n }\n var event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = { receiver: receiver };\n event.streams = [e.stream];\n _this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', function (e) {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver', { value: { receiver: e.receiver } });\n }\n return e;\n });\n }\n}\n\nfunction shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && !('getSenders' in window.RTCPeerConnection.prototype) && 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n var shimSenderWithDtmf = function shimSenderWithDtmf(pc, track) {\n return {\n track: track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {\n var sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n var idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n var _this2 = this;\n\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(function (track) {\n _this2._senders.push(shimSenderWithDtmf(_this2, track));\n });\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n var _this3 = this;\n\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(function (track) {\n var sender = _this3._senders.find(function (s) {\n return s.track === track;\n });\n if (sender) {\n // remove sender\n _this3._senders.splice(_this3._senders.indexOf(sender), 1);\n }\n });\n };\n } else if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && 'getSenders' in window.RTCPeerConnection.prototype && 'createDTMFSender' in window.RTCPeerConnection.prototype && window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n var _this4 = this;\n\n var senders = origGetSenders.apply(this, []);\n senders.forEach(function (sender) {\n return sender._pc = _this4;\n });\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get: function get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nfunction shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n var origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n var _this5 = this;\n\n var _arguments = Array.prototype.slice.call(arguments),\n selector = _arguments[0],\n onSucc = _arguments[1],\n onErr = _arguments[2];\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n\n\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 || typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n var fixChromeStats_ = function fixChromeStats_(response) {\n var standardReport = {};\n var reports = response.result();\n reports.forEach(function (report) {\n var standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(function (name) {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n var makeMapStats = function makeMapStats(stats) {\n return new Map(Object.keys(stats).map(function (key) {\n return [key, stats[key]];\n }));\n };\n\n if (arguments.length >= 2) {\n var successCallbackWrapper_ = function successCallbackWrapper_(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_, selector]);\n }\n\n // promise-support\n return new Promise(function (resolve, reject) {\n origGetStats.apply(_this5, [function (response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nfunction shimSenderReceiverGetStats(window) {\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n var _this6 = this;\n\n var senders = origGetSenders.apply(this, []);\n senders.forEach(function (sender) {\n return sender._pc = _this6;\n });\n return senders;\n };\n }\n\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n var sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n var sender = this;\n return this._pc.getStats().then(function (result) {\n return (\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true)\n );\n });\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n var _this7 = this;\n\n var receivers = origGetReceivers.apply(this, []);\n receivers.forEach(function (receiver) {\n return receiver._pc = _this7;\n });\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', function (e) {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n var receiver = this;\n return this._pc.getStats().then(function (result) {\n return utils.filterStats(result, receiver.track, false);\n });\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype && 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n var origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 && arguments[0] instanceof window.MediaStreamTrack) {\n var track = arguments[0];\n var sender = void 0;\n var receiver = void 0;\n var err = void 0;\n this.getSenders().forEach(function (s) {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(function (r) {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || sender && receiver) {\n return Promise.reject(new DOMException('There are more than one sender or receiver for the track.', 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException('There is no sender or receiver for the track.', 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nfunction shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {\n var _this8 = this;\n\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams).map(function (streamId) {\n return _this8._shimmedLocalStreams[streamId][0];\n });\n };\n\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n var sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n var _this9 = this;\n\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(function (track) {\n var alreadyExists = _this9.getSenders().find(function (s) {\n return s.track === track;\n });\n if (alreadyExists) {\n throw new DOMException('Track already exists.', 'InvalidAccessError');\n }\n });\n var existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n var newSenders = this.getSenders().filter(function (newSender) {\n return existingSenders.indexOf(newSender) === -1;\n });\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n var _this10 = this;\n\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(function (streamId) {\n var idx = _this10._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n _this10._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (_this10._shimmedLocalStreams[streamId].length === 1) {\n delete _this10._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nfunction shimAddTrackRemoveTrack(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n var browserDetails = utils.detectBrowser(window);\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack && browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n var origGetLocalStreams = window.RTCPeerConnection.prototype.getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {\n var _this11 = this;\n\n var nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(function (stream) {\n return _this11._reverseStreams[stream.id];\n });\n };\n\n var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n var _this12 = this;\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(function (track) {\n var alreadyExists = _this12.getSenders().find(function (s) {\n return s.track === track;\n });\n if (alreadyExists) {\n throw new DOMException('Track already exists.', 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n var newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [this._streams[stream.id] || stream]);\n delete this._reverseStreams[this._streams[stream.id] ? this._streams[stream.id].id : stream.id];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {\n var _this13 = this;\n\n if (this.signalingState === 'closed') {\n throw new DOMException('The RTCPeerConnection\\'s signalingState is \\'closed\\'.', 'InvalidStateError');\n }\n var streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 || !streams[0].getTracks().find(function (t) {\n return t === track;\n })) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException('The adapter.js addTrack polyfill only supports a single ' + ' stream which is associated with the specified track.', 'NotSupportedError');\n }\n\n var alreadyExists = this.getSenders().find(function (s) {\n return s.track === track;\n });\n if (alreadyExists) {\n throw new DOMException('Track already exists.', 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n var oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(function () {\n _this13.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n var newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(function (s) {\n return s.track === track;\n });\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n var sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(function (internalId) {\n var externalStream = pc._reverseStreams[internalId];\n var internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'), externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp: sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n var sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(function (internalId) {\n var externalStream = pc._reverseStreams[internalId];\n var internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'), internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp: sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function (method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n var methodObj = _defineProperty({}, method, function () {\n var _this14 = this;\n\n var args = arguments;\n var isLegacyCall = arguments.length && typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [function (description) {\n var desc = replaceInternalStreamId(_this14, description);\n args[0].apply(null, [desc]);\n }, function (err) {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]]);\n }\n return nativeMethod.apply(this, arguments).then(function (description) {\n return replaceInternalStreamId(_this14, description);\n });\n });\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n var origSetLocalDescription = window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n var origLocalDescription = Object.getOwnPropertyDescriptor(window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype, 'localDescription', {\n get: function get() {\n var description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n var _this15 = this;\n\n if (this.signalingState === 'closed') {\n throw new DOMException('The RTCPeerConnection\\'s signalingState is \\'closed\\'.', 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' + 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n var isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.', 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n var stream = void 0;\n Object.keys(this._streams).forEach(function (streamid) {\n var hasTrack = _this15._streams[streamid].getTracks().find(function (track) {\n return sender.track === track;\n });\n if (hasTrack) {\n stream = _this15._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nfunction shimPeerConnection(window) {\n var browserDetails = utils.detectBrowser(window);\n\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'].forEach(function (method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n var methodObj = _defineProperty({}, method, function () {\n arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n });\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n // support for addIceCandidate(null or undefined)\n var nativeAddIceCandidate = window.RTCPeerConnection.prototype.addIceCandidate;\n window.RTCPeerConnection.prototype.addIceCandidate = function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions. Native support planned for Chrome M77.\n if (browserDetails.version < 78 && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n\nfunction fixNegotiationNeeded(window) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', function (e) {\n var pc = e.target;\n if (pc.signalingState !== 'stable') {\n return;\n }\n return e;\n });\n}\n\n},{\"../utils.js\":15,\"./getdisplaymedia\":4,\"./getusermedia\":5}],4:[function(require,module,exports){\n/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = shimGetDisplayMedia;\nfunction shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!window.navigator.mediaDevices) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' + 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) {\n return getSourceId(constraints).then(function (sourceId) {\n var widthSpecified = constraints.video && constraints.video.width;\n var heightSpecified = constraints.video && constraints.video.height;\n var frameRateSpecified = constraints.video && constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n\n},{}],5:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.shimGetUserMedia = shimGetUserMedia;\n\nvar _utils = require('../utils.js');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar logging = utils.log;\n\nfunction shimGetUserMedia(window) {\n var navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n var browserDetails = utils.detectBrowser(window);\n\n var constraintsToChrome_ = function constraintsToChrome_(c) {\n if ((typeof c === 'undefined' ? 'undefined' : _typeof(c)) !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n var cc = {};\n Object.keys(c).forEach(function (key) {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n var r = _typeof(c[key]) === 'object' ? c[key] : { ideal: c[key] };\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n var oldname_ = function oldname_(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return name === 'deviceId' ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n var oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(function (mix) {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n var shimConstraints_ = function shimConstraints_(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && _typeof(constraints.audio) === 'object') {\n var remap = function remap(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && _typeof(constraints.video) === 'object') {\n // Shim facingMode for mobile & surface pro.\n var face = constraints.video.facingMode;\n face = face && ((typeof face === 'undefined' ? 'undefined' : _typeof(face)) === 'object' ? face : { ideal: face });\n var getSupportedFacingModeLies = browserDetails.version < 66;\n\n if (face && (face.exact === 'user' || face.exact === 'environment' || face.ideal === 'user' || face.ideal === 'environment') && !(navigator.mediaDevices.getSupportedConstraints && navigator.mediaDevices.getSupportedConstraints().facingMode && !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n var matches = void 0;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices().then(function (devices) {\n devices = devices.filter(function (d) {\n return d.kind === 'videoinput';\n });\n var dev = devices.find(function (d) {\n return matches.some(function (match) {\n return d.label.toLowerCase().includes(match);\n });\n });\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact ? { exact: dev.deviceId } : { ideal: dev.deviceId };\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n var shimError_ = function shimError_(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString: function toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n var getUserMedia_ = function getUserMedia_(constraints, onSuccess, onError) {\n shimConstraints_(constraints, function (c) {\n navigator.webkitGetUserMedia(c, onSuccess, function (e) {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n if (navigator.mediaDevices.getUserMedia) {\n var origGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function (cs) {\n return shimConstraints_(cs, function (c) {\n return origGetUserMedia(c).then(function (stream) {\n if (c.audio && !stream.getAudioTracks().length || c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(function (track) {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, function (e) {\n return Promise.reject(shimError_(e));\n });\n });\n };\n }\n}\n\n},{\"../utils.js\":15}],6:[function(require,module,exports){\n/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.shimRTCIceCandidate = shimRTCIceCandidate;\nexports.shimMaxMessageSize = shimMaxMessageSize;\nexports.shimSendThrowTypeError = shimSendThrowTypeError;\nexports.shimConnectionState = shimConnectionState;\nexports.removeAllowExtmapMixed = removeAllowExtmapMixed;\n\nvar _sdp = require('sdp');\n\nvar _sdp2 = _interopRequireDefault(_sdp);\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || window.RTCIceCandidate && 'foundation' in window.RTCIceCandidate.prototype) {\n return;\n }\n\n var NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if ((typeof args === 'undefined' ? 'undefined' : _typeof(args)) === 'object' && args.candidate && args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substr(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n var nativeCandidate = new NativeRTCIceCandidate(args);\n var parsedCandidate = _sdp2.default.parseCandidate(args.candidate);\n var augmentedCandidate = Object.assign(nativeCandidate, parsedCandidate);\n\n // Add a serializer that does not serialize the extra attributes.\n augmentedCandidate.toJSON = function toJSON() {\n return {\n candidate: augmentedCandidate.candidate,\n sdpMid: augmentedCandidate.sdpMid,\n sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n usernameFragment: augmentedCandidate.usernameFragment\n };\n };\n return augmentedCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', function (e) {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nfunction shimMaxMessageSize(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n var browserDetails = utils.detectBrowser(window);\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get: function get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n var sctpInDescription = function sctpInDescription(description) {\n if (!description || !description.sdp) {\n return false;\n }\n var sections = _sdp2.default.splitSections(description.sdp);\n sections.shift();\n return sections.some(function (mediaSection) {\n var mLine = _sdp2.default.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application' && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n var getRemoteFirefoxVersion = function getRemoteFirefoxVersion(description) {\n // TODO: Is there a better solution for detecting Firefox?\n var match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n var version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n var getCanSendMaxMessageSize = function getCanSendMaxMessageSize(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n var canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize = browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n var getMaxMessageSize = function getMaxMessageSize(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n var maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox' && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n var match = _sdp2.default.matchPrefix(description.sdp, 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substr(19), 10);\n } else if (browserDetails.browser === 'firefox' && remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n var origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n var _getConfiguration = this.getConfiguration(),\n sdpSemantics = _getConfiguration.sdpSemantics;\n\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get: function get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n\n enumerable: true,\n configurable: true\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n var isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n var canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n var remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n var maxMessageSize = void 0;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n var sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get: function get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nfunction shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection && 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n var origDataChannelSend = dc.send;\n dc.send = function send() {\n var data = arguments[0];\n var length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' && pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' + pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n var origCreateDataChannel = window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel = function createDataChannel() {\n var dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', function (e) {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nfunction shimConnectionState(window) {\n if (!window.RTCPeerConnection || 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n var proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get: function get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get: function get() {\n return this._onconnectionstatechange || null;\n },\n set: function set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange', this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange', this._onconnectionstatechange = cb);\n }\n },\n\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach(function (method) {\n var origMethod = proto[method];\n proto[method] = function () {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = function (e) {\n var pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n var newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange', this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nfunction removeAllowExtmapMixed(window) {\n /* remove a=extmap-allow-mixed for Chrome < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n var browserDetails = utils.detectBrowser(window);\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n var nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n desc.sdp = desc.sdp.split('\\n').filter(function (line) {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\n},{\"./utils\":15,\"sdp\":17}],7:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = exports.shimGetUserMedia = undefined;\n\nvar _getusermedia = require('./getusermedia');\n\nObject.defineProperty(exports, 'shimGetUserMedia', {\n enumerable: true,\n get: function get() {\n return _getusermedia.shimGetUserMedia;\n }\n});\n\nvar _getdisplaymedia = require('./getdisplaymedia');\n\nObject.defineProperty(exports, 'shimGetDisplayMedia', {\n enumerable: true,\n get: function get() {\n return _getdisplaymedia.shimGetDisplayMedia;\n }\n});\nexports.shimPeerConnection = shimPeerConnection;\nexports.shimReplaceTrack = shimReplaceTrack;\n\nvar _utils = require('../utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _filtericeservers = require('./filtericeservers');\n\nvar _rtcpeerconnectionShim = require('rtcpeerconnection-shim');\n\nvar _rtcpeerconnectionShim2 = _interopRequireDefault(_rtcpeerconnectionShim);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction shimPeerConnection(window) {\n var browserDetails = utils.detectBrowser(window);\n\n if (window.RTCIceGatherer) {\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n return args;\n };\n }\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = function RTCSessionDescription(args) {\n return args;\n };\n }\n // this adds an additional event listener to MediaStrackTrack that signals\n // when a tracks enabled property was changed. Workaround for a bug in\n // addStream, see below. No longer required in 15025+\n if (browserDetails.version < 15025) {\n var origMSTEnabled = Object.getOwnPropertyDescriptor(window.MediaStreamTrack.prototype, 'enabled');\n Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n set: function set(value) {\n origMSTEnabled.set.call(this, value);\n var ev = new Event('enabled');\n ev.enabled = value;\n this.dispatchEvent(ev);\n }\n });\n }\n }\n\n // ORTC defines the DTMF sender a bit different.\n // https://github.com/w3c/ortc/issues/714\n if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get: function get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = new window.RTCDtmfSender(this);\n } else if (this.track.kind === 'video') {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n // Edge currently only implements the RTCDtmfSender, not the\n // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n window.RTCDTMFSender = window.RTCDtmfSender;\n }\n\n var RTCPeerConnectionShim = (0, _rtcpeerconnectionShim2.default)(window, browserDetails.version);\n window.RTCPeerConnection = function RTCPeerConnection(config) {\n if (config && config.iceServers) {\n config.iceServers = (0, _filtericeservers.filterIceServers)(config.iceServers, browserDetails.version);\n utils.log('ICE servers after filtering:', config.iceServers);\n }\n return new RTCPeerConnectionShim(config);\n };\n window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n}\n\nfunction shimReplaceTrack(window) {\n // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n if (window.RTCRtpSender && !('replaceTrack' in window.RTCRtpSender.prototype)) {\n window.RTCRtpSender.prototype.replaceTrack = window.RTCRtpSender.prototype.setTrack;\n }\n}\n\n},{\"../utils\":15,\"./filtericeservers\":8,\"./getdisplaymedia\":9,\"./getusermedia\":10,\"rtcpeerconnection-shim\":16}],8:[function(require,module,exports){\n/*\n * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.filterIceServers = filterIceServers;\n\nvar _utils = require('../utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n var hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(function (server) {\n if (server && (server.urls || server.url)) {\n var urls = server.urls || server.url;\n if (server.url && !server.urls) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n }\n var isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(function (url) {\n // filter STUN unconditionally.\n if (url.indexOf('stun:') === 0) {\n return false;\n }\n\n var validTurn = url.startsWith('turn') && !url.startsWith('turn:[') && url.includes('transport=udp');\n if (validTurn && !hasTurn) {\n hasTurn = true;\n return true;\n }\n return validTurn && !hasTurn;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n\n},{\"../utils\":15}],9:[function(require,module,exports){\n/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = shimGetDisplayMedia;\nfunction shimGetDisplayMedia(window) {\n if (!('getDisplayMedia' in window.navigator)) {\n return;\n }\n if (!window.navigator.mediaDevices) {\n return;\n }\n if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia = window.navigator.getDisplayMedia.bind(window.navigator);\n}\n\n},{}],10:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetUserMedia = shimGetUserMedia;\nfunction shimGetUserMedia(window) {\n var navigator = window && window.navigator;\n\n var shimError_ = function shimError_(e) {\n return {\n name: { PermissionDeniedError: 'NotAllowedError' }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint,\n toString: function toString() {\n return this.name;\n }\n };\n };\n\n // getUserMedia error shim.\n var origGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function (c) {\n return origGetUserMedia(c).catch(function (e) {\n return Promise.reject(shimError_(e));\n });\n };\n}\n\n},{}],11:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = exports.shimGetUserMedia = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _getusermedia = require('./getusermedia');\n\nObject.defineProperty(exports, 'shimGetUserMedia', {\n enumerable: true,\n get: function get() {\n return _getusermedia.shimGetUserMedia;\n }\n});\n\nvar _getdisplaymedia = require('./getdisplaymedia');\n\nObject.defineProperty(exports, 'shimGetDisplayMedia', {\n enumerable: true,\n get: function get() {\n return _getdisplaymedia.shimGetDisplayMedia;\n }\n});\nexports.shimOnTrack = shimOnTrack;\nexports.shimPeerConnection = shimPeerConnection;\nexports.shimSenderGetStats = shimSenderGetStats;\nexports.shimReceiverGetStats = shimReceiverGetStats;\nexports.shimRemoveStream = shimRemoveStream;\nexports.shimRTCDataChannel = shimRTCDataChannel;\nexports.shimAddTransceiver = shimAddTransceiver;\nexports.shimCreateOffer = shimCreateOffer;\nexports.shimCreateAnswer = shimCreateAnswer;\n\nvar _utils = require('../utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction shimOnTrack(window) {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get: function get() {\n return { receiver: this.receiver };\n }\n });\n }\n}\n\nfunction shimPeerConnection(window) {\n var browserDetails = utils.detectBrowser(window);\n\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) !== 'object' || !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'].forEach(function (method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n var methodObj = _defineProperty({}, method, function () {\n arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n });\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n // support for addIceCandidate(null or undefined)\n // as well as ignoring {sdpMid, candidate: \"\"}\n if (browserDetails.version < 68) {\n var nativeAddIceCandidate = window.RTCPeerConnection.prototype.addIceCandidate;\n window.RTCPeerConnection.prototype.addIceCandidate = function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n if (arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n }\n\n var modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n var nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n var _arguments = Array.prototype.slice.call(arguments),\n selector = _arguments[0],\n onSucc = _arguments[1],\n onErr = _arguments[2];\n\n return nativeGetStats.apply(this, [selector || null]).then(function (stats) {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(function (stat) {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach(function (stat, i) {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n }).then(onSucc, onErr);\n };\n}\n\nfunction shimSenderGetStats(window) {\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n var _this = this;\n\n var senders = origGetSenders.apply(this, []);\n senders.forEach(function (sender) {\n return sender._pc = _this;\n });\n return senders;\n };\n }\n\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n var sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) : Promise.resolve(new Map());\n };\n}\n\nfunction shimReceiverGetStats(window) {\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n var _this2 = this;\n\n var receivers = origGetReceivers.apply(this, []);\n receivers.forEach(function (receiver) {\n return receiver._pc = _this2;\n });\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', function (e) {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nfunction shimRemoveStream(window) {\n if (!window.RTCPeerConnection || 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n var _this3 = this;\n\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(function (sender) {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n _this3.removeTrack(sender);\n }\n });\n };\n}\n\nfunction shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nfunction shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection)) {\n return;\n }\n var origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver = function addTransceiver() {\n this.setParametersPromises = [];\n var initParameters = arguments[1];\n var shouldPerformCheck = initParameters && 'sendEncodings' in initParameters;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n initParameters.sendEncodings.forEach(function (encodingParam) {\n if ('rid' in encodingParam) {\n var ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n var transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n var sender = transceiver.sender;\n\n var params = sender.getParameters();\n if (!('encodings' in params)) {\n params.encodings = initParameters.sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params).catch(function () {}));\n }\n }\n return transceiver;\n };\n }\n}\n\nfunction shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection)) {\n return;\n }\n var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n var _this4 = this,\n _arguments2 = arguments;\n\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises).then(function () {\n return origCreateOffer.apply(_this4, _arguments2);\n }).finally(function () {\n _this4.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nfunction shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCPeerConnection)) {\n return;\n }\n var origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n var _this5 = this,\n _arguments3 = arguments;\n\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises).then(function () {\n return origCreateAnswer.apply(_this5, _arguments3);\n }).finally(function () {\n _this5.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n\n},{\"../utils\":15,\"./getdisplaymedia\":12,\"./getusermedia\":13}],12:[function(require,module,exports){\n/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.shimGetDisplayMedia = shimGetDisplayMedia;\nfunction shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!window.navigator.mediaDevices) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n var err = new DOMException('getDisplayMedia without video ' + 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = { mediaSource: preferredMediaSource };\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n\n},{}],13:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.shimGetUserMedia = shimGetUserMedia;\n\nvar _utils = require('../utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction shimGetUserMedia(window) {\n var browserDetails = utils.detectBrowser(window);\n var navigator = window && window.navigator;\n var MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function (constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia', 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 && 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n var remap = function remap(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n var nativeGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function (c) {\n if ((typeof c === 'undefined' ? 'undefined' : _typeof(c)) === 'object' && _typeof(c.audio) === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n var nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function () {\n var obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n var nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function (c) {\n if (this.kind === 'audio' && (typeof c === 'undefined' ? 'undefined' : _typeof(c)) === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n\n},{\"../utils\":15}],14:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.shimLocalStreamsAPI = shimLocalStreamsAPI;\nexports.shimRemoteStreamsAPI = shimRemoteStreamsAPI;\nexports.shimCallbacksAPI = shimCallbacksAPI;\nexports.shimGetUserMedia = shimGetUserMedia;\nexports.shimConstraints = shimConstraints;\nexports.shimRTCIceServerUrls = shimRTCIceServerUrls;\nexports.shimTrackEventTransceiver = shimTrackEventTransceiver;\nexports.shimCreateOfferLegacy = shimCreateOfferLegacy;\n\nvar _utils = require('../utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction shimLocalStreamsAPI(window) {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n var _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n var _this = this;\n\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(function (track) {\n return _addTrack.call(_this, track, stream);\n });\n stream.getVideoTracks().forEach(function (track) {\n return _addTrack.call(_this, track, stream);\n });\n };\n\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track) {\n var stream = arguments[1];\n if (stream) {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n var _this2 = this;\n\n if (!this._localStreams) {\n this._localStreams = [];\n }\n var index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n var tracks = stream.getTracks();\n this.getSenders().forEach(function (sender) {\n if (tracks.includes(sender.track)) {\n _this2.removeTrack(sender);\n }\n });\n };\n }\n}\n\nfunction shimRemoteStreamsAPI(window) {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams = function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get: function get() {\n return this._onaddstream;\n },\n set: function set(f) {\n var _this3 = this;\n\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = function (e) {\n e.streams.forEach(function (stream) {\n if (!_this3._remoteStreams) {\n _this3._remoteStreams = [];\n }\n if (_this3._remoteStreams.includes(stream)) {\n return;\n }\n _this3._remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n _this3.dispatchEvent(event);\n });\n });\n }\n });\n var origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {\n var pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function (e) {\n e.streams.forEach(function (stream) {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nfunction shimCallbacksAPI(window) {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n var prototype = window.RTCPeerConnection.prototype;\n var origCreateOffer = prototype.createOffer;\n var origCreateAnswer = prototype.createAnswer;\n var setLocalDescription = prototype.setLocalDescription;\n var setRemoteDescription = prototype.setRemoteDescription;\n var addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer = function createOffer(successCallback, failureCallback) {\n var options = arguments.length >= 2 ? arguments[2] : arguments[0];\n var promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer = function createAnswer(successCallback, failureCallback) {\n var options = arguments.length >= 2 ? arguments[2] : arguments[0];\n var promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n var withCallback = function withCallback(description, successCallback, failureCallback) {\n var promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function withCallback(description, successCallback, failureCallback) {\n var promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function withCallback(candidate, successCallback, failureCallback) {\n var promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nfunction shimGetUserMedia(window) {\n var navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n var mediaDevices = navigator.mediaDevices;\n var _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = function (constraints) {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints).then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nfunction shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({}, constraints, { video: utils.compactObject(constraints.video) });\n }\n\n return constraints;\n}\n\nfunction shimRTCIceServerUrls(window) {\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n var OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection = function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n var newIceServers = [];\n for (var i = 0; i < pcConfig.iceServers.length; i++) {\n var server = pcConfig.iceServers[i];\n if (!server.hasOwnProperty('urls') && server.hasOwnProperty('url')) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in window.RTCPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get: function get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nfunction shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get: function get() {\n return { receiver: this.receiver };\n }\n });\n }\n}\n\nfunction shimCreateOfferLegacy(window) {\n var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio;\n }\n var audioTransceiver = this.getTransceivers().find(function (transceiver) {\n return transceiver.receiver.track.kind === 'audio';\n });\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true && !audioTransceiver) {\n this.addTransceiver('audio');\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo;\n }\n var videoTransceiver = this.getTransceivers().find(function (transceiver) {\n return transceiver.receiver.track.kind === 'video';\n });\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true && !videoTransceiver) {\n this.addTransceiver('video');\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\n},{\"../utils\":15}],15:[function(require,module,exports){\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.extractVersion = extractVersion;\nexports.wrapPeerConnectionEvent = wrapPeerConnectionEvent;\nexports.disableLog = disableLog;\nexports.disableWarnings = disableWarnings;\nexports.log = log;\nexports.deprecated = deprecated;\nexports.detectBrowser = detectBrowser;\nexports.compactObject = compactObject;\nexports.walkStats = walkStats;\nexports.filterStats = filterStats;\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar logDisabled_ = true;\nvar deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nfunction extractVersion(uastring, expr, pos) {\n var match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nfunction wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n var proto = window.RTCPeerConnection.prototype;\n var nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function (nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n var wrappedCallback = function wrappedCallback(e) {\n var modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n cb(modifiedEvent);\n }\n };\n this._eventMap = this._eventMap || {};\n this._eventMap[cb] = wrappedCallback;\n return nativeAddEventListener.apply(this, [nativeEventName, wrappedCallback]);\n };\n\n var nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function (nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap || !this._eventMap[cb]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n var unwrappedCb = this._eventMap[cb];\n delete this._eventMap[cb];\n return nativeRemoveEventListener.apply(this, [nativeEventName, unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get: function get() {\n return this['_on' + eventNameToWrap];\n },\n set: function set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap, this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap, this['_on' + eventNameToWrap] = cb);\n }\n },\n\n enumerable: true,\n configurable: true\n });\n}\n\nfunction disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + (typeof bool === 'undefined' ? 'undefined' : _typeof(bool)) + '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return bool ? 'adapter.js logging disabled' : 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nfunction disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + (typeof bool === 'undefined' ? 'undefined' : _typeof(bool)) + '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nfunction log() {\n if ((typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nfunction deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod + ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nfunction detectBrowser(window) {\n var navigator = window.navigator;\n\n // Returned result object.\n\n var result = { browser: null, version: null };\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n if (navigator.mozGetUserMedia) {\n // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent, /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia || window.isSecureContext === false && window.webkitRTCPeerConnection && !window.RTCIceGatherer) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent, /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (navigator.mediaDevices && navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) {\n // Edge.\n result.browser = 'edge';\n result.version = extractVersion(navigator.userAgent, /Edge\\/(\\d+).(\\d+)$/, 2);\n } else if (window.RTCPeerConnection && navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) {\n // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent, /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver && 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else {\n // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nfunction compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function (accumulator, key) {\n var isObj = isObject(data[key]);\n var value = isObj ? compactObject(data[key]) : data[key];\n var isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, _defineProperty({}, key, value));\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nfunction walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(function (name) {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(function (id) {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nfunction filterStats(result, track, outbound) {\n var streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n var filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n var trackStats = [];\n result.forEach(function (value) {\n if (value.type === 'track' && value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(function (trackStat) {\n result.forEach(function (stats) {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n},{}],16:[function(require,module,exports){\n/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n return {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n var trackId = transceiver.rtpSender._initialTrackId ||\n transceiver.rtpSender.track.id;\n transceiver.rtpSender._initialTrackId = trackId;\n // spec.\n var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n trackId + '\\r\\n';\n sdp += 'a=' + msid;\n // for Chrome. Legacy should no longer be required.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n\n // RTX\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n var hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(function(server) {\n if (server && (server.urls || server.url)) {\n var urls = server.urls || server.url;\n if (server.url && !server.urls) {\n console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n }\n var isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(function(url) {\n var validTurn = url.indexOf('turn:') === 0 &&\n url.indexOf('transport=udp') !== -1 &&\n url.indexOf('turn:[') === -1 &&\n !hasTurn;\n\n if (validTurn) {\n hasTurn = true;\n return true;\n }\n return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n url.indexOf('?transport=udp') === -1;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n var commonCapabilities = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: []\n };\n\n var findCodecByPayloadType = function(pt, codecs) {\n pt = parseInt(pt, 10);\n for (var i = 0; i < codecs.length; i++) {\n if (codecs[i].payloadType === pt ||\n codecs[i].preferredPayloadType === pt) {\n return codecs[i];\n }\n }\n };\n\n var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n return lCodec && rCodec &&\n lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n };\n\n localCapabilities.codecs.forEach(function(lCodec) {\n for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n var rCodec = remoteCapabilities.codecs[i];\n if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n lCodec.clockRate === rCodec.clockRate) {\n if (lCodec.name.toLowerCase() === 'rtx' &&\n lCodec.parameters && rCodec.parameters.apt) {\n // for RTX we need to find the local rtx that has a apt\n // which points to the same local codec as the remote one.\n if (!rtxCapabilityMatches(lCodec, rCodec,\n localCapabilities.codecs, remoteCapabilities.codecs)) {\n continue;\n }\n }\n rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n // number of channels is the highest common number of channels\n rCodec.numChannels = Math.min(lCodec.numChannels,\n rCodec.numChannels);\n // push rCodec so we reply with offerer payload type\n commonCapabilities.codecs.push(rCodec);\n\n // determine common feedback mechanisms\n rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n if (lCodec.rtcpFeedback[j].type === fb.type &&\n lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n return true;\n }\n }\n return false;\n });\n // FIXME: also need to determine .parameters\n // see https://github.com/openpeer/ortc/issues/569\n break;\n }\n }\n });\n\n localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n i++) {\n var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n if (lHeaderExtension.uri === rHeaderExtension.uri) {\n commonCapabilities.headerExtensions.push(rHeaderExtension);\n break;\n }\n }\n });\n\n // FIXME: fecMechanisms\n return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n return {\n offer: {\n setLocalDescription: ['stable', 'have-local-offer'],\n setRemoteDescription: ['stable', 'have-remote-offer']\n },\n answer: {\n setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n }\n }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n // Edge's internal representation adds some fields therefore\n // not all fieldѕ are taken into account.\n var alreadyAdded = iceTransport.getRemoteCandidates()\n .find(function(remoteCandidate) {\n return candidate.foundation === remoteCandidate.foundation &&\n candidate.ip === remoteCandidate.ip &&\n candidate.port === remoteCandidate.port &&\n candidate.priority === remoteCandidate.priority &&\n candidate.protocol === remoteCandidate.protocol &&\n candidate.type === remoteCandidate.type;\n });\n if (!alreadyAdded) {\n iceTransport.addRemoteCandidate(candidate);\n }\n return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n var e = new Error(description);\n e.name = name;\n // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n e.code = {\n NotSupportedError: 9,\n InvalidStateError: 11,\n InvalidAccessError: 15,\n TypeError: undefined,\n OperationError: undefined\n }[name];\n return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n // https://w3c.github.io/mediacapture-main/#mediastream\n // Helper function to add the track to the stream and\n // dispatch the event ourselves.\n function addTrackToStreamAndFireEvent(track, stream) {\n stream.addTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n {track: track}));\n }\n\n function removeTrackFromStreamAndFireEvent(track, stream) {\n stream.removeTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n {track: track}));\n }\n\n function fireAddTrack(pc, track, receiver, streams) {\n var trackEvent = new Event('track');\n trackEvent.track = track;\n trackEvent.receiver = receiver;\n trackEvent.transceiver = {receiver: receiver};\n trackEvent.streams = streams;\n window.setTimeout(function() {\n pc._dispatchEvent('track', trackEvent);\n });\n }\n\n var RTCPeerConnection = function(config) {\n var pc = this;\n\n var _eventTarget = document.createDocumentFragment();\n ['addEventListener', 'removeEventListener', 'dispatchEvent']\n .forEach(function(method) {\n pc[method] = _eventTarget[method].bind(_eventTarget);\n });\n\n this.canTrickleIceCandidates = null;\n\n this.needNegotiation = false;\n\n this.localStreams = [];\n this.remoteStreams = [];\n\n this._localDescription = null;\n this._remoteDescription = null;\n\n this.signalingState = 'stable';\n this.iceConnectionState = 'new';\n this.connectionState = 'new';\n this.iceGatheringState = 'new';\n\n config = JSON.parse(JSON.stringify(config || {}));\n\n this.usingBundle = config.bundlePolicy === 'max-bundle';\n if (config.rtcpMuxPolicy === 'negotiate') {\n throw(makeError('NotSupportedError',\n 'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n } else if (!config.rtcpMuxPolicy) {\n config.rtcpMuxPolicy = 'require';\n }\n\n switch (config.iceTransportPolicy) {\n case 'all':\n case 'relay':\n break;\n default:\n config.iceTransportPolicy = 'all';\n break;\n }\n\n switch (config.bundlePolicy) {\n case 'balanced':\n case 'max-compat':\n case 'max-bundle':\n break;\n default:\n config.bundlePolicy = 'balanced';\n break;\n }\n\n config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n this._iceGatherers = [];\n if (config.iceCandidatePoolSize) {\n for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n this._iceGatherers.push(new window.RTCIceGatherer({\n iceServers: config.iceServers,\n gatherPolicy: config.iceTransportPolicy\n }));\n }\n } else {\n config.iceCandidatePoolSize = 0;\n }\n\n this._config = config;\n\n // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n // everything that is needed to describe a SDP m-line.\n this.transceivers = [];\n\n this._sdpSessionId = SDPUtils.generateSessionId();\n this._sdpSessionVersion = 0;\n\n this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n this._isClosed = false;\n };\n\n Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n configurable: true,\n get: function() {\n return this._localDescription;\n }\n });\n Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n configurable: true,\n get: function() {\n return this._remoteDescription;\n }\n });\n\n // set up event handlers on prototype\n RTCPeerConnection.prototype.onicecandidate = null;\n RTCPeerConnection.prototype.onaddstream = null;\n RTCPeerConnection.prototype.ontrack = null;\n RTCPeerConnection.prototype.onremovestream = null;\n RTCPeerConnection.prototype.onsignalingstatechange = null;\n RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n RTCPeerConnection.prototype.onconnectionstatechange = null;\n RTCPeerConnection.prototype.onicegatheringstatechange = null;\n RTCPeerConnection.prototype.onnegotiationneeded = null;\n RTCPeerConnection.prototype.ondatachannel = null;\n\n RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n if (this._isClosed) {\n return;\n }\n this.dispatchEvent(event);\n if (typeof this['on' + name] === 'function') {\n this['on' + name](event);\n }\n };\n\n RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n var event = new Event('icegatheringstatechange');\n this._dispatchEvent('icegatheringstatechange', event);\n };\n\n RTCPeerConnection.prototype.getConfiguration = function() {\n return this._config;\n };\n\n RTCPeerConnection.prototype.getLocalStreams = function() {\n return this.localStreams;\n };\n\n RTCPeerConnection.prototype.getRemoteStreams = function() {\n return this.remoteStreams;\n };\n\n // internal helper to create a transceiver object.\n // (which is not yet the same as the WebRTC 1.0 transceiver)\n RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n var hasBundleTransport = this.transceivers.length > 0;\n var transceiver = {\n track: null,\n iceGatherer: null,\n iceTransport: null,\n dtlsTransport: null,\n localCapabilities: null,\n remoteCapabilities: null,\n rtpSender: null,\n rtpReceiver: null,\n kind: kind,\n mid: null,\n sendEncodingParameters: null,\n recvEncodingParameters: null,\n stream: null,\n associatedRemoteMediaStreams: [],\n wantReceive: true\n };\n if (this.usingBundle && hasBundleTransport) {\n transceiver.iceTransport = this.transceivers[0].iceTransport;\n transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n } else {\n var transports = this._createIceAndDtlsTransports();\n transceiver.iceTransport = transports.iceTransport;\n transceiver.dtlsTransport = transports.dtlsTransport;\n }\n if (!doNotAdd) {\n this.transceivers.push(transceiver);\n }\n return transceiver;\n };\n\n RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call addTrack on a closed peerconnection.');\n }\n\n var alreadyExists = this.transceivers.find(function(s) {\n return s.track === track;\n });\n\n if (alreadyExists) {\n throw makeError('InvalidAccessError', 'Track already exists.');\n }\n\n var transceiver;\n for (var i = 0; i < this.transceivers.length; i++) {\n if (!this.transceivers[i].track &&\n this.transceivers[i].kind === track.kind) {\n transceiver = this.transceivers[i];\n }\n }\n if (!transceiver) {\n transceiver = this._createTransceiver(track.kind);\n }\n\n this._maybeFireNegotiationNeeded();\n\n if (this.localStreams.indexOf(stream) === -1) {\n this.localStreams.push(stream);\n }\n\n transceiver.track = track;\n transceiver.stream = stream;\n transceiver.rtpSender = new window.RTCRtpSender(track,\n transceiver.dtlsTransport);\n return transceiver.rtpSender;\n };\n\n RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n if (edgeVersion >= 15025) {\n stream.getTracks().forEach(function(track) {\n pc.addTrack(track, stream);\n });\n } else {\n // Clone is necessary for local demos mostly, attaching directly\n // to two different senders does not work (build 10547).\n // Fixed in 15025 (or earlier)\n var clonedStream = stream.clone();\n stream.getTracks().forEach(function(track, idx) {\n var clonedTrack = clonedStream.getTracks()[idx];\n track.addEventListener('enabled', function(event) {\n clonedTrack.enabled = event.enabled;\n });\n });\n clonedStream.getTracks().forEach(function(track) {\n pc.addTrack(track, clonedStream);\n });\n }\n };\n\n RTCPeerConnection.prototype.removeTrack = function(sender) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call removeTrack on a closed peerconnection.');\n }\n\n if (!(sender instanceof window.RTCRtpSender)) {\n throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.');\n }\n\n var transceiver = this.transceivers.find(function(t) {\n return t.rtpSender === sender;\n });\n\n if (!transceiver) {\n throw makeError('InvalidAccessError',\n 'Sender was not created by this connection.');\n }\n var stream = transceiver.stream;\n\n transceiver.rtpSender.stop();\n transceiver.rtpSender = null;\n transceiver.track = null;\n transceiver.stream = null;\n\n // remove the stream from the set of local streams\n var localStreams = this.transceivers.map(function(t) {\n return t.stream;\n });\n if (localStreams.indexOf(stream) === -1 &&\n this.localStreams.indexOf(stream) > -1) {\n this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n }\n\n this._maybeFireNegotiationNeeded();\n };\n\n RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n stream.getTracks().forEach(function(track) {\n var sender = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (sender) {\n pc.removeTrack(sender);\n }\n });\n };\n\n RTCPeerConnection.prototype.getSenders = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpSender;\n })\n .map(function(transceiver) {\n return transceiver.rtpSender;\n });\n };\n\n RTCPeerConnection.prototype.getReceivers = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpReceiver;\n })\n .map(function(transceiver) {\n return transceiver.rtpReceiver;\n });\n };\n\n\n RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n usingBundle) {\n var pc = this;\n if (usingBundle && sdpMLineIndex > 0) {\n return this.transceivers[0].iceGatherer;\n } else if (this._iceGatherers.length) {\n return this._iceGatherers.shift();\n }\n var iceGatherer = new window.RTCIceGatherer({\n iceServers: this._config.iceServers,\n gatherPolicy: this._config.iceTransportPolicy\n });\n Object.defineProperty(iceGatherer, 'state',\n {value: 'new', writable: true}\n );\n\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n var end = !event.candidate || Object.keys(event.candidate).length === 0;\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n iceGatherer.state = end ? 'completed' : 'gathering';\n if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n }\n };\n iceGatherer.addEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n return iceGatherer;\n };\n\n // start gathering from an RTCIceGatherer.\n RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n var pc = this;\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer.onlocalcandidate) {\n return;\n }\n var bufferedCandidateEvents =\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n iceGatherer.removeEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n iceGatherer.onlocalcandidate = function(evt) {\n if (pc.usingBundle && sdpMLineIndex > 0) {\n // if we know that we use bundle we can drop candidates with\n // ѕdpMLineIndex > 0. If we don't do this then our state gets\n // confused since we dispose the extra ice gatherer.\n return;\n }\n var event = new Event('icecandidate');\n event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n var cand = evt.candidate;\n // Edge emits an empty object for RTCIceCandidateComplete‥\n var end = !cand || Object.keys(cand).length === 0;\n if (end) {\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n iceGatherer.state = 'completed';\n }\n } else {\n if (iceGatherer.state === 'new') {\n iceGatherer.state = 'gathering';\n }\n // RTCIceCandidate doesn't have a component, needs to be added\n cand.component = 1;\n // also the usernameFragment. TODO: update SDP to take both variants.\n cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n var serializedCandidate = SDPUtils.writeCandidate(cand);\n event.candidate = Object.assign(event.candidate,\n SDPUtils.parseCandidate(serializedCandidate));\n\n event.candidate.candidate = serializedCandidate;\n event.candidate.toJSON = function() {\n return {\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment\n };\n };\n }\n\n // update local description.\n var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n if (!end) {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=' + event.candidate.candidate + '\\r\\n';\n } else {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=end-of-candidates\\r\\n';\n }\n pc._localDescription.sdp =\n SDPUtils.getDescription(pc._localDescription.sdp) +\n sections.join('');\n var complete = pc.transceivers.every(function(transceiver) {\n return transceiver.iceGatherer &&\n transceiver.iceGatherer.state === 'completed';\n });\n\n if (pc.iceGatheringState !== 'gathering') {\n pc.iceGatheringState = 'gathering';\n pc._emitGatheringStateChange();\n }\n\n // Emit candidate. Also emit null candidate when all gatherers are\n // complete.\n if (!end) {\n pc._dispatchEvent('icecandidate', event);\n }\n if (complete) {\n pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n pc.iceGatheringState = 'complete';\n pc._emitGatheringStateChange();\n }\n };\n\n // emit already gathered candidates.\n window.setTimeout(function() {\n bufferedCandidateEvents.forEach(function(e) {\n iceGatherer.onlocalcandidate(e);\n });\n }, 0);\n };\n\n // Create ICE transport and DTLS transport.\n RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n var pc = this;\n var iceTransport = new window.RTCIceTransport(null);\n iceTransport.onicestatechange = function() {\n pc._updateIceConnectionState();\n pc._updateConnectionState();\n };\n\n var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n dtlsTransport.ondtlsstatechange = function() {\n pc._updateConnectionState();\n };\n dtlsTransport.onerror = function() {\n // onerror does not set state to failed by itself.\n Object.defineProperty(dtlsTransport, 'state',\n {value: 'failed', writable: true});\n pc._updateConnectionState();\n };\n\n return {\n iceTransport: iceTransport,\n dtlsTransport: dtlsTransport\n };\n };\n\n // Destroy ICE gatherer, ICE transport and DTLS transport.\n // Without triggering the callbacks.\n RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n sdpMLineIndex) {\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer) {\n delete iceGatherer.onlocalcandidate;\n delete this.transceivers[sdpMLineIndex].iceGatherer;\n }\n var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n if (iceTransport) {\n delete iceTransport.onicestatechange;\n delete this.transceivers[sdpMLineIndex].iceTransport;\n }\n var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n if (dtlsTransport) {\n delete dtlsTransport.ondtlsstatechange;\n delete dtlsTransport.onerror;\n delete this.transceivers[sdpMLineIndex].dtlsTransport;\n }\n };\n\n // Start the RTP Sender and Receiver for a transceiver.\n RTCPeerConnection.prototype._transceive = function(transceiver,\n send, recv) {\n var params = getCommonCapabilities(transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n if (send && transceiver.rtpSender) {\n params.encodings = transceiver.sendEncodingParameters;\n params.rtcp = {\n cname: SDPUtils.localCName,\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.recvEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n }\n transceiver.rtpSender.send(params);\n }\n if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n // remove RTX field in Edge 14942\n if (transceiver.kind === 'video'\n && transceiver.recvEncodingParameters\n && edgeVersion < 15019) {\n transceiver.recvEncodingParameters.forEach(function(p) {\n delete p.rtx;\n });\n }\n if (transceiver.recvEncodingParameters.length) {\n params.encodings = transceiver.recvEncodingParameters;\n } else {\n params.encodings = [{}];\n }\n params.rtcp = {\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.rtcpParameters.cname) {\n params.rtcp.cname = transceiver.rtcpParameters.cname;\n }\n if (transceiver.sendEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n }\n transceiver.rtpReceiver.receive(params);\n }\n };\n\n RTCPeerConnection.prototype.setLocalDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setLocalDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set local ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var sections;\n var sessionpart;\n if (description.type === 'offer') {\n // VERY limited support for SDP munging. Limited to:\n // * changing the order of codecs\n sections = SDPUtils.splitSections(description.sdp);\n sessionpart = sections.shift();\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var caps = SDPUtils.parseRtpParameters(mediaSection);\n pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n });\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n });\n } else if (description.type === 'answer') {\n sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var transceiver = pc.transceivers[sdpMLineIndex];\n var iceGatherer = transceiver.iceGatherer;\n var iceTransport = transceiver.iceTransport;\n var dtlsTransport = transceiver.dtlsTransport;\n var localCapabilities = transceiver.localCapabilities;\n var remoteCapabilities = transceiver.remoteCapabilities;\n\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n if (!rejected && !transceiver.rejected) {\n var remoteIceParameters = SDPUtils.getIceParameters(\n mediaSection, sessionpart);\n var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n mediaSection, sessionpart);\n if (isIceLite) {\n remoteDtlsParameters.role = 'server';\n }\n\n if (!pc.usingBundle || sdpMLineIndex === 0) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n isIceLite ? 'controlling' : 'controlled');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // Calculate intersection of capabilities.\n var params = getCommonCapabilities(localCapabilities,\n remoteCapabilities);\n\n // Start the RTCRtpSender. The RTCRtpReceiver for this\n // transceiver has already been started in setRemoteDescription.\n pc._transceive(transceiver,\n params.codecs.length > 0,\n false);\n }\n });\n }\n\n pc._localDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-local-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setRemoteDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set remote ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var streams = {};\n pc.remoteStreams.forEach(function(stream) {\n streams[stream.id] = stream;\n });\n var receiverList = [];\n var sections = SDPUtils.splitSections(description.sdp);\n var sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n var usingBundle = SDPUtils.matchPrefix(sessionpart,\n 'a=group:BUNDLE ').length > 0;\n pc.usingBundle = usingBundle;\n var iceOptions = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-options:')[0];\n if (iceOptions) {\n pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n .indexOf('trickle') >= 0;\n } else {\n pc.canTrickleIceCandidates = false;\n }\n\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var lines = SDPUtils.splitLines(mediaSection);\n var kind = SDPUtils.getKind(mediaSection);\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n var protocol = lines[0].substr(2).split(' ')[2];\n\n var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n // Reject datachannels which are not implemented yet.\n if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n protocol === 'UDP/DTLS/SCTP'))) {\n // TODO: this is dangerous in the case where a non-rejected m-line\n // becomes rejected.\n pc.transceivers[sdpMLineIndex] = {\n mid: mid,\n kind: kind,\n protocol: protocol,\n rejected: true\n };\n return;\n }\n\n if (!rejected && pc.transceivers[sdpMLineIndex] &&\n pc.transceivers[sdpMLineIndex].rejected) {\n // recycle a rejected transceiver.\n pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n }\n\n var transceiver;\n var iceGatherer;\n var iceTransport;\n var dtlsTransport;\n var rtpReceiver;\n var sendEncodingParameters;\n var recvEncodingParameters;\n var localCapabilities;\n\n var track;\n // FIXME: ensure the mediaSection has rtcp-mux set.\n var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n var remoteIceParameters;\n var remoteDtlsParameters;\n if (!rejected) {\n remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters.role = 'client';\n }\n recvEncodingParameters =\n SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n var isComplete = SDPUtils.matchPrefix(mediaSection,\n 'a=end-of-candidates', sessionpart).length > 0;\n var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n .map(function(cand) {\n return SDPUtils.parseCandidate(cand);\n })\n .filter(function(cand) {\n return cand.component === 1;\n });\n\n // Check if we can use BUNDLE and dispose transports.\n if ((description.type === 'offer' || description.type === 'answer') &&\n !rejected && usingBundle && sdpMLineIndex > 0 &&\n pc.transceivers[sdpMLineIndex]) {\n pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n pc.transceivers[sdpMLineIndex].iceGatherer =\n pc.transceivers[0].iceGatherer;\n pc.transceivers[sdpMLineIndex].iceTransport =\n pc.transceivers[0].iceTransport;\n pc.transceivers[sdpMLineIndex].dtlsTransport =\n pc.transceivers[0].dtlsTransport;\n if (pc.transceivers[sdpMLineIndex].rtpSender) {\n pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n }\n if (description.type === 'offer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex] ||\n pc._createTransceiver(kind);\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n usingBundle);\n }\n\n if (cands.length && transceiver.iceTransport.state === 'new') {\n if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n transceiver.iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n\n sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 2) * 1001\n }];\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n var isNewTrack = false;\n if (direction === 'sendrecv' || direction === 'sendonly') {\n isNewTrack = !transceiver.rtpReceiver;\n rtpReceiver = transceiver.rtpReceiver ||\n new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n if (isNewTrack) {\n var stream;\n track = rtpReceiver.track;\n // FIXME: does not work with Plan B.\n if (remoteMsid && remoteMsid.stream === '-') {\n // no-op. a stream id of '-' means: no associated stream.\n } else if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n Object.defineProperty(streams[remoteMsid.stream], 'id', {\n get: function() {\n return remoteMsid.stream;\n }\n });\n }\n Object.defineProperty(track, 'id', {\n get: function() {\n return remoteMsid.track;\n }\n });\n stream = streams[remoteMsid.stream];\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n stream = streams.default;\n }\n if (stream) {\n addTrackToStreamAndFireEvent(track, stream);\n transceiver.associatedRemoteMediaStreams.push(stream);\n }\n receiverList.push([track, rtpReceiver, stream]);\n }\n } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n var nativeTrack = s.getTracks().find(function(t) {\n return t.id === transceiver.rtpReceiver.track.id;\n });\n if (nativeTrack) {\n removeTrackFromStreamAndFireEvent(nativeTrack, s);\n }\n });\n transceiver.associatedRemoteMediaStreams = [];\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.remoteCapabilities = remoteCapabilities;\n transceiver.rtpReceiver = rtpReceiver;\n transceiver.rtcpParameters = rtcpParameters;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n transceiver.recvEncodingParameters = recvEncodingParameters;\n\n // Start the RTCRtpReceiver now. The RTPSender is started in\n // setLocalDescription.\n pc._transceive(pc.transceivers[sdpMLineIndex],\n false,\n isNewTrack);\n } else if (description.type === 'answer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex];\n iceGatherer = transceiver.iceGatherer;\n iceTransport = transceiver.iceTransport;\n dtlsTransport = transceiver.dtlsTransport;\n rtpReceiver = transceiver.rtpReceiver;\n sendEncodingParameters = transceiver.sendEncodingParameters;\n localCapabilities = transceiver.localCapabilities;\n\n pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n recvEncodingParameters;\n pc.transceivers[sdpMLineIndex].remoteCapabilities =\n remoteCapabilities;\n pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n if (cands.length && iceTransport.state === 'new') {\n if ((isIceLite || isComplete) &&\n (!usingBundle || sdpMLineIndex === 0)) {\n iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n if (!usingBundle || sdpMLineIndex === 0) {\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n 'controlling');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // If the offer contained RTX but the answer did not,\n // remove RTX from sendEncodingParameters.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n pc._transceive(transceiver,\n direction === 'sendrecv' || direction === 'recvonly',\n direction === 'sendrecv' || direction === 'sendonly');\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n if (rtpReceiver &&\n (direction === 'sendrecv' || direction === 'sendonly')) {\n track = rtpReceiver.track;\n if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams.default);\n receiverList.push([track, rtpReceiver, streams.default]);\n }\n } else {\n // FIXME: actually the receiver should be created later.\n delete transceiver.rtpReceiver;\n }\n }\n });\n\n if (pc._dtlsRole === undefined) {\n pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n }\n\n pc._remoteDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-remote-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n Object.keys(streams).forEach(function(sid) {\n var stream = streams[sid];\n if (stream.getTracks().length) {\n if (pc.remoteStreams.indexOf(stream) === -1) {\n pc.remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n window.setTimeout(function() {\n pc._dispatchEvent('addstream', event);\n });\n }\n\n receiverList.forEach(function(item) {\n var track = item[0];\n var receiver = item[1];\n if (stream.id !== item[2].id) {\n return;\n }\n fireAddTrack(pc, track, receiver, [stream]);\n });\n }\n });\n receiverList.forEach(function(item) {\n if (item[2]) {\n return;\n }\n fireAddTrack(pc, item[0], item[1], []);\n });\n\n // check whether addIceCandidate({}) was called within four seconds after\n // setRemoteDescription.\n window.setTimeout(function() {\n if (!(pc && pc.transceivers)) {\n return;\n }\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport &&\n transceiver.iceTransport.state === 'new' &&\n transceiver.iceTransport.getRemoteCandidates().length > 0) {\n console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n 'an end-of-candidates notification');\n transceiver.iceTransport.addRemoteCandidate({});\n }\n });\n }, 4000);\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.close = function() {\n this.transceivers.forEach(function(transceiver) {\n /* not yet\n if (transceiver.iceGatherer) {\n transceiver.iceGatherer.close();\n }\n */\n if (transceiver.iceTransport) {\n transceiver.iceTransport.stop();\n }\n if (transceiver.dtlsTransport) {\n transceiver.dtlsTransport.stop();\n }\n if (transceiver.rtpSender) {\n transceiver.rtpSender.stop();\n }\n if (transceiver.rtpReceiver) {\n transceiver.rtpReceiver.stop();\n }\n });\n // FIXME: clean up tracks, local streams, remote streams, etc\n this._isClosed = true;\n this._updateSignalingState('closed');\n };\n\n // Update the signaling state.\n RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n this.signalingState = newState;\n var event = new Event('signalingstatechange');\n this._dispatchEvent('signalingstatechange', event);\n };\n\n // Determine whether to fire the negotiationneeded event.\n RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n var pc = this;\n if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n return;\n }\n this.needNegotiation = true;\n window.setTimeout(function() {\n if (pc.needNegotiation) {\n pc.needNegotiation = false;\n var event = new Event('negotiationneeded');\n pc._dispatchEvent('negotiationneeded', event);\n }\n }, 0);\n };\n\n // Update the ice connection state.\n RTCPeerConnection.prototype._updateIceConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n checking: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n }\n });\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.checking > 0) {\n newState = 'checking';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n } else if (states.completed > 0) {\n newState = 'completed';\n }\n\n if (newState !== this.iceConnectionState) {\n this.iceConnectionState = newState;\n var event = new Event('iceconnectionstatechange');\n this._dispatchEvent('iceconnectionstatechange', event);\n }\n };\n\n // Update the connection state.\n RTCPeerConnection.prototype._updateConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n connecting: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && transceiver.dtlsTransport &&\n !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n states[transceiver.dtlsTransport.state]++;\n }\n });\n // ICETransport.completed and connected are the same for this purpose.\n states.connected += states.completed;\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.connecting > 0) {\n newState = 'connecting';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n }\n\n if (newState !== this.connectionState) {\n this.connectionState = newState;\n var event = new Event('connectionstatechange');\n this._dispatchEvent('connectionstatechange', event);\n }\n };\n\n RTCPeerConnection.prototype.createOffer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createOffer after close'));\n }\n\n var numAudioTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'audio';\n }).length;\n var numVideoTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'video';\n }).length;\n\n // Determine number of audio and video tracks we need to send/recv.\n var offerOptions = arguments[0];\n if (offerOptions) {\n // Reject Chrome legacy constraints.\n if (offerOptions.mandatory || offerOptions.optional) {\n throw new TypeError(\n 'Legacy mandatory/optional constraints not supported.');\n }\n if (offerOptions.offerToReceiveAudio !== undefined) {\n if (offerOptions.offerToReceiveAudio === true) {\n numAudioTracks = 1;\n } else if (offerOptions.offerToReceiveAudio === false) {\n numAudioTracks = 0;\n } else {\n numAudioTracks = offerOptions.offerToReceiveAudio;\n }\n }\n if (offerOptions.offerToReceiveVideo !== undefined) {\n if (offerOptions.offerToReceiveVideo === true) {\n numVideoTracks = 1;\n } else if (offerOptions.offerToReceiveVideo === false) {\n numVideoTracks = 0;\n } else {\n numVideoTracks = offerOptions.offerToReceiveVideo;\n }\n }\n }\n\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.kind === 'audio') {\n numAudioTracks--;\n if (numAudioTracks < 0) {\n transceiver.wantReceive = false;\n }\n } else if (transceiver.kind === 'video') {\n numVideoTracks--;\n if (numVideoTracks < 0) {\n transceiver.wantReceive = false;\n }\n }\n });\n\n // Create M-lines for recvonly streams.\n while (numAudioTracks > 0 || numVideoTracks > 0) {\n if (numAudioTracks > 0) {\n pc._createTransceiver('audio');\n numAudioTracks--;\n }\n if (numVideoTracks > 0) {\n pc._createTransceiver('video');\n numVideoTracks--;\n }\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n // For each track, create an ice gatherer, ice transport,\n // dtls transport, potentially rtpsender and rtpreceiver.\n var track = transceiver.track;\n var kind = transceiver.kind;\n var mid = transceiver.mid || SDPUtils.generateIdentifier();\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n pc.usingBundle);\n }\n\n var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n localCapabilities.codecs.forEach(function(codec) {\n // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n // by adding level-asymmetry-allowed=1\n if (codec.name === 'H264' &&\n codec.parameters['level-asymmetry-allowed'] === undefined) {\n codec.parameters['level-asymmetry-allowed'] = '1';\n }\n\n // for subsequent offers, we might have to re-use the payload\n // type of the last offer.\n if (transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.codecs) {\n transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n codec.clockRate === remoteCodec.clockRate) {\n codec.preferredPayloadType = remoteCodec.payloadType;\n }\n });\n }\n });\n localCapabilities.headerExtensions.forEach(function(hdrExt) {\n var remoteExtensions = transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.headerExtensions || [];\n remoteExtensions.forEach(function(rHdrExt) {\n if (hdrExt.uri === rHdrExt.uri) {\n hdrExt.id = rHdrExt.id;\n }\n });\n });\n\n // generate an ssrc now, to be used later in rtpSender.send\n var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 1) * 1001\n }];\n if (track) {\n // add RTX\n if (edgeVersion >= 15019 && kind === 'video' &&\n !sendEncodingParameters[0].rtx) {\n sendEncodingParameters[0].rtx = {\n ssrc: sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n\n if (transceiver.wantReceive) {\n transceiver.rtpReceiver = new window.RTCRtpReceiver(\n transceiver.dtlsTransport, kind);\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n });\n\n // always offer BUNDLE and dispose on return if not supported.\n if (pc._config.bundlePolicy !== 'max-compat') {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n 'offer', transceiver.stream, pc._dtlsRole);\n sdp += 'a=rtcp-rsize\\r\\n';\n\n if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n (sdpMLineIndex === 0 || !pc.usingBundle)) {\n transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n cand.component = 1;\n sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n });\n\n if (transceiver.iceGatherer.state === 'completed') {\n sdp += 'a=end-of-candidates\\r\\n';\n }\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'offer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.createAnswer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer after close'));\n }\n\n if (!(pc.signalingState === 'have-remote-offer' ||\n pc.signalingState === 'have-local-pranswer')) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer in signalingState ' + pc.signalingState));\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n if (pc.usingBundle) {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n var mediaSectionsInOffer = SDPUtils.getMediaSections(\n pc._remoteDescription.sdp).length;\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n return;\n }\n if (transceiver.rejected) {\n if (transceiver.kind === 'application') {\n if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n } else {\n sdp += 'm=application 0 ' + transceiver.protocol +\n ' webrtc-datachannel\\r\\n';\n }\n } else if (transceiver.kind === 'audio') {\n sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n 'a=rtpmap:0 PCMU/8000\\r\\n';\n } else if (transceiver.kind === 'video') {\n sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n 'a=rtpmap:120 VP8/90000\\r\\n';\n }\n sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n 'a=inactive\\r\\n' +\n 'a=mid:' + transceiver.mid + '\\r\\n';\n return;\n }\n\n // FIXME: look at direction.\n if (transceiver.stream) {\n var localTrack;\n if (transceiver.kind === 'audio') {\n localTrack = transceiver.stream.getAudioTracks()[0];\n } else if (transceiver.kind === 'video') {\n localTrack = transceiver.stream.getVideoTracks()[0];\n }\n if (localTrack) {\n // add RTX\n if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n !transceiver.sendEncodingParameters[0].rtx) {\n transceiver.sendEncodingParameters[0].rtx = {\n ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n }\n\n // Calculate intersection of capabilities.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n sdp += writeMediaSection(transceiver, commonCapabilities,\n 'answer', transceiver.stream, pc._dtlsRole);\n if (transceiver.rtcpParameters &&\n transceiver.rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'answer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n var pc = this;\n var sections;\n if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n candidate.sdpMid)) {\n return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n }\n\n // TODO: needs to go into ops queue.\n return new Promise(function(resolve, reject) {\n if (!pc._remoteDescription) {\n return reject(makeError('InvalidStateError',\n 'Can not add ICE candidate without a remote description'));\n } else if (!candidate || candidate.candidate === '') {\n for (var j = 0; j < pc.transceivers.length; j++) {\n if (pc.transceivers[j].rejected) {\n continue;\n }\n pc.transceivers[j].iceTransport.addRemoteCandidate({});\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[j] += 'a=end-of-candidates\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n if (pc.usingBundle) {\n break;\n }\n }\n } else {\n var sdpMLineIndex = candidate.sdpMLineIndex;\n if (candidate.sdpMid) {\n for (var i = 0; i < pc.transceivers.length; i++) {\n if (pc.transceivers[i].mid === candidate.sdpMid) {\n sdpMLineIndex = i;\n break;\n }\n }\n }\n var transceiver = pc.transceivers[sdpMLineIndex];\n if (transceiver) {\n if (transceiver.rejected) {\n return resolve();\n }\n var cand = Object.keys(candidate.candidate).length > 0 ?\n SDPUtils.parseCandidate(candidate.candidate) : {};\n // Ignore Chrome's invalid candidates since Edge does not like them.\n if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n return resolve();\n }\n // Ignore RTCP candidates, we assume RTCP-MUX.\n if (cand.component && cand.component !== 1) {\n return resolve();\n }\n // when using bundle, avoid adding candidates to the wrong\n // ice transport. And avoid adding candidates added in the SDP.\n if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n\n // update the remoteDescription.\n var candidateString = candidate.candidate.trim();\n if (candidateString.indexOf('a=') === 0) {\n candidateString = candidateString.substr(2);\n }\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[sdpMLineIndex] += 'a=' +\n (cand.type ? candidateString : 'end-of-candidates')\n + '\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n } else {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n resolve();\n });\n };\n\n RTCPeerConnection.prototype.getStats = function(selector) {\n if (selector && selector instanceof window.MediaStreamTrack) {\n var senderOrReceiver = null;\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.rtpSender &&\n transceiver.rtpSender.track === selector) {\n senderOrReceiver = transceiver.rtpSender;\n } else if (transceiver.rtpReceiver &&\n transceiver.rtpReceiver.track === selector) {\n senderOrReceiver = transceiver.rtpReceiver;\n }\n });\n if (!senderOrReceiver) {\n throw makeError('InvalidAccessError', 'Invalid selector.');\n }\n return senderOrReceiver.getStats();\n }\n\n var promises = [];\n this.transceivers.forEach(function(transceiver) {\n ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n 'dtlsTransport'].forEach(function(method) {\n if (transceiver[method]) {\n promises.push(transceiver[method].getStats());\n }\n });\n });\n return Promise.all(promises).then(function(allStats) {\n var results = new Map();\n allStats.forEach(function(stats) {\n stats.forEach(function(stat) {\n results.set(stat.id, stat);\n });\n });\n return results;\n });\n };\n\n // fix low-level stat names and return Map instead of object.\n var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n 'RTCIceTransport', 'RTCDtlsTransport'];\n ortcObjects.forEach(function(ortcObjectName) {\n var obj = window[ortcObjectName];\n if (obj && obj.prototype && obj.prototype.getStats) {\n var nativeGetstats = obj.prototype.getStats;\n obj.prototype.getStats = function() {\n return nativeGetstats.apply(this)\n .then(function(nativeStats) {\n var mapStats = new Map();\n Object.keys(nativeStats).forEach(function(id) {\n nativeStats[id].type = fixStatsType(nativeStats[id]);\n mapStats.set(id, nativeStats[id]);\n });\n return mapStats;\n });\n };\n }\n });\n\n // legacy callback shims. Should be moved to adapter.js some days.\n var methods = ['createOffer', 'createAnswer'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[0] === 'function' ||\n typeof args[1] === 'function') { // legacy\n return nativeMethod.apply(this, [arguments[2]])\n .then(function(description) {\n if (typeof args[0] === 'function') {\n args[0].apply(null, [description]);\n }\n }, function(error) {\n if (typeof args[1] === 'function') {\n args[1].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function' ||\n typeof args[2] === 'function') { // legacy\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n }, function(error) {\n if (typeof args[2] === 'function') {\n args[2].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // getStats is special. It doesn't have a spec legacy method yet we support\n // getStats(something, cb) without error callbacks.\n ['getStats'].forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function') {\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n return RTCPeerConnection;\n};\n\n},{\"sdp\":17}],17:[function(require,module,exports){\n/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(function(line) {\n return line.trim();\n });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n var parts = blob.split('\\nm=');\n return parts.map(function(part, index) {\n return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(function(line) {\n return line.indexOf(prefix) === 0;\n });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n var parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n var candidate = {\n foundation: parts[0],\n component: parseInt(parts[1], 10),\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7]\n };\n\n for (var i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compability.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag\n candidate[parts[i]] = parts[i + 1];\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n var sdp = [];\n sdp.push(candidate.foundation);\n sdp.push(candidate.component);\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n var type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n payloadType: parseInt(parts.shift(), 10) // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n var channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1]\n };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n var parsed = {};\n var kv;\n var parts = line.substr(line.indexOf(' ') + 1).split(';');\n for (var j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n var line = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n var params = [];\n Object.keys(codec.parameters).forEach(function(param) {\n if (codec.parameters[param]) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' ')\n };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n var lines = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(function(fb) {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n var sp = line.indexOf(' ');\n var parts = {\n ssrc: parseInt(line.substr(7, sp - 7), 10)\n };\n var colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substr(sp + 1, colon - sp - 1);\n parts.value = line.substr(colon + 1);\n } else {\n parts.attribute = line.substr(sp + 1);\n }\n return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n var parts = line.substr(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(function(ssrc) {\n return parseInt(ssrc, 10);\n })\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substr(6);\n }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n var parts = line.substr(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1]\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role.\n // Note2: 'algorithm' is not case sensitive except in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint)\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n var sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(function(fp) {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n var parts = keyParams.substr(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES paramters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substr(12),\n password: pwd.substr(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n var description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: []\n };\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n var pt = mline[i];\n var rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n var codec = SDPUtils.parseRtpMap(rtpmapline);\n var fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp: is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n var sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' UDP/TLS/RTP/SAVPF ';\n sdp += caps.codecs.map(function(codec) {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(function(codec) {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n var maxptime = 0;\n caps.codecs.forEach(function(codec) {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n sdp += 'a=rtcp-mux\\r\\n';\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(function(extension) {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n var encodingParameters = [];\n var description = SDPUtils.parseRtpParameters(mediaSection);\n var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(parts) {\n return parts.attribute === 'cname';\n });\n var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n var secondarySsrc;\n\n var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(function(line) {\n var parts = line.substr(17).split(' ');\n return parts.map(function(part) {\n return parseInt(part, 10);\n });\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(function(codec) {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n var encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10)\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substr(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(function(params) {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n var rtcpParameters = {};\n\n // Gets the first SSRC. Note tha with RTX there might be multiple\n // SSRCs.\n var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(obj) {\n return obj.attribute === 'cname';\n })[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n var parts;\n var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substr(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(msidParts) {\n return msidParts.attribute === 'msid';\n });\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n var mline = SDPUtils.parseMLine(mediaSection);\n var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n var maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substr(12), 10),\n protocol: mline.fmt,\n maxMessageSize: maxMessageSize\n };\n }\n var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0]\n .substr(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize: maxMessageSize\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n var output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n'\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n'\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n var sessionId;\n var version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n var user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.direction) {\n sdp += 'a=' + transceiver.direction + '\\r\\n';\n } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n // spec.\n var msid = 'msid:' + stream.id + ' ' +\n transceiver.rtpSender.track.id + '\\r\\n';\n sdp += 'a=' + msid;\n\n // for Chrome.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n var lines = SDPUtils.splitLines(mediaSection);\n for (var i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substr(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var parts = lines[0].substr(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' ')\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n var parts = line.substr(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5]\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n var lines = SDPUtils.splitLines(blob);\n for (var i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n\n},{}]},{},[1])(1)\n});"],"names":["define","e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","module","adapter","adapterFactory","window","Object","defineProperty","value","_ref","arguments","undefined","options","shimChrome","shimFirefox","shimEdge","shimSafari","logging","utils","log","browserDetails","detectBrowser","commonShim","extractVersion","disableLog","disableWarnings","browser","chromeShim","shimPeerConnection","browserShim","shimGetUserMedia","shimMediaStream","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimGetStats","shimSenderReceiverGetStats","fixNegotiationNeeded","shimRTCIceCandidate","shimConnectionState","shimMaxMessageSize","shimSendThrowTypeError","removeAllowExtmapMixed","firefoxShim","shimRemoveStream","shimSenderGetStats","shimReceiverGetStats","shimRTCDataChannel","shimAddTransceiver","shimCreateOffer","shimCreateAnswer","edgeShim","shimGetDisplayMedia","shimReplaceTrack","safariShim","shimRTCIceServerUrls","shimCreateOfferLegacy","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","_interopRequireWildcard","obj","__esModule","newObj","key","prototype","hasOwnProperty","default","_typeof","Symbol","_typeof2","iterator","constructor","_getusermedia","enumerable","get","_getdisplaymedia","MediaStream","webkitMediaStream","RTCPeerConnection","this","_ontrack","set","removeEventListener","addEventListener","configurable","origSetRemoteDescription","setRemoteDescription","_this","_ontrackpoly","stream","te","receiver","getReceivers","find","track","id","event","Event","transceiver","streams","dispatchEvent","getTracks","forEach","apply","wrapPeerConnectionEvent","shimSenderWithDtmf","pc","dtmf","_dtmf","kind","createDTMFSender","_pc","getSenders","_senders","slice","origAddTrack","addTrack","sender","push","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","_this2","origRemoveStream","removeStream","_this3","RTCRtpSender","origGetSenders","_this4","senders","origGetStats","getStats","_this5","_arguments","Array","selector","onSucc","onErr","fixChromeStats_","response","standardReport","result","report","standardStats","timestamp","type","localcandidate","remotecandidate","names","name","stat","makeMapStats","stats","Map","keys","map","Promise","resolve","reject","then","RTCRtpReceiver","_this6","filterStats","origGetReceivers","_this7","receivers","srcElement","MediaStreamTrack","err","DOMException","shimAddTrackRemoveTrackWithNative","version","origGetLocalStreams","getLocalStreams","_this11","nativeStreams","_reverseStreams","_this12","_streams","newStream","replaceInternalStreamId","description","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","_this13","signalingState","oldStream","method","nativeMethod","methodObj","_defineProperty","_this14","args","desc","origSetLocalDescription","setLocalDescription","origLocalDescription","getOwnPropertyDescriptor","_this15","streamid","webkitRTCPeerConnection","RTCIceCandidate","nativeAddIceCandidate","addIceCandidate","candidate","target","writable","_this8","_shimmedLocalStreams","streamId","_this9","existingSenders","newSenders","filter","newSender","concat","_this10","getSourceId","navigator","mediaDevices","console","error","getDisplayMedia","constraints","sourceId","widthSpecified","video","width","heightSpecified","height","frameRateSpecified","frameRate","mandatory","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","getUserMedia","constraintsToChrome_","c","optional","cc","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","oc","mix","advanced","shimConstraints_","func","JSON","parse","stringify","audio","remap","b","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","devices","dev","d","some","match","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","toString","onSuccess","onError","webkitGetUserMedia","bind","origGetUserMedia","cs","getAudioTracks","getVideoTracks","stop","NativeRTCIceCandidate","substr","nativeCandidate","parsedCandidate","_sdp2","parseCandidate","augmentedCandidate","assign","toJSON","sdpMid","sdpMLineIndex","usernameFragment","_sctp","sctpInDescription","sections","splitSections","shift","mediaSection","mLine","parseMLine","protocol","getRemoteFirefoxVersion","parseInt","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","matchPrefix","getConfiguration","sdpSemantics","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","Math","sctp","wrapDcSend","dc","origDataChannelSend","send","data","size","byteLength","readyState","TypeError","origCreateDataChannel","createDataChannel","dataChannel","channel","proto","completed","checking","iceConnectionState","_onconnectionstatechange","cb","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","nativeSRD","split","line","trim","join","_sdp","RTCIceGatherer","origMSTEnabled","ev","enabled","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","_rtcpeerconnectionShim2","config","iceServers","_filtericeservers","filterIceServers","replaceTrack","setTrack","_rtcpeerconnectionShim","edgeVersion","hasTurn","server","urls","url","deprecated","isString","validTurn","startsWith","catch","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","nativeGetStats","DataChannel","RTCDataChannel","origAddTransceiver","addTransceiver","setParametersPromises","initParameters","shouldPerformCheck","sendEncodings","encodingParam","test","rid","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","params","getParameters","encodings","setParameters","origCreateOffer","createOffer","_arguments2","all","finally","origCreateAnswer","createAnswer","_arguments3","preferredMediaSource","mediaSource","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","_localStreams","_addTrack","index","tracks","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","successCallback","failureCallback","promise","withCallback","_getUserMedia","shimConstraints","errcb","OrigPeerConnection","pcConfig","pcConstraints","newIceServers","generateCertificate","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","direction","setDirection","offerToReceiveVideo","videoTransceiver","compactObject","eventNameToWrap","wrapper","nativeAddEventListener","nativeEventName","wrappedCallback","modifiedEvent","_eventMap","nativeRemoveEventListener","unwrappedCb","bool","logDisabled_","deprecationWarnings_","oldMethod","newMethod","warn","mozGetUserMedia","userAgent","isSecureContext","supportsUnifiedPlan","RTCRtpTransceiver","isObject","reduce","accumulator","isObj","isEmptyObject","walkStats","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","uastring","expr","pos","val","base","resultSet","has","endsWith","SDPUtils","writeMediaSection","caps","dtlsRole","writeRtpDescription","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","_initialTrackId","msid","sendEncodingParameters","ssrc","rtx","localCName","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","clockRate","numChannels","rtcpFeedback","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","offer","answer","maybeAddCandidate","iceTransport","alreadyAdded","getRemoteCandidates","remoteCandidate","foundation","ip","port","priority","addRemoteCandidate","makeError","NotSupportedError","InvalidAccessError","OperationError","addTrackToStreamAndFireEvent","MediaStreamTrackEvent","fireAddTrack","trackEvent","setTimeout","_dispatchEvent","_eventTarget","document","createDocumentFragment","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","_iceGatherers","iceCandidatePoolSize","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","_emitGatheringStateChange","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","alreadyExists","_maybeFireNegotiationNeeded","clonedStream","clone","clonedTrack","_createIceGatherer","bufferedCandidateEvents","bufferCandidates","end","state","_gather","onlocalcandidate","evt","cand","component","ufrag","serializedCandidate","writeCandidate","getMediaSections","getDescription","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","recv","rtcp","cname","compound","rtcpParameters","p","receive","sessionpart","parseRtpParameters","isIceLite","isRejected","rejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","receiverList","iceOptions","lines","splitLines","getKind","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","getCapabilities","codec","isNewTrack","nativeTrack","removeTrackFromStreamAndFireEvent","sid","item","close","newState","states","new","closed","connected","disconnected","failed","connecting","numAudioTracks","numVideoTracks","writeSessionBoilerplate","remoteCodec","hdrExt","rHdrExt","getLocalCandidates","mediaSectionsInOffer","localTrack","reducedSize","candidateString","senderOrReceiver","promises","allStats","results","ortcObjectName","nativeGetstats","nativeStats","mapStats","fixStatsType","methods","random","blob","parts","part","substring","address","relatedAddress","relatedPort","tcpType","parseIceOptions","parseRtpMap","parsed","channels","writeRtpMap","parseExtmap","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","param","parseRtcpFb","writeRtcpFb","parseSsrcMedia","sp","colon","attribute","parseSsrcGroup","semantics","ssrcs","parseFingerprint","algorithm","fingerprints","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","pwd","password","mline","rtpmapline","fmtps","maxptime","extension","encodingParameters","secondarySsrc","hasRed","hasUlpfec","primarySsrc","flows","encParam","codecPayloadType","fec","mechanism","bandwidth","maxBitrate","remoteSsrc","rsize","mux","spec","planB","msidParts","parseSctpDescription","maxSizeLine","isNaN","sctpPort","fmt","writeSctpDescription","media","output","sessId","sessVer","sessUser","parseOLine","username","sessionId","sessionVersion","netType","addressType","isValidSDP"],"mappings":"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"} \ No newline at end of file diff --git a/lib/amd/build/addblockmodal.min.js b/lib/amd/build/addblockmodal.min.js index fffc4fd6872..fdec2b7f1c7 100644 --- a/lib/amd/build/addblockmodal.min.js +++ b/lib/amd/build/addblockmodal.min.js @@ -1,3 +1,3 @@ -define("core/addblockmodal",["exports","core/modal_factory","core/templates","core/str","core/ajax"],(function(_exports,_modal_factory,_templates,_str,_ajax){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg),value=info.value}catch(error){return void reject(error)}info.done?resolve(value):Promise.resolve(value).then(_next,_throw)}function _asyncToGenerator(fn){return function(){var self=this,args=arguments;return new Promise((function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(void 0)}))}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_modal_factory=_interopRequireDefault(_modal_factory),_templates=_interopRequireDefault(_templates),_ajax=_interopRequireDefault(_ajax);var _ref,_ref2,SELECTORS_ADD_BLOCK='[data-key="addblock"]',addBlockModal=null,registerListenerEvents=function(pageType,pageLayout,addBlockUrl,subPage){document.addEventListener("click",(function(e){e.target.closest(SELECTORS_ADD_BLOCK)&&(e.preventDefault(),addBlockModal?addBlockModal.show():buildAddBlockModal().then((function(modal){addBlockModal=modal;var modalBody=renderBlocks(addBlockUrl,pageType,pageLayout,subPage);return modal.setBody(modalBody),modal.show(),modalBody})).catch((function(){addBlockModal.destroy(),addBlockModal=null})))}))},buildAddBlockModal=function(){return _modal_factory.default.create({type:_modal_factory.default.types.CANCEL,title:(0,_str.get_string)("addblock")})},renderBlocks=(_ref=_asyncToGenerator(regeneratorRuntime.mark((function _callee(addBlockUrl,pageType,pageLayout,subPage){var blocks;return regeneratorRuntime.wrap((function(_context){for(;;)switch(_context.prev=_context.next){case 0:return _context.next=2,getAddableBlocks(pageType,pageLayout,subPage);case 2:return blocks=_context.sent,_context.abrupt("return",_templates.default.render("core/add_block_body",{blocks:blocks,url:addBlockUrl}));case 4:case"end":return _context.stop()}}),_callee)}))),function(_x,_x2,_x3,_x4){return _ref.apply(this,arguments)}),getAddableBlocks=(_ref2=_asyncToGenerator(regeneratorRuntime.mark((function _callee2(pageType,pageLayout,subPage){var request;return regeneratorRuntime.wrap((function(_context2){for(;;)switch(_context2.prev=_context2.next){case 0:return request={methodname:"core_block_fetch_addable_blocks",args:{pagecontextid:M.cfg.contextid,pagetype:pageType,pagelayout:pageLayout,subpage:subPage}},_context2.abrupt("return",_ajax.default.call([request])[0]);case 2:case"end":return _context2.stop()}}),_callee2)}))),function(_x5,_x6,_x7){return _ref2.apply(this,arguments)});_exports.init=function(pageType,pageLayout,addBlockUrl){var subPage=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";registerListenerEvents(pageType,pageLayout,addBlockUrl,subPage)}})); +define("core/addblockmodal",["exports","core/modal_factory","core/templates","core/str","core/ajax"],(function(_exports,_modal_factory,_templates,_str,_ajax){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg),value=info.value}catch(error){return void reject(error)}info.done?resolve(value):Promise.resolve(value).then(_next,_throw)}function _asyncToGenerator(fn){return function(){var self=this,args=arguments;return new Promise((function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(void 0)}))}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_modal_factory=_interopRequireDefault(_modal_factory),_templates=_interopRequireDefault(_templates),_ajax=_interopRequireDefault(_ajax);var _ref,_ref2,SELECTORS_ADD_BLOCK='[data-key="addblock"]',addBlockModal=null,registerListenerEvents=function(pageType,pageLayout,addBlockUrl,subPage){document.addEventListener("click",(function(e){e.target.closest(SELECTORS_ADD_BLOCK)&&(e.preventDefault(),addBlockModal?addBlockModal.show():buildAddBlockModal().then((function(modal){addBlockModal=modal;var modalBody=renderBlocks(addBlockUrl,pageType,pageLayout,subPage);return modal.setBody(modalBody),modal.show(),modalBody})).catch((function(){addBlockModal.destroy(),addBlockModal=null})))}))},buildAddBlockModal=function(){return _modal_factory.default.create({type:_modal_factory.default.types.CANCEL,title:(0,_str.get_string)("addblock")})},renderBlocks=(_ref=_asyncToGenerator(regeneratorRuntime.mark((function _callee(addBlockUrl,pageType,pageLayout,subPage){var blocks;return regeneratorRuntime.wrap((function(_context){for(;;)switch(_context.prev=_context.next){case 0:return _context.next=2,getAddableBlocks(pageType,pageLayout,subPage);case 2:return blocks=_context.sent,_context.abrupt("return",_templates.default.render("core/add_block_body",{blocks:blocks,url:addBlockUrl}));case 4:case"end":return _context.stop()}}),_callee)}))),function(_x,_x2,_x3,_x4){return _ref.apply(this,arguments)}),getAddableBlocks=(_ref2=_asyncToGenerator(regeneratorRuntime.mark((function _callee2(pageType,pageLayout,subPage){var request;return regeneratorRuntime.wrap((function(_context2){for(;;)switch(_context2.prev=_context2.next){case 0:return request={methodname:"core_block_fetch_addable_blocks",args:{pagecontextid:M.cfg.contextid,pagetype:pageType,pagelayout:pageLayout,subpage:subPage}},_context2.abrupt("return",_ajax.default.call([request])[0]);case 2:case"end":return _context2.stop()}}),_callee2)}))),function(_x5,_x6,_x7){return _ref2.apply(this,arguments)});_exports.init=function(pageType,pageLayout,addBlockUrl){registerListenerEvents(pageType,pageLayout,addBlockUrl,arguments.length>3&&void 0!==arguments[3]?arguments[3]:"")}})); //# sourceMappingURL=addblockmodal.min.js.map \ No newline at end of file diff --git a/lib/amd/build/addblockmodal.min.js.map b/lib/amd/build/addblockmodal.min.js.map index bcf4fb60dfb..351f9ea25eb 100644 --- a/lib/amd/build/addblockmodal.min.js.map +++ b/lib/amd/build/addblockmodal.min.js.map @@ -1 +1 @@ -{"version":3,"file":"addblockmodal.min.js","sources":["../src/addblockmodal.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 * Show an add block modal instead of doing it on a separate page.\n *\n * @module core/addblockmodal\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalFactory from 'core/modal_factory';\nimport Templates from 'core/templates';\nimport {get_string as getString} from 'core/str';\nimport Ajax from 'core/ajax';\n\nconst SELECTORS = {\n ADD_BLOCK: '[data-key=\"addblock\"]'\n};\n\nlet addBlockModal = null;\n\n/**\n * Register related event listeners.\n *\n * @method registerListenerEvents\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String} addBlockUrl The add block URL\n * @param {String} subPage The subpage identifier\n */\nconst registerListenerEvents = (pageType, pageLayout, addBlockUrl, subPage) => {\n document.addEventListener('click', e => {\n\n if (e.target.closest(SELECTORS.ADD_BLOCK)) {\n e.preventDefault();\n\n if (addBlockModal) { // The 'add block' modal has been already created.\n // Display the 'add block' modal.\n addBlockModal.show();\n } else {\n buildAddBlockModal()\n .then(modal => {\n addBlockModal = modal;\n const modalBody = renderBlocks(addBlockUrl, pageType, pageLayout, subPage);\n modal.setBody(modalBody);\n modal.show();\n\n return modalBody;\n })\n .catch(() => {\n addBlockModal.destroy();\n // Unset the addBlockModal in case this is a transient error and it goes away on a relaunch.\n addBlockModal = null;\n });\n }\n }\n });\n};\n\n/**\n * Method that creates the 'add block' modal.\n *\n * @method buildAddBlockModal\n * @returns {Promise} The modal promise (modal's body will be rendered later).\n */\nconst buildAddBlockModal = () => {\n return ModalFactory.create({\n type: ModalFactory.types.CANCEL,\n title: getString('addblock')\n });\n};\n\n/**\n * Method that renders the list of available blocks.\n *\n * @method renderBlocks\n * @param {String} addBlockUrl The add block URL\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String} subPage The subpage identifier\n * @return {Promise}\n */\nconst renderBlocks = async(addBlockUrl, pageType, pageLayout, subPage) => {\n // Fetch all addable blocks in the given page.\n const blocks = await getAddableBlocks(pageType, pageLayout, subPage);\n\n return Templates.render('core/add_block_body', {\n blocks: blocks,\n url: addBlockUrl\n });\n};\n\n/**\n * Method that fetches all addable blocks in a given page.\n *\n * @method getAddableBlocks\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String} subPage The subpage identifier\n * @return {Promise}\n */\nconst getAddableBlocks = async(pageType, pageLayout, subPage) => {\n const request = {\n methodname: 'core_block_fetch_addable_blocks',\n args: {\n pagecontextid: M.cfg.contextid,\n pagetype: pageType,\n pagelayout: pageLayout,\n subpage: subPage,\n },\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Set up the actions.\n *\n * @method init\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String} addBlockUrl The add block URL\n * @param {String} subPage The subpage identifier\n */\nexport const init = (pageType, pageLayout, addBlockUrl, subPage = '') => {\n registerListenerEvents(pageType, pageLayout, addBlockUrl, subPage);\n};\n"],"names":["SELECTORS","addBlockModal","registerListenerEvents","pageType","pageLayout","addBlockUrl","subPage","document","addEventListener","e","target","closest","preventDefault","show","buildAddBlockModal","then","modal","modalBody","renderBlocks","setBody","catch","destroy","ModalFactory","create","type","types","CANCEL","title","getAddableBlocks","blocks","Templates","render","url","request","methodname","args","pagecontextid","M","cfg","contextid","pagetype","pagelayout","subpage","Ajax","call"],"mappings":"ogCA4BMA,oBACS,wBAGXC,cAAgB,KAWdC,uBAAyB,SAACC,SAAUC,WAAYC,YAAaC,SAC/DC,SAASC,iBAAiB,SAAS,SAAAC,GAE3BA,EAAEC,OAAOC,QAAQX,uBACjBS,EAAEG,iBAEEX,cAEAA,cAAcY,OAEdC,qBACCC,MAAK,SAAAC,OACFf,cAAgBe,UACVC,UAAYC,aAAab,YAAaF,SAAUC,WAAYE,gBAClEU,MAAMG,QAAQF,WACdD,MAAMH,OAECI,aAEVG,OAAM,WACHnB,cAAcoB,UAEdpB,cAAgB,aAa9Ba,mBAAqB,kBAChBQ,uBAAaC,OAAO,CACvBC,KAAMF,uBAAaG,MAAMC,OACzBC,OAAO,mBAAU,eAcnBT,8DAAe,iBAAMb,YAAaF,SAAUC,WAAYE,gJAErCsB,iBAAiBzB,SAAUC,WAAYE,uBAAtDuB,8CAECC,mBAAUC,OAAO,sBAAuB,CAC3CF,OAAQA,OACRG,IAAK3B,oIAaPuB,mEAAmB,kBAAMzB,SAAUC,WAAYE,oIAC3C2B,QAAU,CACZC,WAAY,kCACZC,KAAM,CACFC,cAAeC,EAAEC,IAAIC,UACrBC,SAAUrC,SACVsC,WAAYrC,WACZsC,QAASpC,oCAIVqC,cAAKC,KAAK,CAACX,UAAU,uIAYZ,SAAC9B,SAAUC,WAAYC,iBAAaC,+DAAU,GAC9DJ,uBAAuBC,SAAUC,WAAYC,YAAaC"} \ No newline at end of file +{"version":3,"file":"addblockmodal.min.js","sources":["../src/addblockmodal.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 * Show an add block modal instead of doing it on a separate page.\n *\n * @module core/addblockmodal\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalFactory from 'core/modal_factory';\nimport Templates from 'core/templates';\nimport {get_string as getString} from 'core/str';\nimport Ajax from 'core/ajax';\n\nconst SELECTORS = {\n ADD_BLOCK: '[data-key=\"addblock\"]'\n};\n\nlet addBlockModal = null;\n\n/**\n * Register related event listeners.\n *\n * @method registerListenerEvents\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String} addBlockUrl The add block URL\n * @param {String} subPage The subpage identifier\n */\nconst registerListenerEvents = (pageType, pageLayout, addBlockUrl, subPage) => {\n document.addEventListener('click', e => {\n\n if (e.target.closest(SELECTORS.ADD_BLOCK)) {\n e.preventDefault();\n\n if (addBlockModal) { // The 'add block' modal has been already created.\n // Display the 'add block' modal.\n addBlockModal.show();\n } else {\n buildAddBlockModal()\n .then(modal => {\n addBlockModal = modal;\n const modalBody = renderBlocks(addBlockUrl, pageType, pageLayout, subPage);\n modal.setBody(modalBody);\n modal.show();\n\n return modalBody;\n })\n .catch(() => {\n addBlockModal.destroy();\n // Unset the addBlockModal in case this is a transient error and it goes away on a relaunch.\n addBlockModal = null;\n });\n }\n }\n });\n};\n\n/**\n * Method that creates the 'add block' modal.\n *\n * @method buildAddBlockModal\n * @returns {Promise} The modal promise (modal's body will be rendered later).\n */\nconst buildAddBlockModal = () => {\n return ModalFactory.create({\n type: ModalFactory.types.CANCEL,\n title: getString('addblock')\n });\n};\n\n/**\n * Method that renders the list of available blocks.\n *\n * @method renderBlocks\n * @param {String} addBlockUrl The add block URL\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String} subPage The subpage identifier\n * @return {Promise}\n */\nconst renderBlocks = async(addBlockUrl, pageType, pageLayout, subPage) => {\n // Fetch all addable blocks in the given page.\n const blocks = await getAddableBlocks(pageType, pageLayout, subPage);\n\n return Templates.render('core/add_block_body', {\n blocks: blocks,\n url: addBlockUrl\n });\n};\n\n/**\n * Method that fetches all addable blocks in a given page.\n *\n * @method getAddableBlocks\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String} subPage The subpage identifier\n * @return {Promise}\n */\nconst getAddableBlocks = async(pageType, pageLayout, subPage) => {\n const request = {\n methodname: 'core_block_fetch_addable_blocks',\n args: {\n pagecontextid: M.cfg.contextid,\n pagetype: pageType,\n pagelayout: pageLayout,\n subpage: subPage,\n },\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Set up the actions.\n *\n * @method init\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String} addBlockUrl The add block URL\n * @param {String} subPage The subpage identifier\n */\nexport const init = (pageType, pageLayout, addBlockUrl, subPage = '') => {\n registerListenerEvents(pageType, pageLayout, addBlockUrl, subPage);\n};\n"],"names":["_modal_factory","_interopRequireDefault","_templates","_ajax","_ref","_ref2","SELECTORS","addBlockModal","registerListenerEvents","pageType","pageLayout","addBlockUrl","subPage","document","addEventListener","e","target","closest","preventDefault","show","buildAddBlockModal","then","modal","modalBody","renderBlocks","setBody","catch","destroy","ModalFactory","create","type","types","CANCEL","title","_str","get_string","_asyncToGenerator","regeneratorRuntime","mark","blocks","wrap","_context","prev","next","getAddableBlocks","sent","abrupt","Templates","render","url","stop","_callee","_x","_x2","_x3","_x4","apply","this","arguments","request","_context2","Ajax","methodname","args","pagecontextid","M","cfg","contextid","pagetype","pagelayout","subpage","call","_callee2","_x5","_x6","_x7"],"mappings":"62BAuBAA,eAAAC,uBAAAD,gBACAE,WAAAD,uBAAAC,YAEAC,MAAAF,uBAAAE,OAEA,IAmEkBC,KAmBIC,MAtFhBC,oBACS,wBAGXC,cAAgB,KAWdC,uBAAyB,SAACC,SAAUC,WAAYC,YAAaC,SAC/DC,SAASC,iBAAiB,SAAS,SAAAC,GAE3BA,EAAEC,OAAOC,QAAQX,uBACjBS,EAAEG,iBAEEX,cAEAA,cAAcY,OAEdC,qBACCC,MAAK,SAAAC,OACFf,cAAgBe,MACVC,IAAAA,UAAYC,aAAab,YAAaF,SAAUC,WAAYE,SAIlE,OAHAU,MAAMG,QAAQF,WACdD,MAAMH,OAECI,SACV,IACAG,OAAM,WACHnB,cAAcoB,UAEdpB,cAAgB,IACnB,IAGZ,GACJ,EAQKa,mBAAqB,WAChBQ,OAAAA,eAAAA,QAAaC,OAAO,CACvBC,KAAMF,eAAaG,QAAAA,MAAMC,OACzBC,OAAO,EAAAC,KAAAC,YAAU,aAExB,EAYKX,cAAYpB,KAAAgC,kBAAAC,mBAAAC,MAAG,iBAAM3B,YAAaF,SAAUC,WAAYE,SAAzC,IAAA2B,OAAA,OAAAF,mBAAAG,MAAA,SAAAC,UAAA,OAAA,OAAAA,SAAAC,KAAAD,SAAAE,MAAA,KAAA,EAAA,OAAAF,SAAAE,KAAA,EAEIC,iBAAiBnC,SAAUC,WAAYE,SAF3C,KAAA,EAAA,OAEX2B,OAFWE,SAAAI,KAAAJ,SAAAK,OAAA,SAIVC,WAAUC,QAAAA,OAAO,sBAAuB,CAC3CT,OAAQA,OACRU,IAAKtC,eANQ,KAAA,EAAA,IAAA,MAAA,OAAA8B,SAAAS,OAAA,GAAAC,QAAH,KAAA,SAAAC,GAAAC,IAAAC,IAAAC,KAAA,OAAAnD,KAAAoD,MAAAC,KAAAC,UAAA,GAmBZd,kBAAgBvC,MAAA+B,kBAAAC,mBAAAC,MAAG,SAAM7B,SAAAA,SAAUC,WAAYE,SAA5B,IAAA+C,QAAA,OAAAtB,mBAAAG,MAAA,SAAAoB,WAAA,OAAA,OAAAA,UAAAlB,KAAAkB,UAAAjB,MAAA,KAAA,EAWdkB,OAVDF,QAAU,CACZG,WAAY,kCACZC,KAAM,CACFC,cAAeC,EAAEC,IAAIC,UACrBC,SAAU3D,SACV4D,WAAY3D,WACZ4D,QAAS1D,UAIViD,UAAAA,OAAAA,SAAAA,MAAAA,QAAKU,KAAK,CAACZ,UAAU,IAXP,KAAA,EAAA,IAAA,MAAA,OAAAC,UAAAV,OAAA,GAAAsB,SAAH,KAAA,SAAAC,IAAAC,IAAAC,KAAA,OAAAtE,MAAAmD,MAAAC,KAAAC,UAAA,iBAuBF,SAACjD,SAAUC,WAAYC,aACvCH,uBAAuBC,SAAUC,WAAYC,mEADiB,GAEjE"} \ No newline at end of file diff --git a/lib/amd/build/ajax.min.js.map b/lib/amd/build/ajax.min.js.map index 6bead2f8109..57e0e55cd75 100644 --- a/lib/amd/build/ajax.min.js.map +++ b/lib/amd/build/ajax.min.js.map @@ -1 +1 @@ -{"version":3,"file":"ajax.min.js","sources":["../src/ajax.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 * Standard Ajax wrapper for Moodle. It calls the central Ajax script,\n * which can call any existing webservice using the current session.\n * In addition, it can batch multiple requests and return multiple responses.\n *\n * @module core/ajax\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\ndefine(['jquery', 'core/config', 'core/log', 'core/url'], function($, config, Log, URL) {\n\n/**\n * A request to be performed.\n *\n * @typedef {object} request\n * @property {string} methodname The remote method to be called\n * @property {object} args The arguments to pass when fetching the remote content\n */\n\n // Keeps track of when the user leaves the page so we know not to show an error.\n var unloading = false;\n\n /**\n * Success handler. Called when the ajax call succeeds. Checks each response and\n * resolves or rejects the deferred from that request.\n *\n * @method requestSuccess\n * @private\n * @param {Object[]} responses Array of responses containing error, exception and data attributes.\n */\n var requestSuccess = function(responses) {\n // Call each of the success handlers.\n var requests = this,\n exception = null,\n i = 0,\n request,\n response,\n nosessionupdate;\n\n if (responses.error) {\n // There was an error with the request as a whole.\n // We need to reject each promise.\n // Unfortunately this may lead to duplicate dialogues, but each Promise must be rejected.\n for (; i < requests.length; i++) {\n request = requests[i];\n request.deferred.reject(responses);\n }\n\n return;\n }\n\n for (i = 0; i < requests.length; i++) {\n request = requests[i];\n\n response = responses[i];\n // We may not have responses for all the requests.\n if (typeof response !== \"undefined\") {\n if (response.error === false) {\n // Call the done handler if it was provided.\n request.deferred.resolve(response.data);\n } else {\n exception = response.exception;\n nosessionupdate = requests[i].nosessionupdate;\n break;\n }\n } else {\n // This is not an expected case.\n exception = new Error('missing response');\n break;\n }\n }\n // Something failed, reject the remaining promises.\n if (exception !== null) {\n // Redirect to the login page.\n if (exception.errorcode === \"servicerequireslogin\" && !nosessionupdate) {\n window.location = URL.relativeUrl(\"/login/index.php\");\n } else {\n requests.forEach(function(request) {\n request.deferred.reject(exception);\n });\n }\n }\n };\n\n /**\n * Fail handler. Called when the ajax call fails. Rejects all deferreds.\n *\n * @method requestFail\n * @private\n * @param {jqXHR} jqXHR The ajax object.\n * @param {string} textStatus The status string.\n * @param {Error|Object} exception The error thrown.\n */\n var requestFail = function(jqXHR, textStatus, exception) {\n // Reject all the promises.\n var requests = this;\n\n var i = 0;\n for (i = 0; i < requests.length; i++) {\n var request = requests[i];\n\n if (unloading) {\n // No need to trigger an error because we are already navigating.\n Log.error(\"Page unloaded.\");\n Log.error(exception);\n } else {\n request.deferred.reject(exception);\n }\n }\n };\n\n return /** @alias module:core/ajax */ {\n // Public variables and functions.\n /**\n * Make a series of ajax requests and return all the responses.\n *\n * @method call\n * @param {request[]} requests Array of requests with each containing methodname and args properties.\n * done and fail callbacks can be set for each element in the array, or the\n * can be attached to the promises returned by this function.\n * @param {Boolean} [async=true] If false this function will not return until the promises are resolved.\n * @param {Boolean} [loginrequired=true] When false this function calls an endpoint which does not use the\n * session.\n * Note: This may only be used with external functions which have been marked as\n * `'loginrequired' => false`\n * @param {Boolean} [nosessionupdate=false] If true, the timemodified for the session will not be updated.\n * @param {Number} [timeout] number of milliseconds to wait for a response. Defaults to no limit.\n * @param {Number} [cachekey] A cache key used to improve browser-side caching.\n * Typically the same `cachekey` is used for all function calls.\n * When the key changes, this causes the URL used to perform the fetch to change, which\n * prevents the existing browser cache from being used.\n * Note: This option is only availbale when `loginrequired` is `false`.\n * See {@link https://tracker.moodle.org/browser/MDL-65794} for more information.\n * @return {Promise[]} The Promises for each of the supplied requests.\n * The order of the Promise matches the order of requests exactly.\n *\n * @example A simple example that you might find in a repository module\n *\n * import {call as fetchMany} from 'core/ajax';\n *\n * export const fetchMessages = timeSince => fetchMany([{methodname: 'core_message_get_messages', args: {timeSince}}])[0];\n *\n * export const fetchNotifications = timeSince => fetchMany([{\n * methodname: 'core_message_get_notifications',\n * args: {\n * timeSince,\n * }\n * }])[0];\n *\n * export const fetchSomethingElse = (some, params, here) => fetchMany([{\n * methodname: 'core_get_something_else',\n * args: {\n * some,\n * params,\n * gohere: here,\n * },\n * }])[0];\n *\n * @example An example of fetching a string using the cachekey parameter\n * import {call as fetchMany} from 'core/ajax';\n * import * as Notification from 'core/notification';\n *\n * export const performAction = (some, args) => {\n * Promises.all(fetchMany([{methodname: 'core_get_string', args: {\n * stringid: 'do_not_copy',\n * component: 'core',\n * lang: 'en',\n * stringparams: [],\n * }}], true, false, false, undefined, M.cfg.langrev))\n * .then(([doNotCopyString]) => {\n * window.console.log(doNotCopyString);\n * })\n * .catch(Notification.exception);\n * };\n *\n */\n call: function(requests, async, loginrequired, nosessionupdate, timeout, cachekey) {\n $(window).bind('beforeunload', function() {\n unloading = true;\n });\n var ajaxRequestData = [],\n i,\n promises = [],\n methodInfo = [],\n requestInfo = '';\n\n var maxUrlLength = 2000;\n\n if (typeof loginrequired === \"undefined\") {\n loginrequired = true;\n }\n if (typeof async === \"undefined\") {\n async = true;\n }\n if (typeof timeout === 'undefined') {\n timeout = 0;\n }\n if (typeof cachekey === 'undefined') {\n cachekey = null;\n } else {\n cachekey = parseInt(cachekey);\n if (cachekey <= 0) {\n cachekey = null;\n } else if (!cachekey) {\n cachekey = null;\n }\n }\n\n if (typeof nosessionupdate === \"undefined\") {\n nosessionupdate = false;\n }\n for (i = 0; i < requests.length; i++) {\n var request = requests[i];\n ajaxRequestData.push({\n index: i,\n methodname: request.methodname,\n args: request.args\n });\n request.nosessionupdate = nosessionupdate;\n request.deferred = $.Deferred();\n promises.push(request.deferred.promise());\n // Allow setting done and fail handlers as arguments.\n // This is just a shortcut for the calling code.\n if (typeof request.done !== \"undefined\") {\n request.deferred.done(request.done);\n }\n if (typeof request.fail !== \"undefined\") {\n request.deferred.fail(request.fail);\n }\n request.index = i;\n methodInfo.push(request.methodname);\n }\n\n if (methodInfo.length <= 5) {\n requestInfo = methodInfo.sort().join();\n } else {\n requestInfo = methodInfo.length + '-method-calls';\n }\n\n ajaxRequestData = JSON.stringify(ajaxRequestData);\n var settings = {\n type: 'POST',\n context: requests,\n dataType: 'json',\n processData: false,\n async: async,\n contentType: \"application/json\",\n timeout: timeout\n };\n\n var script = 'service.php';\n var url = config.wwwroot + '/lib/ajax/';\n if (!loginrequired) {\n script = 'service-nologin.php';\n url += script + '?info=' + requestInfo;\n if (cachekey) {\n url += '&cachekey=' + cachekey;\n settings.type = 'GET';\n }\n } else {\n url += script + '?sesskey=' + config.sesskey + '&info=' + requestInfo;\n }\n\n if (nosessionupdate) {\n url += '&nosessionupdate=true';\n }\n\n if (settings.type === 'POST') {\n settings.data = ajaxRequestData;\n } else {\n var urlUseGet = url + '&args=' + encodeURIComponent(ajaxRequestData);\n\n if (urlUseGet.length > maxUrlLength) {\n settings.type = 'POST';\n settings.data = ajaxRequestData;\n } else {\n url = urlUseGet;\n }\n }\n\n // Jquery deprecated done and fail with async=false so we need to do this 2 ways.\n if (async) {\n $.ajax(url, settings)\n .done(requestSuccess)\n .fail(requestFail);\n } else {\n settings.success = requestSuccess;\n settings.error = requestFail;\n $.ajax(url, settings);\n }\n\n return promises;\n }\n };\n});\n"],"names":["define","$","config","Log","URL","unloading","requestSuccess","responses","request","response","nosessionupdate","exception","i","error","this","length","deferred","reject","Error","resolve","data","errorcode","forEach","window","location","relativeUrl","requestFail","jqXHR","textStatus","call","requests","async","loginrequired","timeout","cachekey","bind","ajaxRequestData","promises","methodInfo","requestInfo","parseInt","push","index","methodname","args","Deferred","promise","done","fail","sort","join","JSON","stringify","settings","type","context","dataType","processData","contentType","script","url","wwwroot","sesskey","urlUseGet","encodeURIComponent","ajax","success"],"mappings":";;;;;;;;;;AAyBAA,mBAAO,CAAC,SAAU,cAAe,WAAY,aAAa,SAASC,EAAGC,OAAQC,IAAKC,SAW3EC,WAAY,EAUZC,eAAiB,SAASC,eAKtBC,QACAC,SACAC,gBAJAC,UAAY,KACZC,EAAI,KAKJL,UAAUM,WAIHD,EAXIE,KAWSC,OAAQH,KACxBJ,QAZOM,KAYYF,IACXI,SAASC,OAAOV,oBAM3BK,EAAI,EAAGA,EAnBGE,KAmBUC,OAAQH,IAAK,IAClCJ,QApBWM,KAoBQF,QAIK,KAFxBH,SAAWF,UAAUK,IAWd,CAEHD,UAAY,IAAIO,MAAM,8BAVC,IAAnBT,SAASI,MAGN,CACHF,UAAYF,SAASE,UACrBD,gBA9BGI,KA8BwBF,GAAGF,sBAH9BF,QAAQQ,SAASG,QAAQV,SAASW,MAa5B,OAAdT,YAE4B,yBAAxBA,UAAUU,WAAyCX,gBA1C5CI,KA6CEQ,SAAQ,SAASd,SACtBA,QAAQQ,SAASC,OAAON,cAH5BY,OAAOC,SAAWpB,IAAIqB,YAAY,uBAkB1CC,YAAc,SAASC,MAAOC,WAAYjB,eAItCC,EAAI,MACHA,EAAI,EAAGA,EAHGE,KAGUC,OAAQH,IAAK,KAC9BJ,QAJOM,KAIYF,GAEnBP,WAEAF,IAAIU,MAAM,kBACVV,IAAIU,MAAMF,YAEVH,QAAQQ,SAASC,OAAON,mBAKE,CAiElCkB,KAAM,SAASC,SAAUC,MAAOC,cAAetB,gBAAiBuB,QAASC,UACrEjC,EAAEsB,QAAQY,KAAK,gBAAgB,WAC3B9B,WAAY,SAGZO,EADAwB,gBAAkB,GAElBC,SAAW,GACXC,WAAa,GACbC,YAAc,YAIW,IAAlBP,gBACPA,eAAgB,QAEC,IAAVD,QACPA,OAAQ,QAEW,IAAZE,UACPA,QAAU,QAEU,IAAbC,WAGPA,SAAWM,SAASN,YACJ,EAHhBA,SAAW,KAKCA,WACRA,SAAW,WAIY,IAApBxB,kBACPA,iBAAkB,GAEjBE,EAAI,EAAGA,EAAIkB,SAASf,OAAQH,IAAK,KAC9BJ,QAAUsB,SAASlB,GACvBwB,gBAAgBK,KAAK,CACjBC,MAAO9B,EACP+B,WAAYnC,QAAQmC,WACpBC,KAAMpC,QAAQoC,OAElBpC,QAAQE,gBAAkBA,gBAC1BF,QAAQQ,SAAWf,EAAE4C,WACrBR,SAASI,KAAKjC,QAAQQ,SAAS8B,gBAGH,IAAjBtC,QAAQuC,MACfvC,QAAQQ,SAAS+B,KAAKvC,QAAQuC,WAEN,IAAjBvC,QAAQwC,MACfxC,QAAQQ,SAASgC,KAAKxC,QAAQwC,MAElCxC,QAAQkC,MAAQ9B,EAChB0B,WAAWG,KAAKjC,QAAQmC,YAIxBJ,YADAD,WAAWvB,QAAU,EACPuB,WAAWW,OAAOC,OAElBZ,WAAWvB,OAAS,gBAGtCqB,gBAAkBe,KAAKC,UAAUhB,qBAC7BiB,SAAW,CACXC,KAAM,OACNC,QAASzB,SACT0B,SAAU,OACVC,aAAa,EACb1B,MAAOA,MACP2B,YAAa,mBACbzB,QAASA,SAGT0B,OAAS,cACTC,IAAM1D,OAAO2D,QAAU,gBACtB7B,cAQD4B,KAAOD,OAAS,YAAczD,OAAO4D,QAAU,SAAWvB,aAN1DqB,MADAD,OAAS,uBACO,SAAWpB,YACvBL,WACA0B,KAAO,aAAe1B,SACtBmB,SAASC,KAAO,QAMpB5C,kBACAkD,KAAO,yBAGW,SAAlBP,SAASC,KACTD,SAASjC,KAAOgB,oBACb,KACC2B,UAAYH,IAAM,SAAWI,mBAAmB5B,iBAEhD2B,UAAUhD,OAtFC,KAuFXsC,SAASC,KAAO,OAChBD,SAASjC,KAAOgB,iBAEhBwB,IAAMG,iBAKVhC,MACA9B,EAAEgE,KAAKL,IAAKP,UACPN,KAAKzC,gBACL0C,KAAKtB,cAEV2B,SAASa,QAAU5D,eACnB+C,SAASxC,MAAQa,YACjBzB,EAAEgE,KAAKL,IAAKP,WAGThB"} \ No newline at end of file +{"version":3,"file":"ajax.min.js","sources":["../src/ajax.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 * Standard Ajax wrapper for Moodle. It calls the central Ajax script,\n * which can call any existing webservice using the current session.\n * In addition, it can batch multiple requests and return multiple responses.\n *\n * @module core/ajax\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\ndefine(['jquery', 'core/config', 'core/log', 'core/url'], function($, config, Log, URL) {\n\n/**\n * A request to be performed.\n *\n * @typedef {object} request\n * @property {string} methodname The remote method to be called\n * @property {object} args The arguments to pass when fetching the remote content\n */\n\n // Keeps track of when the user leaves the page so we know not to show an error.\n var unloading = false;\n\n /**\n * Success handler. Called when the ajax call succeeds. Checks each response and\n * resolves or rejects the deferred from that request.\n *\n * @method requestSuccess\n * @private\n * @param {Object[]} responses Array of responses containing error, exception and data attributes.\n */\n var requestSuccess = function(responses) {\n // Call each of the success handlers.\n var requests = this,\n exception = null,\n i = 0,\n request,\n response,\n nosessionupdate;\n\n if (responses.error) {\n // There was an error with the request as a whole.\n // We need to reject each promise.\n // Unfortunately this may lead to duplicate dialogues, but each Promise must be rejected.\n for (; i < requests.length; i++) {\n request = requests[i];\n request.deferred.reject(responses);\n }\n\n return;\n }\n\n for (i = 0; i < requests.length; i++) {\n request = requests[i];\n\n response = responses[i];\n // We may not have responses for all the requests.\n if (typeof response !== \"undefined\") {\n if (response.error === false) {\n // Call the done handler if it was provided.\n request.deferred.resolve(response.data);\n } else {\n exception = response.exception;\n nosessionupdate = requests[i].nosessionupdate;\n break;\n }\n } else {\n // This is not an expected case.\n exception = new Error('missing response');\n break;\n }\n }\n // Something failed, reject the remaining promises.\n if (exception !== null) {\n // Redirect to the login page.\n if (exception.errorcode === \"servicerequireslogin\" && !nosessionupdate) {\n window.location = URL.relativeUrl(\"/login/index.php\");\n } else {\n requests.forEach(function(request) {\n request.deferred.reject(exception);\n });\n }\n }\n };\n\n /**\n * Fail handler. Called when the ajax call fails. Rejects all deferreds.\n *\n * @method requestFail\n * @private\n * @param {jqXHR} jqXHR The ajax object.\n * @param {string} textStatus The status string.\n * @param {Error|Object} exception The error thrown.\n */\n var requestFail = function(jqXHR, textStatus, exception) {\n // Reject all the promises.\n var requests = this;\n\n var i = 0;\n for (i = 0; i < requests.length; i++) {\n var request = requests[i];\n\n if (unloading) {\n // No need to trigger an error because we are already navigating.\n Log.error(\"Page unloaded.\");\n Log.error(exception);\n } else {\n request.deferred.reject(exception);\n }\n }\n };\n\n return /** @alias module:core/ajax */ {\n // Public variables and functions.\n /**\n * Make a series of ajax requests and return all the responses.\n *\n * @method call\n * @param {request[]} requests Array of requests with each containing methodname and args properties.\n * done and fail callbacks can be set for each element in the array, or the\n * can be attached to the promises returned by this function.\n * @param {Boolean} [async=true] If false this function will not return until the promises are resolved.\n * @param {Boolean} [loginrequired=true] When false this function calls an endpoint which does not use the\n * session.\n * Note: This may only be used with external functions which have been marked as\n * `'loginrequired' => false`\n * @param {Boolean} [nosessionupdate=false] If true, the timemodified for the session will not be updated.\n * @param {Number} [timeout] number of milliseconds to wait for a response. Defaults to no limit.\n * @param {Number} [cachekey] A cache key used to improve browser-side caching.\n * Typically the same `cachekey` is used for all function calls.\n * When the key changes, this causes the URL used to perform the fetch to change, which\n * prevents the existing browser cache from being used.\n * Note: This option is only availbale when `loginrequired` is `false`.\n * See {@link https://tracker.moodle.org/browser/MDL-65794} for more information.\n * @return {Promise[]} The Promises for each of the supplied requests.\n * The order of the Promise matches the order of requests exactly.\n *\n * @example A simple example that you might find in a repository module\n *\n * import {call as fetchMany} from 'core/ajax';\n *\n * export const fetchMessages = timeSince => fetchMany([{methodname: 'core_message_get_messages', args: {timeSince}}])[0];\n *\n * export const fetchNotifications = timeSince => fetchMany([{\n * methodname: 'core_message_get_notifications',\n * args: {\n * timeSince,\n * }\n * }])[0];\n *\n * export const fetchSomethingElse = (some, params, here) => fetchMany([{\n * methodname: 'core_get_something_else',\n * args: {\n * some,\n * params,\n * gohere: here,\n * },\n * }])[0];\n *\n * @example An example of fetching a string using the cachekey parameter\n * import {call as fetchMany} from 'core/ajax';\n * import * as Notification from 'core/notification';\n *\n * export const performAction = (some, args) => {\n * Promises.all(fetchMany([{methodname: 'core_get_string', args: {\n * stringid: 'do_not_copy',\n * component: 'core',\n * lang: 'en',\n * stringparams: [],\n * }}], true, false, false, undefined, M.cfg.langrev))\n * .then(([doNotCopyString]) => {\n * window.console.log(doNotCopyString);\n * })\n * .catch(Notification.exception);\n * };\n *\n */\n call: function(requests, async, loginrequired, nosessionupdate, timeout, cachekey) {\n $(window).bind('beforeunload', function() {\n unloading = true;\n });\n var ajaxRequestData = [],\n i,\n promises = [],\n methodInfo = [],\n requestInfo = '';\n\n var maxUrlLength = 2000;\n\n if (typeof loginrequired === \"undefined\") {\n loginrequired = true;\n }\n if (typeof async === \"undefined\") {\n async = true;\n }\n if (typeof timeout === 'undefined') {\n timeout = 0;\n }\n if (typeof cachekey === 'undefined') {\n cachekey = null;\n } else {\n cachekey = parseInt(cachekey);\n if (cachekey <= 0) {\n cachekey = null;\n } else if (!cachekey) {\n cachekey = null;\n }\n }\n\n if (typeof nosessionupdate === \"undefined\") {\n nosessionupdate = false;\n }\n for (i = 0; i < requests.length; i++) {\n var request = requests[i];\n ajaxRequestData.push({\n index: i,\n methodname: request.methodname,\n args: request.args\n });\n request.nosessionupdate = nosessionupdate;\n request.deferred = $.Deferred();\n promises.push(request.deferred.promise());\n // Allow setting done and fail handlers as arguments.\n // This is just a shortcut for the calling code.\n if (typeof request.done !== \"undefined\") {\n request.deferred.done(request.done);\n }\n if (typeof request.fail !== \"undefined\") {\n request.deferred.fail(request.fail);\n }\n request.index = i;\n methodInfo.push(request.methodname);\n }\n\n if (methodInfo.length <= 5) {\n requestInfo = methodInfo.sort().join();\n } else {\n requestInfo = methodInfo.length + '-method-calls';\n }\n\n ajaxRequestData = JSON.stringify(ajaxRequestData);\n var settings = {\n type: 'POST',\n context: requests,\n dataType: 'json',\n processData: false,\n async: async,\n contentType: \"application/json\",\n timeout: timeout\n };\n\n var script = 'service.php';\n var url = config.wwwroot + '/lib/ajax/';\n if (!loginrequired) {\n script = 'service-nologin.php';\n url += script + '?info=' + requestInfo;\n if (cachekey) {\n url += '&cachekey=' + cachekey;\n settings.type = 'GET';\n }\n } else {\n url += script + '?sesskey=' + config.sesskey + '&info=' + requestInfo;\n }\n\n if (nosessionupdate) {\n url += '&nosessionupdate=true';\n }\n\n if (settings.type === 'POST') {\n settings.data = ajaxRequestData;\n } else {\n var urlUseGet = url + '&args=' + encodeURIComponent(ajaxRequestData);\n\n if (urlUseGet.length > maxUrlLength) {\n settings.type = 'POST';\n settings.data = ajaxRequestData;\n } else {\n url = urlUseGet;\n }\n }\n\n // Jquery deprecated done and fail with async=false so we need to do this 2 ways.\n if (async) {\n $.ajax(url, settings)\n .done(requestSuccess)\n .fail(requestFail);\n } else {\n settings.success = requestSuccess;\n settings.error = requestFail;\n $.ajax(url, settings);\n }\n\n return promises;\n }\n };\n});\n"],"names":["define","$","config","Log","URL","unloading","requestSuccess","responses","requests","request","response","nosessionupdate","exception","i","error","this","length","deferred","reject","Error","resolve","data","errorcode","forEach","window","location","relativeUrl","requestFail","jqXHR","textStatus","call","async","loginrequired","timeout","cachekey","bind","ajaxRequestData","promises","methodInfo","requestInfo","parseInt","push","index","methodname","args","Deferred","promise","done","fail","sort","join","JSON","stringify","settings","type","context","dataType","processData","contentType","script","url","wwwroot","sesskey","urlUseGet","encodeURIComponent","ajax","success"],"mappings":"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"} \ No newline at end of file diff --git a/lib/amd/build/auto_rows.min.js.map b/lib/amd/build/auto_rows.min.js.map index 022d9eb5207..15b037750f0 100644 --- a/lib/amd/build/auto_rows.min.js.map +++ b/lib/amd/build/auto_rows.min.js.map @@ -1 +1 @@ -{"version":3,"file":"auto_rows.min.js","sources":["../src/auto_rows.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 * Enhance a textarea with auto growing rows to fit the content.\n *\n * @module core/auto_rows\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\ndefine(['jquery'], function($) {\n var SELECTORS = {\n ELEMENT: '[data-auto-rows]'\n };\n\n var EVENTS = {\n ROW_CHANGE: 'autorows:rowchange',\n };\n\n /**\n * Determine how many rows should be set for the given element.\n *\n * @method calculateRows\n * @param {jQuery} element The textarea element\n * @return {int} The number of rows for the element\n * @private\n */\n var calculateRows = function(element) {\n var currentRows = element.attr('rows');\n var minRows = element.data('min-rows');\n var maxRows = element.attr('data-max-rows');\n\n var height = element.height();\n var innerHeight = element.innerHeight();\n var padding = innerHeight - height;\n\n var scrollHeight = element[0].scrollHeight;\n var rows = (scrollHeight - padding) / (height / currentRows);\n\n // Remove the height styling to let the height be calculated automatically\n // based on the row attribute.\n element.css('height', '');\n\n if (rows < minRows) {\n return minRows;\n } else if (maxRows && rows >= maxRows) {\n return maxRows;\n } else {\n return rows;\n }\n };\n\n /**\n * Listener for change events to trigger resizing of the element.\n *\n * @method changeListener\n * @param {Event} e The triggered event.\n * @private\n */\n var changeListener = function(e) {\n var element = $(e.target);\n var minRows = element.data('min-rows');\n var currentRows = element.attr('rows');\n\n if (typeof minRows === \"undefined\") {\n element.data('min-rows', currentRows);\n }\n\n // Reset element to single row so that the scroll height of the\n // element is correctly calculated each time.\n element.attr('rows', 1);\n var rows = calculateRows(element);\n element.attr('rows', rows);\n\n if (rows != currentRows) {\n element.trigger(EVENTS.ROW_CHANGE);\n }\n };\n\n /**\n * Add the event listeners for all text areas within the given element.\n *\n * @method init\n * @param {jQuery|selector} root The container element of all enhanced text areas\n * @public\n */\n var init = function(root) {\n if ($(root).data('auto-rows')) {\n $(root).on('input propertychange', changeListener.bind(this));\n } else {\n $(root).on('input propertychange', SELECTORS.ELEMENT, changeListener.bind(this));\n }\n };\n\n return /** @module core/auto_rows */ {\n init: init,\n events: EVENTS,\n };\n});\n"],"names":["define","$","SELECTORS","EVENTS","ROW_CHANGE","changeListener","e","element","target","minRows","data","currentRows","attr","rows","maxRows","height","padding","innerHeight","scrollHeight","css","calculateRows","trigger","init","root","on","bind","this","events"],"mappings":";;;;;;;;AAuBAA,wBAAO,CAAC,WAAW,SAASC,OACpBC,kBACS,mBAGTC,OAAS,CACTC,WAAY,sBA2CZC,eAAiB,SAASC,OACtBC,QAAUN,EAAEK,EAAEE,QACdC,QAAUF,QAAQG,KAAK,YACvBC,YAAcJ,QAAQK,KAAK,aAER,IAAZH,SACPF,QAAQG,KAAK,WAAYC,aAK7BJ,QAAQK,KAAK,OAAQ,OACjBC,KA5CY,SAASN,aACrBI,YAAcJ,QAAQK,KAAK,QAC3BH,QAAUF,QAAQG,KAAK,YACvBI,QAAUP,QAAQK,KAAK,iBAEvBG,OAASR,QAAQQ,SAEjBC,QADcT,QAAQU,cACEF,OAGxBF,MADeN,QAAQ,GAAGW,aACHF,UAAYD,OAASJ,oBAIhDJ,QAAQY,IAAI,SAAU,IAElBN,KAAOJ,QACAA,QACAK,SAAWD,MAAQC,QACnBA,QAEAD,KAuBAO,CAAcb,SACzBA,QAAQK,KAAK,OAAQC,MAEjBA,MAAQF,aACRJ,QAAQc,QAAQlB,OAAOC,mBAmBM,CACjCkB,KATO,SAASC,MACZtB,EAAEsB,MAAMb,KAAK,aACbT,EAAEsB,MAAMC,GAAG,uBAAwBnB,eAAeoB,KAAKC,OAEvDzB,EAAEsB,MAAMC,GAAG,uBAAwBtB,kBAAmBG,eAAeoB,KAAKC,QAM9EC,OAAQxB"} \ No newline at end of file +{"version":3,"file":"auto_rows.min.js","sources":["../src/auto_rows.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 * Enhance a textarea with auto growing rows to fit the content.\n *\n * @module core/auto_rows\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\ndefine(['jquery'], function($) {\n var SELECTORS = {\n ELEMENT: '[data-auto-rows]'\n };\n\n var EVENTS = {\n ROW_CHANGE: 'autorows:rowchange',\n };\n\n /**\n * Determine how many rows should be set for the given element.\n *\n * @method calculateRows\n * @param {jQuery} element The textarea element\n * @return {int} The number of rows for the element\n * @private\n */\n var calculateRows = function(element) {\n var currentRows = element.attr('rows');\n var minRows = element.data('min-rows');\n var maxRows = element.attr('data-max-rows');\n\n var height = element.height();\n var innerHeight = element.innerHeight();\n var padding = innerHeight - height;\n\n var scrollHeight = element[0].scrollHeight;\n var rows = (scrollHeight - padding) / (height / currentRows);\n\n // Remove the height styling to let the height be calculated automatically\n // based on the row attribute.\n element.css('height', '');\n\n if (rows < minRows) {\n return minRows;\n } else if (maxRows && rows >= maxRows) {\n return maxRows;\n } else {\n return rows;\n }\n };\n\n /**\n * Listener for change events to trigger resizing of the element.\n *\n * @method changeListener\n * @param {Event} e The triggered event.\n * @private\n */\n var changeListener = function(e) {\n var element = $(e.target);\n var minRows = element.data('min-rows');\n var currentRows = element.attr('rows');\n\n if (typeof minRows === \"undefined\") {\n element.data('min-rows', currentRows);\n }\n\n // Reset element to single row so that the scroll height of the\n // element is correctly calculated each time.\n element.attr('rows', 1);\n var rows = calculateRows(element);\n element.attr('rows', rows);\n\n if (rows != currentRows) {\n element.trigger(EVENTS.ROW_CHANGE);\n }\n };\n\n /**\n * Add the event listeners for all text areas within the given element.\n *\n * @method init\n * @param {jQuery|selector} root The container element of all enhanced text areas\n * @public\n */\n var init = function(root) {\n if ($(root).data('auto-rows')) {\n $(root).on('input propertychange', changeListener.bind(this));\n } else {\n $(root).on('input propertychange', SELECTORS.ELEMENT, changeListener.bind(this));\n }\n };\n\n return /** @module core/auto_rows */ {\n init: init,\n events: EVENTS,\n };\n});\n"],"names":["define","$","SELECTORS","EVENTS","ROW_CHANGE","changeListener","e","element","target","minRows","data","currentRows","attr","rows","maxRows","height","padding","innerHeight","scrollHeight","css","calculateRows","trigger","init","root","on","bind","this","events"],"mappings":";;;;;;;;AAuBAA,wBAAO,CAAC,WAAW,SAASC,GACxB,IAAIC,kBACS,mBAGTC,OAAS,CACTC,WAAY,sBA2CZC,eAAiB,SAASC,GAC1B,IAAIC,QAAUN,EAAEK,EAAEE,QACdC,QAAUF,QAAQG,KAAK,YACvBC,YAAcJ,QAAQK,KAAK,aAER,IAAZH,SACPF,QAAQG,KAAK,WAAYC,aAK7BJ,QAAQK,KAAK,OAAQ,GACrB,IAAIC,KA5CY,SAASN,SACzB,IAAII,YAAcJ,QAAQK,KAAK,QAC3BH,QAAUF,QAAQG,KAAK,YACvBI,QAAUP,QAAQK,KAAK,iBAEvBG,OAASR,QAAQQ,SAEjBC,QADcT,QAAQU,cACEF,OAGxBF,MADeN,QAAQ,GAAGW,aACHF,UAAYD,OAASJ,aAM5CE,OAFJN,QAAQY,IAAI,SAAU,IAElBN,KAAOJ,QACAA,QACAK,SAAWD,MAAQC,QACnBA,QAEAD,IAEd,CAqBcO,CAAcb,SACzBA,QAAQK,KAAK,OAAQC,MAEjBA,MAAQF,aACRJ,QAAQc,QAAQlB,OAAOC,WAE9B,EAiBoC,MAAA,CACjCkB,KATO,SAASC,MACZtB,EAAEsB,MAAMb,KAAK,aACbT,EAAEsB,MAAMC,GAAG,uBAAwBnB,eAAeoB,KAAKC,OAEvDzB,EAAEsB,MAAMC,GAAG,uBAAwBtB,kBAAmBG,eAAeoB,KAAKC,MAEjF,EAIGC,OAAQxB,OAEf"} \ No newline at end of file diff --git a/lib/amd/build/autoscroll.min.js.map b/lib/amd/build/autoscroll.min.js.map index ffafcb2bb3b..af8bb7e8fc7 100644 --- a/lib/amd/build/autoscroll.min.js.map +++ b/lib/amd/build/autoscroll.min.js.map @@ -1 +1 @@ -{"version":3,"file":"autoscroll.min.js","sources":["../src/autoscroll.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 * JavaScript to provide automatic scrolling, e.g. during a drag operation.\n *\n * Note: this module is defined statically. It is a singleton. You\n * can only have one use of it active at any time. However, since this\n * is usually used in relation to drag-drop, and since you only ever\n * drag one thing at a time, this is not a problem in practice.\n *\n * @module core/autoscroll\n * @copyright 2016 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.6\n */\ndefine(['jquery'], function($) {\n /**\n * @alias module:core/autoscroll\n */\n var autoscroll = {\n /**\n * Size of area near edge of screen that triggers scrolling.\n * @private\n */\n SCROLL_THRESHOLD: 30,\n\n /**\n * How frequently to scroll window.\n * @private\n */\n SCROLL_FREQUENCY: 1000 / 60,\n\n /**\n * How many pixels to scroll per unit (1 = max scroll 30).\n * @private\n */\n SCROLL_SPEED: 0.5,\n\n /**\n * Set if currently scrolling up/down.\n * @private\n */\n scrollingId: null,\n\n /**\n * Speed we are supposed to scroll (range 1 to SCROLL_THRESHOLD).\n * @private\n */\n scrollAmount: 0,\n\n /**\n * Optional callback called when it scrolls\n * @private\n */\n callback: null,\n\n /**\n * Starts automatically scrolling if user moves near edge of window.\n * This should be called in response to mouse down or touch start.\n *\n * @public\n * @param {Function} callback Optional callback that is called every time it scrolls\n */\n start: function(callback) {\n $(window).on('mousemove', autoscroll.mouseMove);\n $(window).on('touchmove', autoscroll.touchMove);\n autoscroll.callback = callback;\n },\n\n /**\n * Stops automatically scrolling. This should be called in response to mouse up or touch end.\n *\n * @public\n */\n stop: function() {\n $(window).off('mousemove', autoscroll.mouseMove);\n $(window).off('touchmove', autoscroll.touchMove);\n if (autoscroll.scrollingId !== null) {\n autoscroll.stopScrolling();\n }\n },\n\n /**\n * Event handler for touch move.\n *\n * @private\n * @param {Object} e Event\n */\n touchMove: function(e) {\n for (var i = 0; i < e.changedTouches.length; i++) {\n autoscroll.handleMove(e.changedTouches[i].clientX, e.changedTouches[i].clientY);\n }\n },\n\n /**\n * Event handler for mouse move.\n *\n * @private\n * @param {Object} e Event\n */\n mouseMove: function(e) {\n autoscroll.handleMove(e.clientX, e.clientY);\n },\n\n /**\n * Handles user moving.\n *\n * @private\n * @param {number} clientX X\n * @param {number} clientY Y\n */\n handleMove: function(clientX, clientY) {\n // If near the bottom or top, start auto-scrolling.\n if (clientY < autoscroll.SCROLL_THRESHOLD) {\n autoscroll.scrollAmount = -Math.min(autoscroll.SCROLL_THRESHOLD - clientY, autoscroll.SCROLL_THRESHOLD);\n } else if (clientY > $(window).height() - autoscroll.SCROLL_THRESHOLD) {\n autoscroll.scrollAmount = Math.min(clientY - ($(window).height() - autoscroll.SCROLL_THRESHOLD),\n autoscroll.SCROLL_THRESHOLD);\n } else {\n autoscroll.scrollAmount = 0;\n }\n if (autoscroll.scrollAmount && autoscroll.scrollingId === null) {\n autoscroll.startScrolling();\n } else if (!autoscroll.scrollAmount && autoscroll.scrollingId !== null) {\n autoscroll.stopScrolling();\n }\n },\n\n /**\n * Starts automatic scrolling.\n *\n * @private\n */\n startScrolling: function() {\n var maxScroll = $(document).height() - $(window).height();\n autoscroll.scrollingId = window.setInterval(function() {\n // Work out how much to scroll.\n var y = $(window).scrollTop();\n var offset = Math.round(autoscroll.scrollAmount * autoscroll.SCROLL_SPEED);\n if (y + offset < 0) {\n offset = -y;\n }\n if (y + offset > maxScroll) {\n offset = maxScroll - y;\n }\n if (offset === 0) {\n return;\n }\n\n // Scroll.\n $(window).scrollTop(y + offset);\n var realOffset = $(window).scrollTop() - y;\n if (realOffset === 0) {\n return;\n }\n\n // Inform callback\n if (autoscroll.callback) {\n autoscroll.callback(realOffset);\n }\n\n }, autoscroll.SCROLL_FREQUENCY);\n },\n\n /**\n * Stops the automatic scrolling.\n *\n * @private\n */\n stopScrolling: function() {\n window.clearInterval(autoscroll.scrollingId);\n autoscroll.scrollingId = null;\n }\n };\n\n return {\n /**\n * Starts automatic scrolling if user moves near edge of window.\n * This should be called in response to mouse down or touch start.\n *\n * @public\n * @param {Function} callback Optional callback that is called every time it scrolls\n */\n start: autoscroll.start,\n\n /**\n * Stops automatic scrolling. This should be called in response to mouse up or touch end.\n *\n * @public\n */\n stop: autoscroll.stop\n };\n\n});\n"],"names":["define","$","autoscroll","SCROLL_THRESHOLD","SCROLL_FREQUENCY","SCROLL_SPEED","scrollingId","scrollAmount","callback","start","window","on","mouseMove","touchMove","stop","off","stopScrolling","e","i","changedTouches","length","handleMove","clientX","clientY","Math","min","height","startScrolling","maxScroll","document","setInterval","y","scrollTop","offset","round","realOffset","clearInterval"],"mappings":";;;;;;;;;;;;;AA4BAA,yBAAO,CAAC,WAAW,SAASC,OAIpBC,WAAa,CAKbC,iBAAkB,GAMlBC,iBAAkB,IAAO,GAMzBC,aAAc,GAMdC,YAAa,KAMbC,aAAc,EAMdC,SAAU,KASVC,MAAO,SAASD,UACZP,EAAES,QAAQC,GAAG,YAAaT,WAAWU,WACrCX,EAAES,QAAQC,GAAG,YAAaT,WAAWW,WACrCX,WAAWM,SAAWA,UAQ1BM,KAAM,WACFb,EAAES,QAAQK,IAAI,YAAab,WAAWU,WACtCX,EAAES,QAAQK,IAAI,YAAab,WAAWW,WACP,OAA3BX,WAAWI,aACXJ,WAAWc,iBAUnBH,UAAW,SAASI,OACX,IAAIC,EAAI,EAAGA,EAAID,EAAEE,eAAeC,OAAQF,IACzChB,WAAWmB,WAAWJ,EAAEE,eAAeD,GAAGI,QAASL,EAAEE,eAAeD,GAAGK,UAU/EX,UAAW,SAASK,GAChBf,WAAWmB,WAAWJ,EAAEK,QAASL,EAAEM,UAUvCF,WAAY,SAASC,QAASC,SAEtBA,QAAUrB,WAAWC,iBACrBD,WAAWK,cAAgBiB,KAAKC,IAAIvB,WAAWC,iBAAmBoB,QAASrB,WAAWC,kBAC/EoB,QAAUtB,EAAES,QAAQgB,SAAWxB,WAAWC,iBACjDD,WAAWK,aAAeiB,KAAKC,IAAIF,SAAWtB,EAAES,QAAQgB,SAAWxB,WAAWC,kBAC1ED,WAAWC,kBAEfD,WAAWK,aAAe,EAE1BL,WAAWK,cAA2C,OAA3BL,WAAWI,YACtCJ,WAAWyB,iBACHzB,WAAWK,cAA2C,OAA3BL,WAAWI,aAC9CJ,WAAWc,iBASnBW,eAAgB,eACRC,UAAY3B,EAAE4B,UAAUH,SAAWzB,EAAES,QAAQgB,SACjDxB,WAAWI,YAAcI,OAAOoB,aAAY,eAEpCC,EAAI9B,EAAES,QAAQsB,YACdC,OAAST,KAAKU,MAAMhC,WAAWK,aAAeL,WAAWG,iBACzD0B,EAAIE,OAAS,IACbA,QAAUF,GAEVA,EAAIE,OAASL,YACbK,OAASL,UAAYG,GAEV,IAAXE,QAKJhC,EAAES,QAAQsB,UAAUD,EAAIE,YACpBE,WAAalC,EAAES,QAAQsB,YAAcD,EACtB,IAAfI,YAKAjC,WAAWM,UACXN,WAAWM,SAAS2B,eAGzBjC,WAAWE,mBAQlBY,cAAe,WACXN,OAAO0B,cAAclC,WAAWI,aAChCJ,WAAWI,YAAc,aAI1B,CAQHG,MAAOP,WAAWO,MAOlBK,KAAMZ,WAAWY"} \ No newline at end of file +{"version":3,"file":"autoscroll.min.js","sources":["../src/autoscroll.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 * JavaScript to provide automatic scrolling, e.g. during a drag operation.\n *\n * Note: this module is defined statically. It is a singleton. You\n * can only have one use of it active at any time. However, since this\n * is usually used in relation to drag-drop, and since you only ever\n * drag one thing at a time, this is not a problem in practice.\n *\n * @module core/autoscroll\n * @copyright 2016 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.6\n */\ndefine(['jquery'], function($) {\n /**\n * @alias module:core/autoscroll\n */\n var autoscroll = {\n /**\n * Size of area near edge of screen that triggers scrolling.\n * @private\n */\n SCROLL_THRESHOLD: 30,\n\n /**\n * How frequently to scroll window.\n * @private\n */\n SCROLL_FREQUENCY: 1000 / 60,\n\n /**\n * How many pixels to scroll per unit (1 = max scroll 30).\n * @private\n */\n SCROLL_SPEED: 0.5,\n\n /**\n * Set if currently scrolling up/down.\n * @private\n */\n scrollingId: null,\n\n /**\n * Speed we are supposed to scroll (range 1 to SCROLL_THRESHOLD).\n * @private\n */\n scrollAmount: 0,\n\n /**\n * Optional callback called when it scrolls\n * @private\n */\n callback: null,\n\n /**\n * Starts automatically scrolling if user moves near edge of window.\n * This should be called in response to mouse down or touch start.\n *\n * @public\n * @param {Function} callback Optional callback that is called every time it scrolls\n */\n start: function(callback) {\n $(window).on('mousemove', autoscroll.mouseMove);\n $(window).on('touchmove', autoscroll.touchMove);\n autoscroll.callback = callback;\n },\n\n /**\n * Stops automatically scrolling. This should be called in response to mouse up or touch end.\n *\n * @public\n */\n stop: function() {\n $(window).off('mousemove', autoscroll.mouseMove);\n $(window).off('touchmove', autoscroll.touchMove);\n if (autoscroll.scrollingId !== null) {\n autoscroll.stopScrolling();\n }\n },\n\n /**\n * Event handler for touch move.\n *\n * @private\n * @param {Object} e Event\n */\n touchMove: function(e) {\n for (var i = 0; i < e.changedTouches.length; i++) {\n autoscroll.handleMove(e.changedTouches[i].clientX, e.changedTouches[i].clientY);\n }\n },\n\n /**\n * Event handler for mouse move.\n *\n * @private\n * @param {Object} e Event\n */\n mouseMove: function(e) {\n autoscroll.handleMove(e.clientX, e.clientY);\n },\n\n /**\n * Handles user moving.\n *\n * @private\n * @param {number} clientX X\n * @param {number} clientY Y\n */\n handleMove: function(clientX, clientY) {\n // If near the bottom or top, start auto-scrolling.\n if (clientY < autoscroll.SCROLL_THRESHOLD) {\n autoscroll.scrollAmount = -Math.min(autoscroll.SCROLL_THRESHOLD - clientY, autoscroll.SCROLL_THRESHOLD);\n } else if (clientY > $(window).height() - autoscroll.SCROLL_THRESHOLD) {\n autoscroll.scrollAmount = Math.min(clientY - ($(window).height() - autoscroll.SCROLL_THRESHOLD),\n autoscroll.SCROLL_THRESHOLD);\n } else {\n autoscroll.scrollAmount = 0;\n }\n if (autoscroll.scrollAmount && autoscroll.scrollingId === null) {\n autoscroll.startScrolling();\n } else if (!autoscroll.scrollAmount && autoscroll.scrollingId !== null) {\n autoscroll.stopScrolling();\n }\n },\n\n /**\n * Starts automatic scrolling.\n *\n * @private\n */\n startScrolling: function() {\n var maxScroll = $(document).height() - $(window).height();\n autoscroll.scrollingId = window.setInterval(function() {\n // Work out how much to scroll.\n var y = $(window).scrollTop();\n var offset = Math.round(autoscroll.scrollAmount * autoscroll.SCROLL_SPEED);\n if (y + offset < 0) {\n offset = -y;\n }\n if (y + offset > maxScroll) {\n offset = maxScroll - y;\n }\n if (offset === 0) {\n return;\n }\n\n // Scroll.\n $(window).scrollTop(y + offset);\n var realOffset = $(window).scrollTop() - y;\n if (realOffset === 0) {\n return;\n }\n\n // Inform callback\n if (autoscroll.callback) {\n autoscroll.callback(realOffset);\n }\n\n }, autoscroll.SCROLL_FREQUENCY);\n },\n\n /**\n * Stops the automatic scrolling.\n *\n * @private\n */\n stopScrolling: function() {\n window.clearInterval(autoscroll.scrollingId);\n autoscroll.scrollingId = null;\n }\n };\n\n return {\n /**\n * Starts automatic scrolling if user moves near edge of window.\n * This should be called in response to mouse down or touch start.\n *\n * @public\n * @param {Function} callback Optional callback that is called every time it scrolls\n */\n start: autoscroll.start,\n\n /**\n * Stops automatic scrolling. This should be called in response to mouse up or touch end.\n *\n * @public\n */\n stop: autoscroll.stop\n };\n\n});\n"],"names":["define","$","autoscroll","SCROLL_THRESHOLD","SCROLL_FREQUENCY","SCROLL_SPEED","scrollingId","scrollAmount","callback","start","window","on","mouseMove","touchMove","stop","off","stopScrolling","e","i","changedTouches","length","handleMove","clientX","clientY","Math","min","height","startScrolling","maxScroll","document","setInterval","y","scrollTop","offset","round","realOffset","clearInterval"],"mappings":";;;;;;;;;;;;;AA4BAA,yBAAO,CAAC,WAAW,SAASC,GAIxB,IAAIC,WAAa,CAKbC,iBAAkB,GAMlBC,iBAAkB,IAAO,GAMzBC,aAAc,GAMdC,YAAa,KAMbC,aAAc,EAMdC,SAAU,KASVC,MAAO,SAASD,UACZP,EAAES,QAAQC,GAAG,YAAaT,WAAWU,WACrCX,EAAES,QAAQC,GAAG,YAAaT,WAAWW,WACrCX,WAAWM,SAAWA,QA/Cb,EAuDbM,KAAM,WACFb,EAAES,QAAQK,IAAI,YAAab,WAAWU,WACtCX,EAAES,QAAQK,IAAI,YAAab,WAAWW,WACP,OAA3BX,WAAWI,aACXJ,WAAWc,eA3DN,EAqEbH,UAAW,SAASI,GAChB,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAEE,eAAeC,OAAQF,IACzChB,WAAWmB,WAAWJ,EAAEE,eAAeD,GAAGI,QAASL,EAAEE,eAAeD,GAAGK,QAvElE,EAiFbX,UAAW,SAASK,GAChBf,WAAWmB,WAAWJ,EAAEK,QAASL,EAAEM,QAlF1B,EA4FbF,WAAY,SAASC,QAASC,SAEtBA,QAAUrB,WAAWC,iBACrBD,WAAWK,cAAgBiB,KAAKC,IAAIvB,WAAWC,iBAAmBoB,QAASrB,WAAWC,kBAC/EoB,QAAUtB,EAAES,QAAQgB,SAAWxB,WAAWC,iBACjDD,WAAWK,aAAeiB,KAAKC,IAAIF,SAAWtB,EAAES,QAAQgB,SAAWxB,WAAWC,kBAC1ED,WAAWC,kBAEfD,WAAWK,aAAe,EAE1BL,WAAWK,cAA2C,OAA3BL,WAAWI,YACtCJ,WAAWyB,iBACHzB,WAAWK,cAA2C,OAA3BL,WAAWI,aAC9CJ,WAAWc,eAzGN,EAkHbW,eAAgB,WACZ,IAAIC,UAAY3B,EAAE4B,UAAUH,SAAWzB,EAAES,QAAQgB,SACjDxB,WAAWI,YAAcI,OAAOoB,aAAY,WAEpCC,IAAAA,EAAI9B,EAAES,QAAQsB,YACdC,OAAST,KAAKU,MAAMhC,WAAWK,aAAeL,WAAWG,cAOzD4B,GANAF,EAAIE,OAAS,IACbA,QAAUF,GAEVA,EAAIE,OAASL,YACbK,OAASL,UAAYG,GAEV,IAAXE,OAAAA,CAKJhC,EAAES,QAAQsB,UAAUD,EAAIE,QACpBE,IAAAA,WAAalC,EAAES,QAAQsB,YAAcD,EACtB,IAAfI,YAKAjC,WAAWM,UACXN,WAAWM,SAAS2B,WAXvB,CAcJ,GAAEjC,WAAWE,iBA9IL,EAsJbY,cAAe,WACXN,OAAO0B,cAAclC,WAAWI,aAChCJ,WAAWI,YAAc,IAC5B,GAGE,MAAA,CAQHG,MAAOP,WAAWO,MAOlBK,KAAMZ,WAAWY,KAGxB"} \ No newline at end of file diff --git a/lib/amd/build/backoff_timer.min.js.map b/lib/amd/build/backoff_timer.min.js.map index 76e4a9a2b12..001842f3702 100644 --- a/lib/amd/build/backoff_timer.min.js.map +++ b/lib/amd/build/backoff_timer.min.js.map @@ -1 +1 @@ -{"version":3,"file":"backoff_timer.min.js","sources":["../src/backoff_timer.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 timer that will execute a callback with decreasing frequency. Useful for\n * doing polling on the server without overwhelming it with requests.\n *\n * @module core/backoff_timer\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(function() {\n\n /**\n * Constructor for the back off timer.\n *\n * @class\n * @param {function} callback The function to execute after each tick\n * @param {function} backoffFunction The function to determine what the next timeout value should be\n */\n var BackoffTimer = function(callback, backoffFunction) {\n this.callback = callback;\n this.backOffFunction = backoffFunction;\n };\n\n /**\n * @property {function} callback The function to execute after each tick\n */\n BackoffTimer.prototype.callback = null;\n\n /**\n * @property {function} backoffFunction The function to determine what the next timeout value should be\n */\n BackoffTimer.prototype.backOffFunction = null;\n\n /**\n * @property {int} time The timeout value to use\n */\n BackoffTimer.prototype.time = null;\n\n /**\n * @property {numeric} timeout The timeout identifier\n */\n BackoffTimer.prototype.timeout = null;\n\n /**\n * Generate the next timeout in the back off time sequence\n * for the timer.\n *\n * The back off function is called to calculate the next value.\n * It is given the current value and an array of all previous values.\n *\n * @return {int} The new timeout value (in milliseconds)\n */\n BackoffTimer.prototype.generateNextTime = function() {\n var newTime = this.backOffFunction(this.time);\n this.time = newTime;\n\n return newTime;\n };\n\n /**\n * Stop the current timer and clear the previous time values\n *\n * @return {object} this\n */\n BackoffTimer.prototype.reset = function() {\n this.time = null;\n this.stop();\n\n return this;\n };\n\n /**\n * Clear the current timeout, if one is set.\n *\n * @return {object} this\n */\n BackoffTimer.prototype.stop = function() {\n if (this.timeout) {\n window.clearTimeout(this.timeout);\n this.timeout = null;\n }\n\n return this;\n };\n\n /**\n * Start the current timer by generating the new timeout value and\n * starting the ticks.\n *\n * This function recurses after each tick with a new timeout value\n * generated each time.\n *\n * The callback function is called after each tick.\n *\n * @return {object} this\n */\n BackoffTimer.prototype.start = function() {\n // If we haven't already started.\n if (!this.timeout) {\n var time = this.generateNextTime();\n this.timeout = window.setTimeout(function() {\n this.callback();\n // Clear the existing timer.\n this.stop();\n // Start the next timer.\n this.start();\n }.bind(this), time);\n }\n\n return this;\n };\n\n /**\n * Reset the timer and start it again from the initial timeout\n * values\n *\n * @return {object} this\n */\n BackoffTimer.prototype.restart = function() {\n return this.reset().start();\n };\n\n /**\n * Returns an incremental function for the timer.\n *\n * @param {int} minamount The minimum amount of time we wait before checking\n * @param {int} incrementamount The amount to increment the timer by\n * @param {int} maxamount The max amount to ever increment to\n * @param {int} timeoutamount The timeout to use once we reach the max amount\n * @return {function}\n */\n BackoffTimer.getIncrementalCallback = function(minamount, incrementamount, maxamount, timeoutamount) {\n\n /**\n * An incremental function for the timer.\n *\n * @param {(int|null)} time The current timeout value or null if none set\n * @return {int} The new timeout value\n */\n return function(time) {\n if (!time) {\n return minamount;\n }\n\n // Don't go over the max amount.\n if (time + incrementamount > maxamount) {\n return timeoutamount;\n }\n\n return time + incrementamount;\n };\n };\n\n return BackoffTimer;\n});\n"],"names":["define","BackoffTimer","callback","backoffFunction","backOffFunction","prototype","time","timeout","generateNextTime","newTime","this","reset","stop","window","clearTimeout","start","setTimeout","bind","restart","getIncrementalCallback","minamount","incrementamount","maxamount","timeoutamount"],"mappings":";;;;;;;;AAuBAA,6BAAO,eASCC,aAAe,SAASC,SAAUC,sBAC7BD,SAAWA,cACXE,gBAAkBD,wBAM3BF,aAAaI,UAAUH,SAAW,KAKlCD,aAAaI,UAAUD,gBAAkB,KAKzCH,aAAaI,UAAUC,KAAO,KAK9BL,aAAaI,UAAUE,QAAU,KAWjCN,aAAaI,UAAUG,iBAAmB,eAClCC,QAAUC,KAAKN,gBAAgBM,KAAKJ,kBACnCA,KAAOG,QAELA,SAQXR,aAAaI,UAAUM,MAAQ,uBACtBL,KAAO,UACPM,OAEEF,MAQXT,aAAaI,UAAUO,KAAO,kBACtBF,KAAKH,UACLM,OAAOC,aAAaJ,KAAKH,cACpBA,QAAU,MAGZG,MAcXT,aAAaI,UAAUU,MAAQ,eAEtBL,KAAKH,QAAS,KACXD,KAAOI,KAAKF,wBACXD,QAAUM,OAAOG,WAAW,gBACxBd,gBAEAU,YAEAG,SACPE,KAAKP,MAAOJ,aAGXI,MASXT,aAAaI,UAAUa,QAAU,kBACtBR,KAAKC,QAAQI,SAYvBd,aAAakB,uBAAyB,SAASC,UAAWC,gBAAiBC,UAAWC,sBAQ5E,SAASjB,aACPA,KAKDA,KAAOe,gBAAkBC,UAClBC,cAGJjB,KAAOe,gBARHD,YAYZnB"} \ No newline at end of file +{"version":3,"file":"backoff_timer.min.js","sources":["../src/backoff_timer.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 timer that will execute a callback with decreasing frequency. Useful for\n * doing polling on the server without overwhelming it with requests.\n *\n * @module core/backoff_timer\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(function() {\n\n /**\n * Constructor for the back off timer.\n *\n * @class\n * @param {function} callback The function to execute after each tick\n * @param {function} backoffFunction The function to determine what the next timeout value should be\n */\n var BackoffTimer = function(callback, backoffFunction) {\n this.callback = callback;\n this.backOffFunction = backoffFunction;\n };\n\n /**\n * @property {function} callback The function to execute after each tick\n */\n BackoffTimer.prototype.callback = null;\n\n /**\n * @property {function} backoffFunction The function to determine what the next timeout value should be\n */\n BackoffTimer.prototype.backOffFunction = null;\n\n /**\n * @property {int} time The timeout value to use\n */\n BackoffTimer.prototype.time = null;\n\n /**\n * @property {numeric} timeout The timeout identifier\n */\n BackoffTimer.prototype.timeout = null;\n\n /**\n * Generate the next timeout in the back off time sequence\n * for the timer.\n *\n * The back off function is called to calculate the next value.\n * It is given the current value and an array of all previous values.\n *\n * @return {int} The new timeout value (in milliseconds)\n */\n BackoffTimer.prototype.generateNextTime = function() {\n var newTime = this.backOffFunction(this.time);\n this.time = newTime;\n\n return newTime;\n };\n\n /**\n * Stop the current timer and clear the previous time values\n *\n * @return {object} this\n */\n BackoffTimer.prototype.reset = function() {\n this.time = null;\n this.stop();\n\n return this;\n };\n\n /**\n * Clear the current timeout, if one is set.\n *\n * @return {object} this\n */\n BackoffTimer.prototype.stop = function() {\n if (this.timeout) {\n window.clearTimeout(this.timeout);\n this.timeout = null;\n }\n\n return this;\n };\n\n /**\n * Start the current timer by generating the new timeout value and\n * starting the ticks.\n *\n * This function recurses after each tick with a new timeout value\n * generated each time.\n *\n * The callback function is called after each tick.\n *\n * @return {object} this\n */\n BackoffTimer.prototype.start = function() {\n // If we haven't already started.\n if (!this.timeout) {\n var time = this.generateNextTime();\n this.timeout = window.setTimeout(function() {\n this.callback();\n // Clear the existing timer.\n this.stop();\n // Start the next timer.\n this.start();\n }.bind(this), time);\n }\n\n return this;\n };\n\n /**\n * Reset the timer and start it again from the initial timeout\n * values\n *\n * @return {object} this\n */\n BackoffTimer.prototype.restart = function() {\n return this.reset().start();\n };\n\n /**\n * Returns an incremental function for the timer.\n *\n * @param {int} minamount The minimum amount of time we wait before checking\n * @param {int} incrementamount The amount to increment the timer by\n * @param {int} maxamount The max amount to ever increment to\n * @param {int} timeoutamount The timeout to use once we reach the max amount\n * @return {function}\n */\n BackoffTimer.getIncrementalCallback = function(minamount, incrementamount, maxamount, timeoutamount) {\n\n /**\n * An incremental function for the timer.\n *\n * @param {(int|null)} time The current timeout value or null if none set\n * @return {int} The new timeout value\n */\n return function(time) {\n if (!time) {\n return minamount;\n }\n\n // Don't go over the max amount.\n if (time + incrementamount > maxamount) {\n return timeoutamount;\n }\n\n return time + incrementamount;\n };\n };\n\n return BackoffTimer;\n});\n"],"names":["define","BackoffTimer","callback","backoffFunction","backOffFunction","prototype","time","timeout","generateNextTime","newTime","this","reset","stop","window","clearTimeout","start","setTimeout","bind","restart","getIncrementalCallback","minamount","incrementamount","maxamount","timeoutamount"],"mappings":";;;;;;;;AAuBAA,6BAAO,WASCC,IAAAA,aAAe,SAASC,SAAUC,iBAC7BD,KAAAA,SAAWA,SACXE,KAAAA,gBAAkBD,eAC1B,EAoID,OA/HAF,aAAaI,UAAUH,SAAW,KAKlCD,aAAaI,UAAUD,gBAAkB,KAKzCH,aAAaI,UAAUC,KAAO,KAK9BL,aAAaI,UAAUE,QAAU,KAWjCN,aAAaI,UAAUG,iBAAmB,WACtC,IAAIC,QAAUC,KAAKN,gBAAgBM,KAAKJ,MAGxC,OAFKA,KAAAA,KAAOG,QAELA,OACV,EAODR,aAAaI,UAAUM,MAAQ,WAI3B,OAHKL,KAAAA,KAAO,KACZI,KAAKE,OAEEF,IACV,EAODT,aAAaI,UAAUO,KAAO,WAM1B,OALIF,KAAKH,UACLM,OAAOC,aAAaJ,KAAKH,SACpBA,KAAAA,QAAU,MAGZG,IACV,EAaDT,aAAaI,UAAUU,MAAQ,WAEvB,IAACL,KAAKH,QAAS,CACf,IAAID,KAAOI,KAAKF,mBAChBE,KAAKH,QAAUM,OAAOG,WAAW,WAC7BN,KAAKR,WAELQ,KAAKE,OAELF,KAAKK,OALwB,EAM/BE,KAAKP,MAAOJ,KACjB,CAED,OAAOI,IACV,EAQDT,aAAaI,UAAUa,QAAU,WAC7B,OAAOR,KAAKC,QAAQI,OACvB,EAWAd,aAAakB,uBAAyB,SAASC,UAAWC,gBAAiBC,UAAWC,eAQ5E,OAAA,SAASjB,MACR,OAACA,KAKDA,KAAOe,gBAAkBC,UAClBC,cAGJjB,KAAOe,gBARHD,SASd,CACJ,EAEMnB,YACV"} \ No newline at end of file diff --git a/lib/amd/build/chart_axis.min.js.map b/lib/amd/build/chart_axis.min.js.map index 8aabebfd82d..d9153bfea0a 100644 --- a/lib/amd/build/chart_axis.min.js.map +++ b/lib/amd/build/chart_axis.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_axis.min.js","sources":["../src/chart_axis.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 * Chart axis.\n *\n * @module core/chart_axis\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n\n /**\n * Chart axis class.\n *\n * This is used to represent an axis, whether X or Y.\n *\n * @class core/chart_axis\n */\n function Axis() {\n // Please eslint no-empty-function.\n }\n\n /**\n * Default axis position.\n * @const {Null}\n */\n Axis.prototype.POS_DEFAULT = null;\n\n /**\n * Bottom axis position.\n * @const {String}\n */\n Axis.prototype.POS_BOTTOM = 'bottom';\n\n /**\n * Left axis position.\n * @const {String}\n */\n Axis.prototype.POS_LEFT = 'left';\n\n /**\n * Right axis position.\n * @const {String}\n */\n Axis.prototype.POS_RIGHT = 'right';\n\n /**\n * Top axis position.\n * @const {String}\n */\n Axis.prototype.POS_TOP = 'top';\n\n /**\n * Label of the axis.\n * @type {String}\n * @protected\n */\n Axis.prototype._label = null;\n\n /**\n * Labels of the ticks.\n * @type {String[]}\n * @protected\n */\n Axis.prototype._labels = null;\n\n /**\n * Maximum value of the axis.\n * @type {Number}\n * @protected\n */\n Axis.prototype._max = null;\n\n /**\n * Minimum value of the axis.\n * @type {Number}\n * @protected\n */\n Axis.prototype._min = null;\n\n /**\n * Position of the axis.\n * @type {String}\n * @protected\n */\n Axis.prototype._position = null;\n\n /**\n * Steps on the axis.\n * @type {Number}\n * @protected\n */\n Axis.prototype._stepSize = null;\n\n /**\n * Create a new instance of an axis from serialised data.\n *\n * @static\n * @method create\n * @param {Object} obj The data of the axis.\n * @return {module:core/chart_axis}\n */\n Axis.prototype.create = function(obj) {\n var s = new Axis();\n s.setPosition(obj.position);\n s.setLabel(obj.label);\n s.setStepSize(obj.stepSize);\n s.setMax(obj.max);\n s.setMin(obj.min);\n s.setLabels(obj.labels);\n return s;\n };\n\n /**\n * Get the label of the axis.\n *\n * @method getLabel\n * @return {String}\n */\n Axis.prototype.getLabel = function() {\n return this._label;\n };\n\n /**\n * Get the labels of the ticks of the axis.\n *\n * @method getLabels\n * @return {String[]}\n */\n Axis.prototype.getLabels = function() {\n return this._labels;\n };\n\n /**\n * Get the maximum value of the axis.\n *\n * @method getMax\n * @return {Number}\n */\n Axis.prototype.getMax = function() {\n return this._max;\n };\n\n /**\n * Get the minimum value of the axis.\n *\n * @method getMin\n * @return {Number}\n */\n Axis.prototype.getMin = function() {\n return this._min;\n };\n\n /**\n * Get the position of the axis.\n *\n * @method getPosition\n * @return {String}\n */\n Axis.prototype.getPosition = function() {\n return this._position;\n };\n\n /**\n * Get the step size of the axis.\n *\n * @method getStepSize\n * @return {Number}\n */\n Axis.prototype.getStepSize = function() {\n return this._stepSize;\n };\n\n /**\n * Set the label of the axis.\n *\n * @method setLabel\n * @param {String} label The label.\n */\n Axis.prototype.setLabel = function(label) {\n this._label = label || null;\n };\n\n /**\n * Set the labels of the values on the axis.\n *\n * This automatically sets the [_stepSize]{@link module:core/chart_axis#_stepSize},\n * [_min]{@link module:core/chart_axis#_min} and [_max]{@link module:core/chart_axis#_max}\n * to define a scale from 0 to the number of labels when none of the previously\n * mentioned values have been modified.\n *\n * You can use other values so long that your values in a series are mapped\n * to the values represented by your _min, _max and _stepSize.\n *\n * @method setLabels\n * @param {String[]} labels The labels.\n */\n Axis.prototype.setLabels = function(labels) {\n this._labels = labels || null;\n\n // By default we set the grid according to the labels.\n if (this._labels !== null\n && this._stepSize === null\n && (this._min === null || this._min === 0)\n && this._max === null) {\n this.setStepSize(1);\n this.setMin(0);\n this.setMax(labels.length - 1);\n }\n };\n\n /**\n * Set the maximum value on the axis.\n *\n * When this is not set (or set to null) it is left for the output\n * library to best guess what should be used.\n *\n * @method setMax\n * @param {Number} max The value.\n */\n Axis.prototype.setMax = function(max) {\n this._max = typeof max !== 'undefined' ? max : null;\n };\n\n /**\n * Set the minimum value on the axis.\n *\n * When this is not set (or set to null) it is left for the output\n * library to best guess what should be used.\n *\n * @method setMin\n * @param {Number} min The value.\n */\n Axis.prototype.setMin = function(min) {\n this._min = typeof min !== 'undefined' ? min : null;\n };\n\n /**\n * Set the position of the axis.\n *\n * This does not validate whether or not the constant used is valid\n * as the axis itself is not aware whether it represents the X or Y axis.\n *\n * The output library has to have a fallback in case the values are incorrect.\n * When this is not set to {@link module:core/chart_axis#POS_DEFAULT} it is up\n * to the output library to choose what position fits best.\n *\n * @method setPosition\n * @param {String} position The value.\n */\n Axis.prototype.setPosition = function(position) {\n if (position != this.POS_DEFAULT\n && position != this.POS_BOTTOM\n && position != this.POS_LEFT\n && position != this.POS_RIGHT\n && position != this.POS_TOP) {\n throw new Error('Invalid axis position.');\n }\n this._position = position;\n };\n\n /**\n * Set the stepSize on the axis.\n *\n * This is used to determine where ticks are displayed on the axis between min and max.\n *\n * @method setStepSize\n * @param {Number} stepSize The value.\n */\n Axis.prototype.setStepSize = function(stepSize) {\n if (typeof stepSize === 'undefined' || stepSize === null) {\n stepSize = null;\n } else if (isNaN(Number(stepSize))) {\n throw new Error('Value for stepSize is not a number.');\n } else {\n stepSize = Number(stepSize);\n }\n\n this._stepSize = stepSize;\n };\n\n return Axis;\n\n});\n"],"names":["define","Axis","prototype","POS_DEFAULT","POS_BOTTOM","POS_LEFT","POS_RIGHT","POS_TOP","_label","_labels","_max","_min","_position","_stepSize","create","obj","s","setPosition","position","setLabel","label","setStepSize","stepSize","setMax","max","setMin","min","setLabels","labels","getLabel","this","getLabels","getMax","getMin","getPosition","getStepSize","length","Error","isNaN","Number"],"mappings":";;;;;;;AAsBAA,yBAAO,IAAI,oBASEC,eAQTA,KAAKC,UAAUC,YAAc,KAM7BF,KAAKC,UAAUE,WAAa,SAM5BH,KAAKC,UAAUG,SAAW,OAM1BJ,KAAKC,UAAUI,UAAY,QAM3BL,KAAKC,UAAUK,QAAU,MAOzBN,KAAKC,UAAUM,OAAS,KAOxBP,KAAKC,UAAUO,QAAU,KAOzBR,KAAKC,UAAUQ,KAAO,KAOtBT,KAAKC,UAAUS,KAAO,KAOtBV,KAAKC,UAAUU,UAAY,KAO3BX,KAAKC,UAAUW,UAAY,KAU3BZ,KAAKC,UAAUY,OAAS,SAASC,SACzBC,EAAI,IAAIf,YACZe,EAAEC,YAAYF,IAAIG,UAClBF,EAAEG,SAASJ,IAAIK,OACfJ,EAAEK,YAAYN,IAAIO,UAClBN,EAAEO,OAAOR,IAAIS,KACbR,EAAES,OAAOV,IAAIW,KACbV,EAAEW,UAAUZ,IAAIa,QACTZ,GASXf,KAAKC,UAAU2B,SAAW,kBACfC,KAAKtB,QAShBP,KAAKC,UAAU6B,UAAY,kBAChBD,KAAKrB,SAShBR,KAAKC,UAAU8B,OAAS,kBACbF,KAAKpB,MAShBT,KAAKC,UAAU+B,OAAS,kBACbH,KAAKnB,MAShBV,KAAKC,UAAUgC,YAAc,kBAClBJ,KAAKlB,WAShBX,KAAKC,UAAUiC,YAAc,kBAClBL,KAAKjB,WAShBZ,KAAKC,UAAUiB,SAAW,SAASC,YAC1BZ,OAASY,OAAS,MAiB3BnB,KAAKC,UAAUyB,UAAY,SAASC,aAC3BnB,QAAUmB,QAAU,KAGJ,OAAjBE,KAAKrB,SACqB,OAAnBqB,KAAKjB,WACU,OAAdiB,KAAKnB,MAA+B,IAAdmB,KAAKnB,MACd,OAAdmB,KAAKpB,YACPW,YAAY,QACZI,OAAO,QACPF,OAAOK,OAAOQ,OAAS,KAapCnC,KAAKC,UAAUqB,OAAS,SAASC,UACxBd,UAAsB,IAARc,IAAsBA,IAAM,MAYnDvB,KAAKC,UAAUuB,OAAS,SAASC,UACxBf,UAAsB,IAARe,IAAsBA,IAAM,MAgBnDzB,KAAKC,UAAUe,YAAc,SAASC,aAC9BA,UAAYY,KAAK3B,aACVe,UAAYY,KAAK1B,YACjBc,UAAYY,KAAKzB,UACjBa,UAAYY,KAAKxB,WACjBY,UAAYY,KAAKvB,cAClB,IAAI8B,MAAM,+BAEfzB,UAAYM,UAWrBjB,KAAKC,UAAUmB,YAAc,SAASC,aAC9B,MAAOA,SACPA,SAAW,SACR,CAAA,GAAIgB,MAAMC,OAAOjB,iBACd,IAAIe,MAAM,uCAEhBf,SAAWiB,OAAOjB,eAGjBT,UAAYS,UAGdrB"} \ No newline at end of file +{"version":3,"file":"chart_axis.min.js","sources":["../src/chart_axis.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 * Chart axis.\n *\n * @module core/chart_axis\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n\n /**\n * Chart axis class.\n *\n * This is used to represent an axis, whether X or Y.\n *\n * @class core/chart_axis\n */\n function Axis() {\n // Please eslint no-empty-function.\n }\n\n /**\n * Default axis position.\n * @const {Null}\n */\n Axis.prototype.POS_DEFAULT = null;\n\n /**\n * Bottom axis position.\n * @const {String}\n */\n Axis.prototype.POS_BOTTOM = 'bottom';\n\n /**\n * Left axis position.\n * @const {String}\n */\n Axis.prototype.POS_LEFT = 'left';\n\n /**\n * Right axis position.\n * @const {String}\n */\n Axis.prototype.POS_RIGHT = 'right';\n\n /**\n * Top axis position.\n * @const {String}\n */\n Axis.prototype.POS_TOP = 'top';\n\n /**\n * Label of the axis.\n * @type {String}\n * @protected\n */\n Axis.prototype._label = null;\n\n /**\n * Labels of the ticks.\n * @type {String[]}\n * @protected\n */\n Axis.prototype._labels = null;\n\n /**\n * Maximum value of the axis.\n * @type {Number}\n * @protected\n */\n Axis.prototype._max = null;\n\n /**\n * Minimum value of the axis.\n * @type {Number}\n * @protected\n */\n Axis.prototype._min = null;\n\n /**\n * Position of the axis.\n * @type {String}\n * @protected\n */\n Axis.prototype._position = null;\n\n /**\n * Steps on the axis.\n * @type {Number}\n * @protected\n */\n Axis.prototype._stepSize = null;\n\n /**\n * Create a new instance of an axis from serialised data.\n *\n * @static\n * @method create\n * @param {Object} obj The data of the axis.\n * @return {module:core/chart_axis}\n */\n Axis.prototype.create = function(obj) {\n var s = new Axis();\n s.setPosition(obj.position);\n s.setLabel(obj.label);\n s.setStepSize(obj.stepSize);\n s.setMax(obj.max);\n s.setMin(obj.min);\n s.setLabels(obj.labels);\n return s;\n };\n\n /**\n * Get the label of the axis.\n *\n * @method getLabel\n * @return {String}\n */\n Axis.prototype.getLabel = function() {\n return this._label;\n };\n\n /**\n * Get the labels of the ticks of the axis.\n *\n * @method getLabels\n * @return {String[]}\n */\n Axis.prototype.getLabels = function() {\n return this._labels;\n };\n\n /**\n * Get the maximum value of the axis.\n *\n * @method getMax\n * @return {Number}\n */\n Axis.prototype.getMax = function() {\n return this._max;\n };\n\n /**\n * Get the minimum value of the axis.\n *\n * @method getMin\n * @return {Number}\n */\n Axis.prototype.getMin = function() {\n return this._min;\n };\n\n /**\n * Get the position of the axis.\n *\n * @method getPosition\n * @return {String}\n */\n Axis.prototype.getPosition = function() {\n return this._position;\n };\n\n /**\n * Get the step size of the axis.\n *\n * @method getStepSize\n * @return {Number}\n */\n Axis.prototype.getStepSize = function() {\n return this._stepSize;\n };\n\n /**\n * Set the label of the axis.\n *\n * @method setLabel\n * @param {String} label The label.\n */\n Axis.prototype.setLabel = function(label) {\n this._label = label || null;\n };\n\n /**\n * Set the labels of the values on the axis.\n *\n * This automatically sets the [_stepSize]{@link module:core/chart_axis#_stepSize},\n * [_min]{@link module:core/chart_axis#_min} and [_max]{@link module:core/chart_axis#_max}\n * to define a scale from 0 to the number of labels when none of the previously\n * mentioned values have been modified.\n *\n * You can use other values so long that your values in a series are mapped\n * to the values represented by your _min, _max and _stepSize.\n *\n * @method setLabels\n * @param {String[]} labels The labels.\n */\n Axis.prototype.setLabels = function(labels) {\n this._labels = labels || null;\n\n // By default we set the grid according to the labels.\n if (this._labels !== null\n && this._stepSize === null\n && (this._min === null || this._min === 0)\n && this._max === null) {\n this.setStepSize(1);\n this.setMin(0);\n this.setMax(labels.length - 1);\n }\n };\n\n /**\n * Set the maximum value on the axis.\n *\n * When this is not set (or set to null) it is left for the output\n * library to best guess what should be used.\n *\n * @method setMax\n * @param {Number} max The value.\n */\n Axis.prototype.setMax = function(max) {\n this._max = typeof max !== 'undefined' ? max : null;\n };\n\n /**\n * Set the minimum value on the axis.\n *\n * When this is not set (or set to null) it is left for the output\n * library to best guess what should be used.\n *\n * @method setMin\n * @param {Number} min The value.\n */\n Axis.prototype.setMin = function(min) {\n this._min = typeof min !== 'undefined' ? min : null;\n };\n\n /**\n * Set the position of the axis.\n *\n * This does not validate whether or not the constant used is valid\n * as the axis itself is not aware whether it represents the X or Y axis.\n *\n * The output library has to have a fallback in case the values are incorrect.\n * When this is not set to {@link module:core/chart_axis#POS_DEFAULT} it is up\n * to the output library to choose what position fits best.\n *\n * @method setPosition\n * @param {String} position The value.\n */\n Axis.prototype.setPosition = function(position) {\n if (position != this.POS_DEFAULT\n && position != this.POS_BOTTOM\n && position != this.POS_LEFT\n && position != this.POS_RIGHT\n && position != this.POS_TOP) {\n throw new Error('Invalid axis position.');\n }\n this._position = position;\n };\n\n /**\n * Set the stepSize on the axis.\n *\n * This is used to determine where ticks are displayed on the axis between min and max.\n *\n * @method setStepSize\n * @param {Number} stepSize The value.\n */\n Axis.prototype.setStepSize = function(stepSize) {\n if (typeof stepSize === 'undefined' || stepSize === null) {\n stepSize = null;\n } else if (isNaN(Number(stepSize))) {\n throw new Error('Value for stepSize is not a number.');\n } else {\n stepSize = Number(stepSize);\n }\n\n this._stepSize = stepSize;\n };\n\n return Axis;\n\n});\n"],"names":["define","Axis","prototype","POS_DEFAULT","POS_BOTTOM","POS_LEFT","POS_RIGHT","POS_TOP","_label","_labels","_max","_min","_position","_stepSize","create","obj","s","setPosition","position","setLabel","label","setStepSize","stepSize","setMax","max","setMin","min","setLabels","labels","getLabel","this","getLabels","getMax","getMin","getPosition","getStepSize","length","Error","isNaN","Number"],"mappings":";;;;;;;AAsBAA,OAAM,kBAAC,IAAI,WASEC,SAAAA,OAER,CAqQD,OA/PAA,KAAKC,UAAUC,YAAc,KAM7BF,KAAKC,UAAUE,WAAa,SAM5BH,KAAKC,UAAUG,SAAW,OAM1BJ,KAAKC,UAAUI,UAAY,QAM3BL,KAAKC,UAAUK,QAAU,MAOzBN,KAAKC,UAAUM,OAAS,KAOxBP,KAAKC,UAAUO,QAAU,KAOzBR,KAAKC,UAAUQ,KAAO,KAOtBT,KAAKC,UAAUS,KAAO,KAOtBV,KAAKC,UAAUU,UAAY,KAO3BX,KAAKC,UAAUW,UAAY,KAU3BZ,KAAKC,UAAUY,OAAS,SAASC,KAC7B,IAAIC,EAAI,IAAIf,KAOZ,OANAe,EAAEC,YAAYF,IAAIG,UAClBF,EAAEG,SAASJ,IAAIK,OACfJ,EAAEK,YAAYN,IAAIO,UAClBN,EAAEO,OAAOR,IAAIS,KACbR,EAAES,OAAOV,IAAIW,KACbV,EAAEW,UAAUZ,IAAIa,QACTZ,CACV,EAQDf,KAAKC,UAAU2B,SAAW,WACtB,OAAOC,KAAKtB,MACf,EAQDP,KAAKC,UAAU6B,UAAY,WACvB,OAAOD,KAAKrB,OACf,EAQDR,KAAKC,UAAU8B,OAAS,WACpB,OAAOF,KAAKpB,IACf,EAQDT,KAAKC,UAAU+B,OAAS,WACpB,OAAOH,KAAKnB,IACf,EAQDV,KAAKC,UAAUgC,YAAc,WACzB,OAAOJ,KAAKlB,SACf,EAQDX,KAAKC,UAAUiC,YAAc,WACzB,OAAOL,KAAKjB,SACf,EAQDZ,KAAKC,UAAUiB,SAAW,SAASC,OAC/BU,KAAKtB,OAASY,OAAS,IAC1B,EAgBDnB,KAAKC,UAAUyB,UAAY,SAASC,QAChCE,KAAKrB,QAAUmB,QAAU,KAGJ,OAAjBE,KAAKrB,SACqB,OAAnBqB,KAAKjB,WACU,OAAdiB,KAAKnB,MAA+B,IAAdmB,KAAKnB,MACd,OAAdmB,KAAKpB,OACPW,KAAAA,YAAY,GACZI,KAAAA,OAAO,GACZK,KAAKP,OAAOK,OAAOQ,OAAS,GAEnC,EAWDnC,KAAKC,UAAUqB,OAAS,SAASC,KACxBd,KAAAA,UAAsB,IAARc,IAAsBA,IAAM,IAClD,EAWDvB,KAAKC,UAAUuB,OAAS,SAASC,KACxBf,KAAAA,UAAsB,IAARe,IAAsBA,IAAM,IAClD,EAeDzB,KAAKC,UAAUe,YAAc,SAASC,UAC9BA,GAAAA,UAAYY,KAAK3B,aACVe,UAAYY,KAAK1B,YACjBc,UAAYY,KAAKzB,UACjBa,UAAYY,KAAKxB,WACjBY,UAAYY,KAAKvB,QACxB,MAAM,IAAI8B,MAAM,0BAEfzB,KAAAA,UAAYM,QACpB,EAUDjB,KAAKC,UAAUmB,YAAc,SAASC,UAC9B,GAAA,MAAOA,SACPA,SAAW,SACR,IAAIgB,MAAMC,OAAOjB,WACpB,MAAM,IAAIe,MAAM,uCAEhBf,SAAWiB,OAAOjB,SACrB,CAEIT,KAAAA,UAAYS,QACpB,EAEMrB,IAEV"} \ No newline at end of file diff --git a/lib/amd/build/chart_bar.min.js b/lib/amd/build/chart_bar.min.js index 4e59ef47e36..fac6578adb4 100644 --- a/lib/amd/build/chart_bar.min.js +++ b/lib/amd/build/chart_bar.min.js @@ -5,6 +5,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @module core/chart_bar */ -define("core/chart_bar",["core/chart_base"],(function(Base){function Bar(){Base.prototype.constructor.apply(this,arguments)}return Bar.prototype=Object.create(Base.prototype),Bar.prototype._horizontal=!1,Bar.prototype._stacked=!1,Bar.prototype.TYPE="bar",Bar.prototype.create=function(Klass,data){var chart=Base.prototype.create.apply(this,arguments);return chart.setHorizontal(data.horizontal),chart.setStacked(data.stacked),chart},Bar.prototype._setDefaults=function(){Base.prototype._setDefaults.apply(this,arguments);var axis=this.getYAxis(0,!0);axis.setMin(0)},Bar.prototype.getHorizontal=function(){return this._horizontal},Bar.prototype.getStacked=function(){return this._stacked},Bar.prototype.setHorizontal=function(horizontal){var axis=this.getXAxis(0,!0);null===axis.getMin()&&axis.setMin(0),this._horizontal=Boolean(horizontal)},Bar.prototype.setStacked=function(stacked){this._stacked=Boolean(stacked)},Bar})); +define("core/chart_bar",["core/chart_base"],(function(Base){function Bar(){Base.prototype.constructor.apply(this,arguments)}return Bar.prototype=Object.create(Base.prototype),Bar.prototype._horizontal=!1,Bar.prototype._stacked=!1,Bar.prototype.TYPE="bar",Bar.prototype.create=function(Klass,data){var chart=Base.prototype.create.apply(this,arguments);return chart.setHorizontal(data.horizontal),chart.setStacked(data.stacked),chart},Bar.prototype._setDefaults=function(){Base.prototype._setDefaults.apply(this,arguments),this.getYAxis(0,!0).setMin(0)},Bar.prototype.getHorizontal=function(){return this._horizontal},Bar.prototype.getStacked=function(){return this._stacked},Bar.prototype.setHorizontal=function(horizontal){var axis=this.getXAxis(0,!0);null===axis.getMin()&&axis.setMin(0),this._horizontal=Boolean(horizontal)},Bar.prototype.setStacked=function(stacked){this._stacked=Boolean(stacked)},Bar})); //# sourceMappingURL=chart_bar.min.js.map \ No newline at end of file diff --git a/lib/amd/build/chart_bar.min.js.map b/lib/amd/build/chart_bar.min.js.map index 7ccfb81c248..fab2eb0b26e 100644 --- a/lib/amd/build/chart_bar.min.js.map +++ b/lib/amd/build/chart_bar.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_bar.min.js","sources":["../src/chart_bar.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 * Chart bar.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_bar\n */\ndefine(['core/chart_base'], function(Base) {\n\n /**\n * Bar chart.\n *\n * @extends {module:core/chart_base}\n * @class\n */\n function Bar() {\n Base.prototype.constructor.apply(this, arguments);\n }\n Bar.prototype = Object.create(Base.prototype);\n\n /**\n * Whether the bars should be displayed horizontally or not.\n *\n * @type {Bool}\n * @protected\n */\n Bar.prototype._horizontal = false;\n\n /**\n * Whether the bars should be stacked or not.\n *\n * @type {Bool}\n * @protected\n */\n Bar.prototype._stacked = false;\n\n /** @override */\n Bar.prototype.TYPE = 'bar';\n\n /** @override */\n Bar.prototype.create = function(Klass, data) {\n var chart = Base.prototype.create.apply(this, arguments);\n chart.setHorizontal(data.horizontal);\n chart.setStacked(data.stacked);\n return chart;\n };\n\n /** @override */\n Bar.prototype._setDefaults = function() {\n Base.prototype._setDefaults.apply(this, arguments);\n var axis = this.getYAxis(0, true);\n axis.setMin(0);\n };\n\n /**\n * Get whether the bars should be displayed horizontally or not.\n *\n * @returns {Bool}\n */\n Bar.prototype.getHorizontal = function() {\n return this._horizontal;\n };\n\n /**\n * Get whether the bars should be stacked or not.\n *\n * @returns {Bool}\n */\n Bar.prototype.getStacked = function() {\n return this._stacked;\n };\n\n /**\n * Set whether the bars should be displayed horizontally or not.\n *\n * It sets the X Axis to zero if the min value is null.\n *\n * @param {Bool} horizontal True if the bars should be displayed horizontally, false otherwise.\n */\n Bar.prototype.setHorizontal = function(horizontal) {\n var axis = this.getXAxis(0, true);\n if (axis.getMin() === null) {\n axis.setMin(0);\n }\n this._horizontal = Boolean(horizontal);\n };\n\n /**\n * Set whether the bars should be stacked or not.\n *\n * @method setStacked\n * @param {Bool} stacked True if the chart should be stacked or false otherwise.\n */\n Bar.prototype.setStacked = function(stacked) {\n this._stacked = Boolean(stacked);\n };\n\n return Bar;\n\n});\n"],"names":["define","Base","Bar","prototype","constructor","apply","this","arguments","Object","create","_horizontal","_stacked","TYPE","Klass","data","chart","setHorizontal","horizontal","setStacked","stacked","_setDefaults","axis","getYAxis","setMin","getHorizontal","getStacked","getXAxis","getMin","Boolean"],"mappings":";;;;;;;AAsBAA,wBAAO,CAAC,oBAAoB,SAASC,eAQxBC,MACLD,KAAKE,UAAUC,YAAYC,MAAMC,KAAMC,kBAE3CL,IAAIC,UAAYK,OAAOC,OAAOR,KAAKE,WAQnCD,IAAIC,UAAUO,aAAc,EAQ5BR,IAAIC,UAAUQ,UAAW,EAGzBT,IAAIC,UAAUS,KAAO,MAGrBV,IAAIC,UAAUM,OAAS,SAASI,MAAOC,UAC/BC,MAAQd,KAAKE,UAAUM,OAAOJ,MAAMC,KAAMC,kBAC9CQ,MAAMC,cAAcF,KAAKG,YACzBF,MAAMG,WAAWJ,KAAKK,SACfJ,OAIXb,IAAIC,UAAUiB,aAAe,WACzBnB,KAAKE,UAAUiB,aAAaf,MAAMC,KAAMC,eACpCc,KAAOf,KAAKgB,SAAS,GAAG,GAC5BD,KAAKE,OAAO,IAQhBrB,IAAIC,UAAUqB,cAAgB,kBACnBlB,KAAKI,aAQhBR,IAAIC,UAAUsB,WAAa,kBAChBnB,KAAKK,UAUhBT,IAAIC,UAAUa,cAAgB,SAASC,gBAC/BI,KAAOf,KAAKoB,SAAS,GAAG,GACN,OAAlBL,KAAKM,UACLN,KAAKE,OAAO,QAEXb,YAAckB,QAAQX,aAS/Bf,IAAIC,UAAUe,WAAa,SAASC,cAC3BR,SAAWiB,QAAQT,UAGrBjB"} \ No newline at end of file +{"version":3,"file":"chart_bar.min.js","sources":["../src/chart_bar.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 * Chart bar.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_bar\n */\ndefine(['core/chart_base'], function(Base) {\n\n /**\n * Bar chart.\n *\n * @extends {module:core/chart_base}\n * @class\n */\n function Bar() {\n Base.prototype.constructor.apply(this, arguments);\n }\n Bar.prototype = Object.create(Base.prototype);\n\n /**\n * Whether the bars should be displayed horizontally or not.\n *\n * @type {Bool}\n * @protected\n */\n Bar.prototype._horizontal = false;\n\n /**\n * Whether the bars should be stacked or not.\n *\n * @type {Bool}\n * @protected\n */\n Bar.prototype._stacked = false;\n\n /** @override */\n Bar.prototype.TYPE = 'bar';\n\n /** @override */\n Bar.prototype.create = function(Klass, data) {\n var chart = Base.prototype.create.apply(this, arguments);\n chart.setHorizontal(data.horizontal);\n chart.setStacked(data.stacked);\n return chart;\n };\n\n /** @override */\n Bar.prototype._setDefaults = function() {\n Base.prototype._setDefaults.apply(this, arguments);\n var axis = this.getYAxis(0, true);\n axis.setMin(0);\n };\n\n /**\n * Get whether the bars should be displayed horizontally or not.\n *\n * @returns {Bool}\n */\n Bar.prototype.getHorizontal = function() {\n return this._horizontal;\n };\n\n /**\n * Get whether the bars should be stacked or not.\n *\n * @returns {Bool}\n */\n Bar.prototype.getStacked = function() {\n return this._stacked;\n };\n\n /**\n * Set whether the bars should be displayed horizontally or not.\n *\n * It sets the X Axis to zero if the min value is null.\n *\n * @param {Bool} horizontal True if the bars should be displayed horizontally, false otherwise.\n */\n Bar.prototype.setHorizontal = function(horizontal) {\n var axis = this.getXAxis(0, true);\n if (axis.getMin() === null) {\n axis.setMin(0);\n }\n this._horizontal = Boolean(horizontal);\n };\n\n /**\n * Set whether the bars should be stacked or not.\n *\n * @method setStacked\n * @param {Bool} stacked True if the chart should be stacked or false otherwise.\n */\n Bar.prototype.setStacked = function(stacked) {\n this._stacked = Boolean(stacked);\n };\n\n return Bar;\n\n});\n"],"names":["define","Base","Bar","prototype","constructor","apply","this","arguments","Object","create","_horizontal","_stacked","TYPE","Klass","data","chart","setHorizontal","horizontal","setStacked","stacked","_setDefaults","getYAxis","setMin","getHorizontal","getStacked","axis","getXAxis","getMin","Boolean"],"mappings":";;;;;;;AAsBAA,wBAAO,CAAC,oBAAoB,SAASC,MAQjC,SAASC,MACLD,KAAKE,UAAUC,YAAYC,MAAMC,KAAMC,UAC1C,CAgFD,OA/EAL,IAAIC,UAAYK,OAAOC,OAAOR,KAAKE,WAQnCD,IAAIC,UAAUO,aAAc,EAQ5BR,IAAIC,UAAUQ,UAAW,EAGzBT,IAAIC,UAAUS,KAAO,MAGrBV,IAAIC,UAAUM,OAAS,SAASI,MAAOC,MACnC,IAAIC,MAAQd,KAAKE,UAAUM,OAAOJ,MAAMC,KAAMC,WAG9C,OAFAQ,MAAMC,cAAcF,KAAKG,YACzBF,MAAMG,WAAWJ,KAAKK,SACfJ,KACV,EAGDb,IAAIC,UAAUiB,aAAe,WACzBnB,KAAKE,UAAUiB,aAAaf,MAAMC,KAAMC,WAC7BD,KAAKe,SAAS,GAAG,GACvBC,OAAO,EACf,EAODpB,IAAIC,UAAUoB,cAAgB,WAC1B,OAAOjB,KAAKI,WACf,EAODR,IAAIC,UAAUqB,WAAa,WACvB,OAAOlB,KAAKK,QACf,EASDT,IAAIC,UAAUa,cAAgB,SAASC,YAC/BQ,IAAAA,KAAOnB,KAAKoB,SAAS,GAAG,GACN,OAAlBD,KAAKE,UACLF,KAAKH,OAAO,GAEhBhB,KAAKI,YAAckB,QAAQX,WAC9B,EAQDf,IAAIC,UAAUe,WAAa,SAASC,SAChCb,KAAKK,SAAWiB,QAAQT,QAC3B,EAEMjB,GAEV"} \ No newline at end of file diff --git a/lib/amd/build/chart_base.min.js.map b/lib/amd/build/chart_base.min.js.map index f6e8e680643..b9353965600 100644 --- a/lib/amd/build/chart_base.min.js.map +++ b/lib/amd/build/chart_base.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_base.min.js","sources":["../src/chart_base.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 * Chart base.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_base\n */\ndefine(['core/chart_series', 'core/chart_axis'], function(Series, Axis) {\n\n /**\n * Chart base.\n *\n * The constructor of a chart must never take any argument.\n *\n * {@link module:core/chart_base#_setDefault} to set the defaults on instantiation.\n *\n * @class\n */\n function Base() {\n this._series = [];\n this._labels = [];\n this._xaxes = [];\n this._yaxes = [];\n\n this._setDefaults();\n }\n\n /**\n * The series constituting this chart.\n *\n * @protected\n * @type {module:core/chart_series[]}\n */\n Base.prototype._series = null;\n\n /**\n * The labels of the X axis when categorised.\n *\n * @protected\n * @type {String[]}\n */\n Base.prototype._labels = null;\n\n /**\n * Options for chart legend display.\n *\n * @protected\n * @type {Object}\n */\n Base.prototype._legendOptions = null;\n\n /**\n * The title of the chart.\n *\n * @protected\n * @type {String}\n */\n Base.prototype._title = null;\n\n /**\n * The X axes.\n *\n * @protected\n * @type {module:core/chart_axis[]}\n */\n Base.prototype._xaxes = null;\n\n /**\n * The Y axes.\n *\n * @protected\n * @type {module:core/chart_axis[]}\n */\n Base.prototype._yaxes = null;\n\n /**\n * Colours to pick from when automatically assigning them.\n *\n * @const\n * @type {String[]}\n */\n Base.prototype.COLORSET = ['#f3c300', '#875692', '#f38400', '#a1caf1', '#be0032', '#c2b280', '#7f180d', '#008856',\n '#e68fac', '#0067a5'];\n\n /**\n * Set of colours defined by setting $CFG->chart_colorset to be picked when automatically assigning them.\n *\n * @type {String[]}\n * @protected\n */\n Base.prototype._configColorSet = null;\n\n /**\n * The type of chart.\n *\n * @abstract\n * @type {String}\n * @const\n */\n Base.prototype.TYPE = null;\n\n /**\n * Add a series to the chart.\n *\n * This will automatically assign a color to the series if it does not have one.\n *\n * @param {module:core/chart_series} series The series to add.\n */\n Base.prototype.addSeries = function(series) {\n this._validateSeries(series);\n this._series.push(series);\n\n // Give a default color from the set.\n if (series.getColor() === null) {\n var configColorSet = this.getConfigColorSet() || Base.prototype.COLORSET;\n series.setColor(configColorSet[this._series.length % configColorSet.length]);\n }\n };\n\n /**\n * Create a new instance of a chart from serialised data.\n *\n * the serialised attributes they offer and support.\n *\n * @static\n * @method create\n * @param {module:core/chart_base} Klass The class oject representing the type of chart to instantiate.\n * @param {Object} data The data of the chart.\n * @return {module:core/chart_base}\n */\n Base.prototype.create = function(Klass, data) {\n // TODO Not convinced about the usage of Klass here but I can't figure out a way\n // to have a reference to the class in the sub classes, in PHP I'd do new self().\n var Chart = new Klass();\n Chart.setConfigColorSet(data.config_colorset);\n Chart.setLabels(data.labels);\n Chart.setTitle(data.title);\n if (data.legend_options) {\n Chart.setLegendOptions(data.legend_options);\n }\n data.series.forEach(function(seriesData) {\n Chart.addSeries(Series.prototype.create(seriesData));\n });\n data.axes.x.forEach(function(axisData, i) {\n Chart.setXAxis(Axis.prototype.create(axisData), i);\n });\n data.axes.y.forEach(function(axisData, i) {\n Chart.setYAxis(Axis.prototype.create(axisData), i);\n });\n return Chart;\n };\n\n /**\n * Get an axis.\n *\n * @private\n * @param {String} xy Accepts the values 'x' or 'y'.\n * @param {Number} [index=0] The index of the axis of its type.\n * @param {Bool} [createIfNotExists=false] When true, create an instance if it does not exist.\n * @return {module:core/chart_axis}\n */\n Base.prototype.__getAxis = function(xy, index, createIfNotExists) {\n var axes = xy === 'x' ? this._xaxes : this._yaxes,\n setAxis = (xy === 'x' ? this.setXAxis : this.setYAxis).bind(this),\n axis;\n\n index = typeof index === 'undefined' ? 0 : index;\n createIfNotExists = typeof createIfNotExists === 'undefined' ? false : createIfNotExists;\n axis = axes[index];\n\n if (typeof axis === 'undefined') {\n if (!createIfNotExists) {\n throw new Error('Unknown axis.');\n }\n axis = new Axis();\n setAxis(axis, index);\n }\n\n return axis;\n };\n\n /**\n * Get colours defined by setting.\n *\n * @return {String[]}\n */\n Base.prototype.getConfigColorSet = function() {\n return this._configColorSet;\n };\n\n /**\n * Get the labels of the X axis.\n *\n * @return {String[]}\n */\n Base.prototype.getLabels = function() {\n return this._labels;\n };\n\n /**\n * Get whether to display the chart legend.\n *\n * @return {Bool}\n */\n Base.prototype.getLegendOptions = function() {\n return this._legendOptions;\n };\n\n /**\n * Get the series.\n *\n * @return {module:core/chart_series[]}\n */\n Base.prototype.getSeries = function() {\n return this._series;\n };\n\n /**\n * Get the title of the chart.\n *\n * @return {String}\n */\n Base.prototype.getTitle = function() {\n return this._title;\n };\n\n /**\n * Get the type of chart.\n *\n * @see module:core/chart_base#TYPE\n * @return {String}\n */\n Base.prototype.getType = function() {\n if (!this.TYPE) {\n throw new Error('The TYPE property has not been set.');\n }\n return this.TYPE;\n };\n\n /**\n * Get the X axes.\n *\n * @return {module:core/chart_axis[]}\n */\n Base.prototype.getXAxes = function() {\n return this._xaxes;\n };\n\n /**\n * Get an X axis.\n *\n * @param {Number} [index=0] The index of the axis.\n * @param {Bool} [createIfNotExists=false] Create the instance of it does not exist at index.\n * @return {module:core/chart_axis}\n */\n Base.prototype.getXAxis = function(index, createIfNotExists) {\n return this.__getAxis('x', index, createIfNotExists);\n };\n\n /**\n * Get the Y axes.\n *\n * @return {module:core/chart_axis[]}\n */\n Base.prototype.getYAxes = function() {\n return this._yaxes;\n };\n\n /**\n * Get an Y axis.\n *\n * @param {Number} [index=0] The index of the axis.\n * @param {Bool} [createIfNotExists=false] Create the instance of it does not exist at index.\n * @return {module:core/chart_axis}\n */\n Base.prototype.getYAxis = function(index, createIfNotExists) {\n return this.__getAxis('y', index, createIfNotExists);\n };\n\n /**\n * Set colours defined by setting.\n *\n * @param {String[]} colorset An array of css colours.\n * @protected\n */\n Base.prototype.setConfigColorSet = function(colorset) {\n this._configColorSet = colorset;\n };\n\n /**\n * Set the defaults for this chart type.\n *\n * Child classes can extend this to set defaults values on instantiation.\n *\n * emphasize and self-document the defaults values set by the chart type.\n *\n * @protected\n */\n Base.prototype._setDefaults = function() {\n // For the children to extend.\n };\n\n /**\n * Set the labels of the X axis.\n *\n * This requires for each series to contain strictly as many values as there\n * are labels.\n *\n * @param {String[]} labels The labels.\n */\n Base.prototype.setLabels = function(labels) {\n if (labels.length && this._series.length && this._series[0].length != labels.length) {\n throw new Error('Series must match label values.');\n }\n this._labels = labels;\n };\n\n /**\n * Set options for chart legend display.\n *\n * @param {Object} legendOptions\n */\n Base.prototype.setLegendOptions = function(legendOptions) {\n if (typeof legendOptions !== 'object') {\n throw new Error('Setting legend with non-object value:' + legendOptions);\n }\n this._legendOptions = legendOptions;\n };\n\n /**\n * Set the title of the chart.\n *\n * @param {String} title The title.\n */\n Base.prototype.setTitle = function(title) {\n this._title = title;\n };\n\n /**\n * Set an X axis.\n *\n * Note that this will override any predefined axis without warning.\n *\n * @param {module:core/chart_axis} axis The axis.\n * @param {Number} [index=0] The index of the axis.\n */\n Base.prototype.setXAxis = function(axis, index) {\n index = typeof index === 'undefined' ? 0 : index;\n this._validateAxis('x', axis, index);\n this._xaxes[index] = axis;\n };\n\n /**\n * Set a Y axis.\n *\n * Note that this will override any predefined axis without warning.\n *\n * @param {module:core/chart_axis} axis The axis.\n * @param {Number} [index=0] The index of the axis.\n */\n Base.prototype.setYAxis = function(axis, index) {\n index = typeof index === 'undefined' ? 0 : index;\n this._validateAxis('y', axis, index);\n this._yaxes[index] = axis;\n };\n\n /**\n * Validate an axis.\n *\n * @protected\n * @param {String} xy X or Y axis.\n * @param {module:core/chart_axis} axis The axis to validate.\n * @param {Number} [index=0] The index of the axis.\n */\n Base.prototype._validateAxis = function(xy, axis, index) {\n index = typeof index === 'undefined' ? 0 : index;\n if (index > 0) {\n var axes = xy == 'x' ? this._xaxes : this._yaxes;\n if (typeof axes[index - 1] === 'undefined') {\n throw new Error('Missing ' + xy + ' axis at index lower than ' + index);\n }\n }\n };\n\n /**\n * Validate a series.\n *\n * @protected\n * @param {module:core/chart_series} series The series to validate.\n */\n Base.prototype._validateSeries = function(series) {\n if (this._series.length && this._series[0].getCount() != series.getCount()) {\n throw new Error('Series do not have an equal number of values.');\n\n } else if (this._labels.length && this._labels.length != series.getCount()) {\n throw new Error('Series must match label values.');\n }\n };\n\n return Base;\n\n});\n"],"names":["define","Series","Axis","Base","_series","_labels","_xaxes","_yaxes","_setDefaults","prototype","_legendOptions","_title","COLORSET","_configColorSet","TYPE","addSeries","series","_validateSeries","push","getColor","configColorSet","this","getConfigColorSet","setColor","length","create","Klass","data","Chart","setConfigColorSet","config_colorset","setLabels","labels","setTitle","title","legend_options","setLegendOptions","forEach","seriesData","axes","x","axisData","i","setXAxis","y","setYAxis","__getAxis","xy","index","createIfNotExists","axis","setAxis","bind","Error","getLabels","getLegendOptions","getSeries","getTitle","getType","getXAxes","getXAxis","getYAxes","getYAxis","colorset","legendOptions","_typeof","_validateAxis","getCount"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chart_base.min.js","sources":["../src/chart_base.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 * Chart base.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_base\n */\ndefine(['core/chart_series', 'core/chart_axis'], function(Series, Axis) {\n\n /**\n * Chart base.\n *\n * The constructor of a chart must never take any argument.\n *\n * {@link module:core/chart_base#_setDefault} to set the defaults on instantiation.\n *\n * @class\n */\n function Base() {\n this._series = [];\n this._labels = [];\n this._xaxes = [];\n this._yaxes = [];\n\n this._setDefaults();\n }\n\n /**\n * The series constituting this chart.\n *\n * @protected\n * @type {module:core/chart_series[]}\n */\n Base.prototype._series = null;\n\n /**\n * The labels of the X axis when categorised.\n *\n * @protected\n * @type {String[]}\n */\n Base.prototype._labels = null;\n\n /**\n * Options for chart legend display.\n *\n * @protected\n * @type {Object}\n */\n Base.prototype._legendOptions = null;\n\n /**\n * The title of the chart.\n *\n * @protected\n * @type {String}\n */\n Base.prototype._title = null;\n\n /**\n * The X axes.\n *\n * @protected\n * @type {module:core/chart_axis[]}\n */\n Base.prototype._xaxes = null;\n\n /**\n * The Y axes.\n *\n * @protected\n * @type {module:core/chart_axis[]}\n */\n Base.prototype._yaxes = null;\n\n /**\n * Colours to pick from when automatically assigning them.\n *\n * @const\n * @type {String[]}\n */\n Base.prototype.COLORSET = ['#f3c300', '#875692', '#f38400', '#a1caf1', '#be0032', '#c2b280', '#7f180d', '#008856',\n '#e68fac', '#0067a5'];\n\n /**\n * Set of colours defined by setting $CFG->chart_colorset to be picked when automatically assigning them.\n *\n * @type {String[]}\n * @protected\n */\n Base.prototype._configColorSet = null;\n\n /**\n * The type of chart.\n *\n * @abstract\n * @type {String}\n * @const\n */\n Base.prototype.TYPE = null;\n\n /**\n * Add a series to the chart.\n *\n * This will automatically assign a color to the series if it does not have one.\n *\n * @param {module:core/chart_series} series The series to add.\n */\n Base.prototype.addSeries = function(series) {\n this._validateSeries(series);\n this._series.push(series);\n\n // Give a default color from the set.\n if (series.getColor() === null) {\n var configColorSet = this.getConfigColorSet() || Base.prototype.COLORSET;\n series.setColor(configColorSet[this._series.length % configColorSet.length]);\n }\n };\n\n /**\n * Create a new instance of a chart from serialised data.\n *\n * the serialised attributes they offer and support.\n *\n * @static\n * @method create\n * @param {module:core/chart_base} Klass The class oject representing the type of chart to instantiate.\n * @param {Object} data The data of the chart.\n * @return {module:core/chart_base}\n */\n Base.prototype.create = function(Klass, data) {\n // TODO Not convinced about the usage of Klass here but I can't figure out a way\n // to have a reference to the class in the sub classes, in PHP I'd do new self().\n var Chart = new Klass();\n Chart.setConfigColorSet(data.config_colorset);\n Chart.setLabels(data.labels);\n Chart.setTitle(data.title);\n if (data.legend_options) {\n Chart.setLegendOptions(data.legend_options);\n }\n data.series.forEach(function(seriesData) {\n Chart.addSeries(Series.prototype.create(seriesData));\n });\n data.axes.x.forEach(function(axisData, i) {\n Chart.setXAxis(Axis.prototype.create(axisData), i);\n });\n data.axes.y.forEach(function(axisData, i) {\n Chart.setYAxis(Axis.prototype.create(axisData), i);\n });\n return Chart;\n };\n\n /**\n * Get an axis.\n *\n * @private\n * @param {String} xy Accepts the values 'x' or 'y'.\n * @param {Number} [index=0] The index of the axis of its type.\n * @param {Bool} [createIfNotExists=false] When true, create an instance if it does not exist.\n * @return {module:core/chart_axis}\n */\n Base.prototype.__getAxis = function(xy, index, createIfNotExists) {\n var axes = xy === 'x' ? this._xaxes : this._yaxes,\n setAxis = (xy === 'x' ? this.setXAxis : this.setYAxis).bind(this),\n axis;\n\n index = typeof index === 'undefined' ? 0 : index;\n createIfNotExists = typeof createIfNotExists === 'undefined' ? false : createIfNotExists;\n axis = axes[index];\n\n if (typeof axis === 'undefined') {\n if (!createIfNotExists) {\n throw new Error('Unknown axis.');\n }\n axis = new Axis();\n setAxis(axis, index);\n }\n\n return axis;\n };\n\n /**\n * Get colours defined by setting.\n *\n * @return {String[]}\n */\n Base.prototype.getConfigColorSet = function() {\n return this._configColorSet;\n };\n\n /**\n * Get the labels of the X axis.\n *\n * @return {String[]}\n */\n Base.prototype.getLabels = function() {\n return this._labels;\n };\n\n /**\n * Get whether to display the chart legend.\n *\n * @return {Bool}\n */\n Base.prototype.getLegendOptions = function() {\n return this._legendOptions;\n };\n\n /**\n * Get the series.\n *\n * @return {module:core/chart_series[]}\n */\n Base.prototype.getSeries = function() {\n return this._series;\n };\n\n /**\n * Get the title of the chart.\n *\n * @return {String}\n */\n Base.prototype.getTitle = function() {\n return this._title;\n };\n\n /**\n * Get the type of chart.\n *\n * @see module:core/chart_base#TYPE\n * @return {String}\n */\n Base.prototype.getType = function() {\n if (!this.TYPE) {\n throw new Error('The TYPE property has not been set.');\n }\n return this.TYPE;\n };\n\n /**\n * Get the X axes.\n *\n * @return {module:core/chart_axis[]}\n */\n Base.prototype.getXAxes = function() {\n return this._xaxes;\n };\n\n /**\n * Get an X axis.\n *\n * @param {Number} [index=0] The index of the axis.\n * @param {Bool} [createIfNotExists=false] Create the instance of it does not exist at index.\n * @return {module:core/chart_axis}\n */\n Base.prototype.getXAxis = function(index, createIfNotExists) {\n return this.__getAxis('x', index, createIfNotExists);\n };\n\n /**\n * Get the Y axes.\n *\n * @return {module:core/chart_axis[]}\n */\n Base.prototype.getYAxes = function() {\n return this._yaxes;\n };\n\n /**\n * Get an Y axis.\n *\n * @param {Number} [index=0] The index of the axis.\n * @param {Bool} [createIfNotExists=false] Create the instance of it does not exist at index.\n * @return {module:core/chart_axis}\n */\n Base.prototype.getYAxis = function(index, createIfNotExists) {\n return this.__getAxis('y', index, createIfNotExists);\n };\n\n /**\n * Set colours defined by setting.\n *\n * @param {String[]} colorset An array of css colours.\n * @protected\n */\n Base.prototype.setConfigColorSet = function(colorset) {\n this._configColorSet = colorset;\n };\n\n /**\n * Set the defaults for this chart type.\n *\n * Child classes can extend this to set defaults values on instantiation.\n *\n * emphasize and self-document the defaults values set by the chart type.\n *\n * @protected\n */\n Base.prototype._setDefaults = function() {\n // For the children to extend.\n };\n\n /**\n * Set the labels of the X axis.\n *\n * This requires for each series to contain strictly as many values as there\n * are labels.\n *\n * @param {String[]} labels The labels.\n */\n Base.prototype.setLabels = function(labels) {\n if (labels.length && this._series.length && this._series[0].length != labels.length) {\n throw new Error('Series must match label values.');\n }\n this._labels = labels;\n };\n\n /**\n * Set options for chart legend display.\n *\n * @param {Object} legendOptions\n */\n Base.prototype.setLegendOptions = function(legendOptions) {\n if (typeof legendOptions !== 'object') {\n throw new Error('Setting legend with non-object value:' + legendOptions);\n }\n this._legendOptions = legendOptions;\n };\n\n /**\n * Set the title of the chart.\n *\n * @param {String} title The title.\n */\n Base.prototype.setTitle = function(title) {\n this._title = title;\n };\n\n /**\n * Set an X axis.\n *\n * Note that this will override any predefined axis without warning.\n *\n * @param {module:core/chart_axis} axis The axis.\n * @param {Number} [index=0] The index of the axis.\n */\n Base.prototype.setXAxis = function(axis, index) {\n index = typeof index === 'undefined' ? 0 : index;\n this._validateAxis('x', axis, index);\n this._xaxes[index] = axis;\n };\n\n /**\n * Set a Y axis.\n *\n * Note that this will override any predefined axis without warning.\n *\n * @param {module:core/chart_axis} axis The axis.\n * @param {Number} [index=0] The index of the axis.\n */\n Base.prototype.setYAxis = function(axis, index) {\n index = typeof index === 'undefined' ? 0 : index;\n this._validateAxis('y', axis, index);\n this._yaxes[index] = axis;\n };\n\n /**\n * Validate an axis.\n *\n * @protected\n * @param {String} xy X or Y axis.\n * @param {module:core/chart_axis} axis The axis to validate.\n * @param {Number} [index=0] The index of the axis.\n */\n Base.prototype._validateAxis = function(xy, axis, index) {\n index = typeof index === 'undefined' ? 0 : index;\n if (index > 0) {\n var axes = xy == 'x' ? this._xaxes : this._yaxes;\n if (typeof axes[index - 1] === 'undefined') {\n throw new Error('Missing ' + xy + ' axis at index lower than ' + index);\n }\n }\n };\n\n /**\n * Validate a series.\n *\n * @protected\n * @param {module:core/chart_series} series The series to validate.\n */\n Base.prototype._validateSeries = function(series) {\n if (this._series.length && this._series[0].getCount() != series.getCount()) {\n throw new Error('Series do not have an equal number of values.');\n\n } else if (this._labels.length && this._labels.length != series.getCount()) {\n throw new Error('Series must match label values.');\n }\n };\n\n return Base;\n\n});\n"],"names":["define","Series","Axis","Base","_series","_labels","_xaxes","_yaxes","this","_setDefaults","prototype","_legendOptions","_title","COLORSET","_configColorSet","TYPE","addSeries","series","_validateSeries","push","getColor","configColorSet","getConfigColorSet","setColor","length","create","Klass","data","Chart","setConfigColorSet","config_colorset","setLabels","labels","setTitle","title","legend_options","setLegendOptions","forEach","seriesData","axes","x","axisData","i","setXAxis","y","setYAxis","__getAxis","xy","index","createIfNotExists","axis","setAxis","bind","Error","getLabels","getLegendOptions","getSeries","getTitle","getType","getXAxes","getXAxis","getYAxes","getYAxis","colorset","legendOptions","_typeof","_validateAxis","getCount"],"mappings":"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"} \ No newline at end of file diff --git a/lib/amd/build/chart_builder.min.js.map b/lib/amd/build/chart_builder.min.js.map index 537b1418a22..562af807b17 100644 --- a/lib/amd/build/chart_builder.min.js.map +++ b/lib/amd/build/chart_builder.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_builder.min.js","sources":["../src/chart_builder.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 * Chart builder.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n /**\n * Chart builder.\n *\n * @exports core/chart_builder\n */\n var module = {\n\n /**\n * Make a chart instance.\n *\n * This takes data, most likely generated in PHP, and creates a chart instance from it\n * deferring most of the logic to {@link module:core/chart_base.create}.\n *\n * @param {Object} data The data.\n * @return {Promise} A promise resolved with the chart instance.\n */\n make: function(data) {\n var deferred = $.Deferred();\n require(['core/chart_' + data.type], function(Klass) {\n var instance = Klass.prototype.create(Klass, data);\n deferred.resolve(instance);\n });\n return deferred.promise();\n }\n };\n\n return module;\n\n});\n"],"names":["define","$","make","data","deferred","Deferred","require","type","Klass","instance","prototype","create","resolve","promise"],"mappings":";;;;;;AAqBAA,4BAAO,CAAC,WAAW,SAASC,SAOX,CAWTC,KAAM,SAASC,UACPC,SAAWH,EAAEI,kBACjBC,QAAQ,CAAC,cAAgBH,KAAKI,OAAO,SAASC,WACtCC,SAAWD,MAAME,UAAUC,OAAOH,MAAOL,MAC7CC,SAASQ,QAAQH,aAEdL,SAASS"} \ No newline at end of file +{"version":3,"file":"chart_builder.min.js","sources":["../src/chart_builder.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 * Chart builder.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n /**\n * Chart builder.\n *\n * @exports core/chart_builder\n */\n var module = {\n\n /**\n * Make a chart instance.\n *\n * This takes data, most likely generated in PHP, and creates a chart instance from it\n * deferring most of the logic to {@link module:core/chart_base.create}.\n *\n * @param {Object} data The data.\n * @return {Promise} A promise resolved with the chart instance.\n */\n make: function(data) {\n var deferred = $.Deferred();\n require(['core/chart_' + data.type], function(Klass) {\n var instance = Klass.prototype.create(Klass, data);\n deferred.resolve(instance);\n });\n return deferred.promise();\n }\n };\n\n return module;\n\n});\n"],"names":["define","$","make","data","deferred","Deferred","require","type","Klass","instance","prototype","create","resolve","promise"],"mappings":";;;;;;AAqBAA,4BAAO,CAAC,WAAW,SAASC,GA4BxB,MArBa,CAWTC,KAAM,SAASC,MACX,IAAIC,SAAWH,EAAEI,WAKVD,OAJPE,QAAQ,CAAC,cAAgBH,KAAKI,OAAO,SAASC,OACtCC,IAAAA,SAAWD,MAAME,UAAUC,OAAOH,MAAOL,MAC7CC,SAASQ,QAAQH,SACpB,IACML,SAASS,SACnB,EAKR"} \ No newline at end of file diff --git a/lib/amd/build/chart_line.min.js.map b/lib/amd/build/chart_line.min.js.map index 35f2c91f21d..8800c9d8f5e 100644 --- a/lib/amd/build/chart_line.min.js.map +++ b/lib/amd/build/chart_line.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_line.min.js","sources":["../src/chart_line.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 * Chart line.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_line\n */\ndefine(['core/chart_base'], function(Base) {\n\n /**\n * Line chart.\n *\n * @extends {module:core/chart_base}\n * @class\n */\n function Line() {\n Base.prototype.constructor.apply(this, arguments);\n }\n Line.prototype = Object.create(Base.prototype);\n\n /** @override */\n Line.prototype.TYPE = 'line';\n\n /**\n * Whether the line should be smooth or not.\n *\n * By default the chart lines are not smooth.\n *\n * @type {Bool}\n * @protected\n */\n Line.prototype._smooth = false;\n\n /** @override */\n Line.prototype.create = function(Klass, data) {\n var chart = Base.prototype.create.apply(this, arguments);\n chart.setSmooth(data.smooth);\n return chart;\n };\n\n /**\n * Get whether the line should be smooth or not.\n *\n * @method getSmooth\n * @returns {Bool}\n */\n Line.prototype.getSmooth = function() {\n return this._smooth;\n };\n\n /**\n * Set whether the line should be smooth or not.\n *\n * @method setSmooth\n * @param {Bool} smooth True if the line chart should be smooth, false otherwise.\n */\n Line.prototype.setSmooth = function(smooth) {\n this._smooth = Boolean(smooth);\n };\n\n return Line;\n\n});\n"],"names":["define","Base","Line","prototype","constructor","apply","this","arguments","Object","create","TYPE","_smooth","Klass","data","chart","setSmooth","smooth","getSmooth","Boolean"],"mappings":";;;;;;;AAsBAA,yBAAO,CAAC,oBAAoB,SAASC,eAQxBC,OACLD,KAAKE,UAAUC,YAAYC,MAAMC,KAAMC,kBAE3CL,KAAKC,UAAYK,OAAOC,OAAOR,KAAKE,WAGpCD,KAAKC,UAAUO,KAAO,OAUtBR,KAAKC,UAAUQ,SAAU,EAGzBT,KAAKC,UAAUM,OAAS,SAASG,MAAOC,UAChCC,MAAQb,KAAKE,UAAUM,OAAOJ,MAAMC,KAAMC,kBAC9CO,MAAMC,UAAUF,KAAKG,QACdF,OASXZ,KAAKC,UAAUc,UAAY,kBAChBX,KAAKK,SAShBT,KAAKC,UAAUY,UAAY,SAASC,aAC3BL,QAAUO,QAAQF,SAGpBd"} \ No newline at end of file +{"version":3,"file":"chart_line.min.js","sources":["../src/chart_line.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 * Chart line.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_line\n */\ndefine(['core/chart_base'], function(Base) {\n\n /**\n * Line chart.\n *\n * @extends {module:core/chart_base}\n * @class\n */\n function Line() {\n Base.prototype.constructor.apply(this, arguments);\n }\n Line.prototype = Object.create(Base.prototype);\n\n /** @override */\n Line.prototype.TYPE = 'line';\n\n /**\n * Whether the line should be smooth or not.\n *\n * By default the chart lines are not smooth.\n *\n * @type {Bool}\n * @protected\n */\n Line.prototype._smooth = false;\n\n /** @override */\n Line.prototype.create = function(Klass, data) {\n var chart = Base.prototype.create.apply(this, arguments);\n chart.setSmooth(data.smooth);\n return chart;\n };\n\n /**\n * Get whether the line should be smooth or not.\n *\n * @method getSmooth\n * @returns {Bool}\n */\n Line.prototype.getSmooth = function() {\n return this._smooth;\n };\n\n /**\n * Set whether the line should be smooth or not.\n *\n * @method setSmooth\n * @param {Bool} smooth True if the line chart should be smooth, false otherwise.\n */\n Line.prototype.setSmooth = function(smooth) {\n this._smooth = Boolean(smooth);\n };\n\n return Line;\n\n});\n"],"names":["define","Base","Line","prototype","constructor","apply","this","arguments","Object","create","TYPE","_smooth","Klass","data","chart","setSmooth","smooth","getSmooth","Boolean"],"mappings":";;;;;;;AAsBAA,yBAAO,CAAC,oBAAoB,SAASC,MAQjC,SAASC,OACLD,KAAKE,UAAUC,YAAYC,MAAMC,KAAMC,UAC1C,CA2CD,OA1CAL,KAAKC,UAAYK,OAAOC,OAAOR,KAAKE,WAGpCD,KAAKC,UAAUO,KAAO,OAUtBR,KAAKC,UAAUQ,SAAU,EAGzBT,KAAKC,UAAUM,OAAS,SAASG,MAAOC,MACpC,IAAIC,MAAQb,KAAKE,UAAUM,OAAOJ,MAAMC,KAAMC,WAE9C,OADAO,MAAMC,UAAUF,KAAKG,QACdF,KACV,EAQDZ,KAAKC,UAAUc,UAAY,WACvB,OAAOX,KAAKK,OACf,EAQDT,KAAKC,UAAUY,UAAY,SAASC,QAChCV,KAAKK,QAAUO,QAAQF,OAC1B,EAEMd,IAEV"} \ No newline at end of file diff --git a/lib/amd/build/chart_output.min.js.map b/lib/amd/build/chart_output.min.js.map index 4c535a063c2..cfc793e62ad 100644 --- a/lib/amd/build/chart_output.min.js.map +++ b/lib/amd/build/chart_output.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_output.min.js","sources":["../src/chart_output.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 * Chart output.\n *\n * Proxy to the default output module.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/chart_output_chartjs'], function(Output) {\n\n /**\n * @exports module:core/chart_output\n * @extends {module:core/chart_output_chartjs}\n */\n var defaultModule = Output;\n\n return defaultModule;\n\n});\n"],"names":["define","Output"],"mappings":";;;;;;;;AAuBAA,2BAAO,CAAC,8BAA8B,SAASC,eAMvBA"} \ No newline at end of file +{"version":3,"file":"chart_output.min.js","sources":["../src/chart_output.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 * Chart output.\n *\n * Proxy to the default output module.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/chart_output_chartjs'], function(Output) {\n\n /**\n * @exports module:core/chart_output\n * @extends {module:core/chart_output_chartjs}\n */\n var defaultModule = Output;\n\n return defaultModule;\n\n});\n"],"names":["define","Output"],"mappings":";;;;;;;;AAuBAA,2BAAO,CAAC,8BAA8B,SAASC,QAQ3C,OAFoBA,MAIvB"} \ No newline at end of file diff --git a/lib/amd/build/chart_output_base.min.js.map b/lib/amd/build/chart_output_base.min.js.map index 1edfe371778..1ec38dbb26c 100644 --- a/lib/amd/build/chart_output_base.min.js.map +++ b/lib/amd/build/chart_output_base.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_output_base.min.js","sources":["../src/chart_output_base.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 * Chart output base.\n *\n * This takes a chart object and draws it.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_output_base\n */\ndefine(['jquery'], function($) {\n\n /**\n * Chart output base.\n *\n * The constructor of an output class must instantly generate and display the\n * chart. It is also the responsability of the output module to check that\n * the node received is of the appropriate type, if not a new node can be\n * added within.\n *\n * The output module has total control over the content of the node and can\n * clear it or output anything to it at will. A node should not be shared by\n * two simultaneous output modules.\n *\n * @class\n * @param {Node} node The node to output with/in.\n * @param {Chart} chart A chart object.\n */\n function Base(node, chart) {\n this._node = $(node);\n this._chart = chart;\n }\n\n /**\n * Update method.\n *\n * This is the public method through which an output instance in informed\n * that the chart instance has been updated and they need to update the\n * chart rendering.\n *\n * @abstract\n * @return {Void}\n */\n Base.prototype.update = function() {\n throw new Error('Not supported.');\n };\n\n return Base;\n\n});\n"],"names":["define","$","Base","node","chart","_node","_chart","prototype","update","Error"],"mappings":";;;;;;;;;AAwBAA,gCAAO,CAAC,WAAW,SAASC,YAkBfC,KAAKC,KAAMC,YACXC,MAAQJ,EAAEE,WACVG,OAASF,aAalBF,KAAKK,UAAUC,OAAS,iBACd,IAAIC,MAAM,mBAGbP"} \ No newline at end of file +{"version":3,"file":"chart_output_base.min.js","sources":["../src/chart_output_base.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 * Chart output base.\n *\n * This takes a chart object and draws it.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_output_base\n */\ndefine(['jquery'], function($) {\n\n /**\n * Chart output base.\n *\n * The constructor of an output class must instantly generate and display the\n * chart. It is also the responsability of the output module to check that\n * the node received is of the appropriate type, if not a new node can be\n * added within.\n *\n * The output module has total control over the content of the node and can\n * clear it or output anything to it at will. A node should not be shared by\n * two simultaneous output modules.\n *\n * @class\n * @param {Node} node The node to output with/in.\n * @param {Chart} chart A chart object.\n */\n function Base(node, chart) {\n this._node = $(node);\n this._chart = chart;\n }\n\n /**\n * Update method.\n *\n * This is the public method through which an output instance in informed\n * that the chart instance has been updated and they need to update the\n * chart rendering.\n *\n * @abstract\n * @return {Void}\n */\n Base.prototype.update = function() {\n throw new Error('Not supported.');\n };\n\n return Base;\n\n});\n"],"names":["define","$","Base","node","chart","this","_node","_chart","prototype","update","Error"],"mappings":";;;;;;;;;AAwBAA,gCAAO,CAAC,WAAW,SAASC,GAkBxB,SAASC,KAAKC,KAAMC,OAChBC,KAAKC,MAAQL,EAAEE,MACVI,KAAAA,OAASH,KACjB,CAgBD,OAJAF,KAAKM,UAAUC,OAAS,WACpB,MAAM,IAAIC,MAAM,iBACnB,EAEMR,IAEV"} \ No newline at end of file diff --git a/lib/amd/build/chart_output_chartjs.min.js.map b/lib/amd/build/chart_output_chartjs.min.js.map index 83404ec3294..2f37903639e 100644 --- a/lib/amd/build/chart_output_chartjs.min.js.map +++ b/lib/amd/build/chart_output_chartjs.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_output_chartjs.min.js","sources":["../src/chart_output_chartjs.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 * Chart output for chart.js.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_output_chartjs\n */\ndefine([\n 'jquery',\n 'core/chartjs',\n 'core/chart_axis',\n 'core/chart_bar',\n 'core/chart_output_base',\n 'core/chart_line',\n 'core/chart_pie',\n 'core/chart_series'\n], function($, Chartjs, Axis, Bar, Base, Line, Pie, Series) {\n\n /**\n * Makes an axis ID.\n *\n * @param {String} xy Accepts 'x' and 'y'.\n * @param {Number} index The axis index.\n * @return {String}\n */\n var makeAxisId = function(xy, index) {\n return 'axis-' + xy + '-' + index;\n };\n\n /**\n * Chart output for Chart.js.\n *\n * @class\n * @extends {module:core/chart_output_base}\n */\n function Output() {\n Base.prototype.constructor.apply(this, arguments);\n\n // Make sure that we've got a canvas tag.\n this._canvas = this._node;\n if (this._canvas.prop('tagName') != 'CANVAS') {\n this._canvas = $('');\n this._node.append(this._canvas);\n }\n\n this._build();\n }\n Output.prototype = Object.create(Base.prototype);\n\n /**\n * Reference to the chart config object.\n *\n * @type {Object}\n * @protected\n */\n Output.prototype._config = null;\n\n /**\n * Reference to the instance of chart.js.\n *\n * @type {Object}\n * @protected\n */\n Output.prototype._chartjs = null;\n\n /**\n * Reference to the canvas node.\n *\n * @type {Jquery}\n * @protected\n */\n Output.prototype._canvas = null;\n\n /**\n * Builds the config and the chart.\n *\n * @protected\n */\n Output.prototype._build = function() {\n this._config = this._makeConfig();\n this._chartjs = new Chartjs(this._canvas[0], this._config);\n };\n\n /**\n * Clean data.\n *\n * @param {(String|String[])} data A single string or an array of strings.\n * @returns {(String|String[])}\n * @protected\n */\n Output.prototype._cleanData = function(data) {\n if (data instanceof Array) {\n return data.map(function(value) {\n return $('').html(value).text();\n });\n } else {\n return $('').html(data).text();\n }\n };\n\n /**\n * Get the chart type and handles the Chart.js specific chart types.\n *\n * By default returns the current chart TYPE value. Also does the handling of specific chart types, for example\n * check if the bar chart should be horizontal and the pie chart should be displayed as a doughnut.\n *\n * @method getChartType\n * @returns {String} the chart type.\n * @protected\n */\n Output.prototype._getChartType = function() {\n var type = this._chart.getType();\n\n // Bars can be displayed vertically and horizontally, defining horizontalBar type.\n if (this._chart.getType() === Bar.prototype.TYPE && this._chart.getHorizontal() === true) {\n type = 'horizontalBar';\n } else if (this._chart.getType() === Pie.prototype.TYPE && this._chart.getDoughnut() === true) {\n // Pie chart can be displayed as doughnut.\n type = 'doughnut';\n }\n\n return type;\n };\n\n /**\n * Make the axis config.\n *\n * @protected\n * @param {module:core/chart_axis} axis The axis.\n * @param {String} xy Accepts 'x' or 'y'.\n * @param {Number} index The axis index.\n * @return {Object} The axis config.\n */\n Output.prototype._makeAxisConfig = function(axis, xy, index) {\n var scaleData = {\n id: makeAxisId(xy, index)\n };\n\n if (axis.getPosition() !== Axis.prototype.POS_DEFAULT) {\n scaleData.position = axis.getPosition();\n }\n\n if (axis.getLabel() !== null) {\n scaleData.scaleLabel = {\n display: true,\n labelString: this._cleanData(axis.getLabel())\n };\n }\n\n if (axis.getStepSize() !== null) {\n scaleData.ticks = scaleData.ticks || {};\n scaleData.ticks.stepSize = axis.getStepSize();\n }\n\n if (axis.getMax() !== null) {\n scaleData.ticks = scaleData.ticks || {};\n scaleData.ticks.max = axis.getMax();\n }\n\n if (axis.getMin() !== null) {\n scaleData.ticks = scaleData.ticks || {};\n scaleData.ticks.min = axis.getMin();\n }\n\n return scaleData;\n };\n\n /**\n * Make the config config.\n *\n * @protected\n * @return {Object} The axis config.\n */\n Output.prototype._makeConfig = function() {\n var config = {\n type: this._getChartType(),\n data: {\n labels: this._cleanData(this._chart.getLabels()),\n datasets: this._makeDatasetsConfig()\n },\n options: {\n title: {\n display: this._chart.getTitle() !== null,\n text: this._cleanData(this._chart.getTitle())\n }\n }\n };\n var legendOptions = this._chart.getLegendOptions();\n if (legendOptions) {\n config.options.legend = legendOptions;\n }\n\n\n this._chart.getXAxes().forEach(function(axis, i) {\n var axisLabels = axis.getLabels();\n\n config.options.scales = config.options.scales || {};\n config.options.scales.xAxes = config.options.scales.xAxes || [];\n config.options.scales.xAxes[i] = this._makeAxisConfig(axis, 'x', i);\n\n if (axisLabels !== null) {\n config.options.scales.xAxes[i].ticks.callback = function(value, index) {\n return axisLabels[index] || '';\n };\n }\n config.options.scales.xAxes[i].stacked = this._isStacked();\n }.bind(this));\n\n this._chart.getYAxes().forEach(function(axis, i) {\n var axisLabels = axis.getLabels();\n\n config.options.scales = config.options.scales || {};\n config.options.scales.yAxes = config.options.scales.yAxes || [];\n config.options.scales.yAxes[i] = this._makeAxisConfig(axis, 'y', i);\n\n if (axisLabels !== null) {\n config.options.scales.yAxes[i].ticks.callback = function(value) {\n return axisLabels[parseInt(value, 10)] || '';\n };\n }\n config.options.scales.yAxes[i].stacked = this._isStacked();\n }.bind(this));\n\n config.options.tooltips = {\n callbacks: {\n label: this._makeTooltip.bind(this)\n }\n };\n\n return config;\n };\n\n /**\n * Get the datasets configurations.\n *\n * @protected\n * @return {Object[]}\n */\n Output.prototype._makeDatasetsConfig = function() {\n var sets = this._chart.getSeries().map(function(series) {\n var colors = series.hasColoredValues() ? series.getColors() : series.getColor();\n var dataset = {\n label: this._cleanData(series.getLabel()),\n data: series.getValues(),\n type: series.getType(),\n fill: series.getFill(),\n backgroundColor: colors,\n // Pie charts look better without borders.\n borderColor: this._chart.getType() == Pie.prototype.TYPE ? '#fff' : colors,\n lineTension: this._isSmooth(series) ? 0.3 : 0\n };\n\n if (series.getXAxis() !== null) {\n dataset.xAxisID = makeAxisId('x', series.getXAxis());\n }\n if (series.getYAxis() !== null) {\n dataset.yAxisID = makeAxisId('y', series.getYAxis());\n }\n\n return dataset;\n }.bind(this));\n return sets;\n };\n\n /**\n * Get the chart data, add labels and rebuild the tooltip.\n *\n * @param {Object[]} tooltipItem The tooltip item data.\n * @param {Object[]} data The chart data.\n * @returns {String}\n * @protected\n */\n Output.prototype._makeTooltip = function(tooltipItem, data) {\n\n // Get series and chart data to rebuild the tooltip and add labels.\n var series = this._chart.getSeries()[tooltipItem.datasetIndex];\n var serieLabel = series.getLabel();\n var serieLabels = series.getLabels();\n var chartData = data.datasets[tooltipItem.datasetIndex].data;\n var tooltipData = chartData[tooltipItem.index];\n\n // Build default tooltip.\n var tooltip = [];\n\n // Pie and doughnut charts does not have axis.\n if (tooltipItem.xLabel == '' && tooltipItem.yLabel == '') {\n var chartLabels = this._cleanData(this._chart.getLabels());\n tooltip.push(chartLabels[tooltipItem.index]);\n }\n\n // Add series labels to the tooltip if any.\n if (serieLabels !== null) {\n tooltip.push(this._cleanData(serieLabels[tooltipItem.index]));\n } else {\n tooltip.push(this._cleanData(serieLabel) + ': ' + tooltipData);\n }\n\n return tooltip;\n };\n\n /**\n * Verify if the chart line is smooth or not.\n *\n * @protected\n * @param {module:core/chart_series} series The series.\n * @returns {Bool}\n */\n Output.prototype._isSmooth = function(series) {\n var smooth = false;\n if (this._chart.getType() === Line.prototype.TYPE) {\n smooth = series.getSmooth();\n if (smooth === null) {\n smooth = this._chart.getSmooth();\n }\n } else if (series.getType() === Series.prototype.TYPE_LINE) {\n smooth = series.getSmooth();\n }\n\n return smooth;\n };\n\n /**\n * Verify if the bar chart is stacked or not.\n *\n * @protected\n * @returns {Bool}\n */\n Output.prototype._isStacked = function() {\n var stacked = false;\n\n // Stacking is (currently) only supported for bar charts.\n if (this._chart.getType() === Bar.prototype.TYPE) {\n stacked = this._chart.getStacked();\n }\n\n return stacked;\n };\n\n /** @override */\n Output.prototype.update = function() {\n $.extend(true, this._config, this._makeConfig());\n this._chartjs.update();\n };\n\n return Output;\n\n});\n"],"names":["define","$","Chartjs","Axis","Bar","Base","Line","Pie","Series","makeAxisId","xy","index","Output","prototype","constructor","apply","this","arguments","_canvas","_node","prop","append","_build","Object","create","_config","_chartjs","_makeConfig","_cleanData","data","Array","map","value","html","text","_getChartType","type","_chart","getType","TYPE","getHorizontal","getDoughnut","_makeAxisConfig","axis","scaleData","id","getPosition","POS_DEFAULT","position","getLabel","scaleLabel","display","labelString","getStepSize","ticks","stepSize","getMax","max","getMin","min","config","labels","getLabels","datasets","_makeDatasetsConfig","options","title","getTitle","legendOptions","getLegendOptions","legend","getXAxes","forEach","i","axisLabels","scales","xAxes","callback","stacked","_isStacked","bind","getYAxes","yAxes","parseInt","tooltips","callbacks","label","_makeTooltip","getSeries","series","colors","hasColoredValues","getColors","getColor","dataset","getValues","fill","getFill","backgroundColor","borderColor","lineTension","_isSmooth","getXAxis","xAxisID","getYAxis","yAxisID","tooltipItem","datasetIndex","serieLabel","serieLabels","tooltipData","tooltip","xLabel","yLabel","chartLabels","push","smooth","getSmooth","TYPE_LINE","getStacked","update","extend"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chart_output_chartjs.min.js","sources":["../src/chart_output_chartjs.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 * Chart output for chart.js.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_output_chartjs\n */\ndefine([\n 'jquery',\n 'core/chartjs',\n 'core/chart_axis',\n 'core/chart_bar',\n 'core/chart_output_base',\n 'core/chart_line',\n 'core/chart_pie',\n 'core/chart_series'\n], function($, Chartjs, Axis, Bar, Base, Line, Pie, Series) {\n\n /**\n * Makes an axis ID.\n *\n * @param {String} xy Accepts 'x' and 'y'.\n * @param {Number} index The axis index.\n * @return {String}\n */\n var makeAxisId = function(xy, index) {\n return 'axis-' + xy + '-' + index;\n };\n\n /**\n * Chart output for Chart.js.\n *\n * @class\n * @extends {module:core/chart_output_base}\n */\n function Output() {\n Base.prototype.constructor.apply(this, arguments);\n\n // Make sure that we've got a canvas tag.\n this._canvas = this._node;\n if (this._canvas.prop('tagName') != 'CANVAS') {\n this._canvas = $('');\n this._node.append(this._canvas);\n }\n\n this._build();\n }\n Output.prototype = Object.create(Base.prototype);\n\n /**\n * Reference to the chart config object.\n *\n * @type {Object}\n * @protected\n */\n Output.prototype._config = null;\n\n /**\n * Reference to the instance of chart.js.\n *\n * @type {Object}\n * @protected\n */\n Output.prototype._chartjs = null;\n\n /**\n * Reference to the canvas node.\n *\n * @type {Jquery}\n * @protected\n */\n Output.prototype._canvas = null;\n\n /**\n * Builds the config and the chart.\n *\n * @protected\n */\n Output.prototype._build = function() {\n this._config = this._makeConfig();\n this._chartjs = new Chartjs(this._canvas[0], this._config);\n };\n\n /**\n * Clean data.\n *\n * @param {(String|String[])} data A single string or an array of strings.\n * @returns {(String|String[])}\n * @protected\n */\n Output.prototype._cleanData = function(data) {\n if (data instanceof Array) {\n return data.map(function(value) {\n return $('').html(value).text();\n });\n } else {\n return $('').html(data).text();\n }\n };\n\n /**\n * Get the chart type and handles the Chart.js specific chart types.\n *\n * By default returns the current chart TYPE value. Also does the handling of specific chart types, for example\n * check if the bar chart should be horizontal and the pie chart should be displayed as a doughnut.\n *\n * @method getChartType\n * @returns {String} the chart type.\n * @protected\n */\n Output.prototype._getChartType = function() {\n var type = this._chart.getType();\n\n // Bars can be displayed vertically and horizontally, defining horizontalBar type.\n if (this._chart.getType() === Bar.prototype.TYPE && this._chart.getHorizontal() === true) {\n type = 'horizontalBar';\n } else if (this._chart.getType() === Pie.prototype.TYPE && this._chart.getDoughnut() === true) {\n // Pie chart can be displayed as doughnut.\n type = 'doughnut';\n }\n\n return type;\n };\n\n /**\n * Make the axis config.\n *\n * @protected\n * @param {module:core/chart_axis} axis The axis.\n * @param {String} xy Accepts 'x' or 'y'.\n * @param {Number} index The axis index.\n * @return {Object} The axis config.\n */\n Output.prototype._makeAxisConfig = function(axis, xy, index) {\n var scaleData = {\n id: makeAxisId(xy, index)\n };\n\n if (axis.getPosition() !== Axis.prototype.POS_DEFAULT) {\n scaleData.position = axis.getPosition();\n }\n\n if (axis.getLabel() !== null) {\n scaleData.scaleLabel = {\n display: true,\n labelString: this._cleanData(axis.getLabel())\n };\n }\n\n if (axis.getStepSize() !== null) {\n scaleData.ticks = scaleData.ticks || {};\n scaleData.ticks.stepSize = axis.getStepSize();\n }\n\n if (axis.getMax() !== null) {\n scaleData.ticks = scaleData.ticks || {};\n scaleData.ticks.max = axis.getMax();\n }\n\n if (axis.getMin() !== null) {\n scaleData.ticks = scaleData.ticks || {};\n scaleData.ticks.min = axis.getMin();\n }\n\n return scaleData;\n };\n\n /**\n * Make the config config.\n *\n * @protected\n * @return {Object} The axis config.\n */\n Output.prototype._makeConfig = function() {\n var config = {\n type: this._getChartType(),\n data: {\n labels: this._cleanData(this._chart.getLabels()),\n datasets: this._makeDatasetsConfig()\n },\n options: {\n title: {\n display: this._chart.getTitle() !== null,\n text: this._cleanData(this._chart.getTitle())\n }\n }\n };\n var legendOptions = this._chart.getLegendOptions();\n if (legendOptions) {\n config.options.legend = legendOptions;\n }\n\n\n this._chart.getXAxes().forEach(function(axis, i) {\n var axisLabels = axis.getLabels();\n\n config.options.scales = config.options.scales || {};\n config.options.scales.xAxes = config.options.scales.xAxes || [];\n config.options.scales.xAxes[i] = this._makeAxisConfig(axis, 'x', i);\n\n if (axisLabels !== null) {\n config.options.scales.xAxes[i].ticks.callback = function(value, index) {\n return axisLabels[index] || '';\n };\n }\n config.options.scales.xAxes[i].stacked = this._isStacked();\n }.bind(this));\n\n this._chart.getYAxes().forEach(function(axis, i) {\n var axisLabels = axis.getLabels();\n\n config.options.scales = config.options.scales || {};\n config.options.scales.yAxes = config.options.scales.yAxes || [];\n config.options.scales.yAxes[i] = this._makeAxisConfig(axis, 'y', i);\n\n if (axisLabels !== null) {\n config.options.scales.yAxes[i].ticks.callback = function(value) {\n return axisLabels[parseInt(value, 10)] || '';\n };\n }\n config.options.scales.yAxes[i].stacked = this._isStacked();\n }.bind(this));\n\n config.options.tooltips = {\n callbacks: {\n label: this._makeTooltip.bind(this)\n }\n };\n\n return config;\n };\n\n /**\n * Get the datasets configurations.\n *\n * @protected\n * @return {Object[]}\n */\n Output.prototype._makeDatasetsConfig = function() {\n var sets = this._chart.getSeries().map(function(series) {\n var colors = series.hasColoredValues() ? series.getColors() : series.getColor();\n var dataset = {\n label: this._cleanData(series.getLabel()),\n data: series.getValues(),\n type: series.getType(),\n fill: series.getFill(),\n backgroundColor: colors,\n // Pie charts look better without borders.\n borderColor: this._chart.getType() == Pie.prototype.TYPE ? '#fff' : colors,\n lineTension: this._isSmooth(series) ? 0.3 : 0\n };\n\n if (series.getXAxis() !== null) {\n dataset.xAxisID = makeAxisId('x', series.getXAxis());\n }\n if (series.getYAxis() !== null) {\n dataset.yAxisID = makeAxisId('y', series.getYAxis());\n }\n\n return dataset;\n }.bind(this));\n return sets;\n };\n\n /**\n * Get the chart data, add labels and rebuild the tooltip.\n *\n * @param {Object[]} tooltipItem The tooltip item data.\n * @param {Object[]} data The chart data.\n * @returns {String}\n * @protected\n */\n Output.prototype._makeTooltip = function(tooltipItem, data) {\n\n // Get series and chart data to rebuild the tooltip and add labels.\n var series = this._chart.getSeries()[tooltipItem.datasetIndex];\n var serieLabel = series.getLabel();\n var serieLabels = series.getLabels();\n var chartData = data.datasets[tooltipItem.datasetIndex].data;\n var tooltipData = chartData[tooltipItem.index];\n\n // Build default tooltip.\n var tooltip = [];\n\n // Pie and doughnut charts does not have axis.\n if (tooltipItem.xLabel == '' && tooltipItem.yLabel == '') {\n var chartLabels = this._cleanData(this._chart.getLabels());\n tooltip.push(chartLabels[tooltipItem.index]);\n }\n\n // Add series labels to the tooltip if any.\n if (serieLabels !== null) {\n tooltip.push(this._cleanData(serieLabels[tooltipItem.index]));\n } else {\n tooltip.push(this._cleanData(serieLabel) + ': ' + tooltipData);\n }\n\n return tooltip;\n };\n\n /**\n * Verify if the chart line is smooth or not.\n *\n * @protected\n * @param {module:core/chart_series} series The series.\n * @returns {Bool}\n */\n Output.prototype._isSmooth = function(series) {\n var smooth = false;\n if (this._chart.getType() === Line.prototype.TYPE) {\n smooth = series.getSmooth();\n if (smooth === null) {\n smooth = this._chart.getSmooth();\n }\n } else if (series.getType() === Series.prototype.TYPE_LINE) {\n smooth = series.getSmooth();\n }\n\n return smooth;\n };\n\n /**\n * Verify if the bar chart is stacked or not.\n *\n * @protected\n * @returns {Bool}\n */\n Output.prototype._isStacked = function() {\n var stacked = false;\n\n // Stacking is (currently) only supported for bar charts.\n if (this._chart.getType() === Bar.prototype.TYPE) {\n stacked = this._chart.getStacked();\n }\n\n return stacked;\n };\n\n /** @override */\n Output.prototype.update = function() {\n $.extend(true, this._config, this._makeConfig());\n this._chartjs.update();\n };\n\n return Output;\n\n});\n"],"names":["define","$","Chartjs","Axis","Bar","Base","Line","Pie","Series","makeAxisId","xy","index","Output","prototype","constructor","apply","this","arguments","_canvas","_node","prop","append","_build","Object","create","_config","_chartjs","_makeConfig","_cleanData","data","Array","map","value","html","text","_getChartType","type","_chart","getType","TYPE","getHorizontal","getDoughnut","_makeAxisConfig","axis","scaleData","id","getPosition","POS_DEFAULT","position","getLabel","scaleLabel","display","labelString","getStepSize","ticks","stepSize","getMax","max","getMin","min","config","labels","getLabels","datasets","_makeDatasetsConfig","options","title","getTitle","legendOptions","getLegendOptions","legend","getXAxes","forEach","i","axisLabels","scales","xAxes","callback","stacked","_isStacked","bind","getYAxes","yAxes","parseInt","tooltips","callbacks","label","_makeTooltip","getSeries","series","colors","hasColoredValues","getColors","getColor","dataset","getValues","fill","getFill","backgroundColor","borderColor","lineTension","_isSmooth","getXAxis","xAxisID","getYAxis","yAxisID","tooltipItem","datasetIndex","serieLabel","serieLabels","tooltipData","tooltip","xLabel","yLabel","chartLabels","push","smooth","getSmooth","TYPE_LINE","getStacked","update","extend"],"mappings":"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"} \ No newline at end of file diff --git a/lib/amd/build/chart_output_htmltable.min.js.map b/lib/amd/build/chart_output_htmltable.min.js.map index 1e91963b151..139d8c752f1 100644 --- a/lib/amd/build/chart_output_htmltable.min.js.map +++ b/lib/amd/build/chart_output_htmltable.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_output_htmltable.min.js","sources":["../src/chart_output_htmltable.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 * Chart output for HTML table.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_output_htmltable\n */\ndefine([\n 'jquery',\n 'core/chart_output_base',\n], function($, Base) {\n\n /**\n * Render a chart as an HTML table.\n *\n * @class\n * @extends {module:core/chart_output_base}\n */\n function Output() {\n Base.prototype.constructor.apply(this, arguments);\n this._build();\n }\n Output.prototype = Object.create(Base.prototype);\n\n /**\n * Attach the table to the document.\n *\n * @protected\n */\n Output.prototype._build = function() {\n this._node.empty();\n this._node.append(this._makeTable());\n };\n\n /**\n * Builds the table node.\n *\n * @protected\n * @return {Jquery}\n */\n Output.prototype._makeTable = function() {\n var tbl = $(''),\n c = this._chart,\n node,\n value,\n labels = c.getLabels(),\n hasLabel = labels.length > 0,\n series = c.getSeries(),\n seriesLabels,\n rowCount = series[0].getCount();\n\n // Identify the table.\n tbl.addClass('chart-output-htmltable generaltable');\n\n // Set the caption.\n if (c.getTitle() !== null) {\n tbl.append($('');\n if (hasLabel) {\n node.append($('');\n if (labels.length > 0) {\n node.append(\n $('
          ').text(c.getTitle()));\n }\n\n // Write the column headers.\n node = $('
          '));\n }\n series.forEach(function(serie) {\n node.append(\n $('')\n .text(serie.getLabel())\n .attr('scope', 'col')\n );\n });\n tbl.append(node);\n\n // Write rows.\n for (var rowId = 0; rowId < rowCount; rowId++) {\n node = $('
          ')\n .text(labels[rowId])\n .attr('scope', 'row')\n );\n }\n for (var serieId = 0; serieId < series.length; serieId++) {\n value = series[serieId].getValues()[rowId];\n seriesLabels = series[serieId].getLabels();\n if (seriesLabels !== null) {\n value = series[serieId].getLabels()[rowId];\n }\n node.append($('').text(value));\n }\n tbl.append(node);\n }\n\n return tbl;\n };\n\n /** @override */\n Output.prototype.update = function() {\n this._build();\n };\n\n return Output;\n\n});\n"],"names":["define","$","Base","Output","prototype","constructor","apply","this","arguments","_build","Object","create","_node","empty","append","_makeTable","node","value","tbl","c","_chart","labels","getLabels","hasLabel","length","series","getSeries","rowCount","getCount","addClass","getTitle","text","forEach","serie","getLabel","attr","rowId","serieId","getValues","update"],"mappings":";;;;;;;AAsBAA,qCAAO,CACH,SACA,2BACD,SAASC,EAAGC,eAQFC,SACLD,KAAKE,UAAUC,YAAYC,MAAMC,KAAMC,gBAClCC,gBAETN,OAAOC,UAAYM,OAAOC,OAAOT,KAAKE,WAOtCD,OAAOC,UAAUK,OAAS,gBACjBG,MAAMC,aACND,MAAME,OAAOP,KAAKQ,eAS3BZ,OAAOC,UAAUW,WAAa,eAGtBC,KACAC,MAHAC,IAAMjB,EAAE,WACRkB,EAAIZ,KAAKa,OAGTC,OAASF,EAAEG,YACXC,SAAWF,OAAOG,OAAS,EAC3BC,OAASN,EAAEO,YAEXC,SAAWF,OAAO,GAAGG,WAGzBV,IAAIW,SAAS,uCAGQ,OAAjBV,EAAEW,YACFZ,IAAIJ,OAAOb,EAAE,aAAa8B,KAAKZ,EAAEW,aAIrCd,KAAOf,EAAE,QACLsB,UACAP,KAAKF,OAAOb,EAAE,SAElBwB,OAAOO,SAAQ,SAASC,OACpBjB,KAAKF,OACDb,EAAE,QACD8B,KAAKE,MAAMC,YACXC,KAAK,QAAS,WAGvBjB,IAAIJ,OAAOE,UAGN,IAAIoB,MAAQ,EAAGA,MAAQT,SAAUS,QAAS,CAC3CpB,KAAOf,EAAE,QACLoB,OAAOG,OAAS,GAChBR,KAAKF,OACDb,EAAE,QACD8B,KAAKV,OAAOe,QACZD,KAAK,QAAS,YAGlB,IAAIE,QAAU,EAAGA,QAAUZ,OAAOD,OAAQa,UAC3CpB,MAAQQ,OAAOY,SAASC,YAAYF,OAEf,OADNX,OAAOY,SAASf,cAE3BL,MAAQQ,OAAOY,SAASf,YAAYc,QAExCpB,KAAKF,OAAOb,EAAE,QAAQ8B,KAAKd,QAE/BC,IAAIJ,OAAOE,aAGRE,KAIXf,OAAOC,UAAUmC,OAAS,gBACjB9B,UAGFN"} \ No newline at end of file +{"version":3,"file":"chart_output_htmltable.min.js","sources":["../src/chart_output_htmltable.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 * Chart output for HTML table.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_output_htmltable\n */\ndefine([\n 'jquery',\n 'core/chart_output_base',\n], function($, Base) {\n\n /**\n * Render a chart as an HTML table.\n *\n * @class\n * @extends {module:core/chart_output_base}\n */\n function Output() {\n Base.prototype.constructor.apply(this, arguments);\n this._build();\n }\n Output.prototype = Object.create(Base.prototype);\n\n /**\n * Attach the table to the document.\n *\n * @protected\n */\n Output.prototype._build = function() {\n this._node.empty();\n this._node.append(this._makeTable());\n };\n\n /**\n * Builds the table node.\n *\n * @protected\n * @return {Jquery}\n */\n Output.prototype._makeTable = function() {\n var tbl = $(''),\n c = this._chart,\n node,\n value,\n labels = c.getLabels(),\n hasLabel = labels.length > 0,\n series = c.getSeries(),\n seriesLabels,\n rowCount = series[0].getCount();\n\n // Identify the table.\n tbl.addClass('chart-output-htmltable generaltable');\n\n // Set the caption.\n if (c.getTitle() !== null) {\n tbl.append($('');\n if (hasLabel) {\n node.append($('');\n if (labels.length > 0) {\n node.append(\n $('
          ').text(c.getTitle()));\n }\n\n // Write the column headers.\n node = $('
          '));\n }\n series.forEach(function(serie) {\n node.append(\n $('')\n .text(serie.getLabel())\n .attr('scope', 'col')\n );\n });\n tbl.append(node);\n\n // Write rows.\n for (var rowId = 0; rowId < rowCount; rowId++) {\n node = $('
          ')\n .text(labels[rowId])\n .attr('scope', 'row')\n );\n }\n for (var serieId = 0; serieId < series.length; serieId++) {\n value = series[serieId].getValues()[rowId];\n seriesLabels = series[serieId].getLabels();\n if (seriesLabels !== null) {\n value = series[serieId].getLabels()[rowId];\n }\n node.append($('').text(value));\n }\n tbl.append(node);\n }\n\n return tbl;\n };\n\n /** @override */\n Output.prototype.update = function() {\n this._build();\n };\n\n return Output;\n\n});\n"],"names":["define","$","Base","Output","prototype","constructor","apply","this","arguments","_build","Object","create","_node","empty","append","_makeTable","node","value","tbl","c","_chart","labels","getLabels","hasLabel","length","series","getSeries","rowCount","getCount","addClass","getTitle","text","forEach","serie","getLabel","attr","rowId","serieId","getValues","update"],"mappings":";;;;;;;AAsBAA,OAAM,8BAAC,CACH,SACA,2BACD,SAASC,EAAGC,MAQX,SAASC,SACLD,KAAKE,UAAUC,YAAYC,MAAMC,KAAMC,WACvCD,KAAKE,QACR,CAiFD,OAhFAN,OAAOC,UAAYM,OAAOC,OAAOT,KAAKE,WAOtCD,OAAOC,UAAUK,OAAS,WACjBG,KAAAA,MAAMC,QACXN,KAAKK,MAAME,OAAOP,KAAKQ,aAC1B,EAQDZ,OAAOC,UAAUW,WAAa,WAC1B,IAEIC,KACAC,MAHAC,IAAMjB,EAAE,WACRkB,EAAIZ,KAAKa,OAGTC,OAASF,EAAEG,YACXC,SAAWF,OAAOG,OAAS,EAC3BC,OAASN,EAAEO,YAEXC,SAAWF,OAAO,GAAGG,WAGzBV,IAAIW,SAAS,uCAGQ,OAAjBV,EAAEW,YACFZ,IAAIJ,OAAOb,EAAE,aAAa8B,KAAKZ,EAAEW,aAIrCd,KAAOf,EAAE,QACLsB,UACAP,KAAKF,OAAOb,EAAE,SAElBwB,OAAOO,SAAQ,SAASC,OACpBjB,KAAKF,OACDb,EAAE,QACD8B,KAAKE,MAAMC,YACXC,KAAK,QAAS,OAEtB,IACDjB,IAAIJ,OAAOE,MAGN,IAAA,IAAIoB,MAAQ,EAAGA,MAAQT,SAAUS,QAAS,CAC3CpB,KAAOf,EAAE,QACLoB,OAAOG,OAAS,GAChBR,KAAKF,OACDb,EAAE,QACD8B,KAAKV,OAAOe,QACZD,KAAK,QAAS,QAGvB,IAAK,IAAIE,QAAU,EAAGA,QAAUZ,OAAOD,OAAQa,UAC3CpB,MAAQQ,OAAOY,SAASC,YAAYF,OAEf,OADNX,OAAOY,SAASf,cAE3BL,MAAQQ,OAAOY,SAASf,YAAYc,QAExCpB,KAAKF,OAAOb,EAAE,QAAQ8B,KAAKd,QAE/BC,IAAIJ,OAAOE,KACd,CAED,OAAOE,GACV,EAGDf,OAAOC,UAAUmC,OAAS,WACtBhC,KAAKE,QACR,EAEMN,MAEV"} \ No newline at end of file diff --git a/lib/amd/build/chart_pie.min.js.map b/lib/amd/build/chart_pie.min.js.map index 7db4a75325f..cd55a265ad0 100644 --- a/lib/amd/build/chart_pie.min.js.map +++ b/lib/amd/build/chart_pie.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_pie.min.js","sources":["../src/chart_pie.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 * Chart pie.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_pie\n */\ndefine(['core/chart_base'], function(Base) {\n\n /**\n * Pie chart.\n *\n * @class\n * @extends {module:core/chart_base}\n */\n function Pie() {\n Base.prototype.constructor.apply(this, arguments);\n }\n Pie.prototype = Object.create(Base.prototype);\n\n /** @override */\n Pie.prototype.TYPE = 'pie';\n\n /**\n * Whether the chart should be displayed as doughnut or not.\n *\n * @type {Bool}\n * @protected\n */\n Pie.prototype._doughnut = null;\n\n /** @override */\n Pie.prototype.create = function(Klass, data) {\n var chart = Base.prototype.create.apply(this, arguments);\n chart.setDoughnut(data.doughnut);\n return chart;\n };\n\n /**\n * Overridden to add appropriate colors to the series.\n *\n * @override\n */\n Pie.prototype.addSeries = function(series) {\n if (series.getColor() === null) {\n var colors = [];\n var configColorSet = this.getConfigColorSet() || Base.prototype.COLORSET;\n for (var i = 0; i < series.getCount(); i++) {\n colors.push(configColorSet[i % configColorSet.length]);\n }\n series.setColors(colors);\n }\n return Base.prototype.addSeries.apply(this, arguments);\n };\n\n /**\n * Get whether the chart should be displayed as doughnut or not.\n *\n * @method getDoughnut\n * @returns {Bool}\n */\n Pie.prototype.getDoughnut = function() {\n return this._doughnut;\n };\n\n /**\n * Set whether the chart should be displayed as doughnut or not.\n *\n * @method setDoughnut\n * @param {Bool} doughnut True for doughnut type, false for pie.\n */\n Pie.prototype.setDoughnut = function(doughnut) {\n this._doughnut = Boolean(doughnut);\n };\n\n /**\n * Validate a series.\n *\n * Overrides parent implementation to validate that there is only\n * one series per chart instance.\n *\n * @override\n */\n Pie.prototype._validateSeries = function() {\n if (this._series.length >= 1) {\n throw new Error('Pie charts only support one serie.');\n }\n return Base.prototype._validateSeries.apply(this, arguments);\n };\n\n return Pie;\n\n});\n"],"names":["define","Base","Pie","prototype","constructor","apply","this","arguments","Object","create","TYPE","_doughnut","Klass","data","chart","setDoughnut","doughnut","addSeries","series","getColor","colors","configColorSet","getConfigColorSet","COLORSET","i","getCount","push","length","setColors","getDoughnut","Boolean","_validateSeries","_series","Error"],"mappings":";;;;;;;AAsBAA,wBAAO,CAAC,oBAAoB,SAASC,eAQxBC,MACLD,KAAKE,UAAUC,YAAYC,MAAMC,KAAMC,kBAE3CL,IAAIC,UAAYK,OAAOC,OAAOR,KAAKE,WAGnCD,IAAIC,UAAUO,KAAO,MAQrBR,IAAIC,UAAUQ,UAAY,KAG1BT,IAAIC,UAAUM,OAAS,SAASG,MAAOC,UAC/BC,MAAQb,KAAKE,UAAUM,OAAOJ,MAAMC,KAAMC,kBAC9CO,MAAMC,YAAYF,KAAKG,UAChBF,OAQXZ,IAAIC,UAAUc,UAAY,SAASC,WACL,OAAtBA,OAAOC,WAAqB,SACxBC,OAAS,GACTC,eAAiBf,KAAKgB,qBAAuBrB,KAAKE,UAAUoB,SACvDC,EAAI,EAAGA,EAAIN,OAAOO,WAAYD,IACnCJ,OAAOM,KAAKL,eAAeG,EAAIH,eAAeM,SAElDT,OAAOU,UAAUR,eAEdnB,KAAKE,UAAUc,UAAUZ,MAAMC,KAAMC,YAShDL,IAAIC,UAAU0B,YAAc,kBACjBvB,KAAKK,WAShBT,IAAIC,UAAUY,YAAc,SAASC,eAC5BL,UAAYmB,QAAQd,WAW7Bd,IAAIC,UAAU4B,gBAAkB,cACxBzB,KAAK0B,QAAQL,QAAU,QACjB,IAAIM,MAAM,6CAEbhC,KAAKE,UAAU4B,gBAAgB1B,MAAMC,KAAMC,YAG/CL"} \ No newline at end of file +{"version":3,"file":"chart_pie.min.js","sources":["../src/chart_pie.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 * Chart pie.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_pie\n */\ndefine(['core/chart_base'], function(Base) {\n\n /**\n * Pie chart.\n *\n * @class\n * @extends {module:core/chart_base}\n */\n function Pie() {\n Base.prototype.constructor.apply(this, arguments);\n }\n Pie.prototype = Object.create(Base.prototype);\n\n /** @override */\n Pie.prototype.TYPE = 'pie';\n\n /**\n * Whether the chart should be displayed as doughnut or not.\n *\n * @type {Bool}\n * @protected\n */\n Pie.prototype._doughnut = null;\n\n /** @override */\n Pie.prototype.create = function(Klass, data) {\n var chart = Base.prototype.create.apply(this, arguments);\n chart.setDoughnut(data.doughnut);\n return chart;\n };\n\n /**\n * Overridden to add appropriate colors to the series.\n *\n * @override\n */\n Pie.prototype.addSeries = function(series) {\n if (series.getColor() === null) {\n var colors = [];\n var configColorSet = this.getConfigColorSet() || Base.prototype.COLORSET;\n for (var i = 0; i < series.getCount(); i++) {\n colors.push(configColorSet[i % configColorSet.length]);\n }\n series.setColors(colors);\n }\n return Base.prototype.addSeries.apply(this, arguments);\n };\n\n /**\n * Get whether the chart should be displayed as doughnut or not.\n *\n * @method getDoughnut\n * @returns {Bool}\n */\n Pie.prototype.getDoughnut = function() {\n return this._doughnut;\n };\n\n /**\n * Set whether the chart should be displayed as doughnut or not.\n *\n * @method setDoughnut\n * @param {Bool} doughnut True for doughnut type, false for pie.\n */\n Pie.prototype.setDoughnut = function(doughnut) {\n this._doughnut = Boolean(doughnut);\n };\n\n /**\n * Validate a series.\n *\n * Overrides parent implementation to validate that there is only\n * one series per chart instance.\n *\n * @override\n */\n Pie.prototype._validateSeries = function() {\n if (this._series.length >= 1) {\n throw new Error('Pie charts only support one serie.');\n }\n return Base.prototype._validateSeries.apply(this, arguments);\n };\n\n return Pie;\n\n});\n"],"names":["define","Base","Pie","prototype","constructor","apply","this","arguments","Object","create","TYPE","_doughnut","Klass","data","chart","setDoughnut","doughnut","addSeries","series","getColor","colors","configColorSet","getConfigColorSet","COLORSET","i","getCount","push","length","setColors","getDoughnut","Boolean","_validateSeries","_series","Error"],"mappings":";;;;;;;AAsBAA,wBAAO,CAAC,oBAAoB,SAASC,MAQjC,SAASC,MACLD,KAAKE,UAAUC,YAAYC,MAAMC,KAAMC,UAC1C,CAyED,OAxEAL,IAAIC,UAAYK,OAAOC,OAAOR,KAAKE,WAGnCD,IAAIC,UAAUO,KAAO,MAQrBR,IAAIC,UAAUQ,UAAY,KAG1BT,IAAIC,UAAUM,OAAS,SAASG,MAAOC,MACnC,IAAIC,MAAQb,KAAKE,UAAUM,OAAOJ,MAAMC,KAAMC,WAE9C,OADAO,MAAMC,YAAYF,KAAKG,UAChBF,KACV,EAODZ,IAAIC,UAAUc,UAAY,SAASC,QAC/B,GAA0B,OAAtBA,OAAOC,WAAqB,CAG5B,IAFIC,IAAAA,OAAS,GACTC,eAAiBf,KAAKgB,qBAAuBrB,KAAKE,UAAUoB,SACvDC,EAAI,EAAGA,EAAIN,OAAOO,WAAYD,IACnCJ,OAAOM,KAAKL,eAAeG,EAAIH,eAAeM,SAElDT,OAAOU,UAAUR,OACpB,CACMnB,OAAAA,KAAKE,UAAUc,UAAUZ,MAAMC,KAAMC,UAC/C,EAQDL,IAAIC,UAAU0B,YAAc,WACxB,OAAOvB,KAAKK,SACf,EAQDT,IAAIC,UAAUY,YAAc,SAASC,UACjCV,KAAKK,UAAYmB,QAAQd,SAC5B,EAUDd,IAAIC,UAAU4B,gBAAkB,WAC5B,GAAIzB,KAAK0B,QAAQL,QAAU,EACvB,MAAM,IAAIM,MAAM,sCAEbhC,OAAAA,KAAKE,UAAU4B,gBAAgB1B,MAAMC,KAAMC,UACrD,EAEML,GAEV"} \ No newline at end of file diff --git a/lib/amd/build/chart_series.min.js.map b/lib/amd/build/chart_series.min.js.map index 653f383a3e9..3b9a3b993b1 100644 --- a/lib/amd/build/chart_series.min.js.map +++ b/lib/amd/build/chart_series.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_series.min.js","sources":["../src/chart_series.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 * Chart series.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_series\n */\ndefine([], function() {\n\n /**\n * Chart data series.\n *\n * @class\n * @param {String} label The series label.\n * @param {Number[]} values The values.\n */\n function Series(label, values) {\n if (typeof label !== 'string') {\n throw new Error('Invalid label for series.');\n\n } else if (typeof values !== 'object') {\n throw new Error('Values for a series must be an array.');\n\n } else if (values.length < 1) {\n throw new Error('Invalid values received for series.');\n }\n\n this._colors = [];\n this._label = label;\n this._values = values;\n }\n\n /**\n * The default type of series.\n *\n * @type {Null}\n * @const\n */\n Series.prototype.TYPE_DEFAULT = null;\n\n /**\n * Type of series 'line'.\n *\n * @type {String}\n * @const\n */\n Series.prototype.TYPE_LINE = 'line';\n\n /**\n * The colors of the series.\n *\n * @type {String[]}\n * @protected\n */\n Series.prototype._colors = null;\n\n /**\n * The fill mode of the series.\n *\n * @type {Object}\n * @protected\n */\n Series.prototype._fill = false;\n\n /**\n * The label of the series.\n *\n * @type {String}\n * @protected\n */\n Series.prototype._label = null;\n\n /**\n * The labels for the values of the series.\n *\n * @type {String[]}\n * @protected\n */\n Series.prototype._labels = null;\n\n /**\n * Whether the line of the serie should be smooth or not.\n *\n * @type {Bool}\n * @protected\n */\n Series.prototype._smooth = false;\n\n /**\n * The type of the series.\n *\n * @type {String}\n * @protected\n */\n Series.prototype._type = Series.prototype.TYPE_DEFAULT;\n\n /**\n * The values in the series.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._values = null;\n\n /**\n * The index of the X axis.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._xaxis = null;\n\n /**\n * The index of the Y axis.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._yaxis = null;\n\n /**\n * Create a new instance of a series from serialised data.\n *\n * @static\n * @method create\n * @param {Object} obj The data of the series.\n * @return {module:core/chart_series}\n */\n Series.prototype.create = function(obj) {\n var s = new Series(obj.label, obj.values);\n s.setType(obj.type);\n s.setXAxis(obj.axes.x);\n s.setYAxis(obj.axes.y);\n s.setLabels(obj.labels);\n\n // Colors are exported as an array with 1, or n values.\n if (obj.colors && obj.colors.length > 1) {\n s.setColors(obj.colors);\n } else {\n s.setColor(obj.colors[0]);\n }\n\n s.setFill(obj.fill);\n s.setSmooth(obj.smooth);\n return s;\n };\n\n /**\n * Get the color.\n *\n * @return {String}\n */\n Series.prototype.getColor = function() {\n return this._colors[0] || null;\n };\n\n /**\n * Get the colors for each value in the series.\n *\n * @return {String[]}\n */\n Series.prototype.getColors = function() {\n return this._colors;\n };\n\n /**\n * Get the number of values in the series.\n *\n * @return {Number}\n */\n Series.prototype.getCount = function() {\n return this._values.length;\n };\n\n /**\n * Get the fill mode of the series.\n *\n * @return {Object}\n */\n Series.prototype.getFill = function() {\n return this._fill;\n };\n\n /**\n * Get the series label.\n *\n * @return {String}\n */\n Series.prototype.getLabel = function() {\n return this._label;\n };\n\n /**\n * Get labels for the values of the series.\n *\n * @return {String[]}\n */\n Series.prototype.getLabels = function() {\n return this._labels;\n };\n\n /**\n * Get whether the line of the serie should be smooth or not.\n *\n * @returns {Bool}\n */\n Series.prototype.getSmooth = function() {\n return this._smooth;\n };\n\n /**\n * Get the series type.\n *\n * @return {String}\n */\n Series.prototype.getType = function() {\n return this._type;\n };\n\n /**\n * Get the series values.\n *\n * @return {Number[]}\n */\n Series.prototype.getValues = function() {\n return this._values;\n };\n\n /**\n * Get the index of the X axis.\n *\n * @return {Number}\n */\n Series.prototype.getXAxis = function() {\n return this._xaxis;\n };\n\n /**\n * Get the index of the Y axis.\n *\n * @return {Number}\n */\n Series.prototype.getYAxis = function() {\n return this._yaxis;\n };\n\n /**\n * Whether there is a color per value.\n *\n * @return {Bool}\n */\n Series.prototype.hasColoredValues = function() {\n return this._colors.length == this.getCount();\n };\n\n /**\n * Set the series color.\n *\n * @param {String} color A CSS-compatible color.\n */\n Series.prototype.setColor = function(color) {\n this._colors = [color];\n };\n\n /**\n * Set a color for each value in the series.\n *\n * @param {String[]} colors CSS-compatible colors.\n */\n Series.prototype.setColors = function(colors) {\n if (colors && colors.length != this.getCount()) {\n throw new Error('When setting multiple colors there must be one per value.');\n }\n this._colors = colors || [];\n };\n\n /**\n * Set the fill mode for the series.\n *\n * @param {Object} fill\n */\n Series.prototype.setFill = function(fill) {\n this._fill = typeof fill === 'undefined' ? null : fill;\n };\n\n /**\n * Set the labels for the values of the series.\n *\n * @param {String[]} labels the labels of the series values.\n */\n Series.prototype.setLabels = function(labels) {\n this._validateLabels(labels);\n labels = typeof labels === 'undefined' ? null : labels;\n this._labels = labels;\n };\n\n /**\n * Set Whether the line of the serie should be smooth or not.\n *\n * Only applicable for line chart or a line series, if null it assumes the chart default (not smooth).\n *\n * @param {Bool} smooth True if the lines should be smooth, false for tensioned lines.\n */\n Series.prototype.setSmooth = function(smooth) {\n smooth = typeof smooth === 'undefined' ? null : smooth;\n this._smooth = smooth;\n };\n\n /**\n * Set the type of the series.\n *\n * @param {String} type A type constant value.\n */\n Series.prototype.setType = function(type) {\n if (type != this.TYPE_DEFAULT && type != this.TYPE_LINE) {\n throw new Error('Invalid serie type.');\n }\n this._type = type || null;\n };\n\n /**\n * Set the index of the X axis.\n *\n * @param {Number} index The index.\n */\n Series.prototype.setXAxis = function(index) {\n this._xaxis = index || null;\n };\n\n\n /**\n * Set the index of the Y axis.\n *\n * @param {Number} index The index.\n */\n Series.prototype.setYAxis = function(index) {\n this._yaxis = index || null;\n };\n\n /**\n * Validate series labels.\n *\n * @protected\n * @param {String[]} labels The labels of the serie.\n */\n Series.prototype._validateLabels = function(labels) {\n if (labels && labels.length > 0 && labels.length != this.getCount()) {\n throw new Error('Series labels must match series values.');\n }\n };\n\n return Series;\n\n});\n"],"names":["define","Series","label","values","Error","_typeof","length","_colors","_label","_values","prototype","TYPE_DEFAULT","TYPE_LINE","_fill","_labels","_smooth","_type","_xaxis","_yaxis","create","obj","s","setType","type","setXAxis","axes","x","setYAxis","y","setLabels","labels","colors","setColors","setColor","setFill","fill","setSmooth","smooth","getColor","this","getColors","getCount","getFill","getLabel","getLabels","getSmooth","getType","getValues","getXAxis","getYAxis","hasColoredValues","color","_validateLabels","index"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chart_series.min.js","sources":["../src/chart_series.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 * Chart series.\n *\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_series\n */\ndefine([], function() {\n\n /**\n * Chart data series.\n *\n * @class\n * @param {String} label The series label.\n * @param {Number[]} values The values.\n */\n function Series(label, values) {\n if (typeof label !== 'string') {\n throw new Error('Invalid label for series.');\n\n } else if (typeof values !== 'object') {\n throw new Error('Values for a series must be an array.');\n\n } else if (values.length < 1) {\n throw new Error('Invalid values received for series.');\n }\n\n this._colors = [];\n this._label = label;\n this._values = values;\n }\n\n /**\n * The default type of series.\n *\n * @type {Null}\n * @const\n */\n Series.prototype.TYPE_DEFAULT = null;\n\n /**\n * Type of series 'line'.\n *\n * @type {String}\n * @const\n */\n Series.prototype.TYPE_LINE = 'line';\n\n /**\n * The colors of the series.\n *\n * @type {String[]}\n * @protected\n */\n Series.prototype._colors = null;\n\n /**\n * The fill mode of the series.\n *\n * @type {Object}\n * @protected\n */\n Series.prototype._fill = false;\n\n /**\n * The label of the series.\n *\n * @type {String}\n * @protected\n */\n Series.prototype._label = null;\n\n /**\n * The labels for the values of the series.\n *\n * @type {String[]}\n * @protected\n */\n Series.prototype._labels = null;\n\n /**\n * Whether the line of the serie should be smooth or not.\n *\n * @type {Bool}\n * @protected\n */\n Series.prototype._smooth = false;\n\n /**\n * The type of the series.\n *\n * @type {String}\n * @protected\n */\n Series.prototype._type = Series.prototype.TYPE_DEFAULT;\n\n /**\n * The values in the series.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._values = null;\n\n /**\n * The index of the X axis.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._xaxis = null;\n\n /**\n * The index of the Y axis.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._yaxis = null;\n\n /**\n * Create a new instance of a series from serialised data.\n *\n * @static\n * @method create\n * @param {Object} obj The data of the series.\n * @return {module:core/chart_series}\n */\n Series.prototype.create = function(obj) {\n var s = new Series(obj.label, obj.values);\n s.setType(obj.type);\n s.setXAxis(obj.axes.x);\n s.setYAxis(obj.axes.y);\n s.setLabels(obj.labels);\n\n // Colors are exported as an array with 1, or n values.\n if (obj.colors && obj.colors.length > 1) {\n s.setColors(obj.colors);\n } else {\n s.setColor(obj.colors[0]);\n }\n\n s.setFill(obj.fill);\n s.setSmooth(obj.smooth);\n return s;\n };\n\n /**\n * Get the color.\n *\n * @return {String}\n */\n Series.prototype.getColor = function() {\n return this._colors[0] || null;\n };\n\n /**\n * Get the colors for each value in the series.\n *\n * @return {String[]}\n */\n Series.prototype.getColors = function() {\n return this._colors;\n };\n\n /**\n * Get the number of values in the series.\n *\n * @return {Number}\n */\n Series.prototype.getCount = function() {\n return this._values.length;\n };\n\n /**\n * Get the fill mode of the series.\n *\n * @return {Object}\n */\n Series.prototype.getFill = function() {\n return this._fill;\n };\n\n /**\n * Get the series label.\n *\n * @return {String}\n */\n Series.prototype.getLabel = function() {\n return this._label;\n };\n\n /**\n * Get labels for the values of the series.\n *\n * @return {String[]}\n */\n Series.prototype.getLabels = function() {\n return this._labels;\n };\n\n /**\n * Get whether the line of the serie should be smooth or not.\n *\n * @returns {Bool}\n */\n Series.prototype.getSmooth = function() {\n return this._smooth;\n };\n\n /**\n * Get the series type.\n *\n * @return {String}\n */\n Series.prototype.getType = function() {\n return this._type;\n };\n\n /**\n * Get the series values.\n *\n * @return {Number[]}\n */\n Series.prototype.getValues = function() {\n return this._values;\n };\n\n /**\n * Get the index of the X axis.\n *\n * @return {Number}\n */\n Series.prototype.getXAxis = function() {\n return this._xaxis;\n };\n\n /**\n * Get the index of the Y axis.\n *\n * @return {Number}\n */\n Series.prototype.getYAxis = function() {\n return this._yaxis;\n };\n\n /**\n * Whether there is a color per value.\n *\n * @return {Bool}\n */\n Series.prototype.hasColoredValues = function() {\n return this._colors.length == this.getCount();\n };\n\n /**\n * Set the series color.\n *\n * @param {String} color A CSS-compatible color.\n */\n Series.prototype.setColor = function(color) {\n this._colors = [color];\n };\n\n /**\n * Set a color for each value in the series.\n *\n * @param {String[]} colors CSS-compatible colors.\n */\n Series.prototype.setColors = function(colors) {\n if (colors && colors.length != this.getCount()) {\n throw new Error('When setting multiple colors there must be one per value.');\n }\n this._colors = colors || [];\n };\n\n /**\n * Set the fill mode for the series.\n *\n * @param {Object} fill\n */\n Series.prototype.setFill = function(fill) {\n this._fill = typeof fill === 'undefined' ? null : fill;\n };\n\n /**\n * Set the labels for the values of the series.\n *\n * @param {String[]} labels the labels of the series values.\n */\n Series.prototype.setLabels = function(labels) {\n this._validateLabels(labels);\n labels = typeof labels === 'undefined' ? null : labels;\n this._labels = labels;\n };\n\n /**\n * Set Whether the line of the serie should be smooth or not.\n *\n * Only applicable for line chart or a line series, if null it assumes the chart default (not smooth).\n *\n * @param {Bool} smooth True if the lines should be smooth, false for tensioned lines.\n */\n Series.prototype.setSmooth = function(smooth) {\n smooth = typeof smooth === 'undefined' ? null : smooth;\n this._smooth = smooth;\n };\n\n /**\n * Set the type of the series.\n *\n * @param {String} type A type constant value.\n */\n Series.prototype.setType = function(type) {\n if (type != this.TYPE_DEFAULT && type != this.TYPE_LINE) {\n throw new Error('Invalid serie type.');\n }\n this._type = type || null;\n };\n\n /**\n * Set the index of the X axis.\n *\n * @param {Number} index The index.\n */\n Series.prototype.setXAxis = function(index) {\n this._xaxis = index || null;\n };\n\n\n /**\n * Set the index of the Y axis.\n *\n * @param {Number} index The index.\n */\n Series.prototype.setYAxis = function(index) {\n this._yaxis = index || null;\n };\n\n /**\n * Validate series labels.\n *\n * @protected\n * @param {String[]} labels The labels of the serie.\n */\n Series.prototype._validateLabels = function(labels) {\n if (labels && labels.length > 0 && labels.length != this.getCount()) {\n throw new Error('Series labels must match series values.');\n }\n };\n\n return Series;\n\n});\n"],"names":["define","Series","label","values","Error","_typeof","length","_colors","_label","_values","prototype","TYPE_DEFAULT","TYPE_LINE","_fill","_labels","_smooth","_type","_xaxis","_yaxis","create","obj","s","setType","type","setXAxis","axes","x","setYAxis","y","setLabels","labels","colors","setColors","setColor","setFill","fill","setSmooth","smooth","getColor","this","getColors","getCount","getFill","getLabel","getLabels","getSmooth","getType","getValues","getXAxis","getYAxis","hasColoredValues","color","_validateLabels","index"],"mappings":";;;;;;;IAsBAA,OAAM,oBAAC,IAAI,WASP,SAASC,OAAOC,MAAOC,QACnB,GAAqB,iBAAVD,MACP,MAAM,IAAIE,MAAM,6BAEb,GAAsB,WAAlBC,QAAOF,QACd,MAAM,IAAIC,MAAM,yCAEb,GAAID,OAAOG,OAAS,EACvB,MAAM,IAAIF,MAAM,uCAGfG,KAAAA,QAAU,GACVC,KAAAA,OAASN,MACTO,KAAAA,QAAUN,MAClB,CAiUD,OAzTAF,OAAOS,UAAUC,aAAe,KAQhCV,OAAOS,UAAUE,UAAY,OAQ7BX,OAAOS,UAAUH,QAAU,KAQ3BN,OAAOS,UAAUG,OAAQ,EAQzBZ,OAAOS,UAAUF,OAAS,KAQzBP,OAAOS,UAAUI,QAAU,KAQ5Bb,OAAOS,UAAUK,SAAU,EAQ3Bd,OAAOS,UAAUM,MAAQf,OAAOS,UAAUC,aAQ1CV,OAAOS,UAAUD,QAAU,KAQ3BR,OAAOS,UAAUO,OAAS,KAQ1BhB,OAAOS,UAAUQ,OAAS,KAU1BjB,OAAOS,UAAUS,OAAS,SAASC,KAC/B,IAAIC,EAAI,IAAIpB,OAAOmB,IAAIlB,MAAOkB,IAAIjB,QAelC,OAdAkB,EAAEC,QAAQF,IAAIG,MACdF,EAAEG,SAASJ,IAAIK,KAAKC,GACpBL,EAAEM,SAASP,IAAIK,KAAKG,GACpBP,EAAEQ,UAAUT,IAAIU,QAGZV,IAAIW,QAAUX,IAAIW,OAAOzB,OAAS,EAClCe,EAAEW,UAAUZ,IAAIW,QAEhBV,EAAEY,SAASb,IAAIW,OAAO,IAG1BV,EAAEa,QAAQd,IAAIe,MACdd,EAAEe,UAAUhB,IAAIiB,QACThB,CACV,EAODpB,OAAOS,UAAU4B,SAAW,WACxB,OAAOC,KAAKhC,QAAQ,IAAM,IAC7B,EAODN,OAAOS,UAAU8B,UAAY,WACzB,OAAOD,KAAKhC,OACf,EAODN,OAAOS,UAAU+B,SAAW,WACjB,OAAAF,KAAK9B,QAAQH,MACvB,EAODL,OAAOS,UAAUgC,QAAU,WACzB,OAAOH,KAAK1B,KACb,EAODZ,OAAOS,UAAUiC,SAAW,WACxB,OAAOJ,KAAK/B,MACf,EAODP,OAAOS,UAAUkC,UAAY,WACzB,OAAOL,KAAKzB,OACf,EAODb,OAAOS,UAAUmC,UAAY,WACzB,OAAON,KAAKxB,OACf,EAODd,OAAOS,UAAUoC,QAAU,WACvB,OAAOP,KAAKvB,KACf,EAODf,OAAOS,UAAUqC,UAAY,WACzB,OAAOR,KAAK9B,OACf,EAODR,OAAOS,UAAUsC,SAAW,WACxB,OAAOT,KAAKtB,MACf,EAODhB,OAAOS,UAAUuC,SAAW,WACxB,OAAOV,KAAKrB,MACf,EAODjB,OAAOS,UAAUwC,iBAAmB,WAChC,OAAOX,KAAKhC,QAAQD,QAAUiC,KAAKE,UACtC,EAODxC,OAAOS,UAAUuB,SAAW,SAASkB,OACjCZ,KAAKhC,QAAU,CAAC4C,MACnB,EAODlD,OAAOS,UAAUsB,UAAY,SAASD,QAC9BA,GAAAA,QAAUA,OAAOzB,QAAUiC,KAAKE,WAChC,MAAM,IAAIrC,MAAM,6DAEpBmC,KAAKhC,QAAUwB,QAAU,EAC5B,EAOD9B,OAAOS,UAAUwB,QAAU,SAASC,MAC7BtB,KAAAA,WAAwB,IAATsB,KAAuB,KAAOA,IACnD,EAODlC,OAAOS,UAAUmB,UAAY,SAASC,QAC7BsB,KAAAA,gBAAgBtB,QACrBA,YAA2B,IAAXA,OAAyB,KAAOA,OAC3ChB,KAAAA,QAAUgB,MAClB,EASD7B,OAAOS,UAAU0B,UAAY,SAASC,QAClCA,YAA2B,IAAXA,OAAyB,KAAOA,OAC3CtB,KAAAA,QAAUsB,MAClB,EAODpC,OAAOS,UAAUY,QAAU,SAASC,MAC5BA,GAAAA,MAAQgB,KAAK5B,cAAgBY,MAAQgB,KAAK3B,UAC1C,MAAM,IAAIR,MAAM,uBAEpBmC,KAAKvB,MAAQO,MAAQ,IACxB,EAODtB,OAAOS,UAAUc,SAAW,SAAS6B,OACjCd,KAAKtB,OAASoC,OAAS,IAC1B,EAQDpD,OAAOS,UAAUiB,SAAW,SAAS0B,OACjCd,KAAKrB,OAASmC,OAAS,IAC1B,EAQDpD,OAAOS,UAAU0C,gBAAkB,SAAStB,QACxC,GAAIA,QAAUA,OAAOxB,OAAS,GAAKwB,OAAOxB,QAAUiC,KAAKE,WACrD,MAAM,IAAIrC,MAAM,0CAEvB,EAEMH,MAEV"} \ No newline at end of file diff --git a/lib/amd/build/chartjs-lazy.min.js b/lib/amd/build/chartjs-lazy.min.js index 213c861f294..e924e2d6762 100644 --- a/lib/amd/build/chartjs-lazy.min.js +++ b/lib/amd/build/chartjs-lazy.min.js @@ -1,3 +1,3 @@ -function _typeof(obj){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof(obj)}!function(global,factory){"object"===("undefined"==typeof exports?"undefined":_typeof(exports))&&"undefined"!=typeof module?module.exports=factory():"function"==typeof define&&define.amd?define("core/chartjs-lazy",factory):(global=global||self).Chart=factory()}(window,(function(){"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function commonjsRequire(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}function createCommonjsModule(fn,module){return fn(module={exports:{}},module.exports),module.exports}var colorName={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},conversions=createCommonjsModule((function(module){var reverseKeywords={};for(var key in colorName)colorName.hasOwnProperty(key)&&(reverseKeywords[colorName[key]]=key);var convert=module.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var model in convert)if(convert.hasOwnProperty(model)){if(!("channels"in convert[model]))throw new Error("missing channels property: "+model);if(!("labels"in convert[model]))throw new Error("missing channel labels property: "+model);if(convert[model].labels.length!==convert[model].channels)throw new Error("channel and label counts mismatch: "+model);var channels=convert[model].channels,labels=convert[model].labels;delete convert[model].channels,delete convert[model].labels,Object.defineProperty(convert[model],"channels",{value:channels}),Object.defineProperty(convert[model],"labels",{value:labels})}convert.rgb.hsl=function(rgb){var h,l,r=rgb[0]/255,g=rgb[1]/255,b=rgb[2]/255,min=Math.min(r,g,b),max=Math.max(r,g,b),delta=max-min;return max===min?h=0:r===max?h=(g-b)/delta:g===max?h=2+(b-r)/delta:b===max&&(h=4+(r-g)/delta),(h=Math.min(60*h,360))<0&&(h+=360),l=(min+max)/2,[h,100*(max===min?0:l<=.5?delta/(max+min):delta/(2-max-min)),100*l]},convert.rgb.hsv=function(rgb){var rdif,gdif,bdif,h,s,r=rgb[0]/255,g=rgb[1]/255,b=rgb[2]/255,v=Math.max(r,g,b),diff=v-Math.min(r,g,b),diffc=function(c){return(v-c)/6/diff+.5};return 0===diff?h=s=0:(s=diff/v,rdif=diffc(r),gdif=diffc(g),bdif=diffc(b),r===v?h=bdif-gdif:g===v?h=1/3+rdif-bdif:b===v&&(h=2/3+gdif-rdif),h<0?h+=1:h>1&&(h-=1)),[360*h,100*s,100*v]},convert.rgb.hwb=function(rgb){var r=rgb[0],g=rgb[1],b=rgb[2];return[convert.rgb.hsl(rgb)[0],100*(1/255*Math.min(r,Math.min(g,b))),100*(b=1-1/255*Math.max(r,Math.max(g,b)))]},convert.rgb.cmyk=function(rgb){var k,r=rgb[0]/255,g=rgb[1]/255,b=rgb[2]/255;return[100*((1-r-(k=Math.min(1-r,1-g,1-b)))/(1-k)||0),100*((1-g-k)/(1-k)||0),100*((1-b-k)/(1-k)||0),100*k]},convert.rgb.keyword=function(rgb){var reversed=reverseKeywords[rgb];if(reversed)return reversed;var currentClosestKeyword,x,y,currentClosestDistance=1/0;for(var keyword in colorName)if(colorName.hasOwnProperty(keyword)){var value=colorName[keyword],distance=(x=rgb,y=value,Math.pow(x[0]-y[0],2)+Math.pow(x[1]-y[1],2)+Math.pow(x[2]-y[2],2));distance.04045?Math.pow((r+.055)/1.055,2.4):r/12.92)+.3576*(g=g>.04045?Math.pow((g+.055)/1.055,2.4):g/12.92)+.1805*(b=b>.04045?Math.pow((b+.055)/1.055,2.4):b/12.92)),100*(.2126*r+.7152*g+.0722*b),100*(.0193*r+.1192*g+.9505*b)]},convert.rgb.lab=function(rgb){var xyz=convert.rgb.xyz(rgb),x=xyz[0],y=xyz[1],z=xyz[2];return y/=100,z/=108.883,x=(x/=95.047)>.008856?Math.pow(x,1/3):7.787*x+16/116,[116*(y=y>.008856?Math.pow(y,1/3):7.787*y+16/116)-16,500*(x-y),200*(y-(z=z>.008856?Math.pow(z,1/3):7.787*z+16/116))]},convert.hsl.rgb=function(hsl){var t1,t2,t3,rgb,val,h=hsl[0]/360,s=hsl[1]/100,l=hsl[2]/100;if(0===s)return[val=255*l,val,val];t1=2*l-(t2=l<.5?l*(1+s):l+s-l*s),rgb=[0,0,0];for(var i=0;i<3;i++)(t3=h+1/3*-(i-1))<0&&t3++,t3>1&&t3--,val=6*t3<1?t1+6*(t2-t1)*t3:2*t3<1?t2:3*t3<2?t1+(t2-t1)*(2/3-t3)*6:t1,rgb[i]=255*val;return rgb},convert.hsl.hsv=function(hsl){var h=hsl[0],s=hsl[1]/100,l=hsl[2]/100,smin=s,lmin=Math.max(l,.01);return s*=(l*=2)<=1?l:2-l,smin*=lmin<=1?lmin:2-lmin,[h,100*(0===l?2*smin/(lmin+smin):2*s/(l+s)),100*((l+s)/2)]},convert.hsv.rgb=function(hsv){var h=hsv[0]/60,s=hsv[1]/100,v=hsv[2]/100,hi=Math.floor(h)%6,f=h-Math.floor(h),p=255*v*(1-s),q=255*v*(1-s*f),t=255*v*(1-s*(1-f));switch(v*=255,hi){case 0:return[v,t,p];case 1:return[q,v,p];case 2:return[p,v,t];case 3:return[p,q,v];case 4:return[t,p,v];case 5:return[v,p,q]}},convert.hsv.hsl=function(hsv){var lmin,sl,l,h=hsv[0],s=hsv[1]/100,v=hsv[2]/100,vmin=Math.max(v,.01);return l=(2-s)*v,sl=s*vmin,[h,100*(sl=(sl/=(lmin=(2-s)*vmin)<=1?lmin:2-lmin)||0),100*(l/=2)]},convert.hwb.rgb=function(hwb){var i,v,f,n,r,g,b,h=hwb[0]/360,wh=hwb[1]/100,bl=hwb[2]/100,ratio=wh+bl;switch(ratio>1&&(wh/=ratio,bl/=ratio),f=6*h-(i=Math.floor(6*h)),0!=(1&i)&&(f=1-f),n=wh+f*((v=1-bl)-wh),i){default:case 6:case 0:r=v,g=n,b=wh;break;case 1:r=n,g=v,b=wh;break;case 2:r=wh,g=v,b=n;break;case 3:r=wh,g=n,b=v;break;case 4:r=n,g=wh,b=v;break;case 5:r=v,g=wh,b=n}return[255*r,255*g,255*b]},convert.cmyk.rgb=function(cmyk){var c=cmyk[0]/100,m=cmyk[1]/100,y=cmyk[2]/100,k=cmyk[3]/100;return[255*(1-Math.min(1,c*(1-k)+k)),255*(1-Math.min(1,m*(1-k)+k)),255*(1-Math.min(1,y*(1-k)+k))]},convert.xyz.rgb=function(xyz){var r,g,b,x=xyz[0]/100,y=xyz[1]/100,z=xyz[2]/100;return g=-.9689*x+1.8758*y+.0415*z,b=.0557*x+-.204*y+1.057*z,r=(r=3.2406*x+-1.5372*y+-.4986*z)>.0031308?1.055*Math.pow(r,1/2.4)-.055:12.92*r,g=g>.0031308?1.055*Math.pow(g,1/2.4)-.055:12.92*g,b=b>.0031308?1.055*Math.pow(b,1/2.4)-.055:12.92*b,[255*(r=Math.min(Math.max(0,r),1)),255*(g=Math.min(Math.max(0,g),1)),255*(b=Math.min(Math.max(0,b),1))]},convert.xyz.lab=function(xyz){var x=xyz[0],y=xyz[1],z=xyz[2];return y/=100,z/=108.883,x=(x/=95.047)>.008856?Math.pow(x,1/3):7.787*x+16/116,[116*(y=y>.008856?Math.pow(y,1/3):7.787*y+16/116)-16,500*(x-y),200*(y-(z=z>.008856?Math.pow(z,1/3):7.787*z+16/116))]},convert.lab.xyz=function(lab){var x,y,z,l=lab[0];x=lab[1]/500+(y=(l+16)/116),z=y-lab[2]/200;var y2=Math.pow(y,3),x2=Math.pow(x,3),z2=Math.pow(z,3);return y=y2>.008856?y2:(y-16/116)/7.787,x=x2>.008856?x2:(x-16/116)/7.787,z=z2>.008856?z2:(z-16/116)/7.787,[x*=95.047,y*=100,z*=108.883]},convert.lab.lch=function(lab){var h,l=lab[0],a=lab[1],b=lab[2];return(h=360*Math.atan2(b,a)/2/Math.PI)<0&&(h+=360),[l,Math.sqrt(a*a+b*b),h]},convert.lch.lab=function(lch){var hr,l=lch[0],c=lch[1];return hr=lch[2]/360*2*Math.PI,[l,c*Math.cos(hr),c*Math.sin(hr)]},convert.rgb.ansi16=function(args){var r=args[0],g=args[1],b=args[2],value=1 in arguments?arguments[1]:convert.rgb.hsv(args)[2];if(0===(value=Math.round(value/50)))return 30;var ansi=30+(Math.round(b/255)<<2|Math.round(g/255)<<1|Math.round(r/255));return 2===value&&(ansi+=60),ansi},convert.hsv.ansi16=function(args){return convert.rgb.ansi16(convert.hsv.rgb(args),args[2])},convert.rgb.ansi256=function(args){var r=args[0],g=args[1],b=args[2];return r===g&&g===b?r<8?16:r>248?231:Math.round((r-8)/247*24)+232:16+36*Math.round(r/255*5)+6*Math.round(g/255*5)+Math.round(b/255*5)},convert.ansi16.rgb=function(args){var color=args%10;if(0===color||7===color)return args>50&&(color+=3.5),[color=color/10.5*255,color,color];var mult=.5*(1+~~(args>50));return[(1&color)*mult*255,(color>>1&1)*mult*255,(color>>2&1)*mult*255]},convert.ansi256.rgb=function(args){if(args>=232){var c=10*(args-232)+8;return[c,c,c]}var rem;return args-=16,[Math.floor(args/36)/5*255,Math.floor((rem=args%36)/6)/5*255,rem%6/5*255]},convert.rgb.hex=function(args){var string=(((255&Math.round(args[0]))<<16)+((255&Math.round(args[1]))<<8)+(255&Math.round(args[2]))).toString(16).toUpperCase();return"000000".substring(string.length)+string},convert.hex.rgb=function(args){var match=args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!match)return[0,0,0];var colorString=match[0];3===match[0].length&&(colorString=colorString.split("").map((function(char){return char+char})).join(""));var integer=parseInt(colorString,16);return[integer>>16&255,integer>>8&255,255&integer]},convert.rgb.hcg=function(rgb){var hue,r=rgb[0]/255,g=rgb[1]/255,b=rgb[2]/255,max=Math.max(Math.max(r,g),b),min=Math.min(Math.min(r,g),b),chroma=max-min;return hue=chroma<=0?0:max===r?(g-b)/chroma%6:max===g?2+(b-r)/chroma:4+(r-g)/chroma+4,hue/=6,[360*(hue%=1),100*chroma,100*(chroma<1?min/(1-chroma):0)]},convert.hsl.hcg=function(hsl){var s=hsl[1]/100,l=hsl[2]/100,c=1,f=0;return(c=l<.5?2*s*l:2*s*(1-l))<1&&(f=(l-.5*c)/(1-c)),[hsl[0],100*c,100*f]},convert.hsv.hcg=function(hsv){var s=hsv[1]/100,v=hsv[2]/100,c=s*v,f=0;return c<1&&(f=(v-c)/(1-c)),[hsv[0],100*c,100*f]},convert.hcg.rgb=function(hcg){var h=hcg[0]/360,c=hcg[1]/100,g=hcg[2]/100;if(0===c)return[255*g,255*g,255*g];var mg,pure=[0,0,0],hi=h%1*6,v=hi%1,w=1-v;switch(Math.floor(hi)){case 0:pure[0]=1,pure[1]=v,pure[2]=0;break;case 1:pure[0]=w,pure[1]=1,pure[2]=0;break;case 2:pure[0]=0,pure[1]=1,pure[2]=v;break;case 3:pure[0]=0,pure[1]=w,pure[2]=1;break;case 4:pure[0]=v,pure[1]=0,pure[2]=1;break;default:pure[0]=1,pure[1]=0,pure[2]=w}return mg=(1-c)*g,[255*(c*pure[0]+mg),255*(c*pure[1]+mg),255*(c*pure[2]+mg)]},convert.hcg.hsv=function(hcg){var c=hcg[1]/100,v=c+hcg[2]/100*(1-c),f=0;return v>0&&(f=c/v),[hcg[0],100*f,100*v]},convert.hcg.hsl=function(hcg){var c=hcg[1]/100,l=hcg[2]/100*(1-c)+.5*c,s=0;return l>0&&l<.5?s=c/(2*l):l>=.5&&l<1&&(s=c/(2*(1-l))),[hcg[0],100*s,100*l]},convert.hcg.hwb=function(hcg){var c=hcg[1]/100,v=c+hcg[2]/100*(1-c);return[hcg[0],100*(v-c),100*(1-v)]},convert.hwb.hcg=function(hwb){var w=hwb[1]/100,v=1-hwb[2]/100,c=v-w,g=0;return c<1&&(g=(v-c)/(1-c)),[hwb[0],100*c,100*g]},convert.apple.rgb=function(apple){return[apple[0]/65535*255,apple[1]/65535*255,apple[2]/65535*255]},convert.rgb.apple=function(rgb){return[rgb[0]/255*65535,rgb[1]/255*65535,rgb[2]/255*65535]},convert.gray.rgb=function(args){return[args[0]/100*255,args[0]/100*255,args[0]/100*255]},convert.gray.hsl=convert.gray.hsv=function(args){return[0,0,args[0]]},convert.gray.hwb=function(gray){return[0,100,gray[0]]},convert.gray.cmyk=function(gray){return[0,0,0,gray[0]]},convert.gray.lab=function(gray){return[gray[0],0,0]},convert.gray.hex=function(gray){var val=255&Math.round(gray[0]/100*255),string=((val<<16)+(val<<8)+val).toString(16).toUpperCase();return"000000".substring(string.length)+string},convert.rgb.gray=function(rgb){return[(rgb[0]+rgb[1]+rgb[2])/3/255*100]}}));conversions.rgb,conversions.hsl,conversions.hsv,conversions.hwb,conversions.cmyk,conversions.xyz,conversions.lab,conversions.lch,conversions.hex,conversions.keyword,conversions.ansi16,conversions.ansi256,conversions.hcg,conversions.apple,conversions.gray;function deriveBFS(fromModel){var graph=function(){for(var graph={},models=Object.keys(conversions),len=models.length,i=0;i1&&(args=Array.prototype.slice.call(arguments));var result=fn(args);if("object"===_typeof(result))for(var len=result.length,i=0;i1&&(args=Array.prototype.slice.call(arguments)),fn(args))};return"conversion"in fn&&(wrappedFn.conversion=fn.conversion),wrappedFn}(fn)}))}));var colorConvert=convert,colorName$1={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},colorString={getRgba:getRgba,getHsla:getHsla,getRgb:function(string){var rgba=getRgba(string);return rgba&&rgba.slice(0,3)},getHsl:function(string){var hsla=getHsla(string);return hsla&&hsla.slice(0,3)},getHwb:getHwb,getAlpha:function(string){var vals=getRgba(string);if(vals)return vals[3];if(vals=getHsla(string))return vals[3];if(vals=getHwb(string))return vals[3]},hexString:function(rgba,a){a=void 0!==a&&3===rgba.length?a:rgba[3];return"#"+hexDouble(rgba[0])+hexDouble(rgba[1])+hexDouble(rgba[2])+(a>=0&&a<1?hexDouble(Math.round(255*a)):"")},rgbString:function(rgba,alpha){if(alpha<1||rgba[3]&&rgba[3]<1)return rgbaString(rgba,alpha);return"rgb("+rgba[0]+", "+rgba[1]+", "+rgba[2]+")"},rgbaString:rgbaString,percentString:function(rgba,alpha){if(alpha<1||rgba[3]&&rgba[3]<1)return percentaString(rgba,alpha);var r=Math.round(rgba[0]/255*100),g=Math.round(rgba[1]/255*100),b=Math.round(rgba[2]/255*100);return"rgb("+r+"%, "+g+"%, "+b+"%)"},percentaString:percentaString,hslString:function(hsla,alpha){if(alpha<1||hsla[3]&&hsla[3]<1)return hslaString(hsla,alpha);return"hsl("+hsla[0]+", "+hsla[1]+"%, "+hsla[2]+"%)"},hslaString:hslaString,hwbString:function(hwb,alpha){void 0===alpha&&(alpha=void 0!==hwb[3]?hwb[3]:1);return"hwb("+hwb[0]+", "+hwb[1]+"%, "+hwb[2]+"%"+(void 0!==alpha&&1!==alpha?", "+alpha:"")+")"},keyword:function(rgb){return reverseNames[rgb.slice(0,3)]}};function getRgba(string){if(string){var rgb=[0,0,0],a=1,match=string.match(/^#([a-fA-F0-9]{3,4})$/i),hexAlpha="";if(match){hexAlpha=(match=match[1])[3];for(var i=0;ilum2?(lum1+.05)/(lum2+.05):(lum2+.05)/(lum1+.05)},level:function(color2){var contrastRatio=this.contrast(color2);return contrastRatio>=7.1?"AAA":contrastRatio>=4.5?"AA":""},dark:function(){var rgb=this.values.rgb;return(299*rgb[0]+587*rgb[1]+114*rgb[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var rgb=[],i=0;i<3;i++)rgb[i]=255-this.values.rgb[i];return this.setValues("rgb",rgb),this},lighten:function(ratio){var hsl=this.values.hsl;return hsl[2]+=hsl[2]*ratio,this.setValues("hsl",hsl),this},darken:function(ratio){var hsl=this.values.hsl;return hsl[2]-=hsl[2]*ratio,this.setValues("hsl",hsl),this},saturate:function(ratio){var hsl=this.values.hsl;return hsl[1]+=hsl[1]*ratio,this.setValues("hsl",hsl),this},desaturate:function(ratio){var hsl=this.values.hsl;return hsl[1]-=hsl[1]*ratio,this.setValues("hsl",hsl),this},whiten:function(ratio){var hwb=this.values.hwb;return hwb[1]+=hwb[1]*ratio,this.setValues("hwb",hwb),this},blacken:function(ratio){var hwb=this.values.hwb;return hwb[2]+=hwb[2]*ratio,this.setValues("hwb",hwb),this},greyscale:function(){var rgb=this.values.rgb,val=.3*rgb[0]+.59*rgb[1]+.11*rgb[2];return this.setValues("rgb",[val,val,val]),this},clearer:function(ratio){var alpha=this.values.alpha;return this.setValues("alpha",alpha-alpha*ratio),this},opaquer:function(ratio){var alpha=this.values.alpha;return this.setValues("alpha",alpha+alpha*ratio),this},rotate:function(degrees){var hsl=this.values.hsl,hue=(hsl[0]+degrees)%360;return hsl[0]=hue<0?360+hue:hue,this.setValues("hsl",hsl),this},mix:function(mixinColor,weight){var color2=mixinColor,p=void 0===weight?.5:weight,w=2*p-1,a=this.alpha()-color2.alpha(),w1=((w*a==-1?w:(w+a)/(1+w*a))+1)/2,w2=1-w1;return this.rgb(w1*this.red()+w2*color2.red(),w1*this.green()+w2*color2.green(),w1*this.blue()+w2*color2.blue()).alpha(this.alpha()*p+color2.alpha()*(1-p))},toJSON:function(){return this.rgb()},clone:function(){var value,type,result=new Color,source=this.values,target=result.values;for(var prop in source)source.hasOwnProperty(prop)&&(value=source[prop],"[object Array]"===(type={}.toString.call(value))?target[prop]=value.slice(0):"[object Number]"===type?target[prop]=value:console.error("unexpected color value:",value));return result}}).spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},Color.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},Color.prototype.getValues=function(space){for(var values=this.values,vals={},i=0;i=0;i--)fn.call(thisArg,loopable[i],i);else for(i=0;i=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var s=1.70158,p=0,a=1;return 0===t?0:1===t?1:(p||(p=.3),a<1?(a=1,s=p/4):s=p/(2*Math.PI)*Math.asin(1/a),-a*Math.pow(2,10*(t-=1))*Math.sin((t-s)*(2*Math.PI)/p))},easeOutElastic:function(t){var s=1.70158,p=0,a=1;return 0===t?0:1===t?1:(p||(p=.3),a<1?(a=1,s=p/4):s=p/(2*Math.PI)*Math.asin(1/a),a*Math.pow(2,-10*t)*Math.sin((t-s)*(2*Math.PI)/p)+1)},easeInOutElastic:function(t){var s=1.70158,p=0,a=1;return 0===t?0:2==(t/=.5)?1:(p||(p=.45),a<1?(a=1,s=p/4):s=p/(2*Math.PI)*Math.asin(1/a),t<1?a*Math.pow(2,10*(t-=1))*Math.sin((t-s)*(2*Math.PI)/p)*-.5:a*Math.pow(2,-10*(t-=1))*Math.sin((t-s)*(2*Math.PI)/p)*.5+1)},easeInBack:function(t){var s=1.70158;return t*t*((s+1)*t-s)},easeOutBack:function(t){var s=1.70158;return(t-=1)*t*((s+1)*t+s)+1},easeInOutBack:function(t){var s=1.70158;return(t/=.5)<1?t*t*((1+(s*=1.525))*t-s)*.5:.5*((t-=2)*t*((1+(s*=1.525))*t+s)+2)},easeInBounce:function(t){return 1-effects.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*effects.easeInBounce(2*t):.5*effects.easeOutBounce(2*t-1)+.5}},helpers_easing={effects:effects};helpers_core.easingEffects=effects;var PI=Math.PI,RAD_PER_DEG=PI/180,DOUBLE_PI=2*PI,HALF_PI=PI/2,QUARTER_PI=PI/4,TWO_THIRDS_PI=2*PI/3,exports$1={clear:function(chart){chart.ctx.clearRect(0,0,chart.width,chart.height)},roundedRect:function(ctx,x,y,width,height,radius){if(radius){var r=Math.min(radius,height/2,width/2),left=x+r,top=y+r,right=x+width-r,bottom=y+height-r;ctx.moveTo(x,top),leftarea.left-1e-6&&point.xarea.top-1e-6&&point.y0&&this.requestAnimationFrame()},advance:function(){for(var animation,chart,numSteps,nextStep,animations=this.animations,i=0;i=numSteps?(helpers$1.callback(animation.onAnimationComplete,[animation],chart),chart.animating=!1,animations.splice(i,1)):++i}},resolve=helpers$1.options.resolve,arrayEvents=["push","pop","shift","splice","unshift"];function unlistenArrayEvents(array,listener){var stub=array._chartjs;if(stub){var listeners=stub.listeners,index=listeners.indexOf(listener);-1!==index&&listeners.splice(index,1),listeners.length>0||(arrayEvents.forEach((function(key){delete array[key]})),delete array._chartjs)}}var DatasetController=function(chart,datasetIndex){this.initialize(chart,datasetIndex)};helpers$1.extend(DatasetController.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(chart,datasetIndex){var me=this;me.chart=chart,me.index=datasetIndex,me.linkScales(),me.addElements(),me._type=me.getMeta().type},updateIndex:function(datasetIndex){this.index=datasetIndex},linkScales:function(){var meta=this.getMeta(),chart=this.chart,scales=chart.scales,dataset=this.getDataset(),scalesOpts=chart.options.scales;null!==meta.xAxisID&&meta.xAxisID in scales&&!dataset.xAxisID||(meta.xAxisID=dataset.xAxisID||scalesOpts.xAxes[0].id),null!==meta.yAxisID&&meta.yAxisID in scales&&!dataset.yAxisID||(meta.yAxisID=dataset.yAxisID||scalesOpts.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(scaleID){return this.chart.scales[scaleID]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&unlistenArrayEvents(this._data,this)},createMetaDataset:function(){var type=this.datasetElementType;return type&&new type({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(index){var type=this.dataElementType;return type&&new type({_chart:this.chart,_datasetIndex:this.index,_index:index})},addElements:function(){var i,ilen,meta=this.getMeta(),data=this.getDataset().data||[],metaData=meta.data;for(i=0,ilen=data.length;inumMeta&&this.insertElements(numMeta,numData-numMeta)},insertElements:function(start,count){for(var i=0;ipixelMargin?(angleMargin=pixelMargin/arc.innerRadius,ctx.arc(x,y,arc.innerRadius-pixelMargin,endAngle+angleMargin,startAngle-angleMargin,!0)):ctx.arc(x,y,pixelMargin,endAngle+Math.PI/2,startAngle-Math.PI/2),ctx.closePath(),ctx.clip()}function drawBorder(ctx,vm,arc){var inner="inner"===vm.borderAlign;inner?(ctx.lineWidth=2*vm.borderWidth,ctx.lineJoin="round"):(ctx.lineWidth=vm.borderWidth,ctx.lineJoin="bevel"),arc.fullCircles&&function(ctx,vm,arc,inner){var i,endAngle=arc.endAngle;for(inner&&(arc.endAngle=arc.startAngle+TAU,clipArc(ctx,arc),arc.endAngle=endAngle,arc.endAngle===arc.startAngle&&arc.fullCircles&&(arc.endAngle+=TAU,arc.fullCircles--)),ctx.beginPath(),ctx.arc(arc.x,arc.y,arc.innerRadius,arc.startAngle+TAU,arc.startAngle,!0),i=0;iendAngle;)angle-=TAU;for(;angle=startAngle&&angle<=endAngle,withinRadius=distance>=vm.innerRadius&&distance<=vm.outerRadius;return betweenAngles&&withinRadius}return!1},getCenterPoint:function(){var vm=this._view,halfAngle=(vm.startAngle+vm.endAngle)/2,halfRadius=(vm.innerRadius+vm.outerRadius)/2;return{x:vm.x+Math.cos(halfAngle)*halfRadius,y:vm.y+Math.sin(halfAngle)*halfRadius}},getArea:function(){var vm=this._view;return Math.PI*((vm.endAngle-vm.startAngle)/(2*Math.PI))*(Math.pow(vm.outerRadius,2)-Math.pow(vm.innerRadius,2))},tooltipPosition:function(){var vm=this._view,centreAngle=vm.startAngle+(vm.endAngle-vm.startAngle)/2,rangeFromCentre=(vm.outerRadius-vm.innerRadius)/2+vm.innerRadius;return{x:vm.x+Math.cos(centreAngle)*rangeFromCentre,y:vm.y+Math.sin(centreAngle)*rangeFromCentre}},draw:function(){var i,ctx=this._chart.ctx,vm=this._view,pixelMargin="inner"===vm.borderAlign?.33:0,arc={x:vm.x,y:vm.y,innerRadius:vm.innerRadius,outerRadius:Math.max(vm.outerRadius-pixelMargin,0),pixelMargin:pixelMargin,startAngle:vm.startAngle,endAngle:vm.endAngle,fullCircles:Math.floor(vm.circumference/TAU)};if(ctx.save(),ctx.fillStyle=vm.backgroundColor,ctx.strokeStyle=vm.borderColor,arc.fullCircles){for(arc.endAngle=arc.startAngle+TAU,ctx.beginPath(),ctx.arc(arc.x,arc.y,arc.outerRadius,arc.startAngle,arc.endAngle),ctx.arc(arc.x,arc.y,arc.innerRadius,arc.endAngle,arc.startAngle,!0),ctx.closePath(),i=0;ivm.x&&(edge=swap(edge,"left","right")):vm.basemaxH?maxH:t,r:skip.right||r<0?0:r>maxW?maxW:r,b:skip.bottom||b<0?0:b>maxH?maxH:b,l:skip.left||l<0?0:l>maxW?maxW:l}}function _inRange(vm,x,y){var skipX=null===x,skipY=null===y,bounds=!(!vm||skipX&&skipY)&&getBarBounds(vm);return bounds&&(skipX||x>=bounds.left&&x<=bounds.right)&&(skipY||y>=bounds.top&&y<=bounds.bottom)}core_defaults._set("global",{elements:{rectangle:{backgroundColor:defaultColor$2,borderColor:defaultColor$2,borderSkipped:"bottom",borderWidth:0}}});var element_rectangle=core_element.extend({_type:"rectangle",draw:function(){var ctx=this._chart.ctx,vm=this._view,rects=function(vm){var bounds=getBarBounds(vm),width=bounds.right-bounds.left,height=bounds.bottom-bounds.top,border=parseBorderWidth(vm,width/2,height/2);return{outer:{x:bounds.left,y:bounds.top,w:width,h:height},inner:{x:bounds.left+border.l,y:bounds.top+border.t,w:width-border.l-border.r,h:height-border.t-border.b}}}(vm),outer=rects.outer,inner=rects.inner;ctx.fillStyle=vm.backgroundColor,ctx.fillRect(outer.x,outer.y,outer.w,outer.h),outer.w===inner.w&&outer.h===inner.h||(ctx.save(),ctx.beginPath(),ctx.rect(outer.x,outer.y,outer.w,outer.h),ctx.clip(),ctx.fillStyle=vm.borderColor,ctx.rect(inner.x,inner.y,inner.w,inner.h),ctx.fill("evenodd"),ctx.restore())},height:function(){var vm=this._view;return vm.base-vm.y},inRange:function(mouseX,mouseY){return _inRange(this._view,mouseX,mouseY)},inLabelRange:function(mouseX,mouseY){var vm=this._view;return isVertical(vm)?_inRange(vm,mouseX,null):_inRange(vm,null,mouseY)},inXRange:function(mouseX){return _inRange(this._view,mouseX,null)},inYRange:function(mouseY){return _inRange(this._view,null,mouseY)},getCenterPoint:function(){var x,y,vm=this._view;return isVertical(vm)?(x=vm.x,y=(vm.y+vm.base)/2):(x=(vm.x+vm.base)/2,y=vm.y),{x:x,y:y}},getArea:function(){var vm=this._view;return isVertical(vm)?vm.width*Math.abs(vm.y-vm.base):vm.height*Math.abs(vm.x-vm.base)},tooltipPosition:function(){var vm=this._view;return{x:vm.x,y:vm.y}}}),elements={},Arc=element_arc,Line=element_line,Point=element_point,Rectangle=element_rectangle;elements.Arc=Arc,elements.Line=Line,elements.Point=Point,elements.Rectangle=Rectangle;var deprecated=helpers$1._deprecated,valueOrDefault$3=helpers$1.valueOrDefault;function computeFitCategoryTraits(index,ruler,options){var size,ratio,thickness=options.barThickness,count=ruler.stackCount,curr=ruler.pixels[index],min=helpers$1.isNullOrUndef(thickness)?function(scale,pixels){var prev,curr,i,ilen,min=scale._length;for(i=1,ilen=pixels.length;i0?Math.min(min,Math.abs(curr-prev)):min,prev=curr;return min}(ruler.scale,ruler.pixels):-1;return helpers$1.isNullOrUndef(thickness)?(size=min*options.categoryPercentage,ratio=options.barPercentage):(size=thickness*count,ratio=1),{chunk:size/count,ratio:ratio,start:curr-size/2}}core_defaults._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),core_defaults._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var controller_bar=core_datasetController.extend({dataElementType:elements.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var meta,scaleOpts,me=this;core_datasetController.prototype.initialize.apply(me,arguments),(meta=me.getMeta()).stack=me.getDataset().stack,meta.bar=!0,scaleOpts=me._getIndexScale().options,deprecated("bar chart",scaleOpts.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),deprecated("bar chart",scaleOpts.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),deprecated("bar chart",scaleOpts.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),deprecated("bar chart",me._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),deprecated("bar chart",scaleOpts.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(reset){var i,ilen,rects=this.getMeta().data;for(this._ruler=this.getRuler(),i=0,ilen=rects.length;i=0&&value.min>=0?value.min:value.max,length=void 0===value.start?value.end:value.max>=0&&value.min>=0?value.max-value.min:value.min-value.max,ilen=metasets.length;if(stacked||void 0===stacked&&void 0!==stack)for(i=0;i=0&&stackLength.max>=0?stackLength.max:stackLength.min,(value.min<0&&ivalue<0||value.max>=0&&ivalue>0)&&(start+=ivalue));return base=scale.getPixelForValue(start),size=(head=scale.getPixelForValue(start+length))-base,void 0!==minBarLength&&Math.abs(size)=0&&!isHorizontal||length<0&&isHorizontal?base-minBarLength:base+minBarLength),{size:size,base:base,head:head,center:head+size/2}},calculateBarIndexPixels:function(datasetIndex,index,ruler,options){var range="flex"===options.barThickness?function(index,ruler,options){var start,pixels=ruler.pixels,curr=pixels[index],prev=index>0?pixels[index-1]:null,next=index=PI$1?-DOUBLE_PI$1:startAngle<-PI$1?DOUBLE_PI$1:0)+circumference,startX=Math.cos(startAngle),startY=Math.sin(startAngle),endX=Math.cos(endAngle),endY=Math.sin(endAngle),contains0=startAngle<=0&&endAngle>=0||endAngle>=DOUBLE_PI$1,contains90=startAngle<=HALF_PI$1&&endAngle>=HALF_PI$1||endAngle>=DOUBLE_PI$1+HALF_PI$1,contains270=startAngle<=-HALF_PI$1&&endAngle>=-HALF_PI$1||endAngle>=PI$1+HALF_PI$1,minX=startAngle===-PI$1||endAngle>=PI$1?-1:Math.min(startX,startX*cutout,endX,endX*cutout),minY=contains270?-1:Math.min(startY,startY*cutout,endY,endY*cutout),maxX=contains0?1:Math.max(startX,startX*cutout,endX,endX*cutout),maxY=contains90?1:Math.max(startY,startY*cutout,endY,endY*cutout);ratioX=(maxX-minX)/2,ratioY=(maxY-minY)/2,offsetX=-(maxX+minX)/2,offsetY=-(maxY+minY)/2}for(i=0,ilen=arcs.length;i0&&!isNaN(value)?DOUBLE_PI$1*(Math.abs(value)/total):0},getMaxBorderWidth:function(arcs){var i,ilen,meta,arc,controller,options,borderWidth,hoverWidth,max=0,chart=this.chart;if(!arcs)for(i=0,ilen=chart.data.datasets.length;i(max=borderWidth>max?borderWidth:max)?hoverWidth:max);return max},setHoverStyle:function(arc){var model=arc._model,options=arc._options,getHoverColor=helpers$1.getHoverColor;arc.$previousStyle={backgroundColor:model.backgroundColor,borderColor:model.borderColor,borderWidth:model.borderWidth},model.backgroundColor=valueOrDefault$5(options.hoverBackgroundColor,getHoverColor(options.backgroundColor)),model.borderColor=valueOrDefault$5(options.hoverBorderColor,getHoverColor(options.borderColor)),model.borderWidth=valueOrDefault$5(options.hoverBorderWidth,options.borderWidth)},_getRingWeightOffset:function(datasetIndex){for(var ringWeightOffset=0,i=0;i0&&isPointInArea(points[i-1]._model,area)&&(model.controlPointPreviousX=capControlPoint(model.controlPointPreviousX,area.left,area.right),model.controlPointPreviousY=capControlPoint(model.controlPointPreviousY,area.top,area.bottom)),i0&&(items=chart.getDatasetMeta(items[0]._datasetIndex).data),items},"x-axis":function(chart,e){return indexMode(chart,e,{intersect:!1})},point:function(chart,e){return getIntersectItems(chart,getRelativePosition(e,chart))},nearest:function(chart,e,options){var position=getRelativePosition(e,chart);options.axis=options.axis||"xy";var distanceMetric=getDistanceMetricForAxis(options.axis);return getNearestItems(chart,position,options.intersect,distanceMetric)},x:function(chart,e,options){var position=getRelativePosition(e,chart),items=[],intersectsItem=!1;return parseVisibleItems(chart,(function(element){element.inXRange(position.x)&&items.push(element),element.inRange(position.x,position.y)&&(intersectsItem=!0)})),options.intersect&&!intersectsItem&&(items=[]),items},y:function(chart,e,options){var position=getRelativePosition(e,chart),items=[],intersectsItem=!1;return parseVisibleItems(chart,(function(element){element.inYRange(position.y)&&items.push(element),element.inRange(position.x,position.y)&&(intersectsItem=!0)})),options.intersect&&!intersectsItem&&(items=[]),items}}},extend=helpers$1.extend;function filterByPosition(array,position){return helpers$1.where(array,(function(v){return v.pos===position}))}function sortByWeight(array,reverse){return array.sort((function(a,b){var v0=reverse?b:a,v1=reverse?a:b;return v0.weight===v1.weight?v0.index-v1.index:v0.weight-v1.weight}))}function getCombinedMax(maxPadding,chartArea,a,b){return Math.max(maxPadding[a],chartArea[a])+Math.max(maxPadding[b],chartArea[b])}function updateDims(chartArea,params,layout){var newWidth,newHeight,box=layout.box,maxPadding=chartArea.maxPadding;if(layout.size&&(chartArea[layout.pos]-=layout.size),layout.size=layout.horizontal?box.height:box.width,chartArea[layout.pos]+=layout.size,box.getPadding){var boxPadding=box.getPadding();maxPadding.top=Math.max(maxPadding.top,boxPadding.top),maxPadding.left=Math.max(maxPadding.left,boxPadding.left),maxPadding.bottom=Math.max(maxPadding.bottom,boxPadding.bottom),maxPadding.right=Math.max(maxPadding.right,boxPadding.right)}if(newWidth=params.outerWidth-getCombinedMax(maxPadding,chartArea,"left","right"),newHeight=params.outerHeight-getCombinedMax(maxPadding,chartArea,"top","bottom"),newWidth!==chartArea.w||newHeight!==chartArea.h){chartArea.w=newWidth,chartArea.h=newHeight;var sizes=layout.horizontal?[newWidth,chartArea.w]:[newHeight,chartArea.h];return!(sizes[0]===sizes[1]||isNaN(sizes[0])&&isNaN(sizes[1]))}}function getMargins(horizontal,chartArea){var maxPadding=chartArea.maxPadding;function marginForPositions(positions){var margin={left:0,top:0,right:0,bottom:0};return positions.forEach((function(pos){margin[pos]=Math.max(chartArea[pos],maxPadding[pos])})),margin}return marginForPositions(horizontal?["left","right"]:["top","bottom"])}function fitBoxes(boxes,chartArea,params){var i,ilen,layout,box,refit,changed,refitBoxes=[];for(i=0,ilen=boxes.length;i div {\r\n\tposition: absolute;\r\n\twidth: 1000000px;\r\n\theight: 1000000px;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n\r\n.chartjs-size-monitor-shrink > div {\r\n\tposition: absolute;\r\n\twidth: 200%;\r\n\theight: 200%;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n"}),stylesheet=(n=platform_dom$1)&&n.default||n,ANIMATION_START_EVENTS=["animationstart","webkitAnimationStart"],EVENT_TYPES={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function readUsedSize(element,property){var value=helpers$1.getStyle(element,property),matches=value&&value.match(/^(\d+)(\.\d+)?px$/);return matches?Number(matches[1]):void 0}var supportsEventListenerOptions=function(){var supports=!1;try{var options=Object.defineProperty({},"passive",{get:function(){supports=!0}});window.addEventListener("e",null,options)}catch(e){}return supports}(),eventListenerOptions=!!supportsEventListenerOptions&&{passive:!0};function addListener(node,type,listener){node.addEventListener(type,listener,eventListenerOptions)}function removeListener(node,type,listener){node.removeEventListener(type,listener,eventListenerOptions)}function createEvent(type,chart,x,y,nativeEvent){return{type:type,chart:chart,native:nativeEvent||null,x:void 0!==x?x:null,y:void 0!==y?y:null}}function createDiv(cls){var el=document.createElement("div");return el.className=cls||"",el}function addResizeListener(node,listener,chart){var fn,thisArg,ticking,args,expando=node.$chartjs||(node.$chartjs={}),resizer=expando.resizer=function(handler){var resizer=createDiv("chartjs-size-monitor"),expand=createDiv("chartjs-size-monitor-expand"),shrink=createDiv("chartjs-size-monitor-shrink");expand.appendChild(createDiv()),shrink.appendChild(createDiv()),resizer.appendChild(expand),resizer.appendChild(shrink),resizer._reset=function(){expand.scrollLeft=1e6,expand.scrollTop=1e6,shrink.scrollLeft=1e6,shrink.scrollTop=1e6};var onScroll=function(){resizer._reset(),handler()};return addListener(expand,"scroll",onScroll.bind(expand,"expand")),addListener(shrink,"scroll",onScroll.bind(shrink,"shrink")),resizer}((fn=function(){if(expando.resizer){var container=chart.options.maintainAspectRatio&&node.parentNode,w=container?container.clientWidth:0;listener(createEvent("resize",chart)),container&&container.clientWidth0){var item=tooltipItems[0];item.label?title=item.label:item.xLabel?title=item.xLabel:labelCount>0&&item.index-1?str.split("\n"):str}function getBaseModel(tooltipOpts){var globalDefaults=core_defaults.global;return{xPadding:tooltipOpts.xPadding,yPadding:tooltipOpts.yPadding,xAlign:tooltipOpts.xAlign,yAlign:tooltipOpts.yAlign,rtl:tooltipOpts.rtl,textDirection:tooltipOpts.textDirection,bodyFontColor:tooltipOpts.bodyFontColor,_bodyFontFamily:valueOrDefault$8(tooltipOpts.bodyFontFamily,globalDefaults.defaultFontFamily),_bodyFontStyle:valueOrDefault$8(tooltipOpts.bodyFontStyle,globalDefaults.defaultFontStyle),_bodyAlign:tooltipOpts.bodyAlign,bodyFontSize:valueOrDefault$8(tooltipOpts.bodyFontSize,globalDefaults.defaultFontSize),bodySpacing:tooltipOpts.bodySpacing,titleFontColor:tooltipOpts.titleFontColor,_titleFontFamily:valueOrDefault$8(tooltipOpts.titleFontFamily,globalDefaults.defaultFontFamily),_titleFontStyle:valueOrDefault$8(tooltipOpts.titleFontStyle,globalDefaults.defaultFontStyle),titleFontSize:valueOrDefault$8(tooltipOpts.titleFontSize,globalDefaults.defaultFontSize),_titleAlign:tooltipOpts.titleAlign,titleSpacing:tooltipOpts.titleSpacing,titleMarginBottom:tooltipOpts.titleMarginBottom,footerFontColor:tooltipOpts.footerFontColor,_footerFontFamily:valueOrDefault$8(tooltipOpts.footerFontFamily,globalDefaults.defaultFontFamily),_footerFontStyle:valueOrDefault$8(tooltipOpts.footerFontStyle,globalDefaults.defaultFontStyle),footerFontSize:valueOrDefault$8(tooltipOpts.footerFontSize,globalDefaults.defaultFontSize),_footerAlign:tooltipOpts.footerAlign,footerSpacing:tooltipOpts.footerSpacing,footerMarginTop:tooltipOpts.footerMarginTop,caretSize:tooltipOpts.caretSize,cornerRadius:tooltipOpts.cornerRadius,backgroundColor:tooltipOpts.backgroundColor,opacity:0,legendColorBackground:tooltipOpts.multiKeyBackground,displayColors:tooltipOpts.displayColors,borderColor:tooltipOpts.borderColor,borderWidth:tooltipOpts.borderWidth}}function getAlignedX(vm,align){return"center"===align?vm.x+vm.width/2:"right"===align?vm.x+vm.width-vm.xPadding:vm.x+vm.xPadding}function getBeforeAfterBodyLines(callback){return pushOrConcat([],splitNewlines(callback))}var exports$4=core_element.extend({initialize:function(){this._model=getBaseModel(this._options),this._lastActive=[]},getTitle:function(){var me=this,opts=me._options,callbacks=opts.callbacks,beforeTitle=callbacks.beforeTitle.apply(me,arguments),title=callbacks.title.apply(me,arguments),afterTitle=callbacks.afterTitle.apply(me,arguments),lines=[];return lines=pushOrConcat(lines,splitNewlines(beforeTitle)),lines=pushOrConcat(lines,splitNewlines(title)),lines=pushOrConcat(lines,splitNewlines(afterTitle))},getBeforeBody:function(){return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(tooltipItems,data){var me=this,callbacks=me._options.callbacks,bodyItems=[];return helpers$1.each(tooltipItems,(function(tooltipItem){var bodyItem={before:[],lines:[],after:[]};pushOrConcat(bodyItem.before,splitNewlines(callbacks.beforeLabel.call(me,tooltipItem,data))),pushOrConcat(bodyItem.lines,callbacks.label.call(me,tooltipItem,data)),pushOrConcat(bodyItem.after,splitNewlines(callbacks.afterLabel.call(me,tooltipItem,data))),bodyItems.push(bodyItem)})),bodyItems},getAfterBody:function(){return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var me=this,callbacks=me._options.callbacks,beforeFooter=callbacks.beforeFooter.apply(me,arguments),footer=callbacks.footer.apply(me,arguments),afterFooter=callbacks.afterFooter.apply(me,arguments),lines=[];return lines=pushOrConcat(lines,splitNewlines(beforeFooter)),lines=pushOrConcat(lines,splitNewlines(footer)),lines=pushOrConcat(lines,splitNewlines(afterFooter))},update:function(changed){var i,len,element,xScale,yScale,index,datasetIndex,controller,indexScale,valueScale,me=this,opts=me._options,existingModel=me._model,model=me._model=getBaseModel(opts),active=me._active,data=me._data,alignment={xAlign:existingModel.xAlign,yAlign:existingModel.yAlign},backgroundPoint={x:existingModel.x,y:existingModel.y},tooltipSize={width:existingModel.width,height:existingModel.height},tooltipPosition={x:existingModel.caretX,y:existingModel.caretY};if(active.length){model.opacity=1;var labelColors=[],labelTextColors=[];tooltipPosition=positioners[opts.position].call(me,active,me._eventPosition);var tooltipItems=[];for(i=0,len=active.length;ichart.height-size.height&&(yAlign="bottom");var midX=(chartArea.left+chartArea.right)/2,midY=(chartArea.top+chartArea.bottom)/2;"center"===yAlign?(lf=function(x){return x<=midX},rf=function(x){return x>midX}):(lf=function(x){return x<=size.width/2},rf=function(x){return x>=chart.width-size.width/2}),olf=function(x){return x+size.width+model.caretSize+model.caretPadding>chart.width},orf=function(x){return x-size.width-model.caretSize-model.caretPadding<0},yf=function(y){return y<=midY?"top":"bottom"},lf(model.x)?(xAlign="left",olf(model.x)&&(xAlign="center",yAlign=yf(model.y))):rf(model.x)&&(xAlign="right",orf(model.x)&&(xAlign="center",yAlign=yf(model.y)));var opts=tooltip._options;return{xAlign:opts.xAlign?opts.xAlign:xAlign,yAlign:opts.yAlign?opts.yAlign:yAlign}}(this,tooltipSize),backgroundPoint=function(vm,size,alignment,chart){var x=vm.x,y=vm.y,caretSize=vm.caretSize,caretPadding=vm.caretPadding,cornerRadius=vm.cornerRadius,xAlign=alignment.xAlign,yAlign=alignment.yAlign,paddingAndSize=caretSize+caretPadding,radiusAndPadding=cornerRadius+caretPadding;return"right"===xAlign?x-=size.width:"center"===xAlign&&((x-=size.width/2)+size.width>chart.width&&(x=chart.width-size.width),x<0&&(x=0)),"top"===yAlign?y+=paddingAndSize:y-="bottom"===yAlign?size.height+paddingAndSize:size.height/2,"center"===yAlign?"left"===xAlign?x+=paddingAndSize:"right"===xAlign&&(x-=paddingAndSize):"left"===xAlign?x-=radiusAndPadding:"right"===xAlign&&(x+=radiusAndPadding),{x:x,y:y}}(model,tooltipSize,alignment,me._chart)}else model.opacity=0;return model.xAlign=alignment.xAlign,model.yAlign=alignment.yAlign,model.x=backgroundPoint.x,model.y=backgroundPoint.y,model.width=tooltipSize.width,model.height=tooltipSize.height,model.caretX=tooltipPosition.x,model.caretY=tooltipPosition.y,me._model=model,changed&&opts.custom&&opts.custom.call(me,model),me},drawCaret:function(tooltipPoint,size){var ctx=this._chart.ctx,vm=this._view,caretPosition=this.getCaretPosition(tooltipPoint,size,vm);ctx.lineTo(caretPosition.x1,caretPosition.y1),ctx.lineTo(caretPosition.x2,caretPosition.y2),ctx.lineTo(caretPosition.x3,caretPosition.y3)},getCaretPosition:function(tooltipPoint,size,vm){var x1,x2,x3,y1,y2,y3,caretSize=vm.caretSize,cornerRadius=vm.cornerRadius,xAlign=vm.xAlign,yAlign=vm.yAlign,ptX=tooltipPoint.x,ptY=tooltipPoint.y,width=size.width,height=size.height;if("center"===yAlign)y2=ptY+height/2,"left"===xAlign?(x2=(x1=ptX)-caretSize,x3=x1,y1=y2+caretSize,y3=y2-caretSize):(x2=(x1=ptX+width)+caretSize,x3=x1,y1=y2-caretSize,y3=y2+caretSize);else if("left"===xAlign?(x1=(x2=ptX+cornerRadius+caretSize)-caretSize,x3=x2+caretSize):"right"===xAlign?(x1=(x2=ptX+width-cornerRadius-caretSize)-caretSize,x3=x2+caretSize):(x1=(x2=vm.caretX)-caretSize,x3=x2+caretSize),"top"===yAlign)y2=(y1=ptY)-caretSize,y3=y1;else{y2=(y1=ptY+height)+caretSize,y3=y1;var tmp=x3;x3=x1,x1=tmp}return{x1:x1,x2:x2,x3:x3,y1:y1,y2:y2,y3:y3}},drawTitle:function(pt,vm,ctx){var titleFontSize,titleSpacing,i,title=vm.title,length=title.length;if(length){var rtlHelper=getRtlHelper(vm.rtl,vm.x,vm.width);for(pt.x=getAlignedX(vm,vm._titleAlign),ctx.textAlign=rtlHelper.textAlign(vm._titleAlign),ctx.textBaseline="middle",titleFontSize=vm.titleFontSize,titleSpacing=vm.titleSpacing,ctx.fillStyle=vm.titleFontColor,ctx.font=helpers$1.fontString(titleFontSize,vm._titleFontStyle,vm._titleFontFamily),i=0;i0&&ctx.stroke()},draw:function(){var ctx=this._chart.ctx,vm=this._view;if(0!==vm.opacity){var tooltipSize={width:vm.width,height:vm.height},pt={x:vm.x,y:vm.y},opacity=Math.abs(vm.opacity<.001)?0:vm.opacity,hasTooltipContent=vm.title.length||vm.beforeBody.length||vm.body.length||vm.afterBody.length||vm.footer.length;this._options.enabled&&hasTooltipContent&&(ctx.save(),ctx.globalAlpha=opacity,this.drawBackground(pt,vm,ctx,tooltipSize),pt.y+=vm.yPadding,helpers$1.rtl.overrideTextDirection(ctx,vm.textDirection),this.drawTitle(pt,vm,ctx),this.drawBody(pt,vm,ctx),this.drawFooter(pt,vm,ctx),helpers$1.rtl.restoreTextDirection(ctx,vm.textDirection),ctx.restore())}},handleEvent:function(e){var changed,me=this,options=me._options;return me._lastActive=me._lastActive||[],"mouseout"===e.type?me._active=[]:(me._active=me._chart.getElementsAtEventForMode(e,options.mode,options),options.reverse&&me._active.reverse()),(changed=!helpers$1.arrayEquals(me._active,me._lastActive))&&(me._lastActive=me._active,(options.enabled||options.custom)&&(me._eventPosition={x:e.x,y:e.y},me.update(!0),me.pivot())),changed}}),positioners_1=positioners,core_tooltip=exports$4;core_tooltip.positioners=positioners_1;var valueOrDefault$9=helpers$1.valueOrDefault;function mergeScaleConfig(){return helpers$1.merge(Object.create(null),[].slice.call(arguments),{merger:function(key,target,source,options){if("xAxes"===key||"yAxes"===key){var i,type,scale,slen=source[key].length;for(target[key]||(target[key]=[]),i=0;i=target[key].length&&target[key].push({}),!target[key][i].type||scale.type&&scale.type!==target[key][i].type?helpers$1.merge(target[key][i],[core_scaleService.getScaleDefaults(type),scale]):helpers$1.merge(target[key][i],scale)}else helpers$1._merger(key,target,source,options)}})}function mergeConfig(){return helpers$1.merge(Object.create(null),[].slice.call(arguments),{merger:function(key,target,source,options){var tval=target[key]||Object.create(null),sval=source[key];"scales"===key?target[key]=mergeScaleConfig(tval,sval):"scale"===key?target[key]=helpers$1.merge(tval,[core_scaleService.getScaleDefaults(sval.type),sval]):helpers$1._merger(key,target,source,options)}})}function updateConfig(chart){var newOptions=chart.options;helpers$1.each(chart.scales,(function(scale){core_layouts.removeBox(chart,scale)})),newOptions=mergeConfig(core_defaults.global,core_defaults[chart.config.type],newOptions),chart.options=chart.config.options=newOptions,chart.ensureScalesHaveIDs(),chart.buildOrUpdateScales(),chart.tooltip._options=newOptions.tooltips,chart.tooltip.initialize()}function nextAvailableScaleId(axesOpts,prefix,index){var id,hasId=function(obj){return obj.id===id};do{id=prefix+index++}while(helpers$1.findIndex(axesOpts,hasId)>=0);return id}function positionIsHorizontal(position){return"top"===position||"bottom"===position}function compare2Level(l1,l2){return function(a,b){return a[l1]===b[l1]?a[l2]-b[l2]:a[l1]-b[l1]}}core_defaults._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var Chart=function(item,config){return this.construct(item,config),this};helpers$1.extend(Chart.prototype,{construct:function(item,config){var me=this;config=function(config){var data=(config=config||Object.create(null)).data=config.data||{};return data.datasets=data.datasets||[],data.labels=data.labels||[],config.options=mergeConfig(core_defaults.global,core_defaults[config.type],config.options||{}),config}(config);var context=platform.acquireContext(item,config),canvas=context&&context.canvas,height=canvas&&canvas.height,width=canvas&&canvas.width;me.id=helpers$1.uid(),me.ctx=context,me.canvas=canvas,me.config=config,me.width=width,me.height=height,me.aspectRatio=height?width/height:null,me.options=config.options,me._bufferedRender=!1,me._layers=[],me.chart=me,me.controller=me,Chart.instances[me.id]=me,Object.defineProperty(me,"data",{get:function(){return me.config.data},set:function(value){me.config.data=value}}),context&&canvas?(me.initialize(),me.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var me=this;return core_plugins.notify(me,"beforeInit"),helpers$1.retinaScale(me,me.options.devicePixelRatio),me.bindEvents(),me.options.responsive&&me.resize(!0),me.initToolTip(),core_plugins.notify(me,"afterInit"),me},clear:function(){return helpers$1.canvas.clear(this),this},stop:function(){return core_animations.cancelAnimation(this),this},resize:function(silent){var me=this,options=me.options,canvas=me.canvas,aspectRatio=options.maintainAspectRatio&&me.aspectRatio||null,newWidth=Math.max(0,Math.floor(helpers$1.getMaximumWidth(canvas))),newHeight=Math.max(0,Math.floor(aspectRatio?newWidth/aspectRatio:helpers$1.getMaximumHeight(canvas)));if((me.width!==newWidth||me.height!==newHeight)&&(canvas.width=me.width=newWidth,canvas.height=me.height=newHeight,canvas.style.width=newWidth+"px",canvas.style.height=newHeight+"px",helpers$1.retinaScale(me,options.devicePixelRatio),!silent)){var newSize={width:newWidth,height:newHeight};core_plugins.notify(me,"resize",[newSize]),options.onResize&&options.onResize(me,newSize),me.stop(),me.update({duration:options.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var options=this.options,scalesOptions=options.scales||{},scaleOptions=options.scale;helpers$1.each(scalesOptions.xAxes,(function(xAxisOptions,index){xAxisOptions.id||(xAxisOptions.id=nextAvailableScaleId(scalesOptions.xAxes,"x-axis-",index))})),helpers$1.each(scalesOptions.yAxes,(function(yAxisOptions,index){yAxisOptions.id||(yAxisOptions.id=nextAvailableScaleId(scalesOptions.yAxes,"y-axis-",index))})),scaleOptions&&(scaleOptions.id=scaleOptions.id||"scale")},buildOrUpdateScales:function(){var me=this,options=me.options,scales=me.scales||{},items=[],updated=Object.keys(scales).reduce((function(obj,id){return obj[id]=!1,obj}),{});options.scales&&(items=items.concat((options.scales.xAxes||[]).map((function(xAxisOptions){return{options:xAxisOptions,dtype:"category",dposition:"bottom"}})),(options.scales.yAxes||[]).map((function(yAxisOptions){return{options:yAxisOptions,dtype:"linear",dposition:"left"}})))),options.scale&&items.push({options:options.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),helpers$1.each(items,(function(item){var scaleOptions=item.options,id=scaleOptions.id,scaleType=valueOrDefault$9(scaleOptions.type,item.dtype);positionIsHorizontal(scaleOptions.position)!==positionIsHorizontal(item.dposition)&&(scaleOptions.position=item.dposition),updated[id]=!0;var scale=null;if(id in scales&&scales[id].type===scaleType)(scale=scales[id]).options=scaleOptions,scale.ctx=me.ctx,scale.chart=me;else{var scaleClass=core_scaleService.getScaleConstructor(scaleType);if(!scaleClass)return;scale=new scaleClass({id:id,type:scaleType,options:scaleOptions,ctx:me.ctx,chart:me}),scales[scale.id]=scale}scale.mergeTicksOptions(),item.isDefault&&(me.scale=scale)})),helpers$1.each(updated,(function(hasUpdated,id){hasUpdated||delete scales[id]})),me.scales=scales,core_scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var i,ilen,me=this,newControllers=[],datasets=me.data.datasets;for(i=0,ilen=datasets.length;i=0;--i)this.drawDataset(metasets[i],easingValue);core_plugins.notify(this,"afterDatasetsDraw",[easingValue])}},drawDataset:function(meta,easingValue){var args={meta:meta,index:meta.index,easingValue:easingValue};!1!==core_plugins.notify(this,"beforeDatasetDraw",[args])&&(meta.controller.draw(easingValue),core_plugins.notify(this,"afterDatasetDraw",[args]))},_drawTooltip:function(easingValue){var tooltip=this.tooltip,args={tooltip:tooltip,easingValue:easingValue};!1!==core_plugins.notify(this,"beforeTooltipDraw",[args])&&(tooltip.draw(),core_plugins.notify(this,"afterTooltipDraw",[args]))},getElementAtEvent:function(e){return core_interaction.modes.single(this,e)},getElementsAtEvent:function(e){return core_interaction.modes.label(this,e,{intersect:!0})},getElementsAtXAxis:function(e){return core_interaction.modes["x-axis"](this,e,{intersect:!0})},getElementsAtEventForMode:function(e,mode,options){var method=core_interaction.modes[mode];return"function"==typeof method?method(this,e,options):[]},getDatasetAtEvent:function(e){return core_interaction.modes.dataset(this,e,{intersect:!0})},getDatasetMeta:function(datasetIndex){var dataset=this.data.datasets[datasetIndex];dataset._meta||(dataset._meta={});var meta=dataset._meta[this.id];return meta||(meta=dataset._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:dataset.order||0,index:datasetIndex}),meta},getVisibleDatasetCount:function(){for(var count=0,i=0,ilen=this.data.datasets.length;i3?ticks[2]-ticks[1]:ticks[1]-ticks[0];Math.abs(delta)>1&&tickValue!==Math.floor(tickValue)&&(delta=tickValue-Math.floor(tickValue));var logDelta=helpers$1.log10(Math.abs(delta)),tickString="";if(0!==tickValue)if(Math.max(Math.abs(ticks[0]),Math.abs(ticks[ticks.length-1]))<1e-4){var logTick=helpers$1.log10(Math.abs(tickValue)),numExponential=Math.floor(logTick)-Math.floor(logDelta);numExponential=Math.max(Math.min(numExponential,20),0),tickString=tickValue.toExponential(numExponential)}else{var numDecimal=-1*Math.floor(logDelta);numDecimal=Math.max(Math.min(numDecimal,20),0),tickString=tickValue.toFixed(numDecimal)}else tickString="0";return tickString},logarithmic:function(tickValue,index,ticks){var remain=tickValue/Math.pow(10,Math.floor(helpers$1.log10(tickValue)));return 0===tickValue?"0":1===remain||2===remain||5===remain||0===index||index===ticks.length-1?tickValue.toExponential():""}}},isArray=helpers$1.isArray,isNullOrUndef=helpers$1.isNullOrUndef,valueOrDefault$a=helpers$1.valueOrDefault,valueAtIndexOrDefault=helpers$1.valueAtIndexOrDefault;function getPixelForGridLine(scale,index,offsetGridLines){var offset,length=scale.getTicks().length,validIndex=Math.min(index,length-1),lineValue=scale.getPixelForTick(validIndex),start=scale._startPixel,end=scale._endPixel;if(!(offsetGridLines&&(offset=1===length?Math.max(lineValue-start,end-lineValue):0===index?(scale.getPixelForTick(1)-lineValue)/2:(lineValue-scale.getPixelForTick(validIndex-1))/2,(lineValue+=validIndexend+1e-6)))return lineValue}function computeLabelSizes(ctx,tickFonts,ticks,caches){var i,j,jlen,label,tickFont,fontString,cache,lineHeight,width,height,nestedLabel,widest,highest,length=ticks.length,widths=[],heights=[],offsets=[],widestLabelSize=0,highestLabelSize=0;for(i=0;ilength){for(i=0;i=maxRotation||numTicks<=1||!me.isHorizontal()?me.labelRotation=minRotation:(maxLabelWidth=(labelSizes=me._getLabelSizes()).widest.width,maxLabelHeight=labelSizes.highest.height-labelSizes.highest.offset,maxWidth=Math.min(me.maxWidth,me.chart.width-maxLabelWidth),maxLabelWidth+6>(tickWidth=options.offset?me.maxWidth/numTicks:maxWidth/(numTicks-1))&&(tickWidth=maxWidth/(numTicks-(options.offset?.5:1)),maxHeight=me.maxHeight-getTickMarkLength(options.gridLines)-tickOpts.padding-getScaleLabelHeight(options.scaleLabel),maxLabelDiagonal=Math.sqrt(maxLabelWidth*maxLabelWidth+maxLabelHeight*maxLabelHeight),labelRotation=helpers$1.toDegrees(Math.min(Math.asin(Math.min((labelSizes.highest.height+6)/tickWidth,1)),Math.asin(Math.min(maxHeight/maxLabelDiagonal,1))-Math.asin(maxLabelHeight/maxLabelDiagonal))),labelRotation=Math.max(minRotation,Math.min(maxRotation,labelRotation))),me.labelRotation=labelRotation)},afterCalculateTickRotation:function(){helpers$1.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){helpers$1.callback(this.options.beforeFit,[this])},fit:function(){var me=this,minSize=me.minSize={width:0,height:0},chart=me.chart,opts=me.options,tickOpts=opts.ticks,scaleLabelOpts=opts.scaleLabel,gridLineOpts=opts.gridLines,display=me._isVisible(),isBottom="bottom"===opts.position,isHorizontal=me.isHorizontal();if(isHorizontal?minSize.width=me.maxWidth:display&&(minSize.width=getTickMarkLength(gridLineOpts)+getScaleLabelHeight(scaleLabelOpts)),isHorizontal?display&&(minSize.height=getTickMarkLength(gridLineOpts)+getScaleLabelHeight(scaleLabelOpts)):minSize.height=me.maxHeight,tickOpts.display&&display){var tickFonts=parseTickFontOptions(tickOpts),labelSizes=me._getLabelSizes(),firstLabelSize=labelSizes.first,lastLabelSize=labelSizes.last,widestLabelSize=labelSizes.widest,highestLabelSize=labelSizes.highest,lineSpace=.4*tickFonts.minor.lineHeight,tickPadding=tickOpts.padding;if(isHorizontal){var isRotated=0!==me.labelRotation,angleRadians=helpers$1.toRadians(me.labelRotation),cosRotation=Math.cos(angleRadians),sinRotation=Math.sin(angleRadians),labelHeight=sinRotation*widestLabelSize.width+cosRotation*(highestLabelSize.height-(isRotated?highestLabelSize.offset:0))+(isRotated?0:lineSpace);minSize.height=Math.min(me.maxHeight,minSize.height+labelHeight+tickPadding);var paddingLeft,paddingRight,offsetLeft=me.getPixelForTick(0)-me.left,offsetRight=me.right-me.getPixelForTick(me.getTicks().length-1);isRotated?(paddingLeft=isBottom?cosRotation*firstLabelSize.width+sinRotation*firstLabelSize.offset:sinRotation*(firstLabelSize.height-firstLabelSize.offset),paddingRight=isBottom?sinRotation*(lastLabelSize.height-lastLabelSize.offset):cosRotation*lastLabelSize.width+sinRotation*lastLabelSize.offset):(paddingLeft=firstLabelSize.width/2,paddingRight=lastLabelSize.width/2),me.paddingLeft=Math.max((paddingLeft-offsetLeft)*me.width/(me.width-offsetLeft),0)+3,me.paddingRight=Math.max((paddingRight-offsetRight)*me.width/(me.width-offsetRight),0)+3}else{var labelWidth=tickOpts.mirror?0:widestLabelSize.width+tickPadding+lineSpace;minSize.width=Math.min(me.maxWidth,minSize.width+labelWidth),me.paddingTop=firstLabelSize.height/2,me.paddingBottom=lastLabelSize.height/2}}me.handleMargins(),isHorizontal?(me.width=me._length=chart.width-me.margins.left-me.margins.right,me.height=minSize.height):(me.width=minSize.width,me.height=me._length=chart.height-me.margins.top-me.margins.bottom)},handleMargins:function(){var me=this;me.margins&&(me.margins.left=Math.max(me.paddingLeft,me.margins.left),me.margins.top=Math.max(me.paddingTop,me.margins.top),me.margins.right=Math.max(me.paddingRight,me.margins.right),me.margins.bottom=Math.max(me.paddingBottom,me.margins.bottom))},afterFit:function(){helpers$1.callback(this.options.afterFit,[this])},isHorizontal:function(){var pos=this.options.position;return"top"===pos||"bottom"===pos},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(rawValue){if(isNullOrUndef(rawValue))return NaN;if(("number"==typeof rawValue||rawValue instanceof Number)&&!isFinite(rawValue))return NaN;if(rawValue)if(this.isHorizontal()){if(void 0!==rawValue.x)return this.getRightValue(rawValue.x)}else if(void 0!==rawValue.y)return this.getRightValue(rawValue.y);return rawValue},_convertTicksToLabels:function(ticks){var labels,i,ilen,me=this;for(me.ticks=ticks.map((function(tick){return tick.value})),me.beforeTickToLabelConversion(),labels=me.convertTicksToLabels(ticks)||me.ticks,me.afterTickToLabelConversion(),i=0,ilen=ticks.length;inumTicks-1?null:this.getPixelForDecimal(index*tickWidth+(offset?tickWidth/2:0))},getPixelForDecimal:function(decimal){return this._reversePixels&&(decimal=1-decimal),this._startPixel+decimal*this._length},getDecimalForPixel:function(pixel){var decimal=(pixel-this._startPixel)/this._length;return this._reversePixels?1-decimal:decimal},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var min=this.min,max=this.max;return this.beginAtZero?0:min<0&&max<0?max:min>0&&max>0?min:0},_autoSkip:function(ticks){var i,ilen,spacing,avgMajorSpacing,tickOpts=this.options.ticks,axisLength=this._length,ticksLimit=tickOpts.maxTicksLimit||axisLength/this._tickSize()+1,majorIndices=tickOpts.major.enabled?function(ticks){var i,ilen,result=[];for(i=0,ilen=ticks.length;iticksLimit)return function(ticks,majorIndices,spacing){var i,tick,count=0,next=majorIndices[0];for(spacing=Math.ceil(spacing),i=0;ispacing)return factor;return Math.max(spacing,1)}(majorIndices,ticks,0,ticksLimit),numMajorIndices>0){for(i=0,ilen=numMajorIndices-1;i1?(last-first)/(numMajorIndices-1):null,skip(ticks,spacing,helpers$1.isNullOrUndef(avgMajorSpacing)?0:first-avgMajorSpacing,first),skip(ticks,spacing,last,helpers$1.isNullOrUndef(avgMajorSpacing)?ticks.length:last+avgMajorSpacing),nonSkipped(ticks)}return skip(ticks,spacing),nonSkipped(ticks)},_tickSize:function(){var optionTicks=this.options.ticks,rot=helpers$1.toRadians(this.labelRotation),cos=Math.abs(Math.cos(rot)),sin=Math.abs(Math.sin(rot)),labelSizes=this._getLabelSizes(),padding=optionTicks.autoSkipPadding||0,w=labelSizes?labelSizes.widest.width+padding:0,h=labelSizes?labelSizes.highest.height+padding:0;return this.isHorizontal()?h*cos>w*sin?w/cos:h/sin:h*sin=0&&(minIndex=findIndex),void 0!==max&&(findIndex=labels.indexOf(max))>=0&&(maxIndex=findIndex),me.minIndex=minIndex,me.maxIndex=maxIndex,me.min=labels[minIndex],me.max=labels[maxIndex]},buildTicks:function(){var labels=this._getLabels(),minIndex=this.minIndex,maxIndex=this.maxIndex;this.ticks=0===minIndex&&maxIndex===labels.length-1?labels:labels.slice(minIndex,maxIndex+1)},getLabelForIndex:function(index,datasetIndex){var chart=this.chart;return chart.getDatasetMeta(datasetIndex).controller._getValueScaleId()===this.id?this.getRightValue(chart.data.datasets[datasetIndex].data[index]):this._getLabels()[index]},_configure:function(){var me=this,offset=me.options.offset,ticks=me.ticks;core_scale.prototype._configure.call(me),me.isHorizontal()||(me._reversePixels=!me._reversePixels),ticks&&(me._startValue=me.minIndex-(offset?.5:0),me._valueRange=Math.max(ticks.length-(offset?0:1),1))},getPixelForValue:function(value,index,datasetIndex){var valueCategory,labels,idx,me=this;return isNullOrUndef$1(index)||isNullOrUndef$1(datasetIndex)||(value=me.chart.data.datasets[datasetIndex].data[index]),isNullOrUndef$1(value)||(valueCategory=me.isHorizontal()?value.x:value.y),(void 0!==valueCategory||void 0!==value&&isNaN(index))&&(labels=me._getLabels(),value=helpers$1.valueOrDefault(valueCategory,value),index=-1!==(idx=labels.indexOf(value))?idx:index,isNaN(index)&&(index=value)),me.getPixelForDecimal((index-me._startValue)/me._valueRange)},getPixelForTick:function(index){var ticks=this.ticks;return index<0||index>ticks.length-1?null:this.getPixelForValue(ticks[index],index+this.minIndex)},getValueForPixel:function(pixel){var value=Math.round(this._startValue+this.getDecimalForPixel(pixel)*this._valueRange);return Math.min(Math.max(value,0),this.ticks.length-1)},getBasePixel:function(){return this.bottom}}),_defaults={position:"bottom"};scale_category._defaults=_defaults;var noop=helpers$1.noop,isNullOrUndef$2=helpers$1.isNullOrUndef;var scale_linearbase=core_scale.extend({getRightValue:function(value){return"string"==typeof value?+value:core_scale.prototype.getRightValue.call(this,value)},handleTickRangeOptions:function(){var me=this,tickOpts=me.options.ticks;if(tickOpts.beginAtZero){var minSign=helpers$1.sign(me.min),maxSign=helpers$1.sign(me.max);minSign<0&&maxSign<0?me.max=0:minSign>0&&maxSign>0&&(me.min=0)}var setMin=void 0!==tickOpts.min||void 0!==tickOpts.suggestedMin,setMax=void 0!==tickOpts.max||void 0!==tickOpts.suggestedMax;void 0!==tickOpts.min?me.min=tickOpts.min:void 0!==tickOpts.suggestedMin&&(null===me.min?me.min=tickOpts.suggestedMin:me.min=Math.min(me.min,tickOpts.suggestedMin)),void 0!==tickOpts.max?me.max=tickOpts.max:void 0!==tickOpts.suggestedMax&&(null===me.max?me.max=tickOpts.suggestedMax:me.max=Math.max(me.max,tickOpts.suggestedMax)),setMin!==setMax&&me.min>=me.max&&(setMin?me.max=me.min+1:me.min=me.max-1),me.min===me.max&&(me.max++,tickOpts.beginAtZero||me.min--)},getTickLimit:function(){var maxTicks,tickOpts=this.options.ticks,stepSize=tickOpts.stepSize,maxTicksLimit=tickOpts.maxTicksLimit;return stepSize?maxTicks=Math.ceil(this.max/stepSize)-Math.floor(this.min/stepSize)+1:(maxTicks=this._computeTickLimit(),maxTicksLimit=maxTicksLimit||11),maxTicksLimit&&(maxTicks=Math.min(maxTicksLimit,maxTicks)),maxTicks},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:noop,buildTicks:function(){var me=this,tickOpts=me.options.ticks,maxTicks=me.getTickLimit(),numericGeneratorOptions={maxTicks:maxTicks=Math.max(2,maxTicks),min:tickOpts.min,max:tickOpts.max,precision:tickOpts.precision,stepSize:helpers$1.valueOrDefault(tickOpts.fixedStepSize,tickOpts.stepSize)},ticks=me.ticks=function(generationOptions,dataRange){var factor,niceMin,niceMax,numSpaces,ticks=[],stepSize=generationOptions.stepSize,unit=stepSize||1,maxNumSpaces=generationOptions.maxTicks-1,min=generationOptions.min,max=generationOptions.max,precision=generationOptions.precision,rmin=dataRange.min,rmax=dataRange.max,spacing=helpers$1.niceNum((rmax-rmin)/maxNumSpaces/unit)*unit;if(spacing<1e-14&&isNullOrUndef$2(min)&&isNullOrUndef$2(max))return[rmin,rmax];(numSpaces=Math.ceil(rmax/spacing)-Math.floor(rmin/spacing))>maxNumSpaces&&(spacing=helpers$1.niceNum(numSpaces*spacing/maxNumSpaces/unit)*unit),stepSize||isNullOrUndef$2(precision)?factor=Math.pow(10,helpers$1._decimalPlaces(spacing)):(factor=Math.pow(10,precision),spacing=Math.ceil(spacing*factor)/factor),niceMin=Math.floor(rmin/spacing)*spacing,niceMax=Math.ceil(rmax/spacing)*spacing,stepSize&&(!isNullOrUndef$2(min)&&helpers$1.almostWhole(min/spacing,spacing/1e3)&&(niceMin=min),!isNullOrUndef$2(max)&&helpers$1.almostWhole(max/spacing,spacing/1e3)&&(niceMax=max)),numSpaces=(niceMax-niceMin)/spacing,numSpaces=helpers$1.almostEquals(numSpaces,Math.round(numSpaces),spacing/1e3)?Math.round(numSpaces):Math.ceil(numSpaces),niceMin=Math.round(niceMin*factor)/factor,niceMax=Math.round(niceMax*factor)/factor,ticks.push(isNullOrUndef$2(min)?niceMin:min);for(var j=1;jticks.length-1?null:this.getPixelForValue(ticks[index])}}),_defaults$1=defaultConfig$1;scale_linear._defaults=_defaults$1;var valueOrDefault$b=helpers$1.valueOrDefault,log10=helpers$1.math.log10;var defaultConfig$2={position:"left",ticks:{callback:core_ticks.formatters.logarithmic}};function nonNegativeOrDefault(value,defaultValue){return helpers$1.isFinite(value)&&value>=0?value:defaultValue}var scale_logarithmic=core_scale.extend({determineDataLimits:function(){var datasetIndex,meta,value,data,i,ilen,me=this,opts=me.options,chart=me.chart,datasets=chart.data.datasets,isHorizontal=me.isHorizontal();function IDMatches(meta){return isHorizontal?meta.xAxisID===me.id:meta.yAxisID===me.id}me.min=Number.POSITIVE_INFINITY,me.max=Number.NEGATIVE_INFINITY,me.minNotZero=Number.POSITIVE_INFINITY;var hasStacks=opts.stacked;if(void 0===hasStacks)for(datasetIndex=0;datasetIndex0){var minVal=helpers$1.min(valuesForType),maxVal=helpers$1.max(valuesForType);me.min=Math.min(me.min,minVal),me.max=Math.max(me.max,maxVal)}}))}else for(datasetIndex=0;datasetIndex0?me.minNotZero=me.min:me.max<1?me.minNotZero=Math.pow(10,Math.floor(log10(me.max))):me.minNotZero=1)},buildTicks:function(){var me=this,tickOpts=me.options.ticks,reverse=!me.isHorizontal(),generationOptions={min:nonNegativeOrDefault(tickOpts.min),max:nonNegativeOrDefault(tickOpts.max)},ticks=me.ticks=function(generationOptions,dataRange){var exp,significand,ticks=[],tickVal=valueOrDefault$b(generationOptions.min,Math.pow(10,Math.floor(log10(dataRange.min)))),endExp=Math.floor(log10(dataRange.max)),endSignificand=Math.ceil(dataRange.max/Math.pow(10,endExp));0===tickVal?(exp=Math.floor(log10(dataRange.minNotZero)),significand=Math.floor(dataRange.minNotZero/Math.pow(10,exp)),ticks.push(tickVal),tickVal=significand*Math.pow(10,exp)):(exp=Math.floor(log10(tickVal)),significand=Math.floor(tickVal/Math.pow(10,exp)));var precision=exp<0?Math.pow(10,Math.abs(exp)):1;do{ticks.push(tickVal),10==++significand&&(significand=1,precision=++exp>=0?1:precision),tickVal=Math.round(significand*Math.pow(10,exp)*precision)/precision}while(expticks.length-1?null:this.getPixelForValue(ticks[index])},_getFirstTickValue:function(value){var exp=Math.floor(log10(value));return Math.floor(value/Math.pow(10,exp))*Math.pow(10,exp)},_configure:function(){var me=this,start=me.min,offset=0;core_scale.prototype._configure.call(me),0===start&&(start=me._getFirstTickValue(me.minNotZero),offset=valueOrDefault$b(me.options.ticks.fontSize,core_defaults.global.defaultFontSize)/me._length),me._startValue=log10(start),me._valueOffset=offset,me._valueRange=(log10(me.max)-log10(start))/(1-offset)},getPixelForValue:function(value){var me=this,decimal=0;return(value=+me.getRightValue(value))>me.min&&value>0&&(decimal=(log10(value)-me._startValue)/me._valueRange+me._valueOffset),me.getPixelForDecimal(decimal)},getValueForPixel:function(pixel){var me=this,decimal=me.getDecimalForPixel(pixel);return 0===decimal&&0===me.min?0:Math.pow(10,me._startValue+(decimal-me._valueOffset)*me._valueRange)}}),_defaults$2=defaultConfig$2;scale_logarithmic._defaults=_defaults$2;var valueOrDefault$c=helpers$1.valueOrDefault,valueAtIndexOrDefault$1=helpers$1.valueAtIndexOrDefault,resolve$4=helpers$1.options.resolve,defaultConfig$3={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:core_ticks.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(label){return label}}};function getTickBackdropHeight(opts){var tickOpts=opts.ticks;return tickOpts.display&&opts.display?valueOrDefault$c(tickOpts.fontSize,core_defaults.global.defaultFontSize)+2*tickOpts.backdropPaddingY:0}function determineLimits(angle,pos,size,min,max){return angle===min||angle===max?{start:pos-size/2,end:pos+size/2}:anglemax?{start:pos-size,end:pos}:{start:pos,end:pos+size}}function getTextAlignForAngle(angle){return 0===angle||180===angle?"center":angle<180?"left":"right"}function fillText(ctx,text,position,lineHeight){var i,ilen,y=position.y+lineHeight/2;if(helpers$1.isArray(text))for(i=0,ilen=text.length;i270||angle<90)&&(position.y-=textSize.h)}function numberOrZero(param){return helpers$1.isNumber(param)?param:0}var scale_radialLinear=scale_linearbase.extend({setDimensions:function(){var me=this;me.width=me.maxWidth,me.height=me.maxHeight,me.paddingTop=getTickBackdropHeight(me.options)/2,me.xCenter=Math.floor(me.width/2),me.yCenter=Math.floor((me.height-me.paddingTop)/2),me.drawingArea=Math.min(me.height-me.paddingTop,me.width)/2},determineDataLimits:function(){var me=this,chart=me.chart,min=Number.POSITIVE_INFINITY,max=Number.NEGATIVE_INFINITY;helpers$1.each(chart.data.datasets,(function(dataset,datasetIndex){if(chart.isDatasetVisible(datasetIndex)){var meta=chart.getDatasetMeta(datasetIndex);helpers$1.each(dataset.data,(function(rawValue,index){var value=+me.getRightValue(rawValue);isNaN(value)||meta.data[index].hidden||(min=Math.min(value,min),max=Math.max(value,max))}))}})),me.min=min===Number.POSITIVE_INFINITY?0:min,me.max=max===Number.NEGATIVE_INFINITY?0:max,me.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/getTickBackdropHeight(this.options))},convertTicksToLabels:function(){var me=this;scale_linearbase.prototype.convertTicksToLabels.call(me),me.pointLabels=me.chart.data.labels.map((function(){var label=helpers$1.callback(me.options.pointLabels.callback,arguments,me);return label||0===label?label:""}))},getLabelForIndex:function(index,datasetIndex){return+this.getRightValue(this.chart.data.datasets[datasetIndex].data[index])},fit:function(){var opts=this.options;opts.display&&opts.pointLabels.display?function(scale){var i,textSize,pointPosition,plFont=helpers$1.options._parseFont(scale.options.pointLabels),furthestLimits={l:0,r:scale.width,t:0,b:scale.height-scale.paddingTop},furthestAngles={};scale.ctx.font=plFont.string,scale._pointLabelSizes=[];var ctx,lineHeight,label,valueCount=scale.chart.data.labels.length;for(i=0;ifurthestLimits.r&&(furthestLimits.r=hLimits.end,furthestAngles.r=angleRadians),vLimits.startfurthestLimits.b&&(furthestLimits.b=vLimits.end,furthestAngles.b=angleRadians)}scale.setReductions(scale.drawingArea,furthestLimits,furthestAngles)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(largestPossibleRadius,furthestLimits,furthestAngles){var me=this,radiusReductionLeft=furthestLimits.l/Math.sin(furthestAngles.l),radiusReductionRight=Math.max(furthestLimits.r-me.width,0)/Math.sin(furthestAngles.r),radiusReductionTop=-furthestLimits.t/Math.cos(furthestAngles.t),radiusReductionBottom=-Math.max(furthestLimits.b-(me.height-me.paddingTop),0)/Math.cos(furthestAngles.b);radiusReductionLeft=numberOrZero(radiusReductionLeft),radiusReductionRight=numberOrZero(radiusReductionRight),radiusReductionTop=numberOrZero(radiusReductionTop),radiusReductionBottom=numberOrZero(radiusReductionBottom),me.drawingArea=Math.min(Math.floor(largestPossibleRadius-(radiusReductionLeft+radiusReductionRight)/2),Math.floor(largestPossibleRadius-(radiusReductionTop+radiusReductionBottom)/2)),me.setCenterPoint(radiusReductionLeft,radiusReductionRight,radiusReductionTop,radiusReductionBottom)},setCenterPoint:function(leftMovement,rightMovement,topMovement,bottomMovement){var me=this,maxRight=me.width-rightMovement-me.drawingArea,maxLeft=leftMovement+me.drawingArea,maxTop=topMovement+me.drawingArea,maxBottom=me.height-me.paddingTop-bottomMovement-me.drawingArea;me.xCenter=Math.floor((maxLeft+maxRight)/2+me.left),me.yCenter=Math.floor((maxTop+maxBottom)/2+me.top+me.paddingTop)},getIndexAngle:function(index){var chart=this.chart,angle=(index*(360/chart.data.labels.length)+((chart.options||{}).startAngle||0))%360;return(angle<0?angle+360:angle)*Math.PI*2/360},getDistanceFromCenterForValue:function(value){var me=this;if(helpers$1.isNullOrUndef(value))return NaN;var scalingFactor=me.drawingArea/(me.max-me.min);return me.options.ticks.reverse?(me.max-value)*scalingFactor:(value-me.min)*scalingFactor},getPointPosition:function(index,distanceFromCenter){var thisAngle=this.getIndexAngle(index)-Math.PI/2;return{x:Math.cos(thisAngle)*distanceFromCenter+this.xCenter,y:Math.sin(thisAngle)*distanceFromCenter+this.yCenter}},getPointPositionForValue:function(index,value){return this.getPointPosition(index,this.getDistanceFromCenterForValue(value))},getBasePosition:function(index){var min=this.min,max=this.max;return this.getPointPositionForValue(index||0,this.beginAtZero?0:min<0&&max<0?max:min>0&&max>0?min:0)},_drawGrid:function(){var i,offset,position,me=this,ctx=me.ctx,opts=me.options,gridLineOpts=opts.gridLines,angleLineOpts=opts.angleLines,lineWidth=valueOrDefault$c(angleLineOpts.lineWidth,gridLineOpts.lineWidth),lineColor=valueOrDefault$c(angleLineOpts.color,gridLineOpts.color);if(opts.pointLabels.display&&function(scale){var ctx=scale.ctx,opts=scale.options,pointLabelOpts=opts.pointLabels,tickBackdropHeight=getTickBackdropHeight(opts),outerDistance=scale.getDistanceFromCenterForValue(opts.ticks.reverse?scale.min:scale.max),plFont=helpers$1.options._parseFont(pointLabelOpts);ctx.save(),ctx.font=plFont.string,ctx.textBaseline="middle";for(var i=scale.chart.data.labels.length-1;i>=0;i--){var extra=0===i?tickBackdropHeight/2:0,pointLabelPosition=scale.getPointPosition(i,outerDistance+extra+5),pointLabelFontColor=valueAtIndexOrDefault$1(pointLabelOpts.fontColor,i,core_defaults.global.defaultFontColor);ctx.fillStyle=pointLabelFontColor;var angleRadians=scale.getIndexAngle(i),angle=helpers$1.toDegrees(angleRadians);ctx.textAlign=getTextAlignForAngle(angle),adjustPointPositionForLabelHeight(angle,scale._pointLabelSizes[i],pointLabelPosition),fillText(ctx,scale.pointLabels[i],pointLabelPosition,plFont.lineHeight)}ctx.restore()}(me),gridLineOpts.display&&helpers$1.each(me.ticks,(function(label,index){0!==index&&(offset=me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]),function(scale,gridLineOpts,radius,index){var pointPosition,ctx=scale.ctx,circular=gridLineOpts.circular,valueCount=scale.chart.data.labels.length,lineColor=valueAtIndexOrDefault$1(gridLineOpts.color,index-1),lineWidth=valueAtIndexOrDefault$1(gridLineOpts.lineWidth,index-1);if((circular||valueCount)&&lineColor&&lineWidth){if(ctx.save(),ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,ctx.setLineDash&&(ctx.setLineDash(gridLineOpts.borderDash||[]),ctx.lineDashOffset=gridLineOpts.borderDashOffset||0),ctx.beginPath(),circular)ctx.arc(scale.xCenter,scale.yCenter,radius,0,2*Math.PI);else{pointPosition=scale.getPointPosition(0,radius),ctx.moveTo(pointPosition.x,pointPosition.y);for(var i=1;i=0;i--)offset=me.getDistanceFromCenterForValue(opts.ticks.reverse?me.min:me.max),position=me.getPointPosition(i,offset),ctx.beginPath(),ctx.moveTo(me.xCenter,me.yCenter),ctx.lineTo(position.x,position.y),ctx.stroke();ctx.restore()}},_drawLabels:function(){var me=this,ctx=me.ctx,tickOpts=me.options.ticks;if(tickOpts.display){var offset,width,startAngle=me.getIndexAngle(0),tickFont=helpers$1.options._parseFont(tickOpts),tickFontColor=valueOrDefault$c(tickOpts.fontColor,core_defaults.global.defaultFontColor);ctx.save(),ctx.font=tickFont.string,ctx.translate(me.xCenter,me.yCenter),ctx.rotate(startAngle),ctx.textAlign="center",ctx.textBaseline="middle",helpers$1.each(me.ticks,(function(label,index){(0!==index||tickOpts.reverse)&&(offset=me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]),tickOpts.showLabelBackdrop&&(width=ctx.measureText(label).width,ctx.fillStyle=tickOpts.backdropColor,ctx.fillRect(-width/2-tickOpts.backdropPaddingX,-offset-tickFont.size/2-tickOpts.backdropPaddingY,width+2*tickOpts.backdropPaddingX,tickFont.size+2*tickOpts.backdropPaddingY)),ctx.fillStyle=tickFontColor,ctx.fillText(label,0,-offset))})),ctx.restore()}},_drawTitle:helpers$1.noop}),_defaults$3=defaultConfig$3;scale_radialLinear._defaults=_defaults$3;var deprecated$1=helpers$1._deprecated,resolve$5=helpers$1.options.resolve,valueOrDefault$d=helpers$1.valueOrDefault,MIN_INTEGER=Number.MIN_SAFE_INTEGER||-9007199254740991,MAX_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,INTERVALS={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},UNITS=Object.keys(INTERVALS);function sorter(a,b){return a-b}function getMin(options){return helpers$1.valueOrDefault(options.time.min,options.ticks.min)}function getMax(options){return helpers$1.valueOrDefault(options.time.max,options.ticks.max)}function interpolate$1(table,skey,sval,tkey){var range=function(table,key,value){for(var mid,i0,i1,lo=0,hi=table.length-1;lo>=0&&lo<=hi;){if(i0=table[(mid=lo+hi>>1)-1]||null,i1=table[mid],!i0)return{lo:null,hi:i1};if(i1[key]value))return{lo:i0,hi:i1};hi=mid-1}}return{lo:i1,hi:null}}(table,skey,sval),prev=range.lo?range.hi?range.lo:table[table.length-2]:table[0],next=range.lo?range.hi?range.hi:table[table.length-1]:table[1],span=next[skey]-prev[skey],ratio=span?(sval-prev[skey])/span:0,offset=(next[tkey]-prev[tkey])*ratio;return prev[tkey]+offset}function toTimestamp(scale,input){var adapter=scale._adapter,options=scale.options.time,parser=options.parser,format=parser||options.format,value=input;return"function"==typeof parser&&(value=parser(value)),helpers$1.isFinite(value)||(value="string"==typeof format?adapter.parse(value,format):adapter.parse(value)),null!==value?+value:(parser||"function"!=typeof format||(value=format(input),helpers$1.isFinite(value)||(value=adapter.parse(value))),value)}function parse(scale,input){if(helpers$1.isNullOrUndef(input))return null;var options=scale.options.time,value=toTimestamp(scale,scale.getRightValue(input));return null===value||options.round&&(value=+scale._adapter.startOf(value,options.round)),value}function determineUnitForAutoTicks(minUnit,min,max,capacity){var i,interval,factor,ilen=UNITS.length;for(i=UNITS.indexOf(minUnit);i=0&&(ticks[index].major=!0);return ticks}(scale,ticks,map,majorUnit):ticks}var scale_time=core_scale.extend({initialize:function(){this.mergeTicksOptions(),core_scale.prototype.initialize.call(this)},update:function(){var me=this,options=me.options,time=options.time||(options.time={}),adapter=me._adapter=new core_adapters._date(options.adapters.date);return deprecated$1("time scale",time.format,"time.format","time.parser"),deprecated$1("time scale",time.min,"time.min","ticks.min"),deprecated$1("time scale",time.max,"time.max","ticks.max"),helpers$1.mergeIf(time.displayFormats,adapter.formats()),core_scale.prototype.update.apply(me,arguments)},getRightValue:function(rawValue){return rawValue&&void 0!==rawValue.t&&(rawValue=rawValue.t),core_scale.prototype.getRightValue.call(this,rawValue)},determineDataLimits:function(){var i,j,ilen,jlen,data,timestamp,labelsAdded,me=this,chart=me.chart,adapter=me._adapter,options=me.options,unit=options.time.unit||"day",min=MAX_INTEGER,max=MIN_INTEGER,timestamps=[],datasets=[],labels=[],dataLabels=me._getLabels();for(i=0,ilen=dataLabels.length;i1?function(items){var i,ilen,item,hash={},out=[];for(i=0,ilen=items.length;i1e5*stepSize)throw min+" and "+max+" are too far apart with stepSize of "+stepSize+" "+minor;for(time=first;time=min&×tamp<=max&&ticks.push(timestamp);return me.min=min,me.max=max,me._unit=timeOpts.unit||(tickOpts.autoSkip?determineUnitForAutoTicks(timeOpts.minUnit,me.min,me.max,capacity):function(scale,numTicks,minUnit,min,max){var i,unit;for(i=UNITS.length-1;i>=UNITS.indexOf(minUnit);i--)if(unit=UNITS[i],INTERVALS[unit].common&&scale._adapter.diff(max,min,unit)>=numTicks-1)return unit;return UNITS[minUnit?UNITS.indexOf(minUnit):0]}(me,ticks.length,timeOpts.minUnit,me.min,me.max)),me._majorUnit=tickOpts.major.enabled&&"year"!==me._unit?function(unit){for(var i=UNITS.indexOf(unit)+1,ilen=UNITS.length;imin&&curr=0&&index0?capacity:1}}),_defaults$4={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};scale_time._defaults=_defaults$4;var scales={category:scale_category,linear:scale_linear,logarithmic:scale_logarithmic,radialLinear:scale_radialLinear,time:scale_time},moment=createCommonjsModule((function(module,exports){module.exports=function(){var hookCallback,some;function hooks(){return hookCallback.apply(null,arguments)}function setHookCallback(callback){hookCallback=callback}function isArray(input){return input instanceof Array||"[object Array]"===Object.prototype.toString.call(input)}function isObject(input){return null!=input&&"[object Object]"===Object.prototype.toString.call(input)}function isObjectEmpty(obj){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(obj).length;var k;for(k in obj)if(obj.hasOwnProperty(k))return!1;return!0}function isUndefined(input){return void 0===input}function isNumber(input){return"number"==typeof input||"[object Number]"===Object.prototype.toString.call(input)}function isDate(input){return input instanceof Date||"[object Date]"===Object.prototype.toString.call(input)}function map(arr,fn){var i,res=[];for(i=0;i>>0,i=0;i0)for(i=0;i0?"future":"past"];return isFunction(format)?format(output):format.replace(/%s/i,output)}var aliases={};function addUnitAlias(unit,shorthand){var lowerCase=unit.toLowerCase();aliases[lowerCase]=aliases[lowerCase+"s"]=aliases[shorthand]=unit}function normalizeUnits(units){return"string"==typeof units?aliases[units]||aliases[units.toLowerCase()]:void 0}function normalizeObjectUnits(inputObject){var normalizedProp,prop,normalizedInput={};for(prop in inputObject)hasOwnProp(inputObject,prop)&&(normalizedProp=normalizeUnits(prop))&&(normalizedInput[normalizedProp]=inputObject[prop]);return normalizedInput}var priorities={};function addUnitPriority(unit,priority){priorities[unit]=priority}function getPrioritizedUnits(unitsObj){var units=[];for(var u in unitsObj)units.push({unit:u,priority:priorities[u]});return units.sort((function(a,b){return a.priority-b.priority})),units}function zeroFill(number,targetLength,forceSign){var absNumber=""+Math.abs(number),zerosToFill=targetLength-absNumber.length;return(number>=0?forceSign?"+":"":"-")+Math.pow(10,Math.max(0,zerosToFill)).toString().substr(1)+absNumber}var formattingTokens=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,localFormattingTokens=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,formatFunctions={},formatTokenFunctions={};function addFormatToken(token,padded,ordinal,callback){var func=callback;"string"==typeof callback&&(func=function(){return this[callback]()}),token&&(formatTokenFunctions[token]=func),padded&&(formatTokenFunctions[padded[0]]=function(){return zeroFill(func.apply(this,arguments),padded[1],padded[2])}),ordinal&&(formatTokenFunctions[ordinal]=function(){return this.localeData().ordinal(func.apply(this,arguments),token)})}function removeFormattingTokens(input){return input.match(/\[[\s\S]/)?input.replace(/^\[|\]$/g,""):input.replace(/\\/g,"")}function makeFormatFunction(format){var i,length,array=format.match(formattingTokens);for(i=0,length=array.length;i=0&&localFormattingTokens.test(format);)format=format.replace(localFormattingTokens,replaceLongDateFormatTokens),localFormattingTokens.lastIndex=0,i-=1;return format}var match1=/\d/,match2=/\d\d/,match3=/\d{3}/,match4=/\d{4}/,match6=/[+-]?\d{6}/,match1to2=/\d\d?/,match3to4=/\d\d\d\d?/,match5to6=/\d\d\d\d\d\d?/,match1to3=/\d{1,3}/,match1to4=/\d{1,4}/,match1to6=/[+-]?\d{1,6}/,matchUnsigned=/\d+/,matchSigned=/[+-]?\d+/,matchOffset=/Z|[+-]\d\d:?\d\d/gi,matchShortOffset=/Z|[+-]\d\d(?::?\d\d)?/gi,matchTimestamp=/[+-]?\d+(\.\d{1,3})?/,matchWord=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,regexes={};function addRegexToken(token,regex,strictRegex){regexes[token]=isFunction(regex)?regex:function(isStrict,localeData){return isStrict&&strictRegex?strictRegex:regex}}function getParseRegexForToken(token,config){return hasOwnProp(regexes,token)?regexes[token](config._strict,config._locale):new RegExp(unescapeFormat(token))}function unescapeFormat(s){return regexEscape(s.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(matched,p1,p2,p3,p4){return p1||p2||p3||p4})))}function regexEscape(s){return s.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var tokens={};function addParseToken(token,callback){var i,func=callback;for("string"==typeof token&&(token=[token]),isNumber(callback)&&(func=function(input,array){array[callback]=toInt(input)}),i=0;i68?1900:2e3)};var indexOf,getSetYear=makeGetSet("FullYear",!0);function getIsLeapYear(){return isLeapYear(this.year())}function makeGetSet(unit,keepTime){return function(value){return null!=value?(set$1(this,unit,value),hooks.updateOffset(this,keepTime),this):get(this,unit)}}function get(mom,unit){return mom.isValid()?mom._d["get"+(mom._isUTC?"UTC":"")+unit]():NaN}function set$1(mom,unit,value){mom.isValid()&&!isNaN(value)&&("FullYear"===unit&&isLeapYear(mom.year())&&1===mom.month()&&29===mom.date()?mom._d["set"+(mom._isUTC?"UTC":"")+unit](value,mom.month(),daysInMonth(value,mom.month())):mom._d["set"+(mom._isUTC?"UTC":"")+unit](value))}function stringGet(units){return isFunction(this[units=normalizeUnits(units)])?this[units]():this}function stringSet(units,value){if("object"===_typeof(units))for(var prioritized=getPrioritizedUnits(units=normalizeObjectUnits(units)),i=0;i=0?(date=new Date(y+400,m,d,h,M,s,ms),isFinite(date.getFullYear())&&date.setFullYear(y)):date=new Date(y,m,d,h,M,s,ms),date}function createUTCDate(y){var date;if(y<100&&y>=0){var args=Array.prototype.slice.call(arguments);args[0]=y+400,date=new Date(Date.UTC.apply(null,args)),isFinite(date.getUTCFullYear())&&date.setUTCFullYear(y)}else date=new Date(Date.UTC.apply(null,arguments));return date}function firstWeekOffset(year,dow,doy){var fwd=7+dow-doy;return-(7+createUTCDate(year,0,fwd).getUTCDay()-dow)%7+fwd-1}function dayOfYearFromWeeks(year,week,weekday,dow,doy){var resYear,resDayOfYear,dayOfYear=1+7*(week-1)+(7+weekday-dow)%7+firstWeekOffset(year,dow,doy);return dayOfYear<=0?resDayOfYear=daysInYear(resYear=year-1)+dayOfYear:dayOfYear>daysInYear(year)?(resYear=year+1,resDayOfYear=dayOfYear-daysInYear(year)):(resYear=year,resDayOfYear=dayOfYear),{year:resYear,dayOfYear:resDayOfYear}}function weekOfYear(mom,dow,doy){var resWeek,resYear,weekOffset=firstWeekOffset(mom.year(),dow,doy),week=Math.floor((mom.dayOfYear()-weekOffset-1)/7)+1;return week<1?resWeek=week+weeksInYear(resYear=mom.year()-1,dow,doy):week>weeksInYear(mom.year(),dow,doy)?(resWeek=week-weeksInYear(mom.year(),dow,doy),resYear=mom.year()+1):(resYear=mom.year(),resWeek=week),{week:resWeek,year:resYear}}function weeksInYear(year,dow,doy){var weekOffset=firstWeekOffset(year,dow,doy),weekOffsetNext=firstWeekOffset(year+1,dow,doy);return(daysInYear(year)-weekOffset+weekOffsetNext)/7}function localeWeek(mom){return weekOfYear(mom,this._week.dow,this._week.doy).week}addFormatToken("w",["ww",2],"wo","week"),addFormatToken("W",["WW",2],"Wo","isoWeek"),addUnitAlias("week","w"),addUnitAlias("isoWeek","W"),addUnitPriority("week",5),addUnitPriority("isoWeek",5),addRegexToken("w",match1to2),addRegexToken("ww",match1to2,match2),addRegexToken("W",match1to2),addRegexToken("WW",match1to2,match2),addWeekParseToken(["w","ww","W","WW"],(function(input,week,config,token){week[token.substr(0,1)]=toInt(input)}));var defaultLocaleWeek={dow:0,doy:6};function localeFirstDayOfWeek(){return this._week.dow}function localeFirstDayOfYear(){return this._week.doy}function getSetWeek(input){var week=this.localeData().week(this);return null==input?week:this.add(7*(input-week),"d")}function getSetISOWeek(input){var week=weekOfYear(this,1,4).week;return null==input?week:this.add(7*(input-week),"d")}function parseWeekday(input,locale){return"string"!=typeof input?input:isNaN(input)?"number"==typeof(input=locale.weekdaysParse(input))?input:null:parseInt(input,10)}function parseIsoWeekday(input,locale){return"string"==typeof input?locale.weekdaysParse(input)%7||7:isNaN(input)?null:input}function shiftWeekdays(ws,n){return ws.slice(n,7).concat(ws.slice(0,n))}addFormatToken("d",0,"do","day"),addFormatToken("dd",0,0,(function(format){return this.localeData().weekdaysMin(this,format)})),addFormatToken("ddd",0,0,(function(format){return this.localeData().weekdaysShort(this,format)})),addFormatToken("dddd",0,0,(function(format){return this.localeData().weekdays(this,format)})),addFormatToken("e",0,0,"weekday"),addFormatToken("E",0,0,"isoWeekday"),addUnitAlias("day","d"),addUnitAlias("weekday","e"),addUnitAlias("isoWeekday","E"),addUnitPriority("day",11),addUnitPriority("weekday",11),addUnitPriority("isoWeekday",11),addRegexToken("d",match1to2),addRegexToken("e",match1to2),addRegexToken("E",match1to2),addRegexToken("dd",(function(isStrict,locale){return locale.weekdaysMinRegex(isStrict)})),addRegexToken("ddd",(function(isStrict,locale){return locale.weekdaysShortRegex(isStrict)})),addRegexToken("dddd",(function(isStrict,locale){return locale.weekdaysRegex(isStrict)})),addWeekParseToken(["dd","ddd","dddd"],(function(input,week,config,token){var weekday=config._locale.weekdaysParse(input,token,config._strict);null!=weekday?week.d=weekday:getParsingFlags(config).invalidWeekday=input})),addWeekParseToken(["d","e","E"],(function(input,week,config,token){week[token]=toInt(input)}));var defaultLocaleWeekdays="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");function localeWeekdays(m,format){var weekdays=isArray(this._weekdays)?this._weekdays:this._weekdays[m&&!0!==m&&this._weekdays.isFormat.test(format)?"format":"standalone"];return!0===m?shiftWeekdays(weekdays,this._week.dow):m?weekdays[m.day()]:weekdays}var defaultLocaleWeekdaysShort="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");function localeWeekdaysShort(m){return!0===m?shiftWeekdays(this._weekdaysShort,this._week.dow):m?this._weekdaysShort[m.day()]:this._weekdaysShort}var defaultLocaleWeekdaysMin="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function localeWeekdaysMin(m){return!0===m?shiftWeekdays(this._weekdaysMin,this._week.dow):m?this._weekdaysMin[m.day()]:this._weekdaysMin}function handleStrictParse$1(weekdayName,format,strict){var i,ii,mom,llc=weekdayName.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)mom=createUTC([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(mom,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(mom,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(mom,"").toLocaleLowerCase();return strict?"dddd"===format?-1!==(ii=indexOf.call(this._weekdaysParse,llc))?ii:null:"ddd"===format?-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))?ii:null:-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))?ii:null:"dddd"===format?-1!==(ii=indexOf.call(this._weekdaysParse,llc))||-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))||-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))?ii:null:"ddd"===format?-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))||-1!==(ii=indexOf.call(this._weekdaysParse,llc))||-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))?ii:null:-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))||-1!==(ii=indexOf.call(this._weekdaysParse,llc))||-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))?ii:null}function localeWeekdaysParse(weekdayName,format,strict){var i,mom,regex;if(this._weekdaysParseExact)return handleStrictParse$1.call(this,weekdayName,format,strict);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(mom=createUTC([2e3,1]).day(i),strict&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(mom,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(mom,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(mom,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[i]||(regex="^"+this.weekdays(mom,"")+"|^"+this.weekdaysShort(mom,"")+"|^"+this.weekdaysMin(mom,""),this._weekdaysParse[i]=new RegExp(regex.replace(".",""),"i")),strict&&"dddd"===format&&this._fullWeekdaysParse[i].test(weekdayName))return i;if(strict&&"ddd"===format&&this._shortWeekdaysParse[i].test(weekdayName))return i;if(strict&&"dd"===format&&this._minWeekdaysParse[i].test(weekdayName))return i;if(!strict&&this._weekdaysParse[i].test(weekdayName))return i}}function getSetDayOfWeek(input){if(!this.isValid())return null!=input?this:NaN;var day=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=input?(input=parseWeekday(input,this.localeData()),this.add(input-day,"d")):day}function getSetLocaleDayOfWeek(input){if(!this.isValid())return null!=input?this:NaN;var weekday=(this.day()+7-this.localeData()._week.dow)%7;return null==input?weekday:this.add(input-weekday,"d")}function getSetISODayOfWeek(input){if(!this.isValid())return null!=input?this:NaN;if(null!=input){var weekday=parseIsoWeekday(input,this.localeData());return this.day(this.day()%7?weekday:weekday-7)}return this.day()||7}var defaultWeekdaysRegex=matchWord;function weekdaysRegex(isStrict){return this._weekdaysParseExact?(hasOwnProp(this,"_weekdaysRegex")||computeWeekdaysParse.call(this),isStrict?this._weekdaysStrictRegex:this._weekdaysRegex):(hasOwnProp(this,"_weekdaysRegex")||(this._weekdaysRegex=defaultWeekdaysRegex),this._weekdaysStrictRegex&&isStrict?this._weekdaysStrictRegex:this._weekdaysRegex)}var defaultWeekdaysShortRegex=matchWord;function weekdaysShortRegex(isStrict){return this._weekdaysParseExact?(hasOwnProp(this,"_weekdaysRegex")||computeWeekdaysParse.call(this),isStrict?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(hasOwnProp(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=defaultWeekdaysShortRegex),this._weekdaysShortStrictRegex&&isStrict?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}var defaultWeekdaysMinRegex=matchWord;function weekdaysMinRegex(isStrict){return this._weekdaysParseExact?(hasOwnProp(this,"_weekdaysRegex")||computeWeekdaysParse.call(this),isStrict?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(hasOwnProp(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=defaultWeekdaysMinRegex),this._weekdaysMinStrictRegex&&isStrict?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function computeWeekdaysParse(){function cmpLenRev(a,b){return b.length-a.length}var i,mom,minp,shortp,longp,minPieces=[],shortPieces=[],longPieces=[],mixedPieces=[];for(i=0;i<7;i++)mom=createUTC([2e3,1]).day(i),minp=this.weekdaysMin(mom,""),shortp=this.weekdaysShort(mom,""),longp=this.weekdays(mom,""),minPieces.push(minp),shortPieces.push(shortp),longPieces.push(longp),mixedPieces.push(minp),mixedPieces.push(shortp),mixedPieces.push(longp);for(minPieces.sort(cmpLenRev),shortPieces.sort(cmpLenRev),longPieces.sort(cmpLenRev),mixedPieces.sort(cmpLenRev),i=0;i<7;i++)shortPieces[i]=regexEscape(shortPieces[i]),longPieces[i]=regexEscape(longPieces[i]),mixedPieces[i]=regexEscape(mixedPieces[i]);this._weekdaysRegex=new RegExp("^("+mixedPieces.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+longPieces.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+shortPieces.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+minPieces.join("|")+")","i")}function hFormat(){return this.hours()%12||12}function kFormat(){return this.hours()||24}function meridiem(token,lowercase){addFormatToken(token,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),lowercase)}))}function matchMeridiem(isStrict,locale){return locale._meridiemParse}function localeIsPM(input){return"p"===(input+"").toLowerCase().charAt(0)}addFormatToken("H",["HH",2],0,"hour"),addFormatToken("h",["hh",2],0,hFormat),addFormatToken("k",["kk",2],0,kFormat),addFormatToken("hmm",0,0,(function(){return""+hFormat.apply(this)+zeroFill(this.minutes(),2)})),addFormatToken("hmmss",0,0,(function(){return""+hFormat.apply(this)+zeroFill(this.minutes(),2)+zeroFill(this.seconds(),2)})),addFormatToken("Hmm",0,0,(function(){return""+this.hours()+zeroFill(this.minutes(),2)})),addFormatToken("Hmmss",0,0,(function(){return""+this.hours()+zeroFill(this.minutes(),2)+zeroFill(this.seconds(),2)})),meridiem("a",!0),meridiem("A",!1),addUnitAlias("hour","h"),addUnitPriority("hour",13),addRegexToken("a",matchMeridiem),addRegexToken("A",matchMeridiem),addRegexToken("H",match1to2),addRegexToken("h",match1to2),addRegexToken("k",match1to2),addRegexToken("HH",match1to2,match2),addRegexToken("hh",match1to2,match2),addRegexToken("kk",match1to2,match2),addRegexToken("hmm",match3to4),addRegexToken("hmmss",match5to6),addRegexToken("Hmm",match3to4),addRegexToken("Hmmss",match5to6),addParseToken(["H","HH"],HOUR),addParseToken(["k","kk"],(function(input,array,config){var kInput=toInt(input);array[HOUR]=24===kInput?0:kInput})),addParseToken(["a","A"],(function(input,array,config){config._isPm=config._locale.isPM(input),config._meridiem=input})),addParseToken(["h","hh"],(function(input,array,config){array[HOUR]=toInt(input),getParsingFlags(config).bigHour=!0})),addParseToken("hmm",(function(input,array,config){var pos=input.length-2;array[HOUR]=toInt(input.substr(0,pos)),array[MINUTE]=toInt(input.substr(pos)),getParsingFlags(config).bigHour=!0})),addParseToken("hmmss",(function(input,array,config){var pos1=input.length-4,pos2=input.length-2;array[HOUR]=toInt(input.substr(0,pos1)),array[MINUTE]=toInt(input.substr(pos1,2)),array[SECOND]=toInt(input.substr(pos2)),getParsingFlags(config).bigHour=!0})),addParseToken("Hmm",(function(input,array,config){var pos=input.length-2;array[HOUR]=toInt(input.substr(0,pos)),array[MINUTE]=toInt(input.substr(pos))})),addParseToken("Hmmss",(function(input,array,config){var pos1=input.length-4,pos2=input.length-2;array[HOUR]=toInt(input.substr(0,pos1)),array[MINUTE]=toInt(input.substr(pos1,2)),array[SECOND]=toInt(input.substr(pos2))}));var defaultLocaleMeridiemParse=/[ap]\.?m?\.?/i;function localeMeridiem(hours,minutes,isLower){return hours>11?isLower?"pm":"PM":isLower?"am":"AM"}var globalLocale,getSetHour=makeGetSet("Hours",!0),baseConfig={calendar:defaultCalendar,longDateFormat:defaultLongDateFormat,invalidDate:defaultInvalidDate,ordinal:defaultOrdinal,dayOfMonthOrdinalParse:defaultDayOfMonthOrdinalParse,relativeTime:defaultRelativeTime,months:defaultLocaleMonths,monthsShort:defaultLocaleMonthsShort,week:defaultLocaleWeek,weekdays:defaultLocaleWeekdays,weekdaysMin:defaultLocaleWeekdaysMin,weekdaysShort:defaultLocaleWeekdaysShort,meridiemParse:defaultLocaleMeridiemParse},locales={},localeFamilies={};function normalizeLocale(key){return key?key.toLowerCase().replace("_","-"):key}function chooseLocale(names){for(var j,next,locale,split,i=0;i0;){if(locale=loadLocale(split.slice(0,j).join("-")))return locale;if(next&&next.length>=j&&compareArrays(split,next,!0)>=j-1)break;j--}i++}return globalLocale}function loadLocale(name){var oldLocale=null;if(!locales[name]&&module&&module.exports)try{oldLocale=globalLocale._abbr,commonjsRequire(),getSetGlobalLocale(oldLocale)}catch(e){}return locales[name]}function getSetGlobalLocale(key,values){var data;return key&&((data=isUndefined(values)?getLocale(key):defineLocale(key,values))?globalLocale=data:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+key+" not found. Did you forget to load it?")),globalLocale._abbr}function defineLocale(name,config){if(null!==config){var locale,parentConfig=baseConfig;if(config.abbr=name,null!=locales[name])deprecateSimple("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),parentConfig=locales[name]._config;else if(null!=config.parentLocale)if(null!=locales[config.parentLocale])parentConfig=locales[config.parentLocale]._config;else{if(null==(locale=loadLocale(config.parentLocale)))return localeFamilies[config.parentLocale]||(localeFamilies[config.parentLocale]=[]),localeFamilies[config.parentLocale].push({name:name,config:config}),null;parentConfig=locale._config}return locales[name]=new Locale(mergeConfigs(parentConfig,config)),localeFamilies[name]&&localeFamilies[name].forEach((function(x){defineLocale(x.name,x.config)})),getSetGlobalLocale(name),locales[name]}return delete locales[name],null}function updateLocale(name,config){if(null!=config){var locale,tmpLocale,parentConfig=baseConfig;null!=(tmpLocale=loadLocale(name))&&(parentConfig=tmpLocale._config),(locale=new Locale(config=mergeConfigs(parentConfig,config))).parentLocale=locales[name],locales[name]=locale,getSetGlobalLocale(name)}else null!=locales[name]&&(null!=locales[name].parentLocale?locales[name]=locales[name].parentLocale:null!=locales[name]&&delete locales[name]);return locales[name]}function getLocale(key){var locale;if(key&&key._locale&&key._locale._abbr&&(key=key._locale._abbr),!key)return globalLocale;if(!isArray(key)){if(locale=loadLocale(key))return locale;key=[key]}return chooseLocale(key)}function listLocales(){return keys(locales)}function checkOverflow(m){var overflow,a=m._a;return a&&-2===getParsingFlags(m).overflow&&(overflow=a[MONTH]<0||a[MONTH]>11?MONTH:a[DATE]<1||a[DATE]>daysInMonth(a[YEAR],a[MONTH])?DATE:a[HOUR]<0||a[HOUR]>24||24===a[HOUR]&&(0!==a[MINUTE]||0!==a[SECOND]||0!==a[MILLISECOND])?HOUR:a[MINUTE]<0||a[MINUTE]>59?MINUTE:a[SECOND]<0||a[SECOND]>59?SECOND:a[MILLISECOND]<0||a[MILLISECOND]>999?MILLISECOND:-1,getParsingFlags(m)._overflowDayOfYear&&(overflowDATE)&&(overflow=DATE),getParsingFlags(m)._overflowWeeks&&-1===overflow&&(overflow=WEEK),getParsingFlags(m)._overflowWeekday&&-1===overflow&&(overflow=WEEKDAY),getParsingFlags(m).overflow=overflow),m}function defaults(a,b,c){return null!=a?a:null!=b?b:c}function currentDateArray(config){var nowValue=new Date(hooks.now());return config._useUTC?[nowValue.getUTCFullYear(),nowValue.getUTCMonth(),nowValue.getUTCDate()]:[nowValue.getFullYear(),nowValue.getMonth(),nowValue.getDate()]}function configFromArray(config){var i,date,currentDate,expectedWeekday,yearToUse,input=[];if(!config._d){for(currentDate=currentDateArray(config),config._w&&null==config._a[DATE]&&null==config._a[MONTH]&&dayOfYearFromWeekInfo(config),null!=config._dayOfYear&&(yearToUse=defaults(config._a[YEAR],currentDate[YEAR]),(config._dayOfYear>daysInYear(yearToUse)||0===config._dayOfYear)&&(getParsingFlags(config)._overflowDayOfYear=!0),date=createUTCDate(yearToUse,0,config._dayOfYear),config._a[MONTH]=date.getUTCMonth(),config._a[DATE]=date.getUTCDate()),i=0;i<3&&null==config._a[i];++i)config._a[i]=input[i]=currentDate[i];for(;i<7;i++)config._a[i]=input[i]=null==config._a[i]?2===i?1:0:config._a[i];24===config._a[HOUR]&&0===config._a[MINUTE]&&0===config._a[SECOND]&&0===config._a[MILLISECOND]&&(config._nextDay=!0,config._a[HOUR]=0),config._d=(config._useUTC?createUTCDate:createDate).apply(null,input),expectedWeekday=config._useUTC?config._d.getUTCDay():config._d.getDay(),null!=config._tzm&&config._d.setUTCMinutes(config._d.getUTCMinutes()-config._tzm),config._nextDay&&(config._a[HOUR]=24),config._w&&void 0!==config._w.d&&config._w.d!==expectedWeekday&&(getParsingFlags(config).weekdayMismatch=!0)}}function dayOfYearFromWeekInfo(config){var w,weekYear,week,weekday,dow,doy,temp,weekdayOverflow;if(null!=(w=config._w).GG||null!=w.W||null!=w.E)dow=1,doy=4,weekYear=defaults(w.GG,config._a[YEAR],weekOfYear(createLocal(),1,4).year),week=defaults(w.W,1),((weekday=defaults(w.E,1))<1||weekday>7)&&(weekdayOverflow=!0);else{dow=config._locale._week.dow,doy=config._locale._week.doy;var curWeek=weekOfYear(createLocal(),dow,doy);weekYear=defaults(w.gg,config._a[YEAR],curWeek.year),week=defaults(w.w,curWeek.week),null!=w.d?((weekday=w.d)<0||weekday>6)&&(weekdayOverflow=!0):null!=w.e?(weekday=w.e+dow,(w.e<0||w.e>6)&&(weekdayOverflow=!0)):weekday=dow}week<1||week>weeksInYear(weekYear,dow,doy)?getParsingFlags(config)._overflowWeeks=!0:null!=weekdayOverflow?getParsingFlags(config)._overflowWeekday=!0:(temp=dayOfYearFromWeeks(weekYear,week,weekday,dow,doy),config._a[YEAR]=temp.year,config._dayOfYear=temp.dayOfYear)}var extendedIsoRegex=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,basicIsoRegex=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,tzRegex=/Z|[+-]\d\d(?::?\d\d)?/,isoDates=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],isoTimes=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],aspNetJsonRegex=/^\/?Date\((\-?\d+)/i;function configFromISO(config){var i,l,allowTime,dateFormat,timeFormat,tzFormat,string=config._i,match=extendedIsoRegex.exec(string)||basicIsoRegex.exec(string);if(match){for(getParsingFlags(config).iso=!0,i=0,l=isoDates.length;i0&&getParsingFlags(config).unusedInput.push(skipped),string=string.slice(string.indexOf(parsedInput)+parsedInput.length),totalParsedInputLength+=parsedInput.length),formatTokenFunctions[token]?(parsedInput?getParsingFlags(config).empty=!1:getParsingFlags(config).unusedTokens.push(token),addTimeToArrayFromToken(token,parsedInput,config)):config._strict&&!parsedInput&&getParsingFlags(config).unusedTokens.push(token);getParsingFlags(config).charsLeftOver=stringLength-totalParsedInputLength,string.length>0&&getParsingFlags(config).unusedInput.push(string),config._a[HOUR]<=12&&!0===getParsingFlags(config).bigHour&&config._a[HOUR]>0&&(getParsingFlags(config).bigHour=void 0),getParsingFlags(config).parsedDateParts=config._a.slice(0),getParsingFlags(config).meridiem=config._meridiem,config._a[HOUR]=meridiemFixWrap(config._locale,config._a[HOUR],config._meridiem),configFromArray(config),checkOverflow(config)}else configFromRFC2822(config);else configFromISO(config)}function meridiemFixWrap(locale,hour,meridiem){var isPm;return null==meridiem?hour:null!=locale.meridiemHour?locale.meridiemHour(hour,meridiem):null!=locale.isPM?((isPm=locale.isPM(meridiem))&&hour<12&&(hour+=12),isPm||12!==hour||(hour=0),hour):hour}function configFromStringAndArray(config){var tempConfig,bestMoment,scoreToBeat,i,currentScore;if(0===config._f.length)return getParsingFlags(config).invalidFormat=!0,void(config._d=new Date(NaN));for(i=0;ithis?this:other:createInvalid()}));function pickBy(fn,moments){var res,i;if(1===moments.length&&isArray(moments[0])&&(moments=moments[0]),!moments.length)return createLocal();for(res=moments[0],i=1;ithis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function isDaylightSavingTimeShifted(){if(!isUndefined(this._isDSTShifted))return this._isDSTShifted;var c={};if(copyConfig(c,this),(c=prepareConfig(c))._a){var other=c._isUTC?createUTC(c._a):createLocal(c._a);this._isDSTShifted=this.isValid()&&compareArrays(c._a,other.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function isLocal(){return!!this.isValid()&&!this._isUTC}function isUtcOffset(){return!!this.isValid()&&this._isUTC}function isUtc(){return!!this.isValid()&&this._isUTC&&0===this._offset}hooks.updateOffset=function(){};var aspNetRegex=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,isoRegex=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function createDuration(input,key){var sign,ret,diffRes,duration=input,match=null;return isDuration(input)?duration={ms:input._milliseconds,d:input._days,M:input._months}:isNumber(input)?(duration={},key?duration[key]=input:duration.milliseconds=input):(match=aspNetRegex.exec(input))?(sign="-"===match[1]?-1:1,duration={y:0,d:toInt(match[DATE])*sign,h:toInt(match[HOUR])*sign,m:toInt(match[MINUTE])*sign,s:toInt(match[SECOND])*sign,ms:toInt(absRound(1e3*match[MILLISECOND]))*sign}):(match=isoRegex.exec(input))?(sign="-"===match[1]?-1:1,duration={y:parseIso(match[2],sign),M:parseIso(match[3],sign),w:parseIso(match[4],sign),d:parseIso(match[5],sign),h:parseIso(match[6],sign),m:parseIso(match[7],sign),s:parseIso(match[8],sign)}):null==duration?duration={}:"object"===_typeof(duration)&&("from"in duration||"to"in duration)&&(diffRes=momentsDifference(createLocal(duration.from),createLocal(duration.to)),(duration={}).ms=diffRes.milliseconds,duration.M=diffRes.months),ret=new Duration(duration),isDuration(input)&&hasOwnProp(input,"_locale")&&(ret._locale=input._locale),ret}function parseIso(inp,sign){var res=inp&&parseFloat(inp.replace(",","."));return(isNaN(res)?0:res)*sign}function positiveMomentsDifference(base,other){var res={};return res.months=other.month()-base.month()+12*(other.year()-base.year()),base.clone().add(res.months,"M").isAfter(other)&&--res.months,res.milliseconds=+other-+base.clone().add(res.months,"M"),res}function momentsDifference(base,other){var res;return base.isValid()&&other.isValid()?(other=cloneWithOffset(other,base),base.isBefore(other)?res=positiveMomentsDifference(base,other):((res=positiveMomentsDifference(other,base)).milliseconds=-res.milliseconds,res.months=-res.months),res):{milliseconds:0,months:0}}function createAdder(direction,name){return function(val,period){var tmp;return null===period||isNaN(+period)||(deprecateSimple(name,"moment()."+name+"(period, number) is deprecated. Please use moment()."+name+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),tmp=val,val=period,period=tmp),addSubtract(this,createDuration(val="string"==typeof val?+val:val,period),direction),this}}function addSubtract(mom,duration,isAdding,updateOffset){var milliseconds=duration._milliseconds,days=absRound(duration._days),months=absRound(duration._months);mom.isValid()&&(updateOffset=null==updateOffset||updateOffset,months&&setMonth(mom,get(mom,"Month")+months*isAdding),days&&set$1(mom,"Date",get(mom,"Date")+days*isAdding),milliseconds&&mom._d.setTime(mom._d.valueOf()+milliseconds*isAdding),updateOffset&&hooks.updateOffset(mom,days||months))}createDuration.fn=Duration.prototype,createDuration.invalid=createInvalid$1;var add=createAdder(1,"add"),subtract=createAdder(-1,"subtract");function getCalendarFormat(myMoment,now){var diff=myMoment.diff(now,"days",!0);return diff<-6?"sameElse":diff<-1?"lastWeek":diff<0?"lastDay":diff<1?"sameDay":diff<2?"nextDay":diff<7?"nextWeek":"sameElse"}function calendar$1(time,formats){var now=time||createLocal(),sod=cloneWithOffset(now,this).startOf("day"),format=hooks.calendarFormat(this,sod)||"sameElse",output=formats&&(isFunction(formats[format])?formats[format].call(this,now):formats[format]);return this.format(output||this.localeData().calendar(format,this,createLocal(now)))}function clone(){return new Moment(this)}function isAfter(input,units){var localInput=isMoment(input)?input:createLocal(input);return!(!this.isValid()||!localInput.isValid())&&("millisecond"===(units=normalizeUnits(units)||"millisecond")?this.valueOf()>localInput.valueOf():localInput.valueOf()9999?formatMoment(m,utc?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):isFunction(Date.prototype.toISOString)?utc?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",formatMoment(m,"Z")):formatMoment(m,utc?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function inspect(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var func="moment",zone="";this.isLocal()||(func=0===this.utcOffset()?"moment.utc":"moment.parseZone",zone="Z");var prefix="["+func+'("]',year=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",datetime="-MM-DD[T]HH:mm:ss.SSS",suffix=zone+'[")]';return this.format(prefix+year+datetime+suffix)}function format(inputString){inputString||(inputString=this.isUtc()?hooks.defaultFormatUtc:hooks.defaultFormat);var output=formatMoment(this,inputString);return this.localeData().postformat(output)}function from(time,withoutSuffix){return this.isValid()&&(isMoment(time)&&time.isValid()||createLocal(time).isValid())?createDuration({to:this,from:time}).locale(this.locale()).humanize(!withoutSuffix):this.localeData().invalidDate()}function fromNow(withoutSuffix){return this.from(createLocal(),withoutSuffix)}function to(time,withoutSuffix){return this.isValid()&&(isMoment(time)&&time.isValid()||createLocal(time).isValid())?createDuration({from:this,to:time}).locale(this.locale()).humanize(!withoutSuffix):this.localeData().invalidDate()}function toNow(withoutSuffix){return this.to(createLocal(),withoutSuffix)}function locale(key){var newLocaleData;return void 0===key?this._locale._abbr:(null!=(newLocaleData=getLocale(key))&&(this._locale=newLocaleData),this)}hooks.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",hooks.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var lang=deprecate("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(key){return void 0===key?this.localeData():this.locale(key)}));function localeData(){return this._locale}var MS_PER_SECOND=1e3,MS_PER_MINUTE=60*MS_PER_SECOND,MS_PER_HOUR=60*MS_PER_MINUTE,MS_PER_400_YEARS=3506328*MS_PER_HOUR;function mod$1(dividend,divisor){return(dividend%divisor+divisor)%divisor}function localStartOfDate(y,m,d){return y<100&&y>=0?new Date(y+400,m,d)-MS_PER_400_YEARS:new Date(y,m,d).valueOf()}function utcStartOfDate(y,m,d){return y<100&&y>=0?Date.UTC(y+400,m,d)-MS_PER_400_YEARS:Date.UTC(y,m,d)}function startOf(units){var time;if(void 0===(units=normalizeUnits(units))||"millisecond"===units||!this.isValid())return this;var startOfDate=this._isUTC?utcStartOfDate:localStartOfDate;switch(units){case"year":time=startOfDate(this.year(),0,1);break;case"quarter":time=startOfDate(this.year(),this.month()-this.month()%3,1);break;case"month":time=startOfDate(this.year(),this.month(),1);break;case"week":time=startOfDate(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":time=startOfDate(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":time=startOfDate(this.year(),this.month(),this.date());break;case"hour":time=this._d.valueOf(),time-=mod$1(time+(this._isUTC?0:this.utcOffset()*MS_PER_MINUTE),MS_PER_HOUR);break;case"minute":time=this._d.valueOf(),time-=mod$1(time,MS_PER_MINUTE);break;case"second":time=this._d.valueOf(),time-=mod$1(time,MS_PER_SECOND)}return this._d.setTime(time),hooks.updateOffset(this,!0),this}function endOf(units){var time;if(void 0===(units=normalizeUnits(units))||"millisecond"===units||!this.isValid())return this;var startOfDate=this._isUTC?utcStartOfDate:localStartOfDate;switch(units){case"year":time=startOfDate(this.year()+1,0,1)-1;break;case"quarter":time=startOfDate(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":time=startOfDate(this.year(),this.month()+1,1)-1;break;case"week":time=startOfDate(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":time=startOfDate(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":time=startOfDate(this.year(),this.month(),this.date()+1)-1;break;case"hour":time=this._d.valueOf(),time+=MS_PER_HOUR-mod$1(time+(this._isUTC?0:this.utcOffset()*MS_PER_MINUTE),MS_PER_HOUR)-1;break;case"minute":time=this._d.valueOf(),time+=MS_PER_MINUTE-mod$1(time,MS_PER_MINUTE)-1;break;case"second":time=this._d.valueOf(),time+=MS_PER_SECOND-mod$1(time,MS_PER_SECOND)-1}return this._d.setTime(time),hooks.updateOffset(this,!0),this}function valueOf(){return this._d.valueOf()-6e4*(this._offset||0)}function unix(){return Math.floor(this.valueOf()/1e3)}function toDate(){return new Date(this.valueOf())}function toArray(){var m=this;return[m.year(),m.month(),m.date(),m.hour(),m.minute(),m.second(),m.millisecond()]}function toObject(){var m=this;return{years:m.year(),months:m.month(),date:m.date(),hours:m.hours(),minutes:m.minutes(),seconds:m.seconds(),milliseconds:m.milliseconds()}}function toJSON(){return this.isValid()?this.toISOString():null}function isValid$2(){return isValid(this)}function parsingFlags(){return extend({},getParsingFlags(this))}function invalidAt(){return getParsingFlags(this).overflow}function creationData(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function addWeekYearFormatToken(token,getter){addFormatToken(0,[token,token.length],0,getter)}function getSetWeekYear(input){return getSetWeekYearHelper.call(this,input,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function getSetISOWeekYear(input){return getSetWeekYearHelper.call(this,input,this.isoWeek(),this.isoWeekday(),1,4)}function getISOWeeksInYear(){return weeksInYear(this.year(),1,4)}function getWeeksInYear(){var weekInfo=this.localeData()._week;return weeksInYear(this.year(),weekInfo.dow,weekInfo.doy)}function getSetWeekYearHelper(input,week,weekday,dow,doy){var weeksTarget;return null==input?weekOfYear(this,dow,doy).year:(week>(weeksTarget=weeksInYear(input,dow,doy))&&(week=weeksTarget),setWeekAll.call(this,input,week,weekday,dow,doy))}function setWeekAll(weekYear,week,weekday,dow,doy){var dayOfYearData=dayOfYearFromWeeks(weekYear,week,weekday,dow,doy),date=createUTCDate(dayOfYearData.year,0,dayOfYearData.dayOfYear);return this.year(date.getUTCFullYear()),this.month(date.getUTCMonth()),this.date(date.getUTCDate()),this}function getSetQuarter(input){return null==input?Math.ceil((this.month()+1)/3):this.month(3*(input-1)+this.month()%3)}addFormatToken(0,["gg",2],0,(function(){return this.weekYear()%100})),addFormatToken(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),addWeekYearFormatToken("gggg","weekYear"),addWeekYearFormatToken("ggggg","weekYear"),addWeekYearFormatToken("GGGG","isoWeekYear"),addWeekYearFormatToken("GGGGG","isoWeekYear"),addUnitAlias("weekYear","gg"),addUnitAlias("isoWeekYear","GG"),addUnitPriority("weekYear",1),addUnitPriority("isoWeekYear",1),addRegexToken("G",matchSigned),addRegexToken("g",matchSigned),addRegexToken("GG",match1to2,match2),addRegexToken("gg",match1to2,match2),addRegexToken("GGGG",match1to4,match4),addRegexToken("gggg",match1to4,match4),addRegexToken("GGGGG",match1to6,match6),addRegexToken("ggggg",match1to6,match6),addWeekParseToken(["gggg","ggggg","GGGG","GGGGG"],(function(input,week,config,token){week[token.substr(0,2)]=toInt(input)})),addWeekParseToken(["gg","GG"],(function(input,week,config,token){week[token]=hooks.parseTwoDigitYear(input)})),addFormatToken("Q",0,"Qo","quarter"),addUnitAlias("quarter","Q"),addUnitPriority("quarter",7),addRegexToken("Q",match1),addParseToken("Q",(function(input,array){array[MONTH]=3*(toInt(input)-1)})),addFormatToken("D",["DD",2],"Do","date"),addUnitAlias("date","D"),addUnitPriority("date",9),addRegexToken("D",match1to2),addRegexToken("DD",match1to2,match2),addRegexToken("Do",(function(isStrict,locale){return isStrict?locale._dayOfMonthOrdinalParse||locale._ordinalParse:locale._dayOfMonthOrdinalParseLenient})),addParseToken(["D","DD"],DATE),addParseToken("Do",(function(input,array){array[DATE]=toInt(input.match(match1to2)[0])}));var getSetDayOfMonth=makeGetSet("Date",!0);function getSetDayOfYear(input){var dayOfYear=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==input?dayOfYear:this.add(input-dayOfYear,"d")}addFormatToken("DDD",["DDDD",3],"DDDo","dayOfYear"),addUnitAlias("dayOfYear","DDD"),addUnitPriority("dayOfYear",4),addRegexToken("DDD",match1to3),addRegexToken("DDDD",match3),addParseToken(["DDD","DDDD"],(function(input,array,config){config._dayOfYear=toInt(input)})),addFormatToken("m",["mm",2],0,"minute"),addUnitAlias("minute","m"),addUnitPriority("minute",14),addRegexToken("m",match1to2),addRegexToken("mm",match1to2,match2),addParseToken(["m","mm"],MINUTE);var getSetMinute=makeGetSet("Minutes",!1);addFormatToken("s",["ss",2],0,"second"),addUnitAlias("second","s"),addUnitPriority("second",15),addRegexToken("s",match1to2),addRegexToken("ss",match1to2,match2),addParseToken(["s","ss"],SECOND);var token,getSetSecond=makeGetSet("Seconds",!1);for(addFormatToken("S",0,0,(function(){return~~(this.millisecond()/100)})),addFormatToken(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),addFormatToken(0,["SSS",3],0,"millisecond"),addFormatToken(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),addFormatToken(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),addFormatToken(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),addFormatToken(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),addFormatToken(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),addFormatToken(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),addUnitAlias("millisecond","ms"),addUnitPriority("millisecond",16),addRegexToken("S",match1to3,match1),addRegexToken("SS",match1to3,match2),addRegexToken("SSS",match1to3,match3),token="SSSS";token.length<=9;token+="S")addRegexToken(token,matchUnsigned);function parseMs(input,array){array[MILLISECOND]=toInt(1e3*("0."+input))}for(token="S";token.length<=9;token+="S")addParseToken(token,parseMs);var getSetMillisecond=makeGetSet("Milliseconds",!1);function getZoneAbbr(){return this._isUTC?"UTC":""}function getZoneName(){return this._isUTC?"Coordinated Universal Time":""}addFormatToken("z",0,0,"zoneAbbr"),addFormatToken("zz",0,0,"zoneName");var proto=Moment.prototype;function createUnix(input){return createLocal(1e3*input)}function createInZone(){return createLocal.apply(null,arguments).parseZone()}function preParsePostFormat(string){return string}proto.add=add,proto.calendar=calendar$1,proto.clone=clone,proto.diff=diff,proto.endOf=endOf,proto.format=format,proto.from=from,proto.fromNow=fromNow,proto.to=to,proto.toNow=toNow,proto.get=stringGet,proto.invalidAt=invalidAt,proto.isAfter=isAfter,proto.isBefore=isBefore,proto.isBetween=isBetween,proto.isSame=isSame,proto.isSameOrAfter=isSameOrAfter,proto.isSameOrBefore=isSameOrBefore,proto.isValid=isValid$2,proto.lang=lang,proto.locale=locale,proto.localeData=localeData,proto.max=prototypeMax,proto.min=prototypeMin,proto.parsingFlags=parsingFlags,proto.set=stringSet,proto.startOf=startOf,proto.subtract=subtract,proto.toArray=toArray,proto.toObject=toObject,proto.toDate=toDate,proto.toISOString=toISOString,proto.inspect=inspect,proto.toJSON=toJSON,proto.toString=toString,proto.unix=unix,proto.valueOf=valueOf,proto.creationData=creationData,proto.year=getSetYear,proto.isLeapYear=getIsLeapYear,proto.weekYear=getSetWeekYear,proto.isoWeekYear=getSetISOWeekYear,proto.quarter=proto.quarters=getSetQuarter,proto.month=getSetMonth,proto.daysInMonth=getDaysInMonth,proto.week=proto.weeks=getSetWeek,proto.isoWeek=proto.isoWeeks=getSetISOWeek,proto.weeksInYear=getWeeksInYear,proto.isoWeeksInYear=getISOWeeksInYear,proto.date=getSetDayOfMonth,proto.day=proto.days=getSetDayOfWeek,proto.weekday=getSetLocaleDayOfWeek,proto.isoWeekday=getSetISODayOfWeek,proto.dayOfYear=getSetDayOfYear,proto.hour=proto.hours=getSetHour,proto.minute=proto.minutes=getSetMinute,proto.second=proto.seconds=getSetSecond,proto.millisecond=proto.milliseconds=getSetMillisecond,proto.utcOffset=getSetOffset,proto.utc=setOffsetToUTC,proto.local=setOffsetToLocal,proto.parseZone=setOffsetToParsedOffset,proto.hasAlignedHourOffset=hasAlignedHourOffset,proto.isDST=isDaylightSavingTime,proto.isLocal=isLocal,proto.isUtcOffset=isUtcOffset,proto.isUtc=isUtc,proto.isUTC=isUtc,proto.zoneAbbr=getZoneAbbr,proto.zoneName=getZoneName,proto.dates=deprecate("dates accessor is deprecated. Use date instead.",getSetDayOfMonth),proto.months=deprecate("months accessor is deprecated. Use month instead",getSetMonth),proto.years=deprecate("years accessor is deprecated. Use year instead",getSetYear),proto.zone=deprecate("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",getSetZone),proto.isDSTShifted=deprecate("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",isDaylightSavingTimeShifted);var proto$1=Locale.prototype;function get$1(format,index,field,setter){var locale=getLocale(),utc=createUTC().set(setter,index);return locale[field](utc,format)}function listMonthsImpl(format,index,field){if(isNumber(format)&&(index=format,format=void 0),format=format||"",null!=index)return get$1(format,index,field,"month");var i,out=[];for(i=0;i<12;i++)out[i]=get$1(format,i,field,"month");return out}function listWeekdaysImpl(localeSorted,format,index,field){"boolean"==typeof localeSorted?(isNumber(format)&&(index=format,format=void 0),format=format||""):(index=format=localeSorted,localeSorted=!1,isNumber(format)&&(index=format,format=void 0),format=format||"");var i,locale=getLocale(),shift=localeSorted?locale._week.dow:0;if(null!=index)return get$1(format,(index+shift)%7,field,"day");var out=[];for(i=0;i<7;i++)out[i]=get$1(format,(i+shift)%7,field,"day");return out}function listMonths(format,index){return listMonthsImpl(format,index,"months")}function listMonthsShort(format,index){return listMonthsImpl(format,index,"monthsShort")}function listWeekdays(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdays")}function listWeekdaysShort(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdaysShort")}function listWeekdaysMin(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdaysMin")}proto$1.calendar=calendar,proto$1.longDateFormat=longDateFormat,proto$1.invalidDate=invalidDate,proto$1.ordinal=ordinal,proto$1.preparse=preParsePostFormat,proto$1.postformat=preParsePostFormat,proto$1.relativeTime=relativeTime,proto$1.pastFuture=pastFuture,proto$1.set=set,proto$1.months=localeMonths,proto$1.monthsShort=localeMonthsShort,proto$1.monthsParse=localeMonthsParse,proto$1.monthsRegex=monthsRegex,proto$1.monthsShortRegex=monthsShortRegex,proto$1.week=localeWeek,proto$1.firstDayOfYear=localeFirstDayOfYear,proto$1.firstDayOfWeek=localeFirstDayOfWeek,proto$1.weekdays=localeWeekdays,proto$1.weekdaysMin=localeWeekdaysMin,proto$1.weekdaysShort=localeWeekdaysShort,proto$1.weekdaysParse=localeWeekdaysParse,proto$1.weekdaysRegex=weekdaysRegex,proto$1.weekdaysShortRegex=weekdaysShortRegex,proto$1.weekdaysMinRegex=weekdaysMinRegex,proto$1.isPM=localeIsPM,proto$1.meridiem=localeMeridiem,getSetGlobalLocale("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(number){var b=number%10;return number+(1===toInt(number%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}}),hooks.lang=deprecate("moment.lang is deprecated. Use moment.locale instead.",getSetGlobalLocale),hooks.langData=deprecate("moment.langData is deprecated. Use moment.localeData instead.",getLocale);var mathAbs=Math.abs;function abs(){var data=this._data;return this._milliseconds=mathAbs(this._milliseconds),this._days=mathAbs(this._days),this._months=mathAbs(this._months),data.milliseconds=mathAbs(data.milliseconds),data.seconds=mathAbs(data.seconds),data.minutes=mathAbs(data.minutes),data.hours=mathAbs(data.hours),data.months=mathAbs(data.months),data.years=mathAbs(data.years),this}function addSubtract$1(duration,input,value,direction){var other=createDuration(input,value);return duration._milliseconds+=direction*other._milliseconds,duration._days+=direction*other._days,duration._months+=direction*other._months,duration._bubble()}function add$1(input,value){return addSubtract$1(this,input,value,1)}function subtract$1(input,value){return addSubtract$1(this,input,value,-1)}function absCeil(number){return number<0?Math.floor(number):Math.ceil(number)}function bubble(){var seconds,minutes,hours,years,monthsFromDays,milliseconds=this._milliseconds,days=this._days,months=this._months,data=this._data;return milliseconds>=0&&days>=0&&months>=0||milliseconds<=0&&days<=0&&months<=0||(milliseconds+=864e5*absCeil(monthsToDays(months)+days),days=0,months=0),data.milliseconds=milliseconds%1e3,seconds=absFloor(milliseconds/1e3),data.seconds=seconds%60,minutes=absFloor(seconds/60),data.minutes=minutes%60,hours=absFloor(minutes/60),data.hours=hours%24,days+=absFloor(hours/24),months+=monthsFromDays=absFloor(daysToMonths(days)),days-=absCeil(monthsToDays(monthsFromDays)),years=absFloor(months/12),months%=12,data.days=days,data.months=months,data.years=years,this}function daysToMonths(days){return 4800*days/146097}function monthsToDays(months){return 146097*months/4800}function as(units){if(!this.isValid())return NaN;var days,months,milliseconds=this._milliseconds;if("month"===(units=normalizeUnits(units))||"quarter"===units||"year"===units)switch(days=this._days+milliseconds/864e5,months=this._months+daysToMonths(days),units){case"month":return months;case"quarter":return months/3;case"year":return months/12}else switch(days=this._days+Math.round(monthsToDays(this._months)),units){case"week":return days/7+milliseconds/6048e5;case"day":return days+milliseconds/864e5;case"hour":return 24*days+milliseconds/36e5;case"minute":return 1440*days+milliseconds/6e4;case"second":return 86400*days+milliseconds/1e3;case"millisecond":return Math.floor(864e5*days)+milliseconds;default:throw new Error("Unknown unit "+units)}}function valueOf$1(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*toInt(this._months/12):NaN}function makeAs(alias){return function(){return this.as(alias)}}var asMilliseconds=makeAs("ms"),asSeconds=makeAs("s"),asMinutes=makeAs("m"),asHours=makeAs("h"),asDays=makeAs("d"),asWeeks=makeAs("w"),asMonths=makeAs("M"),asQuarters=makeAs("Q"),asYears=makeAs("y");function clone$1(){return createDuration(this)}function get$2(units){return units=normalizeUnits(units),this.isValid()?this[units+"s"]():NaN}function makeGetter(name){return function(){return this.isValid()?this._data[name]:NaN}}var milliseconds=makeGetter("milliseconds"),seconds=makeGetter("seconds"),minutes=makeGetter("minutes"),hours=makeGetter("hours"),days=makeGetter("days"),months=makeGetter("months"),years=makeGetter("years");function weeks(){return absFloor(this.days()/7)}var round=Math.round,thresholds={ss:44,s:45,m:45,h:22,d:26,M:11};function substituteTimeAgo(string,number,withoutSuffix,isFuture,locale){return locale.relativeTime(number||1,!!withoutSuffix,string,isFuture)}function relativeTime$1(posNegDuration,withoutSuffix,locale){var duration=createDuration(posNegDuration).abs(),seconds=round(duration.as("s")),minutes=round(duration.as("m")),hours=round(duration.as("h")),days=round(duration.as("d")),months=round(duration.as("M")),years=round(duration.as("y")),a=seconds<=thresholds.ss&&["s",seconds]||seconds0,a[4]=locale,substituteTimeAgo.apply(null,a)}function getSetRelativeTimeRounding(roundingFunction){return void 0===roundingFunction?round:"function"==typeof roundingFunction&&(round=roundingFunction,!0)}function getSetRelativeTimeThreshold(threshold,limit){return void 0!==thresholds[threshold]&&(void 0===limit?thresholds[threshold]:(thresholds[threshold]=limit,"s"===threshold&&(thresholds.ss=limit-1),!0))}function humanize(withSuffix){if(!this.isValid())return this.localeData().invalidDate();var locale=this.localeData(),output=relativeTime$1(this,!withSuffix,locale);return withSuffix&&(output=locale.pastFuture(+this,output)),locale.postformat(output)}var abs$1=Math.abs;function sign(x){return(x>0)-(x<0)||+x}function toISOString$1(){if(!this.isValid())return this.localeData().invalidDate();var minutes,hours,seconds=abs$1(this._milliseconds)/1e3,days=abs$1(this._days),months=abs$1(this._months);minutes=absFloor(seconds/60),hours=absFloor(minutes/60),seconds%=60,minutes%=60;var Y=absFloor(months/12),M=months%=12,D=days,h=hours,m=minutes,s=seconds?seconds.toFixed(3).replace(/\.?0+$/,""):"",total=this.asSeconds();if(!total)return"P0D";var totalSign=total<0?"-":"",ymSign=sign(this._months)!==sign(total)?"-":"",daysSign=sign(this._days)!==sign(total)?"-":"",hmsSign=sign(this._milliseconds)!==sign(total)?"-":"";return totalSign+"P"+(Y?ymSign+Y+"Y":"")+(M?ymSign+M+"M":"")+(D?daysSign+D+"D":"")+(h||m||s?"T":"")+(h?hmsSign+h+"H":"")+(m?hmsSign+m+"M":"")+(s?hmsSign+s+"S":"")}var proto$2=Duration.prototype;return proto$2.isValid=isValid$1,proto$2.abs=abs,proto$2.add=add$1,proto$2.subtract=subtract$1,proto$2.as=as,proto$2.asMilliseconds=asMilliseconds,proto$2.asSeconds=asSeconds,proto$2.asMinutes=asMinutes,proto$2.asHours=asHours,proto$2.asDays=asDays,proto$2.asWeeks=asWeeks,proto$2.asMonths=asMonths,proto$2.asQuarters=asQuarters,proto$2.asYears=asYears,proto$2.valueOf=valueOf$1,proto$2._bubble=bubble,proto$2.clone=clone$1,proto$2.get=get$2,proto$2.milliseconds=milliseconds,proto$2.seconds=seconds,proto$2.minutes=minutes,proto$2.hours=hours,proto$2.days=days,proto$2.weeks=weeks,proto$2.months=months,proto$2.years=years,proto$2.humanize=humanize,proto$2.toISOString=toISOString$1,proto$2.toString=toISOString$1,proto$2.toJSON=toISOString$1,proto$2.locale=locale,proto$2.localeData=localeData,proto$2.toIsoString=deprecate("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",toISOString$1),proto$2.lang=lang,addFormatToken("X",0,0,"unix"),addFormatToken("x",0,0,"valueOf"),addRegexToken("x",matchSigned),addRegexToken("X",matchTimestamp),addParseToken("X",(function(input,array,config){config._d=new Date(1e3*parseFloat(input,10))})),addParseToken("x",(function(input,array,config){config._d=new Date(toInt(input))})),hooks.version="2.24.0",setHookCallback(createLocal),hooks.fn=proto,hooks.min=min,hooks.max=max,hooks.now=now,hooks.utc=createUTC,hooks.unix=createUnix,hooks.months=listMonths,hooks.isDate=isDate,hooks.locale=getSetGlobalLocale,hooks.invalid=createInvalid,hooks.duration=createDuration,hooks.isMoment=isMoment,hooks.weekdays=listWeekdays,hooks.parseZone=createInZone,hooks.localeData=getLocale,hooks.isDuration=isDuration,hooks.monthsShort=listMonthsShort,hooks.weekdaysMin=listWeekdaysMin,hooks.defineLocale=defineLocale,hooks.updateLocale=updateLocale,hooks.locales=listLocales,hooks.weekdaysShort=listWeekdaysShort,hooks.normalizeUnits=normalizeUnits,hooks.relativeTimeRounding=getSetRelativeTimeRounding,hooks.relativeTimeThreshold=getSetRelativeTimeThreshold,hooks.calendarFormat=getCalendarFormat,hooks.prototype=proto,hooks.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},hooks}()})),FORMATS={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};core_adapters._date.override("function"==typeof moment?{_id:"moment",formats:function(){return FORMATS},parse:function(value,format){return"string"==typeof value&&"string"==typeof format?value=moment(value,format):value instanceof moment||(value=moment(value)),value.isValid()?value.valueOf():null},format:function(time,_format){return moment(time).format(_format)},add:function(time,amount,unit){return moment(time).add(amount,unit).valueOf()},diff:function(max,min,unit){return moment(max).diff(moment(min),unit)},startOf:function(time,unit,weekday){return time=moment(time),"isoWeek"===unit?time.isoWeekday(weekday).valueOf():time.startOf(unit).valueOf()},endOf:function(time,unit){return moment(time).endOf(unit).valueOf()},_create:function(time){return moment(time)}}:{}),core_defaults._set("global",{plugins:{filler:{propagate:!0}}});var mappers={dataset:function(source){var index=source.fill,chart=source.chart,meta=chart.getDatasetMeta(index),points=meta&&chart.isDatasetVisible(index)&&meta.dataset._children||[],length=points.length||0;return length?function(point,i){return i=count)&⌖switch(fill){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return fill;default:return!1}}function computeBoundary(source){return(source.el._scale||{}).getPointPositionForValue?function(source){var start,end,center,i,point,scale=source.el._scale,options=scale.options,length=scale.chart.data.labels.length,fill=source.fill,target=[];if(!length)return null;for(start=options.ticks.reverse?scale.max:scale.min,end=options.ticks.reverse?scale.min:scale.max,center=scale.getPointPositionForValue(0,start),i=0;i0;--i)helpers$1.canvas.lineTo(ctx,curve1[i],curve1[i-1],!0);else for(cx=curve1[0].cx,cy=curve1[0].cy,r=Math.sqrt(Math.pow(curve1[0].x-cx,2)+Math.pow(curve1[0].y-cy,2)),i=len1-1;i>0;--i)ctx.arc(cx,cy,r,curve1[i].angle,curve1[i-1].angle,!0)}}function doFill(ctx,points,mapper,view,color,loop){var i,ilen,index,p0,p1,d0,d1,loopOffset,count=points.length,span=view.spanGaps,curve0=[],curve1=[],len0=0,len1=0;for(ctx.beginPath(),i=0,ilen=count;i=0;--i)(meta=metasets[i].$filler)&&meta.visible&&(view=(el=meta.el)._view,points=el._children||[],mapper=meta.mapper,color=view.backgroundColor||core_defaults.global.defaultColor,mapper&&color&&points.length&&(helpers$1.canvas.clipArea(ctx,chart.chartArea),doFill(ctx,points,mapper,view,color,el._loop),helpers$1.canvas.unclipArea(ctx)))}},getRtlHelper$1=helpers$1.rtl.getRtlAdapter,noop$1=helpers$1.noop,valueOrDefault$e=helpers$1.valueOrDefault;function getBoxWidth(labelOpts,fontSize){return labelOpts.usePointStyle&&labelOpts.boxWidth>fontSize?fontSize:labelOpts.boxWidth}core_defaults._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(e,legendItem){var index=legendItem.datasetIndex,ci=this.chart,meta=ci.getDatasetMeta(index);meta.hidden=null===meta.hidden?!ci.data.datasets[index].hidden:null,ci.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(chart){var datasets=chart.data.datasets,options=chart.options.legend||{},usePointStyle=options.labels&&options.labels.usePointStyle;return chart._getSortedDatasetMetas().map((function(meta){var style=meta.controller.getStyle(usePointStyle?0:void 0);return{text:datasets[meta.index].label,fillStyle:style.backgroundColor,hidden:!chart.isDatasetVisible(meta.index),lineCap:style.borderCapStyle,lineDash:style.borderDash,lineDashOffset:style.borderDashOffset,lineJoin:style.borderJoinStyle,lineWidth:style.borderWidth,strokeStyle:style.borderColor,pointStyle:style.pointStyle,rotation:style.rotation,datasetIndex:meta.index}}),this)}}},legendCallback:function(chart){var i,ilen,listItem,list=document.createElement("ul"),datasets=chart.data.datasets;for(list.setAttribute("class",chart.id+"-legend"),i=0,ilen=datasets.length;iminSize.width)&&(totalHeight+=fontSize+labelOpts.padding,lineWidths[lineWidths.length-(i>0?0:1)]=0),hitboxes[i]={left:0,top:0,width:width,height:fontSize},lineWidths[lineWidths.length-1]+=width+labelOpts.padding})),minSize.height+=totalHeight}else{var vPadding=labelOpts.padding,columnWidths=me.columnWidths=[],columnHeights=me.columnHeights=[],totalWidth=labelOpts.padding,currentColWidth=0,currentColHeight=0;helpers$1.each(me.legendItems,(function(legendItem,i){var itemWidth=getBoxWidth(labelOpts,fontSize)+fontSize/2+ctx.measureText(legendItem.text).width;i>0&¤tColHeight+fontSize+2*vPadding>minSize.height&&(totalWidth+=currentColWidth+labelOpts.padding,columnWidths.push(currentColWidth),columnHeights.push(currentColHeight),currentColWidth=0,currentColHeight=0),currentColWidth=Math.max(currentColWidth,itemWidth),currentColHeight+=fontSize+vPadding,hitboxes[i]={left:0,top:0,width:itemWidth,height:fontSize}})),totalWidth+=currentColWidth,columnWidths.push(currentColWidth),columnHeights.push(currentColHeight),minSize.width+=totalWidth}me.width=minSize.width,me.height=minSize.height}else me.width=minSize.width=me.height=minSize.height=0},afterFit:noop$1,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var me=this,opts=me.options,labelOpts=opts.labels,globalDefaults=core_defaults.global,defaultColor=globalDefaults.defaultColor,lineDefault=globalDefaults.elements.line,legendHeight=me.height,columnHeights=me.columnHeights,legendWidth=me.width,lineWidths=me.lineWidths;if(opts.display){var cursor,rtlHelper=getRtlHelper$1(opts.rtl,me.left,me.minSize.width),ctx=me.ctx,fontColor=valueOrDefault$e(labelOpts.fontColor,globalDefaults.defaultFontColor),labelFont=helpers$1.options._parseFont(labelOpts),fontSize=labelFont.size;ctx.textAlign=rtlHelper.textAlign("left"),ctx.textBaseline="middle",ctx.lineWidth=.5,ctx.strokeStyle=fontColor,ctx.fillStyle=fontColor,ctx.font=labelFont.string;var boxWidth=getBoxWidth(labelOpts,fontSize),hitboxes=me.legendHitBoxes,alignmentOffset=function(dimension,blockSize){switch(opts.align){case"start":return labelOpts.padding;case"end":return dimension-blockSize;default:return(dimension-blockSize+labelOpts.padding)/2}},isHorizontal=me.isHorizontal();cursor=isHorizontal?{x:me.left+alignmentOffset(legendWidth,lineWidths[0]),y:me.top+labelOpts.padding,line:0}:{x:me.left+labelOpts.padding,y:me.top+alignmentOffset(legendHeight,columnHeights[0]),line:0},helpers$1.rtl.overrideTextDirection(me.ctx,opts.textDirection);var itemHeight=fontSize+labelOpts.padding;helpers$1.each(me.legendItems,(function(legendItem,i){var textWidth=ctx.measureText(legendItem.text).width,width=boxWidth+fontSize/2+textWidth,x=cursor.x,y=cursor.y;rtlHelper.setWidth(me.minSize.width),isHorizontal?i>0&&x+width+labelOpts.padding>me.left+me.minSize.width&&(y=cursor.y+=itemHeight,cursor.line++,x=cursor.x=me.left+alignmentOffset(legendWidth,lineWidths[cursor.line])):i>0&&y+itemHeight>me.top+me.minSize.height&&(x=cursor.x=x+me.columnWidths[cursor.line]+labelOpts.padding,cursor.line++,y=cursor.y=me.top+alignmentOffset(legendHeight,columnHeights[cursor.line]));var realX=rtlHelper.x(x);!function(x,y,legendItem){if(!(isNaN(boxWidth)||boxWidth<=0)){ctx.save();var lineWidth=valueOrDefault$e(legendItem.lineWidth,lineDefault.borderWidth);if(ctx.fillStyle=valueOrDefault$e(legendItem.fillStyle,defaultColor),ctx.lineCap=valueOrDefault$e(legendItem.lineCap,lineDefault.borderCapStyle),ctx.lineDashOffset=valueOrDefault$e(legendItem.lineDashOffset,lineDefault.borderDashOffset),ctx.lineJoin=valueOrDefault$e(legendItem.lineJoin,lineDefault.borderJoinStyle),ctx.lineWidth=lineWidth,ctx.strokeStyle=valueOrDefault$e(legendItem.strokeStyle,defaultColor),ctx.setLineDash&&ctx.setLineDash(valueOrDefault$e(legendItem.lineDash,lineDefault.borderDash)),labelOpts&&labelOpts.usePointStyle){var radius=boxWidth*Math.SQRT2/2,centerX=rtlHelper.xPlus(x,boxWidth/2),centerY=y+fontSize/2;helpers$1.canvas.drawPoint(ctx,legendItem.pointStyle,radius,centerX,centerY,legendItem.rotation)}else ctx.fillRect(rtlHelper.leftForLtr(x,boxWidth),y,boxWidth,fontSize),0!==lineWidth&&ctx.strokeRect(rtlHelper.leftForLtr(x,boxWidth),y,boxWidth,fontSize);ctx.restore()}}(realX,y,legendItem),hitboxes[i].left=rtlHelper.leftForLtr(realX,hitboxes[i].width),hitboxes[i].top=y,function(x,y,legendItem,textWidth){var halfFontSize=fontSize/2,xLeft=rtlHelper.xPlus(x,boxWidth+halfFontSize),yMiddle=y+halfFontSize;ctx.fillText(legendItem.text,xLeft,yMiddle),legendItem.hidden&&(ctx.beginPath(),ctx.lineWidth=2,ctx.moveTo(xLeft,yMiddle),ctx.lineTo(rtlHelper.xPlus(xLeft,textWidth),yMiddle),ctx.stroke())}(realX,y,legendItem,textWidth),isHorizontal?cursor.x+=width+labelOpts.padding:cursor.y+=itemHeight})),helpers$1.rtl.restoreTextDirection(me.ctx,opts.textDirection)}},_getLegendItemAt:function(x,y){var i,hitBox,lh,me=this;if(x>=me.left&&x<=me.right&&y>=me.top&&y<=me.bottom)for(lh=me.legendHitBoxes,i=0;i=(hitBox=lh[i]).left&&x<=hitBox.left+hitBox.width&&y>=hitBox.top&&y<=hitBox.top+hitBox.height)return me.legendItems[i];return null},handleEvent:function(e){var hoveredItem,me=this,opts=me.options,type="mouseup"===e.type?"click":e.type;if("mousemove"===type){if(!opts.onHover&&!opts.onLeave)return}else{if("click"!==type)return;if(!opts.onClick)return}hoveredItem=me._getLegendItemAt(e.x,e.y),"click"===type?hoveredItem&&opts.onClick&&opts.onClick.call(me,e.native,hoveredItem):(opts.onLeave&&hoveredItem!==me._hoveredItem&&(me._hoveredItem&&opts.onLeave.call(me,e.native,me._hoveredItem),me._hoveredItem=hoveredItem),opts.onHover&&hoveredItem&&opts.onHover.call(me,e.native,hoveredItem))}});function createNewLegendAndAttach(chart,legendOpts){var legend=new Legend({ctx:chart.ctx,options:legendOpts,chart:chart});core_layouts.configure(chart,legend,legendOpts),core_layouts.addBox(chart,legend),chart.legend=legend}var plugin_legend={id:"legend",_element:Legend,beforeInit:function(chart){var legendOpts=chart.options.legend;legendOpts&&createNewLegendAndAttach(chart,legendOpts)},beforeUpdate:function(chart){var legendOpts=chart.options.legend,legend=chart.legend;legendOpts?(helpers$1.mergeIf(legendOpts,core_defaults.global.legend),legend?(core_layouts.configure(chart,legend,legendOpts),legend.options=legendOpts):createNewLegendAndAttach(chart,legendOpts)):legend&&(core_layouts.removeBox(chart,legend),delete chart.legend)},afterEvent:function(chart,e){var legend=chart.legend;legend&&legend.handleEvent(e)}},noop$2=helpers$1.noop;core_defaults._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Title=core_element.extend({initialize:function(config){helpers$1.extend(this,config),this.legendHitBoxes=[]},beforeUpdate:noop$2,update:function(maxWidth,maxHeight,margins){var me=this;return me.beforeUpdate(),me.maxWidth=maxWidth,me.maxHeight=maxHeight,me.margins=margins,me.beforeSetDimensions(),me.setDimensions(),me.afterSetDimensions(),me.beforeBuildLabels(),me.buildLabels(),me.afterBuildLabels(),me.beforeFit(),me.fit(),me.afterFit(),me.afterUpdate(),me.minSize},afterUpdate:noop$2,beforeSetDimensions:noop$2,setDimensions:function(){var me=this;me.isHorizontal()?(me.width=me.maxWidth,me.left=0,me.right=me.width):(me.height=me.maxHeight,me.top=0,me.bottom=me.height),me.paddingLeft=0,me.paddingTop=0,me.paddingRight=0,me.paddingBottom=0,me.minSize={width:0,height:0}},afterSetDimensions:noop$2,beforeBuildLabels:noop$2,buildLabels:noop$2,afterBuildLabels:noop$2,beforeFit:noop$2,fit:function(){var textSize,me=this,opts=me.options,minSize=me.minSize={},isHorizontal=me.isHorizontal();opts.display?(textSize=(helpers$1.isArray(opts.text)?opts.text.length:1)*helpers$1.options._parseFont(opts).lineHeight+2*opts.padding,me.width=minSize.width=isHorizontal?me.maxWidth:textSize,me.height=minSize.height=isHorizontal?textSize:me.maxHeight):me.width=minSize.width=me.height=minSize.height=0},afterFit:noop$2,isHorizontal:function(){var pos=this.options.position;return"top"===pos||"bottom"===pos},draw:function(){var me=this,ctx=me.ctx,opts=me.options;if(opts.display){var maxWidth,titleX,titleY,fontOpts=helpers$1.options._parseFont(opts),lineHeight=fontOpts.lineHeight,offset=lineHeight/2+opts.padding,rotation=0,top=me.top,left=me.left,bottom=me.bottom,right=me.right;ctx.fillStyle=helpers$1.valueOrDefault(opts.fontColor,core_defaults.global.defaultFontColor),ctx.font=fontOpts.string,me.isHorizontal()?(titleX=left+(right-left)/2,titleY=top+offset,maxWidth=right-left):(titleX="left"===opts.position?left+offset:right-offset,titleY=top+(bottom-top)/2,maxWidth=bottom-top,rotation=Math.PI*("left"===opts.position?-.5:.5)),ctx.save(),ctx.translate(titleX,titleY),ctx.rotate(rotation),ctx.textAlign="center",ctx.textBaseline="middle";var text=opts.text;if(helpers$1.isArray(text))for(var y=0,i=0;i=0;i--){var currentItem=arrayToSearch[i];if(filterCallback(currentItem))return currentItem}},helpers$1.isNumber=function(n){return!isNaN(parseFloat(n))&&isFinite(n)},helpers$1.almostEquals=function(x,y,epsilon){return Math.abs(x-y)=x},helpers$1.max=function(array){return array.reduce((function(max,value){return isNaN(value)?max:Math.max(max,value)}),Number.NEGATIVE_INFINITY)},helpers$1.min=function(array){return array.reduce((function(min,value){return isNaN(value)?min:Math.min(min,value)}),Number.POSITIVE_INFINITY)},helpers$1.sign=Math.sign?function(x){return Math.sign(x)}:function(x){return 0===(x=+x)||isNaN(x)?x:x>0?1:-1},helpers$1.toRadians=function(degrees){return degrees*(Math.PI/180)},helpers$1.toDegrees=function(radians){return radians*(180/Math.PI)},helpers$1._decimalPlaces=function(x){if(helpers$1.isFinite(x)){for(var e=1,p=0;Math.round(x*e)/e!==x;)e*=10,p++;return p}},helpers$1.getAngleFromPoint=function(centrePoint,anglePoint){var distanceFromXCenter=anglePoint.x-centrePoint.x,distanceFromYCenter=anglePoint.y-centrePoint.y,radialDistanceFromCenter=Math.sqrt(distanceFromXCenter*distanceFromXCenter+distanceFromYCenter*distanceFromYCenter),angle=Math.atan2(distanceFromYCenter,distanceFromXCenter);return angle<-.5*Math.PI&&(angle+=2*Math.PI),{angle:angle,distance:radialDistanceFromCenter}},helpers$1.distanceBetweenPoints=function(pt1,pt2){return Math.sqrt(Math.pow(pt2.x-pt1.x,2)+Math.pow(pt2.y-pt1.y,2))},helpers$1.aliasPixel=function(pixelWidth){return pixelWidth%2==0?0:.5},helpers$1._alignPixel=function(chart,pixel,width){var devicePixelRatio=chart.currentDevicePixelRatio,halfWidth=width/2;return Math.round((pixel-halfWidth)*devicePixelRatio)/devicePixelRatio+halfWidth},helpers$1.splineCurve=function(firstPoint,middlePoint,afterPoint,t){var previous=firstPoint.skip?middlePoint:firstPoint,current=middlePoint,next=afterPoint.skip?middlePoint:afterPoint,d01=Math.sqrt(Math.pow(current.x-previous.x,2)+Math.pow(current.y-previous.y,2)),d12=Math.sqrt(Math.pow(next.x-current.x,2)+Math.pow(next.y-current.y,2)),s01=d01/(d01+d12),s12=d12/(d01+d12),fa=t*(s01=isNaN(s01)?0:s01),fb=t*(s12=isNaN(s12)?0:s12);return{previous:{x:current.x-fa*(next.x-previous.x),y:current.y-fa*(next.y-previous.y)},next:{x:current.x+fb*(next.x-previous.x),y:current.y+fb*(next.y-previous.y)}}},helpers$1.EPSILON=Number.EPSILON||1e-14,helpers$1.splineCurveMonotone=function(points){var i,pointBefore,pointCurrent,pointAfter,alphaK,betaK,tauK,squaredMagnitude,deltaX,pointsWithTangents=(points||[]).map((function(point){return{model:point._model,deltaK:0,mK:0}})),pointsLen=pointsWithTangents.length;for(i=0;i0?pointsWithTangents[i-1]:null,(pointAfter=i0?pointsWithTangents[i-1]:null,pointAfter=i=collection.length-1?collection[0]:collection[index+1]:index>=collection.length-1?collection[collection.length-1]:collection[index+1]},helpers$1.previousItem=function(collection,index,loop){return loop?index<=0?collection[collection.length-1]:collection[index-1]:index<=0?collection[0]:collection[index-1]},helpers$1.niceNum=function(range,round){var exponent=Math.floor(helpers$1.log10(range)),fraction=range/Math.pow(10,exponent);return(round?fraction<1.5?1:fraction<3?2:fraction<7?5:10:fraction<=1?1:fraction<=2?2:fraction<=5?5:10)*Math.pow(10,exponent)},helpers$1.requestAnimFrame="undefined"==typeof window?function(callback){callback()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){return window.setTimeout(callback,1e3/60)},helpers$1.getRelativePosition=function(evt,chart){var mouseX,mouseY,e=evt.originalEvent||evt,canvas=evt.target||evt.srcElement,boundingRect=canvas.getBoundingClientRect(),touches=e.touches;touches&&touches.length>0?(mouseX=touches[0].clientX,mouseY=touches[0].clientY):(mouseX=e.clientX,mouseY=e.clientY);var paddingLeft=parseFloat(helpers$1.getStyle(canvas,"padding-left")),paddingTop=parseFloat(helpers$1.getStyle(canvas,"padding-top")),paddingRight=parseFloat(helpers$1.getStyle(canvas,"padding-right")),paddingBottom=parseFloat(helpers$1.getStyle(canvas,"padding-bottom")),width=boundingRect.right-boundingRect.left-paddingLeft-paddingRight,height=boundingRect.bottom-boundingRect.top-paddingTop-paddingBottom;return{x:mouseX=Math.round((mouseX-boundingRect.left-paddingLeft)/width*canvas.width/chart.currentDevicePixelRatio),y:mouseY=Math.round((mouseY-boundingRect.top-paddingTop)/height*canvas.height/chart.currentDevicePixelRatio)}},helpers$1.getConstraintWidth=function(domNode){return getConstraintDimension(domNode,"max-width","clientWidth")},helpers$1.getConstraintHeight=function(domNode){return getConstraintDimension(domNode,"max-height","clientHeight")},helpers$1._calculatePadding=function(container,padding,parentDimension){return(padding=helpers$1.getStyle(container,padding)).indexOf("%")>-1?parentDimension*parseInt(padding,10)/100:parseInt(padding,10)},helpers$1._getParentNode=function(domNode){var parent=domNode.parentNode;return parent&&"[object ShadowRoot]"===parent.toString()&&(parent=parent.host),parent},helpers$1.getMaximumWidth=function(domNode){var container=helpers$1._getParentNode(domNode);if(!container)return domNode.clientWidth;var clientWidth=container.clientWidth,w=clientWidth-helpers$1._calculatePadding(container,"padding-left",clientWidth)-helpers$1._calculatePadding(container,"padding-right",clientWidth),cw=helpers$1.getConstraintWidth(domNode);return isNaN(cw)?w:Math.min(w,cw)},helpers$1.getMaximumHeight=function(domNode){var container=helpers$1._getParentNode(domNode);if(!container)return domNode.clientHeight;var clientHeight=container.clientHeight,h=clientHeight-helpers$1._calculatePadding(container,"padding-top",clientHeight)-helpers$1._calculatePadding(container,"padding-bottom",clientHeight),ch=helpers$1.getConstraintHeight(domNode);return isNaN(ch)?h:Math.min(h,ch)},helpers$1.getStyle=function(el,property){return el.currentStyle?el.currentStyle[property]:document.defaultView.getComputedStyle(el,null).getPropertyValue(property)},helpers$1.retinaScale=function(chart,forceRatio){var pixelRatio=chart.currentDevicePixelRatio=forceRatio||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==pixelRatio){var canvas=chart.canvas,height=chart.height,width=chart.width;canvas.height=height*pixelRatio,canvas.width=width*pixelRatio,chart.ctx.scale(pixelRatio,pixelRatio),canvas.style.height||canvas.style.width||(canvas.style.height=height+"px",canvas.style.width=width+"px")}},helpers$1.fontString=function(pixelSize,fontStyle,fontFamily){return fontStyle+" "+pixelSize+"px "+fontFamily},helpers$1.longestText=function(ctx,font,arrayOfThings,cache){var data=(cache=cache||{}).data=cache.data||{},gc=cache.garbageCollect=cache.garbageCollect||[];cache.font!==font&&(data=cache.data={},gc=cache.garbageCollect=[],cache.font=font),ctx.font=font;var i,j,jlen,thing,nestedThing,longest=0,ilen=arrayOfThings.length;for(i=0;iarrayOfThings.length){for(i=0;ilongest&&(longest=textWidth),longest},helpers$1.numberOfLabelLines=function(arrayOfThings){var numberOfLines=1;return helpers$1.each(arrayOfThings,(function(thing){helpers$1.isArray(thing)&&thing.length>numberOfLines&&(numberOfLines=thing.length)})),numberOfLines},helpers$1.color=chartjsColor?function(value){return value instanceof CanvasGradient&&(value=core_defaults.global.defaultColor),chartjsColor(value)}:function(value){return console.error("Color.js not found!"),value},helpers$1.getHoverColor=function(colorValue){return colorValue instanceof CanvasPattern||colorValue instanceof CanvasGradient?colorValue:helpers$1.color(colorValue).saturate(.5).darken(.1).rgbString()}}(),core_controller._adapters=core_adapters,core_controller.Animation=core_animation,core_controller.animationService=core_animations,core_controller.controllers=controllers,core_controller.DatasetController=core_datasetController,core_controller.defaults=core_defaults,core_controller.Element=core_element,core_controller.elements=elements,core_controller.Interaction=core_interaction,core_controller.layouts=core_layouts,core_controller.platform=platform,core_controller.plugins=core_plugins,core_controller.Scale=core_scale,core_controller.scaleService=core_scaleService,core_controller.Ticks=core_ticks,core_controller.Tooltip=core_tooltip,core_controller.helpers.each(scales,(function(scale,type){core_controller.scaleService.registerScaleType(type,scale,scale._defaults)})),plugins)plugins.hasOwnProperty(k)&&core_controller.plugins.register(plugins[k]);core_controller.platform.initialize();var src=core_controller;return"undefined"!=typeof window&&(window.Chart=core_controller),core_controller.Chart=core_controller,core_controller.Legend=plugins.legend._element,core_controller.Title=plugins.title._element,core_controller.pluginService=core_controller.plugins,core_controller.PluginBase=core_controller.Element.extend({}),core_controller.canvasHelpers=core_controller.helpers.canvas,core_controller.layoutService=core_controller.layouts,core_controller.LinearScaleBase=scale_linearbase,core_controller.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],(function(klass){core_controller[klass]=function(ctx,cfg){return new core_controller(ctx,core_controller.helpers.merge(cfg||{},{type:klass.charAt(0).toLowerCase()+klass.slice(1)}))}})),src})); +function _typeof(obj){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof(obj)}!function(global,factory){"object"===("undefined"==typeof exports?"undefined":_typeof(exports))&&"undefined"!=typeof module?module.exports=factory():"function"==typeof define&&define.amd?define("core/chartjs-lazy",factory):(global=global||self).Chart=factory()}(window,(function(){"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function commonjsRequire(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}function createCommonjsModule(fn,module){return fn(module={exports:{}},module.exports),module.exports}var colorName={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},conversions=createCommonjsModule((function(module){var reverseKeywords={};for(var key in colorName)colorName.hasOwnProperty(key)&&(reverseKeywords[colorName[key]]=key);var convert=module.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var model in convert)if(convert.hasOwnProperty(model)){if(!("channels"in convert[model]))throw new Error("missing channels property: "+model);if(!("labels"in convert[model]))throw new Error("missing channel labels property: "+model);if(convert[model].labels.length!==convert[model].channels)throw new Error("channel and label counts mismatch: "+model);var channels=convert[model].channels,labels=convert[model].labels;delete convert[model].channels,delete convert[model].labels,Object.defineProperty(convert[model],"channels",{value:channels}),Object.defineProperty(convert[model],"labels",{value:labels})}convert.rgb.hsl=function(rgb){var h,l,r=rgb[0]/255,g=rgb[1]/255,b=rgb[2]/255,min=Math.min(r,g,b),max=Math.max(r,g,b),delta=max-min;return max===min?h=0:r===max?h=(g-b)/delta:g===max?h=2+(b-r)/delta:b===max&&(h=4+(r-g)/delta),(h=Math.min(60*h,360))<0&&(h+=360),l=(min+max)/2,[h,100*(max===min?0:l<=.5?delta/(max+min):delta/(2-max-min)),100*l]},convert.rgb.hsv=function(rgb){var rdif,gdif,bdif,h,s,r=rgb[0]/255,g=rgb[1]/255,b=rgb[2]/255,v=Math.max(r,g,b),diff=v-Math.min(r,g,b),diffc=function(c){return(v-c)/6/diff+.5};return 0===diff?h=s=0:(s=diff/v,rdif=diffc(r),gdif=diffc(g),bdif=diffc(b),r===v?h=bdif-gdif:g===v?h=1/3+rdif-bdif:b===v&&(h=2/3+gdif-rdif),h<0?h+=1:h>1&&(h-=1)),[360*h,100*s,100*v]},convert.rgb.hwb=function(rgb){var r=rgb[0],g=rgb[1],b=rgb[2];return[convert.rgb.hsl(rgb)[0],100*(1/255*Math.min(r,Math.min(g,b))),100*(b=1-1/255*Math.max(r,Math.max(g,b)))]},convert.rgb.cmyk=function(rgb){var k,r=rgb[0]/255,g=rgb[1]/255,b=rgb[2]/255;return[100*((1-r-(k=Math.min(1-r,1-g,1-b)))/(1-k)||0),100*((1-g-k)/(1-k)||0),100*((1-b-k)/(1-k)||0),100*k]},convert.rgb.keyword=function(rgb){var reversed=reverseKeywords[rgb];if(reversed)return reversed;var currentClosestKeyword,x,y,currentClosestDistance=1/0;for(var keyword in colorName)if(colorName.hasOwnProperty(keyword)){var value=colorName[keyword],distance=(x=rgb,y=value,Math.pow(x[0]-y[0],2)+Math.pow(x[1]-y[1],2)+Math.pow(x[2]-y[2],2));distance.04045?Math.pow((r+.055)/1.055,2.4):r/12.92)+.3576*(g=g>.04045?Math.pow((g+.055)/1.055,2.4):g/12.92)+.1805*(b=b>.04045?Math.pow((b+.055)/1.055,2.4):b/12.92)),100*(.2126*r+.7152*g+.0722*b),100*(.0193*r+.1192*g+.9505*b)]},convert.rgb.lab=function(rgb){var xyz=convert.rgb.xyz(rgb),x=xyz[0],y=xyz[1],z=xyz[2];return y/=100,z/=108.883,x=(x/=95.047)>.008856?Math.pow(x,1/3):7.787*x+16/116,[116*(y=y>.008856?Math.pow(y,1/3):7.787*y+16/116)-16,500*(x-y),200*(y-(z=z>.008856?Math.pow(z,1/3):7.787*z+16/116))]},convert.hsl.rgb=function(hsl){var t1,t2,t3,rgb,val,h=hsl[0]/360,s=hsl[1]/100,l=hsl[2]/100;if(0===s)return[val=255*l,val,val];t1=2*l-(t2=l<.5?l*(1+s):l+s-l*s),rgb=[0,0,0];for(var i=0;i<3;i++)(t3=h+1/3*-(i-1))<0&&t3++,t3>1&&t3--,val=6*t3<1?t1+6*(t2-t1)*t3:2*t3<1?t2:3*t3<2?t1+(t2-t1)*(2/3-t3)*6:t1,rgb[i]=255*val;return rgb},convert.hsl.hsv=function(hsl){var h=hsl[0],s=hsl[1]/100,l=hsl[2]/100,smin=s,lmin=Math.max(l,.01);return s*=(l*=2)<=1?l:2-l,smin*=lmin<=1?lmin:2-lmin,[h,100*(0===l?2*smin/(lmin+smin):2*s/(l+s)),100*((l+s)/2)]},convert.hsv.rgb=function(hsv){var h=hsv[0]/60,s=hsv[1]/100,v=hsv[2]/100,hi=Math.floor(h)%6,f=h-Math.floor(h),p=255*v*(1-s),q=255*v*(1-s*f),t=255*v*(1-s*(1-f));switch(v*=255,hi){case 0:return[v,t,p];case 1:return[q,v,p];case 2:return[p,v,t];case 3:return[p,q,v];case 4:return[t,p,v];case 5:return[v,p,q]}},convert.hsv.hsl=function(hsv){var lmin,sl,l,h=hsv[0],s=hsv[1]/100,v=hsv[2]/100,vmin=Math.max(v,.01);return l=(2-s)*v,sl=s*vmin,[h,100*(sl=(sl/=(lmin=(2-s)*vmin)<=1?lmin:2-lmin)||0),100*(l/=2)]},convert.hwb.rgb=function(hwb){var i,v,f,n,r,g,b,h=hwb[0]/360,wh=hwb[1]/100,bl=hwb[2]/100,ratio=wh+bl;switch(ratio>1&&(wh/=ratio,bl/=ratio),f=6*h-(i=Math.floor(6*h)),0!=(1&i)&&(f=1-f),n=wh+f*((v=1-bl)-wh),i){default:case 6:case 0:r=v,g=n,b=wh;break;case 1:r=n,g=v,b=wh;break;case 2:r=wh,g=v,b=n;break;case 3:r=wh,g=n,b=v;break;case 4:r=n,g=wh,b=v;break;case 5:r=v,g=wh,b=n}return[255*r,255*g,255*b]},convert.cmyk.rgb=function(cmyk){var c=cmyk[0]/100,m=cmyk[1]/100,y=cmyk[2]/100,k=cmyk[3]/100;return[255*(1-Math.min(1,c*(1-k)+k)),255*(1-Math.min(1,m*(1-k)+k)),255*(1-Math.min(1,y*(1-k)+k))]},convert.xyz.rgb=function(xyz){var r,g,b,x=xyz[0]/100,y=xyz[1]/100,z=xyz[2]/100;return g=-.9689*x+1.8758*y+.0415*z,b=.0557*x+-.204*y+1.057*z,r=(r=3.2406*x+-1.5372*y+-.4986*z)>.0031308?1.055*Math.pow(r,1/2.4)-.055:12.92*r,g=g>.0031308?1.055*Math.pow(g,1/2.4)-.055:12.92*g,b=b>.0031308?1.055*Math.pow(b,1/2.4)-.055:12.92*b,[255*(r=Math.min(Math.max(0,r),1)),255*(g=Math.min(Math.max(0,g),1)),255*(b=Math.min(Math.max(0,b),1))]},convert.xyz.lab=function(xyz){var x=xyz[0],y=xyz[1],z=xyz[2];return y/=100,z/=108.883,x=(x/=95.047)>.008856?Math.pow(x,1/3):7.787*x+16/116,[116*(y=y>.008856?Math.pow(y,1/3):7.787*y+16/116)-16,500*(x-y),200*(y-(z=z>.008856?Math.pow(z,1/3):7.787*z+16/116))]},convert.lab.xyz=function(lab){var x,y,z,l=lab[0];x=lab[1]/500+(y=(l+16)/116),z=y-lab[2]/200;var y2=Math.pow(y,3),x2=Math.pow(x,3),z2=Math.pow(z,3);return y=y2>.008856?y2:(y-16/116)/7.787,x=x2>.008856?x2:(x-16/116)/7.787,z=z2>.008856?z2:(z-16/116)/7.787,[x*=95.047,y*=100,z*=108.883]},convert.lab.lch=function(lab){var h,l=lab[0],a=lab[1],b=lab[2];return(h=360*Math.atan2(b,a)/2/Math.PI)<0&&(h+=360),[l,Math.sqrt(a*a+b*b),h]},convert.lch.lab=function(lch){var hr,l=lch[0],c=lch[1];return hr=lch[2]/360*2*Math.PI,[l,c*Math.cos(hr),c*Math.sin(hr)]},convert.rgb.ansi16=function(args){var r=args[0],g=args[1],b=args[2],value=1 in arguments?arguments[1]:convert.rgb.hsv(args)[2];if(0===(value=Math.round(value/50)))return 30;var ansi=30+(Math.round(b/255)<<2|Math.round(g/255)<<1|Math.round(r/255));return 2===value&&(ansi+=60),ansi},convert.hsv.ansi16=function(args){return convert.rgb.ansi16(convert.hsv.rgb(args),args[2])},convert.rgb.ansi256=function(args){var r=args[0],g=args[1],b=args[2];return r===g&&g===b?r<8?16:r>248?231:Math.round((r-8)/247*24)+232:16+36*Math.round(r/255*5)+6*Math.round(g/255*5)+Math.round(b/255*5)},convert.ansi16.rgb=function(args){var color=args%10;if(0===color||7===color)return args>50&&(color+=3.5),[color=color/10.5*255,color,color];var mult=.5*(1+~~(args>50));return[(1&color)*mult*255,(color>>1&1)*mult*255,(color>>2&1)*mult*255]},convert.ansi256.rgb=function(args){if(args>=232){var c=10*(args-232)+8;return[c,c,c]}var rem;return args-=16,[Math.floor(args/36)/5*255,Math.floor((rem=args%36)/6)/5*255,rem%6/5*255]},convert.rgb.hex=function(args){var string=(((255&Math.round(args[0]))<<16)+((255&Math.round(args[1]))<<8)+(255&Math.round(args[2]))).toString(16).toUpperCase();return"000000".substring(string.length)+string},convert.hex.rgb=function(args){var match=args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!match)return[0,0,0];var colorString=match[0];3===match[0].length&&(colorString=colorString.split("").map((function(char){return char+char})).join(""));var integer=parseInt(colorString,16);return[integer>>16&255,integer>>8&255,255&integer]},convert.rgb.hcg=function(rgb){var hue,r=rgb[0]/255,g=rgb[1]/255,b=rgb[2]/255,max=Math.max(Math.max(r,g),b),min=Math.min(Math.min(r,g),b),chroma=max-min;return hue=chroma<=0?0:max===r?(g-b)/chroma%6:max===g?2+(b-r)/chroma:4+(r-g)/chroma+4,hue/=6,[360*(hue%=1),100*chroma,100*(chroma<1?min/(1-chroma):0)]},convert.hsl.hcg=function(hsl){var s=hsl[1]/100,l=hsl[2]/100,c=1,f=0;return(c=l<.5?2*s*l:2*s*(1-l))<1&&(f=(l-.5*c)/(1-c)),[hsl[0],100*c,100*f]},convert.hsv.hcg=function(hsv){var s=hsv[1]/100,v=hsv[2]/100,c=s*v,f=0;return c<1&&(f=(v-c)/(1-c)),[hsv[0],100*c,100*f]},convert.hcg.rgb=function(hcg){var h=hcg[0]/360,c=hcg[1]/100,g=hcg[2]/100;if(0===c)return[255*g,255*g,255*g];var mg,pure=[0,0,0],hi=h%1*6,v=hi%1,w=1-v;switch(Math.floor(hi)){case 0:pure[0]=1,pure[1]=v,pure[2]=0;break;case 1:pure[0]=w,pure[1]=1,pure[2]=0;break;case 2:pure[0]=0,pure[1]=1,pure[2]=v;break;case 3:pure[0]=0,pure[1]=w,pure[2]=1;break;case 4:pure[0]=v,pure[1]=0,pure[2]=1;break;default:pure[0]=1,pure[1]=0,pure[2]=w}return mg=(1-c)*g,[255*(c*pure[0]+mg),255*(c*pure[1]+mg),255*(c*pure[2]+mg)]},convert.hcg.hsv=function(hcg){var c=hcg[1]/100,v=c+hcg[2]/100*(1-c),f=0;return v>0&&(f=c/v),[hcg[0],100*f,100*v]},convert.hcg.hsl=function(hcg){var c=hcg[1]/100,l=hcg[2]/100*(1-c)+.5*c,s=0;return l>0&&l<.5?s=c/(2*l):l>=.5&&l<1&&(s=c/(2*(1-l))),[hcg[0],100*s,100*l]},convert.hcg.hwb=function(hcg){var c=hcg[1]/100,v=c+hcg[2]/100*(1-c);return[hcg[0],100*(v-c),100*(1-v)]},convert.hwb.hcg=function(hwb){var w=hwb[1]/100,v=1-hwb[2]/100,c=v-w,g=0;return c<1&&(g=(v-c)/(1-c)),[hwb[0],100*c,100*g]},convert.apple.rgb=function(apple){return[apple[0]/65535*255,apple[1]/65535*255,apple[2]/65535*255]},convert.rgb.apple=function(rgb){return[rgb[0]/255*65535,rgb[1]/255*65535,rgb[2]/255*65535]},convert.gray.rgb=function(args){return[args[0]/100*255,args[0]/100*255,args[0]/100*255]},convert.gray.hsl=convert.gray.hsv=function(args){return[0,0,args[0]]},convert.gray.hwb=function(gray){return[0,100,gray[0]]},convert.gray.cmyk=function(gray){return[0,0,0,gray[0]]},convert.gray.lab=function(gray){return[gray[0],0,0]},convert.gray.hex=function(gray){var val=255&Math.round(gray[0]/100*255),string=((val<<16)+(val<<8)+val).toString(16).toUpperCase();return"000000".substring(string.length)+string},convert.rgb.gray=function(rgb){return[(rgb[0]+rgb[1]+rgb[2])/3/255*100]}}));conversions.rgb,conversions.hsl,conversions.hsv,conversions.hwb,conversions.cmyk,conversions.xyz,conversions.lab,conversions.lch,conversions.hex,conversions.keyword,conversions.ansi16,conversions.ansi256,conversions.hcg,conversions.apple,conversions.gray;function deriveBFS(fromModel){var graph=function(){for(var graph={},models=Object.keys(conversions),len=models.length,i=0;i1&&(args=Array.prototype.slice.call(arguments));var result=fn(args);if("object"===_typeof(result))for(var len=result.length,i=0;i1&&(args=Array.prototype.slice.call(arguments)),fn(args))};return"conversion"in fn&&(wrappedFn.conversion=fn.conversion),wrappedFn}(fn)}))}));var colorConvert=convert,colorName$1={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},colorString={getRgba:getRgba,getHsla:getHsla,getRgb:function(string){var rgba=getRgba(string);return rgba&&rgba.slice(0,3)},getHsl:function(string){var hsla=getHsla(string);return hsla&&hsla.slice(0,3)},getHwb:getHwb,getAlpha:function(string){var vals=getRgba(string);if(vals)return vals[3];if(vals=getHsla(string))return vals[3];if(vals=getHwb(string))return vals[3]},hexString:function(rgba,a){a=void 0!==a&&3===rgba.length?a:rgba[3];return"#"+hexDouble(rgba[0])+hexDouble(rgba[1])+hexDouble(rgba[2])+(a>=0&&a<1?hexDouble(Math.round(255*a)):"")},rgbString:function(rgba,alpha){if(alpha<1||rgba[3]&&rgba[3]<1)return rgbaString(rgba,alpha);return"rgb("+rgba[0]+", "+rgba[1]+", "+rgba[2]+")"},rgbaString:rgbaString,percentString:function(rgba,alpha){if(alpha<1||rgba[3]&&rgba[3]<1)return percentaString(rgba,alpha);var r=Math.round(rgba[0]/255*100),g=Math.round(rgba[1]/255*100),b=Math.round(rgba[2]/255*100);return"rgb("+r+"%, "+g+"%, "+b+"%)"},percentaString:percentaString,hslString:function(hsla,alpha){if(alpha<1||hsla[3]&&hsla[3]<1)return hslaString(hsla,alpha);return"hsl("+hsla[0]+", "+hsla[1]+"%, "+hsla[2]+"%)"},hslaString:hslaString,hwbString:function(hwb,alpha){void 0===alpha&&(alpha=void 0!==hwb[3]?hwb[3]:1);return"hwb("+hwb[0]+", "+hwb[1]+"%, "+hwb[2]+"%"+(void 0!==alpha&&1!==alpha?", "+alpha:"")+")"},keyword:function(rgb){return reverseNames[rgb.slice(0,3)]}};function getRgba(string){if(string){var rgb=[0,0,0],a=1,match=string.match(/^#([a-fA-F0-9]{3,4})$/i),hexAlpha="";if(match){hexAlpha=(match=match[1])[3];for(var i=0;ilum2?(lum1+.05)/(lum2+.05):(lum2+.05)/(lum1+.05)},level:function(color2){var contrastRatio=this.contrast(color2);return contrastRatio>=7.1?"AAA":contrastRatio>=4.5?"AA":""},dark:function(){var rgb=this.values.rgb;return(299*rgb[0]+587*rgb[1]+114*rgb[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var rgb=[],i=0;i<3;i++)rgb[i]=255-this.values.rgb[i];return this.setValues("rgb",rgb),this},lighten:function(ratio){var hsl=this.values.hsl;return hsl[2]+=hsl[2]*ratio,this.setValues("hsl",hsl),this},darken:function(ratio){var hsl=this.values.hsl;return hsl[2]-=hsl[2]*ratio,this.setValues("hsl",hsl),this},saturate:function(ratio){var hsl=this.values.hsl;return hsl[1]+=hsl[1]*ratio,this.setValues("hsl",hsl),this},desaturate:function(ratio){var hsl=this.values.hsl;return hsl[1]-=hsl[1]*ratio,this.setValues("hsl",hsl),this},whiten:function(ratio){var hwb=this.values.hwb;return hwb[1]+=hwb[1]*ratio,this.setValues("hwb",hwb),this},blacken:function(ratio){var hwb=this.values.hwb;return hwb[2]+=hwb[2]*ratio,this.setValues("hwb",hwb),this},greyscale:function(){var rgb=this.values.rgb,val=.3*rgb[0]+.59*rgb[1]+.11*rgb[2];return this.setValues("rgb",[val,val,val]),this},clearer:function(ratio){var alpha=this.values.alpha;return this.setValues("alpha",alpha-alpha*ratio),this},opaquer:function(ratio){var alpha=this.values.alpha;return this.setValues("alpha",alpha+alpha*ratio),this},rotate:function(degrees){var hsl=this.values.hsl,hue=(hsl[0]+degrees)%360;return hsl[0]=hue<0?360+hue:hue,this.setValues("hsl",hsl),this},mix:function(mixinColor,weight){var color2=mixinColor,p=void 0===weight?.5:weight,w=2*p-1,a=this.alpha()-color2.alpha(),w1=((w*a==-1?w:(w+a)/(1+w*a))+1)/2,w2=1-w1;return this.rgb(w1*this.red()+w2*color2.red(),w1*this.green()+w2*color2.green(),w1*this.blue()+w2*color2.blue()).alpha(this.alpha()*p+color2.alpha()*(1-p))},toJSON:function(){return this.rgb()},clone:function(){var value,type,result=new Color,source=this.values,target=result.values;for(var prop in source)source.hasOwnProperty(prop)&&(value=source[prop],"[object Array]"===(type={}.toString.call(value))?target[prop]=value.slice(0):"[object Number]"===type?target[prop]=value:console.error("unexpected color value:",value));return result}},Color.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},Color.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},Color.prototype.getValues=function(space){for(var values=this.values,vals={},i=0;i=0;i--)fn.call(thisArg,loopable[i],i);else for(i=0;i=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var s=1.70158,p=0,a=1;return 0===t?0:1===t?1:(p||(p=.3),a<1?(a=1,s=p/4):s=p/(2*Math.PI)*Math.asin(1/a),-a*Math.pow(2,10*(t-=1))*Math.sin((t-s)*(2*Math.PI)/p))},easeOutElastic:function(t){var s=1.70158,p=0,a=1;return 0===t?0:1===t?1:(p||(p=.3),a<1?(a=1,s=p/4):s=p/(2*Math.PI)*Math.asin(1/a),a*Math.pow(2,-10*t)*Math.sin((t-s)*(2*Math.PI)/p)+1)},easeInOutElastic:function(t){var s=1.70158,p=0,a=1;return 0===t?0:2==(t/=.5)?1:(p||(p=.45),a<1?(a=1,s=p/4):s=p/(2*Math.PI)*Math.asin(1/a),t<1?a*Math.pow(2,10*(t-=1))*Math.sin((t-s)*(2*Math.PI)/p)*-.5:a*Math.pow(2,-10*(t-=1))*Math.sin((t-s)*(2*Math.PI)/p)*.5+1)},easeInBack:function(t){var s=1.70158;return t*t*((s+1)*t-s)},easeOutBack:function(t){var s=1.70158;return(t-=1)*t*((s+1)*t+s)+1},easeInOutBack:function(t){var s=1.70158;return(t/=.5)<1?t*t*((1+(s*=1.525))*t-s)*.5:.5*((t-=2)*t*((1+(s*=1.525))*t+s)+2)},easeInBounce:function(t){return 1-effects.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*effects.easeInBounce(2*t):.5*effects.easeOutBounce(2*t-1)+.5}},helpers_easing={effects:effects};helpers_core.easingEffects=effects;var PI=Math.PI,RAD_PER_DEG=PI/180,DOUBLE_PI=2*PI,HALF_PI=PI/2,QUARTER_PI=PI/4,TWO_THIRDS_PI=2*PI/3,exports$1={clear:function(chart){chart.ctx.clearRect(0,0,chart.width,chart.height)},roundedRect:function(ctx,x,y,width,height,radius){if(radius){var r=Math.min(radius,height/2,width/2),left=x+r,top=y+r,right=x+width-r,bottom=y+height-r;ctx.moveTo(x,top),leftarea.left-1e-6&&point.xarea.top-1e-6&&point.y0&&this.requestAnimationFrame()},advance:function(){for(var animation,chart,numSteps,nextStep,animations=this.animations,i=0;i=numSteps?(helpers$1.callback(animation.onAnimationComplete,[animation],chart),chart.animating=!1,animations.splice(i,1)):++i}},resolve=helpers$1.options.resolve,arrayEvents=["push","pop","shift","splice","unshift"];function unlistenArrayEvents(array,listener){var stub=array._chartjs;if(stub){var listeners=stub.listeners,index=listeners.indexOf(listener);-1!==index&&listeners.splice(index,1),listeners.length>0||(arrayEvents.forEach((function(key){delete array[key]})),delete array._chartjs)}}var DatasetController=function(chart,datasetIndex){this.initialize(chart,datasetIndex)};helpers$1.extend(DatasetController.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(chart,datasetIndex){var me=this;me.chart=chart,me.index=datasetIndex,me.linkScales(),me.addElements(),me._type=me.getMeta().type},updateIndex:function(datasetIndex){this.index=datasetIndex},linkScales:function(){var meta=this.getMeta(),chart=this.chart,scales=chart.scales,dataset=this.getDataset(),scalesOpts=chart.options.scales;null!==meta.xAxisID&&meta.xAxisID in scales&&!dataset.xAxisID||(meta.xAxisID=dataset.xAxisID||scalesOpts.xAxes[0].id),null!==meta.yAxisID&&meta.yAxisID in scales&&!dataset.yAxisID||(meta.yAxisID=dataset.yAxisID||scalesOpts.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(scaleID){return this.chart.scales[scaleID]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&unlistenArrayEvents(this._data,this)},createMetaDataset:function(){var type=this.datasetElementType;return type&&new type({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(index){var type=this.dataElementType;return type&&new type({_chart:this.chart,_datasetIndex:this.index,_index:index})},addElements:function(){var i,ilen,meta=this.getMeta(),data=this.getDataset().data||[],metaData=meta.data;for(i=0,ilen=data.length;inumMeta&&this.insertElements(numMeta,numData-numMeta)},insertElements:function(start,count){for(var i=0;ipixelMargin?(angleMargin=pixelMargin/arc.innerRadius,ctx.arc(x,y,arc.innerRadius-pixelMargin,endAngle+angleMargin,startAngle-angleMargin,!0)):ctx.arc(x,y,pixelMargin,endAngle+Math.PI/2,startAngle-Math.PI/2),ctx.closePath(),ctx.clip()}function drawBorder(ctx,vm,arc){var inner="inner"===vm.borderAlign;inner?(ctx.lineWidth=2*vm.borderWidth,ctx.lineJoin="round"):(ctx.lineWidth=vm.borderWidth,ctx.lineJoin="bevel"),arc.fullCircles&&function(ctx,vm,arc,inner){var i,endAngle=arc.endAngle;for(inner&&(arc.endAngle=arc.startAngle+TAU,clipArc(ctx,arc),arc.endAngle=endAngle,arc.endAngle===arc.startAngle&&arc.fullCircles&&(arc.endAngle+=TAU,arc.fullCircles--)),ctx.beginPath(),ctx.arc(arc.x,arc.y,arc.innerRadius,arc.startAngle+TAU,arc.startAngle,!0),i=0;iendAngle;)angle-=TAU;for(;angle=startAngle&&angle<=endAngle,withinRadius=distance>=vm.innerRadius&&distance<=vm.outerRadius;return betweenAngles&&withinRadius}return!1},getCenterPoint:function(){var vm=this._view,halfAngle=(vm.startAngle+vm.endAngle)/2,halfRadius=(vm.innerRadius+vm.outerRadius)/2;return{x:vm.x+Math.cos(halfAngle)*halfRadius,y:vm.y+Math.sin(halfAngle)*halfRadius}},getArea:function(){var vm=this._view;return Math.PI*((vm.endAngle-vm.startAngle)/(2*Math.PI))*(Math.pow(vm.outerRadius,2)-Math.pow(vm.innerRadius,2))},tooltipPosition:function(){var vm=this._view,centreAngle=vm.startAngle+(vm.endAngle-vm.startAngle)/2,rangeFromCentre=(vm.outerRadius-vm.innerRadius)/2+vm.innerRadius;return{x:vm.x+Math.cos(centreAngle)*rangeFromCentre,y:vm.y+Math.sin(centreAngle)*rangeFromCentre}},draw:function(){var i,ctx=this._chart.ctx,vm=this._view,pixelMargin="inner"===vm.borderAlign?.33:0,arc={x:vm.x,y:vm.y,innerRadius:vm.innerRadius,outerRadius:Math.max(vm.outerRadius-pixelMargin,0),pixelMargin:pixelMargin,startAngle:vm.startAngle,endAngle:vm.endAngle,fullCircles:Math.floor(vm.circumference/TAU)};if(ctx.save(),ctx.fillStyle=vm.backgroundColor,ctx.strokeStyle=vm.borderColor,arc.fullCircles){for(arc.endAngle=arc.startAngle+TAU,ctx.beginPath(),ctx.arc(arc.x,arc.y,arc.outerRadius,arc.startAngle,arc.endAngle),ctx.arc(arc.x,arc.y,arc.innerRadius,arc.endAngle,arc.startAngle,!0),ctx.closePath(),i=0;ivm.x&&(edge=swap(edge,"left","right")):vm.basemaxH?maxH:t,r:skip.right||r<0?0:r>maxW?maxW:r,b:skip.bottom||b<0?0:b>maxH?maxH:b,l:skip.left||l<0?0:l>maxW?maxW:l}}function _inRange(vm,x,y){var skipX=null===x,skipY=null===y,bounds=!(!vm||skipX&&skipY)&&getBarBounds(vm);return bounds&&(skipX||x>=bounds.left&&x<=bounds.right)&&(skipY||y>=bounds.top&&y<=bounds.bottom)}core_defaults._set("global",{elements:{rectangle:{backgroundColor:defaultColor$2,borderColor:defaultColor$2,borderSkipped:"bottom",borderWidth:0}}});var element_rectangle=core_element.extend({_type:"rectangle",draw:function(){var ctx=this._chart.ctx,vm=this._view,rects=function(vm){var bounds=getBarBounds(vm),width=bounds.right-bounds.left,height=bounds.bottom-bounds.top,border=parseBorderWidth(vm,width/2,height/2);return{outer:{x:bounds.left,y:bounds.top,w:width,h:height},inner:{x:bounds.left+border.l,y:bounds.top+border.t,w:width-border.l-border.r,h:height-border.t-border.b}}}(vm),outer=rects.outer,inner=rects.inner;ctx.fillStyle=vm.backgroundColor,ctx.fillRect(outer.x,outer.y,outer.w,outer.h),outer.w===inner.w&&outer.h===inner.h||(ctx.save(),ctx.beginPath(),ctx.rect(outer.x,outer.y,outer.w,outer.h),ctx.clip(),ctx.fillStyle=vm.borderColor,ctx.rect(inner.x,inner.y,inner.w,inner.h),ctx.fill("evenodd"),ctx.restore())},height:function(){var vm=this._view;return vm.base-vm.y},inRange:function(mouseX,mouseY){return _inRange(this._view,mouseX,mouseY)},inLabelRange:function(mouseX,mouseY){var vm=this._view;return isVertical(vm)?_inRange(vm,mouseX,null):_inRange(vm,null,mouseY)},inXRange:function(mouseX){return _inRange(this._view,mouseX,null)},inYRange:function(mouseY){return _inRange(this._view,null,mouseY)},getCenterPoint:function(){var x,y,vm=this._view;return isVertical(vm)?(x=vm.x,y=(vm.y+vm.base)/2):(x=(vm.x+vm.base)/2,y=vm.y),{x:x,y:y}},getArea:function(){var vm=this._view;return isVertical(vm)?vm.width*Math.abs(vm.y-vm.base):vm.height*Math.abs(vm.x-vm.base)},tooltipPosition:function(){var vm=this._view;return{x:vm.x,y:vm.y}}}),elements={},Arc=element_arc,Line=element_line,Point=element_point,Rectangle=element_rectangle;elements.Arc=Arc,elements.Line=Line,elements.Point=Point,elements.Rectangle=Rectangle;var deprecated=helpers$1._deprecated,valueOrDefault$3=helpers$1.valueOrDefault;function computeFitCategoryTraits(index,ruler,options){var size,ratio,thickness=options.barThickness,count=ruler.stackCount,curr=ruler.pixels[index],min=helpers$1.isNullOrUndef(thickness)?function(scale,pixels){var prev,curr,i,ilen,min=scale._length;for(i=1,ilen=pixels.length;i0?Math.min(min,Math.abs(curr-prev)):min,prev=curr;return min}(ruler.scale,ruler.pixels):-1;return helpers$1.isNullOrUndef(thickness)?(size=min*options.categoryPercentage,ratio=options.barPercentage):(size=thickness*count,ratio=1),{chunk:size/count,ratio:ratio,start:curr-size/2}}core_defaults._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),core_defaults._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var controller_bar=core_datasetController.extend({dataElementType:elements.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var meta,scaleOpts,me=this;core_datasetController.prototype.initialize.apply(me,arguments),(meta=me.getMeta()).stack=me.getDataset().stack,meta.bar=!0,scaleOpts=me._getIndexScale().options,deprecated("bar chart",scaleOpts.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),deprecated("bar chart",scaleOpts.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),deprecated("bar chart",scaleOpts.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),deprecated("bar chart",me._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),deprecated("bar chart",scaleOpts.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(reset){var i,ilen,rects=this.getMeta().data;for(this._ruler=this.getRuler(),i=0,ilen=rects.length;i=0&&value.min>=0?value.min:value.max,length=void 0===value.start?value.end:value.max>=0&&value.min>=0?value.max-value.min:value.min-value.max,ilen=metasets.length;if(stacked||void 0===stacked&&void 0!==stack)for(i=0;i=0&&stackLength.max>=0?stackLength.max:stackLength.min,(value.min<0&&ivalue<0||value.max>=0&&ivalue>0)&&(start+=ivalue));return base=scale.getPixelForValue(start),size=(head=scale.getPixelForValue(start+length))-base,void 0!==minBarLength&&Math.abs(size)=0&&!isHorizontal||length<0&&isHorizontal?base-minBarLength:base+minBarLength),{size:size,base:base,head:head,center:head+size/2}},calculateBarIndexPixels:function(datasetIndex,index,ruler,options){var range="flex"===options.barThickness?function(index,ruler,options){var start,pixels=ruler.pixels,curr=pixels[index],prev=index>0?pixels[index-1]:null,next=index=PI$1?-DOUBLE_PI$1:startAngle<-PI$1?DOUBLE_PI$1:0)+circumference,startX=Math.cos(startAngle),startY=Math.sin(startAngle),endX=Math.cos(endAngle),endY=Math.sin(endAngle),contains0=startAngle<=0&&endAngle>=0||endAngle>=DOUBLE_PI$1,contains90=startAngle<=HALF_PI$1&&endAngle>=HALF_PI$1||endAngle>=DOUBLE_PI$1+HALF_PI$1,contains270=startAngle<=-HALF_PI$1&&endAngle>=-HALF_PI$1||endAngle>=PI$1+HALF_PI$1,minX=startAngle===-PI$1||endAngle>=PI$1?-1:Math.min(startX,startX*cutout,endX,endX*cutout),minY=contains270?-1:Math.min(startY,startY*cutout,endY,endY*cutout),maxX=contains0?1:Math.max(startX,startX*cutout,endX,endX*cutout),maxY=contains90?1:Math.max(startY,startY*cutout,endY,endY*cutout);ratioX=(maxX-minX)/2,ratioY=(maxY-minY)/2,offsetX=-(maxX+minX)/2,offsetY=-(maxY+minY)/2}for(i=0,ilen=arcs.length;i0&&!isNaN(value)?DOUBLE_PI$1*(Math.abs(value)/total):0},getMaxBorderWidth:function(arcs){var i,ilen,meta,arc,controller,options,borderWidth,hoverWidth,max=0,chart=this.chart;if(!arcs)for(i=0,ilen=chart.data.datasets.length;i(max=borderWidth>max?borderWidth:max)?hoverWidth:max);return max},setHoverStyle:function(arc){var model=arc._model,options=arc._options,getHoverColor=helpers$1.getHoverColor;arc.$previousStyle={backgroundColor:model.backgroundColor,borderColor:model.borderColor,borderWidth:model.borderWidth},model.backgroundColor=valueOrDefault$5(options.hoverBackgroundColor,getHoverColor(options.backgroundColor)),model.borderColor=valueOrDefault$5(options.hoverBorderColor,getHoverColor(options.borderColor)),model.borderWidth=valueOrDefault$5(options.hoverBorderWidth,options.borderWidth)},_getRingWeightOffset:function(datasetIndex){for(var ringWeightOffset=0,i=0;i0&&isPointInArea(points[i-1]._model,area)&&(model.controlPointPreviousX=capControlPoint(model.controlPointPreviousX,area.left,area.right),model.controlPointPreviousY=capControlPoint(model.controlPointPreviousY,area.top,area.bottom)),i0&&(items=chart.getDatasetMeta(items[0]._datasetIndex).data),items},"x-axis":function(chart,e){return indexMode(chart,e,{intersect:!1})},point:function(chart,e){return getIntersectItems(chart,getRelativePosition(e,chart))},nearest:function(chart,e,options){var position=getRelativePosition(e,chart);options.axis=options.axis||"xy";var distanceMetric=getDistanceMetricForAxis(options.axis);return getNearestItems(chart,position,options.intersect,distanceMetric)},x:function(chart,e,options){var position=getRelativePosition(e,chart),items=[],intersectsItem=!1;return parseVisibleItems(chart,(function(element){element.inXRange(position.x)&&items.push(element),element.inRange(position.x,position.y)&&(intersectsItem=!0)})),options.intersect&&!intersectsItem&&(items=[]),items},y:function(chart,e,options){var position=getRelativePosition(e,chart),items=[],intersectsItem=!1;return parseVisibleItems(chart,(function(element){element.inYRange(position.y)&&items.push(element),element.inRange(position.x,position.y)&&(intersectsItem=!0)})),options.intersect&&!intersectsItem&&(items=[]),items}}},extend=helpers$1.extend;function filterByPosition(array,position){return helpers$1.where(array,(function(v){return v.pos===position}))}function sortByWeight(array,reverse){return array.sort((function(a,b){var v0=reverse?b:a,v1=reverse?a:b;return v0.weight===v1.weight?v0.index-v1.index:v0.weight-v1.weight}))}function getCombinedMax(maxPadding,chartArea,a,b){return Math.max(maxPadding[a],chartArea[a])+Math.max(maxPadding[b],chartArea[b])}function updateDims(chartArea,params,layout){var newWidth,newHeight,box=layout.box,maxPadding=chartArea.maxPadding;if(layout.size&&(chartArea[layout.pos]-=layout.size),layout.size=layout.horizontal?box.height:box.width,chartArea[layout.pos]+=layout.size,box.getPadding){var boxPadding=box.getPadding();maxPadding.top=Math.max(maxPadding.top,boxPadding.top),maxPadding.left=Math.max(maxPadding.left,boxPadding.left),maxPadding.bottom=Math.max(maxPadding.bottom,boxPadding.bottom),maxPadding.right=Math.max(maxPadding.right,boxPadding.right)}if(newWidth=params.outerWidth-getCombinedMax(maxPadding,chartArea,"left","right"),newHeight=params.outerHeight-getCombinedMax(maxPadding,chartArea,"top","bottom"),newWidth!==chartArea.w||newHeight!==chartArea.h){chartArea.w=newWidth,chartArea.h=newHeight;var sizes=layout.horizontal?[newWidth,chartArea.w]:[newHeight,chartArea.h];return!(sizes[0]===sizes[1]||isNaN(sizes[0])&&isNaN(sizes[1]))}}function getMargins(horizontal,chartArea){var maxPadding=chartArea.maxPadding;function marginForPositions(positions){var margin={left:0,top:0,right:0,bottom:0};return positions.forEach((function(pos){margin[pos]=Math.max(chartArea[pos],maxPadding[pos])})),margin}return marginForPositions(horizontal?["left","right"]:["top","bottom"])}function fitBoxes(boxes,chartArea,params){var i,ilen,layout,box,refit,changed,refitBoxes=[];for(i=0,ilen=boxes.length;i div {\r\n\tposition: absolute;\r\n\twidth: 1000000px;\r\n\theight: 1000000px;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n\r\n.chartjs-size-monitor-shrink > div {\r\n\tposition: absolute;\r\n\twidth: 200%;\r\n\theight: 200%;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n"}),stylesheet=(n=platform_dom$1)&&n.default||n,EXPANDO_KEY="$chartjs",CSS_SIZE_MONITOR="chartjs-size-monitor",CSS_RENDER_MONITOR="chartjs-render-monitor",CSS_RENDER_ANIMATION="chartjs-render-animation",ANIMATION_START_EVENTS=["animationstart","webkitAnimationStart"],EVENT_TYPES={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function readUsedSize(element,property){var value=helpers$1.getStyle(element,property),matches=value&&value.match(/^(\d+)(\.\d+)?px$/);return matches?Number(matches[1]):void 0}var supportsEventListenerOptions=function(){var supports=!1;try{var options=Object.defineProperty({},"passive",{get:function(){supports=!0}});window.addEventListener("e",null,options)}catch(e){}return supports}(),eventListenerOptions=!!supportsEventListenerOptions&&{passive:!0};function addListener(node,type,listener){node.addEventListener(type,listener,eventListenerOptions)}function removeListener(node,type,listener){node.removeEventListener(type,listener,eventListenerOptions)}function createEvent(type,chart,x,y,nativeEvent){return{type:type,chart:chart,native:nativeEvent||null,x:void 0!==x?x:null,y:void 0!==y?y:null}}function createDiv(cls){var el=document.createElement("div");return el.className=cls||"",el}function addResizeListener(node,listener,chart){var fn,thisArg,ticking,args,expando=node[EXPANDO_KEY]||(node[EXPANDO_KEY]={}),resizer=expando.resizer=function(handler){var resizer=createDiv(CSS_SIZE_MONITOR),expand=createDiv(CSS_SIZE_MONITOR+"-expand"),shrink=createDiv(CSS_SIZE_MONITOR+"-shrink");expand.appendChild(createDiv()),shrink.appendChild(createDiv()),resizer.appendChild(expand),resizer.appendChild(shrink),resizer._reset=function(){expand.scrollLeft=1e6,expand.scrollTop=1e6,shrink.scrollLeft=1e6,shrink.scrollTop=1e6};var onScroll=function(){resizer._reset(),handler()};return addListener(expand,"scroll",onScroll.bind(expand,"expand")),addListener(shrink,"scroll",onScroll.bind(shrink,"shrink")),resizer}((fn=function(){if(expando.resizer){var container=chart.options.maintainAspectRatio&&node.parentNode,w=container?container.clientWidth:0;listener(createEvent("resize",chart)),container&&container.clientWidth0){var item=tooltipItems[0];item.label?title=item.label:item.xLabel?title=item.xLabel:labelCount>0&&item.index-1?str.split("\n"):str}function getBaseModel(tooltipOpts){var globalDefaults=core_defaults.global;return{xPadding:tooltipOpts.xPadding,yPadding:tooltipOpts.yPadding,xAlign:tooltipOpts.xAlign,yAlign:tooltipOpts.yAlign,rtl:tooltipOpts.rtl,textDirection:tooltipOpts.textDirection,bodyFontColor:tooltipOpts.bodyFontColor,_bodyFontFamily:valueOrDefault$8(tooltipOpts.bodyFontFamily,globalDefaults.defaultFontFamily),_bodyFontStyle:valueOrDefault$8(tooltipOpts.bodyFontStyle,globalDefaults.defaultFontStyle),_bodyAlign:tooltipOpts.bodyAlign,bodyFontSize:valueOrDefault$8(tooltipOpts.bodyFontSize,globalDefaults.defaultFontSize),bodySpacing:tooltipOpts.bodySpacing,titleFontColor:tooltipOpts.titleFontColor,_titleFontFamily:valueOrDefault$8(tooltipOpts.titleFontFamily,globalDefaults.defaultFontFamily),_titleFontStyle:valueOrDefault$8(tooltipOpts.titleFontStyle,globalDefaults.defaultFontStyle),titleFontSize:valueOrDefault$8(tooltipOpts.titleFontSize,globalDefaults.defaultFontSize),_titleAlign:tooltipOpts.titleAlign,titleSpacing:tooltipOpts.titleSpacing,titleMarginBottom:tooltipOpts.titleMarginBottom,footerFontColor:tooltipOpts.footerFontColor,_footerFontFamily:valueOrDefault$8(tooltipOpts.footerFontFamily,globalDefaults.defaultFontFamily),_footerFontStyle:valueOrDefault$8(tooltipOpts.footerFontStyle,globalDefaults.defaultFontStyle),footerFontSize:valueOrDefault$8(tooltipOpts.footerFontSize,globalDefaults.defaultFontSize),_footerAlign:tooltipOpts.footerAlign,footerSpacing:tooltipOpts.footerSpacing,footerMarginTop:tooltipOpts.footerMarginTop,caretSize:tooltipOpts.caretSize,cornerRadius:tooltipOpts.cornerRadius,backgroundColor:tooltipOpts.backgroundColor,opacity:0,legendColorBackground:tooltipOpts.multiKeyBackground,displayColors:tooltipOpts.displayColors,borderColor:tooltipOpts.borderColor,borderWidth:tooltipOpts.borderWidth}}function getAlignedX(vm,align){return"center"===align?vm.x+vm.width/2:"right"===align?vm.x+vm.width-vm.xPadding:vm.x+vm.xPadding}function getBeforeAfterBodyLines(callback){return pushOrConcat([],splitNewlines(callback))}var exports$4=core_element.extend({initialize:function(){this._model=getBaseModel(this._options),this._lastActive=[]},getTitle:function(){var callbacks=this._options.callbacks,beforeTitle=callbacks.beforeTitle.apply(this,arguments),title=callbacks.title.apply(this,arguments),afterTitle=callbacks.afterTitle.apply(this,arguments),lines=[];return lines=pushOrConcat(lines,splitNewlines(beforeTitle)),lines=pushOrConcat(lines,splitNewlines(title)),lines=pushOrConcat(lines,splitNewlines(afterTitle))},getBeforeBody:function(){return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(tooltipItems,data){var me=this,callbacks=me._options.callbacks,bodyItems=[];return helpers$1.each(tooltipItems,(function(tooltipItem){var bodyItem={before:[],lines:[],after:[]};pushOrConcat(bodyItem.before,splitNewlines(callbacks.beforeLabel.call(me,tooltipItem,data))),pushOrConcat(bodyItem.lines,callbacks.label.call(me,tooltipItem,data)),pushOrConcat(bodyItem.after,splitNewlines(callbacks.afterLabel.call(me,tooltipItem,data))),bodyItems.push(bodyItem)})),bodyItems},getAfterBody:function(){return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var callbacks=this._options.callbacks,beforeFooter=callbacks.beforeFooter.apply(this,arguments),footer=callbacks.footer.apply(this,arguments),afterFooter=callbacks.afterFooter.apply(this,arguments),lines=[];return lines=pushOrConcat(lines,splitNewlines(beforeFooter)),lines=pushOrConcat(lines,splitNewlines(footer)),lines=pushOrConcat(lines,splitNewlines(afterFooter))},update:function(changed){var i,len,element,xScale,yScale,index,datasetIndex,controller,indexScale,valueScale,me=this,opts=me._options,existingModel=me._model,model=me._model=getBaseModel(opts),active=me._active,data=me._data,alignment={xAlign:existingModel.xAlign,yAlign:existingModel.yAlign},backgroundPoint={x:existingModel.x,y:existingModel.y},tooltipSize={width:existingModel.width,height:existingModel.height},tooltipPosition={x:existingModel.caretX,y:existingModel.caretY};if(active.length){model.opacity=1;var labelColors=[],labelTextColors=[];tooltipPosition=positioners[opts.position].call(me,active,me._eventPosition);var tooltipItems=[];for(i=0,len=active.length;ichart.height-size.height&&(yAlign="bottom");var midX=(chartArea.left+chartArea.right)/2,midY=(chartArea.top+chartArea.bottom)/2;"center"===yAlign?(lf=function(x){return x<=midX},rf=function(x){return x>midX}):(lf=function(x){return x<=size.width/2},rf=function(x){return x>=chart.width-size.width/2}),olf=function(x){return x+size.width+model.caretSize+model.caretPadding>chart.width},orf=function(x){return x-size.width-model.caretSize-model.caretPadding<0},yf=function(y){return y<=midY?"top":"bottom"},lf(model.x)?(xAlign="left",olf(model.x)&&(xAlign="center",yAlign=yf(model.y))):rf(model.x)&&(xAlign="right",orf(model.x)&&(xAlign="center",yAlign=yf(model.y)));var opts=tooltip._options;return{xAlign:opts.xAlign?opts.xAlign:xAlign,yAlign:opts.yAlign?opts.yAlign:yAlign}}(this,tooltipSize),backgroundPoint=function(vm,size,alignment,chart){var x=vm.x,y=vm.y,caretSize=vm.caretSize,caretPadding=vm.caretPadding,cornerRadius=vm.cornerRadius,xAlign=alignment.xAlign,yAlign=alignment.yAlign,paddingAndSize=caretSize+caretPadding,radiusAndPadding=cornerRadius+caretPadding;return"right"===xAlign?x-=size.width:"center"===xAlign&&((x-=size.width/2)+size.width>chart.width&&(x=chart.width-size.width),x<0&&(x=0)),"top"===yAlign?y+=paddingAndSize:y-="bottom"===yAlign?size.height+paddingAndSize:size.height/2,"center"===yAlign?"left"===xAlign?x+=paddingAndSize:"right"===xAlign&&(x-=paddingAndSize):"left"===xAlign?x-=radiusAndPadding:"right"===xAlign&&(x+=radiusAndPadding),{x:x,y:y}}(model,tooltipSize,alignment,me._chart)}else model.opacity=0;return model.xAlign=alignment.xAlign,model.yAlign=alignment.yAlign,model.x=backgroundPoint.x,model.y=backgroundPoint.y,model.width=tooltipSize.width,model.height=tooltipSize.height,model.caretX=tooltipPosition.x,model.caretY=tooltipPosition.y,me._model=model,changed&&opts.custom&&opts.custom.call(me,model),me},drawCaret:function(tooltipPoint,size){var ctx=this._chart.ctx,vm=this._view,caretPosition=this.getCaretPosition(tooltipPoint,size,vm);ctx.lineTo(caretPosition.x1,caretPosition.y1),ctx.lineTo(caretPosition.x2,caretPosition.y2),ctx.lineTo(caretPosition.x3,caretPosition.y3)},getCaretPosition:function(tooltipPoint,size,vm){var x1,x2,x3,y1,y2,y3,caretSize=vm.caretSize,cornerRadius=vm.cornerRadius,xAlign=vm.xAlign,yAlign=vm.yAlign,ptX=tooltipPoint.x,ptY=tooltipPoint.y,width=size.width,height=size.height;if("center"===yAlign)y2=ptY+height/2,"left"===xAlign?(x2=(x1=ptX)-caretSize,x3=x1,y1=y2+caretSize,y3=y2-caretSize):(x2=(x1=ptX+width)+caretSize,x3=x1,y1=y2-caretSize,y3=y2+caretSize);else if("left"===xAlign?(x1=(x2=ptX+cornerRadius+caretSize)-caretSize,x3=x2+caretSize):"right"===xAlign?(x1=(x2=ptX+width-cornerRadius-caretSize)-caretSize,x3=x2+caretSize):(x1=(x2=vm.caretX)-caretSize,x3=x2+caretSize),"top"===yAlign)y2=(y1=ptY)-caretSize,y3=y1;else{y2=(y1=ptY+height)+caretSize,y3=y1;var tmp=x3;x3=x1,x1=tmp}return{x1:x1,x2:x2,x3:x3,y1:y1,y2:y2,y3:y3}},drawTitle:function(pt,vm,ctx){var titleFontSize,titleSpacing,i,title=vm.title,length=title.length;if(length){var rtlHelper=getRtlHelper(vm.rtl,vm.x,vm.width);for(pt.x=getAlignedX(vm,vm._titleAlign),ctx.textAlign=rtlHelper.textAlign(vm._titleAlign),ctx.textBaseline="middle",titleFontSize=vm.titleFontSize,titleSpacing=vm.titleSpacing,ctx.fillStyle=vm.titleFontColor,ctx.font=helpers$1.fontString(titleFontSize,vm._titleFontStyle,vm._titleFontFamily),i=0;i0&&ctx.stroke()},draw:function(){var ctx=this._chart.ctx,vm=this._view;if(0!==vm.opacity){var tooltipSize={width:vm.width,height:vm.height},pt={x:vm.x,y:vm.y},opacity=Math.abs(vm.opacity<.001)?0:vm.opacity,hasTooltipContent=vm.title.length||vm.beforeBody.length||vm.body.length||vm.afterBody.length||vm.footer.length;this._options.enabled&&hasTooltipContent&&(ctx.save(),ctx.globalAlpha=opacity,this.drawBackground(pt,vm,ctx,tooltipSize),pt.y+=vm.yPadding,helpers$1.rtl.overrideTextDirection(ctx,vm.textDirection),this.drawTitle(pt,vm,ctx),this.drawBody(pt,vm,ctx),this.drawFooter(pt,vm,ctx),helpers$1.rtl.restoreTextDirection(ctx,vm.textDirection),ctx.restore())}},handleEvent:function(e){var changed,me=this,options=me._options;return me._lastActive=me._lastActive||[],"mouseout"===e.type?me._active=[]:(me._active=me._chart.getElementsAtEventForMode(e,options.mode,options),options.reverse&&me._active.reverse()),(changed=!helpers$1.arrayEquals(me._active,me._lastActive))&&(me._lastActive=me._active,(options.enabled||options.custom)&&(me._eventPosition={x:e.x,y:e.y},me.update(!0),me.pivot())),changed}}),positioners_1=positioners,core_tooltip=exports$4;core_tooltip.positioners=positioners_1;var valueOrDefault$9=helpers$1.valueOrDefault;function mergeScaleConfig(){return helpers$1.merge(Object.create(null),[].slice.call(arguments),{merger:function(key,target,source,options){if("xAxes"===key||"yAxes"===key){var i,type,scale,slen=source[key].length;for(target[key]||(target[key]=[]),i=0;i=target[key].length&&target[key].push({}),!target[key][i].type||scale.type&&scale.type!==target[key][i].type?helpers$1.merge(target[key][i],[core_scaleService.getScaleDefaults(type),scale]):helpers$1.merge(target[key][i],scale)}else helpers$1._merger(key,target,source,options)}})}function mergeConfig(){return helpers$1.merge(Object.create(null),[].slice.call(arguments),{merger:function(key,target,source,options){var tval=target[key]||Object.create(null),sval=source[key];"scales"===key?target[key]=mergeScaleConfig(tval,sval):"scale"===key?target[key]=helpers$1.merge(tval,[core_scaleService.getScaleDefaults(sval.type),sval]):helpers$1._merger(key,target,source,options)}})}function nextAvailableScaleId(axesOpts,prefix,index){var id,hasId=function(obj){return obj.id===id};do{id=prefix+index++}while(helpers$1.findIndex(axesOpts,hasId)>=0);return id}function positionIsHorizontal(position){return"top"===position||"bottom"===position}function compare2Level(l1,l2){return function(a,b){return a[l1]===b[l1]?a[l2]-b[l2]:a[l1]-b[l1]}}core_defaults._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var Chart=function(item,config){return this.construct(item,config),this};helpers$1.extend(Chart.prototype,{construct:function(item,config){var me=this;config=function(config){var data=(config=config||Object.create(null)).data=config.data||{};return data.datasets=data.datasets||[],data.labels=data.labels||[],config.options=mergeConfig(core_defaults.global,core_defaults[config.type],config.options||{}),config}(config);var context=platform.acquireContext(item,config),canvas=context&&context.canvas,height=canvas&&canvas.height,width=canvas&&canvas.width;me.id=helpers$1.uid(),me.ctx=context,me.canvas=canvas,me.config=config,me.width=width,me.height=height,me.aspectRatio=height?width/height:null,me.options=config.options,me._bufferedRender=!1,me._layers=[],me.chart=me,me.controller=me,Chart.instances[me.id]=me,Object.defineProperty(me,"data",{get:function(){return me.config.data},set:function(value){me.config.data=value}}),context&&canvas?(me.initialize(),me.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var me=this;return core_plugins.notify(me,"beforeInit"),helpers$1.retinaScale(me,me.options.devicePixelRatio),me.bindEvents(),me.options.responsive&&me.resize(!0),me.initToolTip(),core_plugins.notify(me,"afterInit"),me},clear:function(){return helpers$1.canvas.clear(this),this},stop:function(){return core_animations.cancelAnimation(this),this},resize:function(silent){var me=this,options=me.options,canvas=me.canvas,aspectRatio=options.maintainAspectRatio&&me.aspectRatio||null,newWidth=Math.max(0,Math.floor(helpers$1.getMaximumWidth(canvas))),newHeight=Math.max(0,Math.floor(aspectRatio?newWidth/aspectRatio:helpers$1.getMaximumHeight(canvas)));if((me.width!==newWidth||me.height!==newHeight)&&(canvas.width=me.width=newWidth,canvas.height=me.height=newHeight,canvas.style.width=newWidth+"px",canvas.style.height=newHeight+"px",helpers$1.retinaScale(me,options.devicePixelRatio),!silent)){var newSize={width:newWidth,height:newHeight};core_plugins.notify(me,"resize",[newSize]),options.onResize&&options.onResize(me,newSize),me.stop(),me.update({duration:options.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var options=this.options,scalesOptions=options.scales||{},scaleOptions=options.scale;helpers$1.each(scalesOptions.xAxes,(function(xAxisOptions,index){xAxisOptions.id||(xAxisOptions.id=nextAvailableScaleId(scalesOptions.xAxes,"x-axis-",index))})),helpers$1.each(scalesOptions.yAxes,(function(yAxisOptions,index){yAxisOptions.id||(yAxisOptions.id=nextAvailableScaleId(scalesOptions.yAxes,"y-axis-",index))})),scaleOptions&&(scaleOptions.id=scaleOptions.id||"scale")},buildOrUpdateScales:function(){var me=this,options=me.options,scales=me.scales||{},items=[],updated=Object.keys(scales).reduce((function(obj,id){return obj[id]=!1,obj}),{});options.scales&&(items=items.concat((options.scales.xAxes||[]).map((function(xAxisOptions){return{options:xAxisOptions,dtype:"category",dposition:"bottom"}})),(options.scales.yAxes||[]).map((function(yAxisOptions){return{options:yAxisOptions,dtype:"linear",dposition:"left"}})))),options.scale&&items.push({options:options.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),helpers$1.each(items,(function(item){var scaleOptions=item.options,id=scaleOptions.id,scaleType=valueOrDefault$9(scaleOptions.type,item.dtype);positionIsHorizontal(scaleOptions.position)!==positionIsHorizontal(item.dposition)&&(scaleOptions.position=item.dposition),updated[id]=!0;var scale=null;if(id in scales&&scales[id].type===scaleType)(scale=scales[id]).options=scaleOptions,scale.ctx=me.ctx,scale.chart=me;else{var scaleClass=core_scaleService.getScaleConstructor(scaleType);if(!scaleClass)return;scale=new scaleClass({id:id,type:scaleType,options:scaleOptions,ctx:me.ctx,chart:me}),scales[scale.id]=scale}scale.mergeTicksOptions(),item.isDefault&&(me.scale=scale)})),helpers$1.each(updated,(function(hasUpdated,id){hasUpdated||delete scales[id]})),me.scales=scales,core_scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var i,ilen,me=this,newControllers=[],datasets=me.data.datasets;for(i=0,ilen=datasets.length;i=0;--i)this.drawDataset(metasets[i],easingValue);core_plugins.notify(this,"afterDatasetsDraw",[easingValue])}},drawDataset:function(meta,easingValue){var args={meta:meta,index:meta.index,easingValue:easingValue};!1!==core_plugins.notify(this,"beforeDatasetDraw",[args])&&(meta.controller.draw(easingValue),core_plugins.notify(this,"afterDatasetDraw",[args]))},_drawTooltip:function(easingValue){var tooltip=this.tooltip,args={tooltip:tooltip,easingValue:easingValue};!1!==core_plugins.notify(this,"beforeTooltipDraw",[args])&&(tooltip.draw(),core_plugins.notify(this,"afterTooltipDraw",[args]))},getElementAtEvent:function(e){return core_interaction.modes.single(this,e)},getElementsAtEvent:function(e){return core_interaction.modes.label(this,e,{intersect:!0})},getElementsAtXAxis:function(e){return core_interaction.modes["x-axis"](this,e,{intersect:!0})},getElementsAtEventForMode:function(e,mode,options){var method=core_interaction.modes[mode];return"function"==typeof method?method(this,e,options):[]},getDatasetAtEvent:function(e){return core_interaction.modes.dataset(this,e,{intersect:!0})},getDatasetMeta:function(datasetIndex){var dataset=this.data.datasets[datasetIndex];dataset._meta||(dataset._meta={});var meta=dataset._meta[this.id];return meta||(meta=dataset._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:dataset.order||0,index:datasetIndex}),meta},getVisibleDatasetCount:function(){for(var count=0,i=0,ilen=this.data.datasets.length;i3?ticks[2]-ticks[1]:ticks[1]-ticks[0];Math.abs(delta)>1&&tickValue!==Math.floor(tickValue)&&(delta=tickValue-Math.floor(tickValue));var logDelta=helpers$1.log10(Math.abs(delta)),tickString="";if(0!==tickValue)if(Math.max(Math.abs(ticks[0]),Math.abs(ticks[ticks.length-1]))<1e-4){var logTick=helpers$1.log10(Math.abs(tickValue)),numExponential=Math.floor(logTick)-Math.floor(logDelta);numExponential=Math.max(Math.min(numExponential,20),0),tickString=tickValue.toExponential(numExponential)}else{var numDecimal=-1*Math.floor(logDelta);numDecimal=Math.max(Math.min(numDecimal,20),0),tickString=tickValue.toFixed(numDecimal)}else tickString="0";return tickString},logarithmic:function(tickValue,index,ticks){var remain=tickValue/Math.pow(10,Math.floor(helpers$1.log10(tickValue)));return 0===tickValue?"0":1===remain||2===remain||5===remain||0===index||index===ticks.length-1?tickValue.toExponential():""}}},isArray=helpers$1.isArray,isNullOrUndef=helpers$1.isNullOrUndef,valueOrDefault$a=helpers$1.valueOrDefault,valueAtIndexOrDefault=helpers$1.valueAtIndexOrDefault;function getPixelForGridLine(scale,index,offsetGridLines){var offset,length=scale.getTicks().length,validIndex=Math.min(index,length-1),lineValue=scale.getPixelForTick(validIndex),start=scale._startPixel,end=scale._endPixel;if(!(offsetGridLines&&(offset=1===length?Math.max(lineValue-start,end-lineValue):0===index?(scale.getPixelForTick(1)-lineValue)/2:(lineValue-scale.getPixelForTick(validIndex-1))/2,(lineValue+=validIndexend+1e-6)))return lineValue}function computeLabelSizes(ctx,tickFonts,ticks,caches){var i,j,jlen,label,tickFont,fontString,cache,lineHeight,width,height,nestedLabel,widest,highest,length=ticks.length,widths=[],heights=[],offsets=[],widestLabelSize=0,highestLabelSize=0;for(i=0;ilength){for(i=0;i=maxRotation||numTicks<=1||!me.isHorizontal()?me.labelRotation=minRotation:(maxLabelWidth=(labelSizes=me._getLabelSizes()).widest.width,maxLabelHeight=labelSizes.highest.height-labelSizes.highest.offset,maxWidth=Math.min(me.maxWidth,me.chart.width-maxLabelWidth),maxLabelWidth+6>(tickWidth=options.offset?me.maxWidth/numTicks:maxWidth/(numTicks-1))&&(tickWidth=maxWidth/(numTicks-(options.offset?.5:1)),maxHeight=me.maxHeight-getTickMarkLength(options.gridLines)-tickOpts.padding-getScaleLabelHeight(options.scaleLabel),maxLabelDiagonal=Math.sqrt(maxLabelWidth*maxLabelWidth+maxLabelHeight*maxLabelHeight),labelRotation=helpers$1.toDegrees(Math.min(Math.asin(Math.min((labelSizes.highest.height+6)/tickWidth,1)),Math.asin(Math.min(maxHeight/maxLabelDiagonal,1))-Math.asin(maxLabelHeight/maxLabelDiagonal))),labelRotation=Math.max(minRotation,Math.min(maxRotation,labelRotation))),me.labelRotation=labelRotation)},afterCalculateTickRotation:function(){helpers$1.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){helpers$1.callback(this.options.beforeFit,[this])},fit:function(){var me=this,minSize=me.minSize={width:0,height:0},chart=me.chart,opts=me.options,tickOpts=opts.ticks,scaleLabelOpts=opts.scaleLabel,gridLineOpts=opts.gridLines,display=me._isVisible(),isBottom="bottom"===opts.position,isHorizontal=me.isHorizontal();if(isHorizontal?minSize.width=me.maxWidth:display&&(minSize.width=getTickMarkLength(gridLineOpts)+getScaleLabelHeight(scaleLabelOpts)),isHorizontal?display&&(minSize.height=getTickMarkLength(gridLineOpts)+getScaleLabelHeight(scaleLabelOpts)):minSize.height=me.maxHeight,tickOpts.display&&display){var tickFonts=parseTickFontOptions(tickOpts),labelSizes=me._getLabelSizes(),firstLabelSize=labelSizes.first,lastLabelSize=labelSizes.last,widestLabelSize=labelSizes.widest,highestLabelSize=labelSizes.highest,lineSpace=.4*tickFonts.minor.lineHeight,tickPadding=tickOpts.padding;if(isHorizontal){var isRotated=0!==me.labelRotation,angleRadians=helpers$1.toRadians(me.labelRotation),cosRotation=Math.cos(angleRadians),sinRotation=Math.sin(angleRadians),labelHeight=sinRotation*widestLabelSize.width+cosRotation*(highestLabelSize.height-(isRotated?highestLabelSize.offset:0))+(isRotated?0:lineSpace);minSize.height=Math.min(me.maxHeight,minSize.height+labelHeight+tickPadding);var paddingLeft,paddingRight,offsetLeft=me.getPixelForTick(0)-me.left,offsetRight=me.right-me.getPixelForTick(me.getTicks().length-1);isRotated?(paddingLeft=isBottom?cosRotation*firstLabelSize.width+sinRotation*firstLabelSize.offset:sinRotation*(firstLabelSize.height-firstLabelSize.offset),paddingRight=isBottom?sinRotation*(lastLabelSize.height-lastLabelSize.offset):cosRotation*lastLabelSize.width+sinRotation*lastLabelSize.offset):(paddingLeft=firstLabelSize.width/2,paddingRight=lastLabelSize.width/2),me.paddingLeft=Math.max((paddingLeft-offsetLeft)*me.width/(me.width-offsetLeft),0)+3,me.paddingRight=Math.max((paddingRight-offsetRight)*me.width/(me.width-offsetRight),0)+3}else{var labelWidth=tickOpts.mirror?0:widestLabelSize.width+tickPadding+lineSpace;minSize.width=Math.min(me.maxWidth,minSize.width+labelWidth),me.paddingTop=firstLabelSize.height/2,me.paddingBottom=lastLabelSize.height/2}}me.handleMargins(),isHorizontal?(me.width=me._length=chart.width-me.margins.left-me.margins.right,me.height=minSize.height):(me.width=minSize.width,me.height=me._length=chart.height-me.margins.top-me.margins.bottom)},handleMargins:function(){var me=this;me.margins&&(me.margins.left=Math.max(me.paddingLeft,me.margins.left),me.margins.top=Math.max(me.paddingTop,me.margins.top),me.margins.right=Math.max(me.paddingRight,me.margins.right),me.margins.bottom=Math.max(me.paddingBottom,me.margins.bottom))},afterFit:function(){helpers$1.callback(this.options.afterFit,[this])},isHorizontal:function(){var pos=this.options.position;return"top"===pos||"bottom"===pos},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(rawValue){if(isNullOrUndef(rawValue))return NaN;if(("number"==typeof rawValue||rawValue instanceof Number)&&!isFinite(rawValue))return NaN;if(rawValue)if(this.isHorizontal()){if(void 0!==rawValue.x)return this.getRightValue(rawValue.x)}else if(void 0!==rawValue.y)return this.getRightValue(rawValue.y);return rawValue},_convertTicksToLabels:function(ticks){var labels,i,ilen,me=this;for(me.ticks=ticks.map((function(tick){return tick.value})),me.beforeTickToLabelConversion(),labels=me.convertTicksToLabels(ticks)||me.ticks,me.afterTickToLabelConversion(),i=0,ilen=ticks.length;inumTicks-1?null:this.getPixelForDecimal(index*tickWidth+(offset?tickWidth/2:0))},getPixelForDecimal:function(decimal){return this._reversePixels&&(decimal=1-decimal),this._startPixel+decimal*this._length},getDecimalForPixel:function(pixel){var decimal=(pixel-this._startPixel)/this._length;return this._reversePixels?1-decimal:decimal},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var min=this.min,max=this.max;return this.beginAtZero?0:min<0&&max<0?max:min>0&&max>0?min:0},_autoSkip:function(ticks){var i,ilen,spacing,avgMajorSpacing,tickOpts=this.options.ticks,axisLength=this._length,ticksLimit=tickOpts.maxTicksLimit||axisLength/this._tickSize()+1,majorIndices=tickOpts.major.enabled?function(ticks){var i,ilen,result=[];for(i=0,ilen=ticks.length;iticksLimit)return function(ticks,majorIndices,spacing){var i,tick,count=0,next=majorIndices[0];for(spacing=Math.ceil(spacing),i=0;ispacing)return factor;return Math.max(spacing,1)}(majorIndices,ticks,0,ticksLimit),numMajorIndices>0){for(i=0,ilen=numMajorIndices-1;i1?(last-first)/(numMajorIndices-1):null,skip(ticks,spacing,helpers$1.isNullOrUndef(avgMajorSpacing)?0:first-avgMajorSpacing,first),skip(ticks,spacing,last,helpers$1.isNullOrUndef(avgMajorSpacing)?ticks.length:last+avgMajorSpacing),nonSkipped(ticks)}return skip(ticks,spacing),nonSkipped(ticks)},_tickSize:function(){var optionTicks=this.options.ticks,rot=helpers$1.toRadians(this.labelRotation),cos=Math.abs(Math.cos(rot)),sin=Math.abs(Math.sin(rot)),labelSizes=this._getLabelSizes(),padding=optionTicks.autoSkipPadding||0,w=labelSizes?labelSizes.widest.width+padding:0,h=labelSizes?labelSizes.highest.height+padding:0;return this.isHorizontal()?h*cos>w*sin?w/cos:h/sin:h*sin=0&&(minIndex=findIndex),void 0!==max&&(findIndex=labels.indexOf(max))>=0&&(maxIndex=findIndex),me.minIndex=minIndex,me.maxIndex=maxIndex,me.min=labels[minIndex],me.max=labels[maxIndex]},buildTicks:function(){var labels=this._getLabels(),minIndex=this.minIndex,maxIndex=this.maxIndex;this.ticks=0===minIndex&&maxIndex===labels.length-1?labels:labels.slice(minIndex,maxIndex+1)},getLabelForIndex:function(index,datasetIndex){var chart=this.chart;return chart.getDatasetMeta(datasetIndex).controller._getValueScaleId()===this.id?this.getRightValue(chart.data.datasets[datasetIndex].data[index]):this._getLabels()[index]},_configure:function(){var me=this,offset=me.options.offset,ticks=me.ticks;core_scale.prototype._configure.call(me),me.isHorizontal()||(me._reversePixels=!me._reversePixels),ticks&&(me._startValue=me.minIndex-(offset?.5:0),me._valueRange=Math.max(ticks.length-(offset?0:1),1))},getPixelForValue:function(value,index,datasetIndex){var valueCategory,labels,idx,me=this;return isNullOrUndef$1(index)||isNullOrUndef$1(datasetIndex)||(value=me.chart.data.datasets[datasetIndex].data[index]),isNullOrUndef$1(value)||(valueCategory=me.isHorizontal()?value.x:value.y),(void 0!==valueCategory||void 0!==value&&isNaN(index))&&(labels=me._getLabels(),value=helpers$1.valueOrDefault(valueCategory,value),index=-1!==(idx=labels.indexOf(value))?idx:index,isNaN(index)&&(index=value)),me.getPixelForDecimal((index-me._startValue)/me._valueRange)},getPixelForTick:function(index){var ticks=this.ticks;return index<0||index>ticks.length-1?null:this.getPixelForValue(ticks[index],index+this.minIndex)},getValueForPixel:function(pixel){var value=Math.round(this._startValue+this.getDecimalForPixel(pixel)*this._valueRange);return Math.min(Math.max(value,0),this.ticks.length-1)},getBasePixel:function(){return this.bottom}}),_defaults={position:"bottom"};scale_category._defaults=_defaults;var noop=helpers$1.noop,isNullOrUndef$2=helpers$1.isNullOrUndef;var scale_linearbase=core_scale.extend({getRightValue:function(value){return"string"==typeof value?+value:core_scale.prototype.getRightValue.call(this,value)},handleTickRangeOptions:function(){var me=this,tickOpts=me.options.ticks;if(tickOpts.beginAtZero){var minSign=helpers$1.sign(me.min),maxSign=helpers$1.sign(me.max);minSign<0&&maxSign<0?me.max=0:minSign>0&&maxSign>0&&(me.min=0)}var setMin=void 0!==tickOpts.min||void 0!==tickOpts.suggestedMin,setMax=void 0!==tickOpts.max||void 0!==tickOpts.suggestedMax;void 0!==tickOpts.min?me.min=tickOpts.min:void 0!==tickOpts.suggestedMin&&(null===me.min?me.min=tickOpts.suggestedMin:me.min=Math.min(me.min,tickOpts.suggestedMin)),void 0!==tickOpts.max?me.max=tickOpts.max:void 0!==tickOpts.suggestedMax&&(null===me.max?me.max=tickOpts.suggestedMax:me.max=Math.max(me.max,tickOpts.suggestedMax)),setMin!==setMax&&me.min>=me.max&&(setMin?me.max=me.min+1:me.min=me.max-1),me.min===me.max&&(me.max++,tickOpts.beginAtZero||me.min--)},getTickLimit:function(){var maxTicks,tickOpts=this.options.ticks,stepSize=tickOpts.stepSize,maxTicksLimit=tickOpts.maxTicksLimit;return stepSize?maxTicks=Math.ceil(this.max/stepSize)-Math.floor(this.min/stepSize)+1:(maxTicks=this._computeTickLimit(),maxTicksLimit=maxTicksLimit||11),maxTicksLimit&&(maxTicks=Math.min(maxTicksLimit,maxTicks)),maxTicks},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:noop,buildTicks:function(){var me=this,tickOpts=me.options.ticks,maxTicks=me.getTickLimit(),numericGeneratorOptions={maxTicks:maxTicks=Math.max(2,maxTicks),min:tickOpts.min,max:tickOpts.max,precision:tickOpts.precision,stepSize:helpers$1.valueOrDefault(tickOpts.fixedStepSize,tickOpts.stepSize)},ticks=me.ticks=function(generationOptions,dataRange){var factor,niceMin,niceMax,numSpaces,ticks=[],stepSize=generationOptions.stepSize,unit=stepSize||1,maxNumSpaces=generationOptions.maxTicks-1,min=generationOptions.min,max=generationOptions.max,precision=generationOptions.precision,rmin=dataRange.min,rmax=dataRange.max,spacing=helpers$1.niceNum((rmax-rmin)/maxNumSpaces/unit)*unit;if(spacing<1e-14&&isNullOrUndef$2(min)&&isNullOrUndef$2(max))return[rmin,rmax];(numSpaces=Math.ceil(rmax/spacing)-Math.floor(rmin/spacing))>maxNumSpaces&&(spacing=helpers$1.niceNum(numSpaces*spacing/maxNumSpaces/unit)*unit),stepSize||isNullOrUndef$2(precision)?factor=Math.pow(10,helpers$1._decimalPlaces(spacing)):(factor=Math.pow(10,precision),spacing=Math.ceil(spacing*factor)/factor),niceMin=Math.floor(rmin/spacing)*spacing,niceMax=Math.ceil(rmax/spacing)*spacing,stepSize&&(!isNullOrUndef$2(min)&&helpers$1.almostWhole(min/spacing,spacing/1e3)&&(niceMin=min),!isNullOrUndef$2(max)&&helpers$1.almostWhole(max/spacing,spacing/1e3)&&(niceMax=max)),numSpaces=(niceMax-niceMin)/spacing,numSpaces=helpers$1.almostEquals(numSpaces,Math.round(numSpaces),spacing/1e3)?Math.round(numSpaces):Math.ceil(numSpaces),niceMin=Math.round(niceMin*factor)/factor,niceMax=Math.round(niceMax*factor)/factor,ticks.push(isNullOrUndef$2(min)?niceMin:min);for(var j=1;jticks.length-1?null:this.getPixelForValue(ticks[index])}}),_defaults$1=defaultConfig$1;scale_linear._defaults=_defaults$1;var valueOrDefault$b=helpers$1.valueOrDefault,log10=helpers$1.math.log10;var defaultConfig$2={position:"left",ticks:{callback:core_ticks.formatters.logarithmic}};function nonNegativeOrDefault(value,defaultValue){return helpers$1.isFinite(value)&&value>=0?value:defaultValue}var scale_logarithmic=core_scale.extend({determineDataLimits:function(){var datasetIndex,meta,value,data,i,ilen,me=this,opts=me.options,chart=me.chart,datasets=chart.data.datasets,isHorizontal=me.isHorizontal();function IDMatches(meta){return isHorizontal?meta.xAxisID===me.id:meta.yAxisID===me.id}me.min=Number.POSITIVE_INFINITY,me.max=Number.NEGATIVE_INFINITY,me.minNotZero=Number.POSITIVE_INFINITY;var hasStacks=opts.stacked;if(void 0===hasStacks)for(datasetIndex=0;datasetIndex0){var minVal=helpers$1.min(valuesForType),maxVal=helpers$1.max(valuesForType);me.min=Math.min(me.min,minVal),me.max=Math.max(me.max,maxVal)}}))}else for(datasetIndex=0;datasetIndex0?me.minNotZero=me.min:me.max<1?me.minNotZero=Math.pow(10,Math.floor(log10(me.max))):me.minNotZero=1)},buildTicks:function(){var me=this,tickOpts=me.options.ticks,reverse=!me.isHorizontal(),generationOptions={min:nonNegativeOrDefault(tickOpts.min),max:nonNegativeOrDefault(tickOpts.max)},ticks=me.ticks=function(generationOptions,dataRange){var exp,significand,ticks=[],tickVal=valueOrDefault$b(generationOptions.min,Math.pow(10,Math.floor(log10(dataRange.min)))),endExp=Math.floor(log10(dataRange.max)),endSignificand=Math.ceil(dataRange.max/Math.pow(10,endExp));0===tickVal?(exp=Math.floor(log10(dataRange.minNotZero)),significand=Math.floor(dataRange.minNotZero/Math.pow(10,exp)),ticks.push(tickVal),tickVal=significand*Math.pow(10,exp)):(exp=Math.floor(log10(tickVal)),significand=Math.floor(tickVal/Math.pow(10,exp)));var precision=exp<0?Math.pow(10,Math.abs(exp)):1;do{ticks.push(tickVal),10==++significand&&(significand=1,precision=++exp>=0?1:precision),tickVal=Math.round(significand*Math.pow(10,exp)*precision)/precision}while(expticks.length-1?null:this.getPixelForValue(ticks[index])},_getFirstTickValue:function(value){var exp=Math.floor(log10(value));return Math.floor(value/Math.pow(10,exp))*Math.pow(10,exp)},_configure:function(){var me=this,start=me.min,offset=0;core_scale.prototype._configure.call(me),0===start&&(start=me._getFirstTickValue(me.minNotZero),offset=valueOrDefault$b(me.options.ticks.fontSize,core_defaults.global.defaultFontSize)/me._length),me._startValue=log10(start),me._valueOffset=offset,me._valueRange=(log10(me.max)-log10(start))/(1-offset)},getPixelForValue:function(value){var me=this,decimal=0;return(value=+me.getRightValue(value))>me.min&&value>0&&(decimal=(log10(value)-me._startValue)/me._valueRange+me._valueOffset),me.getPixelForDecimal(decimal)},getValueForPixel:function(pixel){var me=this,decimal=me.getDecimalForPixel(pixel);return 0===decimal&&0===me.min?0:Math.pow(10,me._startValue+(decimal-me._valueOffset)*me._valueRange)}}),_defaults$2=defaultConfig$2;scale_logarithmic._defaults=_defaults$2;var valueOrDefault$c=helpers$1.valueOrDefault,valueAtIndexOrDefault$1=helpers$1.valueAtIndexOrDefault,resolve$4=helpers$1.options.resolve,defaultConfig$3={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:core_ticks.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(label){return label}}};function getTickBackdropHeight(opts){var tickOpts=opts.ticks;return tickOpts.display&&opts.display?valueOrDefault$c(tickOpts.fontSize,core_defaults.global.defaultFontSize)+2*tickOpts.backdropPaddingY:0}function determineLimits(angle,pos,size,min,max){return angle===min||angle===max?{start:pos-size/2,end:pos+size/2}:anglemax?{start:pos-size,end:pos}:{start:pos,end:pos+size}}function getTextAlignForAngle(angle){return 0===angle||180===angle?"center":angle<180?"left":"right"}function fillText(ctx,text,position,lineHeight){var i,ilen,y=position.y+lineHeight/2;if(helpers$1.isArray(text))for(i=0,ilen=text.length;i270||angle<90)&&(position.y-=textSize.h)}function numberOrZero(param){return helpers$1.isNumber(param)?param:0}var scale_radialLinear=scale_linearbase.extend({setDimensions:function(){var me=this;me.width=me.maxWidth,me.height=me.maxHeight,me.paddingTop=getTickBackdropHeight(me.options)/2,me.xCenter=Math.floor(me.width/2),me.yCenter=Math.floor((me.height-me.paddingTop)/2),me.drawingArea=Math.min(me.height-me.paddingTop,me.width)/2},determineDataLimits:function(){var me=this,chart=me.chart,min=Number.POSITIVE_INFINITY,max=Number.NEGATIVE_INFINITY;helpers$1.each(chart.data.datasets,(function(dataset,datasetIndex){if(chart.isDatasetVisible(datasetIndex)){var meta=chart.getDatasetMeta(datasetIndex);helpers$1.each(dataset.data,(function(rawValue,index){var value=+me.getRightValue(rawValue);isNaN(value)||meta.data[index].hidden||(min=Math.min(value,min),max=Math.max(value,max))}))}})),me.min=min===Number.POSITIVE_INFINITY?0:min,me.max=max===Number.NEGATIVE_INFINITY?0:max,me.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/getTickBackdropHeight(this.options))},convertTicksToLabels:function(){var me=this;scale_linearbase.prototype.convertTicksToLabels.call(me),me.pointLabels=me.chart.data.labels.map((function(){var label=helpers$1.callback(me.options.pointLabels.callback,arguments,me);return label||0===label?label:""}))},getLabelForIndex:function(index,datasetIndex){return+this.getRightValue(this.chart.data.datasets[datasetIndex].data[index])},fit:function(){var opts=this.options;opts.display&&opts.pointLabels.display?function(scale){var i,textSize,pointPosition,plFont=helpers$1.options._parseFont(scale.options.pointLabels),furthestLimits={l:0,r:scale.width,t:0,b:scale.height-scale.paddingTop},furthestAngles={};scale.ctx.font=plFont.string,scale._pointLabelSizes=[];var ctx,lineHeight,label,valueCount=scale.chart.data.labels.length;for(i=0;ifurthestLimits.r&&(furthestLimits.r=hLimits.end,furthestAngles.r=angleRadians),vLimits.startfurthestLimits.b&&(furthestLimits.b=vLimits.end,furthestAngles.b=angleRadians)}scale.setReductions(scale.drawingArea,furthestLimits,furthestAngles)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(largestPossibleRadius,furthestLimits,furthestAngles){var me=this,radiusReductionLeft=furthestLimits.l/Math.sin(furthestAngles.l),radiusReductionRight=Math.max(furthestLimits.r-me.width,0)/Math.sin(furthestAngles.r),radiusReductionTop=-furthestLimits.t/Math.cos(furthestAngles.t),radiusReductionBottom=-Math.max(furthestLimits.b-(me.height-me.paddingTop),0)/Math.cos(furthestAngles.b);radiusReductionLeft=numberOrZero(radiusReductionLeft),radiusReductionRight=numberOrZero(radiusReductionRight),radiusReductionTop=numberOrZero(radiusReductionTop),radiusReductionBottom=numberOrZero(radiusReductionBottom),me.drawingArea=Math.min(Math.floor(largestPossibleRadius-(radiusReductionLeft+radiusReductionRight)/2),Math.floor(largestPossibleRadius-(radiusReductionTop+radiusReductionBottom)/2)),me.setCenterPoint(radiusReductionLeft,radiusReductionRight,radiusReductionTop,radiusReductionBottom)},setCenterPoint:function(leftMovement,rightMovement,topMovement,bottomMovement){var me=this,maxRight=me.width-rightMovement-me.drawingArea,maxLeft=leftMovement+me.drawingArea,maxTop=topMovement+me.drawingArea,maxBottom=me.height-me.paddingTop-bottomMovement-me.drawingArea;me.xCenter=Math.floor((maxLeft+maxRight)/2+me.left),me.yCenter=Math.floor((maxTop+maxBottom)/2+me.top+me.paddingTop)},getIndexAngle:function(index){var chart=this.chart,angle=(index*(360/chart.data.labels.length)+((chart.options||{}).startAngle||0))%360;return(angle<0?angle+360:angle)*Math.PI*2/360},getDistanceFromCenterForValue:function(value){var me=this;if(helpers$1.isNullOrUndef(value))return NaN;var scalingFactor=me.drawingArea/(me.max-me.min);return me.options.ticks.reverse?(me.max-value)*scalingFactor:(value-me.min)*scalingFactor},getPointPosition:function(index,distanceFromCenter){var thisAngle=this.getIndexAngle(index)-Math.PI/2;return{x:Math.cos(thisAngle)*distanceFromCenter+this.xCenter,y:Math.sin(thisAngle)*distanceFromCenter+this.yCenter}},getPointPositionForValue:function(index,value){return this.getPointPosition(index,this.getDistanceFromCenterForValue(value))},getBasePosition:function(index){var min=this.min,max=this.max;return this.getPointPositionForValue(index||0,this.beginAtZero?0:min<0&&max<0?max:min>0&&max>0?min:0)},_drawGrid:function(){var i,offset,position,me=this,ctx=me.ctx,opts=me.options,gridLineOpts=opts.gridLines,angleLineOpts=opts.angleLines,lineWidth=valueOrDefault$c(angleLineOpts.lineWidth,gridLineOpts.lineWidth),lineColor=valueOrDefault$c(angleLineOpts.color,gridLineOpts.color);if(opts.pointLabels.display&&function(scale){var ctx=scale.ctx,opts=scale.options,pointLabelOpts=opts.pointLabels,tickBackdropHeight=getTickBackdropHeight(opts),outerDistance=scale.getDistanceFromCenterForValue(opts.ticks.reverse?scale.min:scale.max),plFont=helpers$1.options._parseFont(pointLabelOpts);ctx.save(),ctx.font=plFont.string,ctx.textBaseline="middle";for(var i=scale.chart.data.labels.length-1;i>=0;i--){var extra=0===i?tickBackdropHeight/2:0,pointLabelPosition=scale.getPointPosition(i,outerDistance+extra+5),pointLabelFontColor=valueAtIndexOrDefault$1(pointLabelOpts.fontColor,i,core_defaults.global.defaultFontColor);ctx.fillStyle=pointLabelFontColor;var angleRadians=scale.getIndexAngle(i),angle=helpers$1.toDegrees(angleRadians);ctx.textAlign=getTextAlignForAngle(angle),adjustPointPositionForLabelHeight(angle,scale._pointLabelSizes[i],pointLabelPosition),fillText(ctx,scale.pointLabels[i],pointLabelPosition,plFont.lineHeight)}ctx.restore()}(me),gridLineOpts.display&&helpers$1.each(me.ticks,(function(label,index){0!==index&&(offset=me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]),function(scale,gridLineOpts,radius,index){var pointPosition,ctx=scale.ctx,circular=gridLineOpts.circular,valueCount=scale.chart.data.labels.length,lineColor=valueAtIndexOrDefault$1(gridLineOpts.color,index-1),lineWidth=valueAtIndexOrDefault$1(gridLineOpts.lineWidth,index-1);if((circular||valueCount)&&lineColor&&lineWidth){if(ctx.save(),ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,ctx.setLineDash&&(ctx.setLineDash(gridLineOpts.borderDash||[]),ctx.lineDashOffset=gridLineOpts.borderDashOffset||0),ctx.beginPath(),circular)ctx.arc(scale.xCenter,scale.yCenter,radius,0,2*Math.PI);else{pointPosition=scale.getPointPosition(0,radius),ctx.moveTo(pointPosition.x,pointPosition.y);for(var i=1;i=0;i--)offset=me.getDistanceFromCenterForValue(opts.ticks.reverse?me.min:me.max),position=me.getPointPosition(i,offset),ctx.beginPath(),ctx.moveTo(me.xCenter,me.yCenter),ctx.lineTo(position.x,position.y),ctx.stroke();ctx.restore()}},_drawLabels:function(){var me=this,ctx=me.ctx,tickOpts=me.options.ticks;if(tickOpts.display){var offset,width,startAngle=me.getIndexAngle(0),tickFont=helpers$1.options._parseFont(tickOpts),tickFontColor=valueOrDefault$c(tickOpts.fontColor,core_defaults.global.defaultFontColor);ctx.save(),ctx.font=tickFont.string,ctx.translate(me.xCenter,me.yCenter),ctx.rotate(startAngle),ctx.textAlign="center",ctx.textBaseline="middle",helpers$1.each(me.ticks,(function(label,index){(0!==index||tickOpts.reverse)&&(offset=me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]),tickOpts.showLabelBackdrop&&(width=ctx.measureText(label).width,ctx.fillStyle=tickOpts.backdropColor,ctx.fillRect(-width/2-tickOpts.backdropPaddingX,-offset-tickFont.size/2-tickOpts.backdropPaddingY,width+2*tickOpts.backdropPaddingX,tickFont.size+2*tickOpts.backdropPaddingY)),ctx.fillStyle=tickFontColor,ctx.fillText(label,0,-offset))})),ctx.restore()}},_drawTitle:helpers$1.noop}),_defaults$3=defaultConfig$3;scale_radialLinear._defaults=_defaults$3;var deprecated$1=helpers$1._deprecated,resolve$5=helpers$1.options.resolve,valueOrDefault$d=helpers$1.valueOrDefault,MIN_INTEGER=Number.MIN_SAFE_INTEGER||-9007199254740991,MAX_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,INTERVALS={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},UNITS=Object.keys(INTERVALS);function sorter(a,b){return a-b}function getMin(options){return helpers$1.valueOrDefault(options.time.min,options.ticks.min)}function getMax(options){return helpers$1.valueOrDefault(options.time.max,options.ticks.max)}function interpolate$1(table,skey,sval,tkey){var range=function(table,key,value){for(var mid,i0,i1,lo=0,hi=table.length-1;lo>=0&&lo<=hi;){if(i0=table[(mid=lo+hi>>1)-1]||null,i1=table[mid],!i0)return{lo:null,hi:i1};if(i1[key]value))return{lo:i0,hi:i1};hi=mid-1}}return{lo:i1,hi:null}}(table,skey,sval),prev=range.lo?range.hi?range.lo:table[table.length-2]:table[0],next=range.lo?range.hi?range.hi:table[table.length-1]:table[1],span=next[skey]-prev[skey],ratio=span?(sval-prev[skey])/span:0,offset=(next[tkey]-prev[tkey])*ratio;return prev[tkey]+offset}function toTimestamp(scale,input){var adapter=scale._adapter,options=scale.options.time,parser=options.parser,format=parser||options.format,value=input;return"function"==typeof parser&&(value=parser(value)),helpers$1.isFinite(value)||(value="string"==typeof format?adapter.parse(value,format):adapter.parse(value)),null!==value?+value:(parser||"function"!=typeof format||(value=format(input),helpers$1.isFinite(value)||(value=adapter.parse(value))),value)}function parse(scale,input){if(helpers$1.isNullOrUndef(input))return null;var options=scale.options.time,value=toTimestamp(scale,scale.getRightValue(input));return null===value||options.round&&(value=+scale._adapter.startOf(value,options.round)),value}function determineUnitForAutoTicks(minUnit,min,max,capacity){var i,interval,factor,ilen=UNITS.length;for(i=UNITS.indexOf(minUnit);i=0&&(ticks[index].major=!0);return ticks}(scale,ticks,map,majorUnit):ticks}var scale_time=core_scale.extend({initialize:function(){this.mergeTicksOptions(),core_scale.prototype.initialize.call(this)},update:function(){var options=this.options,time=options.time||(options.time={}),adapter=this._adapter=new core_adapters._date(options.adapters.date);return deprecated$1("time scale",time.format,"time.format","time.parser"),deprecated$1("time scale",time.min,"time.min","ticks.min"),deprecated$1("time scale",time.max,"time.max","ticks.max"),helpers$1.mergeIf(time.displayFormats,adapter.formats()),core_scale.prototype.update.apply(this,arguments)},getRightValue:function(rawValue){return rawValue&&void 0!==rawValue.t&&(rawValue=rawValue.t),core_scale.prototype.getRightValue.call(this,rawValue)},determineDataLimits:function(){var i,j,ilen,jlen,data,timestamp,labelsAdded,me=this,chart=me.chart,adapter=me._adapter,options=me.options,unit=options.time.unit||"day",min=MAX_INTEGER,max=MIN_INTEGER,timestamps=[],datasets=[],labels=[],dataLabels=me._getLabels();for(i=0,ilen=dataLabels.length;i1?function(items){var i,ilen,item,hash={},out=[];for(i=0,ilen=items.length;i1e5*stepSize)throw min+" and "+max+" are too far apart with stepSize of "+stepSize+" "+minor;for(time=first;time=min&×tamp<=max&&ticks.push(timestamp);return me.min=min,me.max=max,me._unit=timeOpts.unit||(tickOpts.autoSkip?determineUnitForAutoTicks(timeOpts.minUnit,me.min,me.max,capacity):function(scale,numTicks,minUnit,min,max){var i,unit;for(i=UNITS.length-1;i>=UNITS.indexOf(minUnit);i--)if(unit=UNITS[i],INTERVALS[unit].common&&scale._adapter.diff(max,min,unit)>=numTicks-1)return unit;return UNITS[minUnit?UNITS.indexOf(minUnit):0]}(me,ticks.length,timeOpts.minUnit,me.min,me.max)),me._majorUnit=tickOpts.major.enabled&&"year"!==me._unit?function(unit){for(var i=UNITS.indexOf(unit)+1,ilen=UNITS.length;imin&&curr=0&&index0?capacity:1}}),_defaults$4={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};scale_time._defaults=_defaults$4;var scales={category:scale_category,linear:scale_linear,logarithmic:scale_logarithmic,radialLinear:scale_radialLinear,time:scale_time},moment=createCommonjsModule((function(module,exports){module.exports=function(){var hookCallback,some;function hooks(){return hookCallback.apply(null,arguments)}function setHookCallback(callback){hookCallback=callback}function isArray(input){return input instanceof Array||"[object Array]"===Object.prototype.toString.call(input)}function isObject(input){return null!=input&&"[object Object]"===Object.prototype.toString.call(input)}function isObjectEmpty(obj){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(obj).length;var k;for(k in obj)if(obj.hasOwnProperty(k))return!1;return!0}function isUndefined(input){return void 0===input}function isNumber(input){return"number"==typeof input||"[object Number]"===Object.prototype.toString.call(input)}function isDate(input){return input instanceof Date||"[object Date]"===Object.prototype.toString.call(input)}function map(arr,fn){var i,res=[];for(i=0;i>>0,i=0;i0)for(i=0;i0?"future":"past"];return isFunction(format)?format(output):format.replace(/%s/i,output)}var aliases={};function addUnitAlias(unit,shorthand){var lowerCase=unit.toLowerCase();aliases[lowerCase]=aliases[lowerCase+"s"]=aliases[shorthand]=unit}function normalizeUnits(units){return"string"==typeof units?aliases[units]||aliases[units.toLowerCase()]:void 0}function normalizeObjectUnits(inputObject){var normalizedProp,prop,normalizedInput={};for(prop in inputObject)hasOwnProp(inputObject,prop)&&(normalizedProp=normalizeUnits(prop))&&(normalizedInput[normalizedProp]=inputObject[prop]);return normalizedInput}var priorities={};function addUnitPriority(unit,priority){priorities[unit]=priority}function getPrioritizedUnits(unitsObj){var units=[];for(var u in unitsObj)units.push({unit:u,priority:priorities[u]});return units.sort((function(a,b){return a.priority-b.priority})),units}function zeroFill(number,targetLength,forceSign){var absNumber=""+Math.abs(number),zerosToFill=targetLength-absNumber.length;return(number>=0?forceSign?"+":"":"-")+Math.pow(10,Math.max(0,zerosToFill)).toString().substr(1)+absNumber}var formattingTokens=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,localFormattingTokens=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,formatFunctions={},formatTokenFunctions={};function addFormatToken(token,padded,ordinal,callback){var func=callback;"string"==typeof callback&&(func=function(){return this[callback]()}),token&&(formatTokenFunctions[token]=func),padded&&(formatTokenFunctions[padded[0]]=function(){return zeroFill(func.apply(this,arguments),padded[1],padded[2])}),ordinal&&(formatTokenFunctions[ordinal]=function(){return this.localeData().ordinal(func.apply(this,arguments),token)})}function removeFormattingTokens(input){return input.match(/\[[\s\S]/)?input.replace(/^\[|\]$/g,""):input.replace(/\\/g,"")}function makeFormatFunction(format){var i,length,array=format.match(formattingTokens);for(i=0,length=array.length;i=0&&localFormattingTokens.test(format);)format=format.replace(localFormattingTokens,replaceLongDateFormatTokens),localFormattingTokens.lastIndex=0,i-=1;return format}var match1=/\d/,match2=/\d\d/,match3=/\d{3}/,match4=/\d{4}/,match6=/[+-]?\d{6}/,match1to2=/\d\d?/,match3to4=/\d\d\d\d?/,match5to6=/\d\d\d\d\d\d?/,match1to3=/\d{1,3}/,match1to4=/\d{1,4}/,match1to6=/[+-]?\d{1,6}/,matchUnsigned=/\d+/,matchSigned=/[+-]?\d+/,matchOffset=/Z|[+-]\d\d:?\d\d/gi,matchShortOffset=/Z|[+-]\d\d(?::?\d\d)?/gi,matchTimestamp=/[+-]?\d+(\.\d{1,3})?/,matchWord=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,regexes={};function addRegexToken(token,regex,strictRegex){regexes[token]=isFunction(regex)?regex:function(isStrict,localeData){return isStrict&&strictRegex?strictRegex:regex}}function getParseRegexForToken(token,config){return hasOwnProp(regexes,token)?regexes[token](config._strict,config._locale):new RegExp(unescapeFormat(token))}function unescapeFormat(s){return regexEscape(s.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(matched,p1,p2,p3,p4){return p1||p2||p3||p4})))}function regexEscape(s){return s.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var tokens={};function addParseToken(token,callback){var i,func=callback;for("string"==typeof token&&(token=[token]),isNumber(callback)&&(func=function(input,array){array[callback]=toInt(input)}),i=0;i68?1900:2e3)};var indexOf,getSetYear=makeGetSet("FullYear",!0);function getIsLeapYear(){return isLeapYear(this.year())}function makeGetSet(unit,keepTime){return function(value){return null!=value?(set$1(this,unit,value),hooks.updateOffset(this,keepTime),this):get(this,unit)}}function get(mom,unit){return mom.isValid()?mom._d["get"+(mom._isUTC?"UTC":"")+unit]():NaN}function set$1(mom,unit,value){mom.isValid()&&!isNaN(value)&&("FullYear"===unit&&isLeapYear(mom.year())&&1===mom.month()&&29===mom.date()?mom._d["set"+(mom._isUTC?"UTC":"")+unit](value,mom.month(),daysInMonth(value,mom.month())):mom._d["set"+(mom._isUTC?"UTC":"")+unit](value))}function stringGet(units){return isFunction(this[units=normalizeUnits(units)])?this[units]():this}function stringSet(units,value){if("object"===_typeof(units))for(var prioritized=getPrioritizedUnits(units=normalizeObjectUnits(units)),i=0;i=0?(date=new Date(y+400,m,d,h,M,s,ms),isFinite(date.getFullYear())&&date.setFullYear(y)):date=new Date(y,m,d,h,M,s,ms),date}function createUTCDate(y){var date;if(y<100&&y>=0){var args=Array.prototype.slice.call(arguments);args[0]=y+400,date=new Date(Date.UTC.apply(null,args)),isFinite(date.getUTCFullYear())&&date.setUTCFullYear(y)}else date=new Date(Date.UTC.apply(null,arguments));return date}function firstWeekOffset(year,dow,doy){var fwd=7+dow-doy;return-(7+createUTCDate(year,0,fwd).getUTCDay()-dow)%7+fwd-1}function dayOfYearFromWeeks(year,week,weekday,dow,doy){var resYear,resDayOfYear,dayOfYear=1+7*(week-1)+(7+weekday-dow)%7+firstWeekOffset(year,dow,doy);return dayOfYear<=0?resDayOfYear=daysInYear(resYear=year-1)+dayOfYear:dayOfYear>daysInYear(year)?(resYear=year+1,resDayOfYear=dayOfYear-daysInYear(year)):(resYear=year,resDayOfYear=dayOfYear),{year:resYear,dayOfYear:resDayOfYear}}function weekOfYear(mom,dow,doy){var resWeek,resYear,weekOffset=firstWeekOffset(mom.year(),dow,doy),week=Math.floor((mom.dayOfYear()-weekOffset-1)/7)+1;return week<1?resWeek=week+weeksInYear(resYear=mom.year()-1,dow,doy):week>weeksInYear(mom.year(),dow,doy)?(resWeek=week-weeksInYear(mom.year(),dow,doy),resYear=mom.year()+1):(resYear=mom.year(),resWeek=week),{week:resWeek,year:resYear}}function weeksInYear(year,dow,doy){var weekOffset=firstWeekOffset(year,dow,doy),weekOffsetNext=firstWeekOffset(year+1,dow,doy);return(daysInYear(year)-weekOffset+weekOffsetNext)/7}function localeWeek(mom){return weekOfYear(mom,this._week.dow,this._week.doy).week}addFormatToken("w",["ww",2],"wo","week"),addFormatToken("W",["WW",2],"Wo","isoWeek"),addUnitAlias("week","w"),addUnitAlias("isoWeek","W"),addUnitPriority("week",5),addUnitPriority("isoWeek",5),addRegexToken("w",match1to2),addRegexToken("ww",match1to2,match2),addRegexToken("W",match1to2),addRegexToken("WW",match1to2,match2),addWeekParseToken(["w","ww","W","WW"],(function(input,week,config,token){week[token.substr(0,1)]=toInt(input)}));var defaultLocaleWeek={dow:0,doy:6};function localeFirstDayOfWeek(){return this._week.dow}function localeFirstDayOfYear(){return this._week.doy}function getSetWeek(input){var week=this.localeData().week(this);return null==input?week:this.add(7*(input-week),"d")}function getSetISOWeek(input){var week=weekOfYear(this,1,4).week;return null==input?week:this.add(7*(input-week),"d")}function parseWeekday(input,locale){return"string"!=typeof input?input:isNaN(input)?"number"==typeof(input=locale.weekdaysParse(input))?input:null:parseInt(input,10)}function parseIsoWeekday(input,locale){return"string"==typeof input?locale.weekdaysParse(input)%7||7:isNaN(input)?null:input}function shiftWeekdays(ws,n){return ws.slice(n,7).concat(ws.slice(0,n))}addFormatToken("d",0,"do","day"),addFormatToken("dd",0,0,(function(format){return this.localeData().weekdaysMin(this,format)})),addFormatToken("ddd",0,0,(function(format){return this.localeData().weekdaysShort(this,format)})),addFormatToken("dddd",0,0,(function(format){return this.localeData().weekdays(this,format)})),addFormatToken("e",0,0,"weekday"),addFormatToken("E",0,0,"isoWeekday"),addUnitAlias("day","d"),addUnitAlias("weekday","e"),addUnitAlias("isoWeekday","E"),addUnitPriority("day",11),addUnitPriority("weekday",11),addUnitPriority("isoWeekday",11),addRegexToken("d",match1to2),addRegexToken("e",match1to2),addRegexToken("E",match1to2),addRegexToken("dd",(function(isStrict,locale){return locale.weekdaysMinRegex(isStrict)})),addRegexToken("ddd",(function(isStrict,locale){return locale.weekdaysShortRegex(isStrict)})),addRegexToken("dddd",(function(isStrict,locale){return locale.weekdaysRegex(isStrict)})),addWeekParseToken(["dd","ddd","dddd"],(function(input,week,config,token){var weekday=config._locale.weekdaysParse(input,token,config._strict);null!=weekday?week.d=weekday:getParsingFlags(config).invalidWeekday=input})),addWeekParseToken(["d","e","E"],(function(input,week,config,token){week[token]=toInt(input)}));var defaultLocaleWeekdays="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");function localeWeekdays(m,format){var weekdays=isArray(this._weekdays)?this._weekdays:this._weekdays[m&&!0!==m&&this._weekdays.isFormat.test(format)?"format":"standalone"];return!0===m?shiftWeekdays(weekdays,this._week.dow):m?weekdays[m.day()]:weekdays}var defaultLocaleWeekdaysShort="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");function localeWeekdaysShort(m){return!0===m?shiftWeekdays(this._weekdaysShort,this._week.dow):m?this._weekdaysShort[m.day()]:this._weekdaysShort}var defaultLocaleWeekdaysMin="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function localeWeekdaysMin(m){return!0===m?shiftWeekdays(this._weekdaysMin,this._week.dow):m?this._weekdaysMin[m.day()]:this._weekdaysMin}function handleStrictParse$1(weekdayName,format,strict){var i,ii,mom,llc=weekdayName.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)mom=createUTC([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(mom,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(mom,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(mom,"").toLocaleLowerCase();return strict?"dddd"===format?-1!==(ii=indexOf.call(this._weekdaysParse,llc))?ii:null:"ddd"===format?-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))?ii:null:-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))?ii:null:"dddd"===format?-1!==(ii=indexOf.call(this._weekdaysParse,llc))||-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))||-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))?ii:null:"ddd"===format?-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))||-1!==(ii=indexOf.call(this._weekdaysParse,llc))||-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))?ii:null:-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))||-1!==(ii=indexOf.call(this._weekdaysParse,llc))||-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))?ii:null}function localeWeekdaysParse(weekdayName,format,strict){var i,mom,regex;if(this._weekdaysParseExact)return handleStrictParse$1.call(this,weekdayName,format,strict);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(mom=createUTC([2e3,1]).day(i),strict&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(mom,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(mom,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(mom,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[i]||(regex="^"+this.weekdays(mom,"")+"|^"+this.weekdaysShort(mom,"")+"|^"+this.weekdaysMin(mom,""),this._weekdaysParse[i]=new RegExp(regex.replace(".",""),"i")),strict&&"dddd"===format&&this._fullWeekdaysParse[i].test(weekdayName))return i;if(strict&&"ddd"===format&&this._shortWeekdaysParse[i].test(weekdayName))return i;if(strict&&"dd"===format&&this._minWeekdaysParse[i].test(weekdayName))return i;if(!strict&&this._weekdaysParse[i].test(weekdayName))return i}}function getSetDayOfWeek(input){if(!this.isValid())return null!=input?this:NaN;var day=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=input?(input=parseWeekday(input,this.localeData()),this.add(input-day,"d")):day}function getSetLocaleDayOfWeek(input){if(!this.isValid())return null!=input?this:NaN;var weekday=(this.day()+7-this.localeData()._week.dow)%7;return null==input?weekday:this.add(input-weekday,"d")}function getSetISODayOfWeek(input){if(!this.isValid())return null!=input?this:NaN;if(null!=input){var weekday=parseIsoWeekday(input,this.localeData());return this.day(this.day()%7?weekday:weekday-7)}return this.day()||7}var defaultWeekdaysRegex=matchWord;function weekdaysRegex(isStrict){return this._weekdaysParseExact?(hasOwnProp(this,"_weekdaysRegex")||computeWeekdaysParse.call(this),isStrict?this._weekdaysStrictRegex:this._weekdaysRegex):(hasOwnProp(this,"_weekdaysRegex")||(this._weekdaysRegex=defaultWeekdaysRegex),this._weekdaysStrictRegex&&isStrict?this._weekdaysStrictRegex:this._weekdaysRegex)}var defaultWeekdaysShortRegex=matchWord;function weekdaysShortRegex(isStrict){return this._weekdaysParseExact?(hasOwnProp(this,"_weekdaysRegex")||computeWeekdaysParse.call(this),isStrict?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(hasOwnProp(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=defaultWeekdaysShortRegex),this._weekdaysShortStrictRegex&&isStrict?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}var defaultWeekdaysMinRegex=matchWord;function weekdaysMinRegex(isStrict){return this._weekdaysParseExact?(hasOwnProp(this,"_weekdaysRegex")||computeWeekdaysParse.call(this),isStrict?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(hasOwnProp(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=defaultWeekdaysMinRegex),this._weekdaysMinStrictRegex&&isStrict?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function computeWeekdaysParse(){function cmpLenRev(a,b){return b.length-a.length}var i,mom,minp,shortp,longp,minPieces=[],shortPieces=[],longPieces=[],mixedPieces=[];for(i=0;i<7;i++)mom=createUTC([2e3,1]).day(i),minp=this.weekdaysMin(mom,""),shortp=this.weekdaysShort(mom,""),longp=this.weekdays(mom,""),minPieces.push(minp),shortPieces.push(shortp),longPieces.push(longp),mixedPieces.push(minp),mixedPieces.push(shortp),mixedPieces.push(longp);for(minPieces.sort(cmpLenRev),shortPieces.sort(cmpLenRev),longPieces.sort(cmpLenRev),mixedPieces.sort(cmpLenRev),i=0;i<7;i++)shortPieces[i]=regexEscape(shortPieces[i]),longPieces[i]=regexEscape(longPieces[i]),mixedPieces[i]=regexEscape(mixedPieces[i]);this._weekdaysRegex=new RegExp("^("+mixedPieces.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+longPieces.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+shortPieces.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+minPieces.join("|")+")","i")}function hFormat(){return this.hours()%12||12}function kFormat(){return this.hours()||24}function meridiem(token,lowercase){addFormatToken(token,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),lowercase)}))}function matchMeridiem(isStrict,locale){return locale._meridiemParse}function localeIsPM(input){return"p"===(input+"").toLowerCase().charAt(0)}addFormatToken("H",["HH",2],0,"hour"),addFormatToken("h",["hh",2],0,hFormat),addFormatToken("k",["kk",2],0,kFormat),addFormatToken("hmm",0,0,(function(){return""+hFormat.apply(this)+zeroFill(this.minutes(),2)})),addFormatToken("hmmss",0,0,(function(){return""+hFormat.apply(this)+zeroFill(this.minutes(),2)+zeroFill(this.seconds(),2)})),addFormatToken("Hmm",0,0,(function(){return""+this.hours()+zeroFill(this.minutes(),2)})),addFormatToken("Hmmss",0,0,(function(){return""+this.hours()+zeroFill(this.minutes(),2)+zeroFill(this.seconds(),2)})),meridiem("a",!0),meridiem("A",!1),addUnitAlias("hour","h"),addUnitPriority("hour",13),addRegexToken("a",matchMeridiem),addRegexToken("A",matchMeridiem),addRegexToken("H",match1to2),addRegexToken("h",match1to2),addRegexToken("k",match1to2),addRegexToken("HH",match1to2,match2),addRegexToken("hh",match1to2,match2),addRegexToken("kk",match1to2,match2),addRegexToken("hmm",match3to4),addRegexToken("hmmss",match5to6),addRegexToken("Hmm",match3to4),addRegexToken("Hmmss",match5to6),addParseToken(["H","HH"],HOUR),addParseToken(["k","kk"],(function(input,array,config){var kInput=toInt(input);array[HOUR]=24===kInput?0:kInput})),addParseToken(["a","A"],(function(input,array,config){config._isPm=config._locale.isPM(input),config._meridiem=input})),addParseToken(["h","hh"],(function(input,array,config){array[HOUR]=toInt(input),getParsingFlags(config).bigHour=!0})),addParseToken("hmm",(function(input,array,config){var pos=input.length-2;array[HOUR]=toInt(input.substr(0,pos)),array[MINUTE]=toInt(input.substr(pos)),getParsingFlags(config).bigHour=!0})),addParseToken("hmmss",(function(input,array,config){var pos1=input.length-4,pos2=input.length-2;array[HOUR]=toInt(input.substr(0,pos1)),array[MINUTE]=toInt(input.substr(pos1,2)),array[SECOND]=toInt(input.substr(pos2)),getParsingFlags(config).bigHour=!0})),addParseToken("Hmm",(function(input,array,config){var pos=input.length-2;array[HOUR]=toInt(input.substr(0,pos)),array[MINUTE]=toInt(input.substr(pos))})),addParseToken("Hmmss",(function(input,array,config){var pos1=input.length-4,pos2=input.length-2;array[HOUR]=toInt(input.substr(0,pos1)),array[MINUTE]=toInt(input.substr(pos1,2)),array[SECOND]=toInt(input.substr(pos2))}));var defaultLocaleMeridiemParse=/[ap]\.?m?\.?/i;function localeMeridiem(hours,minutes,isLower){return hours>11?isLower?"pm":"PM":isLower?"am":"AM"}var globalLocale,getSetHour=makeGetSet("Hours",!0),baseConfig={calendar:defaultCalendar,longDateFormat:defaultLongDateFormat,invalidDate:defaultInvalidDate,ordinal:defaultOrdinal,dayOfMonthOrdinalParse:defaultDayOfMonthOrdinalParse,relativeTime:defaultRelativeTime,months:defaultLocaleMonths,monthsShort:defaultLocaleMonthsShort,week:defaultLocaleWeek,weekdays:defaultLocaleWeekdays,weekdaysMin:defaultLocaleWeekdaysMin,weekdaysShort:defaultLocaleWeekdaysShort,meridiemParse:defaultLocaleMeridiemParse},locales={},localeFamilies={};function normalizeLocale(key){return key?key.toLowerCase().replace("_","-"):key}function chooseLocale(names){for(var j,next,locale,split,i=0;i0;){if(locale=loadLocale(split.slice(0,j).join("-")))return locale;if(next&&next.length>=j&&compareArrays(split,next,!0)>=j-1)break;j--}i++}return globalLocale}function loadLocale(name){var oldLocale=null;if(!locales[name]&&module&&module.exports)try{oldLocale=globalLocale._abbr,commonjsRequire(),getSetGlobalLocale(oldLocale)}catch(e){}return locales[name]}function getSetGlobalLocale(key,values){var data;return key&&((data=isUndefined(values)?getLocale(key):defineLocale(key,values))?globalLocale=data:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+key+" not found. Did you forget to load it?")),globalLocale._abbr}function defineLocale(name,config){if(null!==config){var locale,parentConfig=baseConfig;if(config.abbr=name,null!=locales[name])deprecateSimple("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),parentConfig=locales[name]._config;else if(null!=config.parentLocale)if(null!=locales[config.parentLocale])parentConfig=locales[config.parentLocale]._config;else{if(null==(locale=loadLocale(config.parentLocale)))return localeFamilies[config.parentLocale]||(localeFamilies[config.parentLocale]=[]),localeFamilies[config.parentLocale].push({name:name,config:config}),null;parentConfig=locale._config}return locales[name]=new Locale(mergeConfigs(parentConfig,config)),localeFamilies[name]&&localeFamilies[name].forEach((function(x){defineLocale(x.name,x.config)})),getSetGlobalLocale(name),locales[name]}return delete locales[name],null}function updateLocale(name,config){if(null!=config){var locale,tmpLocale,parentConfig=baseConfig;null!=(tmpLocale=loadLocale(name))&&(parentConfig=tmpLocale._config),(locale=new Locale(config=mergeConfigs(parentConfig,config))).parentLocale=locales[name],locales[name]=locale,getSetGlobalLocale(name)}else null!=locales[name]&&(null!=locales[name].parentLocale?locales[name]=locales[name].parentLocale:null!=locales[name]&&delete locales[name]);return locales[name]}function getLocale(key){var locale;if(key&&key._locale&&key._locale._abbr&&(key=key._locale._abbr),!key)return globalLocale;if(!isArray(key)){if(locale=loadLocale(key))return locale;key=[key]}return chooseLocale(key)}function listLocales(){return keys(locales)}function checkOverflow(m){var overflow,a=m._a;return a&&-2===getParsingFlags(m).overflow&&(overflow=a[MONTH]<0||a[MONTH]>11?MONTH:a[DATE]<1||a[DATE]>daysInMonth(a[YEAR],a[MONTH])?DATE:a[HOUR]<0||a[HOUR]>24||24===a[HOUR]&&(0!==a[MINUTE]||0!==a[SECOND]||0!==a[MILLISECOND])?HOUR:a[MINUTE]<0||a[MINUTE]>59?MINUTE:a[SECOND]<0||a[SECOND]>59?SECOND:a[MILLISECOND]<0||a[MILLISECOND]>999?MILLISECOND:-1,getParsingFlags(m)._overflowDayOfYear&&(overflowDATE)&&(overflow=DATE),getParsingFlags(m)._overflowWeeks&&-1===overflow&&(overflow=WEEK),getParsingFlags(m)._overflowWeekday&&-1===overflow&&(overflow=WEEKDAY),getParsingFlags(m).overflow=overflow),m}function defaults(a,b,c){return null!=a?a:null!=b?b:c}function currentDateArray(config){var nowValue=new Date(hooks.now());return config._useUTC?[nowValue.getUTCFullYear(),nowValue.getUTCMonth(),nowValue.getUTCDate()]:[nowValue.getFullYear(),nowValue.getMonth(),nowValue.getDate()]}function configFromArray(config){var i,date,currentDate,expectedWeekday,yearToUse,input=[];if(!config._d){for(currentDate=currentDateArray(config),config._w&&null==config._a[DATE]&&null==config._a[MONTH]&&dayOfYearFromWeekInfo(config),null!=config._dayOfYear&&(yearToUse=defaults(config._a[YEAR],currentDate[YEAR]),(config._dayOfYear>daysInYear(yearToUse)||0===config._dayOfYear)&&(getParsingFlags(config)._overflowDayOfYear=!0),date=createUTCDate(yearToUse,0,config._dayOfYear),config._a[MONTH]=date.getUTCMonth(),config._a[DATE]=date.getUTCDate()),i=0;i<3&&null==config._a[i];++i)config._a[i]=input[i]=currentDate[i];for(;i<7;i++)config._a[i]=input[i]=null==config._a[i]?2===i?1:0:config._a[i];24===config._a[HOUR]&&0===config._a[MINUTE]&&0===config._a[SECOND]&&0===config._a[MILLISECOND]&&(config._nextDay=!0,config._a[HOUR]=0),config._d=(config._useUTC?createUTCDate:createDate).apply(null,input),expectedWeekday=config._useUTC?config._d.getUTCDay():config._d.getDay(),null!=config._tzm&&config._d.setUTCMinutes(config._d.getUTCMinutes()-config._tzm),config._nextDay&&(config._a[HOUR]=24),config._w&&void 0!==config._w.d&&config._w.d!==expectedWeekday&&(getParsingFlags(config).weekdayMismatch=!0)}}function dayOfYearFromWeekInfo(config){var w,weekYear,week,weekday,dow,doy,temp,weekdayOverflow;if(null!=(w=config._w).GG||null!=w.W||null!=w.E)dow=1,doy=4,weekYear=defaults(w.GG,config._a[YEAR],weekOfYear(createLocal(),1,4).year),week=defaults(w.W,1),((weekday=defaults(w.E,1))<1||weekday>7)&&(weekdayOverflow=!0);else{dow=config._locale._week.dow,doy=config._locale._week.doy;var curWeek=weekOfYear(createLocal(),dow,doy);weekYear=defaults(w.gg,config._a[YEAR],curWeek.year),week=defaults(w.w,curWeek.week),null!=w.d?((weekday=w.d)<0||weekday>6)&&(weekdayOverflow=!0):null!=w.e?(weekday=w.e+dow,(w.e<0||w.e>6)&&(weekdayOverflow=!0)):weekday=dow}week<1||week>weeksInYear(weekYear,dow,doy)?getParsingFlags(config)._overflowWeeks=!0:null!=weekdayOverflow?getParsingFlags(config)._overflowWeekday=!0:(temp=dayOfYearFromWeeks(weekYear,week,weekday,dow,doy),config._a[YEAR]=temp.year,config._dayOfYear=temp.dayOfYear)}var extendedIsoRegex=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,basicIsoRegex=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,tzRegex=/Z|[+-]\d\d(?::?\d\d)?/,isoDates=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],isoTimes=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],aspNetJsonRegex=/^\/?Date\((\-?\d+)/i;function configFromISO(config){var i,l,allowTime,dateFormat,timeFormat,tzFormat,string=config._i,match=extendedIsoRegex.exec(string)||basicIsoRegex.exec(string);if(match){for(getParsingFlags(config).iso=!0,i=0,l=isoDates.length;i0&&getParsingFlags(config).unusedInput.push(skipped),string=string.slice(string.indexOf(parsedInput)+parsedInput.length),totalParsedInputLength+=parsedInput.length),formatTokenFunctions[token]?(parsedInput?getParsingFlags(config).empty=!1:getParsingFlags(config).unusedTokens.push(token),addTimeToArrayFromToken(token,parsedInput,config)):config._strict&&!parsedInput&&getParsingFlags(config).unusedTokens.push(token);getParsingFlags(config).charsLeftOver=stringLength-totalParsedInputLength,string.length>0&&getParsingFlags(config).unusedInput.push(string),config._a[HOUR]<=12&&!0===getParsingFlags(config).bigHour&&config._a[HOUR]>0&&(getParsingFlags(config).bigHour=void 0),getParsingFlags(config).parsedDateParts=config._a.slice(0),getParsingFlags(config).meridiem=config._meridiem,config._a[HOUR]=meridiemFixWrap(config._locale,config._a[HOUR],config._meridiem),configFromArray(config),checkOverflow(config)}else configFromRFC2822(config);else configFromISO(config)}function meridiemFixWrap(locale,hour,meridiem){var isPm;return null==meridiem?hour:null!=locale.meridiemHour?locale.meridiemHour(hour,meridiem):null!=locale.isPM?((isPm=locale.isPM(meridiem))&&hour<12&&(hour+=12),isPm||12!==hour||(hour=0),hour):hour}function configFromStringAndArray(config){var tempConfig,bestMoment,scoreToBeat,i,currentScore;if(0===config._f.length)return getParsingFlags(config).invalidFormat=!0,void(config._d=new Date(NaN));for(i=0;ithis?this:other:createInvalid()}));function pickBy(fn,moments){var res,i;if(1===moments.length&&isArray(moments[0])&&(moments=moments[0]),!moments.length)return createLocal();for(res=moments[0],i=1;ithis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function isDaylightSavingTimeShifted(){if(!isUndefined(this._isDSTShifted))return this._isDSTShifted;var c={};if(copyConfig(c,this),(c=prepareConfig(c))._a){var other=c._isUTC?createUTC(c._a):createLocal(c._a);this._isDSTShifted=this.isValid()&&compareArrays(c._a,other.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function isLocal(){return!!this.isValid()&&!this._isUTC}function isUtcOffset(){return!!this.isValid()&&this._isUTC}function isUtc(){return!!this.isValid()&&this._isUTC&&0===this._offset}hooks.updateOffset=function(){};var aspNetRegex=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,isoRegex=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function createDuration(input,key){var sign,ret,diffRes,duration=input,match=null;return isDuration(input)?duration={ms:input._milliseconds,d:input._days,M:input._months}:isNumber(input)?(duration={},key?duration[key]=input:duration.milliseconds=input):(match=aspNetRegex.exec(input))?(sign="-"===match[1]?-1:1,duration={y:0,d:toInt(match[DATE])*sign,h:toInt(match[HOUR])*sign,m:toInt(match[MINUTE])*sign,s:toInt(match[SECOND])*sign,ms:toInt(absRound(1e3*match[MILLISECOND]))*sign}):(match=isoRegex.exec(input))?(sign="-"===match[1]?-1:1,duration={y:parseIso(match[2],sign),M:parseIso(match[3],sign),w:parseIso(match[4],sign),d:parseIso(match[5],sign),h:parseIso(match[6],sign),m:parseIso(match[7],sign),s:parseIso(match[8],sign)}):null==duration?duration={}:"object"===_typeof(duration)&&("from"in duration||"to"in duration)&&(diffRes=momentsDifference(createLocal(duration.from),createLocal(duration.to)),(duration={}).ms=diffRes.milliseconds,duration.M=diffRes.months),ret=new Duration(duration),isDuration(input)&&hasOwnProp(input,"_locale")&&(ret._locale=input._locale),ret}function parseIso(inp,sign){var res=inp&&parseFloat(inp.replace(",","."));return(isNaN(res)?0:res)*sign}function positiveMomentsDifference(base,other){var res={};return res.months=other.month()-base.month()+12*(other.year()-base.year()),base.clone().add(res.months,"M").isAfter(other)&&--res.months,res.milliseconds=+other-+base.clone().add(res.months,"M"),res}function momentsDifference(base,other){var res;return base.isValid()&&other.isValid()?(other=cloneWithOffset(other,base),base.isBefore(other)?res=positiveMomentsDifference(base,other):((res=positiveMomentsDifference(other,base)).milliseconds=-res.milliseconds,res.months=-res.months),res):{milliseconds:0,months:0}}function createAdder(direction,name){return function(val,period){var tmp;return null===period||isNaN(+period)||(deprecateSimple(name,"moment()."+name+"(period, number) is deprecated. Please use moment()."+name+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),tmp=val,val=period,period=tmp),addSubtract(this,createDuration(val="string"==typeof val?+val:val,period),direction),this}}function addSubtract(mom,duration,isAdding,updateOffset){var milliseconds=duration._milliseconds,days=absRound(duration._days),months=absRound(duration._months);mom.isValid()&&(updateOffset=null==updateOffset||updateOffset,months&&setMonth(mom,get(mom,"Month")+months*isAdding),days&&set$1(mom,"Date",get(mom,"Date")+days*isAdding),milliseconds&&mom._d.setTime(mom._d.valueOf()+milliseconds*isAdding),updateOffset&&hooks.updateOffset(mom,days||months))}createDuration.fn=Duration.prototype,createDuration.invalid=createInvalid$1;var add=createAdder(1,"add"),subtract=createAdder(-1,"subtract");function getCalendarFormat(myMoment,now){var diff=myMoment.diff(now,"days",!0);return diff<-6?"sameElse":diff<-1?"lastWeek":diff<0?"lastDay":diff<1?"sameDay":diff<2?"nextDay":diff<7?"nextWeek":"sameElse"}function calendar$1(time,formats){var now=time||createLocal(),sod=cloneWithOffset(now,this).startOf("day"),format=hooks.calendarFormat(this,sod)||"sameElse",output=formats&&(isFunction(formats[format])?formats[format].call(this,now):formats[format]);return this.format(output||this.localeData().calendar(format,this,createLocal(now)))}function clone(){return new Moment(this)}function isAfter(input,units){var localInput=isMoment(input)?input:createLocal(input);return!(!this.isValid()||!localInput.isValid())&&("millisecond"===(units=normalizeUnits(units)||"millisecond")?this.valueOf()>localInput.valueOf():localInput.valueOf()9999?formatMoment(m,utc?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):isFunction(Date.prototype.toISOString)?utc?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",formatMoment(m,"Z")):formatMoment(m,utc?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function inspect(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var func="moment",zone="";this.isLocal()||(func=0===this.utcOffset()?"moment.utc":"moment.parseZone",zone="Z");var prefix="["+func+'("]',year=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",datetime="-MM-DD[T]HH:mm:ss.SSS",suffix=zone+'[")]';return this.format(prefix+year+datetime+suffix)}function format(inputString){inputString||(inputString=this.isUtc()?hooks.defaultFormatUtc:hooks.defaultFormat);var output=formatMoment(this,inputString);return this.localeData().postformat(output)}function from(time,withoutSuffix){return this.isValid()&&(isMoment(time)&&time.isValid()||createLocal(time).isValid())?createDuration({to:this,from:time}).locale(this.locale()).humanize(!withoutSuffix):this.localeData().invalidDate()}function fromNow(withoutSuffix){return this.from(createLocal(),withoutSuffix)}function to(time,withoutSuffix){return this.isValid()&&(isMoment(time)&&time.isValid()||createLocal(time).isValid())?createDuration({from:this,to:time}).locale(this.locale()).humanize(!withoutSuffix):this.localeData().invalidDate()}function toNow(withoutSuffix){return this.to(createLocal(),withoutSuffix)}function locale(key){var newLocaleData;return void 0===key?this._locale._abbr:(null!=(newLocaleData=getLocale(key))&&(this._locale=newLocaleData),this)}hooks.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",hooks.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var lang=deprecate("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(key){return void 0===key?this.localeData():this.locale(key)}));function localeData(){return this._locale}var MS_PER_SECOND=1e3,MS_PER_MINUTE=60*MS_PER_SECOND,MS_PER_HOUR=60*MS_PER_MINUTE,MS_PER_400_YEARS=3506328*MS_PER_HOUR;function mod$1(dividend,divisor){return(dividend%divisor+divisor)%divisor}function localStartOfDate(y,m,d){return y<100&&y>=0?new Date(y+400,m,d)-MS_PER_400_YEARS:new Date(y,m,d).valueOf()}function utcStartOfDate(y,m,d){return y<100&&y>=0?Date.UTC(y+400,m,d)-MS_PER_400_YEARS:Date.UTC(y,m,d)}function startOf(units){var time;if(void 0===(units=normalizeUnits(units))||"millisecond"===units||!this.isValid())return this;var startOfDate=this._isUTC?utcStartOfDate:localStartOfDate;switch(units){case"year":time=startOfDate(this.year(),0,1);break;case"quarter":time=startOfDate(this.year(),this.month()-this.month()%3,1);break;case"month":time=startOfDate(this.year(),this.month(),1);break;case"week":time=startOfDate(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":time=startOfDate(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":time=startOfDate(this.year(),this.month(),this.date());break;case"hour":time=this._d.valueOf(),time-=mod$1(time+(this._isUTC?0:this.utcOffset()*MS_PER_MINUTE),MS_PER_HOUR);break;case"minute":time=this._d.valueOf(),time-=mod$1(time,MS_PER_MINUTE);break;case"second":time=this._d.valueOf(),time-=mod$1(time,MS_PER_SECOND)}return this._d.setTime(time),hooks.updateOffset(this,!0),this}function endOf(units){var time;if(void 0===(units=normalizeUnits(units))||"millisecond"===units||!this.isValid())return this;var startOfDate=this._isUTC?utcStartOfDate:localStartOfDate;switch(units){case"year":time=startOfDate(this.year()+1,0,1)-1;break;case"quarter":time=startOfDate(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":time=startOfDate(this.year(),this.month()+1,1)-1;break;case"week":time=startOfDate(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":time=startOfDate(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":time=startOfDate(this.year(),this.month(),this.date()+1)-1;break;case"hour":time=this._d.valueOf(),time+=MS_PER_HOUR-mod$1(time+(this._isUTC?0:this.utcOffset()*MS_PER_MINUTE),MS_PER_HOUR)-1;break;case"minute":time=this._d.valueOf(),time+=MS_PER_MINUTE-mod$1(time,MS_PER_MINUTE)-1;break;case"second":time=this._d.valueOf(),time+=MS_PER_SECOND-mod$1(time,MS_PER_SECOND)-1}return this._d.setTime(time),hooks.updateOffset(this,!0),this}function valueOf(){return this._d.valueOf()-6e4*(this._offset||0)}function unix(){return Math.floor(this.valueOf()/1e3)}function toDate(){return new Date(this.valueOf())}function toArray(){var m=this;return[m.year(),m.month(),m.date(),m.hour(),m.minute(),m.second(),m.millisecond()]}function toObject(){var m=this;return{years:m.year(),months:m.month(),date:m.date(),hours:m.hours(),minutes:m.minutes(),seconds:m.seconds(),milliseconds:m.milliseconds()}}function toJSON(){return this.isValid()?this.toISOString():null}function isValid$2(){return isValid(this)}function parsingFlags(){return extend({},getParsingFlags(this))}function invalidAt(){return getParsingFlags(this).overflow}function creationData(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function addWeekYearFormatToken(token,getter){addFormatToken(0,[token,token.length],0,getter)}function getSetWeekYear(input){return getSetWeekYearHelper.call(this,input,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function getSetISOWeekYear(input){return getSetWeekYearHelper.call(this,input,this.isoWeek(),this.isoWeekday(),1,4)}function getISOWeeksInYear(){return weeksInYear(this.year(),1,4)}function getWeeksInYear(){var weekInfo=this.localeData()._week;return weeksInYear(this.year(),weekInfo.dow,weekInfo.doy)}function getSetWeekYearHelper(input,week,weekday,dow,doy){var weeksTarget;return null==input?weekOfYear(this,dow,doy).year:(week>(weeksTarget=weeksInYear(input,dow,doy))&&(week=weeksTarget),setWeekAll.call(this,input,week,weekday,dow,doy))}function setWeekAll(weekYear,week,weekday,dow,doy){var dayOfYearData=dayOfYearFromWeeks(weekYear,week,weekday,dow,doy),date=createUTCDate(dayOfYearData.year,0,dayOfYearData.dayOfYear);return this.year(date.getUTCFullYear()),this.month(date.getUTCMonth()),this.date(date.getUTCDate()),this}function getSetQuarter(input){return null==input?Math.ceil((this.month()+1)/3):this.month(3*(input-1)+this.month()%3)}addFormatToken(0,["gg",2],0,(function(){return this.weekYear()%100})),addFormatToken(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),addWeekYearFormatToken("gggg","weekYear"),addWeekYearFormatToken("ggggg","weekYear"),addWeekYearFormatToken("GGGG","isoWeekYear"),addWeekYearFormatToken("GGGGG","isoWeekYear"),addUnitAlias("weekYear","gg"),addUnitAlias("isoWeekYear","GG"),addUnitPriority("weekYear",1),addUnitPriority("isoWeekYear",1),addRegexToken("G",matchSigned),addRegexToken("g",matchSigned),addRegexToken("GG",match1to2,match2),addRegexToken("gg",match1to2,match2),addRegexToken("GGGG",match1to4,match4),addRegexToken("gggg",match1to4,match4),addRegexToken("GGGGG",match1to6,match6),addRegexToken("ggggg",match1to6,match6),addWeekParseToken(["gggg","ggggg","GGGG","GGGGG"],(function(input,week,config,token){week[token.substr(0,2)]=toInt(input)})),addWeekParseToken(["gg","GG"],(function(input,week,config,token){week[token]=hooks.parseTwoDigitYear(input)})),addFormatToken("Q",0,"Qo","quarter"),addUnitAlias("quarter","Q"),addUnitPriority("quarter",7),addRegexToken("Q",match1),addParseToken("Q",(function(input,array){array[MONTH]=3*(toInt(input)-1)})),addFormatToken("D",["DD",2],"Do","date"),addUnitAlias("date","D"),addUnitPriority("date",9),addRegexToken("D",match1to2),addRegexToken("DD",match1to2,match2),addRegexToken("Do",(function(isStrict,locale){return isStrict?locale._dayOfMonthOrdinalParse||locale._ordinalParse:locale._dayOfMonthOrdinalParseLenient})),addParseToken(["D","DD"],DATE),addParseToken("Do",(function(input,array){array[DATE]=toInt(input.match(match1to2)[0])}));var getSetDayOfMonth=makeGetSet("Date",!0);function getSetDayOfYear(input){var dayOfYear=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==input?dayOfYear:this.add(input-dayOfYear,"d")}addFormatToken("DDD",["DDDD",3],"DDDo","dayOfYear"),addUnitAlias("dayOfYear","DDD"),addUnitPriority("dayOfYear",4),addRegexToken("DDD",match1to3),addRegexToken("DDDD",match3),addParseToken(["DDD","DDDD"],(function(input,array,config){config._dayOfYear=toInt(input)})),addFormatToken("m",["mm",2],0,"minute"),addUnitAlias("minute","m"),addUnitPriority("minute",14),addRegexToken("m",match1to2),addRegexToken("mm",match1to2,match2),addParseToken(["m","mm"],MINUTE);var getSetMinute=makeGetSet("Minutes",!1);addFormatToken("s",["ss",2],0,"second"),addUnitAlias("second","s"),addUnitPriority("second",15),addRegexToken("s",match1to2),addRegexToken("ss",match1to2,match2),addParseToken(["s","ss"],SECOND);var token,getSetSecond=makeGetSet("Seconds",!1);for(addFormatToken("S",0,0,(function(){return~~(this.millisecond()/100)})),addFormatToken(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),addFormatToken(0,["SSS",3],0,"millisecond"),addFormatToken(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),addFormatToken(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),addFormatToken(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),addFormatToken(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),addFormatToken(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),addFormatToken(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),addUnitAlias("millisecond","ms"),addUnitPriority("millisecond",16),addRegexToken("S",match1to3,match1),addRegexToken("SS",match1to3,match2),addRegexToken("SSS",match1to3,match3),token="SSSS";token.length<=9;token+="S")addRegexToken(token,matchUnsigned);function parseMs(input,array){array[MILLISECOND]=toInt(1e3*("0."+input))}for(token="S";token.length<=9;token+="S")addParseToken(token,parseMs);var getSetMillisecond=makeGetSet("Milliseconds",!1);function getZoneAbbr(){return this._isUTC?"UTC":""}function getZoneName(){return this._isUTC?"Coordinated Universal Time":""}addFormatToken("z",0,0,"zoneAbbr"),addFormatToken("zz",0,0,"zoneName");var proto=Moment.prototype;function createUnix(input){return createLocal(1e3*input)}function createInZone(){return createLocal.apply(null,arguments).parseZone()}function preParsePostFormat(string){return string}proto.add=add,proto.calendar=calendar$1,proto.clone=clone,proto.diff=diff,proto.endOf=endOf,proto.format=format,proto.from=from,proto.fromNow=fromNow,proto.to=to,proto.toNow=toNow,proto.get=stringGet,proto.invalidAt=invalidAt,proto.isAfter=isAfter,proto.isBefore=isBefore,proto.isBetween=isBetween,proto.isSame=isSame,proto.isSameOrAfter=isSameOrAfter,proto.isSameOrBefore=isSameOrBefore,proto.isValid=isValid$2,proto.lang=lang,proto.locale=locale,proto.localeData=localeData,proto.max=prototypeMax,proto.min=prototypeMin,proto.parsingFlags=parsingFlags,proto.set=stringSet,proto.startOf=startOf,proto.subtract=subtract,proto.toArray=toArray,proto.toObject=toObject,proto.toDate=toDate,proto.toISOString=toISOString,proto.inspect=inspect,proto.toJSON=toJSON,proto.toString=toString,proto.unix=unix,proto.valueOf=valueOf,proto.creationData=creationData,proto.year=getSetYear,proto.isLeapYear=getIsLeapYear,proto.weekYear=getSetWeekYear,proto.isoWeekYear=getSetISOWeekYear,proto.quarter=proto.quarters=getSetQuarter,proto.month=getSetMonth,proto.daysInMonth=getDaysInMonth,proto.week=proto.weeks=getSetWeek,proto.isoWeek=proto.isoWeeks=getSetISOWeek,proto.weeksInYear=getWeeksInYear,proto.isoWeeksInYear=getISOWeeksInYear,proto.date=getSetDayOfMonth,proto.day=proto.days=getSetDayOfWeek,proto.weekday=getSetLocaleDayOfWeek,proto.isoWeekday=getSetISODayOfWeek,proto.dayOfYear=getSetDayOfYear,proto.hour=proto.hours=getSetHour,proto.minute=proto.minutes=getSetMinute,proto.second=proto.seconds=getSetSecond,proto.millisecond=proto.milliseconds=getSetMillisecond,proto.utcOffset=getSetOffset,proto.utc=setOffsetToUTC,proto.local=setOffsetToLocal,proto.parseZone=setOffsetToParsedOffset,proto.hasAlignedHourOffset=hasAlignedHourOffset,proto.isDST=isDaylightSavingTime,proto.isLocal=isLocal,proto.isUtcOffset=isUtcOffset,proto.isUtc=isUtc,proto.isUTC=isUtc,proto.zoneAbbr=getZoneAbbr,proto.zoneName=getZoneName,proto.dates=deprecate("dates accessor is deprecated. Use date instead.",getSetDayOfMonth),proto.months=deprecate("months accessor is deprecated. Use month instead",getSetMonth),proto.years=deprecate("years accessor is deprecated. Use year instead",getSetYear),proto.zone=deprecate("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",getSetZone),proto.isDSTShifted=deprecate("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",isDaylightSavingTimeShifted);var proto$1=Locale.prototype;function get$1(format,index,field,setter){var locale=getLocale(),utc=createUTC().set(setter,index);return locale[field](utc,format)}function listMonthsImpl(format,index,field){if(isNumber(format)&&(index=format,format=void 0),format=format||"",null!=index)return get$1(format,index,field,"month");var i,out=[];for(i=0;i<12;i++)out[i]=get$1(format,i,field,"month");return out}function listWeekdaysImpl(localeSorted,format,index,field){"boolean"==typeof localeSorted?(isNumber(format)&&(index=format,format=void 0),format=format||""):(index=format=localeSorted,localeSorted=!1,isNumber(format)&&(index=format,format=void 0),format=format||"");var i,locale=getLocale(),shift=localeSorted?locale._week.dow:0;if(null!=index)return get$1(format,(index+shift)%7,field,"day");var out=[];for(i=0;i<7;i++)out[i]=get$1(format,(i+shift)%7,field,"day");return out}function listMonths(format,index){return listMonthsImpl(format,index,"months")}function listMonthsShort(format,index){return listMonthsImpl(format,index,"monthsShort")}function listWeekdays(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdays")}function listWeekdaysShort(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdaysShort")}function listWeekdaysMin(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdaysMin")}proto$1.calendar=calendar,proto$1.longDateFormat=longDateFormat,proto$1.invalidDate=invalidDate,proto$1.ordinal=ordinal,proto$1.preparse=preParsePostFormat,proto$1.postformat=preParsePostFormat,proto$1.relativeTime=relativeTime,proto$1.pastFuture=pastFuture,proto$1.set=set,proto$1.months=localeMonths,proto$1.monthsShort=localeMonthsShort,proto$1.monthsParse=localeMonthsParse,proto$1.monthsRegex=monthsRegex,proto$1.monthsShortRegex=monthsShortRegex,proto$1.week=localeWeek,proto$1.firstDayOfYear=localeFirstDayOfYear,proto$1.firstDayOfWeek=localeFirstDayOfWeek,proto$1.weekdays=localeWeekdays,proto$1.weekdaysMin=localeWeekdaysMin,proto$1.weekdaysShort=localeWeekdaysShort,proto$1.weekdaysParse=localeWeekdaysParse,proto$1.weekdaysRegex=weekdaysRegex,proto$1.weekdaysShortRegex=weekdaysShortRegex,proto$1.weekdaysMinRegex=weekdaysMinRegex,proto$1.isPM=localeIsPM,proto$1.meridiem=localeMeridiem,getSetGlobalLocale("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(number){var b=number%10;return number+(1===toInt(number%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}}),hooks.lang=deprecate("moment.lang is deprecated. Use moment.locale instead.",getSetGlobalLocale),hooks.langData=deprecate("moment.langData is deprecated. Use moment.localeData instead.",getLocale);var mathAbs=Math.abs;function abs(){var data=this._data;return this._milliseconds=mathAbs(this._milliseconds),this._days=mathAbs(this._days),this._months=mathAbs(this._months),data.milliseconds=mathAbs(data.milliseconds),data.seconds=mathAbs(data.seconds),data.minutes=mathAbs(data.minutes),data.hours=mathAbs(data.hours),data.months=mathAbs(data.months),data.years=mathAbs(data.years),this}function addSubtract$1(duration,input,value,direction){var other=createDuration(input,value);return duration._milliseconds+=direction*other._milliseconds,duration._days+=direction*other._days,duration._months+=direction*other._months,duration._bubble()}function add$1(input,value){return addSubtract$1(this,input,value,1)}function subtract$1(input,value){return addSubtract$1(this,input,value,-1)}function absCeil(number){return number<0?Math.floor(number):Math.ceil(number)}function bubble(){var seconds,minutes,hours,years,monthsFromDays,milliseconds=this._milliseconds,days=this._days,months=this._months,data=this._data;return milliseconds>=0&&days>=0&&months>=0||milliseconds<=0&&days<=0&&months<=0||(milliseconds+=864e5*absCeil(monthsToDays(months)+days),days=0,months=0),data.milliseconds=milliseconds%1e3,seconds=absFloor(milliseconds/1e3),data.seconds=seconds%60,minutes=absFloor(seconds/60),data.minutes=minutes%60,hours=absFloor(minutes/60),data.hours=hours%24,days+=absFloor(hours/24),months+=monthsFromDays=absFloor(daysToMonths(days)),days-=absCeil(monthsToDays(monthsFromDays)),years=absFloor(months/12),months%=12,data.days=days,data.months=months,data.years=years,this}function daysToMonths(days){return 4800*days/146097}function monthsToDays(months){return 146097*months/4800}function as(units){if(!this.isValid())return NaN;var days,months,milliseconds=this._milliseconds;if("month"===(units=normalizeUnits(units))||"quarter"===units||"year"===units)switch(days=this._days+milliseconds/864e5,months=this._months+daysToMonths(days),units){case"month":return months;case"quarter":return months/3;case"year":return months/12}else switch(days=this._days+Math.round(monthsToDays(this._months)),units){case"week":return days/7+milliseconds/6048e5;case"day":return days+milliseconds/864e5;case"hour":return 24*days+milliseconds/36e5;case"minute":return 1440*days+milliseconds/6e4;case"second":return 86400*days+milliseconds/1e3;case"millisecond":return Math.floor(864e5*days)+milliseconds;default:throw new Error("Unknown unit "+units)}}function valueOf$1(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*toInt(this._months/12):NaN}function makeAs(alias){return function(){return this.as(alias)}}var asMilliseconds=makeAs("ms"),asSeconds=makeAs("s"),asMinutes=makeAs("m"),asHours=makeAs("h"),asDays=makeAs("d"),asWeeks=makeAs("w"),asMonths=makeAs("M"),asQuarters=makeAs("Q"),asYears=makeAs("y");function clone$1(){return createDuration(this)}function get$2(units){return units=normalizeUnits(units),this.isValid()?this[units+"s"]():NaN}function makeGetter(name){return function(){return this.isValid()?this._data[name]:NaN}}var milliseconds=makeGetter("milliseconds"),seconds=makeGetter("seconds"),minutes=makeGetter("minutes"),hours=makeGetter("hours"),days=makeGetter("days"),months=makeGetter("months"),years=makeGetter("years");function weeks(){return absFloor(this.days()/7)}var round=Math.round,thresholds={ss:44,s:45,m:45,h:22,d:26,M:11};function substituteTimeAgo(string,number,withoutSuffix,isFuture,locale){return locale.relativeTime(number||1,!!withoutSuffix,string,isFuture)}function relativeTime$1(posNegDuration,withoutSuffix,locale){var duration=createDuration(posNegDuration).abs(),seconds=round(duration.as("s")),minutes=round(duration.as("m")),hours=round(duration.as("h")),days=round(duration.as("d")),months=round(duration.as("M")),years=round(duration.as("y")),a=seconds<=thresholds.ss&&["s",seconds]||seconds0,a[4]=locale,substituteTimeAgo.apply(null,a)}function getSetRelativeTimeRounding(roundingFunction){return void 0===roundingFunction?round:"function"==typeof roundingFunction&&(round=roundingFunction,!0)}function getSetRelativeTimeThreshold(threshold,limit){return void 0!==thresholds[threshold]&&(void 0===limit?thresholds[threshold]:(thresholds[threshold]=limit,"s"===threshold&&(thresholds.ss=limit-1),!0))}function humanize(withSuffix){if(!this.isValid())return this.localeData().invalidDate();var locale=this.localeData(),output=relativeTime$1(this,!withSuffix,locale);return withSuffix&&(output=locale.pastFuture(+this,output)),locale.postformat(output)}var abs$1=Math.abs;function sign(x){return(x>0)-(x<0)||+x}function toISOString$1(){if(!this.isValid())return this.localeData().invalidDate();var minutes,hours,seconds=abs$1(this._milliseconds)/1e3,days=abs$1(this._days),months=abs$1(this._months);minutes=absFloor(seconds/60),hours=absFloor(minutes/60),seconds%=60,minutes%=60;var Y=absFloor(months/12),M=months%=12,D=days,h=hours,m=minutes,s=seconds?seconds.toFixed(3).replace(/\.?0+$/,""):"",total=this.asSeconds();if(!total)return"P0D";var totalSign=total<0?"-":"",ymSign=sign(this._months)!==sign(total)?"-":"",daysSign=sign(this._days)!==sign(total)?"-":"",hmsSign=sign(this._milliseconds)!==sign(total)?"-":"";return totalSign+"P"+(Y?ymSign+Y+"Y":"")+(M?ymSign+M+"M":"")+(D?daysSign+D+"D":"")+(h||m||s?"T":"")+(h?hmsSign+h+"H":"")+(m?hmsSign+m+"M":"")+(s?hmsSign+s+"S":"")}var proto$2=Duration.prototype;return proto$2.isValid=isValid$1,proto$2.abs=abs,proto$2.add=add$1,proto$2.subtract=subtract$1,proto$2.as=as,proto$2.asMilliseconds=asMilliseconds,proto$2.asSeconds=asSeconds,proto$2.asMinutes=asMinutes,proto$2.asHours=asHours,proto$2.asDays=asDays,proto$2.asWeeks=asWeeks,proto$2.asMonths=asMonths,proto$2.asQuarters=asQuarters,proto$2.asYears=asYears,proto$2.valueOf=valueOf$1,proto$2._bubble=bubble,proto$2.clone=clone$1,proto$2.get=get$2,proto$2.milliseconds=milliseconds,proto$2.seconds=seconds,proto$2.minutes=minutes,proto$2.hours=hours,proto$2.days=days,proto$2.weeks=weeks,proto$2.months=months,proto$2.years=years,proto$2.humanize=humanize,proto$2.toISOString=toISOString$1,proto$2.toString=toISOString$1,proto$2.toJSON=toISOString$1,proto$2.locale=locale,proto$2.localeData=localeData,proto$2.toIsoString=deprecate("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",toISOString$1),proto$2.lang=lang,addFormatToken("X",0,0,"unix"),addFormatToken("x",0,0,"valueOf"),addRegexToken("x",matchSigned),addRegexToken("X",matchTimestamp),addParseToken("X",(function(input,array,config){config._d=new Date(1e3*parseFloat(input,10))})),addParseToken("x",(function(input,array,config){config._d=new Date(toInt(input))})),hooks.version="2.24.0",setHookCallback(createLocal),hooks.fn=proto,hooks.min=min,hooks.max=max,hooks.now=now,hooks.utc=createUTC,hooks.unix=createUnix,hooks.months=listMonths,hooks.isDate=isDate,hooks.locale=getSetGlobalLocale,hooks.invalid=createInvalid,hooks.duration=createDuration,hooks.isMoment=isMoment,hooks.weekdays=listWeekdays,hooks.parseZone=createInZone,hooks.localeData=getLocale,hooks.isDuration=isDuration,hooks.monthsShort=listMonthsShort,hooks.weekdaysMin=listWeekdaysMin,hooks.defineLocale=defineLocale,hooks.updateLocale=updateLocale,hooks.locales=listLocales,hooks.weekdaysShort=listWeekdaysShort,hooks.normalizeUnits=normalizeUnits,hooks.relativeTimeRounding=getSetRelativeTimeRounding,hooks.relativeTimeThreshold=getSetRelativeTimeThreshold,hooks.calendarFormat=getCalendarFormat,hooks.prototype=proto,hooks.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},hooks}()})),FORMATS={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};core_adapters._date.override("function"==typeof moment?{_id:"moment",formats:function(){return FORMATS},parse:function(value,format){return"string"==typeof value&&"string"==typeof format?value=moment(value,format):value instanceof moment||(value=moment(value)),value.isValid()?value.valueOf():null},format:function(time,_format){return moment(time).format(_format)},add:function(time,amount,unit){return moment(time).add(amount,unit).valueOf()},diff:function(max,min,unit){return moment(max).diff(moment(min),unit)},startOf:function(time,unit,weekday){return time=moment(time),"isoWeek"===unit?time.isoWeekday(weekday).valueOf():time.startOf(unit).valueOf()},endOf:function(time,unit){return moment(time).endOf(unit).valueOf()},_create:function(time){return moment(time)}}:{}),core_defaults._set("global",{plugins:{filler:{propagate:!0}}});var mappers={dataset:function(source){var index=source.fill,chart=source.chart,meta=chart.getDatasetMeta(index),points=meta&&chart.isDatasetVisible(index)&&meta.dataset._children||[],length=points.length||0;return length?function(point,i){return i=count)&⌖switch(fill){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return fill;default:return!1}}function computeBoundary(source){return(source.el._scale||{}).getPointPositionForValue?function(source){var start,end,center,i,point,scale=source.el._scale,options=scale.options,length=scale.chart.data.labels.length,fill=source.fill,target=[];if(!length)return null;for(start=options.ticks.reverse?scale.max:scale.min,end=options.ticks.reverse?scale.min:scale.max,center=scale.getPointPositionForValue(0,start),i=0;i0;--i)helpers$1.canvas.lineTo(ctx,curve1[i],curve1[i-1],!0);else for(cx=curve1[0].cx,cy=curve1[0].cy,r=Math.sqrt(Math.pow(curve1[0].x-cx,2)+Math.pow(curve1[0].y-cy,2)),i=len1-1;i>0;--i)ctx.arc(cx,cy,r,curve1[i].angle,curve1[i-1].angle,!0)}}function doFill(ctx,points,mapper,view,color,loop){var i,ilen,index,p0,p1,d0,d1,loopOffset,count=points.length,span=view.spanGaps,curve0=[],curve1=[],len0=0,len1=0;for(ctx.beginPath(),i=0,ilen=count;i=0;--i)(meta=metasets[i].$filler)&&meta.visible&&(view=(el=meta.el)._view,points=el._children||[],mapper=meta.mapper,color=view.backgroundColor||core_defaults.global.defaultColor,mapper&&color&&points.length&&(helpers$1.canvas.clipArea(ctx,chart.chartArea),doFill(ctx,points,mapper,view,color,el._loop),helpers$1.canvas.unclipArea(ctx)))}},getRtlHelper$1=helpers$1.rtl.getRtlAdapter,noop$1=helpers$1.noop,valueOrDefault$e=helpers$1.valueOrDefault;function getBoxWidth(labelOpts,fontSize){return labelOpts.usePointStyle&&labelOpts.boxWidth>fontSize?fontSize:labelOpts.boxWidth}core_defaults._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(e,legendItem){var index=legendItem.datasetIndex,ci=this.chart,meta=ci.getDatasetMeta(index);meta.hidden=null===meta.hidden?!ci.data.datasets[index].hidden:null,ci.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(chart){var datasets=chart.data.datasets,options=chart.options.legend||{},usePointStyle=options.labels&&options.labels.usePointStyle;return chart._getSortedDatasetMetas().map((function(meta){var style=meta.controller.getStyle(usePointStyle?0:void 0);return{text:datasets[meta.index].label,fillStyle:style.backgroundColor,hidden:!chart.isDatasetVisible(meta.index),lineCap:style.borderCapStyle,lineDash:style.borderDash,lineDashOffset:style.borderDashOffset,lineJoin:style.borderJoinStyle,lineWidth:style.borderWidth,strokeStyle:style.borderColor,pointStyle:style.pointStyle,rotation:style.rotation,datasetIndex:meta.index}}),this)}}},legendCallback:function(chart){var i,ilen,listItem,list=document.createElement("ul"),datasets=chart.data.datasets;for(list.setAttribute("class",chart.id+"-legend"),i=0,ilen=datasets.length;iminSize.width)&&(totalHeight+=fontSize+labelOpts.padding,lineWidths[lineWidths.length-(i>0?0:1)]=0),hitboxes[i]={left:0,top:0,width:width,height:fontSize},lineWidths[lineWidths.length-1]+=width+labelOpts.padding})),minSize.height+=totalHeight}else{var vPadding=labelOpts.padding,columnWidths=me.columnWidths=[],columnHeights=me.columnHeights=[],totalWidth=labelOpts.padding,currentColWidth=0,currentColHeight=0;helpers$1.each(me.legendItems,(function(legendItem,i){var itemWidth=getBoxWidth(labelOpts,fontSize)+fontSize/2+ctx.measureText(legendItem.text).width;i>0&¤tColHeight+fontSize+2*vPadding>minSize.height&&(totalWidth+=currentColWidth+labelOpts.padding,columnWidths.push(currentColWidth),columnHeights.push(currentColHeight),currentColWidth=0,currentColHeight=0),currentColWidth=Math.max(currentColWidth,itemWidth),currentColHeight+=fontSize+vPadding,hitboxes[i]={left:0,top:0,width:itemWidth,height:fontSize}})),totalWidth+=currentColWidth,columnWidths.push(currentColWidth),columnHeights.push(currentColHeight),minSize.width+=totalWidth}me.width=minSize.width,me.height=minSize.height}else me.width=minSize.width=me.height=minSize.height=0},afterFit:noop$1,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var me=this,opts=me.options,labelOpts=opts.labels,globalDefaults=core_defaults.global,defaultColor=globalDefaults.defaultColor,lineDefault=globalDefaults.elements.line,legendHeight=me.height,columnHeights=me.columnHeights,legendWidth=me.width,lineWidths=me.lineWidths;if(opts.display){var cursor,rtlHelper=getRtlHelper$1(opts.rtl,me.left,me.minSize.width),ctx=me.ctx,fontColor=valueOrDefault$e(labelOpts.fontColor,globalDefaults.defaultFontColor),labelFont=helpers$1.options._parseFont(labelOpts),fontSize=labelFont.size;ctx.textAlign=rtlHelper.textAlign("left"),ctx.textBaseline="middle",ctx.lineWidth=.5,ctx.strokeStyle=fontColor,ctx.fillStyle=fontColor,ctx.font=labelFont.string;var boxWidth=getBoxWidth(labelOpts,fontSize),hitboxes=me.legendHitBoxes,alignmentOffset=function(dimension,blockSize){switch(opts.align){case"start":return labelOpts.padding;case"end":return dimension-blockSize;default:return(dimension-blockSize+labelOpts.padding)/2}},isHorizontal=me.isHorizontal();cursor=isHorizontal?{x:me.left+alignmentOffset(legendWidth,lineWidths[0]),y:me.top+labelOpts.padding,line:0}:{x:me.left+labelOpts.padding,y:me.top+alignmentOffset(legendHeight,columnHeights[0]),line:0},helpers$1.rtl.overrideTextDirection(me.ctx,opts.textDirection);var itemHeight=fontSize+labelOpts.padding;helpers$1.each(me.legendItems,(function(legendItem,i){var textWidth=ctx.measureText(legendItem.text).width,width=boxWidth+fontSize/2+textWidth,x=cursor.x,y=cursor.y;rtlHelper.setWidth(me.minSize.width),isHorizontal?i>0&&x+width+labelOpts.padding>me.left+me.minSize.width&&(y=cursor.y+=itemHeight,cursor.line++,x=cursor.x=me.left+alignmentOffset(legendWidth,lineWidths[cursor.line])):i>0&&y+itemHeight>me.top+me.minSize.height&&(x=cursor.x=x+me.columnWidths[cursor.line]+labelOpts.padding,cursor.line++,y=cursor.y=me.top+alignmentOffset(legendHeight,columnHeights[cursor.line]));var realX=rtlHelper.x(x);!function(x,y,legendItem){if(!(isNaN(boxWidth)||boxWidth<=0)){ctx.save();var lineWidth=valueOrDefault$e(legendItem.lineWidth,lineDefault.borderWidth);if(ctx.fillStyle=valueOrDefault$e(legendItem.fillStyle,defaultColor),ctx.lineCap=valueOrDefault$e(legendItem.lineCap,lineDefault.borderCapStyle),ctx.lineDashOffset=valueOrDefault$e(legendItem.lineDashOffset,lineDefault.borderDashOffset),ctx.lineJoin=valueOrDefault$e(legendItem.lineJoin,lineDefault.borderJoinStyle),ctx.lineWidth=lineWidth,ctx.strokeStyle=valueOrDefault$e(legendItem.strokeStyle,defaultColor),ctx.setLineDash&&ctx.setLineDash(valueOrDefault$e(legendItem.lineDash,lineDefault.borderDash)),labelOpts&&labelOpts.usePointStyle){var radius=boxWidth*Math.SQRT2/2,centerX=rtlHelper.xPlus(x,boxWidth/2),centerY=y+fontSize/2;helpers$1.canvas.drawPoint(ctx,legendItem.pointStyle,radius,centerX,centerY,legendItem.rotation)}else ctx.fillRect(rtlHelper.leftForLtr(x,boxWidth),y,boxWidth,fontSize),0!==lineWidth&&ctx.strokeRect(rtlHelper.leftForLtr(x,boxWidth),y,boxWidth,fontSize);ctx.restore()}}(realX,y,legendItem),hitboxes[i].left=rtlHelper.leftForLtr(realX,hitboxes[i].width),hitboxes[i].top=y,function(x,y,legendItem,textWidth){var halfFontSize=fontSize/2,xLeft=rtlHelper.xPlus(x,boxWidth+halfFontSize),yMiddle=y+halfFontSize;ctx.fillText(legendItem.text,xLeft,yMiddle),legendItem.hidden&&(ctx.beginPath(),ctx.lineWidth=2,ctx.moveTo(xLeft,yMiddle),ctx.lineTo(rtlHelper.xPlus(xLeft,textWidth),yMiddle),ctx.stroke())}(realX,y,legendItem,textWidth),isHorizontal?cursor.x+=width+labelOpts.padding:cursor.y+=itemHeight})),helpers$1.rtl.restoreTextDirection(me.ctx,opts.textDirection)}},_getLegendItemAt:function(x,y){var i,hitBox,lh,me=this;if(x>=me.left&&x<=me.right&&y>=me.top&&y<=me.bottom)for(lh=me.legendHitBoxes,i=0;i=(hitBox=lh[i]).left&&x<=hitBox.left+hitBox.width&&y>=hitBox.top&&y<=hitBox.top+hitBox.height)return me.legendItems[i];return null},handleEvent:function(e){var hoveredItem,me=this,opts=me.options,type="mouseup"===e.type?"click":e.type;if("mousemove"===type){if(!opts.onHover&&!opts.onLeave)return}else{if("click"!==type)return;if(!opts.onClick)return}hoveredItem=me._getLegendItemAt(e.x,e.y),"click"===type?hoveredItem&&opts.onClick&&opts.onClick.call(me,e.native,hoveredItem):(opts.onLeave&&hoveredItem!==me._hoveredItem&&(me._hoveredItem&&opts.onLeave.call(me,e.native,me._hoveredItem),me._hoveredItem=hoveredItem),opts.onHover&&hoveredItem&&opts.onHover.call(me,e.native,hoveredItem))}});function createNewLegendAndAttach(chart,legendOpts){var legend=new Legend({ctx:chart.ctx,options:legendOpts,chart:chart});core_layouts.configure(chart,legend,legendOpts),core_layouts.addBox(chart,legend),chart.legend=legend}var plugin_legend={id:"legend",_element:Legend,beforeInit:function(chart){var legendOpts=chart.options.legend;legendOpts&&createNewLegendAndAttach(chart,legendOpts)},beforeUpdate:function(chart){var legendOpts=chart.options.legend,legend=chart.legend;legendOpts?(helpers$1.mergeIf(legendOpts,core_defaults.global.legend),legend?(core_layouts.configure(chart,legend,legendOpts),legend.options=legendOpts):createNewLegendAndAttach(chart,legendOpts)):legend&&(core_layouts.removeBox(chart,legend),delete chart.legend)},afterEvent:function(chart,e){var legend=chart.legend;legend&&legend.handleEvent(e)}},noop$2=helpers$1.noop;core_defaults._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Title=core_element.extend({initialize:function(config){helpers$1.extend(this,config),this.legendHitBoxes=[]},beforeUpdate:noop$2,update:function(maxWidth,maxHeight,margins){var me=this;return me.beforeUpdate(),me.maxWidth=maxWidth,me.maxHeight=maxHeight,me.margins=margins,me.beforeSetDimensions(),me.setDimensions(),me.afterSetDimensions(),me.beforeBuildLabels(),me.buildLabels(),me.afterBuildLabels(),me.beforeFit(),me.fit(),me.afterFit(),me.afterUpdate(),me.minSize},afterUpdate:noop$2,beforeSetDimensions:noop$2,setDimensions:function(){var me=this;me.isHorizontal()?(me.width=me.maxWidth,me.left=0,me.right=me.width):(me.height=me.maxHeight,me.top=0,me.bottom=me.height),me.paddingLeft=0,me.paddingTop=0,me.paddingRight=0,me.paddingBottom=0,me.minSize={width:0,height:0}},afterSetDimensions:noop$2,beforeBuildLabels:noop$2,buildLabels:noop$2,afterBuildLabels:noop$2,beforeFit:noop$2,fit:function(){var textSize,me=this,opts=me.options,minSize=me.minSize={},isHorizontal=me.isHorizontal();opts.display?(textSize=(helpers$1.isArray(opts.text)?opts.text.length:1)*helpers$1.options._parseFont(opts).lineHeight+2*opts.padding,me.width=minSize.width=isHorizontal?me.maxWidth:textSize,me.height=minSize.height=isHorizontal?textSize:me.maxHeight):me.width=minSize.width=me.height=minSize.height=0},afterFit:noop$2,isHorizontal:function(){var pos=this.options.position;return"top"===pos||"bottom"===pos},draw:function(){var me=this,ctx=me.ctx,opts=me.options;if(opts.display){var maxWidth,titleX,titleY,fontOpts=helpers$1.options._parseFont(opts),lineHeight=fontOpts.lineHeight,offset=lineHeight/2+opts.padding,rotation=0,top=me.top,left=me.left,bottom=me.bottom,right=me.right;ctx.fillStyle=helpers$1.valueOrDefault(opts.fontColor,core_defaults.global.defaultFontColor),ctx.font=fontOpts.string,me.isHorizontal()?(titleX=left+(right-left)/2,titleY=top+offset,maxWidth=right-left):(titleX="left"===opts.position?left+offset:right-offset,titleY=top+(bottom-top)/2,maxWidth=bottom-top,rotation=Math.PI*("left"===opts.position?-.5:.5)),ctx.save(),ctx.translate(titleX,titleY),ctx.rotate(rotation),ctx.textAlign="center",ctx.textBaseline="middle";var text=opts.text;if(helpers$1.isArray(text))for(var y=0,i=0;i=0;i--){var currentItem=arrayToSearch[i];if(filterCallback(currentItem))return currentItem}},helpers$1.isNumber=function(n){return!isNaN(parseFloat(n))&&isFinite(n)},helpers$1.almostEquals=function(x,y,epsilon){return Math.abs(x-y)=x},helpers$1.max=function(array){return array.reduce((function(max,value){return isNaN(value)?max:Math.max(max,value)}),Number.NEGATIVE_INFINITY)},helpers$1.min=function(array){return array.reduce((function(min,value){return isNaN(value)?min:Math.min(min,value)}),Number.POSITIVE_INFINITY)},helpers$1.sign=Math.sign?function(x){return Math.sign(x)}:function(x){return 0===(x=+x)||isNaN(x)?x:x>0?1:-1},helpers$1.toRadians=function(degrees){return degrees*(Math.PI/180)},helpers$1.toDegrees=function(radians){return radians*(180/Math.PI)},helpers$1._decimalPlaces=function(x){if(helpers$1.isFinite(x)){for(var e=1,p=0;Math.round(x*e)/e!==x;)e*=10,p++;return p}},helpers$1.getAngleFromPoint=function(centrePoint,anglePoint){var distanceFromXCenter=anglePoint.x-centrePoint.x,distanceFromYCenter=anglePoint.y-centrePoint.y,radialDistanceFromCenter=Math.sqrt(distanceFromXCenter*distanceFromXCenter+distanceFromYCenter*distanceFromYCenter),angle=Math.atan2(distanceFromYCenter,distanceFromXCenter);return angle<-.5*Math.PI&&(angle+=2*Math.PI),{angle:angle,distance:radialDistanceFromCenter}},helpers$1.distanceBetweenPoints=function(pt1,pt2){return Math.sqrt(Math.pow(pt2.x-pt1.x,2)+Math.pow(pt2.y-pt1.y,2))},helpers$1.aliasPixel=function(pixelWidth){return pixelWidth%2==0?0:.5},helpers$1._alignPixel=function(chart,pixel,width){var devicePixelRatio=chart.currentDevicePixelRatio,halfWidth=width/2;return Math.round((pixel-halfWidth)*devicePixelRatio)/devicePixelRatio+halfWidth},helpers$1.splineCurve=function(firstPoint,middlePoint,afterPoint,t){var previous=firstPoint.skip?middlePoint:firstPoint,current=middlePoint,next=afterPoint.skip?middlePoint:afterPoint,d01=Math.sqrt(Math.pow(current.x-previous.x,2)+Math.pow(current.y-previous.y,2)),d12=Math.sqrt(Math.pow(next.x-current.x,2)+Math.pow(next.y-current.y,2)),s01=d01/(d01+d12),s12=d12/(d01+d12),fa=t*(s01=isNaN(s01)?0:s01),fb=t*(s12=isNaN(s12)?0:s12);return{previous:{x:current.x-fa*(next.x-previous.x),y:current.y-fa*(next.y-previous.y)},next:{x:current.x+fb*(next.x-previous.x),y:current.y+fb*(next.y-previous.y)}}},helpers$1.EPSILON=Number.EPSILON||1e-14,helpers$1.splineCurveMonotone=function(points){var i,pointBefore,pointCurrent,pointAfter,alphaK,betaK,tauK,squaredMagnitude,deltaX,pointsWithTangents=(points||[]).map((function(point){return{model:point._model,deltaK:0,mK:0}})),pointsLen=pointsWithTangents.length;for(i=0;i0?pointsWithTangents[i-1]:null,(pointAfter=i0?pointsWithTangents[i-1]:null,pointAfter=i=collection.length-1?collection[0]:collection[index+1]:index>=collection.length-1?collection[collection.length-1]:collection[index+1]},helpers$1.previousItem=function(collection,index,loop){return loop?index<=0?collection[collection.length-1]:collection[index-1]:index<=0?collection[0]:collection[index-1]},helpers$1.niceNum=function(range,round){var exponent=Math.floor(helpers$1.log10(range)),fraction=range/Math.pow(10,exponent);return(round?fraction<1.5?1:fraction<3?2:fraction<7?5:10:fraction<=1?1:fraction<=2?2:fraction<=5?5:10)*Math.pow(10,exponent)},helpers$1.requestAnimFrame="undefined"==typeof window?function(callback){callback()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){return window.setTimeout(callback,1e3/60)},helpers$1.getRelativePosition=function(evt,chart){var mouseX,mouseY,e=evt.originalEvent||evt,canvas=evt.target||evt.srcElement,boundingRect=canvas.getBoundingClientRect(),touches=e.touches;touches&&touches.length>0?(mouseX=touches[0].clientX,mouseY=touches[0].clientY):(mouseX=e.clientX,mouseY=e.clientY);var paddingLeft=parseFloat(helpers$1.getStyle(canvas,"padding-left")),paddingTop=parseFloat(helpers$1.getStyle(canvas,"padding-top")),paddingRight=parseFloat(helpers$1.getStyle(canvas,"padding-right")),paddingBottom=parseFloat(helpers$1.getStyle(canvas,"padding-bottom")),width=boundingRect.right-boundingRect.left-paddingLeft-paddingRight,height=boundingRect.bottom-boundingRect.top-paddingTop-paddingBottom;return{x:mouseX=Math.round((mouseX-boundingRect.left-paddingLeft)/width*canvas.width/chart.currentDevicePixelRatio),y:mouseY=Math.round((mouseY-boundingRect.top-paddingTop)/height*canvas.height/chart.currentDevicePixelRatio)}},helpers$1.getConstraintWidth=function(domNode){return getConstraintDimension(domNode,"max-width","clientWidth")},helpers$1.getConstraintHeight=function(domNode){return getConstraintDimension(domNode,"max-height","clientHeight")},helpers$1._calculatePadding=function(container,padding,parentDimension){return(padding=helpers$1.getStyle(container,padding)).indexOf("%")>-1?parentDimension*parseInt(padding,10)/100:parseInt(padding,10)},helpers$1._getParentNode=function(domNode){var parent=domNode.parentNode;return parent&&"[object ShadowRoot]"===parent.toString()&&(parent=parent.host),parent},helpers$1.getMaximumWidth=function(domNode){var container=helpers$1._getParentNode(domNode);if(!container)return domNode.clientWidth;var clientWidth=container.clientWidth,w=clientWidth-helpers$1._calculatePadding(container,"padding-left",clientWidth)-helpers$1._calculatePadding(container,"padding-right",clientWidth),cw=helpers$1.getConstraintWidth(domNode);return isNaN(cw)?w:Math.min(w,cw)},helpers$1.getMaximumHeight=function(domNode){var container=helpers$1._getParentNode(domNode);if(!container)return domNode.clientHeight;var clientHeight=container.clientHeight,h=clientHeight-helpers$1._calculatePadding(container,"padding-top",clientHeight)-helpers$1._calculatePadding(container,"padding-bottom",clientHeight),ch=helpers$1.getConstraintHeight(domNode);return isNaN(ch)?h:Math.min(h,ch)},helpers$1.getStyle=function(el,property){return el.currentStyle?el.currentStyle[property]:document.defaultView.getComputedStyle(el,null).getPropertyValue(property)},helpers$1.retinaScale=function(chart,forceRatio){var pixelRatio=chart.currentDevicePixelRatio=forceRatio||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==pixelRatio){var canvas=chart.canvas,height=chart.height,width=chart.width;canvas.height=height*pixelRatio,canvas.width=width*pixelRatio,chart.ctx.scale(pixelRatio,pixelRatio),canvas.style.height||canvas.style.width||(canvas.style.height=height+"px",canvas.style.width=width+"px")}},helpers$1.fontString=function(pixelSize,fontStyle,fontFamily){return fontStyle+" "+pixelSize+"px "+fontFamily},helpers$1.longestText=function(ctx,font,arrayOfThings,cache){var data=(cache=cache||{}).data=cache.data||{},gc=cache.garbageCollect=cache.garbageCollect||[];cache.font!==font&&(data=cache.data={},gc=cache.garbageCollect=[],cache.font=font),ctx.font=font;var i,j,jlen,thing,nestedThing,longest=0,ilen=arrayOfThings.length;for(i=0;iarrayOfThings.length){for(i=0;ilongest&&(longest=textWidth),longest},helpers$1.numberOfLabelLines=function(arrayOfThings){var numberOfLines=1;return helpers$1.each(arrayOfThings,(function(thing){helpers$1.isArray(thing)&&thing.length>numberOfLines&&(numberOfLines=thing.length)})),numberOfLines},helpers$1.color=chartjsColor?function(value){return value instanceof CanvasGradient&&(value=core_defaults.global.defaultColor),chartjsColor(value)}:function(value){return console.error("Color.js not found!"),value},helpers$1.getHoverColor=function(colorValue){return colorValue instanceof CanvasPattern||colorValue instanceof CanvasGradient?colorValue:helpers$1.color(colorValue).saturate(.5).darken(.1).rgbString()}}(),core_controller._adapters=core_adapters,core_controller.Animation=core_animation,core_controller.animationService=core_animations,core_controller.controllers=controllers,core_controller.DatasetController=core_datasetController,core_controller.defaults=core_defaults,core_controller.Element=core_element,core_controller.elements=elements,core_controller.Interaction=core_interaction,core_controller.layouts=core_layouts,core_controller.platform=platform,core_controller.plugins=core_plugins,core_controller.Scale=core_scale,core_controller.scaleService=core_scaleService,core_controller.Ticks=core_ticks,core_controller.Tooltip=core_tooltip,core_controller.helpers.each(scales,(function(scale,type){core_controller.scaleService.registerScaleType(type,scale,scale._defaults)})),plugins)plugins.hasOwnProperty(k)&&core_controller.plugins.register(plugins[k]);core_controller.platform.initialize();var src=core_controller;return"undefined"!=typeof window&&(window.Chart=core_controller),core_controller.Chart=core_controller,core_controller.Legend=plugins.legend._element,core_controller.Title=plugins.title._element,core_controller.pluginService=core_controller.plugins,core_controller.PluginBase=core_controller.Element.extend({}),core_controller.canvasHelpers=core_controller.helpers.canvas,core_controller.layoutService=core_controller.layouts,core_controller.LinearScaleBase=scale_linearbase,core_controller.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],(function(klass){core_controller[klass]=function(ctx,cfg){return new core_controller(ctx,core_controller.helpers.merge(cfg||{},{type:klass.charAt(0).toLowerCase()+klass.slice(1)}))}})),src})); //# sourceMappingURL=chartjs-lazy.min.js.map \ No newline at end of file diff --git a/lib/amd/build/chartjs-lazy.min.js.map b/lib/amd/build/chartjs-lazy.min.js.map index 14cab59909c..42524c05a8c 100644 --- a/lib/amd/build/chartjs-lazy.min.js.map +++ b/lib/amd/build/chartjs-lazy.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chartjs-lazy.min.js","sources":["../src/chartjs-lazy.js"],"sourcesContent":["/*!\n * Chart.js v2.9.4\n * https://www.chartjs.org\n * (c) 2020 Chart.js Contributors\n * Released under the MIT License\n */\n\n/**\n * Description of import into Moodle:\n *\n * - Download Chart.bundle.js from https://github.com/chartjs/Chart.js/releases.\n * - Copy Chart.bundle.js content to lib/amd/src/chartjs-lazy.js.\n * - Convert line endings to LF-Unix format.\n * - Keep these instructions to the file.\n * - Visit lib/tests/other/chartjstestpage.php to see if the library still works after the update.\n */\n\n(function (global, factory) {\ntypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\ntypeof define === 'function' && define.amd ? define(factory) :\n(global = global || self, global.Chart = factory());\n}(this, (function () { 'use strict';\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction commonjsRequire () {\n\tthrow new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nfunction getCjsExportFromNamespace (n) {\n\treturn n && n['default'] || n;\n}\n\nvar colorName = {\n\t\"aliceblue\": [240, 248, 255],\n\t\"antiquewhite\": [250, 235, 215],\n\t\"aqua\": [0, 255, 255],\n\t\"aquamarine\": [127, 255, 212],\n\t\"azure\": [240, 255, 255],\n\t\"beige\": [245, 245, 220],\n\t\"bisque\": [255, 228, 196],\n\t\"black\": [0, 0, 0],\n\t\"blanchedalmond\": [255, 235, 205],\n\t\"blue\": [0, 0, 255],\n\t\"blueviolet\": [138, 43, 226],\n\t\"brown\": [165, 42, 42],\n\t\"burlywood\": [222, 184, 135],\n\t\"cadetblue\": [95, 158, 160],\n\t\"chartreuse\": [127, 255, 0],\n\t\"chocolate\": [210, 105, 30],\n\t\"coral\": [255, 127, 80],\n\t\"cornflowerblue\": [100, 149, 237],\n\t\"cornsilk\": [255, 248, 220],\n\t\"crimson\": [220, 20, 60],\n\t\"cyan\": [0, 255, 255],\n\t\"darkblue\": [0, 0, 139],\n\t\"darkcyan\": [0, 139, 139],\n\t\"darkgoldenrod\": [184, 134, 11],\n\t\"darkgray\": [169, 169, 169],\n\t\"darkgreen\": [0, 100, 0],\n\t\"darkgrey\": [169, 169, 169],\n\t\"darkkhaki\": [189, 183, 107],\n\t\"darkmagenta\": [139, 0, 139],\n\t\"darkolivegreen\": [85, 107, 47],\n\t\"darkorange\": [255, 140, 0],\n\t\"darkorchid\": [153, 50, 204],\n\t\"darkred\": [139, 0, 0],\n\t\"darksalmon\": [233, 150, 122],\n\t\"darkseagreen\": [143, 188, 143],\n\t\"darkslateblue\": [72, 61, 139],\n\t\"darkslategray\": [47, 79, 79],\n\t\"darkslategrey\": [47, 79, 79],\n\t\"darkturquoise\": [0, 206, 209],\n\t\"darkviolet\": [148, 0, 211],\n\t\"deeppink\": [255, 20, 147],\n\t\"deepskyblue\": [0, 191, 255],\n\t\"dimgray\": [105, 105, 105],\n\t\"dimgrey\": [105, 105, 105],\n\t\"dodgerblue\": [30, 144, 255],\n\t\"firebrick\": [178, 34, 34],\n\t\"floralwhite\": [255, 250, 240],\n\t\"forestgreen\": [34, 139, 34],\n\t\"fuchsia\": [255, 0, 255],\n\t\"gainsboro\": [220, 220, 220],\n\t\"ghostwhite\": [248, 248, 255],\n\t\"gold\": [255, 215, 0],\n\t\"goldenrod\": [218, 165, 32],\n\t\"gray\": [128, 128, 128],\n\t\"green\": [0, 128, 0],\n\t\"greenyellow\": [173, 255, 47],\n\t\"grey\": [128, 128, 128],\n\t\"honeydew\": [240, 255, 240],\n\t\"hotpink\": [255, 105, 180],\n\t\"indianred\": [205, 92, 92],\n\t\"indigo\": [75, 0, 130],\n\t\"ivory\": [255, 255, 240],\n\t\"khaki\": [240, 230, 140],\n\t\"lavender\": [230, 230, 250],\n\t\"lavenderblush\": [255, 240, 245],\n\t\"lawngreen\": [124, 252, 0],\n\t\"lemonchiffon\": [255, 250, 205],\n\t\"lightblue\": [173, 216, 230],\n\t\"lightcoral\": [240, 128, 128],\n\t\"lightcyan\": [224, 255, 255],\n\t\"lightgoldenrodyellow\": [250, 250, 210],\n\t\"lightgray\": [211, 211, 211],\n\t\"lightgreen\": [144, 238, 144],\n\t\"lightgrey\": [211, 211, 211],\n\t\"lightpink\": [255, 182, 193],\n\t\"lightsalmon\": [255, 160, 122],\n\t\"lightseagreen\": [32, 178, 170],\n\t\"lightskyblue\": [135, 206, 250],\n\t\"lightslategray\": [119, 136, 153],\n\t\"lightslategrey\": [119, 136, 153],\n\t\"lightsteelblue\": [176, 196, 222],\n\t\"lightyellow\": [255, 255, 224],\n\t\"lime\": [0, 255, 0],\n\t\"limegreen\": [50, 205, 50],\n\t\"linen\": [250, 240, 230],\n\t\"magenta\": [255, 0, 255],\n\t\"maroon\": [128, 0, 0],\n\t\"mediumaquamarine\": [102, 205, 170],\n\t\"mediumblue\": [0, 0, 205],\n\t\"mediumorchid\": [186, 85, 211],\n\t\"mediumpurple\": [147, 112, 219],\n\t\"mediumseagreen\": [60, 179, 113],\n\t\"mediumslateblue\": [123, 104, 238],\n\t\"mediumspringgreen\": [0, 250, 154],\n\t\"mediumturquoise\": [72, 209, 204],\n\t\"mediumvioletred\": [199, 21, 133],\n\t\"midnightblue\": [25, 25, 112],\n\t\"mintcream\": [245, 255, 250],\n\t\"mistyrose\": [255, 228, 225],\n\t\"moccasin\": [255, 228, 181],\n\t\"navajowhite\": [255, 222, 173],\n\t\"navy\": [0, 0, 128],\n\t\"oldlace\": [253, 245, 230],\n\t\"olive\": [128, 128, 0],\n\t\"olivedrab\": [107, 142, 35],\n\t\"orange\": [255, 165, 0],\n\t\"orangered\": [255, 69, 0],\n\t\"orchid\": [218, 112, 214],\n\t\"palegoldenrod\": [238, 232, 170],\n\t\"palegreen\": [152, 251, 152],\n\t\"paleturquoise\": [175, 238, 238],\n\t\"palevioletred\": [219, 112, 147],\n\t\"papayawhip\": [255, 239, 213],\n\t\"peachpuff\": [255, 218, 185],\n\t\"peru\": [205, 133, 63],\n\t\"pink\": [255, 192, 203],\n\t\"plum\": [221, 160, 221],\n\t\"powderblue\": [176, 224, 230],\n\t\"purple\": [128, 0, 128],\n\t\"rebeccapurple\": [102, 51, 153],\n\t\"red\": [255, 0, 0],\n\t\"rosybrown\": [188, 143, 143],\n\t\"royalblue\": [65, 105, 225],\n\t\"saddlebrown\": [139, 69, 19],\n\t\"salmon\": [250, 128, 114],\n\t\"sandybrown\": [244, 164, 96],\n\t\"seagreen\": [46, 139, 87],\n\t\"seashell\": [255, 245, 238],\n\t\"sienna\": [160, 82, 45],\n\t\"silver\": [192, 192, 192],\n\t\"skyblue\": [135, 206, 235],\n\t\"slateblue\": [106, 90, 205],\n\t\"slategray\": [112, 128, 144],\n\t\"slategrey\": [112, 128, 144],\n\t\"snow\": [255, 250, 250],\n\t\"springgreen\": [0, 255, 127],\n\t\"steelblue\": [70, 130, 180],\n\t\"tan\": [210, 180, 140],\n\t\"teal\": [0, 128, 128],\n\t\"thistle\": [216, 191, 216],\n\t\"tomato\": [255, 99, 71],\n\t\"turquoise\": [64, 224, 208],\n\t\"violet\": [238, 130, 238],\n\t\"wheat\": [245, 222, 179],\n\t\"white\": [255, 255, 255],\n\t\"whitesmoke\": [245, 245, 245],\n\t\"yellow\": [255, 255, 0],\n\t\"yellowgreen\": [154, 205, 50]\n};\n\nvar conversions = createCommonjsModule(function (module) {\n/* MIT license */\n\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `typeof` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nvar reverseKeywords = {};\nfor (var key in colorName) {\n\tif (colorName.hasOwnProperty(key)) {\n\t\treverseKeywords[colorName[key]] = key;\n\t}\n}\n\nvar convert = module.exports = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\n// hide .channels and .labels properties\nfor (var model in convert) {\n\tif (convert.hasOwnProperty(model)) {\n\t\tif (!('channels' in convert[model])) {\n\t\t\tthrow new Error('missing channels property: ' + model);\n\t\t}\n\n\t\tif (!('labels' in convert[model])) {\n\t\t\tthrow new Error('missing channel labels property: ' + model);\n\t\t}\n\n\t\tif (convert[model].labels.length !== convert[model].channels) {\n\t\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t\t}\n\n\t\tvar channels = convert[model].channels;\n\t\tvar labels = convert[model].labels;\n\t\tdelete convert[model].channels;\n\t\tdelete convert[model].labels;\n\t\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\t\tObject.defineProperty(convert[model], 'labels', {value: labels});\n\t}\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar l;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tvar rdif;\n\tvar gdif;\n\tvar bdif;\n\tvar h;\n\tvar s;\n\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar v = Math.max(r, g, b);\n\tvar diff = v - Math.min(r, g, b);\n\tvar diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = s = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar h = convert.rgb.hsl(rgb)[0];\n\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar c;\n\tvar m;\n\tvar y;\n\tvar k;\n\n\tk = Math.min(1 - r, 1 - g, 1 - b);\n\tc = (1 - r - k) / (1 - k) || 0;\n\tm = (1 - g - k) / (1 - k) || 0;\n\ty = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\n/**\n * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n * */\nfunction comparativeDistance(x, y) {\n\treturn (\n\t\tMath.pow(x[0] - y[0], 2) +\n\t\tMath.pow(x[1] - y[1], 2) +\n\t\tMath.pow(x[2] - y[2], 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tvar reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tvar currentClosestDistance = Infinity;\n\tvar currentClosestKeyword;\n\n\tfor (var keyword in colorName) {\n\t\tif (colorName.hasOwnProperty(keyword)) {\n\t\t\tvar value = colorName[keyword];\n\n\t\t\t// Compute comparative distance\n\t\t\tvar distance = comparativeDistance(rgb, value);\n\n\t\t\t// Check if its less, if so set as closest\n\t\t\tif (distance < currentClosestDistance) {\n\t\t\t\tcurrentClosestDistance = distance;\n\t\t\t\tcurrentClosestKeyword = keyword;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn colorName[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tvar xyz = convert.rgb.xyz(rgb);\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tvar h = hsl[0] / 360;\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar t1;\n\tvar t2;\n\tvar t3;\n\tvar rgb;\n\tvar val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tt1 = 2 * l - t2;\n\n\trgb = [0, 0, 0];\n\tfor (var i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tvar h = hsl[0];\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar smin = s;\n\tvar lmin = Math.max(l, 0.01);\n\tvar sv;\n\tvar v;\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tv = (l + s) / 2;\n\tsv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tvar h = hsv[0] / 60;\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar hi = Math.floor(h) % 6;\n\n\tvar f = h - Math.floor(h);\n\tvar p = 255 * v * (1 - s);\n\tvar q = 255 * v * (1 - (s * f));\n\tvar t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tvar h = hsv[0];\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar vmin = Math.max(v, 0.01);\n\tvar lmin;\n\tvar sl;\n\tvar l;\n\n\tl = (2 - s) * v;\n\tlmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tvar h = hwb[0] / 360;\n\tvar wh = hwb[1] / 100;\n\tvar bl = hwb[2] / 100;\n\tvar ratio = wh + bl;\n\tvar i;\n\tvar v;\n\tvar f;\n\tvar n;\n\n\t// wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\ti = Math.floor(6 * h);\n\tv = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tn = wh + f * (v - wh); // linear interpolation\n\n\tvar r;\n\tvar g;\n\tvar b;\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tvar c = cmyk[0] / 100;\n\tvar m = cmyk[1] / 100;\n\tvar y = cmyk[2] / 100;\n\tvar k = cmyk[3] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = 1 - Math.min(1, c * (1 - k) + k);\n\tg = 1 - Math.min(1, m * (1 - k) + k);\n\tb = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tvar x = xyz[0] / 100;\n\tvar y = xyz[1] / 100;\n\tvar z = xyz[2] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar x;\n\tvar y;\n\tvar z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tvar y2 = Math.pow(y, 3);\n\tvar x2 = Math.pow(x, 3);\n\tvar z2 = Math.pow(z, 3);\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar hr;\n\tvar h;\n\tvar c;\n\n\thr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tc = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tvar l = lch[0];\n\tvar c = lch[1];\n\tvar h = lch[2];\n\tvar a;\n\tvar b;\n\tvar hr;\n\n\thr = h / 360 * 2 * Math.PI;\n\ta = c * Math.cos(hr);\n\tb = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tvar ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\n\t// we use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tvar ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tvar color = args % 10;\n\n\t// handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tvar mult = (~~(args > 50) + 1) * 0.5;\n\tvar r = ((color & 1) * mult) * 255;\n\tvar g = (((color >> 1) & 1) * mult) * 255;\n\tvar b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// handle greyscale\n\tif (args >= 232) {\n\t\tvar c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tvar rem;\n\tvar r = Math.floor(args / 36) / 5 * 255;\n\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tvar b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tvar match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tvar colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(function (char) {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tvar integer = parseInt(colorString, 16);\n\tvar r = (integer >> 16) & 0xFF;\n\tvar g = (integer >> 8) & 0xFF;\n\tvar b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar max = Math.max(Math.max(r, g), b);\n\tvar min = Math.min(Math.min(r, g), b);\n\tvar chroma = (max - min);\n\tvar grayscale;\n\tvar hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar c = 1;\n\tvar f = 0;\n\n\tif (l < 0.5) {\n\t\tc = 2.0 * s * l;\n\t} else {\n\t\tc = 2.0 * s * (1.0 - l);\n\t}\n\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\n\tvar c = s * v;\n\tvar f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tvar h = hcg[0] / 360;\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tvar pure = [0, 0, 0];\n\tvar hi = (h % 1) * 6;\n\tvar v = hi % 1;\n\tvar w = 1 - v;\n\tvar mg = 0;\n\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar v = c + g * (1.0 - c);\n\tvar f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar l = g * (1.0 - c) + 0.5 * c;\n\tvar s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\tvar v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tvar w = hwb[1] / 100;\n\tvar b = hwb[2] / 100;\n\tvar v = 1 - b;\n\tvar c = v - w;\n\tvar g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = convert.gray.hsv = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tvar val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tvar integer = (val << 16) + (val << 8) + val;\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tvar val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n});\nvar conversions_1 = conversions.rgb;\nvar conversions_2 = conversions.hsl;\nvar conversions_3 = conversions.hsv;\nvar conversions_4 = conversions.hwb;\nvar conversions_5 = conversions.cmyk;\nvar conversions_6 = conversions.xyz;\nvar conversions_7 = conversions.lab;\nvar conversions_8 = conversions.lch;\nvar conversions_9 = conversions.hex;\nvar conversions_10 = conversions.keyword;\nvar conversions_11 = conversions.ansi16;\nvar conversions_12 = conversions.ansi256;\nvar conversions_13 = conversions.hcg;\nvar conversions_14 = conversions.apple;\nvar conversions_15 = conversions.gray;\n\n/*\n\tthis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tvar graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tvar models = Object.keys(conversions);\n\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tvar graph = buildGraph();\n\tvar queue = [fromModel]; // unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tvar current = queue.pop();\n\t\tvar adjacents = Object.keys(conversions[current]);\n\n\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tvar adjacent = adjacents[i];\n\t\t\tvar node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tvar path = [graph[toModel].parent, toModel];\n\tvar fn = conversions[graph[toModel].parent][toModel];\n\n\tvar cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nvar route = function (fromModel) {\n\tvar graph = deriveBFS(fromModel);\n\tvar conversion = {};\n\n\tvar models = Object.keys(graph);\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tvar toModel = models[i];\n\t\tvar node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// no possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\nvar convert = {};\n\nvar models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\tvar result = fn(args);\n\n\t\t// we're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(function (fromModel) {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tvar routes = route(fromModel);\n\tvar routeModels = Object.keys(routes);\n\n\trouteModels.forEach(function (toModel) {\n\t\tvar fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nvar colorConvert = convert;\n\nvar colorName$1 = {\n\t\"aliceblue\": [240, 248, 255],\n\t\"antiquewhite\": [250, 235, 215],\n\t\"aqua\": [0, 255, 255],\n\t\"aquamarine\": [127, 255, 212],\n\t\"azure\": [240, 255, 255],\n\t\"beige\": [245, 245, 220],\n\t\"bisque\": [255, 228, 196],\n\t\"black\": [0, 0, 0],\n\t\"blanchedalmond\": [255, 235, 205],\n\t\"blue\": [0, 0, 255],\n\t\"blueviolet\": [138, 43, 226],\n\t\"brown\": [165, 42, 42],\n\t\"burlywood\": [222, 184, 135],\n\t\"cadetblue\": [95, 158, 160],\n\t\"chartreuse\": [127, 255, 0],\n\t\"chocolate\": [210, 105, 30],\n\t\"coral\": [255, 127, 80],\n\t\"cornflowerblue\": [100, 149, 237],\n\t\"cornsilk\": [255, 248, 220],\n\t\"crimson\": [220, 20, 60],\n\t\"cyan\": [0, 255, 255],\n\t\"darkblue\": [0, 0, 139],\n\t\"darkcyan\": [0, 139, 139],\n\t\"darkgoldenrod\": [184, 134, 11],\n\t\"darkgray\": [169, 169, 169],\n\t\"darkgreen\": [0, 100, 0],\n\t\"darkgrey\": [169, 169, 169],\n\t\"darkkhaki\": [189, 183, 107],\n\t\"darkmagenta\": [139, 0, 139],\n\t\"darkolivegreen\": [85, 107, 47],\n\t\"darkorange\": [255, 140, 0],\n\t\"darkorchid\": [153, 50, 204],\n\t\"darkred\": [139, 0, 0],\n\t\"darksalmon\": [233, 150, 122],\n\t\"darkseagreen\": [143, 188, 143],\n\t\"darkslateblue\": [72, 61, 139],\n\t\"darkslategray\": [47, 79, 79],\n\t\"darkslategrey\": [47, 79, 79],\n\t\"darkturquoise\": [0, 206, 209],\n\t\"darkviolet\": [148, 0, 211],\n\t\"deeppink\": [255, 20, 147],\n\t\"deepskyblue\": [0, 191, 255],\n\t\"dimgray\": [105, 105, 105],\n\t\"dimgrey\": [105, 105, 105],\n\t\"dodgerblue\": [30, 144, 255],\n\t\"firebrick\": [178, 34, 34],\n\t\"floralwhite\": [255, 250, 240],\n\t\"forestgreen\": [34, 139, 34],\n\t\"fuchsia\": [255, 0, 255],\n\t\"gainsboro\": [220, 220, 220],\n\t\"ghostwhite\": [248, 248, 255],\n\t\"gold\": [255, 215, 0],\n\t\"goldenrod\": [218, 165, 32],\n\t\"gray\": [128, 128, 128],\n\t\"green\": [0, 128, 0],\n\t\"greenyellow\": [173, 255, 47],\n\t\"grey\": [128, 128, 128],\n\t\"honeydew\": [240, 255, 240],\n\t\"hotpink\": [255, 105, 180],\n\t\"indianred\": [205, 92, 92],\n\t\"indigo\": [75, 0, 130],\n\t\"ivory\": [255, 255, 240],\n\t\"khaki\": [240, 230, 140],\n\t\"lavender\": [230, 230, 250],\n\t\"lavenderblush\": [255, 240, 245],\n\t\"lawngreen\": [124, 252, 0],\n\t\"lemonchiffon\": [255, 250, 205],\n\t\"lightblue\": [173, 216, 230],\n\t\"lightcoral\": [240, 128, 128],\n\t\"lightcyan\": [224, 255, 255],\n\t\"lightgoldenrodyellow\": [250, 250, 210],\n\t\"lightgray\": [211, 211, 211],\n\t\"lightgreen\": [144, 238, 144],\n\t\"lightgrey\": [211, 211, 211],\n\t\"lightpink\": [255, 182, 193],\n\t\"lightsalmon\": [255, 160, 122],\n\t\"lightseagreen\": [32, 178, 170],\n\t\"lightskyblue\": [135, 206, 250],\n\t\"lightslategray\": [119, 136, 153],\n\t\"lightslategrey\": [119, 136, 153],\n\t\"lightsteelblue\": [176, 196, 222],\n\t\"lightyellow\": [255, 255, 224],\n\t\"lime\": [0, 255, 0],\n\t\"limegreen\": [50, 205, 50],\n\t\"linen\": [250, 240, 230],\n\t\"magenta\": [255, 0, 255],\n\t\"maroon\": [128, 0, 0],\n\t\"mediumaquamarine\": [102, 205, 170],\n\t\"mediumblue\": [0, 0, 205],\n\t\"mediumorchid\": [186, 85, 211],\n\t\"mediumpurple\": [147, 112, 219],\n\t\"mediumseagreen\": [60, 179, 113],\n\t\"mediumslateblue\": [123, 104, 238],\n\t\"mediumspringgreen\": [0, 250, 154],\n\t\"mediumturquoise\": [72, 209, 204],\n\t\"mediumvioletred\": [199, 21, 133],\n\t\"midnightblue\": [25, 25, 112],\n\t\"mintcream\": [245, 255, 250],\n\t\"mistyrose\": [255, 228, 225],\n\t\"moccasin\": [255, 228, 181],\n\t\"navajowhite\": [255, 222, 173],\n\t\"navy\": [0, 0, 128],\n\t\"oldlace\": [253, 245, 230],\n\t\"olive\": [128, 128, 0],\n\t\"olivedrab\": [107, 142, 35],\n\t\"orange\": [255, 165, 0],\n\t\"orangered\": [255, 69, 0],\n\t\"orchid\": [218, 112, 214],\n\t\"palegoldenrod\": [238, 232, 170],\n\t\"palegreen\": [152, 251, 152],\n\t\"paleturquoise\": [175, 238, 238],\n\t\"palevioletred\": [219, 112, 147],\n\t\"papayawhip\": [255, 239, 213],\n\t\"peachpuff\": [255, 218, 185],\n\t\"peru\": [205, 133, 63],\n\t\"pink\": [255, 192, 203],\n\t\"plum\": [221, 160, 221],\n\t\"powderblue\": [176, 224, 230],\n\t\"purple\": [128, 0, 128],\n\t\"rebeccapurple\": [102, 51, 153],\n\t\"red\": [255, 0, 0],\n\t\"rosybrown\": [188, 143, 143],\n\t\"royalblue\": [65, 105, 225],\n\t\"saddlebrown\": [139, 69, 19],\n\t\"salmon\": [250, 128, 114],\n\t\"sandybrown\": [244, 164, 96],\n\t\"seagreen\": [46, 139, 87],\n\t\"seashell\": [255, 245, 238],\n\t\"sienna\": [160, 82, 45],\n\t\"silver\": [192, 192, 192],\n\t\"skyblue\": [135, 206, 235],\n\t\"slateblue\": [106, 90, 205],\n\t\"slategray\": [112, 128, 144],\n\t\"slategrey\": [112, 128, 144],\n\t\"snow\": [255, 250, 250],\n\t\"springgreen\": [0, 255, 127],\n\t\"steelblue\": [70, 130, 180],\n\t\"tan\": [210, 180, 140],\n\t\"teal\": [0, 128, 128],\n\t\"thistle\": [216, 191, 216],\n\t\"tomato\": [255, 99, 71],\n\t\"turquoise\": [64, 224, 208],\n\t\"violet\": [238, 130, 238],\n\t\"wheat\": [245, 222, 179],\n\t\"white\": [255, 255, 255],\n\t\"whitesmoke\": [245, 245, 245],\n\t\"yellow\": [255, 255, 0],\n\t\"yellowgreen\": [154, 205, 50]\n};\n\n/* MIT license */\n\n\nvar colorString = {\n getRgba: getRgba,\n getHsla: getHsla,\n getRgb: getRgb,\n getHsl: getHsl,\n getHwb: getHwb,\n getAlpha: getAlpha,\n\n hexString: hexString,\n rgbString: rgbString,\n rgbaString: rgbaString,\n percentString: percentString,\n percentaString: percentaString,\n hslString: hslString,\n hslaString: hslaString,\n hwbString: hwbString,\n keyword: keyword\n};\n\nfunction getRgba(string) {\n if (!string) {\n return;\n }\n var abbr = /^#([a-fA-F0-9]{3,4})$/i,\n hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i,\n rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n keyword = /(\\w+)/;\n\n var rgb = [0, 0, 0],\n a = 1,\n match = string.match(abbr),\n hexAlpha = \"\";\n if (match) {\n match = match[1];\n hexAlpha = match[3];\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = parseInt(match[i] + match[i], 16);\n }\n if (hexAlpha) {\n a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100;\n }\n }\n else if (match = string.match(hex)) {\n hexAlpha = match[2];\n match = match[1];\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n }\n if (hexAlpha) {\n a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100;\n }\n }\n else if (match = string.match(rgba)) {\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = parseInt(match[i + 1]);\n }\n a = parseFloat(match[4]);\n }\n else if (match = string.match(per)) {\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n }\n a = parseFloat(match[4]);\n }\n else if (match = string.match(keyword)) {\n if (match[1] == \"transparent\") {\n return [0, 0, 0, 0];\n }\n rgb = colorName$1[match[1]];\n if (!rgb) {\n return;\n }\n }\n\n for (var i = 0; i < rgb.length; i++) {\n rgb[i] = scale(rgb[i], 0, 255);\n }\n if (!a && a != 0) {\n a = 1;\n }\n else {\n a = scale(a, 0, 1);\n }\n rgb[3] = a;\n return rgb;\n}\n\nfunction getHsla(string) {\n if (!string) {\n return;\n }\n var hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n var match = string.match(hsl);\n if (match) {\n var alpha = parseFloat(match[4]);\n var h = scale(parseInt(match[1]), 0, 360),\n s = scale(parseFloat(match[2]), 0, 100),\n l = scale(parseFloat(match[3]), 0, 100),\n a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n return [h, s, l, a];\n }\n}\n\nfunction getHwb(string) {\n if (!string) {\n return;\n }\n var hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n var match = string.match(hwb);\n if (match) {\n var alpha = parseFloat(match[4]);\n var h = scale(parseInt(match[1]), 0, 360),\n w = scale(parseFloat(match[2]), 0, 100),\n b = scale(parseFloat(match[3]), 0, 100),\n a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n return [h, w, b, a];\n }\n}\n\nfunction getRgb(string) {\n var rgba = getRgba(string);\n return rgba && rgba.slice(0, 3);\n}\n\nfunction getHsl(string) {\n var hsla = getHsla(string);\n return hsla && hsla.slice(0, 3);\n}\n\nfunction getAlpha(string) {\n var vals = getRgba(string);\n if (vals) {\n return vals[3];\n }\n else if (vals = getHsla(string)) {\n return vals[3];\n }\n else if (vals = getHwb(string)) {\n return vals[3];\n }\n}\n\n// generators\nfunction hexString(rgba, a) {\n var a = (a !== undefined && rgba.length === 3) ? a : rgba[3];\n return \"#\" + hexDouble(rgba[0]) \n + hexDouble(rgba[1])\n + hexDouble(rgba[2])\n + (\n (a >= 0 && a < 1)\n ? hexDouble(Math.round(a * 255))\n : \"\"\n );\n}\n\nfunction rgbString(rgba, alpha) {\n if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n return rgbaString(rgba, alpha);\n }\n return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n}\n\nfunction rgbaString(rgba, alpha) {\n if (alpha === undefined) {\n alpha = (rgba[3] !== undefined ? rgba[3] : 1);\n }\n return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2]\n + \", \" + alpha + \")\";\n}\n\nfunction percentString(rgba, alpha) {\n if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n return percentaString(rgba, alpha);\n }\n var r = Math.round(rgba[0]/255 * 100),\n g = Math.round(rgba[1]/255 * 100),\n b = Math.round(rgba[2]/255 * 100);\n\n return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n}\n\nfunction percentaString(rgba, alpha) {\n var r = Math.round(rgba[0]/255 * 100),\n g = Math.round(rgba[1]/255 * 100),\n b = Math.round(rgba[2]/255 * 100);\n return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n}\n\nfunction hslString(hsla, alpha) {\n if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {\n return hslaString(hsla, alpha);\n }\n return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n}\n\nfunction hslaString(hsla, alpha) {\n if (alpha === undefined) {\n alpha = (hsla[3] !== undefined ? hsla[3] : 1);\n }\n return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \"\n + alpha + \")\";\n}\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\nfunction hwbString(hwb, alpha) {\n if (alpha === undefined) {\n alpha = (hwb[3] !== undefined ? hwb[3] : 1);\n }\n return \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\"\n + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n}\n\nfunction keyword(rgb) {\n return reverseNames[rgb.slice(0, 3)];\n}\n\n// helpers\nfunction scale(num, min, max) {\n return Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n var str = num.toString(16).toUpperCase();\n return (str.length < 2) ? \"0\" + str : str;\n}\n\n\n//create a list of reverse color names\nvar reverseNames = {};\nfor (var name in colorName$1) {\n reverseNames[colorName$1[name]] = name;\n}\n\n/* MIT license */\n\n\n\nvar Color = function (obj) {\n\tif (obj instanceof Color) {\n\t\treturn obj;\n\t}\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj);\n\t}\n\n\tthis.valid = false;\n\tthis.values = {\n\t\trgb: [0, 0, 0],\n\t\thsl: [0, 0, 0],\n\t\thsv: [0, 0, 0],\n\t\thwb: [0, 0, 0],\n\t\tcmyk: [0, 0, 0, 0],\n\t\talpha: 1\n\t};\n\n\t// parse Color() argument\n\tvar vals;\n\tif (typeof obj === 'string') {\n\t\tvals = colorString.getRgba(obj);\n\t\tif (vals) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals = colorString.getHsla(obj)) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals = colorString.getHwb(obj)) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t}\n\t} else if (typeof obj === 'object') {\n\t\tvals = obj;\n\t\tif (vals.r !== undefined || vals.red !== undefined) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals.l !== undefined || vals.lightness !== undefined) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals.v !== undefined || vals.value !== undefined) {\n\t\t\tthis.setValues('hsv', vals);\n\t\t} else if (vals.w !== undefined || vals.whiteness !== undefined) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t} else if (vals.c !== undefined || vals.cyan !== undefined) {\n\t\t\tthis.setValues('cmyk', vals);\n\t\t}\n\t}\n};\n\nColor.prototype = {\n\tisValid: function () {\n\t\treturn this.valid;\n\t},\n\trgb: function () {\n\t\treturn this.setSpace('rgb', arguments);\n\t},\n\thsl: function () {\n\t\treturn this.setSpace('hsl', arguments);\n\t},\n\thsv: function () {\n\t\treturn this.setSpace('hsv', arguments);\n\t},\n\thwb: function () {\n\t\treturn this.setSpace('hwb', arguments);\n\t},\n\tcmyk: function () {\n\t\treturn this.setSpace('cmyk', arguments);\n\t},\n\n\trgbArray: function () {\n\t\treturn this.values.rgb;\n\t},\n\thslArray: function () {\n\t\treturn this.values.hsl;\n\t},\n\thsvArray: function () {\n\t\treturn this.values.hsv;\n\t},\n\thwbArray: function () {\n\t\tvar values = this.values;\n\t\tif (values.alpha !== 1) {\n\t\t\treturn values.hwb.concat([values.alpha]);\n\t\t}\n\t\treturn values.hwb;\n\t},\n\tcmykArray: function () {\n\t\treturn this.values.cmyk;\n\t},\n\trgbaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.rgb.concat([values.alpha]);\n\t},\n\thslaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.hsl.concat([values.alpha]);\n\t},\n\talpha: function (val) {\n\t\tif (val === undefined) {\n\t\t\treturn this.values.alpha;\n\t\t}\n\t\tthis.setValues('alpha', val);\n\t\treturn this;\n\t},\n\n\tred: function (val) {\n\t\treturn this.setChannel('rgb', 0, val);\n\t},\n\tgreen: function (val) {\n\t\treturn this.setChannel('rgb', 1, val);\n\t},\n\tblue: function (val) {\n\t\treturn this.setChannel('rgb', 2, val);\n\t},\n\thue: function (val) {\n\t\tif (val) {\n\t\t\tval %= 360;\n\t\t\tval = val < 0 ? 360 + val : val;\n\t\t}\n\t\treturn this.setChannel('hsl', 0, val);\n\t},\n\tsaturation: function (val) {\n\t\treturn this.setChannel('hsl', 1, val);\n\t},\n\tlightness: function (val) {\n\t\treturn this.setChannel('hsl', 2, val);\n\t},\n\tsaturationv: function (val) {\n\t\treturn this.setChannel('hsv', 1, val);\n\t},\n\twhiteness: function (val) {\n\t\treturn this.setChannel('hwb', 1, val);\n\t},\n\tblackness: function (val) {\n\t\treturn this.setChannel('hwb', 2, val);\n\t},\n\tvalue: function (val) {\n\t\treturn this.setChannel('hsv', 2, val);\n\t},\n\tcyan: function (val) {\n\t\treturn this.setChannel('cmyk', 0, val);\n\t},\n\tmagenta: function (val) {\n\t\treturn this.setChannel('cmyk', 1, val);\n\t},\n\tyellow: function (val) {\n\t\treturn this.setChannel('cmyk', 2, val);\n\t},\n\tblack: function (val) {\n\t\treturn this.setChannel('cmyk', 3, val);\n\t},\n\n\thexString: function () {\n\t\treturn colorString.hexString(this.values.rgb);\n\t},\n\trgbString: function () {\n\t\treturn colorString.rgbString(this.values.rgb, this.values.alpha);\n\t},\n\trgbaString: function () {\n\t\treturn colorString.rgbaString(this.values.rgb, this.values.alpha);\n\t},\n\tpercentString: function () {\n\t\treturn colorString.percentString(this.values.rgb, this.values.alpha);\n\t},\n\thslString: function () {\n\t\treturn colorString.hslString(this.values.hsl, this.values.alpha);\n\t},\n\thslaString: function () {\n\t\treturn colorString.hslaString(this.values.hsl, this.values.alpha);\n\t},\n\thwbString: function () {\n\t\treturn colorString.hwbString(this.values.hwb, this.values.alpha);\n\t},\n\tkeyword: function () {\n\t\treturn colorString.keyword(this.values.rgb, this.values.alpha);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.values.rgb;\n\t\treturn (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.values.rgb;\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tdark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.values.rgb;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tlight: function () {\n\t\treturn !this.dark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = [];\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb[i] = 255 - this.values.rgb[i];\n\t\t}\n\t\tthis.setValues('rgb', rgb);\n\t\treturn this;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] += hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] -= hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] += hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] -= hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[1] += hwb[1] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[2] += hwb[2] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tgreyscale: function () {\n\t\tvar rgb = this.values.rgb;\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\tthis.setValues('rgb', [val, val, val]);\n\t\treturn this;\n\t},\n\n\tclearer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha - (alpha * ratio));\n\t\treturn this;\n\t},\n\n\topaquer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha + (alpha * ratio));\n\t\treturn this;\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.values.hsl;\n\t\tvar hue = (hsl[0] + degrees) % 360;\n\t\thsl[0] = hue < 0 ? 360 + hue : hue;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\t/**\n\t * Ported from sass implementation in C\n\t * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t */\n\tmix: function (mixinColor, weight) {\n\t\tvar color1 = this;\n\t\tvar color2 = mixinColor;\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn this\n\t\t\t.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue()\n\t\t\t)\n\t\t\t.alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n\t},\n\n\ttoJSON: function () {\n\t\treturn this.rgb();\n\t},\n\n\tclone: function () {\n\t\t// NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n\t\t// making the final build way to big to embed in Chart.js. So let's do it manually,\n\t\t// assuming that values to clone are 1 dimension arrays containing only numbers,\n\t\t// except 'alpha' which is a number.\n\t\tvar result = new Color();\n\t\tvar source = this.values;\n\t\tvar target = result.values;\n\t\tvar value, type;\n\n\t\tfor (var prop in source) {\n\t\t\tif (source.hasOwnProperty(prop)) {\n\t\t\t\tvalue = source[prop];\n\t\t\t\ttype = ({}).toString.call(value);\n\t\t\t\tif (type === '[object Array]') {\n\t\t\t\t\ttarget[prop] = value.slice(0);\n\t\t\t\t} else if (type === '[object Number]') {\n\t\t\t\t\ttarget[prop] = value;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('unexpected color value:', value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n};\n\nColor.prototype.spaces = {\n\trgb: ['red', 'green', 'blue'],\n\thsl: ['hue', 'saturation', 'lightness'],\n\thsv: ['hue', 'saturation', 'value'],\n\thwb: ['hue', 'whiteness', 'blackness'],\n\tcmyk: ['cyan', 'magenta', 'yellow', 'black']\n};\n\nColor.prototype.maxes = {\n\trgb: [255, 255, 255],\n\thsl: [360, 100, 100],\n\thsv: [360, 100, 100],\n\thwb: [360, 100, 100],\n\tcmyk: [100, 100, 100, 100]\n};\n\nColor.prototype.getValues = function (space) {\n\tvar values = this.values;\n\tvar vals = {};\n\n\tfor (var i = 0; i < space.length; i++) {\n\t\tvals[space.charAt(i)] = values[space][i];\n\t}\n\n\tif (values.alpha !== 1) {\n\t\tvals.a = values.alpha;\n\t}\n\n\t// {r: 255, g: 255, b: 255, a: 0.4}\n\treturn vals;\n};\n\nColor.prototype.setValues = function (space, vals) {\n\tvar values = this.values;\n\tvar spaces = this.spaces;\n\tvar maxes = this.maxes;\n\tvar alpha = 1;\n\tvar i;\n\n\tthis.valid = true;\n\n\tif (space === 'alpha') {\n\t\talpha = vals;\n\t} else if (vals.length) {\n\t\t// [10, 10, 10]\n\t\tvalues[space] = vals.slice(0, space.length);\n\t\talpha = vals[space.length];\n\t} else if (vals[space.charAt(0)] !== undefined) {\n\t\t// {r: 10, g: 10, b: 10}\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[space.charAt(i)];\n\t\t}\n\n\t\talpha = vals.a;\n\t} else if (vals[spaces[space][0]] !== undefined) {\n\t\t// {red: 10, green: 10, blue: 10}\n\t\tvar chans = spaces[space];\n\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[chans[i]];\n\t\t}\n\n\t\talpha = vals.alpha;\n\t}\n\n\tvalues.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));\n\n\tif (space === 'alpha') {\n\t\treturn false;\n\t}\n\n\tvar capped;\n\n\t// cap values of the space prior converting all values\n\tfor (i = 0; i < space.length; i++) {\n\t\tcapped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n\t\tvalues[space][i] = Math.round(capped);\n\t}\n\n\t// convert to all the other color spaces\n\tfor (var sname in spaces) {\n\t\tif (sname !== space) {\n\t\t\tvalues[sname] = colorConvert[space][sname](values[space]);\n\t\t}\n\t}\n\n\treturn true;\n};\n\nColor.prototype.setSpace = function (space, args) {\n\tvar vals = args[0];\n\n\tif (vals === undefined) {\n\t\t// color.rgb()\n\t\treturn this.getValues(space);\n\t}\n\n\t// color.rgb(10, 10, 10)\n\tif (typeof vals === 'number') {\n\t\tvals = Array.prototype.slice.call(args);\n\t}\n\n\tthis.setValues(space, vals);\n\treturn this;\n};\n\nColor.prototype.setChannel = function (space, index, val) {\n\tvar svalues = this.values[space];\n\tif (val === undefined) {\n\t\t// color.red()\n\t\treturn svalues[index];\n\t} else if (val === svalues[index]) {\n\t\t// color.red(color.red())\n\t\treturn this;\n\t}\n\n\t// color.red(100)\n\tsvalues[index] = val;\n\tthis.setValues(space, svalues);\n\n\treturn this;\n};\n\nif (typeof window !== 'undefined') {\n\twindow.Color = Color;\n}\n\nvar chartjsColor = Color;\n\nfunction isValidKey(key) {\n\treturn ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * @namespace Chart.helpers\n */\nvar helpers = {\n\t/**\n\t * An empty function that can be used, for example, for optional callback.\n\t */\n\tnoop: function() {},\n\n\t/**\n\t * Returns a unique id, sequentially generated from a global variable.\n\t * @returns {number}\n\t * @function\n\t */\n\tuid: (function() {\n\t\tvar id = 0;\n\t\treturn function() {\n\t\t\treturn id++;\n\t\t};\n\t}()),\n\n\t/**\n\t * Returns true if `value` is neither null nor undefined, else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {boolean}\n\t * @since 2.7.0\n\t */\n\tisNullOrUndef: function(value) {\n\t\treturn value === null || typeof value === 'undefined';\n\t},\n\n\t/**\n\t * Returns true if `value` is an array (including typed arrays), else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {boolean}\n\t * @function\n\t */\n\tisArray: function(value) {\n\t\tif (Array.isArray && Array.isArray(value)) {\n\t\t\treturn true;\n\t\t}\n\t\tvar type = Object.prototype.toString.call(value);\n\t\tif (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\n\t/**\n\t * Returns true if `value` is an object (excluding null), else returns false.\n\t * @param {*} value - The value to test.\n\t * @returns {boolean}\n\t * @since 2.7.0\n\t */\n\tisObject: function(value) {\n\t\treturn value !== null && Object.prototype.toString.call(value) === '[object Object]';\n\t},\n\n\t/**\n\t * Returns true if `value` is a finite number, else returns false\n\t * @param {*} value - The value to test.\n\t * @returns {boolean}\n\t */\n\tisFinite: function(value) {\n\t\treturn (typeof value === 'number' || value instanceof Number) && isFinite(value);\n\t},\n\n\t/**\n\t * Returns `value` if defined, else returns `defaultValue`.\n\t * @param {*} value - The value to return if defined.\n\t * @param {*} defaultValue - The value to return if `value` is undefined.\n\t * @returns {*}\n\t */\n\tvalueOrDefault: function(value, defaultValue) {\n\t\treturn typeof value === 'undefined' ? defaultValue : value;\n\t},\n\n\t/**\n\t * Returns value at the given `index` in array if defined, else returns `defaultValue`.\n\t * @param {Array} value - The array to lookup for value at `index`.\n\t * @param {number} index - The index in `value` to lookup for value.\n\t * @param {*} defaultValue - The value to return if `value[index]` is undefined.\n\t * @returns {*}\n\t */\n\tvalueAtIndexOrDefault: function(value, index, defaultValue) {\n\t\treturn helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\n\t},\n\n\t/**\n\t * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n\t * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n\t * @param {function} fn - The function to call.\n\t * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\n\t * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.\n\t * @returns {*}\n\t */\n\tcallback: function(fn, args, thisArg) {\n\t\tif (fn && typeof fn.call === 'function') {\n\t\t\treturn fn.apply(thisArg, args);\n\t\t}\n\t},\n\n\t/**\n\t * Note(SB) for performance sake, this method should only be used when loopable type\n\t * is unknown or in none intensive code (not called often and small loopable). Else\n\t * it's preferable to use a regular for() loop and save extra function calls.\n\t * @param {object|Array} loopable - The object or array to be iterated.\n\t * @param {function} fn - The function to call for each item.\n\t * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.\n\t * @param {boolean} [reverse] - If true, iterates backward on the loopable.\n\t */\n\teach: function(loopable, fn, thisArg, reverse) {\n\t\tvar i, len, keys;\n\t\tif (helpers.isArray(loopable)) {\n\t\t\tlen = loopable.length;\n\t\t\tif (reverse) {\n\t\t\t\tfor (i = len - 1; i >= 0; i--) {\n\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (helpers.isObject(loopable)) {\n\t\t\tkeys = Object.keys(loopable);\n\t\t\tlen = keys.length;\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tfn.call(thisArg, loopable[keys[i]], keys[i]);\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n\t * @see https://stackoverflow.com/a/14853974\n\t * @param {Array} a0 - The array to compare\n\t * @param {Array} a1 - The array to compare\n\t * @returns {boolean}\n\t */\n\tarrayEquals: function(a0, a1) {\n\t\tvar i, ilen, v0, v1;\n\n\t\tif (!a0 || !a1 || a0.length !== a1.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (i = 0, ilen = a0.length; i < ilen; ++i) {\n\t\t\tv0 = a0[i];\n\t\t\tv1 = a1[i];\n\n\t\t\tif (v0 instanceof Array && v1 instanceof Array) {\n\t\t\t\tif (!helpers.arrayEquals(v0, v1)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else if (v0 !== v1) {\n\t\t\t\t// NOTE: two different object instances will never be equal: {x:20} != {x:20}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t/**\n\t * Returns a deep copy of `source` without keeping references on objects and arrays.\n\t * @param {*} source - The value to clone.\n\t * @returns {*}\n\t */\n\tclone: function(source) {\n\t\tif (helpers.isArray(source)) {\n\t\t\treturn source.map(helpers.clone);\n\t\t}\n\n\t\tif (helpers.isObject(source)) {\n\t\t\tvar target = Object.create(source);\n\t\t\tvar keys = Object.keys(source);\n\t\t\tvar klen = keys.length;\n\t\t\tvar k = 0;\n\n\t\t\tfor (; k < klen; ++k) {\n\t\t\t\ttarget[keys[k]] = helpers.clone(source[keys[k]]);\n\t\t\t}\n\n\t\t\treturn target;\n\t\t}\n\n\t\treturn source;\n\t},\n\n\t/**\n\t * The default merger when Chart.helpers.merge is called without merger option.\n\t * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n\t * @private\n\t */\n\t_merger: function(key, target, source, options) {\n\t\tif (!isValidKey(key)) {\n\t\t\t// We want to ensure we do not copy prototypes over\n\t\t\t// as this can pollute global namespaces\n\t\t\treturn;\n\t\t}\n\n\t\tvar tval = target[key];\n\t\tvar sval = source[key];\n\n\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\thelpers.merge(tval, sval, options);\n\t\t} else {\n\t\t\ttarget[key] = helpers.clone(sval);\n\t\t}\n\t},\n\n\t/**\n\t * Merges source[key] in target[key] only if target[key] is undefined.\n\t * @private\n\t */\n\t_mergerIf: function(key, target, source) {\n\t\tif (!isValidKey(key)) {\n\t\t\t// We want to ensure we do not copy prototypes over\n\t\t\t// as this can pollute global namespaces\n\t\t\treturn;\n\t\t}\n\n\t\tvar tval = target[key];\n\t\tvar sval = source[key];\n\n\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\thelpers.mergeIf(tval, sval);\n\t\t} else if (!target.hasOwnProperty(key)) {\n\t\t\ttarget[key] = helpers.clone(sval);\n\t\t}\n\t},\n\n\t/**\n\t * Recursively deep copies `source` properties into `target` with the given `options`.\n\t * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n\t * @param {object} target - The target object in which all sources are merged into.\n\t * @param {object|object[]} source - Object(s) to merge into `target`.\n\t * @param {object} [options] - Merging options:\n\t * @param {function} [options.merger] - The merge method (key, target, source, options)\n\t * @returns {object} The `target` object.\n\t */\n\tmerge: function(target, source, options) {\n\t\tvar sources = helpers.isArray(source) ? source : [source];\n\t\tvar ilen = sources.length;\n\t\tvar merge, i, keys, klen, k;\n\n\t\tif (!helpers.isObject(target)) {\n\t\t\treturn target;\n\t\t}\n\n\t\toptions = options || {};\n\t\tmerge = options.merger || helpers._merger;\n\n\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\tsource = sources[i];\n\t\t\tif (!helpers.isObject(source)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tkeys = Object.keys(source);\n\t\t\tfor (k = 0, klen = keys.length; k < klen; ++k) {\n\t\t\t\tmerge(keys[k], target, source, options);\n\t\t\t}\n\t\t}\n\n\t\treturn target;\n\t},\n\n\t/**\n\t * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n\t * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n\t * @param {object} target - The target object in which all sources are merged into.\n\t * @param {object|object[]} source - Object(s) to merge into `target`.\n\t * @returns {object} The `target` object.\n\t */\n\tmergeIf: function(target, source) {\n\t\treturn helpers.merge(target, source, {merger: helpers._mergerIf});\n\t},\n\n\t/**\n\t * Applies the contents of two or more objects together into the first object.\n\t * @param {object} target - The target object in which all objects are merged into.\n\t * @param {object} arg1 - Object containing additional properties to merge in target.\n\t * @param {object} argN - Additional objects containing properties to merge in target.\n\t * @returns {object} The `target` object.\n\t */\n\textend: Object.assign || function(target) {\n\t\treturn helpers.merge(target, [].slice.call(arguments, 1), {\n\t\t\tmerger: function(key, dst, src) {\n\t\t\t\tdst[key] = src[key];\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Basic javascript inheritance based on the model created in Backbone.js\n\t */\n\tinherits: function(extensions) {\n\t\tvar me = this;\n\t\tvar ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {\n\t\t\treturn me.apply(this, arguments);\n\t\t};\n\n\t\tvar Surrogate = function() {\n\t\t\tthis.constructor = ChartElement;\n\t\t};\n\n\t\tSurrogate.prototype = me.prototype;\n\t\tChartElement.prototype = new Surrogate();\n\t\tChartElement.extend = helpers.inherits;\n\n\t\tif (extensions) {\n\t\t\thelpers.extend(ChartElement.prototype, extensions);\n\t\t}\n\n\t\tChartElement.__super__ = me.prototype;\n\t\treturn ChartElement;\n\t},\n\n\t_deprecated: function(scope, value, previous, current) {\n\t\tif (value !== undefined) {\n\t\t\tconsole.warn(scope + ': \"' + previous +\n\t\t\t\t'\" is deprecated. Please use \"' + current + '\" instead');\n\t\t}\n\t}\n};\n\nvar helpers_core = helpers;\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.callback instead.\n * @function Chart.helpers.callCallback\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\nhelpers.callCallback = helpers.callback;\n\n/**\n * Provided for backward compatibility, use Array.prototype.indexOf instead.\n * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+\n * @function Chart.helpers.indexOf\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.indexOf = function(array, item, fromIndex) {\n\treturn Array.prototype.indexOf.call(array, item, fromIndex);\n};\n\n/**\n * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.\n * @function Chart.helpers.getValueOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.getValueOrDefault = helpers.valueOrDefault;\n\n/**\n * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.\n * @function Chart.helpers.getValueAtIndexOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easingEffects\n * @see http://www.robertpenner.com/easing/\n */\nvar effects = {\n\tlinear: function(t) {\n\t\treturn t;\n\t},\n\n\teaseInQuad: function(t) {\n\t\treturn t * t;\n\t},\n\n\teaseOutQuad: function(t) {\n\t\treturn -t * (t - 2);\n\t},\n\n\teaseInOutQuad: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t;\n\t\t}\n\t\treturn -0.5 * ((--t) * (t - 2) - 1);\n\t},\n\n\teaseInCubic: function(t) {\n\t\treturn t * t * t;\n\t},\n\n\teaseOutCubic: function(t) {\n\t\treturn (t = t - 1) * t * t + 1;\n\t},\n\n\teaseInOutCubic: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t;\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * t + 2);\n\t},\n\n\teaseInQuart: function(t) {\n\t\treturn t * t * t * t;\n\t},\n\n\teaseOutQuart: function(t) {\n\t\treturn -((t = t - 1) * t * t * t - 1);\n\t},\n\n\teaseInOutQuart: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t * t;\n\t\t}\n\t\treturn -0.5 * ((t -= 2) * t * t * t - 2);\n\t},\n\n\teaseInQuint: function(t) {\n\t\treturn t * t * t * t * t;\n\t},\n\n\teaseOutQuint: function(t) {\n\t\treturn (t = t - 1) * t * t * t * t + 1;\n\t},\n\n\teaseInOutQuint: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * t * t * t * t * t;\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * t * t * t + 2);\n\t},\n\n\teaseInSine: function(t) {\n\t\treturn -Math.cos(t * (Math.PI / 2)) + 1;\n\t},\n\n\teaseOutSine: function(t) {\n\t\treturn Math.sin(t * (Math.PI / 2));\n\t},\n\n\teaseInOutSine: function(t) {\n\t\treturn -0.5 * (Math.cos(Math.PI * t) - 1);\n\t},\n\n\teaseInExpo: function(t) {\n\t\treturn (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));\n\t},\n\n\teaseOutExpo: function(t) {\n\t\treturn (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;\n\t},\n\n\teaseInOutExpo: function(t) {\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * Math.pow(2, 10 * (t - 1));\n\t\t}\n\t\treturn 0.5 * (-Math.pow(2, -10 * --t) + 2);\n\t},\n\n\teaseInCirc: function(t) {\n\t\tif (t >= 1) {\n\t\t\treturn t;\n\t\t}\n\t\treturn -(Math.sqrt(1 - t * t) - 1);\n\t},\n\n\teaseOutCirc: function(t) {\n\t\treturn Math.sqrt(1 - (t = t - 1) * t);\n\t},\n\n\teaseInOutCirc: function(t) {\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn -0.5 * (Math.sqrt(1 - t * t) - 1);\n\t\t}\n\t\treturn 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n\t},\n\n\teaseInElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.3;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\treturn -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t},\n\n\teaseOutElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (t === 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.3;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\treturn a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\n\t},\n\n\teaseInOutElastic: function(t) {\n\t\tvar s = 1.70158;\n\t\tvar p = 0;\n\t\tvar a = 1;\n\t\tif (t === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif ((t /= 0.5) === 2) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!p) {\n\t\t\tp = 0.45;\n\t\t}\n\t\tif (a < 1) {\n\t\t\ta = 1;\n\t\t\ts = p / 4;\n\t\t} else {\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t}\n\t\tif (t < 1) {\n\t\t\treturn -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t\t}\n\t\treturn a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\n\t},\n\teaseInBack: function(t) {\n\t\tvar s = 1.70158;\n\t\treturn t * t * ((s + 1) * t - s);\n\t},\n\n\teaseOutBack: function(t) {\n\t\tvar s = 1.70158;\n\t\treturn (t = t - 1) * t * ((s + 1) * t + s) + 1;\n\t},\n\n\teaseInOutBack: function(t) {\n\t\tvar s = 1.70158;\n\t\tif ((t /= 0.5) < 1) {\n\t\t\treturn 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n\t\t}\n\t\treturn 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n\t},\n\n\teaseInBounce: function(t) {\n\t\treturn 1 - effects.easeOutBounce(1 - t);\n\t},\n\n\teaseOutBounce: function(t) {\n\t\tif (t < (1 / 2.75)) {\n\t\t\treturn 7.5625 * t * t;\n\t\t}\n\t\tif (t < (2 / 2.75)) {\n\t\t\treturn 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;\n\t\t}\n\t\tif (t < (2.5 / 2.75)) {\n\t\t\treturn 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;\n\t\t}\n\t\treturn 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;\n\t},\n\n\teaseInOutBounce: function(t) {\n\t\tif (t < 0.5) {\n\t\t\treturn effects.easeInBounce(t * 2) * 0.5;\n\t\t}\n\t\treturn effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n\t}\n};\n\nvar helpers_easing = {\n\teffects: effects\n};\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.easing.effects instead.\n * @function Chart.helpers.easingEffects\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers_core.easingEffects = effects;\n\nvar PI = Math.PI;\nvar RAD_PER_DEG = PI / 180;\nvar DOUBLE_PI = PI * 2;\nvar HALF_PI = PI / 2;\nvar QUARTER_PI = PI / 4;\nvar TWO_THIRDS_PI = PI * 2 / 3;\n\n/**\n * @namespace Chart.helpers.canvas\n */\nvar exports$1 = {\n\t/**\n\t * Clears the entire canvas associated to the given `chart`.\n\t * @param {Chart} chart - The chart for which to clear the canvas.\n\t */\n\tclear: function(chart) {\n\t\tchart.ctx.clearRect(0, 0, chart.width, chart.height);\n\t},\n\n\t/**\n\t * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\n\t * given size (width, height) and the same `radius` for all corners.\n\t * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\n\t * @param {number} x - The x axis of the coordinate for the rectangle starting point.\n\t * @param {number} y - The y axis of the coordinate for the rectangle starting point.\n\t * @param {number} width - The rectangle's width.\n\t * @param {number} height - The rectangle's height.\n\t * @param {number} radius - The rounded amount (in pixels) for the four corners.\n\t * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\n\t */\n\troundedRect: function(ctx, x, y, width, height, radius) {\n\t\tif (radius) {\n\t\t\tvar r = Math.min(radius, height / 2, width / 2);\n\t\t\tvar left = x + r;\n\t\t\tvar top = y + r;\n\t\t\tvar right = x + width - r;\n\t\t\tvar bottom = y + height - r;\n\n\t\t\tctx.moveTo(x, top);\n\t\t\tif (left < right && top < bottom) {\n\t\t\t\tctx.arc(left, top, r, -PI, -HALF_PI);\n\t\t\t\tctx.arc(right, top, r, -HALF_PI, 0);\n\t\t\t\tctx.arc(right, bottom, r, 0, HALF_PI);\n\t\t\t\tctx.arc(left, bottom, r, HALF_PI, PI);\n\t\t\t} else if (left < right) {\n\t\t\t\tctx.moveTo(left, y);\n\t\t\t\tctx.arc(right, top, r, -HALF_PI, HALF_PI);\n\t\t\t\tctx.arc(left, top, r, HALF_PI, PI + HALF_PI);\n\t\t\t} else if (top < bottom) {\n\t\t\t\tctx.arc(left, top, r, -PI, 0);\n\t\t\t\tctx.arc(left, bottom, r, 0, PI);\n\t\t\t} else {\n\t\t\t\tctx.arc(left, top, r, -PI, PI);\n\t\t\t}\n\t\t\tctx.closePath();\n\t\t\tctx.moveTo(x, y);\n\t\t} else {\n\t\t\tctx.rect(x, y, width, height);\n\t\t}\n\t},\n\n\tdrawPoint: function(ctx, style, radius, x, y, rotation) {\n\t\tvar type, xOffset, yOffset, size, cornerRadius;\n\t\tvar rad = (rotation || 0) * RAD_PER_DEG;\n\n\t\tif (style && typeof style === 'object') {\n\t\t\ttype = style.toString();\n\t\t\tif (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n\t\t\t\tctx.save();\n\t\t\t\tctx.translate(x, y);\n\t\t\t\tctx.rotate(rad);\n\t\t\t\tctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n\t\t\t\tctx.restore();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (isNaN(radius) || radius <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tctx.beginPath();\n\n\t\tswitch (style) {\n\t\t// Default includes circle\n\t\tdefault:\n\t\t\tctx.arc(x, y, radius, 0, DOUBLE_PI);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'triangle':\n\t\t\tctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n\t\t\trad += TWO_THIRDS_PI;\n\t\t\tctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n\t\t\trad += TWO_THIRDS_PI;\n\t\t\tctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'rectRounded':\n\t\t\t// NOTE: the rounded rect implementation changed to use `arc` instead of\n\t\t\t// `quadraticCurveTo` since it generates better results when rect is\n\t\t\t// almost a circle. 0.516 (instead of 0.5) produces results with visually\n\t\t\t// closer proportion to the previous impl and it is inscribed in the\n\t\t\t// circle with `radius`. For more details, see the following PRs:\n\t\t\t// https://github.com/chartjs/Chart.js/issues/5597\n\t\t\t// https://github.com/chartjs/Chart.js/issues/5858\n\t\t\tcornerRadius = radius * 0.516;\n\t\t\tsize = radius - cornerRadius;\n\t\t\txOffset = Math.cos(rad + QUARTER_PI) * size;\n\t\t\tyOffset = Math.sin(rad + QUARTER_PI) * size;\n\t\t\tctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n\t\t\tctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n\t\t\tctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n\t\t\tctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'rect':\n\t\t\tif (!rotation) {\n\t\t\t\tsize = Math.SQRT1_2 * radius;\n\t\t\t\tctx.rect(x - size, y - size, 2 * size, 2 * size);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\trad += QUARTER_PI;\n\t\t\t/* falls through */\n\t\tcase 'rectRot':\n\t\t\txOffset = Math.cos(rad) * radius;\n\t\t\tyOffset = Math.sin(rad) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + yOffset, y - xOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'crossRot':\n\t\t\trad += QUARTER_PI;\n\t\t\t/* falls through */\n\t\tcase 'cross':\n\t\t\txOffset = Math.cos(rad) * radius;\n\t\t\tyOffset = Math.sin(rad) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x + yOffset, y - xOffset);\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\n\t\t\tbreak;\n\t\tcase 'star':\n\t\t\txOffset = Math.cos(rad) * radius;\n\t\t\tyOffset = Math.sin(rad) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x + yOffset, y - xOffset);\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\n\t\t\trad += QUARTER_PI;\n\t\t\txOffset = Math.cos(rad) * radius;\n\t\t\tyOffset = Math.sin(rad) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x + yOffset, y - xOffset);\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\n\t\t\tbreak;\n\t\tcase 'line':\n\t\t\txOffset = Math.cos(rad) * radius;\n\t\t\tyOffset = Math.sin(rad) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tbreak;\n\t\tcase 'dash':\n\t\t\tctx.moveTo(x, y);\n\t\t\tctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n\t\t\tbreak;\n\t\t}\n\n\t\tctx.fill();\n\t\tctx.stroke();\n\t},\n\n\t/**\n\t * Returns true if the point is inside the rectangle\n\t * @param {object} point - The point to test\n\t * @param {object} area - The rectangle\n\t * @returns {boolean}\n\t * @private\n\t */\n\t_isPointInArea: function(point, area) {\n\t\tvar epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n\n\t\treturn point.x > area.left - epsilon && point.x < area.right + epsilon &&\n\t\t\tpoint.y > area.top - epsilon && point.y < area.bottom + epsilon;\n\t},\n\n\tclipArea: function(ctx, area) {\n\t\tctx.save();\n\t\tctx.beginPath();\n\t\tctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n\t\tctx.clip();\n\t},\n\n\tunclipArea: function(ctx) {\n\t\tctx.restore();\n\t},\n\n\tlineTo: function(ctx, previous, target, flip) {\n\t\tvar stepped = target.steppedLine;\n\t\tif (stepped) {\n\t\t\tif (stepped === 'middle') {\n\t\t\t\tvar midpoint = (previous.x + target.x) / 2.0;\n\t\t\t\tctx.lineTo(midpoint, flip ? target.y : previous.y);\n\t\t\t\tctx.lineTo(midpoint, flip ? previous.y : target.y);\n\t\t\t} else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) {\n\t\t\t\tctx.lineTo(previous.x, target.y);\n\t\t\t} else {\n\t\t\t\tctx.lineTo(target.x, previous.y);\n\t\t\t}\n\t\t\tctx.lineTo(target.x, target.y);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!target.tension) {\n\t\t\tctx.lineTo(target.x, target.y);\n\t\t\treturn;\n\t\t}\n\n\t\tctx.bezierCurveTo(\n\t\t\tflip ? previous.controlPointPreviousX : previous.controlPointNextX,\n\t\t\tflip ? previous.controlPointPreviousY : previous.controlPointNextY,\n\t\t\tflip ? target.controlPointNextX : target.controlPointPreviousX,\n\t\t\tflip ? target.controlPointNextY : target.controlPointPreviousY,\n\t\t\ttarget.x,\n\t\t\ttarget.y);\n\t}\n};\n\nvar helpers_canvas = exports$1;\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.\n * @namespace Chart.helpers.clear\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers_core.clear = exports$1.clear;\n\n/**\n * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.\n * @namespace Chart.helpers.drawRoundedRectangle\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\nhelpers_core.drawRoundedRectangle = function(ctx) {\n\tctx.beginPath();\n\texports$1.roundedRect.apply(exports$1, arguments);\n};\n\nvar defaults = {\n\t/**\n\t * @private\n\t */\n\t_set: function(scope, values) {\n\t\treturn helpers_core.merge(this[scope] || (this[scope] = {}), values);\n\t}\n};\n\n// TODO(v3): remove 'global' from namespace. all default are global and\n// there's inconsistency around which options are under 'global'\ndefaults._set('global', {\n\tdefaultColor: 'rgba(0,0,0,0.1)',\n\tdefaultFontColor: '#666',\n\tdefaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\tdefaultFontSize: 12,\n\tdefaultFontStyle: 'normal',\n\tdefaultLineHeight: 1.2,\n\tshowLines: true\n});\n\nvar core_defaults = defaults;\n\nvar valueOrDefault = helpers_core.valueOrDefault;\n\n/**\n * Converts the given font object into a CSS font string.\n * @param {object} font - A font object.\n * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nfunction toFontString(font) {\n\tif (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) {\n\t\treturn null;\n\t}\n\n\treturn (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\nvar helpers_options = {\n\t/**\n\t * Converts the given line height `value` in pixels for a specific font `size`.\n\t * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n\t * @param {number} size - The font size (in pixels) used to resolve relative `value`.\n\t * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid).\n\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n\t * @since 2.7.0\n\t */\n\ttoLineHeight: function(value, size) {\n\t\tvar matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\n\t\tif (!matches || matches[1] === 'normal') {\n\t\t\treturn size * 1.2;\n\t\t}\n\n\t\tvalue = +matches[2];\n\n\t\tswitch (matches[3]) {\n\t\tcase 'px':\n\t\t\treturn value;\n\t\tcase '%':\n\t\t\tvalue /= 100;\n\t\t\tbreak;\n\t\t}\n\n\t\treturn size * value;\n\t},\n\n\t/**\n\t * Converts the given value into a padding object with pre-computed width/height.\n\t * @param {number|object} value - If a number, set the value to all TRBL component,\n\t * else, if and object, use defined properties and sets undefined ones to 0.\n\t * @returns {object} The padding values (top, right, bottom, left, width, height)\n\t * @since 2.7.0\n\t */\n\ttoPadding: function(value) {\n\t\tvar t, r, b, l;\n\n\t\tif (helpers_core.isObject(value)) {\n\t\t\tt = +value.top || 0;\n\t\t\tr = +value.right || 0;\n\t\t\tb = +value.bottom || 0;\n\t\t\tl = +value.left || 0;\n\t\t} else {\n\t\t\tt = r = b = l = +value || 0;\n\t\t}\n\n\t\treturn {\n\t\t\ttop: t,\n\t\t\tright: r,\n\t\t\tbottom: b,\n\t\t\tleft: l,\n\t\t\theight: t + b,\n\t\t\twidth: l + r\n\t\t};\n\t},\n\n\t/**\n\t * Parses font options and returns the font object.\n\t * @param {object} options - A object that contains font options to be parsed.\n\t * @return {object} The font object.\n\t * @todo Support font.* options and renamed to toFont().\n\t * @private\n\t */\n\t_parseFont: function(options) {\n\t\tvar globalDefaults = core_defaults.global;\n\t\tvar size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n\t\tvar font = {\n\t\t\tfamily: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily),\n\t\t\tlineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size),\n\t\t\tsize: size,\n\t\t\tstyle: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle),\n\t\t\tweight: null,\n\t\t\tstring: ''\n\t\t};\n\n\t\tfont.string = toFontString(font);\n\t\treturn font;\n\t},\n\n\t/**\n\t * Evaluates the given `inputs` sequentially and returns the first defined value.\n\t * @param {Array} inputs - An array of values, falling back to the last value.\n\t * @param {object} [context] - If defined and the current value is a function, the value\n\t * is called with `context` as first argument and the result becomes the new input.\n\t * @param {number} [index] - If defined and the current value is an array, the value\n\t * at `index` become the new input.\n\t * @param {object} [info] - object to return information about resolution in\n\t * @param {boolean} [info.cacheable] - Will be set to `false` if option is not cacheable.\n\t * @since 2.7.0\n\t */\n\tresolve: function(inputs, context, index, info) {\n\t\tvar cacheable = true;\n\t\tvar i, ilen, value;\n\n\t\tfor (i = 0, ilen = inputs.length; i < ilen; ++i) {\n\t\t\tvalue = inputs[i];\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (context !== undefined && typeof value === 'function') {\n\t\t\t\tvalue = value(context);\n\t\t\t\tcacheable = false;\n\t\t\t}\n\t\t\tif (index !== undefined && helpers_core.isArray(value)) {\n\t\t\t\tvalue = value[index];\n\t\t\t\tcacheable = false;\n\t\t\t}\n\t\t\tif (value !== undefined) {\n\t\t\t\tif (info && !cacheable) {\n\t\t\t\t\tinfo.cacheable = false;\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t}\n};\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\nvar exports$2 = {\n\t/**\n\t * Returns an array of factors sorted from 1 to sqrt(value)\n\t * @private\n\t */\n\t_factorize: function(value) {\n\t\tvar result = [];\n\t\tvar sqrt = Math.sqrt(value);\n\t\tvar i;\n\n\t\tfor (i = 1; i < sqrt; i++) {\n\t\t\tif (value % i === 0) {\n\t\t\t\tresult.push(i);\n\t\t\t\tresult.push(value / i);\n\t\t\t}\n\t\t}\n\t\tif (sqrt === (sqrt | 0)) { // if value is a square number\n\t\t\tresult.push(sqrt);\n\t\t}\n\n\t\tresult.sort(function(a, b) {\n\t\t\treturn a - b;\n\t\t}).pop();\n\t\treturn result;\n\t},\n\n\tlog10: Math.log10 || function(x) {\n\t\tvar exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.\n\t\t// Check for whole powers of 10,\n\t\t// which due to floating point rounding error should be corrected.\n\t\tvar powerOf10 = Math.round(exponent);\n\t\tvar isPowerOf10 = x === Math.pow(10, powerOf10);\n\n\t\treturn isPowerOf10 ? powerOf10 : exponent;\n\t}\n};\n\nvar helpers_math = exports$2;\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.helpers.math.log10 instead.\n * @namespace Chart.helpers.log10\n * @deprecated since version 2.9.0\n * @todo remove at version 3\n * @private\n */\nhelpers_core.log10 = exports$2.log10;\n\nvar getRtlAdapter = function(rectX, width) {\n\treturn {\n\t\tx: function(x) {\n\t\t\treturn rectX + rectX + width - x;\n\t\t},\n\t\tsetWidth: function(w) {\n\t\t\twidth = w;\n\t\t},\n\t\ttextAlign: function(align) {\n\t\t\tif (align === 'center') {\n\t\t\t\treturn align;\n\t\t\t}\n\t\t\treturn align === 'right' ? 'left' : 'right';\n\t\t},\n\t\txPlus: function(x, value) {\n\t\t\treturn x - value;\n\t\t},\n\t\tleftForLtr: function(x, itemWidth) {\n\t\t\treturn x - itemWidth;\n\t\t},\n\t};\n};\n\nvar getLtrAdapter = function() {\n\treturn {\n\t\tx: function(x) {\n\t\t\treturn x;\n\t\t},\n\t\tsetWidth: function(w) { // eslint-disable-line no-unused-vars\n\t\t},\n\t\ttextAlign: function(align) {\n\t\t\treturn align;\n\t\t},\n\t\txPlus: function(x, value) {\n\t\t\treturn x + value;\n\t\t},\n\t\tleftForLtr: function(x, _itemWidth) { // eslint-disable-line no-unused-vars\n\t\t\treturn x;\n\t\t},\n\t};\n};\n\nvar getAdapter = function(rtl, rectX, width) {\n\treturn rtl ? getRtlAdapter(rectX, width) : getLtrAdapter();\n};\n\nvar overrideTextDirection = function(ctx, direction) {\n\tvar style, original;\n\tif (direction === 'ltr' || direction === 'rtl') {\n\t\tstyle = ctx.canvas.style;\n\t\toriginal = [\n\t\t\tstyle.getPropertyValue('direction'),\n\t\t\tstyle.getPropertyPriority('direction'),\n\t\t];\n\n\t\tstyle.setProperty('direction', direction, 'important');\n\t\tctx.prevTextDirection = original;\n\t}\n};\n\nvar restoreTextDirection = function(ctx) {\n\tvar original = ctx.prevTextDirection;\n\tif (original !== undefined) {\n\t\tdelete ctx.prevTextDirection;\n\t\tctx.canvas.style.setProperty('direction', original[0], original[1]);\n\t}\n};\n\nvar helpers_rtl = {\n\tgetRtlAdapter: getAdapter,\n\toverrideTextDirection: overrideTextDirection,\n\trestoreTextDirection: restoreTextDirection,\n};\n\nvar helpers$1 = helpers_core;\nvar easing = helpers_easing;\nvar canvas = helpers_canvas;\nvar options = helpers_options;\nvar math = helpers_math;\nvar rtl = helpers_rtl;\nhelpers$1.easing = easing;\nhelpers$1.canvas = canvas;\nhelpers$1.options = options;\nhelpers$1.math = math;\nhelpers$1.rtl = rtl;\n\nfunction interpolate(start, view, model, ease) {\n\tvar keys = Object.keys(model);\n\tvar i, ilen, key, actual, origin, target, type, c0, c1;\n\n\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\tkey = keys[i];\n\n\t\ttarget = model[key];\n\n\t\t// if a value is added to the model after pivot() has been called, the view\n\t\t// doesn't contain it, so let's initialize the view to the target value.\n\t\tif (!view.hasOwnProperty(key)) {\n\t\t\tview[key] = target;\n\t\t}\n\n\t\tactual = view[key];\n\n\t\tif (actual === target || key[0] === '_') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!start.hasOwnProperty(key)) {\n\t\t\tstart[key] = actual;\n\t\t}\n\n\t\torigin = start[key];\n\n\t\ttype = typeof target;\n\n\t\tif (type === typeof origin) {\n\t\t\tif (type === 'string') {\n\t\t\t\tc0 = chartjsColor(origin);\n\t\t\t\tif (c0.valid) {\n\t\t\t\t\tc1 = chartjsColor(target);\n\t\t\t\t\tif (c1.valid) {\n\t\t\t\t\t\tview[key] = c1.mix(c0, ease).rgbString();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) {\n\t\t\t\tview[key] = origin + (target - origin) * ease;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tview[key] = target;\n\t}\n}\n\nvar Element = function(configuration) {\n\thelpers$1.extend(this, configuration);\n\tthis.initialize.apply(this, arguments);\n};\n\nhelpers$1.extend(Element.prototype, {\n\t_type: undefined,\n\n\tinitialize: function() {\n\t\tthis.hidden = false;\n\t},\n\n\tpivot: function() {\n\t\tvar me = this;\n\t\tif (!me._view) {\n\t\t\tme._view = helpers$1.extend({}, me._model);\n\t\t}\n\t\tme._start = {};\n\t\treturn me;\n\t},\n\n\ttransition: function(ease) {\n\t\tvar me = this;\n\t\tvar model = me._model;\n\t\tvar start = me._start;\n\t\tvar view = me._view;\n\n\t\t// No animation -> No Transition\n\t\tif (!model || ease === 1) {\n\t\t\tme._view = helpers$1.extend({}, model);\n\t\t\tme._start = null;\n\t\t\treturn me;\n\t\t}\n\n\t\tif (!view) {\n\t\t\tview = me._view = {};\n\t\t}\n\n\t\tif (!start) {\n\t\t\tstart = me._start = {};\n\t\t}\n\n\t\tinterpolate(start, view, model, ease);\n\n\t\treturn me;\n\t},\n\n\ttooltipPosition: function() {\n\t\treturn {\n\t\t\tx: this._model.x,\n\t\t\ty: this._model.y\n\t\t};\n\t},\n\n\thasValue: function() {\n\t\treturn helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y);\n\t}\n});\n\nElement.extend = helpers$1.inherits;\n\nvar core_element = Element;\n\nvar exports$3 = core_element.extend({\n\tchart: null, // the animation associated chart instance\n\tcurrentStep: 0, // the current animation step\n\tnumSteps: 60, // default number of steps\n\teasing: '', // the easing to use for this animation\n\trender: null, // render function used by the animation service\n\n\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\n\tonAnimationComplete: null, // user specified callback to fire when the animation finishes\n});\n\nvar core_animation = exports$3;\n\n// DEPRECATIONS\n\n/**\n * Provided for backward compatibility, use Chart.Animation instead\n * @prop Chart.Animation#animationObject\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\nObject.defineProperty(exports$3.prototype, 'animationObject', {\n\tget: function() {\n\t\treturn this;\n\t}\n});\n\n/**\n * Provided for backward compatibility, use Chart.Animation#chart instead\n * @prop Chart.Animation#chartInstance\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\nObject.defineProperty(exports$3.prototype, 'chartInstance', {\n\tget: function() {\n\t\treturn this.chart;\n\t},\n\tset: function(value) {\n\t\tthis.chart = value;\n\t}\n});\n\ncore_defaults._set('global', {\n\tanimation: {\n\t\tduration: 1000,\n\t\teasing: 'easeOutQuart',\n\t\tonProgress: helpers$1.noop,\n\t\tonComplete: helpers$1.noop\n\t}\n});\n\nvar core_animations = {\n\tanimations: [],\n\trequest: null,\n\n\t/**\n\t * @param {Chart} chart - The chart to animate.\n\t * @param {Chart.Animation} animation - The animation that we will animate.\n\t * @param {number} duration - The animation duration in ms.\n\t * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n\t */\n\taddAnimation: function(chart, animation, duration, lazy) {\n\t\tvar animations = this.animations;\n\t\tvar i, ilen;\n\n\t\tanimation.chart = chart;\n\t\tanimation.startTime = Date.now();\n\t\tanimation.duration = duration;\n\n\t\tif (!lazy) {\n\t\t\tchart.animating = true;\n\t\t}\n\n\t\tfor (i = 0, ilen = animations.length; i < ilen; ++i) {\n\t\t\tif (animations[i].chart === chart) {\n\t\t\t\tanimations[i] = animation;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tanimations.push(animation);\n\n\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\n\t\tif (animations.length === 1) {\n\t\t\tthis.requestAnimationFrame();\n\t\t}\n\t},\n\n\tcancelAnimation: function(chart) {\n\t\tvar index = helpers$1.findIndex(this.animations, function(animation) {\n\t\t\treturn animation.chart === chart;\n\t\t});\n\n\t\tif (index !== -1) {\n\t\t\tthis.animations.splice(index, 1);\n\t\t\tchart.animating = false;\n\t\t}\n\t},\n\n\trequestAnimationFrame: function() {\n\t\tvar me = this;\n\t\tif (me.request === null) {\n\t\t\t// Skip animation frame requests until the active one is executed.\n\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\n\t\t\t// and 'mouseout' events will trigger multiple renders.\n\t\t\tme.request = helpers$1.requestAnimFrame.call(window, function() {\n\t\t\t\tme.request = null;\n\t\t\t\tme.startDigest();\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\tstartDigest: function() {\n\t\tvar me = this;\n\n\t\tme.advance();\n\n\t\t// Do we have more stuff to animate?\n\t\tif (me.animations.length > 0) {\n\t\t\tme.requestAnimationFrame();\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\tadvance: function() {\n\t\tvar animations = this.animations;\n\t\tvar animation, chart, numSteps, nextStep;\n\t\tvar i = 0;\n\n\t\t// 1 animation per chart, so we are looping charts here\n\t\twhile (i < animations.length) {\n\t\t\tanimation = animations[i];\n\t\t\tchart = animation.chart;\n\t\t\tnumSteps = animation.numSteps;\n\n\t\t\t// Make sure that currentStep starts at 1\n\t\t\t// https://github.com/chartjs/Chart.js/issues/6104\n\t\t\tnextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1;\n\t\t\tanimation.currentStep = Math.min(nextStep, numSteps);\n\n\t\t\thelpers$1.callback(animation.render, [chart, animation], chart);\n\t\t\thelpers$1.callback(animation.onAnimationProgress, [animation], chart);\n\n\t\t\tif (animation.currentStep >= numSteps) {\n\t\t\t\thelpers$1.callback(animation.onAnimationComplete, [animation], chart);\n\t\t\t\tchart.animating = false;\n\t\t\t\tanimations.splice(i, 1);\n\t\t\t} else {\n\t\t\t\t++i;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar resolve = helpers$1.options.resolve;\n\nvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n */\nfunction listenArrayEvents(array, listener) {\n\tif (array._chartjs) {\n\t\tarray._chartjs.listeners.push(listener);\n\t\treturn;\n\t}\n\n\tObject.defineProperty(array, '_chartjs', {\n\t\tconfigurable: true,\n\t\tenumerable: false,\n\t\tvalue: {\n\t\t\tlisteners: [listener]\n\t\t}\n\t});\n\n\tarrayEvents.forEach(function(key) {\n\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n\t\tvar base = array[key];\n\n\t\tObject.defineProperty(array, key, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: function() {\n\t\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\t\tvar res = base.apply(this, args);\n\n\t\t\t\thelpers$1.each(array._chartjs.listeners, function(object) {\n\t\t\t\t\tif (typeof object[method] === 'function') {\n\t\t\t\t\t\tobject[method].apply(object, args);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn res;\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nfunction unlistenArrayEvents(array, listener) {\n\tvar stub = array._chartjs;\n\tif (!stub) {\n\t\treturn;\n\t}\n\n\tvar listeners = stub.listeners;\n\tvar index = listeners.indexOf(listener);\n\tif (index !== -1) {\n\t\tlisteners.splice(index, 1);\n\t}\n\n\tif (listeners.length > 0) {\n\t\treturn;\n\t}\n\n\tarrayEvents.forEach(function(key) {\n\t\tdelete array[key];\n\t});\n\n\tdelete array._chartjs;\n}\n\n// Base class for all dataset controllers (line, bar, etc)\nvar DatasetController = function(chart, datasetIndex) {\n\tthis.initialize(chart, datasetIndex);\n};\n\nhelpers$1.extend(DatasetController.prototype, {\n\n\t/**\n\t * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n\t * @type {Chart.core.element}\n\t */\n\tdatasetElementType: null,\n\n\t/**\n\t * Element type used to generate a meta data (e.g. Chart.element.Point).\n\t * @type {Chart.core.element}\n\t */\n\tdataElementType: null,\n\n\t/**\n\t * Dataset element option keys to be resolved in _resolveDatasetElementOptions.\n\t * A derived controller may override this to resolve controller-specific options.\n\t * The keys defined here are for backward compatibility for legend styles.\n\t * @private\n\t */\n\t_datasetElementOptions: [\n\t\t'backgroundColor',\n\t\t'borderCapStyle',\n\t\t'borderColor',\n\t\t'borderDash',\n\t\t'borderDashOffset',\n\t\t'borderJoinStyle',\n\t\t'borderWidth'\n\t],\n\n\t/**\n\t * Data element option keys to be resolved in _resolveDataElementOptions.\n\t * A derived controller may override this to resolve controller-specific options.\n\t * The keys defined here are for backward compatibility for legend styles.\n\t * @private\n\t */\n\t_dataElementOptions: [\n\t\t'backgroundColor',\n\t\t'borderColor',\n\t\t'borderWidth',\n\t\t'pointStyle'\n\t],\n\n\tinitialize: function(chart, datasetIndex) {\n\t\tvar me = this;\n\t\tme.chart = chart;\n\t\tme.index = datasetIndex;\n\t\tme.linkScales();\n\t\tme.addElements();\n\t\tme._type = me.getMeta().type;\n\t},\n\n\tupdateIndex: function(datasetIndex) {\n\t\tthis.index = datasetIndex;\n\t},\n\n\tlinkScales: function() {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar chart = me.chart;\n\t\tvar scales = chart.scales;\n\t\tvar dataset = me.getDataset();\n\t\tvar scalesOpts = chart.options.scales;\n\n\t\tif (meta.xAxisID === null || !(meta.xAxisID in scales) || dataset.xAxisID) {\n\t\t\tmeta.xAxisID = dataset.xAxisID || scalesOpts.xAxes[0].id;\n\t\t}\n\t\tif (meta.yAxisID === null || !(meta.yAxisID in scales) || dataset.yAxisID) {\n\t\t\tmeta.yAxisID = dataset.yAxisID || scalesOpts.yAxes[0].id;\n\t\t}\n\t},\n\n\tgetDataset: function() {\n\t\treturn this.chart.data.datasets[this.index];\n\t},\n\n\tgetMeta: function() {\n\t\treturn this.chart.getDatasetMeta(this.index);\n\t},\n\n\tgetScaleForId: function(scaleID) {\n\t\treturn this.chart.scales[scaleID];\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getValueScaleId: function() {\n\t\treturn this.getMeta().yAxisID;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getIndexScaleId: function() {\n\t\treturn this.getMeta().xAxisID;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getValueScale: function() {\n\t\treturn this.getScaleForId(this._getValueScaleId());\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getIndexScale: function() {\n\t\treturn this.getScaleForId(this._getIndexScaleId());\n\t},\n\n\treset: function() {\n\t\tthis._update(true);\n\t},\n\n\t/**\n\t * @private\n\t */\n\tdestroy: function() {\n\t\tif (this._data) {\n\t\t\tunlistenArrayEvents(this._data, this);\n\t\t}\n\t},\n\n\tcreateMetaDataset: function() {\n\t\tvar me = this;\n\t\tvar type = me.datasetElementType;\n\t\treturn type && new type({\n\t\t\t_chart: me.chart,\n\t\t\t_datasetIndex: me.index\n\t\t});\n\t},\n\n\tcreateMetaData: function(index) {\n\t\tvar me = this;\n\t\tvar type = me.dataElementType;\n\t\treturn type && new type({\n\t\t\t_chart: me.chart,\n\t\t\t_datasetIndex: me.index,\n\t\t\t_index: index\n\t\t});\n\t},\n\n\taddElements: function() {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar data = me.getDataset().data || [];\n\t\tvar metaData = meta.data;\n\t\tvar i, ilen;\n\n\t\tfor (i = 0, ilen = data.length; i < ilen; ++i) {\n\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\n\t\t}\n\n\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\n\t},\n\n\taddElementAndReset: function(index) {\n\t\tvar element = this.createMetaData(index);\n\t\tthis.getMeta().data.splice(index, 0, element);\n\t\tthis.updateElement(element, index, true);\n\t},\n\n\tbuildOrUpdateElements: function() {\n\t\tvar me = this;\n\t\tvar dataset = me.getDataset();\n\t\tvar data = dataset.data || (dataset.data = []);\n\n\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\n\t\t// real-time charts), we need to monitor these data modifications and synchronize\n\t\t// the internal meta data accordingly.\n\t\tif (me._data !== data) {\n\t\t\tif (me._data) {\n\t\t\t\t// This case happens when the user replaced the data array instance.\n\t\t\t\tunlistenArrayEvents(me._data, me);\n\t\t\t}\n\n\t\t\tif (data && Object.isExtensible(data)) {\n\t\t\t\tlistenArrayEvents(data, me);\n\t\t\t}\n\t\t\tme._data = data;\n\t\t}\n\n\t\t// Re-sync meta data in case the user replaced the data array or if we missed\n\t\t// any updates and so make sure that we handle number of datapoints changing.\n\t\tme.resyncElements();\n\t},\n\n\t/**\n\t * Returns the merged user-supplied and default dataset-level options\n\t * @private\n\t */\n\t_configure: function() {\n\t\tvar me = this;\n\t\tme._config = helpers$1.merge(Object.create(null), [\n\t\t\tme.chart.options.datasets[me._type],\n\t\t\tme.getDataset(),\n\t\t], {\n\t\t\tmerger: function(key, target, source) {\n\t\t\t\tif (key !== '_meta' && key !== 'data') {\n\t\t\t\t\thelpers$1._merger(key, target, source);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t_update: function(reset) {\n\t\tvar me = this;\n\t\tme._configure();\n\t\tme._cachedDataOpts = null;\n\t\tme.update(reset);\n\t},\n\n\tupdate: helpers$1.noop,\n\n\ttransition: function(easingValue) {\n\t\tvar meta = this.getMeta();\n\t\tvar elements = meta.data || [];\n\t\tvar ilen = elements.length;\n\t\tvar i = 0;\n\n\t\tfor (; i < ilen; ++i) {\n\t\t\telements[i].transition(easingValue);\n\t\t}\n\n\t\tif (meta.dataset) {\n\t\t\tmeta.dataset.transition(easingValue);\n\t\t}\n\t},\n\n\tdraw: function() {\n\t\tvar meta = this.getMeta();\n\t\tvar elements = meta.data || [];\n\t\tvar ilen = elements.length;\n\t\tvar i = 0;\n\n\t\tif (meta.dataset) {\n\t\t\tmeta.dataset.draw();\n\t\t}\n\n\t\tfor (; i < ilen; ++i) {\n\t\t\telements[i].draw();\n\t\t}\n\t},\n\n\t/**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @return {IStyleInterface} style object\n\t */\n\tgetStyle: function(index) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar dataset = meta.dataset;\n\t\tvar style;\n\n\t\tme._configure();\n\t\tif (dataset && index === undefined) {\n\t\t\tstyle = me._resolveDatasetElementOptions(dataset || {});\n\t\t} else {\n\t\t\tindex = index || 0;\n\t\t\tstyle = me._resolveDataElementOptions(meta.data[index] || {}, index);\n\t\t}\n\n\t\tif (style.fill === false || style.fill === null) {\n\t\t\tstyle.backgroundColor = style.borderColor;\n\t\t}\n\n\t\treturn style;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveDatasetElementOptions: function(element, hover) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar datasetOpts = me._config;\n\t\tvar custom = element.custom || {};\n\t\tvar options = chart.options.elements[me.datasetElementType.prototype._type] || {};\n\t\tvar elementOptions = me._datasetElementOptions;\n\t\tvar values = {};\n\t\tvar i, ilen, key, readKey;\n\n\t\t// Scriptable options\n\t\tvar context = {\n\t\t\tchart: chart,\n\t\t\tdataset: me.getDataset(),\n\t\t\tdatasetIndex: me.index,\n\t\t\thover: hover\n\t\t};\n\n\t\tfor (i = 0, ilen = elementOptions.length; i < ilen; ++i) {\n\t\t\tkey = elementOptions[i];\n\t\t\treadKey = hover ? 'hover' + key.charAt(0).toUpperCase() + key.slice(1) : key;\n\t\t\tvalues[key] = resolve([\n\t\t\t\tcustom[readKey],\n\t\t\t\tdatasetOpts[readKey],\n\t\t\t\toptions[readKey]\n\t\t\t], context);\n\t\t}\n\n\t\treturn values;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveDataElementOptions: function(element, index) {\n\t\tvar me = this;\n\t\tvar custom = element && element.custom;\n\t\tvar cached = me._cachedDataOpts;\n\t\tif (cached && !custom) {\n\t\t\treturn cached;\n\t\t}\n\t\tvar chart = me.chart;\n\t\tvar datasetOpts = me._config;\n\t\tvar options = chart.options.elements[me.dataElementType.prototype._type] || {};\n\t\tvar elementOptions = me._dataElementOptions;\n\t\tvar values = {};\n\n\t\t// Scriptable options\n\t\tvar context = {\n\t\t\tchart: chart,\n\t\t\tdataIndex: index,\n\t\t\tdataset: me.getDataset(),\n\t\t\tdatasetIndex: me.index\n\t\t};\n\n\t\t// `resolve` sets cacheable to `false` if any option is indexed or scripted\n\t\tvar info = {cacheable: !custom};\n\n\t\tvar keys, i, ilen, key;\n\n\t\tcustom = custom || {};\n\n\t\tif (helpers$1.isArray(elementOptions)) {\n\t\t\tfor (i = 0, ilen = elementOptions.length; i < ilen; ++i) {\n\t\t\t\tkey = elementOptions[i];\n\t\t\t\tvalues[key] = resolve([\n\t\t\t\t\tcustom[key],\n\t\t\t\t\tdatasetOpts[key],\n\t\t\t\t\toptions[key]\n\t\t\t\t], context, index, info);\n\t\t\t}\n\t\t} else {\n\t\t\tkeys = Object.keys(elementOptions);\n\t\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\t\tkey = keys[i];\n\t\t\t\tvalues[key] = resolve([\n\t\t\t\t\tcustom[key],\n\t\t\t\t\tdatasetOpts[elementOptions[key]],\n\t\t\t\t\tdatasetOpts[key],\n\t\t\t\t\toptions[key]\n\t\t\t\t], context, index, info);\n\t\t\t}\n\t\t}\n\n\t\tif (info.cacheable) {\n\t\t\tme._cachedDataOpts = Object.freeze(values);\n\t\t}\n\n\t\treturn values;\n\t},\n\n\tremoveHoverStyle: function(element) {\n\t\thelpers$1.merge(element._model, element.$previousStyle || {});\n\t\tdelete element.$previousStyle;\n\t},\n\n\tsetHoverStyle: function(element) {\n\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\tvar index = element._index;\n\t\tvar custom = element.custom || {};\n\t\tvar model = element._model;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\n\t\telement.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth\n\t\t};\n\n\t\tmodel.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index);\n\t\tmodel.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index);\n\t\tmodel.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_removeDatasetHoverStyle: function() {\n\t\tvar element = this.getMeta().dataset;\n\n\t\tif (element) {\n\t\t\tthis.removeHoverStyle(element);\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_setDatasetHoverStyle: function() {\n\t\tvar element = this.getMeta().dataset;\n\t\tvar prev = {};\n\t\tvar i, ilen, key, keys, hoverOptions, model;\n\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\n\t\tmodel = element._model;\n\t\thoverOptions = this._resolveDatasetElementOptions(element, true);\n\n\t\tkeys = Object.keys(hoverOptions);\n\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\tkey = keys[i];\n\t\t\tprev[key] = model[key];\n\t\t\tmodel[key] = hoverOptions[key];\n\t\t}\n\n\t\telement.$previousStyle = prev;\n\t},\n\n\t/**\n\t * @private\n\t */\n\tresyncElements: function() {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar data = me.getDataset().data;\n\t\tvar numMeta = meta.data.length;\n\t\tvar numData = data.length;\n\n\t\tif (numData < numMeta) {\n\t\t\tmeta.data.splice(numData, numMeta - numData);\n\t\t} else if (numData > numMeta) {\n\t\t\tme.insertElements(numMeta, numData - numMeta);\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\tinsertElements: function(start, count) {\n\t\tfor (var i = 0; i < count; ++i) {\n\t\t\tthis.addElementAndReset(start + i);\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\tonDataPush: function() {\n\t\tvar count = arguments.length;\n\t\tthis.insertElements(this.getDataset().data.length - count, count);\n\t},\n\n\t/**\n\t * @private\n\t */\n\tonDataPop: function() {\n\t\tthis.getMeta().data.pop();\n\t},\n\n\t/**\n\t * @private\n\t */\n\tonDataShift: function() {\n\t\tthis.getMeta().data.shift();\n\t},\n\n\t/**\n\t * @private\n\t */\n\tonDataSplice: function(start, count) {\n\t\tthis.getMeta().data.splice(start, count);\n\t\tthis.insertElements(start, arguments.length - 2);\n\t},\n\n\t/**\n\t * @private\n\t */\n\tonDataUnshift: function() {\n\t\tthis.insertElements(0, arguments.length);\n\t}\n});\n\nDatasetController.extend = helpers$1.inherits;\n\nvar core_datasetController = DatasetController;\n\nvar TAU = Math.PI * 2;\n\ncore_defaults._set('global', {\n\telements: {\n\t\tarc: {\n\t\t\tbackgroundColor: core_defaults.global.defaultColor,\n\t\t\tborderColor: '#fff',\n\t\t\tborderWidth: 2,\n\t\t\tborderAlign: 'center'\n\t\t}\n\t}\n});\n\nfunction clipArc(ctx, arc) {\n\tvar startAngle = arc.startAngle;\n\tvar endAngle = arc.endAngle;\n\tvar pixelMargin = arc.pixelMargin;\n\tvar angleMargin = pixelMargin / arc.outerRadius;\n\tvar x = arc.x;\n\tvar y = arc.y;\n\n\t// Draw an inner border by cliping the arc and drawing a double-width border\n\t// Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n\tctx.beginPath();\n\tctx.arc(x, y, arc.outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n\tif (arc.innerRadius > pixelMargin) {\n\t\tangleMargin = pixelMargin / arc.innerRadius;\n\t\tctx.arc(x, y, arc.innerRadius - pixelMargin, endAngle + angleMargin, startAngle - angleMargin, true);\n\t} else {\n\t\tctx.arc(x, y, pixelMargin, endAngle + Math.PI / 2, startAngle - Math.PI / 2);\n\t}\n\tctx.closePath();\n\tctx.clip();\n}\n\nfunction drawFullCircleBorders(ctx, vm, arc, inner) {\n\tvar endAngle = arc.endAngle;\n\tvar i;\n\n\tif (inner) {\n\t\tarc.endAngle = arc.startAngle + TAU;\n\t\tclipArc(ctx, arc);\n\t\tarc.endAngle = endAngle;\n\t\tif (arc.endAngle === arc.startAngle && arc.fullCircles) {\n\t\t\tarc.endAngle += TAU;\n\t\t\tarc.fullCircles--;\n\t\t}\n\t}\n\n\tctx.beginPath();\n\tctx.arc(arc.x, arc.y, arc.innerRadius, arc.startAngle + TAU, arc.startAngle, true);\n\tfor (i = 0; i < arc.fullCircles; ++i) {\n\t\tctx.stroke();\n\t}\n\n\tctx.beginPath();\n\tctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.startAngle + TAU);\n\tfor (i = 0; i < arc.fullCircles; ++i) {\n\t\tctx.stroke();\n\t}\n}\n\nfunction drawBorder(ctx, vm, arc) {\n\tvar inner = vm.borderAlign === 'inner';\n\n\tif (inner) {\n\t\tctx.lineWidth = vm.borderWidth * 2;\n\t\tctx.lineJoin = 'round';\n\t} else {\n\t\tctx.lineWidth = vm.borderWidth;\n\t\tctx.lineJoin = 'bevel';\n\t}\n\n\tif (arc.fullCircles) {\n\t\tdrawFullCircleBorders(ctx, vm, arc, inner);\n\t}\n\n\tif (inner) {\n\t\tclipArc(ctx, arc);\n\t}\n\n\tctx.beginPath();\n\tctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.endAngle);\n\tctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);\n\tctx.closePath();\n\tctx.stroke();\n}\n\nvar element_arc = core_element.extend({\n\t_type: 'arc',\n\n\tinLabelRange: function(mouseX) {\n\t\tvar vm = this._view;\n\n\t\tif (vm) {\n\t\t\treturn (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));\n\t\t}\n\t\treturn false;\n\t},\n\n\tinRange: function(chartX, chartY) {\n\t\tvar vm = this._view;\n\n\t\tif (vm) {\n\t\t\tvar pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY});\n\t\t\tvar angle = pointRelativePosition.angle;\n\t\t\tvar distance = pointRelativePosition.distance;\n\n\t\t\t// Sanitise angle range\n\t\t\tvar startAngle = vm.startAngle;\n\t\t\tvar endAngle = vm.endAngle;\n\t\t\twhile (endAngle < startAngle) {\n\t\t\t\tendAngle += TAU;\n\t\t\t}\n\t\t\twhile (angle > endAngle) {\n\t\t\t\tangle -= TAU;\n\t\t\t}\n\t\t\twhile (angle < startAngle) {\n\t\t\t\tangle += TAU;\n\t\t\t}\n\n\t\t\t// Check if within the range of the open/close angle\n\t\t\tvar betweenAngles = (angle >= startAngle && angle <= endAngle);\n\t\t\tvar withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);\n\n\t\t\treturn (betweenAngles && withinRadius);\n\t\t}\n\t\treturn false;\n\t},\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\tvar halfAngle = (vm.startAngle + vm.endAngle) / 2;\n\t\tvar halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n\t\treturn {\n\t\t\tx: vm.x + Math.cos(halfAngle) * halfRadius,\n\t\t\ty: vm.y + Math.sin(halfAngle) * halfRadius\n\t\t};\n\t},\n\n\tgetArea: function() {\n\t\tvar vm = this._view;\n\t\treturn Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\tvar centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2);\n\t\tvar rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\n\t\treturn {\n\t\t\tx: vm.x + (Math.cos(centreAngle) * rangeFromCentre),\n\t\t\ty: vm.y + (Math.sin(centreAngle) * rangeFromCentre)\n\t\t};\n\t},\n\n\tdraw: function() {\n\t\tvar ctx = this._chart.ctx;\n\t\tvar vm = this._view;\n\t\tvar pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0;\n\t\tvar arc = {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y,\n\t\t\tinnerRadius: vm.innerRadius,\n\t\t\touterRadius: Math.max(vm.outerRadius - pixelMargin, 0),\n\t\t\tpixelMargin: pixelMargin,\n\t\t\tstartAngle: vm.startAngle,\n\t\t\tendAngle: vm.endAngle,\n\t\t\tfullCircles: Math.floor(vm.circumference / TAU)\n\t\t};\n\t\tvar i;\n\n\t\tctx.save();\n\n\t\tctx.fillStyle = vm.backgroundColor;\n\t\tctx.strokeStyle = vm.borderColor;\n\n\t\tif (arc.fullCircles) {\n\t\t\tarc.endAngle = arc.startAngle + TAU;\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);\n\t\t\tctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);\n\t\t\tctx.closePath();\n\t\t\tfor (i = 0; i < arc.fullCircles; ++i) {\n\t\t\t\tctx.fill();\n\t\t\t}\n\t\t\tarc.endAngle = arc.startAngle + vm.circumference % TAU;\n\t\t}\n\n\t\tctx.beginPath();\n\t\tctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);\n\t\tctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);\n\t\tctx.closePath();\n\t\tctx.fill();\n\n\t\tif (vm.borderWidth) {\n\t\t\tdrawBorder(ctx, vm, arc);\n\t\t}\n\n\t\tctx.restore();\n\t}\n});\n\nvar valueOrDefault$1 = helpers$1.valueOrDefault;\n\nvar defaultColor = core_defaults.global.defaultColor;\n\ncore_defaults._set('global', {\n\telements: {\n\t\tline: {\n\t\t\ttension: 0.4,\n\t\t\tbackgroundColor: defaultColor,\n\t\t\tborderWidth: 3,\n\t\t\tborderColor: defaultColor,\n\t\t\tborderCapStyle: 'butt',\n\t\t\tborderDash: [],\n\t\t\tborderDashOffset: 0.0,\n\t\t\tborderJoinStyle: 'miter',\n\t\t\tcapBezierPoints: true,\n\t\t\tfill: true, // do we fill in the area between the line and its base axis\n\t\t}\n\t}\n});\n\nvar element_line = core_element.extend({\n\t_type: 'line',\n\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar vm = me._view;\n\t\tvar ctx = me._chart.ctx;\n\t\tvar spanGaps = vm.spanGaps;\n\t\tvar points = me._children.slice(); // clone array\n\t\tvar globalDefaults = core_defaults.global;\n\t\tvar globalOptionLineElements = globalDefaults.elements.line;\n\t\tvar lastDrawnIndex = -1;\n\t\tvar closePath = me._loop;\n\t\tvar index, previous, currentVM;\n\n\t\tif (!points.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (me._loop) {\n\t\t\tfor (index = 0; index < points.length; ++index) {\n\t\t\t\tprevious = helpers$1.previousItem(points, index);\n\t\t\t\t// If the line has an open path, shift the point array\n\t\t\t\tif (!points[index]._view.skip && previous._view.skip) {\n\t\t\t\t\tpoints = points.slice(index).concat(points.slice(0, index));\n\t\t\t\t\tclosePath = spanGaps;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If the line has a close path, add the first point again\n\t\t\tif (closePath) {\n\t\t\t\tpoints.push(points[0]);\n\t\t\t}\n\t\t}\n\n\t\tctx.save();\n\n\t\t// Stroke Line Options\n\t\tctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n\t\t// IE 9 and 10 do not support line dash\n\t\tif (ctx.setLineDash) {\n\t\t\tctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n\t\t}\n\n\t\tctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset);\n\t\tctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n\t\tctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth);\n\t\tctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n\t\t// Stroke Line\n\t\tctx.beginPath();\n\n\t\t// First point moves to it's starting position no matter what\n\t\tcurrentVM = points[0]._view;\n\t\tif (!currentVM.skip) {\n\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\tlastDrawnIndex = 0;\n\t\t}\n\n\t\tfor (index = 1; index < points.length; ++index) {\n\t\t\tcurrentVM = points[index]._view;\n\t\t\tprevious = lastDrawnIndex === -1 ? helpers$1.previousItem(points, index) : points[lastDrawnIndex];\n\n\t\t\tif (!currentVM.skip) {\n\t\t\t\tif ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {\n\t\t\t\t\t// There was a gap and this is the first point after the gap\n\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t} else {\n\t\t\t\t\t// Line to next point\n\t\t\t\t\thelpers$1.canvas.lineTo(ctx, previous._view, currentVM);\n\t\t\t\t}\n\t\t\t\tlastDrawnIndex = index;\n\t\t\t}\n\t\t}\n\n\t\tif (closePath) {\n\t\t\tctx.closePath();\n\t\t}\n\n\t\tctx.stroke();\n\t\tctx.restore();\n\t}\n});\n\nvar valueOrDefault$2 = helpers$1.valueOrDefault;\n\nvar defaultColor$1 = core_defaults.global.defaultColor;\n\ncore_defaults._set('global', {\n\telements: {\n\t\tpoint: {\n\t\t\tradius: 3,\n\t\t\tpointStyle: 'circle',\n\t\t\tbackgroundColor: defaultColor$1,\n\t\t\tborderColor: defaultColor$1,\n\t\t\tborderWidth: 1,\n\t\t\t// Hover\n\t\t\thitRadius: 1,\n\t\t\thoverRadius: 4,\n\t\t\thoverBorderWidth: 1\n\t\t}\n\t}\n});\n\nfunction xRange(mouseX) {\n\tvar vm = this._view;\n\treturn vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false;\n}\n\nfunction yRange(mouseY) {\n\tvar vm = this._view;\n\treturn vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false;\n}\n\nvar element_point = core_element.extend({\n\t_type: 'point',\n\n\tinRange: function(mouseX, mouseY) {\n\t\tvar vm = this._view;\n\t\treturn vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;\n\t},\n\n\tinLabelRange: xRange,\n\tinXRange: xRange,\n\tinYRange: yRange,\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y\n\t\t};\n\t},\n\n\tgetArea: function() {\n\t\treturn Math.PI * Math.pow(this._view.radius, 2);\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y,\n\t\t\tpadding: vm.radius + vm.borderWidth\n\t\t};\n\t},\n\n\tdraw: function(chartArea) {\n\t\tvar vm = this._view;\n\t\tvar ctx = this._chart.ctx;\n\t\tvar pointStyle = vm.pointStyle;\n\t\tvar rotation = vm.rotation;\n\t\tvar radius = vm.radius;\n\t\tvar x = vm.x;\n\t\tvar y = vm.y;\n\t\tvar globalDefaults = core_defaults.global;\n\t\tvar defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow\n\n\t\tif (vm.skip) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clipping for Points.\n\t\tif (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) {\n\t\t\tctx.strokeStyle = vm.borderColor || defaultColor;\n\t\t\tctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth);\n\t\t\tctx.fillStyle = vm.backgroundColor || defaultColor;\n\t\t\thelpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation);\n\t\t}\n\t}\n});\n\nvar defaultColor$2 = core_defaults.global.defaultColor;\n\ncore_defaults._set('global', {\n\telements: {\n\t\trectangle: {\n\t\t\tbackgroundColor: defaultColor$2,\n\t\t\tborderColor: defaultColor$2,\n\t\t\tborderSkipped: 'bottom',\n\t\t\tborderWidth: 0\n\t\t}\n\t}\n});\n\nfunction isVertical(vm) {\n\treturn vm && vm.width !== undefined;\n}\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param bar {Chart.Element.Rectangle} the bar\n * @return {Bounds} bounds of the bar\n * @private\n */\nfunction getBarBounds(vm) {\n\tvar x1, x2, y1, y2, half;\n\n\tif (isVertical(vm)) {\n\t\thalf = vm.width / 2;\n\t\tx1 = vm.x - half;\n\t\tx2 = vm.x + half;\n\t\ty1 = Math.min(vm.y, vm.base);\n\t\ty2 = Math.max(vm.y, vm.base);\n\t} else {\n\t\thalf = vm.height / 2;\n\t\tx1 = Math.min(vm.x, vm.base);\n\t\tx2 = Math.max(vm.x, vm.base);\n\t\ty1 = vm.y - half;\n\t\ty2 = vm.y + half;\n\t}\n\n\treturn {\n\t\tleft: x1,\n\t\ttop: y1,\n\t\tright: x2,\n\t\tbottom: y2\n\t};\n}\n\nfunction swap(orig, v1, v2) {\n\treturn orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction parseBorderSkipped(vm) {\n\tvar edge = vm.borderSkipped;\n\tvar res = {};\n\n\tif (!edge) {\n\t\treturn res;\n\t}\n\n\tif (vm.horizontal) {\n\t\tif (vm.base > vm.x) {\n\t\t\tedge = swap(edge, 'left', 'right');\n\t\t}\n\t} else if (vm.base < vm.y) {\n\t\tedge = swap(edge, 'bottom', 'top');\n\t}\n\n\tres[edge] = true;\n\treturn res;\n}\n\nfunction parseBorderWidth(vm, maxW, maxH) {\n\tvar value = vm.borderWidth;\n\tvar skip = parseBorderSkipped(vm);\n\tvar t, r, b, l;\n\n\tif (helpers$1.isObject(value)) {\n\t\tt = +value.top || 0;\n\t\tr = +value.right || 0;\n\t\tb = +value.bottom || 0;\n\t\tl = +value.left || 0;\n\t} else {\n\t\tt = r = b = l = +value || 0;\n\t}\n\n\treturn {\n\t\tt: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t,\n\t\tr: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r,\n\t\tb: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b,\n\t\tl: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l\n\t};\n}\n\nfunction boundingRects(vm) {\n\tvar bounds = getBarBounds(vm);\n\tvar width = bounds.right - bounds.left;\n\tvar height = bounds.bottom - bounds.top;\n\tvar border = parseBorderWidth(vm, width / 2, height / 2);\n\n\treturn {\n\t\touter: {\n\t\t\tx: bounds.left,\n\t\t\ty: bounds.top,\n\t\t\tw: width,\n\t\t\th: height\n\t\t},\n\t\tinner: {\n\t\t\tx: bounds.left + border.l,\n\t\t\ty: bounds.top + border.t,\n\t\t\tw: width - border.l - border.r,\n\t\t\th: height - border.t - border.b\n\t\t}\n\t};\n}\n\nfunction inRange(vm, x, y) {\n\tvar skipX = x === null;\n\tvar skipY = y === null;\n\tvar bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm);\n\n\treturn bounds\n\t\t&& (skipX || x >= bounds.left && x <= bounds.right)\n\t\t&& (skipY || y >= bounds.top && y <= bounds.bottom);\n}\n\nvar element_rectangle = core_element.extend({\n\t_type: 'rectangle',\n\n\tdraw: function() {\n\t\tvar ctx = this._chart.ctx;\n\t\tvar vm = this._view;\n\t\tvar rects = boundingRects(vm);\n\t\tvar outer = rects.outer;\n\t\tvar inner = rects.inner;\n\n\t\tctx.fillStyle = vm.backgroundColor;\n\t\tctx.fillRect(outer.x, outer.y, outer.w, outer.h);\n\n\t\tif (outer.w === inner.w && outer.h === inner.h) {\n\t\t\treturn;\n\t\t}\n\n\t\tctx.save();\n\t\tctx.beginPath();\n\t\tctx.rect(outer.x, outer.y, outer.w, outer.h);\n\t\tctx.clip();\n\t\tctx.fillStyle = vm.borderColor;\n\t\tctx.rect(inner.x, inner.y, inner.w, inner.h);\n\t\tctx.fill('evenodd');\n\t\tctx.restore();\n\t},\n\n\theight: function() {\n\t\tvar vm = this._view;\n\t\treturn vm.base - vm.y;\n\t},\n\n\tinRange: function(mouseX, mouseY) {\n\t\treturn inRange(this._view, mouseX, mouseY);\n\t},\n\n\tinLabelRange: function(mouseX, mouseY) {\n\t\tvar vm = this._view;\n\t\treturn isVertical(vm)\n\t\t\t? inRange(vm, mouseX, null)\n\t\t\t: inRange(vm, null, mouseY);\n\t},\n\n\tinXRange: function(mouseX) {\n\t\treturn inRange(this._view, mouseX, null);\n\t},\n\n\tinYRange: function(mouseY) {\n\t\treturn inRange(this._view, null, mouseY);\n\t},\n\n\tgetCenterPoint: function() {\n\t\tvar vm = this._view;\n\t\tvar x, y;\n\t\tif (isVertical(vm)) {\n\t\t\tx = vm.x;\n\t\t\ty = (vm.y + vm.base) / 2;\n\t\t} else {\n\t\t\tx = (vm.x + vm.base) / 2;\n\t\t\ty = vm.y;\n\t\t}\n\n\t\treturn {x: x, y: y};\n\t},\n\n\tgetArea: function() {\n\t\tvar vm = this._view;\n\n\t\treturn isVertical(vm)\n\t\t\t? vm.width * Math.abs(vm.y - vm.base)\n\t\t\t: vm.height * Math.abs(vm.x - vm.base);\n\t},\n\n\ttooltipPosition: function() {\n\t\tvar vm = this._view;\n\t\treturn {\n\t\t\tx: vm.x,\n\t\t\ty: vm.y\n\t\t};\n\t}\n});\n\nvar elements = {};\nvar Arc = element_arc;\nvar Line = element_line;\nvar Point = element_point;\nvar Rectangle = element_rectangle;\nelements.Arc = Arc;\nelements.Line = Line;\nelements.Point = Point;\nelements.Rectangle = Rectangle;\n\nvar deprecated = helpers$1._deprecated;\nvar valueOrDefault$3 = helpers$1.valueOrDefault;\n\ncore_defaults._set('bar', {\n\thover: {\n\t\tmode: 'label'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'category',\n\t\t\toffset: true,\n\t\t\tgridLines: {\n\t\t\t\toffsetGridLines: true\n\t\t\t}\n\t\t}],\n\n\t\tyAxes: [{\n\t\t\ttype: 'linear'\n\t\t}]\n\t}\n});\n\ncore_defaults._set('global', {\n\tdatasets: {\n\t\tbar: {\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9\n\t\t}\n\t}\n});\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(scale, pixels) {\n\tvar min = scale._length;\n\tvar prev, curr, i, ilen;\n\n\tfor (i = 1, ilen = pixels.length; i < ilen; ++i) {\n\t\tmin = Math.min(min, Math.abs(pixels[i] - pixels[i - 1]));\n\t}\n\n\tfor (i = 0, ilen = scale.getTicks().length; i < ilen; ++i) {\n\t\tcurr = scale.getPixelForTick(i);\n\t\tmin = i > 0 ? Math.min(min, Math.abs(curr - prev)) : min;\n\t\tprev = curr;\n\t}\n\n\treturn min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options) {\n\tvar thickness = options.barThickness;\n\tvar count = ruler.stackCount;\n\tvar curr = ruler.pixels[index];\n\tvar min = helpers$1.isNullOrUndef(thickness)\n\t\t? computeMinSampleSize(ruler.scale, ruler.pixels)\n\t\t: -1;\n\tvar size, ratio;\n\n\tif (helpers$1.isNullOrUndef(thickness)) {\n\t\tsize = min * options.categoryPercentage;\n\t\tratio = options.barPercentage;\n\t} else {\n\t\t// When bar thickness is enforced, category and bar percentages are ignored.\n\t\t// Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n\t\t// and deprecate barPercentage since this value is ignored when thickness is absolute.\n\t\tsize = thickness * count;\n\t\tratio = 1;\n\t}\n\n\treturn {\n\t\tchunk: size / count,\n\t\tratio: ratio,\n\t\tstart: curr - (size / 2)\n\t};\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options) {\n\tvar pixels = ruler.pixels;\n\tvar curr = pixels[index];\n\tvar prev = index > 0 ? pixels[index - 1] : null;\n\tvar next = index < pixels.length - 1 ? pixels[index + 1] : null;\n\tvar percent = options.categoryPercentage;\n\tvar start, size;\n\n\tif (prev === null) {\n\t\t// first data: its size is double based on the next point or,\n\t\t// if it's also the last data, we use the scale size.\n\t\tprev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n\t}\n\n\tif (next === null) {\n\t\t// last data: its size is also double based on the previous point.\n\t\tnext = curr + curr - prev;\n\t}\n\n\tstart = curr - (curr - Math.min(prev, next)) / 2 * percent;\n\tsize = Math.abs(next - prev) / 2 * percent;\n\n\treturn {\n\t\tchunk: size / ruler.stackCount,\n\t\tratio: options.barPercentage,\n\t\tstart: start\n\t};\n}\n\nvar controller_bar = core_datasetController.extend({\n\n\tdataElementType: elements.Rectangle,\n\n\t/**\n\t * @private\n\t */\n\t_dataElementOptions: [\n\t\t'backgroundColor',\n\t\t'borderColor',\n\t\t'borderSkipped',\n\t\t'borderWidth',\n\t\t'barPercentage',\n\t\t'barThickness',\n\t\t'categoryPercentage',\n\t\t'maxBarThickness',\n\t\t'minBarLength'\n\t],\n\n\tinitialize: function() {\n\t\tvar me = this;\n\t\tvar meta, scaleOpts;\n\n\t\tcore_datasetController.prototype.initialize.apply(me, arguments);\n\n\t\tmeta = me.getMeta();\n\t\tmeta.stack = me.getDataset().stack;\n\t\tmeta.bar = true;\n\n\t\tscaleOpts = me._getIndexScale().options;\n\t\tdeprecated('bar chart', scaleOpts.barPercentage, 'scales.[x/y]Axes.barPercentage', 'dataset.barPercentage');\n\t\tdeprecated('bar chart', scaleOpts.barThickness, 'scales.[x/y]Axes.barThickness', 'dataset.barThickness');\n\t\tdeprecated('bar chart', scaleOpts.categoryPercentage, 'scales.[x/y]Axes.categoryPercentage', 'dataset.categoryPercentage');\n\t\tdeprecated('bar chart', me._getValueScale().options.minBarLength, 'scales.[x/y]Axes.minBarLength', 'dataset.minBarLength');\n\t\tdeprecated('bar chart', scaleOpts.maxBarThickness, 'scales.[x/y]Axes.maxBarThickness', 'dataset.maxBarThickness');\n\t},\n\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar rects = me.getMeta().data;\n\t\tvar i, ilen;\n\n\t\tme._ruler = me.getRuler();\n\n\t\tfor (i = 0, ilen = rects.length; i < ilen; ++i) {\n\t\t\tme.updateElement(rects[i], i, reset);\n\t\t}\n\t},\n\n\tupdateElement: function(rectangle, index, reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar dataset = me.getDataset();\n\t\tvar options = me._resolveDataElementOptions(rectangle, index);\n\n\t\trectangle._xScale = me.getScaleForId(meta.xAxisID);\n\t\trectangle._yScale = me.getScaleForId(meta.yAxisID);\n\t\trectangle._datasetIndex = me.index;\n\t\trectangle._index = index;\n\t\trectangle._model = {\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\tborderColor: options.borderColor,\n\t\t\tborderSkipped: options.borderSkipped,\n\t\t\tborderWidth: options.borderWidth,\n\t\t\tdatasetLabel: dataset.label,\n\t\t\tlabel: me.chart.data.labels[index]\n\t\t};\n\n\t\tif (helpers$1.isArray(dataset.data[index])) {\n\t\t\trectangle._model.borderSkipped = null;\n\t\t}\n\n\t\tme._updateElementGeometry(rectangle, index, reset, options);\n\n\t\trectangle.pivot();\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_updateElementGeometry: function(rectangle, index, reset, options) {\n\t\tvar me = this;\n\t\tvar model = rectangle._model;\n\t\tvar vscale = me._getValueScale();\n\t\tvar base = vscale.getBasePixel();\n\t\tvar horizontal = vscale.isHorizontal();\n\t\tvar ruler = me._ruler || me.getRuler();\n\t\tvar vpixels = me.calculateBarValuePixels(me.index, index, options);\n\t\tvar ipixels = me.calculateBarIndexPixels(me.index, index, ruler, options);\n\n\t\tmodel.horizontal = horizontal;\n\t\tmodel.base = reset ? base : vpixels.base;\n\t\tmodel.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n\t\tmodel.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n\t\tmodel.height = horizontal ? ipixels.size : undefined;\n\t\tmodel.width = horizontal ? undefined : ipixels.size;\n\t},\n\n\t/**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n\t_getStacks: function(last) {\n\t\tvar me = this;\n\t\tvar scale = me._getIndexScale();\n\t\tvar metasets = scale._getMatchingVisibleMetas(me._type);\n\t\tvar stacked = scale.options.stacked;\n\t\tvar ilen = metasets.length;\n\t\tvar stacks = [];\n\t\tvar i, meta;\n\n\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\tmeta = metasets[i];\n\t\t\t// stacked | meta.stack\n\t\t\t// | found | not found | undefined\n\t\t\t// false | x | x | x\n\t\t\t// true | | x |\n\t\t\t// undefined | | x | x\n\t\t\tif (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n\t\t\t\tstacks.push(meta.stack);\n\t\t\t}\n\t\t\tif (meta.index === last) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn stacks;\n\t},\n\n\t/**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n\tgetStackCount: function() {\n\t\treturn this._getStacks().length;\n\t},\n\n\t/**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n\t * @returns {number} The stack index\n\t * @private\n\t */\n\tgetStackIndex: function(datasetIndex, name) {\n\t\tvar stacks = this._getStacks(datasetIndex);\n\t\tvar index = (name !== undefined)\n\t\t\t? stacks.indexOf(name)\n\t\t\t: -1; // indexOf returns -1 if element is not present\n\n\t\treturn (index === -1)\n\t\t\t? stacks.length - 1\n\t\t\t: index;\n\t},\n\n\t/**\n\t * @private\n\t */\n\tgetRuler: function() {\n\t\tvar me = this;\n\t\tvar scale = me._getIndexScale();\n\t\tvar pixels = [];\n\t\tvar i, ilen;\n\n\t\tfor (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n\t\t\tpixels.push(scale.getPixelForValue(null, i, me.index));\n\t\t}\n\n\t\treturn {\n\t\t\tpixels: pixels,\n\t\t\tstart: scale._startPixel,\n\t\t\tend: scale._endPixel,\n\t\t\tstackCount: me.getStackCount(),\n\t\t\tscale: scale\n\t\t};\n\t},\n\n\t/**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n\tcalculateBarValuePixels: function(datasetIndex, index, options) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar scale = me._getValueScale();\n\t\tvar isHorizontal = scale.isHorizontal();\n\t\tvar datasets = chart.data.datasets;\n\t\tvar metasets = scale._getMatchingVisibleMetas(me._type);\n\t\tvar value = scale._parseValue(datasets[datasetIndex].data[index]);\n\t\tvar minBarLength = options.minBarLength;\n\t\tvar stacked = scale.options.stacked;\n\t\tvar stack = me.getMeta().stack;\n\t\tvar start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max;\n\t\tvar length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max;\n\t\tvar ilen = metasets.length;\n\t\tvar i, imeta, ivalue, base, head, size, stackLength;\n\n\t\tif (stacked || (stacked === undefined && stack !== undefined)) {\n\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\timeta = metasets[i];\n\n\t\t\t\tif (imeta.index === datasetIndex) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (imeta.stack === stack) {\n\t\t\t\t\tstackLength = scale._parseValue(datasets[imeta.index].data[index]);\n\t\t\t\t\tivalue = stackLength.start === undefined ? stackLength.end : stackLength.min >= 0 && stackLength.max >= 0 ? stackLength.max : stackLength.min;\n\n\t\t\t\t\tif ((value.min < 0 && ivalue < 0) || (value.max >= 0 && ivalue > 0)) {\n\t\t\t\t\t\tstart += ivalue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbase = scale.getPixelForValue(start);\n\t\thead = scale.getPixelForValue(start + length);\n\t\tsize = head - base;\n\n\t\tif (minBarLength !== undefined && Math.abs(size) < minBarLength) {\n\t\t\tsize = minBarLength;\n\t\t\tif (length >= 0 && !isHorizontal || length < 0 && isHorizontal) {\n\t\t\t\thead = base - minBarLength;\n\t\t\t} else {\n\t\t\t\thead = base + minBarLength;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsize: size,\n\t\t\tbase: base,\n\t\t\thead: head,\n\t\t\tcenter: head + size / 2\n\t\t};\n\t},\n\n\t/**\n\t * @private\n\t */\n\tcalculateBarIndexPixels: function(datasetIndex, index, ruler, options) {\n\t\tvar me = this;\n\t\tvar range = options.barThickness === 'flex'\n\t\t\t? computeFlexCategoryTraits(index, ruler, options)\n\t\t\t: computeFitCategoryTraits(index, ruler, options);\n\n\t\tvar stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);\n\t\tvar center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n\t\tvar size = Math.min(\n\t\t\tvalueOrDefault$3(options.maxBarThickness, Infinity),\n\t\t\trange.chunk * range.ratio);\n\n\t\treturn {\n\t\t\tbase: center - size / 2,\n\t\t\thead: center + size / 2,\n\t\t\tcenter: center,\n\t\t\tsize: size\n\t\t};\n\t},\n\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar scale = me._getValueScale();\n\t\tvar rects = me.getMeta().data;\n\t\tvar dataset = me.getDataset();\n\t\tvar ilen = rects.length;\n\t\tvar i = 0;\n\n\t\thelpers$1.canvas.clipArea(chart.ctx, chart.chartArea);\n\n\t\tfor (; i < ilen; ++i) {\n\t\t\tvar val = scale._parseValue(dataset.data[i]);\n\t\t\tif (!isNaN(val.min) && !isNaN(val.max)) {\n\t\t\t\trects[i].draw();\n\t\t\t}\n\t\t}\n\n\t\thelpers$1.canvas.unclipArea(chart.ctx);\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveDataElementOptions: function() {\n\t\tvar me = this;\n\t\tvar values = helpers$1.extend({}, core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments));\n\t\tvar indexOpts = me._getIndexScale().options;\n\t\tvar valueOpts = me._getValueScale().options;\n\n\t\tvalues.barPercentage = valueOrDefault$3(indexOpts.barPercentage, values.barPercentage);\n\t\tvalues.barThickness = valueOrDefault$3(indexOpts.barThickness, values.barThickness);\n\t\tvalues.categoryPercentage = valueOrDefault$3(indexOpts.categoryPercentage, values.categoryPercentage);\n\t\tvalues.maxBarThickness = valueOrDefault$3(indexOpts.maxBarThickness, values.maxBarThickness);\n\t\tvalues.minBarLength = valueOrDefault$3(valueOpts.minBarLength, values.minBarLength);\n\n\t\treturn values;\n\t}\n\n});\n\nvar valueOrDefault$4 = helpers$1.valueOrDefault;\nvar resolve$1 = helpers$1.options.resolve;\n\ncore_defaults._set('bubble', {\n\thover: {\n\t\tmode: 'single'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'linear', // bubble should probably use a linear scale by default\n\t\t\tposition: 'bottom',\n\t\t\tid: 'x-axis-0' // need an ID so datasets can reference the scale\n\t\t}],\n\t\tyAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tposition: 'left',\n\t\t\tid: 'y-axis-0'\n\t\t}]\n\t},\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(item, data) {\n\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\tvar dataPoint = data.datasets[item.datasetIndex].data[item.index];\n\t\t\t\treturn datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n\t\t\t}\n\t\t}\n\t}\n});\n\nvar controller_bubble = core_datasetController.extend({\n\t/**\n\t * @protected\n\t */\n\tdataElementType: elements.Point,\n\n\t/**\n\t * @private\n\t */\n\t_dataElementOptions: [\n\t\t'backgroundColor',\n\t\t'borderColor',\n\t\t'borderWidth',\n\t\t'hoverBackgroundColor',\n\t\t'hoverBorderColor',\n\t\t'hoverBorderWidth',\n\t\t'hoverRadius',\n\t\t'hitRadius',\n\t\t'pointStyle',\n\t\t'rotation'\n\t],\n\n\t/**\n\t * @protected\n\t */\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar points = meta.data;\n\n\t\t// Update Points\n\t\thelpers$1.each(points, function(point, index) {\n\t\t\tme.updateElement(point, index, reset);\n\t\t});\n\t},\n\n\t/**\n\t * @protected\n\t */\n\tupdateElement: function(point, index, reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar custom = point.custom || {};\n\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\tvar options = me._resolveDataElementOptions(point, index);\n\t\tvar data = me.getDataset().data[index];\n\t\tvar dsIndex = me.index;\n\n\t\tvar x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);\n\t\tvar y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n\n\t\tpoint._xScale = xScale;\n\t\tpoint._yScale = yScale;\n\t\tpoint._options = options;\n\t\tpoint._datasetIndex = dsIndex;\n\t\tpoint._index = index;\n\t\tpoint._model = {\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\tborderColor: options.borderColor,\n\t\t\tborderWidth: options.borderWidth,\n\t\t\thitRadius: options.hitRadius,\n\t\t\tpointStyle: options.pointStyle,\n\t\t\trotation: options.rotation,\n\t\t\tradius: reset ? 0 : options.radius,\n\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t};\n\n\t\tpoint.pivot();\n\t},\n\n\t/**\n\t * @protected\n\t */\n\tsetHoverStyle: function(point) {\n\t\tvar model = point._model;\n\t\tvar options = point._options;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\n\t\tpoint.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth,\n\t\t\tradius: model.radius\n\t\t};\n\n\t\tmodel.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n\t\tmodel.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));\n\t\tmodel.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);\n\t\tmodel.radius = options.radius + options.hoverRadius;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveDataElementOptions: function(point, index) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar dataset = me.getDataset();\n\t\tvar custom = point.custom || {};\n\t\tvar data = dataset.data[index] || {};\n\t\tvar values = core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments);\n\n\t\t// Scriptable options\n\t\tvar context = {\n\t\t\tchart: chart,\n\t\t\tdataIndex: index,\n\t\t\tdataset: dataset,\n\t\t\tdatasetIndex: me.index\n\t\t};\n\n\t\t// In case values were cached (and thus frozen), we need to clone the values\n\t\tif (me._cachedDataOpts === values) {\n\t\t\tvalues = helpers$1.extend({}, values);\n\t\t}\n\n\t\t// Custom radius resolution\n\t\tvalues.radius = resolve$1([\n\t\t\tcustom.radius,\n\t\t\tdata.r,\n\t\t\tme._config.radius,\n\t\t\tchart.options.elements.point.radius\n\t\t], context, index);\n\n\t\treturn values;\n\t}\n});\n\nvar valueOrDefault$5 = helpers$1.valueOrDefault;\n\nvar PI$1 = Math.PI;\nvar DOUBLE_PI$1 = PI$1 * 2;\nvar HALF_PI$1 = PI$1 / 2;\n\ncore_defaults._set('doughnut', {\n\tanimation: {\n\t\t// Boolean - Whether we animate the rotation of the Doughnut\n\t\tanimateRotate: true,\n\t\t// Boolean - Whether we animate scaling the Doughnut from the centre\n\t\tanimateScale: false\n\t},\n\thover: {\n\t\tmode: 'single'\n\t},\n\tlegendCallback: function(chart) {\n\t\tvar list = document.createElement('ul');\n\t\tvar data = chart.data;\n\t\tvar datasets = data.datasets;\n\t\tvar labels = data.labels;\n\t\tvar i, ilen, listItem, listItemSpan;\n\n\t\tlist.setAttribute('class', chart.id + '-legend');\n\t\tif (datasets.length) {\n\t\t\tfor (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {\n\t\t\t\tlistItem = list.appendChild(document.createElement('li'));\n\t\t\t\tlistItemSpan = listItem.appendChild(document.createElement('span'));\n\t\t\t\tlistItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];\n\t\t\t\tif (labels[i]) {\n\t\t\t\t\tlistItem.appendChild(document.createTextNode(labels[i]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn list.outerHTML;\n\t},\n\tlegend: {\n\t\tlabels: {\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\tvar style = meta.controller.getStyle(i);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\tfillStyle: style.backgroundColor,\n\t\t\t\t\t\t\tstrokeStyle: style.borderColor,\n\t\t\t\t\t\t\tlineWidth: style.borderWidth,\n\t\t\t\t\t\t\thidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.index;\n\t\t\tvar chart = this.chart;\n\t\t\tvar i, ilen, meta;\n\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t// toggle visibility of index if exists\n\t\t\t\tif (meta.data[index]) {\n\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchart.update();\n\t\t}\n\t},\n\n\t// The percentage of the chart that we cut out of the middle.\n\tcutoutPercentage: 50,\n\n\t// The rotation of the chart, where the first data arc begins.\n\trotation: -HALF_PI$1,\n\n\t// The total circumference of the chart.\n\tcircumference: DOUBLE_PI$1,\n\n\t// Need to override these to give a nice default\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar dataLabel = data.labels[tooltipItem.index];\n\t\t\t\tvar value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n\t\t\t\tif (helpers$1.isArray(dataLabel)) {\n\t\t\t\t\t// show value on first line of multiline label\n\t\t\t\t\t// need to clone because we are changing the value\n\t\t\t\t\tdataLabel = dataLabel.slice();\n\t\t\t\t\tdataLabel[0] += value;\n\t\t\t\t} else {\n\t\t\t\t\tdataLabel += value;\n\t\t\t\t}\n\n\t\t\t\treturn dataLabel;\n\t\t\t}\n\t\t}\n\t}\n});\n\nvar controller_doughnut = core_datasetController.extend({\n\n\tdataElementType: elements.Arc,\n\n\tlinkScales: helpers$1.noop,\n\n\t/**\n\t * @private\n\t */\n\t_dataElementOptions: [\n\t\t'backgroundColor',\n\t\t'borderColor',\n\t\t'borderWidth',\n\t\t'borderAlign',\n\t\t'hoverBackgroundColor',\n\t\t'hoverBorderColor',\n\t\t'hoverBorderWidth',\n\t],\n\n\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n\tgetRingIndex: function(datasetIndex) {\n\t\tvar ringIndex = 0;\n\n\t\tfor (var j = 0; j < datasetIndex; ++j) {\n\t\t\tif (this.chart.isDatasetVisible(j)) {\n\t\t\t\t++ringIndex;\n\t\t\t}\n\t\t}\n\n\t\treturn ringIndex;\n\t},\n\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar chartArea = chart.chartArea;\n\t\tvar opts = chart.options;\n\t\tvar ratioX = 1;\n\t\tvar ratioY = 1;\n\t\tvar offsetX = 0;\n\t\tvar offsetY = 0;\n\t\tvar meta = me.getMeta();\n\t\tvar arcs = meta.data;\n\t\tvar cutout = opts.cutoutPercentage / 100 || 0;\n\t\tvar circumference = opts.circumference;\n\t\tvar chartWeight = me._getRingWeight(me.index);\n\t\tvar maxWidth, maxHeight, i, ilen;\n\n\t\t// If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n\t\tif (circumference < DOUBLE_PI$1) {\n\t\t\tvar startAngle = opts.rotation % DOUBLE_PI$1;\n\t\t\tstartAngle += startAngle >= PI$1 ? -DOUBLE_PI$1 : startAngle < -PI$1 ? DOUBLE_PI$1 : 0;\n\t\t\tvar endAngle = startAngle + circumference;\n\t\t\tvar startX = Math.cos(startAngle);\n\t\t\tvar startY = Math.sin(startAngle);\n\t\t\tvar endX = Math.cos(endAngle);\n\t\t\tvar endY = Math.sin(endAngle);\n\t\t\tvar contains0 = (startAngle <= 0 && endAngle >= 0) || endAngle >= DOUBLE_PI$1;\n\t\t\tvar contains90 = (startAngle <= HALF_PI$1 && endAngle >= HALF_PI$1) || endAngle >= DOUBLE_PI$1 + HALF_PI$1;\n\t\t\tvar contains180 = startAngle === -PI$1 || endAngle >= PI$1;\n\t\t\tvar contains270 = (startAngle <= -HALF_PI$1 && endAngle >= -HALF_PI$1) || endAngle >= PI$1 + HALF_PI$1;\n\t\t\tvar minX = contains180 ? -1 : Math.min(startX, startX * cutout, endX, endX * cutout);\n\t\t\tvar minY = contains270 ? -1 : Math.min(startY, startY * cutout, endY, endY * cutout);\n\t\t\tvar maxX = contains0 ? 1 : Math.max(startX, startX * cutout, endX, endX * cutout);\n\t\t\tvar maxY = contains90 ? 1 : Math.max(startY, startY * cutout, endY, endY * cutout);\n\t\t\tratioX = (maxX - minX) / 2;\n\t\t\tratioY = (maxY - minY) / 2;\n\t\t\toffsetX = -(maxX + minX) / 2;\n\t\t\toffsetY = -(maxY + minY) / 2;\n\t\t}\n\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\n\t\t\tarcs[i]._options = me._resolveDataElementOptions(arcs[i], i);\n\t\t}\n\n\t\tchart.borderWidth = me.getMaxBorderWidth();\n\t\tmaxWidth = (chartArea.right - chartArea.left - chart.borderWidth) / ratioX;\n\t\tmaxHeight = (chartArea.bottom - chartArea.top - chart.borderWidth) / ratioY;\n\t\tchart.outerRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n\t\tchart.innerRadius = Math.max(chart.outerRadius * cutout, 0);\n\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1);\n\t\tchart.offsetX = offsetX * chart.outerRadius;\n\t\tchart.offsetY = offsetY * chart.outerRadius;\n\n\t\tmeta.total = me.calculateTotal();\n\n\t\tme.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index);\n\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0);\n\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\n\t\t\tme.updateElement(arcs[i], i, reset);\n\t\t}\n\t},\n\n\tupdateElement: function(arc, index, reset) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar chartArea = chart.chartArea;\n\t\tvar opts = chart.options;\n\t\tvar animationOpts = opts.animation;\n\t\tvar centerX = (chartArea.left + chartArea.right) / 2;\n\t\tvar centerY = (chartArea.top + chartArea.bottom) / 2;\n\t\tvar startAngle = opts.rotation; // non reset case handled later\n\t\tvar endAngle = opts.rotation; // non reset case handled later\n\t\tvar dataset = me.getDataset();\n\t\tvar circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / DOUBLE_PI$1);\n\t\tvar innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n\t\tvar outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n\t\tvar options = arc._options || {};\n\n\t\thelpers$1.extend(arc, {\n\t\t\t// Utility\n\t\t\t_datasetIndex: me.index,\n\t\t\t_index: index,\n\n\t\t\t// Desired view properties\n\t\t\t_model: {\n\t\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\t\tborderColor: options.borderColor,\n\t\t\t\tborderWidth: options.borderWidth,\n\t\t\t\tborderAlign: options.borderAlign,\n\t\t\t\tx: centerX + chart.offsetX,\n\t\t\t\ty: centerY + chart.offsetY,\n\t\t\t\tstartAngle: startAngle,\n\t\t\t\tendAngle: endAngle,\n\t\t\t\tcircumference: circumference,\n\t\t\t\touterRadius: outerRadius,\n\t\t\t\tinnerRadius: innerRadius,\n\t\t\t\tlabel: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n\t\t\t}\n\t\t});\n\n\t\tvar model = arc._model;\n\n\t\t// Set correct angles if not resetting\n\t\tif (!reset || !animationOpts.animateRotate) {\n\t\t\tif (index === 0) {\n\t\t\t\tmodel.startAngle = opts.rotation;\n\t\t\t} else {\n\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n\t\t\t}\n\n\t\t\tmodel.endAngle = model.startAngle + model.circumference;\n\t\t}\n\n\t\tarc.pivot();\n\t},\n\n\tcalculateTotal: function() {\n\t\tvar dataset = this.getDataset();\n\t\tvar meta = this.getMeta();\n\t\tvar total = 0;\n\t\tvar value;\n\n\t\thelpers$1.each(meta.data, function(element, index) {\n\t\t\tvalue = dataset.data[index];\n\t\t\tif (!isNaN(value) && !element.hidden) {\n\t\t\t\ttotal += Math.abs(value);\n\t\t\t}\n\t\t});\n\n\t\t/* if (total === 0) {\n\t\t\ttotal = NaN;\n\t\t}*/\n\n\t\treturn total;\n\t},\n\n\tcalculateCircumference: function(value) {\n\t\tvar total = this.getMeta().total;\n\t\tif (total > 0 && !isNaN(value)) {\n\t\t\treturn DOUBLE_PI$1 * (Math.abs(value) / total);\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// gets the max border or hover width to properly scale pie charts\n\tgetMaxBorderWidth: function(arcs) {\n\t\tvar me = this;\n\t\tvar max = 0;\n\t\tvar chart = me.chart;\n\t\tvar i, ilen, meta, arc, controller, options, borderWidth, hoverWidth;\n\n\t\tif (!arcs) {\n\t\t\t// Find the outmost visible dataset\n\t\t\tfor (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tif (chart.isDatasetVisible(i)) {\n\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\tarcs = meta.data;\n\t\t\t\t\tif (i !== me.index) {\n\t\t\t\t\t\tcontroller = meta.controller;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!arcs) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\n\t\t\tarc = arcs[i];\n\t\t\tif (controller) {\n\t\t\t\tcontroller._configure();\n\t\t\t\toptions = controller._resolveDataElementOptions(arc, i);\n\t\t\t} else {\n\t\t\t\toptions = arc._options;\n\t\t\t}\n\t\t\tif (options.borderAlign !== 'inner') {\n\t\t\t\tborderWidth = options.borderWidth;\n\t\t\t\thoverWidth = options.hoverBorderWidth;\n\n\t\t\t\tmax = borderWidth > max ? borderWidth : max;\n\t\t\t\tmax = hoverWidth > max ? hoverWidth : max;\n\t\t\t}\n\t\t}\n\t\treturn max;\n\t},\n\n\t/**\n\t * @protected\n\t */\n\tsetHoverStyle: function(arc) {\n\t\tvar model = arc._model;\n\t\tvar options = arc._options;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\n\t\tarc.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth,\n\t\t};\n\n\t\tmodel.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n\t\tmodel.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));\n\t\tmodel.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);\n\t},\n\n\t/**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n\t_getRingWeightOffset: function(datasetIndex) {\n\t\tvar ringWeightOffset = 0;\n\n\t\tfor (var i = 0; i < datasetIndex; ++i) {\n\t\t\tif (this.chart.isDatasetVisible(i)) {\n\t\t\t\tringWeightOffset += this._getRingWeight(i);\n\t\t\t}\n\t\t}\n\n\t\treturn ringWeightOffset;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getRingWeight: function(dataSetIndex) {\n\t\treturn Math.max(valueOrDefault$5(this.chart.data.datasets[dataSetIndex].weight, 1), 0);\n\t},\n\n\t/**\n\t * Returns the sum of all visibile data set weights. This value can be 0.\n\t * @private\n\t */\n\t_getVisibleDatasetWeightTotal: function() {\n\t\treturn this._getRingWeightOffset(this.chart.data.datasets.length);\n\t}\n});\n\ncore_defaults._set('horizontalBar', {\n\thover: {\n\t\tmode: 'index',\n\t\taxis: 'y'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tposition: 'bottom'\n\t\t}],\n\n\t\tyAxes: [{\n\t\t\ttype: 'category',\n\t\t\tposition: 'left',\n\t\t\toffset: true,\n\t\t\tgridLines: {\n\t\t\t\toffsetGridLines: true\n\t\t\t}\n\t\t}]\n\t},\n\n\telements: {\n\t\trectangle: {\n\t\t\tborderSkipped: 'left'\n\t\t}\n\t},\n\n\ttooltips: {\n\t\tmode: 'index',\n\t\taxis: 'y'\n\t}\n});\n\ncore_defaults._set('global', {\n\tdatasets: {\n\t\thorizontalBar: {\n\t\t\tcategoryPercentage: 0.8,\n\t\t\tbarPercentage: 0.9\n\t\t}\n\t}\n});\n\nvar controller_horizontalBar = controller_bar.extend({\n\t/**\n\t * @private\n\t */\n\t_getValueScaleId: function() {\n\t\treturn this.getMeta().xAxisID;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getIndexScaleId: function() {\n\t\treturn this.getMeta().yAxisID;\n\t}\n});\n\nvar valueOrDefault$6 = helpers$1.valueOrDefault;\nvar resolve$2 = helpers$1.options.resolve;\nvar isPointInArea = helpers$1.canvas._isPointInArea;\n\ncore_defaults._set('line', {\n\tshowLines: true,\n\tspanGaps: false,\n\n\thover: {\n\t\tmode: 'label'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\ttype: 'category',\n\t\t\tid: 'x-axis-0'\n\t\t}],\n\t\tyAxes: [{\n\t\t\ttype: 'linear',\n\t\t\tid: 'y-axis-0'\n\t\t}]\n\t}\n});\n\nfunction scaleClip(scale, halfBorderWidth) {\n\tvar tickOpts = scale && scale.options.ticks || {};\n\tvar reverse = tickOpts.reverse;\n\tvar min = tickOpts.min === undefined ? halfBorderWidth : 0;\n\tvar max = tickOpts.max === undefined ? halfBorderWidth : 0;\n\treturn {\n\t\tstart: reverse ? max : min,\n\t\tend: reverse ? min : max\n\t};\n}\n\nfunction defaultClip(xScale, yScale, borderWidth) {\n\tvar halfBorderWidth = borderWidth / 2;\n\tvar x = scaleClip(xScale, halfBorderWidth);\n\tvar y = scaleClip(yScale, halfBorderWidth);\n\n\treturn {\n\t\ttop: y.end,\n\t\tright: x.end,\n\t\tbottom: y.start,\n\t\tleft: x.start\n\t};\n}\n\nfunction toClip(value) {\n\tvar t, r, b, l;\n\n\tif (helpers$1.isObject(value)) {\n\t\tt = value.top;\n\t\tr = value.right;\n\t\tb = value.bottom;\n\t\tl = value.left;\n\t} else {\n\t\tt = r = b = l = value;\n\t}\n\n\treturn {\n\t\ttop: t,\n\t\tright: r,\n\t\tbottom: b,\n\t\tleft: l\n\t};\n}\n\n\nvar controller_line = core_datasetController.extend({\n\n\tdatasetElementType: elements.Line,\n\n\tdataElementType: elements.Point,\n\n\t/**\n\t * @private\n\t */\n\t_datasetElementOptions: [\n\t\t'backgroundColor',\n\t\t'borderCapStyle',\n\t\t'borderColor',\n\t\t'borderDash',\n\t\t'borderDashOffset',\n\t\t'borderJoinStyle',\n\t\t'borderWidth',\n\t\t'cubicInterpolationMode',\n\t\t'fill'\n\t],\n\n\t/**\n\t * @private\n\t */\n\t_dataElementOptions: {\n\t\tbackgroundColor: 'pointBackgroundColor',\n\t\tborderColor: 'pointBorderColor',\n\t\tborderWidth: 'pointBorderWidth',\n\t\thitRadius: 'pointHitRadius',\n\t\thoverBackgroundColor: 'pointHoverBackgroundColor',\n\t\thoverBorderColor: 'pointHoverBorderColor',\n\t\thoverBorderWidth: 'pointHoverBorderWidth',\n\t\thoverRadius: 'pointHoverRadius',\n\t\tpointStyle: 'pointStyle',\n\t\tradius: 'pointRadius',\n\t\trotation: 'pointRotation'\n\t},\n\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar line = meta.dataset;\n\t\tvar points = meta.data || [];\n\t\tvar options = me.chart.options;\n\t\tvar config = me._config;\n\t\tvar showLine = me._showLine = valueOrDefault$6(config.showLine, options.showLines);\n\t\tvar i, ilen;\n\n\t\tme._xScale = me.getScaleForId(meta.xAxisID);\n\t\tme._yScale = me.getScaleForId(meta.yAxisID);\n\n\t\t// Update Line\n\t\tif (showLine) {\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif (config.tension !== undefined && config.lineTension === undefined) {\n\t\t\t\tconfig.lineTension = config.tension;\n\t\t\t}\n\n\t\t\t// Utility\n\t\t\tline._scale = me._yScale;\n\t\t\tline._datasetIndex = me.index;\n\t\t\t// Data\n\t\t\tline._children = points;\n\t\t\t// Model\n\t\t\tline._model = me._resolveDatasetElementOptions(line);\n\n\t\t\tline.pivot();\n\t\t}\n\n\t\t// Update Points\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\tme.updateElement(points[i], i, reset);\n\t\t}\n\n\t\tif (showLine && line._model.tension !== 0) {\n\t\t\tme.updateBezierControlPoints();\n\t\t}\n\n\t\t// Now pivot the point for animation\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\tpoints[i].pivot();\n\t\t}\n\t},\n\n\tupdateElement: function(point, index, reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar custom = point.custom || {};\n\t\tvar dataset = me.getDataset();\n\t\tvar datasetIndex = me.index;\n\t\tvar value = dataset.data[index];\n\t\tvar xScale = me._xScale;\n\t\tvar yScale = me._yScale;\n\t\tvar lineModel = meta.dataset._model;\n\t\tvar x, y;\n\n\t\tvar options = me._resolveDataElementOptions(point, index);\n\n\t\tx = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);\n\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n\t\t// Utility\n\t\tpoint._xScale = xScale;\n\t\tpoint._yScale = yScale;\n\t\tpoint._options = options;\n\t\tpoint._datasetIndex = datasetIndex;\n\t\tpoint._index = index;\n\n\t\t// Desired view properties\n\t\tpoint._model = {\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t// Appearance\n\t\t\tradius: options.radius,\n\t\t\tpointStyle: options.pointStyle,\n\t\t\trotation: options.rotation,\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\tborderColor: options.borderColor,\n\t\t\tborderWidth: options.borderWidth,\n\t\t\ttension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0),\n\t\t\tsteppedLine: lineModel ? lineModel.steppedLine : false,\n\t\t\t// Tooltip\n\t\t\thitRadius: options.hitRadius\n\t\t};\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveDatasetElementOptions: function(element) {\n\t\tvar me = this;\n\t\tvar config = me._config;\n\t\tvar custom = element.custom || {};\n\t\tvar options = me.chart.options;\n\t\tvar lineOptions = options.elements.line;\n\t\tvar values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);\n\n\t\t// The default behavior of lines is to break at null values, according\n\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n\t\t// This option gives lines the ability to span gaps\n\t\tvalues.spanGaps = valueOrDefault$6(config.spanGaps, options.spanGaps);\n\t\tvalues.tension = valueOrDefault$6(config.lineTension, lineOptions.tension);\n\t\tvalues.steppedLine = resolve$2([custom.steppedLine, config.steppedLine, lineOptions.stepped]);\n\t\tvalues.clip = toClip(valueOrDefault$6(config.clip, defaultClip(me._xScale, me._yScale, values.borderWidth)));\n\n\t\treturn values;\n\t},\n\n\tcalculatePointY: function(value, index, datasetIndex) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar yScale = me._yScale;\n\t\tvar sumPos = 0;\n\t\tvar sumNeg = 0;\n\t\tvar i, ds, dsMeta, stackedRightValue, rightValue, metasets, ilen;\n\n\t\tif (yScale.options.stacked) {\n\t\t\trightValue = +yScale.getRightValue(value);\n\t\t\tmetasets = chart._getSortedVisibleDatasetMetas();\n\t\t\tilen = metasets.length;\n\n\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\tdsMeta = metasets[i];\n\t\t\t\tif (dsMeta.index === datasetIndex) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tds = chart.data.datasets[dsMeta.index];\n\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id) {\n\t\t\t\t\tstackedRightValue = +yScale.getRightValue(ds.data[index]);\n\t\t\t\t\tif (stackedRightValue < 0) {\n\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsumPos += stackedRightValue || 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (rightValue < 0) {\n\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\n\t\t\t}\n\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\n\t\t}\n\t\treturn yScale.getPixelForValue(value);\n\t},\n\n\tupdateBezierControlPoints: function() {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar meta = me.getMeta();\n\t\tvar lineModel = meta.dataset._model;\n\t\tvar area = chart.chartArea;\n\t\tvar points = meta.data || [];\n\t\tvar i, ilen, model, controlPoints;\n\n\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\tif (lineModel.spanGaps) {\n\t\t\tpoints = points.filter(function(pt) {\n\t\t\t\treturn !pt._model.skip;\n\t\t\t});\n\t\t}\n\n\t\tfunction capControlPoint(pt, min, max) {\n\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t}\n\n\t\tif (lineModel.cubicInterpolationMode === 'monotone') {\n\t\t\thelpers$1.splineCurveMonotone(points);\n\t\t} else {\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tmodel = points[i]._model;\n\t\t\t\tcontrolPoints = helpers$1.splineCurve(\n\t\t\t\t\thelpers$1.previousItem(points, i)._model,\n\t\t\t\t\tmodel,\n\t\t\t\t\thelpers$1.nextItem(points, i)._model,\n\t\t\t\t\tlineModel.tension\n\t\t\t\t);\n\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\n\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\n\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\n\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\n\t\t\t}\n\t\t}\n\n\t\tif (chart.options.elements.line.capBezierPoints) {\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\tmodel = points[i]._model;\n\t\t\t\tif (isPointInArea(model, area)) {\n\t\t\t\t\tif (i > 0 && isPointInArea(points[i - 1]._model, area)) {\n\t\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n\t\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n\t\t\t\t\t}\n\t\t\t\t\tif (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) {\n\t\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n\t\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tdraw: function() {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar meta = me.getMeta();\n\t\tvar points = meta.data || [];\n\t\tvar area = chart.chartArea;\n\t\tvar canvas = chart.canvas;\n\t\tvar i = 0;\n\t\tvar ilen = points.length;\n\t\tvar clip;\n\n\t\tif (me._showLine) {\n\t\t\tclip = meta.dataset._model.clip;\n\n\t\t\thelpers$1.canvas.clipArea(chart.ctx, {\n\t\t\t\tleft: clip.left === false ? 0 : area.left - clip.left,\n\t\t\t\tright: clip.right === false ? canvas.width : area.right + clip.right,\n\t\t\t\ttop: clip.top === false ? 0 : area.top - clip.top,\n\t\t\t\tbottom: clip.bottom === false ? canvas.height : area.bottom + clip.bottom\n\t\t\t});\n\n\t\t\tmeta.dataset.draw();\n\n\t\t\thelpers$1.canvas.unclipArea(chart.ctx);\n\t\t}\n\n\t\t// Draw the points\n\t\tfor (; i < ilen; ++i) {\n\t\t\tpoints[i].draw(area);\n\t\t}\n\t},\n\n\t/**\n\t * @protected\n\t */\n\tsetHoverStyle: function(point) {\n\t\tvar model = point._model;\n\t\tvar options = point._options;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\n\t\tpoint.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth,\n\t\t\tradius: model.radius\n\t\t};\n\n\t\tmodel.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n\t\tmodel.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor));\n\t\tmodel.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth);\n\t\tmodel.radius = valueOrDefault$6(options.hoverRadius, options.radius);\n\t},\n});\n\nvar resolve$3 = helpers$1.options.resolve;\n\ncore_defaults._set('polarArea', {\n\tscale: {\n\t\ttype: 'radialLinear',\n\t\tangleLines: {\n\t\t\tdisplay: false\n\t\t},\n\t\tgridLines: {\n\t\t\tcircular: true\n\t\t},\n\t\tpointLabels: {\n\t\t\tdisplay: false\n\t\t},\n\t\tticks: {\n\t\t\tbeginAtZero: true\n\t\t}\n\t},\n\n\t// Boolean - Whether to animate the rotation of the chart\n\tanimation: {\n\t\tanimateRotate: true,\n\t\tanimateScale: true\n\t},\n\n\tstartAngle: -0.5 * Math.PI,\n\tlegendCallback: function(chart) {\n\t\tvar list = document.createElement('ul');\n\t\tvar data = chart.data;\n\t\tvar datasets = data.datasets;\n\t\tvar labels = data.labels;\n\t\tvar i, ilen, listItem, listItemSpan;\n\n\t\tlist.setAttribute('class', chart.id + '-legend');\n\t\tif (datasets.length) {\n\t\t\tfor (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {\n\t\t\t\tlistItem = list.appendChild(document.createElement('li'));\n\t\t\t\tlistItemSpan = listItem.appendChild(document.createElement('span'));\n\t\t\t\tlistItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];\n\t\t\t\tif (labels[i]) {\n\t\t\t\t\tlistItem.appendChild(document.createTextNode(labels[i]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn list.outerHTML;\n\t},\n\tlegend: {\n\t\tlabels: {\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\tvar style = meta.controller.getStyle(i);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\tfillStyle: style.backgroundColor,\n\t\t\t\t\t\t\tstrokeStyle: style.borderColor,\n\t\t\t\t\t\t\tlineWidth: style.borderWidth,\n\t\t\t\t\t\t\thidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.index;\n\t\t\tvar chart = this.chart;\n\t\t\tvar i, ilen, meta;\n\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t}\n\n\t\t\tchart.update();\n\t\t}\n\t},\n\n\t// Need to override these to give a nice default\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\tlabel: function(item, data) {\n\t\t\t\treturn data.labels[item.index] + ': ' + item.yLabel;\n\t\t\t}\n\t\t}\n\t}\n});\n\nvar controller_polarArea = core_datasetController.extend({\n\n\tdataElementType: elements.Arc,\n\n\tlinkScales: helpers$1.noop,\n\n\t/**\n\t * @private\n\t */\n\t_dataElementOptions: [\n\t\t'backgroundColor',\n\t\t'borderColor',\n\t\t'borderWidth',\n\t\t'borderAlign',\n\t\t'hoverBackgroundColor',\n\t\t'hoverBorderColor',\n\t\t'hoverBorderWidth',\n\t],\n\n\t/**\n\t * @private\n\t */\n\t_getIndexScaleId: function() {\n\t\treturn this.chart.scale.id;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getValueScaleId: function() {\n\t\treturn this.chart.scale.id;\n\t},\n\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar dataset = me.getDataset();\n\t\tvar meta = me.getMeta();\n\t\tvar start = me.chart.options.startAngle || 0;\n\t\tvar starts = me._starts = [];\n\t\tvar angles = me._angles = [];\n\t\tvar arcs = meta.data;\n\t\tvar i, ilen, angle;\n\n\t\tme._updateRadius();\n\n\t\tmeta.count = me.countVisibleElements();\n\n\t\tfor (i = 0, ilen = dataset.data.length; i < ilen; i++) {\n\t\t\tstarts[i] = start;\n\t\t\tangle = me._computeAngle(i);\n\t\t\tangles[i] = angle;\n\t\t\tstart += angle;\n\t\t}\n\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\n\t\t\tarcs[i]._options = me._resolveDataElementOptions(arcs[i], i);\n\t\t\tme.updateElement(arcs[i], i, reset);\n\t\t}\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_updateRadius: function() {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar chartArea = chart.chartArea;\n\t\tvar opts = chart.options;\n\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n\t\tchart.outerRadius = Math.max(minSize / 2, 0);\n\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\n\t},\n\n\tupdateElement: function(arc, index, reset) {\n\t\tvar me = this;\n\t\tvar chart = me.chart;\n\t\tvar dataset = me.getDataset();\n\t\tvar opts = chart.options;\n\t\tvar animationOpts = opts.animation;\n\t\tvar scale = chart.scale;\n\t\tvar labels = chart.data.labels;\n\n\t\tvar centerX = scale.xCenter;\n\t\tvar centerY = scale.yCenter;\n\n\t\t// var negHalfPI = -0.5 * Math.PI;\n\t\tvar datasetStartAngle = opts.startAngle;\n\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\tvar startAngle = me._starts[index];\n\t\tvar endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]);\n\n\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\tvar options = arc._options || {};\n\n\t\thelpers$1.extend(arc, {\n\t\t\t// Utility\n\t\t\t_datasetIndex: me.index,\n\t\t\t_index: index,\n\t\t\t_scale: scale,\n\n\t\t\t// Desired view properties\n\t\t\t_model: {\n\t\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\t\tborderColor: options.borderColor,\n\t\t\t\tborderWidth: options.borderWidth,\n\t\t\t\tborderAlign: options.borderAlign,\n\t\t\t\tx: centerX,\n\t\t\t\ty: centerY,\n\t\t\t\tinnerRadius: 0,\n\t\t\t\touterRadius: reset ? resetRadius : distance,\n\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n\t\t\t\tlabel: helpers$1.valueAtIndexOrDefault(labels, index, labels[index])\n\t\t\t}\n\t\t});\n\n\t\tarc.pivot();\n\t},\n\n\tcountVisibleElements: function() {\n\t\tvar dataset = this.getDataset();\n\t\tvar meta = this.getMeta();\n\t\tvar count = 0;\n\n\t\thelpers$1.each(meta.data, function(element, index) {\n\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t});\n\n\t\treturn count;\n\t},\n\n\t/**\n\t * @protected\n\t */\n\tsetHoverStyle: function(arc) {\n\t\tvar model = arc._model;\n\t\tvar options = arc._options;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\t\tvar valueOrDefault = helpers$1.valueOrDefault;\n\n\t\tarc.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth,\n\t\t};\n\n\t\tmodel.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n\t\tmodel.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor));\n\t\tmodel.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_computeAngle: function(index) {\n\t\tvar me = this;\n\t\tvar count = this.getMeta().count;\n\t\tvar dataset = me.getDataset();\n\t\tvar meta = me.getMeta();\n\n\t\tif (isNaN(dataset.data[index]) || meta.data[index].hidden) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Scriptable options\n\t\tvar context = {\n\t\t\tchart: me.chart,\n\t\t\tdataIndex: index,\n\t\t\tdataset: dataset,\n\t\t\tdatasetIndex: me.index\n\t\t};\n\n\t\treturn resolve$3([\n\t\t\tme.chart.options.elements.arc.angle,\n\t\t\t(2 * Math.PI) / count\n\t\t], context, index);\n\t}\n});\n\ncore_defaults._set('pie', helpers$1.clone(core_defaults.doughnut));\ncore_defaults._set('pie', {\n\tcutoutPercentage: 0\n});\n\n// Pie charts are Doughnut chart with different defaults\nvar controller_pie = controller_doughnut;\n\nvar valueOrDefault$7 = helpers$1.valueOrDefault;\n\ncore_defaults._set('radar', {\n\tspanGaps: false,\n\tscale: {\n\t\ttype: 'radialLinear'\n\t},\n\telements: {\n\t\tline: {\n\t\t\tfill: 'start',\n\t\t\ttension: 0 // no bezier in radar\n\t\t}\n\t}\n});\n\nvar controller_radar = core_datasetController.extend({\n\tdatasetElementType: elements.Line,\n\n\tdataElementType: elements.Point,\n\n\tlinkScales: helpers$1.noop,\n\n\t/**\n\t * @private\n\t */\n\t_datasetElementOptions: [\n\t\t'backgroundColor',\n\t\t'borderWidth',\n\t\t'borderColor',\n\t\t'borderCapStyle',\n\t\t'borderDash',\n\t\t'borderDashOffset',\n\t\t'borderJoinStyle',\n\t\t'fill'\n\t],\n\n\t/**\n\t * @private\n\t */\n\t_dataElementOptions: {\n\t\tbackgroundColor: 'pointBackgroundColor',\n\t\tborderColor: 'pointBorderColor',\n\t\tborderWidth: 'pointBorderWidth',\n\t\thitRadius: 'pointHitRadius',\n\t\thoverBackgroundColor: 'pointHoverBackgroundColor',\n\t\thoverBorderColor: 'pointHoverBorderColor',\n\t\thoverBorderWidth: 'pointHoverBorderWidth',\n\t\thoverRadius: 'pointHoverRadius',\n\t\tpointStyle: 'pointStyle',\n\t\tradius: 'pointRadius',\n\t\trotation: 'pointRotation'\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getIndexScaleId: function() {\n\t\treturn this.chart.scale.id;\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_getValueScaleId: function() {\n\t\treturn this.chart.scale.id;\n\t},\n\n\tupdate: function(reset) {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar line = meta.dataset;\n\t\tvar points = meta.data || [];\n\t\tvar scale = me.chart.scale;\n\t\tvar config = me._config;\n\t\tvar i, ilen;\n\n\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\tif (config.tension !== undefined && config.lineTension === undefined) {\n\t\t\tconfig.lineTension = config.tension;\n\t\t}\n\n\t\t// Utility\n\t\tline._scale = scale;\n\t\tline._datasetIndex = me.index;\n\t\t// Data\n\t\tline._children = points;\n\t\tline._loop = true;\n\t\t// Model\n\t\tline._model = me._resolveDatasetElementOptions(line);\n\n\t\tline.pivot();\n\n\t\t// Update Points\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\tme.updateElement(points[i], i, reset);\n\t\t}\n\n\t\t// Update bezier control points\n\t\tme.updateBezierControlPoints();\n\n\t\t// Now pivot the point for animation\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\tpoints[i].pivot();\n\t\t}\n\t},\n\n\tupdateElement: function(point, index, reset) {\n\t\tvar me = this;\n\t\tvar custom = point.custom || {};\n\t\tvar dataset = me.getDataset();\n\t\tvar scale = me.chart.scale;\n\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\t\tvar options = me._resolveDataElementOptions(point, index);\n\t\tvar lineModel = me.getMeta().dataset._model;\n\t\tvar x = reset ? scale.xCenter : pointPosition.x;\n\t\tvar y = reset ? scale.yCenter : pointPosition.y;\n\n\t\t// Utility\n\t\tpoint._scale = scale;\n\t\tpoint._options = options;\n\t\tpoint._datasetIndex = me.index;\n\t\tpoint._index = index;\n\n\t\t// Desired view properties\n\t\tpoint._model = {\n\t\t\tx: x, // value not used in dataset scale, but we want a consistent API between scales\n\t\t\ty: y,\n\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t// Appearance\n\t\t\tradius: options.radius,\n\t\t\tpointStyle: options.pointStyle,\n\t\t\trotation: options.rotation,\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\tborderColor: options.borderColor,\n\t\t\tborderWidth: options.borderWidth,\n\t\t\ttension: valueOrDefault$7(custom.tension, lineModel ? lineModel.tension : 0),\n\n\t\t\t// Tooltip\n\t\t\thitRadius: options.hitRadius\n\t\t};\n\t},\n\n\t/**\n\t * @private\n\t */\n\t_resolveDatasetElementOptions: function() {\n\t\tvar me = this;\n\t\tvar config = me._config;\n\t\tvar options = me.chart.options;\n\t\tvar values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);\n\n\t\tvalues.spanGaps = valueOrDefault$7(config.spanGaps, options.spanGaps);\n\t\tvalues.tension = valueOrDefault$7(config.lineTension, options.elements.line.tension);\n\n\t\treturn values;\n\t},\n\n\tupdateBezierControlPoints: function() {\n\t\tvar me = this;\n\t\tvar meta = me.getMeta();\n\t\tvar area = me.chart.chartArea;\n\t\tvar points = meta.data || [];\n\t\tvar i, ilen, model, controlPoints;\n\n\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\tif (meta.dataset._model.spanGaps) {\n\t\t\tpoints = points.filter(function(pt) {\n\t\t\t\treturn !pt._model.skip;\n\t\t\t});\n\t\t}\n\n\t\tfunction capControlPoint(pt, min, max) {\n\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t}\n\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\tmodel = points[i]._model;\n\t\t\tcontrolPoints = helpers$1.splineCurve(\n\t\t\t\thelpers$1.previousItem(points, i, true)._model,\n\t\t\t\tmodel,\n\t\t\t\thelpers$1.nextItem(points, i, true)._model,\n\t\t\t\tmodel.tension\n\t\t\t);\n\n\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\t\t\tmodel.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right);\n\t\t\tmodel.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom);\n\t\t\tmodel.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right);\n\t\t\tmodel.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom);\n\t\t}\n\t},\n\n\tsetHoverStyle: function(point) {\n\t\tvar model = point._model;\n\t\tvar options = point._options;\n\t\tvar getHoverColor = helpers$1.getHoverColor;\n\n\t\tpoint.$previousStyle = {\n\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\tborderColor: model.borderColor,\n\t\t\tborderWidth: model.borderWidth,\n\t\t\tradius: model.radius\n\t\t};\n\n\t\tmodel.backgroundColor = valueOrDefault$7(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\n\t\tmodel.borderColor = valueOrDefault$7(options.hoverBorderColor, getHoverColor(options.borderColor));\n\t\tmodel.borderWidth = valueOrDefault$7(options.hoverBorderWidth, options.borderWidth);\n\t\tmodel.radius = valueOrDefault$7(options.hoverRadius, options.radius);\n\t}\n});\n\ncore_defaults._set('scatter', {\n\thover: {\n\t\tmode: 'single'\n\t},\n\n\tscales: {\n\t\txAxes: [{\n\t\t\tid: 'x-axis-1', // need an ID so datasets can reference the scale\n\t\t\ttype: 'linear', // scatter should not use a category axis\n\t\t\tposition: 'bottom'\n\t\t}],\n\t\tyAxes: [{\n\t\t\tid: 'y-axis-1',\n\t\t\ttype: 'linear',\n\t\t\tposition: 'left'\n\t\t}]\n\t},\n\n\ttooltips: {\n\t\tcallbacks: {\n\t\t\ttitle: function() {\n\t\t\t\treturn ''; // doesn't make sense for scatter since data are formatted as a point\n\t\t\t},\n\t\t\tlabel: function(item) {\n\t\t\t\treturn '(' + item.xLabel + ', ' + item.yLabel + ')';\n\t\t\t}\n\t\t}\n\t}\n});\n\ncore_defaults._set('global', {\n\tdatasets: {\n\t\tscatter: {\n\t\t\tshowLine: false\n\t\t}\n\t}\n});\n\n// Scatter charts use line controllers\nvar controller_scatter = controller_line;\n\n// NOTE export a map in which the key represents the controller type, not\n// the class, and so must be CamelCase in order to be correctly retrieved\n// by the controller in core.controller.js (`controllers[meta.type]`).\n\nvar controllers = {\n\tbar: controller_bar,\n\tbubble: controller_bubble,\n\tdoughnut: controller_doughnut,\n\thorizontalBar: controller_horizontalBar,\n\tline: controller_line,\n\tpolarArea: controller_polarArea,\n\tpie: controller_pie,\n\tradar: controller_radar,\n\tscatter: controller_scatter\n};\n\n/**\n * Helper function to get relative position for an event\n * @param {Event|IEvent} event - The event to get the position for\n * @param {Chart} chart - The chart\n * @returns {object} the event position\n */\nfunction getRelativePosition(e, chart) {\n\tif (e.native) {\n\t\treturn {\n\t\t\tx: e.x,\n\t\t\ty: e.y\n\t\t};\n\t}\n\n\treturn helpers$1.getRelativePosition(e, chart);\n}\n\n/**\n * Helper function to traverse all of the visible elements in the chart\n * @param {Chart} chart - the chart\n * @param {function} handler - the callback to execute for each visible item\n */\nfunction parseVisibleItems(chart, handler) {\n\tvar metasets = chart._getSortedVisibleDatasetMetas();\n\tvar metadata, i, j, ilen, jlen, element;\n\n\tfor (i = 0, ilen = metasets.length; i < ilen; ++i) {\n\t\tmetadata = metasets[i].data;\n\t\tfor (j = 0, jlen = metadata.length; j < jlen; ++j) {\n\t\t\telement = metadata[j];\n\t\t\tif (!element._view.skip) {\n\t\t\t\thandler(element);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {ChartElement[]} items - elements to filter\n * @param {object} position - the point to be nearest to\n * @return {ChartElement[]} the nearest items\n */\nfunction getIntersectItems(chart, position) {\n\tvar elements = [];\n\n\tparseVisibleItems(chart, function(element) {\n\t\tif (element.inRange(position.x, position.y)) {\n\t\t\telements.push(element);\n\t\t}\n\t});\n\n\treturn elements;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in teh chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {object} position - the point to be nearest to\n * @param {boolean} intersect - if true, only consider items that intersect the position\n * @param {function} distanceMetric - function to provide the distance between points\n * @return {ChartElement[]} the nearest items\n */\nfunction getNearestItems(chart, position, intersect, distanceMetric) {\n\tvar minDistance = Number.POSITIVE_INFINITY;\n\tvar nearestItems = [];\n\n\tparseVisibleItems(chart, function(element) {\n\t\tif (intersect && !element.inRange(position.x, position.y)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar center = element.getCenterPoint();\n\t\tvar distance = distanceMetric(position, center);\n\t\tif (distance < minDistance) {\n\t\t\tnearestItems = [element];\n\t\t\tminDistance = distance;\n\t\t} else if (distance === minDistance) {\n\t\t\t// Can have multiple items at the same distance in which case we sort by size\n\t\t\tnearestItems.push(element);\n\t\t}\n\t});\n\n\treturn nearestItems;\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy\n */\nfunction getDistanceMetricForAxis(axis) {\n\tvar useX = axis.indexOf('x') !== -1;\n\tvar useY = axis.indexOf('y') !== -1;\n\n\treturn function(pt1, pt2) {\n\t\tvar deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n\t\tvar deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n\t\treturn Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n\t};\n}\n\nfunction indexMode(chart, e, options) {\n\tvar position = getRelativePosition(e, chart);\n\t// Default axis for index mode is 'x' to match old behaviour\n\toptions.axis = options.axis || 'x';\n\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\tvar elements = [];\n\n\tif (!items.length) {\n\t\treturn [];\n\t}\n\n\tchart._getSortedVisibleDatasetMetas().forEach(function(meta) {\n\t\tvar element = meta.data[items[0]._index];\n\n\t\t// don't count items that are skipped (null data)\n\t\tif (element && !element._view.skip) {\n\t\t\telements.push(element);\n\t\t}\n\t});\n\n\treturn elements;\n}\n\n/**\n * @interface IInteractionOptions\n */\n/**\n * If true, only consider items that intersect the point\n * @name IInterfaceOptions#boolean\n * @type Boolean\n */\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nvar core_interaction = {\n\t// Helper function for different modes\n\tmodes: {\n\t\tsingle: function(chart, e) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar elements = [];\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\telements.push(element);\n\t\t\t\t\treturn elements;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn elements.slice(0, 1);\n\t\t},\n\n\t\t/**\n\t\t * @function Chart.Interaction.modes.label\n\t\t * @deprecated since version 2.4.0\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\tlabel: indexMode,\n\n\t\t/**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {IInteractionOptions} options - options to use during interaction\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tindex: indexMode,\n\n\t\t/**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {IInteractionOptions} options - options to use during interaction\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tdataset: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\toptions.axis = options.axis || 'xy';\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\n\t\t\tif (items.length > 0) {\n\t\t\t\titems = chart.getDatasetMeta(items[0]._datasetIndex).data;\n\t\t\t}\n\n\t\t\treturn items;\n\t\t},\n\n\t\t/**\n\t\t * @function Chart.Interaction.modes.x-axis\n\t\t * @deprecated since version 2.4.0. Use index mode and intersect == true\n\t\t * @todo remove at version 3\n\t\t * @private\n\t\t */\n\t\t'x-axis': function(chart, e) {\n\t\t\treturn indexMode(chart, e, {intersect: false});\n\t\t},\n\n\t\t/**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tpoint: function(chart, e) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\treturn getIntersectItems(chart, position);\n\t\t},\n\n\t\t/**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {IInteractionOptions} options - options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tnearest: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\toptions.axis = options.axis || 'xy';\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\treturn getNearestItems(chart, position, options.intersect, distanceMetric);\n\t\t},\n\n\t\t/**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {IInteractionOptions} options - options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\tx: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar items = [];\n\t\t\tvar intersectsItem = false;\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inXRange(position.x)) {\n\t\t\t\t\titems.push(element);\n\t\t\t\t}\n\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\tintersectsItem = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t// that intersect the position, return nothing\n\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\titems = [];\n\t\t\t}\n\t\t\treturn items;\n\t\t},\n\n\t\t/**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {IInteractionOptions} options - options to use\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t */\n\t\ty: function(chart, e, options) {\n\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\tvar items = [];\n\t\t\tvar intersectsItem = false;\n\n\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\tif (element.inYRange(position.y)) {\n\t\t\t\t\titems.push(element);\n\t\t\t\t}\n\n\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\tintersectsItem = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t// that intersect the position, return nothing\n\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\titems = [];\n\t\t\t}\n\t\t\treturn items;\n\t\t}\n\t}\n};\n\nvar extend = helpers$1.extend;\n\nfunction filterByPosition(array, position) {\n\treturn helpers$1.where(array, function(v) {\n\t\treturn v.pos === position;\n\t});\n}\n\nfunction sortByWeight(array, reverse) {\n\treturn array.sort(function(a, b) {\n\t\tvar v0 = reverse ? b : a;\n\t\tvar v1 = reverse ? a : b;\n\t\treturn v0.weight === v1.weight ?\n\t\t\tv0.index - v1.index :\n\t\t\tv0.weight - v1.weight;\n\t});\n}\n\nfunction wrapBoxes(boxes) {\n\tvar layoutBoxes = [];\n\tvar i, ilen, box;\n\n\tfor (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n\t\tbox = boxes[i];\n\t\tlayoutBoxes.push({\n\t\t\tindex: i,\n\t\t\tbox: box,\n\t\t\tpos: box.position,\n\t\t\thorizontal: box.isHorizontal(),\n\t\t\tweight: box.weight\n\t\t});\n\t}\n\treturn layoutBoxes;\n}\n\nfunction setLayoutDims(layouts, params) {\n\tvar i, ilen, layout;\n\tfor (i = 0, ilen = layouts.length; i < ilen; ++i) {\n\t\tlayout = layouts[i];\n\t\t// store width used instead of chartArea.w in fitBoxes\n\t\tlayout.width = layout.horizontal\n\t\t\t? layout.box.fullWidth && params.availableWidth\n\t\t\t: params.vBoxMaxWidth;\n\t\t// store height used instead of chartArea.h in fitBoxes\n\t\tlayout.height = layout.horizontal && params.hBoxMaxHeight;\n\t}\n}\n\nfunction buildLayoutBoxes(boxes) {\n\tvar layoutBoxes = wrapBoxes(boxes);\n\tvar left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n\tvar right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n\tvar top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n\tvar bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n\n\treturn {\n\t\tleftAndTop: left.concat(top),\n\t\trightAndBottom: right.concat(bottom),\n\t\tchartArea: filterByPosition(layoutBoxes, 'chartArea'),\n\t\tvertical: left.concat(right),\n\t\thorizontal: top.concat(bottom)\n\t};\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n\treturn Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateDims(chartArea, params, layout) {\n\tvar box = layout.box;\n\tvar maxPadding = chartArea.maxPadding;\n\tvar newWidth, newHeight;\n\n\tif (layout.size) {\n\t\t// this layout was already counted for, lets first reduce old size\n\t\tchartArea[layout.pos] -= layout.size;\n\t}\n\tlayout.size = layout.horizontal ? box.height : box.width;\n\tchartArea[layout.pos] += layout.size;\n\n\tif (box.getPadding) {\n\t\tvar boxPadding = box.getPadding();\n\t\tmaxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n\t\tmaxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n\t\tmaxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n\t\tmaxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n\t}\n\n\tnewWidth = params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right');\n\tnewHeight = params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom');\n\n\tif (newWidth !== chartArea.w || newHeight !== chartArea.h) {\n\t\tchartArea.w = newWidth;\n\t\tchartArea.h = newHeight;\n\n\t\t// return true if chart area changed in layout's direction\n\t\tvar sizes = layout.horizontal ? [newWidth, chartArea.w] : [newHeight, chartArea.h];\n\t\treturn sizes[0] !== sizes[1] && (!isNaN(sizes[0]) || !isNaN(sizes[1]));\n\t}\n}\n\nfunction handleMaxPadding(chartArea) {\n\tvar maxPadding = chartArea.maxPadding;\n\n\tfunction updatePos(pos) {\n\t\tvar change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n\t\tchartArea[pos] += change;\n\t\treturn change;\n\t}\n\tchartArea.y += updatePos('top');\n\tchartArea.x += updatePos('left');\n\tupdatePos('right');\n\tupdatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n\tvar maxPadding = chartArea.maxPadding;\n\n\tfunction marginForPositions(positions) {\n\t\tvar margin = {left: 0, top: 0, right: 0, bottom: 0};\n\t\tpositions.forEach(function(pos) {\n\t\t\tmargin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n\t\t});\n\t\treturn margin;\n\t}\n\n\treturn horizontal\n\t\t? marginForPositions(['left', 'right'])\n\t\t: marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params) {\n\tvar refitBoxes = [];\n\tvar i, ilen, layout, box, refit, changed;\n\n\tfor (i = 0, ilen = boxes.length; i < ilen; ++i) {\n\t\tlayout = boxes[i];\n\t\tbox = layout.box;\n\n\t\tbox.update(\n\t\t\tlayout.width || chartArea.w,\n\t\t\tlayout.height || chartArea.h,\n\t\t\tgetMargins(layout.horizontal, chartArea)\n\t\t);\n\t\tif (updateDims(chartArea, params, layout)) {\n\t\t\tchanged = true;\n\t\t\tif (refitBoxes.length) {\n\t\t\t\t// Dimensions changed and there were non full width boxes before this\n\t\t\t\t// -> we have to refit those\n\t\t\t\trefit = true;\n\t\t\t}\n\t\t}\n\t\tif (!box.fullWidth) { // fullWidth boxes don't need to be re-fitted in any case\n\t\t\trefitBoxes.push(layout);\n\t\t}\n\t}\n\n\treturn refit ? fitBoxes(refitBoxes, chartArea, params) || changed : changed;\n}\n\nfunction placeBoxes(boxes, chartArea, params) {\n\tvar userPadding = params.padding;\n\tvar x = chartArea.x;\n\tvar y = chartArea.y;\n\tvar i, ilen, layout, box;\n\n\tfor (i = 0, ilen = boxes.length; i < ilen; ++i) {\n\t\tlayout = boxes[i];\n\t\tbox = layout.box;\n\t\tif (layout.horizontal) {\n\t\t\tbox.left = box.fullWidth ? userPadding.left : chartArea.left;\n\t\t\tbox.right = box.fullWidth ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w;\n\t\t\tbox.top = y;\n\t\t\tbox.bottom = y + box.height;\n\t\t\tbox.width = box.right - box.left;\n\t\t\ty = box.bottom;\n\t\t} else {\n\t\t\tbox.left = x;\n\t\t\tbox.right = x + box.width;\n\t\t\tbox.top = chartArea.top;\n\t\t\tbox.bottom = chartArea.top + chartArea.h;\n\t\t\tbox.height = box.bottom - box.top;\n\t\t\tx = box.right;\n\t\t}\n\t}\n\n\tchartArea.x = x;\n\tchartArea.y = y;\n}\n\ncore_defaults._set('global', {\n\tlayout: {\n\t\tpadding: {\n\t\t\ttop: 0,\n\t\t\tright: 0,\n\t\t\tbottom: 0,\n\t\t\tleft: 0\n\t\t}\n\t}\n});\n\n/**\n * @interface ILayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} getPadding - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nvar core_layouts = {\n\tdefaults: {},\n\n\t/**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {ILayoutItem} item - the item to add to be layed out\n\t */\n\taddBox: function(chart, item) {\n\t\tif (!chart.boxes) {\n\t\t\tchart.boxes = [];\n\t\t}\n\n\t\t// initialize item with default values\n\t\titem.fullWidth = item.fullWidth || false;\n\t\titem.position = item.position || 'top';\n\t\titem.weight = item.weight || 0;\n\t\titem._layers = item._layers || function() {\n\t\t\treturn [{\n\t\t\t\tz: 0,\n\t\t\t\tdraw: function() {\n\t\t\t\t\titem.draw.apply(item, arguments);\n\t\t\t\t}\n\t\t\t}];\n\t\t};\n\n\t\tchart.boxes.push(item);\n\t},\n\n\t/**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {ILayoutItem} layoutItem - the item to remove from the layout\n\t */\n\tremoveBox: function(chart, layoutItem) {\n\t\tvar index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n\t\tif (index !== -1) {\n\t\t\tchart.boxes.splice(index, 1);\n\t\t}\n\t},\n\n\t/**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {ILayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n\tconfigure: function(chart, item, options) {\n\t\tvar props = ['fullWidth', 'position', 'weight'];\n\t\tvar ilen = props.length;\n\t\tvar i = 0;\n\t\tvar prop;\n\n\t\tfor (; i < ilen; ++i) {\n\t\t\tprop = props[i];\n\t\t\tif (options.hasOwnProperty(prop)) {\n\t\t\t\titem[prop] = options[prop];\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n\t */\n\tupdate: function(chart, width, height) {\n\t\tif (!chart) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar layoutOptions = chart.options.layout || {};\n\t\tvar padding = helpers$1.options.toPadding(layoutOptions.padding);\n\n\t\tvar availableWidth = width - padding.width;\n\t\tvar availableHeight = height - padding.height;\n\t\tvar boxes = buildLayoutBoxes(chart.boxes);\n\t\tvar verticalBoxes = boxes.vertical;\n\t\tvar horizontalBoxes = boxes.horizontal;\n\n\t\t// Essentially we now have any number of boxes on each of the 4 sides.\n\t\t// Our canvas looks like the following.\n\t\t// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n\t\t// B1 is the bottom axis\n\t\t// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n\t\t// These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n\t\t// an error will be thrown.\n\t\t//\n\t\t// |----------------------------------------------------|\n\t\t// | T1 (Full Width) |\n\t\t// |----------------------------------------------------|\n\t\t// | | | T2 | |\n\t\t// | |----|-------------------------------------|----|\n\t\t// | | | C1 | | C2 | |\n\t\t// | | |----| |----| |\n\t\t// | | | | |\n\t\t// | L1 | L2 | ChartArea (C0) | R1 |\n\t\t// | | | | |\n\t\t// | | |----| |----| |\n\t\t// | | | C3 | | C4 | |\n\t\t// | |----|-------------------------------------|----|\n\t\t// | | | B1 | |\n\t\t// |----------------------------------------------------|\n\t\t// | B2 (Full Width) |\n\t\t// |----------------------------------------------------|\n\t\t//\n\n\t\tvar params = Object.freeze({\n\t\t\touterWidth: width,\n\t\t\touterHeight: height,\n\t\t\tpadding: padding,\n\t\t\tavailableWidth: availableWidth,\n\t\t\tvBoxMaxWidth: availableWidth / 2 / verticalBoxes.length,\n\t\t\thBoxMaxHeight: availableHeight / 2\n\t\t});\n\t\tvar chartArea = extend({\n\t\t\tmaxPadding: extend({}, padding),\n\t\t\tw: availableWidth,\n\t\t\th: availableHeight,\n\t\t\tx: padding.left,\n\t\t\ty: padding.top\n\t\t}, padding);\n\n\t\tsetLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n\t\t// First fit vertical boxes\n\t\tfitBoxes(verticalBoxes, chartArea, params);\n\n\t\t// Then fit horizontal boxes\n\t\tif (fitBoxes(horizontalBoxes, chartArea, params)) {\n\t\t\t// if the area changed, re-fit vertical boxes\n\t\t\tfitBoxes(verticalBoxes, chartArea, params);\n\t\t}\n\n\t\thandleMaxPadding(chartArea);\n\n\t\t// Finally place the boxes to correct coordinates\n\t\tplaceBoxes(boxes.leftAndTop, chartArea, params);\n\n\t\t// Move to opposite side of chart\n\t\tchartArea.x += chartArea.w;\n\t\tchartArea.y += chartArea.h;\n\n\t\tplaceBoxes(boxes.rightAndBottom, chartArea, params);\n\n\t\tchart.chartArea = {\n\t\t\tleft: chartArea.left,\n\t\t\ttop: chartArea.top,\n\t\t\tright: chartArea.left + chartArea.w,\n\t\t\tbottom: chartArea.top + chartArea.h\n\t\t};\n\n\t\t// Finally update boxes in chartArea (radial scale for example)\n\t\thelpers$1.each(boxes.chartArea, function(layout) {\n\t\t\tvar box = layout.box;\n\t\t\textend(box, chart.chartArea);\n\t\t\tbox.update(chartArea.w, chartArea.h);\n\t\t});\n\t}\n};\n\n/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nvar platform_basic = {\n\tacquireContext: function(item) {\n\t\tif (item && item.canvas) {\n\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\titem = item.canvas;\n\t\t}\n\n\t\treturn item && item.getContext('2d') || null;\n\t}\n};\n\nvar platform_dom = \"/*\\r\\n * DOM element rendering detection\\r\\n * https://davidwalsh.name/detect-node-insertion\\r\\n */\\r\\n@keyframes chartjs-render-animation {\\r\\n\\tfrom { opacity: 0.99; }\\r\\n\\tto { opacity: 1; }\\r\\n}\\r\\n\\r\\n.chartjs-render-monitor {\\r\\n\\tanimation: chartjs-render-animation 0.001s;\\r\\n}\\r\\n\\r\\n/*\\r\\n * DOM element resizing detection\\r\\n * https://github.com/marcj/css-element-queries\\r\\n */\\r\\n.chartjs-size-monitor,\\r\\n.chartjs-size-monitor-expand,\\r\\n.chartjs-size-monitor-shrink {\\r\\n\\tposition: absolute;\\r\\n\\tdirection: ltr;\\r\\n\\tleft: 0;\\r\\n\\ttop: 0;\\r\\n\\tright: 0;\\r\\n\\tbottom: 0;\\r\\n\\toverflow: hidden;\\r\\n\\tpointer-events: none;\\r\\n\\tvisibility: hidden;\\r\\n\\tz-index: -1;\\r\\n}\\r\\n\\r\\n.chartjs-size-monitor-expand > div {\\r\\n\\tposition: absolute;\\r\\n\\twidth: 1000000px;\\r\\n\\theight: 1000000px;\\r\\n\\tleft: 0;\\r\\n\\ttop: 0;\\r\\n}\\r\\n\\r\\n.chartjs-size-monitor-shrink > div {\\r\\n\\tposition: absolute;\\r\\n\\twidth: 200%;\\r\\n\\theight: 200%;\\r\\n\\tleft: 0;\\r\\n\\ttop: 0;\\r\\n}\\r\\n\";\n\nvar platform_dom$1 = /*#__PURE__*/Object.freeze({\n__proto__: null,\n'default': platform_dom\n});\n\nvar stylesheet = getCjsExportFromNamespace(platform_dom$1);\n\nvar EXPANDO_KEY = '$chartjs';\nvar CSS_PREFIX = 'chartjs-';\nvar CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor';\nvar CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\nvar CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\nvar ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nvar EVENT_TYPES = {\n\ttouchstart: 'mousedown',\n\ttouchmove: 'mousemove',\n\ttouchend: 'mouseup',\n\tpointerenter: 'mouseenter',\n\tpointerdown: 'mousedown',\n\tpointermove: 'mousemove',\n\tpointerup: 'mouseup',\n\tpointerleave: 'mouseout',\n\tpointerout: 'mouseout'\n};\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns {number} Size in pixels or undefined if unknown.\n */\nfunction readUsedSize(element, property) {\n\tvar value = helpers$1.getStyle(element, property);\n\tvar matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n\treturn matches ? Number(matches[1]) : undefined;\n}\n\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n */\nfunction initCanvas(canvas, config) {\n\tvar style = canvas.style;\n\n\t// NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n\t// returns null or '' if no explicit value has been set to the canvas attribute.\n\tvar renderHeight = canvas.getAttribute('height');\n\tvar renderWidth = canvas.getAttribute('width');\n\n\t// Chart.js modifies some canvas values that we want to restore on destroy\n\tcanvas[EXPANDO_KEY] = {\n\t\tinitial: {\n\t\t\theight: renderHeight,\n\t\t\twidth: renderWidth,\n\t\t\tstyle: {\n\t\t\t\tdisplay: style.display,\n\t\t\t\theight: style.height,\n\t\t\t\twidth: style.width\n\t\t\t}\n\t\t}\n\t};\n\n\t// Force canvas to display as block to avoid extra space caused by inline\n\t// elements, which would interfere with the responsive resize process.\n\t// https://github.com/chartjs/Chart.js/issues/2538\n\tstyle.display = style.display || 'block';\n\n\tif (renderWidth === null || renderWidth === '') {\n\t\tvar displayWidth = readUsedSize(canvas, 'width');\n\t\tif (displayWidth !== undefined) {\n\t\t\tcanvas.width = displayWidth;\n\t\t}\n\t}\n\n\tif (renderHeight === null || renderHeight === '') {\n\t\tif (canvas.style.height === '') {\n\t\t\t// If no explicit render height and style height, let's apply the aspect ratio,\n\t\t\t// which one can be specified by the user but also by charts as default option\n\t\t\t// (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n\t\t\tcanvas.height = canvas.width / (config.options.aspectRatio || 2);\n\t\t} else {\n\t\t\tvar displayHeight = readUsedSize(canvas, 'height');\n\t\t\tif (displayWidth !== undefined) {\n\t\t\t\tcanvas.height = displayHeight;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn canvas;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nvar supportsEventListenerOptions = (function() {\n\tvar supports = false;\n\ttry {\n\t\tvar options = Object.defineProperty({}, 'passive', {\n\t\t\t// eslint-disable-next-line getter-return\n\t\t\tget: function() {\n\t\t\t\tsupports = true;\n\t\t\t}\n\t\t});\n\t\twindow.addEventListener('e', null, options);\n\t} catch (e) {\n\t\t// continue regardless of error\n\t}\n\treturn supports;\n}());\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nvar eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n\tnode.addEventListener(type, listener, eventListenerOptions);\n}\n\nfunction removeListener(node, type, listener) {\n\tnode.removeEventListener(type, listener, eventListenerOptions);\n}\n\nfunction createEvent(type, chart, x, y, nativeEvent) {\n\treturn {\n\t\ttype: type,\n\t\tchart: chart,\n\t\tnative: nativeEvent || null,\n\t\tx: x !== undefined ? x : null,\n\t\ty: y !== undefined ? y : null,\n\t};\n}\n\nfunction fromNativeEvent(event, chart) {\n\tvar type = EVENT_TYPES[event.type] || event.type;\n\tvar pos = helpers$1.getRelativePosition(event, chart);\n\treturn createEvent(type, chart, pos.x, pos.y, event);\n}\n\nfunction throttled(fn, thisArg) {\n\tvar ticking = false;\n\tvar args = [];\n\n\treturn function() {\n\t\targs = Array.prototype.slice.call(arguments);\n\t\tthisArg = thisArg || this;\n\n\t\tif (!ticking) {\n\t\t\tticking = true;\n\t\t\thelpers$1.requestAnimFrame.call(window, function() {\n\t\t\t\tticking = false;\n\t\t\t\tfn.apply(thisArg, args);\n\t\t\t});\n\t\t}\n\t};\n}\n\nfunction createDiv(cls) {\n\tvar el = document.createElement('div');\n\tel.className = cls || '';\n\treturn el;\n}\n\n// Implementation based on https://github.com/marcj/css-element-queries\nfunction createResizer(handler) {\n\tvar maxSize = 1000000;\n\n\t// NOTE(SB) Don't use innerHTML because it could be considered unsafe.\n\t// https://github.com/chartjs/Chart.js/issues/5902\n\tvar resizer = createDiv(CSS_SIZE_MONITOR);\n\tvar expand = createDiv(CSS_SIZE_MONITOR + '-expand');\n\tvar shrink = createDiv(CSS_SIZE_MONITOR + '-shrink');\n\n\texpand.appendChild(createDiv());\n\tshrink.appendChild(createDiv());\n\n\tresizer.appendChild(expand);\n\tresizer.appendChild(shrink);\n\tresizer._reset = function() {\n\t\texpand.scrollLeft = maxSize;\n\t\texpand.scrollTop = maxSize;\n\t\tshrink.scrollLeft = maxSize;\n\t\tshrink.scrollTop = maxSize;\n\t};\n\n\tvar onScroll = function() {\n\t\tresizer._reset();\n\t\thandler();\n\t};\n\n\taddListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n\taddListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n\n\treturn resizer;\n}\n\n// https://davidwalsh.name/detect-node-insertion\nfunction watchForRender(node, handler) {\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\tvar proxy = expando.renderProxy = function(e) {\n\t\tif (e.animationName === CSS_RENDER_ANIMATION) {\n\t\t\thandler();\n\t\t}\n\t};\n\n\thelpers$1.each(ANIMATION_START_EVENTS, function(type) {\n\t\taddListener(node, type, proxy);\n\t});\n\n\t// #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class\n\t// is removed then added back immediately (same animation frame?). Accessing the\n\t// `offsetParent` property will force a reflow and re-evaluate the CSS animation.\n\t// https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics\n\t// https://github.com/chartjs/Chart.js/issues/4737\n\texpando.reflow = !!node.offsetParent;\n\n\tnode.classList.add(CSS_RENDER_MONITOR);\n}\n\nfunction unwatchForRender(node) {\n\tvar expando = node[EXPANDO_KEY] || {};\n\tvar proxy = expando.renderProxy;\n\n\tif (proxy) {\n\t\thelpers$1.each(ANIMATION_START_EVENTS, function(type) {\n\t\t\tremoveListener(node, type, proxy);\n\t\t});\n\n\t\tdelete expando.renderProxy;\n\t}\n\n\tnode.classList.remove(CSS_RENDER_MONITOR);\n}\n\nfunction addResizeListener(node, listener, chart) {\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n\t// Let's keep track of this added resizer and thus avoid DOM query when removing it.\n\tvar resizer = expando.resizer = createResizer(throttled(function() {\n\t\tif (expando.resizer) {\n\t\t\tvar container = chart.options.maintainAspectRatio && node.parentNode;\n\t\t\tvar w = container ? container.clientWidth : 0;\n\t\t\tlistener(createEvent('resize', chart));\n\t\t\tif (container && container.clientWidth < w && chart.canvas) {\n\t\t\t\t// If the container size shrank during chart resize, let's assume\n\t\t\t\t// scrollbar appeared. So we resize again with the scrollbar visible -\n\t\t\t\t// effectively making chart smaller and the scrollbar hidden again.\n\t\t\t\t// Because we are inside `throttled`, and currently `ticking`, scroll\n\t\t\t\t// events are ignored during this whole 2 resize process.\n\t\t\t\t// If we assumed wrong and something else happened, we are resizing\n\t\t\t\t// twice in a frame (potential performance issue)\n\t\t\t\tlistener(createEvent('resize', chart));\n\t\t\t}\n\t\t}\n\t}));\n\n\t// The resizer needs to be attached to the node parent, so we first need to be\n\t// sure that `node` is attached to the DOM before injecting the resizer element.\n\twatchForRender(node, function() {\n\t\tif (expando.resizer) {\n\t\t\tvar container = node.parentNode;\n\t\t\tif (container && container !== resizer.parentNode) {\n\t\t\t\tcontainer.insertBefore(resizer, container.firstChild);\n\t\t\t}\n\n\t\t\t// The container size might have changed, let's reset the resizer state.\n\t\t\tresizer._reset();\n\t\t}\n\t});\n}\n\nfunction removeResizeListener(node) {\n\tvar expando = node[EXPANDO_KEY] || {};\n\tvar resizer = expando.resizer;\n\n\tdelete expando.resizer;\n\tunwatchForRender(node);\n\n\tif (resizer && resizer.parentNode) {\n\t\tresizer.parentNode.removeChild(resizer);\n\t}\n}\n\n/**\n * Injects CSS styles inline if the styles are not already present.\n * @param {HTMLDocument|ShadowRoot} rootNode - the node to contain the