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 a902c086f30..4d3717851a3 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 * @class log_info\n * @package tool_analytics\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":";;;;;;;;;AAwBAA,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 +{"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 * @class log_info\n * @package tool_analytics\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":";;;;;;;;;AAwBAA,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 diff --git a/admin/tool/analytics/amd/build/model.min.js.map b/admin/tool/analytics/amd/build/model.min.js.map index 691d7aaeba6..f50f1c0f05a 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","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 +{"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 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 a1a1844d22b..0baf899dcb7 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 * @class potential-contexts\n * @package tool_analytics\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":";;;;;;;;;AAyBAA,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 +{"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 * @class potential-contexts\n * @package tool_analytics\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":";;;;;;;;;AAyBAA,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 diff --git a/admin/tool/behat/amd/build/steps.min.js.map b/admin/tool/behat/amd/build/steps.min.js.map index 49593c5647b..6fb204a7630 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":["_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 +{"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 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 593b1e0f6c6..2c4ab45e9cb 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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 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 a7d04ee1520..29a8b29fe91 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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 diff --git a/admin/tool/dataprivacy/amd/build/categoriesactions.min.js.map b/admin/tool/dataprivacy/amd/build/categoriesactions.min.js.map index eb0e56dd71d..881f0319c5b 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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 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 98b98fe5fa8..479feb0d39b 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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 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 b8734dba62f..4a0e8700c71 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 * @package tool_dataprivacy\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 +{"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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,wCAAO,CAAC,SAAU,WAAY,YAAa,oBAAqB,iBAAkB,qBAC9E,oBAAqB,gBAAiB,+BAAgC,kCACtE,SAASC,EAAGC,IAAKC,KAAMC,aAAcC,UAAWC,aAAcC,YAAaC,SAAUC,WAAYC,iBAEzFC,qBACY,6BADZA,yBAEgB,0BAGhBC,aAAe,SAASC,gBAAiBC,iBAAkBC,oBACtDF,gBAAkBA,qBAClBG,oBAAsBF,sBACtBG,iBAAmBF,mBACnBG,eAOTN,aAAaO,UAAUN,gBAAkB,EAMzCD,aAAaO,UAAUH,oBAAsB,EAM7CJ,aAAaO,UAAUF,iBAAmB,EAM1CL,aAAaO,UAAUC,WAAa,KAMpCR,aAAaO,UAAUE,YAAc,KAErCT,aAAaO,UAAUD,KAAO,gBAErBE,WAAaX,WAAWa,YAAYC,KAAKV,sBACzCQ,YAAcX,YAAYY,YAAYC,KAAKV,sBAoB3CW,QAAUtB,IAAIuB,YAlBF,CACb,CACIC,IAAK,eACLC,UAAW,UACZ,CACCD,IAAK,8BACLC,UAAW,oBACZ,CACCD,IAAK,iBACLC,UAAW,oBACZ,CACCD,IAAK,qBACLC,UAAW,oBACZ,CACCD,IAAK,kBACLC,UAAW,2BAKdC,yBAGDL,KAAKN,sBACAY,SAAS,eAAgB,CAACN,KAAKN,kBAAmBM,KAAKO,sBAAsBC,KAAKR,YAElFM,SAAS,oBAAqB,CAACN,KAAKP,qBAAsBO,KAAKS,2BAA2BD,KAAKR,QAI5GX,aAAaO,UAAUS,uBAAyB,WAC5C3B,EAAEU,sBAAsBsB,GAAG,QAAS,SAASC,IACzCA,GAAGC,qBAECC,QAAUnC,EAAEiC,GAAGG,eAGnBpC,EAAEU,sBAAsB2B,YAAY,UACpCF,QAAQG,SAAS,cAEbC,aAAeJ,QAAQK,KAAK,gBAC5BC,UAAYN,QAAQK,KAAK,gBACzBD,aAGAG,OAAOC,QAAQC,UAAU,GAAI,KAAM,iBAAmBL,mBAGjDpB,WAAW0B,uBACXzB,YAAYyB,uBAGZ9B,oBAAsBwB,kBACtBX,SAAS,oBAAqB,CAACN,KAAKP,qBAAsBO,KAAKS,2BAA2BD,KAAKR,YACjG,GAAImB,UAGPC,OAAOC,QAAQC,UAAU,GAAI,KAAM,cAAgBH,gBAG9CtB,WAAW0B,uBACXzB,YAAYyB,uBAGZ7B,iBAAmByB,eACnBb,SAAS,eAAgB,CAACN,KAAKN,kBAAmBM,KAAKO,sBAAsBC,KAAKR,WACpF,KAGCwB,gBAAkBX,QAAQK,KAAK,mBAC/BO,cAAgBZ,QAAQK,KAAK,iBAC7BQ,SAAWb,QAAQK,KAAK,YAGxBO,gBAEKC,cAUIC,SAASd,UATVA,QAAQK,KAAK,WAAcM,iBAAoBC,eAI/CZ,QAAQe,KAAK,OAAOb,YAAY,WAChCF,QAAQe,KAAK,OAAOZ,SAAS,kCACxBa,UAAUhB,QAASW,gBAAiBC,qBALpCK,OAAOjB,YAa9BL,KAAKR,QAGXX,aAAaO,UAAU2B,gBAAkB,WACrC7C,EAAEU,sBAAsB2C,IAAI,UAGhC1C,aAAaO,UAAUU,SAAW,SAAS0B,aAAcC,aAAcC,yBAE9DC,YAEUlD,SAASmD,aAAa,mBAAoBJ,aAAchC,KAAKV,gBAAiB2C,cACpFI,KAAK,SAASC,KAAMC,IAEzB7D,EAAEU,0BAA0BkD,KAAKA,MACjCxD,UAAU0D,cAAcD,SAEnB1C,WAAWQ,8BACXP,YAAYO,yBAGjB3B,EAAEU,0BAA0BsB,GAAG,SAAU,OAAQwB,qBAEnD1B,KAAKR,OAAOyC,KAAK5D,aAAa6D,YAGpCrD,aAAaO,UAAUuC,UAAY,WAE/BQ,EAAEC,IAAI,iCAAiC,WACnCC,EAAEC,uBAAuBC,4BAI7BrE,EAAEU,0BAA0B2C,IAAI,SAAU,SAU9C1C,aAAaO,UAAUoD,WAAa,SAASC,GACzCA,EAAErC,iBACFlC,EAAEU,0BAA0BwC,KAAK,QAAQsB,UAG7C7D,aAAaO,UAAUa,2BAA6B,SAASwC,QACpDE,eAAeF,EAAG,2CAG3B5D,aAAaO,UAAUW,sBAAwB,SAAS0C,QAC/CE,eAAeF,EAAG,sCAG3B5D,aAAaO,UAAUuD,eAAiB,SAASF,EAAGG,gBAEhDH,EAAErC,qBAGEyC,SAAW3E,EAAEU,0BAA0BwC,KAAK,QAAQ0B,mBACjDtD,KAAKC,QAAQsD,MAAK,SAAStD,SAC9BrB,KAAK4E,KAAK,CAAC,CACPC,WAAYL,eACZM,KAAM,CAACC,aAAcC,KAAKC,UAAUR,WACpChB,KAAM,WACFxD,aAAaiF,MAAM7D,QAAQ,GAAIA,QAAQ,KAE3CwC,KAAM5D,aAAa6D,gBAGxBqB,MAAMlF,aAAa6D,YAI1BrD,aAAaO,UAAUiC,UAAY,SAASmC,WAAYxC,gBAAiBC,eAErE7C,KAAK4E,KAAK,CAAC,CACPC,WAAY,uCACZC,KAAM,CACFO,UAAWzC,gBACX0C,QAASzC,eAEbY,KAAM,SAASnB,MACiB,GAAxBA,KAAKiD,SAASC,OAIlBtF,UAAUuF,OAAO,yCAA0CnD,MACtDqC,KAAK,SAASjB,MACX0B,WAAWM,MAAMhC,WACZf,uBACAlB,8BACAyB,OAAOkC,YACZA,WAAW9C,KAAK,SAAU,IAE5BV,KAAKR,OACNyC,KAAK5D,aAAa6D,gBAZd6B,WAAWP,WAAYvC,gBAalCjB,KAAKR,MACPyC,KAAM5D,aAAa6D,cAI3BrD,aAAaO,UAAU2E,WAAa,SAASC,KAAM/C,eAC/C+C,KAAKtD,KAAK,kBAAmB,IAC7BsD,KAAKtD,KAAK,gBAAiB,SACtBjB,QAAQsD,MAAK,SAAStD,aAGnBE,IAAM,EACW,UAAjBsB,cACAtB,IAAM,EACkB,UAAjBsB,gBACPtB,IAAM,GAEVqE,KAAKC,KAAKxE,QAAQE,SAEnBsC,KAAK5D,aAAa6D,YAGzBrD,aAAaO,UAAU+B,SAAW,SAAS6C,MACvCA,KAAKtD,KAAK,WAAY,GACtBsD,KAAKE,SAAS,OAAO1D,SAAS,UAC9BwD,KAAK5C,KAAK,OAAOb,YAAY,YAC7ByD,KAAK5C,KAAK,OAAOZ,SAAS,YAG9B3B,aAAaO,UAAUkC,OAAS,SAAS0C,MACrCA,KAAKtD,KAAK,WAAY,GACtBsD,KAAKE,SAAS,OAAO3D,YAAY,UACjCyD,KAAK5C,KAAK,OAAOb,YAAY,WAE7ByD,KAAK5C,KAAK,OAAOb,YAAY,6BAC7ByD,KAAK5C,KAAK,OAAOZ,SAAS,aAE6B,CAUvDrB,KAAM,SAASL,gBAAiBC,iBAAkBC,sBACvC,IAAIH,aAAaC,gBAAiBC,iBAAkBC"} \ 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 3c715005abb..1f52e1cf7cd 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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 diff --git a/admin/tool/dataprivacy/amd/build/defaultsactions.min.js.map b/admin/tool/dataprivacy/amd/build/defaultsactions.min.js.map index b2febda80dc..6963a2492fa 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 * @package tool_dataprivacy\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 +{"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 * @package tool_dataprivacy\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":"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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 a053dd42ebe..30c311a6b2c 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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 diff --git a/admin/tool/dataprivacy/amd/build/events.min.js.map b/admin/tool/dataprivacy/amd/build/events.min.js.map index 562de90803b..916293c9a59 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 * @class events\n * @package tool_dataprivacy\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":";;;;;;;;;AAwBAA,OAAM,0BAAC,IAAI,WACA,MAAA,CACHC,QAAS,wCACTC,YAAa,6CACbC,KAAM,qCACNC,SAAU,0CACVC,SAAU,yCAEjB"} \ 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 * @class events\n * @package tool_dataprivacy\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":";;;;;;;;;AAwBAA,iCAAO,IAAI,iBACA,CACHC,QAAS,wCACTC,YAAa,6CACbC,KAAM,qCACNC,SAAU,0CACVC,SAAU"} \ 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 9fdf53d444f..0799a6afffb 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 * @class page-expand-contract\n * @package tool_dataprivacy\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":";;;;;;;;;AAyBAA,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 +{"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 * @class page-expand-contract\n * @package tool_dataprivacy\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":";;;;;;;;;AAyBAA,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 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 9e1352df5f8..c6e5bc44bb1 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 * @class form-user-selector\n * @package tool_dataprivacy\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":";;;;;;;;;AAyBAA,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 +{"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 * @class form-user-selector\n * @package tool_dataprivacy\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":";;;;;;;;;AAyBAA,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 diff --git a/admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map b/admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map index 04fd5202cfe..a94b8eba3b8 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 * @package tool_dataprivacy\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 'core/pending'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates, Pending) {\n\n /**\n * List of action selectors.\n *\n * @type {{CANCEL_REQUEST: string}}\n * @type {{CONTACT_DPO: string}}\n */\n var ACTIONS = {\n CANCEL_REQUEST: '[data-action=\"cancel\"]',\n CONTACT_DPO: '[data-action=\"contactdpo\"]',\n };\n\n /**\n * MyRequestActions class.\n */\n var MyRequestActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n MyRequestActions.prototype.registerEvents = function() {\n $(ACTIONS.CANCEL_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n var stringkeys = [\n {\n key: 'cancelrequest',\n component: 'tool_dataprivacy'\n },\n {\n key: 'cancelrequestconfirmation',\n component: 'tool_dataprivacy'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langStrings) {\n var title = langStrings[0];\n var confirmMessage = langStrings[1];\n return ModalFactory.create({\n title: title,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n }).then(function(modal) {\n modal.setSaveButtonText(title);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n // Cancel the request.\n var params = {\n 'requestid': requestId\n };\n\n var request = {\n methodname: 'tool_dataprivacy_cancel_data_request',\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 });\n }).done(function(modal) {\n // Show the modal!\n modal.show();\n\n }).fail(Notification.exception);\n });\n\n $(ACTIONS.CONTACT_DPO).click(function(e) {\n var pendingPromise = new Pending('dataprivacy/crud:initModal:contactdpo');\n e.preventDefault();\n\n var replyToEmail = $(this).data('replytoemail');\n\n var keys = [\n {\n key: 'contactdataprotectionofficer',\n component: 'tool_dataprivacy'\n },\n {\n key: 'send',\n component: 'tool_dataprivacy'\n },\n ];\n\n var sendButtonText = '';\n Str.get_strings(keys).then(function(langStrings) {\n var modalTitle = langStrings[0];\n sendButtonText = langStrings[1];\n var context = {\n 'replytoemail': replyToEmail\n };\n return ModalFactory.create({\n title: modalTitle,\n body: Templates.render('tool_dataprivacy/contact_dpo', context),\n type: ModalFactory.types.SAVE_CANCEL,\n large: true\n });\n }).then(function(modal) {\n modal.setSaveButtonText(sendButtonText);\n\n // Show the modal!\n modal.show();\n\n // Handle send event.\n modal.getRoot().on(ModalEvents.save, function(e) {\n var message = $('#message').val().trim();\n if (message.length === 0) {\n e.preventDefault();\n // Show validation error when the message is empty.\n $('[data-region=\"messageinput\"]').addClass('has-danger notifyproblem');\n $('#id_error_message').removeAttr('hidden');\n } else {\n // Send the message.\n sendMessageToDPO(message);\n }\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return;\n }).then(pendingPromise.resolve)\n .catch(Notification.exception);\n });\n };\n\n /**\n * Send message to the Data Protection Officer.\n *\n * @param {String} message The message to send.\n */\n function sendMessageToDPO(message) {\n var request = {\n methodname: 'tool_dataprivacy_contact_dpo',\n args: {\n message: message\n }\n };\n\n var requestType = 'success';\n Ajax.call([request])[0].then(function(data) {\n if (data.result) {\n return Str.get_string('requestsubmitted', 'tool_dataprivacy');\n }\n requestType = 'error';\n return data.warnings.join('
');\n\n }).done(function(message) {\n Notification.addNotification({\n message: message,\n type: requestType\n });\n\n }).fail(Notification.exception);\n }\n\n return /** @alias module:tool_dataprivacy/myrequestactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the unified user filter.\n *\n * @method init\n * @return {MyRequestActions}\n */\n 'init': function() {\n return new MyRequestActions();\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","Templates","Pending","ACTIONS","MyRequestActions","this","registerEvents","prototype","click","e","preventDefault","requestId","data","get_strings","key","component","then","langStrings","title","confirmMessage","create","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","request","methodname","args","call","done","result","window","location","reload","addNotification","message","warnings","fail","exception","hidden","destroy","show","pendingPromise","replyToEmail","sendButtonText","modalTitle","context","render","large","val","trim","length","addClass","removeAttr","sendMessageToDPO","requestType","get_string","join","resolve","catch","init"],"mappings":"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"} \ 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 * @package tool_dataprivacy\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 'core/pending'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates, Pending) {\n\n /**\n * List of action selectors.\n *\n * @type {{CANCEL_REQUEST: string}}\n * @type {{CONTACT_DPO: string}}\n */\n var ACTIONS = {\n CANCEL_REQUEST: '[data-action=\"cancel\"]',\n CONTACT_DPO: '[data-action=\"contactdpo\"]',\n };\n\n /**\n * MyRequestActions class.\n */\n var MyRequestActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n MyRequestActions.prototype.registerEvents = function() {\n $(ACTIONS.CANCEL_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n var stringkeys = [\n {\n key: 'cancelrequest',\n component: 'tool_dataprivacy'\n },\n {\n key: 'cancelrequestconfirmation',\n component: 'tool_dataprivacy'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langStrings) {\n var title = langStrings[0];\n var confirmMessage = langStrings[1];\n return ModalFactory.create({\n title: title,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n }).then(function(modal) {\n modal.setSaveButtonText(title);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n // Cancel the request.\n var params = {\n 'requestid': requestId\n };\n\n var request = {\n methodname: 'tool_dataprivacy_cancel_data_request',\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 });\n }).done(function(modal) {\n // Show the modal!\n modal.show();\n\n }).fail(Notification.exception);\n });\n\n $(ACTIONS.CONTACT_DPO).click(function(e) {\n var pendingPromise = new Pending('dataprivacy/crud:initModal:contactdpo');\n e.preventDefault();\n\n var replyToEmail = $(this).data('replytoemail');\n\n var keys = [\n {\n key: 'contactdataprotectionofficer',\n component: 'tool_dataprivacy'\n },\n {\n key: 'send',\n component: 'tool_dataprivacy'\n },\n ];\n\n var sendButtonText = '';\n Str.get_strings(keys).then(function(langStrings) {\n var modalTitle = langStrings[0];\n sendButtonText = langStrings[1];\n var context = {\n 'replytoemail': replyToEmail\n };\n return ModalFactory.create({\n title: modalTitle,\n body: Templates.render('tool_dataprivacy/contact_dpo', context),\n type: ModalFactory.types.SAVE_CANCEL,\n large: true\n });\n }).then(function(modal) {\n modal.setSaveButtonText(sendButtonText);\n\n // Show the modal!\n modal.show();\n\n // Handle send event.\n modal.getRoot().on(ModalEvents.save, function(e) {\n var message = $('#message').val().trim();\n if (message.length === 0) {\n e.preventDefault();\n // Show validation error when the message is empty.\n $('[data-region=\"messageinput\"]').addClass('has-danger notifyproblem');\n $('#id_error_message').removeAttr('hidden');\n } else {\n // Send the message.\n sendMessageToDPO(message);\n }\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return;\n }).then(pendingPromise.resolve)\n .catch(Notification.exception);\n });\n };\n\n /**\n * Send message to the Data Protection Officer.\n *\n * @param {String} message The message to send.\n */\n function sendMessageToDPO(message) {\n var request = {\n methodname: 'tool_dataprivacy_contact_dpo',\n args: {\n message: message\n }\n };\n\n var requestType = 'success';\n Ajax.call([request])[0].then(function(data) {\n if (data.result) {\n return Str.get_string('requestsubmitted', 'tool_dataprivacy');\n }\n requestType = 'error';\n return data.warnings.join('
');\n\n }).done(function(message) {\n Notification.addNotification({\n message: message,\n type: requestType\n });\n\n }).fail(Notification.exception);\n }\n\n return /** @alias module:tool_dataprivacy/myrequestactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the unified user filter.\n *\n * @method init\n * @return {MyRequestActions}\n */\n 'init': function() {\n return new MyRequestActions();\n }\n };\n});\n"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","Templates","Pending","ACTIONS","MyRequestActions","registerEvents","prototype","click","e","preventDefault","requestId","this","data","get_strings","key","component","then","langStrings","title","confirmMessage","create","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","request","methodname","args","call","done","result","window","location","reload","addNotification","message","warnings","fail","exception","hidden","destroy","show","pendingPromise","replyToEmail","sendButtonText","modalTitle","context","render","large","val","trim","length","addClass","removeAttr","requestType","get_string","join","sendMessageToDPO","resolve","catch"],"mappings":";;;;;;;;AAuBAA,2CAAO,CACH,SACA,YACA,oBACA,WACA,qBACA,oBACA,iBACA,iBACJ,SAASC,EAAGC,KAAMC,aAAcC,IAAKC,aAAcC,YAAaC,UAAWC,aAQnEC,uBACgB,yBADhBA,oBAEa,6BAMbC,iBAAmB,gBACdC,yBAMTD,iBAAiBE,UAAUD,eAAiB,WACxCV,EAAEQ,wBAAwBI,OAAM,SAASC,GACrCA,EAAEC,qBAEEC,UAAYf,EAAEgB,MAAMC,KAAK,aAY7Bd,IAAIe,YAXa,CACb,CACIC,IAAK,gBACLC,UAAW,oBAEf,CACID,IAAK,4BACLC,UAAW,sBAISC,MAAK,SAASC,iBAClCC,MAAQD,YAAY,GACpBE,eAAiBF,YAAY,UAC1BlB,aAAaqB,OAAO,CACvBF,MAAOA,MACPG,KAAMF,eACNG,KAAMvB,aAAawB,MAAMC,cAC1BR,MAAK,SAASS,cACbA,MAAMC,kBAAkBR,OAGxBO,MAAME,UAAUC,GAAG5B,YAAY6B,MAAM,eAM7BC,QAAU,CACVC,WAAY,uCACZC,KANS,WACItB,YAQjBd,KAAKqC,KAAK,CAACH,UAAU,GAAGI,MAAK,SAAStB,MAC9BA,KAAKuB,OACLC,OAAOC,SAASC,SAEhBzC,aAAa0C,gBAAgB,CACzBC,QAAS5B,KAAK6B,SAAS,GAAGD,QAC1BlB,KAAM,aAGfoB,KAAK7C,aAAa8C,cAIzBlB,MAAME,UAAUC,GAAG5B,YAAY4C,QAAQ,WAEnCnB,MAAMoB,aAGHpB,YAEZS,MAAK,SAAST,OAEbA,MAAMqB,UAEPJ,KAAK7C,aAAa8C,cAGzBhD,EAAEQ,qBAAqBI,OAAM,SAASC,OAC9BuC,eAAiB,IAAI7C,QAAQ,yCACjCM,EAAEC,qBAEEuC,aAAerD,EAAEgB,MAAMC,KAAK,gBAa5BqC,eAAiB,GACrBnD,IAAIe,YAZO,CACP,CACIC,IAAK,+BACLC,UAAW,oBAEf,CACID,IAAK,OACLC,UAAW,sBAKGC,MAAK,SAASC,iBAC5BiC,WAAajC,YAAY,GAC7BgC,eAAiBhC,YAAY,OACzBkC,QAAU,cACMH,qBAEbjD,aAAaqB,OAAO,CACvBF,MAAOgC,WACP7B,KAAMpB,UAAUmD,OAAO,+BAAgCD,SACvD7B,KAAMvB,aAAawB,MAAMC,YACzB6B,OAAO,OAEZrC,MAAK,SAASS,OACbA,MAAMC,kBAAkBuB,gBAGxBxB,MAAMqB,OAGNrB,MAAME,UAAUC,GAAG5B,YAAY6B,MAAM,SAASrB,OACtCgC,QAAU7C,EAAE,YAAY2D,MAAMC,OACX,IAAnBf,QAAQgB,QACRhD,EAAEC,iBAEFd,EAAE,gCAAgC8D,SAAS,4BAC3C9D,EAAE,qBAAqB+D,WAAW,oBAwB5BlB,aAClBV,QAAU,CACVC,WAAY,+BACZC,KAAM,CACFQ,QAASA,UAIbmB,YAAc,UAClB/D,KAAKqC,KAAK,CAACH,UAAU,GAAGd,MAAK,SAASJ,aAC9BA,KAAKuB,OACErC,IAAI8D,WAAW,mBAAoB,qBAE9CD,YAAc,QACP/C,KAAK6B,SAASoB,KAAK,YAE3B3B,MAAK,SAASM,SACb3C,aAAa0C,gBAAgB,CACzBC,QAASA,QACTlB,KAAMqC,iBAGXjB,KAAK7C,aAAa8C,WA3CLmB,CAAiBtB,YAKzBf,MAAME,UAAUC,GAAG5B,YAAY4C,QAAQ,WAEnCnB,MAAMoB,gBAIX7B,KAAK+B,eAAegB,SACtBC,MAAMnE,aAAa8C,eAkCkC,MASlD,kBACG,IAAIvC"} \ 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 2b9defda03e..ec4f7272c68 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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 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 4b7d6e67558..778bfee2604 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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_dataprivacy\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":";;;;;;;;AAuBAA,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 diff --git a/admin/tool/dataprivacy/amd/build/requestactions.min.js.map b/admin/tool/dataprivacy/amd/build/requestactions.min.js.map index 876b62531cd..8f28d1a2035 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 * @package tool_dataprivacy\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 +{"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 * @package tool_dataprivacy\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":"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"} \ 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 77539ff4081..1bfad215904 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 * @class delete_license\n * @package tool_licensemanager\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":";;;;;;;;;AAwBAA,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 +{"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 * @class delete_license\n * @package tool_licensemanager\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":";;;;;;;;;AAwBAA,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 diff --git a/admin/tool/lp/amd/build/actionselector.min.js.map b/admin/tool/lp/amd/build/actionselector.min.js.map index 1d2db222dcc..bce59340427 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 * @package tool_lp\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 * @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 /** @type {String} The value that was selected. */\n ActionSelector.prototype._selectedValue = null;\n /** @type {Dialogue} The reference to the dialogue. */\n ActionSelector.prototype._popup = null;\n /** @type {String} The title of popup. */\n ActionSelector.prototype._title = null;\n /** @type {String} The message in popup. */\n ActionSelector.prototype._message = null;\n /** @type {object} The information for radion buttons. */\n ActionSelector.prototype._actions = null;\n /** @type {String} The text for confirm button. */\n ActionSelector.prototype._confirm = null;\n /** @type {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 /** @alias module:tool_lp/actionselector */ 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,WAUzD,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,EAEkDf,cAEtD"} \ 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 * @package tool_lp\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 * @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 /** @type {String} The value that was selected. */\n ActionSelector.prototype._selectedValue = null;\n /** @type {Dialogue} The reference to the dialogue. */\n ActionSelector.prototype._popup = null;\n /** @type {String} The title of popup. */\n ActionSelector.prototype._title = null;\n /** @type {String} The message in popup. */\n ActionSelector.prototype._message = null;\n /** @type {object} The information for radion buttons. */\n ActionSelector.prototype._actions = null;\n /** @type {String} The text for confirm button. */\n ActionSelector.prototype._confirm = null;\n /** @type {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 /** @alias module:tool_lp/actionselector */ 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,eAUrDC,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,IAGyBf"} \ 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 dfaf017af42..fb397fcdd43 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 * @package tool_lp\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 * @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 +{"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 * @package tool_lp\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 * @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 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 e7590261e5e..43680911894 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 * @package tool_lp\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 /** @alias module:tool_lp/competency_outcomes */ {\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});\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,KAOwC,MAAA,CAEpDC,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,GA3B+C,EAqCpDG,UAAW,SAASC,IAIhB,OAHWV,KACIF,SAEJM,MAAK,SAASE,UACrB,YAA4B,IAAjBA,SAASI,IACTlB,EAAEmB,WAAWC,SAASC,UAE1BP,SAASI,IAAIF,IACvB,GACJ,EAGR"} \ 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 * @package tool_lp\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 /** @alias module:tool_lp/competency_outcomes */ {\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});\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,WAOwC,CAEpDC,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 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 4b0b106be8d..0891c128872 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 * @package tool_lp\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 * @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 /** @type {Number} The id of the competency. */\n CompetencyPlanNavigation.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n CompetencyPlanNavigation.prototype._userId = null;\n /** @type {Number} The id of the plan. */\n CompetencyPlanNavigation.prototype._planId = null;\n /** @type {String} Plugin base url. */\n CompetencyPlanNavigation.prototype._baseUrl = null;\n /** @type {Boolean} Ignore the first change event for competencies. */\n CompetencyPlanNavigation.prototype._ignoreFirstCompetency = null;\n\n return /** @alias module:tool_lp/competency_plan_navigation */ CompetencyPlanNavigation;\n\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,GAWxB,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,KAEGX,wBAElE"} \ 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 * @package tool_lp\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 * @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 /** @type {Number} The id of the competency. */\n CompetencyPlanNavigation.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n CompetencyPlanNavigation.prototype._userId = null;\n /** @type {Number} The id of the plan. */\n CompetencyPlanNavigation.prototype._planId = null;\n /** @type {String} Plugin base url. */\n CompetencyPlanNavigation.prototype._baseUrl = null;\n /** @type {Boolean} Ignore the first change event for competencies. */\n CompetencyPlanNavigation.prototype._ignoreFirstCompetency = null;\n\n return /** @alias module:tool_lp/competency_plan_navigation */ CompetencyPlanNavigation;\n\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,OAWpBC,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,KAEGV"} \ 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 ca6e3d95dd4..3d634237ba9 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 * @package tool_lp\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 /** @type {Object} The current competency. */\n Rule.prototype._competency = null;\n /** @type {Node} The node we attach the events to. */\n Rule.prototype._eventNode = null;\n /** @type {Promise} Resolved when the object is ready. */\n Rule.prototype._ready = null;\n /** @type {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-next-line valid-jsdoc\n /**\n * Return the type of the module.\n *\n * @return {String}\n * @method getType\n */\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 * @param {Node} container Node to inject in.\n * @return {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,EASDZ,KAAKO,UAAUM,QAAU,WACrB,MAAM,IAAIC,MAAM,kBACnB,EAUDd,KAAKO,UAAUQ,KAAO,WACX,OAAAb,KAAKc,OACf,EASDhB,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 +{"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 * @package tool_lp\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 /** @type {Object} The current competency. */\n Rule.prototype._competency = null;\n /** @type {Node} The node we attach the events to. */\n Rule.prototype._eventNode = null;\n /** @type {Promise} Resolved when the object is ready. */\n Rule.prototype._ready = null;\n /** @type {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-next-line valid-jsdoc\n /**\n * Return the type of the module.\n *\n * @return {String}\n * @method getType\n */\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 * @param {Node} container Node to inject in.\n * @return {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,MAUXZ,KAAKM,UAAUO,QAAU,iBACf,IAAIC,MAAM,oBAWpBd,KAAKM,UAAUS,KAAO,kBACXN,KAAKO,SAUhBhB,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 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 dafd3916ba3..a6693ec69d8 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 * @package tool_lp\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 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 /** @alias module:tool_lp/competency_rule_all */ Rule;\n\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,UAKrB,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,EAEuDR,IAE3D"} \ 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 * @package tool_lp\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 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 /** @alias module:tool_lp/competency_rule_all */ Rule;\n\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,cAKjBC,KAAO,WACPD,SAASE,MAAMC,KAAMC,mBAEzBH,KAAKI,UAAYC,OAAOC,OAAOP,SAASK,YAQzBG,QAAU,iBACd,wCASXP,KAAKI,UAAUI,QAAU,kBACd,GAG6CR"} \ 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 00952e34551..df17f7f15ea 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 * @package tool_lp\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 /** @type {Node} Reference to the container in which the template was included. */\n Rule.prototype._container = null;\n /** @type {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 /** @alias module:tool_lp/competency_rule_all */ Rule;\n\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,EAEuDxB,IAE3D"} \ 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 * @package tool_lp\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 /** @type {Node} Reference to the container in which the template was included. */\n Rule.prototype._container = null;\n /** @type {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 /** @alias module:tool_lp/competency_rule_all */ Rule;\n\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,UAI4BxB"} \ 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 7645c8fcec6..4da2e90bc7c 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 * @package tool_lp\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 /** @type {Object} Picker instance. */\n var pickerInstance;\n /** @type {Object} Rule config instance. */\n var ruleConfigInstance;\n /** @type {Object} The competency we're picking a relation to. */\n var relatedTarget;\n /** @type {Object} Taxonomy constants indexed per level. */\n var taxonomiesConstants;\n /** @type {Array} The rules modules. Values are object containing type, namd and amd. */\n var rulesModules;\n /** @type {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 +{"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 * @package tool_lp\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 /** @type {Object} Picker instance. */\n var pickerInstance;\n /** @type {Object} Rule config instance. */\n var ruleConfigInstance;\n /** @type {Object} The competency we're picking a relation to. */\n var relatedTarget;\n /** @type {Object} Taxonomy constants indexed per level. */\n var taxonomiesConstants;\n /** @type {Array} The rules modules. Values are object containing type, namd and amd. */\n var rulesModules;\n /** @type {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 diff --git a/admin/tool/lp/amd/build/competencydialogue.min.js.map b/admin/tool/lp/amd/build/competencydialogue.min.js.map index 132bea62310..65f9c4d1b0d 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 * @package tool_lp\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 * @param {Object} options\n *\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":";;;;;;;;AAuBAA,OAAM,6BAAC,CAAC,SACA,oBACA,YACA,iBACA,WACA,qBACD,SAASC,EAAGC,aAAcC,KAAMC,UAAWC,IAAKC,UAOnD,IAAIC,SAQAC,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 +{"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 * @package tool_lp\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 * @param {Object} options\n *\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":";;;;;;;;AAuBAA,oCAAO,CAAC,SACA,oBACA,YACA,iBACA,WACA,qBACD,SAASC,EAAGC,aAAcC,KAAMC,UAAWC,IAAKC,cAO/CC,SAQAC,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 diff --git a/admin/tool/lp/amd/build/competencypicker.min.js.map b/admin/tool/lp/amd/build/competencypicker.min.js.map index 668bb09bca3..d1747159071 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 * @package tool_lp\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 /** @type {Array} The competencies fetched. */\n Picker.prototype._competencies = null;\n /** @type {Array} The competencies that cannot be picked. */\n Picker.prototype._disallowedCompetencyIDs = null;\n /** @type {Node} The node we attach the events to. */\n Picker.prototype._eventNode = null;\n /** @type {Array} The list of frameworks fetched. */\n Picker.prototype._frameworks = null;\n /** @type {Number} The current framework ID. */\n Picker.prototype._frameworkId = null;\n /** @type {Number} The page context ID. */\n Picker.prototype._pageContextId = null;\n /** @type {Number} Relevant contexts inclusion. */\n Picker.prototype._pageContextIncludes = null;\n /** @type {Dialogue} The reference to the dialogue. */\n Picker.prototype._popup = null;\n /** @type {String} The string we filter the competencies with. */\n Picker.prototype._searchText = '';\n /** @type {Object} The competency that was selected. */\n Picker.prototype._selectedCompetencies = null;\n /** @type {Boolean} Whether we can browse frameworks or not. */\n Picker.prototype._singleFramework = false;\n /** @type {Boolean} Do we allow multi select? */\n Picker.prototype._multiSelect = true;\n /** @type {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 /** @alias module:tool_lp/competencypicker */ 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 * @package tool_lp\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 /** @type {Array} The competencies fetched. */\n Picker.prototype._competencies = null;\n /** @type {Array} The competencies that cannot be picked. */\n Picker.prototype._disallowedCompetencyIDs = null;\n /** @type {Node} The node we attach the events to. */\n Picker.prototype._eventNode = null;\n /** @type {Array} The list of frameworks fetched. */\n Picker.prototype._frameworks = null;\n /** @type {Number} The current framework ID. */\n Picker.prototype._frameworkId = null;\n /** @type {Number} The page context ID. */\n Picker.prototype._pageContextId = null;\n /** @type {Number} Relevant contexts inclusion. */\n Picker.prototype._pageContextIncludes = null;\n /** @type {Dialogue} The reference to the dialogue. */\n Picker.prototype._popup = null;\n /** @type {String} The string we filter the competencies with. */\n Picker.prototype._searchText = '';\n /** @type {Object} The competency that was selected. */\n Picker.prototype._selectedCompetencies = null;\n /** @type {Boolean} Whether we can browse frameworks or not. */\n Picker.prototype._singleFramework = false;\n /** @type {Boolean} Do we allow multi select? */\n Picker.prototype._multiSelect = true;\n /** @type {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 /** @alias module:tool_lp/competencypicker */ 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 b4f27a52125..7f005274b50 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 * @package tool_lp\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 * @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 /** @type {Array} The list of plans fetched. */\n Picker.prototype._plans = null;\n /** @type {Number} The current plan ID. */\n Picker.prototype._planId = null;\n /** @type {Boolean} Whether we can browse plans or not. */\n Picker.prototype._singlePlan = false;\n /** @type {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 /** @alias module:tool_lp/competencypicker_user_plans */ Picker;\n\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 +{"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 * @package tool_lp\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 * @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 /** @type {Array} The list of plans fetched. */\n Picker.prototype._plans = null;\n /** @type {Number} The current plan ID. */\n Picker.prototype._planId = null;\n /** @type {Boolean} Whether we can browse plans or not. */\n Picker.prototype._singlePlan = false;\n /** @type {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 /** @alias module:tool_lp/competencypicker_user_plans */ Picker;\n\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 d8d3b8e5b6d..d3c84e058fe 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 * @package tool_lp\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 /** @type {Object} The current competency. */\n RuleConfig.prototype._competency = null;\n /** @type {Node} The node we attach the events to. */\n RuleConfig.prototype._eventNode = null;\n /** @type {Array} Outcomes options. */\n RuleConfig.prototype._outcomesOption = null;\n /** @type {Dialogue} The dialogue. */\n RuleConfig.prototype._popup = null;\n /** @type {Promise} Resolved when the module is ready. */\n RuleConfig.prototype._ready = null;\n /** @type {Array} The rules. */\n RuleConfig.prototype._rules = null;\n /** @type {Array} The rules modules. */\n RuleConfig.prototype._rulesModules = null;\n /** @type {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 * @param {Number} competencyId The competency ID of the competency to work on.\n * @method display\n * @return {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 +{"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 * @package tool_lp\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 /** @type {Object} The current competency. */\n RuleConfig.prototype._competency = null;\n /** @type {Node} The node we attach the events to. */\n RuleConfig.prototype._eventNode = null;\n /** @type {Array} Outcomes options. */\n RuleConfig.prototype._outcomesOption = null;\n /** @type {Dialogue} The dialogue. */\n RuleConfig.prototype._popup = null;\n /** @type {Promise} Resolved when the module is ready. */\n RuleConfig.prototype._ready = null;\n /** @type {Array} The rules. */\n RuleConfig.prototype._rules = null;\n /** @type {Array} The rules modules. */\n RuleConfig.prototype._rulesModules = null;\n /** @type {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 * @param {Number} competencyId The competency ID of the competency to work on.\n * @method display\n * @return {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 diff --git a/admin/tool/lp/amd/build/competencytree.min.js.map b/admin/tool/lp/amd/build/competencytree.min.js.map index cf50a719530..cc00f6de00b 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 * @package tool_lp\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 +{"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 * @package tool_lp\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 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 9c16e2ed5a7..85f75330b3c 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 * @package tool_lp\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 /** @type {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 * @param {Event} e\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":";;;;;;;;AAuBAA,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,EA4HD,OAzHAH,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,EAQD3B,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 +{"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 * @package tool_lp\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 /** @type {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 * @param {Event} e\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":";;;;;;;;AAuBAA,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,YAUxB3B,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 diff --git a/admin/tool/lp/amd/build/dialogue.min.js.map b/admin/tool/lp/amd/build/dialogue.min.js.map index 1beddb1ebf4..d3e2ee5454a 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 * @package tool_lp\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":";;;;;;;;;AAwBAA,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 +{"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 * @package tool_lp\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":";;;;;;;;;AAwBAA,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 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 9ee5909528f..67bee4df382 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 * @package tool_lp\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 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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_lp\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 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":";;;;;;;;AAuBAA,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 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 31df98f94a9..dca3f1c5261 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 * @package tool_lp\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 /** @type {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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_lp\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 /** @type {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":";;;;;;;;AAuBAA,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 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 ba177a59308..6b6f448a3dd 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 * @package tool_lp\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 +{"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 * @package tool_lp\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 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 666241421e9..d15cd2040c9 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 * @class form-cohort-selector\n * @package tool_lp\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":";;;;;;;;;AAyBAA,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 +{"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 * @class form-cohort-selector\n * @package tool_lp\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":";;;;;;;;;AAyBAA,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 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 015598389b1..f192b963100 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 * @class form-user-selector\n * @package tool_lp\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":";;;;;;;;;AAyBAA,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 +{"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 * @class form-user-selector\n * @package tool_lp\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":";;;;;;;;;AAyBAA,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 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 2a543f3f76e..530553e8826 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 * @package tool_lp\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_lp\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":";;;;;;;;AAuBAA,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 diff --git a/admin/tool/lp/amd/build/frameworkactions.min.js.map b/admin/tool/lp/amd/build/frameworkactions.min.js.map index 700f8847bb9..1edfbd58d5b 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 * @package tool_lp\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_lp\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":";;;;;;;;AAuBAA,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 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 5f680db0185..2f2b8445659 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 * @package tool_lpmigrate\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 +{"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 * @package tool_lpmigrate\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 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 b6f90147853..4f48856c409 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 * @package tool_lp\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 * @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 /** @type {Dialogue} The dialogue. */\n Grade.prototype._popup = null;\n /** @type {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 * @param {Number} competencyId The competency ID of the competency to work on.\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 /** @alias module:tool_lp/grade_dialogue */ Grade;\n\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,KAM9D,IAAIC,MAAQ,SAASC,eACjBH,UAAUI,UAAUC,YAAYC,MAAMC,KAAM,IACvCC,KAAAA,eAAiBL,aACzB,EAiHD,OAhHAD,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,EASDT,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,EAEkDzC,KAEtD"} \ 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 * @package tool_lp\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 * @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 /** @type {Dialogue} The dialogue. */\n Grade.prototype._popup = null;\n /** @type {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 * @param {Number} competencyId The competency ID of the competency to work on.\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 /** @alias module:tool_lp/grade_dialogue */ Grade;\n\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,SAM1DC,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,MAUlBT,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,UAGNxC"} \ 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 494db009ec9..af09509a4fc 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 * @package tool_lp\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 * @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 /** @type {Number} The scale id for this competency. */\n InlineEditor.prototype._scaleId = null;\n /** @type {Number} The id of the competency. */\n InlineEditor.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n InlineEditor.prototype._userId = null;\n /** @type {Number} The id of the plan. */\n InlineEditor.prototype._planId = null;\n /** @type {Number} The id of the course. */\n InlineEditor.prototype._courseId = null;\n /** @type {String} The text for Choose rating. */\n InlineEditor.prototype._chooseStr = null;\n /** @type {GradeDialogue} The grading dialogue. */\n InlineEditor.prototype._dialogue = null;\n\n return /** @alias module:tool_lp/grade_user_competency_inline */ InlineEditor;\n\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,aAalE,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,KAE8BzB,YAEpE"} \ 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 * @package tool_lp\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 * @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 /** @type {Number} The scale id for this competency. */\n InlineEditor.prototype._scaleId = null;\n /** @type {Number} The id of the competency. */\n InlineEditor.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n InlineEditor.prototype._userId = null;\n /** @type {Number} The id of the plan. */\n InlineEditor.prototype._planId = null;\n /** @type {Number} The id of the course. */\n InlineEditor.prototype._courseId = null;\n /** @type {String} The text for Choose rating. */\n InlineEditor.prototype._chooseStr = null;\n /** @type {GradeDialogue} The grading dialogue. */\n InlineEditor.prototype._dialogue = null;\n\n return /** @alias module:tool_lp/grade_user_competency_inline */ InlineEditor;\n\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,iBAa9DC,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,KAE8BzB"} \ 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 bcef0ce6d29..d140865993e 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 * @package tool_lp\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 {$} 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 * @package tool_lp\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 {$} 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 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 652b7a1ee78..b22203b485c 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 * @package tool_lp\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 * @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 /** @type {Number} The id of the course. */\n ModuleNavigation.prototype._courseId = null;\n /** @type {Number} The id of the module. */\n ModuleNavigation.prototype._moduleId = null;\n /** @type {String} Plugin base url. */\n ModuleNavigation.prototype._baseUrl = null;\n\n return /** @alias module:tool_lp/module_navigation */ 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,GAUxB,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,KAEgBL,gBACzD"} \ 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 * @package tool_lp\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 * @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 /** @type {Number} The id of the course. */\n ModuleNavigation.prototype._courseId = null;\n /** @type {Number} The id of the module. */\n ModuleNavigation.prototype._moduleId = null;\n /** @type {String} Plugin base url. */\n ModuleNavigation.prototype._baseUrl = null;\n\n return /** @alias module:tool_lp/module_navigation */ 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,OAUpBC,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,KAEgBL"} \ 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 5dbcd6a86f3..c136457254e 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 * @package tool_lp\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_lp\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":";;;;;;;;AAuBAA,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 diff --git a/admin/tool/lp/amd/build/planactions.min.js.map b/admin/tool/lp/amd/build/planactions.min.js.map index 8cd0e490a9d..7a87fe1a04b 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 * @package tool_lp\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 /** @type {String} Ajax method to fetch the page data from. */\n PlanActions.prototype._contextMethod = null;\n /** @type {String} Selector to find the node describing the plan. */\n PlanActions.prototype._planNode = null;\n /** @type {String} Selector mapping to the region to update. Usually similar to wrapper. */\n PlanActions.prototype._region = null;\n /** @type {String} Name of the template used to render the region. */\n PlanActions.prototype._template = null;\n /** @type {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 +{"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 * @package tool_lp\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 /** @type {String} Ajax method to fetch the page data from. */\n PlanActions.prototype._contextMethod = null;\n /** @type {String} Selector to find the node describing the plan. */\n PlanActions.prototype._planNode = null;\n /** @type {String} Selector mapping to the region to update. Usually similar to wrapper. */\n PlanActions.prototype._region = null;\n /** @type {String} Name of the template used to render the region. */\n PlanActions.prototype._template = null;\n /** @type {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":"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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 e6c50f45cc5..c5cb05c72cb 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 * @package tool_lp\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 * @package tool_lp\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 4569ea06bc2..75613b8bcf1 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 * @package tool_lp\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 /** @alias module:tool_lp/scalevalues */ {\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,GAE+B,MAAA,CAU5CC,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 +{"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 * @package tool_lp\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 /** @alias module:tool_lp/scalevalues */ {\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,SAE+B,CAU5CC,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 diff --git a/admin/tool/lp/amd/build/templateactions.min.js.map b/admin/tool/lp/amd/build/templateactions.min.js.map index 6d75ce3159a..a4f2dee9af4 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 * @package tool_lp\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_lp\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":";;;;;;;;AAuBAA,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 diff --git a/admin/tool/lp/amd/build/tree.min.js.map b/admin/tool/lp/amd/build/tree.min.js.map index 0845ad16142..d246b5d2bda 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 * @package core\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 * @param {Object} item 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.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 * @param {Event} e The event.\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 +{"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 * @package core\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 * @param {Object} item 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.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 * @param {Event} e The event.\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 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 4e1da4584fa..b133b39044f 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 * @package tool_lp\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 * @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 /** @type {Number} The id of the competency. */\n UserCompetencyCourseNavigation.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n UserCompetencyCourseNavigation.prototype._userId = null;\n /** @type {Number} The id of the course. */\n UserCompetencyCourseNavigation.prototype._courseId = null;\n /** @type {String} Plugin base url. */\n UserCompetencyCourseNavigation.prototype._baseUrl = null;\n /** @type {Boolean} Ignore the first change event for competencies. */\n UserCompetencyCourseNavigation.prototype._ignoreFirstCompetency = null;\n\n return /** @alias module:tool_lp/user_competency_course_navigation */ UserCompetencyCourseNavigation;\n\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,GAYxB,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,KAEIzB,8BAEzE"} \ 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 * @package tool_lp\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 * @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 /** @type {Number} The id of the competency. */\n UserCompetencyCourseNavigation.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n UserCompetencyCourseNavigation.prototype._userId = null;\n /** @type {Number} The id of the course. */\n UserCompetencyCourseNavigation.prototype._courseId = null;\n /** @type {String} Plugin base url. */\n UserCompetencyCourseNavigation.prototype._baseUrl = null;\n /** @type {Boolean} Ignore the first change event for competencies. */\n UserCompetencyCourseNavigation.prototype._ignoreFirstCompetency = null;\n\n return /** @alias module:tool_lp/user_competency_course_navigation */ UserCompetencyCourseNavigation;\n\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,OAYpBC,+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,KAEIxB"} \ 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 6b9ba81faf6..ff965fc8ac8 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 * @package tool_lp\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 /** @type {JQuery} The root element to replace in the DOM. */\n Info.prototype._rootElement = null;\n /** @type {Number} The id of the course. */\n Info.prototype._courseId = null;\n /** @type {Boolean} Is this module valid? */\n Info.prototype._valid = null;\n /** @type {Number} The id of the plan. */\n Info.prototype._planId = null;\n /** @type {Number} The id of the competency. */\n Info.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n Info.prototype._userId = null;\n /** @type {String} The method name to load the data. */\n Info.prototype._methodName = null;\n /** @type {Object} The arguments to load the data. */\n Info.prototype._args = null;\n /** @type {String} The template to reload the fragment. */\n Info.prototype._templateName = null;\n /** @type {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 +{"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 * @package tool_lp\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 /** @type {JQuery} The root element to replace in the DOM. */\n Info.prototype._rootElement = null;\n /** @type {Number} The id of the course. */\n Info.prototype._courseId = null;\n /** @type {Boolean} Is this module valid? */\n Info.prototype._valid = null;\n /** @type {Number} The id of the plan. */\n Info.prototype._planId = null;\n /** @type {Number} The id of the competency. */\n Info.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n Info.prototype._userId = null;\n /** @type {String} The method name to load the data. */\n Info.prototype._methodName = null;\n /** @type {Object} The arguments to load the data. */\n Info.prototype._args = null;\n /** @type {String} The template to reload the fragment. */\n Info.prototype._templateName = null;\n /** @type {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 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 b16dd20328e..5887d918e90 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 * @package report_competency\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 /** @type {String} The selector for the region with the user competencies */\n UserCompetencyPopup.prototype._regionSelector = null;\n /** @type {String} The selector for the region with a single user competencies */\n UserCompetencyPopup.prototype._userCompetencySelector = null;\n /** @type {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 +{"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 * @package report_competency\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 /** @type {String} The selector for the region with the user competencies */\n UserCompetencyPopup.prototype._regionSelector = null;\n /** @type {String} The selector for the region with a single user competencies */\n UserCompetencyPopup.prototype._userCompetencySelector = null;\n /** @type {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 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 f9cbdb0d3d8..b95a4c18252 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 * @package tool_lp\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 * @param {String} selector The node containing the buttons to switch mode.\n */\n var UserCompetencyWorkflow = function() {\n EventBase.prototype.constructor.apply(this, []);\n };\n UserCompetencyWorkflow.prototype = Object.create(EventBase.prototype);\n\n /** @type {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 * @package tool_lp\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 * @param {String} selector The node containing the buttons to switch mode.\n */\n var UserCompetencyWorkflow = function() {\n EventBase.prototype.constructor.apply(this, []);\n };\n UserCompetencyWorkflow.prototype = Object.create(EventBase.prototype);\n\n /** @type {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 993f15eda8b..7e8fe516f16 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 * @package tool_lp\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 /** @type {String} Ajax method to fetch the page data from. */\n UserEvidenceActions.prototype._contextMethod = null;\n /** @type {String} Selector to find the node describing the evidence. */\n UserEvidenceActions.prototype._evidenceNode = null;\n /** @type {String} Selector mapping to the region to update. Usually similar to wrapper. */\n UserEvidenceActions.prototype._region = null;\n /** @type {String} Name of the template used to render the region. */\n UserEvidenceActions.prototype._template = null;\n /** @type {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 * @param {Boolean} requestReview Send competencies to review.\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 +{"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 * @package tool_lp\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 /** @type {String} Ajax method to fetch the page data from. */\n UserEvidenceActions.prototype._contextMethod = null;\n /** @type {String} Selector to find the node describing the evidence. */\n UserEvidenceActions.prototype._evidenceNode = null;\n /** @type {String} Selector mapping to the region to update. Usually similar to wrapper. */\n UserEvidenceActions.prototype._region = null;\n /** @type {String} Name of the template used to render the region. */\n UserEvidenceActions.prototype._template = null;\n /** @type {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 * @param {Boolean} requestReview Send competencies to review.\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 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 24c72d3d3e4..505e5f20cb1 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 * @package tool_moodlenet\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-error');\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-error');\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":";;;;;;;;;;;;;;;AA+BAA,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,cAChCH,eAAeE,UAAUK,IAAI,gBAE7BG,YAAW,WACPC,OAAOC,SAAWN,OAAOO,MADnB,GAEP,OAEHlB,MAAMO,UAAUK,IAAI,cACpBP,eAAeQ,UAAYF,OAAOG,QAClCT,eAAeE,UAAUK,IAAI,cAGxC,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 +{"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 * @package tool_moodlenet\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-error');\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-error');\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":";;;;;;;;;;;;;;;AA+BAA,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,cAChCH,eAAeE,UAAUK,IAAI,gBAE7BG,YAAW,WACPC,OAAOC,SAAWN,OAAOO,SAC1B,OAEHlB,MAAMO,UAAUK,IAAI,cACpBP,eAAeQ,UAAYF,OAAOG,QAClCT,eAAeE,UAAUK,IAAI,kBAGtCpB,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 diff --git a/admin/tool/moodlenet/amd/build/select_page.min.js b/admin/tool/moodlenet/amd/build/select_page.min.js index 02d59486f8d..9d266e83a64 100644 --- a/admin/tool/moodlenet/amd/build/select_page.min.js +++ b/admin/tool/moodlenet/amd/build/select_page.min.js @@ -6,6 +6,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,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)}}})); +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)}}})); //# 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 43fc01c4b91..e688d43464a 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 * @package tool_moodlenet\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":";;;;;;;;AAwBAA,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 +{"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 * @package tool_moodlenet\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":";;;;;;;;AAwBAA,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 diff --git a/admin/tool/moodlenet/amd/build/selectors.min.js.map b/admin/tool/moodlenet/amd/build/selectors.min.js.map index 3168028b5e5..587e94a3dca 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 * @package tool_moodlenet\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_moodlenet\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":";;;;;;;;AAuBAA,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 diff --git a/admin/tool/moodlenet/amd/build/validator.min.js.map b/admin/tool/moodlenet/amd/build/validator.min.js.map index b4a738326fd..6ffa7b46633 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 * @package tool_moodlenet\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_moodlenet\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":";;;;;;;;AAuBAA,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 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 fe692c2f6d0..8ba36959b01 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 * @package tool_policy\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_policy\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":";;;;;;;;AAuBAA,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 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 77964da235a..bab29dd6d41 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 * @package tool_policy\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":";;;;;;;;;AAyBAA,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 +{"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 * @package tool_policy\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":";;;;;;;;;AAyBAA,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 diff --git a/admin/tool/policy/amd/build/acceptmodal.min.js.map b/admin/tool/policy/amd/build/acceptmodal.min.js.map index 1cc62569980..73ca28b265b 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 * @class AcceptOnBehalf\n * @package tool_policy\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 +{"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 * @class AcceptOnBehalf\n * @package tool_policy\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 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 392eda0da97..e9557426c2c 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","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 +{"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 diff --git a/admin/tool/policy/amd/build/managedocsactions.min.js.map b/admin/tool/policy/amd/build/managedocsactions.min.js.map index b912f272f55..dd5991eae84 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 * @package tool_policy\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_policy\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":";;;;;;;;AAuBAA,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 diff --git a/admin/tool/policy/amd/build/policyactions.min.js.map b/admin/tool/policy/amd/build/policyactions.min.js.map index 8b27aa7ca54..c0caa2cff97 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 * @package tool_policy\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 var PolicyActions = function(root) {\n this.registerEvents(root);\n };\n\n /**\n * Register event listeners.\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 * @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":";;;;;;;;AAuBAA,OAAM,4BAAC,CACH,SACA,YACA,oBACA,qBACA,sBACJ,SAASC,EAAGC,KAAMC,aAAcC,aAAcC,aAK1C,IAAIC,cAAgB,SAASC,MACpBC,KAAAA,eAAeD,KACvB,EA2EqD,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,CAS1CC,KAAA,SAAS1C,MAEb,OADAA,KAAON,EAAEM,MACF,IAAID,cAAcC,KAC5B,EAER"} \ 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 * @package tool_policy\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 var PolicyActions = function(root) {\n this.registerEvents(root);\n };\n\n /**\n * Register event listeners.\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 * @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":";;;;;;;;AAuBAA,mCAAO,CACH,SACA,YACA,oBACA,qBACA,sBACJ,SAASC,EAAGC,KAAMC,aAAcC,aAAcC,iBAKtCC,cAAgB,SAASC,WACpBC,eAAeD,cAMxBD,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,MAS1C,SAASvC,aACbA,KAAON,EAAEM,MACF,IAAID,cAAcC"} \ 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 67a821e1140..6aca0bd8730 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 * @package tool_templatelibrary\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":";;;;;;;;AAuBAA,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 +{"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 * @package tool_templatelibrary\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":";;;;;;;;AAuBAA,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 diff --git a/admin/tool/templatelibrary/amd/build/search.min.js.map b/admin/tool/templatelibrary/amd/build/search.min.js.map index 50fe1a62917..7769a566927 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 * @package tool_templatelibrary\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-field=\"search\"]').val();\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-field=\"search\"]', changeHandler);\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","call","methodname","args","component","search","throttle","changeHandler","callback","delay","bind","this","theme","window","clearTimeout","setTimeout","on"],"mappings":";;;;;;;;AAuBAA,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,yBAAyBkB,MAG3CjB,KAAKmB,KAAK,CACN,CAACC,WAAY,sCACXC,KAAM,CAACC,UAAWN,aAAcO,OAAQL,UAAWH,UAAWA,WAC9DP,KAAMH,mBACNO,KAAMV,aAAaW,aACtB,GAAM,EACZ,EAEGW,SAAW,KAqBXC,cAAgB,WAXD,IAASC,SAAUC,MAAVD,SAYXZ,cAAcc,KAAKC,KAAMzB,OAAO0B,OAZXH,MAYmB,IAXpC,OAAbH,UACAO,OAAOC,aAAaR,UAGxBA,SAAWO,OAAOE,YAAW,WACzBP,WACAF,SAAW,IAFJ,GAGRG,MAKN,EAMD,OAJA5B,EAAE,kCAAkCmC,GAAG,SAAU,2BAA4BT,eAC7E1B,EAAE,kCAAkCmC,GAAG,QAAS,wBAAyBT,eAEzEX,cAAcV,OAAO0B,OACd,EACV"} \ 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 * @package tool_templatelibrary\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-field=\"search\"]').val();\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-field=\"search\"]', changeHandler);\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","call","methodname","args","component","search","throttle","changeHandler","callback","delay","bind","this","theme","window","clearTimeout","setTimeout","on"],"mappings":";;;;;;;;AAuBAA,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,yBAAyBkB,MAG3CjB,KAAKmB,KAAK,CACN,CAACC,WAAY,sCACXC,KAAM,CAACC,UAAWN,aAAcO,OAAQL,UAAWH,UAAWA,WAC9DP,KAAMH,mBACNO,KAAMV,aAAaW,aACtB,GAAM,IAGTW,SAAW,KAqBXC,cAAgB,WAXD,IAASC,SAAUC,MAAVD,SAYXZ,cAAcc,KAAKC,KAAMzB,OAAO0B,OAZXH,MAYmB,IAXpC,OAAbH,UACAO,OAAOC,aAAaR,UAGxBA,SAAWO,OAAOE,YAAW,WACzBP,WACAF,SAAW,OACZG,eAOP5B,EAAE,kCAAkCmC,GAAG,SAAU,2BAA4BT,eAC7E1B,EAAE,kCAAkCmC,GAAG,QAAS,wBAAyBT,eAEzEX,cAAcV,OAAO0B,OACd"} \ 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 549c1aae6e0..c1cd3aded76 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 * @class managesteps\n * @package tool_usertours\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":"AAQAA,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 +{"version":3,"file":"managesteps.min.js","sources":["../src/managesteps.js"],"sourcesContent":["/**\n * Step management code.\n *\n * @module tool_usertours/managesteps\n * @class managesteps\n * @package tool_usertours\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":"AAQAA,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 diff --git a/admin/tool/usertours/amd/build/managetours.min.js.map b/admin/tool/usertours/amd/build/managetours.min.js.map index e544a55cf94..dd64e14f230 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 * @class managetours\n * @package tool_usertours\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":"AAQAA,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 +{"version":3,"file":"managetours.min.js","sources":["../src/managetours.js"],"sourcesContent":["/**\n * Tour management code.\n *\n * @module tool_usertours/managetours\n * @class managetours\n * @package tool_usertours\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":"AAQAA,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 diff --git a/admin/tool/usertours/amd/build/tour.min.js.map b/admin/tool/usertours/amd/build/tour.min.js.map index 8b6d111f4a2..70d5b9ee698 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 * @copyright 2018 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport Popper from 'core/popper';\n\n/**\n * A Tour.\n *\n * @class Tour\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 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 * 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 child.attr(attrName, true);\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 attrName = 'aria-hidden';\n let showFunction = function(child) {\n let hidden = child.attr(stateHolder);\n if (typeof hidden !== 'undefined') {\n child.removeAttr(stateHolder);\n child.removeAttr(attrName);\n }\n };\n\n $('[' + stateHolder + ']').each(function(index, node) {\n showFunction($(node));\n });\n }\n}\n"],"names":["_jquery","_interopRequireDefault","_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","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","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"],"mappings":"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"} \ 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 * @copyright 2018 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport Popper from 'core/popper';\n\n/**\n * A Tour.\n *\n * @class Tour\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 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 * 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 child.attr(attrName, true);\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 attrName = 'aria-hidden';\n let showFunction = function(child) {\n let hidden = child.attr(stateHolder);\n if (typeof hidden !== 'undefined') {\n child.removeAttr(stateHolder);\n child.removeAttr(attrName);\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","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","backdrop","insertAfter","colorNode","outerWidth","outerHeight","backgroundColor","calculateInherittedBackgroundColor","targetRadius","targetPosition","calculatePosition","fader","opacity","elem","position","value","isNaN","parent","fakeNode","fakeElemColor","color","hideFunction","child","flexitourRole","siblings","parentsUntil"],"mappings":"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"} \ No newline at end of file diff --git a/admin/tool/usertours/amd/build/usertours.min.js.map b/admin/tool/usertours/amd/build/usertours.min.js.map index 0b71e1f9759..3c6d4a34ba8 100644 --- a/admin/tool/usertours/amd/build/usertours.min.js.map +++ b/admin/tool/usertours/amd/build/usertours.min.js.map @@ -1 +1 @@ -{"version":3,"file":"usertours.min.js","sources":["../src/usertours.js"],"sourcesContent":["/**\n * User tour control library.\n *\n * @module tool_usertours/usertours\n * @class usertours\n * @package tool_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 context: null,\n\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 * @param {Number} context The context of the current page.\n */\n init: function(tourId, startTour, context) {\n // Only one tour per page is allowed.\n usertours.tourId = tourId;\n\n usertours.context = context;\n\n if (typeof startTour === 'undefined') {\n startTour = true;\n }\n\n if (startTour) {\n // Fetch the tour configuration.\n usertours.fetchTour(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 * 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: usertours.context,\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: usertours.context,\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: usertours.context,\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: usertours.context,\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","context","init","startTour","fetchTour","addResetLink","on","e","preventDefault","resetTourState","M","util","js_pending","when","call","methodname","args","tourid","pageurl","window","location","href","render","then","response","template","hasOwnProperty","startBootstrapTour","tourconfig","always","js_complete","fail","exception","ele","length","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 * @class usertours\n * @package tool_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 context: null,\n\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 * @param {Number} context The context of the current page.\n */\n init: function(tourId, startTour, context) {\n // Only one tour per page is allowed.\n usertours.tourId = tourId;\n\n usertours.context = context;\n\n if (typeof startTour === 'undefined') {\n startTour = true;\n }\n\n if (startTour) {\n // Fetch the tour configuration.\n usertours.fetchTour(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 * 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: usertours.context,\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: usertours.context,\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: usertours.context,\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: usertours.context,\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","context","init","startTour","fetchTour","addResetLink","on","e","preventDefault","resetTourState","M","util","js_pending","when","call","methodname","args","tourid","pageurl","window","location","href","render","then","response","template","hasOwnProperty","startBootstrapTour","tourconfig","always","js_complete","fail","exception","ele","length","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 4849b979648..9fb16fee00f 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","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 +{"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 diff --git a/backup/util/ui/amd/build/async_backup.min.js b/backup/util/ui/amd/build/async_backup.min.js index 5a0ae3ee3fa..b102f20df51 100644 --- a/backup/util/ui/amd/build/async_backup.min.js +++ b/backup/util/ui/amd/build/async_backup.min.js @@ -8,6 +8,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,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})); +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})); //# 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 7c881b61e9f..2832de4dbee 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 backup/util/async_backup\n * @package core\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 +{"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 backup/util/async_backup\n * @package core\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 diff --git a/badges/amd/build/backpackactions.min.js.map b/badges/amd/build/backpackactions.min.js.map index fccbc8f0ecb..30638761d38 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 * @package core_badges\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":"48BAwBAA,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 +{"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 * @package core_badges\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":"4uCAqCoB,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 diff --git a/badges/amd/build/selectors.min.js.map b/badges/amd/build/selectors.min.js.map index 5d269f641e6..1dadc93a8aa 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 * @package core_badges\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":";;;;;;;;;AAgCMA,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 +{"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 * @package core_badges\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":";;;;;;;;;IAgCyBA,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 diff --git a/blocks/myoverview/amd/build/main.min.js.map b/blocks/myoverview/amd/build/main.min.js.map index 1cc023ca1ff..a87182d9e40 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 * @package block_myoverview\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":";;;;;;;AAuBAA,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 +{"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 * @package block_myoverview\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":";;;;;;;AAuBAA,+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 diff --git a/blocks/myoverview/amd/build/repository.min.js.map b/blocks/myoverview/amd/build/repository.min.js.map index bbcae3e5162..079f9d8bd10 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 * @package block_myoverview\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 +{"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 * @package block_myoverview\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 diff --git a/blocks/myoverview/amd/build/selectors.min.js.map b/blocks/myoverview/amd/build/selectors.min.js.map index 95ca853287d..c2b0de58c22 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 * @package block_myoverview\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":";;;;;;;AAuBAA,OAAM,6BAAC,IAAI,WACA,MAAA,CACHC,WAAY,CACRC,OAAQ,+BACRC,cAAe,uCAG1B"} \ 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 * @package block_myoverview\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":";;;;;;;AAuBAA,oCAAO,IAAI,iBACA,CACHC,WAAY,CACRC,OAAQ,+BACRC,cAAe"} \ 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 8478901c17c..c9a5e4f957b 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 * @package block_myoverview\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],\nfunction(\n $,\n Repository,\n PagedContentFactory,\n PubSub,\n CustomEvents,\n Notification,\n Templates,\n CourseEvents,\n Selectors,\n PagedContentEvents\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 var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);\n isFavouriteIcon.addClass('hidden');\n isFavouriteIcon.attr('aria-hidden', true);\n var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);\n notFavourteIcon.removeClass('hidden');\n notFavourteIcon.attr('aria-hidden', false);\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 var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);\n isFavouriteIcon.removeClass('hidden');\n isFavouriteIcon.attr('aria-hidden', false);\n var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);\n notFavourteIcon.addClass('hidden');\n notFavourteIcon.attr('aria-hidden', true);\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 * @param {object} content The content 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\n * Reset the courses views to their original\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","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","notFavourteIcon","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 +{"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 * @package block_myoverview\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],\nfunction(\n $,\n Repository,\n PagedContentFactory,\n PubSub,\n CustomEvents,\n Notification,\n Templates,\n CourseEvents,\n Selectors,\n PagedContentEvents\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 var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);\n isFavouriteIcon.addClass('hidden');\n isFavouriteIcon.attr('aria-hidden', true);\n var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);\n notFavourteIcon.removeClass('hidden');\n notFavourteIcon.attr('aria-hidden', false);\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 var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);\n isFavouriteIcon.removeClass('hidden');\n isFavouriteIcon.attr('aria-hidden', false);\n var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);\n notFavourteIcon.addClass('hidden');\n notFavourteIcon.attr('aria-hidden', true);\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 * @param {object} content The content 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\n * Reset the courses views to their original\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","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","notFavourteIcon","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":";;;;;;;AAuBAA,+BACA,CACI,SACA,8BACA,6BACA,cACA,iCACA,oBACA,iBACA,qBACA,6BACA,8BAEJ,SACIC,EACAC,WACAC,oBACAC,OACAC,aACAC,aACAC,UACAC,aACAC,UACAC,wBAGIC,6BAEoB,8BAFpBA,6BAGoB,8BAHpBA,+BAIsB,gCAJtBA,kCAKyB,mCALzBA,yBAMgB,iCANhBA,4BAOmB,+BAPnBA,6BAQoB,gCAKpBC,wBACe,8BADfA,uBAEc,6BAFdA,0BAGiB,gCAHjBA,oBAIW,yBAGXC,sCAC6B,qBAS7BC,mBAAqB,CAAC,GAAI,GAAI,GAAI,GAAI,GAEtCC,YAAc,GAEdC,aAAe,EAEfC,SAAW,EAEXC,UAAY,EAEZC,UAAY,KAQZC,gBAAkB,SAASC,UACvBC,aAAeD,KAAKE,KAAKd,UAAUe,WAAWC,cAC3C,CACHC,QAASJ,aAAaK,KAAK,gBAC3BC,SAAUN,aAAaK,KAAK,iBAC5BE,KAAMP,aAAaK,KAAK,aACxBG,kBAAmBR,aAAaK,KAAK,0BACrCI,gBAAiBT,aAAaK,KAAK,wBACnCK,iBAAkBV,aAAaK,KAAK,2BAMxCM,6BAA+B,CAC/BC,2BAA2B,EAC3BC,wBAAwB,EACxBC,mBAAoB,2CA6BpBC,0BAA4B,SAAShB,KAAMiB,iBACpCjB,KAAKE,KAAKZ,yBAA2B,oBAAsB2B,SAAW,OAU7EC,yBAA2B,SAASlB,KAAMmB,cACnCnB,KAAKE,KAAK,iDAAmDiB,MAAQ,OAS5EC,YAAc,SAASpB,aAChBA,KAAKM,KAAK,mBA0CjBe,wBAA0B,SAASrB,KAAMiB,iBAClCjB,KAAKE,KAAK,iDAAmDe,SAAW,OAU/EK,2BAA6B,SAAStB,KAAMiB,iBACrCjB,KAAKE,KAAK,oDAAsDe,SAAW,OASlFM,gBAAkB,SAASvB,KAAMiB,cAC7BO,aAAeF,2BAA2BtB,KAAMiB,UAChDQ,UAAYJ,wBAAwBrB,KAAMiB,UAE9CS,wBAAwBT,UAAU,GAAMU,MAAK,SAASC,SAC9CA,SACA7C,OAAO8C,QAAQ1C,aAAa2C,WAAYb,UACxCO,aAAaO,YAAY,UACzBN,UAAUO,SAAS,UA9CP,SAAShC,KAAMiB,cAC/BgB,cAAgBjB,0BAA0BhB,KAAMiB,UAChDiB,gBAAkBD,cAAc/B,KAAKZ,6BACzC4C,gBAAgBH,YAAY,UAC5BG,gBAAgB5B,KAAK,eAAe,OAChC6B,gBAAkBF,cAAc/B,KAAKZ,8BACzC6C,gBAAgBH,SAAS,UACzBG,gBAAgB7B,KAAK,eAAe,GAwC5B8B,CAAkBpC,KAAMiB,WAExBhC,aAAaoD,MAAM,yBAA0B,uCAGlDC,MAAMrD,aAAasD,YAStBC,qBAAuB,SAASxC,KAAMiB,cAClCO,aAAeF,2BAA2BtB,KAAMiB,UAChDQ,UAAYJ,wBAAwBrB,KAAMiB,UAE9CS,wBAAwBT,UAAU,GAAOU,MAAK,SAASC,SAC/CA,SACA7C,OAAO8C,QAAQ1C,aAAasD,YAAaxB,UACzCO,aAAaQ,SAAS,UACtBP,UAAUM,YAAY,UArFV,SAAS/B,KAAMiB,cAC/BgB,cAAgBjB,0BAA0BhB,KAAMiB,UAChDiB,gBAAkBD,cAAc/B,KAAKZ,6BACzC4C,gBAAgBF,SAAS,UACzBE,gBAAgB5B,KAAK,eAAe,OAChC6B,gBAAkBF,cAAc/B,KAAKZ,8BACzC6C,gBAAgBJ,YAAY,UAC5BI,gBAAgB7B,KAAK,eAAe,GA+E5BoC,CAAkB1C,KAAMiB,WAExBhC,aAAaoD,MAAM,yBAA0B,uCAGlDC,MAAMrD,aAAasD,YAUtBI,sBAAwB,SAAS3C,KAAMiB,iBAChCjB,KAAKE,KAAK,+CAAiDe,SAAW,OAU7E2B,sBAAwB,SAAS5C,KAAMiB,iBAChCjB,KAAKE,KAAK,+CAAiDe,SAAW,OAwD7E4B,qBAAuB,SAAS5B,SAAU6B,eAG3B,IAAXA,SACAA,OAAS,MAENjE,WAAWkE,sBAAsB,CACpCC,YAAa,CACT,CACIC,KAAM,kCAAoChC,SAC1CiC,MAAOJ,YAYnBK,YAAc,SAASnD,KAAMoD,QACzBC,UAAYrD,KAAKE,KAAK,8BACtBoD,OAASC,SAASF,UAAU/C,KAAK,4BAIjCkD,cADa9D,YAAY4D,QACEG,QAAQC,QAAO,SAASC,YAAaC,gBAC5DR,IAAMQ,QAAQR,IACdO,YAAYE,KAAKD,SAEdD,cACR,OAG4BG,MAA3BpE,YAAY4D,OAAS,GAAiB,KAClCS,WAAarE,YAAY4D,OAAS,GAAGG,QAAQO,MAAM,EAAG,GAG1DtE,YAAYuE,SAAQ,SAASC,WAAY/C,UACjCA,MAAQmC,OAAQ,KACZa,WAAa,GACaL,MAA1BpE,YAAYyB,MAAQ,KACpBgD,WAAazE,YAAYyB,MAAQ,GAAGsC,QAAQO,MAAM,EAAG,IAGzDtE,YAAYyB,OAAOsC,QAAU7E,EAAEwF,MAAM1E,YAAYyB,OAAOsC,QAAQO,MAAM,GAAIG,gBAKlFX,cAAgB5E,EAAEwF,MAAMZ,cAAeO,eAIvCnE,UAAY0D,OAAS,GAA+C,GAA1C5D,YAAY4D,OAAS,GAAGG,QAAQY,OAAa,KACnEC,sBAAwBtE,KAAKE,KAAK,2CACtCpB,oBAAoByF,oBAAoB3F,EAAE0F,uBAAuBhE,KAAK,MAAOgD,QAGjF5D,YAAY4D,QAAQG,QAAUD,cAG9B7D,mBAGI6E,iBAAmBtD,yBAAyBlB,KAAMsD,QACtDmB,cAAczE,KAAMN,YAAY4D,SAAS3B,MAAK,SAAS+C,KAAMC,WAClDzF,UAAU0F,oBAAoBJ,iBAAkBE,KAAMC,OAC9DrC,MAAMrD,aAAasD,WAGtB7C,YAAYuE,SAAQ,SAASC,WAAY/C,OACjCA,MAAQmC,QACGpC,yBAAyBlB,KAAMmB,OACrC0D,aAYbnD,wBAA0B,SAAST,SAAU6B,eAEtCjE,WAAWiG,oBAAoB,CAClCrB,QAAS,CACD,IACUxC,mBACO6B,WAG1BnB,MAAK,SAASoD,eACiB,GAA1BA,OAAOC,SAASX,SAChB3E,YAAYuE,SAAQ,SAASC,YACzBA,WAAWT,QAAQQ,SAAQ,SAASgB,OAAQ9D,OACpC8D,OAAO7B,IAAMnC,WACbiD,WAAWT,QAAQtC,OAAO+D,YAAcpC,eAI7C,MAIZR,MAAMrD,aAAasD,YAUtBkC,cAAgB,SAASzE,KAAMmF,iBAE3BC,QAAUrF,gBAAgBC,MAE1BqF,gBAAkB,MAElBA,gBADmB,QAAnBD,QAAQ/E,QACUd,wBACQ,QAAnB6F,QAAQ/E,QACGd,uBAEAA,0BAItB4F,YAAY1B,QAAU0B,YAAY1B,QAAQ6B,KAAI,SAASL,eACnDA,OAAOM,mBAAkD,MAA7BH,QAAQ3E,kBAC7BwE,UAGPE,YAAY1B,QAAQY,cACbnF,UAAUsG,OAAOH,gBAAiB,CACrC5B,QAAS0B,YAAY1B,cAGrBgC,aAAezF,KAAKE,KAAKd,UAAUe,WAAWC,QAAQE,KAAK,4BACxDpB,UAAUsG,OAAOjG,oBAAqB,CACzCkG,aAAcA,gBAUtBC,SAAW,SAASC,YACfzF,KAAKd,UAAUe,WAAWC,QAAQE,KAAK,cAAeqF,QAU3DC,2BAA6B,SAAS5F,KAAMF,eACxC+F,MAAQ/F,UAAYT,mBAAmByG,yBAC3C/G,OAAOgH,UAAUF,MAAOH,SAASM,KAAKhG,QAStCiG,uBAAyB,SAASjG,MAClCF,UAAY,oBAAsBE,KAAKM,KAAK,MAAQ,IAAM4F,KAAKC,aAE3DC,YAAc7C,SAASvD,KAAKE,KAAKd,UAAUe,WAAWC,QAAQE,KAAK,eAAgB,IACnF+F,aAAe5G,mBAAmB6F,KAAI,SAASpC,WAC3CoD,QAAS,SACTpD,OAASkD,cACTE,QAAS,GAGN,CACHpD,MAAOA,MACPoD,OAAQA,WAKZC,iBAAmBhD,SAASvD,KAAKE,KAAKd,UAAUe,WAAWC,QAAQE,KAAK,yBAA0B,IACtG+F,aAAeA,aAAaG,QAAO,SAASC,qBACjCA,aAAavD,MAAQqD,kBAA2C,IAAvBE,aAAavD,aAG7DkC,QAAUrF,gBAAgBC,MAC1B0G,OAAS9H,EAAE+H,OAAO,GAAI/F,8BAC1B8F,OAAOE,eAAiB9G,cAEpB+G,oBAAsB/H,oBAAoBgI,gBAC1CT,cACA,SAASU,UAAWC,aACZC,SAAW,UAEfF,UAAU9C,SAAQ,SAASiD,cACnBC,YAAcD,SAASE,WACvBzB,MAASuB,SAASvB,MAAQ,EAAKuB,SAASvB,MAAQ,KAGhD9F,WAAa8F,QACbjG,YAAc,GACdC,aAAe,EACfC,SAAW,GAGXA,UAAYuH,mBAEZH,QAAQK,eAAezH,eACvBqH,SAASpD,KAAKY,cAAczE,KAAMN,YAAYyH,eAIlDtH,UAAY8F,MAGwB7B,MAAhCpE,YAAYyH,YAAc,IACMrD,MAA5BpE,YAAYyH,eACZxB,OAAS,OAIb2B,YAvcD,SAASlC,QAASO,cAE1B9G,WAAW0I,6BAA6B,CAC3CC,OAAQ7H,aACRgG,MAAOA,MACP8B,eAAgBrC,QAAQ7E,SACxBC,KAAM4E,QAAQ5E,KACdE,gBAAiB0E,QAAQ1E,gBACzBC,iBAAkByE,QAAQzE,mBA+bA+G,CACdtC,QACAO,OACFhE,MAAK,SAASwD,iBACR1B,QAAU0B,YAAY1B,QACtBkE,cAAgB,EAChBC,YAAc,MAGc9D,MAA5BpE,YAAYyH,aAA2B,KAEnCU,mBADJD,YAAclI,YAAYyH,aAAa1D,SACHY,OAChCwD,kBAAoBX,SAASvB,QAC7BgC,cAAgBT,SAASvB,MAAQkC,kBACjCD,YAAchJ,EAAEwF,MAAM1E,YAAYyH,aAAa1D,QAASA,QAAQO,MAAM,EAAG2D,sBAI7EA,cAAgBT,SAASvB,QAAS,EAClCiC,YAAeV,SAASvB,MAAQ,EAAKlC,QAAQO,MAAM,EAAGkD,SAASvB,OAASlC,QAI5E/D,YAAYyH,aAAe,CACvB1D,QAASmE,iBAITE,kBAAqC,IAAlBH,cAA0BlE,QAAQO,MAAM2D,cAAelE,QAAQY,QAAU,UAC5FyD,iBAAiBzD,SACjB3E,YAAYyH,YAAc,GAAK,CAC3B1D,QAASqE,mBAKbpI,YAAYyH,aAAa1D,QAAQY,OAAS6C,SAASvB,QAAUmC,iBAAiBzD,QAC9EzE,SAAWuH,YACXH,QAAQK,eAAeF,cACgBrD,MAAhCpE,YAAYyH,YAAc,IAC9BzH,YAAYyH,YAAc,GAAG1D,QAAQY,OAAS6C,SAASvB,QAC1D/F,SAAWuH,YAAc,GAG7BxH,aAAewF,YAAY4C,WACpBtD,cAAczE,KAAMN,YAAYyH,iBAE1C7E,MAAMrD,aAAasD,WAEpB0E,SAASpD,KAAKyD,gBAGXL,WAEXP,QAGJG,oBAAoBlF,MAAK,SAAS+C,KAAMC,WACpCiB,2BAA2B5F,KAAMF,WAC1BZ,UAAU0F,oBAAoB5E,KAAKE,KAAKd,UAAUe,WAAWC,QAASsE,KAAMC,OACpFrC,MAAMrD,aAAasD,YAQtByF,uBAAyB,SAAShI,MAClChB,aAAaL,OAAOqB,KAAM,CACtBhB,aAAaiJ,OAAOC,WAGxBlI,KAAKmI,GAAGnJ,aAAaiJ,OAAOC,SAAU5I,gCAAgC,SAAS8I,EAAGC,UAC1EC,UAAY1J,EAAEwJ,EAAEG,QAAQC,QAAQlJ,gCAChC2B,SAAWG,YAAYkH,WAC3B/G,gBAAgBvB,KAAMiB,UACtBoH,KAAKI,cAAcC,oBAGvB1I,KAAKmI,GAAGnJ,aAAaiJ,OAAOC,SAAU5I,mCAAmC,SAAS8I,EAAGC,UAC7EC,UAAY1J,EAAEwJ,EAAEG,QAAQC,QAAQlJ,mCAChC2B,SAAWG,YAAYkH,WAC3B9F,qBAAqBxC,KAAMiB,UAC3BoH,KAAKI,cAAcC,oBAGvB1I,KAAKmI,GAAGnJ,aAAaiJ,OAAOC,SAAU5I,0BAA0B,SAAS8I,EAAGC,MACxEA,KAAKI,cAAcC,oBAGvB1I,KAAKmI,GAAGnJ,aAAaiJ,OAAOC,SAAU5I,8BAA8B,SAAS8I,EAAGC,UACxEE,OAAS3J,EAAEwJ,EAAEG,QAAQC,QAAQlJ,8BAC7B2B,SAAWG,YAAYmH,SAxXlB,SAASvI,KAAMiB,cACxB0H,WAAahG,sBAAsB3C,KAAMiB,UACzC2H,WAAahG,sBAAsB5C,KAAMiB,UACzCmE,QAAUrF,gBAAgBC,MAE9B6C,qBAAqB5B,UAAU,GAI3BmE,QAAQ7E,UAAYf,uCACpB2D,YAAYnD,KAAMiB,UAGtB0H,WAAW3G,SAAS,UACpB4G,WAAW7G,YAAY,UA2WnB8G,CAAW7I,KAAMiB,UACjBoH,KAAKI,cAAcC,oBAGvB1I,KAAKmI,GAAGnJ,aAAaiJ,OAAOC,SAAU5I,8BAA8B,SAAS8I,EAAGC,UACxEE,OAAS3J,EAAEwJ,EAAEG,QAAQC,QAAQlJ,8BAC7B2B,SAAWG,YAAYmH,SAxWlB,SAASvI,KAAMiB,cACxB0H,WAAahG,sBAAsB3C,KAAMiB,UACzC2H,WAAahG,sBAAsB5C,KAAMiB,UACzCmE,QAAUrF,gBAAgBC,MAE9B6C,qBAAqB5B,SAAU,MAI3BmE,QAAQ7E,UAAYf,uCACpB2D,YAAYnD,KAAMiB,UAGtB0H,WAAW5G,YAAY,UACvB6G,WAAW5G,SAAS,UA2VhB8G,CAAW9I,KAAMiB,UACjBoH,KAAKI,cAAcC,qBASvBK,KAAO,SAAS/I,MAChBA,KAAOpB,EAAEoB,MACTN,YAAc,GACdE,SAAW,EACXD,aAAe,EAEfsG,uBAAuBjG,MAElBA,KAAKM,KAAK,eACX0H,uBAAuBhI,MACvBA,KAAKM,KAAK,aAAa,WA2BxB,CACHyI,KAAMA,KACNC,MAfQ,SAAShJ,MACbN,YAAY2E,OAAS,EACrB3E,YAAYuE,SAAQ,SAASC,WAAY/C,WACjCqD,iBAAmBtD,yBAAyBlB,KAAMmB,OACtDsD,cAAczE,KAAMkE,YAAYvC,MAAK,SAAS+C,KAAMC,WACzCzF,UAAU0F,oBAAoBJ,iBAAkBE,KAAMC,OAC9DrC,MAAMrD,aAAasD,cAG1BwG,KAAK/I"} \ 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 280a370ebd5..ff0ba78d5ce 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 * @package block_myoverview\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":";;;;;;;AAuBAA,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 +{"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 * @package block_myoverview\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":";;;;;;;AAuBAA,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 diff --git a/blocks/navigation/amd/build/ajax_response_renderer.min.js b/blocks/navigation/amd/build/ajax_response_renderer.min.js index beec879cfcb..bb7030fdb9d 100644 --- a/blocks/navigation/amd/build/ajax_response_renderer.min.js +++ b/blocks/navigation/amd/build/ajax_response_renderer.min.js @@ -7,6 +7,6 @@ function _typeof(obj){return _typeof="function"==typeof Symbol&&"symbol"==typeof * @package core * @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"],(function($,Templates,Notification,Url){var NODETYPE={ACTIVITY:40,RESOURCE:50};function buildDOM(rootElement,nodes){var ul=$("
    ");ul.attr("role","group"),ul.attr("aria-hidden",!0),$.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);p.addClass("tree_item"),p.attr("id",id),p.attr("role","treeitem"),p.attr("tabindex","-1"),node.requiresajaxloading&&(p.attr("data-requires-ajax",!0),p.attr("data-node-id",node.id),p.attr("data-node-key",node.key),p.attr("data-node-type",node.type)),isBranch&&(li.addClass("collapsed contains_branch"),p.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(p,node.children):isBranch&&!node.requiresajaxloading&&(li.removeClass("contains_branch"),p.addClass("emptybranch"))}})),rootElement.parent().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),group.attr("aria-hidden",!1)}else element.parent().hasClass("contains_branch")&&(element.parent().removeClass("contains_branch"),element.addClass("emptybranch"))}}})); + */}define("block_navigation/ajax_response_renderer",["jquery","core/templates","core/notification","core/url"],(function($,Templates,Notification,Url){var NODETYPE_ACTIVITY=40,NODETYPE_RESOURCE=50;function buildDOM(rootElement,nodes){var ul=$("
      ");ul.attr("role","group"),ul.attr("aria-hidden",!0),$.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);p.addClass("tree_item"),p.attr("id",id),p.attr("role","treeitem"),p.attr("tabindex","-1"),node.requiresajaxloading&&(p.attr("data-requires-ajax",!0),p.attr("data-node-id",node.id),p.attr("data-node-key",node.key),p.attr("data-node-type",node.type)),isBranch&&(li.addClass("collapsed contains_branch"),p.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(p,node.children):isBranch&&!node.requiresajaxloading&&(li.removeClass("contains_branch"),p.addClass("emptybranch"))}})),rootElement.parent().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),group.attr("aria-hidden",!1)}else element.parent().hasClass("contains_branch")&&(element.parent().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 945f9504e88..70d0d43a4ea 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 * @package core\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/url'], function($, Templates, Notification, Url) {\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 ul.attr('aria-hidden', true);\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 p.addClass('tree_item');\n p.attr('id', id);\n p.attr('role', 'treeitem');\n // Negative tab index to allow it to receive focus.\n p.attr('tabindex', '-1');\n\n if (node.requiresajaxloading) {\n p.attr('data-requires-ajax', true);\n p.attr('data-node-id', node.id);\n p.attr('data-node-key', node.key);\n p.attr('data-node-type', node.type);\n }\n\n if (isBranch) {\n li.addClass('collapsed contains_branch');\n p.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(p, node.children);\n } else if (isBranch && !node.requiresajaxloading) {\n li.removeClass('contains_branch');\n p.addClass('emptybranch');\n }\n });\n\n rootElement.parent().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 group.attr('aria-hidden', false);\n } else {\n if (element.parent().hasClass('contains_branch')) {\n element.parent().removeClass('contains_branch');\n element.addClass('emptybranch');\n }\n }\n }\n };\n});\n"],"names":["define","$","Templates","Notification","Url","NODETYPE","ACTIVITY","RESOURCE","buildDOM","rootElement","nodes","ul","attr","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","parent","render","element","item","first","group","find","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 * @package core\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/url'], function($, Templates, Notification, Url) {\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 ul.attr('aria-hidden', true);\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 p.addClass('tree_item');\n p.attr('id', id);\n p.attr('role', 'treeitem');\n // Negative tab index to allow it to receive focus.\n p.attr('tabindex', '-1');\n\n if (node.requiresajaxloading) {\n p.attr('data-requires-ajax', true);\n p.attr('data-node-id', node.id);\n p.attr('data-node-key', node.key);\n p.attr('data-node-type', node.type);\n }\n\n if (isBranch) {\n li.addClass('collapsed contains_branch');\n p.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(p, node.children);\n } else if (isBranch && !node.requiresajaxloading) {\n li.removeClass('contains_branch');\n p.addClass('emptybranch');\n }\n });\n\n rootElement.parent().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 group.attr('aria-hidden', false);\n } else {\n if (element.parent().hasClass('contains_branch')) {\n element.parent().removeClass('contains_branch');\n element.addClass('emptybranch');\n }\n }\n }\n };\n});\n"],"names":["define","$","Templates","Notification","Url","NODETYPE","buildDOM","rootElement","nodes","ul","attr","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","parent","render","element","item","first","group","find","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 267f2896dfd..125823d15e6 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 * @package core\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":";;;;;;;;AAuBAA,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 +{"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 * @package core\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":";;;;;;;;AAuBAA,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 diff --git a/blocks/navigation/amd/build/navblock.min.js.map b/blocks/navigation/amd/build/navblock.min.js.map index 8d246b2ec84..7c38c852ea4 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 * @package core\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":";;;;;;;;AAuBAA,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 +{"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 * @package core\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":";;;;;;;;AAuBAA,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 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 139b4b60850..181ff3533c5 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 * @package core\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":";;;;;;;;AAuBAA,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 +{"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 * @package core\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":";;;;;;;;AAuBAA,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 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 8bf7c905600..29ce8a18f2b 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 * @package block_online_users\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":";;;;;;;;;AAwBAA,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 +{"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 * @package block_online_users\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":";;;;;;;;;AAwBAA,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 diff --git a/blocks/recentlyaccessedcourses/amd/build/main.min.js.map b/blocks/recentlyaccessedcourses/amd/build/main.min.js.map index 5f6dcf14eb0..07f247286be 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.js\n * @package block_recentlyaccessedcourses\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 ],\n function(\n $,\n CustomEvents,\n Notification,\n PubSub,\n PagedContentPagingBar,\n Templates,\n CourseEvents,\n CoursesRepository\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 pagingBar.attr('aria-hidden', 'false');\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 pagingBar.attr('aria-hidden', 'true');\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","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","hidePagingBar","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.js\n * @package block_recentlyaccessedcourses\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 ],\n function(\n $,\n CustomEvents,\n Notification,\n PubSub,\n PagedContentPagingBar,\n Templates,\n CourseEvents,\n CoursesRepository\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 pagingBar.attr('aria-hidden', 'false');\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 pagingBar.attr('aria-hidden', 'true');\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","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","hidePagingBar","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 dca36d58c6e..13fb6616773 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 * @package block_recentlyaccesseditems\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":";;;;;;;;AAyBAA,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 +{"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 * @package block_recentlyaccesseditems\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":";;;;;;;;AAyBAA,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 diff --git a/blocks/recentlyaccesseditems/amd/build/repository.min.js.map b/blocks/recentlyaccesseditems/amd/build/repository.min.js.map index d66f831f8af..90b112c872f 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 * @package block_recentlyaccesseditems\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":";;;;;;;;AAuBAA,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 +{"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 * @package block_recentlyaccesseditems\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":";;;;;;;;AAuBAA,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 diff --git a/blocks/settings/amd/build/settingsblock.min.js.map b/blocks/settings/amd/build/settingsblock.min.js.map index 8a2af275d60..48054937d35 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 * @package core\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":";;;;;;;;AAuBAA,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 +{"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 * @package core\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":";;;;;;;;AAuBAA,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 diff --git a/blocks/starredcourses/amd/build/main.min.js.map b/blocks/starredcourses/amd/build/main.min.js.map index 4adc4ca92a2..c2db6736bcc 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 * @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":";;;;;;AAsBAA,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 +{"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 * @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":";;;;;;AAsBAA,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 diff --git a/blocks/starredcourses/amd/build/repository.min.js.map b/blocks/starredcourses/amd/build/repository.min.js.map index f5dfefad5af..60857f42c1f 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 * @package block_starredcourses\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});"],"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 +{"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 * @package block_starredcourses\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});"],"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 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 f33c2040326..f8dfa0e612e 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,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 +{"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 diff --git a/blocks/timeline/amd/build/event_list.min.js.map b/blocks/timeline/amd/build/event_list.min.js.map index 8968f20653a..a605b1afab1 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 * @package block_timeline\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 = UserDate.getUserMidnightForTimestamp(calendarEvent.timesort, midnight);\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|falsey} 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","getUserMidnightForTimestamp","timesort","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","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 +{"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 * @package block_timeline\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 = UserDate.getUserMidnightForTimestamp(calendarEvent.timesort, midnight);\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|falsey} 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","getUserMidnightForTimestamp","timesort","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","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 diff --git a/blocks/timeline/amd/build/main.min.js.map b/blocks/timeline/amd/build/main.min.js.map index c2c53ebefc4..b8a83abf783 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,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 +{"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 diff --git a/blocks/timeline/amd/build/view.min.js.map b/blocks/timeline/amd/build/view.min.js.map index e01953ddbec..a709e52ac1a 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 * @package block_timeline\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":";;;;;;;AAuBAA,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 +{"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 * @package block_timeline\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":";;;;;;;AAuBAA,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 diff --git a/blocks/timeline/amd/build/view_courses.min.js.map b/blocks/timeline/amd/build/view_courses.min.js.map index 26b4bb639d7..7ef0c6c934d 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 * @package block_timeline\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 = 'inprogress';\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 * @package block_timeline\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 = 'inprogress';\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 diff --git a/blocks/timeline/amd/build/view_dates.min.js.map b/blocks/timeline/amd/build/view_dates.min.js.map index 9793c2c656a..2dbc946e634 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 * @package block_timeline\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.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.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.data('seen')) {\n load(root);\n root.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":";;;;;;;AAuBAA,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,KAAKW,KAAK,QAAQ,GAEzB,EA8BGmB,MAtBQ,SAAS9B,MACjBA,KAAK+B,WAAW,aACZ/B,KAAK6B,SAAS,YACd9B,KAAKC,MACLA,KAAKW,KAAK,QAAQ,GAEzB,EAiBGqB,MAVQ,SAAShC,MACZA,KAAKW,KAAK,UACXZ,KAAKC,MACLA,KAAKW,KAAK,QAAQ,GAEzB,EAOJ"} \ 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 * @package block_timeline\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.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.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.data('seen')) {\n load(root);\n root.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":";;;;;;;AAuBAA,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,KAAKW,KAAK,QAAQ,KAgCtBmB,MAtBQ,SAAS9B,MACjBA,KAAK+B,WAAW,aACZ/B,KAAK6B,SAAS,YACd9B,KAAKC,MACLA,KAAKW,KAAK,QAAQ,KAmBtBqB,MAVQ,SAAShC,MACZA,KAAKW,KAAK,UACXZ,KAAKC,MACLA,KAAKW,KAAK,QAAQ"} \ 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 7bdef288e24..99ad307fc3c 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 * @package block_timeline\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":";;;;;;;AAuBAA,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 +{"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 * @package block_timeline\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":";;;;;;;AAuBAA,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 diff --git a/calendar/amd/build/calendar.min.js.map b/calendar/amd/build/calendar.min.js.map index 1fe0cb19c8b..fd625546f66 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 * @package core_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 * @package core_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":";;;;;;;;;;;;AA2BAA,gCAAO,CACK,SACA,YACA,WACA,iBACA,oBACA,iCACA,oBACA,qBACA,iCACA,8BACA,2BACA,uBACA,6BACA,qBACA,4BAEJ,SACIC,EACAC,KACAC,IACAC,UACAC,aACAC,aACAC,YACAC,aACAC,eACAC,aACAC,mBACAC,eACAC,oBACAC,aACAC,uBAGJC,cAEK,sBAFLA,sBAIa,8BAJbA,uBAKc,gBALdA,wBAMe,gCANfA,iCAOwB,mBAgBxBC,gBAAkB,SAASC,EAAGC,QAASC,cAAeC,wBAClDC,gBAAkB,KAClBC,qBAAuBF,mBAAmBG,KAAK,sBAE/CJ,gBACAE,gBAAkBF,cAAcI,KAAK,uBAIpCJ,eAAiBE,iBAAmBC,sBACrCnB,UAAUqB,OAAO,eAAgB,IAC5BC,MAAK,SAASC,KAAMC,IAEjBP,mBAAmBQ,KAAKb,uBAAuBc,SAAS,UACxD1B,UAAU2B,mBAAmBV,mBAAoBM,KAAMC,IAEnDR,gBACAA,cAAcS,KAAKb,uBAAuBc,SAAS,UACnD1B,UAAU2B,mBAAmBX,cAAeO,KAAMC,QAIzDF,MAAK,kBAEKf,mBAAmBqB,oBAAoBb,QAASI,yBAE1DG,MAAK,WAGFzB,EAAE,QAAQgC,QAAQrB,eAAesB,WAAY,CAACf,QAASC,cAAeC,wBAGzEc,QAAO,eAGAC,0BAA4Bf,mBAAmBQ,KAAKb,2BACxDK,mBAAmBQ,KAAKb,uBAAuBqB,YAAY,UAC3DjC,UAAUkC,YAAYF,0BAA2B,GAAI,IAEjDhB,cAAe,KACXmB,qBAAuBnB,cAAcS,KAAKb,wBAC9CI,cAAcS,KAAKb,uBAAuBqB,YAAY,UACtDjC,UAAUkC,YAAYC,qBAAsB,GAAI,QAIvDC,KAAKnC,aAAaoC,YA0C3BC,uBAAyB,SAASC,MAElCA,KAAKC,GAAG,QAAS5B,yBAAyB,SAASE,OAC3C2B,QAAU5C,EAAEiB,EAAE4B,QACdC,KAAOF,QAAQG,KAAK,QACpBC,MAAQJ,QAAQG,KAAK,SACrBE,IAAML,QAAQG,KAAK,OACnBG,SAAWN,QAAQG,KAAK,YACxBI,WAAaP,QAAQG,KAAK,cAC9BnC,oBAAoBwC,kBAAkBV,KAAMI,KAAME,MAAOC,IAAKC,SAAUC,WAAYT,KAC5E,8BAA8BjB,MAAK,WACvCR,EAAEoC,qBACEC,IAAM,kBAAoBV,QAAQG,KAAK,oBACpCQ,OAAOC,QAAQC,UAAU,GAAI,GAAIH,QACzCf,KAAKnC,aAAaoC,cAGzBE,KAAKC,GAAG,SAAU7B,kBAAkB4C,SAASC,gBAAgB,eAErDT,SADgBlD,EAAE4D,MACOC,MAC7BjD,oBAAoBkD,mBAAmBpB,KAAMQ,SAAU,MAClDzB,MAAK,kBAEKiB,KAAKd,KAAKd,kBAAkB4C,SAASC,gBAAgBE,IAAIX,aAEnEX,KAAKnC,aAAaoC,kBAGvBuB,iBAAmBlD,aAAamD,uBAAuBtB,MACvDuB,UAAYjE,EAAEe,kCAAkCgC,KAAK,eA5DxB,SAASL,KAAMwB,2BAC5CC,KAAOnE,EAAE,QAEbmE,KAAKxB,GAAGhC,eAAeyD,SAAS,WAC5BxD,oBAAoBkD,mBAAmBpB,SAE3CyB,KAAKxB,GAAGhC,eAAe0D,SAAS,WAC5BzD,oBAAoBkD,mBAAmBpB,SAE3CyB,KAAKxB,GAAGhC,eAAe2D,SAAS,WAC5B1D,oBAAoBkD,mBAAmBpB,SAE3CyB,KAAKxB,GAAGhC,eAAe4D,iBAAiB,SAAStD,EAAGqC,KAEhDC,OAAOiB,SAASC,OAAOnB,QAG3Ba,KAAKxB,GAAGhC,eAAe+D,UAAW1D,iBAElCmD,KAAKxB,GAAGhC,eAAesB,YAAY,WAC/BrB,oBAAoBkD,mBAAmBpB,SAG3C7B,aAAa8D,sBAAsBjC,KAAMwB,uBAsCzCU,CAA+BlC,KAAMqB,kBAEjCE,WAEAvB,KAAKC,GAAG,QAAS5B,eAAe,SAAUE,OAElC4B,OAAS7C,EAAEiB,EAAE4B,YAEZA,OAAOgC,GAAG9D,yBAA0B,KACjC+D,UAAY9E,EAAE4D,MAAMrC,KAAK,4BAC7BwC,iBAAiBtC,MAAK,SAAUsD,WACxBC,QAAUnC,OAAOoC,QAAQnE,kBAAkBkE,SAC/CD,MAAMG,YAAYF,QAAQjC,KAAK,iBAE3BI,WAAa6B,QAAQjC,KAAK,mBACJ,IAAfI,YACP4B,MAAMI,cAAchC,YAGxB4B,MAAMK,aAAaJ,QAAQjC,KAAK,cAChCgC,MAAMM,aAAaP,WACnBC,MAAMO,UAGT/C,KAAKnC,aAAaoC,WAEnBvB,EAAEoC,4BAMX,CACHkC,KAAM,SAAS7C,MACXA,KAAO1C,EAAE0C,MACT9B,oBAAoB2E,KAAK7C,MACzBD,uBAAuBC"} \ 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 fd5d749000a..b8b5c72239d 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 * @package core_calendar\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":";;;;;;;;AAuBAA,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 +{"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 * @package core_calendar\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":";;;;;;;;AAuBAA,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 diff --git a/calendar/amd/build/calendar_mini.min.js.map b/calendar/amd/build/calendar_mini.min.js.map index ac03953912f..349c5e76081 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 * @package core_calendar\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":";;;;;;;;;;;;AA2BAA,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 +{"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 * @package core_calendar\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":";;;;;;;;;;;;AA2BAA,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 diff --git a/calendar/amd/build/calendar_threemonth.min.js.map b/calendar/amd/build/calendar_threemonth.min.js.map index 40e6b780020..46a745cdbe0 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 * @package core_calendar\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, '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":";;;;;;;;;AAwBAA,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,aAAc,8BAClB7C,EAAEgD,iBACFC,OAAOC,QAAQC,UAAU,CAAzB,EAA6B,GAAI,YACxC,GACJ,CAMOC,CAFAzD,KAAOP,EAAEO,MAGZ,EAER"} \ 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 * @package core_calendar\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, '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":";;;;;;;;;AAwBAA,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,aAAc,8BAClB7C,EAAEgD,iBACFC,OAAOC,QAAQC,UAAU,GAAI,GAAI,gBAQrCC,CAFAzD,KAAOP,EAAEO"} \ 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 6b9e2c34810..f40be2c4b1f 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 * @package core_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":";;;;;;;;AAuBAA,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 +{"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 * @package core_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":";;;;;;;;AAuBAA,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 diff --git a/calendar/amd/build/crud.min.js.map b/calendar/amd/build/crud.min.js.map index ff31a7b29f6..919a5a2815e 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 * @package core_calendar\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.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 * @package core_calendar\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.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 5fd32c82747..84d85a18fe1 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 * @package core_calendar\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":";;;;;;;;;;;;AA2BAA,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 +{"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 * @package core_calendar\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":";;;;;;;;;;;;AA2BAA,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 diff --git a/calendar/amd/build/event_form.min.js.map b/calendar/amd/build/event_form.min.js.map index a28eb9faa37..0d216e05484 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 * @package core_calendar\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":";;;;;;;;AAuBAA,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 +{"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 * @package core_calendar\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":";;;;;;;;AAuBAA,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 diff --git a/calendar/amd/build/events.min.js.map b/calendar/amd/build/events.min.js.map index e1e77d29e73..d61ee4f4e4a 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 * @class calendar_events\n * @package core_calendar\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":";;;;;;;;;AAwBAA,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 +{"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 * @class calendar_events\n * @package core_calendar\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":";;;;;;;;;AAwBAA,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 diff --git a/calendar/amd/build/modal_delete.min.js.map b/calendar/amd/build/modal_delete.min.js.map index 683fda98264..a6c7239cb88 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 save/cancel modal.\n *\n * @module core_calendar/modal_delete\n * @class modal_delete\n * @package core_calendar\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 * @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":";;;;;;;;;AAwBAA,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,yBAQfC,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 +{"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 save/cancel modal.\n *\n * @module core_calendar/modal_delete\n * @class modal_delete\n * @package core_calendar\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 * @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":";;;;;;;;;AAwBAA,oCAAO,CACH,SACA,oBACA,iCACA,aACA,oBACA,sBACA,yBAEJ,SACIC,EACAC,aACAC,aACAC,MACAC,YACAC,cACAC,oBAGIC,YAAa,EACbC,4BACmB,4BADnBA,4BAEmB,4BAFnBA,wBAGe,yBAQfC,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 diff --git a/calendar/amd/build/modal_event_form.min.js.map b/calendar/amd/build/modal_event_form.min.js.map index 5358e5dd914..ab1146b523a 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 calendar/modal_quick_add_event\n * @class modal_quick_add_event\n * @package core\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 calendar/modal_quick_add_event\n * @class modal_quick_add_event\n * @package core\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 346ff7a8f0e..2200bceb3a5 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 * @class month_navigation_drag_drop\n * @package core_calendar\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 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":";;;;;;;;;;;;;;AA6BAA,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,EAMGW,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,GAhGd,MAsGbE,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 +{"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 * @class month_navigation_drag_drop\n * @package core_calendar\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 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":";;;;;;;;;;;;;;AA6BAA,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,MAOlCW,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,OAlGR,MAsGbE,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 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 d1f6fb9ff31..3bef4ad4954 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 * @class month_view_drag_drop\n * @package core_calendar\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} target The drag target element\n * @param {bool} hovered If the target is hovered or not\n * @param {int} 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 * @class month_view_drag_drop\n * @package core_calendar\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} target The drag target element\n * @param {bool} hovered If the target is hovered or not\n * @param {int} 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 diff --git a/calendar/amd/build/repository.min.js b/calendar/amd/build/repository.min.js index 6d7ccbe0a23..52e9474e88c 100644 --- a/calendar/amd/build/repository.min.js +++ b/calendar/amd/build/repository.min.js @@ -7,6 +7,6 @@ define("core_calendar/repository",["exports","core/ajax"],(function(_exports,_aj * @package core_calendar * @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 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]}})); + */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]}})); //# 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 70d6d9ba68f..c2bc2f2fc37 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 * @class repository\n * @package core_calendar\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":";;;;;;;;;oSAwBAA,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 +{"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 * @class repository\n * @package core_calendar\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":";;;;;;;;;6WAkC2B,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 diff --git a/calendar/amd/build/selectors.min.js.map b/calendar/amd/build/selectors.min.js.map index eb3920b3133..65dbf11ef4a 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 * @package core_calendar\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":";;;;;;;;AAuBAA,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 +{"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 * @package core_calendar\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":";;;;;;;;AAuBAA,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 diff --git a/calendar/amd/build/summary_modal.min.js.map b/calendar/amd/build/summary_modal.min.js.map index a421fa7f56d..ba1b45877b1 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 * @package core_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/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":";;;;;;;;AAuBAA,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 +{"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 * @package core_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/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":";;;;;;;;AAuBAA,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 diff --git a/calendar/amd/build/view_manager.min.js b/calendar/amd/build/view_manager.min.js index 213743f54a1..eda33465969 100644 --- a/calendar/amd/build/view_manager.min.js +++ b/calendar/amd/build/view_manager.min.js @@ -6,6 +6,6 @@ function _typeof(obj){return _typeof="function"==typeof Symbol&&"symbol"==typeof * @package core_calendar * @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){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=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){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=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 428a317b55a..d339c54eb8a 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 * @package core_calendar\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 target = target || root.find(CalendarSelectors.wrapper);\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":";;;;;;;;uQAwBAA,QAAAC,uBAAAD,SACAE,WAAAD,uBAAAC,YACAC,cAAAF,uBAAAE,eACAC,mBAAAC,wBAAAD,oBACAE,QAAAL,uBAAAK,SACAC,kBAAAF,wBAAAE,mBACAC,eAAAP,uBAAAO,gBACAC,cAAAR,uBAAAQ,eACAC,eAAAT,uBAAAS,gBACAC,2BAAAV,uBAAAU,4BACAC,SAAAX,uBAAAW,UAOA,IA0GaC,oBAAsB,SAACC,KAAMC,KAAMC,MAAOC,SAAUC,YAAYC,IAAAA,8DAAS,KAAMC,gEAAW,GAAIC,2DAAM,EAC7GC,aAAaR,MAEbK,OAASA,QAAUL,KAAKS,KAAKhB,kBAAkBiB,SAC/CJ,SAAWA,UAAYN,KAAKW,KAAK,iBACjCC,EAAEC,KAAKC,WAAW,CAACd,KAAKe,IAAI,MAAOd,KAAMC,MAAOC,UAAUa,KAAK,MAC/D,IAAMC,kBAAoBjB,KAAKkB,KAAK,qBAC9BC,KAAOnB,KAAKkB,KAAK,QAChB5B,OAAAA,mBAAmB8B,qBAAqBnB,KAAMC,MAAOC,SAAUC,WAAYa,kBAAmBE,KAAMZ,KACtGc,MAAK,SAAAC,SAEF,OADAA,QAAQC,cAAe,EAChBC,mBAAUC,OAAOnB,SAAUgB,QAHnC,IAKFD,MAAK,SAACK,KAAMC,IACFH,OAAAA,WAAAA,QAAUI,YAAYvB,OAAQqB,KAAMC,GAC9C,IACAN,MAAK,WACFQ,SAASC,cAAc,QAAQC,cAAc,IAAIC,YAAYC,QAAAA,QAAeC,aAE/E,IACAC,QAAO,WAEGC,OADPxB,EAAEC,KAAKwB,YAAY,CAACrC,KAAKe,IAAI,MAAOd,KAAMC,MAAOC,UAAUa,KAAK,MACzDoB,YAAYpC,KAdpB,IAgBFsC,KAAKC,cAAAA,QAAaC,UAC1B,mDAcM,IAAMC,YAAc,SAACzC,KAAM0C,IAAKzC,KAAMC,MAAOC,SAAUC,YACnDL,OAAAA,oBAAoBC,KAAMC,KAAMC,MAAOC,SAAUC,WAAY,KAAM,0DADE,GAEvEiB,MAAK,WACEqB,IAAIC,QAAkB,MAARD,KACdE,OAAOC,QAAQC,UAAU,CAAzB,EAA6B,GAAIJ,KAFtB,IAAA,IAAAK,KAAAC,UAAAL,OAATM,KAAS,IAAAC,MAAAH,MAAAI,KAAA,EAAAA,KAAAJ,KAAAI,OAATF,KAASE,MAAAH,UAAAG,MAIf,OAAOF,IACV,IACA5B,MAAK,YACF,EAAAnC,QAAAkE,SAAE,QAAQC,QAAQpB,gBAAeqB,aAAc,CAACrD,KAAMC,MAAOC,SAAUC,aADxD,IAAA,IAAAmD,MAAAP,UAAAL,OAATM,KAAS,IAAAC,MAAAK,OAAAC,MAAA,EAAAA,MAAAD,MAAAC,QAATP,KAASO,OAAAR,UAAAQ,OAEf,OAAOP,IACV,GACR,+DAUiC,SAACjD,MAAMG,IAAAA,gEAAW,EAAGC,kEAAa,EAC1DH,KAAOD,KAAKS,KAAKhB,kBAAkBiB,SAASQ,KAAK,QACjDhB,MAAQF,KAAKS,KAAKhB,kBAAkBiB,SAASQ,KAAK,SAClDX,IAAMP,KAAKS,KAAKhB,kBAAkBiB,SAASQ,KAAK,OAKtD,OAHAf,SAAWA,UAAYH,KAAKS,KAAKhB,kBAAkBiB,SAASQ,KAAK,YACjEd,WAAaA,YAAcJ,KAAKS,KAAKhB,kBAAkBiB,SAASQ,KAAK,cAE9DnB,oBAAoBC,KAAMC,KAAMC,MAAOC,SAAUC,WAAY,KAAM,GAAIG,IACjF,EAiBM,IAAMkD,kBAAoB,SAACzD,KAAMC,KAAMC,MAAOK,IAAKJ,SAAUC,YAAYC,IAAAA,8DAAS,KAAMC,gEAAW,GACtGE,aAAaR,MAEbK,OAASA,QAAUL,KAAKS,KAAKhB,kBAAkBiB,SAC/CJ,SAAWA,UAAYN,KAAKW,KAAK,iBACjCC,EAAEC,KAAKC,WAAW,CAACd,KAAKe,IAAI,MAAOd,KAAMC,MAAOK,IAAKJ,SAAUC,YAAYY,KAAK,MAChF,IAAMC,kBAAoBjB,KAAKkB,KAAK,qBAC7B5B,OAAAA,mBAAmBoE,mBAAmBzD,KAAMC,MAAOK,IAAKJ,SAAUC,WAAYa,mBAChFI,MAAK,SAACC,SAEH,OADAA,QAAQqC,YAAa,EACdnC,mBAAUC,OAAOnB,SAAUgB,QAHnC,IAKFD,MAAK,SAACK,KAAMC,IACFH,OAAAA,WAAAA,QAAUI,YAAYvB,OAAQqB,KAAMC,GAC9C,IACAN,MAAK,WACFQ,SAASC,cAAc,QAAQC,cAAc,IAAIC,YAAYC,QAAAA,QAAeC,aAE/E,IACAC,QAAO,WAEGC,OADPxB,EAAEC,KAAKwB,YAAY,CAACrC,KAAKe,IAAI,MAAOd,KAAMC,MAAOK,IAAKJ,SAAUC,YAAYY,KAAK,MAC1EoB,YAAYpC,KAdpB,IAgBFsC,KAAKC,cAAAA,QAAaC,UAC1B,yEAU+B,SAACxC,MAAMG,IAAAA,gEAAW,EAAGC,kEAAa,EACxDM,QAAUV,KAAKS,KAAKhB,kBAAkBiB,SACtCT,KAAOS,QAAQQ,KAAK,QACpBhB,MAAQQ,QAAQQ,KAAK,SACrBX,IAAMG,QAAQQ,KAAK,OAKzB,OAHAf,SAAWA,UAAYH,KAAKS,KAAKhB,kBAAkBiB,SAASQ,KAAK,YACjEd,WAAaA,YAAcJ,KAAKS,KAAKhB,kBAAkBiB,SAASQ,KAAK,cAE9DuC,kBAAkBzD,KAAMC,KAAMC,MAAOK,IAAKJ,SAAUC,WAC9D,EAcM,IAAMwD,UAAY,SAAC5D,KAAM0C,IAAKzC,KAAMC,MAAOK,IAAKJ,SAAUC,YAC7D,OAAOqD,kBAAkBzD,KAAMC,KAAMC,MAAOK,IAAKJ,SAAUC,YACtDiB,MAAK,WACEqB,IAAIC,QAAkB,MAARD,KACdE,OAAOC,QAAQC,UAAU,CAAzB,EAA6B,GAAIJ,KAFtB,IAAA,IAAAmB,MAAAb,UAAAL,OAATM,KAAS,IAAAC,MAAAW,OAAAC,MAAA,EAAAA,MAAAD,MAAAC,QAATb,KAASa,OAAAd,UAAAc,OAIf,OAAOb,IACV,IACA5B,MAAK,YACF,EAAAnC,QAAAkE,SAAE,QAAQC,QAAQpB,gBAAe8B,WAAY,CAAC9D,KAAMC,MAAOC,SAAUC,aADtD,IAAA,IAAA4D,MAAAhB,UAAAL,OAATM,KAAS,IAAAC,MAAAc,OAAAC,MAAA,EAAAA,MAAAD,MAAAC,QAAThB,KAASgB,OAAAjB,UAAAiB,OAEf,OAAOhB,IACV,GACR,+BAQD,IAAMzC,aAAe,SAACR,MACWA,KAAKS,KAAKhB,kBAAkByE,WAAWC,aAE/CC,YAAY,SACpC,EAQKhC,YAAc,SAACpC,MACYA,KAAKS,KAAKhB,kBAAkByE,WAAWC,aAE/CE,SAAS,SACjC,EAYYC,sBAAwB,SAACtE,MAAMG,IAAAA,gEAAW,EAAGC,kEAAa,EAAGC,8DAAS,KAAMC,gEAAW,GAQhG,OAPAE,aAAaR,MAEbK,OAASA,QAAUL,KAAKS,KAAKhB,kBAAkBiB,SAC/CJ,SAAWA,UAAYN,KAAKW,KAAK,iBACjCR,SAAWA,UAAYH,KAAKS,KAAKhB,kBAAkBiB,SAASQ,KAAK,YACjEd,WAAaA,YAAcJ,KAAKS,KAAKhB,kBAAkBiB,SAASQ,KAAK,cAE9D5B,mBAAmBiF,wBAAwBpE,SAAUC,YACvDiB,MAAK,SAACC,SAEH,OADAA,QAAQkD,iBAAkB,EACnBhD,mBAAUC,OAAOnB,SAAUgB,QAHnC,IAKFD,MAAK,SAACK,KAAMC,IACFH,OAAAA,WAAAA,QAAUI,YAAYvB,OAAQqB,KAAMC,GAC9C,IACAN,MAAK,WACFQ,SAASC,cAAc,QAAQC,cAAc,IAAIC,YAAYC,QAAAA,QAAeC,aAE/E,IACAC,QAAO,WACGC,OAAAA,YAAYpC,KAbpB,IAeFsC,KAAKC,cAAAA,QAAaC,UAC1B,uDAQD,IAUMiC,wBAA0B,SAACC,SAC7B,IAAMC,eAAiB,IAAIC,SAAJxB,QAAY,sDAG5B9D,OAAAA,mBAAmBuF,aAAaH,SACtCrD,MAAK,SAACyD,kBACH,IAAKA,iBAAiBC,MAClB,MAAM,IAAIC,MAAM,mEAAqEN,SAGlFI,OAAAA,iBAAiBC,KAC3B,IACA1D,MAAK,SAAA4D,WAEF,IAxB2BC,UAwBrBC,YAAc,CAChBC,MAAOH,UAAUI,KACjBC,KAAMC,eAAAA,QAAaC,KACnBC,KAAMjE,WAAUC,QAAAA,OAAO,mCAAoCwD,WAC3DS,gBAAiB,CACbC,QAASV,UAAUU,QACnBC,UAAWX,UAAUW,UACrBC,eA/BmBX,UA+BsBD,UAAUa,oBA9BxD,kBAAoBZ,WA+Bfa,cAAed,UAAUc,cACzBrD,IAAKuC,UAAUvC,IACfsD,OAAQf,UAAUe,SAK1B,OAAOC,eAAaC,QAAAA,OAAOf,YAC9B,IACA9D,MAAK,SAAA8E,OAUF,OARAA,MAAMC,UAAUC,GAAGC,cAAAA,QAAYC,QAAQ,WAEnCJ,MAAMK,SACT,IAGDL,MAAMM,OAECN,KACV,IACA9E,MAAK,SAAA8E,OAGF,OAFAxB,eAAe+B,UAERP,KA1CJ,IA4CNQ,MAAMpE,cAAAA,QAAaC,UACvB,gBAEmB,SAACxC,KAAM4G,OAxYI,SAAC5G,OAC5BA,MAAO,EAAEA,QAAAA,SAAAA,OAGJqG,GAAG,QAAS5G,kBAAkBoH,MAAMC,WAAW,SAACC,GACjD,IAAM1G,OAAS0G,EAAE1G,OACbyG,UAAY,KACZpC,QAAU,KACRC,eAAiB,IAAIC,SAAJxB,QAAY,+CAS/BsB,SANAoC,UADAzG,OAAO2G,QAAQvH,kBAAkBwH,QAAQC,WAC7B7G,OAEAA,OAAO8G,QAAQ1H,kBAAkBwH,QAAQC,YAI3CJ,UAAUM,QAAQ1C,QAElBrE,OAAOyB,cAAcrC,kBAAkBwH,QAAQC,WAAWE,QAAQ1C,UAM5EqC,EAAEM,iBAGFN,EAAEO,kBAEF7C,wBAAwBC,SACvBrD,KAAKsD,eAAe+B,SACpBC,SAEDhC,eAAe+B,SAEtB,IAED1G,KAAKqG,GAAG,QAAS5G,kBAAkBoH,MAAMU,SAAS,SAACR,GACzCrG,IAAAA,QAAUV,KAAKS,KAAKhB,kBAAkBiB,SACtCkG,KAAOlG,QAAQQ,KAAK,QACpBf,SAAWO,QAAQQ,KAAK,YACxBd,WAAaM,QAAQQ,KAAK,cAC1BsG,KAAOT,EAAEU,cAEF,UAATb,MACAnE,YAAYzC,KAAMwH,KAAKE,KAAMF,KAAKJ,QAAQnH,KAAMuH,KAAKJ,QAAQlH,MAAOC,SAAUC,WAAYoH,KAAKJ,QAAQ7G,KACvGwG,EAAEM,kBACc,QAATT,OACPhD,UAAU5D,KAAMwH,KAAKE,KAAMF,KAAKJ,QAAQnH,KAAMuH,KAAKJ,QAAQlH,MAAOsH,KAAKJ,QAAQ7G,IAAKJ,SAAUC,YAC9F2G,EAAEM,iBAET,IAEKM,IAAAA,aAAe3H,KAAKS,KAAKhB,kBAAkBkI,cACpCC,2BAAAA,QAAAA,OAAOD,aAAc,CAACE,2BAAaC,QAAAA,OAAOC,WACvDJ,aAAatB,GACTwB,2BAAAA,QAAaC,OAAOC,UACpB,SAAChB,GACGA,EAAEM,iBAEF,IAAMW,OAASjB,EAAE1G,OACb2H,IAAAA,OAAOC,UAAUC,SAAS,UAA1BF,CAIJ,IAAMpB,KAAOoB,OAAOZ,QAAQR,KACxB3G,KAAO+H,OAAOZ,QAAQnH,KACtBC,MAAQ8H,OAAOZ,QAAQlH,MACvBK,IAAMyH,OAAOZ,QAAQ7G,IACrBJ,SAAW6H,OAAOZ,QAAQe,SAC1B/H,WAAa4H,OAAOZ,QAAQgB,WAEpB,SAARxB,KACA7G,oBAAoBC,KAAMC,KAAMC,MAAOC,SAAUC,WAAYJ,KAAM,+BAAgCO,KAC9Fc,MAAK,WACKuB,OAAAA,OAAOC,QAAQC,UAAU,CAAA,EAAI,GAAI,cAFhD,IAGOR,KAAKC,cAAAA,QAAaC,WACV,OAARoE,KACPnD,kBAAkBzD,KAAMC,KAAMC,MAAOK,IAAKJ,SAAUC,WAAYJ,KAAM,8BACjEqB,MAAK,WACKuB,OAAAA,OAAOC,QAAQC,UAAU,CAAA,EAAI,GAAI,YAFhD,IAGOR,KAAKC,cAAAA,QAAaC,WACV,YAARoE,MACPtC,sBAAsBtE,KAAMG,SAAUC,WAAYJ,KAAM,mCACnDqB,MAAK,WACKuB,OAAAA,OAAOC,QAAQC,UAAU,CAAA,EAAI,GAAI,iBAFhD,IAGOR,KAAKC,cAAAA,QAAaC,UAvB5B,CAyBJ,GAER,CA8SG6F,CAAuBrI,KAC1B"} \ 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 * @package core_calendar\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 target = target || root.find(CalendarSelectors.wrapper);\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 diff --git a/contentbank/amd/build/actions.min.js.map b/contentbank/amd/build/actions.min.js.map index cf87a3b45cc..1e6efe81e3d 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 * @package core_contentbank\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 };\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 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: '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 deleteButtonText = langStrings[2];\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\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 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","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","init"],"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 * @package core_contentbank\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 };\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 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: '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 deleteButtonText = langStrings[2];\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\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 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","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"],"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 7ed54fd06ae..73d2c76e5a7 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 * @package core_contentbank\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.elements.clearsearch)[0];\n const searchIcon = body.find(selectors.elements.searchicon)[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 searchIcon.classList.add('d-none');\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 searchIcon.classList.remove('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","searchIcon","navbarBreadcrumb","navbarTotal","filteredContents","wrap","_context","prev","next","clearsearch","searchicon","cbnavbarbreadcrumb","cbnavbartotalsearch","filterContents","length","classList","add","remove","_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":"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"} \ 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 * @package core_contentbank\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.elements.clearsearch)[0];\n const searchIcon = body.find(selectors.elements.searchicon)[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 searchIcon.classList.add('d-none');\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 searchIcon.classList.remove('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","clearsearch","searchIcon","searchicon","navbarBreadcrumb","cbnavbarbreadcrumb","navbarTotal","cbnavbartotalsearch","filteredContents","filterContents","length","classList","add","remove","innerHTML","searchTerm","contents","Array","from","listitem","searchResults","forEach","content","contentName","getAttribute","toLowerCase","includes","push","querySelector","cbcontentname","highlight","text","highlightText","result","pos","indexOf","substr"],"mappings":"8rBAmCoB,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,oMAClCC,kBAAoBF,KAAKb,KAAKN,mBAAUO,SAASe,aAAa,GAC9DC,WAAaJ,KAAKb,KAAKN,mBAAUO,SAASiB,YAAY,GAEtDC,iBAAmBN,KAAKb,KAAKN,mBAAUO,SAASmB,oBAAoB,GACpEC,YAAcR,KAAKb,KAAKN,mBAAUO,SAASqB,qBAAqB,GAEhEC,iBAAmBC,eAAeX,KAAMC,eAC1CA,YAAYW,OAAS,kCAIrBR,WAAWS,UAAUC,IAAI,UACzBZ,kBAAkBW,UAAUE,OAAO,UAGnCT,iBAAiBO,UAAUC,IAAI,4BACD,mBAAU,aAAc,mBAAoBJ,iBAAiBE,gBAA3FJ,YAAYQ,wBACZR,YAAYK,UAAUE,OAAO,yCAK7Bb,kBAAkBW,UAAUC,IAAI,UAChCV,WAAWS,UAAUE,OAAO,UAG5BT,iBAAiBO,UAAUE,OAAO,UAClCP,YAAYK,UAAUC,IAAI,2aAY5BH,eAAiB,SAACX,KAAMiB,gBACpBC,SAAWC,MAAMC,KAAKpB,KAAKb,KAAKN,mBAAUO,SAASiC,WACnDC,cAAgB,UACtBJ,SAASK,SAAQ,SAACC,aACRC,YAAcD,QAAQE,aAAa,aACtB,KAAfT,YAAqBQ,YAAYE,cAAcC,SAASX,WAAWU,gBAEnEL,cAAcO,KAAKL,SACQA,QAAQM,cAAcjD,mBAAUC,QAAQiD,eAChDf,UAAYgB,UAAUP,YAAaR,YACtDO,QAAQX,UAAUE,OAAO,WAEzBS,QAAQX,UAAUC,IAAI,aAIvBQ,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 diff --git a/contentbank/amd/build/selectors.min.js.map b/contentbank/amd/build/selectors.min.js.map index 913d860a8da..1a195e62b72 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 * @package core_contentbank\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', 'clearsearchcontent'),\n viewgrid: getDataSelector('action', 'viewgrid'),\n viewlist: getDataSelector('action', 'viewlist'),\n sortname: getDataSelector('action', 'sortname'),\n sortdate: getDataSelector('action', 'sortdate'),\n sortsize: getDataSelector('action', 'sortsize'),\n sorttype: getDataSelector('action', 'sorttype')\n },\n elements: {\n listitem: '.cb-listitem',\n cbnavbarbreadcrumb: '.cb-navbar-breadbrumb',\n cbnavbartotalsearch: '.cb-navbar-totalsearch',\n clearsearch: '.input-group-append .clear-icon',\n searchicon: '.input-group-append .search-icon',\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","sortdate","sortsize","sorttype","elements","listitem","cbnavbarbreadcrumb","cbnavbartotalsearch","clearsearch","searchicon","searchinput","sortbutton"],"mappings":";;;;;;;;;AAgCMA,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,sBACvCW,SAAUX,gBAAgB,SAAU,YACpCY,SAAUZ,gBAAgB,SAAU,YACpCa,SAAUb,gBAAgB,SAAU,YACpCc,SAAUd,gBAAgB,SAAU,YACpCe,SAAUf,gBAAgB,SAAU,YACpCgB,SAAUhB,gBAAgB,SAAU,aAExCiB,SAAU,CACNC,SAAU,eACVC,mBAAoB,wBACpBC,oBAAqB,yBACrBC,YAAa,kCACbC,WAAY,mCACZC,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 * @package core_contentbank\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', 'clearsearchcontent'),\n viewgrid: getDataSelector('action', 'viewgrid'),\n viewlist: getDataSelector('action', 'viewlist'),\n sortname: getDataSelector('action', 'sortname'),\n sortdate: getDataSelector('action', 'sortdate'),\n sortsize: getDataSelector('action', 'sortsize'),\n sorttype: getDataSelector('action', 'sorttype')\n },\n elements: {\n listitem: '.cb-listitem',\n cbnavbarbreadcrumb: '.cb-navbar-breadbrumb',\n cbnavbartotalsearch: '.cb-navbar-totalsearch',\n clearsearch: '.input-group-append .clear-icon',\n searchicon: '.input-group-append .search-icon',\n searchinput: '#searchinput',\n sortbutton: '.cb-btnsort'\n },\n};\n"],"names":["getDataSelector","name","value","regions","cbcontentname","contentbank","filearea","actions","search","clearSearch","viewgrid","viewlist","sortname","sortdate","sortsize","sorttype","elements","listitem","cbnavbarbreadcrumb","cbnavbartotalsearch","clearsearch","searchicon","searchinput","sortbutton"],"mappings":";;;;;;;;;IAgCMA,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,sBACvCU,SAAUV,gBAAgB,SAAU,YACpCW,SAAUX,gBAAgB,SAAU,YACpCY,SAAUZ,gBAAgB,SAAU,YACpCa,SAAUb,gBAAgB,SAAU,YACpCc,SAAUd,gBAAgB,SAAU,YACpCe,SAAUf,gBAAgB,SAAU,aAExCgB,SAAU,CACNC,SAAU,eACVC,mBAAoB,wBACpBC,oBAAqB,yBACrBC,YAAa,kCACbC,WAAY,mCACZC,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 8c5aeb91c7f..ad611e9a2a9 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 * @package core_contentbank\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', 'lastmodified', 'size', 'type']);\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 // The search.\n const fileArea = document.querySelector(selectors.regions.filearea);\n const shownItems = fileArea.querySelectorAll(selectors.elements.listitem);\n\n // The view buttons.\n const viewGrid = contentBank.querySelector(selectors.actions.viewgrid);\n const viewList = contentBank.querySelector(selectors.actions.viewlist);\n\n viewGrid.addEventListener('click', () => {\n contentBank.classList.remove('view-list');\n contentBank.classList.add('view-grid');\n viewGrid.classList.add('active');\n viewList.classList.remove('active');\n setViewListPreference(false);\n });\n\n viewList.addEventListener('click', () => {\n contentBank.classList.remove('view-grid');\n contentBank.classList.add('view-list');\n viewList.classList.add('active');\n viewGrid.classList.remove('active');\n setViewListPreference(true);\n });\n\n // Sort by file name alphabetical\n const sortByName = contentBank.querySelector(selectors.actions.sortname);\n sortByName.addEventListener('click', () => {\n const ascending = updateSortButtons(contentBank, sortByName);\n updateSortOrder(fileArea, shownItems, 'data-file', ascending);\n });\n\n // Sort by date.\n const sortByDate = contentBank.querySelector(selectors.actions.sortdate);\n sortByDate.addEventListener('click', () => {\n const ascending = updateSortButtons(contentBank, sortByDate);\n updateSortOrder(fileArea, shownItems, 'data-timemodified', ascending);\n });\n\n // Sort by size.\n const sortBySize = contentBank.querySelector(selectors.actions.sortsize);\n sortBySize.addEventListener('click', () => {\n const ascending = updateSortButtons(contentBank, sortBySize);\n updateSortOrder(fileArea, shownItems, 'data-bytes', ascending);\n });\n\n // Sort by type\n const sortByType = contentBank.querySelector(selectors.actions.sorttype);\n sortByType.addEventListener('click', () => {\n const ascending = updateSortButtons(contentBank, sortByType);\n updateSortOrder(fileArea, shownItems, 'data-type', ascending);\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 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 } else if (sortButton.classList.contains('dir-asc')) {\n sortButton.classList.remove('dir-asc');\n sortButton.classList.add('dir-desc');\n ascending = false;\n } else if (sortButton.classList.contains('dir-desc')) {\n sortButton.classList.remove('dir-desc');\n sortButton.classList.add('dir-asc');\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","fileArea","filearea","shownItems","querySelectorAll","elements","listitem","viewGrid","actions","viewgrid","viewList","viewlist","addEventListener","classList","remove","add","setViewListPreference","sortByName","sortname","ascending","updateSortButtons","updateSortOrder","sortByDate","sortdate","sortBySize","sortsize","sortByType","sorttype","request","methodname","args","preferences","type","value","Ajax","call","catch","Notification","exception","sortButton","sortbutton","forEach","button","updateButtonTitle","contains","sortString","dataset","string","then","columnName","sortByString","setAttribute","itemList","attribute","slice","sort","a","b","aa","getAttribute","bb","isNaN","parseInt","listItem","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 * @package core_contentbank\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', 'lastmodified', 'size', 'type']);\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 // The search.\n const fileArea = document.querySelector(selectors.regions.filearea);\n const shownItems = fileArea.querySelectorAll(selectors.elements.listitem);\n\n // The view buttons.\n const viewGrid = contentBank.querySelector(selectors.actions.viewgrid);\n const viewList = contentBank.querySelector(selectors.actions.viewlist);\n\n viewGrid.addEventListener('click', () => {\n contentBank.classList.remove('view-list');\n contentBank.classList.add('view-grid');\n viewGrid.classList.add('active');\n viewList.classList.remove('active');\n setViewListPreference(false);\n });\n\n viewList.addEventListener('click', () => {\n contentBank.classList.remove('view-grid');\n contentBank.classList.add('view-list');\n viewList.classList.add('active');\n viewGrid.classList.remove('active');\n setViewListPreference(true);\n });\n\n // Sort by file name alphabetical\n const sortByName = contentBank.querySelector(selectors.actions.sortname);\n sortByName.addEventListener('click', () => {\n const ascending = updateSortButtons(contentBank, sortByName);\n updateSortOrder(fileArea, shownItems, 'data-file', ascending);\n });\n\n // Sort by date.\n const sortByDate = contentBank.querySelector(selectors.actions.sortdate);\n sortByDate.addEventListener('click', () => {\n const ascending = updateSortButtons(contentBank, sortByDate);\n updateSortOrder(fileArea, shownItems, 'data-timemodified', ascending);\n });\n\n // Sort by size.\n const sortBySize = contentBank.querySelector(selectors.actions.sortsize);\n sortBySize.addEventListener('click', () => {\n const ascending = updateSortButtons(contentBank, sortBySize);\n updateSortOrder(fileArea, shownItems, 'data-bytes', ascending);\n });\n\n // Sort by type\n const sortByType = contentBank.querySelector(selectors.actions.sorttype);\n sortByType.addEventListener('click', () => {\n const ascending = updateSortButtons(contentBank, sortByType);\n updateSortOrder(fileArea, shownItems, 'data-type', ascending);\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 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 } else if (sortButton.classList.contains('dir-asc')) {\n sortButton.classList.remove('dir-asc');\n sortButton.classList.add('dir-desc');\n ascending = false;\n } else if (sortButton.classList.contains('dir-desc')) {\n sortButton.classList.remove('dir-desc');\n sortButton.classList.add('dir-asc');\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","fileArea","filearea","shownItems","querySelectorAll","elements","listitem","viewGrid","actions","viewgrid","viewList","viewlist","addEventListener","classList","remove","add","setViewListPreference","sortByName","sortname","ascending","updateSortButtons","updateSortOrder","sortByDate","sortdate","sortBySize","sortsize","sortByType","sorttype","request","methodname","args","preferences","type","value","Ajax","call","catch","Notification","exception","sortButton","sortbutton","forEach","button","updateButtonTitle","contains","sortString","dataset","string","then","columnName","sortByString","setAttribute","itemList","attribute","slice","sort","a","b","aa","getAttribute","bb","isNaN","parseInt","listItem","appendChild"],"mappings":"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"} \ 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 f3348992d56..6e689a3c29d 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 * @package core\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":";;;;;;;;;AAwBAA,OAAM,sBAAC,CAAC,SAAU,YAAa,iBAAkB,oBAAqB,WAAY,WAAY,WACtF,qBAAsB,oBAAqB,iBAAkB,aACjE,SAASC,EAAGC,KAAMC,UAAWC,aAAcC,IAAKC,IAAKC,EAAGC,aAAcC,YAAaC,SAAUC,KACzF,IAAIC,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,WAC1BC,IAAAA,qBAAuBC,EAAEC,OAAOC,OAAOC,uBACvCJ,uBACAV,SAASM,UAAYI,qBAE5B,IAQD,IAAIK,YAAc,SAASC,SACvB,IAAIC,GAIJ,OAHAvB,EAAEe,IAAI,sBAAsB,SAASf,GACjCuB,GAAKvB,EAAEwB,OAAOC,YAAYC,KAAKC,GAAGC,MAAM5B,EAAE6B,KAAKP,QAAQQ,IAAI,IAC9D,IACMP,EACV,EAsBGQ,mBAAqB,SAASC,UAC9BA,SAASC,SAAS5B,oBAClB,IAAI6B,WAAaF,SAASG,KAAK7B,SAASE,YAAYsB,IAAI,GACxD,GAAII,WAAY,CACZ,IAAIE,QAAUnB,EAAES,KAAKW,YAAYrC,EAAGA,EAAE6B,KAAKK,aAE3C,OADAE,QAAQE,OACDF,OACV,CACD,OAAO,IACV,EAyBGG,mBAAqB,SAASC,gBAC1BC,IAAAA,SAAWxB,EAAES,KAAKgB,aAAa1C,EAAGA,EAAE6B,KAAKW,eAAeV,IAAI,KAEhE,OADAW,SAASH,OACFG,QACV,EASGE,cAAgB,SAASrB,QAASc,QAASQ,OAC3CC,OAAOC,YAAW,WACdxB,QAAQyB,YAAY1C,oBAChB+B,SACAA,QAAQY,MAHhB,GAKGJ,MACN,EAQGK,eAAiB,SAASR,SAAUG,OAChCH,UACAI,OAAOC,YAAW,WACdL,SAASO,MADb,GAEGJ,MAEV,EAOGM,eAAiB,SAASC,WAE1BnD,EAAEe,IAAI,4BAA4B,WAC9BE,EAAEC,OAAOkC,WAAWC,gBAAgB,qBAAsB,IAAMF,UACnE,IACGlC,EAAEqC,KAAKC,YAActC,EAAEqC,KAAKC,WAAWC,YACvCvC,EAAEqC,KAAKC,WAAWC,WAAWxD,EAAEyD,IAAI,IAAMN,WAEhD,EAmDGO,WAAa,SAASC,cAAeC,KAAMC,QAC3C,IAUIpB,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,MACX,IAvCqBC,YACzBC,SACAC,SACAC,aAoCQC,gBAvCiBJ,YAuCkBf,cAtC3CgB,SAAWjF,EAAE,aACbkF,UAAW,EACXC,aAAe,KACnBF,SAASI,MAAK,WACNrF,GAAAA,EAAEsF,SAASN,YAAY,GAAIO,MAC3BL,UAAW,OACR,GAAIA,SAEP,OADAC,aAAeI,MACR,CAEd,IACMJ,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,QACtC,IAAIuB,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,OAE7D,CAqDmBC,CAAgB/F,EAAEuF,MAAMlB,KAAK,MAAOD,QACpCgB,eAAiB,KAExB,IAEGA,gBACAA,eAAeU,QAGnB7C,cAAcgB,cAAevB,QAAS,KACtCa,eAAeR,SAAU,KAEzBkB,cAAc+B,QAAQhG,EAAEiG,MAAM,qBAAsB,CAACC,WAAYnB,KAAMX,OAAQA,SAClF,IAAE+B,MAAK,SAASC,IAEbnD,cAAcgB,cAAevB,SAC7Ba,eAAeR,UAEf,IAAIsD,EAAIrG,EAAEiG,MAAM,yBAA0B,CAACK,UAAWF,GAAIhC,OAAQA,SAClEH,cAAc+B,QAAQK,GACjBA,EAAEE,sBACHpG,aAAamG,UAAUF,GAE9B,GACR,EAiCGI,oBAAsB,SAASb,YAAac,WAC5C,IArOyB7E,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,IAClE,IACMsE,MAmOPtG,IAAI2G,WAAW,aAAcJ,aAAa7B,MAAK,SAASkC,YACpD,IAAIC,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,UAChD,GAER,GACJ,EA6BGe,kBAAoB,SAASC,WAAYC,MAAOC,WACjBC,gBAAiBC,WAE5CC,IAAAA,eAAiB,CAAC,CAACV,IAAKO,WAAYI,UAAWH,kBAG5CxH,OAAAA,IAAI+G,YAAYW,gBAAgBE,MAAK,SAASC,SAGjD,OAFAR,WAAWhF,KAAK,yBAAyByF,KAAKD,QAAQ,IAE/C/H,UAAUiI,UAAUT,MAAO,OACrC,IAAEM,MAAK,SAASI,SACbX,WAAWhF,KAAK,SAAS+C,YAAY4C,SACrCX,WAAWpD,KAAK,cAAewD,UAN5B,IAQJQ,MAAMlI,aAAamG,UACzB,EA+DGgC,wBAA0B,SAASC,cACnCvI,EAAE,QAAUuI,aAAe,UAAU9F,KAAK7B,SAASC,YAAYwE,MAAK,WAE5DxD,IAAAA,GAAK7B,EAAEuF,MAAMlB,KAAK,MAEtBrE,EAAEY,SAASC,WAAa,IAAMgB,IAAI2D,YAAY+C,cAE9C/E,eAAe3B,GAClB,GACJ,EAUG2G,YAAc,SAASC,eAAgBC,UAAWvE,OAAQwE,cAC1D,IAAIvE,OAASD,OAAOE,KAAK,eACrBK,cAAgBP,OAAOE,KAAK,sBAAwBF,OAAOE,KAAK,sBAAwB,EACxF3B,QAzVgB,SAASI,gBAC7BA,eAAeP,SAAS5B,oBACxB,IAAI6B,WAAaM,eAAeL,KAAK7B,SAASO,mBAAmBiB,IAAI,GACrE,GAAII,WAAY,CACZ,IAAIE,QAAUnB,EAAES,KAAKW,YAAYrC,EAAGA,EAAE6B,KAAKK,aAE3C,OADAE,QAAQE,OACDF,OACV,CACD,OAAO,IACV,CAgViBkG,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,aACX,IAAI9D,KAAO/E,EAAE8I,UAAUD,aACvB5F,cAAcwF,eAAgB/F,SAC9Ba,eAAeR,UACf0F,eAAehG,KAAK7B,SAASO,mBAAmBsB,KAAK7B,SAASK,QAAQ6E,QAEtE,IAAIO,EAAIrG,EAAEiG,MAAM,sBAAuB,CAACC,WAAYnB,KAAMX,OAAQA,SAClEqE,eAAezC,QAAQK,GAClBA,EAAEE,sBAjFa,SAASkC,eAAgBM,WAAYhE,KAAM4D,cACvE,IAAIvE,OAAS2E,WAAW1E,KAAK,eAC7B,GAAe,SAAXD,QAAgC,SAAXA,OAAmB,CAWxC,GAVe,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,QACL,IAAK,IAAIC,KAAKnE,KAAKkE,QACfX,wBAAwBvD,KAAKkE,QAAQC,SAIXF,IAA9BjE,KAAKoE,sBACLV,eAAehG,KAAK,yBAAyB2G,QAAQ5D,YAAYT,KAAKoE,qBAE7E,MAAM,GAAe,cAAX/E,OAAwB,CAC3BiF,IAAAA,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,eAC/B,KAAqB,iBAAX3E,SACPqE,eAAepF,YAAY,WAC3BmE,kBAAkBuB,WAAY,WAC1B,YAAa,OAAQ,aAEhC,CA8CeQ,CAA0Bd,eAAgBtE,OAAQY,KAAM4D,aAE/D,IAAExC,MAAK,SAASC,IAEbnD,cAAcwF,eAAgB/F,SAC9Ba,eAAeR,UAEf,IAAIsD,EAAIrG,EAAEiG,MAAM,0BAA2B,CAACK,UAAWF,GAAIhC,OAAQA,SACnEqE,eAAezC,QAAQK,GAClBA,EAAEE,sBACHpG,aAAamG,UAAUF,GAE9B,GACR,EAkB+C,OAfhD9F,EAAEe,IAAI,4BAA4B,WAC9BE,EAAEC,OAAOkC,WAAW8F,gBAAgB,CAGhCC,2BAA4B,SAAShF,MAC7BkB,IAAAA,YAAc3F,EAAEyE,KAAK7C,QAAQ8H,cAC7BxF,KAAOvC,YAAYgE,aACvB,GAAIzB,KAAM,CACN,IAAIQ,cAAgBiB,YAAYlD,KAAK,IAAM9B,iBAAiB0D,KAAK,uBAnN7D,SAASsF,gBAAiBzF,KAAMQ,eAChD,IAAIhC,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,KAC3B,IAAEoB,MAAK,WACJlD,cAAc0G,gBAAiBjH,QAClC,GACR,CAsMekH,CAAcjE,YAAazB,KAAMQ,cACpC,CACJ,GAER,IAE+C,CAQ5CmF,eAAgB,SAASlB,cAGrB3I,EAAE,QAAQ8J,GAAG,iBAAkBlJ,SAASC,WAAa,IAC7CD,SAASG,eAAiB,iBAAiB,SAASsF,GACpDA,GAAW,aAAXA,EAAEa,MAAqC,KAAdb,EAAE0D,QAA3B1D,CAGJ,IAAI0C,WAAa/I,EAAEuF,MACftB,cAAgB8E,WAAWpE,QAAQ/D,SAASC,YAC5CuD,OAAS2E,WAAW1E,KAAK,eACzB2F,SAAWrI,YAAYsC,eAC3B,OAAQG,QACJ,IAAK,WACL,IAAK,YACL,IAAK,SACL,IAAK,YACL,IAAK,OACL,IAAK,UACL,IAAK,OACL,IAAK,iBACL,IAAK,gBACL,IAAK,aACD,MACJ,QAEI,OAEH4F,WAGL3D,EAAE4D,iBACa,WAAX7F,OAEAoC,oBAAoBvC,eAAe,WAC/BD,WAAWC,cAAe+F,SAAUjB,WACvC,IAED/E,WAAWC,cAAe+F,SAAUjB,YA/BvC,CAiCJ,IAGD/I,EAAE,QAAQ8J,GAAG,iBAAkBlJ,SAASM,UAAY,IACxCN,SAASO,kBADUP,mCAED,SAASyF,GAC/BA,GAAW,aAAXA,EAAEa,MAAqC,KAAdb,EAAE0D,QAA3B1D,CAGJ,IAlOsB6D,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,aACtD,EAzObvI,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,UACnD,KAqOO+B,YAAYC,eAAgB0B,UAAWpB,WAAYJ,aAXtD,CAaJ,IAGDvI,IAAI2G,WAAW,eAAejC,MAAK,SAASsF,mBACxC,IAAIpE,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,OACX,IAAIC,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,OAEzF,EACDL,MAAMQ,kBAAkBhB,YACxBQ,MAAMS,UAAUxB,GAAGtJ,YAAY+K,OAAO,WAElCT,YAAYhF,QAAQ0F,SAAS1B,GAAG,WAAW,SAASzD,GAC5CA,EAAE0D,UAAYtJ,SAASgL,OACvBT,aAEP,GACJ,IACDH,MAAMS,UAAUxB,GAAGtJ,YAAYkL,MAAM,SAASrF,GAE1CA,EAAE4D,iBACFe,aACH,GACJ,GACJ,GA5GuC,EA4H5CW,yBAA0B,SAAS7I,eAAgB8C,SAAU8B,MAAOC,WAC5BC,gBAAiBC,WACrDnH,IAAIkL,MAAM,iEACV,IAAInE,WAAa3E,eAAeL,KAAK7B,SAASO,kBAAoB,IAAMyE,UACxE4B,kBAAkBC,WAAYC,MAAOC,WAAYC,gBAAiBC,UACrE,EAER"} \ 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 * @package core\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 59ea4130cbd..4903d82ceaa 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 * @package core_course\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 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","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 +{"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 * @package core_course\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 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","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 diff --git a/course/amd/build/copy_modal.min.js.map b/course/amd/build/copy_modal.min.js.map index 0fe8b0aa3e6..88dcc95252b 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 course\n * @package core\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 * @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":";;;;;;;;;;;AA2BAA,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,CAuCD,OA/BA1B,UAAUgD,KAAO,SAASC,SACtBhD,UAAYgD,QA7GZxD,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,IAwFD9B,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 +{"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 course\n * @package core\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 * @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":";;;;;;;;;;;AA2BAA,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,oBAUxBrB,UAAU4C,KAAO,SAASC,SACtBhD,UAAYgD,QA7GZvD,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,sCAyFrC5B,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 diff --git a/course/amd/build/events.min.js.map b/course/amd/build/events.min.js.map index 27aa3ccb88d..a8cba44ffc2 100644 --- a/course/amd/build/events.min.js.map +++ b/course/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 course component can trigger.\n *\n * @module core_course/events\n * @package core_course\n * @copyright 2018 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n favourited: 'core_course:favourited',\n unfavorited: 'core_course:unfavorited',\n };\n});"],"names":["define","favourited","unfavorited"],"mappings":";;;;;;;;AAuBAA,OAAM,qBAAC,IAAI,WACA,MAAA,CACHC,WAAY,yBACZC,YAAa,0BAEpB"} \ 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 course component can trigger.\n *\n * @module core_course/events\n * @package core_course\n * @copyright 2018 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n favourited: 'core_course:favourited',\n unfavorited: 'core_course:unfavorited',\n };\n});"],"names":["define","favourited","unfavorited"],"mappings":";;;;;;;;AAuBAA,4BAAO,IAAI,iBACA,CACHC,WAAY,yBACZC,YAAa"} \ 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 23aa195809b..123f4e032d7 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 * @package core\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.elements.clearsearch);\n const searchIcon = modalBody.querySelector(selectors.elements.searchicon);\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 searchIcon.classList.add('d-none');\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 searchIcon.classList.remove('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","searchIcon","searchResultItemsContainer","firstSearchResultItem","_context5","getBody","searchResults","chooser","elements","clearsearch","searchicon","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","activetab","getAttribute","getSectionChooserOptions","closeOption","on","getModuleSelector","clearSearch","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 +{"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 * @package core\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.elements.clearsearch);\n const searchIcon = modalBody.querySelector(selectors.elements.searchicon);\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 searchIcon.classList.add('d-none');\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 searchIcon.classList.remove('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","elements","clearsearch","searchIcon","searchicon","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","activetab","getAttribute","getSectionChooserOptions","firstChooserOption","closeOption","on","getModuleSelector","clearSearch","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 diff --git a/course/amd/build/local/activitychooser/repository.min.js.map b/course/amd/build/local/activitychooser/repository.min.js.map index 13b2d2070e0..6fe151c7e2d 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 * @package core_course\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":";;;;;;;0KAsBAA,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 +{"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 * @package core_course\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":";;;;;;;uPA+B+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 diff --git a/course/amd/build/local/activitychooser/selectors.min.js.map b/course/amd/build/local/activitychooser/selectors.min.js.map index 4d17257ee0b..65dc2d8327c 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 * @package core_course\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 searchicon: '.input-group-append .search-icon',\n clearsearch: '.input-group-append .clear'\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","searchicon","clearsearch"],"mappings":";;;;;;;;;AA+BMA,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,oCACbC,WAAY,mCACZC,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 * @package core_course\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 searchicon: '.input-group-append .search-icon',\n clearsearch: '.input-group-append .clear'\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","searchicon","clearsearch"],"mappings":";;;;;;;;;IA+BMA,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,oCACbC,WAAY,mCACZC,YAAa"} \ 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 e63786f4a58..efa89fb81af 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":["_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 +{"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 diff --git a/course/amd/build/repository.min.js.map b/course/amd/build/repository.min.js.map index 2570bf63bb0..1e1e97858f5 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 */\ndefine(['jquery', 'core/ajax'], function($, 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 */\n var getEnrolledCoursesByTimelineClassification = function(classification, limit, offset, sort) {\n var 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 var 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 */\n var getLastAccessedCourses = function(userid, limit, offset, sort) {\n var 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 var 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 * @returns {Promise} Promise containing a list of users\n */\n var getEnrolledUsersFromCourseModuleID = function(cmid, groupID) {\n var request = {\n methodname: 'core_course_get_enrolled_users_by_cmid',\n args: {\n cmid: cmid,\n groupid: groupID,\n },\n };\n\n return Ajax.call([request])[0];\n };\n\n return {\n getEnrolledCoursesByTimelineClassification: getEnrolledCoursesByTimelineClassification,\n getLastAccessedCourses: getLastAccessedCourses,\n getUsersFromCourseModuleID: getEnrolledUsersFromCourseModuleID,\n };\n});\n"],"names":["define","$","Ajax","getEnrolledCoursesByTimelineClassification","classification","limit","offset","sort","args","request","methodname","call","getLastAccessedCourses","userid","getUsersFromCourseModuleID","cmid","groupID","groupid"],"mappings":";;;;;;;AAsBAA,OAAM,yBAAC,CAAC,SAAU,cAAc,SAASC,EAAGC,MA6FjC,MAAA,CACHC,2CAlF6C,SAASC,eAAgBC,MAAOC,OAAQC,MACrF,IAAIC,KAAO,CACPJ,eAAgBA,qBAGC,IAAVC,QACPG,KAAKH,MAAQA,YAGK,IAAXC,SACPE,KAAKF,OAASA,aAGE,IAATC,OACPC,KAAKD,KAAOA,MAGhB,IAAIE,QAAU,CACVC,WAAY,8DACZF,KAAMA,MAGHN,OAAAA,KAAKS,KAAK,CAACF,UAAU,EAC/B,EA4DGG,uBAhDyB,SAASC,OAAQR,MAAOC,OAAQC,MACrDC,IAAAA,KAAO,CAAA,OAEW,IAAXK,SACPL,KAAKK,OAASA,aAGG,IAAVR,QACPG,KAAKH,MAAQA,YAGK,IAAXC,SACPE,KAAKF,OAASA,aAGE,IAATC,OACPC,KAAKD,KAAOA,MAGhB,IAAIE,QAAU,CACVC,WAAY,iCACZF,KAAMA,MAGHN,OAAAA,KAAKS,KAAK,CAACF,UAAU,EAC/B,EAwBGK,2BAfqC,SAASC,KAAMC,SACpD,IAAIP,QAAU,CACVC,WAAY,yCACZF,KAAM,CACFO,KAAMA,KACNE,QAASD,UAIVd,OAAAA,KAAKS,KAAK,CAACF,UAAU,EAC/B,EAOJ"} \ 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 */\ndefine(['jquery', 'core/ajax'], function($, 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 */\n var getEnrolledCoursesByTimelineClassification = function(classification, limit, offset, sort) {\n var 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 var 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 */\n var getLastAccessedCourses = function(userid, limit, offset, sort) {\n var 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 var 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 * @returns {Promise} Promise containing a list of users\n */\n var getEnrolledUsersFromCourseModuleID = function(cmid, groupID) {\n var request = {\n methodname: 'core_course_get_enrolled_users_by_cmid',\n args: {\n cmid: cmid,\n groupid: groupID,\n },\n };\n\n return Ajax.call([request])[0];\n };\n\n return {\n getEnrolledCoursesByTimelineClassification: getEnrolledCoursesByTimelineClassification,\n getLastAccessedCourses: getLastAccessedCourses,\n getUsersFromCourseModuleID: getEnrolledUsersFromCourseModuleID,\n };\n});\n"],"names":["define","$","Ajax","getEnrolledCoursesByTimelineClassification","classification","limit","offset","sort","args","request","methodname","call","getLastAccessedCourses","userid","getUsersFromCourseModuleID","cmid","groupID","groupid"],"mappings":";;;;;;;AAsBAA,gCAAO,CAAC,SAAU,cAAc,SAASC,EAAGC,YA6FjC,CACHC,2CAlF6C,SAASC,eAAgBC,MAAOC,OAAQC,UACjFC,KAAO,CACPJ,eAAgBA,qBAGC,IAAVC,QACPG,KAAKH,MAAQA,YAGK,IAAXC,SACPE,KAAKF,OAASA,aAGE,IAATC,OACPC,KAAKD,KAAOA,UAGZE,QAAU,CACVC,WAAY,8DACZF,KAAMA,aAGHN,KAAKS,KAAK,CAACF,UAAU,IA6D5BG,uBAhDyB,SAASC,OAAQR,MAAOC,OAAQC,UACrDC,KAAO,QAEW,IAAXK,SACPL,KAAKK,OAASA,aAGG,IAAVR,QACPG,KAAKH,MAAQA,YAGK,IAAXC,SACPE,KAAKF,OAASA,aAGE,IAATC,OACPC,KAAKD,KAAOA,UAGZE,QAAU,CACVC,WAAY,iCACZF,KAAMA,aAGHN,KAAKS,KAAK,CAACF,UAAU,IAyB5BK,2BAfqC,SAASC,KAAMC,aAChDP,QAAU,CACVC,WAAY,yCACZF,KAAM,CACFO,KAAMA,KACNE,QAASD,iBAIVd,KAAKS,KAAK,CAACF,UAAU"} \ 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 fbaa4f0ca32..f086709ab74 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 * This module depends on the real jquery - and returns the non-global version of it.\n *\n * @module core_customfield/form\n * @package core_customfield\n * @copyright 2018 Toni Barbera\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/ajax',\n 'core/templates',\n 'core/sortable_list',\n 'core/pending',\n 'core/inplace_editable',\n], function($, Str, Notification, Ajax, Templates, SortableList, Pending) {\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 */\n var confirmDelete = function(id, type, component, area, itemid) {\n var pendingPromise = new Pending('core_customfield/form:confirmDelete');\n Str.get_strings([\n {'key': 'confirm'},\n {'key': 'confirmdelete' + type, component: 'core_customfield'},\n {'key': 'yes'},\n {'key': 'no'},\n ])\n .then(function(s) {\n Notification.confirm(s[0], s[1], s[2], s[3], function() {\n var pendingDeletePromise = new Pending('core_customfield/form:confirmDelete');\n var func = (type === 'field') ? 'core_customfield_delete_field' : 'core_customfield_delete_category';\n Ajax.call([\n {methodname: func, args: {id: id}},\n {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n ])[1]\n .then(function(response) {\n return Templates.render('core_customfield/list', response);\n })\n .then(function(html, js) {\n Templates.replaceNode($('[data-region=\"list-page\"]'), html, js);\n return null;\n })\n .then(pendingDeletePromise.resolve)\n .catch(Notification.exception);\n });\n\n return;\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\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 */\n var createNewCategory = function(component, area, itemid) {\n var pendingPromise = new Pending('core_customfield/form:confirmDelete');\n var promises = Ajax.call([\n {methodname: 'core_customfield_create_category', args: {component: component, area: area, itemid: itemid}},\n {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n ]);\n var categoryid;\n\n promises[0].then(function(response) {\n categoryid = response;\n return null;\n }).catch(Notification.exception);\n\n promises[1].then(function(response) {\n return Templates.render('core_customfield/list', response);\n })\n .then(function(html, js) {\n Templates.replaceNode($('[data-region=\"list-page\"]'), html, js);\n window.location.href = '#category-' + categoryid;\n return null;\n })\n .catch(Notification.exception);\n\n Promise.all(promises)\n .then(pendingPromise.resolve)\n .catch();\n };\n\n return {\n /**\n * Initialise the custom fields manager\n */\n init: function() {\n var mainlist = $('#customfield_catlist');\n var component = mainlist.attr('data-component');\n var area = mainlist.attr('data-area');\n var itemid = mainlist.attr('data-itemid');\n\n $(\"[data-role=deletefield]\").on('click', function(e) {\n confirmDelete($(this).attr('data-id'), 'field', component, area, itemid);\n e.preventDefault();\n });\n\n $(\"[data-role=deletecategory]\").on('click', function(e) {\n confirmDelete($(this).attr('data-id'), 'category', component, area, itemid);\n e.preventDefault();\n });\n\n $('[data-role=addnewcategory]').on('click', function() {\n createNewCategory(component, area, itemid);\n });\n\n var categoryName = function(element) {\n return element\n .closest('[data-category-id]')\n .find('[data-inplaceeditable][data-itemtype=category][data-component=core_customfield]')\n .attr('data-value');\n };\n\n // Sort category.\n var sortCat = new SortableList(\n $('#customfield_catlist .categorieslist'),\n {moveHandlerSelector: '.movecategory [data-drag-type=move]'}\n );\n\n sortCat.getElementName = function(el) {\n return $.Deferred().resolve(categoryName(el));\n };\n\n $('[data-category-id]').on('sortablelist-drop', function(evt, info) {\n if (info.positionChanged) {\n var pendingPromise = new Pending('core_customfield/form:categoryid:on:sortablelist-drop');\n Ajax.call([\n {\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 },\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 {moveHandlerSelector: '.movefield [data-drag-type=move]'}\n );\n\n sort.getDestinationName = function(parentElement, afterElement) {\n if (!afterElement.length) {\n return Str.get_string('totopofcategory', 'customfield', categoryName(parentElement));\n } else if (afterElement.attr('data-field-name')) {\n return Str.get_string('afterfield', 'customfield', afterElement.attr('data-field-name'));\n } else {\n return $.Deferred().resolve('');\n }\n };\n\n $('[data-field-name]').on('sortablelist-drop', function(evt, info) {\n evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n if (info.positionChanged) {\n var pendingPromise = new Pending('core_customfield/form:fieldname:on:sortablelist-drop');\n Ajax.call([\n {\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 },\n ])[0]\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n }\n });\n\n $('[data-field-name]').on('sortablelist-drag', function(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 Str.get_string('therearenofields', 'core_customfield').then(function(s) {\n $('#customfield_catlist .categorieslist').children().each(function() {\n var fields = $(this).find($('.field')),\n nofields = $(this).find($('.nofields'));\n if (!fields.length && !nofields.length) {\n $(this).find('tbody').append(\n '' + s + ''\n );\n }\n if (fields.length && nofields.length) {\n nofields.remove();\n }\n });\n return null;\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n });\n\n $('[data-category-id], [data-field-name]').on('sortablelist-dragstart',\n function(evt, info) {\n setTimeout(function() {\n $('.sortable-list-is-dragged').width(info.element.width());\n }, 501);\n }\n );\n\n }\n };\n});\n"],"names":["define","$","Str","Notification","Ajax","Templates","SortableList","Pending","confirmDelete","id","type","component","area","itemid","pendingPromise","get_strings","key","then","s","confirm","pendingDeletePromise","func","call","methodname","args","response","render","html","js","replaceNode","resolve","catch","exception","init","mainlist","attr","on","e","this","preventDefault","categoryid","promises","window","location","href","Promise","all","createNewCategory","categoryName","element","closest","find","moveHandlerSelector","getElementName","el","Deferred","evt","info","positionChanged","data","beforeid","targetNextElement","stopPropagation","getDestinationName","parentElement","afterElement","length","get_string","Number","targetList","children","each","fields","nofields","append","remove","setTimeout","width"],"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 * This module depends on the real jquery - and returns the non-global version of it.\n *\n * @module core_customfield/form\n * @package core_customfield\n * @copyright 2018 Toni Barbera\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/ajax',\n 'core/templates',\n 'core/sortable_list',\n 'core/pending',\n 'core/inplace_editable',\n], function($, Str, Notification, Ajax, Templates, SortableList, Pending) {\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 */\n var confirmDelete = function(id, type, component, area, itemid) {\n var pendingPromise = new Pending('core_customfield/form:confirmDelete');\n Str.get_strings([\n {'key': 'confirm'},\n {'key': 'confirmdelete' + type, component: 'core_customfield'},\n {'key': 'yes'},\n {'key': 'no'},\n ])\n .then(function(s) {\n Notification.confirm(s[0], s[1], s[2], s[3], function() {\n var pendingDeletePromise = new Pending('core_customfield/form:confirmDelete');\n var func = (type === 'field') ? 'core_customfield_delete_field' : 'core_customfield_delete_category';\n Ajax.call([\n {methodname: func, args: {id: id}},\n {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n ])[1]\n .then(function(response) {\n return Templates.render('core_customfield/list', response);\n })\n .then(function(html, js) {\n Templates.replaceNode($('[data-region=\"list-page\"]'), html, js);\n return null;\n })\n .then(pendingDeletePromise.resolve)\n .catch(Notification.exception);\n });\n\n return;\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\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 */\n var createNewCategory = function(component, area, itemid) {\n var pendingPromise = new Pending('core_customfield/form:confirmDelete');\n var promises = Ajax.call([\n {methodname: 'core_customfield_create_category', args: {component: component, area: area, itemid: itemid}},\n {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n ]);\n var categoryid;\n\n promises[0].then(function(response) {\n categoryid = response;\n return null;\n }).catch(Notification.exception);\n\n promises[1].then(function(response) {\n return Templates.render('core_customfield/list', response);\n })\n .then(function(html, js) {\n Templates.replaceNode($('[data-region=\"list-page\"]'), html, js);\n window.location.href = '#category-' + categoryid;\n return null;\n })\n .catch(Notification.exception);\n\n Promise.all(promises)\n .then(pendingPromise.resolve)\n .catch();\n };\n\n return {\n /**\n * Initialise the custom fields manager\n */\n init: function() {\n var mainlist = $('#customfield_catlist');\n var component = mainlist.attr('data-component');\n var area = mainlist.attr('data-area');\n var itemid = mainlist.attr('data-itemid');\n\n $(\"[data-role=deletefield]\").on('click', function(e) {\n confirmDelete($(this).attr('data-id'), 'field', component, area, itemid);\n e.preventDefault();\n });\n\n $(\"[data-role=deletecategory]\").on('click', function(e) {\n confirmDelete($(this).attr('data-id'), 'category', component, area, itemid);\n e.preventDefault();\n });\n\n $('[data-role=addnewcategory]').on('click', function() {\n createNewCategory(component, area, itemid);\n });\n\n var categoryName = function(element) {\n return element\n .closest('[data-category-id]')\n .find('[data-inplaceeditable][data-itemtype=category][data-component=core_customfield]')\n .attr('data-value');\n };\n\n // Sort category.\n var sortCat = new SortableList(\n $('#customfield_catlist .categorieslist'),\n {moveHandlerSelector: '.movecategory [data-drag-type=move]'}\n );\n\n sortCat.getElementName = function(el) {\n return $.Deferred().resolve(categoryName(el));\n };\n\n $('[data-category-id]').on('sortablelist-drop', function(evt, info) {\n if (info.positionChanged) {\n var pendingPromise = new Pending('core_customfield/form:categoryid:on:sortablelist-drop');\n Ajax.call([\n {\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 },\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 {moveHandlerSelector: '.movefield [data-drag-type=move]'}\n );\n\n sort.getDestinationName = function(parentElement, afterElement) {\n if (!afterElement.length) {\n return Str.get_string('totopofcategory', 'customfield', categoryName(parentElement));\n } else if (afterElement.attr('data-field-name')) {\n return Str.get_string('afterfield', 'customfield', afterElement.attr('data-field-name'));\n } else {\n return $.Deferred().resolve('');\n }\n };\n\n $('[data-field-name]').on('sortablelist-drop', function(evt, info) {\n evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n if (info.positionChanged) {\n var pendingPromise = new Pending('core_customfield/form:fieldname:on:sortablelist-drop');\n Ajax.call([\n {\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 },\n ])[0]\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n }\n });\n\n $('[data-field-name]').on('sortablelist-drag', function(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 Str.get_string('therearenofields', 'core_customfield').then(function(s) {\n $('#customfield_catlist .categorieslist').children().each(function() {\n var fields = $(this).find($('.field')),\n nofields = $(this).find($('.nofields'));\n if (!fields.length && !nofields.length) {\n $(this).find('tbody').append(\n '' + s + ''\n );\n }\n if (fields.length && nofields.length) {\n nofields.remove();\n }\n });\n return null;\n })\n .then(pendingPromise.resolve)\n .catch(Notification.exception);\n });\n\n $('[data-category-id], [data-field-name]').on('sortablelist-dragstart',\n function(evt, info) {\n setTimeout(function() {\n $('.sortable-list-is-dragged').width(info.element.width());\n }, 501);\n }\n );\n\n }\n };\n});\n"],"names":["define","$","Str","Notification","Ajax","Templates","SortableList","Pending","confirmDelete","id","type","component","area","itemid","pendingPromise","get_strings","then","s","confirm","pendingDeletePromise","func","call","methodname","args","response","render","html","js","replaceNode","resolve","catch","exception","init","mainlist","attr","on","e","this","preventDefault","categoryid","promises","window","location","href","Promise","all","createNewCategory","categoryName","element","closest","find","moveHandlerSelector","getElementName","el","Deferred","evt","info","positionChanged","data","beforeid","targetNextElement","stopPropagation","getDestinationName","parentElement","afterElement","length","get_string","Number","targetList","children","each","fields","nofields","append","remove","setTimeout","width"],"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 d4607ee53b8..e739acce569 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 * @class form-potential-user-selector\n * @package enrol_manual\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 $.each(results, function(index, user) {\n var ctx = user,\n identity = [];\n $.each(userfields, 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('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","ctx","identity","k","hasidentity","join","render","when","apply","arguments","get_string","toomanyuserstoshow","fail"],"mappings":";;;;;;;;;AAyBAA,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,OAAI/B,QAAQgC,QAAUZ,SAElB1B,EAAES,KAAKH,SAAS,SAASI,MAAOC,MACxB4B,IAAAA,IAAM5B,KACN6B,SAAW,GACfxC,EAAES,KAAKc,YAAY,SAASc,EAAGI,QACJ,IAAZ9B,KAAK8B,IAAkC,KAAZ9B,KAAK8B,KACvCF,IAAIG,aAAc,EAClBF,SAAS5B,KAAKD,KAAK8B,IAE1B,IACDF,IAAIC,SAAWA,SAASG,KAAK,MAC7BP,SAASxB,KAAKV,UAAU0C,OAAO,6CAA8CL,KAChF,IAGMvC,EAAE6C,KAAKC,MAAM9C,EAAE6C,KAAMT,UAAUD,MAAK,WACnCJ,IAAAA,KAAOgB,UACX/C,EAAES,KAAKH,SAAS,SAASI,MAAOC,MAC5BA,KAAKK,OAASe,KAAKM,GACnBA,GACH,IACDlB,QAAQb,QAEX,KAGMH,IAAI6C,WAAW,qBAAsB,OAAQ,IAAMtB,SAASS,MAAK,SAASc,oBAC7E9B,QAAQ8B,mBAEX,GAGR,IAAEC,KAAK9B,QACX,EAIR"} \ 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 * @class form-potential-user-selector\n * @package enrol_manual\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 $.each(results, function(index, user) {\n var ctx = user,\n identity = [];\n $.each(userfields, 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('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","ctx","identity","k","hasidentity","join","render","when","apply","arguments","get_string","toomanyuserstoshow","fail"],"mappings":";;;;;;;;;AAyBAA,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,SAEJ/B,QAAQgC,QAAUZ,SAElB1B,EAAES,KAAKH,SAAS,SAASI,MAAOC,UACxB4B,IAAM5B,KACN6B,SAAW,GACfxC,EAAES,KAAKc,YAAY,SAASc,EAAGI,QACJ,IAAZ9B,KAAK8B,IAAkC,KAAZ9B,KAAK8B,KACvCF,IAAIG,aAAc,EAClBF,SAAS5B,KAAKD,KAAK8B,QAG3BF,IAAIC,SAAWA,SAASG,KAAK,MAC7BP,SAASxB,KAAKV,UAAU0C,OAAO,6CAA8CL,SAI1EvC,EAAE6C,KAAKC,MAAM9C,EAAE6C,KAAMT,UAAUD,MAAK,eACnCJ,KAAOgB,UACX/C,EAAES,KAAKH,SAAS,SAASI,MAAOC,MAC5BA,KAAKK,OAASe,KAAKM,GACnBA,OAEJlB,QAAQb,aAKLH,IAAI6C,WAAW,qBAAsB,OAAQ,IAAMtB,SAASS,MAAK,SAASc,oBAC7E9B,QAAQ8B,0BAKjBC,KAAK9B"} \ 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 8947d1150ec..b6232cd7c34 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":["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 +{"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 diff --git a/grade/amd/build/edittree_index.min.js.map b/grade/amd/build/edittree_index.min.js.map index 5ba9967ea3a..19d41a42d6c 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 * @package core_grades\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":";;;;;;;;AAuBAA,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 +{"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 * @package core_grades\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":";;;;;;;;AAuBAA,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 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 091456341cc..1492efab4df 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 * @package core_grades\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":";;;;;;;;;AAwBO,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 +{"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 * @package core_grades\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":";;;;;;;;;IAwBaA,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 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 702956fde02..a32e6015549 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 * @package core_grades\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":"wPA8B+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 +{"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 * @package core_grades\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":"wPA8B+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 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 952aa90fa5f..e1a133544ae 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 * @package core_grades\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 {String} component\n * @param {Number} context\n * @param {String} itemname\n * @param {Number} userId\n * @param {Element} rootNode\n * @return {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 *\n * @return {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":"mjBA2BAA,aAAAA,sEAaiC,WAAa,OAAA,EAAAC,YAAAC,YAAW,SAAxBC,WAAA,EAAAC,UAAA,EAc1B,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 +{"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 * @package core_grades\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 {String} component\n * @param {Number} context\n * @param {String} itemname\n * @param {Number} userId\n * @param {Element} rootNode\n * @return {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 *\n * @return {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,8CAc5CA,+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 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 0f01cdab565..53772419dd8 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 * @package core_grades\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":"2dA0B0B,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 +{"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 * @package core_grades\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":"2dA0B0B,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 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 8c15733e765..468a528b1b5 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 * @package core_grades\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":";;;;;;;;0HA2BAA,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 +{"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 * @package core_grades\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":";;;;;;;;6MA8BiC,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 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 ba400b3a26e..e2692446ef5 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 * @class comment_chooser\n * @package core\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":";;;;;;;;;AAwBAA,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 +{"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 * @class comment_chooser\n * @package core\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":";;;;;;;;;AAwBAA,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 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 a78e48bd1fd..723dce2e82a 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 * @package gradingform_guide\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":"+kBA6BAA,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 +{"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 * @package gradingform_guide\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":"kqBAyCiC,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 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 7ba99d06b2a..e7ed79e0cdb 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 * @package gradingform_guide\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":";;;;;;;;kFAwBAA,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 +{"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 * @package gradingform_guide\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":";;;;;;;;8JA+BoB,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 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 51c805020e3..39fd3936057 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 * @package gradingform_rubric\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":"glBA6BAA,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 +{"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 * @package gradingform_rubric\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":"mqBAyCiC,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 diff --git a/h5p/amd/build/editor_display.min.js.map b/h5p/amd/build/editor_display.min.js.map index 50af52c6b72..ef5e45d5601 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 * @package core_h5p\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":";;;;;;;;kFAwBAA,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 +{"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 * @package core_h5p\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":";;;;;;;;wJAgCoB,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 diff --git a/lib/amd/build/adapter.min.js b/lib/amd/build/adapter.min.js index 7726182ae96..39d74d71d1e 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){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.getIceParameters=function(mediaSection,sessionpart){var lines=SDPUtils.splitLines(mediaSection);return{usernameFragment:(lines=lines.concat(SDPUtils.splitLines(sessionpart))).filter((function(line){return 0===line.indexOf("a=ice-ufrag:")}))[0].substr(12),password:lines.filter((function(line){return 0===line.indexOf("a=ice-pwd:")}))[0].substr(10)}},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){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.getIceParameters=function(mediaSection,sessionpart){var lines=SDPUtils.splitLines(mediaSection);return{usernameFragment:(lines=lines.concat(SDPUtils.splitLines(sessionpart))).filter((function(line){return 0===line.indexOf("a=ice-ufrag:")}))[0].substr(12),password:lines.filter((function(line){return 0===line.indexOf("a=ice-pwd:")}))[0].substr(10)}},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// 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 lines = SDPUtils.splitLines(mediaSection);\n // Search in session part, too.\n lines = lines.concat(SDPUtils.splitLines(sessionpart));\n var iceParameters = {\n usernameFragment: lines.filter(function(line) {\n return line.indexOf('a=ice-ufrag:') === 0;\n })[0].substr(12),\n password: lines.filter(function(line) {\n return line.indexOf('a=ice-pwd:') === 0;\n })[0].substr(10)\n };\n return iceParameters;\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","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 +{"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// 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 lines = SDPUtils.splitLines(mediaSection);\n // Search in session part, too.\n lines = lines.concat(SDPUtils.splitLines(sessionpart));\n var iceParameters = {\n usernameFragment: lines.filter(function(line) {\n return line.indexOf('a=ice-ufrag:') === 0;\n })[0].substr(12),\n password: lines.filter(function(line) {\n return line.indexOf('a=ice-pwd:') === 0;\n })[0].substr(10)\n };\n return iceParameters;\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","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 diff --git a/lib/amd/build/addblockmodal.min.js.map b/lib/amd/build/addblockmodal.min.js.map index fa69010daec..468a476145f 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 * @class addblockmodal\n * @package core\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/modal_factory', 'core/templates', 'core/str', 'core/notification'],\n function($, ModalFactory, Templates, Str, Notification) {\n\n\n return /** @alias module:core/addblockmodal */ {\n /**\n * Global init function for this module.\n *\n * @method init\n * @param {Object} context The template context for rendering this modal body.\n */\n init: function(context) {\n var addblocklink = $('[data-key=addblock]');\n\n // We need the fetch the names of the blocks. It was too much to send in the page.\n var titlerequests = context.blocks.map(function(blockName) {\n return {\n key: 'pluginname',\n component: 'block_' + blockName,\n };\n });\n\n var bodyPromise = Str.get_strings(titlerequests)\n .then(function(titles) {\n return titles.map(function(title, index) {\n return {\n name: context.blocks[index],\n title: title,\n };\n });\n })\n .then(function(blocks) {\n context.blocks = blocks;\n return Templates.render('core/add_block_body', context);\n })\n .fail(Notification.exception);\n\n var titlePromise = Str.get_string('addblock')\n .fail(Notification.exception);\n\n ModalFactory.create({\n title: titlePromise,\n body: bodyPromise,\n type: 'CANCEL',\n }, addblocklink);\n }\n };\n});\n"],"names":["define","$","ModalFactory","Templates","Str","Notification","init","context","addblocklink","titlerequests","blocks","map","blockName","key","component","bodyPromise","get_strings","then","titles","title","index","name","render","fail","exception","titlePromise","get_string","create","body","type"],"mappings":";;;;;;;;;AAwBAA,OAAM,qBAAC,CAAC,SAAU,qBAAsB,iBAAkB,WAAY,sBAC/D,SAASC,EAAGC,aAAcC,UAAWC,IAAKC,cAGE,MAAA,CAO3CC,KAAM,SAASC,SACX,IAAIC,aAAeP,EAAE,uBAGjBQ,cAAgBF,QAAQG,OAAOC,KAAI,SAASC,WACrC,MAAA,CACHC,IAAK,aACLC,UAAW,SAAWF,UAE7B,IAEGG,YAAcX,IAAIY,YAAYP,eACjCQ,MAAK,SAASC,QACJA,OAAAA,OAAOP,KAAI,SAASQ,MAAOC,OACvB,MAAA,CACHC,KAAMd,QAAQG,OAAOU,OACrBD,MAAOA,MAEd,GACJ,IACAF,MAAK,SAASP,QAEX,OADAH,QAAQG,OAASA,OACVP,UAAUmB,OAAO,sBAAuBf,QAXjC,IAajBgB,KAAKlB,aAAamB,WAEfC,aAAerB,IAAIsB,WAAW,YACjCH,KAAKlB,aAAamB,WAEnBtB,aAAayB,OAAO,CAChBR,MAAOM,aACPG,KAAMb,YACNc,KAAM,UACPrB,aACN,EAER"} \ 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 * @class addblockmodal\n * @package core\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/modal_factory', 'core/templates', 'core/str', 'core/notification'],\n function($, ModalFactory, Templates, Str, Notification) {\n\n\n return /** @alias module:core/addblockmodal */ {\n /**\n * Global init function for this module.\n *\n * @method init\n * @param {Object} context The template context for rendering this modal body.\n */\n init: function(context) {\n var addblocklink = $('[data-key=addblock]');\n\n // We need the fetch the names of the blocks. It was too much to send in the page.\n var titlerequests = context.blocks.map(function(blockName) {\n return {\n key: 'pluginname',\n component: 'block_' + blockName,\n };\n });\n\n var bodyPromise = Str.get_strings(titlerequests)\n .then(function(titles) {\n return titles.map(function(title, index) {\n return {\n name: context.blocks[index],\n title: title,\n };\n });\n })\n .then(function(blocks) {\n context.blocks = blocks;\n return Templates.render('core/add_block_body', context);\n })\n .fail(Notification.exception);\n\n var titlePromise = Str.get_string('addblock')\n .fail(Notification.exception);\n\n ModalFactory.create({\n title: titlePromise,\n body: bodyPromise,\n type: 'CANCEL',\n }, addblocklink);\n }\n };\n});\n"],"names":["define","$","ModalFactory","Templates","Str","Notification","init","context","addblocklink","titlerequests","blocks","map","blockName","key","component","bodyPromise","get_strings","then","titles","title","index","name","render","fail","exception","titlePromise","get_string","create","body","type"],"mappings":";;;;;;;;;AAwBAA,4BAAO,CAAC,SAAU,qBAAsB,iBAAkB,WAAY,sBAC/D,SAASC,EAAGC,aAAcC,UAAWC,IAAKC,oBAGE,CAO3CC,KAAM,SAASC,aACPC,aAAeP,EAAE,uBAGjBQ,cAAgBF,QAAQG,OAAOC,KAAI,SAASC,iBACrC,CACHC,IAAK,aACLC,UAAW,SAAWF,cAI1BG,YAAcX,IAAIY,YAAYP,eACjCQ,MAAK,SAASC,eACJA,OAAOP,KAAI,SAASQ,MAAOC,aACvB,CACHC,KAAMd,QAAQG,OAAOU,OACrBD,MAAOA,aAIlBF,MAAK,SAASP,eACXH,QAAQG,OAASA,OACVP,UAAUmB,OAAO,sBAAuBf,YAElDgB,KAAKlB,aAAamB,WAEfC,aAAerB,IAAIsB,WAAW,YACjCH,KAAKlB,aAAamB,WAEnBtB,aAAayB,OAAO,CAChBR,MAAOM,aACPG,KAAMb,YACNc,KAAM,UACPrB"} \ 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 de8aef53d13..22864cf59ec 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 * @class ajax\n * @package core\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 // 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 {Object[]} 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 Optional, defaults to true.\n * If false - this function will not return until the promises are resolved.\n * @param {Boolean} loginrequired Optional, defaults to true.\n * If false - this function will call the faster nologin ajax script - but\n * will fail unless all functions have been marked as 'loginrequired' => false\n * in services.php\n * @param {Boolean} nosessionupdate Optional, defaults to false.\n * If true, the timemodified for the session will not be updated.\n * @param {Integer} timeout number of milliseconds to wait for a response. Defaults to no limit.\n * @param {Integer} cachekey This is used in order to identify the request. If this id changes then we\n * will be sending a different URL and any caching (eg. browser, proxy) knows that it\n * should perform another request and not use the cache. Note - this variable is only\n * used when we are calling 'service-nologin.php'. See MDL-65794.\n * @return {Promise[]} Array of promises that will be resolved when the ajax call returns.\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 +{"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 * @class ajax\n * @package core\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 // 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 {Object[]} 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 Optional, defaults to true.\n * If false - this function will not return until the promises are resolved.\n * @param {Boolean} loginrequired Optional, defaults to true.\n * If false - this function will call the faster nologin ajax script - but\n * will fail unless all functions have been marked as 'loginrequired' => false\n * in services.php\n * @param {Boolean} nosessionupdate Optional, defaults to false.\n * If true, the timemodified for the session will not be updated.\n * @param {Integer} timeout number of milliseconds to wait for a response. Defaults to no limit.\n * @param {Integer} cachekey This is used in order to identify the request. If this id changes then we\n * will be sending a different URL and any caching (eg. browser, proxy) knows that it\n * should perform another request and not use the cache. Note - this variable is only\n * used when we are calling 'service-nologin.php'. See MDL-65794.\n * @return {Promise[]} Array of promises that will be resolved when the ajax call returns.\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":"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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 14eb26f044c..1c8014aa9a2 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 * @class auto_rows\n * @package core\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":";;;;;;;;;;AAyBAA,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 +{"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 * @class auto_rows\n * @package core\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":";;;;;;;;;;AAyBAA,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 diff --git a/lib/amd/build/autoscroll.min.js.map b/lib/amd/build/autoscroll.min.js.map index 399477baac2..4c331e36c4c 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 * @class autoscroll\n * @package core\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":";;;;;;;;;;;;;;;AA8BAA,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 +{"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 * @class autoscroll\n * @package core\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":";;;;;;;;;;;;;;;AA8BAA,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 diff --git a/lib/amd/build/backoff_timer.min.js.map b/lib/amd/build/backoff_timer.min.js.map index 670af713ab4..efaa90087e0 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 * @class backoff_timer\n * @package core\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 * @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 * @type {function} callback The function to execute after each tick\n */\n BackoffTimer.prototype.callback = null;\n\n /**\n * @type {function} backoffFunction The function to determine what the next timeout value should be\n */\n BackoffTimer.prototype.backOffFunction = null;\n\n /**\n * @type {int} time The timeout value to use\n */\n BackoffTimer.prototype.time = null;\n\n /**\n * @type {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 * @method generateNextTime\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 * @method reset\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 * @method stop\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 * @method start\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 * @method restart\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":";;;;;;;;;;AAyBAA,6BAAO,WAQCC,IAAAA,aAAe,SAASC,SAAUC,iBAC7BD,KAAAA,SAAWA,SACXE,KAAAA,gBAAkBD,eAC1B,EAyID,OApIAF,aAAaI,UAAUH,SAAW,KAKlCD,aAAaI,UAAUD,gBAAkB,KAKzCH,aAAaI,UAAUC,KAAO,KAK9BL,aAAaI,UAAUE,QAAU,KAYjCN,aAAaI,UAAUG,iBAAmB,WACtC,IAAIC,QAAUC,KAAKN,gBAAgBM,KAAKJ,MAGxC,OAFKA,KAAAA,KAAOG,QAELA,OACV,EAQDR,aAAaI,UAAUM,MAAQ,WAI3B,OAHKL,KAAAA,KAAO,KACZI,KAAKE,OAEEF,IACV,EAQDT,aAAaI,UAAUO,KAAO,WAM1B,OALIF,KAAKH,UACLM,OAAOC,aAAaJ,KAAKH,SACpBA,KAAAA,QAAU,MAGZG,IACV,EAcDT,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,EASDT,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 +{"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 * @class backoff_timer\n * @package core\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 * @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 * @type {function} callback The function to execute after each tick\n */\n BackoffTimer.prototype.callback = null;\n\n /**\n * @type {function} backoffFunction The function to determine what the next timeout value should be\n */\n BackoffTimer.prototype.backOffFunction = null;\n\n /**\n * @type {int} time The timeout value to use\n */\n BackoffTimer.prototype.time = null;\n\n /**\n * @type {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 * @method generateNextTime\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 * @method reset\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 * @method stop\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 * @method start\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 * @method restart\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":";;;;;;;;;;AAyBAA,6BAAO,eAQCC,aAAe,SAASC,SAAUC,sBAC7BD,SAAWA,cACXE,gBAAkBD,wBAM3BF,aAAaI,UAAUH,SAAW,KAKlCD,aAAaI,UAAUD,gBAAkB,KAKzCH,aAAaI,UAAUC,KAAO,KAK9BL,aAAaI,UAAUE,QAAU,KAYjCN,aAAaI,UAAUG,iBAAmB,eAClCC,QAAUC,KAAKN,gBAAgBM,KAAKJ,kBACnCA,KAAOG,QAELA,SASXR,aAAaI,UAAUM,MAAQ,uBACtBL,KAAO,UACPM,OAEEF,MASXT,aAAaI,UAAUO,KAAO,kBACtBF,KAAKH,UACLM,OAAOC,aAAaJ,KAAKH,cACpBA,QAAU,MAGZG,MAeXT,aAAaI,UAAUU,MAAQ,eAEtBL,KAAKH,QAAS,KACXD,KAAOI,KAAKF,wBACXD,QAAUM,OAAOG,WAAW,gBACxBd,gBAEAU,YAEAG,SACPE,KAAKP,MAAOJ,aAGXI,MAUXT,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 diff --git a/lib/amd/build/chart_axis.min.js.map b/lib/amd/build/chart_axis.min.js.map index 7ff6aa5bcf4..1fe365be960 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 * @package core\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_axis\n */\ndefine([], function() {\n\n /**\n * Chart axis class.\n *\n * This is used to represent an axis, whether X or Y.\n *\n * @alias module:core/chart_axis\n * @class\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":";;;;;;;;AAuBAA,OAAM,kBAAC,IAAI,WAUEC,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 +{"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 * @package core\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_axis\n */\ndefine([], function() {\n\n /**\n * Chart axis class.\n *\n * This is used to represent an axis, whether X or Y.\n *\n * @alias module:core/chart_axis\n * @class\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":";;;;;;;;AAuBAA,yBAAO,IAAI,oBAUEC,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 diff --git a/lib/amd/build/chart_bar.min.js b/lib/amd/build/chart_bar.min.js index 0b0d7991ba9..9aabcd8516c 100644 --- a/lib/amd/build/chart_bar.min.js +++ b/lib/amd/build/chart_bar.min.js @@ -6,6 +6,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),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})); +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})); //# 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 f444ed1bd6f..9d55f25a114 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 * @package core\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 * @alias module:core/chart_bar\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":";;;;;;;;AAuBAA,wBAAO,CAAC,oBAAoB,SAASC,MASjC,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 +{"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 * @package core\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 * @alias module:core/chart_bar\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":";;;;;;;;AAuBAA,wBAAO,CAAC,oBAAoB,SAASC,eASxBC,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 diff --git a/lib/amd/build/chart_base.min.js.map b/lib/amd/build/chart_base.min.js.map index d07bbfb38ea..51ce567389e 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 * @package core\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 * @alias module:core/chart_base\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":";;;;;;;;IAuBAA,OAAM,kBAAC,CAAC,oBAAqB,oBAAoB,SAASC,OAAQC,MAY9D,SAASC,OACAC,KAAAA,QAAU,GACVC,KAAAA,QAAU,GACVC,KAAAA,OAAS,GACTC,KAAAA,OAAS,GAEdC,KAAKC,cACR,CAsXD,OA9WAN,KAAKO,UAAUN,QAAU,KAQzBD,KAAKO,UAAUL,QAAU,KAQzBF,KAAKO,UAAUC,eAAiB,KAQhCR,KAAKO,UAAUE,OAAS,KAQxBT,KAAKO,UAAUJ,OAAS,KAQxBH,KAAKO,UAAUH,OAAS,KAQxBJ,KAAKO,UAAUG,SAAW,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAChG,UAAW,WAQnBV,KAAKO,UAAUI,gBAAkB,KASjCX,KAAKO,UAAUK,KAAO,KAStBZ,KAAKO,UAAUM,UAAY,SAASC,QAKhC,GAJKC,KAAAA,gBAAgBD,QACrBT,KAAKJ,QAAQe,KAAKF,QAGQ,OAAtBA,OAAOG,WAAqB,CACxBC,IAAAA,eAAiBb,KAAKc,qBAAuBnB,KAAKO,UAAUG,SAChEI,OAAOM,SAASF,eAAeb,KAAKJ,QAAQoB,OAASH,eAAeG,QACvE,CACJ,EAaDrB,KAAKO,UAAUe,OAAS,SAASC,MAAOC,MAGpC,IAAIC,MAAQ,IAAIF,MAgBhB,OAfAE,MAAMC,kBAAkBF,KAAKG,iBAC7BF,MAAMG,UAAUJ,KAAKK,QACrBJ,MAAMK,SAASN,KAAKO,OAChBP,KAAKQ,gBACLP,MAAMQ,iBAAiBT,KAAKQ,gBAEhCR,KAAKV,OAAOoB,SAAQ,SAASC,YACzBV,MAAMZ,UAAUf,OAAOS,UAAUe,OAAOa,YAC3C,IACDX,KAAKY,KAAKC,EAAEH,SAAQ,SAASI,SAAUC,GACnCd,MAAMe,SAASzC,KAAKQ,UAAUe,OAAOgB,UAAWC,EACnD,IACDf,KAAKY,KAAKK,EAAEP,SAAQ,SAASI,SAAUC,GACnCd,MAAMiB,SAAS3C,KAAKQ,UAAUe,OAAOgB,UAAWC,EACnD,IACMd,KACV,EAWDzB,KAAKO,UAAUoC,UAAY,SAASC,GAAIC,MAAOC,mBACvCV,IAEAW,KAFAX,KAAc,MAAPQ,GAAavC,KAAKF,OAASE,KAAKD,OACvC4C,SAAkB,MAAPJ,GAAavC,KAAKmC,SAAWnC,KAAKqC,UAAUO,KAAK5C,MAOhE,GAHAyC,uBAAiD,IAAtBA,mBAA4CA,uBAGnD,KAFpBC,KAAOX,KAFPS,WAAyB,IAAVA,MAAwB,EAAIA,QAIV,CACzB,IAACC,kBACD,MAAM,IAAII,MAAM,iBAGpBF,QADAD,KAAO,IAAIhD,KACG8C,MACjB,CAED,OAAOE,IACV,EAOD/C,KAAKO,UAAUY,kBAAoB,WAC/B,OAAOd,KAAKM,eACf,EAODX,KAAKO,UAAU4C,UAAY,WACvB,OAAO9C,KAAKH,OACf,EAODF,KAAKO,UAAU6C,iBAAmB,WAC9B,OAAO/C,KAAKG,cACf,EAODR,KAAKO,UAAU8C,UAAY,WACvB,OAAOhD,KAAKJ,OACf,EAODD,KAAKO,UAAU+C,SAAW,WACtB,OAAOjD,KAAKI,MACf,EAQDT,KAAKO,UAAUgD,QAAU,WACjB,IAAClD,KAAKO,KACN,MAAM,IAAIsC,MAAM,uCAEpB,OAAO7C,KAAKO,IACf,EAODZ,KAAKO,UAAUiD,SAAW,WACtB,OAAOnD,KAAKF,MACf,EASDH,KAAKO,UAAUkD,SAAW,SAASZ,MAAOC,mBAC/B,OAAAzC,KAAKsC,UAAU,IAAKE,MAAOC,kBACrC,EAOD9C,KAAKO,UAAUmD,SAAW,WACtB,OAAOrD,KAAKD,MACf,EASDJ,KAAKO,UAAUoD,SAAW,SAASd,MAAOC,mBAC/B,OAAAzC,KAAKsC,UAAU,IAAKE,MAAOC,kBACrC,EAQD9C,KAAKO,UAAUmB,kBAAoB,SAASkC,UACnCjD,KAAAA,gBAAkBiD,QAC1B,EAWD5D,KAAKO,UAAUD,aAAe,aAY9BN,KAAKO,UAAUqB,UAAY,SAASC,QAChC,GAAIA,OAAOR,QAAUhB,KAAKJ,QAAQoB,QAAUhB,KAAKJ,QAAQ,GAAGoB,QAAUQ,OAAOR,OACzE,MAAM,IAAI6B,MAAM,mCAEfhD,KAAAA,QAAU2B,MAClB,EAOD7B,KAAKO,UAAU0B,iBAAmB,SAAS4B,eACvC,GAA6B,WAAzBC,QAAOD,eACP,MAAM,IAAIX,MAAM,wCAA0CW,eAEzDrD,KAAAA,eAAiBqD,aACzB,EAOD7D,KAAKO,UAAUuB,SAAW,SAASC,OAC1BtB,KAAAA,OAASsB,KACjB,EAUD/B,KAAKO,UAAUiC,SAAW,SAASO,KAAMF,OACrCA,WAAyB,IAAVA,MAAwB,EAAIA,MAC3CxC,KAAK0D,cAAc,IAAKhB,KAAMF,OAC9BxC,KAAKF,OAAO0C,OAASE,IACxB,EAUD/C,KAAKO,UAAUmC,SAAW,SAASK,KAAMF,OACrCA,WAAyB,IAAVA,MAAwB,EAAIA,MAC3CxC,KAAK0D,cAAc,IAAKhB,KAAMF,OAC9BxC,KAAKD,OAAOyC,OAASE,IACxB,EAUD/C,KAAKO,UAAUwD,cAAgB,SAASnB,GAAIG,KAAMF,OAE1CA,IADJA,WAAyB,IAAVA,MAAwB,EAAIA,OAC/B,QAEuB,KADd,KAAND,GAAYvC,KAAKF,OAASE,KAAKD,QAC1ByC,MAAQ,GACd,MAAA,IAAIK,MAAM,WAAaN,GAAK,6BAA+BC,MAG5E,EAQD7C,KAAKO,UAAUQ,gBAAkB,SAASD,QACtC,GAAIT,KAAKJ,QAAQoB,QAAUhB,KAAKJ,QAAQ,GAAG+D,YAAclD,OAAOkD,WAC5D,MAAM,IAAId,MAAM,iDAEb,GAAI7C,KAAKH,QAAQmB,QAAUhB,KAAKH,QAAQmB,QAAUP,OAAOkD,WAC5D,MAAM,IAAId,MAAM,kCAEvB,EAEMlD,IAEV"} \ 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 * @package core\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 * @alias module:core/chart_base\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 diff --git a/lib/amd/build/chart_builder.min.js.map b/lib/amd/build/chart_builder.min.js.map index 6c0ca465e64..4bc8b447143 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 * @package core\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":";;;;;;;AAsBAA,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 +{"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 * @package core\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":";;;;;;;AAsBAA,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 diff --git a/lib/amd/build/chart_line.min.js.map b/lib/amd/build/chart_line.min.js.map index c13f50b5661..d5c26fa270d 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 * @package core\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 * @alias module:core/chart_line\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":";;;;;;;;AAuBAA,yBAAO,CAAC,oBAAoB,SAASC,MASjC,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 +{"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 * @package core\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 * @alias module:core/chart_line\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":";;;;;;;;AAuBAA,yBAAO,CAAC,oBAAoB,SAASC,eASxBC,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 diff --git a/lib/amd/build/chart_output.min.js.map b/lib/amd/build/chart_output.min.js.map index c2dc7c27241..1861b4401b2 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 * @package core\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":";;;;;;;;;AAwBAA,2BAAO,CAAC,8BAA8B,SAASC,QAQ3C,OAFoBA,MAIvB"} \ 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 * @package core\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":";;;;;;;;;AAwBAA,2BAAO,CAAC,8BAA8B,SAASC,eAMvBA"} \ 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 19ac3b5105b..edcca38dd78 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 * @package core\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 * @alias module:core/chart_output_base\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":";;;;;;;;;;AAyBAA,gCAAO,CAAC,WAAW,SAASC,GAmBxB,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 +{"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 * @package core\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 * @alias module:core/chart_output_base\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":";;;;;;;;;;AAyBAA,gCAAO,CAAC,WAAW,SAASC,YAmBfC,KAAKC,KAAMC,YACXC,MAAQJ,EAAEE,WACVG,OAASF,aAalBF,KAAKK,UAAUC,OAAS,iBACd,IAAIC,MAAM,mBAGbP"} \ 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 80a5d8fc7f4..aff821370a3 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 * @package core\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 * @alias module:core/chart_output_chartjs\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 * @param {module:core/chart_axis} axis The axis.\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 * @package core\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 * @alias module:core/chart_output_chartjs\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 * @param {module:core/chart_axis} axis The axis.\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 caffd99bf32..1502ee7342c 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 * @package core\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 * @alias module:core/chart_output_htmltable\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":";;;;;;;;AAuBAA,OAAM,8BAAC,CACH,SACA,2BACD,SAASC,EAAGC,MASX,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 +{"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 * @package core\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 * @alias module:core/chart_output_htmltable\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 $(') where each draggable element has a drag handle.\n * The best practice is to use the template core/drag_handle:\n * $OUTPUT->render_from_template('core/drag_handle', ['movetitle' => get_string('movecontent', 'moodle', ELEMENTNAME)]);\n *\n * Attach this JS module to this list:\n *\n * Space between define and ( critical in comment but not allowed in code in order to function\n * correctly with Moodle's requirejs.php\n *\n * define (['jquery', 'core/sortable_list'], function($, SortableList) {\n * var list = new SortableList('ul.my-awesome-list'); // source list (usually
            or
          ) - selector or element\n *\n * // Listen to the events when element is dragged.\n * $('ul.my-awesome-list > *').on(SortableList.EVENTS.DROP, function(evt, info) {\n * console.log(info);\n * });\n *\n * // Advanced usage. Overwrite methods getElementName, getDestinationName, moveDialogueTitle, for example:\n * list.getElementName = function(element) {\n * return $.Deferred().resolve(element.attr('data-name'));\n * }\n * }\n *\n * More details: https://docs.moodle.org/dev/Sortable_list\n *\n * For the full list of possible parameters see var defaultParameters below.\n *\n * The following jQuery events are fired:\n * - SortableList.EVENTS.DRAGSTART : when user started dragging a list element\n * - SortableList.EVENTS.DRAG : when user dragged a list element to a new position\n * - SortableList.EVENTS.DROP : when user dropped a list element\n * - SortableList.EVENTS.DROPEND : when user finished dragging - either fired right after dropping or\n * if \"Esc\" was pressed during dragging\n *\n * @module core/sortable_list\n * @class sortable_list\n * @package core\n * @copyright 2018 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/log', 'core/autoscroll', 'core/str', 'core/modal_factory', 'core/modal_events', 'core/notification'],\nfunction($, log, autoScroll, str, ModalFactory, ModalEvents, Notification) {\n\n /**\n * Default parameters\n *\n * @private\n * @type {Object}\n */\n var defaultParameters = {\n targetListSelector: null,\n moveHandlerSelector: '[data-drag-type=move]',\n isHorizontal: false,\n autoScroll: true\n };\n\n /**\n * Class names for different elements that may be changed during sorting\n *\n * @private\n * @type {Object}\n */\n var CSS = {\n keyboardDragClass: 'dragdrop-keyboard-drag',\n isDraggedClass: 'sortable-list-is-dragged',\n currentPositionClass: 'sortable-list-current-position',\n sourceListClass: 'sortable-list-source',\n targetListClass: 'sortable-list-target',\n overElementClass: 'sortable-list-over-element'\n };\n\n /**\n * Test the browser support for options objects on event listeners.\n * @return {Boolean}\n */\n var eventListenerOptionsSupported = function() {\n var passivesupported = false,\n options,\n testeventname = \"testpassiveeventoptions\";\n\n // Options support testing example from:\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n\n try {\n options = Object.defineProperty({}, \"passive\", {\n get: function() {\n passivesupported = true;\n }\n });\n\n // We use an event name that is not likely to conflict with any real event.\n document.addEventListener(testeventname, options, options);\n // We remove the event listener as we have tested the options already.\n document.removeEventListener(testeventname, options, options);\n } catch (err) {\n // It's already false.\n passivesupported = false;\n }\n return passivesupported;\n };\n\n /**\n * Allow to create non-passive touchstart listeners and prevent page scrolling when dragging\n * From: https://stackoverflow.com/a/48098097\n *\n * @type {Object}\n */\n var registerNotPassiveListeners = function(eventname) {\n return {\n setup: function(x, ns, handle) {\n if (ns.includes('notPassive')) {\n this.addEventListener(eventname, handle, {passive: false});\n return true;\n } else {\n return false;\n }\n }\n };\n };\n\n if (eventListenerOptionsSupported) {\n $.event.special.touchstart = registerNotPassiveListeners('touchstart');\n $.event.special.touchmove = registerNotPassiveListeners('touchmove');\n $.event.special.touchend = registerNotPassiveListeners('touchend');\n }\n\n /**\n * Initialise sortable list.\n *\n * @param {(String|jQuery|Element)} root JQuery/DOM element representing sortable list (i.e.
            ,
          ) or CSS selector\n * @param {Object} config Parameters for the list. See defaultParameters above for examples.\n * @property {(String|jQuery|Element)} config.targetListSelector target lists, by default same as root\n * @property {String} config.moveHandlerSelector CSS selector for a drag handle. By default '[data-drag-type=move]'\n * @property {String} config.targetListSelector CSS selector for target lists. By default the same as root\n * @property {(Boolean|Function)} config.isHorizontal Set to true if the list is horizontal\n * (can also be a callback with list as an argument)\n * @property {Boolean} config.autoScroll Engages autoscroll module for automatic vertical scrolling of the\n * whole page, by default true\n */\n var SortableList = function(root, config) {\n\n this.info = null;\n this.proxy = null;\n this.proxyDelta = null;\n this.dragCounter = 0;\n this.lastEvent = null;\n\n this.config = $.extend({}, defaultParameters, config || {});\n this.config.listSelector = root;\n if (!this.config.targetListSelector) {\n this.config.targetListSelector = root;\n }\n if (typeof this.config.listSelector === 'object') {\n // The root is an element on the page. Register a listener for this element.\n $(this.config.listSelector).on('mousedown touchstart.notPassive', $.proxy(this.dragStartHandler, this));\n } else {\n // The root is a CSS selector. Register a listener that picks up the element dynamically.\n $('body').on('mousedown touchstart.notPassive', this.config.listSelector, $.proxy(this.dragStartHandler, this));\n }\n if (this.config.moveHandlerSelector !== null) {\n $('body').on('click keypress', this.config.moveHandlerSelector, $.proxy(this.clickHandler, this));\n }\n\n };\n\n /**\n * Events fired by this entity\n *\n * @public\n * @type {Object}\n */\n SortableList.EVENTS = {\n DRAGSTART: 'sortablelist-dragstart',\n DRAG: 'sortablelist-drag',\n DROP: 'sortablelist-drop',\n DRAGEND: 'sortablelist-dragend'\n };\n\n /**\n * Resets the temporary classes assigned during dragging\n * @private\n */\n SortableList.prototype.resetDraggedClasses = function() {\n var classes = [\n CSS.isDraggedClass,\n CSS.currentPositionClass,\n CSS.overElementClass,\n CSS.targetListClass,\n ];\n for (var i in classes) {\n $('.' + classes[i]).removeClass(classes[i]);\n }\n if (this.proxy) {\n this.proxy.remove();\n this.proxy = $();\n }\n };\n\n /**\n * Calculates evt.pageX, evt.pageY, evt.clientX and evt.clientY\n *\n * For touch events pageX and pageY are taken from the first touch;\n * For the emulated mousemove event they are taken from the last real event.\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.calculatePositionOnPage = function(evt) {\n\n if (evt.originalEvent && evt.originalEvent.touches && evt.originalEvent.touches[0] !== undefined) {\n // This is a touchmove or touchstart event, get position from the first touch position.\n var touch = evt.originalEvent.touches[0];\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n }\n\n if (evt.pageX === undefined) {\n // Information is not present in case of touchend or when event was emulated by autoScroll.\n // Take the absolute mouse position from the last event.\n evt.pageX = this.lastEvent.pageX;\n evt.pageY = this.lastEvent.pageY;\n } else {\n this.lastEvent = evt;\n }\n\n if (evt.clientX === undefined) {\n // If not provided in event calculate relative mouse position.\n evt.clientX = Math.round(evt.pageX - $(window).scrollLeft());\n evt.clientY = Math.round(evt.pageY - $(window).scrollTop());\n }\n };\n\n /**\n * Handler from dragstart event\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragStartHandler = function(evt) {\n if (this.info !== null) {\n if (this.info.type === 'click' || this.info.type === 'touchend') {\n // Ignore double click.\n return;\n }\n // Mouse down or touch while already dragging, cancel previous dragging.\n this.moveElement(this.info.sourceList, this.info.sourceNextElement);\n this.finishDragging();\n }\n\n if (evt.type === 'mousedown' && evt.which !== 1) {\n // We only need left mouse click. If this is a mousedown event with right/middle click ignore it.\n return;\n }\n\n this.calculatePositionOnPage(evt);\n var movedElement = $(evt.target).closest($(evt.currentTarget).children());\n if (!movedElement.length) {\n // Can't find the element user wants to drag. They clicked on the list but outside of any element of the list.\n return;\n }\n\n // Check that we grabbed the element by the handle.\n if (this.config.moveHandlerSelector !== null) {\n if (!$(evt.target).closest(this.config.moveHandlerSelector, movedElement).length) {\n return;\n }\n }\n\n evt.stopPropagation();\n evt.preventDefault();\n\n // Information about moved element with original location.\n // This object is passed to event observers.\n this.dragCounter++;\n this.info = {\n element: movedElement,\n sourceNextElement: movedElement.next(),\n sourceList: movedElement.parent(),\n targetNextElement: movedElement.next(),\n targetList: movedElement.parent(),\n type: evt.type,\n dropped: false,\n startX: evt.pageX,\n startY: evt.pageY,\n startTime: new Date().getTime()\n };\n\n $(this.config.targetListSelector).addClass(CSS.targetListClass);\n\n var offset = movedElement.offset();\n movedElement.addClass(CSS.currentPositionClass);\n this.proxyDelta = {x: offset.left - evt.pageX, y: offset.top - evt.pageY};\n this.proxy = $();\n var thisDragCounter = this.dragCounter;\n setTimeout($.proxy(function() {\n // This mousedown event may in fact be a beginning of a 'click' event. Use timeout before showing the\n // dragged object so we can catch click event. When timeout finishes make sure that click event\n // has not happened during this half a second.\n // Verify dragcounter to make sure the user did not manage to do two very fast drag actions one after another.\n if (this.info === null || this.info.type === 'click' || this.info.type === 'keypress'\n || this.dragCounter !== thisDragCounter) {\n return;\n }\n\n // Create a proxy - the copy of the dragged element that moves together with a mouse.\n this.createProxy();\n }, this), 500);\n\n // Start drag.\n $(window).on('mousemove touchmove.notPassive mouseup touchend.notPassive', $.proxy(this.dragHandler, this));\n $(window).on('keypress', $.proxy(this.dragcancelHandler, this));\n\n // Start autoscrolling. Every time the page is scrolled emulate the mousemove event.\n if (this.config.autoScroll) {\n autoScroll.start(function() {\n $(window).trigger('mousemove');\n });\n }\n\n this.executeCallback(SortableList.EVENTS.DRAGSTART);\n };\n\n /**\n * Creates a \"proxy\" object - a copy of the element that is being moved that always follows the mouse\n * @private\n */\n SortableList.prototype.createProxy = function() {\n this.proxy = this.info.element.clone();\n this.info.sourceList.append(this.proxy);\n this.proxy.removeAttr('id').removeClass(CSS.currentPositionClass)\n .addClass(CSS.isDraggedClass).css({position: 'fixed'});\n this.proxy.offset({top: this.proxyDelta.y + this.lastEvent.pageY, left: this.proxyDelta.x + this.lastEvent.pageX});\n };\n\n /**\n * Handler for click event - when user clicks on the drag handler or presses Enter on keyboard\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.clickHandler = function(evt) {\n if (evt.type === 'keypress' && evt.originalEvent.keyCode !== 13 && evt.originalEvent.keyCode !== 32) {\n return;\n }\n if (this.info !== null) {\n // Ignore double click.\n return;\n }\n\n // Find the element that this draghandle belongs to.\n var clickedElement = $(evt.target).closest(this.config.moveHandlerSelector),\n sourceList = clickedElement.closest(this.config.listSelector),\n movedElement = clickedElement.closest(sourceList.children());\n if (!movedElement.length) {\n return;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Store information about moved element with original location.\n this.dragCounter++;\n this.info = {\n element: movedElement,\n sourceNextElement: movedElement.next(),\n sourceList: sourceList,\n targetNextElement: movedElement.next(),\n targetList: sourceList,\n dropped: false,\n type: evt.type,\n startTime: new Date().getTime()\n };\n\n this.executeCallback(SortableList.EVENTS.DRAGSTART);\n this.displayMoveDialogue(clickedElement);\n };\n\n /**\n * Finds the position of the mouse inside the element - on the top, on the bottom, on the right or on the left\\\n *\n * Used to determine if the moved element should be moved after or before the current element\n *\n * @private\n * @param {Number} pageX\n * @param {Number} pageY\n * @param {jQuery} element\n * @returns {(Object|null)}\n */\n SortableList.prototype.getPositionInNode = function(pageX, pageY, element) {\n if (!element.length) {\n return null;\n }\n var node = element[0],\n offset = 0,\n rect = node.getBoundingClientRect(),\n y = pageY - (rect.top + window.scrollY),\n x = pageX - (rect.left + window.scrollX);\n if (x >= -offset && x <= rect.width + offset && y >= -offset && y <= rect.height + offset) {\n return {\n x: x,\n y: y,\n xRatio: rect.width ? (x / rect.width) : 0,\n yRatio: rect.height ? (y / rect.height) : 0\n };\n }\n return null;\n };\n\n /**\n * Check if list is horizontal\n *\n * @param {jQuery} element\n * @return {Boolean}\n */\n SortableList.prototype.isListHorizontal = function(element) {\n var isHorizontal = this.config.isHorizontal;\n if (isHorizontal === true || isHorizontal === false) {\n return isHorizontal;\n }\n return isHorizontal(element);\n };\n\n /**\n * Handler for events mousemove touchmove mouseup touchend\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragHandler = function(evt) {\n\n evt.preventDefault();\n evt.stopPropagation();\n\n this.calculatePositionOnPage(evt);\n\n // We can not use evt.target here because it will most likely be our proxy.\n // Move the proxy out of the way so we can find the element at the current mouse position.\n this.proxy.offset({top: -1000, left: -1000});\n // Find the element at the current mouse position.\n var element = $(document.elementFromPoint(evt.clientX, evt.clientY));\n\n // Find the list element and the list over the mouse position.\n var mainElement = this.info.element[0],\n isNotSelf = function() {\n return this !== mainElement;\n },\n current = element.closest('.' + CSS.targetListClass + ' > :not(.' + CSS.isDraggedClass + ')').filter(isNotSelf),\n currentList = element.closest('.' + CSS.targetListClass),\n proxy = this.proxy,\n isNotProxy = function() {\n return !proxy || !proxy.length || this !== proxy[0];\n };\n\n // Add the specified class to the list element we are hovering.\n $('.' + CSS.overElementClass).removeClass(CSS.overElementClass);\n current.addClass(CSS.overElementClass);\n\n // Move proxy to the current position.\n this.proxy.offset({top: this.proxyDelta.y + evt.pageY, left: this.proxyDelta.x + evt.pageX});\n\n if (currentList.length && !currentList.children().filter(isNotProxy).length) {\n // Mouse is over an empty list.\n this.moveElement(currentList, $());\n } else if (current.length === 1 && !this.info.element.find(current[0]).length) {\n // Mouse is over an element in a list - find whether we should move the current position\n // above or below this element.\n var coordinates = this.getPositionInNode(evt.pageX, evt.pageY, current);\n if (coordinates) {\n var parent = current.parent(),\n ratio = this.isListHorizontal(parent) ? coordinates.xRatio : coordinates.yRatio,\n subList = current.find('.' + CSS.targetListClass),\n subListEmpty = !subList.children().filter(isNotProxy).filter(isNotSelf).length;\n if (subList.length && subListEmpty && ratio > 0.2 && ratio < 0.8) {\n // This is an element that is a parent of an empty list and we are around the middle of this element.\n // Treat it as if we are over this empty list.\n this.moveElement(subList, $());\n } else if (ratio > 0.5) {\n // Insert after this element.\n this.moveElement(parent, current.next().filter(isNotProxy));\n } else {\n // Insert before this element.\n this.moveElement(parent, current);\n }\n }\n }\n\n if (evt.type === 'mouseup' || evt.type === 'touchend') {\n // Drop the moved element.\n this.info.endX = evt.pageX;\n this.info.endY = evt.pageY;\n this.info.endTime = new Date().getTime();\n this.info.dropped = true;\n this.info.positionChanged = this.hasPositionChanged(this.info);\n var oldinfo = this.info;\n this.executeCallback(SortableList.EVENTS.DROP);\n this.finishDragging();\n\n if (evt.type === 'touchend'\n && this.config.moveHandlerSelector !== null\n && (oldinfo.endTime - oldinfo.startTime < 500)\n && !oldinfo.positionChanged) {\n // The click event is not triggered on touch screens because we call preventDefault in touchstart handler.\n // If the touchend quickly followed touchstart without moving, consider it a \"click\".\n this.clickHandler(evt);\n }\n }\n };\n\n /**\n * Checks if the position of the dragged element in the list has changed\n *\n * @private\n * @param {Object} info\n * @return {Boolean}\n */\n SortableList.prototype.hasPositionChanged = function(info) {\n return info.sourceList[0] !== info.targetList[0] ||\n info.sourceNextElement.length !== info.targetNextElement.length ||\n (info.sourceNextElement.length && info.sourceNextElement[0] !== info.targetNextElement[0]);\n };\n\n /**\n * Moves the current position of the dragged element\n *\n * @private\n * @param {jQuery} parentElement\n * @param {jQuery} beforeElement\n */\n SortableList.prototype.moveElement = function(parentElement, beforeElement) {\n var dragEl = this.info.element;\n if (beforeElement.length && beforeElement[0] === dragEl[0]) {\n // Insert before the current position of the dragged element - nothing to do.\n return;\n }\n if (parentElement[0] === this.info.targetList[0] &&\n beforeElement.length === this.info.targetNextElement.length &&\n beforeElement[0] === this.info.targetNextElement[0]) {\n // Insert in the same location as the current position - nothing to do.\n return;\n }\n\n if (beforeElement.length) {\n // Move the dragged element before the specified element.\n parentElement[0].insertBefore(dragEl[0], beforeElement[0]);\n } else if (this.proxy && this.proxy.parent().length && this.proxy.parent()[0] === parentElement[0]) {\n // We need to move to the end of the list but the last element in this list is a proxy.\n // Always leave the proxy in the end of the list.\n parentElement[0].insertBefore(dragEl[0], this.proxy[0]);\n } else {\n // Insert in the end of a list (when proxy is in another list).\n parentElement[0].appendChild(dragEl[0]);\n }\n\n // Save the current position of the dragged element in the list.\n this.info.targetList = parentElement;\n this.info.targetNextElement = beforeElement;\n this.executeCallback(SortableList.EVENTS.DRAG);\n };\n\n /**\n * Finish dragging (when dropped or cancelled).\n * @private\n */\n SortableList.prototype.finishDragging = function() {\n this.resetDraggedClasses();\n if (this.config.autoScroll) {\n autoScroll.stop();\n }\n $(window).off('mousemove touchmove.notPassive mouseup touchend.notPassive', $.proxy(this.dragHandler, this));\n $(window).off('keypress', $.proxy(this.dragcancelHandler, this));\n this.executeCallback(SortableList.EVENTS.DRAGEND);\n this.info = null;\n };\n\n /**\n * Executes callback specified in sortable list parameters\n *\n * @private\n * @param {String} eventName\n */\n SortableList.prototype.executeCallback = function(eventName) {\n this.info.element.trigger(eventName, this.info);\n };\n\n /**\n * Handler from keypress event (cancel dragging when Esc is pressed)\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragcancelHandler = function(evt) {\n if (evt.type !== 'keypress' || evt.originalEvent.keyCode !== 27) {\n // Only cancel dragging when Esc was pressed.\n return;\n }\n // Dragging was cancelled. Return item to the original position.\n this.moveElement(this.info.sourceList, this.info.sourceNextElement);\n this.finishDragging();\n };\n\n /**\n * Returns the name of the current element to be used in the move dialogue\n *\n * @public\n * @param {jQuery} element\n * @return {Promise}\n */\n SortableList.prototype.getElementName = function(element) {\n return $.Deferred().resolve(element.text());\n };\n\n /**\n * Returns the label for the potential move destination, i.e. \"After ElementX\" or \"To the top of the list\"\n *\n * Note that we use \"after\" in the label for better UX\n *\n * @public\n * @param {jQuery} parentElement\n * @param {jQuery} afterElement\n * @return {Promise}\n */\n SortableList.prototype.getDestinationName = function(parentElement, afterElement) {\n if (!afterElement.length) {\n return str.get_string('movecontenttothetop', 'moodle');\n } else {\n return this.getElementName(afterElement)\n .then(function(name) {\n return str.get_string('movecontentafter', 'moodle', name);\n });\n }\n };\n\n /**\n * Returns the title for the move dialogue (\"Move elementY\")\n *\n * @public\n * @param {jQuery} element\n * @param {jQuery} handler\n * @return {Promise}\n */\n SortableList.prototype.getMoveDialogueTitle = function(element, handler) {\n if (handler.attr('title')) {\n return $.Deferred().resolve(handler.attr('title'));\n }\n return this.getElementName(element).then(function(name) {\n return str.get_string('movecontent', 'moodle', name);\n });\n };\n\n /**\n * Returns the list of possible move destinations\n *\n * @private\n * @return {Promise}\n */\n SortableList.prototype.getDestinationsList = function() {\n var addedLists = [],\n targets = $(this.config.targetListSelector),\n destinations = $(') where each draggable element has a drag handle.\n * The best practice is to use the template core/drag_handle:\n * $OUTPUT->render_from_template('core/drag_handle', ['movetitle' => get_string('movecontent', 'moodle', ELEMENTNAME)]);\n *\n * Attach this JS module to this list:\n *\n * Space between define and ( critical in comment but not allowed in code in order to function\n * correctly with Moodle's requirejs.php\n *\n * define (['jquery', 'core/sortable_list'], function($, SortableList) {\n * var list = new SortableList('ul.my-awesome-list'); // source list (usually
            or
          ) - selector or element\n *\n * // Listen to the events when element is dragged.\n * $('ul.my-awesome-list > *').on(SortableList.EVENTS.DROP, function(evt, info) {\n * console.log(info);\n * });\n *\n * // Advanced usage. Overwrite methods getElementName, getDestinationName, moveDialogueTitle, for example:\n * list.getElementName = function(element) {\n * return $.Deferred().resolve(element.attr('data-name'));\n * }\n * }\n *\n * More details: https://docs.moodle.org/dev/Sortable_list\n *\n * For the full list of possible parameters see var defaultParameters below.\n *\n * The following jQuery events are fired:\n * - SortableList.EVENTS.DRAGSTART : when user started dragging a list element\n * - SortableList.EVENTS.DRAG : when user dragged a list element to a new position\n * - SortableList.EVENTS.DROP : when user dropped a list element\n * - SortableList.EVENTS.DROPEND : when user finished dragging - either fired right after dropping or\n * if \"Esc\" was pressed during dragging\n *\n * @module core/sortable_list\n * @class sortable_list\n * @package core\n * @copyright 2018 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/log', 'core/autoscroll', 'core/str', 'core/modal_factory', 'core/modal_events', 'core/notification'],\nfunction($, log, autoScroll, str, ModalFactory, ModalEvents, Notification) {\n\n /**\n * Default parameters\n *\n * @private\n * @type {Object}\n */\n var defaultParameters = {\n targetListSelector: null,\n moveHandlerSelector: '[data-drag-type=move]',\n isHorizontal: false,\n autoScroll: true\n };\n\n /**\n * Class names for different elements that may be changed during sorting\n *\n * @private\n * @type {Object}\n */\n var CSS = {\n keyboardDragClass: 'dragdrop-keyboard-drag',\n isDraggedClass: 'sortable-list-is-dragged',\n currentPositionClass: 'sortable-list-current-position',\n sourceListClass: 'sortable-list-source',\n targetListClass: 'sortable-list-target',\n overElementClass: 'sortable-list-over-element'\n };\n\n /**\n * Test the browser support for options objects on event listeners.\n * @return {Boolean}\n */\n var eventListenerOptionsSupported = function() {\n var passivesupported = false,\n options,\n testeventname = \"testpassiveeventoptions\";\n\n // Options support testing example from:\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n\n try {\n options = Object.defineProperty({}, \"passive\", {\n get: function() {\n passivesupported = true;\n }\n });\n\n // We use an event name that is not likely to conflict with any real event.\n document.addEventListener(testeventname, options, options);\n // We remove the event listener as we have tested the options already.\n document.removeEventListener(testeventname, options, options);\n } catch (err) {\n // It's already false.\n passivesupported = false;\n }\n return passivesupported;\n };\n\n /**\n * Allow to create non-passive touchstart listeners and prevent page scrolling when dragging\n * From: https://stackoverflow.com/a/48098097\n *\n * @type {Object}\n */\n var registerNotPassiveListeners = function(eventname) {\n return {\n setup: function(x, ns, handle) {\n if (ns.includes('notPassive')) {\n this.addEventListener(eventname, handle, {passive: false});\n return true;\n } else {\n return false;\n }\n }\n };\n };\n\n if (eventListenerOptionsSupported) {\n $.event.special.touchstart = registerNotPassiveListeners('touchstart');\n $.event.special.touchmove = registerNotPassiveListeners('touchmove');\n $.event.special.touchend = registerNotPassiveListeners('touchend');\n }\n\n /**\n * Initialise sortable list.\n *\n * @param {(String|jQuery|Element)} root JQuery/DOM element representing sortable list (i.e.
            ,
          ) or CSS selector\n * @param {Object} config Parameters for the list. See defaultParameters above for examples.\n * @property {(String|jQuery|Element)} config.targetListSelector target lists, by default same as root\n * @property {String} config.moveHandlerSelector CSS selector for a drag handle. By default '[data-drag-type=move]'\n * @property {String} config.targetListSelector CSS selector for target lists. By default the same as root\n * @property {(Boolean|Function)} config.isHorizontal Set to true if the list is horizontal\n * (can also be a callback with list as an argument)\n * @property {Boolean} config.autoScroll Engages autoscroll module for automatic vertical scrolling of the\n * whole page, by default true\n */\n var SortableList = function(root, config) {\n\n this.info = null;\n this.proxy = null;\n this.proxyDelta = null;\n this.dragCounter = 0;\n this.lastEvent = null;\n\n this.config = $.extend({}, defaultParameters, config || {});\n this.config.listSelector = root;\n if (!this.config.targetListSelector) {\n this.config.targetListSelector = root;\n }\n if (typeof this.config.listSelector === 'object') {\n // The root is an element on the page. Register a listener for this element.\n $(this.config.listSelector).on('mousedown touchstart.notPassive', $.proxy(this.dragStartHandler, this));\n } else {\n // The root is a CSS selector. Register a listener that picks up the element dynamically.\n $('body').on('mousedown touchstart.notPassive', this.config.listSelector, $.proxy(this.dragStartHandler, this));\n }\n if (this.config.moveHandlerSelector !== null) {\n $('body').on('click keypress', this.config.moveHandlerSelector, $.proxy(this.clickHandler, this));\n }\n\n };\n\n /**\n * Events fired by this entity\n *\n * @public\n * @type {Object}\n */\n SortableList.EVENTS = {\n DRAGSTART: 'sortablelist-dragstart',\n DRAG: 'sortablelist-drag',\n DROP: 'sortablelist-drop',\n DRAGEND: 'sortablelist-dragend'\n };\n\n /**\n * Resets the temporary classes assigned during dragging\n * @private\n */\n SortableList.prototype.resetDraggedClasses = function() {\n var classes = [\n CSS.isDraggedClass,\n CSS.currentPositionClass,\n CSS.overElementClass,\n CSS.targetListClass,\n ];\n for (var i in classes) {\n $('.' + classes[i]).removeClass(classes[i]);\n }\n if (this.proxy) {\n this.proxy.remove();\n this.proxy = $();\n }\n };\n\n /**\n * Calculates evt.pageX, evt.pageY, evt.clientX and evt.clientY\n *\n * For touch events pageX and pageY are taken from the first touch;\n * For the emulated mousemove event they are taken from the last real event.\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.calculatePositionOnPage = function(evt) {\n\n if (evt.originalEvent && evt.originalEvent.touches && evt.originalEvent.touches[0] !== undefined) {\n // This is a touchmove or touchstart event, get position from the first touch position.\n var touch = evt.originalEvent.touches[0];\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n }\n\n if (evt.pageX === undefined) {\n // Information is not present in case of touchend or when event was emulated by autoScroll.\n // Take the absolute mouse position from the last event.\n evt.pageX = this.lastEvent.pageX;\n evt.pageY = this.lastEvent.pageY;\n } else {\n this.lastEvent = evt;\n }\n\n if (evt.clientX === undefined) {\n // If not provided in event calculate relative mouse position.\n evt.clientX = Math.round(evt.pageX - $(window).scrollLeft());\n evt.clientY = Math.round(evt.pageY - $(window).scrollTop());\n }\n };\n\n /**\n * Handler from dragstart event\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragStartHandler = function(evt) {\n if (this.info !== null) {\n if (this.info.type === 'click' || this.info.type === 'touchend') {\n // Ignore double click.\n return;\n }\n // Mouse down or touch while already dragging, cancel previous dragging.\n this.moveElement(this.info.sourceList, this.info.sourceNextElement);\n this.finishDragging();\n }\n\n if (evt.type === 'mousedown' && evt.which !== 1) {\n // We only need left mouse click. If this is a mousedown event with right/middle click ignore it.\n return;\n }\n\n this.calculatePositionOnPage(evt);\n var movedElement = $(evt.target).closest($(evt.currentTarget).children());\n if (!movedElement.length) {\n // Can't find the element user wants to drag. They clicked on the list but outside of any element of the list.\n return;\n }\n\n // Check that we grabbed the element by the handle.\n if (this.config.moveHandlerSelector !== null) {\n if (!$(evt.target).closest(this.config.moveHandlerSelector, movedElement).length) {\n return;\n }\n }\n\n evt.stopPropagation();\n evt.preventDefault();\n\n // Information about moved element with original location.\n // This object is passed to event observers.\n this.dragCounter++;\n this.info = {\n element: movedElement,\n sourceNextElement: movedElement.next(),\n sourceList: movedElement.parent(),\n targetNextElement: movedElement.next(),\n targetList: movedElement.parent(),\n type: evt.type,\n dropped: false,\n startX: evt.pageX,\n startY: evt.pageY,\n startTime: new Date().getTime()\n };\n\n $(this.config.targetListSelector).addClass(CSS.targetListClass);\n\n var offset = movedElement.offset();\n movedElement.addClass(CSS.currentPositionClass);\n this.proxyDelta = {x: offset.left - evt.pageX, y: offset.top - evt.pageY};\n this.proxy = $();\n var thisDragCounter = this.dragCounter;\n setTimeout($.proxy(function() {\n // This mousedown event may in fact be a beginning of a 'click' event. Use timeout before showing the\n // dragged object so we can catch click event. When timeout finishes make sure that click event\n // has not happened during this half a second.\n // Verify dragcounter to make sure the user did not manage to do two very fast drag actions one after another.\n if (this.info === null || this.info.type === 'click' || this.info.type === 'keypress'\n || this.dragCounter !== thisDragCounter) {\n return;\n }\n\n // Create a proxy - the copy of the dragged element that moves together with a mouse.\n this.createProxy();\n }, this), 500);\n\n // Start drag.\n $(window).on('mousemove touchmove.notPassive mouseup touchend.notPassive', $.proxy(this.dragHandler, this));\n $(window).on('keypress', $.proxy(this.dragcancelHandler, this));\n\n // Start autoscrolling. Every time the page is scrolled emulate the mousemove event.\n if (this.config.autoScroll) {\n autoScroll.start(function() {\n $(window).trigger('mousemove');\n });\n }\n\n this.executeCallback(SortableList.EVENTS.DRAGSTART);\n };\n\n /**\n * Creates a \"proxy\" object - a copy of the element that is being moved that always follows the mouse\n * @private\n */\n SortableList.prototype.createProxy = function() {\n this.proxy = this.info.element.clone();\n this.info.sourceList.append(this.proxy);\n this.proxy.removeAttr('id').removeClass(CSS.currentPositionClass)\n .addClass(CSS.isDraggedClass).css({position: 'fixed'});\n this.proxy.offset({top: this.proxyDelta.y + this.lastEvent.pageY, left: this.proxyDelta.x + this.lastEvent.pageX});\n };\n\n /**\n * Handler for click event - when user clicks on the drag handler or presses Enter on keyboard\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.clickHandler = function(evt) {\n if (evt.type === 'keypress' && evt.originalEvent.keyCode !== 13 && evt.originalEvent.keyCode !== 32) {\n return;\n }\n if (this.info !== null) {\n // Ignore double click.\n return;\n }\n\n // Find the element that this draghandle belongs to.\n var clickedElement = $(evt.target).closest(this.config.moveHandlerSelector),\n sourceList = clickedElement.closest(this.config.listSelector),\n movedElement = clickedElement.closest(sourceList.children());\n if (!movedElement.length) {\n return;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Store information about moved element with original location.\n this.dragCounter++;\n this.info = {\n element: movedElement,\n sourceNextElement: movedElement.next(),\n sourceList: sourceList,\n targetNextElement: movedElement.next(),\n targetList: sourceList,\n dropped: false,\n type: evt.type,\n startTime: new Date().getTime()\n };\n\n this.executeCallback(SortableList.EVENTS.DRAGSTART);\n this.displayMoveDialogue(clickedElement);\n };\n\n /**\n * Finds the position of the mouse inside the element - on the top, on the bottom, on the right or on the left\\\n *\n * Used to determine if the moved element should be moved after or before the current element\n *\n * @private\n * @param {Number} pageX\n * @param {Number} pageY\n * @param {jQuery} element\n * @returns {(Object|null)}\n */\n SortableList.prototype.getPositionInNode = function(pageX, pageY, element) {\n if (!element.length) {\n return null;\n }\n var node = element[0],\n offset = 0,\n rect = node.getBoundingClientRect(),\n y = pageY - (rect.top + window.scrollY),\n x = pageX - (rect.left + window.scrollX);\n if (x >= -offset && x <= rect.width + offset && y >= -offset && y <= rect.height + offset) {\n return {\n x: x,\n y: y,\n xRatio: rect.width ? (x / rect.width) : 0,\n yRatio: rect.height ? (y / rect.height) : 0\n };\n }\n return null;\n };\n\n /**\n * Check if list is horizontal\n *\n * @param {jQuery} element\n * @return {Boolean}\n */\n SortableList.prototype.isListHorizontal = function(element) {\n var isHorizontal = this.config.isHorizontal;\n if (isHorizontal === true || isHorizontal === false) {\n return isHorizontal;\n }\n return isHorizontal(element);\n };\n\n /**\n * Handler for events mousemove touchmove mouseup touchend\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragHandler = function(evt) {\n\n evt.preventDefault();\n evt.stopPropagation();\n\n this.calculatePositionOnPage(evt);\n\n // We can not use evt.target here because it will most likely be our proxy.\n // Move the proxy out of the way so we can find the element at the current mouse position.\n this.proxy.offset({top: -1000, left: -1000});\n // Find the element at the current mouse position.\n var element = $(document.elementFromPoint(evt.clientX, evt.clientY));\n\n // Find the list element and the list over the mouse position.\n var mainElement = this.info.element[0],\n isNotSelf = function() {\n return this !== mainElement;\n },\n current = element.closest('.' + CSS.targetListClass + ' > :not(.' + CSS.isDraggedClass + ')').filter(isNotSelf),\n currentList = element.closest('.' + CSS.targetListClass),\n proxy = this.proxy,\n isNotProxy = function() {\n return !proxy || !proxy.length || this !== proxy[0];\n };\n\n // Add the specified class to the list element we are hovering.\n $('.' + CSS.overElementClass).removeClass(CSS.overElementClass);\n current.addClass(CSS.overElementClass);\n\n // Move proxy to the current position.\n this.proxy.offset({top: this.proxyDelta.y + evt.pageY, left: this.proxyDelta.x + evt.pageX});\n\n if (currentList.length && !currentList.children().filter(isNotProxy).length) {\n // Mouse is over an empty list.\n this.moveElement(currentList, $());\n } else if (current.length === 1 && !this.info.element.find(current[0]).length) {\n // Mouse is over an element in a list - find whether we should move the current position\n // above or below this element.\n var coordinates = this.getPositionInNode(evt.pageX, evt.pageY, current);\n if (coordinates) {\n var parent = current.parent(),\n ratio = this.isListHorizontal(parent) ? coordinates.xRatio : coordinates.yRatio,\n subList = current.find('.' + CSS.targetListClass),\n subListEmpty = !subList.children().filter(isNotProxy).filter(isNotSelf).length;\n if (subList.length && subListEmpty && ratio > 0.2 && ratio < 0.8) {\n // This is an element that is a parent of an empty list and we are around the middle of this element.\n // Treat it as if we are over this empty list.\n this.moveElement(subList, $());\n } else if (ratio > 0.5) {\n // Insert after this element.\n this.moveElement(parent, current.next().filter(isNotProxy));\n } else {\n // Insert before this element.\n this.moveElement(parent, current);\n }\n }\n }\n\n if (evt.type === 'mouseup' || evt.type === 'touchend') {\n // Drop the moved element.\n this.info.endX = evt.pageX;\n this.info.endY = evt.pageY;\n this.info.endTime = new Date().getTime();\n this.info.dropped = true;\n this.info.positionChanged = this.hasPositionChanged(this.info);\n var oldinfo = this.info;\n this.executeCallback(SortableList.EVENTS.DROP);\n this.finishDragging();\n\n if (evt.type === 'touchend'\n && this.config.moveHandlerSelector !== null\n && (oldinfo.endTime - oldinfo.startTime < 500)\n && !oldinfo.positionChanged) {\n // The click event is not triggered on touch screens because we call preventDefault in touchstart handler.\n // If the touchend quickly followed touchstart without moving, consider it a \"click\".\n this.clickHandler(evt);\n }\n }\n };\n\n /**\n * Checks if the position of the dragged element in the list has changed\n *\n * @private\n * @param {Object} info\n * @return {Boolean}\n */\n SortableList.prototype.hasPositionChanged = function(info) {\n return info.sourceList[0] !== info.targetList[0] ||\n info.sourceNextElement.length !== info.targetNextElement.length ||\n (info.sourceNextElement.length && info.sourceNextElement[0] !== info.targetNextElement[0]);\n };\n\n /**\n * Moves the current position of the dragged element\n *\n * @private\n * @param {jQuery} parentElement\n * @param {jQuery} beforeElement\n */\n SortableList.prototype.moveElement = function(parentElement, beforeElement) {\n var dragEl = this.info.element;\n if (beforeElement.length && beforeElement[0] === dragEl[0]) {\n // Insert before the current position of the dragged element - nothing to do.\n return;\n }\n if (parentElement[0] === this.info.targetList[0] &&\n beforeElement.length === this.info.targetNextElement.length &&\n beforeElement[0] === this.info.targetNextElement[0]) {\n // Insert in the same location as the current position - nothing to do.\n return;\n }\n\n if (beforeElement.length) {\n // Move the dragged element before the specified element.\n parentElement[0].insertBefore(dragEl[0], beforeElement[0]);\n } else if (this.proxy && this.proxy.parent().length && this.proxy.parent()[0] === parentElement[0]) {\n // We need to move to the end of the list but the last element in this list is a proxy.\n // Always leave the proxy in the end of the list.\n parentElement[0].insertBefore(dragEl[0], this.proxy[0]);\n } else {\n // Insert in the end of a list (when proxy is in another list).\n parentElement[0].appendChild(dragEl[0]);\n }\n\n // Save the current position of the dragged element in the list.\n this.info.targetList = parentElement;\n this.info.targetNextElement = beforeElement;\n this.executeCallback(SortableList.EVENTS.DRAG);\n };\n\n /**\n * Finish dragging (when dropped or cancelled).\n * @private\n */\n SortableList.prototype.finishDragging = function() {\n this.resetDraggedClasses();\n if (this.config.autoScroll) {\n autoScroll.stop();\n }\n $(window).off('mousemove touchmove.notPassive mouseup touchend.notPassive', $.proxy(this.dragHandler, this));\n $(window).off('keypress', $.proxy(this.dragcancelHandler, this));\n this.executeCallback(SortableList.EVENTS.DRAGEND);\n this.info = null;\n };\n\n /**\n * Executes callback specified in sortable list parameters\n *\n * @private\n * @param {String} eventName\n */\n SortableList.prototype.executeCallback = function(eventName) {\n this.info.element.trigger(eventName, this.info);\n };\n\n /**\n * Handler from keypress event (cancel dragging when Esc is pressed)\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragcancelHandler = function(evt) {\n if (evt.type !== 'keypress' || evt.originalEvent.keyCode !== 27) {\n // Only cancel dragging when Esc was pressed.\n return;\n }\n // Dragging was cancelled. Return item to the original position.\n this.moveElement(this.info.sourceList, this.info.sourceNextElement);\n this.finishDragging();\n };\n\n /**\n * Returns the name of the current element to be used in the move dialogue\n *\n * @public\n * @param {jQuery} element\n * @return {Promise}\n */\n SortableList.prototype.getElementName = function(element) {\n return $.Deferred().resolve(element.text());\n };\n\n /**\n * Returns the label for the potential move destination, i.e. \"After ElementX\" or \"To the top of the list\"\n *\n * Note that we use \"after\" in the label for better UX\n *\n * @public\n * @param {jQuery} parentElement\n * @param {jQuery} afterElement\n * @return {Promise}\n */\n SortableList.prototype.getDestinationName = function(parentElement, afterElement) {\n if (!afterElement.length) {\n return str.get_string('movecontenttothetop', 'moodle');\n } else {\n return this.getElementName(afterElement)\n .then(function(name) {\n return str.get_string('movecontentafter', 'moodle', name);\n });\n }\n };\n\n /**\n * Returns the title for the move dialogue (\"Move elementY\")\n *\n * @public\n * @param {jQuery} element\n * @param {jQuery} handler\n * @return {Promise}\n */\n SortableList.prototype.getMoveDialogueTitle = function(element, handler) {\n if (handler.attr('title')) {\n return $.Deferred().resolve(handler.attr('title'));\n }\n return this.getElementName(element).then(function(name) {\n return str.get_string('movecontent', 'moodle', name);\n });\n };\n\n /**\n * Returns the list of possible move destinations\n *\n * @private\n * @return {Promise}\n */\n SortableList.prototype.getDestinationsList = function() {\n var addedLists = [],\n targets = $(this.config.targetListSelector),\n destinations = $('
          ').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":";;;;;;;;AAuBAA,qCAAO,CACH,SACA,2BACD,SAASC,EAAGC,eASFC,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 diff --git a/lib/amd/build/chart_pie.min.js.map b/lib/amd/build/chart_pie.min.js.map index cd167004104..8ba7e277e63 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 * @package core\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 * @alias module:core/chart_pie\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":";;;;;;;;AAuBAA,wBAAO,CAAC,oBAAoB,SAASC,MASjC,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 +{"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 * @package core\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 * @alias module:core/chart_pie\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":";;;;;;;;AAuBAA,wBAAO,CAAC,oBAAoB,SAASC,eASxBC,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 diff --git a/lib/amd/build/chart_series.min.js.map b/lib/amd/build/chart_series.min.js.map index 687eb94fada..05220861329 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 * @package core\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 * @alias module:core/chart_series\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 * @package core\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 * @alias module:core/chart_series\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 diff --git a/lib/amd/build/chartjs-lazy.min.js b/lib/amd/build/chartjs-lazy.min.js index 90f19997c1c..f6782492ad4 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(f){if("object"===("undefined"==typeof exports?"undefined":_typeof(exports))&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define("core/chartjs-lazy",[],f);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Chart=f()}}((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;olum2?(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.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)]}function rgb2lab(rgb){var xyz=rgb2xyz(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))]}function hsl2rgb(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}function hsv2rgb(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));v*=255;switch(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]}}function hwb2rgb(hwb){var i,v,f,n,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]}function cmyk2rgb(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))]}function xyz2rgb(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:r*=12.92,g=g>.0031308?1.055*Math.pow(g,1/2.4)-.055:g*=12.92,b=b>.0031308?1.055*Math.pow(b,1/2.4)-.055:b*=12.92,[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))]}function xyz2lab(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))]}function lab2xyz(lab){var x,y,z,y2,l=lab[0],a=lab[1],b=lab[2];return l<=8?y2=(y=100*l/903.3)/100*7.787+16/116:(y=100*Math.pow((l+16)/116,3),y2=Math.pow(y/100,1/3)),[x=x/95.047<=.008856?x=95.047*(a/500+y2-16/116)/7.787:95.047*Math.pow(a/500+y2,3),y,z=z/108.883<=.008859?z=108.883*(y2-b/200-16/116)/7.787:108.883*Math.pow(y2-b/200,3)]}function lab2lch(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]}function lab2rgb(args){return xyz2rgb(lab2xyz(args))}function lch2lab(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)]}function keyword2rgb(keyword){return cssKeywords[keyword]}module.exports={rgb2hsl:rgb2hsl,rgb2hsv:rgb2hsv,rgb2hwb:rgb2hwb,rgb2cmyk:rgb2cmyk,rgb2keyword:rgb2keyword,rgb2xyz:rgb2xyz,rgb2lab:rgb2lab,rgb2lch:function(args){return lab2lch(rgb2lab(args))},hsl2rgb:hsl2rgb,hsl2hsv:function(hsl){var h=hsl[0],s=hsl[1]/100,l=hsl[2]/100;if(0===l)return[0,0,0];return[h,100*(2*(s*=(l*=2)<=1?l:2-l)/(l+s)),100*((l+s)/2)]},hsl2hwb:function(args){return rgb2hwb(hsl2rgb(args))},hsl2cmyk:function(args){return rgb2cmyk(hsl2rgb(args))},hsl2keyword:function(args){return rgb2keyword(hsl2rgb(args))},hsv2rgb:hsv2rgb,hsv2hsl:function(hsv){var sl,l,h=hsv[0],s=hsv[1]/100,v=hsv[2]/100;return sl=s*v,[h,100*(sl=(sl/=(l=(2-s)*v)<=1?l:2-l)||0),100*(l/=2)]},hsv2hwb:function(args){return rgb2hwb(hsv2rgb(args))},hsv2cmyk:function(args){return rgb2cmyk(hsv2rgb(args))},hsv2keyword:function(args){return rgb2keyword(hsv2rgb(args))},hwb2rgb:hwb2rgb,hwb2hsl:function(args){return rgb2hsl(hwb2rgb(args))},hwb2hsv:function(args){return rgb2hsv(hwb2rgb(args))},hwb2cmyk:function(args){return rgb2cmyk(hwb2rgb(args))},hwb2keyword:function(args){return rgb2keyword(hwb2rgb(args))},cmyk2rgb:cmyk2rgb,cmyk2hsl:function(args){return rgb2hsl(cmyk2rgb(args))},cmyk2hsv:function(args){return rgb2hsv(cmyk2rgb(args))},cmyk2hwb:function(args){return rgb2hwb(cmyk2rgb(args))},cmyk2keyword:function(args){return rgb2keyword(cmyk2rgb(args))},keyword2rgb:keyword2rgb,keyword2hsl:function(args){return rgb2hsl(keyword2rgb(args))},keyword2hsv:function(args){return rgb2hsv(keyword2rgb(args))},keyword2hwb:function(args){return rgb2hwb(keyword2rgb(args))},keyword2cmyk:function(args){return rgb2cmyk(keyword2rgb(args))},keyword2lab:function(args){return rgb2lab(keyword2rgb(args))},keyword2xyz:function(args){return rgb2xyz(keyword2rgb(args))},xyz2rgb:xyz2rgb,xyz2lab:xyz2lab,xyz2lch:function(args){return lab2lch(xyz2lab(args))},lab2xyz:lab2xyz,lab2rgb:lab2rgb,lab2lch:lab2lch,lch2lab:lch2lab,lch2xyz:function(args){return lab2xyz(lch2lab(args))},lch2rgb:function(args){return lab2rgb(lch2lab(args))}};var cssKeywords={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]},reverseKeywords={};for(var key in cssKeywords)reverseKeywords[JSON.stringify(cssKeywords[key])]=key},{}],4:[function(require,module,exports){var conversions=require(3),convert=function(){return new Converter};for(var func in conversions){convert[func+"Raw"]=function(func){return function(arg){return"number"==typeof arg&&(arg=Array.prototype.slice.call(arguments)),conversions[func](arg)}}(func);var pair=/(\w+)2(\w+)/.exec(func),from=pair[1],to=pair[2];(convert[from]=convert[from]||{})[to]=convert[func]=function(func){return function(arg){"number"==typeof arg&&(arg=Array.prototype.slice.call(arguments));var val=conversions[func](arg);if("string"==typeof val||void 0===val)return val;for(var i=0;i>>0,i=0;i0)for(i=0;i=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 formatMoment(m,format){return m.isValid()?(format=expandFormat(format,m.localeData()),formatFunctions[format]=formatFunctions[format]||function(format){var i,length,input,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,matchWord=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){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(regexEscape(token.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 getSetYear=makeGetSet("FullYear",!0);function createDate(y,m,d,h,M,s,ms){var date=new Date(y,m,d,h,M,s,ms);return y<100&&y>=0&&isFinite(date.getFullYear())&&date.setFullYear(y),date}function createUTCDate(y){var date=new Date(Date.UTC.apply(null,arguments));return y<100&&y>=0&&isFinite(date.getUTCFullYear())&&date.setUTCFullYear(y),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}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)}));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("_");var defaultLocaleWeekdaysShort="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var defaultLocaleWeekdaysMin="Su_Mo_Tu_We_Th_Fr_Sa".split("_");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$1.call(this._weekdaysParse,llc))?ii:null:"ddd"===format?-1!==(ii=indexOf$1.call(this._shortWeekdaysParse,llc))?ii:null:-1!==(ii=indexOf$1.call(this._minWeekdaysParse,llc))?ii:null:"dddd"===format?-1!==(ii=indexOf$1.call(this._weekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._shortWeekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._minWeekdaysParse,llc))?ii:null:"ddd"===format?-1!==(ii=indexOf$1.call(this._shortWeekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._weekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._minWeekdaysParse,llc))?ii:null:-1!==(ii=indexOf$1.call(this._minWeekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._weekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._shortWeekdaysParse,llc))?ii:null}var defaultWeekdaysRegex=matchWord;var defaultWeekdaysShortRegex=matchWord;var defaultWeekdaysMinRegex=matchWord;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 meridiem(token,lowercase){addFormatToken(token,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),lowercase)}))}function matchMeridiem(isStrict,locale){return locale._meridiemParse}addFormatToken("H",["HH",2],0,"hour"),addFormatToken("h",["hh",2],0,hFormat),addFormatToken("k",["kk",2],0,(function(){return this.hours()||24})),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 globalLocale,getSetHour=makeGetSet("Hours",!0),baseConfig={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:defaultLocaleMonths,monthsShort:defaultLocaleMonthsShort,week:{dow:0,doy:6},weekdays:defaultLocaleWeekdays,weekdaysMin:defaultLocaleWeekdaysMin,weekdaysShort:defaultLocaleWeekdaysShort,meridiemParse:/[ap]\.?m?\.?/i},locales={},localeFamilies={};function normalizeLocale(key){return key?key.toLowerCase().replace("_","-"):key}function loadLocale(name){var oldLocale=null;if(!locales[name]&&void 0!==module&&module&&module.exports)try{oldLocale=globalLocale._abbr,require("./locale/"+name),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),globalLocale._abbr}function defineLocale(name,config){if(null!==config){var 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])return localeFamilies[config.parentLocale]||(localeFamilies[config.parentLocale]=[]),localeFamilies[config.parentLocale].push({name:name,config:config}),null;parentConfig=locales[config.parentLocale]._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 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 function(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 null}(key)}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}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;i10?"YYYY ":"YY "),timeFormat="HH:mm"+(match[4]?":ss":""),match[1]){var momentDay=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][new Date(match[2]).getDay()];if(match[1].substr(0,3)!==momentDay)return getParsingFlags(config).weekdayMismatch=!0,void(config._isValid=!1)}switch(match[5].length){case 2:timezone=0===timezoneIndex?" +0000":((timezoneIndex="YXWVUTSRQPONZABCDEFGHIKLM".indexOf(match[5][1].toUpperCase())-12)<0?" -":" +")+(""+timezoneIndex).replace(/^-?/,"0").match(/..$/)[0]+"00";break;case 4:timezone=timezones[match[5]];break;default:timezone=timezones[" GMT"]}match[5]=timezone,config._i=match.splice(1).join("")," ZZ",config._f=dayFormat+dateFormat+timeFormat+" ZZ",configFromStringAndFormat(config),getParsingFlags(config).rfc2822=!0}else config._isValid=!1}function defaults(a,b,c){return null!=a?a:null!=b?b:c}function configFromArray(config){var i,date,currentDate,yearToUse,input=[];if(!config._d){for(currentDate=function(config){var nowValue=new Date(hooks.now());return config._useUTC?[nowValue.getUTCFullYear(),nowValue.getUTCMonth(),nowValue.getUTCDate()]:[nowValue.getFullYear(),nowValue.getMonth(),nowValue.getDate()]}(config),config._w&&null==config._a[DATE]&&null==config._a[MONTH]&&function(config){var w,weekYear,week,weekday,dow,doy,temp,weekdayOverflow;if(w=config._w,null!=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)}(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),null!=config._tzm&&config._d.setUTCMinutes(config._d.getUTCMinutes()-config._tzm),config._nextDay&&(config._a[HOUR]=24)}}function configFromStringAndFormat(config){if(config._f!==hooks.ISO_8601)if(config._f!==hooks.RFC_2822){config._a=[],getParsingFlags(config).empty=!0;var i,parsedInput,tokens,token,skipped,string=""+config._i,stringLength=string.length,totalParsedInputLength=0;for(tokens=expandFormat(config._f,config._locale).match(formattingTokens)||[],i=0;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]=function(locale,hour,meridiem){var isPm;if(null==meridiem)return hour;return 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}(config._locale,config._a[HOUR],config._meridiem),configFromArray(config),checkOverflow(config)}else configFromRFC2822(config);else configFromISO(config)}function prepareConfig(config){var input=config._i,format=config._f;return config._locale=config._locale||getLocale(config._l),null===input||void 0===format&&""===input?createInvalid({nullInput:!0}):("string"==typeof input&&(config._i=input=config._locale.preparse(input)),isMoment(input)?new Moment(checkOverflow(input)):(isDate(input)?config._d=input:isArray(format)?function(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;i(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}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);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);addFormatToken("z",0,0,"zoneAbbr"),addFormatToken("zz",0,0,"zoneName");var proto=Moment.prototype;function preParsePostFormat(string){return string}proto.add=add,proto.calendar=function(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)))},proto.clone=function(){return new Moment(this)},proto.diff=function(input,units,asFloat){var that,zoneDelta,delta,output;return this.isValid()&&(that=cloneWithOffset(input,this)).isValid()?(zoneDelta=6e4*(that.utcOffset()-this.utcOffset()),"year"===(units=normalizeUnits(units))||"month"===units||"quarter"===units?(output=function(a,b){var adjust,wholeMonthDiff=12*(b.year()-a.year())+(b.month()-a.month()),anchor=a.clone().add(wholeMonthDiff,"months");adjust=b-anchor<0?(b-anchor)/(anchor-a.clone().add(wholeMonthDiff-1,"months")):(b-anchor)/(a.clone().add(wholeMonthDiff+1,"months")-anchor);return-(wholeMonthDiff+adjust)||0}(this,that),"quarter"===units?output/=3:"year"===units&&(output/=12)):(delta=this-that,output="second"===units?delta/1e3:"minute"===units?delta/6e4:"hour"===units?delta/36e5:"day"===units?(delta-zoneDelta)/864e5:"week"===units?(delta-zoneDelta)/6048e5:delta),asFloat?output:absFloor(output)):NaN},proto.endOf=function(units){return void 0===(units=normalizeUnits(units))||"millisecond"===units?this:("date"===units&&(units="day"),this.startOf(units).add(1,"isoWeek"===units?"week":units).subtract(1,"ms"))},proto.format=function(inputString){inputString||(inputString=this.isUtc()?hooks.defaultFormatUtc:hooks.defaultFormat);var output=formatMoment(this,inputString);return this.localeData().postformat(output)},proto.from=function(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()},proto.fromNow=function(withoutSuffix){return this.from(createLocal(),withoutSuffix)},proto.to=function(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()},proto.toNow=function(withoutSuffix){return this.to(createLocal(),withoutSuffix)},proto.get=function(units){return isFunction(this[units=normalizeUnits(units)])?this[units]():this},proto.invalidAt=function(){return getParsingFlags(this).overflow},proto.isAfter=function(input,units){var localInput=isMoment(input)?input:createLocal(input);return!(!this.isValid()||!localInput.isValid())&&("millisecond"===(units=normalizeUnits(isUndefined(units)?"millisecond":units))?this.valueOf()>localInput.valueOf():localInput.valueOf()9999?formatMoment(m,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):isFunction(Date.prototype.toISOString)?this.toDate().toISOString():formatMoment(m,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},proto.inspect=function(){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",suffix=zone+'[")]';return this.format(prefix+year+"-MM-DD[T]HH:mm:ss.SSS"+suffix)},proto.toJSON=function(){return this.isValid()?this.toISOString():null},proto.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},proto.unix=function(){return Math.floor(this.valueOf()/1e3)},proto.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},proto.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},proto.year=getSetYear,proto.isLeapYear=function(){return isLeapYear(this.year())},proto.weekYear=function(input){return getSetWeekYearHelper.call(this,input,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},proto.isoWeekYear=function(input){return getSetWeekYearHelper.call(this,input,this.isoWeek(),this.isoWeekday(),1,4)},proto.quarter=proto.quarters=function(input){return null==input?Math.ceil((this.month()+1)/3):this.month(3*(input-1)+this.month()%3)},proto.month=getSetMonth,proto.daysInMonth=function(){return daysInMonth(this.year(),this.month())},proto.week=proto.weeks=function(input){var week=this.localeData().week(this);return null==input?week:this.add(7*(input-week),"d")},proto.isoWeek=proto.isoWeeks=function(input){var week=weekOfYear(this,1,4).week;return null==input?week:this.add(7*(input-week),"d")},proto.weeksInYear=function(){var weekInfo=this.localeData()._week;return weeksInYear(this.year(),weekInfo.dow,weekInfo.doy)},proto.isoWeeksInYear=function(){return weeksInYear(this.year(),1,4)},proto.date=getSetDayOfMonth,proto.day=proto.days=function(input){if(!this.isValid())return null!=input?this:NaN;var day=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=input?(input=function(input,locale){return"string"!=typeof input?input:isNaN(input)?"number"==typeof(input=locale.weekdaysParse(input))?input:null:parseInt(input,10)}(input,this.localeData()),this.add(input-day,"d")):day},proto.weekday=function(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")},proto.isoWeekday=function(input){if(!this.isValid())return null!=input?this:NaN;if(null!=input){var weekday=function(input,locale){return"string"==typeof input?locale.weekdaysParse(input)%7||7:isNaN(input)?null:input}(input,this.localeData());return this.day(this.day()%7?weekday:weekday-7)}return this.day()||7},proto.dayOfYear=function(input){var dayOfYear=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==input?dayOfYear:this.add(input-dayOfYear,"d")},proto.hour=proto.hours=getSetHour,proto.minute=proto.minutes=getSetMinute,proto.second=proto.seconds=getSetSecond,proto.millisecond=proto.milliseconds=getSetMillisecond,proto.utcOffset=function(input,keepLocalTime,keepMinutes){var localAdjust,offset=this._offset||0;if(!this.isValid())return null!=input?this:NaN;if(null!=input){if("string"==typeof input){if(null===(input=offsetFromString(matchShortOffset,input)))return this}else Math.abs(input)<16&&!keepMinutes&&(input*=60);return!this._isUTC&&keepLocalTime&&(localAdjust=getDateOffset(this)),this._offset=input,this._isUTC=!0,null!=localAdjust&&this.add(localAdjust,"m"),offset!==input&&(!keepLocalTime||this._changeInProgress?addSubtract(this,createDuration(input-offset,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,hooks.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?offset:getDateOffset(this)},proto.utc=function(keepLocalTime){return this.utcOffset(0,keepLocalTime)},proto.local=function(keepLocalTime){return this._isUTC&&(this.utcOffset(0,keepLocalTime),this._isUTC=!1,keepLocalTime&&this.subtract(getDateOffset(this),"m")),this},proto.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var tZone=offsetFromString(matchOffset,this._i);null!=tZone?this.utcOffset(tZone):this.utcOffset(0,!0)}return this},proto.hasAlignedHourOffset=function(input){return!!this.isValid()&&(input=input?createLocal(input).utcOffset():0,(this.utcOffset()-input)%60==0)},proto.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},proto.isLocal=function(){return!!this.isValid()&&!this._isUTC},proto.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},proto.isUtc=isUtc,proto.isUTC=isUtc,proto.zoneAbbr=function(){return this._isUTC?"UTC":""},proto.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},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/",(function(input,keepLocalTime){return null!=input?("string"!=typeof input&&(input=-input),this.utcOffset(input,keepLocalTime),this):-this.utcOffset()})),proto.isDSTShifted=deprecate("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){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}));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}proto$1.calendar=function(key,mom,now){var output=this._calendar[key]||this._calendar.sameElse;return isFunction(output)?output.call(mom,now):output},proto$1.longDateFormat=function(key){var format=this._longDateFormat[key],formatUpper=this._longDateFormat[key.toUpperCase()];return format||!formatUpper?format:(this._longDateFormat[key]=formatUpper.replace(/MMMM|MM|DD|dddd/g,(function(val){return val.slice(1)})),this._longDateFormat[key])},proto$1.invalidDate=function(){return this._invalidDate},proto$1.ordinal=function(number){return this._ordinal.replace("%d",number)},proto$1.preparse=preParsePostFormat,proto$1.postformat=preParsePostFormat,proto$1.relativeTime=function(number,withoutSuffix,string,isFuture){var output=this._relativeTime[string];return isFunction(output)?output(number,withoutSuffix,string,isFuture):output.replace(/%d/i,number)},proto$1.pastFuture=function(diff,output){var format=this._relativeTime[diff>0?"future":"past"];return isFunction(format)?format(output):format.replace(/%s/i,output)},proto$1.set=function(config){var prop,i;for(i in config)isFunction(prop=config[i])?this[i]=prop:this["_"+i]=prop;this._config=config,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},proto$1.months=function(m,format){return m?isArray(this._months)?this._months[m.month()]:this._months[(this._months.isFormat||MONTHS_IN_FORMAT).test(format)?"format":"standalone"][m.month()]:isArray(this._months)?this._months:this._months.standalone},proto$1.monthsShort=function(m,format){return m?isArray(this._monthsShort)?this._monthsShort[m.month()]:this._monthsShort[MONTHS_IN_FORMAT.test(format)?"format":"standalone"][m.month()]:isArray(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},proto$1.monthsParse=function(monthName,format,strict){var i,mom,regex;if(this._monthsParseExact)return handleStrictParse.call(this,monthName,format,strict);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(mom=createUTC([2e3,i]),strict&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(mom,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(mom,"").replace(".","")+"$","i")),strict||this._monthsParse[i]||(regex="^"+this.months(mom,"")+"|^"+this.monthsShort(mom,""),this._monthsParse[i]=new RegExp(regex.replace(".",""),"i")),strict&&"MMMM"===format&&this._longMonthsParse[i].test(monthName))return i;if(strict&&"MMM"===format&&this._shortMonthsParse[i].test(monthName))return i;if(!strict&&this._monthsParse[i].test(monthName))return i}},proto$1.monthsRegex=function(isStrict){return this._monthsParseExact?(hasOwnProp(this,"_monthsRegex")||computeMonthsParse.call(this),isStrict?this._monthsStrictRegex:this._monthsRegex):(hasOwnProp(this,"_monthsRegex")||(this._monthsRegex=defaultMonthsRegex),this._monthsStrictRegex&&isStrict?this._monthsStrictRegex:this._monthsRegex)},proto$1.monthsShortRegex=function(isStrict){return this._monthsParseExact?(hasOwnProp(this,"_monthsRegex")||computeMonthsParse.call(this),isStrict?this._monthsShortStrictRegex:this._monthsShortRegex):(hasOwnProp(this,"_monthsShortRegex")||(this._monthsShortRegex=defaultMonthsShortRegex),this._monthsShortStrictRegex&&isStrict?this._monthsShortStrictRegex:this._monthsShortRegex)},proto$1.week=function(mom){return weekOfYear(mom,this._week.dow,this._week.doy).week},proto$1.firstDayOfYear=function(){return this._week.doy},proto$1.firstDayOfWeek=function(){return this._week.dow},proto$1.weekdays=function(m,format){return m?isArray(this._weekdays)?this._weekdays[m.day()]:this._weekdays[this._weekdays.isFormat.test(format)?"format":"standalone"][m.day()]:isArray(this._weekdays)?this._weekdays:this._weekdays.standalone},proto$1.weekdaysMin=function(m){return m?this._weekdaysMin[m.day()]:this._weekdaysMin},proto$1.weekdaysShort=function(m){return m?this._weekdaysShort[m.day()]:this._weekdaysShort},proto$1.weekdaysParse=function(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}},proto$1.weekdaysRegex=function(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)},proto$1.weekdaysShortRegex=function(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)},proto$1.weekdaysMinRegex=function(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)},proto$1.isPM=function(input){return"p"===(input+"").toLowerCase().charAt(0)},proto$1.meridiem=function(hours,minutes,isLower){return hours>11?isLower?"pm":"PM":isLower?"am":"AM"},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 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 absCeil(number){return number<0?Math.floor(number):Math.ceil(number)}function daysToMonths(days){return 4800*days/146097}function monthsToDays(months){return 146097*months/4800}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"),asYears=makeAs("y");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");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)}var abs$1=Math.abs;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,total=this.asSeconds();return total?(total<0?"-":"")+"P"+(Y?Y+"Y":"")+(M?M+"M":"")+(D?D+"D":"")+(h||m||s?"T":"")+(h?h+"H":"")+(m?m+"M":"")+(s?s+"S":""):"P0D"}var proto$2=Duration.prototype;return proto$2.isValid=function(){return this._isValid},proto$2.abs=function(){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},proto$2.add=function(input,value){return addSubtract$1(this,input,value,1)},proto$2.subtract=function(input,value){return addSubtract$1(this,input,value,-1)},proto$2.as=function(units){if(!this.isValid())return NaN;var days,months,milliseconds=this._milliseconds;if("month"===(units=normalizeUnits(units))||"year"===units)return days=this._days+milliseconds/864e5,months=this._months+daysToMonths(days),"month"===units?months:months/12;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)}},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.asYears=asYears,proto$2.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*toInt(this._months/12):NaN},proto$2._bubble=function(){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},proto$2.get=function(units){return units=normalizeUnits(units),this.isValid()?this[units+"s"]():NaN},proto$2.milliseconds=milliseconds,proto$2.seconds=seconds,proto$2.minutes=minutes,proto$2.hours=hours,proto$2.days=days,proto$2.weeks=function(){return absFloor(this.days()/7)},proto$2.months=months,proto$2.years=years,proto$2.humanize=function(withSuffix){if(!this.isValid())return this.localeData().invalidDate();var locale=this.localeData(),output=function(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)}(this,!withSuffix,locale);return withSuffix&&(output=locale.pastFuture(+this,output)),locale.postformat(output)},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",/[+-]?\d+(\.\d{1,3})?/),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.18.1",hookCallback=createLocal,hooks.fn=proto,hooks.min=function(){return pickBy("isBefore",[].slice.call(arguments,0))},hooks.max=function(){return pickBy("isAfter",[].slice.call(arguments,0))},hooks.now=function(){return Date.now?Date.now():+new Date},hooks.utc=createUTC,hooks.unix=function(input){return createLocal(1e3*input)},hooks.months=function(format,index){return listMonthsImpl(format,index,"months")},hooks.isDate=isDate,hooks.locale=getSetGlobalLocale,hooks.invalid=createInvalid,hooks.duration=createDuration,hooks.isMoment=isMoment,hooks.weekdays=function(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdays")},hooks.parseZone=function(){return createLocal.apply(null,arguments).parseZone()},hooks.localeData=getLocale,hooks.isDuration=isDuration,hooks.monthsShort=function(format,index){return listMonthsImpl(format,index,"monthsShort")},hooks.weekdaysMin=function(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdaysMin")},hooks.defineLocale=defineLocale,hooks.updateLocale=function(name,config){if(null!=config){var locale,parentConfig=baseConfig;null!=locales[name]&&(parentConfig=locales[name]._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]},hooks.locales=function(){return keys$1(locales)},hooks.weekdaysShort=function(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdaysShort")},hooks.normalizeUnits=normalizeUnits,hooks.relativeTimeRounding=function(roundingFunction){return void 0===roundingFunction?round:"function"==typeof roundingFunction&&(round=roundingFunction,!0)},hooks.relativeTimeThreshold=function(threshold,limit){return void 0!==thresholds[threshold]&&(void 0===limit?thresholds[threshold]:(thresholds[threshold]=limit,"s"===threshold&&(thresholds.ss=limit-1),!0))},hooks.calendarFormat=function(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"},hooks.prototype=proto,hooks}))},{}],7:[function(require,module,exports){var Chart=require(29)();Chart.helpers=require(45),require(27)(Chart),Chart.defaults=require(25),Chart.Element=require(26),Chart.elements=require(40),Chart.Interaction=require(28),Chart.platform=require(48),require(31)(Chart),require(22)(Chart),require(23)(Chart),require(24)(Chart),require(30)(Chart),require(33)(Chart),require(32)(Chart),require(35)(Chart),require(54)(Chart),require(52)(Chart),require(53)(Chart),require(55)(Chart),require(56)(Chart),require(57)(Chart),require(15)(Chart),require(16)(Chart),require(17)(Chart),require(18)(Chart),require(19)(Chart),require(20)(Chart),require(21)(Chart),require(8)(Chart),require(9)(Chart),require(10)(Chart),require(11)(Chart),require(12)(Chart),require(13)(Chart),require(14)(Chart);var plugins=[];plugins.push(require(49)(Chart),require(50)(Chart),require(51)(Chart)),Chart.plugins.register(plugins),Chart.platform.initialize(),module.exports=Chart,"undefined"!=typeof window&&(window.Chart=Chart),Chart.canvasHelpers=Chart.helpers.canvas},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,35:35,40:40,45:45,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,8:8,9:9}],8:[function(require,module,exports){module.exports=function(Chart){Chart.Bar=function(context,config){return config.type="bar",new Chart(context,config)}}},{}],9:[function(require,module,exports){module.exports=function(Chart){Chart.Bubble=function(context,config){return config.type="bubble",new Chart(context,config)}}},{}],10:[function(require,module,exports){module.exports=function(Chart){Chart.Doughnut=function(context,config){return config.type="doughnut",new Chart(context,config)}}},{}],11:[function(require,module,exports){module.exports=function(Chart){Chart.Line=function(context,config){return config.type="line",new Chart(context,config)}}},{}],12:[function(require,module,exports){module.exports=function(Chart){Chart.PolarArea=function(context,config){return config.type="polarArea",new Chart(context,config)}}},{}],13:[function(require,module,exports){module.exports=function(Chart){Chart.Radar=function(context,config){return config.type="radar",new Chart(context,config)}}},{}],14:[function(require,module,exports){module.exports=function(Chart){Chart.Scatter=function(context,config){return config.type="scatter",new Chart(context,config)}}},{}],15:[function(require,module,exports){var defaults=require(25),elements=require(40),helpers=require(45);defaults._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),defaults._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(item,data){var title="";return item.length>0&&(item[0].yLabel?title=item[0].yLabel:data.labels.length>0&&item[0].index=0&&ivalue>0)&&(start+=ivalue));return base=scale.getPixelForValue(start),{size:size=((head=scale.getPixelForValue(start+value))-base)/2,base:base,head:head,center:head+size/2}},calculateBarIndexPixels:function(datasetIndex,index,ruler){var leftSampleSize,rightSampleSize,leftCategorySize,fullBarSize,size,options=ruler.scale.options,stackIndex=this.getStackIndex(datasetIndex),pixels=ruler.pixels,base=pixels[index],length=pixels.length,start=ruler.start,end=ruler.end;return 1===length?(leftSampleSize=base>start?base-start:end-base,rightSampleSize=base0&&(leftSampleSize=(base-pixels[index-1])/2,index===length-1&&(rightSampleSize=leftSampleSize)),index');var data=chart.data,datasets=data.datasets,labels=data.labels;if(datasets.length)for(var i=0;i'),labels[i]&&text.push(labels[i]),text.push("");return text.push(""),text.join("")},legend:{labels:{generateLabels:function(chart){var data=chart.data;return data.labels.length&&data.datasets.length?data.labels.map((function(label,i){var meta=chart.getDatasetMeta(0),ds=data.datasets[0],arc=meta.data[i],custom=arc&&arc.custom||{},valueAtIndexOrDefault=helpers.valueAtIndexOrDefault,arcOpts=chart.options.elements.arc;return{text:label,fillStyle:custom.backgroundColor?custom.backgroundColor:valueAtIndexOrDefault(ds.backgroundColor,i,arcOpts.backgroundColor),strokeStyle:custom.borderColor?custom.borderColor:valueAtIndexOrDefault(ds.borderColor,i,arcOpts.borderColor),lineWidth:custom.borderWidth?custom.borderWidth:valueAtIndexOrDefault(ds.borderWidth,i,arcOpts.borderWidth),hidden:isNaN(ds.data[i])||meta.data[i].hidden,index:i}})):[]}},onClick:function(e,legendItem){var i,ilen,meta,index=legendItem.index,chart=this.chart;for(i=0,ilen=(chart.data.datasets||[]).length;i=Math.PI?-1:startAngle<-Math.PI?1:0))+circumference,start={x:Math.cos(startAngle),y:Math.sin(startAngle)},end={x:Math.cos(endAngle),y:Math.sin(endAngle)},contains0=startAngle<=0&&endAngle>=0||startAngle<=2*Math.PI&&2*Math.PI<=endAngle,contains90=startAngle<=.5*Math.PI&&.5*Math.PI<=endAngle||startAngle<=2.5*Math.PI&&2.5*Math.PI<=endAngle,contains180=startAngle<=-Math.PI&&-Math.PI<=endAngle||startAngle<=Math.PI&&Math.PI<=endAngle,contains270=startAngle<=.5*-Math.PI&&.5*-Math.PI<=endAngle||startAngle<=1.5*Math.PI&&1.5*Math.PI<=endAngle,cutout=cutoutPercentage/100,min={x:contains180?-1:Math.min(start.x*(start.x<0?1:cutout),end.x*(end.x<0?1:cutout)),y:contains270?-1:Math.min(start.y*(start.y<0?1:cutout),end.y*(end.y<0?1:cutout))},max={x:contains0?1:Math.max(start.x*(start.x>0?1:cutout),end.x*(end.x>0?1:cutout)),y:contains90?1:Math.max(start.y*(start.y>0?1:cutout),end.y*(end.y>0?1:cutout))},size={width:.5*(max.x-min.x),height:.5*(max.y-min.y)};minSize=Math.min(availableWidth/size.width,availableHeight/size.height),offset={x:-.5*(max.x+min.x),y:-.5*(max.y+min.y)}}chart.borderWidth=me.getMaxBorderWidth(meta.data),chart.outerRadius=Math.max((minSize-chart.borderWidth)/2,0),chart.innerRadius=Math.max(cutoutPercentage?chart.outerRadius/100*cutoutPercentage:0,0),chart.radiusLength=(chart.outerRadius-chart.innerRadius)/chart.getVisibleDatasetCount(),chart.offsetX=offset.x*chart.outerRadius,chart.offsetY=offset.y*chart.outerRadius,meta.total=me.calculateTotal(),me.outerRadius=chart.outerRadius-chart.radiusLength*me.getRingIndex(me.index),me.innerRadius=Math.max(me.outerRadius-chart.radiusLength,0),helpers.each(meta.data,(function(arc,index){me.updateElement(arc,index,reset)}))},updateElement:function(arc,index,reset){var me=this,chart=me.chart,chartArea=chart.chartArea,opts=chart.options,animationOpts=opts.animation,centerX=(chartArea.left+chartArea.right)/2,centerY=(chartArea.top+chartArea.bottom)/2,startAngle=opts.rotation,endAngle=opts.rotation,dataset=me.getDataset(),circumference=reset&&animationOpts.animateRotate||arc.hidden?0:me.calculateCircumference(dataset.data[index])*(opts.circumference/(2*Math.PI)),innerRadius=reset&&animationOpts.animateScale?0:me.innerRadius,outerRadius=reset&&animationOpts.animateScale?0:me.outerRadius,valueAtIndexOrDefault=helpers.valueAtIndexOrDefault;helpers.extend(arc,{_datasetIndex:me.index,_index:index,_model:{x:centerX+chart.offsetX,y:centerY+chart.offsetY,startAngle:startAngle,endAngle:endAngle,circumference:circumference,outerRadius:outerRadius,innerRadius:innerRadius,label:valueAtIndexOrDefault(dataset.label,index,chart.data.labels[index])}});var model=arc._model;this.removeHoverStyle(arc),reset&&animationOpts.animateRotate||(model.startAngle=0===index?opts.rotation:me.getMeta().data[index-1]._model.endAngle,model.endAngle=model.startAngle+model.circumference),arc.pivot()},removeHoverStyle:function(arc){Chart.DatasetController.prototype.removeHoverStyle.call(this,arc,this.chart.options.elements.arc)},calculateTotal:function(){var value,dataset=this.getDataset(),meta=this.getMeta(),total=0;return helpers.each(meta.data,(function(element,index){value=dataset.data[index],isNaN(value)||element.hidden||(total+=Math.abs(value))})),total},calculateCircumference:function(value){var total=this.getMeta().total;return total>0&&!isNaN(value)?2*Math.PI*(value/total):0},getMaxBorderWidth:function(arcs){for(var borderWidth,hoverWidth,max=0,index=this.index,length=arcs.length,i=0;i(max=borderWidth>max?borderWidth:max)?hoverWidth:max;return max}})}},{25:25,40:40,45:45}],18:[function(require,module,exports){var defaults=require(25),elements=require(40),helpers=require(45);defaults._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}}),module.exports=function(Chart){function lineEnabled(dataset,options){return helpers.valueOrDefault(dataset.showLine,options.showLines)}Chart.controllers.line=Chart.DatasetController.extend({datasetElementType:elements.Line,dataElementType:elements.Point,update:function(reset){var i,ilen,custom,me=this,meta=me.getMeta(),line=meta.dataset,points=meta.data||[],options=me.chart.options,lineElementOptions=options.elements.line,scale=me.getScaleForId(meta.yAxisID),dataset=me.getDataset(),showLine=lineEnabled(dataset,options);for(showLine&&(custom=line.custom||{},void 0!==dataset.tension&&void 0===dataset.lineTension&&(dataset.lineTension=dataset.tension),line._scale=scale,line._datasetIndex=me.index,line._children=points,line._model={spanGaps:dataset.spanGaps?dataset.spanGaps:options.spanGaps,tension:custom.tension?custom.tension:helpers.valueOrDefault(dataset.lineTension,lineElementOptions.tension),backgroundColor:custom.backgroundColor?custom.backgroundColor:dataset.backgroundColor||lineElementOptions.backgroundColor,borderWidth:custom.borderWidth?custom.borderWidth:dataset.borderWidth||lineElementOptions.borderWidth,borderColor:custom.borderColor?custom.borderColor:dataset.borderColor||lineElementOptions.borderColor,borderCapStyle:custom.borderCapStyle?custom.borderCapStyle:dataset.borderCapStyle||lineElementOptions.borderCapStyle,borderDash:custom.borderDash?custom.borderDash:dataset.borderDash||lineElementOptions.borderDash,borderDashOffset:custom.borderDashOffset?custom.borderDashOffset:dataset.borderDashOffset||lineElementOptions.borderDashOffset,borderJoinStyle:custom.borderJoinStyle?custom.borderJoinStyle:dataset.borderJoinStyle||lineElementOptions.borderJoinStyle,fill:custom.fill?custom.fill:void 0!==dataset.fill?dataset.fill:lineElementOptions.fill,steppedLine:custom.steppedLine?custom.steppedLine:helpers.valueOrDefault(dataset.steppedLine,lineElementOptions.stepped),cubicInterpolationMode:custom.cubicInterpolationMode?custom.cubicInterpolationMode:helpers.valueOrDefault(dataset.cubicInterpolationMode,lineElementOptions.cubicInterpolationMode)},line.pivot()),i=0,ilen=points.length;i');var data=chart.data,datasets=data.datasets,labels=data.labels;if(datasets.length)for(var i=0;i'),labels[i]&&text.push(labels[i]),text.push("");return text.push(""),text.join("")},legend:{labels:{generateLabels:function(chart){var data=chart.data;return data.labels.length&&data.datasets.length?data.labels.map((function(label,i){var meta=chart.getDatasetMeta(0),ds=data.datasets[0],custom=meta.data[i].custom||{},valueAtIndexOrDefault=helpers.valueAtIndexOrDefault,arcOpts=chart.options.elements.arc;return{text:label,fillStyle:custom.backgroundColor?custom.backgroundColor:valueAtIndexOrDefault(ds.backgroundColor,i,arcOpts.backgroundColor),strokeStyle:custom.borderColor?custom.borderColor:valueAtIndexOrDefault(ds.borderColor,i,arcOpts.borderColor),lineWidth:custom.borderWidth?custom.borderWidth:valueAtIndexOrDefault(ds.borderWidth,i,arcOpts.borderWidth),hidden:isNaN(ds.data[i])||meta.data[i].hidden,index:i}})):[]}},onClick:function(e,legendItem){var i,ilen,meta,index=legendItem.index,chart=this.chart;for(i=0,ilen=(chart.data.datasets||[]).length;i0&&!isNaN(value)?2*Math.PI/count:0}})}},{25:25,40:40,45:45}],20:[function(require,module,exports){var defaults=require(25),elements=require(40),helpers=require(45);defaults._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}}),module.exports=function(Chart){Chart.controllers.radar=Chart.DatasetController.extend({datasetElementType:elements.Line,dataElementType:elements.Point,linkScales:helpers.noop,update:function(reset){var me=this,meta=me.getMeta(),line=meta.dataset,points=meta.data,custom=line.custom||{},dataset=me.getDataset(),lineElementOptions=me.chart.options.elements.line,scale=me.chart.scale;void 0!==dataset.tension&&void 0===dataset.lineTension&&(dataset.lineTension=dataset.tension),helpers.extend(meta.dataset,{_datasetIndex:me.index,_scale:scale,_children:points,_loop:!0,_model:{tension:custom.tension?custom.tension:helpers.valueOrDefault(dataset.lineTension,lineElementOptions.tension),backgroundColor:custom.backgroundColor?custom.backgroundColor:dataset.backgroundColor||lineElementOptions.backgroundColor,borderWidth:custom.borderWidth?custom.borderWidth:dataset.borderWidth||lineElementOptions.borderWidth,borderColor:custom.borderColor?custom.borderColor:dataset.borderColor||lineElementOptions.borderColor,fill:custom.fill?custom.fill:void 0!==dataset.fill?dataset.fill:lineElementOptions.fill,borderCapStyle:custom.borderCapStyle?custom.borderCapStyle:dataset.borderCapStyle||lineElementOptions.borderCapStyle,borderDash:custom.borderDash?custom.borderDash:dataset.borderDash||lineElementOptions.borderDash,borderDashOffset:custom.borderDashOffset?custom.borderDashOffset:dataset.borderDashOffset||lineElementOptions.borderDashOffset,borderJoinStyle:custom.borderJoinStyle?custom.borderJoinStyle:dataset.borderJoinStyle||lineElementOptions.borderJoinStyle}}),meta.dataset.pivot(),helpers.each(points,(function(point,index){me.updateElement(point,index,reset)}),me),me.updateBezierControlPoints()},updateElement:function(point,index,reset){var me=this,custom=point.custom||{},dataset=me.getDataset(),scale=me.chart.scale,pointElementOptions=me.chart.options.elements.point,pointPosition=scale.getPointPositionForValue(index,dataset.data[index]);void 0!==dataset.radius&&void 0===dataset.pointRadius&&(dataset.pointRadius=dataset.radius),void 0!==dataset.hitRadius&&void 0===dataset.pointHitRadius&&(dataset.pointHitRadius=dataset.hitRadius),helpers.extend(point,{_datasetIndex:me.index,_index:index,_scale:scale,_model:{x:reset?scale.xCenter:pointPosition.x,y:reset?scale.yCenter:pointPosition.y,tension:custom.tension?custom.tension:helpers.valueOrDefault(dataset.lineTension,me.chart.options.elements.line.tension),radius:custom.radius?custom.radius:helpers.valueAtIndexOrDefault(dataset.pointRadius,index,pointElementOptions.radius),backgroundColor:custom.backgroundColor?custom.backgroundColor:helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor,index,pointElementOptions.backgroundColor),borderColor:custom.borderColor?custom.borderColor:helpers.valueAtIndexOrDefault(dataset.pointBorderColor,index,pointElementOptions.borderColor),borderWidth:custom.borderWidth?custom.borderWidth:helpers.valueAtIndexOrDefault(dataset.pointBorderWidth,index,pointElementOptions.borderWidth),pointStyle:custom.pointStyle?custom.pointStyle:helpers.valueAtIndexOrDefault(dataset.pointStyle,index,pointElementOptions.pointStyle),hitRadius:custom.hitRadius?custom.hitRadius:helpers.valueAtIndexOrDefault(dataset.pointHitRadius,index,pointElementOptions.hitRadius)}}),point._model.skip=custom.skip?custom.skip:isNaN(point._model.x)||isNaN(point._model.y)},updateBezierControlPoints:function(){var chartArea=this.chart.chartArea,meta=this.getMeta();helpers.each(meta.data,(function(point,index){var model=point._model,controlPoints=helpers.splineCurve(helpers.previousItem(meta.data,index,!0)._model,model,helpers.nextItem(meta.data,index,!0)._model,model.tension);model.controlPointPreviousX=Math.max(Math.min(controlPoints.previous.x,chartArea.right),chartArea.left),model.controlPointPreviousY=Math.max(Math.min(controlPoints.previous.y,chartArea.bottom),chartArea.top),model.controlPointNextX=Math.max(Math.min(controlPoints.next.x,chartArea.right),chartArea.left),model.controlPointNextY=Math.max(Math.min(controlPoints.next.y,chartArea.bottom),chartArea.top),point.pivot()}))},setHoverStyle:function(point){var dataset=this.chart.data.datasets[point._datasetIndex],custom=point.custom||{},index=point._index,model=point._model;model.radius=custom.hoverRadius?custom.hoverRadius:helpers.valueAtIndexOrDefault(dataset.pointHoverRadius,index,this.chart.options.elements.point.hoverRadius),model.backgroundColor=custom.hoverBackgroundColor?custom.hoverBackgroundColor:helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor,index,helpers.getHoverColor(model.backgroundColor)),model.borderColor=custom.hoverBorderColor?custom.hoverBorderColor:helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor,index,helpers.getHoverColor(model.borderColor)),model.borderWidth=custom.hoverBorderWidth?custom.hoverBorderWidth:helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth,index,model.borderWidth)},removeHoverStyle:function(point){var dataset=this.chart.data.datasets[point._datasetIndex],custom=point.custom||{},index=point._index,model=point._model,pointElementOptions=this.chart.options.elements.point;model.radius=custom.radius?custom.radius:helpers.valueAtIndexOrDefault(dataset.pointRadius,index,pointElementOptions.radius),model.backgroundColor=custom.backgroundColor?custom.backgroundColor:helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor,index,pointElementOptions.backgroundColor),model.borderColor=custom.borderColor?custom.borderColor:helpers.valueAtIndexOrDefault(dataset.pointBorderColor,index,pointElementOptions.borderColor),model.borderWidth=custom.borderWidth?custom.borderWidth:helpers.valueAtIndexOrDefault(dataset.pointBorderWidth,index,pointElementOptions.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(require,module,exports){require(25)._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(item){return"("+item.xLabel+", "+item.yLabel+")"}}}}),module.exports=function(Chart){Chart.controllers.scatter=Chart.controllers.line}},{25:25}],22:[function(require,module,exports){var defaults=require(25),Element=require(26),helpers=require(45);defaults._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:helpers.noop,onComplete:helpers.noop}}),module.exports=function(Chart){Chart.Animation=Element.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),Chart.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(chart,animation,duration,lazy){var i,ilen,animations=this.animations;for(animation.chart=chart,lazy||(chart.animating=!0),i=0,ilen=animations.length;i1&&(framesToDrop=Math.floor(me.dropFrames),me.dropFrames=me.dropFrames%1),me.advance(1+framesToDrop);var endTime=Date.now();me.dropFrames+=(endTime-startTime)/me.frameDuration,me.animations.length>0&&me.requestAnimationFrame()},advance:function(count){for(var animation,chart,animations=this.animations,i=0;i=animation.numSteps?(helpers.callback(animation.onAnimationComplete,[animation],chart),chart.animating=!1,animations.splice(i,1)):++i}},Object.defineProperty(Chart.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(Chart.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(value){this.chart=value}})}},{25:25,26:26,45:45}],23:[function(require,module,exports){var defaults=require(25),helpers=require(45),Interaction=require(28),platform=require(48);module.exports=function(Chart){var plugins=Chart.plugins;function positionIsHorizontal(position){return"top"===position||"bottom"===position}Chart.types={},Chart.instances={},Chart.controllers={},helpers.extend(Chart.prototype,{construct:function(item,config){var me=this;config=function(config){var data=(config=config||{}).data=config.data||{};return data.datasets=data.datasets||[],data.labels=data.labels||[],config.options=helpers.configMerge(defaults.global,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.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.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 plugins.notify(me,"beforeInit"),helpers.retinaScale(me,me.options.devicePixelRatio),me.bindEvents(),me.options.responsive&&me.resize(!0),me.ensureScalesHaveIDs(),me.buildScales(),me.initToolTip(),plugins.notify(me,"afterInit"),me},clear:function(){return helpers.canvas.clear(this),this},stop:function(){return Chart.animationService.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.getMaximumWidth(canvas))),newHeight=Math.max(0,Math.floor(aspectRatio?newWidth/aspectRatio:helpers.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.retinaScale(me,options.devicePixelRatio),!silent)){var newSize={width:newWidth,height:newHeight};plugins.notify(me,"resize",[newSize]),me.options.onResize&&me.options.onResize(me,newSize),me.stop(),me.update(me.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var options=this.options,scalesOptions=options.scales||{},scaleOptions=options.scale;helpers.each(scalesOptions.xAxes,(function(xAxisOptions,index){xAxisOptions.id=xAxisOptions.id||"x-axis-"+index})),helpers.each(scalesOptions.yAxes,(function(yAxisOptions,index){yAxisOptions.id=yAxisOptions.id||"y-axis-"+index})),scaleOptions&&(scaleOptions.id=scaleOptions.id||"scale")},buildScales:function(){var me=this,options=me.options,scales=me.scales={},items=[];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.each(items,(function(item){var scaleOptions=item.options,scaleType=helpers.valueOrDefault(scaleOptions.type,item.dtype),scaleClass=Chart.scaleService.getScaleConstructor(scaleType);if(scaleClass){positionIsHorizontal(scaleOptions.position)!==positionIsHorizontal(item.dposition)&&(scaleOptions.position=item.dposition);var scale=new scaleClass({id:scaleOptions.id,options:scaleOptions,ctx:me.ctx,chart:me});scales[scale.id]=scale,scale.mergeTicksOptions(),item.isDefault&&(me.scale=scale)}})),Chart.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var me=this,types=[],newControllers=[];return helpers.each(me.data.datasets,(function(dataset,datasetIndex){var meta=me.getDatasetMeta(datasetIndex),type=dataset.type||me.config.type;if(meta.type&&meta.type!==type&&(me.destroyDatasetMeta(datasetIndex),meta=me.getDatasetMeta(datasetIndex)),meta.type=type,types.push(meta.type),meta.controller)meta.controller.updateIndex(datasetIndex);else{var ControllerClass=Chart.controllers[meta.type];if(void 0===ControllerClass)throw new Error('"'+meta.type+'" is not a chart type.');meta.controller=new ControllerClass(me,datasetIndex),newControllers.push(meta.controller)}}),me),newControllers},resetElements:function(){var me=this;helpers.each(me.data.datasets,(function(dataset,datasetIndex){me.getDatasetMeta(datasetIndex).controller.reset()}),me)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(config){var chart,newOptions,me=this;if(config&&"object"===_typeof(config)||(config={duration:config,lazy:arguments[1]}),(newOptions=(chart=me).options).scale?chart.scale.options=newOptions.scale:newOptions.scales&&newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach((function(scaleOptions){chart.scales[scaleOptions.id].options=scaleOptions})),chart.tooltip._options=newOptions.tooltips,!1!==plugins.notify(me,"beforeUpdate")){me.tooltip._data=me.data;var newControllers=me.buildOrUpdateControllers();helpers.each(me.data.datasets,(function(dataset,datasetIndex){me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements()}),me),me.updateLayout(),helpers.each(newControllers,(function(controller){controller.reset()})),me.updateDatasets(),plugins.notify(me,"afterUpdate"),me._bufferedRender?me._bufferedRequest={duration:config.duration,easing:config.easing,lazy:config.lazy}:me.render(config)}},updateLayout:function(){!1!==plugins.notify(this,"beforeLayout")&&(Chart.layoutService.update(this,this.width,this.height),plugins.notify(this,"afterScaleUpdate"),plugins.notify(this,"afterLayout"))},updateDatasets:function(){if(!1!==plugins.notify(this,"beforeDatasetsUpdate")){for(var i=0,ilen=this.data.datasets.length;i=0;--i)me.isDatasetVisible(i)&&me.drawDataset(i,easingValue);plugins.notify(me,"afterDatasetsDraw",[easingValue])}},drawDataset:function(index,easingValue){var meta=this.getDatasetMeta(index),args={meta:meta,index:index,easingValue:easingValue};!1!==plugins.notify(this,"beforeDatasetDraw",[args])&&(meta.controller.draw(easingValue),plugins.notify(this,"afterDatasetDraw",[args]))},getElementAtEvent:function(e){return Interaction.modes.single(this,e)},getElementsAtEvent:function(e){return Interaction.modes.label(this,e,{intersect:!0})},getElementsAtXAxis:function(e){return Interaction.modes["x-axis"](this,e,{intersect:!0})},getElementsAtEventForMode:function(e,mode,options){var method=Interaction.modes[mode];return"function"==typeof method?method(this,e,options):[]},getDatasetAtEvent:function(e){return 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}),meta},getVisibleDatasetCount:function(){for(var count=0,i=0,ilen=this.data.datasets.length;i0||(arrayEvents.forEach((function(key){delete array[key]})),delete array._chartjs)}}Chart.DatasetController=function(chart,datasetIndex){this.initialize(chart,datasetIndex)},helpers.extend(Chart.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(chart,datasetIndex){this.chart=chart,this.index=datasetIndex,this.linkScales(),this.addElements()},updateIndex:function(datasetIndex){this.index=datasetIndex},linkScales:function(){var meta=this.getMeta(),dataset=this.getDataset();null===meta.xAxisID&&(meta.xAxisID=dataset.xAxisID||this.chart.options.scales.xAxes[0].id),null===meta.yAxisID&&(meta.yAxisID=dataset.yAxisID||this.chart.options.scales.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]},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;i=target[key].length&&target[key].push({}),!target[key][i].type||scale.type&&scale.type!==target[key][i].type?helpers.merge(target[key][i],[Chart.scaleService.getScaleDefaults(type),scale]):helpers.merge(target[key][i],scale)}else helpers._merger(key,target,source,options)}})},helpers.where=function(collection,filterCallback){if(helpers.isArray(collection)&&Array.prototype.filter)return collection.filter(filterCallback);var filtered=[];return helpers.each(collection,(function(item){filterCallback(item)&&filtered.push(item)})),filtered},helpers.findIndex=Array.prototype.findIndex?function(array,callback,scope){return array.findIndex(callback,scope)}:function(array,callback,scope){scope=void 0===scope?array:scope;for(var i=0,ilen=array.length;i=0;i--){var currentItem=arrayToSearch[i];if(filterCallback(currentItem))return currentItem}},helpers.inherits=function(extensions){var me=this,ChartElement=extensions&&extensions.hasOwnProperty("constructor")?extensions.constructor:function(){return me.apply(this,arguments)},Surrogate=function(){this.constructor=ChartElement};return Surrogate.prototype=me.prototype,ChartElement.prototype=new Surrogate,ChartElement.extend=helpers.inherits,extensions&&helpers.extend(ChartElement.prototype,extensions),ChartElement.__super__=me.prototype,ChartElement},helpers.isNumber=function(n){return!isNaN(parseFloat(n))&&isFinite(n)},helpers.almostEquals=function(x,y,epsilon){return Math.abs(x-y)x},helpers.max=function(array){return array.reduce((function(max,value){return isNaN(value)?max:Math.max(max,value)}),Number.NEGATIVE_INFINITY)},helpers.min=function(array){return array.reduce((function(min,value){return isNaN(value)?min:Math.min(min,value)}),Number.POSITIVE_INFINITY)},helpers.sign=Math.sign?function(x){return Math.sign(x)}:function(x){return 0===(x=+x)||isNaN(x)?x:x>0?1:-1},helpers.log10=Math.log10?function(x){return Math.log10(x)}:function(x){return Math.log(x)/Math.LN10},helpers.toRadians=function(degrees){return degrees*(Math.PI/180)},helpers.toDegrees=function(radians){return radians*(180/Math.PI)},helpers.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.distanceBetweenPoints=function(pt1,pt2){return Math.sqrt(Math.pow(pt2.x-pt1.x,2)+Math.pow(pt2.y-pt1.y,2))},helpers.aliasPixel=function(pixelWidth){return pixelWidth%2==0?0:.5},helpers.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.EPSILON=Number.EPSILON||1e-14,helpers.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.previousItem=function(collection,index,loop){return loop?index<=0?collection[collection.length-1]:collection[index-1]:index<=0?collection[0]:collection[index-1]},helpers.niceNum=function(range,round){var exponent=Math.floor(helpers.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.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.getRelativePosition=function(evt,chart){var mouseX,mouseY,e=evt.originalEvent||evt,canvas=evt.currentTarget||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.getStyle(canvas,"padding-left")),paddingTop=parseFloat(helpers.getStyle(canvas,"padding-top")),paddingRight=parseFloat(helpers.getStyle(canvas,"padding-right")),paddingBottom=parseFloat(helpers.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.getConstraintWidth=function(domNode){return getConstraintDimension(domNode,"max-width","clientWidth")},helpers.getConstraintHeight=function(domNode){return getConstraintDimension(domNode,"max-height","clientHeight")},helpers.getMaximumWidth=function(domNode){var container=domNode.parentNode;if(!container)return domNode.clientWidth;var paddingLeft=parseInt(helpers.getStyle(container,"padding-left"),10),paddingRight=parseInt(helpers.getStyle(container,"padding-right"),10),w=container.clientWidth-paddingLeft-paddingRight,cw=helpers.getConstraintWidth(domNode);return isNaN(cw)?w:Math.min(w,cw)},helpers.getMaximumHeight=function(domNode){var container=domNode.parentNode;if(!container)return domNode.clientHeight;var paddingTop=parseInt(helpers.getStyle(container,"padding-top"),10),paddingBottom=parseInt(helpers.getStyle(container,"padding-bottom"),10),h=container.clientHeight-paddingTop-paddingBottom,ch=helpers.getConstraintHeight(domNode);return isNaN(ch)?h:Math.min(h,ch)},helpers.getStyle=function(el,property){return el.currentStyle?el.currentStyle[property]:document.defaultView.getComputedStyle(el,null).getPropertyValue(property)},helpers.retinaScale=function(chart,forceRatio){var pixelRatio=chart.currentDevicePixelRatio=forceRatio||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=height+"px",canvas.style.width=width+"px"}},helpers.fontString=function(pixelSize,fontStyle,fontFamily){return fontStyle+" "+pixelSize+"px "+fontFamily},helpers.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 longest=0;helpers.each(arrayOfThings,(function(thing){null!=thing&&!0!==helpers.isArray(thing)?longest=helpers.measureText(ctx,data,gc,longest,thing):helpers.isArray(thing)&&helpers.each(thing,(function(nestedThing){null==nestedThing||helpers.isArray(nestedThing)||(longest=helpers.measureText(ctx,data,gc,longest,nestedThing))}))}));var gcLen=gc.length/2;if(gcLen>arrayOfThings.length){for(var i=0;ilongest&&(longest=textWidth),longest},helpers.numberOfLabelLines=function(arrayOfThings){var numberOfLines=1;return helpers.each(arrayOfThings,(function(thing){helpers.isArray(thing)&&thing.length>numberOfLines&&(numberOfLines=thing.length)})),numberOfLines},helpers.color=color?function(value){return value instanceof CanvasGradient&&(value=defaults.global.defaultColor),color(value)}:function(value){return console.error("Color.js not found!"),value},helpers.getHoverColor=function(colorValue){return colorValue instanceof CanvasPattern?colorValue:helpers.color(colorValue).saturate(.5).darken(.1).rgbString()}}},{2:2,25:25,45:45}],28:[function(require,module,exports){var helpers=require(45);function getRelativePosition(e,chart){return e.native?{x:e.x,y:e.y}:helpers.getRelativePosition(e,chart)}function parseVisibleItems(chart,handler){var meta,i,j,ilen,jlen;for(i=0,ilen=chart.data.datasets.length;i0&&(items=chart.getDatasetMeta(items[0]._datasetIndex).data),items},"x-axis":function(chart,e){return indexMode(chart,e,{intersect:!0})},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),nearestItems=getNearestItems(chart,position,options.intersect,distanceMetric);return nearestItems.length>1&&nearestItems.sort((function(a,b){var ret=a.getArea()-b.getArea();return 0===ret&&(ret=a._datasetIndex-b._datasetIndex),ret})),nearestItems.slice(0,1)},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}}}},{45:45}],29:[function(require,module,exports){require(25)._set("global",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),module.exports=function(){var Chart=function(item,config){return this.construct(item,config),this};return Chart.Chart=Chart,Chart}},{25:25}],30:[function(require,module,exports){var helpers=require(45);module.exports=function(Chart){function filterByPosition(array,position){return helpers.where(array,(function(v){return v.position===position}))}function sortByWeight(array,reverse){array.forEach((function(v,i){return v._tmpIndex_=i,v})),array.sort((function(a,b){var v0=reverse?b:a,v1=reverse?a:b;return v0.weight===v1.weight?v0._tmpIndex_-v1._tmpIndex_:v0.weight-v1.weight})),array.forEach((function(v){delete v._tmpIndex_}))}Chart.layoutService={defaults:{},addBox:function(chart,item){chart.boxes||(chart.boxes=[]),item.fullWidth=item.fullWidth||!1,item.position=item.position||"top",item.weight=item.weight||0,chart.boxes.push(item)},removeBox:function(chart,layoutItem){var index=chart.boxes?chart.boxes.indexOf(layoutItem):-1;-1!==index&&chart.boxes.splice(index,1)},configure:function(chart,item,options){for(var prop,props=["fullWidth","position","weight"],ilen=props.length,i=0;itickWidth&&labelRotationme.maxHeight){labelRotation--;break}labelRotation++,labelWidth=cosRotation*originalLabelWidth}me.labelRotation=labelRotation},afterCalculateTickRotation:function(){helpers.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){helpers.callback(this.options.beforeFit,[this])},fit:function(){var me=this,minSize=me.minSize={width:0,height:0},labels=labelsFromTicks(me._ticks),opts=me.options,tickOpts=opts.ticks,scaleLabelOpts=opts.scaleLabel,gridLineOpts=opts.gridLines,display=opts.display,isHorizontal=me.isHorizontal(),tickFont=parseFontOptions(tickOpts),tickMarkLength=opts.gridLines.tickMarkLength;if(minSize.width=isHorizontal?me.isFullWidth()?me.maxWidth-me.margins.left-me.margins.right:me.maxWidth:display&&gridLineOpts.drawTicks?tickMarkLength:0,minSize.height=isHorizontal?display&&gridLineOpts.drawTicks?tickMarkLength:0:me.maxHeight,scaleLabelOpts.display&&display){var deltaHeight=parseLineHeight(scaleLabelOpts)+helpers.options.toPadding(scaleLabelOpts.padding).height;isHorizontal?minSize.height+=deltaHeight:minSize.width+=deltaHeight}if(tickOpts.display&&display){var largestTextWidth=helpers.longestText(me.ctx,tickFont.font,labels,me.longestTextCache),tallestLabelHeightInLines=helpers.numberOfLabelLines(labels),lineSpace=.5*tickFont.size,tickPadding=me.options.ticks.padding;if(isHorizontal){me.longestLabelWidth=largestTextWidth;var angleRadians=helpers.toRadians(me.labelRotation),cosRotation=Math.cos(angleRadians),labelHeight=Math.sin(angleRadians)*largestTextWidth+tickFont.size*tallestLabelHeightInLines+lineSpace*(tallestLabelHeightInLines-1)+lineSpace;minSize.height=Math.min(me.maxHeight,minSize.height+labelHeight+tickPadding),me.ctx.font=tickFont.font;var firstLabelWidth=computeTextSize(me.ctx,labels[0],tickFont.font),lastLabelWidth=computeTextSize(me.ctx,labels[labels.length-1],tickFont.font);0!==me.labelRotation?(me.paddingLeft="bottom"===opts.position?cosRotation*firstLabelWidth+3:cosRotation*lineSpace+3,me.paddingRight="bottom"===opts.position?cosRotation*lineSpace+3:cosRotation*lastLabelWidth+3):(me.paddingLeft=firstLabelWidth/2+3,me.paddingRight=lastLabelWidth/2+3)}else tickOpts.mirror?largestTextWidth=0:largestTextWidth+=tickPadding+lineSpace,minSize.width=Math.min(me.maxWidth,minSize.width+largestTextWidth),me.paddingTop=tickFont.size/2,me.paddingBottom=tickFont.size/2}me.handleMargins(),me.width=minSize.width,me.height=minSize.height},handleMargins:function(){var me=this;me.margins&&(me.paddingLeft=Math.max(me.paddingLeft-me.margins.left,0),me.paddingTop=Math.max(me.paddingTop-me.margins.top,0),me.paddingRight=Math.max(me.paddingRight-me.margins.right,0),me.paddingBottom=Math.max(me.paddingBottom-me.margins.bottom,0))},afterFit:function(){helpers.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(rawValue){if(helpers.isNullOrUndef(rawValue))return NaN;if("number"==typeof rawValue&&!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},getLabelForIndex:helpers.noop,getPixelForValue:helpers.noop,getValueForPixel:helpers.noop,getPixelForTick:function(index){var me=this,offset=me.options.offset;if(me.isHorizontal()){var tickWidth=(me.width-(me.paddingLeft+me.paddingRight))/Math.max(me._ticks.length-(offset?0:1),1),pixel=tickWidth*index+me.paddingLeft;offset&&(pixel+=tickWidth/2);var finalVal=me.left+Math.round(pixel);return finalVal+=me.isFullWidth()?me.margins.left:0}var innerHeight=me.height-(me.paddingTop+me.paddingBottom);return me.top+index*(innerHeight/(me._ticks.length-1))},getPixelForDecimal:function(decimal){var me=this;if(me.isHorizontal()){var valueOffset=(me.width-(me.paddingLeft+me.paddingRight))*decimal+me.paddingLeft,finalVal=me.left+Math.round(valueOffset);return finalVal+=me.isFullWidth()?me.margins.left:0}return me.top+decimal*me.height},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 skipRatio,i,tick,maxTicks,me=this,isHorizontal=me.isHorizontal(),optionTicks=me.options.ticks.minor,tickCount=ticks.length,labelRotationRadians=helpers.toRadians(me.labelRotation),cosRotation=Math.cos(labelRotationRadians),longestRotatedLabel=me.longestLabelWidth*cosRotation,result=[];for(optionTicks.maxTicksLimit&&(maxTicks=optionTicks.maxTicksLimit),isHorizontal&&(skipRatio=!1,(longestRotatedLabel+optionTicks.autoSkipPadding)*tickCount>me.width-(me.paddingLeft+me.paddingRight)&&(skipRatio=1+Math.floor((longestRotatedLabel+optionTicks.autoSkipPadding)*tickCount/(me.width-(me.paddingLeft+me.paddingRight)))),maxTicks&&tickCount>maxTicks&&(skipRatio=Math.max(skipRatio,Math.floor(tickCount/maxTicks)))),i=0;i1&&i%skipRatio>0||i%skipRatio==0&&i+skipRatio>=tickCount)&&i!==tickCount-1||helpers.isNullOrUndef(tick.label))&&delete tick.label,result.push(tick);return result},draw:function(chartArea){var me=this,options=me.options;if(options.display){var context=me.ctx,globalDefaults=defaults.global,optionTicks=options.ticks.minor,optionMajorTicks=options.ticks.major||optionTicks,gridLines=options.gridLines,scaleLabel=options.scaleLabel,isRotated=0!==me.labelRotation,isHorizontal=me.isHorizontal(),ticks=optionTicks.autoSkip?me._autoSkip(me.getTicks()):me.getTicks(),tickFontColor=helpers.valueOrDefault(optionTicks.fontColor,globalDefaults.defaultFontColor),tickFont=parseFontOptions(optionTicks),majorTickFontColor=helpers.valueOrDefault(optionMajorTicks.fontColor,globalDefaults.defaultFontColor),majorTickFont=parseFontOptions(optionMajorTicks),tl=gridLines.drawTicks?gridLines.tickMarkLength:0,scaleLabelFontColor=helpers.valueOrDefault(scaleLabel.fontColor,globalDefaults.defaultFontColor),scaleLabelFont=parseFontOptions(scaleLabel),scaleLabelPadding=helpers.options.toPadding(scaleLabel.padding),labelRotationRadians=helpers.toRadians(me.labelRotation),itemsToDraw=[],xTickStart="right"===options.position?me.left:me.right-tl,xTickEnd="right"===options.position?me.left+tl:me.right,yTickStart="bottom"===options.position?me.top:me.bottom-tl,yTickEnd="bottom"===options.position?me.top+tl:me.bottom;if(helpers.each(ticks,(function(tick,index){if(void 0!==tick.label){var lineWidth,lineColor,borderDash,borderDashOffset,tx1,ty1,tx2,ty2,x1,y1,x2,y2,labelX,labelY,label=tick.label;index===me.zeroLineIndex&&options.offset===gridLines.offsetGridLines?(lineWidth=gridLines.zeroLineWidth,lineColor=gridLines.zeroLineColor,borderDash=gridLines.zeroLineBorderDash,borderDashOffset=gridLines.zeroLineBorderDashOffset):(lineWidth=helpers.valueAtIndexOrDefault(gridLines.lineWidth,index),lineColor=helpers.valueAtIndexOrDefault(gridLines.color,index),borderDash=helpers.valueOrDefault(gridLines.borderDash,globalDefaults.borderDash),borderDashOffset=helpers.valueOrDefault(gridLines.borderDashOffset,globalDefaults.borderDashOffset));var textAlign="middle",textBaseline="middle",tickPadding=optionTicks.padding;if(isHorizontal){var labelYOffset=tl+tickPadding;"bottom"===options.position?(textBaseline=isRotated?"middle":"top",textAlign=isRotated?"right":"center",labelY=me.top+labelYOffset):(textBaseline=isRotated?"middle":"bottom",textAlign=isRotated?"left":"center",labelY=me.bottom-labelYOffset);var xLineValue=getLineValue(me,index,gridLines.offsetGridLines&&ticks.length>1);xLineValue1);yLineValue0)spacing=generationOptions.stepSize;else{var niceRange=helpers.niceNum(dataRange.max-dataRange.min,!1);spacing=helpers.niceNum(niceRange/(generationOptions.maxTicks-1),!0)}var niceMin=Math.floor(dataRange.min/spacing)*spacing,niceMax=Math.ceil(dataRange.max/spacing)*spacing;generationOptions.min&&generationOptions.max&&generationOptions.stepSize&&helpers.almostWhole((generationOptions.max-generationOptions.min)/generationOptions.stepSize,spacing/1e3)&&(niceMin=generationOptions.min,niceMax=generationOptions.max);var numSpaces=(niceMax-niceMin)/spacing;numSpaces=helpers.almostEquals(numSpaces,Math.round(numSpaces),spacing/1e3)?Math.round(numSpaces):Math.ceil(numSpaces),ticks.push(void 0!==generationOptions.min?generationOptions.min:niceMin);for(var j=1;j3?ticks[2]-ticks[1]:ticks[1]-ticks[0];Math.abs(delta)>1&&tickValue!==Math.floor(tickValue)&&(delta=tickValue-Math.floor(tickValue));var logDelta=helpers.log10(Math.abs(delta)),tickString="";if(0!==tickValue){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.log10(tickValue)));return 0===tickValue?"0":1===remain||2===remain||5===remain||0===index||index===ticks.length-1?tickValue.toExponential():""}}}},{45:45}],35:[function(require,module,exports){var defaults=require(25),Element=require(26),helpers=require(45);defaults._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:helpers.noop,title:function(tooltipItems,data){var title="",labels=data.labels,labelCount=labels?labels.length:0;if(tooltipItems.length>0){var item=tooltipItems[0];item.xLabel?title=item.xLabel:labelCount>0&&item.indexchart.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>chart.width},orf=function(x){return x-size.width<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){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),"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)}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=ptX+width/2)-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,opacity){var title=vm.title;if(title.length){ctx.textAlign=vm._titleAlign,ctx.textBaseline="top";var i,len,titleFontSize=vm.titleFontSize,titleSpacing=vm.titleSpacing;for(ctx.fillStyle=mergeOpacity(vm.titleFontColor,opacity),ctx.font=helpers.fontString(titleFontSize,vm._titleFontStyle,vm._titleFontFamily),i=0,len=title.length;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&&(this.drawBackground(pt,vm,ctx,tooltipSize,opacity),pt.x+=vm.xPadding,pt.y+=vm.yPadding,this.drawTitle(pt,vm,ctx,opacity),this.drawBody(pt,vm,ctx,opacity),this.drawFooter(pt,vm,ctx,opacity))}},handleEvent:function(e){var me=this,options=me._options,changed=!1;if(me._lastActive=me._lastActive||[],"mouseout"===e.type?me._active=[]:me._active=me._chart.getElementsAtEventForMode(e,options.mode,options),!(changed=!helpers.arrayEquals(me._active,me._lastActive)))return!1;if(me._lastActive=me._active,options.enabled||options.custom){me._eventPosition={x:e.x,y:e.y};var model=me._model;me.update(!0),me.pivot(),changed|=model.x!==me._model.x||model.y!==me._model.y}return changed}}),Chart.Tooltip.positioners={average:function(elements){if(!elements.length)return!1;var i,len,x=0,y=0,count=0;for(i=0,len=elements.length;iendAngle;)angle-=2*Math.PI;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 ctx=this._chart.ctx,vm=this._view,sA=vm.startAngle,eA=vm.endAngle;ctx.beginPath(),ctx.arc(vm.x,vm.y,vm.outerRadius,sA,eA),ctx.arc(vm.x,vm.y,vm.innerRadius,eA,sA,!0),ctx.closePath(),ctx.strokeStyle=vm.borderColor,ctx.lineWidth=vm.borderWidth,ctx.fillStyle=vm.backgroundColor,ctx.fill(),ctx.lineJoin="bevel",vm.borderWidth&&ctx.stroke()}})},{25:25,26:26,45:45}],37:[function(require,module,exports){var defaults=require(25),Element=require(26),helpers=require(45),globalDefaults=defaults.global;defaults._set("global",{elements:{line:{tension:.4,backgroundColor:globalDefaults.defaultColor,borderWidth:3,borderColor:globalDefaults.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}}),module.exports=Element.extend({draw:function(){var index,current,previous,currentVM,vm=this._view,ctx=this._chart.ctx,spanGaps=vm.spanGaps,points=this._children.slice(),globalOptionLineElements=globalDefaults.elements.line,lastDrawnIndex=-1;for(this._loop&&points.length&&points.push(points[0]),ctx.save(),ctx.lineCap=vm.borderCapStyle||globalOptionLineElements.borderCapStyle,ctx.setLineDash&&ctx.setLineDash(vm.borderDash||globalOptionLineElements.borderDash),ctx.lineDashOffset=vm.borderDashOffset||globalOptionLineElements.borderDashOffset,ctx.lineJoin=vm.borderJoinStyle||globalOptionLineElements.borderJoinStyle,ctx.lineWidth=vm.borderWidth||globalOptionLineElements.borderWidth,ctx.strokeStyle=vm.borderColor||globalDefaults.defaultColor,ctx.beginPath(),lastDrawnIndex=-1,index=0;indexleft?1:-1,signY=1,borderSkipped=vm.borderSkipped||"left"):(left=vm.x-vm.width/2,right=vm.x+vm.width/2,top=vm.y,signX=1,signY=(bottom=vm.base)>top?1:-1,borderSkipped=vm.borderSkipped||"bottom"),borderWidth){var barSize=Math.min(Math.abs(left-right),Math.abs(top-bottom)),halfStroke=(borderWidth=borderWidth>barSize?barSize:borderWidth)/2,borderLeft=left+("left"!==borderSkipped?halfStroke*signX:0),borderRight=right+("right"!==borderSkipped?-halfStroke*signX:0),borderTop=top+("top"!==borderSkipped?halfStroke*signY:0),borderBottom=bottom+("bottom"!==borderSkipped?-halfStroke*signY:0);borderLeft!==borderRight&&(top=borderTop,bottom=borderBottom),borderTop!==borderBottom&&(left=borderLeft,right=borderRight)}ctx.beginPath(),ctx.fillStyle=vm.backgroundColor,ctx.strokeStyle=vm.borderColor,ctx.lineWidth=borderWidth;var corners=[[left,bottom],[left,top],[right,top],[right,bottom]],startCorner=["bottom","left","top","right"].indexOf(borderSkipped,0);function cornerAt(index){return corners[(startCorner+index)%4]}-1===startCorner&&(startCorner=0);var corner=cornerAt(0);ctx.moveTo(corner[0],corner[1]);for(var i=1;i<4;i++)corner=cornerAt(i),ctx.lineTo(corner[0],corner[1]);ctx.fill(),borderWidth&&ctx.stroke()},height:function(){var vm=this._view;return vm.base-vm.y},inRange:function(mouseX,mouseY){var inRange=!1;if(this._view){var bounds=getBarBounds(this);inRange=mouseX>=bounds.left&&mouseX<=bounds.right&&mouseY>=bounds.top&&mouseY<=bounds.bottom}return inRange},inLabelRange:function(mouseX,mouseY){if(!this._view)return!1;var bounds=getBarBounds(this);return isVertical(this)?mouseX>=bounds.left&&mouseX<=bounds.right:mouseY>=bounds.top&&mouseY<=bounds.bottom},inXRange:function(mouseX){var bounds=getBarBounds(this);return mouseX>=bounds.left&&mouseX<=bounds.right},inYRange:function(mouseY){var bounds=getBarBounds(this);return mouseY>=bounds.top&&mouseY<=bounds.bottom},getCenterPoint:function(){var x,y,vm=this._view;return isVertical(this)?(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 vm.width*Math.abs(vm.y-vm.base)},tooltipPosition:function(){var vm=this._view;return{x:vm.x,y:vm.y}}})},{25:25,26:26}],40:[function(require,module,exports){module.exports={},module.exports.Arc=require(36),module.exports.Line=require(37),module.exports.Point=require(38),module.exports.Rectangle=require(39)},{36:36,37:37,38:38,39:39}],41:[function(require,module,exports){var helpers=require(42);exports=module.exports={clear:function(chart){chart.ctx.clearRect(0,0,chart.width,chart.height)},roundedRect:function(ctx,x,y,width,height,radius){if(radius){var rx=Math.min(radius,width/2),ry=Math.min(radius,height/2);ctx.moveTo(x+rx,y),ctx.lineTo(x+width-rx,y),ctx.quadraticCurveTo(x+width,y,x+width,y+ry),ctx.lineTo(x+width,y+height-ry),ctx.quadraticCurveTo(x+width,y+height,x+width-rx,y+height),ctx.lineTo(x+rx,y+height),ctx.quadraticCurveTo(x,y+height,x,y+height-ry),ctx.lineTo(x,y+ry),ctx.quadraticCurveTo(x,y,x+rx,y)}else ctx.rect(x,y,width,height)},drawPoint:function(ctx,style,radius,x,y){var type,edgeLength,xOffset,yOffset,height,size;if("object"!==_typeof(style)||"[object HTMLImageElement]"!==(type=style.toString())&&"[object HTMLCanvasElement]"!==type){if(!(isNaN(radius)||radius<=0)){switch(style){default:ctx.beginPath(),ctx.arc(x,y,radius,0,2*Math.PI),ctx.closePath(),ctx.fill();break;case"triangle":ctx.beginPath(),height=(edgeLength=3*radius/Math.sqrt(3))*Math.sqrt(3)/2,ctx.moveTo(x-edgeLength/2,y+height/3),ctx.lineTo(x+edgeLength/2,y+height/3),ctx.lineTo(x,y-2*height/3),ctx.closePath(),ctx.fill();break;case"rect":size=1/Math.SQRT2*radius,ctx.beginPath(),ctx.fillRect(x-size,y-size,2*size,2*size),ctx.strokeRect(x-size,y-size,2*size,2*size);break;case"rectRounded":var offset=radius/Math.SQRT2,leftX=x-offset,topY=y-offset,sideSize=Math.SQRT2*radius;ctx.beginPath(),this.roundedRect(ctx,leftX,topY,sideSize,sideSize,radius/2),ctx.closePath(),ctx.fill();break;case"rectRot":size=1/Math.SQRT2*radius,ctx.beginPath(),ctx.moveTo(x-size,y),ctx.lineTo(x,y+size),ctx.lineTo(x+size,y),ctx.lineTo(x,y-size),ctx.closePath(),ctx.fill();break;case"cross":ctx.beginPath(),ctx.moveTo(x,y+radius),ctx.lineTo(x,y-radius),ctx.moveTo(x-radius,y),ctx.lineTo(x+radius,y),ctx.closePath();break;case"crossRot":ctx.beginPath(),xOffset=Math.cos(Math.PI/4)*radius,yOffset=Math.sin(Math.PI/4)*radius,ctx.moveTo(x-xOffset,y-yOffset),ctx.lineTo(x+xOffset,y+yOffset),ctx.moveTo(x-xOffset,y+yOffset),ctx.lineTo(x+xOffset,y-yOffset),ctx.closePath();break;case"star":ctx.beginPath(),ctx.moveTo(x,y+radius),ctx.lineTo(x,y-radius),ctx.moveTo(x-radius,y),ctx.lineTo(x+radius,y),xOffset=Math.cos(Math.PI/4)*radius,yOffset=Math.sin(Math.PI/4)*radius,ctx.moveTo(x-xOffset,y-yOffset),ctx.lineTo(x+xOffset,y+yOffset),ctx.moveTo(x-xOffset,y+yOffset),ctx.lineTo(x+xOffset,y-yOffset),ctx.closePath();break;case"line":ctx.beginPath(),ctx.moveTo(x-radius,y),ctx.lineTo(x+radius,y),ctx.closePath();break;case"dash":ctx.beginPath(),ctx.moveTo(x,y),ctx.lineTo(x+radius,y),ctx.closePath()}ctx.stroke()}}else ctx.drawImage(style,x-style.width/2,y-style.height/2,style.width,style.height)},clipArea:function(ctx,area){ctx.save(),ctx.beginPath(),ctx.rect(area.left,area.top,area.right-area.left,area.bottom-area.top),ctx.clip()},unclipArea:function(ctx){ctx.restore()},lineTo:function(ctx,previous,target,flip){if(target.steppedLine)return"after"===target.steppedLine&&!flip||"after"!==target.steppedLine&&flip?ctx.lineTo(previous.x,target.y):ctx.lineTo(target.x,previous.y),void ctx.lineTo(target.x,target.y);target.tension?ctx.bezierCurveTo(flip?previous.controlPointPreviousX:previous.controlPointNextX,flip?previous.controlPointPreviousY:previous.controlPointNextY,flip?target.controlPointNextX:target.controlPointPreviousX,flip?target.controlPointNextY:target.controlPointPreviousY,target.x,target.y):ctx.lineTo(target.x,target.y)}};helpers.clear=exports.clear,helpers.drawRoundedRectangle=function(ctx){ctx.beginPath(),exports.roundedRect.apply(exports,arguments),ctx.closePath()}},{42:42}],42:[function(require,module,exports){var id,helpers={noop:function(){},uid:(id=0,function(){return id++}),isNullOrUndef:function(value){return null==value},isArray:Array.isArray?Array.isArray:function(value){return"[object Array]"===Object.prototype.toString.call(value)},isObject:function(value){return null!==value&&"[object Object]"===Object.prototype.toString.call(value)},valueOrDefault:function(value,defaultValue){return void 0===value?defaultValue:value},valueAtIndexOrDefault:function(value,index,defaultValue){return helpers.valueOrDefault(helpers.isArray(value)?value[index]:value,defaultValue)},callback:function(fn,args,thisArg){if(fn&&"function"==typeof fn.call)return fn.apply(thisArg,args)},each:function(loopable,fn,thisArg,reverse){var i,len,keys;if(helpers.isArray(loopable))if(len=loopable.length,reverse)for(i=len-1;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}};module.exports={effects:effects},helpers.easingEffects=effects},{42:42}],44:[function(require,module,exports){var helpers=require(42);module.exports={toLineHeight:function(value,size){var matches=(""+value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!matches||"normal"===matches[1])return 1.2*size;switch(value=+matches[2],matches[3]){case"px":return value;case"%":value/=100}return size*value},toPadding:function(value){var t,r,b,l;return helpers.isObject(value)?(t=+value.top||0,r=+value.right||0,b=+value.bottom||0,l=+value.left||0):t=r=b=l=+value||0,{top:t,right:r,bottom:b,left:l,height:t+b,width:l+r}},resolve:function(inputs,context,index){var i,ilen,value;for(i=0,ilen=inputs.length;i
          ';var expand=resizer.childNodes[0],shrink=resizer.childNodes[1];resizer._reset=function(){expand.scrollLeft=1e6,expand.scrollTop=1e6,shrink.scrollLeft=1e6,shrink.scrollTop=1e6};var onScroll=function(){resizer._reset(),handler()};return _addEventListener(expand,"scroll",onScroll.bind(expand,"expand")),_addEventListener(shrink,"scroll",onScroll.bind(shrink,"shrink")),resizer}((fn=function(){if(expando.resizer)return listener(createEvent("resize",chart))},ticking=!1,args=[],function(){args=Array.prototype.slice.call(arguments),thisArg=thisArg||this,ticking||(ticking=!0,helpers.requestAnimFrame.call(window,(function(){ticking=!1,fn.apply(thisArg,args)})))}));!function(node,handler){var proxy=(node[EXPANDO_KEY]||(node[EXPANDO_KEY]={})).renderProxy=function(e){e.animationName===CSS_RENDER_ANIMATION&&handler()};helpers.each(ANIMATION_START_EVENTS,(function(type){_addEventListener(node,type,proxy)})),node.classList.add(CSS_RENDER_MONITOR)}(node,(function(){if(expando.resizer){var container=node.parentNode;container&&container!==resizer.parentNode&&container.insertBefore(resizer,container.firstChild),resizer._reset()}}))}function removeResizeListener(node){var expando=node[EXPANDO_KEY]||{},resizer=expando.resizer;delete expando.resizer,function(node){var expando=node[EXPANDO_KEY]||{},proxy=expando.renderProxy;proxy&&(helpers.each(ANIMATION_START_EVENTS,(function(type){_removeEventListener(node,type,proxy)})),delete expando.renderProxy),node.classList.remove(CSS_RENDER_MONITOR)}(node),resizer&&resizer.parentNode&&resizer.parentNode.removeChild(resizer)}module.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function(){var platform,css,style,keyframes="from{opacity:0.99}to{opacity:1}";css="@-webkit-keyframes "+CSS_RENDER_ANIMATION+"{"+keyframes+"}@keyframes "+CSS_RENDER_ANIMATION+"{"+keyframes+"}."+CSS_RENDER_MONITOR+"{-webkit-animation:"+CSS_RENDER_ANIMATION+" 0.001s;animation:"+CSS_RENDER_ANIMATION+" 0.001s;}",style=(platform=this)._style||document.createElement("style"),platform._style||(platform._style=style,css="/* Chart.js */\n"+css,style.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(style)),style.appendChild(document.createTextNode(css))},acquireContext:function(item,config){"string"==typeof item?item=document.getElementById(item):item.length&&(item=item[0]),item&&item.canvas&&(item=item.canvas);var context=item&&item.getContext&&item.getContext("2d");return context&&context.canvas===item?(function(canvas,config){var style=canvas.style,renderHeight=canvas.getAttribute("height"),renderWidth=canvas.getAttribute("width");if(canvas[EXPANDO_KEY]={initial:{height:renderHeight,width:renderWidth,style:{display:style.display,height:style.height,width:style.width}}},style.display=style.display||"block",null===renderWidth||""===renderWidth){var displayWidth=readUsedSize(canvas,"width");void 0!==displayWidth&&(canvas.width=displayWidth)}if(null===renderHeight||""===renderHeight)if(""===canvas.style.height)canvas.height=canvas.width/(config.options.aspectRatio||2);else{var displayHeight=readUsedSize(canvas,"height");void 0!==displayWidth&&(canvas.height=displayHeight)}}(item,config),context):null},releaseContext:function(context){var canvas=context.canvas;if(canvas[EXPANDO_KEY]){var initial=canvas[EXPANDO_KEY].initial;["height","width"].forEach((function(prop){var value=initial[prop];helpers.isNullOrUndef(value)?canvas.removeAttribute(prop):canvas.setAttribute(prop,value)})),helpers.each(initial.style||{},(function(value,key){canvas.style[key]=value})),canvas.width=canvas.width,delete canvas[EXPANDO_KEY]}},addEventListener:function(chart,type,listener){var canvas=chart.canvas;if("resize"!==type){var expando=listener[EXPANDO_KEY]||(listener[EXPANDO_KEY]={}),proxy=(expando.proxies||(expando.proxies={}))[chart.id+"_"+type]=function(event){listener(function(event,chart){var type=EVENT_TYPES[event.type]||event.type,pos=helpers.getRelativePosition(event,chart);return createEvent(type,chart,pos.x,pos.y,event)}(event,chart))};_addEventListener(canvas,type,proxy)}else addResizeListener(canvas,listener,chart)},removeEventListener:function(chart,type,listener){var canvas=chart.canvas;if("resize"!==type){var proxy=((listener[EXPANDO_KEY]||{}).proxies||{})[chart.id+"_"+type];proxy&&_removeEventListener(canvas,type,proxy)}else removeResizeListener(canvas)}},helpers.addEvent=_addEventListener,helpers.removeEvent=_removeEventListener},{45:45}],48:[function(require,module,exports){var helpers=require(45),basic=require(46),dom=require(47),implementation=dom._enabled?dom:basic;module.exports=helpers.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},implementation)},{45:45,46:46,47:47}],49:[function(require,module,exports){var defaults=require(25),elements=require(40),helpers=require(45);defaults._set("global",{plugins:{filler:{propagate:!0}}}),module.exports=function(){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){var horizontal,model=source.el._model||{},scale=source.el._scale||{},fill=source.fill,target=null;if(isFinite(fill))return null;if("start"===fill?target=void 0===model.scaleBottom?scale.bottom:model.scaleBottom:"end"===fill?target=void 0===model.scaleTop?scale.top:model.scaleTop:void 0!==model.scaleZero?target=model.scaleZero:scale.getBasePosition?target=scale.getBasePosition():scale.getBasePixel&&(target=scale.getBasePixel()),null!=target){if(void 0!==target.x&&void 0!==target.y)return target;if("number"==typeof target&&isFinite(target))return{x:(horizontal=scale.isHorizontal())?target:null,y:horizontal?null:target}}return null}function resolveTarget(sources,index,propagate){var target,fill=sources[index].fill,visited=[index];if(!propagate)return fill;for(;!1!==fill&&-1===visited.indexOf(fill);){if(!isFinite(fill))return fill;if(!(target=sources[fill]))return!1;if(target.visible)return fill;visited.push(fill),fill=target.fill}return!1}function createMapper(source){var fill=source.fill,type="dataset";return!1===fill?null:(isFinite(fill)||(type="boundary"),mappers[type](source))}function isDrawable(point){return point&&!point.skip}function drawArea(ctx,curve0,curve1,len0,len1){var i;if(len0&&len1){for(ctx.moveTo(curve0[0].x,curve0[0].y),i=1;i0;--i)helpers.canvas.lineTo(ctx,curve1[i],curve1[i-1],!0)}}return{id:"filler",afterDatasetsUpdate:function(chart,options){var meta,i,el,source,count=(chart.data.datasets||[]).length,propagate=options.propagate,sources=[];for(i=0;i');for(var i=0;i'),chart.data.datasets[i].label&&text.push(chart.data.datasets[i].label),text.push("");return text.push(""),text.join("")}}),module.exports=function(Chart){var layout=Chart.layoutService,noop=helpers.noop;function getBoxWidth(labelOpts,fontSize){return labelOpts.usePointStyle?fontSize*Math.SQRT2:labelOpts.boxWidth}function createNewLegendAndAttach(chart,legendOpts){var legend=new Chart.Legend({ctx:chart.ctx,options:legendOpts,chart:chart});layout.configure(chart,legend,legendOpts),layout.addBox(chart,legend),chart.legend=legend}return Chart.Legend=Element.extend({initialize:function(config){helpers.extend(this,config),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:noop,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,beforeSetDimensions:noop,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,beforeBuildLabels:noop,buildLabels:function(){var me=this,labelOpts=me.options.labels||{},legendItems=helpers.callback(labelOpts.generateLabels,[me.chart],me)||[];labelOpts.filter&&(legendItems=legendItems.filter((function(item){return labelOpts.filter(item,me.chart.data)}))),me.options.reverse&&legendItems.reverse(),me.legendItems=legendItems},afterBuildLabels:noop,beforeFit:noop,fit:function(){var me=this,opts=me.options,labelOpts=opts.labels,display=opts.display,ctx=me.ctx,globalDefault=defaults.global,valueOrDefault=helpers.valueOrDefault,fontSize=valueOrDefault(labelOpts.fontSize,globalDefault.defaultFontSize),fontStyle=valueOrDefault(labelOpts.fontStyle,globalDefault.defaultFontStyle),fontFamily=valueOrDefault(labelOpts.fontFamily,globalDefault.defaultFontFamily),labelFont=helpers.fontString(fontSize,fontStyle,fontFamily),hitboxes=me.legendHitBoxes=[],minSize=me.minSize,isHorizontal=me.isHorizontal();if(isHorizontal?(minSize.width=me.maxWidth,minSize.height=display?10:0):(minSize.width=display?10:0,minSize.height=me.maxHeight),display)if(ctx.font=labelFont,isHorizontal){var lineWidths=me.lineWidths=[0],totalHeight=me.legendItems.length?fontSize+labelOpts.padding:0;ctx.textAlign="left",ctx.textBaseline="top",helpers.each(me.legendItems,(function(legendItem,i){var width=getBoxWidth(labelOpts,fontSize)+fontSize/2+ctx.measureText(legendItem.text).width;lineWidths[lineWidths.length-1]+width+labelOpts.padding>=me.width&&(totalHeight+=fontSize+labelOpts.padding,lineWidths[lineWidths.length]=me.left),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=[],totalWidth=labelOpts.padding,currentColWidth=0,currentColHeight=0,itemHeight=fontSize+vPadding;helpers.each(me.legendItems,(function(legendItem,i){var itemWidth=getBoxWidth(labelOpts,fontSize)+fontSize/2+ctx.measureText(legendItem.text).width;currentColHeight+itemHeight>minSize.height&&(totalWidth+=currentColWidth+labelOpts.padding,columnWidths.push(currentColWidth),currentColWidth=0,currentColHeight=0),currentColWidth=Math.max(currentColWidth,itemWidth),currentColHeight+=itemHeight,hitboxes[i]={left:0,top:0,width:itemWidth,height:fontSize}})),totalWidth+=currentColWidth,columnWidths.push(currentColWidth),minSize.width+=totalWidth}me.width=minSize.width,me.height=minSize.height},afterFit:noop,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var me=this,opts=me.options,labelOpts=opts.labels,globalDefault=defaults.global,lineDefault=globalDefault.elements.line,legendWidth=me.width,lineWidths=me.lineWidths;if(opts.display){var cursor,ctx=me.ctx,valueOrDefault=helpers.valueOrDefault,fontColor=valueOrDefault(labelOpts.fontColor,globalDefault.defaultFontColor),fontSize=valueOrDefault(labelOpts.fontSize,globalDefault.defaultFontSize),fontStyle=valueOrDefault(labelOpts.fontStyle,globalDefault.defaultFontStyle),fontFamily=valueOrDefault(labelOpts.fontFamily,globalDefault.defaultFontFamily),labelFont=helpers.fontString(fontSize,fontStyle,fontFamily);ctx.textAlign="left",ctx.textBaseline="middle",ctx.lineWidth=.5,ctx.strokeStyle=fontColor,ctx.fillStyle=fontColor,ctx.font=labelFont;var boxWidth=getBoxWidth(labelOpts,fontSize),hitboxes=me.legendHitBoxes,isHorizontal=me.isHorizontal();cursor=isHorizontal?{x:me.left+(legendWidth-lineWidths[0])/2,y:me.top+labelOpts.padding,line:0}:{x:me.left+labelOpts.padding,y:me.top+labelOpts.padding,line:0};var itemHeight=fontSize+labelOpts.padding;helpers.each(me.legendItems,(function(legendItem,i){var textWidth=ctx.measureText(legendItem.text).width,width=boxWidth+fontSize/2+textWidth,x=cursor.x,y=cursor.y;isHorizontal?x+width>=legendWidth&&(y=cursor.y+=itemHeight,cursor.line++,x=cursor.x=me.left+(legendWidth-lineWidths[cursor.line])/2):y+itemHeight>me.bottom&&(x=cursor.x=x+me.columnWidths[cursor.line]+labelOpts.padding,y=cursor.y=me.top+labelOpts.padding,cursor.line++),function(x,y,legendItem){if(!(isNaN(boxWidth)||boxWidth<=0)){ctx.save(),ctx.fillStyle=valueOrDefault(legendItem.fillStyle,globalDefault.defaultColor),ctx.lineCap=valueOrDefault(legendItem.lineCap,lineDefault.borderCapStyle),ctx.lineDashOffset=valueOrDefault(legendItem.lineDashOffset,lineDefault.borderDashOffset),ctx.lineJoin=valueOrDefault(legendItem.lineJoin,lineDefault.borderJoinStyle),ctx.lineWidth=valueOrDefault(legendItem.lineWidth,lineDefault.borderWidth),ctx.strokeStyle=valueOrDefault(legendItem.strokeStyle,globalDefault.defaultColor);var isLineWidthZero=0===valueOrDefault(legendItem.lineWidth,lineDefault.borderWidth);if(ctx.setLineDash&&ctx.setLineDash(valueOrDefault(legendItem.lineDash,lineDefault.borderDash)),opts.labels&&opts.labels.usePointStyle){var radius=fontSize*Math.SQRT2/2,offSet=radius/Math.SQRT2,centerX=x+offSet,centerY=y+offSet;helpers.canvas.drawPoint(ctx,legendItem.pointStyle,radius,centerX,centerY)}else isLineWidthZero||ctx.strokeRect(x,y,boxWidth,fontSize),ctx.fillRect(x,y,boxWidth,fontSize);ctx.restore()}}(x,y,legendItem),hitboxes[i].left=x,hitboxes[i].top=y,function(x,y,legendItem,textWidth){var halfFontSize=fontSize/2,xLeft=boxWidth+halfFontSize+x,yMiddle=y+halfFontSize;ctx.fillText(legendItem.text,xLeft,yMiddle),legendItem.hidden&&(ctx.beginPath(),ctx.lineWidth=2,ctx.moveTo(xLeft,yMiddle),ctx.lineTo(xLeft+textWidth,yMiddle),ctx.stroke())}(x,y,legendItem,textWidth),isHorizontal?cursor.x+=width+labelOpts.padding:cursor.y+=itemHeight}))}},handleEvent:function(e){var me=this,opts=me.options,type="mouseup"===e.type?"click":e.type,changed=!1;if("mousemove"===type){if(!opts.onHover)return}else{if("click"!==type)return;if(!opts.onClick)return}var x=e.x,y=e.y;if(x>=me.left&&x<=me.right&&y>=me.top&&y<=me.bottom)for(var lh=me.legendHitBoxes,i=0;i=hitBox.left&&x<=hitBox.left+hitBox.width&&y>=hitBox.top&&y<=hitBox.top+hitBox.height){if("click"===type){opts.onClick.call(me,e.native,me.legendItems[i]),changed=!0;break}if("mousemove"===type){opts.onHover.call(me,e.native,me.legendItems[i]),changed=!0;break}}}return changed}}),{id:"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.mergeIf(legendOpts,defaults.global.legend),legend?(layout.configure(chart,legend,legendOpts),legend.options=legendOpts):createNewLegendAndAttach(chart,legendOpts)):legend&&(layout.removeBox(chart,legend),delete chart.legend)},afterEvent:function(chart,e){var legend=chart.legend;legend&&legend.handleEvent(e)}}}},{25:25,26:26,45:45}],51:[function(require,module,exports){var defaults=require(25),Element=require(26),helpers=require(45);defaults._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}}),module.exports=function(Chart){var layout=Chart.layoutService,noop=helpers.noop;function createNewTitleBlockAndAttach(chart,titleOpts){var title=new Chart.Title({ctx:chart.ctx,options:titleOpts,chart:chart});layout.configure(chart,title,titleOpts),layout.addBox(chart,title),chart.titleBlock=title}return Chart.Title=Element.extend({initialize:function(config){helpers.extend(this,config),this.legendHitBoxes=[]},beforeUpdate:noop,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,beforeSetDimensions:noop,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,beforeBuildLabels:noop,buildLabels:noop,afterBuildLabels:noop,beforeFit:noop,fit:function(){var me=this,valueOrDefault=helpers.valueOrDefault,opts=me.options,display=opts.display,fontSize=valueOrDefault(opts.fontSize,defaults.global.defaultFontSize),minSize=me.minSize,lineCount=helpers.isArray(opts.text)?opts.text.length:1,lineHeight=helpers.options.toLineHeight(opts.lineHeight,fontSize),textSize=display?lineCount*lineHeight+2*opts.padding:0;me.isHorizontal()?(minSize.width=me.maxWidth,minSize.height=textSize):(minSize.width=textSize,minSize.height=me.maxHeight),me.width=minSize.width,me.height=minSize.height},afterFit:noop,isHorizontal:function(){var pos=this.options.position;return"top"===pos||"bottom"===pos},draw:function(){var me=this,ctx=me.ctx,valueOrDefault=helpers.valueOrDefault,opts=me.options,globalDefaults=defaults.global;if(opts.display){var maxWidth,titleX,titleY,fontSize=valueOrDefault(opts.fontSize,globalDefaults.defaultFontSize),fontStyle=valueOrDefault(opts.fontStyle,globalDefaults.defaultFontStyle),fontFamily=valueOrDefault(opts.fontFamily,globalDefaults.defaultFontFamily),titleFont=helpers.fontString(fontSize,fontStyle,fontFamily),lineHeight=helpers.options.toLineHeight(opts.lineHeight,fontSize),offset=lineHeight/2+opts.padding,rotation=0,top=me.top,left=me.left,bottom=me.bottom,right=me.right;ctx.fillStyle=valueOrDefault(opts.fontColor,globalDefaults.defaultFontColor),ctx.font=titleFont,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.isArray(text))for(var y=0,i=0;ime.max)&&(me.max=value))}))}));me.min=isFinite(me.min)&&!isNaN(me.min)?me.min:0,me.max=isFinite(me.max)&&!isNaN(me.max)?me.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var maxTicks,tickOpts=this.options.ticks;if(this.isHorizontal())maxTicks=Math.min(tickOpts.maxTicksLimit?tickOpts.maxTicksLimit:11,Math.ceil(this.width/50));else{var tickFontSize=helpers.valueOrDefault(tickOpts.fontSize,defaults.global.defaultFontSize);maxTicks=Math.min(tickOpts.maxTicksLimit?tickOpts.maxTicksLimit:11,Math.ceil(this.height/(2*tickFontSize)))}return maxTicks},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(index,datasetIndex){return+this.getRightValue(this.chart.data.datasets[datasetIndex].data[index])},getPixelForValue:function(value){var pixel,me=this,start=me.start,rightValue=+me.getRightValue(value),range=me.end-start;return me.isHorizontal()?(pixel=me.left+me.width/range*(rightValue-start),Math.round(pixel)):(pixel=me.bottom-me.height/range*(rightValue-start),Math.round(pixel))},getValueForPixel:function(pixel){var me=this,isHorizontal=me.isHorizontal(),innerDimension=isHorizontal?me.width:me.height,offset=(isHorizontal?pixel-me.left:me.bottom-pixel)/innerDimension;return me.start+(me.end-me.start)*offset},getPixelForTick:function(index){return this.getPixelForValue(this.ticksAsNumbers[index])}});Chart.scaleService.registerScaleType("linear",LinearScale,defaultConfig)}},{25:25,34:34,45:45}],54:[function(require,module,exports){var helpers=require(45),Ticks=require(34);module.exports=function(Chart){var noop=helpers.noop;Chart.LinearScaleBase=Chart.Scale.extend({getRightValue:function(value){return"string"==typeof value?+value:Chart.Scale.prototype.getRightValue.call(this,value)},handleTickRangeOptions:function(){var me=this,tickOpts=me.options.ticks;if(tickOpts.beginAtZero){var minSign=helpers.sign(me.min),maxSign=helpers.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:noop,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,stepSize:helpers.valueOrDefault(tickOpts.fixedStepSize,tickOpts.stepSize)},ticks=me.ticks=Ticks.generators.linear(numericGeneratorOptions,me);me.handleDirectionalChanges(),me.max=helpers.max(ticks),me.min=helpers.min(ticks),tickOpts.reverse?(ticks.reverse(),me.start=me.max,me.end=me.min):(me.start=me.min,me.end=me.max)},convertTicksToLabels:function(){var me=this;me.ticksAsNumbers=me.ticks.slice(),me.zeroLineIndex=me.ticks.indexOf(0),Chart.Scale.prototype.convertTicksToLabels.call(me)}})}},{34:34,45:45}],55:[function(require,module,exports){var helpers=require(45),Ticks=require(34);module.exports=function(Chart){var defaultConfig={position:"left",ticks:{callback:Ticks.formatters.logarithmic}},LogarithmicScale=Chart.Scale.extend({determineDataLimits:function(){var me=this,opts=me.options,tickOpts=opts.ticks,chart=me.chart,datasets=chart.data.datasets,valueOrDefault=helpers.valueOrDefault,isHorizontal=me.isHorizontal();function IDMatches(meta){return isHorizontal?meta.xAxisID===me.id:meta.yAxisID===me.id}me.min=null,me.max=null,me.minNotZero=null;var hasStacks=opts.stacked;if(void 0===hasStacks&&helpers.each(datasets,(function(dataset,datasetIndex){if(!hasStacks){var meta=chart.getDatasetMeta(datasetIndex);chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)&&void 0!==meta.stack&&(hasStacks=!0)}})),opts.stacked||hasStacks){var valuesPerStack={};helpers.each(datasets,(function(dataset,datasetIndex){var meta=chart.getDatasetMeta(datasetIndex),key=[meta.type,void 0===opts.stacked&&void 0===meta.stack?datasetIndex:"",meta.stack].join(".");chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)&&(void 0===valuesPerStack[key]&&(valuesPerStack[key]=[]),helpers.each(dataset.data,(function(rawValue,index){var values=valuesPerStack[key],value=+me.getRightValue(rawValue);isNaN(value)||meta.data[index].hidden||(values[index]=values[index]||0,opts.relativePoints?values[index]=100:values[index]+=value)})))})),helpers.each(valuesPerStack,(function(valuesForType){var minVal=helpers.min(valuesForType),maxVal=helpers.max(valuesForType);me.min=null===me.min?minVal:Math.min(me.min,minVal),me.max=null===me.max?maxVal:Math.max(me.max,maxVal)}))}else helpers.each(datasets,(function(dataset,datasetIndex){var meta=chart.getDatasetMeta(datasetIndex);chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)&&helpers.each(dataset.data,(function(rawValue,index){var value=+me.getRightValue(rawValue);isNaN(value)||meta.data[index].hidden||((null===me.min||valueme.max)&&(me.max=value),0!==value&&(null===me.minNotZero||valuemax?{start:pos-size-5,end:pos}:{start:pos,end:pos+size+5}}function getTextAlignForAngle(angle){return 0===angle||180===angle?"center":angle<180?"left":"right"}function fillText(ctx,text,position,fontSize){if(helpers.isArray(text))for(var y=position.y,spacing=1.5*fontSize,i=0;i270||angle<90)&&(position.y-=textSize.h)}function numberOrZero(param){return helpers.isNumber(param)?param:0}var LinearRadialScale=Chart.LinearScaleBase.extend({setDimensions:function(){var me=this,opts=me.options,tickOpts=opts.ticks;me.width=me.maxWidth,me.height=me.maxHeight,me.xCenter=Math.round(me.width/2),me.yCenter=Math.round(me.height/2);var minSize=helpers.min([me.height,me.width]),tickFontSize=helpers.valueOrDefault(tickOpts.fontSize,globalDefaults.defaultFontSize);me.drawingArea=opts.display?minSize/2-(tickFontSize/2+tickOpts.backdropPaddingY):minSize/2},determineDataLimits:function(){var me=this,chart=me.chart,min=Number.POSITIVE_INFINITY,max=Number.NEGATIVE_INFINITY;helpers.each(chart.data.datasets,(function(dataset,datasetIndex){if(chart.isDatasetVisible(datasetIndex)){var meta=chart.getDatasetMeta(datasetIndex);helpers.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()},getTickLimit:function(){var tickOpts=this.options.ticks,tickFontSize=helpers.valueOrDefault(tickOpts.fontSize,globalDefaults.defaultFontSize);return Math.min(tickOpts.maxTicksLimit?tickOpts.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*tickFontSize)))},convertTicksToLabels:function(){var me=this;Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me),me.pointLabels=me.chart.data.labels.map(me.options.pointLabels.callback,me)},getLabelForIndex:function(index,datasetIndex){return+this.getRightValue(this.chart.data.datasets[datasetIndex].data[index])},fit:function(){var scale,largestPossibleRadius;this.options.pointLabels.display?function(scale){var i,textSize,pointPosition,plFont=getPointLabelFontOptions(scale),largestPossibleRadius=Math.min(scale.height/2,scale.width/2),furthestLimits={r:scale.width,l:0,t:scale.height,b:0},furthestAngles={};scale.ctx.font=plFont.font,scale._pointLabelSizes=[];var ctx,fontSize,label,valueCount=getValueCount(scale);for(i=0;ifurthestLimits.r&&(furthestLimits.r=hLimits.end,furthestAngles.r=angleRadians),vLimits.startfurthestLimits.b&&(furthestLimits.b=vLimits.end,furthestAngles.b=angleRadians)}scale.setReductions(largestPossibleRadius,furthestLimits,furthestAngles)}(this):(scale=this,largestPossibleRadius=Math.min(scale.height/2,scale.width/2),scale.drawingArea=Math.round(largestPossibleRadius),scale.setCenterPoint(0,0,0,0))},setReductions:function(largestPossibleRadius,furthestLimits,furthestAngles){var radiusReductionLeft=furthestLimits.l/Math.sin(furthestAngles.l),radiusReductionRight=Math.max(furthestLimits.r-this.width,0)/Math.sin(furthestAngles.r),radiusReductionTop=-furthestLimits.t/Math.cos(furthestAngles.t),radiusReductionBottom=-Math.max(furthestLimits.b-this.height,0)/Math.cos(furthestAngles.b);radiusReductionLeft=numberOrZero(radiusReductionLeft),radiusReductionRight=numberOrZero(radiusReductionRight),radiusReductionTop=numberOrZero(radiusReductionTop),radiusReductionBottom=numberOrZero(radiusReductionBottom),this.drawingArea=Math.min(Math.round(largestPossibleRadius-(radiusReductionLeft+radiusReductionRight)/2),Math.round(largestPossibleRadius-(radiusReductionTop+radiusReductionBottom)/2)),this.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-bottomMovement-me.drawingArea;me.xCenter=Math.round((maxLeft+maxRight)/2+me.left),me.yCenter=Math.round((maxTop+maxBottom)/2+me.top)},getIndexAngle:function(index){return index*(2*Math.PI/getValueCount(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(value){var me=this;if(null===value)return 0;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.round(Math.cos(thisAngle)*distanceFromCenter)+this.xCenter,y:Math.round(Math.sin(thisAngle)*distanceFromCenter)+this.yCenter}},getPointPositionForValue:function(index,value){return this.getPointPosition(index,this.getDistanceFromCenterForValue(value))},getBasePosition:function(){var min=this.min,max=this.max;return this.getPointPositionForValue(0,this.beginAtZero?0:min<0&&max<0?max:min>0&&max>0?min:0)},draw:function(){var me=this,opts=me.options,gridLineOpts=opts.gridLines,tickOpts=opts.ticks,valueOrDefault=helpers.valueOrDefault;if(opts.display){var ctx=me.ctx,startAngle=this.getIndexAngle(0),tickFontSize=valueOrDefault(tickOpts.fontSize,globalDefaults.defaultFontSize),tickFontStyle=valueOrDefault(tickOpts.fontStyle,globalDefaults.defaultFontStyle),tickFontFamily=valueOrDefault(tickOpts.fontFamily,globalDefaults.defaultFontFamily),tickLabelFont=helpers.fontString(tickFontSize,tickFontStyle,tickFontFamily);helpers.each(me.ticks,(function(label,index){if(index>0||tickOpts.reverse){var yCenterOffset=me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);if(gridLineOpts.display&&0!==index&&function(scale,gridLineOpts,radius,index){var ctx=scale.ctx;if(ctx.strokeStyle=helpers.valueAtIndexOrDefault(gridLineOpts.color,index-1),ctx.lineWidth=helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth,index-1),scale.options.gridLines.circular)ctx.beginPath(),ctx.arc(scale.xCenter,scale.yCenter,radius,0,2*Math.PI),ctx.closePath(),ctx.stroke();else{var valueCount=getValueCount(scale);if(0===valueCount)return;ctx.beginPath();var pointPosition=scale.getPointPosition(0,radius);ctx.moveTo(pointPosition.x,pointPosition.y);for(var i=1;i=0;i--){if(angleLineOpts.display){var outerPosition=scale.getPointPosition(i,outerDistance);ctx.beginPath(),ctx.moveTo(scale.xCenter,scale.yCenter),ctx.lineTo(outerPosition.x,outerPosition.y),ctx.stroke(),ctx.closePath()}if(pointLabelOpts.display){var pointLabelPosition=scale.getPointPosition(i,outerDistance+5),pointLabelFontColor=valueOrDefault(pointLabelOpts.fontColor,globalDefaults.defaultFontColor);ctx.font=plFont.font,ctx.fillStyle=pointLabelFontColor;var angleRadians=scale.getIndexAngle(i),angle=helpers.toDegrees(angleRadians);ctx.textAlign=getTextAlignForAngle(angle),adjustPointPositionForLabelHeight(angle,scale._pointLabelSizes[i],pointLabelPosition),fillText(ctx,scale.pointLabels[i]||"",pointLabelPosition,plFont.size)}}}(me)}}});Chart.scaleService.registerScaleType("radialLinear",LinearRadialScale,defaultConfig)}},{25:25,34:34,45:45}],57:[function(require,module,exports){var moment=require(6);moment="function"==typeof moment?moment:window.moment;var defaults=require(25),helpers=require(45),MIN_INTEGER=Number.MIN_SAFE_INTEGER||-9007199254740991,MAX_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,INTERVALS={millisecond:{major:!0,size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{major:!0,size:1e3,steps:[1,2,5,10,30]},minute:{major:!0,size:6e4,steps:[1,2,5,10,30]},hour:{major:!0,size:36e5,steps:[1,2,3,6,12]},day:{major:!0,size:864e5,steps:[1,2,5]},week:{major:!1,size:6048e5,steps:[1,2,3,4]},month:{major:!0,size:2628e6,steps:[1,2,3]},quarter:{major:!1,size:7884e6,steps:[1,2,3,4]},year:{major:!0,size:3154e7}},UNITS=Object.keys(INTERVALS);function sorter(a,b){return a-b}function arrayUnique(items){var i,ilen,item,hash={},out=[];for(i=0,ilen=items.length;i=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 momentify(value,options){var parser=options.parser,format=options.parser||options.format;return"function"==typeof parser?parser(value):"string"==typeof value&&"string"==typeof format?moment(value,format):(value instanceof moment||(value=moment(value)),value.isValid()?value:"function"==typeof format?format(value):value)}function parse(input,scale){if(helpers.isNullOrUndef(input))return null;var options=scale.options.time,value=momentify(scale.getRightValue(input),options);return value.isValid()?(options.round&&value.startOf(options.round),value.valueOf()):null}function generate(min,max,minor,major,capacity,options){var time,timeOpts=options.time,stepSize=helpers.valueOrDefault(timeOpts.stepSize,timeOpts.unitStepSize),weekday="week"===minor&&timeOpts.isoWeekday,majorTicksEnabled=options.ticks.major.enabled,interval=INTERVALS[minor],first=moment(min),last=moment(max),ticks=[];for(stepSize||(stepSize=function(min,max,unit,capacity){var i,ilen,factor,range=max-min,interval=INTERVALS[unit],milliseconds=interval.size,steps=interval.steps;if(!steps)return Math.ceil(range/((capacity||1)*milliseconds));for(i=0,ilen=steps.length;i=min&×tamp<=max&&ticks.push(timestamp);return me.min=min,me.max=max,me._unit=unit,me._majorUnit=majorUnit,me._minorFormat=formats[unit],me._majorFormat=formats[majorUnit],me._table=function(timestamps,min,max,distribution){if("linear"===distribution||!timestamps.length)return[{time:min,pos:0},{time:max,pos:1}];var i,ilen,prev,curr,next,table=[],items=[min];for(i=0,ilen=timestamps.length;imin&&curr1?ticks[1]:max,lower=ticks[0],left=(interpolate(table,"time",upper,"pos")-interpolate(table,"time",lower,"pos"))/2),options.time.max||(upper=ticks[ticks.length-1],lower=ticks.length>1?ticks[ticks.length-2]:min,right=(interpolate(table,"time",upper,"pos")-interpolate(table,"time",lower,"pos"))/2)),{left:left,right:right}}(me._table,ticks,min,max,options),function(values,majorUnit){var i,ilen,value,major,ticks=[];for(i=0,ilen=values.length;i=0&&indexlum2?(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.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)]}function rgb2lab(rgb){var xyz=rgb2xyz(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))]}function hsl2rgb(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}function hsv2rgb(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));v*=255;switch(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]}}function hwb2rgb(hwb){var i,v,f,n,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]}function cmyk2rgb(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))]}function xyz2rgb(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:r*=12.92,g=g>.0031308?1.055*Math.pow(g,1/2.4)-.055:g*=12.92,b=b>.0031308?1.055*Math.pow(b,1/2.4)-.055:b*=12.92,[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))]}function xyz2lab(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))]}function lab2xyz(lab){var x,y,z,y2,l=lab[0],a=lab[1],b=lab[2];return l<=8?y2=(y=100*l/903.3)/100*7.787+16/116:(y=100*Math.pow((l+16)/116,3),y2=Math.pow(y/100,1/3)),[x=x/95.047<=.008856?x=95.047*(a/500+y2-16/116)/7.787:95.047*Math.pow(a/500+y2,3),y,z=z/108.883<=.008859?z=108.883*(y2-b/200-16/116)/7.787:108.883*Math.pow(y2-b/200,3)]}function lab2lch(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]}function lab2rgb(args){return xyz2rgb(lab2xyz(args))}function lch2lab(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)]}function keyword2rgb(keyword){return cssKeywords[keyword]}module.exports={rgb2hsl:rgb2hsl,rgb2hsv:rgb2hsv,rgb2hwb:rgb2hwb,rgb2cmyk:rgb2cmyk,rgb2keyword:rgb2keyword,rgb2xyz:rgb2xyz,rgb2lab:rgb2lab,rgb2lch:function(args){return lab2lch(rgb2lab(args))},hsl2rgb:hsl2rgb,hsl2hsv:function(hsl){var h=hsl[0],s=hsl[1]/100,l=hsl[2]/100;if(0===l)return[0,0,0];return[h,100*(2*(s*=(l*=2)<=1?l:2-l)/(l+s)),100*((l+s)/2)]},hsl2hwb:function(args){return rgb2hwb(hsl2rgb(args))},hsl2cmyk:function(args){return rgb2cmyk(hsl2rgb(args))},hsl2keyword:function(args){return rgb2keyword(hsl2rgb(args))},hsv2rgb:hsv2rgb,hsv2hsl:function(hsv){var sl,l,h=hsv[0],s=hsv[1]/100,v=hsv[2]/100;return sl=s*v,[h,100*(sl=(sl/=(l=(2-s)*v)<=1?l:2-l)||0),100*(l/=2)]},hsv2hwb:function(args){return rgb2hwb(hsv2rgb(args))},hsv2cmyk:function(args){return rgb2cmyk(hsv2rgb(args))},hsv2keyword:function(args){return rgb2keyword(hsv2rgb(args))},hwb2rgb:hwb2rgb,hwb2hsl:function(args){return rgb2hsl(hwb2rgb(args))},hwb2hsv:function(args){return rgb2hsv(hwb2rgb(args))},hwb2cmyk:function(args){return rgb2cmyk(hwb2rgb(args))},hwb2keyword:function(args){return rgb2keyword(hwb2rgb(args))},cmyk2rgb:cmyk2rgb,cmyk2hsl:function(args){return rgb2hsl(cmyk2rgb(args))},cmyk2hsv:function(args){return rgb2hsv(cmyk2rgb(args))},cmyk2hwb:function(args){return rgb2hwb(cmyk2rgb(args))},cmyk2keyword:function(args){return rgb2keyword(cmyk2rgb(args))},keyword2rgb:keyword2rgb,keyword2hsl:function(args){return rgb2hsl(keyword2rgb(args))},keyword2hsv:function(args){return rgb2hsv(keyword2rgb(args))},keyword2hwb:function(args){return rgb2hwb(keyword2rgb(args))},keyword2cmyk:function(args){return rgb2cmyk(keyword2rgb(args))},keyword2lab:function(args){return rgb2lab(keyword2rgb(args))},keyword2xyz:function(args){return rgb2xyz(keyword2rgb(args))},xyz2rgb:xyz2rgb,xyz2lab:xyz2lab,xyz2lch:function(args){return lab2lch(xyz2lab(args))},lab2xyz:lab2xyz,lab2rgb:lab2rgb,lab2lch:lab2lch,lch2lab:lch2lab,lch2xyz:function(args){return lab2xyz(lch2lab(args))},lch2rgb:function(args){return lab2rgb(lch2lab(args))}};var cssKeywords={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]},reverseKeywords={};for(var key in cssKeywords)reverseKeywords[JSON.stringify(cssKeywords[key])]=key},{}],4:[function(require,module,exports){var conversions=require(3),convert=function(){return new Converter};for(var func in conversions){convert[func+"Raw"]=function(func){return function(arg){return"number"==typeof arg&&(arg=Array.prototype.slice.call(arguments)),conversions[func](arg)}}(func);var pair=/(\w+)2(\w+)/.exec(func),from=pair[1],to=pair[2];(convert[from]=convert[from]||{})[to]=convert[func]=function(func){return function(arg){"number"==typeof arg&&(arg=Array.prototype.slice.call(arguments));var val=conversions[func](arg);if("string"==typeof val||void 0===val)return val;for(var i=0;i>>0,i=0;i0)for(i=0;i=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 formatMoment(m,format){return m.isValid()?(format=expandFormat(format,m.localeData()),formatFunctions[format]=formatFunctions[format]||function(format){var i,length,input,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,matchWord=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){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(regexEscape(token.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 getSetYear=makeGetSet("FullYear",!0);function createDate(y,m,d,h,M,s,ms){var date=new Date(y,m,d,h,M,s,ms);return y<100&&y>=0&&isFinite(date.getFullYear())&&date.setFullYear(y),date}function createUTCDate(y){var date=new Date(Date.UTC.apply(null,arguments));return y<100&&y>=0&&isFinite(date.getUTCFullYear())&&date.setUTCFullYear(y),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}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)}));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("_");var defaultLocaleWeekdaysShort="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var defaultLocaleWeekdaysMin="Su_Mo_Tu_We_Th_Fr_Sa".split("_");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$1.call(this._weekdaysParse,llc))?ii:null:"ddd"===format?-1!==(ii=indexOf$1.call(this._shortWeekdaysParse,llc))?ii:null:-1!==(ii=indexOf$1.call(this._minWeekdaysParse,llc))?ii:null:"dddd"===format?-1!==(ii=indexOf$1.call(this._weekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._shortWeekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._minWeekdaysParse,llc))?ii:null:"ddd"===format?-1!==(ii=indexOf$1.call(this._shortWeekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._weekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._minWeekdaysParse,llc))?ii:null:-1!==(ii=indexOf$1.call(this._minWeekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._weekdaysParse,llc))||-1!==(ii=indexOf$1.call(this._shortWeekdaysParse,llc))?ii:null}var defaultWeekdaysRegex=matchWord;var defaultWeekdaysShortRegex=matchWord;var defaultWeekdaysMinRegex=matchWord;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 meridiem(token,lowercase){addFormatToken(token,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),lowercase)}))}function matchMeridiem(isStrict,locale){return locale._meridiemParse}addFormatToken("H",["HH",2],0,"hour"),addFormatToken("h",["hh",2],0,hFormat),addFormatToken("k",["kk",2],0,(function(){return this.hours()||24})),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"],3),addParseToken(["k","kk"],(function(input,array,config){var kInput=toInt(input);array[3]=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[3]=toInt(input),getParsingFlags(config).bigHour=!0})),addParseToken("hmm",(function(input,array,config){var pos=input.length-2;array[3]=toInt(input.substr(0,pos)),array[4]=toInt(input.substr(pos)),getParsingFlags(config).bigHour=!0})),addParseToken("hmmss",(function(input,array,config){var pos1=input.length-4,pos2=input.length-2;array[3]=toInt(input.substr(0,pos1)),array[4]=toInt(input.substr(pos1,2)),array[5]=toInt(input.substr(pos2)),getParsingFlags(config).bigHour=!0})),addParseToken("Hmm",(function(input,array,config){var pos=input.length-2;array[3]=toInt(input.substr(0,pos)),array[4]=toInt(input.substr(pos))})),addParseToken("Hmmss",(function(input,array,config){var pos1=input.length-4,pos2=input.length-2;array[3]=toInt(input.substr(0,pos1)),array[4]=toInt(input.substr(pos1,2)),array[5]=toInt(input.substr(pos2))}));var globalLocale,getSetHour=makeGetSet("Hours",!0),baseConfig={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:defaultLocaleMonths,monthsShort:defaultLocaleMonthsShort,week:{dow:0,doy:6},weekdays:defaultLocaleWeekdays,weekdaysMin:defaultLocaleWeekdaysMin,weekdaysShort:defaultLocaleWeekdaysShort,meridiemParse:/[ap]\.?m?\.?/i},locales={},localeFamilies={};function normalizeLocale(key){return key?key.toLowerCase().replace("_","-"):key}function loadLocale(name){var oldLocale=null;if(!locales[name]&&void 0!==module&&module&&module.exports)try{oldLocale=globalLocale._abbr,require("./locale/"+name),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),globalLocale._abbr}function defineLocale(name,config){if(null!==config){var 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])return localeFamilies[config.parentLocale]||(localeFamilies[config.parentLocale]=[]),localeFamilies[config.parentLocale].push({name:name,config:config}),null;parentConfig=locales[config.parentLocale]._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 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 function(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 null}(key)}function checkOverflow(m){var overflow,a=m._a;return a&&-2===getParsingFlags(m).overflow&&(overflow=a[1]<0||a[1]>11?1:a[2]<1||a[2]>daysInMonth(a[0],a[1])?2:a[3]<0||a[3]>24||24===a[3]&&(0!==a[4]||0!==a[5]||0!==a[6])?3:a[4]<0||a[4]>59?4:a[5]<0||a[5]>59?5:a[6]<0||a[6]>999?6:-1,getParsingFlags(m)._overflowDayOfYear&&(overflow<0||overflow>2)&&(overflow=2),getParsingFlags(m)._overflowWeeks&&-1===overflow&&(overflow=7),getParsingFlags(m)._overflowWeekday&&-1===overflow&&(overflow=8),getParsingFlags(m).overflow=overflow),m}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;i10?"YYYY ":"YY "),timeFormat="HH:mm"+(match[4]?":ss":""),match[1]){var momentDay=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][new Date(match[2]).getDay()];if(match[1].substr(0,3)!==momentDay)return getParsingFlags(config).weekdayMismatch=!0,void(config._isValid=!1)}switch(match[5].length){case 2:timezone=0===timezoneIndex?" +0000":((timezoneIndex="YXWVUTSRQPONZABCDEFGHIKLM".indexOf(match[5][1].toUpperCase())-12)<0?" -":" +")+(""+timezoneIndex).replace(/^-?/,"0").match(/..$/)[0]+"00";break;case 4:timezone=timezones[match[5]];break;default:timezone=timezones[" GMT"]}match[5]=timezone,config._i=match.splice(1).join("")," ZZ",config._f=dayFormat+dateFormat+timeFormat+" ZZ",configFromStringAndFormat(config),getParsingFlags(config).rfc2822=!0}else config._isValid=!1}function defaults(a,b,c){return null!=a?a:null!=b?b:c}function configFromArray(config){var i,date,currentDate,yearToUse,input=[];if(!config._d){for(currentDate=function(config){var nowValue=new Date(hooks.now());return config._useUTC?[nowValue.getUTCFullYear(),nowValue.getUTCMonth(),nowValue.getUTCDate()]:[nowValue.getFullYear(),nowValue.getMonth(),nowValue.getDate()]}(config),config._w&&null==config._a[2]&&null==config._a[1]&&function(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[0],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[0],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[0]=temp.year,config._dayOfYear=temp.dayOfYear)}(config),null!=config._dayOfYear&&(yearToUse=defaults(config._a[0],currentDate[0]),(config._dayOfYear>daysInYear(yearToUse)||0===config._dayOfYear)&&(getParsingFlags(config)._overflowDayOfYear=!0),date=createUTCDate(yearToUse,0,config._dayOfYear),config._a[1]=date.getUTCMonth(),config._a[2]=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[3]&&0===config._a[4]&&0===config._a[5]&&0===config._a[6]&&(config._nextDay=!0,config._a[3]=0),config._d=(config._useUTC?createUTCDate:createDate).apply(null,input),null!=config._tzm&&config._d.setUTCMinutes(config._d.getUTCMinutes()-config._tzm),config._nextDay&&(config._a[3]=24)}}function configFromStringAndFormat(config){if(config._f!==hooks.ISO_8601)if(config._f!==hooks.RFC_2822){config._a=[],getParsingFlags(config).empty=!0;var i,parsedInput,tokens,token,skipped,string=""+config._i,stringLength=string.length,totalParsedInputLength=0;for(tokens=expandFormat(config._f,config._locale).match(formattingTokens)||[],i=0;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[3]<=12&&!0===getParsingFlags(config).bigHour&&config._a[3]>0&&(getParsingFlags(config).bigHour=void 0),getParsingFlags(config).parsedDateParts=config._a.slice(0),getParsingFlags(config).meridiem=config._meridiem,config._a[3]=function(locale,hour,meridiem){var isPm;if(null==meridiem)return hour;return 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}(config._locale,config._a[3],config._meridiem),configFromArray(config),checkOverflow(config)}else configFromRFC2822(config);else configFromISO(config)}function prepareConfig(config){var input=config._i,format=config._f;return config._locale=config._locale||getLocale(config._l),null===input||void 0===format&&""===input?createInvalid({nullInput:!0}):("string"==typeof input&&(config._i=input=config._locale.preparse(input)),isMoment(input)?new Moment(checkOverflow(input)):(isDate(input)?config._d=input:isArray(format)?function(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;i(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}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[1]=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"],2),addParseToken("Do",(function(input,array){array[2]=toInt(input.match(match1to2)[0])}));var getSetDayOfMonth=makeGetSet("Date",!0);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"],4);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"],5);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[6]=toInt(1e3*("0."+input))}for(token="S";token.length<=9;token+="S")addParseToken(token,parseMs);var getSetMillisecond=makeGetSet("Milliseconds",!1);addFormatToken("z",0,0,"zoneAbbr"),addFormatToken("zz",0,0,"zoneName");var proto=Moment.prototype;function preParsePostFormat(string){return string}proto.add=add,proto.calendar=function(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)))},proto.clone=function(){return new Moment(this)},proto.diff=function(input,units,asFloat){var that,zoneDelta,delta,output;return this.isValid()&&(that=cloneWithOffset(input,this)).isValid()?(zoneDelta=6e4*(that.utcOffset()-this.utcOffset()),"year"===(units=normalizeUnits(units))||"month"===units||"quarter"===units?(output=function(a,b){var adjust,wholeMonthDiff=12*(b.year()-a.year())+(b.month()-a.month()),anchor=a.clone().add(wholeMonthDiff,"months");adjust=b-anchor<0?(b-anchor)/(anchor-a.clone().add(wholeMonthDiff-1,"months")):(b-anchor)/(a.clone().add(wholeMonthDiff+1,"months")-anchor);return-(wholeMonthDiff+adjust)||0}(this,that),"quarter"===units?output/=3:"year"===units&&(output/=12)):(delta=this-that,output="second"===units?delta/1e3:"minute"===units?delta/6e4:"hour"===units?delta/36e5:"day"===units?(delta-zoneDelta)/864e5:"week"===units?(delta-zoneDelta)/6048e5:delta),asFloat?output:absFloor(output)):NaN},proto.endOf=function(units){return void 0===(units=normalizeUnits(units))||"millisecond"===units?this:("date"===units&&(units="day"),this.startOf(units).add(1,"isoWeek"===units?"week":units).subtract(1,"ms"))},proto.format=function(inputString){inputString||(inputString=this.isUtc()?hooks.defaultFormatUtc:hooks.defaultFormat);var output=formatMoment(this,inputString);return this.localeData().postformat(output)},proto.from=function(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()},proto.fromNow=function(withoutSuffix){return this.from(createLocal(),withoutSuffix)},proto.to=function(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()},proto.toNow=function(withoutSuffix){return this.to(createLocal(),withoutSuffix)},proto.get=function(units){return isFunction(this[units=normalizeUnits(units)])?this[units]():this},proto.invalidAt=function(){return getParsingFlags(this).overflow},proto.isAfter=function(input,units){var localInput=isMoment(input)?input:createLocal(input);return!(!this.isValid()||!localInput.isValid())&&("millisecond"===(units=normalizeUnits(isUndefined(units)?"millisecond":units))?this.valueOf()>localInput.valueOf():localInput.valueOf()9999?formatMoment(m,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):isFunction(Date.prototype.toISOString)?this.toDate().toISOString():formatMoment(m,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},proto.inspect=function(){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",suffix=zone+'[")]';return this.format(prefix+year+"-MM-DD[T]HH:mm:ss.SSS"+suffix)},proto.toJSON=function(){return this.isValid()?this.toISOString():null},proto.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},proto.unix=function(){return Math.floor(this.valueOf()/1e3)},proto.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},proto.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},proto.year=getSetYear,proto.isLeapYear=function(){return isLeapYear(this.year())},proto.weekYear=function(input){return getSetWeekYearHelper.call(this,input,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},proto.isoWeekYear=function(input){return getSetWeekYearHelper.call(this,input,this.isoWeek(),this.isoWeekday(),1,4)},proto.quarter=proto.quarters=function(input){return null==input?Math.ceil((this.month()+1)/3):this.month(3*(input-1)+this.month()%3)},proto.month=getSetMonth,proto.daysInMonth=function(){return daysInMonth(this.year(),this.month())},proto.week=proto.weeks=function(input){var week=this.localeData().week(this);return null==input?week:this.add(7*(input-week),"d")},proto.isoWeek=proto.isoWeeks=function(input){var week=weekOfYear(this,1,4).week;return null==input?week:this.add(7*(input-week),"d")},proto.weeksInYear=function(){var weekInfo=this.localeData()._week;return weeksInYear(this.year(),weekInfo.dow,weekInfo.doy)},proto.isoWeeksInYear=function(){return weeksInYear(this.year(),1,4)},proto.date=getSetDayOfMonth,proto.day=proto.days=function(input){if(!this.isValid())return null!=input?this:NaN;var day=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=input?(input=function(input,locale){return"string"!=typeof input?input:isNaN(input)?"number"==typeof(input=locale.weekdaysParse(input))?input:null:parseInt(input,10)}(input,this.localeData()),this.add(input-day,"d")):day},proto.weekday=function(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")},proto.isoWeekday=function(input){if(!this.isValid())return null!=input?this:NaN;if(null!=input){var weekday=function(input,locale){return"string"==typeof input?locale.weekdaysParse(input)%7||7:isNaN(input)?null:input}(input,this.localeData());return this.day(this.day()%7?weekday:weekday-7)}return this.day()||7},proto.dayOfYear=function(input){var dayOfYear=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==input?dayOfYear:this.add(input-dayOfYear,"d")},proto.hour=proto.hours=getSetHour,proto.minute=proto.minutes=getSetMinute,proto.second=proto.seconds=getSetSecond,proto.millisecond=proto.milliseconds=getSetMillisecond,proto.utcOffset=function(input,keepLocalTime,keepMinutes){var localAdjust,offset=this._offset||0;if(!this.isValid())return null!=input?this:NaN;if(null!=input){if("string"==typeof input){if(null===(input=offsetFromString(matchShortOffset,input)))return this}else Math.abs(input)<16&&!keepMinutes&&(input*=60);return!this._isUTC&&keepLocalTime&&(localAdjust=getDateOffset(this)),this._offset=input,this._isUTC=!0,null!=localAdjust&&this.add(localAdjust,"m"),offset!==input&&(!keepLocalTime||this._changeInProgress?addSubtract(this,createDuration(input-offset,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,hooks.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?offset:getDateOffset(this)},proto.utc=function(keepLocalTime){return this.utcOffset(0,keepLocalTime)},proto.local=function(keepLocalTime){return this._isUTC&&(this.utcOffset(0,keepLocalTime),this._isUTC=!1,keepLocalTime&&this.subtract(getDateOffset(this),"m")),this},proto.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var tZone=offsetFromString(matchOffset,this._i);null!=tZone?this.utcOffset(tZone):this.utcOffset(0,!0)}return this},proto.hasAlignedHourOffset=function(input){return!!this.isValid()&&(input=input?createLocal(input).utcOffset():0,(this.utcOffset()-input)%60==0)},proto.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},proto.isLocal=function(){return!!this.isValid()&&!this._isUTC},proto.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},proto.isUtc=isUtc,proto.isUTC=isUtc,proto.zoneAbbr=function(){return this._isUTC?"UTC":""},proto.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},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/",(function(input,keepLocalTime){return null!=input?("string"!=typeof input&&(input=-input),this.utcOffset(input,keepLocalTime),this):-this.utcOffset()})),proto.isDSTShifted=deprecate("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){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}));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}proto$1.calendar=function(key,mom,now){var output=this._calendar[key]||this._calendar.sameElse;return isFunction(output)?output.call(mom,now):output},proto$1.longDateFormat=function(key){var format=this._longDateFormat[key],formatUpper=this._longDateFormat[key.toUpperCase()];return format||!formatUpper?format:(this._longDateFormat[key]=formatUpper.replace(/MMMM|MM|DD|dddd/g,(function(val){return val.slice(1)})),this._longDateFormat[key])},proto$1.invalidDate=function(){return this._invalidDate},proto$1.ordinal=function(number){return this._ordinal.replace("%d",number)},proto$1.preparse=preParsePostFormat,proto$1.postformat=preParsePostFormat,proto$1.relativeTime=function(number,withoutSuffix,string,isFuture){var output=this._relativeTime[string];return isFunction(output)?output(number,withoutSuffix,string,isFuture):output.replace(/%d/i,number)},proto$1.pastFuture=function(diff,output){var format=this._relativeTime[diff>0?"future":"past"];return isFunction(format)?format(output):format.replace(/%s/i,output)},proto$1.set=function(config){var prop,i;for(i in config)isFunction(prop=config[i])?this[i]=prop:this["_"+i]=prop;this._config=config,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},proto$1.months=function(m,format){return m?isArray(this._months)?this._months[m.month()]:this._months[(this._months.isFormat||MONTHS_IN_FORMAT).test(format)?"format":"standalone"][m.month()]:isArray(this._months)?this._months:this._months.standalone},proto$1.monthsShort=function(m,format){return m?isArray(this._monthsShort)?this._monthsShort[m.month()]:this._monthsShort[MONTHS_IN_FORMAT.test(format)?"format":"standalone"][m.month()]:isArray(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},proto$1.monthsParse=function(monthName,format,strict){var i,mom,regex;if(this._monthsParseExact)return handleStrictParse.call(this,monthName,format,strict);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(mom=createUTC([2e3,i]),strict&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(mom,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(mom,"").replace(".","")+"$","i")),strict||this._monthsParse[i]||(regex="^"+this.months(mom,"")+"|^"+this.monthsShort(mom,""),this._monthsParse[i]=new RegExp(regex.replace(".",""),"i")),strict&&"MMMM"===format&&this._longMonthsParse[i].test(monthName))return i;if(strict&&"MMM"===format&&this._shortMonthsParse[i].test(monthName))return i;if(!strict&&this._monthsParse[i].test(monthName))return i}},proto$1.monthsRegex=function(isStrict){return this._monthsParseExact?(hasOwnProp(this,"_monthsRegex")||computeMonthsParse.call(this),isStrict?this._monthsStrictRegex:this._monthsRegex):(hasOwnProp(this,"_monthsRegex")||(this._monthsRegex=defaultMonthsRegex),this._monthsStrictRegex&&isStrict?this._monthsStrictRegex:this._monthsRegex)},proto$1.monthsShortRegex=function(isStrict){return this._monthsParseExact?(hasOwnProp(this,"_monthsRegex")||computeMonthsParse.call(this),isStrict?this._monthsShortStrictRegex:this._monthsShortRegex):(hasOwnProp(this,"_monthsShortRegex")||(this._monthsShortRegex=defaultMonthsShortRegex),this._monthsShortStrictRegex&&isStrict?this._monthsShortStrictRegex:this._monthsShortRegex)},proto$1.week=function(mom){return weekOfYear(mom,this._week.dow,this._week.doy).week},proto$1.firstDayOfYear=function(){return this._week.doy},proto$1.firstDayOfWeek=function(){return this._week.dow},proto$1.weekdays=function(m,format){return m?isArray(this._weekdays)?this._weekdays[m.day()]:this._weekdays[this._weekdays.isFormat.test(format)?"format":"standalone"][m.day()]:isArray(this._weekdays)?this._weekdays:this._weekdays.standalone},proto$1.weekdaysMin=function(m){return m?this._weekdaysMin[m.day()]:this._weekdaysMin},proto$1.weekdaysShort=function(m){return m?this._weekdaysShort[m.day()]:this._weekdaysShort},proto$1.weekdaysParse=function(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}},proto$1.weekdaysRegex=function(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)},proto$1.weekdaysShortRegex=function(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)},proto$1.weekdaysMinRegex=function(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)},proto$1.isPM=function(input){return"p"===(input+"").toLowerCase().charAt(0)},proto$1.meridiem=function(hours,minutes,isLower){return hours>11?isLower?"pm":"PM":isLower?"am":"AM"},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 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 absCeil(number){return number<0?Math.floor(number):Math.ceil(number)}function daysToMonths(days){return 4800*days/146097}function monthsToDays(months){return 146097*months/4800}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"),asYears=makeAs("y");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");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)}var abs$1=Math.abs;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,total=this.asSeconds();return total?(total<0?"-":"")+"P"+(Y?Y+"Y":"")+(M?M+"M":"")+(D?D+"D":"")+(h||m||s?"T":"")+(h?h+"H":"")+(m?m+"M":"")+(s?s+"S":""):"P0D"}var proto$2=Duration.prototype;return proto$2.isValid=function(){return this._isValid},proto$2.abs=function(){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},proto$2.add=function(input,value){return addSubtract$1(this,input,value,1)},proto$2.subtract=function(input,value){return addSubtract$1(this,input,value,-1)},proto$2.as=function(units){if(!this.isValid())return NaN;var days,months,milliseconds=this._milliseconds;if("month"===(units=normalizeUnits(units))||"year"===units)return days=this._days+milliseconds/864e5,months=this._months+daysToMonths(days),"month"===units?months:months/12;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)}},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.asYears=asYears,proto$2.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*toInt(this._months/12):NaN},proto$2._bubble=function(){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},proto$2.get=function(units){return units=normalizeUnits(units),this.isValid()?this[units+"s"]():NaN},proto$2.milliseconds=milliseconds,proto$2.seconds=seconds,proto$2.minutes=minutes,proto$2.hours=hours,proto$2.days=days,proto$2.weeks=function(){return absFloor(this.days()/7)},proto$2.months=months,proto$2.years=years,proto$2.humanize=function(withSuffix){if(!this.isValid())return this.localeData().invalidDate();var locale=this.localeData(),output=function(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)}(this,!withSuffix,locale);return withSuffix&&(output=locale.pastFuture(+this,output)),locale.postformat(output)},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",/[+-]?\d+(\.\d{1,3})?/),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.18.1",hookCallback=createLocal,hooks.fn=proto,hooks.min=function(){var args=[].slice.call(arguments,0);return pickBy("isBefore",args)},hooks.max=function(){var args=[].slice.call(arguments,0);return pickBy("isAfter",args)},hooks.now=function(){return Date.now?Date.now():+new Date},hooks.utc=createUTC,hooks.unix=function(input){return createLocal(1e3*input)},hooks.months=function(format,index){return listMonthsImpl(format,index,"months")},hooks.isDate=isDate,hooks.locale=getSetGlobalLocale,hooks.invalid=createInvalid,hooks.duration=createDuration,hooks.isMoment=isMoment,hooks.weekdays=function(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdays")},hooks.parseZone=function(){return createLocal.apply(null,arguments).parseZone()},hooks.localeData=getLocale,hooks.isDuration=isDuration,hooks.monthsShort=function(format,index){return listMonthsImpl(format,index,"monthsShort")},hooks.weekdaysMin=function(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdaysMin")},hooks.defineLocale=defineLocale,hooks.updateLocale=function(name,config){if(null!=config){var locale,parentConfig=baseConfig;null!=locales[name]&&(parentConfig=locales[name]._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]},hooks.locales=function(){return keys$1(locales)},hooks.weekdaysShort=function(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdaysShort")},hooks.normalizeUnits=normalizeUnits,hooks.relativeTimeRounding=function(roundingFunction){return void 0===roundingFunction?round:"function"==typeof roundingFunction&&(round=roundingFunction,!0)},hooks.relativeTimeThreshold=function(threshold,limit){return void 0!==thresholds[threshold]&&(void 0===limit?thresholds[threshold]:(thresholds[threshold]=limit,"s"===threshold&&(thresholds.ss=limit-1),!0))},hooks.calendarFormat=function(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"},hooks.prototype=proto,hooks}))},{}],7:[function(require,module,exports){var Chart=require(29)();Chart.helpers=require(45),require(27)(Chart),Chart.defaults=require(25),Chart.Element=require(26),Chart.elements=require(40),Chart.Interaction=require(28),Chart.platform=require(48),require(31)(Chart),require(22)(Chart),require(23)(Chart),require(24)(Chart),require(30)(Chart),require(33)(Chart),require(32)(Chart),require(35)(Chart),require(54)(Chart),require(52)(Chart),require(53)(Chart),require(55)(Chart),require(56)(Chart),require(57)(Chart),require(15)(Chart),require(16)(Chart),require(17)(Chart),require(18)(Chart),require(19)(Chart),require(20)(Chart),require(21)(Chart),require(8)(Chart),require(9)(Chart),require(10)(Chart),require(11)(Chart),require(12)(Chart),require(13)(Chart),require(14)(Chart);var plugins=[];plugins.push(require(49)(Chart),require(50)(Chart),require(51)(Chart)),Chart.plugins.register(plugins),Chart.platform.initialize(),module.exports=Chart,"undefined"!=typeof window&&(window.Chart=Chart),Chart.canvasHelpers=Chart.helpers.canvas},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,35:35,40:40,45:45,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,8:8,9:9}],8:[function(require,module,exports){module.exports=function(Chart){Chart.Bar=function(context,config){return config.type="bar",new Chart(context,config)}}},{}],9:[function(require,module,exports){module.exports=function(Chart){Chart.Bubble=function(context,config){return config.type="bubble",new Chart(context,config)}}},{}],10:[function(require,module,exports){module.exports=function(Chart){Chart.Doughnut=function(context,config){return config.type="doughnut",new Chart(context,config)}}},{}],11:[function(require,module,exports){module.exports=function(Chart){Chart.Line=function(context,config){return config.type="line",new Chart(context,config)}}},{}],12:[function(require,module,exports){module.exports=function(Chart){Chart.PolarArea=function(context,config){return config.type="polarArea",new Chart(context,config)}}},{}],13:[function(require,module,exports){module.exports=function(Chart){Chart.Radar=function(context,config){return config.type="radar",new Chart(context,config)}}},{}],14:[function(require,module,exports){module.exports=function(Chart){Chart.Scatter=function(context,config){return config.type="scatter",new Chart(context,config)}}},{}],15:[function(require,module,exports){var defaults=require(25),elements=require(40),helpers=require(45);defaults._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),defaults._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(item,data){var title="";return item.length>0&&(item[0].yLabel?title=item[0].yLabel:data.labels.length>0&&item[0].index=0&&ivalue>0)&&(start+=ivalue));return base=scale.getPixelForValue(start),{size:size=((head=scale.getPixelForValue(start+value))-base)/2,base:base,head:head,center:head+size/2}},calculateBarIndexPixels:function(datasetIndex,index,ruler){var leftSampleSize,rightSampleSize,leftCategorySize,fullBarSize,size,options=ruler.scale.options,stackIndex=this.getStackIndex(datasetIndex),pixels=ruler.pixels,base=pixels[index],length=pixels.length,start=ruler.start,end=ruler.end;return 1===length?(leftSampleSize=base>start?base-start:end-base,rightSampleSize=base0&&(leftSampleSize=(base-pixels[index-1])/2,index===length-1&&(rightSampleSize=leftSampleSize)),index');var data=chart.data,datasets=data.datasets,labels=data.labels;if(datasets.length)for(var i=0;i'),labels[i]&&text.push(labels[i]),text.push("");return text.push(""),text.join("")},legend:{labels:{generateLabels:function(chart){var data=chart.data;return data.labels.length&&data.datasets.length?data.labels.map((function(label,i){var meta=chart.getDatasetMeta(0),ds=data.datasets[0],arc=meta.data[i],custom=arc&&arc.custom||{},valueAtIndexOrDefault=helpers.valueAtIndexOrDefault,arcOpts=chart.options.elements.arc;return{text:label,fillStyle:custom.backgroundColor?custom.backgroundColor:valueAtIndexOrDefault(ds.backgroundColor,i,arcOpts.backgroundColor),strokeStyle:custom.borderColor?custom.borderColor:valueAtIndexOrDefault(ds.borderColor,i,arcOpts.borderColor),lineWidth:custom.borderWidth?custom.borderWidth:valueAtIndexOrDefault(ds.borderWidth,i,arcOpts.borderWidth),hidden:isNaN(ds.data[i])||meta.data[i].hidden,index:i}})):[]}},onClick:function(e,legendItem){var i,ilen,meta,index=legendItem.index,chart=this.chart;for(i=0,ilen=(chart.data.datasets||[]).length;i=Math.PI?-1:startAngle<-Math.PI?1:0))+circumference,start={x:Math.cos(startAngle),y:Math.sin(startAngle)},end={x:Math.cos(endAngle),y:Math.sin(endAngle)},contains0=startAngle<=0&&endAngle>=0||startAngle<=2*Math.PI&&2*Math.PI<=endAngle,contains90=startAngle<=.5*Math.PI&&.5*Math.PI<=endAngle||startAngle<=2.5*Math.PI&&2.5*Math.PI<=endAngle,contains180=startAngle<=-Math.PI&&-Math.PI<=endAngle||startAngle<=Math.PI&&Math.PI<=endAngle,contains270=startAngle<=.5*-Math.PI&&.5*-Math.PI<=endAngle||startAngle<=1.5*Math.PI&&1.5*Math.PI<=endAngle,cutout=cutoutPercentage/100,min={x:contains180?-1:Math.min(start.x*(start.x<0?1:cutout),end.x*(end.x<0?1:cutout)),y:contains270?-1:Math.min(start.y*(start.y<0?1:cutout),end.y*(end.y<0?1:cutout))},max={x:contains0?1:Math.max(start.x*(start.x>0?1:cutout),end.x*(end.x>0?1:cutout)),y:contains90?1:Math.max(start.y*(start.y>0?1:cutout),end.y*(end.y>0?1:cutout))},size={width:.5*(max.x-min.x),height:.5*(max.y-min.y)};minSize=Math.min(availableWidth/size.width,availableHeight/size.height),offset={x:-.5*(max.x+min.x),y:-.5*(max.y+min.y)}}chart.borderWidth=me.getMaxBorderWidth(meta.data),chart.outerRadius=Math.max((minSize-chart.borderWidth)/2,0),chart.innerRadius=Math.max(cutoutPercentage?chart.outerRadius/100*cutoutPercentage:0,0),chart.radiusLength=(chart.outerRadius-chart.innerRadius)/chart.getVisibleDatasetCount(),chart.offsetX=offset.x*chart.outerRadius,chart.offsetY=offset.y*chart.outerRadius,meta.total=me.calculateTotal(),me.outerRadius=chart.outerRadius-chart.radiusLength*me.getRingIndex(me.index),me.innerRadius=Math.max(me.outerRadius-chart.radiusLength,0),helpers.each(meta.data,(function(arc,index){me.updateElement(arc,index,reset)}))},updateElement:function(arc,index,reset){var me=this,chart=me.chart,chartArea=chart.chartArea,opts=chart.options,animationOpts=opts.animation,centerX=(chartArea.left+chartArea.right)/2,centerY=(chartArea.top+chartArea.bottom)/2,startAngle=opts.rotation,endAngle=opts.rotation,dataset=me.getDataset(),circumference=reset&&animationOpts.animateRotate||arc.hidden?0:me.calculateCircumference(dataset.data[index])*(opts.circumference/(2*Math.PI)),innerRadius=reset&&animationOpts.animateScale?0:me.innerRadius,outerRadius=reset&&animationOpts.animateScale?0:me.outerRadius,valueAtIndexOrDefault=helpers.valueAtIndexOrDefault;helpers.extend(arc,{_datasetIndex:me.index,_index:index,_model:{x:centerX+chart.offsetX,y:centerY+chart.offsetY,startAngle:startAngle,endAngle:endAngle,circumference:circumference,outerRadius:outerRadius,innerRadius:innerRadius,label:valueAtIndexOrDefault(dataset.label,index,chart.data.labels[index])}});var model=arc._model;this.removeHoverStyle(arc),reset&&animationOpts.animateRotate||(model.startAngle=0===index?opts.rotation:me.getMeta().data[index-1]._model.endAngle,model.endAngle=model.startAngle+model.circumference),arc.pivot()},removeHoverStyle:function(arc){Chart.DatasetController.prototype.removeHoverStyle.call(this,arc,this.chart.options.elements.arc)},calculateTotal:function(){var value,dataset=this.getDataset(),meta=this.getMeta(),total=0;return helpers.each(meta.data,(function(element,index){value=dataset.data[index],isNaN(value)||element.hidden||(total+=Math.abs(value))})),total},calculateCircumference:function(value){var total=this.getMeta().total;return total>0&&!isNaN(value)?2*Math.PI*(value/total):0},getMaxBorderWidth:function(arcs){for(var borderWidth,hoverWidth,max=0,index=this.index,length=arcs.length,i=0;i(max=borderWidth>max?borderWidth:max)?hoverWidth:max;return max}})}},{25:25,40:40,45:45}],18:[function(require,module,exports){var defaults=require(25),elements=require(40),helpers=require(45);defaults._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}}),module.exports=function(Chart){function lineEnabled(dataset,options){return helpers.valueOrDefault(dataset.showLine,options.showLines)}Chart.controllers.line=Chart.DatasetController.extend({datasetElementType:elements.Line,dataElementType:elements.Point,update:function(reset){var i,ilen,custom,me=this,meta=me.getMeta(),line=meta.dataset,points=meta.data||[],options=me.chart.options,lineElementOptions=options.elements.line,scale=me.getScaleForId(meta.yAxisID),dataset=me.getDataset(),showLine=lineEnabled(dataset,options);for(showLine&&(custom=line.custom||{},void 0!==dataset.tension&&void 0===dataset.lineTension&&(dataset.lineTension=dataset.tension),line._scale=scale,line._datasetIndex=me.index,line._children=points,line._model={spanGaps:dataset.spanGaps?dataset.spanGaps:options.spanGaps,tension:custom.tension?custom.tension:helpers.valueOrDefault(dataset.lineTension,lineElementOptions.tension),backgroundColor:custom.backgroundColor?custom.backgroundColor:dataset.backgroundColor||lineElementOptions.backgroundColor,borderWidth:custom.borderWidth?custom.borderWidth:dataset.borderWidth||lineElementOptions.borderWidth,borderColor:custom.borderColor?custom.borderColor:dataset.borderColor||lineElementOptions.borderColor,borderCapStyle:custom.borderCapStyle?custom.borderCapStyle:dataset.borderCapStyle||lineElementOptions.borderCapStyle,borderDash:custom.borderDash?custom.borderDash:dataset.borderDash||lineElementOptions.borderDash,borderDashOffset:custom.borderDashOffset?custom.borderDashOffset:dataset.borderDashOffset||lineElementOptions.borderDashOffset,borderJoinStyle:custom.borderJoinStyle?custom.borderJoinStyle:dataset.borderJoinStyle||lineElementOptions.borderJoinStyle,fill:custom.fill?custom.fill:void 0!==dataset.fill?dataset.fill:lineElementOptions.fill,steppedLine:custom.steppedLine?custom.steppedLine:helpers.valueOrDefault(dataset.steppedLine,lineElementOptions.stepped),cubicInterpolationMode:custom.cubicInterpolationMode?custom.cubicInterpolationMode:helpers.valueOrDefault(dataset.cubicInterpolationMode,lineElementOptions.cubicInterpolationMode)},line.pivot()),i=0,ilen=points.length;i');var data=chart.data,datasets=data.datasets,labels=data.labels;if(datasets.length)for(var i=0;i'),labels[i]&&text.push(labels[i]),text.push("");return text.push(""),text.join("")},legend:{labels:{generateLabels:function(chart){var data=chart.data;return data.labels.length&&data.datasets.length?data.labels.map((function(label,i){var meta=chart.getDatasetMeta(0),ds=data.datasets[0],custom=meta.data[i].custom||{},valueAtIndexOrDefault=helpers.valueAtIndexOrDefault,arcOpts=chart.options.elements.arc;return{text:label,fillStyle:custom.backgroundColor?custom.backgroundColor:valueAtIndexOrDefault(ds.backgroundColor,i,arcOpts.backgroundColor),strokeStyle:custom.borderColor?custom.borderColor:valueAtIndexOrDefault(ds.borderColor,i,arcOpts.borderColor),lineWidth:custom.borderWidth?custom.borderWidth:valueAtIndexOrDefault(ds.borderWidth,i,arcOpts.borderWidth),hidden:isNaN(ds.data[i])||meta.data[i].hidden,index:i}})):[]}},onClick:function(e,legendItem){var i,ilen,meta,index=legendItem.index,chart=this.chart;for(i=0,ilen=(chart.data.datasets||[]).length;i0&&!isNaN(value)?2*Math.PI/count:0}})}},{25:25,40:40,45:45}],20:[function(require,module,exports){var defaults=require(25),elements=require(40),helpers=require(45);defaults._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}}),module.exports=function(Chart){Chart.controllers.radar=Chart.DatasetController.extend({datasetElementType:elements.Line,dataElementType:elements.Point,linkScales:helpers.noop,update:function(reset){var me=this,meta=me.getMeta(),line=meta.dataset,points=meta.data,custom=line.custom||{},dataset=me.getDataset(),lineElementOptions=me.chart.options.elements.line,scale=me.chart.scale;void 0!==dataset.tension&&void 0===dataset.lineTension&&(dataset.lineTension=dataset.tension),helpers.extend(meta.dataset,{_datasetIndex:me.index,_scale:scale,_children:points,_loop:!0,_model:{tension:custom.tension?custom.tension:helpers.valueOrDefault(dataset.lineTension,lineElementOptions.tension),backgroundColor:custom.backgroundColor?custom.backgroundColor:dataset.backgroundColor||lineElementOptions.backgroundColor,borderWidth:custom.borderWidth?custom.borderWidth:dataset.borderWidth||lineElementOptions.borderWidth,borderColor:custom.borderColor?custom.borderColor:dataset.borderColor||lineElementOptions.borderColor,fill:custom.fill?custom.fill:void 0!==dataset.fill?dataset.fill:lineElementOptions.fill,borderCapStyle:custom.borderCapStyle?custom.borderCapStyle:dataset.borderCapStyle||lineElementOptions.borderCapStyle,borderDash:custom.borderDash?custom.borderDash:dataset.borderDash||lineElementOptions.borderDash,borderDashOffset:custom.borderDashOffset?custom.borderDashOffset:dataset.borderDashOffset||lineElementOptions.borderDashOffset,borderJoinStyle:custom.borderJoinStyle?custom.borderJoinStyle:dataset.borderJoinStyle||lineElementOptions.borderJoinStyle}}),meta.dataset.pivot(),helpers.each(points,(function(point,index){me.updateElement(point,index,reset)}),me),me.updateBezierControlPoints()},updateElement:function(point,index,reset){var me=this,custom=point.custom||{},dataset=me.getDataset(),scale=me.chart.scale,pointElementOptions=me.chart.options.elements.point,pointPosition=scale.getPointPositionForValue(index,dataset.data[index]);void 0!==dataset.radius&&void 0===dataset.pointRadius&&(dataset.pointRadius=dataset.radius),void 0!==dataset.hitRadius&&void 0===dataset.pointHitRadius&&(dataset.pointHitRadius=dataset.hitRadius),helpers.extend(point,{_datasetIndex:me.index,_index:index,_scale:scale,_model:{x:reset?scale.xCenter:pointPosition.x,y:reset?scale.yCenter:pointPosition.y,tension:custom.tension?custom.tension:helpers.valueOrDefault(dataset.lineTension,me.chart.options.elements.line.tension),radius:custom.radius?custom.radius:helpers.valueAtIndexOrDefault(dataset.pointRadius,index,pointElementOptions.radius),backgroundColor:custom.backgroundColor?custom.backgroundColor:helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor,index,pointElementOptions.backgroundColor),borderColor:custom.borderColor?custom.borderColor:helpers.valueAtIndexOrDefault(dataset.pointBorderColor,index,pointElementOptions.borderColor),borderWidth:custom.borderWidth?custom.borderWidth:helpers.valueAtIndexOrDefault(dataset.pointBorderWidth,index,pointElementOptions.borderWidth),pointStyle:custom.pointStyle?custom.pointStyle:helpers.valueAtIndexOrDefault(dataset.pointStyle,index,pointElementOptions.pointStyle),hitRadius:custom.hitRadius?custom.hitRadius:helpers.valueAtIndexOrDefault(dataset.pointHitRadius,index,pointElementOptions.hitRadius)}}),point._model.skip=custom.skip?custom.skip:isNaN(point._model.x)||isNaN(point._model.y)},updateBezierControlPoints:function(){var chartArea=this.chart.chartArea,meta=this.getMeta();helpers.each(meta.data,(function(point,index){var model=point._model,controlPoints=helpers.splineCurve(helpers.previousItem(meta.data,index,!0)._model,model,helpers.nextItem(meta.data,index,!0)._model,model.tension);model.controlPointPreviousX=Math.max(Math.min(controlPoints.previous.x,chartArea.right),chartArea.left),model.controlPointPreviousY=Math.max(Math.min(controlPoints.previous.y,chartArea.bottom),chartArea.top),model.controlPointNextX=Math.max(Math.min(controlPoints.next.x,chartArea.right),chartArea.left),model.controlPointNextY=Math.max(Math.min(controlPoints.next.y,chartArea.bottom),chartArea.top),point.pivot()}))},setHoverStyle:function(point){var dataset=this.chart.data.datasets[point._datasetIndex],custom=point.custom||{},index=point._index,model=point._model;model.radius=custom.hoverRadius?custom.hoverRadius:helpers.valueAtIndexOrDefault(dataset.pointHoverRadius,index,this.chart.options.elements.point.hoverRadius),model.backgroundColor=custom.hoverBackgroundColor?custom.hoverBackgroundColor:helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor,index,helpers.getHoverColor(model.backgroundColor)),model.borderColor=custom.hoverBorderColor?custom.hoverBorderColor:helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor,index,helpers.getHoverColor(model.borderColor)),model.borderWidth=custom.hoverBorderWidth?custom.hoverBorderWidth:helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth,index,model.borderWidth)},removeHoverStyle:function(point){var dataset=this.chart.data.datasets[point._datasetIndex],custom=point.custom||{},index=point._index,model=point._model,pointElementOptions=this.chart.options.elements.point;model.radius=custom.radius?custom.radius:helpers.valueAtIndexOrDefault(dataset.pointRadius,index,pointElementOptions.radius),model.backgroundColor=custom.backgroundColor?custom.backgroundColor:helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor,index,pointElementOptions.backgroundColor),model.borderColor=custom.borderColor?custom.borderColor:helpers.valueAtIndexOrDefault(dataset.pointBorderColor,index,pointElementOptions.borderColor),model.borderWidth=custom.borderWidth?custom.borderWidth:helpers.valueAtIndexOrDefault(dataset.pointBorderWidth,index,pointElementOptions.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(require,module,exports){require(25)._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(item){return"("+item.xLabel+", "+item.yLabel+")"}}}}),module.exports=function(Chart){Chart.controllers.scatter=Chart.controllers.line}},{25:25}],22:[function(require,module,exports){var defaults=require(25),Element=require(26),helpers=require(45);defaults._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:helpers.noop,onComplete:helpers.noop}}),module.exports=function(Chart){Chart.Animation=Element.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),Chart.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(chart,animation,duration,lazy){var i,ilen,animations=this.animations;for(animation.chart=chart,lazy||(chart.animating=!0),i=0,ilen=animations.length;i1&&(framesToDrop=Math.floor(me.dropFrames),me.dropFrames=me.dropFrames%1),me.advance(1+framesToDrop);var endTime=Date.now();me.dropFrames+=(endTime-startTime)/me.frameDuration,me.animations.length>0&&me.requestAnimationFrame()},advance:function(count){for(var animation,chart,animations=this.animations,i=0;i=animation.numSteps?(helpers.callback(animation.onAnimationComplete,[animation],chart),chart.animating=!1,animations.splice(i,1)):++i}},Object.defineProperty(Chart.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(Chart.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(value){this.chart=value}})}},{25:25,26:26,45:45}],23:[function(require,module,exports){var defaults=require(25),helpers=require(45),Interaction=require(28),platform=require(48);module.exports=function(Chart){var plugins=Chart.plugins;function updateConfig(chart){var newOptions=chart.options;newOptions.scale?chart.scale.options=newOptions.scale:newOptions.scales&&newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach((function(scaleOptions){chart.scales[scaleOptions.id].options=scaleOptions})),chart.tooltip._options=newOptions.tooltips}function positionIsHorizontal(position){return"top"===position||"bottom"===position}Chart.types={},Chart.instances={},Chart.controllers={},helpers.extend(Chart.prototype,{construct:function(item,config){var me=this;config=function(config){var data=(config=config||{}).data=config.data||{};return data.datasets=data.datasets||[],data.labels=data.labels||[],config.options=helpers.configMerge(defaults.global,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.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.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 plugins.notify(me,"beforeInit"),helpers.retinaScale(me,me.options.devicePixelRatio),me.bindEvents(),me.options.responsive&&me.resize(!0),me.ensureScalesHaveIDs(),me.buildScales(),me.initToolTip(),plugins.notify(me,"afterInit"),me},clear:function(){return helpers.canvas.clear(this),this},stop:function(){return Chart.animationService.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.getMaximumWidth(canvas))),newHeight=Math.max(0,Math.floor(aspectRatio?newWidth/aspectRatio:helpers.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.retinaScale(me,options.devicePixelRatio),!silent)){var newSize={width:newWidth,height:newHeight};plugins.notify(me,"resize",[newSize]),me.options.onResize&&me.options.onResize(me,newSize),me.stop(),me.update(me.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var options=this.options,scalesOptions=options.scales||{},scaleOptions=options.scale;helpers.each(scalesOptions.xAxes,(function(xAxisOptions,index){xAxisOptions.id=xAxisOptions.id||"x-axis-"+index})),helpers.each(scalesOptions.yAxes,(function(yAxisOptions,index){yAxisOptions.id=yAxisOptions.id||"y-axis-"+index})),scaleOptions&&(scaleOptions.id=scaleOptions.id||"scale")},buildScales:function(){var me=this,options=me.options,scales=me.scales={},items=[];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.each(items,(function(item){var scaleOptions=item.options,scaleType=helpers.valueOrDefault(scaleOptions.type,item.dtype),scaleClass=Chart.scaleService.getScaleConstructor(scaleType);if(scaleClass){positionIsHorizontal(scaleOptions.position)!==positionIsHorizontal(item.dposition)&&(scaleOptions.position=item.dposition);var scale=new scaleClass({id:scaleOptions.id,options:scaleOptions,ctx:me.ctx,chart:me});scales[scale.id]=scale,scale.mergeTicksOptions(),item.isDefault&&(me.scale=scale)}})),Chart.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var me=this,types=[],newControllers=[];return helpers.each(me.data.datasets,(function(dataset,datasetIndex){var meta=me.getDatasetMeta(datasetIndex),type=dataset.type||me.config.type;if(meta.type&&meta.type!==type&&(me.destroyDatasetMeta(datasetIndex),meta=me.getDatasetMeta(datasetIndex)),meta.type=type,types.push(meta.type),meta.controller)meta.controller.updateIndex(datasetIndex);else{var ControllerClass=Chart.controllers[meta.type];if(void 0===ControllerClass)throw new Error('"'+meta.type+'" is not a chart type.');meta.controller=new ControllerClass(me,datasetIndex),newControllers.push(meta.controller)}}),me),newControllers},resetElements:function(){var me=this;helpers.each(me.data.datasets,(function(dataset,datasetIndex){me.getDatasetMeta(datasetIndex).controller.reset()}),me)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(config){var me=this;if(config&&"object"===_typeof(config)||(config={duration:config,lazy:arguments[1]}),updateConfig(me),!1!==plugins.notify(me,"beforeUpdate")){me.tooltip._data=me.data;var newControllers=me.buildOrUpdateControllers();helpers.each(me.data.datasets,(function(dataset,datasetIndex){me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements()}),me),me.updateLayout(),helpers.each(newControllers,(function(controller){controller.reset()})),me.updateDatasets(),plugins.notify(me,"afterUpdate"),me._bufferedRender?me._bufferedRequest={duration:config.duration,easing:config.easing,lazy:config.lazy}:me.render(config)}},updateLayout:function(){!1!==plugins.notify(this,"beforeLayout")&&(Chart.layoutService.update(this,this.width,this.height),plugins.notify(this,"afterScaleUpdate"),plugins.notify(this,"afterLayout"))},updateDatasets:function(){if(!1!==plugins.notify(this,"beforeDatasetsUpdate")){for(var i=0,ilen=this.data.datasets.length;i=0;--i)me.isDatasetVisible(i)&&me.drawDataset(i,easingValue);plugins.notify(me,"afterDatasetsDraw",[easingValue])}},drawDataset:function(index,easingValue){var meta=this.getDatasetMeta(index),args={meta:meta,index:index,easingValue:easingValue};!1!==plugins.notify(this,"beforeDatasetDraw",[args])&&(meta.controller.draw(easingValue),plugins.notify(this,"afterDatasetDraw",[args]))},getElementAtEvent:function(e){return Interaction.modes.single(this,e)},getElementsAtEvent:function(e){return Interaction.modes.label(this,e,{intersect:!0})},getElementsAtXAxis:function(e){return Interaction.modes["x-axis"](this,e,{intersect:!0})},getElementsAtEventForMode:function(e,mode,options){var method=Interaction.modes[mode];return"function"==typeof method?method(this,e,options):[]},getDatasetAtEvent:function(e){return 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}),meta},getVisibleDatasetCount:function(){for(var count=0,i=0,ilen=this.data.datasets.length;i0||(arrayEvents.forEach((function(key){delete array[key]})),delete array._chartjs)}}Chart.DatasetController=function(chart,datasetIndex){this.initialize(chart,datasetIndex)},helpers.extend(Chart.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(chart,datasetIndex){this.chart=chart,this.index=datasetIndex,this.linkScales(),this.addElements()},updateIndex:function(datasetIndex){this.index=datasetIndex},linkScales:function(){var meta=this.getMeta(),dataset=this.getDataset();null===meta.xAxisID&&(meta.xAxisID=dataset.xAxisID||this.chart.options.scales.xAxes[0].id),null===meta.yAxisID&&(meta.yAxisID=dataset.yAxisID||this.chart.options.scales.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]},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;i=target[key].length&&target[key].push({}),!target[key][i].type||scale.type&&scale.type!==target[key][i].type?helpers.merge(target[key][i],[Chart.scaleService.getScaleDefaults(type),scale]):helpers.merge(target[key][i],scale)}else helpers._merger(key,target,source,options)}})},helpers.where=function(collection,filterCallback){if(helpers.isArray(collection)&&Array.prototype.filter)return collection.filter(filterCallback);var filtered=[];return helpers.each(collection,(function(item){filterCallback(item)&&filtered.push(item)})),filtered},helpers.findIndex=Array.prototype.findIndex?function(array,callback,scope){return array.findIndex(callback,scope)}:function(array,callback,scope){scope=void 0===scope?array:scope;for(var i=0,ilen=array.length;i=0;i--){var currentItem=arrayToSearch[i];if(filterCallback(currentItem))return currentItem}},helpers.inherits=function(extensions){var me=this,ChartElement=extensions&&extensions.hasOwnProperty("constructor")?extensions.constructor:function(){return me.apply(this,arguments)},Surrogate=function(){this.constructor=ChartElement};return Surrogate.prototype=me.prototype,ChartElement.prototype=new Surrogate,ChartElement.extend=helpers.inherits,extensions&&helpers.extend(ChartElement.prototype,extensions),ChartElement.__super__=me.prototype,ChartElement},helpers.isNumber=function(n){return!isNaN(parseFloat(n))&&isFinite(n)},helpers.almostEquals=function(x,y,epsilon){return Math.abs(x-y)x},helpers.max=function(array){return array.reduce((function(max,value){return isNaN(value)?max:Math.max(max,value)}),Number.NEGATIVE_INFINITY)},helpers.min=function(array){return array.reduce((function(min,value){return isNaN(value)?min:Math.min(min,value)}),Number.POSITIVE_INFINITY)},helpers.sign=Math.sign?function(x){return Math.sign(x)}:function(x){return 0===(x=+x)||isNaN(x)?x:x>0?1:-1},helpers.log10=Math.log10?function(x){return Math.log10(x)}:function(x){return Math.log(x)/Math.LN10},helpers.toRadians=function(degrees){return degrees*(Math.PI/180)},helpers.toDegrees=function(radians){return radians*(180/Math.PI)},helpers.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.distanceBetweenPoints=function(pt1,pt2){return Math.sqrt(Math.pow(pt2.x-pt1.x,2)+Math.pow(pt2.y-pt1.y,2))},helpers.aliasPixel=function(pixelWidth){return pixelWidth%2==0?0:.5},helpers.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.EPSILON=Number.EPSILON||1e-14,helpers.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.previousItem=function(collection,index,loop){return loop?index<=0?collection[collection.length-1]:collection[index-1]:index<=0?collection[0]:collection[index-1]},helpers.niceNum=function(range,round){var exponent=Math.floor(helpers.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.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.getRelativePosition=function(evt,chart){var mouseX,mouseY,e=evt.originalEvent||evt,canvas=evt.currentTarget||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.getStyle(canvas,"padding-left")),paddingTop=parseFloat(helpers.getStyle(canvas,"padding-top")),paddingRight=parseFloat(helpers.getStyle(canvas,"padding-right")),paddingBottom=parseFloat(helpers.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.getConstraintWidth=function(domNode){return getConstraintDimension(domNode,"max-width","clientWidth")},helpers.getConstraintHeight=function(domNode){return getConstraintDimension(domNode,"max-height","clientHeight")},helpers.getMaximumWidth=function(domNode){var container=domNode.parentNode;if(!container)return domNode.clientWidth;var paddingLeft=parseInt(helpers.getStyle(container,"padding-left"),10),paddingRight=parseInt(helpers.getStyle(container,"padding-right"),10),w=container.clientWidth-paddingLeft-paddingRight,cw=helpers.getConstraintWidth(domNode);return isNaN(cw)?w:Math.min(w,cw)},helpers.getMaximumHeight=function(domNode){var container=domNode.parentNode;if(!container)return domNode.clientHeight;var paddingTop=parseInt(helpers.getStyle(container,"padding-top"),10),paddingBottom=parseInt(helpers.getStyle(container,"padding-bottom"),10),h=container.clientHeight-paddingTop-paddingBottom,ch=helpers.getConstraintHeight(domNode);return isNaN(ch)?h:Math.min(h,ch)},helpers.getStyle=function(el,property){return el.currentStyle?el.currentStyle[property]:document.defaultView.getComputedStyle(el,null).getPropertyValue(property)},helpers.retinaScale=function(chart,forceRatio){var pixelRatio=chart.currentDevicePixelRatio=forceRatio||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=height+"px",canvas.style.width=width+"px"}},helpers.fontString=function(pixelSize,fontStyle,fontFamily){return fontStyle+" "+pixelSize+"px "+fontFamily},helpers.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 longest=0;helpers.each(arrayOfThings,(function(thing){null!=thing&&!0!==helpers.isArray(thing)?longest=helpers.measureText(ctx,data,gc,longest,thing):helpers.isArray(thing)&&helpers.each(thing,(function(nestedThing){null==nestedThing||helpers.isArray(nestedThing)||(longest=helpers.measureText(ctx,data,gc,longest,nestedThing))}))}));var gcLen=gc.length/2;if(gcLen>arrayOfThings.length){for(var i=0;ilongest&&(longest=textWidth),longest},helpers.numberOfLabelLines=function(arrayOfThings){var numberOfLines=1;return helpers.each(arrayOfThings,(function(thing){helpers.isArray(thing)&&thing.length>numberOfLines&&(numberOfLines=thing.length)})),numberOfLines},helpers.color=color?function(value){return value instanceof CanvasGradient&&(value=defaults.global.defaultColor),color(value)}:function(value){return console.error("Color.js not found!"),value},helpers.getHoverColor=function(colorValue){return colorValue instanceof CanvasPattern?colorValue:helpers.color(colorValue).saturate(.5).darken(.1).rgbString()}}},{2:2,25:25,45:45}],28:[function(require,module,exports){var helpers=require(45);function getRelativePosition(e,chart){return e.native?{x:e.x,y:e.y}:helpers.getRelativePosition(e,chart)}function parseVisibleItems(chart,handler){var meta,i,j,ilen,jlen;for(i=0,ilen=chart.data.datasets.length;i0&&(items=chart.getDatasetMeta(items[0]._datasetIndex).data),items},"x-axis":function(chart,e){return indexMode(chart,e,{intersect:!0})},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),nearestItems=getNearestItems(chart,position,options.intersect,distanceMetric);return nearestItems.length>1&&nearestItems.sort((function(a,b){var ret=a.getArea()-b.getArea();return 0===ret&&(ret=a._datasetIndex-b._datasetIndex),ret})),nearestItems.slice(0,1)},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}}}},{45:45}],29:[function(require,module,exports){require(25)._set("global",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),module.exports=function(){var Chart=function(item,config){return this.construct(item,config),this};return Chart.Chart=Chart,Chart}},{25:25}],30:[function(require,module,exports){var helpers=require(45);module.exports=function(Chart){function filterByPosition(array,position){return helpers.where(array,(function(v){return v.position===position}))}function sortByWeight(array,reverse){array.forEach((function(v,i){return v._tmpIndex_=i,v})),array.sort((function(a,b){var v0=reverse?b:a,v1=reverse?a:b;return v0.weight===v1.weight?v0._tmpIndex_-v1._tmpIndex_:v0.weight-v1.weight})),array.forEach((function(v){delete v._tmpIndex_}))}Chart.layoutService={defaults:{},addBox:function(chart,item){chart.boxes||(chart.boxes=[]),item.fullWidth=item.fullWidth||!1,item.position=item.position||"top",item.weight=item.weight||0,chart.boxes.push(item)},removeBox:function(chart,layoutItem){var index=chart.boxes?chart.boxes.indexOf(layoutItem):-1;-1!==index&&chart.boxes.splice(index,1)},configure:function(chart,item,options){for(var prop,props=["fullWidth","position","weight"],ilen=props.length,i=0;itickWidth&&labelRotationme.maxHeight){labelRotation--;break}labelRotation++,labelWidth=cosRotation*originalLabelWidth}me.labelRotation=labelRotation},afterCalculateTickRotation:function(){helpers.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){helpers.callback(this.options.beforeFit,[this])},fit:function(){var me=this,minSize=me.minSize={width:0,height:0},labels=labelsFromTicks(me._ticks),opts=me.options,tickOpts=opts.ticks,scaleLabelOpts=opts.scaleLabel,gridLineOpts=opts.gridLines,display=opts.display,isHorizontal=me.isHorizontal(),tickFont=parseFontOptions(tickOpts),tickMarkLength=opts.gridLines.tickMarkLength;if(minSize.width=isHorizontal?me.isFullWidth()?me.maxWidth-me.margins.left-me.margins.right:me.maxWidth:display&&gridLineOpts.drawTicks?tickMarkLength:0,minSize.height=isHorizontal?display&&gridLineOpts.drawTicks?tickMarkLength:0:me.maxHeight,scaleLabelOpts.display&&display){var deltaHeight=parseLineHeight(scaleLabelOpts)+helpers.options.toPadding(scaleLabelOpts.padding).height;isHorizontal?minSize.height+=deltaHeight:minSize.width+=deltaHeight}if(tickOpts.display&&display){var largestTextWidth=helpers.longestText(me.ctx,tickFont.font,labels,me.longestTextCache),tallestLabelHeightInLines=helpers.numberOfLabelLines(labels),lineSpace=.5*tickFont.size,tickPadding=me.options.ticks.padding;if(isHorizontal){me.longestLabelWidth=largestTextWidth;var angleRadians=helpers.toRadians(me.labelRotation),cosRotation=Math.cos(angleRadians),labelHeight=Math.sin(angleRadians)*largestTextWidth+tickFont.size*tallestLabelHeightInLines+lineSpace*(tallestLabelHeightInLines-1)+lineSpace;minSize.height=Math.min(me.maxHeight,minSize.height+labelHeight+tickPadding),me.ctx.font=tickFont.font;var firstLabelWidth=computeTextSize(me.ctx,labels[0],tickFont.font),lastLabelWidth=computeTextSize(me.ctx,labels[labels.length-1],tickFont.font);0!==me.labelRotation?(me.paddingLeft="bottom"===opts.position?cosRotation*firstLabelWidth+3:cosRotation*lineSpace+3,me.paddingRight="bottom"===opts.position?cosRotation*lineSpace+3:cosRotation*lastLabelWidth+3):(me.paddingLeft=firstLabelWidth/2+3,me.paddingRight=lastLabelWidth/2+3)}else tickOpts.mirror?largestTextWidth=0:largestTextWidth+=tickPadding+lineSpace,minSize.width=Math.min(me.maxWidth,minSize.width+largestTextWidth),me.paddingTop=tickFont.size/2,me.paddingBottom=tickFont.size/2}me.handleMargins(),me.width=minSize.width,me.height=minSize.height},handleMargins:function(){var me=this;me.margins&&(me.paddingLeft=Math.max(me.paddingLeft-me.margins.left,0),me.paddingTop=Math.max(me.paddingTop-me.margins.top,0),me.paddingRight=Math.max(me.paddingRight-me.margins.right,0),me.paddingBottom=Math.max(me.paddingBottom-me.margins.bottom,0))},afterFit:function(){helpers.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(rawValue){if(helpers.isNullOrUndef(rawValue))return NaN;if("number"==typeof rawValue&&!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},getLabelForIndex:helpers.noop,getPixelForValue:helpers.noop,getValueForPixel:helpers.noop,getPixelForTick:function(index){var me=this,offset=me.options.offset;if(me.isHorizontal()){var tickWidth=(me.width-(me.paddingLeft+me.paddingRight))/Math.max(me._ticks.length-(offset?0:1),1),pixel=tickWidth*index+me.paddingLeft;offset&&(pixel+=tickWidth/2);var finalVal=me.left+Math.round(pixel);return finalVal+=me.isFullWidth()?me.margins.left:0}var innerHeight=me.height-(me.paddingTop+me.paddingBottom);return me.top+index*(innerHeight/(me._ticks.length-1))},getPixelForDecimal:function(decimal){var me=this;if(me.isHorizontal()){var valueOffset=(me.width-(me.paddingLeft+me.paddingRight))*decimal+me.paddingLeft,finalVal=me.left+Math.round(valueOffset);return finalVal+=me.isFullWidth()?me.margins.left:0}return me.top+decimal*me.height},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 skipRatio,i,tick,maxTicks,me=this,isHorizontal=me.isHorizontal(),optionTicks=me.options.ticks.minor,tickCount=ticks.length,labelRotationRadians=helpers.toRadians(me.labelRotation),cosRotation=Math.cos(labelRotationRadians),longestRotatedLabel=me.longestLabelWidth*cosRotation,result=[];for(optionTicks.maxTicksLimit&&(maxTicks=optionTicks.maxTicksLimit),isHorizontal&&(skipRatio=!1,(longestRotatedLabel+optionTicks.autoSkipPadding)*tickCount>me.width-(me.paddingLeft+me.paddingRight)&&(skipRatio=1+Math.floor((longestRotatedLabel+optionTicks.autoSkipPadding)*tickCount/(me.width-(me.paddingLeft+me.paddingRight)))),maxTicks&&tickCount>maxTicks&&(skipRatio=Math.max(skipRatio,Math.floor(tickCount/maxTicks)))),i=0;i1&&i%skipRatio>0||i%skipRatio==0&&i+skipRatio>=tickCount)&&i!==tickCount-1||helpers.isNullOrUndef(tick.label))&&delete tick.label,result.push(tick);return result},draw:function(chartArea){var me=this,options=me.options;if(options.display){var context=me.ctx,globalDefaults=defaults.global,optionTicks=options.ticks.minor,optionMajorTicks=options.ticks.major||optionTicks,gridLines=options.gridLines,scaleLabel=options.scaleLabel,isRotated=0!==me.labelRotation,isHorizontal=me.isHorizontal(),ticks=optionTicks.autoSkip?me._autoSkip(me.getTicks()):me.getTicks(),tickFontColor=helpers.valueOrDefault(optionTicks.fontColor,globalDefaults.defaultFontColor),tickFont=parseFontOptions(optionTicks),majorTickFontColor=helpers.valueOrDefault(optionMajorTicks.fontColor,globalDefaults.defaultFontColor),majorTickFont=parseFontOptions(optionMajorTicks),tl=gridLines.drawTicks?gridLines.tickMarkLength:0,scaleLabelFontColor=helpers.valueOrDefault(scaleLabel.fontColor,globalDefaults.defaultFontColor),scaleLabelFont=parseFontOptions(scaleLabel),scaleLabelPadding=helpers.options.toPadding(scaleLabel.padding),labelRotationRadians=helpers.toRadians(me.labelRotation),itemsToDraw=[],xTickStart="right"===options.position?me.left:me.right-tl,xTickEnd="right"===options.position?me.left+tl:me.right,yTickStart="bottom"===options.position?me.top:me.bottom-tl,yTickEnd="bottom"===options.position?me.top+tl:me.bottom;if(helpers.each(ticks,(function(tick,index){if(void 0!==tick.label){var lineWidth,lineColor,borderDash,borderDashOffset,tx1,ty1,tx2,ty2,x1,y1,x2,y2,labelX,labelY,label=tick.label;index===me.zeroLineIndex&&options.offset===gridLines.offsetGridLines?(lineWidth=gridLines.zeroLineWidth,lineColor=gridLines.zeroLineColor,borderDash=gridLines.zeroLineBorderDash,borderDashOffset=gridLines.zeroLineBorderDashOffset):(lineWidth=helpers.valueAtIndexOrDefault(gridLines.lineWidth,index),lineColor=helpers.valueAtIndexOrDefault(gridLines.color,index),borderDash=helpers.valueOrDefault(gridLines.borderDash,globalDefaults.borderDash),borderDashOffset=helpers.valueOrDefault(gridLines.borderDashOffset,globalDefaults.borderDashOffset));var textAlign="middle",textBaseline="middle",tickPadding=optionTicks.padding;if(isHorizontal){var labelYOffset=tl+tickPadding;"bottom"===options.position?(textBaseline=isRotated?"middle":"top",textAlign=isRotated?"right":"center",labelY=me.top+labelYOffset):(textBaseline=isRotated?"middle":"bottom",textAlign=isRotated?"left":"center",labelY=me.bottom-labelYOffset);var xLineValue=getLineValue(me,index,gridLines.offsetGridLines&&ticks.length>1);xLineValue1);yLineValue0)spacing=generationOptions.stepSize;else{var niceRange=helpers.niceNum(dataRange.max-dataRange.min,!1);spacing=helpers.niceNum(niceRange/(generationOptions.maxTicks-1),!0)}var niceMin=Math.floor(dataRange.min/spacing)*spacing,niceMax=Math.ceil(dataRange.max/spacing)*spacing;generationOptions.min&&generationOptions.max&&generationOptions.stepSize&&helpers.almostWhole((generationOptions.max-generationOptions.min)/generationOptions.stepSize,spacing/1e3)&&(niceMin=generationOptions.min,niceMax=generationOptions.max);var numSpaces=(niceMax-niceMin)/spacing;numSpaces=helpers.almostEquals(numSpaces,Math.round(numSpaces),spacing/1e3)?Math.round(numSpaces):Math.ceil(numSpaces),ticks.push(void 0!==generationOptions.min?generationOptions.min:niceMin);for(var j=1;j3?ticks[2]-ticks[1]:ticks[1]-ticks[0];Math.abs(delta)>1&&tickValue!==Math.floor(tickValue)&&(delta=tickValue-Math.floor(tickValue));var logDelta=helpers.log10(Math.abs(delta)),tickString="";if(0!==tickValue){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.log10(tickValue)));return 0===tickValue?"0":1===remain||2===remain||5===remain||0===index||index===ticks.length-1?tickValue.toExponential():""}}}},{45:45}],35:[function(require,module,exports){var defaults=require(25),Element=require(26),helpers=require(45);defaults._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:helpers.noop,title:function(tooltipItems,data){var title="",labels=data.labels,labelCount=labels?labels.length:0;if(tooltipItems.length>0){var item=tooltipItems[0];item.xLabel?title=item.xLabel:labelCount>0&&item.indexchart.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>chart.width},orf=function(x){return x-size.width<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){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),"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)}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=ptX+width/2)-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,opacity){var title=vm.title;if(title.length){ctx.textAlign=vm._titleAlign,ctx.textBaseline="top";var i,len,titleFontSize=vm.titleFontSize,titleSpacing=vm.titleSpacing;for(ctx.fillStyle=mergeOpacity(vm.titleFontColor,opacity),ctx.font=helpers.fontString(titleFontSize,vm._titleFontStyle,vm._titleFontFamily),i=0,len=title.length;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&&(this.drawBackground(pt,vm,ctx,tooltipSize,opacity),pt.x+=vm.xPadding,pt.y+=vm.yPadding,this.drawTitle(pt,vm,ctx,opacity),this.drawBody(pt,vm,ctx,opacity),this.drawFooter(pt,vm,ctx,opacity))}},handleEvent:function(e){var me=this,options=me._options,changed=!1;if(me._lastActive=me._lastActive||[],"mouseout"===e.type?me._active=[]:me._active=me._chart.getElementsAtEventForMode(e,options.mode,options),!(changed=!helpers.arrayEquals(me._active,me._lastActive)))return!1;if(me._lastActive=me._active,options.enabled||options.custom){me._eventPosition={x:e.x,y:e.y};var model=me._model;me.update(!0),me.pivot(),changed|=model.x!==me._model.x||model.y!==me._model.y}return changed}}),Chart.Tooltip.positioners={average:function(elements){if(!elements.length)return!1;var i,len,x=0,y=0,count=0;for(i=0,len=elements.length;iendAngle;)angle-=2*Math.PI;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 ctx=this._chart.ctx,vm=this._view,sA=vm.startAngle,eA=vm.endAngle;ctx.beginPath(),ctx.arc(vm.x,vm.y,vm.outerRadius,sA,eA),ctx.arc(vm.x,vm.y,vm.innerRadius,eA,sA,!0),ctx.closePath(),ctx.strokeStyle=vm.borderColor,ctx.lineWidth=vm.borderWidth,ctx.fillStyle=vm.backgroundColor,ctx.fill(),ctx.lineJoin="bevel",vm.borderWidth&&ctx.stroke()}})},{25:25,26:26,45:45}],37:[function(require,module,exports){var defaults=require(25),Element=require(26),helpers=require(45),globalDefaults=defaults.global;defaults._set("global",{elements:{line:{tension:.4,backgroundColor:globalDefaults.defaultColor,borderWidth:3,borderColor:globalDefaults.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}}),module.exports=Element.extend({draw:function(){var index,current,previous,currentVM,vm=this._view,ctx=this._chart.ctx,spanGaps=vm.spanGaps,points=this._children.slice(),globalOptionLineElements=globalDefaults.elements.line,lastDrawnIndex=-1;for(this._loop&&points.length&&points.push(points[0]),ctx.save(),ctx.lineCap=vm.borderCapStyle||globalOptionLineElements.borderCapStyle,ctx.setLineDash&&ctx.setLineDash(vm.borderDash||globalOptionLineElements.borderDash),ctx.lineDashOffset=vm.borderDashOffset||globalOptionLineElements.borderDashOffset,ctx.lineJoin=vm.borderJoinStyle||globalOptionLineElements.borderJoinStyle,ctx.lineWidth=vm.borderWidth||globalOptionLineElements.borderWidth,ctx.strokeStyle=vm.borderColor||globalDefaults.defaultColor,ctx.beginPath(),lastDrawnIndex=-1,index=0;indexleft?1:-1,signY=1,borderSkipped=vm.borderSkipped||"left"):(left=vm.x-vm.width/2,right=vm.x+vm.width/2,top=vm.y,signX=1,signY=(bottom=vm.base)>top?1:-1,borderSkipped=vm.borderSkipped||"bottom"),borderWidth){var barSize=Math.min(Math.abs(left-right),Math.abs(top-bottom)),halfStroke=(borderWidth=borderWidth>barSize?barSize:borderWidth)/2,borderLeft=left+("left"!==borderSkipped?halfStroke*signX:0),borderRight=right+("right"!==borderSkipped?-halfStroke*signX:0),borderTop=top+("top"!==borderSkipped?halfStroke*signY:0),borderBottom=bottom+("bottom"!==borderSkipped?-halfStroke*signY:0);borderLeft!==borderRight&&(top=borderTop,bottom=borderBottom),borderTop!==borderBottom&&(left=borderLeft,right=borderRight)}ctx.beginPath(),ctx.fillStyle=vm.backgroundColor,ctx.strokeStyle=vm.borderColor,ctx.lineWidth=borderWidth;var corners=[[left,bottom],[left,top],[right,top],[right,bottom]],startCorner=["bottom","left","top","right"].indexOf(borderSkipped,0);function cornerAt(index){return corners[(startCorner+index)%4]}-1===startCorner&&(startCorner=0);var corner=cornerAt(0);ctx.moveTo(corner[0],corner[1]);for(var i=1;i<4;i++)corner=cornerAt(i),ctx.lineTo(corner[0],corner[1]);ctx.fill(),borderWidth&&ctx.stroke()},height:function(){var vm=this._view;return vm.base-vm.y},inRange:function(mouseX,mouseY){var inRange=!1;if(this._view){var bounds=getBarBounds(this);inRange=mouseX>=bounds.left&&mouseX<=bounds.right&&mouseY>=bounds.top&&mouseY<=bounds.bottom}return inRange},inLabelRange:function(mouseX,mouseY){if(!this._view)return!1;var bounds=getBarBounds(this);return isVertical(this)?mouseX>=bounds.left&&mouseX<=bounds.right:mouseY>=bounds.top&&mouseY<=bounds.bottom},inXRange:function(mouseX){var bounds=getBarBounds(this);return mouseX>=bounds.left&&mouseX<=bounds.right},inYRange:function(mouseY){var bounds=getBarBounds(this);return mouseY>=bounds.top&&mouseY<=bounds.bottom},getCenterPoint:function(){var x,y,vm=this._view;return isVertical(this)?(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 vm.width*Math.abs(vm.y-vm.base)},tooltipPosition:function(){var vm=this._view;return{x:vm.x,y:vm.y}}})},{25:25,26:26}],40:[function(require,module,exports){module.exports={},module.exports.Arc=require(36),module.exports.Line=require(37),module.exports.Point=require(38),module.exports.Rectangle=require(39)},{36:36,37:37,38:38,39:39}],41:[function(require,module,exports){var helpers=require(42);exports=module.exports={clear:function(chart){chart.ctx.clearRect(0,0,chart.width,chart.height)},roundedRect:function(ctx,x,y,width,height,radius){if(radius){var rx=Math.min(radius,width/2),ry=Math.min(radius,height/2);ctx.moveTo(x+rx,y),ctx.lineTo(x+width-rx,y),ctx.quadraticCurveTo(x+width,y,x+width,y+ry),ctx.lineTo(x+width,y+height-ry),ctx.quadraticCurveTo(x+width,y+height,x+width-rx,y+height),ctx.lineTo(x+rx,y+height),ctx.quadraticCurveTo(x,y+height,x,y+height-ry),ctx.lineTo(x,y+ry),ctx.quadraticCurveTo(x,y,x+rx,y)}else ctx.rect(x,y,width,height)},drawPoint:function(ctx,style,radius,x,y){var type,edgeLength,xOffset,yOffset,height,size;if("object"!==_typeof(style)||"[object HTMLImageElement]"!==(type=style.toString())&&"[object HTMLCanvasElement]"!==type){if(!(isNaN(radius)||radius<=0)){switch(style){default:ctx.beginPath(),ctx.arc(x,y,radius,0,2*Math.PI),ctx.closePath(),ctx.fill();break;case"triangle":ctx.beginPath(),height=(edgeLength=3*radius/Math.sqrt(3))*Math.sqrt(3)/2,ctx.moveTo(x-edgeLength/2,y+height/3),ctx.lineTo(x+edgeLength/2,y+height/3),ctx.lineTo(x,y-2*height/3),ctx.closePath(),ctx.fill();break;case"rect":size=1/Math.SQRT2*radius,ctx.beginPath(),ctx.fillRect(x-size,y-size,2*size,2*size),ctx.strokeRect(x-size,y-size,2*size,2*size);break;case"rectRounded":var offset=radius/Math.SQRT2,leftX=x-offset,topY=y-offset,sideSize=Math.SQRT2*radius;ctx.beginPath(),this.roundedRect(ctx,leftX,topY,sideSize,sideSize,radius/2),ctx.closePath(),ctx.fill();break;case"rectRot":size=1/Math.SQRT2*radius,ctx.beginPath(),ctx.moveTo(x-size,y),ctx.lineTo(x,y+size),ctx.lineTo(x+size,y),ctx.lineTo(x,y-size),ctx.closePath(),ctx.fill();break;case"cross":ctx.beginPath(),ctx.moveTo(x,y+radius),ctx.lineTo(x,y-radius),ctx.moveTo(x-radius,y),ctx.lineTo(x+radius,y),ctx.closePath();break;case"crossRot":ctx.beginPath(),xOffset=Math.cos(Math.PI/4)*radius,yOffset=Math.sin(Math.PI/4)*radius,ctx.moveTo(x-xOffset,y-yOffset),ctx.lineTo(x+xOffset,y+yOffset),ctx.moveTo(x-xOffset,y+yOffset),ctx.lineTo(x+xOffset,y-yOffset),ctx.closePath();break;case"star":ctx.beginPath(),ctx.moveTo(x,y+radius),ctx.lineTo(x,y-radius),ctx.moveTo(x-radius,y),ctx.lineTo(x+radius,y),xOffset=Math.cos(Math.PI/4)*radius,yOffset=Math.sin(Math.PI/4)*radius,ctx.moveTo(x-xOffset,y-yOffset),ctx.lineTo(x+xOffset,y+yOffset),ctx.moveTo(x-xOffset,y+yOffset),ctx.lineTo(x+xOffset,y-yOffset),ctx.closePath();break;case"line":ctx.beginPath(),ctx.moveTo(x-radius,y),ctx.lineTo(x+radius,y),ctx.closePath();break;case"dash":ctx.beginPath(),ctx.moveTo(x,y),ctx.lineTo(x+radius,y),ctx.closePath()}ctx.stroke()}}else ctx.drawImage(style,x-style.width/2,y-style.height/2,style.width,style.height)},clipArea:function(ctx,area){ctx.save(),ctx.beginPath(),ctx.rect(area.left,area.top,area.right-area.left,area.bottom-area.top),ctx.clip()},unclipArea:function(ctx){ctx.restore()},lineTo:function(ctx,previous,target,flip){if(target.steppedLine)return"after"===target.steppedLine&&!flip||"after"!==target.steppedLine&&flip?ctx.lineTo(previous.x,target.y):ctx.lineTo(target.x,previous.y),void ctx.lineTo(target.x,target.y);target.tension?ctx.bezierCurveTo(flip?previous.controlPointPreviousX:previous.controlPointNextX,flip?previous.controlPointPreviousY:previous.controlPointNextY,flip?target.controlPointNextX:target.controlPointPreviousX,flip?target.controlPointNextY:target.controlPointPreviousY,target.x,target.y):ctx.lineTo(target.x,target.y)}};helpers.clear=exports.clear,helpers.drawRoundedRectangle=function(ctx){ctx.beginPath(),exports.roundedRect.apply(exports,arguments),ctx.closePath()}},{42:42}],42:[function(require,module,exports){var id,helpers={noop:function(){},uid:(id=0,function(){return id++}),isNullOrUndef:function(value){return null==value},isArray:Array.isArray?Array.isArray:function(value){return"[object Array]"===Object.prototype.toString.call(value)},isObject:function(value){return null!==value&&"[object Object]"===Object.prototype.toString.call(value)},valueOrDefault:function(value,defaultValue){return void 0===value?defaultValue:value},valueAtIndexOrDefault:function(value,index,defaultValue){return helpers.valueOrDefault(helpers.isArray(value)?value[index]:value,defaultValue)},callback:function(fn,args,thisArg){if(fn&&"function"==typeof fn.call)return fn.apply(thisArg,args)},each:function(loopable,fn,thisArg,reverse){var i,len,keys;if(helpers.isArray(loopable))if(len=loopable.length,reverse)for(i=len-1;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}};module.exports={effects:effects},helpers.easingEffects=effects},{42:42}],44:[function(require,module,exports){var helpers=require(42);module.exports={toLineHeight:function(value,size){var matches=(""+value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!matches||"normal"===matches[1])return 1.2*size;switch(value=+matches[2],matches[3]){case"px":return value;case"%":value/=100}return size*value},toPadding:function(value){var t,r,b,l;return helpers.isObject(value)?(t=+value.top||0,r=+value.right||0,b=+value.bottom||0,l=+value.left||0):t=r=b=l=+value||0,{top:t,right:r,bottom:b,left:l,height:t+b,width:l+r}},resolve:function(inputs,context,index){var i,ilen,value;for(i=0,ilen=inputs.length;i
          ';var expand=resizer.childNodes[0],shrink=resizer.childNodes[1];resizer._reset=function(){expand.scrollLeft=1e6,expand.scrollTop=1e6,shrink.scrollLeft=1e6,shrink.scrollTop=1e6};var onScroll=function(){resizer._reset(),handler()};return _addEventListener(expand,"scroll",onScroll.bind(expand,"expand")),_addEventListener(shrink,"scroll",onScroll.bind(shrink,"shrink")),resizer}((fn=function(){if(expando.resizer)return listener(createEvent("resize",chart))},ticking=!1,args=[],function(){args=Array.prototype.slice.call(arguments),thisArg=thisArg||this,ticking||(ticking=!0,helpers.requestAnimFrame.call(window,(function(){ticking=!1,fn.apply(thisArg,args)})))}));!function(node,handler){var proxy=(node.$chartjs||(node.$chartjs={})).renderProxy=function(e){"chartjs-render-animation"===e.animationName&&handler()};helpers.each(ANIMATION_START_EVENTS,(function(type){_addEventListener(node,type,proxy)})),node.classList.add("chartjs-render-monitor")}(node,(function(){if(expando.resizer){var container=node.parentNode;container&&container!==resizer.parentNode&&container.insertBefore(resizer,container.firstChild),resizer._reset()}}))}function removeResizeListener(node){var expando=node.$chartjs||{},resizer=expando.resizer;delete expando.resizer,function(node){var expando=node.$chartjs||{},proxy=expando.renderProxy;proxy&&(helpers.each(ANIMATION_START_EVENTS,(function(type){_removeEventListener(node,type,proxy)})),delete expando.renderProxy),node.classList.remove("chartjs-render-monitor")}(node),resizer&&resizer.parentNode&&resizer.parentNode.removeChild(resizer)}module.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function(){var platform,css,style,keyframes="from{opacity:0.99}to{opacity:1}";css="@-webkit-keyframes chartjs-render-animation{"+keyframes+"}@keyframes chartjs-render-animation{"+keyframes+"}.chartjs-render-monitor{-webkit-animation:chartjs-render-animation 0.001s;animation:chartjs-render-animation 0.001s;}",style=(platform=this)._style||document.createElement("style"),platform._style||(platform._style=style,css="/* Chart.js */\n"+css,style.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(style)),style.appendChild(document.createTextNode(css))},acquireContext:function(item,config){"string"==typeof item?item=document.getElementById(item):item.length&&(item=item[0]),item&&item.canvas&&(item=item.canvas);var context=item&&item.getContext&&item.getContext("2d");return context&&context.canvas===item?(function(canvas,config){var style=canvas.style,renderHeight=canvas.getAttribute("height"),renderWidth=canvas.getAttribute("width");if(canvas.$chartjs={initial:{height:renderHeight,width:renderWidth,style:{display:style.display,height:style.height,width:style.width}}},style.display=style.display||"block",null===renderWidth||""===renderWidth){var displayWidth=readUsedSize(canvas,"width");void 0!==displayWidth&&(canvas.width=displayWidth)}if(null===renderHeight||""===renderHeight)if(""===canvas.style.height)canvas.height=canvas.width/(config.options.aspectRatio||2);else{var displayHeight=readUsedSize(canvas,"height");void 0!==displayWidth&&(canvas.height=displayHeight)}}(item,config),context):null},releaseContext:function(context){var canvas=context.canvas;if(canvas.$chartjs){var initial=canvas.$chartjs.initial;["height","width"].forEach((function(prop){var value=initial[prop];helpers.isNullOrUndef(value)?canvas.removeAttribute(prop):canvas.setAttribute(prop,value)})),helpers.each(initial.style||{},(function(value,key){canvas.style[key]=value})),canvas.width=canvas.width,delete canvas.$chartjs}},addEventListener:function(chart,type,listener){var canvas=chart.canvas;if("resize"!==type){var expando=listener.$chartjs||(listener.$chartjs={}),proxy=(expando.proxies||(expando.proxies={}))[chart.id+"_"+type]=function(event){listener(function(event,chart){var type=EVENT_TYPES[event.type]||event.type,pos=helpers.getRelativePosition(event,chart);return createEvent(type,chart,pos.x,pos.y,event)}(event,chart))};_addEventListener(canvas,type,proxy)}else addResizeListener(canvas,listener,chart)},removeEventListener:function(chart,type,listener){var canvas=chart.canvas;if("resize"!==type){var proxy=((listener.$chartjs||{}).proxies||{})[chart.id+"_"+type];proxy&&_removeEventListener(canvas,type,proxy)}else removeResizeListener(canvas)}},helpers.addEvent=_addEventListener,helpers.removeEvent=_removeEventListener},{45:45}],48:[function(require,module,exports){var helpers=require(45),basic=require(46),dom=require(47),implementation=dom._enabled?dom:basic;module.exports=helpers.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},implementation)},{45:45,46:46,47:47}],49:[function(require,module,exports){var defaults=require(25),elements=require(40),helpers=require(45);defaults._set("global",{plugins:{filler:{propagate:!0}}}),module.exports=function(){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){var horizontal,model=source.el._model||{},scale=source.el._scale||{},fill=source.fill,target=null;if(isFinite(fill))return null;if("start"===fill?target=void 0===model.scaleBottom?scale.bottom:model.scaleBottom:"end"===fill?target=void 0===model.scaleTop?scale.top:model.scaleTop:void 0!==model.scaleZero?target=model.scaleZero:scale.getBasePosition?target=scale.getBasePosition():scale.getBasePixel&&(target=scale.getBasePixel()),null!=target){if(void 0!==target.x&&void 0!==target.y)return target;if("number"==typeof target&&isFinite(target))return{x:(horizontal=scale.isHorizontal())?target:null,y:horizontal?null:target}}return null}function resolveTarget(sources,index,propagate){var target,fill=sources[index].fill,visited=[index];if(!propagate)return fill;for(;!1!==fill&&-1===visited.indexOf(fill);){if(!isFinite(fill))return fill;if(!(target=sources[fill]))return!1;if(target.visible)return fill;visited.push(fill),fill=target.fill}return!1}function createMapper(source){var fill=source.fill,type="dataset";return!1===fill?null:(isFinite(fill)||(type="boundary"),mappers[type](source))}function isDrawable(point){return point&&!point.skip}function drawArea(ctx,curve0,curve1,len0,len1){var i;if(len0&&len1){for(ctx.moveTo(curve0[0].x,curve0[0].y),i=1;i0;--i)helpers.canvas.lineTo(ctx,curve1[i],curve1[i-1],!0)}}return{id:"filler",afterDatasetsUpdate:function(chart,options){var meta,i,el,source,count=(chart.data.datasets||[]).length,propagate=options.propagate,sources=[];for(i=0;i');for(var i=0;i'),chart.data.datasets[i].label&&text.push(chart.data.datasets[i].label),text.push("");return text.push(""),text.join("")}}),module.exports=function(Chart){var layout=Chart.layoutService,noop=helpers.noop;function getBoxWidth(labelOpts,fontSize){return labelOpts.usePointStyle?fontSize*Math.SQRT2:labelOpts.boxWidth}function createNewLegendAndAttach(chart,legendOpts){var legend=new Chart.Legend({ctx:chart.ctx,options:legendOpts,chart:chart});layout.configure(chart,legend,legendOpts),layout.addBox(chart,legend),chart.legend=legend}return Chart.Legend=Element.extend({initialize:function(config){helpers.extend(this,config),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:noop,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,beforeSetDimensions:noop,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,beforeBuildLabels:noop,buildLabels:function(){var me=this,labelOpts=me.options.labels||{},legendItems=helpers.callback(labelOpts.generateLabels,[me.chart],me)||[];labelOpts.filter&&(legendItems=legendItems.filter((function(item){return labelOpts.filter(item,me.chart.data)}))),me.options.reverse&&legendItems.reverse(),me.legendItems=legendItems},afterBuildLabels:noop,beforeFit:noop,fit:function(){var me=this,opts=me.options,labelOpts=opts.labels,display=opts.display,ctx=me.ctx,globalDefault=defaults.global,valueOrDefault=helpers.valueOrDefault,fontSize=valueOrDefault(labelOpts.fontSize,globalDefault.defaultFontSize),fontStyle=valueOrDefault(labelOpts.fontStyle,globalDefault.defaultFontStyle),fontFamily=valueOrDefault(labelOpts.fontFamily,globalDefault.defaultFontFamily),labelFont=helpers.fontString(fontSize,fontStyle,fontFamily),hitboxes=me.legendHitBoxes=[],minSize=me.minSize,isHorizontal=me.isHorizontal();if(isHorizontal?(minSize.width=me.maxWidth,minSize.height=display?10:0):(minSize.width=display?10:0,minSize.height=me.maxHeight),display)if(ctx.font=labelFont,isHorizontal){var lineWidths=me.lineWidths=[0],totalHeight=me.legendItems.length?fontSize+labelOpts.padding:0;ctx.textAlign="left",ctx.textBaseline="top",helpers.each(me.legendItems,(function(legendItem,i){var width=getBoxWidth(labelOpts,fontSize)+fontSize/2+ctx.measureText(legendItem.text).width;lineWidths[lineWidths.length-1]+width+labelOpts.padding>=me.width&&(totalHeight+=fontSize+labelOpts.padding,lineWidths[lineWidths.length]=me.left),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=[],totalWidth=labelOpts.padding,currentColWidth=0,currentColHeight=0,itemHeight=fontSize+vPadding;helpers.each(me.legendItems,(function(legendItem,i){var itemWidth=getBoxWidth(labelOpts,fontSize)+fontSize/2+ctx.measureText(legendItem.text).width;currentColHeight+itemHeight>minSize.height&&(totalWidth+=currentColWidth+labelOpts.padding,columnWidths.push(currentColWidth),currentColWidth=0,currentColHeight=0),currentColWidth=Math.max(currentColWidth,itemWidth),currentColHeight+=itemHeight,hitboxes[i]={left:0,top:0,width:itemWidth,height:fontSize}})),totalWidth+=currentColWidth,columnWidths.push(currentColWidth),minSize.width+=totalWidth}me.width=minSize.width,me.height=minSize.height},afterFit:noop,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var me=this,opts=me.options,labelOpts=opts.labels,globalDefault=defaults.global,lineDefault=globalDefault.elements.line,legendWidth=me.width,lineWidths=me.lineWidths;if(opts.display){var cursor,ctx=me.ctx,valueOrDefault=helpers.valueOrDefault,fontColor=valueOrDefault(labelOpts.fontColor,globalDefault.defaultFontColor),fontSize=valueOrDefault(labelOpts.fontSize,globalDefault.defaultFontSize),fontStyle=valueOrDefault(labelOpts.fontStyle,globalDefault.defaultFontStyle),fontFamily=valueOrDefault(labelOpts.fontFamily,globalDefault.defaultFontFamily),labelFont=helpers.fontString(fontSize,fontStyle,fontFamily);ctx.textAlign="left",ctx.textBaseline="middle",ctx.lineWidth=.5,ctx.strokeStyle=fontColor,ctx.fillStyle=fontColor,ctx.font=labelFont;var boxWidth=getBoxWidth(labelOpts,fontSize),hitboxes=me.legendHitBoxes,isHorizontal=me.isHorizontal();cursor=isHorizontal?{x:me.left+(legendWidth-lineWidths[0])/2,y:me.top+labelOpts.padding,line:0}:{x:me.left+labelOpts.padding,y:me.top+labelOpts.padding,line:0};var itemHeight=fontSize+labelOpts.padding;helpers.each(me.legendItems,(function(legendItem,i){var textWidth=ctx.measureText(legendItem.text).width,width=boxWidth+fontSize/2+textWidth,x=cursor.x,y=cursor.y;isHorizontal?x+width>=legendWidth&&(y=cursor.y+=itemHeight,cursor.line++,x=cursor.x=me.left+(legendWidth-lineWidths[cursor.line])/2):y+itemHeight>me.bottom&&(x=cursor.x=x+me.columnWidths[cursor.line]+labelOpts.padding,y=cursor.y=me.top+labelOpts.padding,cursor.line++),function(x,y,legendItem){if(!(isNaN(boxWidth)||boxWidth<=0)){ctx.save(),ctx.fillStyle=valueOrDefault(legendItem.fillStyle,globalDefault.defaultColor),ctx.lineCap=valueOrDefault(legendItem.lineCap,lineDefault.borderCapStyle),ctx.lineDashOffset=valueOrDefault(legendItem.lineDashOffset,lineDefault.borderDashOffset),ctx.lineJoin=valueOrDefault(legendItem.lineJoin,lineDefault.borderJoinStyle),ctx.lineWidth=valueOrDefault(legendItem.lineWidth,lineDefault.borderWidth),ctx.strokeStyle=valueOrDefault(legendItem.strokeStyle,globalDefault.defaultColor);var isLineWidthZero=0===valueOrDefault(legendItem.lineWidth,lineDefault.borderWidth);if(ctx.setLineDash&&ctx.setLineDash(valueOrDefault(legendItem.lineDash,lineDefault.borderDash)),opts.labels&&opts.labels.usePointStyle){var radius=fontSize*Math.SQRT2/2,offSet=radius/Math.SQRT2,centerX=x+offSet,centerY=y+offSet;helpers.canvas.drawPoint(ctx,legendItem.pointStyle,radius,centerX,centerY)}else isLineWidthZero||ctx.strokeRect(x,y,boxWidth,fontSize),ctx.fillRect(x,y,boxWidth,fontSize);ctx.restore()}}(x,y,legendItem),hitboxes[i].left=x,hitboxes[i].top=y,function(x,y,legendItem,textWidth){var halfFontSize=fontSize/2,xLeft=boxWidth+halfFontSize+x,yMiddle=y+halfFontSize;ctx.fillText(legendItem.text,xLeft,yMiddle),legendItem.hidden&&(ctx.beginPath(),ctx.lineWidth=2,ctx.moveTo(xLeft,yMiddle),ctx.lineTo(xLeft+textWidth,yMiddle),ctx.stroke())}(x,y,legendItem,textWidth),isHorizontal?cursor.x+=width+labelOpts.padding:cursor.y+=itemHeight}))}},handleEvent:function(e){var me=this,opts=me.options,type="mouseup"===e.type?"click":e.type,changed=!1;if("mousemove"===type){if(!opts.onHover)return}else{if("click"!==type)return;if(!opts.onClick)return}var x=e.x,y=e.y;if(x>=me.left&&x<=me.right&&y>=me.top&&y<=me.bottom)for(var lh=me.legendHitBoxes,i=0;i=hitBox.left&&x<=hitBox.left+hitBox.width&&y>=hitBox.top&&y<=hitBox.top+hitBox.height){if("click"===type){opts.onClick.call(me,e.native,me.legendItems[i]),changed=!0;break}if("mousemove"===type){opts.onHover.call(me,e.native,me.legendItems[i]),changed=!0;break}}}return changed}}),{id:"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.mergeIf(legendOpts,defaults.global.legend),legend?(layout.configure(chart,legend,legendOpts),legend.options=legendOpts):createNewLegendAndAttach(chart,legendOpts)):legend&&(layout.removeBox(chart,legend),delete chart.legend)},afterEvent:function(chart,e){var legend=chart.legend;legend&&legend.handleEvent(e)}}}},{25:25,26:26,45:45}],51:[function(require,module,exports){var defaults=require(25),Element=require(26),helpers=require(45);defaults._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}}),module.exports=function(Chart){var layout=Chart.layoutService,noop=helpers.noop;function createNewTitleBlockAndAttach(chart,titleOpts){var title=new Chart.Title({ctx:chart.ctx,options:titleOpts,chart:chart});layout.configure(chart,title,titleOpts),layout.addBox(chart,title),chart.titleBlock=title}return Chart.Title=Element.extend({initialize:function(config){helpers.extend(this,config),this.legendHitBoxes=[]},beforeUpdate:noop,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,beforeSetDimensions:noop,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,beforeBuildLabels:noop,buildLabels:noop,afterBuildLabels:noop,beforeFit:noop,fit:function(){var me=this,valueOrDefault=helpers.valueOrDefault,opts=me.options,display=opts.display,fontSize=valueOrDefault(opts.fontSize,defaults.global.defaultFontSize),minSize=me.minSize,lineCount=helpers.isArray(opts.text)?opts.text.length:1,lineHeight=helpers.options.toLineHeight(opts.lineHeight,fontSize),textSize=display?lineCount*lineHeight+2*opts.padding:0;me.isHorizontal()?(minSize.width=me.maxWidth,minSize.height=textSize):(minSize.width=textSize,minSize.height=me.maxHeight),me.width=minSize.width,me.height=minSize.height},afterFit:noop,isHorizontal:function(){var pos=this.options.position;return"top"===pos||"bottom"===pos},draw:function(){var me=this,ctx=me.ctx,valueOrDefault=helpers.valueOrDefault,opts=me.options,globalDefaults=defaults.global;if(opts.display){var maxWidth,titleX,titleY,fontSize=valueOrDefault(opts.fontSize,globalDefaults.defaultFontSize),fontStyle=valueOrDefault(opts.fontStyle,globalDefaults.defaultFontStyle),fontFamily=valueOrDefault(opts.fontFamily,globalDefaults.defaultFontFamily),titleFont=helpers.fontString(fontSize,fontStyle,fontFamily),lineHeight=helpers.options.toLineHeight(opts.lineHeight,fontSize),offset=lineHeight/2+opts.padding,rotation=0,top=me.top,left=me.left,bottom=me.bottom,right=me.right;ctx.fillStyle=valueOrDefault(opts.fontColor,globalDefaults.defaultFontColor),ctx.font=titleFont,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.isArray(text))for(var y=0,i=0;ime.max)&&(me.max=value))}))}));me.min=isFinite(me.min)&&!isNaN(me.min)?me.min:0,me.max=isFinite(me.max)&&!isNaN(me.max)?me.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var maxTicks,tickOpts=this.options.ticks;if(this.isHorizontal())maxTicks=Math.min(tickOpts.maxTicksLimit?tickOpts.maxTicksLimit:11,Math.ceil(this.width/50));else{var tickFontSize=helpers.valueOrDefault(tickOpts.fontSize,defaults.global.defaultFontSize);maxTicks=Math.min(tickOpts.maxTicksLimit?tickOpts.maxTicksLimit:11,Math.ceil(this.height/(2*tickFontSize)))}return maxTicks},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(index,datasetIndex){return+this.getRightValue(this.chart.data.datasets[datasetIndex].data[index])},getPixelForValue:function(value){var pixel,me=this,start=me.start,rightValue=+me.getRightValue(value),range=me.end-start;return me.isHorizontal()?(pixel=me.left+me.width/range*(rightValue-start),Math.round(pixel)):(pixel=me.bottom-me.height/range*(rightValue-start),Math.round(pixel))},getValueForPixel:function(pixel){var me=this,isHorizontal=me.isHorizontal(),innerDimension=isHorizontal?me.width:me.height,offset=(isHorizontal?pixel-me.left:me.bottom-pixel)/innerDimension;return me.start+(me.end-me.start)*offset},getPixelForTick:function(index){return this.getPixelForValue(this.ticksAsNumbers[index])}});Chart.scaleService.registerScaleType("linear",LinearScale,defaultConfig)}},{25:25,34:34,45:45}],54:[function(require,module,exports){var helpers=require(45),Ticks=require(34);module.exports=function(Chart){var noop=helpers.noop;Chart.LinearScaleBase=Chart.Scale.extend({getRightValue:function(value){return"string"==typeof value?+value:Chart.Scale.prototype.getRightValue.call(this,value)},handleTickRangeOptions:function(){var me=this,tickOpts=me.options.ticks;if(tickOpts.beginAtZero){var minSign=helpers.sign(me.min),maxSign=helpers.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:noop,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,stepSize:helpers.valueOrDefault(tickOpts.fixedStepSize,tickOpts.stepSize)},ticks=me.ticks=Ticks.generators.linear(numericGeneratorOptions,me);me.handleDirectionalChanges(),me.max=helpers.max(ticks),me.min=helpers.min(ticks),tickOpts.reverse?(ticks.reverse(),me.start=me.max,me.end=me.min):(me.start=me.min,me.end=me.max)},convertTicksToLabels:function(){var me=this;me.ticksAsNumbers=me.ticks.slice(),me.zeroLineIndex=me.ticks.indexOf(0),Chart.Scale.prototype.convertTicksToLabels.call(me)}})}},{34:34,45:45}],55:[function(require,module,exports){var helpers=require(45),Ticks=require(34);module.exports=function(Chart){var defaultConfig={position:"left",ticks:{callback:Ticks.formatters.logarithmic}},LogarithmicScale=Chart.Scale.extend({determineDataLimits:function(){var me=this,opts=me.options,tickOpts=opts.ticks,chart=me.chart,datasets=chart.data.datasets,valueOrDefault=helpers.valueOrDefault,isHorizontal=me.isHorizontal();function IDMatches(meta){return isHorizontal?meta.xAxisID===me.id:meta.yAxisID===me.id}me.min=null,me.max=null,me.minNotZero=null;var hasStacks=opts.stacked;if(void 0===hasStacks&&helpers.each(datasets,(function(dataset,datasetIndex){if(!hasStacks){var meta=chart.getDatasetMeta(datasetIndex);chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)&&void 0!==meta.stack&&(hasStacks=!0)}})),opts.stacked||hasStacks){var valuesPerStack={};helpers.each(datasets,(function(dataset,datasetIndex){var meta=chart.getDatasetMeta(datasetIndex),key=[meta.type,void 0===opts.stacked&&void 0===meta.stack?datasetIndex:"",meta.stack].join(".");chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)&&(void 0===valuesPerStack[key]&&(valuesPerStack[key]=[]),helpers.each(dataset.data,(function(rawValue,index){var values=valuesPerStack[key],value=+me.getRightValue(rawValue);isNaN(value)||meta.data[index].hidden||(values[index]=values[index]||0,opts.relativePoints?values[index]=100:values[index]+=value)})))})),helpers.each(valuesPerStack,(function(valuesForType){var minVal=helpers.min(valuesForType),maxVal=helpers.max(valuesForType);me.min=null===me.min?minVal:Math.min(me.min,minVal),me.max=null===me.max?maxVal:Math.max(me.max,maxVal)}))}else helpers.each(datasets,(function(dataset,datasetIndex){var meta=chart.getDatasetMeta(datasetIndex);chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)&&helpers.each(dataset.data,(function(rawValue,index){var value=+me.getRightValue(rawValue);isNaN(value)||meta.data[index].hidden||((null===me.min||valueme.max)&&(me.max=value),0!==value&&(null===me.minNotZero||valuemax?{start:pos-size-5,end:pos}:{start:pos,end:pos+size+5}}function getTextAlignForAngle(angle){return 0===angle||180===angle?"center":angle<180?"left":"right"}function fillText(ctx,text,position,fontSize){if(helpers.isArray(text))for(var y=position.y,spacing=1.5*fontSize,i=0;i270||angle<90)&&(position.y-=textSize.h)}function numberOrZero(param){return helpers.isNumber(param)?param:0}var LinearRadialScale=Chart.LinearScaleBase.extend({setDimensions:function(){var me=this,opts=me.options,tickOpts=opts.ticks;me.width=me.maxWidth,me.height=me.maxHeight,me.xCenter=Math.round(me.width/2),me.yCenter=Math.round(me.height/2);var minSize=helpers.min([me.height,me.width]),tickFontSize=helpers.valueOrDefault(tickOpts.fontSize,globalDefaults.defaultFontSize);me.drawingArea=opts.display?minSize/2-(tickFontSize/2+tickOpts.backdropPaddingY):minSize/2},determineDataLimits:function(){var me=this,chart=me.chart,min=Number.POSITIVE_INFINITY,max=Number.NEGATIVE_INFINITY;helpers.each(chart.data.datasets,(function(dataset,datasetIndex){if(chart.isDatasetVisible(datasetIndex)){var meta=chart.getDatasetMeta(datasetIndex);helpers.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()},getTickLimit:function(){var tickOpts=this.options.ticks,tickFontSize=helpers.valueOrDefault(tickOpts.fontSize,globalDefaults.defaultFontSize);return Math.min(tickOpts.maxTicksLimit?tickOpts.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*tickFontSize)))},convertTicksToLabels:function(){var me=this;Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me),me.pointLabels=me.chart.data.labels.map(me.options.pointLabels.callback,me)},getLabelForIndex:function(index,datasetIndex){return+this.getRightValue(this.chart.data.datasets[datasetIndex].data[index])},fit:function(){var scale,largestPossibleRadius;this.options.pointLabels.display?function(scale){var i,textSize,pointPosition,plFont=getPointLabelFontOptions(scale),largestPossibleRadius=Math.min(scale.height/2,scale.width/2),furthestLimits={r:scale.width,l:0,t:scale.height,b:0},furthestAngles={};scale.ctx.font=plFont.font,scale._pointLabelSizes=[];var ctx,fontSize,label,valueCount=getValueCount(scale);for(i=0;ifurthestLimits.r&&(furthestLimits.r=hLimits.end,furthestAngles.r=angleRadians),vLimits.startfurthestLimits.b&&(furthestLimits.b=vLimits.end,furthestAngles.b=angleRadians)}scale.setReductions(largestPossibleRadius,furthestLimits,furthestAngles)}(this):(scale=this,largestPossibleRadius=Math.min(scale.height/2,scale.width/2),scale.drawingArea=Math.round(largestPossibleRadius),scale.setCenterPoint(0,0,0,0))},setReductions:function(largestPossibleRadius,furthestLimits,furthestAngles){var radiusReductionLeft=furthestLimits.l/Math.sin(furthestAngles.l),radiusReductionRight=Math.max(furthestLimits.r-this.width,0)/Math.sin(furthestAngles.r),radiusReductionTop=-furthestLimits.t/Math.cos(furthestAngles.t),radiusReductionBottom=-Math.max(furthestLimits.b-this.height,0)/Math.cos(furthestAngles.b);radiusReductionLeft=numberOrZero(radiusReductionLeft),radiusReductionRight=numberOrZero(radiusReductionRight),radiusReductionTop=numberOrZero(radiusReductionTop),radiusReductionBottom=numberOrZero(radiusReductionBottom),this.drawingArea=Math.min(Math.round(largestPossibleRadius-(radiusReductionLeft+radiusReductionRight)/2),Math.round(largestPossibleRadius-(radiusReductionTop+radiusReductionBottom)/2)),this.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-bottomMovement-me.drawingArea;me.xCenter=Math.round((maxLeft+maxRight)/2+me.left),me.yCenter=Math.round((maxTop+maxBottom)/2+me.top)},getIndexAngle:function(index){return index*(2*Math.PI/getValueCount(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(value){var me=this;if(null===value)return 0;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.round(Math.cos(thisAngle)*distanceFromCenter)+this.xCenter,y:Math.round(Math.sin(thisAngle)*distanceFromCenter)+this.yCenter}},getPointPositionForValue:function(index,value){return this.getPointPosition(index,this.getDistanceFromCenterForValue(value))},getBasePosition:function(){var min=this.min,max=this.max;return this.getPointPositionForValue(0,this.beginAtZero?0:min<0&&max<0?max:min>0&&max>0?min:0)},draw:function(){var me=this,opts=me.options,gridLineOpts=opts.gridLines,tickOpts=opts.ticks,valueOrDefault=helpers.valueOrDefault;if(opts.display){var ctx=me.ctx,startAngle=this.getIndexAngle(0),tickFontSize=valueOrDefault(tickOpts.fontSize,globalDefaults.defaultFontSize),tickFontStyle=valueOrDefault(tickOpts.fontStyle,globalDefaults.defaultFontStyle),tickFontFamily=valueOrDefault(tickOpts.fontFamily,globalDefaults.defaultFontFamily),tickLabelFont=helpers.fontString(tickFontSize,tickFontStyle,tickFontFamily);helpers.each(me.ticks,(function(label,index){if(index>0||tickOpts.reverse){var yCenterOffset=me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);if(gridLineOpts.display&&0!==index&&function(scale,gridLineOpts,radius,index){var ctx=scale.ctx;if(ctx.strokeStyle=helpers.valueAtIndexOrDefault(gridLineOpts.color,index-1),ctx.lineWidth=helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth,index-1),scale.options.gridLines.circular)ctx.beginPath(),ctx.arc(scale.xCenter,scale.yCenter,radius,0,2*Math.PI),ctx.closePath(),ctx.stroke();else{var valueCount=getValueCount(scale);if(0===valueCount)return;ctx.beginPath();var pointPosition=scale.getPointPosition(0,radius);ctx.moveTo(pointPosition.x,pointPosition.y);for(var i=1;i=0;i--){if(angleLineOpts.display){var outerPosition=scale.getPointPosition(i,outerDistance);ctx.beginPath(),ctx.moveTo(scale.xCenter,scale.yCenter),ctx.lineTo(outerPosition.x,outerPosition.y),ctx.stroke(),ctx.closePath()}if(pointLabelOpts.display){var pointLabelPosition=scale.getPointPosition(i,outerDistance+5),pointLabelFontColor=valueOrDefault(pointLabelOpts.fontColor,globalDefaults.defaultFontColor);ctx.font=plFont.font,ctx.fillStyle=pointLabelFontColor;var angleRadians=scale.getIndexAngle(i),angle=helpers.toDegrees(angleRadians);ctx.textAlign=getTextAlignForAngle(angle),adjustPointPositionForLabelHeight(angle,scale._pointLabelSizes[i],pointLabelPosition),fillText(ctx,scale.pointLabels[i]||"",pointLabelPosition,plFont.size)}}}(me)}}});Chart.scaleService.registerScaleType("radialLinear",LinearRadialScale,defaultConfig)}},{25:25,34:34,45:45}],57:[function(require,module,exports){var moment=require(6);moment="function"==typeof moment?moment:window.moment;var defaults=require(25),helpers=require(45),MIN_INTEGER=Number.MIN_SAFE_INTEGER||-9007199254740991,MAX_INTEGER=Number.MAX_SAFE_INTEGER||9007199254740991,INTERVALS={millisecond:{major:!0,size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{major:!0,size:1e3,steps:[1,2,5,10,30]},minute:{major:!0,size:6e4,steps:[1,2,5,10,30]},hour:{major:!0,size:36e5,steps:[1,2,3,6,12]},day:{major:!0,size:864e5,steps:[1,2,5]},week:{major:!1,size:6048e5,steps:[1,2,3,4]},month:{major:!0,size:2628e6,steps:[1,2,3]},quarter:{major:!1,size:7884e6,steps:[1,2,3,4]},year:{major:!0,size:3154e7}},UNITS=Object.keys(INTERVALS);function sorter(a,b){return a-b}function arrayUnique(items){var i,ilen,item,hash={},out=[];for(i=0,ilen=items.length;i=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 momentify(value,options){var parser=options.parser,format=options.parser||options.format;return"function"==typeof parser?parser(value):"string"==typeof value&&"string"==typeof format?moment(value,format):(value instanceof moment||(value=moment(value)),value.isValid()?value:"function"==typeof format?format(value):value)}function parse(input,scale){if(helpers.isNullOrUndef(input))return null;var options=scale.options.time,value=momentify(scale.getRightValue(input),options);return value.isValid()?(options.round&&value.startOf(options.round),value.valueOf()):null}function generate(min,max,minor,major,capacity,options){var time,timeOpts=options.time,stepSize=helpers.valueOrDefault(timeOpts.stepSize,timeOpts.unitStepSize),weekday="week"===minor&&timeOpts.isoWeekday,majorTicksEnabled=options.ticks.major.enabled,interval=INTERVALS[minor],first=moment(min),last=moment(max),ticks=[];for(stepSize||(stepSize=function(min,max,unit,capacity){var i,ilen,factor,range=max-min,interval=INTERVALS[unit],milliseconds=interval.size,steps=interval.steps;if(!steps)return Math.ceil(range/((capacity||1)*milliseconds));for(i=0,ilen=steps.length;i=min&×tamp<=max&&ticks.push(timestamp);return me.min=min,me.max=max,me._unit=unit,me._majorUnit=majorUnit,me._minorFormat=formats[unit],me._majorFormat=formats[majorUnit],me._table=function(timestamps,min,max,distribution){if("linear"===distribution||!timestamps.length)return[{time:min,pos:0},{time:max,pos:1}];var i,ilen,prev,curr,next,table=[],items=[min];for(i=0,ilen=timestamps.length;imin&&curr1?ticks[1]:max,lower=ticks[0],left=(interpolate(table,"time",upper,"pos")-interpolate(table,"time",lower,"pos"))/2),options.time.max||(upper=ticks[ticks.length-1],lower=ticks.length>1?ticks[ticks.length-2]:min,right=(interpolate(table,"time",upper,"pos")-interpolate(table,"time",lower,"pos"))/2)),{left:left,right:right}}(me._table,ticks,min,max,options),function(values,majorUnit){var i,ilen,value,major,ticks=[];for(i=0,ilen=values.length;i=0&&index lum2) {\n return (lum1 + 0.05) / (lum2 + 0.05);\n }\n return (lum2 + 0.05) / (lum1 + 0.05);\n },\n\n level: function (color2) {\n var contrastRatio = this.contrast(color2);\n if (contrastRatio >= 7.1) {\n return 'AAA';\n }\n\n return (contrastRatio >= 4.5) ? 'AA' : '';\n },\n\n dark: function () {\n // YIQ equation from http://24ways.org/2010/calculating-color-contrast\n var rgb = this.values.rgb;\n var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n return yiq < 128;\n },\n\n light: function () {\n return !this.dark();\n },\n\n negate: function () {\n var rgb = [];\n for (var i = 0; i < 3; i++) {\n rgb[i] = 255 - this.values.rgb[i];\n }\n this.setValues('rgb', rgb);\n return this;\n },\n\n lighten: function (ratio) {\n var hsl = this.values.hsl;\n hsl[2] += hsl[2] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n darken: function (ratio) {\n var hsl = this.values.hsl;\n hsl[2] -= hsl[2] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n saturate: function (ratio) {\n var hsl = this.values.hsl;\n hsl[1] += hsl[1] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n desaturate: function (ratio) {\n var hsl = this.values.hsl;\n hsl[1] -= hsl[1] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n whiten: function (ratio) {\n var hwb = this.values.hwb;\n hwb[1] += hwb[1] * ratio;\n this.setValues('hwb', hwb);\n return this;\n },\n\n blacken: function (ratio) {\n var hwb = this.values.hwb;\n hwb[2] += hwb[2] * ratio;\n this.setValues('hwb', hwb);\n return this;\n },\n\n greyscale: function () {\n var rgb = this.values.rgb;\n // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n this.setValues('rgb', [val, val, val]);\n return this;\n },\n\n clearer: function (ratio) {\n var alpha = this.values.alpha;\n this.setValues('alpha', alpha - (alpha * ratio));\n return this;\n },\n\n opaquer: function (ratio) {\n var alpha = this.values.alpha;\n this.setValues('alpha', alpha + (alpha * ratio));\n return this;\n },\n\n rotate: function (degrees) {\n var hsl = this.values.hsl;\n var hue = (hsl[0] + degrees) % 360;\n hsl[0] = hue < 0 ? 360 + hue : hue;\n this.setValues('hsl', hsl);\n return this;\n },\n\n /**\n * Ported from sass implementation in C\n * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n */\n mix: function (mixinColor, weight) {\n var color1 = this;\n var color2 = mixinColor;\n var p = weight === undefined ? 0.5 : weight;\n\n var w = 2 * p - 1;\n var a = color1.alpha() - color2.alpha();\n\n var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n var w2 = 1 - w1;\n\n return this\n .rgb(\n w1 * color1.red() + w2 * color2.red(),\n w1 * color1.green() + w2 * color2.green(),\n w1 * color1.blue() + w2 * color2.blue()\n )\n .alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n },\n\n toJSON: function () {\n return this.rgb();\n },\n\n clone: function () {\n // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n // making the final build way to big to embed in Chart.js. So let's do it manually,\n // assuming that values to clone are 1 dimension arrays containing only numbers,\n // except 'alpha' which is a number.\n var result = new Color();\n var source = this.values;\n var target = result.values;\n var value, type;\n\n for (var prop in source) {\n if (source.hasOwnProperty(prop)) {\n value = source[prop];\n type = ({}).toString.call(value);\n if (type === '[object Array]') {\n target[prop] = value.slice(0);\n } else if (type === '[object Number]') {\n target[prop] = value;\n } else {\n console.error('unexpected color value:', value);\n }\n }\n }\n\n return result;\n }\n };\n\n Color.prototype.spaces = {\n rgb: ['red', 'green', 'blue'],\n hsl: ['hue', 'saturation', 'lightness'],\n hsv: ['hue', 'saturation', 'value'],\n hwb: ['hue', 'whiteness', 'blackness'],\n cmyk: ['cyan', 'magenta', 'yellow', 'black']\n };\n\n Color.prototype.maxes = {\n rgb: [255, 255, 255],\n hsl: [360, 100, 100],\n hsv: [360, 100, 100],\n hwb: [360, 100, 100],\n cmyk: [100, 100, 100, 100]\n };\n\n Color.prototype.getValues = function (space) {\n var values = this.values;\n var vals = {};\n\n for (var i = 0; i < space.length; i++) {\n vals[space.charAt(i)] = values[space][i];\n }\n\n if (values.alpha !== 1) {\n vals.a = values.alpha;\n }\n\n // {r: 255, g: 255, b: 255, a: 0.4}\n return vals;\n };\n\n Color.prototype.setValues = function (space, vals) {\n var values = this.values;\n var spaces = this.spaces;\n var maxes = this.maxes;\n var alpha = 1;\n var i;\n\n this.valid = true;\n\n if (space === 'alpha') {\n alpha = vals;\n } else if (vals.length) {\n // [10, 10, 10]\n values[space] = vals.slice(0, space.length);\n alpha = vals[space.length];\n } else if (vals[space.charAt(0)] !== undefined) {\n // {r: 10, g: 10, b: 10}\n for (i = 0; i < space.length; i++) {\n values[space][i] = vals[space.charAt(i)];\n }\n\n alpha = vals.a;\n } else if (vals[spaces[space][0]] !== undefined) {\n // {red: 10, green: 10, blue: 10}\n var chans = spaces[space];\n\n for (i = 0; i < space.length; i++) {\n values[space][i] = vals[chans[i]];\n }\n\n alpha = vals.alpha;\n }\n\n values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));\n\n if (space === 'alpha') {\n return false;\n }\n\n var capped;\n\n // cap values of the space prior converting all values\n for (i = 0; i < space.length; i++) {\n capped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n values[space][i] = Math.round(capped);\n }\n\n // convert to all the other color spaces\n for (var sname in spaces) {\n if (sname !== space) {\n values[sname] = convert[space][sname](values[space]);\n }\n }\n\n return true;\n };\n\n Color.prototype.setSpace = function (space, args) {\n var vals = args[0];\n\n if (vals === undefined) {\n // color.rgb()\n return this.getValues(space);\n }\n\n // color.rgb(10, 10, 10)\n if (typeof vals === 'number') {\n vals = Array.prototype.slice.call(args);\n }\n\n this.setValues(space, vals);\n return this;\n };\n\n Color.prototype.setChannel = function (space, index, val) {\n var svalues = this.values[space];\n if (val === undefined) {\n // color.red()\n return svalues[index];\n } else if (val === svalues[index]) {\n // color.red(color.red())\n return this;\n }\n\n // color.red(100)\n svalues[index] = val;\n this.setValues(space, svalues);\n\n return this;\n };\n\n if (typeof window !== 'undefined') {\n window.Color = Color;\n }\n\n module.exports = Color;\n\n},{\"1\":1,\"4\":4}],3:[function(require,module,exports){\n\t/* MIT license */\n\n module.exports = {\n rgb2hsl: rgb2hsl,\n rgb2hsv: rgb2hsv,\n rgb2hwb: rgb2hwb,\n rgb2cmyk: rgb2cmyk,\n rgb2keyword: rgb2keyword,\n rgb2xyz: rgb2xyz,\n rgb2lab: rgb2lab,\n rgb2lch: rgb2lch,\n\n hsl2rgb: hsl2rgb,\n hsl2hsv: hsl2hsv,\n hsl2hwb: hsl2hwb,\n hsl2cmyk: hsl2cmyk,\n hsl2keyword: hsl2keyword,\n\n hsv2rgb: hsv2rgb,\n hsv2hsl: hsv2hsl,\n hsv2hwb: hsv2hwb,\n hsv2cmyk: hsv2cmyk,\n hsv2keyword: hsv2keyword,\n\n hwb2rgb: hwb2rgb,\n hwb2hsl: hwb2hsl,\n hwb2hsv: hwb2hsv,\n hwb2cmyk: hwb2cmyk,\n hwb2keyword: hwb2keyword,\n\n cmyk2rgb: cmyk2rgb,\n cmyk2hsl: cmyk2hsl,\n cmyk2hsv: cmyk2hsv,\n cmyk2hwb: cmyk2hwb,\n cmyk2keyword: cmyk2keyword,\n\n keyword2rgb: keyword2rgb,\n keyword2hsl: keyword2hsl,\n keyword2hsv: keyword2hsv,\n keyword2hwb: keyword2hwb,\n keyword2cmyk: keyword2cmyk,\n keyword2lab: keyword2lab,\n keyword2xyz: keyword2xyz,\n\n xyz2rgb: xyz2rgb,\n xyz2lab: xyz2lab,\n xyz2lch: xyz2lch,\n\n lab2xyz: lab2xyz,\n lab2rgb: lab2rgb,\n lab2lch: lab2lch,\n\n lch2lab: lch2lab,\n lch2xyz: lch2xyz,\n lch2rgb: lch2rgb\n }\n\n\n function rgb2hsl(rgb) {\n var r = rgb[0]/255,\n g = rgb[1]/255,\n b = rgb[2]/255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s, l;\n\n if (max == min)\n h = 0;\n else if (r == max)\n h = (g - b) / delta;\n else if (g == max)\n h = 2 + (b - r) / delta;\n else if (b == max)\n h = 4 + (r - g)/ delta;\n\n h = Math.min(h * 60, 360);\n\n if (h < 0)\n h += 360;\n\n l = (min + max) / 2;\n\n if (max == min)\n s = 0;\n else if (l <= 0.5)\n s = delta / (max + min);\n else\n s = delta / (2 - max - min);\n\n return [h, s * 100, l * 100];\n }\n\n function rgb2hsv(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s, v;\n\n if (max == 0)\n s = 0;\n else\n s = (delta/max * 1000)/10;\n\n if (max == min)\n h = 0;\n else if (r == max)\n h = (g - b) / delta;\n else if (g == max)\n h = 2 + (b - r) / delta;\n else if (b == max)\n h = 4 + (r - g) / delta;\n\n h = Math.min(h * 60, 360);\n\n if (h < 0)\n h += 360;\n\n v = ((max / 255) * 1000) / 10;\n\n return [h, s, v];\n }\n\n function rgb2hwb(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n h = rgb2hsl(rgb)[0],\n w = 1/255 * Math.min(r, Math.min(g, b)),\n b = 1 - 1/255 * Math.max(r, Math.max(g, b));\n\n return [h, w * 100, b * 100];\n }\n\n function rgb2cmyk(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255,\n c, m, y, k;\n\n k = Math.min(1 - r, 1 - g, 1 - b);\n c = (1 - r - k) / (1 - k) || 0;\n m = (1 - g - k) / (1 - k) || 0;\n y = (1 - b - k) / (1 - k) || 0;\n return [c * 100, m * 100, y * 100, k * 100];\n }\n\n function rgb2keyword(rgb) {\n return reverseKeywords[JSON.stringify(rgb)];\n }\n\n function rgb2xyz(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255;\n\n // assume sRGB\n r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n return [x * 100, y *100, z * 100];\n }\n\n function rgb2lab(rgb) {\n var xyz = rgb2xyz(rgb),\n x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l, a, b;\n\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n\n x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n l = (116 * y) - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n\n return [l, a, b];\n }\n\n function rgb2lch(args) {\n return lab2lch(rgb2lab(args));\n }\n\n function hsl2rgb(hsl) {\n var h = hsl[0] / 360,\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n t1, t2, t3, rgb, val;\n\n if (s == 0) {\n val = l * 255;\n return [val, val, val];\n }\n\n if (l < 0.5)\n t2 = l * (1 + s);\n else\n t2 = l + s - l * s;\n t1 = 2 * l - t2;\n\n rgb = [0, 0, 0];\n for (var i = 0; i < 3; i++) {\n t3 = h + 1 / 3 * - (i - 1);\n t3 < 0 && t3++;\n t3 > 1 && t3--;\n\n if (6 * t3 < 1)\n val = t1 + (t2 - t1) * 6 * t3;\n else if (2 * t3 < 1)\n val = t2;\n else if (3 * t3 < 2)\n val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n else\n val = t1;\n\n rgb[i] = val * 255;\n }\n\n return rgb;\n }\n\n function hsl2hsv(hsl) {\n var h = hsl[0],\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n sv, v;\n\n if(l === 0) {\n // no need to do calc on black\n // also avoids divide by 0 error\n return [0, 0, 0];\n }\n\n l *= 2;\n s *= (l <= 1) ? l : 2 - l;\n v = (l + s) / 2;\n sv = (2 * s) / (l + s);\n return [h, sv * 100, v * 100];\n }\n\n function hsl2hwb(args) {\n return rgb2hwb(hsl2rgb(args));\n }\n\n function hsl2cmyk(args) {\n return rgb2cmyk(hsl2rgb(args));\n }\n\n function hsl2keyword(args) {\n return rgb2keyword(hsl2rgb(args));\n }\n\n\n function hsv2rgb(hsv) {\n var h = hsv[0] / 60,\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n hi = Math.floor(h) % 6;\n\n var f = h - Math.floor(h),\n p = 255 * v * (1 - s),\n q = 255 * v * (1 - (s * f)),\n t = 255 * v * (1 - (s * (1 - f))),\n v = 255 * v;\n\n switch(hi) {\n case 0:\n return [v, t, p];\n case 1:\n return [q, v, p];\n case 2:\n return [p, v, t];\n case 3:\n return [p, q, v];\n case 4:\n return [t, p, v];\n case 5:\n return [v, p, q];\n }\n }\n\n function hsv2hsl(hsv) {\n var h = hsv[0],\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n sl, l;\n\n l = (2 - s) * v;\n sl = s * v;\n sl /= (l <= 1) ? l : 2 - l;\n sl = sl || 0;\n l /= 2;\n return [h, sl * 100, l * 100];\n }\n\n function hsv2hwb(args) {\n return rgb2hwb(hsv2rgb(args))\n }\n\n function hsv2cmyk(args) {\n return rgb2cmyk(hsv2rgb(args));\n }\n\n function hsv2keyword(args) {\n return rgb2keyword(hsv2rgb(args));\n }\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\n function hwb2rgb(hwb) {\n var h = hwb[0] / 360,\n wh = hwb[1] / 100,\n bl = hwb[2] / 100,\n ratio = wh + bl,\n i, v, f, n;\n\n // wh + bl cant be > 1\n if (ratio > 1) {\n wh /= ratio;\n bl /= ratio;\n }\n\n i = Math.floor(6 * h);\n v = 1 - bl;\n f = 6 * h - i;\n if ((i & 0x01) != 0) {\n f = 1 - f;\n }\n n = wh + f * (v - wh); // linear interpolation\n\n switch (i) {\n default:\n case 6:\n case 0: r = v; g = n; b = wh; break;\n case 1: r = n; g = v; b = wh; break;\n case 2: r = wh; g = v; b = n; break;\n case 3: r = wh; g = n; b = v; break;\n case 4: r = n; g = wh; b = v; break;\n case 5: r = v; g = wh; b = n; break;\n }\n\n return [r * 255, g * 255, b * 255];\n }\n\n function hwb2hsl(args) {\n return rgb2hsl(hwb2rgb(args));\n }\n\n function hwb2hsv(args) {\n return rgb2hsv(hwb2rgb(args));\n }\n\n function hwb2cmyk(args) {\n return rgb2cmyk(hwb2rgb(args));\n }\n\n function hwb2keyword(args) {\n return rgb2keyword(hwb2rgb(args));\n }\n\n function cmyk2rgb(cmyk) {\n var c = cmyk[0] / 100,\n m = cmyk[1] / 100,\n y = cmyk[2] / 100,\n k = cmyk[3] / 100,\n r, g, b;\n\n r = 1 - Math.min(1, c * (1 - k) + k);\n g = 1 - Math.min(1, m * (1 - k) + k);\n b = 1 - Math.min(1, y * (1 - k) + k);\n return [r * 255, g * 255, b * 255];\n }\n\n function cmyk2hsl(args) {\n return rgb2hsl(cmyk2rgb(args));\n }\n\n function cmyk2hsv(args) {\n return rgb2hsv(cmyk2rgb(args));\n }\n\n function cmyk2hwb(args) {\n return rgb2hwb(cmyk2rgb(args));\n }\n\n function cmyk2keyword(args) {\n return rgb2keyword(cmyk2rgb(args));\n }\n\n\n function xyz2rgb(xyz) {\n var x = xyz[0] / 100,\n y = xyz[1] / 100,\n z = xyz[2] / 100,\n r, g, b;\n\n r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n // assume sRGB\n r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n : r = (r * 12.92);\n\n g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n : g = (g * 12.92);\n\n b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n : b = (b * 12.92);\n\n r = Math.min(Math.max(0, r), 1);\n g = Math.min(Math.max(0, g), 1);\n b = Math.min(Math.max(0, b), 1);\n\n return [r * 255, g * 255, b * 255];\n }\n\n function xyz2lab(xyz) {\n var x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l, a, b;\n\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n\n x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n l = (116 * y) - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n\n return [l, a, b];\n }\n\n function xyz2lch(args) {\n return lab2lch(xyz2lab(args));\n }\n\n function lab2xyz(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n x, y, z, y2;\n\n if (l <= 8) {\n y = (l * 100) / 903.3;\n y2 = (7.787 * (y / 100)) + (16 / 116);\n } else {\n y = 100 * Math.pow((l + 16) / 116, 3);\n y2 = Math.pow(y / 100, 1/3);\n }\n\n x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n return [x, y, z];\n }\n\n function lab2lch(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n hr, h, c;\n\n hr = Math.atan2(b, a);\n h = hr * 360 / 2 / Math.PI;\n if (h < 0) {\n h += 360;\n }\n c = Math.sqrt(a * a + b * b);\n return [l, c, h];\n }\n\n function lab2rgb(args) {\n return xyz2rgb(lab2xyz(args));\n }\n\n function lch2lab(lch) {\n var l = lch[0],\n c = lch[1],\n h = lch[2],\n a, b, hr;\n\n hr = h / 360 * 2 * Math.PI;\n a = c * Math.cos(hr);\n b = c * Math.sin(hr);\n return [l, a, b];\n }\n\n function lch2xyz(args) {\n return lab2xyz(lch2lab(args));\n }\n\n function lch2rgb(args) {\n return lab2rgb(lch2lab(args));\n }\n\n function keyword2rgb(keyword) {\n return cssKeywords[keyword];\n }\n\n function keyword2hsl(args) {\n return rgb2hsl(keyword2rgb(args));\n }\n\n function keyword2hsv(args) {\n return rgb2hsv(keyword2rgb(args));\n }\n\n function keyword2hwb(args) {\n return rgb2hwb(keyword2rgb(args));\n }\n\n function keyword2cmyk(args) {\n return rgb2cmyk(keyword2rgb(args));\n }\n\n function keyword2lab(args) {\n return rgb2lab(keyword2rgb(args));\n }\n\n function keyword2xyz(args) {\n return rgb2xyz(keyword2rgb(args));\n }\n\n var cssKeywords = {\n aliceblue: [240,248,255],\n antiquewhite: [250,235,215],\n aqua: [0,255,255],\n aquamarine: [127,255,212],\n azure: [240,255,255],\n beige: [245,245,220],\n bisque: [255,228,196],\n black: [0,0,0],\n blanchedalmond: [255,235,205],\n blue: [0,0,255],\n blueviolet: [138,43,226],\n brown: [165,42,42],\n burlywood: [222,184,135],\n cadetblue: [95,158,160],\n chartreuse: [127,255,0],\n chocolate: [210,105,30],\n coral: [255,127,80],\n cornflowerblue: [100,149,237],\n cornsilk: [255,248,220],\n crimson: [220,20,60],\n cyan: [0,255,255],\n darkblue: [0,0,139],\n darkcyan: [0,139,139],\n darkgoldenrod: [184,134,11],\n darkgray: [169,169,169],\n darkgreen: [0,100,0],\n darkgrey: [169,169,169],\n darkkhaki: [189,183,107],\n darkmagenta: [139,0,139],\n darkolivegreen: [85,107,47],\n darkorange: [255,140,0],\n darkorchid: [153,50,204],\n darkred: [139,0,0],\n darksalmon: [233,150,122],\n darkseagreen: [143,188,143],\n darkslateblue: [72,61,139],\n darkslategray: [47,79,79],\n darkslategrey: [47,79,79],\n darkturquoise: [0,206,209],\n darkviolet: [148,0,211],\n deeppink: [255,20,147],\n deepskyblue: [0,191,255],\n dimgray: [105,105,105],\n dimgrey: [105,105,105],\n dodgerblue: [30,144,255],\n firebrick: [178,34,34],\n floralwhite: [255,250,240],\n forestgreen: [34,139,34],\n fuchsia: [255,0,255],\n gainsboro: [220,220,220],\n ghostwhite: [248,248,255],\n gold: [255,215,0],\n goldenrod: [218,165,32],\n gray: [128,128,128],\n green: [0,128,0],\n greenyellow: [173,255,47],\n grey: [128,128,128],\n honeydew: [240,255,240],\n hotpink: [255,105,180],\n indianred: [205,92,92],\n indigo: [75,0,130],\n ivory: [255,255,240],\n khaki: [240,230,140],\n lavender: [230,230,250],\n lavenderblush: [255,240,245],\n lawngreen: [124,252,0],\n lemonchiffon: [255,250,205],\n lightblue: [173,216,230],\n lightcoral: [240,128,128],\n lightcyan: [224,255,255],\n lightgoldenrodyellow: [250,250,210],\n lightgray: [211,211,211],\n lightgreen: [144,238,144],\n lightgrey: [211,211,211],\n lightpink: [255,182,193],\n lightsalmon: [255,160,122],\n lightseagreen: [32,178,170],\n lightskyblue: [135,206,250],\n lightslategray: [119,136,153],\n lightslategrey: [119,136,153],\n lightsteelblue: [176,196,222],\n lightyellow: [255,255,224],\n lime: [0,255,0],\n limegreen: [50,205,50],\n linen: [250,240,230],\n magenta: [255,0,255],\n maroon: [128,0,0],\n mediumaquamarine: [102,205,170],\n mediumblue: [0,0,205],\n mediumorchid: [186,85,211],\n mediumpurple: [147,112,219],\n mediumseagreen: [60,179,113],\n mediumslateblue: [123,104,238],\n mediumspringgreen: [0,250,154],\n mediumturquoise: [72,209,204],\n mediumvioletred: [199,21,133],\n midnightblue: [25,25,112],\n mintcream: [245,255,250],\n mistyrose: [255,228,225],\n moccasin: [255,228,181],\n navajowhite: [255,222,173],\n navy: [0,0,128],\n oldlace: [253,245,230],\n olive: [128,128,0],\n olivedrab: [107,142,35],\n orange: [255,165,0],\n orangered: [255,69,0],\n orchid: [218,112,214],\n palegoldenrod: [238,232,170],\n palegreen: [152,251,152],\n paleturquoise: [175,238,238],\n palevioletred: [219,112,147],\n papayawhip: [255,239,213],\n peachpuff: [255,218,185],\n peru: [205,133,63],\n pink: [255,192,203],\n plum: [221,160,221],\n powderblue: [176,224,230],\n purple: [128,0,128],\n rebeccapurple: [102, 51, 153],\n red: [255,0,0],\n rosybrown: [188,143,143],\n royalblue: [65,105,225],\n saddlebrown: [139,69,19],\n salmon: [250,128,114],\n sandybrown: [244,164,96],\n seagreen: [46,139,87],\n seashell: [255,245,238],\n sienna: [160,82,45],\n silver: [192,192,192],\n skyblue: [135,206,235],\n slateblue: [106,90,205],\n slategray: [112,128,144],\n slategrey: [112,128,144],\n snow: [255,250,250],\n springgreen: [0,255,127],\n steelblue: [70,130,180],\n tan: [210,180,140],\n teal: [0,128,128],\n thistle: [216,191,216],\n tomato: [255,99,71],\n turquoise: [64,224,208],\n violet: [238,130,238],\n wheat: [245,222,179],\n white: [255,255,255],\n whitesmoke: [245,245,245],\n yellow: [255,255,0],\n yellowgreen: [154,205,50]\n };\n\n var reverseKeywords = {};\n for (var key in cssKeywords) {\n reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n }\n\n},{}],4:[function(require,module,exports){\n var conversions = require(3);\n\n var convert = function() {\n return new Converter();\n }\n\n for (var func in conversions) {\n // export Raw versions\n convert[func + \"Raw\"] = (function(func) {\n // accept array or plain args\n return function(arg) {\n if (typeof arg == \"number\")\n arg = Array.prototype.slice.call(arguments);\n return conversions[func](arg);\n }\n })(func);\n\n var pair = /(\\w+)2(\\w+)/.exec(func),\n from = pair[1],\n to = pair[2];\n\n // export rgb2hsl and [\"rgb\"][\"hsl\"]\n convert[from] = convert[from] || {};\n\n convert[from][to] = convert[func] = (function(func) {\n return function(arg) {\n if (typeof arg == \"number\")\n arg = Array.prototype.slice.call(arguments);\n\n var val = conversions[func](arg);\n if (typeof val == \"string\" || val === undefined)\n return val; // keyword\n\n for (var i = 0; i < val.length; i++)\n val[i] = Math.round(val[i]);\n return val;\n }\n })(func);\n }\n\n\n\t/* Converter does lazy conversion and caching */\n var Converter = function() {\n this.convs = {};\n };\n\n\t/* Either get the values for a space or\n\t set the values for a space, depending on args */\n Converter.prototype.routeSpace = function(space, args) {\n var values = args[0];\n if (values === undefined) {\n // color.rgb()\n return this.getValues(space);\n }\n // color.rgb(10, 10, 10)\n if (typeof values == \"number\") {\n values = Array.prototype.slice.call(args);\n }\n\n return this.setValues(space, values);\n };\n\n\t/* Set the values for a space, invalidating cache */\n Converter.prototype.setValues = function(space, values) {\n this.space = space;\n this.convs = {};\n this.convs[space] = values;\n return this;\n };\n\n\t/* Get the values for a space. If there's already\n\t a conversion for the space, fetch it, otherwise\n\t compute it */\n Converter.prototype.getValues = function(space) {\n var vals = this.convs[space];\n if (!vals) {\n var fspace = this.space,\n from = this.convs[fspace];\n vals = convert[fspace][space](from);\n\n this.convs[space] = vals;\n }\n return vals;\n };\n\n [\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function(space) {\n Converter.prototype[space] = function(vals) {\n return this.routeSpace(space, arguments);\n }\n });\n\n module.exports = convert;\n},{\"3\":3}],5:[function(require,module,exports){\n 'use strict'\n\n module.exports = {\n \"aliceblue\": [240, 248, 255],\n \"antiquewhite\": [250, 235, 215],\n \"aqua\": [0, 255, 255],\n \"aquamarine\": [127, 255, 212],\n \"azure\": [240, 255, 255],\n \"beige\": [245, 245, 220],\n \"bisque\": [255, 228, 196],\n \"black\": [0, 0, 0],\n \"blanchedalmond\": [255, 235, 205],\n \"blue\": [0, 0, 255],\n \"blueviolet\": [138, 43, 226],\n \"brown\": [165, 42, 42],\n \"burlywood\": [222, 184, 135],\n \"cadetblue\": [95, 158, 160],\n \"chartreuse\": [127, 255, 0],\n \"chocolate\": [210, 105, 30],\n \"coral\": [255, 127, 80],\n \"cornflowerblue\": [100, 149, 237],\n \"cornsilk\": [255, 248, 220],\n \"crimson\": [220, 20, 60],\n \"cyan\": [0, 255, 255],\n \"darkblue\": [0, 0, 139],\n \"darkcyan\": [0, 139, 139],\n \"darkgoldenrod\": [184, 134, 11],\n \"darkgray\": [169, 169, 169],\n \"darkgreen\": [0, 100, 0],\n \"darkgrey\": [169, 169, 169],\n \"darkkhaki\": [189, 183, 107],\n \"darkmagenta\": [139, 0, 139],\n \"darkolivegreen\": [85, 107, 47],\n \"darkorange\": [255, 140, 0],\n \"darkorchid\": [153, 50, 204],\n \"darkred\": [139, 0, 0],\n \"darksalmon\": [233, 150, 122],\n \"darkseagreen\": [143, 188, 143],\n \"darkslateblue\": [72, 61, 139],\n \"darkslategray\": [47, 79, 79],\n \"darkslategrey\": [47, 79, 79],\n \"darkturquoise\": [0, 206, 209],\n \"darkviolet\": [148, 0, 211],\n \"deeppink\": [255, 20, 147],\n \"deepskyblue\": [0, 191, 255],\n \"dimgray\": [105, 105, 105],\n \"dimgrey\": [105, 105, 105],\n \"dodgerblue\": [30, 144, 255],\n \"firebrick\": [178, 34, 34],\n \"floralwhite\": [255, 250, 240],\n \"forestgreen\": [34, 139, 34],\n \"fuchsia\": [255, 0, 255],\n \"gainsboro\": [220, 220, 220],\n \"ghostwhite\": [248, 248, 255],\n \"gold\": [255, 215, 0],\n \"goldenrod\": [218, 165, 32],\n \"gray\": [128, 128, 128],\n \"green\": [0, 128, 0],\n \"greenyellow\": [173, 255, 47],\n \"grey\": [128, 128, 128],\n \"honeydew\": [240, 255, 240],\n \"hotpink\": [255, 105, 180],\n \"indianred\": [205, 92, 92],\n \"indigo\": [75, 0, 130],\n \"ivory\": [255, 255, 240],\n \"khaki\": [240, 230, 140],\n \"lavender\": [230, 230, 250],\n \"lavenderblush\": [255, 240, 245],\n \"lawngreen\": [124, 252, 0],\n \"lemonchiffon\": [255, 250, 205],\n \"lightblue\": [173, 216, 230],\n \"lightcoral\": [240, 128, 128],\n \"lightcyan\": [224, 255, 255],\n \"lightgoldenrodyellow\": [250, 250, 210],\n \"lightgray\": [211, 211, 211],\n \"lightgreen\": [144, 238, 144],\n \"lightgrey\": [211, 211, 211],\n \"lightpink\": [255, 182, 193],\n \"lightsalmon\": [255, 160, 122],\n \"lightseagreen\": [32, 178, 170],\n \"lightskyblue\": [135, 206, 250],\n \"lightslategray\": [119, 136, 153],\n \"lightslategrey\": [119, 136, 153],\n \"lightsteelblue\": [176, 196, 222],\n \"lightyellow\": [255, 255, 224],\n \"lime\": [0, 255, 0],\n \"limegreen\": [50, 205, 50],\n \"linen\": [250, 240, 230],\n \"magenta\": [255, 0, 255],\n \"maroon\": [128, 0, 0],\n \"mediumaquamarine\": [102, 205, 170],\n \"mediumblue\": [0, 0, 205],\n \"mediumorchid\": [186, 85, 211],\n \"mediumpurple\": [147, 112, 219],\n \"mediumseagreen\": [60, 179, 113],\n \"mediumslateblue\": [123, 104, 238],\n \"mediumspringgreen\": [0, 250, 154],\n \"mediumturquoise\": [72, 209, 204],\n \"mediumvioletred\": [199, 21, 133],\n \"midnightblue\": [25, 25, 112],\n \"mintcream\": [245, 255, 250],\n \"mistyrose\": [255, 228, 225],\n \"moccasin\": [255, 228, 181],\n \"navajowhite\": [255, 222, 173],\n \"navy\": [0, 0, 128],\n \"oldlace\": [253, 245, 230],\n \"olive\": [128, 128, 0],\n \"olivedrab\": [107, 142, 35],\n \"orange\": [255, 165, 0],\n \"orangered\": [255, 69, 0],\n \"orchid\": [218, 112, 214],\n \"palegoldenrod\": [238, 232, 170],\n \"palegreen\": [152, 251, 152],\n \"paleturquoise\": [175, 238, 238],\n \"palevioletred\": [219, 112, 147],\n \"papayawhip\": [255, 239, 213],\n \"peachpuff\": [255, 218, 185],\n \"peru\": [205, 133, 63],\n \"pink\": [255, 192, 203],\n \"plum\": [221, 160, 221],\n \"powderblue\": [176, 224, 230],\n \"purple\": [128, 0, 128],\n \"rebeccapurple\": [102, 51, 153],\n \"red\": [255, 0, 0],\n \"rosybrown\": [188, 143, 143],\n \"royalblue\": [65, 105, 225],\n \"saddlebrown\": [139, 69, 19],\n \"salmon\": [250, 128, 114],\n \"sandybrown\": [244, 164, 96],\n \"seagreen\": [46, 139, 87],\n \"seashell\": [255, 245, 238],\n \"sienna\": [160, 82, 45],\n \"silver\": [192, 192, 192],\n \"skyblue\": [135, 206, 235],\n \"slateblue\": [106, 90, 205],\n \"slategray\": [112, 128, 144],\n \"slategrey\": [112, 128, 144],\n \"snow\": [255, 250, 250],\n \"springgreen\": [0, 255, 127],\n \"steelblue\": [70, 130, 180],\n \"tan\": [210, 180, 140],\n \"teal\": [0, 128, 128],\n \"thistle\": [216, 191, 216],\n \"tomato\": [255, 99, 71],\n \"turquoise\": [64, 224, 208],\n \"violet\": [238, 130, 238],\n \"wheat\": [245, 222, 179],\n \"white\": [255, 255, 255],\n \"whitesmoke\": [245, 245, 245],\n \"yellow\": [255, 255, 0],\n \"yellowgreen\": [154, 205, 50]\n };\n\n},{}],6:[function(require,module,exports){\n//! moment.js\n//! version : 2.18.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n ;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.moment = factory()\n }(this, (function () { 'use strict';\n\n var hookCallback;\n\n function hooks () {\n return hookCallback.apply(null, arguments);\n }\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\n function setHookCallback (callback) {\n hookCallback = callback;\n }\n\n function isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n }\n\n function isObject(input) {\n // IE8 will treat undefined and null as object if it wasn't for\n // input != null\n return input != null && Object.prototype.toString.call(input) === '[object Object]';\n }\n\n function isObjectEmpty(obj) {\n var k;\n for (k in obj) {\n // even if its not own property I'd still call it non-empty\n return false;\n }\n return true;\n }\n\n function isUndefined(input) {\n return input === void 0;\n }\n\n function isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n }\n\n function isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n }\n\n function map(arr, fn) {\n var res = [], i;\n for (i = 0; i < arr.length; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n }\n\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n }\n\n function extend(a, b) {\n for (var i in b) {\n if (hasOwnProp(b, i)) {\n a[i] = b[i];\n }\n }\n\n if (hasOwnProp(b, 'toString')) {\n a.toString = b.toString;\n }\n\n if (hasOwnProp(b, 'valueOf')) {\n a.valueOf = b.valueOf;\n }\n\n return a;\n }\n\n function createUTC (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n }\n\n function defaultParsingFlags() {\n // We need to deep clone this object.\n return {\n empty : false,\n unusedTokens : [],\n unusedInput : [],\n overflow : -2,\n charsLeftOver : 0,\n nullInput : false,\n invalidMonth : null,\n invalidFormat : false,\n userInvalidated : false,\n iso : false,\n parsedDateParts : [],\n meridiem : null,\n rfc2822 : false,\n weekdayMismatch : false\n };\n }\n\n function getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n }\n\n var some;\n if (Array.prototype.some) {\n some = Array.prototype.some;\n } else {\n some = function (fun) {\n var t = Object(this);\n var len = t.length >>> 0;\n\n for (var i = 0; i < len; i++) {\n if (i in t && fun.call(this, t[i], i, t)) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n var some$1 = some;\n\n function isValid(m) {\n if (m._isValid == null) {\n var flags = getParsingFlags(m);\n var parsedParts = some$1.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n var isNowValid = !isNaN(m._d.getTime()) &&\n flags.overflow < 0 &&\n !flags.empty &&\n !flags.invalidMonth &&\n !flags.invalidWeekday &&\n !flags.nullInput &&\n !flags.invalidFormat &&\n !flags.userInvalidated &&\n (!flags.meridiem || (flags.meridiem && parsedParts));\n\n if (m._strict) {\n isNowValid = isNowValid &&\n flags.charsLeftOver === 0 &&\n flags.unusedTokens.length === 0 &&\n flags.bigHour === undefined;\n }\n\n if (Object.isFrozen == null || !Object.isFrozen(m)) {\n m._isValid = isNowValid;\n }\n else {\n return isNowValid;\n }\n }\n return m._isValid;\n }\n\n function createInvalid (flags) {\n var m = createUTC(NaN);\n if (flags != null) {\n extend(getParsingFlags(m), flags);\n }\n else {\n getParsingFlags(m).userInvalidated = true;\n }\n\n return m;\n }\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\n var momentProperties = hooks.momentProperties = [];\n\n function copyConfig(to, from) {\n var i, prop, val;\n\n if (!isUndefined(from._isAMomentObject)) {\n to._isAMomentObject = from._isAMomentObject;\n }\n if (!isUndefined(from._i)) {\n to._i = from._i;\n }\n if (!isUndefined(from._f)) {\n to._f = from._f;\n }\n if (!isUndefined(from._l)) {\n to._l = from._l;\n }\n if (!isUndefined(from._strict)) {\n to._strict = from._strict;\n }\n if (!isUndefined(from._tzm)) {\n to._tzm = from._tzm;\n }\n if (!isUndefined(from._isUTC)) {\n to._isUTC = from._isUTC;\n }\n if (!isUndefined(from._offset)) {\n to._offset = from._offset;\n }\n if (!isUndefined(from._pf)) {\n to._pf = getParsingFlags(from);\n }\n if (!isUndefined(from._locale)) {\n to._locale = from._locale;\n }\n\n if (momentProperties.length > 0) {\n for (i = 0; i < momentProperties.length; i++) {\n prop = momentProperties[i];\n val = from[prop];\n if (!isUndefined(val)) {\n to[prop] = val;\n }\n }\n }\n\n return to;\n }\n\n var updateInProgress = false;\n\n// Moment prototype object\n function Moment(config) {\n copyConfig(this, config);\n this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n if (!this.isValid()) {\n this._d = new Date(NaN);\n }\n // Prevent infinite loop in case updateOffset creates new moment\n // objects.\n if (updateInProgress === false) {\n updateInProgress = true;\n hooks.updateOffset(this);\n updateInProgress = false;\n }\n }\n\n function isMoment (obj) {\n return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n }\n\n function absFloor (number) {\n if (number < 0) {\n // -0 -> 0\n return Math.ceil(number) || 0;\n } else {\n return Math.floor(number);\n }\n }\n\n function toInt(argumentForCoercion) {\n var coercedNumber = +argumentForCoercion,\n value = 0;\n\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n\n return value;\n }\n\n// compare two arrays, return the number of differences\n function compareArrays(array1, array2, dontConvert) {\n var len = Math.min(array1.length, array2.length),\n lengthDiff = Math.abs(array1.length - array2.length),\n diffs = 0,\n i;\n for (i = 0; i < len; i++) {\n if ((dontConvert && array1[i] !== array2[i]) ||\n (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n }\n\n function warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n }\n\n function deprecate(msg, fn) {\n var firstTime = true;\n\n return extend(function () {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(null, msg);\n }\n if (firstTime) {\n var args = [];\n var arg;\n for (var i = 0; i < arguments.length; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (var key in arguments[0]) {\n arg += key + ': ' + arguments[0][key] + ', ';\n }\n arg = arg.slice(0, -2); // Remove trailing comma and space\n } else {\n arg = arguments[i];\n }\n args.push(arg);\n }\n warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n firstTime = false;\n }\n return fn.apply(this, arguments);\n }, fn);\n }\n\n var deprecations = {};\n\n function deprecateSimple(name, msg) {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(name, msg);\n }\n if (!deprecations[name]) {\n warn(msg);\n deprecations[name] = true;\n }\n }\n\n hooks.suppressDeprecationWarnings = false;\n hooks.deprecationHandler = null;\n\n function isFunction(input) {\n return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n }\n\n function set (config) {\n var prop, i;\n for (i in config) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\n }\n }\n this._config = config;\n // Lenient ordinal parsing accepts just a number in addition to\n // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n this._dayOfMonthOrdinalParseLenient = new RegExp(\n (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n '|' + (/\\d{1,2}/).source);\n }\n\n function mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig), prop;\n for (prop in childConfig) {\n if (hasOwnProp(childConfig, prop)) {\n if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n res[prop] = {};\n extend(res[prop], parentConfig[prop]);\n extend(res[prop], childConfig[prop]);\n } else if (childConfig[prop] != null) {\n res[prop] = childConfig[prop];\n } else {\n delete res[prop];\n }\n }\n }\n for (prop in parentConfig) {\n if (hasOwnProp(parentConfig, prop) &&\n !hasOwnProp(childConfig, prop) &&\n isObject(parentConfig[prop])) {\n // make sure changes to properties don't modify parent config\n res[prop] = extend({}, res[prop]);\n }\n }\n return res;\n }\n\n function Locale(config) {\n if (config != null) {\n this.set(config);\n }\n }\n\n var keys;\n\n if (Object.keys) {\n keys = Object.keys;\n } else {\n keys = function (obj) {\n var i, res = [];\n for (i in obj) {\n if (hasOwnProp(obj, i)) {\n res.push(i);\n }\n }\n return res;\n };\n }\n\n var keys$1 = keys;\n\n var defaultCalendar = {\n sameDay : '[Today at] LT',\n nextDay : '[Tomorrow at] LT',\n nextWeek : 'dddd [at] LT',\n lastDay : '[Yesterday at] LT',\n lastWeek : '[Last] dddd [at] LT',\n sameElse : 'L'\n };\n\n function calendar (key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n }\n\n var defaultLongDateFormat = {\n LTS : 'h:mm:ss A',\n LT : 'h:mm A',\n L : 'MM/DD/YYYY',\n LL : 'MMMM D, YYYY',\n LLL : 'MMMM D, YYYY h:mm A',\n LLLL : 'dddd, MMMM D, YYYY h:mm A'\n };\n\n function longDateFormat (key) {\n var format = this._longDateFormat[key],\n formatUpper = this._longDateFormat[key.toUpperCase()];\n\n if (format || !formatUpper) {\n return format;\n }\n\n this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n return val.slice(1);\n });\n\n return this._longDateFormat[key];\n }\n\n var defaultInvalidDate = 'Invalid date';\n\n function invalidDate () {\n return this._invalidDate;\n }\n\n var defaultOrdinal = '%d';\n var defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n function ordinal (number) {\n return this._ordinal.replace('%d', number);\n }\n\n var defaultRelativeTime = {\n future : 'in %s',\n past : '%s ago',\n s : 'a few seconds',\n ss : '%d seconds',\n m : 'a minute',\n mm : '%d minutes',\n h : 'an hour',\n hh : '%d hours',\n d : 'a day',\n dd : '%d days',\n M : 'a month',\n MM : '%d months',\n y : 'a year',\n yy : '%d years'\n };\n\n function relativeTime (number, withoutSuffix, string, isFuture) {\n var output = this._relativeTime[string];\n return (isFunction(output)) ?\n output(number, withoutSuffix, string, isFuture) :\n output.replace(/%d/i, number);\n }\n\n function pastFuture (diff, output) {\n var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n }\n\n var aliases = {};\n\n function addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n }\n\n function normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n }\n\n function normalizeObjectUnits(inputObject) {\n var normalizedInput = {},\n normalizedProp,\n prop;\n\n for (prop in inputObject) {\n if (hasOwnProp(inputObject, prop)) {\n normalizedProp = normalizeUnits(prop);\n if (normalizedProp) {\n normalizedInput[normalizedProp] = inputObject[prop];\n }\n }\n }\n\n return normalizedInput;\n }\n\n var priorities = {};\n\n function addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n }\n\n function getPrioritizedUnits(unitsObj) {\n var units = [];\n for (var u in unitsObj) {\n units.push({unit: u, priority: priorities[u]});\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\n }\n\n function makeGetSet (unit, keepTime) {\n return function (value) {\n if (value != null) {\n set$1(this, unit, value);\n hooks.updateOffset(this, keepTime);\n return this;\n } else {\n return get(this, unit);\n }\n };\n }\n\n function get (mom, unit) {\n return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n }\n\n function set$1 (mom, unit, value) {\n if (mom.isValid()) {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n }\n }\n\n// MOMENTS\n\n function stringGet (units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n }\n\n\n function stringSet (units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units);\n for (var i = 0; i < prioritized.length; i++) {\n this[prioritized[i].unit](units[prioritized[i].unit]);\n }\n } else {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units](value);\n }\n }\n return this;\n }\n\n function zeroFill(number, targetLength, forceSign) {\n var absNumber = '' + Math.abs(number),\n zerosToFill = targetLength - absNumber.length,\n sign = number >= 0;\n return (sign ? (forceSign ? '+' : '') : '-') +\n Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n }\n\n 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;\n\n var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n var formatFunctions = {};\n\n var formatTokenFunctions = {};\n\n// token: 'M'\n// padded: ['MM', 2]\n// ordinal: 'Mo'\n// callback: function () { this.month() + 1 }\n function addFormatToken (token, padded, ordinal, callback) {\n var func = callback;\n if (typeof callback === 'string') {\n func = function () {\n return this[callback]();\n };\n }\n if (token) {\n formatTokenFunctions[token] = func;\n }\n if (padded) {\n formatTokenFunctions[padded[0]] = function () {\n return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n };\n }\n if (ordinal) {\n formatTokenFunctions[ordinal] = function () {\n return this.localeData().ordinal(func.apply(this, arguments), token);\n };\n }\n }\n\n function removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n }\n\n function makeFormatFunction(format) {\n var array = format.match(formattingTokens), i, length;\n\n for (i = 0, length = array.length; i < length; i++) {\n if (formatTokenFunctions[array[i]]) {\n array[i] = formatTokenFunctions[array[i]];\n } else {\n array[i] = removeFormattingTokens(array[i]);\n }\n }\n\n return function (mom) {\n var output = '', i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n }\n return output;\n };\n }\n\n// format date using native date object\n function formatMoment(m, format) {\n if (!m.isValid()) {\n return m.localeData().invalidDate();\n }\n\n format = expandFormat(format, m.localeData());\n formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n return formatFunctions[format](m);\n }\n\n function expandFormat(format, locale) {\n var i = 5;\n\n function replaceLongDateFormatTokens(input) {\n return locale.longDateFormat(input) || input;\n }\n\n localFormattingTokens.lastIndex = 0;\n while (i >= 0 && localFormattingTokens.test(format)) {\n format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n\n return format;\n }\n\n var match1 = /\\d/; // 0 - 9\n var match2 = /\\d\\d/; // 00 - 99\n var match3 = /\\d{3}/; // 000 - 999\n var match4 = /\\d{4}/; // 0000 - 9999\n var match6 = /[+-]?\\d{6}/; // -999999 - 999999\n var match1to2 = /\\d\\d?/; // 0 - 99\n var match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\n var match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\n var match1to3 = /\\d{1,3}/; // 0 - 999\n var match1to4 = /\\d{1,4}/; // 0 - 9999\n var match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\n var matchUnsigned = /\\d+/; // 0 - inf\n var matchSigned = /[+-]?\\d+/; // -inf - inf\n\n var matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\n var matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;\n\n\n var regexes = {};\n\n function addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return (isStrict && strictRegex) ? strictRegex : regex;\n };\n }\n\n function getParseRegexForToken (token, config) {\n if (!hasOwnProp(regexes, token)) {\n return new RegExp(unescapeFormat(token));\n }\n\n return regexes[token](config._strict, config._locale);\n }\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n function unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n }\n\n function regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n\n var tokens = {};\n\n function addParseToken (token, callback) {\n var i, func = callback;\n if (typeof token === 'string') {\n token = [token];\n }\n if (isNumber(callback)) {\n func = function (input, array) {\n array[callback] = toInt(input);\n };\n }\n for (i = 0; i < token.length; i++) {\n tokens[token[i]] = func;\n }\n }\n\n function addWeekParseToken (token, callback) {\n addParseToken(token, function (input, array, config, token) {\n config._w = config._w || {};\n callback(input, config._w, config, token);\n });\n }\n\n function addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n }\n\n var YEAR = 0;\n var MONTH = 1;\n var DATE = 2;\n var HOUR = 3;\n var MINUTE = 4;\n var SECOND = 5;\n var MILLISECOND = 6;\n var WEEK = 7;\n var WEEKDAY = 8;\n\n var indexOf;\n\n if (Array.prototype.indexOf) {\n indexOf = Array.prototype.indexOf;\n } else {\n indexOf = function (o) {\n // I know\n var i;\n for (i = 0; i < this.length; ++i) {\n if (this[i] === o) {\n return i;\n }\n }\n return -1;\n };\n }\n\n var indexOf$1 = indexOf;\n\n function daysInMonth(year, month) {\n return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n }\n\n// FORMATTING\n\n addFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n });\n\n addFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n });\n\n addFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n });\n\n// ALIASES\n\n addUnitAlias('month', 'M');\n\n// PRIORITY\n\n addUnitPriority('month', 8);\n\n// PARSING\n\n addRegexToken('M', match1to2);\n addRegexToken('MM', match1to2, match2);\n addRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n });\n addRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n });\n\n addParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n });\n\n addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n var month = config._locale.monthsParse(input, token, config._strict);\n // if we didn't find a month name, mark the date as invalid.\n if (month != null) {\n array[MONTH] = month;\n } else {\n getParsingFlags(config).invalidMonth = input;\n }\n });\n\n// LOCALES\n\n var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\n var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n function localeMonths (m, format) {\n if (!m) {\n return isArray(this._months) ? this._months :\n this._months['standalone'];\n }\n return isArray(this._months) ? this._months[m.month()] :\n this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n function localeMonthsShort (m, format) {\n if (!m) {\n return isArray(this._monthsShort) ? this._monthsShort :\n this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n function handleStrictParse(monthName, format, strict) {\n var i, ii, mom, llc = monthName.toLocaleLowerCase();\n if (!this._monthsParse) {\n // this is not used\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n for (i = 0; i < 12; ++i) {\n mom = createUTC([2000, i]);\n this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'MMM') {\n ii = indexOf$1.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'MMM') {\n ii = indexOf$1.call(this._shortMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._longMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeMonthsParse (monthName, format, strict) {\n var i, mom, regex;\n\n if (this._monthsParseExact) {\n return handleStrictParse.call(this, monthName, format, strict);\n }\n\n if (!this._monthsParse) {\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n }\n\n // TODO: add sorting\n // Sorting makes sure if one month (or abbr) is a prefix of another\n // see sorting in computeMonthsParse\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n if (strict && !this._longMonthsParse[i]) {\n this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n }\n if (!strict && !this._monthsParse[i]) {\n regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n return i;\n } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n return i;\n } else if (!strict && this._monthsParse[i].test(monthName)) {\n return i;\n }\n }\n }\n\n// MOMENTS\n\n function setMonth (mom, value) {\n var dayOfMonth;\n\n if (!mom.isValid()) {\n // No op\n return mom;\n }\n\n if (typeof value === 'string') {\n if (/^\\d+$/.test(value)) {\n value = toInt(value);\n } else {\n value = mom.localeData().monthsParse(value);\n // TODO: Another silent failure?\n if (!isNumber(value)) {\n return mom;\n }\n }\n }\n\n dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n return mom;\n }\n\n function getSetMonth (value) {\n if (value != null) {\n setMonth(this, value);\n hooks.updateOffset(this, true);\n return this;\n } else {\n return get(this, 'Month');\n }\n }\n\n function getDaysInMonth () {\n return daysInMonth(this.year(), this.month());\n }\n\n var defaultMonthsShortRegex = matchWord;\n function monthsShortRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsShortStrictRegex;\n } else {\n return this._monthsShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsShortRegex')) {\n this._monthsShortRegex = defaultMonthsShortRegex;\n }\n return this._monthsShortStrictRegex && isStrict ?\n this._monthsShortStrictRegex : this._monthsShortRegex;\n }\n }\n\n var defaultMonthsRegex = matchWord;\n function monthsRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsStrictRegex;\n } else {\n return this._monthsRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsRegex')) {\n this._monthsRegex = defaultMonthsRegex;\n }\n return this._monthsStrictRegex && isStrict ?\n this._monthsStrictRegex : this._monthsRegex;\n }\n }\n\n function computeMonthsParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom;\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n shortPieces.push(this.monthsShort(mom, ''));\n longPieces.push(this.months(mom, ''));\n mixedPieces.push(this.months(mom, ''));\n mixedPieces.push(this.monthsShort(mom, ''));\n }\n // Sorting makes sure if one month (or abbr) is a prefix of another it\n // will match the longer piece.\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 12; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n }\n for (i = 0; i < 24; i++) {\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._monthsShortRegex = this._monthsRegex;\n this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n }\n\n// FORMATTING\n\n addFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + y;\n });\n\n addFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n });\n\n addFormatToken(0, ['YYYY', 4], 0, 'year');\n addFormatToken(0, ['YYYYY', 5], 0, 'year');\n addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\n addUnitAlias('year', 'y');\n\n// PRIORITIES\n\n addUnitPriority('year', 1);\n\n// PARSING\n\n addRegexToken('Y', matchSigned);\n addRegexToken('YY', match1to2, match2);\n addRegexToken('YYYY', match1to4, match4);\n addRegexToken('YYYYY', match1to6, match6);\n addRegexToken('YYYYYY', match1to6, match6);\n\n addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n addParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n });\n addParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n });\n addParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n });\n\n// HELPERS\n\n function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n }\n\n function isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n// HOOKS\n\n hooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n };\n\n// MOMENTS\n\n var getSetYear = makeGetSet('FullYear', true);\n\n function getIsLeapYear () {\n return isLeapYear(this.year());\n }\n\n function createDate (y, m, d, h, M, s, ms) {\n // can't just apply() to create a date:\n // https://stackoverflow.com/q/181348\n var date = new Date(y, m, d, h, M, s, ms);\n\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n return date;\n }\n\n function createUTCDate (y) {\n var date = new Date(Date.UTC.apply(null, arguments));\n\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\n }\n return date;\n }\n\n// start-of-first-week - start-of-year\n function firstWeekOffset(year, dow, doy) {\n var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n fwd = 7 + dow - doy,\n // first-week day local weekday -- which local weekday is fwd\n fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n return -fwdlw + fwd - 1;\n }\n\n// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n var localWeekday = (7 + weekday - dow) % 7,\n weekOffset = firstWeekOffset(year, dow, doy),\n dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n resYear, resDayOfYear;\n\n if (dayOfYear <= 0) {\n resYear = year - 1;\n resDayOfYear = daysInYear(resYear) + dayOfYear;\n } else if (dayOfYear > daysInYear(year)) {\n resYear = year + 1;\n resDayOfYear = dayOfYear - daysInYear(year);\n } else {\n resYear = year;\n resDayOfYear = dayOfYear;\n }\n\n return {\n year: resYear,\n dayOfYear: resDayOfYear\n };\n }\n\n function weekOfYear(mom, dow, doy) {\n var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n resWeek, resYear;\n\n if (week < 1) {\n resYear = mom.year() - 1;\n resWeek = week + weeksInYear(resYear, dow, doy);\n } else if (week > weeksInYear(mom.year(), dow, doy)) {\n resWeek = week - weeksInYear(mom.year(), dow, doy);\n resYear = mom.year() + 1;\n } else {\n resYear = mom.year();\n resWeek = week;\n }\n\n return {\n week: resWeek,\n year: resYear\n };\n }\n\n function weeksInYear(year, dow, doy) {\n var weekOffset = firstWeekOffset(year, dow, doy),\n weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n }\n\n// FORMATTING\n\n addFormatToken('w', ['ww', 2], 'wo', 'week');\n addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\n addUnitAlias('week', 'w');\n addUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\n addUnitPriority('week', 5);\n addUnitPriority('isoWeek', 5);\n\n// PARSING\n\n addRegexToken('w', match1to2);\n addRegexToken('ww', match1to2, match2);\n addRegexToken('W', match1to2);\n addRegexToken('WW', match1to2, match2);\n\n addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\n });\n\n// HELPERS\n\n// LOCALES\n\n function localeWeek (mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n }\n\n var defaultLocaleWeek = {\n dow : 0, // Sunday is the first day of the week.\n doy : 6 // The week that contains Jan 1st is the first week of the year.\n };\n\n function localeFirstDayOfWeek () {\n return this._week.dow;\n }\n\n function localeFirstDayOfYear () {\n return this._week.doy;\n }\n\n// MOMENTS\n\n function getSetWeek (input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n function getSetISOWeek (input) {\n var week = weekOfYear(this, 1, 4).week;\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n// FORMATTING\n\n addFormatToken('d', 0, 'do', 'day');\n\n addFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n });\n\n addFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n });\n\n addFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n });\n\n addFormatToken('e', 0, 0, 'weekday');\n addFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\n addUnitAlias('day', 'd');\n addUnitAlias('weekday', 'e');\n addUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\n addUnitPriority('day', 11);\n addUnitPriority('weekday', 11);\n addUnitPriority('isoWeekday', 11);\n\n// PARSING\n\n addRegexToken('d', match1to2);\n addRegexToken('e', match1to2);\n addRegexToken('E', match1to2);\n addRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n });\n addRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n });\n addRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n });\n\n addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n var weekday = config._locale.weekdaysParse(input, token, config._strict);\n // if we didn't get a weekday name, mark the date as invalid\n if (weekday != null) {\n week.d = weekday;\n } else {\n getParsingFlags(config).invalidWeekday = input;\n }\n });\n\n addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n });\n\n// HELPERS\n\n function parseWeekday(input, locale) {\n if (typeof input !== 'string') {\n return input;\n }\n\n if (!isNaN(input)) {\n return parseInt(input, 10);\n }\n\n input = locale.weekdaysParse(input);\n if (typeof input === 'number') {\n return input;\n }\n\n return null;\n }\n\n function parseIsoWeekday(input, locale) {\n if (typeof input === 'string') {\n return locale.weekdaysParse(input) % 7 || 7;\n }\n return isNaN(input) ? null : input;\n }\n\n// LOCALES\n\n var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n function localeWeekdays (m, format) {\n if (!m) {\n return isArray(this._weekdays) ? this._weekdays :\n this._weekdays['standalone'];\n }\n return isArray(this._weekdays) ? this._weekdays[m.day()] :\n this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n }\n\n var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n function localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n }\n\n var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n function localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n }\n\n function handleStrictParse$1(weekdayName, format, strict) {\n var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._minWeekdaysParse = [];\n\n for (i = 0; i < 7; ++i) {\n mom = createUTC([2000, 1]).day(i);\n this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'dddd') {\n ii = indexOf$1.call(this._weekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'dddd') {\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeWeekdaysParse (weekdayName, format, strict) {\n var i, mom, regex;\n\n if (this._weekdaysParseExact) {\n return handleStrictParse$1.call(this, weekdayName, format, strict);\n }\n\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._minWeekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._fullWeekdaysParse = [];\n }\n\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n\n mom = createUTC([2000, 1]).day(i);\n if (strict && !this._fullWeekdaysParse[i]) {\n this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n }\n if (!this._weekdaysParse[i]) {\n regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n return i;\n }\n }\n }\n\n// MOMENTS\n\n function getSetDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n if (input != null) {\n input = parseWeekday(input, this.localeData());\n return this.add(input - day, 'd');\n } else {\n return day;\n }\n }\n\n function getSetLocaleDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n return input == null ? weekday : this.add(input - weekday, 'd');\n }\n\n function getSetISODayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n\n // behaves the same as moment#day except\n // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n // as a setter, sunday should belong to the previous week.\n\n if (input != null) {\n var weekday = parseIsoWeekday(input, this.localeData());\n return this.day(this.day() % 7 ? weekday : weekday - 7);\n } else {\n return this.day() || 7;\n }\n }\n\n var defaultWeekdaysRegex = matchWord;\n function weekdaysRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysStrictRegex;\n } else {\n return this._weekdaysRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n this._weekdaysRegex = defaultWeekdaysRegex;\n }\n return this._weekdaysStrictRegex && isStrict ?\n this._weekdaysStrictRegex : this._weekdaysRegex;\n }\n }\n\n var defaultWeekdaysShortRegex = matchWord;\n function weekdaysShortRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysShortStrictRegex;\n } else {\n return this._weekdaysShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n }\n return this._weekdaysShortStrictRegex && isStrict ?\n this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n }\n }\n\n var defaultWeekdaysMinRegex = matchWord;\n function weekdaysMinRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysMinStrictRegex;\n } else {\n return this._weekdaysMinRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n }\n return this._weekdaysMinStrictRegex && isStrict ?\n this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n }\n }\n\n\n function computeWeekdaysParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom, minp, shortp, longp;\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, 1]).day(i);\n minp = this.weekdaysMin(mom, '');\n shortp = this.weekdaysShort(mom, '');\n longp = this.weekdays(mom, '');\n minPieces.push(minp);\n shortPieces.push(shortp);\n longPieces.push(longp);\n mixedPieces.push(minp);\n mixedPieces.push(shortp);\n mixedPieces.push(longp);\n }\n // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n // will match the longer piece.\n minPieces.sort(cmpLenRev);\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 7; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._weekdaysShortRegex = this._weekdaysRegex;\n this._weekdaysMinRegex = this._weekdaysRegex;\n\n this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n }\n\n// FORMATTING\n\n function hFormat() {\n return this.hours() % 12 || 12;\n }\n\n function kFormat() {\n return this.hours() || 24;\n }\n\n addFormatToken('H', ['HH', 2], 0, 'hour');\n addFormatToken('h', ['hh', 2], 0, hFormat);\n addFormatToken('k', ['kk', 2], 0, kFormat);\n\n addFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n addFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n function meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n }\n\n meridiem('a', true);\n meridiem('A', false);\n\n// ALIASES\n\n addUnitAlias('hour', 'h');\n\n// PRIORITY\n addUnitPriority('hour', 13);\n\n// PARSING\n\n function matchMeridiem (isStrict, locale) {\n return locale._meridiemParse;\n }\n\n addRegexToken('a', matchMeridiem);\n addRegexToken('A', matchMeridiem);\n addRegexToken('H', match1to2);\n addRegexToken('h', match1to2);\n addRegexToken('k', match1to2);\n addRegexToken('HH', match1to2, match2);\n addRegexToken('hh', match1to2, match2);\n addRegexToken('kk', match1to2, match2);\n\n addRegexToken('hmm', match3to4);\n addRegexToken('hmmss', match5to6);\n addRegexToken('Hmm', match3to4);\n addRegexToken('Hmmss', match5to6);\n\n addParseToken(['H', 'HH'], HOUR);\n addParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n });\n addParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n });\n addParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('Hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n });\n addParseToken('Hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n });\n\n// LOCALES\n\n function localeIsPM (input) {\n // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n // Using charAt should be more compatible.\n return ((input + '').toLowerCase().charAt(0) === 'p');\n }\n\n var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n function localeMeridiem (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'pm' : 'PM';\n } else {\n return isLower ? 'am' : 'AM';\n }\n }\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\n var getSetHour = makeGetSet('Hours', true);\n\n// months\n// week\n// weekdays\n// meridiem\n var baseConfig = {\n calendar: defaultCalendar,\n longDateFormat: defaultLongDateFormat,\n invalidDate: defaultInvalidDate,\n ordinal: defaultOrdinal,\n dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n relativeTime: defaultRelativeTime,\n\n months: defaultLocaleMonths,\n monthsShort: defaultLocaleMonthsShort,\n\n week: defaultLocaleWeek,\n\n weekdays: defaultLocaleWeekdays,\n weekdaysMin: defaultLocaleWeekdaysMin,\n weekdaysShort: defaultLocaleWeekdaysShort,\n\n meridiemParse: defaultLocaleMeridiemParse\n };\n\n// internal storage for locale config files\n var locales = {};\n var localeFamilies = {};\n var globalLocale;\n\n function normalizeLocale(key) {\n return key ? key.toLowerCase().replace('_', '-') : key;\n }\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n function chooseLocale(names) {\n var i = 0, j, next, locale, split;\n\n while (i < names.length) {\n split = normalizeLocale(names[i]).split('-');\n j = split.length;\n next = normalizeLocale(names[i + 1]);\n next = next ? next.split('-') : null;\n while (j > 0) {\n locale = loadLocale(split.slice(0, j).join('-'));\n if (locale) {\n return locale;\n }\n if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n //the next array item is better than a shallower substring of this one\n break;\n }\n j--;\n }\n i++;\n }\n return null;\n }\n\n function loadLocale(name) {\n var oldLocale = null;\n // TODO: Find a better way to register and load all the locales in Node\n if (!locales[name] && (typeof module !== 'undefined') &&\n module && module.exports) {\n try {\n oldLocale = globalLocale._abbr;\n require('./locale/' + name);\n // because defineLocale currently also sets the global locale, we\n // want to undo that for lazy loaded locales\n getSetGlobalLocale(oldLocale);\n } catch (e) { }\n }\n return locales[name];\n }\n\n// This function will load locale and then set the global locale. If\n// no arguments are passed in, it will simply return the current global\n// locale key.\n function getSetGlobalLocale (key, values) {\n var data;\n if (key) {\n if (isUndefined(values)) {\n data = getLocale(key);\n }\n else {\n data = defineLocale(key, values);\n }\n\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n }\n }\n\n return globalLocale._abbr;\n }\n\n function defineLocale (name, config) {\n if (config !== null) {\n var parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple('defineLocaleOverride',\n 'use moment.updateLocale(localeName, config) to change ' +\n 'an existing locale. moment.defineLocale(localeName, ' +\n 'config) should only be used for creating a new locale ' +\n 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n parentConfig = locales[name]._config;\n } else if (config.parentLocale != null) {\n if (locales[config.parentLocale] != null) {\n parentConfig = locales[config.parentLocale]._config;\n } else {\n if (!localeFamilies[config.parentLocale]) {\n localeFamilies[config.parentLocale] = [];\n }\n localeFamilies[config.parentLocale].push({\n name: name,\n config: config\n });\n return null;\n }\n }\n locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n if (localeFamilies[name]) {\n localeFamilies[name].forEach(function (x) {\n defineLocale(x.name, x.config);\n });\n }\n\n // backwards compat for now: also set the locale\n // make sure we set the locale AFTER all child locales have been\n // created, so we won't end up with the child locale set.\n getSetGlobalLocale(name);\n\n\n return locales[name];\n } else {\n // useful for testing\n delete locales[name];\n return null;\n }\n }\n\n function updateLocale(name, config) {\n if (config != null) {\n var locale, parentConfig = baseConfig;\n // MERGE\n if (locales[name] != null) {\n parentConfig = locales[name]._config;\n }\n config = mergeConfigs(parentConfig, config);\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\n\n // backwards compat for now: also set the locale\n getSetGlobalLocale(name);\n } else {\n // pass null for config to unupdate, useful for tests\n if (locales[name] != null) {\n if (locales[name].parentLocale != null) {\n locales[name] = locales[name].parentLocale;\n } else if (locales[name] != null) {\n delete locales[name];\n }\n }\n }\n return locales[name];\n }\n\n// returns locale data\n function getLocale (key) {\n var locale;\n\n if (key && key._locale && key._locale._abbr) {\n key = key._locale._abbr;\n }\n\n if (!key) {\n return globalLocale;\n }\n\n if (!isArray(key)) {\n //short-circuit everything else\n locale = loadLocale(key);\n if (locale) {\n return locale;\n }\n key = [key];\n }\n\n return chooseLocale(key);\n }\n\n function listLocales() {\n return keys$1(locales);\n }\n\n function checkOverflow (m) {\n var overflow;\n var a = m._a;\n\n if (a && getParsingFlags(m).overflow === -2) {\n overflow =\n a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :\n a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :\n a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :\n a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n -1;\n\n if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n overflow = DATE;\n }\n if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n overflow = WEEK;\n }\n if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n overflow = WEEKDAY;\n }\n\n getParsingFlags(m).overflow = overflow;\n }\n\n return m;\n }\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n 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)?)?$/;\n var 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)?)?$/;\n\n var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n var isoDates = [\n ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n ['YYYY-DDD', /\\d{4}-\\d{3}/],\n ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n ['YYYYYYMMDD', /[+-]\\d{10}/],\n ['YYYYMMDD', /\\d{8}/],\n // YYYYMM is NOT allowed by the standard\n ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n ['YYYYDDD', /\\d{7}/]\n ];\n\n// iso time formats and regexes\n var isoTimes = [\n ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n ['HH:mm', /\\d\\d:\\d\\d/],\n ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n ['HHmm', /\\d\\d\\d\\d/],\n ['HH', /\\d\\d/]\n ];\n\n var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\n function configFromISO(config) {\n var i, l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime, dateFormat, timeFormat, tzFormat;\n\n if (match) {\n getParsingFlags(config).iso = true;\n\n for (i = 0, l = isoDates.length; i < l; i++) {\n if (isoDates[i][1].exec(match[1])) {\n dateFormat = isoDates[i][0];\n allowTime = isoDates[i][2] !== false;\n break;\n }\n }\n if (dateFormat == null) {\n config._isValid = false;\n return;\n }\n if (match[3]) {\n for (i = 0, l = isoTimes.length; i < l; i++) {\n if (isoTimes[i][1].exec(match[3])) {\n // match[2] should be 'T' or space\n timeFormat = (match[2] || ' ') + isoTimes[i][0];\n break;\n }\n }\n if (timeFormat == null) {\n config._isValid = false;\n return;\n }\n }\n if (!allowTime && timeFormat != null) {\n config._isValid = false;\n return;\n }\n if (match[4]) {\n if (tzRegex.exec(match[4])) {\n tzFormat = 'Z';\n } else {\n config._isValid = false;\n return;\n }\n }\n config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n configFromStringAndFormat(config);\n } else {\n config._isValid = false;\n }\n }\n\n// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n var basicRfcRegex = /^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d?\\d\\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(?:\\d\\d)?\\d\\d\\s)(\\d\\d:\\d\\d)(\\:\\d\\d)?(\\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\\d{4}))$/;\n\n// date and time from ref 2822 format\n function configFromRFC2822(config) {\n var string, match, dayFormat,\n dateFormat, timeFormat, tzFormat;\n var timezones = {\n ' GMT': ' +0000',\n ' EDT': ' -0400',\n ' EST': ' -0500',\n ' CDT': ' -0500',\n ' CST': ' -0600',\n ' MDT': ' -0600',\n ' MST': ' -0700',\n ' PDT': ' -0700',\n ' PST': ' -0800'\n };\n var military = 'YXWVUTSRQPONZABCDEFGHIKLM';\n var timezone, timezoneIndex;\n\n string = config._i\n .replace(/\\([^\\)]*\\)|[\\n\\t]/g, ' ') // Remove comments and folding whitespace\n .replace(/(\\s\\s+)/g, ' ') // Replace multiple-spaces with a single space\n .replace(/^\\s|\\s$/g, ''); // Remove leading and trailing spaces\n match = basicRfcRegex.exec(string);\n\n if (match) {\n dayFormat = match[1] ? 'ddd' + ((match[1].length === 5) ? ', ' : ' ') : '';\n dateFormat = 'D MMM ' + ((match[2].length > 10) ? 'YYYY ' : 'YY ');\n timeFormat = 'HH:mm' + (match[4] ? ':ss' : '');\n\n // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n if (match[1]) { // day of week given\n var momentDate = new Date(match[2]);\n var momentDay = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][momentDate.getDay()];\n\n if (match[1].substr(0,3) !== momentDay) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return;\n }\n }\n\n switch (match[5].length) {\n case 2: // military\n if (timezoneIndex === 0) {\n timezone = ' +0000';\n } else {\n timezoneIndex = military.indexOf(match[5][1].toUpperCase()) - 12;\n timezone = ((timezoneIndex < 0) ? ' -' : ' +') +\n (('' + timezoneIndex).replace(/^-?/, '0')).match(/..$/)[0] + '00';\n }\n break;\n case 4: // Zone\n timezone = timezones[match[5]];\n break;\n default: // UT or +/-9999\n timezone = timezones[' GMT'];\n }\n match[5] = timezone;\n config._i = match.splice(1).join('');\n tzFormat = ' ZZ';\n config._f = dayFormat + dateFormat + timeFormat + tzFormat;\n configFromStringAndFormat(config);\n getParsingFlags(config).rfc2822 = true;\n } else {\n config._isValid = false;\n }\n }\n\n// date from iso format or fallback\n function configFromString(config) {\n var matched = aspNetJsonRegex.exec(config._i);\n\n if (matched !== null) {\n config._d = new Date(+matched[1]);\n return;\n }\n\n configFromISO(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n configFromRFC2822(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\n }\n\n hooks.createFromInputFallback = deprecate(\n 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n 'discouraged and will be removed in an upcoming major release. Please refer to ' +\n 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n function (config) {\n config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n }\n );\n\n// Pick the first defined of two or three arguments.\n function defaults(a, b, c) {\n if (a != null) {\n return a;\n }\n if (b != null) {\n return b;\n }\n return c;\n }\n\n function currentDateArray(config) {\n // hooks is actually the exported moment object\n var nowValue = new Date(hooks.now());\n if (config._useUTC) {\n return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n }\n return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n }\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\n function configFromArray (config) {\n var i, date, input = [], currentDate, yearToUse;\n\n if (config._d) {\n return;\n }\n\n currentDate = currentDateArray(config);\n\n //compute day of the year from weeks and weekdays\n if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n dayOfYearFromWeekInfo(config);\n }\n\n //if the day of the year is set, figure out what it is\n if (config._dayOfYear != null) {\n yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n getParsingFlags(config)._overflowDayOfYear = true;\n }\n\n date = createUTCDate(yearToUse, 0, config._dayOfYear);\n config._a[MONTH] = date.getUTCMonth();\n config._a[DATE] = date.getUTCDate();\n }\n\n // Default to current date.\n // * if no year, month, day of month are given, default to today\n // * if day of month is given, default month and year\n // * if month is given, default only year\n // * if year is given, don't default anything\n for (i = 0; i < 3 && config._a[i] == null; ++i) {\n config._a[i] = input[i] = currentDate[i];\n }\n\n // Zero out whatever was not defaulted, including time\n for (; i < 7; i++) {\n config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (config._a[HOUR] === 24 &&\n config._a[MINUTE] === 0 &&\n config._a[SECOND] === 0 &&\n config._a[MILLISECOND] === 0) {\n config._nextDay = true;\n config._a[HOUR] = 0;\n }\n\n config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n // Apply timezone offset from input. The actual utcOffset can be changed\n // with parseZone.\n if (config._tzm != null) {\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n }\n\n if (config._nextDay) {\n config._a[HOUR] = 24;\n }\n }\n\n function dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n w = config._w;\n if (w.GG != null || w.W != null || w.E != null) {\n dow = 1;\n doy = 4;\n\n // TODO: We need to take the current isoWeekYear, but that depends on\n // how we interpret now (local, utc, fixed offset). So create\n // a now version of current config (take local/utc/offset flags, and\n // create now).\n weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n week = defaults(w.W, 1);\n weekday = defaults(w.E, 1);\n if (weekday < 1 || weekday > 7) {\n weekdayOverflow = true;\n }\n } else {\n dow = config._locale._week.dow;\n doy = config._locale._week.doy;\n\n var curWeek = weekOfYear(createLocal(), dow, doy);\n\n weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n // Default to current week.\n week = defaults(w.w, curWeek.week);\n\n if (w.d != null) {\n // weekday -- low day numbers are considered next week\n weekday = w.d;\n if (weekday < 0 || weekday > 6) {\n weekdayOverflow = true;\n }\n } else if (w.e != null) {\n // local weekday -- counting starts from begining of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to begining of week\n weekday = dow;\n }\n }\n if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n getParsingFlags(config)._overflowWeeks = true;\n } else if (weekdayOverflow != null) {\n getParsingFlags(config)._overflowWeekday = true;\n } else {\n temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n config._a[YEAR] = temp.year;\n config._dayOfYear = temp.dayOfYear;\n }\n }\n\n// constant that refers to the ISO standard\n hooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\n hooks.RFC_2822 = function () {};\n\n// date from string and format string\n function configFromStringAndFormat(config) {\n // TODO: Move this to another part of the creation flow to prevent circular deps\n if (config._f === hooks.ISO_8601) {\n configFromISO(config);\n return;\n }\n if (config._f === hooks.RFC_2822) {\n configFromRFC2822(config);\n return;\n }\n config._a = [];\n getParsingFlags(config).empty = true;\n\n // This array is used to make a Date, either with `new Date` or `Date.UTC`\n var string = '' + config._i,\n i, parsedInput, tokens, token, skipped,\n stringLength = string.length,\n totalParsedInputLength = 0;\n\n tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n // console.log('token', token, 'parsedInput', parsedInput,\n // 'regex', getParseRegexForToken(token, config));\n if (parsedInput) {\n skipped = string.substr(0, string.indexOf(parsedInput));\n if (skipped.length > 0) {\n getParsingFlags(config).unusedInput.push(skipped);\n }\n string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n totalParsedInputLength += parsedInput.length;\n }\n // don't parse if it's not a known token\n if (formatTokenFunctions[token]) {\n if (parsedInput) {\n getParsingFlags(config).empty = false;\n }\n else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n }\n else if (config._strict && !parsedInput) {\n getParsingFlags(config).unusedTokens.push(token);\n }\n }\n\n // add remaining unparsed input length to the string\n getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n if (string.length > 0) {\n getParsingFlags(config).unusedInput.push(string);\n }\n\n // clear _12h flag if hour is <= 12\n if (config._a[HOUR] <= 12 &&\n getParsingFlags(config).bigHour === true &&\n config._a[HOUR] > 0) {\n getParsingFlags(config).bigHour = undefined;\n }\n\n getParsingFlags(config).parsedDateParts = config._a.slice(0);\n getParsingFlags(config).meridiem = config._meridiem;\n // handle meridiem\n config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n configFromArray(config);\n checkOverflow(config);\n }\n\n\n function meridiemFixWrap (locale, hour, meridiem) {\n var isPm;\n\n if (meridiem == null) {\n // nothing to do\n return hour;\n }\n if (locale.meridiemHour != null) {\n return locale.meridiemHour(hour, meridiem);\n } else if (locale.isPM != null) {\n // Fallback\n isPm = locale.isPM(meridiem);\n if (isPm && hour < 12) {\n hour += 12;\n }\n if (!isPm && hour === 12) {\n hour = 0;\n }\n return hour;\n } else {\n // this is not supposed to happen\n return hour;\n }\n }\n\n// date from string and array of format strings\n function configFromStringAndArray(config) {\n var tempConfig,\n bestMoment,\n\n scoreToBeat,\n i,\n currentScore;\n\n if (config._f.length === 0) {\n getParsingFlags(config).invalidFormat = true;\n config._d = new Date(NaN);\n return;\n }\n\n for (i = 0; i < config._f.length; i++) {\n currentScore = 0;\n tempConfig = copyConfig({}, config);\n if (config._useUTC != null) {\n tempConfig._useUTC = config._useUTC;\n }\n tempConfig._f = config._f[i];\n configFromStringAndFormat(tempConfig);\n\n if (!isValid(tempConfig)) {\n continue;\n }\n\n // if there is any input that was not parsed add a penalty for that format\n currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n //or tokens\n currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n getParsingFlags(tempConfig).score = currentScore;\n\n if (scoreToBeat == null || currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n }\n }\n\n extend(config, bestMoment || tempConfig);\n }\n\n function configFromObject(config) {\n if (config._d) {\n return;\n }\n\n var i = normalizeObjectUnits(config._i);\n config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n return obj && parseInt(obj, 10);\n });\n\n configFromArray(config);\n }\n\n function createFromConfig (config) {\n var res = new Moment(checkOverflow(prepareConfig(config)));\n if (res._nextDay) {\n // Adding is smart enough around DST\n res.add(1, 'd');\n res._nextDay = undefined;\n }\n\n return res;\n }\n\n function prepareConfig (config) {\n var input = config._i,\n format = config._f;\n\n config._locale = config._locale || getLocale(config._l);\n\n if (input === null || (format === undefined && input === '')) {\n return createInvalid({nullInput: true});\n }\n\n if (typeof input === 'string') {\n config._i = input = config._locale.preparse(input);\n }\n\n if (isMoment(input)) {\n return new Moment(checkOverflow(input));\n } else if (isDate(input)) {\n config._d = input;\n } else if (isArray(format)) {\n configFromStringAndArray(config);\n } else if (format) {\n configFromStringAndFormat(config);\n } else {\n configFromInput(config);\n }\n\n if (!isValid(config)) {\n config._d = null;\n }\n\n return config;\n }\n\n function configFromInput(config) {\n var input = config._i;\n if (isUndefined(input)) {\n config._d = new Date(hooks.now());\n } else if (isDate(input)) {\n config._d = new Date(input.valueOf());\n } else if (typeof input === 'string') {\n configFromString(config);\n } else if (isArray(input)) {\n config._a = map(input.slice(0), function (obj) {\n return parseInt(obj, 10);\n });\n configFromArray(config);\n } else if (isObject(input)) {\n configFromObject(config);\n } else if (isNumber(input)) {\n // from milliseconds\n config._d = new Date(input);\n } else {\n hooks.createFromInputFallback(config);\n }\n }\n\n function createLocalOrUTC (input, format, locale, strict, isUTC) {\n var c = {};\n\n if (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n\n if ((isObject(input) && isObjectEmpty(input)) ||\n (isArray(input) && input.length === 0)) {\n input = undefined;\n }\n // object construction must be done this way.\n // https://github.com/moment/moment/issues/1423\n c._isAMomentObject = true;\n c._useUTC = c._isUTC = isUTC;\n c._l = locale;\n c._i = input;\n c._f = format;\n c._strict = strict;\n\n return createFromConfig(c);\n }\n\n function createLocal (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n }\n\n var prototypeMin = deprecate(\n 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other < this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n var prototypeMax = deprecate(\n 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other > this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\n function pickBy(fn, moments) {\n var res, i;\n if (moments.length === 1 && isArray(moments[0])) {\n moments = moments[0];\n }\n if (!moments.length) {\n return createLocal();\n }\n res = moments[0];\n for (i = 1; i < moments.length; ++i) {\n if (!moments[i].isValid() || moments[i][fn](res)) {\n res = moments[i];\n }\n }\n return res;\n }\n\n// TODO: Use [].sort instead?\n function min () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n }\n\n function max () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n }\n\n var now = function () {\n return Date.now ? Date.now() : +(new Date());\n };\n\n var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n function isDurationValid(m) {\n for (var key in m) {\n if (!(ordering.indexOf(key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n return false;\n }\n }\n\n var unitHasDecimal = false;\n for (var i = 0; i < ordering.length; ++i) {\n if (m[ordering[i]]) {\n if (unitHasDecimal) {\n return false; // only allow non-integers for smallest unit\n }\n if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n unitHasDecimal = true;\n }\n }\n }\n\n return true;\n }\n\n function isValid$1() {\n return this._isValid;\n }\n\n function createInvalid$1() {\n return createDuration(NaN);\n }\n\n function Duration (duration) {\n var normalizedInput = normalizeObjectUnits(duration),\n years = normalizedInput.year || 0,\n quarters = normalizedInput.quarter || 0,\n months = normalizedInput.month || 0,\n weeks = normalizedInput.week || 0,\n days = normalizedInput.day || 0,\n hours = normalizedInput.hour || 0,\n minutes = normalizedInput.minute || 0,\n seconds = normalizedInput.second || 0,\n milliseconds = normalizedInput.millisecond || 0;\n\n this._isValid = isDurationValid(normalizedInput);\n\n // representation for dateAddRemove\n this._milliseconds = +milliseconds +\n seconds * 1e3 + // 1000\n minutes * 6e4 + // 1000 * 60\n hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n // Because of dateAddRemove treats 24 hours as different from a\n // day when working around DST, we need to store them separately\n this._days = +days +\n weeks * 7;\n // It is impossible translate months into days without knowing\n // which months you are are talking about, so we have to store\n // it separately.\n this._months = +months +\n quarters * 3 +\n years * 12;\n\n this._data = {};\n\n this._locale = getLocale();\n\n this._bubble();\n }\n\n function isDuration (obj) {\n return obj instanceof Duration;\n }\n\n function absRound (number) {\n if (number < 0) {\n return Math.round(-1 * number) * -1;\n } else {\n return Math.round(number);\n }\n }\n\n// FORMATTING\n\n function offset (token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset();\n var sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n });\n }\n\n offset('Z', ':');\n offset('ZZ', '');\n\n// PARSING\n\n addRegexToken('Z', matchShortOffset);\n addRegexToken('ZZ', matchShortOffset);\n addParseToken(['Z', 'ZZ'], function (input, array, config) {\n config._useUTC = true;\n config._tzm = offsetFromString(matchShortOffset, input);\n });\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10', '00']\n// '-1530' > ['-15', '30']\n var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n function offsetFromString(matcher, string) {\n var matches = (string || '').match(matcher);\n\n if (matches === null) {\n return null;\n }\n\n var chunk = matches[matches.length - 1] || [];\n var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n return minutes === 0 ?\n 0 :\n parts[0] === '+' ? minutes : -minutes;\n }\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\n function cloneWithOffset(input, model) {\n var res, diff;\n if (model._isUTC) {\n res = model.clone();\n diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n // Use low-level api, because this fn is low-level api.\n res._d.setTime(res._d.valueOf() + diff);\n hooks.updateOffset(res, false);\n return res;\n } else {\n return createLocal(input).local();\n }\n }\n\n function getDateOffset (m) {\n // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n // https://github.com/moment/moment/pull/1871\n return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n }\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\n hooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\n function getSetOffset (input, keepLocalTime, keepMinutes) {\n var offset = this._offset || 0,\n localAdjust;\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n if (input != null) {\n if (typeof input === 'string') {\n input = offsetFromString(matchShortOffset, input);\n if (input === null) {\n return this;\n }\n } else if (Math.abs(input) < 16 && !keepMinutes) {\n input = input * 60;\n }\n if (!this._isUTC && keepLocalTime) {\n localAdjust = getDateOffset(this);\n }\n this._offset = input;\n this._isUTC = true;\n if (localAdjust != null) {\n this.add(localAdjust, 'm');\n }\n if (offset !== input) {\n if (!keepLocalTime || this._changeInProgress) {\n addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n } else if (!this._changeInProgress) {\n this._changeInProgress = true;\n hooks.updateOffset(this, true);\n this._changeInProgress = null;\n }\n }\n return this;\n } else {\n return this._isUTC ? offset : getDateOffset(this);\n }\n }\n\n function getSetZone (input, keepLocalTime) {\n if (input != null) {\n if (typeof input !== 'string') {\n input = -input;\n }\n\n this.utcOffset(input, keepLocalTime);\n\n return this;\n } else {\n return -this.utcOffset();\n }\n }\n\n function setOffsetToUTC (keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n }\n\n function setOffsetToLocal (keepLocalTime) {\n if (this._isUTC) {\n this.utcOffset(0, keepLocalTime);\n this._isUTC = false;\n\n if (keepLocalTime) {\n this.subtract(getDateOffset(this), 'm');\n }\n }\n return this;\n }\n\n function setOffsetToParsedOffset () {\n if (this._tzm != null) {\n this.utcOffset(this._tzm, false, true);\n } else if (typeof this._i === 'string') {\n var tZone = offsetFromString(matchOffset, this._i);\n if (tZone != null) {\n this.utcOffset(tZone);\n }\n else {\n this.utcOffset(0, true);\n }\n }\n return this;\n }\n\n function hasAlignedHourOffset (input) {\n if (!this.isValid()) {\n return false;\n }\n input = input ? createLocal(input).utcOffset() : 0;\n\n return (this.utcOffset() - input) % 60 === 0;\n }\n\n function isDaylightSavingTime () {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n }\n\n function isDaylightSavingTimeShifted () {\n if (!isUndefined(this._isDSTShifted)) {\n return this._isDSTShifted;\n }\n\n var c = {};\n\n copyConfig(c, this);\n c = prepareConfig(c);\n\n if (c._a) {\n var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted = this.isValid() &&\n compareArrays(c._a, other.toArray()) > 0;\n } else {\n this._isDSTShifted = false;\n }\n\n return this._isDSTShifted;\n }\n\n function isLocal () {\n return this.isValid() ? !this._isUTC : false;\n }\n\n function isUtcOffset () {\n return this.isValid() ? this._isUTC : false;\n }\n\n function isUtc () {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n }\n\n// ASP.NET json date format regex\n var aspNetRegex = /^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\n var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;\n\n function createDuration (input, key) {\n var duration = input,\n // matching against regexp is expensive, do it on demand\n match = null,\n sign,\n ret,\n diffRes;\n\n if (isDuration(input)) {\n duration = {\n ms : input._milliseconds,\n d : input._days,\n M : input._months\n };\n } else if (isNumber(input)) {\n duration = {};\n if (key) {\n duration[key] = input;\n } else {\n duration.milliseconds = input;\n }\n } else if (!!(match = aspNetRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : 0,\n d : toInt(match[DATE]) * sign,\n h : toInt(match[HOUR]) * sign,\n m : toInt(match[MINUTE]) * sign,\n s : toInt(match[SECOND]) * sign,\n ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n };\n } else if (!!(match = isoRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : parseIso(match[2], sign),\n M : parseIso(match[3], sign),\n w : parseIso(match[4], sign),\n d : parseIso(match[5], sign),\n h : parseIso(match[6], sign),\n m : parseIso(match[7], sign),\n s : parseIso(match[8], sign)\n };\n } else if (duration == null) {// checks for null or undefined\n duration = {};\n } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n duration = {};\n duration.ms = diffRes.milliseconds;\n duration.M = diffRes.months;\n }\n\n ret = new Duration(duration);\n\n if (isDuration(input) && hasOwnProp(input, '_locale')) {\n ret._locale = input._locale;\n }\n\n return ret;\n }\n\n createDuration.fn = Duration.prototype;\n createDuration.invalid = createInvalid$1;\n\n function parseIso (inp, sign) {\n // We'd normally use ~~inp for this, but unfortunately it also\n // converts floats to ints.\n // inp may be undefined, so careful calling replace on it.\n var res = inp && parseFloat(inp.replace(',', '.'));\n // apply sign while we're at it\n return (isNaN(res) ? 0 : res) * sign;\n }\n\n function positiveMomentsDifference(base, other) {\n var res = {milliseconds: 0, months: 0};\n\n res.months = other.month() - base.month() +\n (other.year() - base.year()) * 12;\n if (base.clone().add(res.months, 'M').isAfter(other)) {\n --res.months;\n }\n\n res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n return res;\n }\n\n function momentsDifference(base, other) {\n var res;\n if (!(base.isValid() && other.isValid())) {\n return {milliseconds: 0, months: 0};\n }\n\n other = cloneWithOffset(other, base);\n if (base.isBefore(other)) {\n res = positiveMomentsDifference(base, other);\n } else {\n res = positiveMomentsDifference(other, base);\n res.milliseconds = -res.milliseconds;\n res.months = -res.months;\n }\n\n return res;\n }\n\n// TODO: remove 'name' arg after deprecation is removed\n function createAdder(direction, name) {\n return function (val, period) {\n var dur, tmp;\n //invert the arguments, but complain about it\n if (period !== null && !isNaN(+period)) {\n deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n tmp = val; val = period; period = tmp;\n }\n\n val = typeof val === 'string' ? +val : val;\n dur = createDuration(val, period);\n addSubtract(this, dur, direction);\n return this;\n };\n }\n\n function addSubtract (mom, duration, isAdding, updateOffset) {\n var milliseconds = duration._milliseconds,\n days = absRound(duration._days),\n months = absRound(duration._months);\n\n if (!mom.isValid()) {\n // No op\n return;\n }\n\n updateOffset = updateOffset == null ? true : updateOffset;\n\n if (milliseconds) {\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n }\n if (days) {\n set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n }\n if (months) {\n setMonth(mom, get(mom, 'Month') + months * isAdding);\n }\n if (updateOffset) {\n hooks.updateOffset(mom, days || months);\n }\n }\n\n var add = createAdder(1, 'add');\n var subtract = createAdder(-1, 'subtract');\n\n function getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6 ? 'sameElse' :\n diff < -1 ? 'lastWeek' :\n diff < 0 ? 'lastDay' :\n diff < 1 ? 'sameDay' :\n diff < 2 ? 'nextDay' :\n diff < 7 ? 'nextWeek' : 'sameElse';\n }\n\n function calendar$1 (time, formats) {\n // We want to compare the start of today, vs this.\n // Getting start-of-today depends on whether we're local/utc/offset or not.\n var now = time || createLocal(),\n sod = cloneWithOffset(now, this).startOf('day'),\n format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n }\n\n function clone () {\n return new Moment(this);\n }\n\n function isAfter (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() > localInput.valueOf();\n } else {\n return localInput.valueOf() < this.clone().startOf(units).valueOf();\n }\n }\n\n function isBefore (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() < localInput.valueOf();\n } else {\n return this.clone().endOf(units).valueOf() < localInput.valueOf();\n }\n }\n\n function isBetween (from, to, units, inclusivity) {\n inclusivity = inclusivity || '()';\n return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n }\n\n function isSame (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input),\n inputMs;\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units || 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() === localInput.valueOf();\n } else {\n inputMs = localInput.valueOf();\n return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n }\n }\n\n function isSameOrAfter (input, units) {\n return this.isSame(input, units) || this.isAfter(input,units);\n }\n\n function isSameOrBefore (input, units) {\n return this.isSame(input, units) || this.isBefore(input,units);\n }\n\n function diff (input, units, asFloat) {\n var that,\n zoneDelta,\n delta, output;\n\n if (!this.isValid()) {\n return NaN;\n }\n\n that = cloneWithOffset(input, this);\n\n if (!that.isValid()) {\n return NaN;\n }\n\n zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n units = normalizeUnits(units);\n\n if (units === 'year' || units === 'month' || units === 'quarter') {\n output = monthDiff(this, that);\n if (units === 'quarter') {\n output = output / 3;\n } else if (units === 'year') {\n output = output / 12;\n }\n } else {\n delta = this - that;\n output = units === 'second' ? delta / 1e3 : // 1000\n units === 'minute' ? delta / 6e4 : // 1000 * 60\n units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\n units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\n units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\n delta;\n }\n return asFloat ? output : absFloor(output);\n }\n\n function monthDiff (a, b) {\n // difference in months\n var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n // b is in (anchor - 1 month, anchor + 1 month)\n anchor = a.clone().add(wholeMonthDiff, 'months'),\n anchor2, adjust;\n\n if (b - anchor < 0) {\n anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor - anchor2);\n } else {\n anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor2 - anchor);\n }\n\n //check for negative zero, return zero if negative zero\n return -(wholeMonthDiff + adjust) || 0;\n }\n\n hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n function toString () {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n }\n\n function toISOString() {\n if (!this.isValid()) {\n return null;\n }\n var m = this.clone().utc();\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n }\n if (isFunction(Date.prototype.toISOString)) {\n // native implementation is ~50x faster, use it when we can\n return this.toDate().toISOString();\n }\n return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n }\n\n /**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\n function inspect () {\n if (!this.isValid()) {\n return 'moment.invalid(/* ' + this._i + ' */)';\n }\n var func = 'moment';\n var zone = '';\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n var prefix = '[' + func + '(\"]';\n var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n var suffix = zone + '[\")]';\n\n return this.format(prefix + year + datetime + suffix);\n }\n\n function format (inputString) {\n if (!inputString) {\n inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n }\n\n function from (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function fromNow (withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n }\n\n function to (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function toNow (withoutSuffix) {\n return this.to(createLocal(), withoutSuffix);\n }\n\n// If passed a locale key, it will set the locale for this\n// instance. Otherwise, it will return the locale configuration\n// variables for this instance.\n function locale (key) {\n var newLocaleData;\n\n if (key === undefined) {\n return this._locale._abbr;\n } else {\n newLocaleData = getLocale(key);\n if (newLocaleData != null) {\n this._locale = newLocaleData;\n }\n return this;\n }\n }\n\n var lang = deprecate(\n 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n function (key) {\n if (key === undefined) {\n return this.localeData();\n } else {\n return this.locale(key);\n }\n }\n );\n\n function localeData () {\n return this._locale;\n }\n\n function startOf (units) {\n units = normalizeUnits(units);\n // the following switch intentionally omits break keywords\n // to utilize falling through the cases.\n switch (units) {\n case 'year':\n this.month(0);\n\t\t\t\t/* falls through */\n case 'quarter':\n case 'month':\n this.date(1);\n\t\t\t\t/* falls through */\n case 'week':\n case 'isoWeek':\n case 'day':\n case 'date':\n this.hours(0);\n\t\t\t\t/* falls through */\n case 'hour':\n this.minutes(0);\n\t\t\t\t/* falls through */\n case 'minute':\n this.seconds(0);\n\t\t\t\t/* falls through */\n case 'second':\n this.milliseconds(0);\n }\n\n // weeks are a special case\n if (units === 'week') {\n this.weekday(0);\n }\n if (units === 'isoWeek') {\n this.isoWeekday(1);\n }\n\n // quarters are also special\n if (units === 'quarter') {\n this.month(Math.floor(this.month() / 3) * 3);\n }\n\n return this;\n }\n\n function endOf (units) {\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond') {\n return this;\n }\n\n // 'date' is an alias for 'day', so it should be considered as such.\n if (units === 'date') {\n units = 'day';\n }\n\n return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n }\n\n function valueOf () {\n return this._d.valueOf() - ((this._offset || 0) * 60000);\n }\n\n function unix () {\n return Math.floor(this.valueOf() / 1000);\n }\n\n function toDate () {\n return new Date(this.valueOf());\n }\n\n function toArray () {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n }\n\n function toObject () {\n var m = this;\n return {\n years: m.year(),\n months: m.month(),\n date: m.date(),\n hours: m.hours(),\n minutes: m.minutes(),\n seconds: m.seconds(),\n milliseconds: m.milliseconds()\n };\n }\n\n function toJSON () {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n }\n\n function isValid$2 () {\n return isValid(this);\n }\n\n function parsingFlags () {\n return extend({}, getParsingFlags(this));\n }\n\n function invalidAt () {\n return getParsingFlags(this).overflow;\n }\n\n function creationData() {\n return {\n input: this._i,\n format: this._f,\n locale: this._locale,\n isUTC: this._isUTC,\n strict: this._strict\n };\n }\n\n// FORMATTING\n\n addFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n });\n\n addFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n });\n\n function addWeekYearFormatToken (token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n }\n\n addWeekYearFormatToken('gggg', 'weekYear');\n addWeekYearFormatToken('ggggg', 'weekYear');\n addWeekYearFormatToken('GGGG', 'isoWeekYear');\n addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\n addUnitAlias('weekYear', 'gg');\n addUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\n addUnitPriority('weekYear', 1);\n addUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\n addRegexToken('G', matchSigned);\n addRegexToken('g', matchSigned);\n addRegexToken('GG', match1to2, match2);\n addRegexToken('gg', match1to2, match2);\n addRegexToken('GGGG', match1to4, match4);\n addRegexToken('gggg', match1to4, match4);\n addRegexToken('GGGGG', match1to6, match6);\n addRegexToken('ggggg', match1to6, match6);\n\n addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n });\n\n addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n });\n\n// MOMENTS\n\n function getSetWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input,\n this.week(),\n this.weekday(),\n this.localeData()._week.dow,\n this.localeData()._week.doy);\n }\n\n function getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n }\n\n function getISOWeeksInYear () {\n return weeksInYear(this.year(), 1, 4);\n }\n\n function getWeeksInYear () {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n }\n\n function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n var weeksTarget;\n if (input == null) {\n return weekOfYear(this, dow, doy).year;\n } else {\n weeksTarget = weeksInYear(input, dow, doy);\n if (week > weeksTarget) {\n week = weeksTarget;\n }\n return setWeekAll.call(this, input, week, weekday, dow, doy);\n }\n }\n\n function setWeekAll(weekYear, week, weekday, dow, doy) {\n var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n this.year(date.getUTCFullYear());\n this.month(date.getUTCMonth());\n this.date(date.getUTCDate());\n return this;\n }\n\n// FORMATTING\n\n addFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\n addUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\n addUnitPriority('quarter', 7);\n\n// PARSING\n\n addRegexToken('Q', match1);\n addParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n });\n\n// MOMENTS\n\n function getSetQuarter (input) {\n return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n }\n\n// FORMATTING\n\n addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\n addUnitAlias('date', 'D');\n\n// PRIOROITY\n addUnitPriority('date', 9);\n\n// PARSING\n\n addRegexToken('D', match1to2);\n addRegexToken('DD', match1to2, match2);\n addRegexToken('Do', function (isStrict, locale) {\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n return isStrict ?\n (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n locale._dayOfMonthOrdinalParseLenient;\n });\n\n addParseToken(['D', 'DD'], DATE);\n addParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0], 10);\n });\n\n// MOMENTS\n\n var getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\n addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\n addUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\n addUnitPriority('dayOfYear', 4);\n\n// PARSING\n\n addRegexToken('DDD', match1to3);\n addRegexToken('DDDD', match3);\n addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n });\n\n// HELPERS\n\n// MOMENTS\n\n function getSetDayOfYear (input) {\n var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n }\n\n// FORMATTING\n\n addFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\n addUnitAlias('minute', 'm');\n\n// PRIORITY\n\n addUnitPriority('minute', 14);\n\n// PARSING\n\n addRegexToken('m', match1to2);\n addRegexToken('mm', match1to2, match2);\n addParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\n var getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\n addFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\n addUnitAlias('second', 's');\n\n// PRIORITY\n\n addUnitPriority('second', 15);\n\n// PARSING\n\n addRegexToken('s', match1to2);\n addRegexToken('ss', match1to2, match2);\n addParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\n var getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\n addFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n });\n\n addFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n });\n\n addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n addFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n });\n addFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n });\n addFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n });\n addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n });\n addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n });\n addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n });\n\n\n// ALIASES\n\n addUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\n addUnitPriority('millisecond', 16);\n\n// PARSING\n\n addRegexToken('S', match1to3, match1);\n addRegexToken('SS', match1to3, match2);\n addRegexToken('SSS', match1to3, match3);\n\n var token;\n for (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n }\n\n function parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n }\n\n for (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n }\n// MOMENTS\n\n var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\n addFormatToken('z', 0, 0, 'zoneAbbr');\n addFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\n function getZoneAbbr () {\n return this._isUTC ? 'UTC' : '';\n }\n\n function getZoneName () {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n }\n\n var proto = Moment.prototype;\n\n proto.add = add;\n proto.calendar = calendar$1;\n proto.clone = clone;\n proto.diff = diff;\n proto.endOf = endOf;\n proto.format = format;\n proto.from = from;\n proto.fromNow = fromNow;\n proto.to = to;\n proto.toNow = toNow;\n proto.get = stringGet;\n proto.invalidAt = invalidAt;\n proto.isAfter = isAfter;\n proto.isBefore = isBefore;\n proto.isBetween = isBetween;\n proto.isSame = isSame;\n proto.isSameOrAfter = isSameOrAfter;\n proto.isSameOrBefore = isSameOrBefore;\n proto.isValid = isValid$2;\n proto.lang = lang;\n proto.locale = locale;\n proto.localeData = localeData;\n proto.max = prototypeMax;\n proto.min = prototypeMin;\n proto.parsingFlags = parsingFlags;\n proto.set = stringSet;\n proto.startOf = startOf;\n proto.subtract = subtract;\n proto.toArray = toArray;\n proto.toObject = toObject;\n proto.toDate = toDate;\n proto.toISOString = toISOString;\n proto.inspect = inspect;\n proto.toJSON = toJSON;\n proto.toString = toString;\n proto.unix = unix;\n proto.valueOf = valueOf;\n proto.creationData = creationData;\n\n// Year\n proto.year = getSetYear;\n proto.isLeapYear = getIsLeapYear;\n\n// Week Year\n proto.weekYear = getSetWeekYear;\n proto.isoWeekYear = getSetISOWeekYear;\n\n// Quarter\n proto.quarter = proto.quarters = getSetQuarter;\n\n// Month\n proto.month = getSetMonth;\n proto.daysInMonth = getDaysInMonth;\n\n// Week\n proto.week = proto.weeks = getSetWeek;\n proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n proto.weeksInYear = getWeeksInYear;\n proto.isoWeeksInYear = getISOWeeksInYear;\n\n// Day\n proto.date = getSetDayOfMonth;\n proto.day = proto.days = getSetDayOfWeek;\n proto.weekday = getSetLocaleDayOfWeek;\n proto.isoWeekday = getSetISODayOfWeek;\n proto.dayOfYear = getSetDayOfYear;\n\n// Hour\n proto.hour = proto.hours = getSetHour;\n\n// Minute\n proto.minute = proto.minutes = getSetMinute;\n\n// Second\n proto.second = proto.seconds = getSetSecond;\n\n// Millisecond\n proto.millisecond = proto.milliseconds = getSetMillisecond;\n\n// Offset\n proto.utcOffset = getSetOffset;\n proto.utc = setOffsetToUTC;\n proto.local = setOffsetToLocal;\n proto.parseZone = setOffsetToParsedOffset;\n proto.hasAlignedHourOffset = hasAlignedHourOffset;\n proto.isDST = isDaylightSavingTime;\n proto.isLocal = isLocal;\n proto.isUtcOffset = isUtcOffset;\n proto.isUtc = isUtc;\n proto.isUTC = isUtc;\n\n// Timezone\n proto.zoneAbbr = getZoneAbbr;\n proto.zoneName = getZoneName;\n\n// Deprecations\n proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n function createUnix (input) {\n return createLocal(input * 1000);\n }\n\n function createInZone () {\n return createLocal.apply(null, arguments).parseZone();\n }\n\n function preParsePostFormat (string) {\n return string;\n }\n\n var proto$1 = Locale.prototype;\n\n proto$1.calendar = calendar;\n proto$1.longDateFormat = longDateFormat;\n proto$1.invalidDate = invalidDate;\n proto$1.ordinal = ordinal;\n proto$1.preparse = preParsePostFormat;\n proto$1.postformat = preParsePostFormat;\n proto$1.relativeTime = relativeTime;\n proto$1.pastFuture = pastFuture;\n proto$1.set = set;\n\n// Month\n proto$1.months = localeMonths;\n proto$1.monthsShort = localeMonthsShort;\n proto$1.monthsParse = localeMonthsParse;\n proto$1.monthsRegex = monthsRegex;\n proto$1.monthsShortRegex = monthsShortRegex;\n\n// Week\n proto$1.week = localeWeek;\n proto$1.firstDayOfYear = localeFirstDayOfYear;\n proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n// Day of Week\n proto$1.weekdays = localeWeekdays;\n proto$1.weekdaysMin = localeWeekdaysMin;\n proto$1.weekdaysShort = localeWeekdaysShort;\n proto$1.weekdaysParse = localeWeekdaysParse;\n\n proto$1.weekdaysRegex = weekdaysRegex;\n proto$1.weekdaysShortRegex = weekdaysShortRegex;\n proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n// Hours\n proto$1.isPM = localeIsPM;\n proto$1.meridiem = localeMeridiem;\n\n function get$1 (format, index, field, setter) {\n var locale = getLocale();\n var utc = createUTC().set(setter, index);\n return locale[field](utc, format);\n }\n\n function listMonthsImpl (format, index, field) {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n\n if (index != null) {\n return get$1(format, index, field, 'month');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 12; i++) {\n out[i] = get$1(format, i, field, 'month');\n }\n return out;\n }\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\n function listWeekdaysImpl (localeSorted, format, index, field) {\n if (typeof localeSorted === 'boolean') {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n } else {\n format = localeSorted;\n index = format;\n localeSorted = false;\n\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n }\n\n var locale = getLocale(),\n shift = localeSorted ? locale._week.dow : 0;\n\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 7; i++) {\n out[i] = get$1(format, (i + shift) % 7, field, 'day');\n }\n return out;\n }\n\n function listMonths (format, index) {\n return listMonthsImpl(format, index, 'months');\n }\n\n function listMonthsShort (format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n }\n\n function listWeekdays (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n }\n\n function listWeekdaysShort (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n }\n\n function listWeekdaysMin (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n }\n\n getSetGlobalLocale('en', {\n dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal : function (number) {\n var b = number % 10,\n output = (toInt(number % 100 / 10) === 1) ? 'th' :\n (b === 1) ? 'st' :\n (b === 2) ? 'nd' :\n (b === 3) ? 'rd' : 'th';\n return number + output;\n }\n });\n\n// Side effect imports\n hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\n var mathAbs = Math.abs;\n\n function abs () {\n var data = this._data;\n\n this._milliseconds = mathAbs(this._milliseconds);\n this._days = mathAbs(this._days);\n this._months = mathAbs(this._months);\n\n data.milliseconds = mathAbs(data.milliseconds);\n data.seconds = mathAbs(data.seconds);\n data.minutes = mathAbs(data.minutes);\n data.hours = mathAbs(data.hours);\n data.months = mathAbs(data.months);\n data.years = mathAbs(data.years);\n\n return this;\n }\n\n function addSubtract$1 (duration, input, value, direction) {\n var other = createDuration(input, value);\n\n duration._milliseconds += direction * other._milliseconds;\n duration._days += direction * other._days;\n duration._months += direction * other._months;\n\n return duration._bubble();\n }\n\n// supports only 2.0-style add(1, 's') or add(duration)\n function add$1 (input, value) {\n return addSubtract$1(this, input, value, 1);\n }\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\n function subtract$1 (input, value) {\n return addSubtract$1(this, input, value, -1);\n }\n\n function absCeil (number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n }\n\n function bubble () {\n var milliseconds = this._milliseconds;\n var days = this._days;\n var months = this._months;\n var data = this._data;\n var seconds, minutes, hours, years, monthsFromDays;\n\n // if we have a mix of positive and negative values, bubble down first\n // check: https://github.com/moment/moment/issues/2166\n if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n (milliseconds <= 0 && days <= 0 && months <= 0))) {\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n days = 0;\n months = 0;\n }\n\n // The following code bubbles up values, see the tests for\n // examples of what that means.\n data.milliseconds = milliseconds % 1000;\n\n seconds = absFloor(milliseconds / 1000);\n data.seconds = seconds % 60;\n\n minutes = absFloor(seconds / 60);\n data.minutes = minutes % 60;\n\n hours = absFloor(minutes / 60);\n data.hours = hours % 24;\n\n days += absFloor(hours / 24);\n\n // convert days to months\n monthsFromDays = absFloor(daysToMonths(days));\n months += monthsFromDays;\n days -= absCeil(monthsToDays(monthsFromDays));\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n data.days = days;\n data.months = months;\n data.years = years;\n\n return this;\n }\n\n function daysToMonths (days) {\n // 400 years have 146097 days (taking into account leap year rules)\n // 400 years have 12 months === 4800\n return days * 4800 / 146097;\n }\n\n function monthsToDays (months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n }\n\n function as (units) {\n if (!this.isValid()) {\n return NaN;\n }\n var days;\n var months;\n var milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === 'month' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n return units === 'month' ? months : months / 12;\n } else {\n // handle milliseconds separately because of floating point math errors (issue #1867)\n days = this._days + Math.round(monthsToDays(this._months));\n switch (units) {\n case 'week' : return days / 7 + milliseconds / 6048e5;\n case 'day' : return days + milliseconds / 864e5;\n case 'hour' : return days * 24 + milliseconds / 36e5;\n case 'minute' : return days * 1440 + milliseconds / 6e4;\n case 'second' : return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n default: throw new Error('Unknown unit ' + units);\n }\n }\n }\n\n// TODO: Use this.as('ms')?\n function valueOf$1 () {\n if (!this.isValid()) {\n return NaN;\n }\n return (\n this._milliseconds +\n this._days * 864e5 +\n (this._months % 12) * 2592e6 +\n toInt(this._months / 12) * 31536e6\n );\n }\n\n function makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n }\n\n var asMilliseconds = makeAs('ms');\n var asSeconds = makeAs('s');\n var asMinutes = makeAs('m');\n var asHours = makeAs('h');\n var asDays = makeAs('d');\n var asWeeks = makeAs('w');\n var asMonths = makeAs('M');\n var asYears = makeAs('y');\n\n function get$2 (units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n }\n\n function makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n }\n\n var milliseconds = makeGetter('milliseconds');\n var seconds = makeGetter('seconds');\n var minutes = makeGetter('minutes');\n var hours = makeGetter('hours');\n var days = makeGetter('days');\n var months = makeGetter('months');\n var years = makeGetter('years');\n\n function weeks () {\n return absFloor(this.days() / 7);\n }\n\n var round = Math.round;\n var thresholds = {\n ss: 44, // a few seconds to seconds\n s : 45, // seconds to minute\n m : 45, // minutes to hour\n h : 22, // hours to day\n d : 26, // days to month\n M : 11 // months to year\n };\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n }\n\n function relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n var duration = createDuration(posNegDuration).abs();\n var seconds = round(duration.as('s'));\n var minutes = round(duration.as('m'));\n var hours = round(duration.as('h'));\n var days = round(duration.as('d'));\n var months = round(duration.as('M'));\n var years = round(duration.as('y'));\n\n var a = seconds <= thresholds.ss && ['s', seconds] ||\n seconds < thresholds.s && ['ss', seconds] ||\n minutes <= 1 && ['m'] ||\n minutes < thresholds.m && ['mm', minutes] ||\n hours <= 1 && ['h'] ||\n hours < thresholds.h && ['hh', hours] ||\n days <= 1 && ['d'] ||\n days < thresholds.d && ['dd', days] ||\n months <= 1 && ['M'] ||\n months < thresholds.M && ['MM', months] ||\n years <= 1 && ['y'] || ['yy', years];\n\n a[2] = withoutSuffix;\n a[3] = +posNegDuration > 0;\n a[4] = locale;\n return substituteTimeAgo.apply(null, a);\n }\n\n// This function allows you to set the rounding function for relative time strings\n function getSetRelativeTimeRounding (roundingFunction) {\n if (roundingFunction === undefined) {\n return round;\n }\n if (typeof(roundingFunction) === 'function') {\n round = roundingFunction;\n return true;\n }\n return false;\n }\n\n// This function allows you to set a threshold for relative time strings\n function getSetRelativeTimeThreshold (threshold, limit) {\n if (thresholds[threshold] === undefined) {\n return false;\n }\n if (limit === undefined) {\n return thresholds[threshold];\n }\n thresholds[threshold] = limit;\n if (threshold === 's') {\n thresholds.ss = limit - 1;\n }\n return true;\n }\n\n function humanize (withSuffix) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var locale = this.localeData();\n var output = relativeTime$1(this, !withSuffix, locale);\n\n if (withSuffix) {\n output = locale.pastFuture(+this, output);\n }\n\n return locale.postformat(output);\n }\n\n var abs$1 = Math.abs;\n\n function toISOString$1() {\n // for ISO strings we do not use the normal bubbling rules:\n // * milliseconds bubble up until they become hours\n // * days do not bubble at all\n // * months bubble up until they become years\n // This is because there is no context-free conversion between hours and days\n // (think of clock changes)\n // and also not between days and months (28-31 days per month)\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var seconds = abs$1(this._milliseconds) / 1000;\n var days = abs$1(this._days);\n var months = abs$1(this._months);\n var minutes, hours, years;\n\n // 3600 seconds -> 60 minutes -> 1 hour\n minutes = absFloor(seconds / 60);\n hours = absFloor(minutes / 60);\n seconds %= 60;\n minutes %= 60;\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n var Y = years;\n var M = months;\n var D = days;\n var h = hours;\n var m = minutes;\n var s = seconds;\n var total = this.asSeconds();\n\n if (!total) {\n // this is the same as C#'s (Noda) and python (isodate)...\n // but not other JS (goog.date)\n return 'P0D';\n }\n\n return (total < 0 ? '-' : '') +\n 'P' +\n (Y ? Y + 'Y' : '') +\n (M ? M + 'M' : '') +\n (D ? D + 'D' : '') +\n ((h || m || s) ? 'T' : '') +\n (h ? h + 'H' : '') +\n (m ? m + 'M' : '') +\n (s ? s + 'S' : '');\n }\n\n var proto$2 = Duration.prototype;\n\n proto$2.isValid = isValid$1;\n proto$2.abs = abs;\n proto$2.add = add$1;\n proto$2.subtract = subtract$1;\n proto$2.as = as;\n proto$2.asMilliseconds = asMilliseconds;\n proto$2.asSeconds = asSeconds;\n proto$2.asMinutes = asMinutes;\n proto$2.asHours = asHours;\n proto$2.asDays = asDays;\n proto$2.asWeeks = asWeeks;\n proto$2.asMonths = asMonths;\n proto$2.asYears = asYears;\n proto$2.valueOf = valueOf$1;\n proto$2._bubble = bubble;\n proto$2.get = get$2;\n proto$2.milliseconds = milliseconds;\n proto$2.seconds = seconds;\n proto$2.minutes = minutes;\n proto$2.hours = hours;\n proto$2.days = days;\n proto$2.weeks = weeks;\n proto$2.months = months;\n proto$2.years = years;\n proto$2.humanize = humanize;\n proto$2.toISOString = toISOString$1;\n proto$2.toString = toISOString$1;\n proto$2.toJSON = toISOString$1;\n proto$2.locale = locale;\n proto$2.localeData = localeData;\n\n// Deprecations\n proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n proto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\n addFormatToken('X', 0, 0, 'unix');\n addFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\n addRegexToken('x', matchSigned);\n addRegexToken('X', matchTimestamp);\n addParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input, 10) * 1000);\n });\n addParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n });\n\n// Side effect imports\n\n\n hooks.version = '2.18.1';\n\n setHookCallback(createLocal);\n\n hooks.fn = proto;\n hooks.min = min;\n hooks.max = max;\n hooks.now = now;\n hooks.utc = createUTC;\n hooks.unix = createUnix;\n hooks.months = listMonths;\n hooks.isDate = isDate;\n hooks.locale = getSetGlobalLocale;\n hooks.invalid = createInvalid;\n hooks.duration = createDuration;\n hooks.isMoment = isMoment;\n hooks.weekdays = listWeekdays;\n hooks.parseZone = createInZone;\n hooks.localeData = getLocale;\n hooks.isDuration = isDuration;\n hooks.monthsShort = listMonthsShort;\n hooks.weekdaysMin = listWeekdaysMin;\n hooks.defineLocale = defineLocale;\n hooks.updateLocale = updateLocale;\n hooks.locales = listLocales;\n hooks.weekdaysShort = listWeekdaysShort;\n hooks.normalizeUnits = normalizeUnits;\n hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n hooks.calendarFormat = getCalendarFormat;\n hooks.prototype = proto;\n\n return hooks;\n\n })));\n\n},{}],7:[function(require,module,exports){\n /**\n * @namespace Chart\n */\n var Chart = require(29)();\n\n Chart.helpers = require(45);\n\n// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\n require(27)(Chart);\n\n Chart.defaults = require(25);\n Chart.Element = require(26);\n Chart.elements = require(40);\n Chart.Interaction = require(28);\n Chart.platform = require(48);\n\n require(31)(Chart);\n require(22)(Chart);\n require(23)(Chart);\n require(24)(Chart);\n require(30)(Chart);\n require(33)(Chart);\n require(32)(Chart);\n require(35)(Chart);\n\n require(54)(Chart);\n require(52)(Chart);\n require(53)(Chart);\n require(55)(Chart);\n require(56)(Chart);\n require(57)(Chart);\n\n// Controllers must be loaded after elements\n// See Chart.core.datasetController.dataElementType\n require(15)(Chart);\n require(16)(Chart);\n require(17)(Chart);\n require(18)(Chart);\n require(19)(Chart);\n require(20)(Chart);\n require(21)(Chart);\n\n require(8)(Chart);\n require(9)(Chart);\n require(10)(Chart);\n require(11)(Chart);\n require(12)(Chart);\n require(13)(Chart);\n require(14)(Chart);\n\n// Loading built-it plugins\n var plugins = [];\n\n plugins.push(\n require(49)(Chart),\n require(50)(Chart),\n require(51)(Chart)\n );\n\n Chart.plugins.register(plugins);\n\n Chart.platform.initialize();\n\n module.exports = Chart;\n if (typeof window !== 'undefined') {\n window.Chart = Chart;\n }\n\n// DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\n * @namespace Chart.canvasHelpers\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n Chart.canvasHelpers = Chart.helpers.canvas;\n\n},{\"10\":10,\"11\":11,\"12\":12,\"13\":13,\"14\":14,\"15\":15,\"16\":16,\"17\":17,\"18\":18,\"19\":19,\"20\":20,\"21\":21,\"22\":22,\"23\":23,\"24\":24,\"25\":25,\"26\":26,\"27\":27,\"28\":28,\"29\":29,\"30\":30,\"31\":31,\"32\":32,\"33\":33,\"35\":35,\"40\":40,\"45\":45,\"48\":48,\"49\":49,\"50\":50,\"51\":51,\"52\":52,\"53\":53,\"54\":54,\"55\":55,\"56\":56,\"57\":57,\"8\":8,\"9\":9}],8:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Bar = function(context, config) {\n config.type = 'bar';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],9:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Bubble = function(context, config) {\n config.type = 'bubble';\n return new Chart(context, config);\n };\n\n };\n\n},{}],10:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Doughnut = function(context, config) {\n config.type = 'doughnut';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],11:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Line = function(context, config) {\n config.type = 'line';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],12:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.PolarArea = function(context, config) {\n config.type = 'polarArea';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],13:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Radar = function(context, config) {\n config.type = 'radar';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],14:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n Chart.Scatter = function(context, config) {\n config.type = 'scatter';\n return new Chart(context, config);\n };\n };\n\n},{}],15:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('bar', {\n hover: {\n mode: 'label'\n },\n\n scales: {\n xAxes: [{\n type: 'category',\n\n // Specific to Bar Controller\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n\n // offset settings\n offset: true,\n\n // grid line settings\n gridLines: {\n offsetGridLines: true\n }\n }],\n\n yAxes: [{\n type: 'linear'\n }]\n }\n });\n\n defaults._set('horizontalBar', {\n hover: {\n mode: 'index',\n axis: 'y'\n },\n\n scales: {\n xAxes: [{\n type: 'linear',\n position: 'bottom'\n }],\n\n yAxes: [{\n position: 'left',\n type: 'category',\n\n // Specific to Horizontal Bar Controller\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n\n // offset settings\n offset: true,\n\n // grid line settings\n gridLines: {\n offsetGridLines: true\n }\n }]\n },\n\n elements: {\n rectangle: {\n borderSkipped: 'left'\n }\n },\n\n tooltips: {\n callbacks: {\n title: function(item, data) {\n // Pick first xLabel for now\n var title = '';\n\n if (item.length > 0) {\n if (item[0].yLabel) {\n title = item[0].yLabel;\n } else if (data.labels.length > 0 && item[0].index < data.labels.length) {\n title = data.labels[item[0].index];\n }\n }\n\n return title;\n },\n\n label: function(item, data) {\n var datasetLabel = data.datasets[item.datasetIndex].label || '';\n return datasetLabel + ': ' + item.xLabel;\n }\n },\n mode: 'index',\n axis: 'y'\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.bar = Chart.DatasetController.extend({\n\n dataElementType: elements.Rectangle,\n\n initialize: function() {\n var me = this;\n var meta;\n\n Chart.DatasetController.prototype.initialize.apply(me, arguments);\n\n meta = me.getMeta();\n meta.stack = me.getDataset().stack;\n meta.bar = true;\n },\n\n update: function(reset) {\n var me = this;\n var rects = me.getMeta().data;\n var i, ilen;\n\n me._ruler = me.getRuler();\n\n for (i = 0, ilen = rects.length; i < ilen; ++i) {\n me.updateElement(rects[i], i, reset);\n }\n },\n\n updateElement: function(rectangle, index, reset) {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var dataset = me.getDataset();\n var custom = rectangle.custom || {};\n var rectangleOptions = chart.options.elements.rectangle;\n\n rectangle._xScale = me.getScaleForId(meta.xAxisID);\n rectangle._yScale = me.getScaleForId(meta.yAxisID);\n rectangle._datasetIndex = me.index;\n rectangle._index = index;\n\n rectangle._model = {\n datasetLabel: dataset.label,\n label: chart.data.labels[index],\n borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped,\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor),\n borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth)\n };\n\n me.updateElementGeometry(rectangle, index, reset);\n\n rectangle.pivot();\n },\n\n /**\n * @private\n */\n updateElementGeometry: function(rectangle, index, reset) {\n var me = this;\n var model = rectangle._model;\n var vscale = me.getValueScale();\n var base = vscale.getBasePixel();\n var horizontal = vscale.isHorizontal();\n var ruler = me._ruler || me.getRuler();\n var vpixels = me.calculateBarValuePixels(me.index, index);\n var ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n\n model.horizontal = horizontal;\n model.base = reset ? base : vpixels.base;\n model.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n model.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n model.height = horizontal ? ipixels.size : undefined;\n model.width = horizontal ? undefined : ipixels.size;\n },\n\n /**\n * @private\n */\n getValueScaleId: function() {\n return this.getMeta().yAxisID;\n },\n\n /**\n * @private\n */\n getIndexScaleId: function() {\n return this.getMeta().xAxisID;\n },\n\n /**\n * @private\n */\n getValueScale: function() {\n return this.getScaleForId(this.getValueScaleId());\n },\n\n /**\n * @private\n */\n getIndexScale: function() {\n return this.getScaleForId(this.getIndexScaleId());\n },\n\n /**\n * Returns the effective number of stacks based on groups and bar visibility.\n * @private\n */\n getStackCount: function(last) {\n var me = this;\n var chart = me.chart;\n var scale = me.getIndexScale();\n var stacked = scale.options.stacked;\n var ilen = last === undefined ? chart.data.datasets.length : last + 1;\n var stacks = [];\n var i, meta;\n\n for (i = 0; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n if (meta.bar && chart.isDatasetVisible(i) &&\n (stacked === false ||\n (stacked === true && stacks.indexOf(meta.stack) === -1) ||\n (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {\n stacks.push(meta.stack);\n }\n }\n\n return stacks.length;\n },\n\n /**\n * Returns the stack index for the given dataset based on groups and bar visibility.\n * @private\n */\n getStackIndex: function(datasetIndex) {\n return this.getStackCount(datasetIndex) - 1;\n },\n\n /**\n * @private\n */\n getRuler: function() {\n var me = this;\n var scale = me.getIndexScale();\n var stackCount = me.getStackCount();\n var datasetIndex = me.index;\n var pixels = [];\n var isHorizontal = scale.isHorizontal();\n var start = isHorizontal ? scale.left : scale.top;\n var end = start + (isHorizontal ? scale.width : scale.height);\n var i, ilen;\n\n for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n pixels.push(scale.getPixelForValue(null, i, datasetIndex));\n }\n\n return {\n pixels: pixels,\n start: start,\n end: end,\n stackCount: stackCount,\n scale: scale\n };\n },\n\n /**\n * Note: pixel values are not clamped to the scale area.\n * @private\n */\n calculateBarValuePixels: function(datasetIndex, index) {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var scale = me.getValueScale();\n var datasets = chart.data.datasets;\n var value = scale.getRightValue(datasets[datasetIndex].data[index]);\n var stacked = scale.options.stacked;\n var stack = meta.stack;\n var start = 0;\n var i, imeta, ivalue, base, head, size;\n\n if (stacked || (stacked === undefined && stack !== undefined)) {\n for (i = 0; i < datasetIndex; ++i) {\n imeta = chart.getDatasetMeta(i);\n\n if (imeta.bar &&\n imeta.stack === stack &&\n imeta.controller.getValueScaleId() === scale.id &&\n chart.isDatasetVisible(i)) {\n\n ivalue = scale.getRightValue(datasets[i].data[index]);\n if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {\n start += ivalue;\n }\n }\n }\n }\n\n base = scale.getPixelForValue(start);\n head = scale.getPixelForValue(start + value);\n size = (head - base) / 2;\n\n return {\n size: size,\n base: base,\n head: head,\n center: head + size / 2\n };\n },\n\n /**\n * @private\n */\n calculateBarIndexPixels: function(datasetIndex, index, ruler) {\n var me = this;\n var options = ruler.scale.options;\n var stackIndex = me.getStackIndex(datasetIndex);\n var pixels = ruler.pixels;\n var base = pixels[index];\n var length = pixels.length;\n var start = ruler.start;\n var end = ruler.end;\n var leftSampleSize, rightSampleSize, leftCategorySize, rightCategorySize, fullBarSize, size;\n\n if (length === 1) {\n leftSampleSize = base > start ? base - start : end - base;\n rightSampleSize = base < end ? end - base : base - start;\n } else {\n if (index > 0) {\n leftSampleSize = (base - pixels[index - 1]) / 2;\n if (index === length - 1) {\n rightSampleSize = leftSampleSize;\n }\n }\n if (index < length - 1) {\n rightSampleSize = (pixels[index + 1] - base) / 2;\n if (index === 0) {\n leftSampleSize = rightSampleSize;\n }\n }\n }\n\n leftCategorySize = leftSampleSize * options.categoryPercentage;\n rightCategorySize = rightSampleSize * options.categoryPercentage;\n fullBarSize = (leftCategorySize + rightCategorySize) / ruler.stackCount;\n size = fullBarSize * options.barPercentage;\n\n size = Math.min(\n helpers.valueOrDefault(options.barThickness, size),\n helpers.valueOrDefault(options.maxBarThickness, Infinity));\n\n base -= leftCategorySize;\n base += fullBarSize * stackIndex;\n base += (fullBarSize - size) / 2;\n\n return {\n size: size,\n base: base,\n head: base + size,\n center: base + size / 2\n };\n },\n\n draw: function() {\n var me = this;\n var chart = me.chart;\n var scale = me.getValueScale();\n var rects = me.getMeta().data;\n var dataset = me.getDataset();\n var ilen = rects.length;\n var i = 0;\n\n helpers.canvas.clipArea(chart.ctx, chart.chartArea);\n\n for (; i < ilen; ++i) {\n if (!isNaN(scale.getRightValue(dataset.data[i]))) {\n rects[i].draw();\n }\n }\n\n helpers.canvas.unclipArea(chart.ctx);\n },\n\n setHoverStyle: function(rectangle) {\n var dataset = this.chart.data.datasets[rectangle._datasetIndex];\n var index = rectangle._index;\n var custom = rectangle.custom || {};\n var model = rectangle._model;\n\n model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n },\n\n removeHoverStyle: function(rectangle) {\n var dataset = this.chart.data.datasets[rectangle._datasetIndex];\n var index = rectangle._index;\n var custom = rectangle.custom || {};\n var model = rectangle._model;\n var rectangleElementOptions = this.chart.options.elements.rectangle;\n\n model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor);\n model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor);\n model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth);\n }\n });\n\n Chart.controllers.horizontalBar = Chart.controllers.bar.extend({\n /**\n * @private\n */\n getValueScaleId: function() {\n return this.getMeta().xAxisID;\n },\n\n /**\n * @private\n */\n getIndexScaleId: function() {\n return this.getMeta().yAxisID;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],16:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('bubble', {\n hover: {\n mode: 'single'\n },\n\n scales: {\n xAxes: [{\n type: 'linear', // bubble should probably use a linear scale by default\n position: 'bottom',\n id: 'x-axis-0' // need an ID so datasets can reference the scale\n }],\n yAxes: [{\n type: 'linear',\n position: 'left',\n id: 'y-axis-0'\n }]\n },\n\n tooltips: {\n callbacks: {\n title: function() {\n // Title doesn't make sense for scatter since we format the data as a point\n return '';\n },\n label: function(item, data) {\n var datasetLabel = data.datasets[item.datasetIndex].label || '';\n var dataPoint = data.datasets[item.datasetIndex].data[item.index];\n return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n }\n }\n }\n });\n\n\n module.exports = function(Chart) {\n\n Chart.controllers.bubble = Chart.DatasetController.extend({\n /**\n * @protected\n */\n dataElementType: elements.Point,\n\n /**\n * @protected\n */\n update: function(reset) {\n var me = this;\n var meta = me.getMeta();\n var points = meta.data;\n\n // Update Points\n helpers.each(points, function(point, index) {\n me.updateElement(point, index, reset);\n });\n },\n\n /**\n * @protected\n */\n updateElement: function(point, index, reset) {\n var me = this;\n var meta = me.getMeta();\n var custom = point.custom || {};\n var xScale = me.getScaleForId(meta.xAxisID);\n var yScale = me.getScaleForId(meta.yAxisID);\n var options = me._resolveElementOptions(point, index);\n var data = me.getDataset().data[index];\n var dsIndex = me.index;\n\n var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);\n var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n\n point._xScale = xScale;\n point._yScale = yScale;\n point._options = options;\n point._datasetIndex = dsIndex;\n point._index = index;\n point._model = {\n backgroundColor: options.backgroundColor,\n borderColor: options.borderColor,\n borderWidth: options.borderWidth,\n hitRadius: options.hitRadius,\n pointStyle: options.pointStyle,\n radius: reset ? 0 : options.radius,\n skip: custom.skip || isNaN(x) || isNaN(y),\n x: x,\n y: y,\n };\n\n point.pivot();\n },\n\n /**\n * @protected\n */\n setHoverStyle: function(point) {\n var model = point._model;\n var options = point._options;\n\n model.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor));\n model.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor));\n model.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n model.radius = options.radius + options.hoverRadius;\n },\n\n /**\n * @protected\n */\n removeHoverStyle: function(point) {\n var model = point._model;\n var options = point._options;\n\n model.backgroundColor = options.backgroundColor;\n model.borderColor = options.borderColor;\n model.borderWidth = options.borderWidth;\n model.radius = options.radius;\n },\n\n /**\n * @private\n */\n _resolveElementOptions: function(point, index) {\n var me = this;\n var chart = me.chart;\n var datasets = chart.data.datasets;\n var dataset = datasets[me.index];\n var custom = point.custom || {};\n var options = chart.options.elements.point;\n var resolve = helpers.options.resolve;\n var data = dataset.data[index];\n var values = {};\n var i, ilen, key;\n\n // Scriptable options\n var context = {\n chart: chart,\n dataIndex: index,\n dataset: dataset,\n datasetIndex: me.index\n };\n\n var keys = [\n 'backgroundColor',\n 'borderColor',\n 'borderWidth',\n 'hoverBackgroundColor',\n 'hoverBorderColor',\n 'hoverBorderWidth',\n 'hoverRadius',\n 'hitRadius',\n 'pointStyle'\n ];\n\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n values[key] = resolve([\n custom[key],\n dataset[key],\n options[key]\n ], context, index);\n }\n\n // Custom radius resolution\n values.radius = resolve([\n custom.radius,\n data ? data.r : undefined,\n dataset.radius,\n options.radius\n ], context, index);\n\n return values;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],17:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('doughnut', {\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n hover: {\n mode: 'single'\n },\n legendCallback: function(chart) {\n var text = [];\n text.push('
            ');\n\n var data = chart.data;\n var datasets = data.datasets;\n var labels = data.labels;\n\n if (datasets.length) {\n for (var i = 0; i < datasets[0].data.length; ++i) {\n text.push('
          • ');\n if (labels[i]) {\n text.push(labels[i]);\n }\n text.push('
          • ');\n }\n }\n\n text.push('
          ');\n return text.join('');\n },\n legend: {\n labels: {\n generateLabels: function(chart) {\n var data = chart.data;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map(function(label, i) {\n var meta = chart.getDatasetMeta(0);\n var ds = data.datasets[0];\n var arc = meta.data[i];\n var custom = arc && arc.custom || {};\n var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n var arcOpts = chart.options.elements.arc;\n var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n return {\n text: label,\n fillStyle: fill,\n strokeStyle: stroke,\n lineWidth: bw,\n hidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick: function(e, legendItem) {\n var index = legendItem.index;\n var chart = this.chart;\n var i, ilen, meta;\n\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n // toggle visibility of index if exists\n if (meta.data[index]) {\n meta.data[index].hidden = !meta.data[index].hidden;\n }\n }\n\n chart.update();\n }\n },\n\n // The percentage of the chart that we cut out of the middle.\n cutoutPercentage: 50,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: Math.PI * -0.5,\n\n // The total circumference of the chart.\n circumference: Math.PI * 2.0,\n\n // Need to override these to give a nice default\n tooltips: {\n callbacks: {\n title: function() {\n return '';\n },\n label: function(tooltipItem, data) {\n var dataLabel = data.labels[tooltipItem.index];\n var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n if (helpers.isArray(dataLabel)) {\n // show value on first line of multiline label\n // need to clone because we are changing the value\n dataLabel = dataLabel.slice();\n dataLabel[0] += value;\n } else {\n dataLabel += value;\n }\n\n return dataLabel;\n }\n }\n }\n });\n\n defaults._set('pie', helpers.clone(defaults.doughnut));\n defaults._set('pie', {\n cutoutPercentage: 0\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n dataElementType: elements.Arc,\n\n linkScales: helpers.noop,\n\n // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n getRingIndex: function(datasetIndex) {\n var ringIndex = 0;\n\n for (var j = 0; j < datasetIndex; ++j) {\n if (this.chart.isDatasetVisible(j)) {\n ++ringIndex;\n }\n }\n\n return ringIndex;\n },\n\n update: function(reset) {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var opts = chart.options;\n var arcOpts = opts.elements.arc;\n var availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth;\n var availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth;\n var minSize = Math.min(availableWidth, availableHeight);\n var offset = {x: 0, y: 0};\n var meta = me.getMeta();\n var cutoutPercentage = opts.cutoutPercentage;\n var circumference = opts.circumference;\n\n // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n if (circumference < Math.PI * 2.0) {\n var startAngle = opts.rotation % (Math.PI * 2.0);\n startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n var endAngle = startAngle + circumference;\n var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};\n var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};\n var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);\n var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);\n var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);\n var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);\n var cutout = cutoutPercentage / 100.0;\n var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};\n var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};\n var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};\n minSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};\n }\n\n chart.borderWidth = me.getMaxBorderWidth(meta.data);\n chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);\n chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n chart.offsetX = offset.x * chart.outerRadius;\n chart.offsetY = offset.y * chart.outerRadius;\n\n meta.total = me.calculateTotal();\n\n me.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\n me.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n helpers.each(meta.data, function(arc, index) {\n me.updateElement(arc, index, reset);\n });\n },\n\n updateElement: function(arc, index, reset) {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var opts = chart.options;\n var animationOpts = opts.animation;\n var centerX = (chartArea.left + chartArea.right) / 2;\n var centerY = (chartArea.top + chartArea.bottom) / 2;\n var startAngle = opts.rotation; // non reset case handled later\n var endAngle = opts.rotation; // non reset case handled later\n var dataset = me.getDataset();\n var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));\n var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n helpers.extend(arc, {\n // Utility\n _datasetIndex: me.index,\n _index: index,\n\n // Desired view properties\n _model: {\n x: centerX + chart.offsetX,\n y: centerY + chart.offsetY,\n startAngle: startAngle,\n endAngle: endAngle,\n circumference: circumference,\n outerRadius: outerRadius,\n innerRadius: innerRadius,\n label: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n }\n });\n\n var model = arc._model;\n // Resets the visual styles\n this.removeHoverStyle(arc);\n\n // Set correct angles if not resetting\n if (!reset || !animationOpts.animateRotate) {\n if (index === 0) {\n model.startAngle = opts.rotation;\n } else {\n model.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n }\n\n model.endAngle = model.startAngle + model.circumference;\n }\n\n arc.pivot();\n },\n\n removeHoverStyle: function(arc) {\n Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n },\n\n calculateTotal: function() {\n var dataset = this.getDataset();\n var meta = this.getMeta();\n var total = 0;\n var value;\n\n helpers.each(meta.data, function(element, index) {\n value = dataset.data[index];\n if (!isNaN(value) && !element.hidden) {\n total += Math.abs(value);\n }\n });\n\n\t\t\t\t/* if (total === 0) {\n\t\t\t\t total = NaN;\n\t\t\t\t }*/\n\n return total;\n },\n\n calculateCircumference: function(value) {\n var total = this.getMeta().total;\n if (total > 0 && !isNaN(value)) {\n return (Math.PI * 2.0) * (value / total);\n }\n return 0;\n },\n\n // gets the max border or hover width to properly scale pie charts\n getMaxBorderWidth: function(arcs) {\n var max = 0;\n var index = this.index;\n var length = arcs.length;\n var borderWidth;\n var hoverWidth;\n\n for (var i = 0; i < length; i++) {\n borderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0;\n hoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n max = borderWidth > max ? borderWidth : max;\n max = hoverWidth > max ? hoverWidth : max;\n }\n return max;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],18:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('line', {\n showLines: true,\n spanGaps: false,\n\n hover: {\n mode: 'label'\n },\n\n scales: {\n xAxes: [{\n type: 'category',\n id: 'x-axis-0'\n }],\n yAxes: [{\n type: 'linear',\n id: 'y-axis-0'\n }]\n }\n });\n\n module.exports = function(Chart) {\n\n function lineEnabled(dataset, options) {\n return helpers.valueOrDefault(dataset.showLine, options.showLines);\n }\n\n Chart.controllers.line = Chart.DatasetController.extend({\n\n datasetElementType: elements.Line,\n\n dataElementType: elements.Point,\n\n update: function(reset) {\n var me = this;\n var meta = me.getMeta();\n var line = meta.dataset;\n var points = meta.data || [];\n var options = me.chart.options;\n var lineElementOptions = options.elements.line;\n var scale = me.getScaleForId(meta.yAxisID);\n var i, ilen, custom;\n var dataset = me.getDataset();\n var showLine = lineEnabled(dataset, options);\n\n // Update Line\n if (showLine) {\n custom = line.custom || {};\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n dataset.lineTension = dataset.tension;\n }\n\n // Utility\n line._scale = scale;\n line._datasetIndex = me.index;\n // Data\n line._children = points;\n // Model\n line._model = {\n // Appearance\n // The default behavior of lines is to break at null values, according\n // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n // This option gives lines the ability to span gaps\n spanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n steppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n cubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode),\n };\n\n line.pivot();\n }\n\n // Update Points\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n me.updateElement(points[i], i, reset);\n }\n\n if (showLine && line._model.tension !== 0) {\n me.updateBezierControlPoints();\n }\n\n // Now pivot the point for animation\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n points[i].pivot();\n }\n },\n\n getPointBackgroundColor: function(point, index) {\n var backgroundColor = this.chart.options.elements.point.backgroundColor;\n var dataset = this.getDataset();\n var custom = point.custom || {};\n\n if (custom.backgroundColor) {\n backgroundColor = custom.backgroundColor;\n } else if (dataset.pointBackgroundColor) {\n backgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n } else if (dataset.backgroundColor) {\n backgroundColor = dataset.backgroundColor;\n }\n\n return backgroundColor;\n },\n\n getPointBorderColor: function(point, index) {\n var borderColor = this.chart.options.elements.point.borderColor;\n var dataset = this.getDataset();\n var custom = point.custom || {};\n\n if (custom.borderColor) {\n borderColor = custom.borderColor;\n } else if (dataset.pointBorderColor) {\n borderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n } else if (dataset.borderColor) {\n borderColor = dataset.borderColor;\n }\n\n return borderColor;\n },\n\n getPointBorderWidth: function(point, index) {\n var borderWidth = this.chart.options.elements.point.borderWidth;\n var dataset = this.getDataset();\n var custom = point.custom || {};\n\n if (!isNaN(custom.borderWidth)) {\n borderWidth = custom.borderWidth;\n } else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) {\n borderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n } else if (!isNaN(dataset.borderWidth)) {\n borderWidth = dataset.borderWidth;\n }\n\n return borderWidth;\n },\n\n updateElement: function(point, index, reset) {\n var me = this;\n var meta = me.getMeta();\n var custom = point.custom || {};\n var dataset = me.getDataset();\n var datasetIndex = me.index;\n var value = dataset.data[index];\n var yScale = me.getScaleForId(meta.yAxisID);\n var xScale = me.getScaleForId(meta.xAxisID);\n var pointOptions = me.chart.options.elements.point;\n var x, y;\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n dataset.pointRadius = dataset.radius;\n }\n if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n dataset.pointHitRadius = dataset.hitRadius;\n }\n\n x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);\n y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n // Utility\n point._xScale = xScale;\n point._yScale = yScale;\n point._datasetIndex = datasetIndex;\n point._index = index;\n\n // Desired view properties\n point._model = {\n x: x,\n y: y,\n skip: custom.skip || isNaN(x) || isNaN(y),\n // Appearance\n radius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n pointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n backgroundColor: me.getPointBackgroundColor(point, index),\n borderColor: me.getPointBorderColor(point, index),\n borderWidth: me.getPointBorderWidth(point, index),\n tension: meta.dataset._model ? meta.dataset._model.tension : 0,\n steppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n // Tooltip\n hitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n };\n },\n\n calculatePointY: function(value, index, datasetIndex) {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var yScale = me.getScaleForId(meta.yAxisID);\n var sumPos = 0;\n var sumNeg = 0;\n var i, ds, dsMeta;\n\n if (yScale.options.stacked) {\n for (i = 0; i < datasetIndex; i++) {\n ds = chart.data.datasets[i];\n dsMeta = chart.getDatasetMeta(i);\n if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n var stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n if (stackedRightValue < 0) {\n sumNeg += stackedRightValue || 0;\n } else {\n sumPos += stackedRightValue || 0;\n }\n }\n }\n\n var rightValue = Number(yScale.getRightValue(value));\n if (rightValue < 0) {\n return yScale.getPixelForValue(sumNeg + rightValue);\n }\n return yScale.getPixelForValue(sumPos + rightValue);\n }\n\n return yScale.getPixelForValue(value);\n },\n\n updateBezierControlPoints: function() {\n var me = this;\n var meta = me.getMeta();\n var area = me.chart.chartArea;\n var points = (meta.data || []);\n var i, ilen, point, model, controlPoints;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (meta.dataset._model.spanGaps) {\n points = points.filter(function(pt) {\n return !pt._model.skip;\n });\n }\n\n function capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n }\n\n if (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n helpers.splineCurveMonotone(points);\n } else {\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n model = point._model;\n controlPoints = helpers.splineCurve(\n helpers.previousItem(points, i)._model,\n model,\n helpers.nextItem(points, i)._model,\n meta.dataset._model.tension\n );\n model.controlPointPreviousX = controlPoints.previous.x;\n model.controlPointPreviousY = controlPoints.previous.y;\n model.controlPointNextX = controlPoints.next.x;\n model.controlPointNextY = controlPoints.next.y;\n }\n }\n\n if (me.chart.options.elements.line.capBezierPoints) {\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n model = points[i]._model;\n model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n }\n }\n },\n\n draw: function() {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var points = meta.data || [];\n var area = chart.chartArea;\n var ilen = points.length;\n var i = 0;\n\n helpers.canvas.clipArea(chart.ctx, area);\n\n if (lineEnabled(me.getDataset(), chart.options)) {\n meta.dataset.draw();\n }\n\n helpers.canvas.unclipArea(chart.ctx);\n\n // Draw the points\n for (; i < ilen; ++i) {\n points[i].draw(area);\n }\n },\n\n setHoverStyle: function(point) {\n // Point\n var dataset = this.chart.data.datasets[point._datasetIndex];\n var index = point._index;\n var custom = point.custom || {};\n var model = point._model;\n\n model.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n model.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n },\n\n removeHoverStyle: function(point) {\n var me = this;\n var dataset = me.chart.data.datasets[point._datasetIndex];\n var index = point._index;\n var custom = point.custom || {};\n var model = point._model;\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n dataset.pointRadius = dataset.radius;\n }\n\n model.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius);\n model.backgroundColor = me.getPointBackgroundColor(point, index);\n model.borderColor = me.getPointBorderColor(point, index);\n model.borderWidth = me.getPointBorderWidth(point, index);\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],19:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('polarArea', {\n scale: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n gridLines: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n ticks: {\n beginAtZero: true\n }\n },\n\n // Boolean - Whether to animate the rotation of the chart\n animation: {\n animateRotate: true,\n animateScale: true\n },\n\n startAngle: -0.5 * Math.PI,\n legendCallback: function(chart) {\n var text = [];\n text.push('
            ');\n\n var data = chart.data;\n var datasets = data.datasets;\n var labels = data.labels;\n\n if (datasets.length) {\n for (var i = 0; i < datasets[0].data.length; ++i) {\n text.push('
          • ');\n if (labels[i]) {\n text.push(labels[i]);\n }\n text.push('
          • ');\n }\n }\n\n text.push('
          ');\n return text.join('');\n },\n legend: {\n labels: {\n generateLabels: function(chart) {\n var data = chart.data;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map(function(label, i) {\n var meta = chart.getDatasetMeta(0);\n var ds = data.datasets[0];\n var arc = meta.data[i];\n var custom = arc.custom || {};\n var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n var arcOpts = chart.options.elements.arc;\n var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n return {\n text: label,\n fillStyle: fill,\n strokeStyle: stroke,\n lineWidth: bw,\n hidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick: function(e, legendItem) {\n var index = legendItem.index;\n var chart = this.chart;\n var i, ilen, meta;\n\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n meta.data[index].hidden = !meta.data[index].hidden;\n }\n\n chart.update();\n }\n },\n\n // Need to override these to give a nice default\n tooltips: {\n callbacks: {\n title: function() {\n return '';\n },\n label: function(item, data) {\n return data.labels[item.index] + ': ' + item.yLabel;\n }\n }\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.polarArea = Chart.DatasetController.extend({\n\n dataElementType: elements.Arc,\n\n linkScales: helpers.noop,\n\n update: function(reset) {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var meta = me.getMeta();\n var opts = chart.options;\n var arcOpts = opts.elements.arc;\n var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n chart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n me.innerRadius = me.outerRadius - chart.radiusLength;\n\n meta.count = me.countVisibleElements();\n\n helpers.each(meta.data, function(arc, index) {\n me.updateElement(arc, index, reset);\n });\n },\n\n updateElement: function(arc, index, reset) {\n var me = this;\n var chart = me.chart;\n var dataset = me.getDataset();\n var opts = chart.options;\n var animationOpts = opts.animation;\n var scale = chart.scale;\n var labels = chart.data.labels;\n\n var circumference = me.calculateCircumference(dataset.data[index]);\n var centerX = scale.xCenter;\n var centerY = scale.yCenter;\n\n // If there is NaN data before us, we need to calculate the starting angle correctly.\n // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\n var visibleCount = 0;\n var meta = me.getMeta();\n for (var i = 0; i < index; ++i) {\n if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\n ++visibleCount;\n }\n }\n\n // var negHalfPI = -0.5 * Math.PI;\n var datasetStartAngle = opts.startAngle;\n var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n var startAngle = datasetStartAngle + (circumference * visibleCount);\n var endAngle = startAngle + (arc.hidden ? 0 : circumference);\n\n var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n helpers.extend(arc, {\n // Utility\n _datasetIndex: me.index,\n _index: index,\n _scale: scale,\n\n // Desired view properties\n _model: {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius: reset ? resetRadius : distance,\n startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n label: helpers.valueAtIndexOrDefault(labels, index, labels[index])\n }\n });\n\n // Apply border and fill style\n me.removeHoverStyle(arc);\n\n arc.pivot();\n },\n\n removeHoverStyle: function(arc) {\n Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n },\n\n countVisibleElements: function() {\n var dataset = this.getDataset();\n var meta = this.getMeta();\n var count = 0;\n\n helpers.each(meta.data, function(element, index) {\n if (!isNaN(dataset.data[index]) && !element.hidden) {\n count++;\n }\n });\n\n return count;\n },\n\n calculateCircumference: function(value) {\n var count = this.getMeta().count;\n if (count > 0 && !isNaN(value)) {\n return (2 * Math.PI) / count;\n }\n return 0;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],20:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('radar', {\n scale: {\n type: 'radialLinear'\n },\n elements: {\n line: {\n tension: 0 // no bezier in radar\n }\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.radar = Chart.DatasetController.extend({\n\n datasetElementType: elements.Line,\n\n dataElementType: elements.Point,\n\n linkScales: helpers.noop,\n\n update: function(reset) {\n var me = this;\n var meta = me.getMeta();\n var line = meta.dataset;\n var points = meta.data;\n var custom = line.custom || {};\n var dataset = me.getDataset();\n var lineElementOptions = me.chart.options.elements.line;\n var scale = me.chart.scale;\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n dataset.lineTension = dataset.tension;\n }\n\n helpers.extend(meta.dataset, {\n // Utility\n _datasetIndex: me.index,\n _scale: scale,\n // Data\n _children: points,\n _loop: true,\n // Model\n _model: {\n // Appearance\n tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n }\n });\n\n meta.dataset.pivot();\n\n // Update Points\n helpers.each(points, function(point, index) {\n me.updateElement(point, index, reset);\n }, me);\n\n // Update bezier control points\n me.updateBezierControlPoints();\n },\n updateElement: function(point, index, reset) {\n var me = this;\n var custom = point.custom || {};\n var dataset = me.getDataset();\n var scale = me.chart.scale;\n var pointElementOptions = me.chart.options.elements.point;\n var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n dataset.pointRadius = dataset.radius;\n }\n if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n dataset.pointHitRadius = dataset.hitRadius;\n }\n\n helpers.extend(point, {\n // Utility\n _datasetIndex: me.index,\n _index: index,\n _scale: scale,\n\n // Desired view properties\n _model: {\n x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n y: reset ? scale.yCenter : pointPosition.y,\n\n // Appearance\n tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n radius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n pointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\n // Tooltip\n hitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius)\n }\n });\n\n point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));\n },\n updateBezierControlPoints: function() {\n var chartArea = this.chart.chartArea;\n var meta = this.getMeta();\n\n helpers.each(meta.data, function(point, index) {\n var model = point._model;\n var controlPoints = helpers.splineCurve(\n helpers.previousItem(meta.data, index, true)._model,\n model,\n helpers.nextItem(meta.data, index, true)._model,\n model.tension\n );\n\n // Prevent the bezier going outside of the bounds of the graph\n model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n // Now pivot the point for animation\n point.pivot();\n });\n },\n\n setHoverStyle: function(point) {\n // Point\n var dataset = this.chart.data.datasets[point._datasetIndex];\n var custom = point.custom || {};\n var index = point._index;\n var model = point._model;\n\n model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n },\n\n removeHoverStyle: function(point) {\n var dataset = this.chart.data.datasets[point._datasetIndex];\n var custom = point.custom || {};\n var index = point._index;\n var model = point._model;\n var pointElementOptions = this.chart.options.elements.point;\n\n model.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius);\n model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);\n model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);\n model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],21:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n\n defaults._set('scatter', {\n hover: {\n mode: 'single'\n },\n\n scales: {\n xAxes: [{\n id: 'x-axis-1', // need an ID so datasets can reference the scale\n type: 'linear', // scatter should not use a category axis\n position: 'bottom'\n }],\n yAxes: [{\n id: 'y-axis-1',\n type: 'linear',\n position: 'left'\n }]\n },\n\n showLines: false,\n\n tooltips: {\n callbacks: {\n title: function() {\n return ''; // doesn't make sense for scatter since data are formatted as a point\n },\n label: function(item) {\n return '(' + item.xLabel + ', ' + item.yLabel + ')';\n }\n }\n }\n });\n\n module.exports = function(Chart) {\n\n // Scatter charts use line controllers\n Chart.controllers.scatter = Chart.controllers.line;\n\n };\n\n},{\"25\":25}],22:[function(require,module,exports){\n\t/* global window: false */\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n animation: {\n duration: 1000,\n easing: 'easeOutQuart',\n onProgress: helpers.noop,\n onComplete: helpers.noop\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.Animation = Element.extend({\n chart: null, // the animation associated chart instance\n currentStep: 0, // the current animation step\n numSteps: 60, // default number of steps\n easing: '', // the easing to use for this animation\n render: null, // render function used by the animation service\n\n onAnimationProgress: null, // user specified callback to fire on each step of the animation\n onAnimationComplete: null, // user specified callback to fire when the animation finishes\n });\n\n Chart.animationService = {\n frameDuration: 17,\n animations: [],\n dropFrames: 0,\n request: null,\n\n /**\n * @param {Chart} chart - The chart to animate.\n * @param {Chart.Animation} animation - The animation that we will animate.\n * @param {Number} duration - The animation duration in ms.\n * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n */\n addAnimation: function(chart, animation, duration, lazy) {\n var animations = this.animations;\n var i, ilen;\n\n animation.chart = chart;\n\n if (!lazy) {\n chart.animating = true;\n }\n\n for (i = 0, ilen = animations.length; i < ilen; ++i) {\n if (animations[i].chart === chart) {\n animations[i] = animation;\n return;\n }\n }\n\n animations.push(animation);\n\n // If there are no animations queued, manually kickstart a digest, for lack of a better word\n if (animations.length === 1) {\n this.requestAnimationFrame();\n }\n },\n\n cancelAnimation: function(chart) {\n var index = helpers.findIndex(this.animations, function(animation) {\n return animation.chart === chart;\n });\n\n if (index !== -1) {\n this.animations.splice(index, 1);\n chart.animating = false;\n }\n },\n\n requestAnimationFrame: function() {\n var me = this;\n if (me.request === null) {\n // Skip animation frame requests until the active one is executed.\n // This can happen when processing mouse events, e.g. 'mousemove'\n // and 'mouseout' events will trigger multiple renders.\n me.request = helpers.requestAnimFrame.call(window, function() {\n me.request = null;\n me.startDigest();\n });\n }\n },\n\n /**\n * @private\n */\n startDigest: function() {\n var me = this;\n var startTime = Date.now();\n var framesToDrop = 0;\n\n if (me.dropFrames > 1) {\n framesToDrop = Math.floor(me.dropFrames);\n me.dropFrames = me.dropFrames % 1;\n }\n\n me.advance(1 + framesToDrop);\n\n var endTime = Date.now();\n\n me.dropFrames += (endTime - startTime) / me.frameDuration;\n\n // Do we have more stuff to animate?\n if (me.animations.length > 0) {\n me.requestAnimationFrame();\n }\n },\n\n /**\n * @private\n */\n advance: function(count) {\n var animations = this.animations;\n var animation, chart;\n var i = 0;\n\n while (i < animations.length) {\n animation = animations[i];\n chart = animation.chart;\n\n animation.currentStep = (animation.currentStep || 0) + count;\n animation.currentStep = Math.min(animation.currentStep, animation.numSteps);\n\n helpers.callback(animation.render, [chart, animation], chart);\n helpers.callback(animation.onAnimationProgress, [animation], chart);\n\n if (animation.currentStep >= animation.numSteps) {\n helpers.callback(animation.onAnimationComplete, [animation], chart);\n chart.animating = false;\n animations.splice(i, 1);\n } else {\n ++i;\n }\n }\n }\n };\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 */\n Object.defineProperty(Chart.Animation.prototype, 'animationObject', {\n get: function() {\n return this;\n }\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 */\n Object.defineProperty(Chart.Animation.prototype, 'chartInstance', {\n get: function() {\n return this.chart;\n },\n set: function(value) {\n this.chart = value;\n }\n });\n\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],23:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n var Interaction = require(28);\n var platform = require(48);\n\n module.exports = function(Chart) {\n var plugins = Chart.plugins;\n\n // Create a dictionary of chart types, to allow for extension of existing types\n Chart.types = {};\n\n // Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n // Destroy method on the chart will remove the instance of the chart from this reference.\n Chart.instances = {};\n\n // Controllers available for dataset visualization eg. bar, line, slice, etc.\n Chart.controllers = {};\n\n /**\n * Initializes the given config with global and chart default values.\n */\n function initConfig(config) {\n config = config || {};\n\n // Do NOT use configMerge() for the data object because this method merges arrays\n // and so would change references to labels and datasets, preventing data updates.\n var data = config.data = config.data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n\n config.options = helpers.configMerge(\n defaults.global,\n defaults[config.type],\n config.options || {});\n\n return config;\n }\n\n /**\n * Updates the config of the chart\n * @param chart {Chart} chart to update the options for\n */\n function updateConfig(chart) {\n var newOptions = chart.options;\n\n // Update Scale(s) with options\n if (newOptions.scale) {\n chart.scale.options = newOptions.scale;\n } else if (newOptions.scales) {\n newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) {\n chart.scales[scaleOptions.id].options = scaleOptions;\n });\n }\n\n // Tooltip\n chart.tooltip._options = newOptions.tooltips;\n }\n\n function positionIsHorizontal(position) {\n return position === 'top' || position === 'bottom';\n }\n\n helpers.extend(Chart.prototype, /** @lends Chart */ {\n /**\n * @private\n */\n construct: function(item, config) {\n var me = this;\n\n config = initConfig(config);\n\n var context = platform.acquireContext(item, config);\n var canvas = context && context.canvas;\n var height = canvas && canvas.height;\n var width = canvas && canvas.width;\n\n me.id = helpers.uid();\n me.ctx = context;\n me.canvas = canvas;\n me.config = config;\n me.width = width;\n me.height = height;\n me.aspectRatio = height ? width / height : null;\n me.options = config.options;\n me._bufferedRender = false;\n\n /**\n * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n * the \"instance\" still need to be defined since it might be called from plugins.\n * @prop Chart#chart\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n me.chart = me;\n me.controller = me; // chart.chart.controller #inception\n\n // Add the chart instance to the global namespace\n Chart.instances[me.id] = me;\n\n // Define alias to the config data: `chart.data === chart.config.data`\n Object.defineProperty(me, 'data', {\n get: function() {\n return me.config.data;\n },\n set: function(value) {\n me.config.data = value;\n }\n });\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n me.initialize();\n me.update();\n },\n\n /**\n * @private\n */\n initialize: function() {\n var me = this;\n\n // Before init plugin notification\n plugins.notify(me, 'beforeInit');\n\n helpers.retinaScale(me, me.options.devicePixelRatio);\n\n me.bindEvents();\n\n if (me.options.responsive) {\n // Initial resize before chart draws (must be silent to preserve initial animations).\n me.resize(true);\n }\n\n // Make sure scales have IDs and are built before we build any controllers.\n me.ensureScalesHaveIDs();\n me.buildScales();\n me.initToolTip();\n\n // After init plugin notification\n plugins.notify(me, 'afterInit');\n\n return me;\n },\n\n clear: function() {\n helpers.canvas.clear(this);\n return this;\n },\n\n stop: function() {\n // Stops any current animation loop occurring\n Chart.animationService.cancelAnimation(this);\n return this;\n },\n\n resize: function(silent) {\n var me = this;\n var options = me.options;\n var canvas = me.canvas;\n var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;\n\n // the canvas render width and height will be casted to integers so make sure that\n // the canvas display style uses the same integer values to avoid blurring effect.\n\n // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased\n var newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas)));\n var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas)));\n\n if (me.width === newWidth && me.height === newHeight) {\n return;\n }\n\n canvas.width = me.width = newWidth;\n canvas.height = me.height = newHeight;\n canvas.style.width = newWidth + 'px';\n canvas.style.height = newHeight + 'px';\n\n helpers.retinaScale(me, options.devicePixelRatio);\n\n if (!silent) {\n // Notify any plugins about the resize\n var newSize = {width: newWidth, height: newHeight};\n plugins.notify(me, 'resize', [newSize]);\n\n // Notify of resize\n if (me.options.onResize) {\n me.options.onResize(me, newSize);\n }\n\n me.stop();\n me.update(me.options.responsiveAnimationDuration);\n }\n },\n\n ensureScalesHaveIDs: function() {\n var options = this.options;\n var scalesOptions = options.scales || {};\n var scaleOptions = options.scale;\n\n helpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {\n xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);\n });\n\n helpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {\n yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);\n });\n\n if (scaleOptions) {\n scaleOptions.id = scaleOptions.id || 'scale';\n }\n },\n\n /**\n * Builds a map of scale ID to scale object for future lookup.\n */\n buildScales: function() {\n var me = this;\n var options = me.options;\n var scales = me.scales = {};\n var items = [];\n\n if (options.scales) {\n items = items.concat(\n (options.scales.xAxes || []).map(function(xAxisOptions) {\n return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};\n }),\n (options.scales.yAxes || []).map(function(yAxisOptions) {\n return {options: yAxisOptions, dtype: 'linear', dposition: 'left'};\n })\n );\n }\n\n if (options.scale) {\n items.push({\n options: options.scale,\n dtype: 'radialLinear',\n isDefault: true,\n dposition: 'chartArea'\n });\n }\n\n helpers.each(items, function(item) {\n var scaleOptions = item.options;\n var scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype);\n var scaleClass = Chart.scaleService.getScaleConstructor(scaleType);\n if (!scaleClass) {\n return;\n }\n\n if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n var scale = new scaleClass({\n id: scaleOptions.id,\n options: scaleOptions,\n ctx: me.ctx,\n chart: me\n });\n\n scales[scale.id] = scale;\n scale.mergeTicksOptions();\n\n // TODO(SB): I think we should be able to remove this custom case (options.scale)\n // and consider it as a regular scale part of the \"scales\"\" map only! This would\n // make the logic easier and remove some useless? custom code.\n if (item.isDefault) {\n me.scale = scale;\n }\n });\n\n Chart.scaleService.addScalesToLayout(this);\n },\n\n buildOrUpdateControllers: function() {\n var me = this;\n var types = [];\n var newControllers = [];\n\n helpers.each(me.data.datasets, function(dataset, datasetIndex) {\n var meta = me.getDatasetMeta(datasetIndex);\n var type = dataset.type || me.config.type;\n\n if (meta.type && meta.type !== type) {\n me.destroyDatasetMeta(datasetIndex);\n meta = me.getDatasetMeta(datasetIndex);\n }\n meta.type = type;\n\n types.push(meta.type);\n\n if (meta.controller) {\n meta.controller.updateIndex(datasetIndex);\n } else {\n var ControllerClass = Chart.controllers[meta.type];\n if (ControllerClass === undefined) {\n throw new Error('\"' + meta.type + '\" is not a chart type.');\n }\n\n meta.controller = new ControllerClass(me, datasetIndex);\n newControllers.push(meta.controller);\n }\n }, me);\n\n return newControllers;\n },\n\n /**\n * Reset the elements of all datasets\n * @private\n */\n resetElements: function() {\n var me = this;\n helpers.each(me.data.datasets, function(dataset, datasetIndex) {\n me.getDatasetMeta(datasetIndex).controller.reset();\n }, me);\n },\n\n /**\n * Resets the chart back to it's state before the initial animation\n */\n reset: function() {\n this.resetElements();\n this.tooltip.initialize();\n },\n\n update: function(config) {\n var me = this;\n\n if (!config || typeof config !== 'object') {\n // backwards compatibility\n config = {\n duration: config,\n lazy: arguments[1]\n };\n }\n\n updateConfig(me);\n\n if (plugins.notify(me, 'beforeUpdate') === false) {\n return;\n }\n\n // In case the entire data object changed\n me.tooltip._data = me.data;\n\n // Make sure dataset controllers are updated and new controllers are reset\n var newControllers = me.buildOrUpdateControllers();\n\n // Make sure all dataset controllers have correct meta data counts\n helpers.each(me.data.datasets, function(dataset, datasetIndex) {\n me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n }, me);\n\n me.updateLayout();\n\n // Can only reset the new controllers after the scales have been updated\n helpers.each(newControllers, function(controller) {\n controller.reset();\n });\n\n me.updateDatasets();\n\n // Do this before render so that any plugins that need final scale updates can use it\n plugins.notify(me, 'afterUpdate');\n\n if (me._bufferedRender) {\n me._bufferedRequest = {\n duration: config.duration,\n easing: config.easing,\n lazy: config.lazy\n };\n } else {\n me.render(config);\n }\n },\n\n /**\n * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n * hook, in which case, plugins will not be called on `afterLayout`.\n * @private\n */\n updateLayout: function() {\n var me = this;\n\n if (plugins.notify(me, 'beforeLayout') === false) {\n return;\n }\n\n Chart.layoutService.update(this, this.width, this.height);\n\n /**\n * Provided for backward compatibility, use `afterLayout` instead.\n * @method IPlugin#afterScaleUpdate\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n plugins.notify(me, 'afterScaleUpdate');\n plugins.notify(me, 'afterLayout');\n },\n\n /**\n * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n * @private\n */\n updateDatasets: function() {\n var me = this;\n\n if (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n return;\n }\n\n for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me.updateDataset(i);\n }\n\n plugins.notify(me, 'afterDatasetsUpdate');\n },\n\n /**\n * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n * @private\n */\n updateDataset: function(index) {\n var me = this;\n var meta = me.getDatasetMeta(index);\n var args = {\n meta: meta,\n index: index\n };\n\n if (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n return;\n }\n\n meta.controller.update();\n\n plugins.notify(me, 'afterDatasetUpdate', [args]);\n },\n\n render: function(config) {\n var me = this;\n\n if (!config || typeof config !== 'object') {\n // backwards compatibility\n config = {\n duration: config,\n lazy: arguments[1]\n };\n }\n\n var duration = config.duration;\n var lazy = config.lazy;\n\n if (plugins.notify(me, 'beforeRender') === false) {\n return;\n }\n\n var animationOptions = me.options.animation;\n var onComplete = function(animation) {\n plugins.notify(me, 'afterRender');\n helpers.callback(animationOptions && animationOptions.onComplete, [animation], me);\n };\n\n if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\n var animation = new Chart.Animation({\n numSteps: (duration || animationOptions.duration) / 16.66, // 60 fps\n easing: config.easing || animationOptions.easing,\n\n render: function(chart, animationObject) {\n var easingFunction = helpers.easing.effects[animationObject.easing];\n var currentStep = animationObject.currentStep;\n var stepDecimal = currentStep / animationObject.numSteps;\n\n chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n },\n\n onAnimationProgress: animationOptions.onProgress,\n onAnimationComplete: onComplete\n });\n\n Chart.animationService.addAnimation(me, animation, duration, lazy);\n } else {\n me.draw();\n\n // See https://github.com/chartjs/Chart.js/issues/3781\n onComplete(new Chart.Animation({numSteps: 0, chart: me}));\n }\n\n return me;\n },\n\n draw: function(easingValue) {\n var me = this;\n\n me.clear();\n\n if (helpers.isNullOrUndef(easingValue)) {\n easingValue = 1;\n }\n\n me.transition(easingValue);\n\n if (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n return;\n }\n\n // Draw all the scales\n helpers.each(me.boxes, function(box) {\n box.draw(me.chartArea);\n }, me);\n\n if (me.scale) {\n me.scale.draw();\n }\n\n me.drawDatasets(easingValue);\n\n // Finally draw the tooltip\n me.tooltip.draw();\n\n plugins.notify(me, 'afterDraw', [easingValue]);\n },\n\n /**\n * @private\n */\n transition: function(easingValue) {\n var me = this;\n\n for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n if (me.isDatasetVisible(i)) {\n me.getDatasetMeta(i).controller.transition(easingValue);\n }\n }\n\n me.tooltip.transition(easingValue);\n },\n\n /**\n * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n * @private\n */\n drawDatasets: function(easingValue) {\n var me = this;\n\n if (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n return;\n }\n\n // Draw datasets reversed to support proper line stacking\n for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {\n if (me.isDatasetVisible(i)) {\n me.drawDataset(i, easingValue);\n }\n }\n\n plugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n },\n\n /**\n * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n * @private\n */\n drawDataset: function(index, easingValue) {\n var me = this;\n var meta = me.getDatasetMeta(index);\n var args = {\n meta: meta,\n index: index,\n easingValue: easingValue\n };\n\n if (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n return;\n }\n\n meta.controller.draw(easingValue);\n\n plugins.notify(me, 'afterDatasetDraw', [args]);\n },\n\n // Get the single element that was clicked on\n // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n getElementAtEvent: function(e) {\n return Interaction.modes.single(this, e);\n },\n\n getElementsAtEvent: function(e) {\n return Interaction.modes.label(this, e, {intersect: true});\n },\n\n getElementsAtXAxis: function(e) {\n return Interaction.modes['x-axis'](this, e, {intersect: true});\n },\n\n getElementsAtEventForMode: function(e, mode, options) {\n var method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options);\n }\n\n return [];\n },\n\n getDatasetAtEvent: function(e) {\n return Interaction.modes.dataset(this, e, {intersect: true});\n },\n\n getDatasetMeta: function(datasetIndex) {\n var me = this;\n var dataset = me.data.datasets[datasetIndex];\n if (!dataset._meta) {\n dataset._meta = {};\n }\n\n var meta = dataset._meta[me.id];\n if (!meta) {\n meta = dataset._meta[me.id] = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null\n };\n }\n\n return meta;\n },\n\n getVisibleDatasetCount: function() {\n var count = 0;\n for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n if (this.isDatasetVisible(i)) {\n count++;\n }\n }\n return count;\n },\n\n isDatasetVisible: function(datasetIndex) {\n var meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n },\n\n generateLegend: function() {\n return this.options.legendCallback(this);\n },\n\n /**\n * @private\n */\n destroyDatasetMeta: function(datasetIndex) {\n var id = this.id;\n var dataset = this.data.datasets[datasetIndex];\n var meta = dataset._meta && dataset._meta[id];\n\n if (meta) {\n meta.controller.destroy();\n delete dataset._meta[id];\n }\n },\n\n destroy: function() {\n var me = this;\n var canvas = me.canvas;\n var i, ilen;\n\n me.stop();\n\n // dataset controllers need to cleanup associated data\n for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me.destroyDatasetMeta(i);\n }\n\n if (canvas) {\n me.unbindEvents();\n helpers.canvas.clear(me);\n platform.releaseContext(me.ctx);\n me.canvas = null;\n me.ctx = null;\n }\n\n plugins.notify(me, 'destroy');\n\n delete Chart.instances[me.id];\n },\n\n toBase64Image: function() {\n return this.canvas.toDataURL.apply(this.canvas, arguments);\n },\n\n initToolTip: function() {\n var me = this;\n me.tooltip = new Chart.Tooltip({\n _chart: me,\n _chartInstance: me, // deprecated, backward compatibility\n _data: me.data,\n _options: me.options.tooltips\n }, me);\n },\n\n /**\n * @private\n */\n bindEvents: function() {\n var me = this;\n var listeners = me._listeners = {};\n var listener = function() {\n me.eventHandler.apply(me, arguments);\n };\n\n helpers.each(me.options.events, function(type) {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n });\n\n // Elements used to detect size change should not be injected for non responsive charts.\n // See https://github.com/chartjs/Chart.js/issues/2210\n if (me.options.responsive) {\n listener = function() {\n me.resize();\n };\n\n platform.addEventListener(me, 'resize', listener);\n listeners.resize = listener;\n }\n },\n\n /**\n * @private\n */\n unbindEvents: function() {\n var me = this;\n var listeners = me._listeners;\n if (!listeners) {\n return;\n }\n\n delete me._listeners;\n helpers.each(listeners, function(listener, type) {\n platform.removeEventListener(me, type, listener);\n });\n },\n\n updateHoverStyle: function(elements, mode, enabled) {\n var method = enabled ? 'setHoverStyle' : 'removeHoverStyle';\n var element, i, ilen;\n\n for (i = 0, ilen = elements.length; i < ilen; ++i) {\n element = elements[i];\n if (element) {\n this.getDatasetMeta(element._datasetIndex).controller[method](element);\n }\n }\n },\n\n /**\n * @private\n */\n eventHandler: function(e) {\n var me = this;\n var tooltip = me.tooltip;\n\n if (plugins.notify(me, 'beforeEvent', [e]) === false) {\n return;\n }\n\n // Buffer any update calls so that renders do not occur\n me._bufferedRender = true;\n me._bufferedRequest = null;\n\n var changed = me.handleEvent(e);\n changed |= tooltip && tooltip.handleEvent(e);\n\n plugins.notify(me, 'afterEvent', [e]);\n\n var bufferedRequest = me._bufferedRequest;\n if (bufferedRequest) {\n // If we have an update that was triggered, we need to do a normal render\n me.render(bufferedRequest);\n } else if (changed && !me.animating) {\n // If entering, leaving, or changing elements, animate the change via pivot\n me.stop();\n\n // We only need to render at this point. Updating will cause scales to be\n // recomputed generating flicker & using more memory than necessary.\n me.render(me.options.hover.animationDuration, true);\n }\n\n me._bufferedRender = false;\n me._bufferedRequest = null;\n\n return me;\n },\n\n /**\n * Handle an event\n * @private\n * @param {IEvent} event the event to handle\n * @return {Boolean} true if the chart needs to re-render\n */\n handleEvent: function(e) {\n var me = this;\n var options = me.options || {};\n var hoverOptions = options.hover;\n var changed = false;\n\n me.lastActive = me.lastActive || [];\n\n // Find Active Elements for hover and tooltips\n if (e.type === 'mouseout') {\n me.active = [];\n } else {\n me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n }\n\n // Invoke onHover hook\n // Need to call with native event here to not break backwards compatibility\n helpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);\n\n if (e.type === 'mouseup' || e.type === 'click') {\n if (options.onClick) {\n // Use e.native here for backwards compatibility\n options.onClick.call(me, e.native, me.active);\n }\n }\n\n // Remove styling for last active (even if it may still be active)\n if (me.lastActive.length) {\n me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n }\n\n // Built in hover styling\n if (me.active.length && hoverOptions.mode) {\n me.updateHoverStyle(me.active, hoverOptions.mode, true);\n }\n\n changed = !helpers.arrayEquals(me.active, me.lastActive);\n\n // Remember Last Actives\n me.lastActive = me.active;\n\n return changed;\n }\n });\n\n /**\n * Provided for backward compatibility, use Chart instead.\n * @class Chart.Controller\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n Chart.Controller = Chart;\n };\n\n},{\"25\":25,\"28\":28,\"45\":45,\"48\":48}],24:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n var 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 */\n function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach(function(key) {\n var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n var base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value: function() {\n var args = Array.prototype.slice.call(arguments);\n var res = base.apply(this, args);\n\n helpers.each(array._chartjs.listeners, function(object) {\n if (typeof object[method] === 'function') {\n object[method].apply(object, args);\n }\n });\n\n return res;\n }\n });\n });\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 */\n function unlistenArrayEvents(array, listener) {\n var stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n var listeners = stub.listeners;\n var index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach(function(key) {\n delete array[key];\n });\n\n delete array._chartjs;\n }\n\n // Base class for all dataset controllers (line, bar, etc)\n Chart.DatasetController = function(chart, datasetIndex) {\n this.initialize(chart, datasetIndex);\n };\n\n helpers.extend(Chart.DatasetController.prototype, {\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n * @type {Chart.core.element}\n */\n datasetElementType: null,\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.Point).\n * @type {Chart.core.element}\n */\n dataElementType: null,\n\n initialize: function(chart, datasetIndex) {\n var me = this;\n me.chart = chart;\n me.index = datasetIndex;\n me.linkScales();\n me.addElements();\n },\n\n updateIndex: function(datasetIndex) {\n this.index = datasetIndex;\n },\n\n linkScales: function() {\n var me = this;\n var meta = me.getMeta();\n var dataset = me.getDataset();\n\n if (meta.xAxisID === null) {\n meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n }\n if (meta.yAxisID === null) {\n meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n }\n },\n\n getDataset: function() {\n return this.chart.data.datasets[this.index];\n },\n\n getMeta: function() {\n return this.chart.getDatasetMeta(this.index);\n },\n\n getScaleForId: function(scaleID) {\n return this.chart.scales[scaleID];\n },\n\n reset: function() {\n this.update(true);\n },\n\n /**\n * @private\n */\n destroy: function() {\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n },\n\n createMetaDataset: function() {\n var me = this;\n var type = me.datasetElementType;\n return type && new type({\n _chart: me.chart,\n _datasetIndex: me.index\n });\n },\n\n createMetaData: function(index) {\n var me = this;\n var type = me.dataElementType;\n return type && new type({\n _chart: me.chart,\n _datasetIndex: me.index,\n _index: index\n });\n },\n\n addElements: function() {\n var me = this;\n var meta = me.getMeta();\n var data = me.getDataset().data || [];\n var metaData = meta.data;\n var i, ilen;\n\n for (i = 0, ilen = data.length; i < ilen; ++i) {\n metaData[i] = metaData[i] || me.createMetaData(i);\n }\n\n meta.dataset = meta.dataset || me.createMetaDataset();\n },\n\n addElementAndReset: function(index) {\n var element = this.createMetaData(index);\n this.getMeta().data.splice(index, 0, element);\n this.updateElement(element, index, true);\n },\n\n buildOrUpdateElements: function() {\n var me = this;\n var dataset = me.getDataset();\n var data = dataset.data || (dataset.data = []);\n\n // In order to correctly handle data addition/deletion animation (an thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal meta data accordingly.\n if (me._data !== data) {\n if (me._data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(me._data, me);\n }\n\n listenArrayEvents(data, me);\n me._data = data;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n me.resyncElements();\n },\n\n update: helpers.noop,\n\n transition: function(easingValue) {\n var meta = this.getMeta();\n var elements = meta.data || [];\n var ilen = elements.length;\n var i = 0;\n\n for (; i < ilen; ++i) {\n elements[i].transition(easingValue);\n }\n\n if (meta.dataset) {\n meta.dataset.transition(easingValue);\n }\n },\n\n draw: function() {\n var meta = this.getMeta();\n var elements = meta.data || [];\n var ilen = elements.length;\n var i = 0;\n\n if (meta.dataset) {\n meta.dataset.draw();\n }\n\n for (; i < ilen; ++i) {\n elements[i].draw();\n }\n },\n\n removeHoverStyle: function(element, elementOpts) {\n var dataset = this.chart.data.datasets[element._datasetIndex];\n var index = element._index;\n var custom = element.custom || {};\n var valueOrDefault = helpers.valueAtIndexOrDefault;\n var model = element._model;\n\n model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n model.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n model.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n },\n\n setHoverStyle: function(element) {\n var dataset = this.chart.data.datasets[element._datasetIndex];\n var index = element._index;\n var custom = element.custom || {};\n var valueOrDefault = helpers.valueAtIndexOrDefault;\n var getHoverColor = helpers.getHoverColor;\n var model = element._model;\n\n model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n },\n\n /**\n * @private\n */\n resyncElements: function() {\n var me = this;\n var meta = me.getMeta();\n var data = me.getDataset().data;\n var numMeta = meta.data.length;\n var numData = data.length;\n\n if (numData < numMeta) {\n meta.data.splice(numData, numMeta - numData);\n } else if (numData > numMeta) {\n me.insertElements(numMeta, numData - numMeta);\n }\n },\n\n /**\n * @private\n */\n insertElements: function(start, count) {\n for (var i = 0; i < count; ++i) {\n this.addElementAndReset(start + i);\n }\n },\n\n /**\n * @private\n */\n onDataPush: function() {\n this.insertElements(this.getDataset().data.length - 1, arguments.length);\n },\n\n /**\n * @private\n */\n onDataPop: function() {\n this.getMeta().data.pop();\n },\n\n /**\n * @private\n */\n onDataShift: function() {\n this.getMeta().data.shift();\n },\n\n /**\n * @private\n */\n onDataSplice: function(start, count) {\n this.getMeta().data.splice(start, count);\n this.insertElements(start, arguments.length - 2);\n },\n\n /**\n * @private\n */\n onDataUnshift: function() {\n this.insertElements(0, arguments.length);\n }\n });\n\n Chart.DatasetController.extend = helpers.inherits;\n };\n\n},{\"45\":45}],25:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n module.exports = {\n /**\n * @private\n */\n _set: function(scope, values) {\n return helpers.merge(this[scope] || (this[scope] = {}), values);\n }\n };\n\n},{\"45\":45}],26:[function(require,module,exports){\n 'use strict';\n\n var color = require(2);\n var helpers = require(45);\n\n function interpolate(start, view, model, ease) {\n var keys = Object.keys(model);\n var i, ilen, key, actual, origin, target, type, c0, c1;\n\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n\n target = model[key];\n\n // if a value is added to the model after pivot() has been called, the view\n // doesn't contain it, so let's initialize the view to the target value.\n if (!view.hasOwnProperty(key)) {\n view[key] = target;\n }\n\n actual = view[key];\n\n if (actual === target || key[0] === '_') {\n continue;\n }\n\n if (!start.hasOwnProperty(key)) {\n start[key] = actual;\n }\n\n origin = start[key];\n\n type = typeof target;\n\n if (type === typeof origin) {\n if (type === 'string') {\n c0 = color(origin);\n if (c0.valid) {\n c1 = color(target);\n if (c1.valid) {\n view[key] = c1.mix(c0, ease).rgbString();\n continue;\n }\n }\n } else if (type === 'number' && isFinite(origin) && isFinite(target)) {\n view[key] = origin + (target - origin) * ease;\n continue;\n }\n }\n\n view[key] = target;\n }\n }\n\n var Element = function(configuration) {\n helpers.extend(this, configuration);\n this.initialize.apply(this, arguments);\n };\n\n helpers.extend(Element.prototype, {\n\n initialize: function() {\n this.hidden = false;\n },\n\n pivot: function() {\n var me = this;\n if (!me._view) {\n me._view = helpers.clone(me._model);\n }\n me._start = {};\n return me;\n },\n\n transition: function(ease) {\n var me = this;\n var model = me._model;\n var start = me._start;\n var view = me._view;\n\n // No animation -> No Transition\n if (!model || ease === 1) {\n me._view = model;\n me._start = null;\n return me;\n }\n\n if (!view) {\n view = me._view = {};\n }\n\n if (!start) {\n start = me._start = {};\n }\n\n interpolate(start, view, model, ease);\n\n return me;\n },\n\n tooltipPosition: function() {\n return {\n x: this._model.x,\n y: this._model.y\n };\n },\n\n hasValue: function() {\n return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n }\n });\n\n Element.extend = helpers.inherits;\n\n module.exports = Element;\n\n},{\"2\":2,\"45\":45}],27:[function(require,module,exports){\n\t/* global window: false */\n\t/* global document: false */\n 'use strict';\n\n var color = require(2);\n var defaults = require(25);\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n // -- Basic js utility methods\n\n helpers.extend = function(base) {\n var setFn = function(value, key) {\n base[key] = value;\n };\n for (var i = 1, ilen = arguments.length; i < ilen; i++) {\n helpers.each(arguments[i], setFn);\n }\n return base;\n };\n\n helpers.configMerge = function(/* objects ... */) {\n return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n merger: function(key, target, source, options) {\n var tval = target[key] || {};\n var sval = source[key];\n\n if (key === 'scales') {\n // scale config merging is complex. Add our own function here for that\n target[key] = helpers.scaleMerge(tval, sval);\n } else if (key === 'scale') {\n // used in polar area & radar charts since there is only one scale\n target[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]);\n } else {\n helpers._merger(key, target, source, options);\n }\n }\n });\n };\n\n helpers.scaleMerge = function(/* objects ... */) {\n return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n merger: function(key, target, source, options) {\n if (key === 'xAxes' || key === 'yAxes') {\n var slen = source[key].length;\n var i, type, scale;\n\n if (!target[key]) {\n target[key] = [];\n }\n\n for (i = 0; i < slen; ++i) {\n scale = source[key][i];\n type = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear');\n\n if (i >= target[key].length) {\n target[key].push({});\n }\n\n if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) {\n // new/untyped scale or type changed: let's apply the new defaults\n // then merge source scale to correctly overwrite the defaults.\n helpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]);\n } else {\n // scales type are the same\n helpers.merge(target[key][i], scale);\n }\n }\n } else {\n helpers._merger(key, target, source, options);\n }\n }\n });\n };\n\n helpers.where = function(collection, filterCallback) {\n if (helpers.isArray(collection) && Array.prototype.filter) {\n return collection.filter(filterCallback);\n }\n var filtered = [];\n\n helpers.each(collection, function(item) {\n if (filterCallback(item)) {\n filtered.push(item);\n }\n });\n\n return filtered;\n };\n helpers.findIndex = Array.prototype.findIndex ?\n function(array, callback, scope) {\n return array.findIndex(callback, scope);\n } :\n function(array, callback, scope) {\n scope = scope === undefined ? array : scope;\n for (var i = 0, ilen = array.length; i < ilen; ++i) {\n if (callback.call(scope, array[i], i, array)) {\n return i;\n }\n }\n return -1;\n };\n helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\n // Default to start of the array\n if (helpers.isNullOrUndef(startIndex)) {\n startIndex = -1;\n }\n for (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n var currentItem = arrayToSearch[i];\n if (filterCallback(currentItem)) {\n return currentItem;\n }\n }\n };\n helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\n // Default to end of the array\n if (helpers.isNullOrUndef(startIndex)) {\n startIndex = arrayToSearch.length;\n }\n for (var i = startIndex - 1; i >= 0; i--) {\n var currentItem = arrayToSearch[i];\n if (filterCallback(currentItem)) {\n return currentItem;\n }\n }\n };\n helpers.inherits = function(extensions) {\n // Basic javascript inheritance based on the model created in Backbone.js\n var me = this;\n var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {\n return me.apply(this, arguments);\n };\n\n var Surrogate = function() {\n this.constructor = ChartElement;\n };\n Surrogate.prototype = me.prototype;\n ChartElement.prototype = new Surrogate();\n\n ChartElement.extend = helpers.inherits;\n\n if (extensions) {\n helpers.extend(ChartElement.prototype, extensions);\n }\n\n ChartElement.__super__ = me.prototype;\n\n return ChartElement;\n };\n // -- Math methods\n helpers.isNumber = function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n };\n helpers.almostEquals = function(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n };\n helpers.almostWhole = function(x, epsilon) {\n var rounded = Math.round(x);\n return (((rounded - epsilon) < x) && ((rounded + epsilon) > x));\n };\n helpers.max = function(array) {\n return array.reduce(function(max, value) {\n if (!isNaN(value)) {\n return Math.max(max, value);\n }\n return max;\n }, Number.NEGATIVE_INFINITY);\n };\n helpers.min = function(array) {\n return array.reduce(function(min, value) {\n if (!isNaN(value)) {\n return Math.min(min, value);\n }\n return min;\n }, Number.POSITIVE_INFINITY);\n };\n helpers.sign = Math.sign ?\n function(x) {\n return Math.sign(x);\n } :\n function(x) {\n x = +x; // convert to a number\n if (x === 0 || isNaN(x)) {\n return x;\n }\n return x > 0 ? 1 : -1;\n };\n helpers.log10 = Math.log10 ?\n function(x) {\n return Math.log10(x);\n } :\n function(x) {\n return Math.log(x) / Math.LN10;\n };\n helpers.toRadians = function(degrees) {\n return degrees * (Math.PI / 180);\n };\n helpers.toDegrees = function(radians) {\n return radians * (180 / Math.PI);\n };\n // Gets the angle from vertical upright to the point about a centre.\n helpers.getAngleFromPoint = function(centrePoint, anglePoint) {\n var distanceFromXCenter = anglePoint.x - centrePoint.x;\n var distanceFromYCenter = anglePoint.y - centrePoint.y;\n var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * Math.PI)) {\n angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle: angle,\n distance: radialDistanceFromCenter\n };\n };\n helpers.distanceBetweenPoints = function(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n };\n helpers.aliasPixel = function(pixelWidth) {\n return (pixelWidth % 2 === 0) ? 0 : 0.5;\n };\n helpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n var previous = firstPoint.skip ? middlePoint : firstPoint;\n var current = middlePoint;\n var next = afterPoint.skip ? middlePoint : afterPoint;\n\n var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n var s01 = d01 / (d01 + d12);\n var s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n var fa = t * s01; // scaling factor for triangle Ta\n var fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n };\n helpers.EPSILON = Number.EPSILON || 1e-14;\n helpers.splineCurveMonotone = function(points) {\n // This function calculates Bézier control points in a similar way than |splineCurve|,\n // but preserves monotonicity of the provided data and ensures no local extremums are added\n // between the dataset discrete points due to the interpolation.\n // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n var pointsWithTangents = (points || []).map(function(point) {\n return {\n model: point._model,\n deltaK: 0,\n mK: 0\n };\n });\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n var pointsLen = pointsWithTangents.length;\n var i, pointBefore, pointCurrent, pointAfter;\n for (i = 0; i < pointsLen; ++i) {\n pointCurrent = pointsWithTangents[i];\n if (pointCurrent.model.skip) {\n continue;\n }\n\n pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n if (pointAfter && !pointAfter.model.skip) {\n var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n }\n\n if (!pointBefore || pointBefore.model.skip) {\n pointCurrent.mK = pointCurrent.deltaK;\n } else if (!pointAfter || pointAfter.model.skip) {\n pointCurrent.mK = pointBefore.deltaK;\n } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n pointCurrent.mK = 0;\n } else {\n pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n }\n }\n\n // Adjust tangents to ensure monotonic properties\n var alphaK, betaK, tauK, squaredMagnitude;\n for (i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointsWithTangents[i];\n pointAfter = pointsWithTangents[i + 1];\n if (pointCurrent.model.skip || pointAfter.model.skip) {\n continue;\n }\n\n if (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n pointCurrent.mK = pointAfter.mK = 0;\n continue;\n }\n\n alphaK = pointCurrent.mK / pointCurrent.deltaK;\n betaK = pointAfter.mK / pointCurrent.deltaK;\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n pointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n }\n\n // Compute control points\n var deltaX;\n for (i = 0; i < pointsLen; ++i) {\n pointCurrent = pointsWithTangents[i];\n if (pointCurrent.model.skip) {\n continue;\n }\n\n pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n if (pointBefore && !pointBefore.model.skip) {\n deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n }\n if (pointAfter && !pointAfter.model.skip) {\n deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n }\n }\n };\n helpers.nextItem = function(collection, index, loop) {\n if (loop) {\n return index >= collection.length - 1 ? collection[0] : collection[index + 1];\n }\n return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n };\n helpers.previousItem = function(collection, index, loop) {\n if (loop) {\n return index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n }\n return index <= 0 ? collection[0] : collection[index - 1];\n };\n // Implementation of the nice number algorithm used in determining where axis labels will go\n helpers.niceNum = function(range, round) {\n var exponent = Math.floor(helpers.log10(range));\n var fraction = range / Math.pow(10, exponent);\n var niceFraction;\n\n if (round) {\n if (fraction < 1.5) {\n niceFraction = 1;\n } else if (fraction < 3) {\n niceFraction = 2;\n } else if (fraction < 7) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n } else if (fraction <= 1.0) {\n niceFraction = 1;\n } else if (fraction <= 2) {\n niceFraction = 2;\n } else if (fraction <= 5) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n\n return niceFraction * Math.pow(10, exponent);\n };\n // Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n helpers.requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n callback();\n };\n }\n return window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback) {\n return window.setTimeout(callback, 1000 / 60);\n };\n }());\n // -- DOM methods\n helpers.getRelativePosition = function(evt, chart) {\n var mouseX, mouseY;\n var e = evt.originalEvent || evt;\n var canvas = evt.currentTarget || evt.srcElement;\n var boundingRect = canvas.getBoundingClientRect();\n\n var touches = e.touches;\n if (touches && touches.length > 0) {\n mouseX = touches[0].clientX;\n mouseY = touches[0].clientY;\n\n } else {\n mouseX = e.clientX;\n mouseY = e.clientY;\n }\n\n // Scale mouse coordinates into canvas coordinates\n // by following the pattern laid out by 'jerryj' in the comments of\n // http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n var paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n var paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n var paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n var paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);\n mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);\n\n return {\n x: mouseX,\n y: mouseY\n };\n\n };\n\n // Private helper function to convert max-width/max-height values that may be percentages into a number\n function parseMaxStyle(styleValue, node, parentProperty) {\n var valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n }\n\n /**\n * Returns if the given value contains an effective constraint.\n * @private\n */\n function isConstrainedValue(value) {\n return value !== undefined && value !== null && value !== 'none';\n }\n\n // Private helper to get a constraint dimension\n // @param domNode : the node to check the constraint on\n // @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n // @param percentageProperty : property of parent to use when calculating width as a percentage\n // @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n function getConstraintDimension(domNode, maxStyle, percentageProperty) {\n var view = document.defaultView;\n var parentNode = domNode.parentNode;\n var constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n var hasCNode = isConstrainedValue(constrainedNode);\n var hasCContainer = isConstrainedValue(constrainedContainer);\n var infinity = Number.POSITIVE_INFINITY;\n\n if (hasCNode || hasCContainer) {\n return Math.min(\n hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,\n hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n }\n\n return 'none';\n }\n // returns Number or undefined if no constraint\n helpers.getConstraintWidth = function(domNode) {\n return getConstraintDimension(domNode, 'max-width', 'clientWidth');\n };\n // returns Number or undefined if no constraint\n helpers.getConstraintHeight = function(domNode) {\n return getConstraintDimension(domNode, 'max-height', 'clientHeight');\n };\n helpers.getMaximumWidth = function(domNode) {\n var container = domNode.parentNode;\n if (!container) {\n return domNode.clientWidth;\n }\n\n var paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10);\n var paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10);\n var w = container.clientWidth - paddingLeft - paddingRight;\n var cw = helpers.getConstraintWidth(domNode);\n return isNaN(cw) ? w : Math.min(w, cw);\n };\n helpers.getMaximumHeight = function(domNode) {\n var container = domNode.parentNode;\n if (!container) {\n return domNode.clientHeight;\n }\n\n var paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10);\n var paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10);\n var h = container.clientHeight - paddingTop - paddingBottom;\n var ch = helpers.getConstraintHeight(domNode);\n return isNaN(ch) ? h : Math.min(h, ch);\n };\n helpers.getStyle = function(el, property) {\n return el.currentStyle ?\n el.currentStyle[property] :\n document.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n };\n helpers.retinaScale = function(chart, forceRatio) {\n var pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1;\n if (pixelRatio === 1) {\n return;\n }\n\n var canvas = chart.canvas;\n var height = chart.height;\n var width = chart.width;\n\n canvas.height = height * pixelRatio;\n canvas.width = width * pixelRatio;\n chart.ctx.scale(pixelRatio, pixelRatio);\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n canvas.style.height = height + 'px';\n canvas.style.width = width + 'px';\n };\n // -- Canvas methods\n helpers.fontString = function(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n };\n helpers.longestText = function(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n var data = cache.data = cache.data || {};\n var gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.font = font;\n var longest = 0;\n helpers.each(arrayOfThings, function(thing) {\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n longest = helpers.measureText(ctx, data, gc, longest, thing);\n } else if (helpers.isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n helpers.each(thing, function(nestedThing) {\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n longest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n }\n });\n }\n });\n\n var gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (var i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n };\n helpers.measureText = function(ctx, data, gc, longest, string) {\n var textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n };\n helpers.numberOfLabelLines = function(arrayOfThings) {\n var numberOfLines = 1;\n helpers.each(arrayOfThings, function(thing) {\n if (helpers.isArray(thing)) {\n if (thing.length > numberOfLines) {\n numberOfLines = thing.length;\n }\n }\n });\n return numberOfLines;\n };\n\n helpers.color = !color ?\n function(value) {\n console.error('Color.js not found!');\n return value;\n } :\n function(value) {\n\t\t\t\t/* global CanvasGradient */\n if (value instanceof CanvasGradient) {\n value = defaults.global.defaultColor;\n }\n\n return color(value);\n };\n\n helpers.getHoverColor = function(colorValue) {\n\t\t\t/* global CanvasPattern */\n return (colorValue instanceof CanvasPattern) ?\n colorValue :\n helpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n };\n };\n\n},{\"2\":2,\"25\":25,\"45\":45}],28:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\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 {Point} the event position\n */\n function getRelativePosition(e, chart) {\n if (e.native) {\n return {\n x: e.x,\n y: e.y\n };\n }\n\n return helpers.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 handler {Function} the callback to execute for each visible item\n */\n function parseVisibleItems(chart, handler) {\n var datasets = chart.data.datasets;\n var meta, i, j, ilen, jlen;\n\n for (i = 0, ilen = datasets.length; i < ilen; ++i) {\n if (!chart.isDatasetVisible(i)) {\n continue;\n }\n\n meta = chart.getDatasetMeta(i);\n for (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n var element = meta.data[j];\n if (!element._view.skip) {\n handler(element);\n }\n }\n }\n }\n\n /**\n * Helper function to get the items that intersect the event position\n * @param items {ChartElement[]} elements to filter\n * @param position {Point} the point to be nearest to\n * @return {ChartElement[]} the nearest items\n */\n function getIntersectItems(chart, position) {\n var elements = [];\n\n parseVisibleItems(chart, function(element) {\n if (element.inRange(position.x, position.y)) {\n elements.push(element);\n }\n });\n\n return 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 position {Point} the point to be nearest to\n * @param intersect {Boolean} if true, only consider items that intersect the position\n * @param distanceMetric {Function} function to provide the distance between points\n * @return {ChartElement[]} the nearest items\n */\n function getNearestItems(chart, position, intersect, distanceMetric) {\n var minDistance = Number.POSITIVE_INFINITY;\n var nearestItems = [];\n\n parseVisibleItems(chart, function(element) {\n if (intersect && !element.inRange(position.x, position.y)) {\n return;\n }\n\n var center = element.getCenterPoint();\n var distance = distanceMetric(position, center);\n\n if (distance < minDistance) {\n nearestItems = [element];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n nearestItems.push(element);\n }\n });\n\n return 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 */\n function getDistanceMetricForAxis(axis) {\n var useX = axis.indexOf('x') !== -1;\n var useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n }\n\n function indexMode(chart, e, options) {\n var position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n options.axis = options.axis || 'x';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n var elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.data.datasets.forEach(function(dataset, datasetIndex) {\n if (chart.isDatasetVisible(datasetIndex)) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var element = meta.data[items[0]._index];\n\n // don't count items that are skipped (null data)\n if (element && !element._view.skip) {\n elements.push(element);\n }\n }\n });\n\n return 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 */\n module.exports = {\n // Helper function for different modes\n modes: {\n single: function(chart, e) {\n var position = getRelativePosition(e, chart);\n var elements = [];\n\n parseVisibleItems(chart, function(element) {\n if (element.inRange(position.x, position.y)) {\n elements.push(element);\n return elements;\n }\n });\n\n return elements.slice(0, 1);\n },\n\n /**\n * @function Chart.Interaction.modes.label\n * @deprecated since version 2.4.0\n * @todo remove at version 3\n * @private\n */\n label: indexMode,\n\n /**\n * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n * @function Chart.Interaction.modes.index\n * @since v2.4.0\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n index: indexMode,\n\n /**\n * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect is false, we find the nearest item and return the items in that dataset\n * @function Chart.Interaction.modes.dataset\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n dataset: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n options.axis = options.axis || 'xy';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\n if (items.length > 0) {\n items = chart.getDatasetMeta(items[0]._datasetIndex).data;\n }\n\n return items;\n },\n\n /**\n * @function Chart.Interaction.modes.x-axis\n * @deprecated since version 2.4.0. Use index mode and intersect == true\n * @todo remove at version 3\n * @private\n */\n 'x-axis': function(chart, e) {\n return indexMode(chart, e, {intersect: true});\n },\n\n /**\n * Point mode returns all elements that hit test based on the event position\n * of the event\n * @function Chart.Interaction.modes.intersect\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n point: function(chart, e) {\n var position = getRelativePosition(e, chart);\n return getIntersectItems(chart, position);\n },\n\n /**\n * nearest mode returns the element closest to the point\n * @function Chart.Interaction.modes.intersect\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n nearest: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n options.axis = options.axis || 'xy';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n var nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric);\n\n // We have multiple items at the same distance from the event. Now sort by smallest\n if (nearestItems.length > 1) {\n nearestItems.sort(function(a, b) {\n var sizeA = a.getArea();\n var sizeB = b.getArea();\n var ret = sizeA - sizeB;\n\n if (ret === 0) {\n // if equal sort by dataset index\n ret = a._datasetIndex - b._datasetIndex;\n }\n\n return ret;\n });\n }\n\n // Return only 1 item\n return nearestItems.slice(0, 1);\n },\n\n /**\n * x mode returns the elements that hit-test at the current x coordinate\n * @function Chart.Interaction.modes.x\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n x: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n var items = [];\n var intersectsItem = false;\n\n parseVisibleItems(chart, function(element) {\n if (element.inXRange(position.x)) {\n items.push(element);\n }\n\n if (element.inRange(position.x, position.y)) {\n intersectsItem = true;\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (options.intersect && !intersectsItem) {\n items = [];\n }\n return items;\n },\n\n /**\n * y mode returns the elements that hit-test at the current y coordinate\n * @function Chart.Interaction.modes.y\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n y: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n var items = [];\n var intersectsItem = false;\n\n parseVisibleItems(chart, function(element) {\n if (element.inYRange(position.y)) {\n items.push(element);\n }\n\n if (element.inRange(position.x, position.y)) {\n intersectsItem = true;\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (options.intersect && !intersectsItem) {\n items = [];\n }\n return items;\n }\n }\n };\n\n},{\"45\":45}],29:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n\n defaults._set('global', {\n responsive: true,\n responsiveAnimationDuration: 0,\n maintainAspectRatio: true,\n events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n hover: {\n onHover: null,\n mode: 'nearest',\n intersect: true,\n animationDuration: 400\n },\n onClick: null,\n defaultColor: 'rgba(0,0,0,0.1)',\n defaultFontColor: '#666',\n defaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n defaultFontSize: 12,\n defaultFontStyle: 'normal',\n showLines: true,\n\n // Element defaults defined in element extensions\n elements: {},\n\n // Layout options such as padding\n layout: {\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n }\n });\n\n module.exports = function() {\n\n // Occupy the global variable of Chart, and create a simple base class\n var Chart = function(item, config) {\n this.construct(item, config);\n return this;\n };\n\n Chart.Chart = Chart;\n\n return Chart;\n };\n\n},{\"25\":25}],30:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n function filterByPosition(array, position) {\n return helpers.where(array, function(v) {\n return v.position === position;\n });\n }\n\n function sortByWeight(array, reverse) {\n array.forEach(function(v, i) {\n v._tmpIndex_ = i;\n return v;\n });\n array.sort(function(a, b) {\n var v0 = reverse ? b : a;\n var v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0._tmpIndex_ - v1._tmpIndex_ :\n v0.weight - v1.weight;\n });\n array.forEach(function(v) {\n delete v._tmpIndex_;\n });\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.\n Chart.layoutService = {\n defaults: {},\n\n /**\n * Register a box to a chart.\n * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n * @param {Chart} chart - the chart to use\n * @param {ILayoutItem} item - the item to add to be layed out\n */\n addBox: function(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullWidth = item.fullWidth || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n\n chart.boxes.push(item);\n },\n\n /**\n * Remove a layoutItem from a chart\n * @param {Chart} chart - the chart to remove the box from\n * @param {Object} layoutItem - the item to remove from the layout\n */\n removeBox: function(chart, layoutItem) {\n var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n * Sets (or updates) options on the given `item`.\n * @param {Chart} chart - the chart in which the item lives (or will be added to)\n * @param {Object} item - the item to configure with the given options\n * @param {Object} options - the new item options.\n */\n configure: function(chart, item, options) {\n var props = ['fullWidth', 'position', 'weight'];\n var ilen = props.length;\n var i = 0;\n var prop;\n\n for (; i < ilen; ++i) {\n prop = props[i];\n if (options.hasOwnProperty(prop)) {\n item[prop] = options[prop];\n }\n }\n },\n\n /**\n * Fits boxes of the given chart into the given size by having each box measure itself\n * then running a fitting algorithm\n * @param {Chart} chart - the chart\n * @param {Number} width - the width to fit into\n * @param {Number} height - the height to fit into\n */\n update: function(chart, width, height) {\n if (!chart) {\n return;\n }\n\n var layoutOptions = chart.options.layout || {};\n var padding = helpers.options.toPadding(layoutOptions.padding);\n var leftPadding = padding.left;\n var rightPadding = padding.right;\n var topPadding = padding.top;\n var bottomPadding = padding.bottom;\n\n var leftBoxes = filterByPosition(chart.boxes, 'left');\n var rightBoxes = filterByPosition(chart.boxes, 'right');\n var topBoxes = filterByPosition(chart.boxes, 'top');\n var bottomBoxes = filterByPosition(chart.boxes, 'bottom');\n var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');\n\n // Sort boxes by weight. A higher weight is further away from the chart area\n sortByWeight(leftBoxes, true);\n sortByWeight(rightBoxes, false);\n sortByWeight(topBoxes, true);\n sortByWeight(bottomBoxes, false);\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n // What we do to find the best sizing, we do the following\n // 1. Determine the minimum size of the chart area.\n // 2. Split the remaining width equally between each vertical axis\n // 3. Split the remaining height equally between each horizontal axis\n // 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n // 5. Adjust the sizes of each axis based on it's minimum reported size.\n // 6. Refit each axis\n // 7. Position each axis in the final location\n // 8. Tell the chart the final location of the chart area\n // 9. Tell any axes that overlay the chart area the positions of the chart area\n\n // Step 1\n var chartWidth = width - leftPadding - rightPadding;\n var chartHeight = height - topPadding - bottomPadding;\n var chartAreaWidth = chartWidth / 2; // min 50%\n var chartAreaHeight = chartHeight / 2; // min 50%\n\n // Step 2\n var verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n // Step 3\n var horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n // Step 4\n var maxChartAreaWidth = chartWidth;\n var maxChartAreaHeight = chartHeight;\n var minBoxSizes = [];\n\n function getMinimumBoxSize(box) {\n var minSize;\n var isHorizontal = box.isHorizontal();\n\n if (isHorizontal) {\n minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n maxChartAreaHeight -= minSize.height;\n } else {\n minSize = box.update(verticalBoxWidth, chartAreaHeight);\n maxChartAreaWidth -= minSize.width;\n }\n\n minBoxSizes.push({\n horizontal: isHorizontal,\n minSize: minSize,\n box: box,\n });\n }\n\n helpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n var maxHorizontalLeftPadding = 0;\n var maxHorizontalRightPadding = 0;\n var maxVerticalTopPadding = 0;\n var maxVerticalBottomPadding = 0;\n\n helpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) {\n if (horizontalBox.getPadding) {\n var boxPadding = horizontalBox.getPadding();\n maxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n maxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n }\n });\n\n helpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) {\n if (verticalBox.getPadding) {\n var boxPadding = verticalBox.getPadding();\n maxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n maxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n }\n });\n\n // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n // be if the axes are drawn at their minimum sizes.\n // Steps 5 & 6\n var totalLeftBoxesWidth = leftPadding;\n var totalRightBoxesWidth = rightPadding;\n var totalTopBoxesHeight = topPadding;\n var totalBottomBoxesHeight = bottomPadding;\n\n // Function to fit a box\n function fitBox(box) {\n var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) {\n return minBox.box === box;\n });\n\n if (minBoxSize) {\n if (box.isHorizontal()) {\n var scaleMargin = {\n left: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n right: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n top: 0,\n bottom: 0\n };\n\n // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n // on the margin. Sometimes they need to increase in size slightly\n box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n } else {\n box.update(minBoxSize.minSize.width, maxChartAreaHeight);\n }\n }\n }\n\n // Update, and calculate the left and right margins for the horizontal boxes\n helpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n helpers.each(leftBoxes, function(box) {\n totalLeftBoxesWidth += box.width;\n });\n\n helpers.each(rightBoxes, function(box) {\n totalRightBoxesWidth += box.width;\n });\n\n // Set the Left and Right margins for the horizontal boxes\n helpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n // Figure out how much margin is on the top and bottom of the vertical boxes\n helpers.each(topBoxes, function(box) {\n totalTopBoxesHeight += box.height;\n });\n\n helpers.each(bottomBoxes, function(box) {\n totalBottomBoxesHeight += box.height;\n });\n\n function finalFitVerticalBox(box) {\n var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) {\n return minSize.box === box;\n });\n\n var scaleMargin = {\n left: 0,\n right: 0,\n top: totalTopBoxesHeight,\n bottom: totalBottomBoxesHeight\n };\n\n if (minBoxSize) {\n box.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n }\n }\n\n // Let the left layout know the final margin\n helpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n totalLeftBoxesWidth = leftPadding;\n totalRightBoxesWidth = rightPadding;\n totalTopBoxesHeight = topPadding;\n totalBottomBoxesHeight = bottomPadding;\n\n helpers.each(leftBoxes, function(box) {\n totalLeftBoxesWidth += box.width;\n });\n\n helpers.each(rightBoxes, function(box) {\n totalRightBoxesWidth += box.width;\n });\n\n helpers.each(topBoxes, function(box) {\n totalTopBoxesHeight += box.height;\n });\n helpers.each(bottomBoxes, function(box) {\n totalBottomBoxesHeight += box.height;\n });\n\n // We may be adding some padding to account for rotated x axis labels\n var leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n totalLeftBoxesWidth += leftPaddingAddition;\n totalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n var topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n totalTopBoxesHeight += topPaddingAddition;\n totalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n // Figure out if our chart area changed. This would occur if the dataset layout label rotation\n // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n // without calling `fit` again\n var newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n var newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n helpers.each(leftBoxes, function(box) {\n box.height = newMaxChartAreaHeight;\n });\n\n helpers.each(rightBoxes, function(box) {\n box.height = newMaxChartAreaHeight;\n });\n\n helpers.each(topBoxes, function(box) {\n if (!box.fullWidth) {\n box.width = newMaxChartAreaWidth;\n }\n });\n\n helpers.each(bottomBoxes, function(box) {\n if (!box.fullWidth) {\n box.width = newMaxChartAreaWidth;\n }\n });\n\n maxChartAreaHeight = newMaxChartAreaHeight;\n maxChartAreaWidth = newMaxChartAreaWidth;\n }\n\n // Step 7 - Position the boxes\n var left = leftPadding + leftPaddingAddition;\n var top = topPadding + topPaddingAddition;\n\n function placeBox(box) {\n if (box.isHorizontal()) {\n box.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth;\n box.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n box.top = top;\n box.bottom = top + box.height;\n\n // Move to next point\n top = box.bottom;\n\n } else {\n\n box.left = left;\n box.right = left + box.width;\n box.top = totalTopBoxesHeight;\n box.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n // Move to next point\n left = box.right;\n }\n }\n\n helpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n // Account for chart width and height\n left += maxChartAreaWidth;\n top += maxChartAreaHeight;\n\n helpers.each(rightBoxes, placeBox);\n helpers.each(bottomBoxes, placeBox);\n\n // Step 8\n chart.chartArea = {\n left: totalLeftBoxesWidth,\n top: totalTopBoxesHeight,\n right: totalLeftBoxesWidth + maxChartAreaWidth,\n bottom: totalTopBoxesHeight + maxChartAreaHeight\n };\n\n // Step 9\n helpers.each(chartAreaBoxes, function(box) {\n box.left = chart.chartArea.left;\n box.top = chart.chartArea.top;\n box.right = chart.chartArea.right;\n box.bottom = chart.chartArea.bottom;\n\n box.update(maxChartAreaWidth, maxChartAreaHeight);\n });\n }\n };\n };\n\n},{\"45\":45}],31:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n plugins: {}\n });\n\n module.exports = function(Chart) {\n\n /**\n * The plugin service singleton\n * @namespace Chart.plugins\n * @since 2.1.0\n */\n Chart.plugins = {\n /**\n * Globally registered plugins.\n * @private\n */\n _plugins: [],\n\n /**\n * This identifier is used to invalidate the descriptors cache attached to each chart\n * when a global plugin is registered or unregistered. In this case, the cache ID is\n * incremented and descriptors are regenerated during following API calls.\n * @private\n */\n _cacheId: 0,\n\n /**\n * Registers the given plugin(s) if not already registered.\n * @param {Array|Object} plugins plugin instance(s).\n */\n register: function(plugins) {\n var p = this._plugins;\n ([]).concat(plugins).forEach(function(plugin) {\n if (p.indexOf(plugin) === -1) {\n p.push(plugin);\n }\n });\n\n this._cacheId++;\n },\n\n /**\n * Unregisters the given plugin(s) only if registered.\n * @param {Array|Object} plugins plugin instance(s).\n */\n unregister: function(plugins) {\n var p = this._plugins;\n ([]).concat(plugins).forEach(function(plugin) {\n var idx = p.indexOf(plugin);\n if (idx !== -1) {\n p.splice(idx, 1);\n }\n });\n\n this._cacheId++;\n },\n\n /**\n * Remove all registered plugins.\n * @since 2.1.5\n */\n clear: function() {\n this._plugins = [];\n this._cacheId++;\n },\n\n /**\n * Returns the number of registered plugins?\n * @returns {Number}\n * @since 2.1.5\n */\n count: function() {\n return this._plugins.length;\n },\n\n /**\n * Returns all registered plugin instances.\n * @returns {Array} array of plugin objects.\n * @since 2.1.5\n */\n getAll: function() {\n return this._plugins;\n },\n\n /**\n * Calls enabled plugins for `chart` on the specified hook and with the given args.\n * This method immediately returns as soon as a plugin explicitly returns false. The\n * returned value can be used, for instance, to interrupt the current action.\n * @param {Object} chart - The chart instance for which plugins should be called.\n * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n * @param {Array} [args] - Extra arguments to apply to the hook call.\n * @returns {Boolean} false if any of the plugins return false, else returns true.\n */\n notify: function(chart, hook, args) {\n var descriptors = this.descriptors(chart);\n var ilen = descriptors.length;\n var i, descriptor, plugin, params, method;\n\n for (i = 0; i < ilen; ++i) {\n descriptor = descriptors[i];\n plugin = descriptor.plugin;\n method = plugin[hook];\n if (typeof method === 'function') {\n params = [chart].concat(args || []);\n params.push(descriptor.options);\n if (method.apply(plugin, params) === false) {\n return false;\n }\n }\n }\n\n return true;\n },\n\n /**\n * Returns descriptors of enabled plugins for the given chart.\n * @returns {Array} [{ plugin, options }]\n * @private\n */\n descriptors: function(chart) {\n var cache = chart._plugins || (chart._plugins = {});\n if (cache.id === this._cacheId) {\n return cache.descriptors;\n }\n\n var plugins = [];\n var descriptors = [];\n var config = (chart && chart.config) || {};\n var options = (config.options && config.options.plugins) || {};\n\n this._plugins.concat(config.plugins || []).forEach(function(plugin) {\n var idx = plugins.indexOf(plugin);\n if (idx !== -1) {\n return;\n }\n\n var id = plugin.id;\n var opts = options[id];\n if (opts === false) {\n return;\n }\n\n if (opts === true) {\n opts = helpers.clone(defaults.global.plugins[id]);\n }\n\n plugins.push(plugin);\n descriptors.push({\n plugin: plugin,\n options: opts || {}\n });\n });\n\n cache.descriptors = descriptors;\n cache.id = this._cacheId;\n return descriptors;\n }\n };\n\n /**\n * Plugin extension hooks.\n * @interface IPlugin\n * @since 2.1.0\n */\n /**\n * @method IPlugin#beforeInit\n * @desc Called before initializing `chart`.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#afterInit\n * @desc Called after `chart` has been initialized and before the first update.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeUpdate\n * @desc Called before updating `chart`. If any plugin returns `false`, the update\n * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart update.\n */\n /**\n * @method IPlugin#afterUpdate\n * @desc Called after `chart` has been updated and before rendering. Note that this\n * hook will not be called if the chart update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDatasetsUpdate\n * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n * the datasets update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} false to cancel the datasets update.\n * @since version 2.1.5\n */\n /**\n * @method IPlugin#afterDatasetsUpdate\n * @desc Called after the `chart` datasets have been updated. Note that this hook\n * will not be called if the datasets update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @since version 2.1.5\n */\n /**\n * @method IPlugin#beforeDatasetUpdate\n * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin\n * returns `false`, the datasets update is cancelled until another `update` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n /**\n * @method IPlugin#afterDatasetUpdate\n * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note\n * that this hook will not be called if the datasets update has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeLayout\n * @desc Called before laying out `chart`. If any plugin returns `false`,\n * the layout update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart layout.\n */\n /**\n * @method IPlugin#afterLayout\n * @desc Called after the `chart` has been layed out. Note that this hook will not\n * be called if the layout update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeRender\n * @desc Called before rendering `chart`. If any plugin returns `false`,\n * the rendering is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart rendering.\n */\n /**\n * @method IPlugin#afterRender\n * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n * that this hook will not be called if the rendering has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDraw\n * @desc Called before drawing `chart` at every animation frame specified by the given\n * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n * another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart drawing.\n */\n /**\n * @method IPlugin#afterDraw\n * @desc Called after the `chart` has been drawn for the specific easing value. Note\n * that this hook will not be called if the drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDatasetsDraw\n * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n * the datasets drawing is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n /**\n * @method IPlugin#afterDatasetsDraw\n * @desc Called after the `chart` datasets have been drawn. Note that this hook\n * will not be called if the datasets drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDatasetDraw\n * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets\n * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing\n * is cancelled until another `render` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n /**\n * @method IPlugin#afterDatasetDraw\n * @desc Called after the `chart` datasets at the given `args.index` have been drawn\n * (datasets are drawn in the reverse order). Note that this hook will not be called\n * if the datasets drawing has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeEvent\n * @desc Called before processing the specified `event`. If any plugin returns `false`,\n * the event will be discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#afterEvent\n * @desc Called after the `event` has been consumed. Note that this hook\n * will not be called if the `event` has been previously discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#resize\n * @desc Called after the chart as been resized.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#destroy\n * @desc Called after the chart as been destroyed.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\n /**\n * Provided for backward compatibility, use Chart.plugins instead\n * @namespace Chart.pluginService\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n Chart.pluginService = Chart.plugins;\n\n /**\n * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n * effect, instead simply create/register plugins via plain JavaScript objects.\n * @interface Chart.PluginBase\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n Chart.PluginBase = Element.extend({});\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],32:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n var Ticks = require(34);\n\n defaults._set('scale', {\n display: true,\n position: 'left',\n offset: false,\n\n // grid line settings\n gridLines: {\n display: true,\n color: 'rgba(0, 0, 0, 0.1)',\n lineWidth: 1,\n drawBorder: true,\n drawOnChartArea: true,\n drawTicks: true,\n tickMarkLength: 10,\n zeroLineWidth: 1,\n zeroLineColor: 'rgba(0,0,0,0.25)',\n zeroLineBorderDash: [],\n zeroLineBorderDashOffset: 0.0,\n offsetGridLines: false,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n // scale label\n scaleLabel: {\n // display property\n display: false,\n\n // actual label\n labelString: '',\n\n // line height\n lineHeight: 1.2,\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n beginAtZero: false,\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n padding: 0,\n reverse: false,\n display: true,\n autoSkip: true,\n autoSkipPadding: 0,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {}\n }\n });\n\n function labelsFromTicks(ticks) {\n var labels = [];\n var i, ilen;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n labels.push(ticks[i].label);\n }\n\n return labels;\n }\n\n function getLineValue(scale, index, offsetGridLines) {\n var lineValue = scale.getPixelForTick(index);\n\n if (offsetGridLines) {\n if (index === 0) {\n lineValue -= (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;\n }\n }\n return lineValue;\n }\n\n module.exports = function(Chart) {\n\n function computeTextSize(context, tick, font) {\n return helpers.isArray(tick) ?\n helpers.longestText(context, font, tick) :\n context.measureText(tick).width;\n }\n\n function parseFontOptions(options) {\n var valueOrDefault = helpers.valueOrDefault;\n var globalDefaults = defaults.global;\n var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n var style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n var family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n return {\n size: size,\n style: style,\n family: family,\n font: helpers.fontString(size, style, family)\n };\n }\n\n function parseLineHeight(options) {\n return helpers.options.toLineHeight(\n helpers.valueOrDefault(options.lineHeight, 1.2),\n helpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize));\n }\n\n Chart.Scale = Element.extend({\n /**\n * Get the padding needed for the scale\n * @method getPadding\n * @private\n * @returns {Padding} the necessary padding\n */\n getPadding: function() {\n var me = this;\n return {\n left: me.paddingLeft || 0,\n top: me.paddingTop || 0,\n right: me.paddingRight || 0,\n bottom: me.paddingBottom || 0\n };\n },\n\n /**\n * Returns the scale tick objects ({label, major})\n * @since 2.7\n */\n getTicks: function() {\n return this._ticks;\n },\n\n // These methods are ordered by lifecyle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n mergeTicksOptions: function() {\n var ticks = this.options.ticks;\n if (ticks.minor === false) {\n ticks.minor = {\n display: false\n };\n }\n if (ticks.major === false) {\n ticks.major = {\n display: false\n };\n }\n for (var key in ticks) {\n if (key !== 'major' && key !== 'minor') {\n if (typeof ticks.minor[key] === 'undefined') {\n ticks.minor[key] = ticks[key];\n }\n if (typeof ticks.major[key] === 'undefined') {\n ticks.major[key] = ticks[key];\n }\n }\n }\n },\n beforeUpdate: function() {\n helpers.callback(this.options.beforeUpdate, [this]);\n },\n update: function(maxWidth, maxHeight, margins) {\n var me = this;\n var i, ilen, labels, label, ticks, tick;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = helpers.extend({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n me.longestTextCache = me.longestTextCache || {};\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n\n // Data min/max\n me.beforeDataLimits();\n me.determineDataLimits();\n me.afterDataLimits();\n\n // Ticks - `this.ticks` is now DEPRECATED!\n // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n // and must not be accessed directly from outside this class. `this.ticks` being\n // around for long time and not marked as private, we can't change its structure\n // without unexpected breaking changes. If you need to access the scale ticks,\n // use scale.getTicks() instead.\n\n me.beforeBuildTicks();\n\n // New implementations should return an array of objects but for BACKWARD COMPAT,\n // we still support no return (`this.ticks` internally set by calling this method).\n ticks = me.buildTicks() || [];\n\n me.afterBuildTicks();\n\n me.beforeTickToLabelConversion();\n\n // New implementations should return the formatted tick labels but for BACKWARD\n // COMPAT, we still support no return (`this.ticks` internally changed by calling\n // this method and supposed to contain only string values).\n labels = me.convertTicksToLabels(ticks) || me.ticks;\n\n me.afterTickToLabelConversion();\n\n me.ticks = labels; // BACKWARD COMPATIBILITY\n\n // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!\n\n // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n tick = ticks[i];\n if (!tick) {\n ticks.push(tick = {\n label: label,\n major: false\n });\n } else {\n tick.label = label;\n }\n }\n\n me._ticks = ticks;\n\n // Tick Rotation\n me.beforeCalculateTickRotation();\n me.calculateTickRotation();\n me.afterCalculateTickRotation();\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n\n return me.minSize;\n\n },\n afterUpdate: function() {\n helpers.callback(this.options.afterUpdate, [this]);\n },\n\n //\n\n beforeSetDimensions: function() {\n helpers.callback(this.options.beforeSetDimensions, [this]);\n },\n setDimensions: function() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n },\n afterSetDimensions: function() {\n helpers.callback(this.options.afterSetDimensions, [this]);\n },\n\n // Data limits\n beforeDataLimits: function() {\n helpers.callback(this.options.beforeDataLimits, [this]);\n },\n determineDataLimits: helpers.noop,\n afterDataLimits: function() {\n helpers.callback(this.options.afterDataLimits, [this]);\n },\n\n //\n beforeBuildTicks: function() {\n helpers.callback(this.options.beforeBuildTicks, [this]);\n },\n buildTicks: helpers.noop,\n afterBuildTicks: function() {\n helpers.callback(this.options.afterBuildTicks, [this]);\n },\n\n beforeTickToLabelConversion: function() {\n helpers.callback(this.options.beforeTickToLabelConversion, [this]);\n },\n convertTicksToLabels: function() {\n var me = this;\n // Convert ticks to strings\n var tickOpts = me.options.ticks;\n me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n },\n afterTickToLabelConversion: function() {\n helpers.callback(this.options.afterTickToLabelConversion, [this]);\n },\n\n //\n\n beforeCalculateTickRotation: function() {\n helpers.callback(this.options.beforeCalculateTickRotation, [this]);\n },\n calculateTickRotation: function() {\n var me = this;\n var context = me.ctx;\n var tickOpts = me.options.ticks;\n var labels = labelsFromTicks(me._ticks);\n\n // Get the width of each grid by calculating the difference\n // between x offsets between 0 and 1.\n var tickFont = parseFontOptions(tickOpts);\n context.font = tickFont.font;\n\n var labelRotation = tickOpts.minRotation || 0;\n\n if (labels.length && me.options.display && me.isHorizontal()) {\n var originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache);\n var labelWidth = originalLabelWidth;\n var cosRotation, sinRotation;\n\n // Allow 3 pixels x2 padding either side for label readability\n var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n // Max label rotation can be set or default to 90 - also act as a loop counter\n while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n var angleRadians = helpers.toRadians(labelRotation);\n cosRotation = Math.cos(angleRadians);\n sinRotation = Math.sin(angleRadians);\n\n if (sinRotation * originalLabelWidth > me.maxHeight) {\n // go back one step\n labelRotation--;\n break;\n }\n\n labelRotation++;\n labelWidth = cosRotation * originalLabelWidth;\n }\n }\n\n me.labelRotation = labelRotation;\n },\n afterCalculateTickRotation: function() {\n helpers.callback(this.options.afterCalculateTickRotation, [this]);\n },\n\n //\n\n beforeFit: function() {\n helpers.callback(this.options.beforeFit, [this]);\n },\n fit: function() {\n var me = this;\n // Reset\n var minSize = me.minSize = {\n width: 0,\n height: 0\n };\n\n var labels = labelsFromTicks(me._ticks);\n\n var opts = me.options;\n var tickOpts = opts.ticks;\n var scaleLabelOpts = opts.scaleLabel;\n var gridLineOpts = opts.gridLines;\n var display = opts.display;\n var isHorizontal = me.isHorizontal();\n\n var tickFont = parseFontOptions(tickOpts);\n var tickMarkLength = opts.gridLines.tickMarkLength;\n\n // Width\n if (isHorizontal) {\n // subtract the margins to line up with the chartArea if we are a full width scale\n minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n } else {\n minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n }\n\n // height\n if (isHorizontal) {\n minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n } else {\n minSize.height = me.maxHeight; // fill all the height\n }\n\n // Are we showing a title for the scale?\n if (scaleLabelOpts.display && display) {\n var scaleLabelLineHeight = parseLineHeight(scaleLabelOpts);\n var scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding);\n var deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height;\n\n if (isHorizontal) {\n minSize.height += deltaHeight;\n } else {\n minSize.width += deltaHeight;\n }\n }\n\n // Don't bother fitting the ticks if we are not showing them\n if (tickOpts.display && display) {\n var largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache);\n var tallestLabelHeightInLines = helpers.numberOfLabelLines(labels);\n var lineSpace = tickFont.size * 0.5;\n var tickPadding = me.options.ticks.padding;\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n me.longestLabelWidth = largestTextWidth;\n\n var angleRadians = helpers.toRadians(me.labelRotation);\n var cosRotation = Math.cos(angleRadians);\n var sinRotation = Math.sin(angleRadians);\n\n // TODO - improve this calculation\n var labelHeight = (sinRotation * largestTextWidth)\n + (tickFont.size * tallestLabelHeightInLines)\n + (lineSpace * (tallestLabelHeightInLines - 1))\n + lineSpace; // padding\n\n minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n\n me.ctx.font = tickFont.font;\n var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font);\n var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font);\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (me.labelRotation !== 0) {\n me.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges\n me.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3;\n } else {\n me.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n me.paddingRight = lastLabelWidth / 2 + 3;\n }\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n if (tickOpts.mirror) {\n largestTextWidth = 0;\n } else {\n // use lineSpace for consistency with horizontal axis\n // tickPadding is not implemented for horizontal\n largestTextWidth += tickPadding + lineSpace;\n }\n\n minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n\n me.paddingTop = tickFont.size / 2;\n me.paddingBottom = tickFont.size / 2;\n }\n }\n\n me.handleMargins();\n\n me.width = minSize.width;\n me.height = minSize.height;\n },\n\n /**\n * Handle margins and padding interactions\n * @private\n */\n handleMargins: function() {\n var me = this;\n if (me.margins) {\n me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n }\n },\n\n afterFit: function() {\n helpers.callback(this.options.afterFit, [this]);\n },\n\n // Shared Methods\n isHorizontal: function() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n },\n isFullWidth: function() {\n return (this.options.fullWidth);\n },\n\n // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n getRightValue: function(rawValue) {\n // Null and undefined values first\n if (helpers.isNullOrUndef(rawValue)) {\n return NaN;\n }\n // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n if (typeof rawValue === 'number' && !isFinite(rawValue)) {\n return NaN;\n }\n // If it is in fact an object, dive in one more level\n if (rawValue) {\n if (this.isHorizontal()) {\n if (rawValue.x !== undefined) {\n return this.getRightValue(rawValue.x);\n }\n } else if (rawValue.y !== undefined) {\n return this.getRightValue(rawValue.y);\n }\n }\n\n // Value is good, return it\n return rawValue;\n },\n\n // Used to get the value to display in the tooltip for the data at the given index\n // function getLabelForIndex(index, datasetIndex)\n getLabelForIndex: helpers.noop,\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue: helpers.noop,\n\n // Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n getValueForPixel: helpers.noop,\n\n // Used for tick location, should\n getPixelForTick: function(index) {\n var me = this;\n var offset = me.options.offset;\n if (me.isHorizontal()) {\n var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n var pixel = (tickWidth * index) + me.paddingLeft;\n\n if (offset) {\n pixel += tickWidth / 2;\n }\n\n var finalVal = me.left + Math.round(pixel);\n finalVal += me.isFullWidth() ? me.margins.left : 0;\n return finalVal;\n }\n var innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n return me.top + (index * (innerHeight / (me._ticks.length - 1)));\n },\n\n // Utility for getting the pixel location of a percentage of scale\n getPixelForDecimal: function(decimal) {\n var me = this;\n if (me.isHorizontal()) {\n var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n var valueOffset = (innerWidth * decimal) + me.paddingLeft;\n\n var finalVal = me.left + Math.round(valueOffset);\n finalVal += me.isFullWidth() ? me.margins.left : 0;\n return finalVal;\n }\n return me.top + (decimal * me.height);\n },\n\n getBasePixel: function() {\n return this.getPixelForValue(this.getBaseValue());\n },\n\n getBaseValue: function() {\n var me = this;\n var min = me.min;\n var max = me.max;\n\n return me.beginAtZero ? 0 :\n min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n },\n\n /**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @private\n */\n _autoSkip: function(ticks) {\n var skipRatio;\n var me = this;\n var isHorizontal = me.isHorizontal();\n var optionTicks = me.options.ticks.minor;\n var tickCount = ticks.length;\n var labelRotationRadians = helpers.toRadians(me.labelRotation);\n var cosRotation = Math.cos(labelRotationRadians);\n var longestRotatedLabel = me.longestLabelWidth * cosRotation;\n var result = [];\n var i, tick, shouldSkip;\n\n // figure out the maximum number of gridlines to show\n var maxTicks;\n if (optionTicks.maxTicksLimit) {\n maxTicks = optionTicks.maxTicksLimit;\n }\n\n if (isHorizontal) {\n skipRatio = false;\n\n if ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) {\n skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight)));\n }\n\n // if they defined a max number of optionTicks,\n // increase skipRatio until that number is met\n if (maxTicks && tickCount > maxTicks) {\n skipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks));\n }\n }\n\n for (i = 0; i < tickCount; i++) {\n tick = ticks[i];\n\n // Since we always show the last tick,we need may need to hide the last shown one before\n shouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount);\n if (shouldSkip && i !== tickCount - 1 || helpers.isNullOrUndef(tick.label)) {\n // leave tick in place but make sure it's not displayed (#4635)\n delete tick.label;\n }\n result.push(tick);\n }\n return result;\n },\n\n // Actually draw the scale on the canvas\n // @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n draw: function(chartArea) {\n var me = this;\n var options = me.options;\n if (!options.display) {\n return;\n }\n\n var context = me.ctx;\n var globalDefaults = defaults.global;\n var optionTicks = options.ticks.minor;\n var optionMajorTicks = options.ticks.major || optionTicks;\n var gridLines = options.gridLines;\n var scaleLabel = options.scaleLabel;\n\n var isRotated = me.labelRotation !== 0;\n var isHorizontal = me.isHorizontal();\n\n var ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();\n var tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n var tickFont = parseFontOptions(optionTicks);\n var majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor);\n var majorTickFont = parseFontOptions(optionMajorTicks);\n\n var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\n var scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n var scaleLabelFont = parseFontOptions(scaleLabel);\n var scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding);\n var labelRotationRadians = helpers.toRadians(me.labelRotation);\n\n var itemsToDraw = [];\n\n var xTickStart = options.position === 'right' ? me.left : me.right - tl;\n var xTickEnd = options.position === 'right' ? me.left + tl : me.right;\n var yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl;\n var yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom;\n\n helpers.each(ticks, function(tick, index) {\n // autoskipper skipped this tick (#4635)\n if (tick.label === undefined) {\n return;\n }\n\n var label = tick.label;\n var lineWidth, lineColor, borderDash, borderDashOffset;\n if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {\n // Draw the first index specially\n lineWidth = gridLines.zeroLineWidth;\n lineColor = gridLines.zeroLineColor;\n borderDash = gridLines.zeroLineBorderDash;\n borderDashOffset = gridLines.zeroLineBorderDashOffset;\n } else {\n lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index);\n lineColor = helpers.valueAtIndexOrDefault(gridLines.color, index);\n borderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n borderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n }\n\n // Common properties\n var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n var textAlign = 'middle';\n var textBaseline = 'middle';\n var tickPadding = optionTicks.padding;\n\n if (isHorizontal) {\n var labelYOffset = tl + tickPadding;\n\n if (options.position === 'bottom') {\n // bottom\n textBaseline = !isRotated ? 'top' : 'middle';\n textAlign = !isRotated ? 'center' : 'right';\n labelY = me.top + labelYOffset;\n } else {\n // top\n textBaseline = !isRotated ? 'bottom' : 'middle';\n textAlign = !isRotated ? 'center' : 'left';\n labelY = me.bottom - labelYOffset;\n }\n\n var xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n if (xLineValue < me.left) {\n lineColor = 'rgba(0,0,0,0)';\n }\n xLineValue += helpers.aliasPixel(lineWidth);\n\n labelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n tx1 = tx2 = x1 = x2 = xLineValue;\n ty1 = yTickStart;\n ty2 = yTickEnd;\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n } else {\n var isLeft = options.position === 'left';\n var labelXOffset;\n\n if (optionTicks.mirror) {\n textAlign = isLeft ? 'left' : 'right';\n labelXOffset = tickPadding;\n } else {\n textAlign = isLeft ? 'right' : 'left';\n labelXOffset = tl + tickPadding;\n }\n\n labelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n var yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n if (yLineValue < me.top) {\n lineColor = 'rgba(0,0,0,0)';\n }\n yLineValue += helpers.aliasPixel(lineWidth);\n\n labelY = me.getPixelForTick(index) + optionTicks.labelOffset;\n\n tx1 = xTickStart;\n tx2 = xTickEnd;\n x1 = chartArea.left;\n x2 = chartArea.right;\n ty1 = ty2 = y1 = y2 = yLineValue;\n }\n\n itemsToDraw.push({\n tx1: tx1,\n ty1: ty1,\n tx2: tx2,\n ty2: ty2,\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2,\n labelX: labelX,\n labelY: labelY,\n glWidth: lineWidth,\n glColor: lineColor,\n glBorderDash: borderDash,\n glBorderDashOffset: borderDashOffset,\n rotation: -1 * labelRotationRadians,\n label: label,\n major: tick.major,\n textBaseline: textBaseline,\n textAlign: textAlign\n });\n });\n\n // Draw all of the tick labels, tick marks, and grid lines at the correct places\n helpers.each(itemsToDraw, function(itemToDraw) {\n if (gridLines.display) {\n context.save();\n context.lineWidth = itemToDraw.glWidth;\n context.strokeStyle = itemToDraw.glColor;\n if (context.setLineDash) {\n context.setLineDash(itemToDraw.glBorderDash);\n context.lineDashOffset = itemToDraw.glBorderDashOffset;\n }\n\n context.beginPath();\n\n if (gridLines.drawTicks) {\n context.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n context.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n }\n\n if (gridLines.drawOnChartArea) {\n context.moveTo(itemToDraw.x1, itemToDraw.y1);\n context.lineTo(itemToDraw.x2, itemToDraw.y2);\n }\n\n context.stroke();\n context.restore();\n }\n\n if (optionTicks.display) {\n // Make sure we draw text in the correct color and font\n context.save();\n context.translate(itemToDraw.labelX, itemToDraw.labelY);\n context.rotate(itemToDraw.rotation);\n context.font = itemToDraw.major ? majorTickFont.font : tickFont.font;\n context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;\n context.textBaseline = itemToDraw.textBaseline;\n context.textAlign = itemToDraw.textAlign;\n\n var label = itemToDraw.label;\n if (helpers.isArray(label)) {\n for (var i = 0, y = 0; i < label.length; ++i) {\n // We just make sure the multiline element is a string here..\n context.fillText('' + label[i], 0, y);\n // apply same lineSpacing as calculated @ L#320\n y += (tickFont.size * 1.5);\n }\n } else {\n context.fillText(label, 0, 0);\n }\n context.restore();\n }\n });\n\n if (scaleLabel.display) {\n // Draw the scale label\n var scaleLabelX;\n var scaleLabelY;\n var rotation = 0;\n var halfLineHeight = parseLineHeight(scaleLabel) / 2;\n\n if (isHorizontal) {\n scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\n scaleLabelY = options.position === 'bottom'\n ? me.bottom - halfLineHeight - scaleLabelPadding.bottom\n : me.top + halfLineHeight + scaleLabelPadding.top;\n } else {\n var isLeft = options.position === 'left';\n scaleLabelX = isLeft\n ? me.left + halfLineHeight + scaleLabelPadding.top\n : me.right - halfLineHeight - scaleLabelPadding.top;\n scaleLabelY = me.top + ((me.bottom - me.top) / 2);\n rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n }\n\n context.save();\n context.translate(scaleLabelX, scaleLabelY);\n context.rotate(rotation);\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n context.fillStyle = scaleLabelFontColor; // render in correct colour\n context.font = scaleLabelFont.font;\n context.fillText(scaleLabel.labelString, 0, 0);\n context.restore();\n }\n\n if (gridLines.drawBorder) {\n // Draw the line at the edge of the axis\n context.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0);\n context.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0);\n var x1 = me.left;\n var x2 = me.right;\n var y1 = me.top;\n var y2 = me.bottom;\n\n var aliasPixel = helpers.aliasPixel(context.lineWidth);\n if (isHorizontal) {\n y1 = y2 = options.position === 'top' ? me.bottom : me.top;\n y1 += aliasPixel;\n y2 += aliasPixel;\n } else {\n x1 = x2 = options.position === 'left' ? me.right : me.left;\n x1 += aliasPixel;\n x2 += aliasPixel;\n }\n\n context.beginPath();\n context.moveTo(x1, y1);\n context.lineTo(x2, y2);\n context.stroke();\n }\n }\n });\n };\n\n},{\"25\":25,\"26\":26,\"34\":34,\"45\":45}],33:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n Chart.scaleService = {\n // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n // use the new chart options to grab the correct scale\n constructors: {},\n // Use a registration function so that we can move to an ES6 map when we no longer need to support\n // old browsers\n\n // Scale config defaults\n defaults: {},\n registerScaleType: function(type, scaleConstructor, scaleDefaults) {\n this.constructors[type] = scaleConstructor;\n this.defaults[type] = helpers.clone(scaleDefaults);\n },\n getScaleConstructor: function(type) {\n return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n },\n getScaleDefaults: function(type) {\n // Return the scale defaults merged with the global settings so that we always use the latest ones\n return this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {};\n },\n updateScaleDefaults: function(type, additions) {\n var me = this;\n if (me.defaults.hasOwnProperty(type)) {\n me.defaults[type] = helpers.extend(me.defaults[type], additions);\n }\n },\n addScalesToLayout: function(chart) {\n // Adds each scale to the chart.boxes array to be sized accordingly\n helpers.each(chart.scales, function(scale) {\n // Set ILayoutItem parameters for backwards compatibility\n scale.fullWidth = scale.options.fullWidth;\n scale.position = scale.options.position;\n scale.weight = scale.options.weight;\n Chart.layoutService.addBox(chart, scale);\n });\n }\n };\n };\n\n},{\"25\":25,\"45\":45}],34:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n /**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\n module.exports = {\n /**\n * Namespace to hold generators for different types of ticks\n * @namespace Chart.Ticks.generators\n */\n generators: {\n /**\n * Interface for the options provided to the numeric tick generator\n * @interface INumericTickGenerationOptions\n */\n /**\n * The maximum number of ticks to display\n * @name INumericTickGenerationOptions#maxTicks\n * @type Number\n */\n /**\n * The distance between each tick.\n * @name INumericTickGenerationOptions#stepSize\n * @type Number\n * @optional\n */\n /**\n * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum\n * @name INumericTickGenerationOptions#min\n * @type Number\n * @optional\n */\n /**\n * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum\n * @name INumericTickGenerationOptions#max\n * @type Number\n * @optional\n */\n\n /**\n * Generate a set of linear ticks\n * @method Chart.Ticks.generators.linear\n * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n * @param dataRange {IRange} the range of the data\n * @returns {Array} array of tick values\n */\n linear: function(generationOptions, dataRange) {\n var ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n var spacing;\n if (generationOptions.stepSize && generationOptions.stepSize > 0) {\n spacing = generationOptions.stepSize;\n } else {\n var niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);\n spacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);\n }\n var niceMin = Math.floor(dataRange.min / spacing) * spacing;\n var niceMax = Math.ceil(dataRange.max / spacing) * spacing;\n\n // If min, max and stepSize is set and they make an evenly spaced scale use it.\n if (generationOptions.min && generationOptions.max && generationOptions.stepSize) {\n // If very close to our whole number, use it.\n if (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) {\n niceMin = generationOptions.min;\n niceMax = generationOptions.max;\n }\n }\n\n var numSpaces = (niceMax - niceMin) / spacing;\n // If very close to our rounded value, use it.\n if (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n\n // Put the values into the ticks array\n ticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin);\n for (var j = 1; j < numSpaces; ++j) {\n ticks.push(niceMin + (j * spacing));\n }\n ticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax);\n\n return ticks;\n },\n\n /**\n * Generate a set of logarithmic ticks\n * @method Chart.Ticks.generators.logarithmic\n * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n * @param dataRange {IRange} the range of the data\n * @returns {Array} array of tick values\n */\n logarithmic: function(generationOptions, dataRange) {\n var ticks = [];\n var valueOrDefault = helpers.valueOrDefault;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph\n var tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min))));\n\n var endExp = Math.floor(helpers.log10(dataRange.max));\n var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n var exp, significand;\n\n if (tickVal === 0) {\n exp = Math.floor(helpers.log10(dataRange.minNotZero));\n significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n ticks.push(tickVal);\n tickVal = significand * Math.pow(10, exp);\n } else {\n exp = Math.floor(helpers.log10(tickVal));\n significand = Math.floor(tickVal / Math.pow(10, exp));\n }\n\n do {\n ticks.push(tickVal);\n\n ++significand;\n if (significand === 10) {\n significand = 1;\n ++exp;\n }\n\n tickVal = significand * Math.pow(10, exp);\n } while (exp < endExp || (exp === endExp && significand < endSignificand));\n\n var lastTick = valueOrDefault(generationOptions.max, tickVal);\n ticks.push(lastTick);\n\n return ticks;\n }\n },\n\n /**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\n formatters: {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {String|Array} the label to display\n */\n values: function(value) {\n return helpers.isArray(value) ? value : '' + value;\n },\n\n /**\n * Formatter for linear numeric ticks\n * @method Chart.Ticks.formatters.linear\n * @param tickValue {Number} the value to be formatted\n * @param index {Number} the position of the tickValue parameter in the ticks array\n * @param ticks {Array} the list of ticks being converted\n * @return {String} string representation of the tickValue parameter\n */\n linear: function(tickValue, index, ticks) {\n // If we have lots of ticks, don't use the ones\n var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) > 1) {\n if (tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n }\n\n var logDelta = helpers.log10(Math.abs(delta));\n var tickString = '';\n\n if (tickValue !== 0) {\n var numDecimal = -1 * Math.floor(logDelta);\n numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n tickString = tickValue.toFixed(numDecimal);\n } else {\n tickString = '0'; // never show decimal places for 0\n }\n\n return tickString;\n },\n\n logarithmic: function(tickValue, index, ticks) {\n var remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue))));\n\n if (tickValue === 0) {\n return '0';\n } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n return tickValue.toExponential();\n }\n return '';\n }\n }\n };\n\n},{\"45\":45}],35:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n tooltips: {\n enabled: true,\n custom: null,\n mode: 'nearest',\n position: 'average',\n intersect: true,\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleFontStyle: 'bold',\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleFontColor: '#fff',\n titleAlign: 'left',\n bodySpacing: 2,\n bodyFontColor: '#fff',\n bodyAlign: 'left',\n footerFontStyle: 'bold',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFontColor: '#fff',\n footerAlign: 'left',\n yPadding: 6,\n xPadding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n multiKeyBackground: '#fff',\n displayColors: true,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n callbacks: {\n // Args are: (tooltipItems, data)\n beforeTitle: helpers.noop,\n title: function(tooltipItems, data) {\n // Pick first xLabel for now\n var title = '';\n var labels = data.labels;\n var labelCount = labels ? labels.length : 0;\n\n if (tooltipItems.length > 0) {\n var item = tooltipItems[0];\n\n if (item.xLabel) {\n title = item.xLabel;\n } else if (labelCount > 0 && item.index < labelCount) {\n title = labels[item.index];\n }\n }\n\n return title;\n },\n afterTitle: helpers.noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: helpers.noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: helpers.noop,\n label: function(tooltipItem, data) {\n var label = data.datasets[tooltipItem.datasetIndex].label || '';\n\n if (label) {\n label += ': ';\n }\n label += tooltipItem.yLabel;\n return label;\n },\n labelColor: function(tooltipItem, chart) {\n var meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n var activeElement = meta.data[tooltipItem.index];\n var view = activeElement._view;\n return {\n borderColor: view.borderColor,\n backgroundColor: view.backgroundColor\n };\n },\n labelTextColor: function() {\n return this._options.bodyFontColor;\n },\n afterLabel: helpers.noop,\n\n // Args are: (tooltipItems, data)\n afterBody: helpers.noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: helpers.noop,\n footer: helpers.noop,\n afterFooter: helpers.noop\n }\n }\n });\n\n module.exports = function(Chart) {\n\n /**\n * Helper method to merge the opacity into a color\n */\n function mergeOpacity(colorString, opacity) {\n var color = helpers.color(colorString);\n return color.alpha(opacity * color.alpha()).rgbaString();\n }\n\n // Helper to push or concat based on if the 2nd parameter is an array or not\n function pushOrConcat(base, toPush) {\n if (toPush) {\n if (helpers.isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n }\n\n // Private helper to create a tooltip item model\n // @param element : the chart element (point, arc, bar) to create the tooltip item for\n // @return : new tooltip item\n function createTooltipItem(element) {\n var xScale = element._xScale;\n var yScale = element._yScale || element._scale; // handle radar || polarArea charts\n var index = element._index;\n var datasetIndex = element._datasetIndex;\n\n return {\n xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n index: index,\n datasetIndex: datasetIndex,\n x: element._model.x,\n y: element._model.y\n };\n }\n\n /**\n * Helper to get the reset model for the tooltip\n * @param tooltipOpts {Object} the tooltip options\n */\n function getBaseModel(tooltipOpts) {\n var globalDefaults = defaults.global;\n var valueOrDefault = helpers.valueOrDefault;\n\n return {\n // Positioning\n xPadding: tooltipOpts.xPadding,\n yPadding: tooltipOpts.yPadding,\n xAlign: tooltipOpts.xAlign,\n yAlign: tooltipOpts.yAlign,\n\n // Body\n bodyFontColor: tooltipOpts.bodyFontColor,\n _bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n _bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n _bodyAlign: tooltipOpts.bodyAlign,\n bodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n bodySpacing: tooltipOpts.bodySpacing,\n\n // Title\n titleFontColor: tooltipOpts.titleFontColor,\n _titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n _titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n titleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n _titleAlign: tooltipOpts.titleAlign,\n titleSpacing: tooltipOpts.titleSpacing,\n titleMarginBottom: tooltipOpts.titleMarginBottom,\n\n // Footer\n footerFontColor: tooltipOpts.footerFontColor,\n _footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n _footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n footerFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n _footerAlign: tooltipOpts.footerAlign,\n footerSpacing: tooltipOpts.footerSpacing,\n footerMarginTop: tooltipOpts.footerMarginTop,\n\n // Appearance\n caretSize: tooltipOpts.caretSize,\n cornerRadius: tooltipOpts.cornerRadius,\n backgroundColor: tooltipOpts.backgroundColor,\n opacity: 0,\n legendColorBackground: tooltipOpts.multiKeyBackground,\n displayColors: tooltipOpts.displayColors,\n borderColor: tooltipOpts.borderColor,\n borderWidth: tooltipOpts.borderWidth\n };\n }\n\n /**\n * Get the size of the tooltip\n */\n function getTooltipSize(tooltip, model) {\n var ctx = tooltip._chart.ctx;\n\n var height = model.yPadding * 2; // Tooltip Padding\n var width = 0;\n\n // Count of all lines in the body\n var body = model.body;\n var combinedBodyLength = body.reduce(function(count, bodyItem) {\n return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n }, 0);\n combinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n var titleLineCount = model.title.length;\n var footerLineCount = model.footer.length;\n var titleFontSize = model.titleFontSize;\n var bodyFontSize = model.bodyFontSize;\n var footerFontSize = model.footerFontSize;\n\n height += titleLineCount * titleFontSize; // Title Lines\n height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n height += combinedBodyLength * bodyFontSize; // Body Lines\n height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n height += footerLineCount * (footerFontSize); // Footer Lines\n height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n // Title width\n var widthPadding = 0;\n var maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n helpers.each(model.title, maxLineWidth);\n\n // Body width\n ctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n helpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\n helpers.each(body, function(bodyItem) {\n helpers.each(bodyItem.before, maxLineWidth);\n helpers.each(bodyItem.lines, maxLineWidth);\n helpers.each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n helpers.each(model.footer, maxLineWidth);\n\n // Add padding\n width += 2 * model.xPadding;\n\n return {\n width: width,\n height: height\n };\n }\n\n /**\n * Helper to get the alignment of a tooltip given the size\n */\n function determineAlignment(tooltip, size) {\n var model = tooltip._model;\n var chart = tooltip._chart;\n var chartArea = tooltip._chart.chartArea;\n var xAlign = 'center';\n var yAlign = 'center';\n\n if (model.y < size.height) {\n yAlign = 'top';\n } else if (model.y > (chart.height - size.height)) {\n yAlign = 'bottom';\n }\n\n var lf, rf; // functions to determine left, right alignment\n var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n var midX = (chartArea.left + chartArea.right) / 2;\n var midY = (chartArea.top + chartArea.bottom) / 2;\n\n if (yAlign === 'center') {\n lf = function(x) {\n return x <= midX;\n };\n rf = function(x) {\n return x > midX;\n };\n } else {\n lf = function(x) {\n return x <= (size.width / 2);\n };\n rf = function(x) {\n return x >= (chart.width - (size.width / 2));\n };\n }\n\n olf = function(x) {\n return x + size.width > chart.width;\n };\n orf = function(x) {\n return x - size.width < 0;\n };\n yf = function(y) {\n return y <= midY ? 'top' : 'bottom';\n };\n\n if (lf(model.x)) {\n xAlign = 'left';\n\n // Is tooltip too wide and goes over the right side of the chart.?\n if (olf(model.x)) {\n xAlign = 'center';\n yAlign = yf(model.y);\n }\n } else if (rf(model.x)) {\n xAlign = 'right';\n\n // Is tooltip too wide and goes outside left edge of canvas?\n if (orf(model.x)) {\n xAlign = 'center';\n yAlign = yf(model.y);\n }\n }\n\n var opts = tooltip._options;\n return {\n xAlign: opts.xAlign ? opts.xAlign : xAlign,\n yAlign: opts.yAlign ? opts.yAlign : yAlign\n };\n }\n\n /**\n * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\n function getBackgroundPoint(vm, size, alignment) {\n // Background Position\n var x = vm.x;\n var y = vm.y;\n\n var caretSize = vm.caretSize;\n var caretPadding = vm.caretPadding;\n var cornerRadius = vm.cornerRadius;\n var xAlign = alignment.xAlign;\n var yAlign = alignment.yAlign;\n var paddingAndSize = caretSize + caretPadding;\n var radiusAndPadding = cornerRadius + caretPadding;\n\n if (xAlign === 'right') {\n x -= size.width;\n } else if (xAlign === 'center') {\n x -= (size.width / 2);\n }\n\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= size.height + paddingAndSize;\n } else {\n y -= (size.height / 2);\n }\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= radiusAndPadding;\n } else if (xAlign === 'right') {\n x += radiusAndPadding;\n }\n\n return {\n x: x,\n y: y\n };\n }\n\n Chart.Tooltip = Element.extend({\n initialize: function() {\n this._model = getBaseModel(this._options);\n },\n\n // Get the title\n // Args are: (tooltipItem, data)\n getTitle: function() {\n var me = this;\n var opts = me._options;\n var callbacks = opts.callbacks;\n\n var beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n var title = callbacks.title.apply(me, arguments);\n var afterTitle = callbacks.afterTitle.apply(me, arguments);\n\n var lines = [];\n lines = pushOrConcat(lines, beforeTitle);\n lines = pushOrConcat(lines, title);\n lines = pushOrConcat(lines, afterTitle);\n\n return lines;\n },\n\n // Args are: (tooltipItem, data)\n getBeforeBody: function() {\n var lines = this._options.callbacks.beforeBody.apply(this, arguments);\n return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n },\n\n // Args are: (tooltipItem, data)\n getBody: function(tooltipItems, data) {\n var me = this;\n var callbacks = me._options.callbacks;\n var bodyItems = [];\n\n helpers.each(tooltipItems, function(tooltipItem) {\n var bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n pushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\n pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n pushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n },\n\n // Args are: (tooltipItem, data)\n getAfterBody: function() {\n var lines = this._options.callbacks.afterBody.apply(this, arguments);\n return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n },\n\n // Get the footer and beforeFooter and afterFooter lines\n // Args are: (tooltipItem, data)\n getFooter: function() {\n var me = this;\n var callbacks = me._options.callbacks;\n\n var beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n var footer = callbacks.footer.apply(me, arguments);\n var afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n var lines = [];\n lines = pushOrConcat(lines, beforeFooter);\n lines = pushOrConcat(lines, footer);\n lines = pushOrConcat(lines, afterFooter);\n\n return lines;\n },\n\n update: function(changed) {\n var me = this;\n var opts = me._options;\n\n // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n // which breaks any animations.\n var existingModel = me._model;\n var model = me._model = getBaseModel(opts);\n var active = me._active;\n\n var data = me._data;\n\n // In the case where active.length === 0 we need to keep these at existing values for good animations\n var alignment = {\n xAlign: existingModel.xAlign,\n yAlign: existingModel.yAlign\n };\n var backgroundPoint = {\n x: existingModel.x,\n y: existingModel.y\n };\n var tooltipSize = {\n width: existingModel.width,\n height: existingModel.height\n };\n var tooltipPosition = {\n x: existingModel.caretX,\n y: existingModel.caretY\n };\n\n var i, len;\n\n if (active.length) {\n model.opacity = 1;\n\n var labelColors = [];\n var labelTextColors = [];\n tooltipPosition = Chart.Tooltip.positioners[opts.position](active, me._eventPosition);\n\n var tooltipItems = [];\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (opts.filter) {\n tooltipItems = tooltipItems.filter(function(a) {\n return opts.filter(a, data);\n });\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (opts.itemSort) {\n tooltipItems = tooltipItems.sort(function(a, b) {\n return opts.itemSort(a, b, data);\n });\n }\n\n // Determine colors for boxes\n helpers.each(tooltipItems, function(tooltipItem) {\n labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n });\n\n\n // Build the Text Lines\n model.title = me.getTitle(tooltipItems, data);\n model.beforeBody = me.getBeforeBody(tooltipItems, data);\n model.body = me.getBody(tooltipItems, data);\n model.afterBody = me.getAfterBody(tooltipItems, data);\n model.footer = me.getFooter(tooltipItems, data);\n\n // Initial positioning and colors\n model.x = Math.round(tooltipPosition.x);\n model.y = Math.round(tooltipPosition.y);\n model.caretPadding = opts.caretPadding;\n model.labelColors = labelColors;\n model.labelTextColors = labelTextColors;\n\n // data points\n model.dataPoints = tooltipItems;\n\n // We need to determine alignment of the tooltip\n tooltipSize = getTooltipSize(this, model);\n alignment = determineAlignment(this, tooltipSize);\n // Final Size and Position\n backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment);\n } else {\n model.opacity = 0;\n }\n\n model.xAlign = alignment.xAlign;\n model.yAlign = alignment.yAlign;\n model.x = backgroundPoint.x;\n model.y = backgroundPoint.y;\n model.width = tooltipSize.width;\n model.height = tooltipSize.height;\n\n // Point where the caret on the tooltip points to\n model.caretX = tooltipPosition.x;\n model.caretY = tooltipPosition.y;\n\n me._model = model;\n\n if (changed && opts.custom) {\n opts.custom.call(me, model);\n }\n\n return me;\n },\n drawCaret: function(tooltipPoint, size) {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n },\n getCaretPosition: function(tooltipPoint, size, vm) {\n var x1, x2, x3, y1, y2, y3;\n var caretSize = vm.caretSize;\n var cornerRadius = vm.cornerRadius;\n var xAlign = vm.xAlign;\n var yAlign = vm.yAlign;\n var ptX = tooltipPoint.x;\n var ptY = tooltipPoint.y;\n var width = size.width;\n var height = size.height;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n x3 = x1;\n\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n x3 = x1;\n\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n } else {\n if (xAlign === 'left') {\n x2 = ptX + cornerRadius + (caretSize);\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else if (xAlign === 'right') {\n x2 = ptX + width - cornerRadius - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n x2 = ptX + (width / 2);\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n y3 = y1;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n y3 = y1;\n // invert drawing order\n var tmp = x3;\n x3 = x1;\n x1 = tmp;\n }\n }\n return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};\n },\n drawTitle: function(pt, vm, ctx, opacity) {\n var title = vm.title;\n\n if (title.length) {\n ctx.textAlign = vm._titleAlign;\n ctx.textBaseline = 'top';\n\n var titleFontSize = vm.titleFontSize;\n var titleSpacing = vm.titleSpacing;\n\n ctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n var i, len;\n for (i = 0, len = title.length; i < len; ++i) {\n ctx.fillText(title[i], pt.x, pt.y);\n pt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n if (i + 1 === title.length) {\n pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n },\n drawBody: function(pt, vm, ctx, opacity) {\n var bodyFontSize = vm.bodyFontSize;\n var bodySpacing = vm.bodySpacing;\n var body = vm.body;\n\n ctx.textAlign = vm._bodyAlign;\n ctx.textBaseline = 'top';\n ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n // Before Body\n var xLinePadding = 0;\n var fillLineOfText = function(line) {\n ctx.fillText(line, pt.x + xLinePadding, pt.y);\n pt.y += bodyFontSize + bodySpacing;\n };\n\n // Before body lines\n helpers.each(vm.beforeBody, fillLineOfText);\n\n var drawColorBoxes = vm.displayColors;\n xLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\n\n // Draw body lines now\n helpers.each(body, function(bodyItem, i) {\n helpers.each(bodyItem.before, fillLineOfText);\n\n helpers.each(bodyItem.lines, function(line) {\n // Draw Legend-like boxes if needed\n if (drawColorBoxes) {\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n ctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n ctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n // Border\n ctx.lineWidth = 1;\n ctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n ctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n // Inner square\n ctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n ctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n var textColor = mergeOpacity(vm.labelTextColors[i], opacity);\n ctx.fillStyle = textColor;\n }\n\n fillLineOfText(line);\n });\n\n helpers.each(bodyItem.after, fillLineOfText);\n });\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n\n // After body lines\n helpers.each(vm.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n },\n drawFooter: function(pt, vm, ctx, opacity) {\n var footer = vm.footer;\n\n if (footer.length) {\n pt.y += vm.footerMarginTop;\n\n ctx.textAlign = vm._footerAlign;\n ctx.textBaseline = 'top';\n\n ctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n helpers.each(footer, function(line) {\n ctx.fillText(line, pt.x, pt.y);\n pt.y += vm.footerFontSize + vm.footerSpacing;\n });\n }\n },\n drawBackground: function(pt, vm, ctx, tooltipSize, opacity) {\n ctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n ctx.strokeStyle = mergeOpacity(vm.borderColor, opacity);\n ctx.lineWidth = vm.borderWidth;\n var xAlign = vm.xAlign;\n var yAlign = vm.yAlign;\n var x = pt.x;\n var y = pt.y;\n var width = tooltipSize.width;\n var height = tooltipSize.height;\n var radius = vm.cornerRadius;\n\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (vm.borderWidth > 0) {\n ctx.stroke();\n }\n },\n draw: function() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n\n if (vm.opacity === 0) {\n return;\n }\n\n var tooltipSize = {\n width: vm.width,\n height: vm.height\n };\n var pt = {\n x: vm.x,\n y: vm.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n // Truthy/falsey value for empty tooltip\n var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n if (this._options.enabled && hasTooltipContent) {\n // Draw Background\n this.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n // Draw Title, Body, and Footer\n pt.x += vm.xPadding;\n pt.y += vm.yPadding;\n\n // Titles\n this.drawTitle(pt, vm, ctx, opacity);\n\n // Body\n this.drawBody(pt, vm, ctx, opacity);\n\n // Footer\n this.drawFooter(pt, vm, ctx, opacity);\n }\n },\n\n /**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n * @returns {Boolean} true if the tooltip changed\n */\n handleEvent: function(e) {\n var me = this;\n var options = me._options;\n var changed = false;\n\n me._lastActive = me._lastActive || [];\n\n // Find Active Elements for tooltips\n if (e.type === 'mouseout') {\n me._active = [];\n } else {\n me._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n }\n\n // Remember Last Actives\n changed = !helpers.arrayEquals(me._active, me._lastActive);\n\n // If tooltip didn't change, do not handle the target event\n if (!changed) {\n return false;\n }\n\n me._lastActive = me._active;\n\n if (options.enabled || options.custom) {\n me._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n var model = me._model;\n me.update(true);\n me.pivot();\n\n // See if our tooltip position changed\n changed |= (model.x !== me._model.x) || (model.y !== me._model.y);\n }\n\n return changed;\n }\n });\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n Chart.Tooltip.positioners = {\n /**\n * Average mode places the tooltip at the average position of the elements shown\n * @function Chart.Tooltip.positioners.average\n * @param elements {ChartElement[]} the elements being displayed in the tooltip\n * @returns {Point} tooltip position\n */\n average: function(elements) {\n if (!elements.length) {\n return false;\n }\n\n var i, len;\n var x = 0;\n var y = 0;\n var count = 0;\n\n for (i = 0, len = elements.length; i < len; ++i) {\n var el = elements[i];\n if (el && el.hasValue()) {\n var pos = el.tooltipPosition();\n x += pos.x;\n y += pos.y;\n ++count;\n }\n }\n\n return {\n x: Math.round(x / count),\n y: Math.round(y / count)\n };\n },\n\n /**\n * Gets the tooltip position nearest of the item nearest to the event position\n * @function Chart.Tooltip.positioners.nearest\n * @param elements {Chart.Element[]} the tooltip elements\n * @param eventPosition {Point} the position of the event in canvas coordinates\n * @returns {Point} the tooltip position\n */\n nearest: function(elements, eventPosition) {\n var x = eventPosition.x;\n var y = eventPosition.y;\n var minDistance = Number.POSITIVE_INFINITY;\n var i, len, nearestElement;\n\n for (i = 0, len = elements.length; i < len; ++i) {\n var el = elements[i];\n if (el && el.hasValue()) {\n var center = el.getCenterPoint();\n var d = helpers.distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n var tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x: x,\n y: y\n };\n }\n };\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],36:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n elements: {\n arc: {\n backgroundColor: defaults.global.defaultColor,\n borderColor: '#fff',\n borderWidth: 2\n }\n }\n });\n\n module.exports = Element.extend({\n inLabelRange: function(mouseX) {\n var vm = this._view;\n\n if (vm) {\n return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));\n }\n return false;\n },\n\n inRange: function(chartX, chartY) {\n var vm = this._view;\n\n if (vm) {\n var pointRelativePosition = helpers.getAngleFromPoint(vm, {x: chartX, y: chartY});\n var\tangle = pointRelativePosition.angle;\n var distance = pointRelativePosition.distance;\n\n // Sanitise angle range\n var startAngle = vm.startAngle;\n var endAngle = vm.endAngle;\n while (endAngle < startAngle) {\n endAngle += 2.0 * Math.PI;\n }\n while (angle > endAngle) {\n angle -= 2.0 * Math.PI;\n }\n while (angle < startAngle) {\n angle += 2.0 * Math.PI;\n }\n\n // Check if within the range of the open/close angle\n var betweenAngles = (angle >= startAngle && angle <= endAngle);\n var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);\n\n return (betweenAngles && withinRadius);\n }\n return false;\n },\n\n getCenterPoint: function() {\n var vm = this._view;\n var halfAngle = (vm.startAngle + vm.endAngle) / 2;\n var halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n return {\n x: vm.x + Math.cos(halfAngle) * halfRadius,\n y: vm.y + Math.sin(halfAngle) * halfRadius\n };\n },\n\n getArea: function() {\n var vm = this._view;\n return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n },\n\n tooltipPosition: function() {\n var vm = this._view;\n var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2);\n var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\n return {\n x: vm.x + (Math.cos(centreAngle) * rangeFromCentre),\n y: vm.y + (Math.sin(centreAngle) * rangeFromCentre)\n };\n },\n\n draw: function() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var sA = vm.startAngle;\n var eA = vm.endAngle;\n\n ctx.beginPath();\n\n ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\n ctx.closePath();\n ctx.strokeStyle = vm.borderColor;\n ctx.lineWidth = vm.borderWidth;\n\n ctx.fillStyle = vm.backgroundColor;\n\n ctx.fill();\n ctx.lineJoin = 'bevel';\n\n if (vm.borderWidth) {\n ctx.stroke();\n }\n }\n });\n\n},{\"25\":25,\"26\":26,\"45\":45}],37:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n var globalDefaults = defaults.global;\n\n defaults._set('global', {\n elements: {\n line: {\n tension: 0.4,\n backgroundColor: globalDefaults.defaultColor,\n borderWidth: 3,\n borderColor: globalDefaults.defaultColor,\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0.0,\n borderJoinStyle: 'miter',\n capBezierPoints: true,\n fill: true, // do we fill in the area between the line and its base axis\n }\n }\n });\n\n module.exports = Element.extend({\n draw: function() {\n var me = this;\n var vm = me._view;\n var ctx = me._chart.ctx;\n var spanGaps = vm.spanGaps;\n var points = me._children.slice(); // clone array\n var globalOptionLineElements = globalDefaults.elements.line;\n var lastDrawnIndex = -1;\n var index, current, previous, currentVM;\n\n // If we are looping, adding the first point again\n if (me._loop && points.length) {\n points.push(points[0]);\n }\n\n ctx.save();\n\n // Stroke Line Options\n ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n // IE 9 and 10 do not support line dash\n if (ctx.setLineDash) {\n ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n }\n\n ctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset;\n ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n ctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth;\n ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n // Stroke Line\n ctx.beginPath();\n lastDrawnIndex = -1;\n\n for (index = 0; index < points.length; ++index) {\n current = points[index];\n previous = helpers.previousItem(points, index);\n currentVM = current._view;\n\n // First point moves to it's starting position no matter what\n if (index === 0) {\n if (!currentVM.skip) {\n ctx.moveTo(currentVM.x, currentVM.y);\n lastDrawnIndex = index;\n }\n } else {\n previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n if (!currentVM.skip) {\n if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {\n // There was a gap and this is the first point after the gap\n ctx.moveTo(currentVM.x, currentVM.y);\n } else {\n // Line to next point\n helpers.canvas.lineTo(ctx, previous._view, current._view);\n }\n lastDrawnIndex = index;\n }\n }\n }\n\n ctx.stroke();\n ctx.restore();\n }\n });\n\n},{\"25\":25,\"26\":26,\"45\":45}],38:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n var defaultColor = defaults.global.defaultColor;\n\n defaults._set('global', {\n elements: {\n point: {\n radius: 3,\n pointStyle: 'circle',\n backgroundColor: defaultColor,\n borderColor: defaultColor,\n borderWidth: 1,\n // Hover\n hitRadius: 1,\n hoverRadius: 4,\n hoverBorderWidth: 1\n }\n }\n });\n\n function xRange(mouseX) {\n var vm = this._view;\n return vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n }\n\n function yRange(mouseY) {\n var vm = this._view;\n return vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n }\n\n module.exports = Element.extend({\n inRange: function(mouseX, mouseY) {\n var vm = this._view;\n return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;\n },\n\n inLabelRange: xRange,\n inXRange: xRange,\n inYRange: yRange,\n\n getCenterPoint: function() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y\n };\n },\n\n getArea: function() {\n return Math.PI * Math.pow(this._view.radius, 2);\n },\n\n tooltipPosition: function() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y,\n padding: vm.radius + vm.borderWidth\n };\n },\n\n draw: function(chartArea) {\n var vm = this._view;\n var model = this._model;\n var ctx = this._chart.ctx;\n var pointStyle = vm.pointStyle;\n var radius = vm.radius;\n var x = vm.x;\n var y = vm.y;\n var color = helpers.color;\n var errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.)\n var ratio = 0;\n\n if (vm.skip) {\n return;\n }\n\n ctx.strokeStyle = vm.borderColor || defaultColor;\n ctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth);\n ctx.fillStyle = vm.backgroundColor || defaultColor;\n\n // Cliping for Points.\n // going out from inner charArea?\n if ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right * errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom * errMargin < model.y))) {\n // Point fade out\n if (model.x < chartArea.left) {\n ratio = (x - model.x) / (chartArea.left - model.x);\n } else if (chartArea.right * errMargin < model.x) {\n ratio = (model.x - x) / (model.x - chartArea.right);\n } else if (model.y < chartArea.top) {\n ratio = (y - model.y) / (chartArea.top - model.y);\n } else if (chartArea.bottom * errMargin < model.y) {\n ratio = (model.y - y) / (model.y - chartArea.bottom);\n }\n ratio = Math.round(ratio * 100) / 100;\n ctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString();\n ctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString();\n }\n\n helpers.canvas.drawPoint(ctx, pointStyle, radius, x, y);\n }\n });\n\n},{\"25\":25,\"26\":26,\"45\":45}],39:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n\n defaults._set('global', {\n elements: {\n rectangle: {\n backgroundColor: defaults.global.defaultColor,\n borderColor: defaults.global.defaultColor,\n borderSkipped: 'bottom',\n borderWidth: 0\n }\n }\n });\n\n function isVertical(bar) {\n return bar._view.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 */\n function getBarBounds(bar) {\n var vm = bar._view;\n var x1, x2, y1, y2;\n\n if (isVertical(bar)) {\n // vertical\n var halfWidth = vm.width / 2;\n x1 = vm.x - halfWidth;\n x2 = vm.x + halfWidth;\n y1 = Math.min(vm.y, vm.base);\n y2 = Math.max(vm.y, vm.base);\n } else {\n // horizontal bar\n var halfHeight = vm.height / 2;\n x1 = Math.min(vm.x, vm.base);\n x2 = Math.max(vm.x, vm.base);\n y1 = vm.y - halfHeight;\n y2 = vm.y + halfHeight;\n }\n\n return {\n left: x1,\n top: y1,\n right: x2,\n bottom: y2\n };\n }\n\n module.exports = Element.extend({\n draw: function() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var left, right, top, bottom, signX, signY, borderSkipped;\n var borderWidth = vm.borderWidth;\n\n if (!vm.horizontal) {\n // bar\n left = vm.x - vm.width / 2;\n right = vm.x + vm.width / 2;\n top = vm.y;\n bottom = vm.base;\n signX = 1;\n signY = bottom > top ? 1 : -1;\n borderSkipped = vm.borderSkipped || 'bottom';\n } else {\n // horizontal bar\n left = vm.base;\n right = vm.x;\n top = vm.y - vm.height / 2;\n bottom = vm.y + vm.height / 2;\n signX = right > left ? 1 : -1;\n signY = 1;\n borderSkipped = vm.borderSkipped || 'left';\n }\n\n // Canvas doesn't allow us to stroke inside the width so we can\n // adjust the sizes to fit if we're setting a stroke on the line\n if (borderWidth) {\n // borderWidth shold be less than bar width and bar height.\n var barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n borderWidth = borderWidth > barSize ? barSize : borderWidth;\n var halfStroke = borderWidth / 2;\n // Adjust borderWidth when bar top position is near vm.base(zero).\n var borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0);\n var borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0);\n var borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0);\n var borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0);\n // not become a vertical line?\n if (borderLeft !== borderRight) {\n top = borderTop;\n bottom = borderBottom;\n }\n // not become a horizontal line?\n if (borderTop !== borderBottom) {\n left = borderLeft;\n right = borderRight;\n }\n }\n\n ctx.beginPath();\n ctx.fillStyle = vm.backgroundColor;\n ctx.strokeStyle = vm.borderColor;\n ctx.lineWidth = borderWidth;\n\n // Corner points, from bottom-left to bottom-right clockwise\n // | 1 2 |\n // | 0 3 |\n var corners = [\n [left, bottom],\n [left, top],\n [right, top],\n [right, bottom]\n ];\n\n // Find first (starting) corner with fallback to 'bottom'\n var borders = ['bottom', 'left', 'top', 'right'];\n var startCorner = borders.indexOf(borderSkipped, 0);\n if (startCorner === -1) {\n startCorner = 0;\n }\n\n function cornerAt(index) {\n return corners[(startCorner + index) % 4];\n }\n\n // Draw rectangle from 'startCorner'\n var corner = cornerAt(0);\n ctx.moveTo(corner[0], corner[1]);\n\n for (var i = 1; i < 4; i++) {\n corner = cornerAt(i);\n ctx.lineTo(corner[0], corner[1]);\n }\n\n ctx.fill();\n if (borderWidth) {\n ctx.stroke();\n }\n },\n\n height: function() {\n var vm = this._view;\n return vm.base - vm.y;\n },\n\n inRange: function(mouseX, mouseY) {\n var inRange = false;\n\n if (this._view) {\n var bounds = getBarBounds(this);\n inRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;\n }\n\n return inRange;\n },\n\n inLabelRange: function(mouseX, mouseY) {\n var me = this;\n if (!me._view) {\n return false;\n }\n\n var inRange = false;\n var bounds = getBarBounds(me);\n\n if (isVertical(me)) {\n inRange = mouseX >= bounds.left && mouseX <= bounds.right;\n } else {\n inRange = mouseY >= bounds.top && mouseY <= bounds.bottom;\n }\n\n return inRange;\n },\n\n inXRange: function(mouseX) {\n var bounds = getBarBounds(this);\n return mouseX >= bounds.left && mouseX <= bounds.right;\n },\n\n inYRange: function(mouseY) {\n var bounds = getBarBounds(this);\n return mouseY >= bounds.top && mouseY <= bounds.bottom;\n },\n\n getCenterPoint: function() {\n var vm = this._view;\n var x, y;\n if (isVertical(this)) {\n x = vm.x;\n y = (vm.y + vm.base) / 2;\n } else {\n x = (vm.x + vm.base) / 2;\n y = vm.y;\n }\n\n return {x: x, y: y};\n },\n\n getArea: function() {\n var vm = this._view;\n return vm.width * Math.abs(vm.y - vm.base);\n },\n\n tooltipPosition: function() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y\n };\n }\n });\n\n},{\"25\":25,\"26\":26}],40:[function(require,module,exports){\n 'use strict';\n\n module.exports = {};\n module.exports.Arc = require(36);\n module.exports.Line = require(37);\n module.exports.Point = require(38);\n module.exports.Rectangle = require(39);\n\n},{\"36\":36,\"37\":37,\"38\":38,\"39\":39}],41:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(42);\n\n /**\n * @namespace Chart.helpers.canvas\n */\n var exports = module.exports = {\n /**\n * Clears the entire canvas associated to the given `chart`.\n * @param {Chart} chart - The chart for which to clear the canvas.\n */\n clear: function(chart) {\n chart.ctx.clearRect(0, 0, chart.width, chart.height);\n },\n\n /**\n * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\n * given size (width, height) and the same `radius` for all corners.\n * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\n * @param {Number} x - The x axis of the coordinate for the rectangle starting point.\n * @param {Number} y - The y axis of the coordinate for the rectangle starting point.\n * @param {Number} width - The rectangle's width.\n * @param {Number} height - The rectangle's height.\n * @param {Number} radius - The rounded amount (in pixels) for the four corners.\n * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\n */\n roundedRect: function(ctx, x, y, width, height, radius) {\n if (radius) {\n var rx = Math.min(radius, width / 2);\n var ry = Math.min(radius, height / 2);\n\n ctx.moveTo(x + rx, y);\n ctx.lineTo(x + width - rx, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + ry);\n ctx.lineTo(x + width, y + height - ry);\n ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height);\n ctx.lineTo(x + rx, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - ry);\n ctx.lineTo(x, y + ry);\n ctx.quadraticCurveTo(x, y, x + rx, y);\n } else {\n ctx.rect(x, y, width, height);\n }\n },\n\n drawPoint: function(ctx, style, radius, x, y) {\n var type, edgeLength, xOffset, yOffset, height, size;\n\n if (typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n switch (style) {\n // Default includes circle\n default:\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangle':\n ctx.beginPath();\n edgeLength = 3 * radius / Math.sqrt(3);\n height = edgeLength * Math.sqrt(3) / 2;\n ctx.moveTo(x - edgeLength / 2, y + height / 3);\n ctx.lineTo(x + edgeLength / 2, y + height / 3);\n ctx.lineTo(x, y - 2 * height / 3);\n ctx.closePath();\n ctx.fill();\n break;\n case 'rect':\n size = 1 / Math.SQRT2 * radius;\n ctx.beginPath();\n ctx.fillRect(x - size, y - size, 2 * size, 2 * size);\n ctx.strokeRect(x - size, y - size, 2 * size, 2 * size);\n break;\n case 'rectRounded':\n var offset = radius / Math.SQRT2;\n var leftX = x - offset;\n var topY = y - offset;\n var sideSize = Math.SQRT2 * radius;\n ctx.beginPath();\n this.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius / 2);\n ctx.closePath();\n ctx.fill();\n break;\n case 'rectRot':\n size = 1 / Math.SQRT2 * radius;\n ctx.beginPath();\n ctx.moveTo(x - size, y);\n ctx.lineTo(x, y + size);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x, y - size);\n ctx.closePath();\n ctx.fill();\n break;\n case 'cross':\n ctx.beginPath();\n ctx.moveTo(x, y + radius);\n ctx.lineTo(x, y - radius);\n ctx.moveTo(x - radius, y);\n ctx.lineTo(x + radius, y);\n ctx.closePath();\n break;\n case 'crossRot':\n ctx.beginPath();\n xOffset = Math.cos(Math.PI / 4) * radius;\n yOffset = Math.sin(Math.PI / 4) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x - xOffset, y + yOffset);\n ctx.lineTo(x + xOffset, y - yOffset);\n ctx.closePath();\n break;\n case 'star':\n ctx.beginPath();\n ctx.moveTo(x, y + radius);\n ctx.lineTo(x, y - radius);\n ctx.moveTo(x - radius, y);\n ctx.lineTo(x + radius, y);\n xOffset = Math.cos(Math.PI / 4) * radius;\n yOffset = Math.sin(Math.PI / 4) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x - xOffset, y + yOffset);\n ctx.lineTo(x + xOffset, y - yOffset);\n ctx.closePath();\n break;\n case 'line':\n ctx.beginPath();\n ctx.moveTo(x - radius, y);\n ctx.lineTo(x + radius, y);\n ctx.closePath();\n break;\n case 'dash':\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + radius, y);\n ctx.closePath();\n break;\n }\n\n ctx.stroke();\n },\n\n clipArea: function(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n },\n\n unclipArea: function(ctx) {\n ctx.restore();\n },\n\n lineTo: function(ctx, previous, target, flip) {\n if (target.steppedLine) {\n if ((target.steppedLine === 'after' && !flip) || (target.steppedLine !== 'after' && flip)) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n return;\n }\n\n if (!target.tension) {\n ctx.lineTo(target.x, target.y);\n return;\n }\n\n ctx.bezierCurveTo(\n flip ? previous.controlPointPreviousX : previous.controlPointNextX,\n flip ? previous.controlPointPreviousY : previous.controlPointNextY,\n flip ? target.controlPointNextX : target.controlPointPreviousX,\n flip ? target.controlPointNextY : target.controlPointPreviousY,\n target.x,\n target.y);\n }\n };\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 */\n helpers.clear = exports.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 */\n helpers.drawRoundedRectangle = function(ctx) {\n ctx.beginPath();\n exports.roundedRect.apply(exports, arguments);\n ctx.closePath();\n };\n\n},{\"42\":42}],42:[function(require,module,exports){\n 'use strict';\n\n /**\n * @namespace Chart.helpers\n */\n var helpers = {\n /**\n * An empty function that can be used, for example, for optional callback.\n */\n noop: function() {},\n\n /**\n * Returns a unique id, sequentially generated from a global variable.\n * @returns {Number}\n * @function\n */\n uid: (function() {\n var id = 0;\n return function() {\n return id++;\n };\n }()),\n\n /**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @since 2.7.0\n */\n isNullOrUndef: function(value) {\n return value === null || typeof value === 'undefined';\n },\n\n /**\n * Returns true if `value` is an array, else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @function\n */\n isArray: Array.isArray ? Array.isArray : function(value) {\n return Object.prototype.toString.call(value) === '[object Array]';\n },\n\n /**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @since 2.7.0\n */\n isObject: function(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n },\n\n /**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param {*} value - The value to return if defined.\n * @param {*} defaultValue - The value to return if `value` is undefined.\n * @returns {*}\n */\n valueOrDefault: function(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n },\n\n /**\n * Returns value at the given `index` in array if defined, else returns `defaultValue`.\n * @param {Array} value - The array to lookup for value at `index`.\n * @param {Number} index - The index in `value` to lookup for value.\n * @param {*} defaultValue - The value to return if `value[index]` is undefined.\n * @returns {*}\n */\n valueAtIndexOrDefault: function(value, index, defaultValue) {\n return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\n },\n\n /**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param {Function} fn - The function to call.\n * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @returns {*}\n */\n callback: function(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n },\n\n /**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param {Object|Array} loopable - The object or array to be iterated.\n * @param {Function} fn - The function to call for each item.\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @param {Boolean} [reverse] - If true, iterates backward on the loopable.\n */\n each: function(loopable, fn, thisArg, reverse) {\n var i, len, keys;\n if (helpers.isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (helpers.isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n },\n\n /**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @see http://stackoverflow.com/a/14853974\n * @param {Array} a0 - The array to compare\n * @param {Array} a1 - The array to compare\n * @returns {Boolean}\n */\n arrayEquals: function(a0, a1) {\n var i, ilen, v0, v1;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0 instanceof Array && v1 instanceof Array) {\n if (!helpers.arrayEquals(v0, v1)) {\n return false;\n }\n } else if (v0 !== v1) {\n // NOTE: two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param {*} source - The value to clone.\n * @returns {*}\n */\n clone: function(source) {\n if (helpers.isArray(source)) {\n return source.map(helpers.clone);\n }\n\n if (helpers.isObject(source)) {\n var target = {};\n var keys = Object.keys(source);\n var klen = keys.length;\n var k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = helpers.clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n },\n\n /**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): this method is also used by configMerge and scaleMerge as fallback.\n * @private\n */\n _merger: function(key, target, source, options) {\n var tval = target[key];\n var sval = source[key];\n\n if (helpers.isObject(tval) && helpers.isObject(sval)) {\n helpers.merge(tval, sval, options);\n } else {\n target[key] = helpers.clone(sval);\n }\n },\n\n /**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\n _mergerIf: function(key, target, source) {\n var tval = target[key];\n var sval = source[key];\n\n if (helpers.isObject(tval) && helpers.isObject(sval)) {\n helpers.mergeIf(tval, sval);\n } else if (!target.hasOwnProperty(key)) {\n target[key] = helpers.clone(sval);\n }\n },\n\n /**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {Object} target - The target object in which all sources are merged into.\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n * @param {Object} [options] - Merging options:\n * @param {Function} [options.merger] - The merge method (key, target, source, options)\n * @returns {Object} The `target` object.\n */\n merge: function(target, source, options) {\n var sources = helpers.isArray(source) ? source : [source];\n var ilen = sources.length;\n var merge, i, keys, klen, k;\n\n if (!helpers.isObject(target)) {\n return target;\n }\n\n options = options || {};\n merge = options.merger || helpers._merger;\n\n for (i = 0; i < ilen; ++i) {\n source = sources[i];\n if (!helpers.isObject(source)) {\n continue;\n }\n\n keys = Object.keys(source);\n for (k = 0, klen = keys.length; k < klen; ++k) {\n merge(keys[k], target, source, options);\n }\n }\n\n return target;\n },\n\n /**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {Object} target - The target object in which all sources are merged into.\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n * @returns {Object} The `target` object.\n */\n mergeIf: function(target, source) {\n return helpers.merge(target, source, {merger: helpers._mergerIf});\n }\n };\n\n module.exports = 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 */\n helpers.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 */\n helpers.indexOf = function(array, item, fromIndex) {\n return 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 */\n helpers.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 */\n helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n},{}],43:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(42);\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 */\n var effects = {\n linear: function(t) {\n return t;\n },\n\n easeInQuad: function(t) {\n return t * t;\n },\n\n easeOutQuad: function(t) {\n return -t * (t - 2);\n },\n\n easeInOutQuad: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t;\n }\n return -0.5 * ((--t) * (t - 2) - 1);\n },\n\n easeInCubic: function(t) {\n return t * t * t;\n },\n\n easeOutCubic: function(t) {\n return (t = t - 1) * t * t + 1;\n },\n\n easeInOutCubic: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t;\n }\n return 0.5 * ((t -= 2) * t * t + 2);\n },\n\n easeInQuart: function(t) {\n return t * t * t * t;\n },\n\n easeOutQuart: function(t) {\n return -((t = t - 1) * t * t * t - 1);\n },\n\n easeInOutQuart: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t * t;\n }\n return -0.5 * ((t -= 2) * t * t * t - 2);\n },\n\n easeInQuint: function(t) {\n return t * t * t * t * t;\n },\n\n easeOutQuint: function(t) {\n return (t = t - 1) * t * t * t * t + 1;\n },\n\n easeInOutQuint: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t * t * t;\n }\n return 0.5 * ((t -= 2) * t * t * t * t + 2);\n },\n\n easeInSine: function(t) {\n return -Math.cos(t * (Math.PI / 2)) + 1;\n },\n\n easeOutSine: function(t) {\n return Math.sin(t * (Math.PI / 2));\n },\n\n easeInOutSine: function(t) {\n return -0.5 * (Math.cos(Math.PI * t) - 1);\n },\n\n easeInExpo: function(t) {\n return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));\n },\n\n easeOutExpo: function(t) {\n return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;\n },\n\n easeInOutExpo: function(t) {\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if ((t /= 0.5) < 1) {\n return 0.5 * Math.pow(2, 10 * (t - 1));\n }\n return 0.5 * (-Math.pow(2, -10 * --t) + 2);\n },\n\n easeInCirc: function(t) {\n if (t >= 1) {\n return t;\n }\n return -(Math.sqrt(1 - t * t) - 1);\n },\n\n easeOutCirc: function(t) {\n return Math.sqrt(1 - (t = t - 1) * t);\n },\n\n easeInOutCirc: function(t) {\n if ((t /= 0.5) < 1) {\n return -0.5 * (Math.sqrt(1 - t * t) - 1);\n }\n return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n },\n\n easeInElastic: function(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if (!p) {\n p = 0.3;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n },\n\n easeOutElastic: function(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if (!p) {\n p = 0.3;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\n },\n\n easeInOutElastic: function(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if ((t /= 0.5) === 2) {\n return 1;\n }\n if (!p) {\n p = 0.45;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n }\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\n },\n easeInBack: function(t) {\n var s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack: function(t) {\n var s = 1.70158;\n return (t = t - 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack: function(t) {\n var s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: function(t) {\n return 1 - effects.easeOutBounce(1 - t);\n },\n\n easeOutBounce: function(t) {\n if (t < (1 / 2.75)) {\n return 7.5625 * t * t;\n }\n if (t < (2 / 2.75)) {\n return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;\n }\n if (t < (2.5 / 2.75)) {\n return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;\n }\n return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;\n },\n\n easeInOutBounce: function(t) {\n if (t < 0.5) {\n return effects.easeInBounce(t * 2) * 0.5;\n }\n return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n }\n };\n\n module.exports = {\n effects: 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 */\n helpers.easingEffects = effects;\n\n},{\"42\":42}],44:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(42);\n\n /**\n * @alias Chart.helpers.options\n * @namespace\n */\n module.exports = {\n /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param {Number} size - The font size (in pixels) used to resolve relative `value`.\n * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\n toLineHeight: function(value, size) {\n var matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n },\n\n /**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param {Number|Object} value - If a number, set the value to all TRBL component,\n * else, if and object, use defined properties and sets undefined ones to 0.\n * @returns {Object} The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\n toPadding: function(value) {\n var t, r, b, l;\n\n if (helpers.isObject(value)) {\n t = +value.top || 0;\n r = +value.right || 0;\n b = +value.bottom || 0;\n l = +value.left || 0;\n } else {\n t = r = b = l = +value || 0;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n height: t + b,\n width: l + r\n };\n },\n\n /**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param {Array[]} inputs - An array of values, falling back to the last value.\n * @param {Object} [context] - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param {Number} [index] - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @since 2.7.0\n */\n resolve: function(inputs, context, index) {\n var i, ilen, value;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n }\n if (index !== undefined && helpers.isArray(value)) {\n value = value[index];\n }\n if (value !== undefined) {\n return value;\n }\n }\n }\n };\n\n},{\"42\":42}],45:[function(require,module,exports){\n 'use strict';\n\n module.exports = require(42);\n module.exports.easing = require(43);\n module.exports.canvas = require(41);\n module.exports.options = require(44);\n\n},{\"41\":41,\"42\":42,\"43\":43,\"44\":44}],46:[function(require,module,exports){\n /**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\n module.exports = {\n acquireContext: function(item) {\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n\n return item && item.getContext('2d') || null;\n }\n };\n\n},{}],47:[function(require,module,exports){\n /**\n * Chart.Platform implementation for targeting a web browser\n */\n\n 'use strict';\n\n var helpers = require(45);\n\n var EXPANDO_KEY = '$chartjs';\n var CSS_PREFIX = 'chartjs-';\n var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\n var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\n var 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 */\n var EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: '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 */\n function readUsedSize(element, property) {\n var value = helpers.getStyle(element, property);\n var matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return 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 */\n function initCanvas(canvas, config) {\n var style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n var renderHeight = canvas.getAttribute('height');\n var renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n\n if (renderWidth === null || renderWidth === '') {\n var displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (renderHeight === null || renderHeight === '') {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (config.options.aspectRatio || 2);\n } else {\n var displayHeight = readUsedSize(canvas, 'height');\n if (displayWidth !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return 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 */\n var supportsEventListenerOptions = (function() {\n var supports = false;\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function() {\n supports = true;\n }\n });\n window.addEventListener('e', null, options);\n } catch (e) {\n // continue regardless of error\n }\n return 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\n var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\n function addEventListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n\n function removeEventListener(node, type, listener) {\n node.removeEventListener(type, listener, eventListenerOptions);\n }\n\n function createEvent(type, chart, x, y, nativeEvent) {\n return {\n type: type,\n chart: chart,\n native: nativeEvent || null,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n }\n\n function fromNativeEvent(event, chart) {\n var type = EVENT_TYPES[event.type] || event.type;\n var pos = helpers.getRelativePosition(event, chart);\n return createEvent(type, chart, pos.x, pos.y, event);\n }\n\n function throttled(fn, thisArg) {\n var ticking = false;\n var args = [];\n\n return function() {\n args = Array.prototype.slice.call(arguments);\n thisArg = thisArg || this;\n\n if (!ticking) {\n ticking = true;\n helpers.requestAnimFrame.call(window, function() {\n ticking = false;\n fn.apply(thisArg, args);\n });\n }\n };\n }\n\n// Implementation based on https://github.com/marcj/css-element-queries\n function createResizer(handler) {\n var resizer = document.createElement('div');\n var cls = CSS_PREFIX + 'size-monitor';\n var maxSize = 1000000;\n var style =\n 'position:absolute;' +\n 'left:0;' +\n 'top:0;' +\n 'right:0;' +\n 'bottom:0;' +\n 'overflow:hidden;' +\n 'pointer-events:none;' +\n 'visibility:hidden;' +\n 'z-index:-1;';\n\n resizer.style.cssText = style;\n resizer.className = cls;\n resizer.innerHTML =\n '
          ' +\n '
          ' +\n '
          ' +\n '
          ' +\n '
          ' +\n '
          ' +\n '
          ' +\n '
          ';\n\n var expand = resizer.childNodes[0];\n var shrink = resizer.childNodes[1];\n\n resizer._reset = function() {\n expand.scrollLeft = maxSize;\n expand.scrollTop = maxSize;\n shrink.scrollLeft = maxSize;\n shrink.scrollTop = maxSize;\n };\n var onScroll = function() {\n resizer._reset();\n handler();\n };\n\n addEventListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n addEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n\n return resizer;\n }\n\n// https://davidwalsh.name/detect-node-insertion\n function watchForRender(node, handler) {\n var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n var proxy = expando.renderProxy = function(e) {\n if (e.animationName === CSS_RENDER_ANIMATION) {\n handler();\n }\n };\n\n helpers.each(ANIMATION_START_EVENTS, function(type) {\n addEventListener(node, type, proxy);\n });\n\n node.classList.add(CSS_RENDER_MONITOR);\n }\n\n function unwatchForRender(node) {\n var expando = node[EXPANDO_KEY] || {};\n var proxy = expando.renderProxy;\n\n if (proxy) {\n helpers.each(ANIMATION_START_EVENTS, function(type) {\n removeEventListener(node, type, proxy);\n });\n\n delete expando.renderProxy;\n }\n\n node.classList.remove(CSS_RENDER_MONITOR);\n }\n\n function addResizeListener(node, listener, chart) {\n var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n // Let's keep track of this added resizer and thus avoid DOM query when removing it.\n var resizer = expando.resizer = createResizer(throttled(function() {\n if (expando.resizer) {\n return listener(createEvent('resize', chart));\n }\n }));\n\n // The resizer needs to be attached to the node parent, so we first need to be\n // sure that `node` is attached to the DOM before injecting the resizer element.\n watchForRender(node, function() {\n if (expando.resizer) {\n var container = node.parentNode;\n if (container && container !== resizer.parentNode) {\n container.insertBefore(resizer, container.firstChild);\n }\n\n // The container size might have changed, let's reset the resizer state.\n resizer._reset();\n }\n });\n }\n\n function removeResizeListener(node) {\n var expando = node[EXPANDO_KEY] || {};\n var resizer = expando.resizer;\n\n delete expando.resizer;\n unwatchForRender(node);\n\n if (resizer && resizer.parentNode) {\n resizer.parentNode.removeChild(resizer);\n }\n }\n\n function injectCSS(platform, css) {\n // http://stackoverflow.com/q/3922139\n var style = platform._style || document.createElement('style');\n if (!platform._style) {\n platform._style = style;\n css = '/* Chart.js */\\n' + css;\n style.setAttribute('type', 'text/css');\n document.getElementsByTagName('head')[0].appendChild(style);\n }\n\n style.appendChild(document.createTextNode(css));\n }\n\n module.exports = {\n /**\n * This property holds whether this platform is enabled for the current environment.\n * Currently used by platform.js to select the proper implementation.\n * @private\n */\n _enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\n\n initialize: function() {\n var keyframes = 'from{opacity:0.99}to{opacity:1}';\n\n injectCSS(this,\n // DOM rendering detection\n // https://davidwalsh.name/detect-node-insertion\n '@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n '@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n '.' + CSS_RENDER_MONITOR + '{' +\n '-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n 'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n '}'\n );\n },\n\n acquireContext: function(item, config) {\n if (typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n var context = item && item.getContext && item.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the item has a context2D which has item as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === item) {\n initCanvas(item, config);\n return context;\n }\n\n return null;\n },\n\n releaseContext: function(context) {\n var canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return;\n }\n\n var initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach(function(prop) {\n var value = initial[prop];\n if (helpers.isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n helpers.each(initial.style || {}, function(value, key) {\n canvas.style[key] = value;\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n },\n\n addEventListener: function(chart, type, listener) {\n var canvas = chart.canvas;\n if (type === 'resize') {\n // Note: the resize event is not supported on all browsers.\n addResizeListener(canvas, listener, chart);\n return;\n }\n\n var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\n var proxies = expando.proxies || (expando.proxies = {});\n var proxy = proxies[chart.id + '_' + type] = function(event) {\n listener(fromNativeEvent(event, chart));\n };\n\n addEventListener(canvas, type, proxy);\n },\n\n removeEventListener: function(chart, type, listener) {\n var canvas = chart.canvas;\n if (type === 'resize') {\n // Note: the resize event is not supported on all browsers.\n removeResizeListener(canvas, listener);\n return;\n }\n\n var expando = listener[EXPANDO_KEY] || {};\n var proxies = expando.proxies || {};\n var proxy = proxies[chart.id + '_' + type];\n if (!proxy) {\n return;\n }\n\n removeEventListener(canvas, type, proxy);\n }\n };\n\n// DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n * @function Chart.helpers.addEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.addEvent = addEventListener;\n\n /**\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\n * @function Chart.helpers.removeEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.removeEvent = removeEventListener;\n\n},{\"45\":45}],48:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n var basic = require(46);\n var dom = require(47);\n\n// @TODO Make possible to select another platform at build time.\n var implementation = dom._enabled ? dom : basic;\n\n /**\n * @namespace Chart.platform\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n * @since 2.4.0\n */\n module.exports = helpers.extend({\n /**\n * @since 2.7.0\n */\n initialize: function() {},\n\n /**\n * Called at chart construction time, returns a context2d instance implementing\n * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n * @param {*} item - The native item from which to acquire context (platform specific)\n * @param {Object} options - The chart options\n * @returns {CanvasRenderingContext2D} context2d instance\n */\n acquireContext: function() {},\n\n /**\n * Called at chart destruction time, releases any resources associated to the context\n * previously returned by the acquireContext() method.\n * @param {CanvasRenderingContext2D} context - The context2d instance\n * @returns {Boolean} true if the method succeeded, else false\n */\n releaseContext: function() {},\n\n /**\n * Registers the specified listener on the given chart.\n * @param {Chart} chart - Chart from which to listen for event\n * @param {String} type - The ({@link IEvent}) type to listen for\n * @param {Function} listener - Receives a notification (an object that implements\n * the {@link IEvent} interface) when an event of the specified type occurs.\n */\n addEventListener: function() {},\n\n /**\n * Removes the specified listener previously registered with addEventListener.\n * @param {Chart} chart -Chart from which to remove the listener\n * @param {String} type - The ({@link IEvent}) type to remove\n * @param {Function} listener - The listener function to remove from the event target.\n */\n removeEventListener: function() {}\n\n }, implementation);\n\n /**\n * @interface IPlatform\n * Allows abstracting platform dependencies away from the chart\n * @borrows Chart.platform.acquireContext as acquireContext\n * @borrows Chart.platform.releaseContext as releaseContext\n * @borrows Chart.platform.addEventListener as addEventListener\n * @borrows Chart.platform.removeEventListener as removeEventListener\n */\n\n /**\n * @interface IEvent\n * @prop {String} type - The event type name, possible values are:\n * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\n * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\n * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\n * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\n * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\n */\n\n},{\"45\":45,\"46\":46,\"47\":47}],49:[function(require,module,exports){\n /**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('global', {\n plugins: {\n filler: {\n propagate: true\n }\n }\n });\n\n module.exports = function() {\n\n var mappers = {\n dataset: function(source) {\n var index = source.fill;\n var chart = source.chart;\n var meta = chart.getDatasetMeta(index);\n var visible = meta && chart.isDatasetVisible(index);\n var points = (visible && meta.dataset._children) || [];\n var length = points.length || 0;\n\n return !length ? null : function(point, i) {\n return (i < length && points[i]._view) || null;\n };\n },\n\n boundary: function(source) {\n var boundary = source.boundary;\n var x = boundary ? boundary.x : null;\n var y = boundary ? boundary.y : null;\n\n return function(point) {\n return {\n x: x === null ? point.x : x,\n y: y === null ? point.y : y,\n };\n };\n }\n };\n\n // @todo if (fill[0] === '#')\n function decodeFill(el, index, count) {\n var model = el._model || {};\n var fill = model.fill;\n var target;\n\n if (fill === undefined) {\n fill = !!model.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n\n target = parseFloat(fill, 10);\n if (isFinite(target) && Math.floor(target) === target) {\n if (fill[0] === '-' || fill[0] === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n }\n\n switch (fill) {\n // compatibility\n case 'bottom':\n return 'start';\n case 'top':\n return 'end';\n case 'zero':\n return 'origin';\n // supported boundaries\n case 'origin':\n case 'start':\n case 'end':\n return fill;\n // invalid fill values\n default:\n return false;\n }\n }\n\n function computeBoundary(source) {\n var model = source.el._model || {};\n var scale = source.el._scale || {};\n var fill = source.fill;\n var target = null;\n var horizontal;\n\n if (isFinite(fill)) {\n return null;\n }\n\n // Backward compatibility: until v3, we still need to support boundary values set on\n // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n // controllers might still use it (e.g. the Smith chart).\n\n if (fill === 'start') {\n target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\n } else if (fill === 'end') {\n target = model.scaleTop === undefined ? scale.top : model.scaleTop;\n } else if (model.scaleZero !== undefined) {\n target = model.scaleZero;\n } else if (scale.getBasePosition) {\n target = scale.getBasePosition();\n } else if (scale.getBasePixel) {\n target = scale.getBasePixel();\n }\n\n if (target !== undefined && target !== null) {\n if (target.x !== undefined && target.y !== undefined) {\n return target;\n }\n\n if (typeof target === 'number' && isFinite(target)) {\n horizontal = scale.isHorizontal();\n return {\n x: horizontal ? target : null,\n y: horizontal ? null : target\n };\n }\n }\n\n return null;\n }\n\n function resolveTarget(sources, index, propagate) {\n var source = sources[index];\n var fill = source.fill;\n var visited = [index];\n var target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n }\n\n function createMapper(source) {\n var fill = source.fill;\n var type = 'dataset';\n\n if (fill === false) {\n return null;\n }\n\n if (!isFinite(fill)) {\n type = 'boundary';\n }\n\n return mappers[type](source);\n }\n\n function isDrawable(point) {\n return point && !point.skip;\n }\n\n function drawArea(ctx, curve0, curve1, len0, len1) {\n var i;\n\n if (!len0 || !len1) {\n return;\n }\n\n // building first area curve (normal)\n ctx.moveTo(curve0[0].x, curve0[0].y);\n for (i = 1; i < len0; ++i) {\n helpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\n }\n\n // joining the two area curves\n ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);\n\n // building opposite area curve (reverse)\n for (i = len1 - 1; i > 0; --i) {\n helpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\n }\n }\n\n function doFill(ctx, points, mapper, view, color, loop) {\n var count = points.length;\n var span = view.spanGaps;\n var curve0 = [];\n var curve1 = [];\n var len0 = 0;\n var len1 = 0;\n var i, ilen, index, p0, p1, d0, d1;\n\n ctx.beginPath();\n\n for (i = 0, ilen = (count + !!loop); i < ilen; ++i) {\n index = i % count;\n p0 = points[index]._view;\n p1 = mapper(p0, index, view);\n d0 = isDrawable(p0);\n d1 = isDrawable(p1);\n\n if (d0 && d1) {\n len0 = curve0.push(p0);\n len1 = curve1.push(p1);\n } else if (len0 && len1) {\n if (!span) {\n drawArea(ctx, curve0, curve1, len0, len1);\n len0 = len1 = 0;\n curve0 = [];\n curve1 = [];\n } else {\n if (d0) {\n curve0.push(p0);\n }\n if (d1) {\n curve1.push(p1);\n }\n }\n }\n }\n\n drawArea(ctx, curve0, curve1, len0, len1);\n\n ctx.closePath();\n ctx.fillStyle = color;\n ctx.fill();\n }\n\n return {\n id: 'filler',\n\n afterDatasetsUpdate: function(chart, options) {\n var count = (chart.data.datasets || []).length;\n var propagate = options.propagate;\n var sources = [];\n var meta, i, el, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n el = meta.dataset;\n source = null;\n\n if (el && el._model && el instanceof elements.Line) {\n source = {\n visible: chart.isDatasetVisible(i),\n fill: decodeFill(el, i, count),\n chart: chart,\n el: el\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source) {\n continue;\n }\n\n source.fill = resolveTarget(sources, i, propagate);\n source.boundary = computeBoundary(source);\n source.mapper = createMapper(source);\n }\n },\n\n beforeDatasetDraw: function(chart, args) {\n var meta = args.meta.$filler;\n if (!meta) {\n return;\n }\n\n var ctx = chart.ctx;\n var el = meta.el;\n var view = el._view;\n var points = el._children || [];\n var mapper = meta.mapper;\n var color = view.backgroundColor || defaults.global.defaultColor;\n\n if (mapper && color && points.length) {\n helpers.canvas.clipArea(ctx, chart.chartArea);\n doFill(ctx, points, mapper, view, color, el._loop);\n helpers.canvas.unclipArea(ctx);\n }\n }\n };\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],50:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n legend: {\n display: true,\n position: 'top',\n fullWidth: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick: function(e, legendItem) {\n var index = legendItem.datasetIndex;\n var ci = this.chart;\n var meta = ci.getDatasetMeta(index);\n\n // See controller.isDatasetVisible comment\n meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;\n\n // We hid a dataset ... rerender the chart\n ci.update();\n },\n\n onHover: null,\n\n labels: {\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels: function(chart) {\n var data = chart.data;\n return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\n return {\n text: dataset.label,\n fillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\n hidden: !chart.isDatasetVisible(i),\n lineCap: dataset.borderCapStyle,\n lineDash: dataset.borderDash,\n lineDashOffset: dataset.borderDashOffset,\n lineJoin: dataset.borderJoinStyle,\n lineWidth: dataset.borderWidth,\n strokeStyle: dataset.borderColor,\n pointStyle: dataset.pointStyle,\n\n // Below is extra data used for toggling the datasets\n datasetIndex: i\n };\n }, this) : [];\n }\n }\n },\n\n legendCallback: function(chart) {\n var text = [];\n text.push('
            ');\n for (var i = 0; i < chart.data.datasets.length; i++) {\n text.push('
          • ');\n if (chart.data.datasets[i].label) {\n text.push(chart.data.datasets[i].label);\n }\n text.push('
          • ');\n }\n text.push('
          ');\n return text.join('');\n }\n });\n\n module.exports = function(Chart) {\n\n var layout = Chart.layoutService;\n var noop = helpers.noop;\n\n /**\n * Helper function to get the box width based on the usePointStyle option\n * @param labelopts {Object} the label options on the legend\n * @param fontSize {Number} the label font size\n * @return {Number} width of the color box area\n */\n function getBoxWidth(labelOpts, fontSize) {\n return labelOpts.usePointStyle ?\n fontSize * Math.SQRT2 :\n labelOpts.boxWidth;\n }\n\n Chart.Legend = Element.extend({\n\n initialize: function(config) {\n helpers.extend(this, config);\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n },\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all legend types.\n // Any function can be extended by the legend type\n\n beforeUpdate: noop,\n update: function(maxWidth, maxHeight, margins) {\n var me = this;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = margins;\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n // Labels\n me.beforeBuildLabels();\n me.buildLabels();\n me.afterBuildLabels();\n\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n\n return me.minSize;\n },\n afterUpdate: noop,\n\n //\n\n beforeSetDimensions: noop,\n setDimensions: function() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n\n // Reset minSize\n me.minSize = {\n width: 0,\n height: 0\n };\n },\n afterSetDimensions: noop,\n\n //\n\n beforeBuildLabels: noop,\n buildLabels: function() {\n var me = this;\n var labelOpts = me.options.labels || {};\n var legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter(function(item) {\n return labelOpts.filter(item, me.chart.data);\n });\n }\n\n if (me.options.reverse) {\n legendItems.reverse();\n }\n\n me.legendItems = legendItems;\n },\n afterBuildLabels: noop,\n\n //\n\n beforeFit: noop,\n fit: function() {\n var me = this;\n var opts = me.options;\n var labelOpts = opts.labels;\n var display = opts.display;\n\n var ctx = me.ctx;\n\n var globalDefault = defaults.global;\n var valueOrDefault = helpers.valueOrDefault;\n var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n // Reset hit boxes\n var hitboxes = me.legendHitBoxes = [];\n\n var minSize = me.minSize;\n var isHorizontal = me.isHorizontal();\n\n if (isHorizontal) {\n minSize.width = me.maxWidth; // fill all the width\n minSize.height = display ? 10 : 0;\n } else {\n minSize.width = display ? 10 : 0;\n minSize.height = me.maxHeight; // fill all the height\n }\n\n // Increase sizes here\n if (display) {\n ctx.font = labelFont;\n\n if (isHorizontal) {\n // Labels\n\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n var lineWidths = me.lineWidths = [0];\n var totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n\n helpers.each(me.legendItems, function(legendItem, i) {\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\n totalHeight += fontSize + (labelOpts.padding);\n lineWidths[lineWidths.length] = me.left;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {\n left: 0,\n top: 0,\n width: width,\n height: fontSize\n };\n\n lineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n });\n\n minSize.height += totalHeight;\n\n } else {\n var vPadding = labelOpts.padding;\n var columnWidths = me.columnWidths = [];\n var totalWidth = labelOpts.padding;\n var currentColWidth = 0;\n var currentColHeight = 0;\n var itemHeight = fontSize + vPadding;\n\n helpers.each(me.legendItems, function(legendItem, i) {\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n // If too tall, go to new column\n if (currentColHeight + itemHeight > minSize.height) {\n totalWidth += currentColWidth + labelOpts.padding;\n columnWidths.push(currentColWidth); // previous column width\n\n currentColWidth = 0;\n currentColHeight = 0;\n }\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight;\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {\n left: 0,\n top: 0,\n width: itemWidth,\n height: fontSize\n };\n });\n\n totalWidth += currentColWidth;\n columnWidths.push(currentColWidth);\n minSize.width += totalWidth;\n }\n }\n\n me.width = minSize.width;\n me.height = minSize.height;\n },\n afterFit: noop,\n\n // Shared Methods\n isHorizontal: function() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n },\n\n // Actually draw the legend on the canvas\n draw: function() {\n var me = this;\n var opts = me.options;\n var labelOpts = opts.labels;\n var globalDefault = defaults.global;\n var lineDefault = globalDefault.elements.line;\n var legendWidth = me.width;\n var lineWidths = me.lineWidths;\n\n if (opts.display) {\n var ctx = me.ctx;\n var valueOrDefault = helpers.valueOrDefault;\n var fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor);\n var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n var cursor;\n\n // Canvas setup\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.strokeStyle = fontColor; // for strikethrough effect\n ctx.fillStyle = fontColor; // render in correct colour\n ctx.font = labelFont;\n\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var hitboxes = me.legendHitBoxes;\n\n // current position\n var drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\n var isLineWidthZero = (valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0);\n\n if (ctx.setLineDash) {\n // IE 9 and 10 do not support line dash\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash));\n }\n\n if (opts.labels && opts.labels.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n var radius = fontSize * Math.SQRT2 / 2;\n var offSet = radius / Math.SQRT2;\n var centerX = x + offSet;\n var centerY = y + offSet;\n\n // Draw pointStyle as legend symbol\n helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n } else {\n // Draw box as legend symbol\n if (!isLineWidthZero) {\n ctx.strokeRect(x, y, boxWidth, fontSize);\n }\n ctx.fillRect(x, y, boxWidth, fontSize);\n }\n\n ctx.restore();\n };\n var fillText = function(x, y, legendItem, textWidth) {\n var halfFontSize = fontSize / 2;\n var xLeft = boxWidth + halfFontSize + x;\n var yMiddle = y + halfFontSize;\n\n ctx.fillText(legendItem.text, xLeft, yMiddle);\n\n if (legendItem.hidden) {\n // Strikethrough the text if hidden\n ctx.beginPath();\n ctx.lineWidth = 2;\n ctx.moveTo(xLeft, yMiddle);\n ctx.lineTo(xLeft + textWidth, yMiddle);\n ctx.stroke();\n }\n };\n\n // Horizontal\n var isHorizontal = me.isHorizontal();\n if (isHorizontal) {\n cursor = {\n x: me.left + ((legendWidth - lineWidths[0]) / 2),\n y: me.top + labelOpts.padding,\n line: 0\n };\n } else {\n cursor = {\n x: me.left + labelOpts.padding,\n y: me.top + labelOpts.padding,\n line: 0\n };\n }\n\n var itemHeight = fontSize + labelOpts.padding;\n helpers.each(me.legendItems, function(legendItem, i) {\n var textWidth = ctx.measureText(legendItem.text).width;\n var width = boxWidth + (fontSize / 2) + textWidth;\n var x = cursor.x;\n var y = cursor.y;\n\n if (isHorizontal) {\n if (x + width >= legendWidth) {\n y = cursor.y += itemHeight;\n cursor.line++;\n x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);\n }\n } else if (y + itemHeight > me.bottom) {\n x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n y = cursor.y = me.top + labelOpts.padding;\n cursor.line++;\n }\n\n drawLegendBox(x, y, legendItem);\n\n hitboxes[i].left = x;\n hitboxes[i].top = y;\n\n // Fill the actual label\n fillText(x, y, legendItem, textWidth);\n\n if (isHorizontal) {\n cursor.x += width + (labelOpts.padding);\n } else {\n cursor.y += itemHeight;\n }\n\n });\n }\n },\n\n /**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n * @return {Boolean} true if a change occured\n */\n handleEvent: function(e) {\n var me = this;\n var opts = me.options;\n var type = e.type === 'mouseup' ? 'click' : e.type;\n var changed = false;\n\n if (type === 'mousemove') {\n if (!opts.onHover) {\n return;\n }\n } else if (type === 'click') {\n if (!opts.onClick) {\n return;\n }\n } else {\n return;\n }\n\n // Chart event already has relative position in it\n var x = e.x;\n var y = e.y;\n\n if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n // See if we are touching one of the dataset boxes\n var lh = me.legendHitBoxes;\n for (var i = 0; i < lh.length; ++i) {\n var hitBox = lh[i];\n\n if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n // Touching an element\n if (type === 'click') {\n // use e.native for backwards compatibility\n opts.onClick.call(me, e.native, me.legendItems[i]);\n changed = true;\n break;\n } else if (type === 'mousemove') {\n // use e.native for backwards compatibility\n opts.onHover.call(me, e.native, me.legendItems[i]);\n changed = true;\n break;\n }\n }\n }\n }\n\n return changed;\n }\n });\n\n function createNewLegendAndAttach(chart, legendOpts) {\n var legend = new Chart.Legend({\n ctx: chart.ctx,\n options: legendOpts,\n chart: chart\n });\n\n layout.configure(chart, legend, legendOpts);\n layout.addBox(chart, legend);\n chart.legend = legend;\n }\n\n return {\n id: 'legend',\n\n beforeInit: function(chart) {\n var legendOpts = chart.options.legend;\n\n if (legendOpts) {\n createNewLegendAndAttach(chart, legendOpts);\n }\n },\n\n beforeUpdate: function(chart) {\n var legendOpts = chart.options.legend;\n var legend = chart.legend;\n\n if (legendOpts) {\n helpers.mergeIf(legendOpts, defaults.global.legend);\n\n if (legend) {\n layout.configure(chart, legend, legendOpts);\n legend.options = legendOpts;\n } else {\n createNewLegendAndAttach(chart, legendOpts);\n }\n } else if (legend) {\n layout.removeBox(chart, legend);\n delete chart.legend;\n }\n },\n\n afterEvent: function(chart, e) {\n var legend = chart.legend;\n if (legend) {\n legend.handleEvent(e);\n }\n }\n };\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],51:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n title: {\n display: false,\n fontStyle: 'bold',\n fullWidth: true,\n lineHeight: 1.2,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000 // by default greater than legend (1000) to be above\n }\n });\n\n module.exports = function(Chart) {\n\n var layout = Chart.layoutService;\n var noop = helpers.noop;\n\n Chart.Title = Element.extend({\n initialize: function(config) {\n var me = this;\n helpers.extend(me, config);\n\n // Contains hit boxes for each dataset (in dataset order)\n me.legendHitBoxes = [];\n },\n\n // These methods are ordered by lifecycle. Utilities then follow.\n\n beforeUpdate: noop,\n update: function(maxWidth, maxHeight, margins) {\n var me = this;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = margins;\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n // Labels\n me.beforeBuildLabels();\n me.buildLabels();\n me.afterBuildLabels();\n\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n\n return me.minSize;\n\n },\n afterUpdate: noop,\n\n //\n\n beforeSetDimensions: noop,\n setDimensions: function() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n\n // Reset minSize\n me.minSize = {\n width: 0,\n height: 0\n };\n },\n afterSetDimensions: noop,\n\n //\n\n beforeBuildLabels: noop,\n buildLabels: noop,\n afterBuildLabels: noop,\n\n //\n\n beforeFit: noop,\n fit: function() {\n var me = this;\n var valueOrDefault = helpers.valueOrDefault;\n var opts = me.options;\n var display = opts.display;\n var fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize);\n var minSize = me.minSize;\n var lineCount = helpers.isArray(opts.text) ? opts.text.length : 1;\n var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n var textSize = display ? (lineCount * lineHeight) + (opts.padding * 2) : 0;\n\n if (me.isHorizontal()) {\n minSize.width = me.maxWidth; // fill all the width\n minSize.height = textSize;\n } else {\n minSize.width = textSize;\n minSize.height = me.maxHeight; // fill all the height\n }\n\n me.width = minSize.width;\n me.height = minSize.height;\n\n },\n afterFit: noop,\n\n // Shared Methods\n isHorizontal: function() {\n var pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n },\n\n // Actually draw the title block on the canvas\n draw: function() {\n var me = this;\n var ctx = me.ctx;\n var valueOrDefault = helpers.valueOrDefault;\n var opts = me.options;\n var globalDefaults = defaults.global;\n\n if (opts.display) {\n var fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize);\n var fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle);\n var fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily);\n var titleFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n var offset = lineHeight / 2 + opts.padding;\n var rotation = 0;\n var top = me.top;\n var left = me.left;\n var bottom = me.bottom;\n var right = me.right;\n var maxWidth, titleX, titleY;\n\n ctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\n ctx.font = titleFont;\n\n // Horizontal\n if (me.isHorizontal()) {\n titleX = left + ((right - left) / 2); // midpoint of the width\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n titleX = opts.position === 'left' ? left + offset : right - offset;\n titleY = top + ((bottom - top) / 2);\n maxWidth = bottom - top;\n rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n }\n\n ctx.save();\n ctx.translate(titleX, titleY);\n ctx.rotate(rotation);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n var text = opts.text;\n if (helpers.isArray(text)) {\n var y = 0;\n for (var i = 0; i < text.length; ++i) {\n ctx.fillText(text[i], 0, y, maxWidth);\n y += lineHeight;\n }\n } else {\n ctx.fillText(text, 0, 0, maxWidth);\n }\n\n ctx.restore();\n }\n }\n });\n\n function createNewTitleBlockAndAttach(chart, titleOpts) {\n var title = new Chart.Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart: chart\n });\n\n layout.configure(chart, title, titleOpts);\n layout.addBox(chart, title);\n chart.titleBlock = title;\n }\n\n return {\n id: 'title',\n\n beforeInit: function(chart) {\n var titleOpts = chart.options.title;\n\n if (titleOpts) {\n createNewTitleBlockAndAttach(chart, titleOpts);\n }\n },\n\n beforeUpdate: function(chart) {\n var titleOpts = chart.options.title;\n var titleBlock = chart.titleBlock;\n\n if (titleOpts) {\n helpers.mergeIf(titleOpts, defaults.global.title);\n\n if (titleBlock) {\n layout.configure(chart, titleBlock, titleOpts);\n titleBlock.options = titleOpts;\n } else {\n createNewTitleBlockAndAttach(chart, titleOpts);\n }\n } else if (titleBlock) {\n Chart.layoutService.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n }\n }\n };\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],52:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n // Default config for a category scale\n var defaultConfig = {\n position: 'bottom'\n };\n\n var DatasetScale = Chart.Scale.extend({\n /**\n * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n * else fall back to data.labels\n * @private\n */\n getLabels: function() {\n var data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n },\n\n determineDataLimits: function() {\n var me = this;\n var labels = me.getLabels();\n me.minIndex = 0;\n me.maxIndex = labels.length - 1;\n var findIndex;\n\n if (me.options.ticks.min !== undefined) {\n // user specified min value\n findIndex = labels.indexOf(me.options.ticks.min);\n me.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n }\n\n if (me.options.ticks.max !== undefined) {\n // user specified max value\n findIndex = labels.indexOf(me.options.ticks.max);\n me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n }\n\n me.min = labels[me.minIndex];\n me.max = labels[me.maxIndex];\n },\n\n buildTicks: function() {\n var me = this;\n var labels = me.getLabels();\n // If we are viewing some subset of labels, slice the original array\n me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n },\n\n getLabelForIndex: function(index, datasetIndex) {\n var me = this;\n var data = me.chart.data;\n var isHorizontal = me.isHorizontal();\n\n if (data.yLabels && !isHorizontal) {\n return me.getRightValue(data.datasets[datasetIndex].data[index]);\n }\n return me.ticks[index - me.minIndex];\n },\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue: function(value, index) {\n var me = this;\n var offset = me.options.offset;\n // 1 is added because we need the length but we have the indexes\n var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1);\n\n // If value is a data object, then index is the index in the data array,\n // not the index of the scale. We need to change that.\n var valueCategory;\n if (value !== undefined && value !== null) {\n valueCategory = me.isHorizontal() ? value.x : value.y;\n }\n if (valueCategory !== undefined || (value !== undefined && isNaN(index))) {\n var labels = me.getLabels();\n value = valueCategory || value;\n var idx = labels.indexOf(value);\n index = idx !== -1 ? idx : index;\n }\n\n if (me.isHorizontal()) {\n var valueWidth = me.width / offsetAmt;\n var widthOffset = (valueWidth * (index - me.minIndex));\n\n if (offset) {\n widthOffset += (valueWidth / 2);\n }\n\n return me.left + Math.round(widthOffset);\n }\n var valueHeight = me.height / offsetAmt;\n var heightOffset = (valueHeight * (index - me.minIndex));\n\n if (offset) {\n heightOffset += (valueHeight / 2);\n }\n\n return me.top + Math.round(heightOffset);\n },\n getPixelForTick: function(index) {\n return this.getPixelForValue(this.ticks[index], index + this.minIndex, null);\n },\n getValueForPixel: function(pixel) {\n var me = this;\n var offset = me.options.offset;\n var value;\n var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n var horz = me.isHorizontal();\n var valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n pixel -= horz ? me.left : me.top;\n\n if (offset) {\n pixel -= (valueDimension / 2);\n }\n\n if (pixel <= 0) {\n value = 0;\n } else {\n value = Math.round(pixel / valueDimension);\n }\n\n return value + me.minIndex;\n },\n getBasePixel: function() {\n return this.bottom;\n }\n });\n\n Chart.scaleService.registerScaleType('category', DatasetScale, defaultConfig);\n\n };\n\n},{}],53:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var defaultConfig = {\n position: 'left',\n ticks: {\n callback: Ticks.formatters.linear\n }\n };\n\n var LinearScale = Chart.LinearScaleBase.extend({\n\n determineDataLimits: function() {\n var me = this;\n var opts = me.options;\n var chart = me.chart;\n var data = chart.data;\n var datasets = data.datasets;\n var isHorizontal = me.isHorizontal();\n var DEFAULT_MIN = 0;\n var DEFAULT_MAX = 1;\n\n function IDMatches(meta) {\n return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n }\n\n // First Calculate the range\n me.min = null;\n me.max = null;\n\n var hasStacks = opts.stacked;\n if (hasStacks === undefined) {\n helpers.each(datasets, function(dataset, datasetIndex) {\n if (hasStacks) {\n return;\n }\n\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n meta.stack !== undefined) {\n hasStacks = true;\n }\n });\n }\n\n if (opts.stacked || hasStacks) {\n var valuesPerStack = {};\n\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var key = [\n meta.type,\n // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n meta.stack\n ].join('.');\n\n if (valuesPerStack[key] === undefined) {\n valuesPerStack[key] = {\n positiveValues: [],\n negativeValues: []\n };\n }\n\n // Store these per type\n var positiveValues = valuesPerStack[key].positiveValues;\n var negativeValues = valuesPerStack[key].negativeValues;\n\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n positiveValues[index] = positiveValues[index] || 0;\n negativeValues[index] = negativeValues[index] || 0;\n\n if (opts.relativePoints) {\n positiveValues[index] = 100;\n } else if (value < 0) {\n negativeValues[index] += value;\n } else {\n positiveValues[index] += value;\n }\n });\n }\n });\n\n helpers.each(valuesPerStack, function(valuesForType) {\n var values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n var minVal = helpers.min(values);\n var maxVal = helpers.max(values);\n me.min = me.min === null ? minVal : Math.min(me.min, minVal);\n me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n });\n\n } else {\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n if (me.min === null) {\n me.min = value;\n } else if (value < me.min) {\n me.min = value;\n }\n\n if (me.max === null) {\n me.max = value;\n } else if (value > me.max) {\n me.max = value;\n }\n });\n }\n });\n }\n\n me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\n me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;\n\n // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n this.handleTickRangeOptions();\n },\n getTickLimit: function() {\n var maxTicks;\n var me = this;\n var tickOpts = me.options.ticks;\n\n if (me.isHorizontal()) {\n maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\n } else {\n // The factor of 2 used to scale the font size has been experimentally determined.\n var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize);\n maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\n }\n\n return maxTicks;\n },\n // Called after the ticks are built. We need\n handleDirectionalChanges: function() {\n if (!this.isHorizontal()) {\n // We are in a vertical orientation. The top value is the highest. So reverse the array\n this.ticks.reverse();\n }\n },\n getLabelForIndex: function(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n // Utils\n getPixelForValue: function(value) {\n // This must be called after fit has been run so that\n // this.left, this.top, this.right, and this.bottom have been defined\n var me = this;\n var start = me.start;\n\n var rightValue = +me.getRightValue(value);\n var pixel;\n var range = me.end - start;\n\n if (me.isHorizontal()) {\n pixel = me.left + (me.width / range * (rightValue - start));\n return Math.round(pixel);\n }\n\n pixel = me.bottom - (me.height / range * (rightValue - start));\n return Math.round(pixel);\n },\n getValueForPixel: function(pixel) {\n var me = this;\n var isHorizontal = me.isHorizontal();\n var innerDimension = isHorizontal ? me.width : me.height;\n var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n return me.start + ((me.end - me.start) * offset);\n },\n getPixelForTick: function(index) {\n return this.getPixelForValue(this.ticksAsNumbers[index]);\n }\n });\n Chart.scaleService.registerScaleType('linear', LinearScale, defaultConfig);\n\n };\n\n},{\"25\":25,\"34\":34,\"45\":45}],54:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var noop = helpers.noop;\n\n Chart.LinearScaleBase = Chart.Scale.extend({\n getRightValue: function(value) {\n if (typeof value === 'string') {\n return +value;\n }\n return Chart.Scale.prototype.getRightValue.call(this, value);\n },\n\n handleTickRangeOptions: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n\n // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n // do nothing since that would make the chart weird. If the user really wants a weird chart\n // axis, they can manually override it\n if (tickOpts.beginAtZero) {\n var minSign = helpers.sign(me.min);\n var maxSign = helpers.sign(me.max);\n\n if (minSign < 0 && maxSign < 0) {\n // move the top up to 0\n me.max = 0;\n } else if (minSign > 0 && maxSign > 0) {\n // move the bottom down to 0\n me.min = 0;\n }\n }\n\n var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\n var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\n\n if (tickOpts.min !== undefined) {\n me.min = tickOpts.min;\n } else if (tickOpts.suggestedMin !== undefined) {\n if (me.min === null) {\n me.min = tickOpts.suggestedMin;\n } else {\n me.min = Math.min(me.min, tickOpts.suggestedMin);\n }\n }\n\n if (tickOpts.max !== undefined) {\n me.max = tickOpts.max;\n } else if (tickOpts.suggestedMax !== undefined) {\n if (me.max === null) {\n me.max = tickOpts.suggestedMax;\n } else {\n me.max = Math.max(me.max, tickOpts.suggestedMax);\n }\n }\n\n if (setMin !== setMax) {\n // We set the min or the max but not both.\n // So ensure that our range is good\n // Inverted or 0 length range can happen when\n // ticks.min is set, and no datasets are visible\n if (me.min >= me.max) {\n if (setMin) {\n me.max = me.min + 1;\n } else {\n me.min = me.max - 1;\n }\n }\n }\n\n if (me.min === me.max) {\n me.max++;\n\n if (!tickOpts.beginAtZero) {\n me.min--;\n }\n }\n },\n getTickLimit: noop,\n handleDirectionalChanges: noop,\n\n buildTicks: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n var maxTicks = me.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n var numericGeneratorOptions = {\n maxTicks: maxTicks,\n min: tickOpts.min,\n max: tickOpts.max,\n stepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n };\n var ticks = me.ticks = Ticks.generators.linear(numericGeneratorOptions, me);\n\n me.handleDirectionalChanges();\n\n // At this point, we need to update our max and min given the tick values since we have expanded the\n // range of the scale\n me.max = helpers.max(ticks);\n me.min = helpers.min(ticks);\n\n if (tickOpts.reverse) {\n ticks.reverse();\n\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n },\n convertTicksToLabels: function() {\n var me = this;\n me.ticksAsNumbers = me.ticks.slice();\n me.zeroLineIndex = me.ticks.indexOf(0);\n\n Chart.Scale.prototype.convertTicksToLabels.call(me);\n }\n });\n };\n\n},{\"34\":34,\"45\":45}],55:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var defaultConfig = {\n position: 'left',\n\n // label settings\n ticks: {\n callback: Ticks.formatters.logarithmic\n }\n };\n\n var LogarithmicScale = Chart.Scale.extend({\n determineDataLimits: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n var chart = me.chart;\n var data = chart.data;\n var datasets = data.datasets;\n var valueOrDefault = helpers.valueOrDefault;\n var isHorizontal = me.isHorizontal();\n function IDMatches(meta) {\n return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n }\n\n // Calculate Range\n me.min = null;\n me.max = null;\n me.minNotZero = null;\n\n var hasStacks = opts.stacked;\n if (hasStacks === undefined) {\n helpers.each(datasets, function(dataset, datasetIndex) {\n if (hasStacks) {\n return;\n }\n\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n meta.stack !== undefined) {\n hasStacks = true;\n }\n });\n }\n\n if (opts.stacked || hasStacks) {\n var valuesPerStack = {};\n\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var key = [\n meta.type,\n // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n meta.stack\n ].join('.');\n\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n if (valuesPerStack[key] === undefined) {\n valuesPerStack[key] = [];\n }\n\n helpers.each(dataset.data, function(rawValue, index) {\n var values = valuesPerStack[key];\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n values[index] = values[index] || 0;\n\n if (opts.relativePoints) {\n values[index] = 100;\n } else {\n // Don't need to split positive and negative since the log scale can't handle a 0 crossing\n values[index] += value;\n }\n });\n }\n });\n\n helpers.each(valuesPerStack, function(valuesForType) {\n var minVal = helpers.min(valuesForType);\n var maxVal = helpers.max(valuesForType);\n me.min = me.min === null ? minVal : Math.min(me.min, minVal);\n me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n });\n\n } else {\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n if (me.min === null) {\n me.min = value;\n } else if (value < me.min) {\n me.min = value;\n }\n\n if (me.max === null) {\n me.max = value;\n } else if (value > me.max) {\n me.max = value;\n }\n\n if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n me.minNotZero = value;\n }\n });\n }\n });\n }\n\n me.min = valueOrDefault(tickOpts.min, me.min);\n me.max = valueOrDefault(tickOpts.max, me.max);\n\n if (me.min === me.max) {\n if (me.min !== 0 && me.min !== null) {\n me.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\n me.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\n } else {\n me.min = 1;\n me.max = 10;\n }\n }\n },\n buildTicks: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n\n var generationOptions = {\n min: tickOpts.min,\n max: tickOpts.max\n };\n var ticks = me.ticks = Ticks.generators.logarithmic(generationOptions, me);\n\n if (!me.isHorizontal()) {\n // We are in a vertical orientation. The top value is the highest. So reverse the array\n ticks.reverse();\n }\n\n // At this point, we need to update our max and min given the tick values since we have expanded the\n // range of the scale\n me.max = helpers.max(ticks);\n me.min = helpers.min(ticks);\n\n if (tickOpts.reverse) {\n ticks.reverse();\n\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n },\n convertTicksToLabels: function() {\n this.tickValues = this.ticks.slice();\n\n Chart.Scale.prototype.convertTicksToLabels.call(this);\n },\n // Get the correct tooltip label\n getLabelForIndex: function(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n getPixelForTick: function(index) {\n return this.getPixelForValue(this.tickValues[index]);\n },\n getPixelForValue: function(value) {\n var me = this;\n var start = me.start;\n var newVal = +me.getRightValue(value);\n var opts = me.options;\n var tickOpts = opts.ticks;\n var innerDimension, pixel, range;\n\n if (me.isHorizontal()) {\n range = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0\n if (newVal === 0) {\n pixel = me.left;\n } else {\n innerDimension = me.width;\n pixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n }\n } else {\n // Bottom - top since pixels increase downward on a screen\n innerDimension = me.height;\n if (start === 0 && !tickOpts.reverse) {\n range = helpers.log10(me.end) - helpers.log10(me.minNotZero);\n if (newVal === start) {\n pixel = me.bottom;\n } else if (newVal === me.minNotZero) {\n pixel = me.bottom - innerDimension * 0.02;\n } else {\n pixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero)));\n }\n } else if (me.end === 0 && tickOpts.reverse) {\n range = helpers.log10(me.start) - helpers.log10(me.minNotZero);\n if (newVal === me.end) {\n pixel = me.top;\n } else if (newVal === me.minNotZero) {\n pixel = me.top + innerDimension * 0.02;\n } else {\n pixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero)));\n }\n } else if (newVal === 0) {\n pixel = tickOpts.reverse ? me.top : me.bottom;\n } else {\n range = helpers.log10(me.end) - helpers.log10(start);\n innerDimension = me.height;\n pixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n }\n }\n return pixel;\n },\n getValueForPixel: function(pixel) {\n var me = this;\n var range = helpers.log10(me.end) - helpers.log10(me.start);\n var value, innerDimension;\n\n if (me.isHorizontal()) {\n innerDimension = me.width;\n value = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension);\n } else { // todo: if start === 0\n innerDimension = me.height;\n value = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start;\n }\n return value;\n }\n });\n Chart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig);\n\n };\n\n},{\"34\":34,\"45\":45}],56:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var globalDefaults = defaults.global;\n\n var defaultConfig = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n color: 'rgba(0, 0, 0, 0.1)',\n lineWidth: 1\n },\n\n gridLines: {\n circular: false\n },\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n // String - The colour of the label backdrop\n backdropColor: 'rgba(255,255,255,0.75)',\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPaddingY: 2,\n\n // Number - The backdrop padding to the side of the label in pixels\n backdropPaddingX: 2,\n\n callback: Ticks.formatters.linear\n },\n\n pointLabels: {\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n fontSize: 10,\n\n // Function - Used to convert point labels\n callback: function(label) {\n return label;\n }\n }\n };\n\n function getValueCount(scale) {\n var opts = scale.options;\n return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;\n }\n\n function getPointLabelFontOptions(scale) {\n var pointLabelOptions = scale.options.pointLabels;\n var fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize);\n var fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle);\n var fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily);\n var font = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n return {\n size: fontSize,\n style: fontStyle,\n family: fontFamily,\n font: font\n };\n }\n\n function measureLabelSize(ctx, fontSize, label) {\n if (helpers.isArray(label)) {\n return {\n w: helpers.longestText(ctx, ctx.font, label),\n h: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize)\n };\n }\n\n return {\n w: ctx.measureText(label).width,\n h: fontSize\n };\n }\n\n function determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size - 5,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size + 5\n };\n }\n\n /**\n * Helper function to fit a radial linear scale with point labels\n */\n function fitWithPointLabels(scale) {\n\t\t\t/*\n\t\t\t * Right, this is really confusing and there is a lot of maths going on here\n\t\t\t * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n\t\t\t *\n\t\t\t * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n\t\t\t *\n\t\t\t * Solution:\n\t\t\t *\n\t\t\t * We assume the radius of the polygon is half the size of the canvas at first\n\t\t\t * at each index we check if the text overlaps.\n\t\t\t *\n\t\t\t * Where it does, we store that angle and that index.\n\t\t\t *\n\t\t\t * After finding the largest index and angle we calculate how much we need to remove\n\t\t\t * from the shape radius to move the point inwards by that x.\n\t\t\t *\n\t\t\t * We average the left and right distances to get the maximum shape radius that can fit in the box\n\t\t\t * along with labels.\n\t\t\t *\n\t\t\t * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n\t\t\t * on each side, removing that from the size, halving it and adding the left x protrusion width.\n\t\t\t *\n\t\t\t * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n\t\t\t * and position it in the most space efficient manner\n\t\t\t *\n\t\t\t * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\t\t\t */\n\n var plFont = getPointLabelFontOptions(scale);\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n var furthestLimits = {\n r: scale.width,\n l: 0,\n t: scale.height,\n b: 0\n };\n var furthestAngles = {};\n var i, textSize, pointPosition;\n\n scale.ctx.font = plFont.font;\n scale._pointLabelSizes = [];\n\n var valueCount = getValueCount(scale);\n for (i = 0; i < valueCount; i++) {\n pointPosition = scale.getPointPosition(i, largestPossibleRadius);\n textSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || '');\n scale._pointLabelSizes[i] = textSize;\n\n // Add quarter circle to make degree 0 mean top of circle\n var angleRadians = scale.getIndexAngle(i);\n var angle = helpers.toDegrees(angleRadians) % 360;\n var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n if (hLimits.start < furthestLimits.l) {\n furthestLimits.l = hLimits.start;\n furthestAngles.l = angleRadians;\n }\n\n if (hLimits.end > furthestLimits.r) {\n furthestLimits.r = hLimits.end;\n furthestAngles.r = angleRadians;\n }\n\n if (vLimits.start < furthestLimits.t) {\n furthestLimits.t = vLimits.start;\n furthestAngles.t = angleRadians;\n }\n\n if (vLimits.end > furthestLimits.b) {\n furthestLimits.b = vLimits.end;\n furthestAngles.b = angleRadians;\n }\n }\n\n scale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles);\n }\n\n /**\n * Helper function to fit a radial linear scale with no point labels\n */\n function fit(scale) {\n var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n scale.drawingArea = Math.round(largestPossibleRadius);\n scale.setCenterPoint(0, 0, 0, 0);\n }\n\n function getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n }\n\n function fillText(ctx, text, position, fontSize) {\n if (helpers.isArray(text)) {\n var y = position.y;\n var spacing = 1.5 * fontSize;\n\n for (var i = 0; i < text.length; ++i) {\n ctx.fillText(text[i], position.x, y);\n y += spacing;\n }\n } else {\n ctx.fillText(text, position.x, position.y);\n }\n }\n\n function adjustPointPositionForLabelHeight(angle, textSize, position) {\n if (angle === 90 || angle === 270) {\n position.y -= (textSize.h / 2);\n } else if (angle > 270 || angle < 90) {\n position.y -= textSize.h;\n }\n }\n\n function drawPointLabels(scale) {\n var ctx = scale.ctx;\n var valueOrDefault = helpers.valueOrDefault;\n var opts = scale.options;\n var angleLineOpts = opts.angleLines;\n var pointLabelOpts = opts.pointLabels;\n\n ctx.lineWidth = angleLineOpts.lineWidth;\n ctx.strokeStyle = angleLineOpts.color;\n\n var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n\n // Point Label Font\n var plFont = getPointLabelFontOptions(scale);\n\n ctx.textBaseline = 'top';\n\n for (var i = getValueCount(scale) - 1; i >= 0; i--) {\n if (angleLineOpts.display) {\n var outerPosition = scale.getPointPosition(i, outerDistance);\n ctx.beginPath();\n ctx.moveTo(scale.xCenter, scale.yCenter);\n ctx.lineTo(outerPosition.x, outerPosition.y);\n ctx.stroke();\n ctx.closePath();\n }\n\n if (pointLabelOpts.display) {\n // Extra 3px out for some label spacing\n var pointLabelPosition = scale.getPointPosition(i, outerDistance + 5);\n\n // Keep this in loop since we may support array properties here\n var pointLabelFontColor = valueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor);\n ctx.font = plFont.font;\n ctx.fillStyle = pointLabelFontColor;\n\n var angleRadians = scale.getIndexAngle(i);\n var angle = helpers.toDegrees(angleRadians);\n ctx.textAlign = getTextAlignForAngle(angle);\n adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size);\n }\n }\n }\n\n function drawRadiusLine(scale, gridLineOpts, radius, index) {\n var ctx = scale.ctx;\n ctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1);\n ctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\n\n if (scale.options.gridLines.circular) {\n // Draw circular arcs between the points\n ctx.beginPath();\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n ctx.closePath();\n ctx.stroke();\n } else {\n // Draw straight lines connecting each index\n var valueCount = getValueCount(scale);\n\n if (valueCount === 0) {\n return;\n }\n\n ctx.beginPath();\n var pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (var i = 1; i < valueCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n\n ctx.closePath();\n ctx.stroke();\n }\n }\n\n function numberOrZero(param) {\n return helpers.isNumber(param) ? param : 0;\n }\n\n var LinearRadialScale = Chart.LinearScaleBase.extend({\n setDimensions: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n // Set the unconstrained dimension before label rotation\n me.width = me.maxWidth;\n me.height = me.maxHeight;\n me.xCenter = Math.round(me.width / 2);\n me.yCenter = Math.round(me.height / 2);\n\n var minSize = helpers.min([me.height, me.width]);\n var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n me.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2);\n },\n determineDataLimits: function() {\n var me = this;\n var chart = me.chart;\n var min = Number.POSITIVE_INFINITY;\n var max = Number.NEGATIVE_INFINITY;\n\n helpers.each(chart.data.datasets, function(dataset, datasetIndex) {\n if (chart.isDatasetVisible(datasetIndex)) {\n var meta = chart.getDatasetMeta(datasetIndex);\n\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n min = Math.min(value, min);\n max = Math.max(value, max);\n });\n }\n });\n\n me.min = (min === Number.POSITIVE_INFINITY ? 0 : min);\n me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);\n\n // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n me.handleTickRangeOptions();\n },\n getTickLimit: function() {\n var tickOpts = this.options.ticks;\n var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n return Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\n },\n convertTicksToLabels: function() {\n var me = this;\n\n Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\n\n // Point labels\n me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n },\n getLabelForIndex: function(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n fit: function() {\n if (this.options.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n fit(this);\n }\n },\n /**\n * Set radius reductions and determine new radius and center point\n * @private\n */\n setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {\n var me = this;\n var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n var radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b);\n\n radiusReductionLeft = numberOrZero(radiusReductionLeft);\n radiusReductionRight = numberOrZero(radiusReductionRight);\n radiusReductionTop = numberOrZero(radiusReductionTop);\n radiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n me.drawingArea = Math.min(\n Math.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n Math.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n },\n setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {\n var me = this;\n var maxRight = me.width - rightMovement - me.drawingArea;\n var maxLeft = leftMovement + me.drawingArea;\n var maxTop = topMovement + me.drawingArea;\n var maxBottom = me.height - bottomMovement - me.drawingArea;\n\n me.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left);\n me.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top);\n },\n\n getIndexAngle: function(index) {\n var angleMultiplier = (Math.PI * 2) / getValueCount(this);\n var startAngle = this.chart.options && this.chart.options.startAngle ?\n this.chart.options.startAngle :\n 0;\n\n var startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n // Start from the top instead of right, so remove a quarter of the circle\n return index * angleMultiplier + startAngleRadians;\n },\n getDistanceFromCenterForValue: function(value) {\n var me = this;\n\n if (value === null) {\n return 0; // null always in center\n }\n\n // Take into account half font size + the yPadding of the top value\n var scalingFactor = me.drawingArea / (me.max - me.min);\n if (me.options.ticks.reverse) {\n return (me.max - value) * scalingFactor;\n }\n return (value - me.min) * scalingFactor;\n },\n getPointPosition: function(index, distanceFromCenter) {\n var me = this;\n var thisAngle = me.getIndexAngle(index) - (Math.PI / 2);\n return {\n x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\n y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\n };\n },\n getPointPositionForValue: function(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n },\n\n getBasePosition: function() {\n var me = this;\n var min = me.min;\n var max = me.max;\n\n return me.getPointPositionForValue(0,\n me.beginAtZero ? 0 :\n min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0);\n },\n\n draw: function() {\n var me = this;\n var opts = me.options;\n var gridLineOpts = opts.gridLines;\n var tickOpts = opts.ticks;\n var valueOrDefault = helpers.valueOrDefault;\n\n if (opts.display) {\n var ctx = me.ctx;\n var startAngle = this.getIndexAngle(0);\n\n // Tick Font\n var tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n var tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\n var tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\n var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\n helpers.each(me.ticks, function(label, index) {\n // Don't draw a centre value (if it is minimum)\n if (index > 0 || tickOpts.reverse) {\n var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\n // Draw circular lines around the scale\n if (gridLineOpts.display && index !== 0) {\n drawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n }\n\n if (tickOpts.display) {\n var tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\n ctx.font = tickLabelFont;\n\n ctx.save();\n ctx.translate(me.xCenter, me.yCenter);\n ctx.rotate(startAngle);\n\n if (tickOpts.showLabelBackdrop) {\n var labelWidth = ctx.measureText(label).width;\n ctx.fillStyle = tickOpts.backdropColor;\n ctx.fillRect(\n -labelWidth / 2 - tickOpts.backdropPaddingX,\n -yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY,\n labelWidth + tickOpts.backdropPaddingX * 2,\n tickFontSize + tickOpts.backdropPaddingY * 2\n );\n }\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = tickFontColor;\n ctx.fillText(label, 0, -yCenterOffset);\n ctx.restore();\n }\n }\n });\n\n if (opts.angleLines.display || opts.pointLabels.display) {\n drawPointLabels(me);\n }\n }\n }\n });\n Chart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig);\n\n };\n\n},{\"25\":25,\"34\":34,\"45\":45}],57:[function(require,module,exports){\n\t/* global window: false */\n 'use strict';\n\n var moment = require(6);\n moment = typeof moment === 'function' ? moment : window.moment;\n\n var defaults = require(25);\n var helpers = require(45);\n\n// Integer constants are from the ES6 spec.\n var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\n var INTERVALS = {\n millisecond: {\n major: true,\n size: 1,\n steps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n },\n second: {\n major: true,\n size: 1000,\n steps: [1, 2, 5, 10, 30]\n },\n minute: {\n major: true,\n size: 60000,\n steps: [1, 2, 5, 10, 30]\n },\n hour: {\n major: true,\n size: 3600000,\n steps: [1, 2, 3, 6, 12]\n },\n day: {\n major: true,\n size: 86400000,\n steps: [1, 2, 5]\n },\n week: {\n major: false,\n size: 604800000,\n steps: [1, 2, 3, 4]\n },\n month: {\n major: true,\n size: 2.628e9,\n steps: [1, 2, 3]\n },\n quarter: {\n major: false,\n size: 7.884e9,\n steps: [1, 2, 3, 4]\n },\n year: {\n major: true,\n size: 3.154e10\n }\n };\n\n var UNITS = Object.keys(INTERVALS);\n\n function sorter(a, b) {\n return a - b;\n }\n\n function arrayUnique(items) {\n var hash = {};\n var out = [];\n var i, ilen, item;\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n if (!hash[item]) {\n hash[item] = true;\n out.push(item);\n }\n }\n\n return out;\n }\n\n /**\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n * extremity (left + width or top + height). Note that it would be more optimized to directly\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n *\n * @param {Number[]} timestamps - timestamps sorted from lowest to highest.\n * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\n * If 'series', timestamps will be positioned at the same distance from each other. In this\n * case, only timestamps that break the time linearity are registered, meaning that in the\n * best case, all timestamps are linear, the table contains only min and max.\n */\n function buildLookupTable(timestamps, min, max, distribution) {\n if (distribution === 'linear' || !timestamps.length) {\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n var table = [];\n var items = [min];\n var i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr > min && curr < max) {\n items.push(curr);\n }\n }\n\n items.push(max);\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n\n return table;\n }\n\n// @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\n function lookup(table, key, value) {\n var lo = 0;\n var hi = table.length - 1;\n var mid, i0, i1;\n\n while (lo >= 0 && lo <= hi) {\n mid = (lo + hi) >> 1;\n i0 = table[mid - 1] || null;\n i1 = table[mid];\n\n if (!i0) {\n // given value is outside table (before first item)\n return {lo: null, hi: i1};\n } else if (i1[key] < value) {\n lo = mid + 1;\n } else if (i0[key] > value) {\n hi = mid - 1;\n } else {\n return {lo: i0, hi: i1};\n }\n }\n\n // given value is outside table (after last item)\n return {lo: i1, hi: null};\n }\n\n /**\n * Linearly interpolates the given source `value` using the table items `skey` values and\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\n * index [0, 1] or [n - 1, n] are used for the interpolation.\n */\n function interpolate(table, skey, sval, tkey) {\n var range = lookup(table, skey, sval);\n\n // Note: the lookup table ALWAYS contains at least 2 items (min and max)\n var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\n var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\n\n var span = next[skey] - prev[skey];\n var ratio = span ? (sval - prev[skey]) / span : 0;\n var offset = (next[tkey] - prev[tkey]) * ratio;\n\n return prev[tkey] + offset;\n }\n\n /**\n * Convert the given value to a moment object using the given time options.\n * @see http://momentjs.com/docs/#/parsing/\n */\n function momentify(value, options) {\n var parser = options.parser;\n var format = options.parser || options.format;\n\n if (typeof parser === 'function') {\n return parser(value);\n }\n\n if (typeof value === 'string' && typeof format === 'string') {\n return moment(value, format);\n }\n\n if (!(value instanceof moment)) {\n value = moment(value);\n }\n\n if (value.isValid()) {\n return value;\n }\n\n // Labels are in an incompatible moment format and no `parser` has been provided.\n // The user might still use the deprecated `format` option to convert his inputs.\n if (typeof format === 'function') {\n return format(value);\n }\n\n return value;\n }\n\n function parse(input, scale) {\n if (helpers.isNullOrUndef(input)) {\n return null;\n }\n\n var options = scale.options.time;\n var value = momentify(scale.getRightValue(input), options);\n if (!value.isValid()) {\n return null;\n }\n\n if (options.round) {\n value.startOf(options.round);\n }\n\n return value.valueOf();\n }\n\n /**\n * Returns the number of unit to skip to be able to display up to `capacity` number of ticks\n * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.\n */\n function determineStepSize(min, max, unit, capacity) {\n var range = max - min;\n var interval = INTERVALS[unit];\n var milliseconds = interval.size;\n var steps = interval.steps;\n var i, ilen, factor;\n\n if (!steps) {\n return Math.ceil(range / ((capacity || 1) * milliseconds));\n }\n\n for (i = 0, ilen = steps.length; i < ilen; ++i) {\n factor = steps[i];\n if (Math.ceil(range / (milliseconds * factor)) <= capacity) {\n break;\n }\n }\n\n return factor;\n }\n\n function determineUnit(minUnit, min, max, capacity) {\n var ilen = UNITS.length;\n var i, interval, factor;\n\n for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n interval = INTERVALS[UNITS[i]];\n factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;\n\n if (Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n }\n\n function determineMajorUnit(unit) {\n for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].major) {\n return UNITS[i];\n }\n }\n }\n\n /**\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n * `minor` unit, aligned on the `major` unit and using the given scale time `options`.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n */\n function generate(min, max, minor, major, capacity, options) {\n var timeOpts = options.time;\n var stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize);\n var weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n var majorTicksEnabled = options.ticks.major.enabled;\n var interval = INTERVALS[minor];\n var first = moment(min);\n var last = moment(max);\n var ticks = [];\n var time;\n\n if (!stepSize) {\n stepSize = determineStepSize(min, max, minor, capacity);\n }\n\n // For 'week' unit, handle the first day of week option\n if (weekday) {\n first = first.isoWeekday(weekday);\n last = last.isoWeekday(weekday);\n }\n\n // Align first/last ticks on unit\n first = first.startOf(weekday ? 'day' : minor);\n last = last.startOf(weekday ? 'day' : minor);\n\n // Make sure that the last tick include max\n if (last < max) {\n last.add(1, minor);\n }\n\n time = moment(first);\n\n if (majorTicksEnabled && major && !weekday && !timeOpts.round) {\n // Align the first tick on the previous `minor` unit aligned on the `major` unit:\n // we first aligned time on the previous `major` unit then add the number of full\n // stepSize there is between first and the previous major time.\n time.startOf(major);\n time.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor);\n }\n\n for (; time < last; time.add(stepSize, minor)) {\n ticks.push(+time);\n }\n\n ticks.push(+time);\n\n return ticks;\n }\n\n /**\n * Returns the right and left offsets from edges in the form of {left, right}.\n * Offsets are added when the `offset` option is true.\n */\n function computeOffsets(table, ticks, min, max, options) {\n var left = 0;\n var right = 0;\n var upper, lower;\n\n if (options.offset && ticks.length) {\n if (!options.time.min) {\n upper = ticks.length > 1 ? ticks[1] : max;\n lower = ticks[0];\n left = (\n interpolate(table, 'time', upper, 'pos') -\n interpolate(table, 'time', lower, 'pos')\n ) / 2;\n }\n if (!options.time.max) {\n upper = ticks[ticks.length - 1];\n lower = ticks.length > 1 ? ticks[ticks.length - 2] : min;\n right = (\n interpolate(table, 'time', upper, 'pos') -\n interpolate(table, 'time', lower, 'pos')\n ) / 2;\n }\n }\n\n return {left: left, right: right};\n }\n\n function ticksFromTimestamps(values, majorUnit) {\n var ticks = [];\n var i, ilen, value, major;\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n value = values[i];\n major = majorUnit ? value === +moment(value).startOf(majorUnit) : false;\n\n ticks.push({\n value: value,\n major: major\n });\n }\n\n return ticks;\n }\n\n module.exports = function(Chart) {\n\n var defaultConfig = {\n position: 'bottom',\n\n /**\n * Data distribution along the scale:\n * - 'linear': data are spread according to their time (distances can vary),\n * - 'series': data are spread at the same distance from each other.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n distribution: 'linear',\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n time: {\n parser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n displayFormat: false, // DEPRECATED\n isoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/\n minUnit: 'millisecond',\n\n // defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/\n displayFormats: {\n millisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM,\n second: 'h:mm:ss a', // 11:20:01 AM\n minute: 'h:mm a', // 11:20 AM\n hour: 'hA', // 5PM\n day: 'MMM D', // Sep 4\n week: 'll', // Week 46, or maybe \"[W]WW - YYYY\" ?\n month: 'MMM YYYY', // Sept 2015\n quarter: '[Q]Q - YYYY', // Q3\n year: 'YYYY' // 2015\n },\n },\n ticks: {\n autoSkip: false,\n\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n major: {\n enabled: false\n }\n }\n };\n\n var TimeScale = Chart.Scale.extend({\n initialize: function() {\n if (!moment) {\n throw new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');\n }\n\n this.mergeTicksOptions();\n\n Chart.Scale.prototype.initialize.call(this);\n },\n\n update: function() {\n var me = this;\n var options = me.options;\n\n // DEPRECATIONS: output a message only one time per update\n if (options.time && options.time.format) {\n console.warn('options.time.format is deprecated and replaced by options.time.parser.');\n }\n\n return Chart.Scale.prototype.update.apply(me, arguments);\n },\n\n /**\n * Allows data to be referenced via 't' attribute\n */\n getRightValue: function(rawValue) {\n if (rawValue && rawValue.t !== undefined) {\n rawValue = rawValue.t;\n }\n return Chart.Scale.prototype.getRightValue.call(this, rawValue);\n },\n\n determineDataLimits: function() {\n var me = this;\n var chart = me.chart;\n var timeOpts = me.options.time;\n var min = parse(timeOpts.min, me) || MAX_INTEGER;\n var max = parse(timeOpts.max, me) || MIN_INTEGER;\n var timestamps = [];\n var datasets = [];\n var labels = [];\n var i, j, ilen, jlen, data, timestamp;\n\n // Convert labels to timestamps\n for (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) {\n labels.push(parse(chart.data.labels[i], me));\n }\n\n // Convert data to timestamps\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n data = chart.data.datasets[i].data;\n\n // Let's consider that all data have the same format.\n if (helpers.isObject(data[0])) {\n datasets[i] = [];\n\n for (j = 0, jlen = data.length; j < jlen; ++j) {\n timestamp = parse(data[j], me);\n timestamps.push(timestamp);\n datasets[i][j] = timestamp;\n }\n } else {\n timestamps.push.apply(timestamps, labels);\n datasets[i] = labels.slice(0);\n }\n } else {\n datasets[i] = [];\n }\n }\n\n if (labels.length) {\n // Sort labels **after** data have been converted\n labels = arrayUnique(labels).sort(sorter);\n min = Math.min(min, labels[0]);\n max = Math.max(max, labels[labels.length - 1]);\n }\n\n if (timestamps.length) {\n timestamps = arrayUnique(timestamps).sort(sorter);\n min = Math.min(min, timestamps[0]);\n max = Math.max(max, timestamps[timestamps.length - 1]);\n }\n\n // In case there is no valid min/max, let's use today limits\n min = min === MAX_INTEGER ? +moment().startOf('day') : min;\n max = max === MIN_INTEGER ? +moment().endOf('day') + 1 : max;\n\n // Make sure that max is strictly higher than min (required by the lookup table)\n me.min = Math.min(min, max);\n me.max = Math.max(min + 1, max);\n\n // PRIVATE\n me._horizontal = me.isHorizontal();\n me._table = [];\n me._timestamps = {\n data: timestamps,\n datasets: datasets,\n labels: labels\n };\n },\n\n buildTicks: function() {\n var me = this;\n var min = me.min;\n var max = me.max;\n var options = me.options;\n var timeOpts = options.time;\n var formats = timeOpts.displayFormats;\n var capacity = me.getLabelCapacity(min);\n var unit = timeOpts.unit || determineUnit(timeOpts.minUnit, min, max, capacity);\n var majorUnit = determineMajorUnit(unit);\n var timestamps = [];\n var ticks = [];\n var i, ilen, timestamp;\n\n switch (options.ticks.source) {\n case 'data':\n timestamps = me._timestamps.data;\n break;\n case 'labels':\n timestamps = me._timestamps.labels;\n break;\n case 'auto':\n default:\n timestamps = generate(min, max, unit, majorUnit, capacity, options);\n }\n\n if (options.bounds === 'ticks' && timestamps.length) {\n min = timestamps[0];\n max = timestamps[timestamps.length - 1];\n }\n\n // Enforce limits with user min/max options\n min = parse(timeOpts.min, me) || min;\n max = parse(timeOpts.max, me) || max;\n\n // Remove ticks outside the min/max range\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n timestamp = timestamps[i];\n if (timestamp >= min && timestamp <= max) {\n ticks.push(timestamp);\n }\n }\n\n me.min = min;\n me.max = max;\n\n // PRIVATE\n me._unit = unit;\n me._majorUnit = majorUnit;\n me._minorFormat = formats[unit];\n me._majorFormat = formats[majorUnit];\n me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);\n me._offsets = computeOffsets(me._table, ticks, min, max, options);\n\n return ticksFromTimestamps(ticks, majorUnit);\n },\n\n getLabelForIndex: function(index, datasetIndex) {\n var me = this;\n var data = me.chart.data;\n var timeOpts = me.options.time;\n var label = data.labels && index < data.labels.length ? data.labels[index] : '';\n var value = data.datasets[datasetIndex].data[index];\n\n if (helpers.isObject(value)) {\n label = me.getRightValue(value);\n }\n if (timeOpts.tooltipFormat) {\n label = momentify(label, timeOpts).format(timeOpts.tooltipFormat);\n }\n\n return label;\n },\n\n /**\n * Function to format an individual tick mark\n * @private\n */\n tickFormatFunction: function(tick, index, ticks) {\n var me = this;\n var options = me.options;\n var time = tick.valueOf();\n var majorUnit = me._majorUnit;\n var majorFormat = me._majorFormat;\n var majorTime = tick.clone().startOf(me._majorUnit).valueOf();\n var majorTickOpts = options.ticks.major;\n var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;\n var label = tick.format(major ? majorFormat : me._minorFormat);\n var tickOpts = major ? majorTickOpts : options.ticks.minor;\n var formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback);\n\n return formatter ? formatter(label, index, ticks) : label;\n },\n\n convertTicksToLabels: function(ticks) {\n var labels = [];\n var i, ilen;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n labels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks));\n }\n\n return labels;\n },\n\n /**\n * @private\n */\n getPixelForOffset: function(time) {\n var me = this;\n var size = me._horizontal ? me.width : me.height;\n var start = me._horizontal ? me.left : me.top;\n var pos = interpolate(me._table, 'time', time, 'pos');\n\n return start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right);\n },\n\n getPixelForValue: function(value, index, datasetIndex) {\n var me = this;\n var time = null;\n\n if (index !== undefined && datasetIndex !== undefined) {\n time = me._timestamps.datasets[datasetIndex][index];\n }\n\n if (time === null) {\n time = parse(value, me);\n }\n\n if (time !== null) {\n return me.getPixelForOffset(time);\n }\n },\n\n getPixelForTick: function(index) {\n var ticks = this.getTicks();\n return index >= 0 && index < ticks.length ?\n this.getPixelForOffset(ticks[index].value) :\n null;\n },\n\n getValueForPixel: function(pixel) {\n var me = this;\n var size = me._horizontal ? me.width : me.height;\n var start = me._horizontal ? me.left : me.top;\n var pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right;\n var time = interpolate(me._table, 'pos', pos, 'time');\n\n return moment(time);\n },\n\n /**\n * Crude approximation of what the label width might be\n * @private\n */\n getLabelWidth: function(label) {\n var me = this;\n var ticksOpts = me.options.ticks;\n var tickLabelWidth = me.ctx.measureText(label).width;\n var angle = helpers.toRadians(ticksOpts.maxRotation);\n var cosRotation = Math.cos(angle);\n var sinRotation = Math.sin(angle);\n var tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize);\n\n return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\n },\n\n /**\n * @private\n */\n getLabelCapacity: function(exampleTime) {\n var me = this;\n\n me._minorFormat = me.options.time.displayFormats.millisecond;\t// Pick the longest format for guestimation\n\n var exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, []);\n var tickLabelWidth = me.getLabelWidth(exampleLabel);\n var innerWidth = me.isHorizontal() ? me.width : me.height;\n\n return Math.floor(innerWidth / tickLabelWidth);\n }\n });\n\n Chart.scaleService.registerScaleType('time', TimeScale, defaultConfig);\n };\n\n},{\"25\":25,\"45\":45,\"6\":6}]},{},[7])(7)\n});"],"names":["f","exports","_typeof","module","define","amd","window","global","self","this","Chart","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","colorNames","getRgba","string","abbr","rgb","match","parseInt","slice","parseFloat","Math","round","scale","getHsla","hsl","alpha","isNaN","getHwb","hwb","rgbaString","rgba","undefined","percentaString","hslaString","hsla","num","min","max","hexDouble","str","toString","toUpperCase","getRgb","getHsl","getAlpha","vals","hexString","rgbString","percentString","g","b","hslString","hwbString","keyword","reverseNames","name","convert","Color","obj","valid","values","hsv","cmyk","setValues","red","lightness","v","value","w","whiteness","c","cyan","prototype","isValid","setSpace","arguments","rgbArray","hslArray","hsvArray","hwbArray","concat","cmykArray","rgbaArray","hslaArray","val","setChannel","green","blue","hue","saturation","saturationv","blackness","magenta","yellow","black","rgbNumber","luminosity","lum","chan","pow","contrast","color2","lum1","lum2","level","contrastRatio","dark","yiq","light","negate","lighten","ratio","darken","saturate","desaturate","whiten","blacken","greyscale","clearer","opaquer","rotate","degrees","mix","mixinColor","weight","color1","p","w1","w2","toJSON","clone","type","result","source","target","prop","hasOwnProperty","console","error","spaces","maxes","getValues","space","charAt","capped","chans","sname","args","Array","index","svalues","rgb2hsl","h","delta","rgb2hsv","rgb2hwb","rgb2cmyk","k","rgb2keyword","reverseKeywords","JSON","stringify","rgb2xyz","rgb2lab","xyz","x","y","z","hsl2rgb","t1","t2","t3","hsv2rgb","hi","floor","q","hwb2rgb","wh","bl","cmyk2rgb","m","xyz2rgb","xyz2lab","lab2xyz","lab","y2","lab2lch","atan2","PI","sqrt","lab2rgb","lch2lab","lch","hr","cos","sin","keyword2rgb","cssKeywords","rgb2lch","hsl2hsv","hsl2hwb","hsl2cmyk","hsl2keyword","hsv2hsl","sl","hsv2hwb","hsv2cmyk","hsv2keyword","hwb2hsl","hwb2hsv","hwb2cmyk","hwb2keyword","cmyk2hsl","cmyk2hsv","cmyk2hwb","cmyk2keyword","keyword2hsl","keyword2hsv","keyword2hwb","keyword2cmyk","keyword2lab","keyword2xyz","xyz2lch","lch2xyz","lch2rgb","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellowgreen","key","conversions","Converter","func","arg","pair","exec","from","to","convs","routeSpace","fspace","forEach","factory","moment","hookCallback","hooks","apply","isArray","input","Object","isObject","isUndefined","isNumber","isDate","Date","map","arr","fn","res","push","hasOwnProp","extend","valueOf","createUTC","format","locale","strict","createLocalOrUTC","utc","getParsingFlags","_pf","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","meridiem","rfc2822","weekdayMismatch","some$1","some","fun","len","_isValid","flags","parsedParts","isNowValid","_d","getTime","invalidWeekday","_strict","bigHour","isFrozen","createInvalid","NaN","momentProperties","copyConfig","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","updateInProgress","Moment","config","updateOffset","isMoment","absFloor","number","ceil","toInt","argumentForCoercion","coercedNumber","isFinite","compareArrays","array1","array2","dontConvert","lengthDiff","abs","diffs","warn","msg","suppressDeprecationWarnings","deprecate","firstTime","deprecationHandler","join","stack","deprecations","deprecateSimple","isFunction","Function","mergeConfigs","parentConfig","childConfig","Locale","set","keys$1","keys","aliases","addUnitAlias","unit","shorthand","lowerCase","toLowerCase","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedInput","normalizedProp","priorities","addUnitPriority","priority","makeGetSet","keepTime","set$1","get","mom","zeroFill","targetLength","forceSign","absNumber","zerosToFill","substr","formattingTokens","localFormattingTokens","formatFunctions","formatTokenFunctions","addFormatToken","token","padded","ordinal","callback","localeData","formatMoment","expandFormat","makeFormatFunction","array","replace","output","invalidDate","replaceLongDateFormatTokens","longDateFormat","lastIndex","test","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchOffset","matchShortOffset","matchWord","regexes","addRegexToken","regex","strictRegex","isStrict","getParseRegexForToken","RegExp","regexEscape","matched","p1","p2","p3","p4","tokens","addParseToken","addWeekParseToken","_w","addTimeToArrayFromToken","_a","YEAR","MONTH","DATE","HOUR","MINUTE","SECOND","MILLISECOND","WEEK","WEEKDAY","indexOf$1","indexOf","daysInMonth","year","month","UTC","getUTCDate","monthsShort","months","monthsShortRegex","monthsRegex","monthsParse","MONTHS_IN_FORMAT","defaultLocaleMonths","split","defaultLocaleMonthsShort","handleStrictParse","monthName","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","setMonth","dayOfMonth","date","getSetMonth","defaultMonthsShortRegex","defaultMonthsRegex","computeMonthsParse","cmpLenRev","shortPieces","longPieces","mixedPieces","sort","_monthsRegex","_monthsShortRegex","_monthsStrictRegex","_monthsShortStrictRegex","daysInYear","isLeapYear","parseTwoDigitYear","getSetYear","createDate","d","M","ms","getFullYear","setFullYear","createUTCDate","getUTCFullYear","setUTCFullYear","firstWeekOffset","dow","doy","fwd","getUTCDay","dayOfYearFromWeeks","week","weekday","localWeekday","resYear","resDayOfYear","dayOfYear","weekOfYear","resWeek","weekOffset","weeksInYear","weekOffsetNext","weekdaysMin","weekdaysShort","weekdays","weekdaysMinRegex","weekdaysShortRegex","weekdaysRegex","weekdaysParse","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","day","defaultWeekdaysRegex","defaultWeekdaysShortRegex","defaultWeekdaysMinRegex","computeWeekdaysParse","minPieces","minp","shortp","longp","_weekdaysRegex","_weekdaysShortRegex","_weekdaysMinRegex","_weekdaysStrictRegex","_weekdaysShortStrictRegex","_weekdaysMinStrictRegex","hFormat","hours","lowercase","minutes","matchMeridiem","_meridiemParse","seconds","kInput","_isPm","isPM","_meridiem","pos","pos1","pos2","globalLocale","getSetHour","baseConfig","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","LTS","LT","L","LL","LLL","LLLL","dayOfMonthOrdinalParse","relativeTime","future","past","ss","mm","hh","dd","MM","yy","meridiemParse","locales","localeFamilies","normalizeLocale","loadLocale","oldLocale","_abbr","getSetGlobalLocale","data","getLocale","defineLocale","_config","parentLocale","chooseLocale","names","j","next","checkOverflow","_overflowDayOfYear","_overflowWeeks","_overflowWeekday","extendedIsoRegex","basicIsoRegex","tzRegex","isoDates","isoTimes","aspNetJsonRegex","configFromISO","allowTime","dateFormat","timeFormat","tzFormat","configFromStringAndFormat","basicRfcRegex","configFromRFC2822","dayFormat","timezone","timezoneIndex","timezones","momentDate","momentDay","getDay","splice","defaults","configFromArray","currentDate","yearToUse","currentDateArray","nowValue","now","_useUTC","getUTCMonth","getMonth","getDate","dayOfYearFromWeekInfo","weekYear","temp","weekdayOverflow","GG","W","E","createLocal","_week","curWeek","gg","_dayOfYear","_nextDay","setUTCMinutes","getUTCMinutes","ISO_8601","RFC_2822","parsedInput","skipped","stringLength","totalParsedInputLength","hour","isPm","meridiemHour","meridiemFixWrap","prepareConfig","preparse","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromInput","configFromString","createFromInputFallback","configFromObject","minute","second","millisecond","isUTC","createFromConfig","isObjectEmpty","add","prototypeMin","other","prototypeMax","pickBy","moments","ordering","Duration","duration","years","quarters","quarter","weeks","days","milliseconds","isDurationValid","unitHasDecimal","_milliseconds","_days","_months","_data","_bubble","isDuration","absRound","offset","separator","utcOffset","sign","offsetFromString","chunkOffset","matcher","matches","chunk","parts","cloneWithOffset","model","diff","setTime","local","getDateOffset","getTimezoneOffset","isUtc","aspNetRegex","isoRegex","createDuration","ret","diffRes","parseIso","base","isBefore","positiveMomentsDifference","momentsDifference","inp","isAfter","createAdder","direction","period","dur","tmp","addSubtract","isAdding","invalid","subtract","newLocaleData","defaultFormat","defaultFormatUtc","lang","addWeekYearFormatToken","getter","getSetWeekYearHelper","weeksTarget","setWeekAll","dayOfYearData","isoWeekYear","_dayOfMonthOrdinalParse","_ordinalParse","_dayOfMonthOrdinalParseLenient","getSetDayOfMonth","getSetMinute","getSetSecond","parseMs","getSetMillisecond","proto","preParsePostFormat","time","formats","sod","startOf","calendarFormat","asFloat","that","zoneDelta","wholeMonthDiff","adjust","anchor","monthDiff","endOf","inputString","postformat","withoutSuffix","humanize","fromNow","toNow","stringGet","invalidAt","localInput","isBetween","inclusivity","isSame","inputMs","isSameOrAfter","isSameOrBefore","parsingFlags","prioritized","getPrioritizedUnits","unitsObj","isoWeekday","toArray","toObject","toDate","toISOString","inspect","zone","isLocal","prefix","suffix","unix","creationData","getSetWeekYear","getSetISOWeekYear","isoWeek","getSetQuarter","getSetWeek","isoWeeks","getSetISOWeek","weekInfo","isoWeeksInYear","getSetDayOfWeek","parseWeekday","getSetLocaleDayOfWeek","getSetISODayOfWeek","parseIsoWeekday","getSetDayOfYear","keepLocalTime","keepMinutes","localAdjust","_changeInProgress","setOffsetToUTC","setOffsetToLocal","parseZone","tZone","hasAlignedHourOffset","isDST","isUtcOffset","zoneAbbr","zoneName","dates","isDSTShifted","_isDSTShifted","proto$1","get$1","field","setter","listMonthsImpl","out","listWeekdaysImpl","localeSorted","shift","_calendar","_longDateFormat","formatUpper","_invalidDate","_ordinal","isFuture","_relativeTime","pastFuture","isFormat","_monthsShort","_monthsParseExact","localeWeek","firstDayOfYear","firstDayOfWeek","_weekdays","localeWeekdaysMin","_weekdaysMin","localeWeekdaysShort","_weekdaysShort","_weekdaysParseExact","_fullWeekdaysParse","localeIsPM","isLower","langData","mathAbs","addSubtract$1","absCeil","daysToMonths","monthsToDays","makeAs","alias","as","asMilliseconds","asSeconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","makeGetter","thresholds","substituteTimeAgo","abs$1","toISOString$1","Y","D","total","proto$2","monthsFromDays","get$2","withSuffix","posNegDuration","relativeTime$1","toIsoString","version","createUnix","updateLocale","relativeTimeRounding","getSetRelativeTimeRounding","roundingFunction","relativeTimeThreshold","threshold","limit","myMoment","helpers","Element","elements","Interaction","platform","plugins","register","initialize","canvasHelpers","canvas","Bar","context","Bubble","Doughnut","Line","PolarArea","Radar","Scatter","_set","hover","mode","scales","xAxes","categoryPercentage","barPercentage","gridLines","offsetGridLines","yAxes","axis","position","rectangle","borderSkipped","tooltips","callbacks","title","item","yLabel","labels","label","datasets","datasetIndex","xLabel","controllers","bar","DatasetController","dataElementType","Rectangle","me","meta","getMeta","getDataset","update","reset","ilen","rects","_ruler","getRuler","updateElement","chart","dataset","custom","rectangleOptions","options","_xScale","getScaleForId","xAxisID","_yScale","yAxisID","_datasetIndex","_index","_model","datasetLabel","backgroundColor","valueAtIndexOrDefault","borderColor","borderWidth","updateElementGeometry","pivot","vscale","getValueScale","getBasePixel","horizontal","isHorizontal","ruler","vpixels","calculateBarValuePixels","ipixels","calculateBarIndexPixels","head","center","height","size","width","getValueScaleId","getIndexScaleId","getIndexScale","getStackCount","last","stacked","stacks","getDatasetMeta","isDatasetVisible","getStackIndex","stackCount","pixels","start","left","top","end","getPixelForValue","imeta","ivalue","getRightValue","controller","id","leftSampleSize","rightSampleSize","leftCategorySize","fullBarSize","stackIndex","valueOrDefault","barThickness","maxBarThickness","Infinity","draw","clipArea","ctx","chartArea","unclipArea","setHoverStyle","hoverBackgroundColor","getHoverColor","hoverBorderColor","hoverBorderWidth","removeHoverStyle","rectangleElementOptions","horizontalBar","dataPoint","bubble","Point","points","each","point","xScale","yScale","_resolveElementOptions","dsIndex","getPixelForDecimal","_options","hitRadius","pointStyle","radius","skip","hoverRadius","resolve","dataIndex","animation","animateRotate","animateScale","legendCallback","text","legend","generateLabels","ds","arc","arcOpts","fillStyle","strokeStyle","lineWidth","hidden","onClick","legendItem","cutoutPercentage","rotation","circumference","tooltipItem","dataLabel","doughnut","pie","Arc","linkScales","noop","getRingIndex","ringIndex","opts","availableWidth","right","availableHeight","bottom","minSize","startAngle","endAngle","contains0","contains90","contains180","contains270","cutout","getMaxBorderWidth","outerRadius","innerRadius","radiusLength","getVisibleDatasetCount","offsetX","offsetY","calculateTotal","animationOpts","centerX","centerY","calculateCircumference","element","arcs","hoverWidth","_chart","showLines","spanGaps","lineEnabled","showLine","line","datasetElementType","lineElementOptions","tension","lineTension","_scale","_children","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill","steppedLine","stepped","cubicInterpolationMode","updateBezierControlPoints","getPointBackgroundColor","pointBackgroundColor","getPointBorderColor","pointBorderColor","getPointBorderWidth","pointBorderWidth","pointOptions","pointRadius","pointHitRadius","calculatePointY","dsMeta","sumPos","sumNeg","stackedRightValue","Number","rightValue","controlPoints","area","capControlPoint","pt","filter","splineCurveMonotone","splineCurve","previousItem","nextItem","controlPointPreviousX","previous","controlPointPreviousY","controlPointNextX","controlPointNextY","capBezierPoints","pointHoverRadius","pointHoverBackgroundColor","pointHoverBorderColor","pointHoverBorderWidth","angleLines","display","circular","pointLabels","ticks","beginAtZero","polarArea","count","countVisibleElements","xCenter","yCenter","visibleCount","datasetStartAngle","distance","getDistanceFromCenterForValue","resetRadius","radar","_loop","pointElementOptions","pointPosition","getPointPositionForValue","scatter","easing","onProgress","onComplete","Animation","currentStep","numSteps","render","onAnimationProgress","onAnimationComplete","animationService","frameDuration","animations","dropFrames","request","addAnimation","lazy","animating","requestAnimationFrame","cancelAnimation","findIndex","requestAnimFrame","startDigest","startTime","framesToDrop","advance","endTime","defineProperty","positionIsHorizontal","types","instances","construct","initConfig","configMerge","acquireContext","uid","aspectRatio","_bufferedRender","notify","retinaScale","devicePixelRatio","bindEvents","responsive","resize","ensureScalesHaveIDs","buildScales","initToolTip","clear","stop","silent","maintainAspectRatio","newWidth","getMaximumWidth","newHeight","getMaximumHeight","style","newSize","onResize","responsiveAnimationDuration","scalesOptions","scaleOptions","xAxisOptions","yAxisOptions","items","dtype","dposition","isDefault","scaleType","scaleClass","scaleService","getScaleConstructor","mergeTicksOptions","addScalesToLayout","buildOrUpdateControllers","newControllers","destroyDatasetMeta","updateIndex","ControllerClass","resetElements","tooltip","newOptions","buildOrUpdateElements","updateLayout","updateDatasets","_bufferedRequest","layoutService","updateDataset","animationOptions","animationObject","easingFunction","effects","stepDecimal","easingValue","isNullOrUndef","transition","boxes","box","drawDatasets","drawDataset","getElementAtEvent","modes","single","getElementsAtEvent","intersect","getElementsAtXAxis","getElementsAtEventForMode","method","getDatasetAtEvent","_meta","generateLegend","destroy","unbindEvents","releaseContext","toBase64Image","toDataURL","Tooltip","_chartInstance","listeners","_listeners","listener","eventHandler","events","addEventListener","removeEventListener","updateHoverStyle","enabled","changed","handleEvent","bufferedRequest","animationDuration","hoverOptions","lastActive","active","onHover","native","arrayEquals","Controller","arrayEvents","unlistenArrayEvents","stub","_chartjs","addElements","scaleID","createMetaDataset","createMetaData","metaData","addElementAndReset","configurable","enumerable","object","resyncElements","elementOpts","numMeta","numData","insertElements","onDataPush","onDataPop","pop","onDataShift","onDataSplice","onDataUnshift","inherits","scope","merge","color","configuration","_view","_start","ease","view","interpolate","actual","origin","c0","c1","tooltipPosition","hasValue","parseMaxStyle","styleValue","node","parentProperty","valueInPixels","parentNode","isConstrainedValue","getConstraintDimension","domNode","maxStyle","percentageProperty","document","defaultView","constrainedNode","getComputedStyle","constrainedContainer","hasCNode","hasCContainer","infinity","POSITIVE_INFINITY","setFn","merger","tval","sval","scaleMerge","getScaleDefaults","_merger","slen","where","collection","filterCallback","filtered","findNextWhere","arrayToSearch","startIndex","currentItem","findPreviousWhere","extensions","ChartElement","constructor","Surrogate","__super__","almostEquals","epsilon","almostWhole","rounded","reduce","NEGATIVE_INFINITY","log10","log","LN10","toRadians","toDegrees","radians","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","distanceBetweenPoints","pt1","pt2","aliasPixel","pixelWidth","firstPoint","middlePoint","afterPoint","current","d01","d12","s01","s12","fa","fb","EPSILON","pointsWithTangents","pointBefore","pointCurrent","pointAfter","alphaK","betaK","tauK","squaredMagnitude","deltaX","deltaK","mK","pointsLen","slopeDeltaX","loop","niceNum","range","exponent","fraction","niceFraction","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","setTimeout","getRelativePosition","evt","mouseX","mouseY","originalEvent","currentTarget","srcElement","boundingRect","getBoundingClientRect","touches","clientX","clientY","paddingLeft","getStyle","paddingTop","paddingRight","paddingBottom","currentDevicePixelRatio","getConstraintWidth","getConstraintHeight","container","clientWidth","cw","clientHeight","ch","el","property","currentStyle","getPropertyValue","forceRatio","pixelRatio","fontString","pixelSize","fontStyle","fontFamily","longestText","font","arrayOfThings","cache","gc","garbageCollect","longest","thing","measureText","nestedThing","gcLen","textWidth","numberOfLabelLines","numberOfLines","CanvasGradient","defaultColor","colorValue","CanvasPattern","parseVisibleItems","handler","jlen","getIntersectItems","inRange","getNearestItems","distanceMetric","minDistance","nearestItems","getCenterPoint","getDistanceMetricForAxis","useX","useY","deltaY","indexMode","nearest","getArea","intersectsItem","inXRange","inYRange","defaultFontColor","defaultFontFamily","defaultFontSize","defaultFontStyle","layout","padding","filterByPosition","sortByWeight","reverse","_tmpIndex_","v0","v1","addBox","fullWidth","removeBox","layoutItem","configure","props","layoutOptions","toPadding","leftPadding","rightPadding","topPadding","bottomPadding","leftBoxes","rightBoxes","topBoxes","bottomBoxes","chartAreaBoxes","chartWidth","chartHeight","chartAreaHeight","verticalBoxWidth","horizontalBoxHeight","maxChartAreaWidth","maxChartAreaHeight","minBoxSizes","getMinimumBoxSize","maxHorizontalLeftPadding","maxHorizontalRightPadding","maxVerticalTopPadding","maxVerticalBottomPadding","horizontalBox","getPadding","boxPadding","verticalBox","totalLeftBoxesWidth","totalRightBoxesWidth","totalTopBoxesHeight","totalBottomBoxesHeight","fitBox","finalFitVerticalBox","minBoxSize","scaleMargin","leftPaddingAddition","topPaddingAddition","newMaxChartAreaHeight","newMaxChartAreaWidth","placeBox","minBox","_plugins","_cacheId","plugin","unregister","idx","getAll","hook","descriptor","params","descriptors","pluginService","PluginBase","Ticks","labelsFromTicks","getLineValue","lineValue","getPixelForTick","drawBorder","drawOnChartArea","drawTicks","tickMarkLength","zeroLineWidth","zeroLineColor","zeroLineBorderDash","zeroLineBorderDashOffset","scaleLabel","labelString","lineHeight","minRotation","maxRotation","mirror","autoSkip","autoSkipPadding","labelOffset","formatters","minor","major","computeTextSize","tick","parseFontOptions","globalDefaults","fontSize","family","parseLineHeight","toLineHeight","Scale","getTicks","_ticks","beforeUpdate","maxWidth","maxHeight","margins","longestTextCache","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","beforeTickToLabelConversion","convertTicksToLabels","afterTickToLabelConversion","beforeCalculateTickRotation","calculateTickRotation","afterCalculateTickRotation","beforeFit","fit","afterFit","afterUpdate","tickOpts","userCallback","tickFont","labelRotation","labelWidth","cosRotation","originalLabelWidth","tickWidth","angleRadians","scaleLabelOpts","gridLineOpts","isFullWidth","deltaHeight","largestTextWidth","tallestLabelHeightInLines","lineSpace","tickPadding","longestLabelWidth","labelHeight","firstLabelWidth","lastLabelWidth","handleMargins","rawValue","getLabelForIndex","getValueForPixel","pixel","finalVal","innerHeight","decimal","valueOffset","getBaseValue","_autoSkip","skipRatio","maxTicks","optionTicks","tickCount","labelRotationRadians","longestRotatedLabel","maxTicksLimit","optionMajorTicks","isRotated","tickFontColor","fontColor","majorTickFontColor","majorTickFont","tl","scaleLabelFontColor","scaleLabelFont","scaleLabelPadding","itemsToDraw","xTickStart","xTickEnd","yTickStart","yTickEnd","lineColor","tx1","ty1","tx2","ty2","x1","y1","x2","labelX","labelY","zeroLineIndex","textAlign","textBaseline","labelYOffset","xLineValue","labelXOffset","isLeft","yLineValue","glWidth","glColor","glBorderDash","glBorderDashOffset","itemToDraw","save","setLineDash","lineDashOffset","beginPath","moveTo","lineTo","stroke","restore","translate","fillText","scaleLabelX","scaleLabelY","halfLineHeight","constructors","registerScaleType","scaleConstructor","scaleDefaults","updateScaleDefaults","additions","generators","linear","generationOptions","dataRange","spacing","stepSize","niceRange","niceMin","niceMax","numSpaces","logarithmic","exp","significand","tickVal","endExp","endSignificand","minNotZero","lastTick","tickValue","logDelta","tickString","numDecimal","toFixed","remain","toExponential","titleFontStyle","titleSpacing","titleMarginBottom","titleFontColor","titleAlign","bodySpacing","bodyFontColor","bodyAlign","footerFontStyle","footerSpacing","footerMarginTop","footerFontColor","footerAlign","yPadding","xPadding","caretPadding","caretSize","cornerRadius","multiKeyBackground","displayColors","beforeTitle","tooltipItems","labelCount","afterTitle","beforeBody","beforeLabel","labelColor","labelTextColor","afterLabel","afterBody","beforeFooter","footer","afterFooter","mergeOpacity","colorString","opacity","pushOrConcat","toPush","getBaseModel","tooltipOpts","xAlign","yAlign","_bodyFontFamily","bodyFontFamily","_bodyFontStyle","bodyFontStyle","_bodyAlign","bodyFontSize","_titleFontFamily","titleFontFamily","_titleFontStyle","titleFontSize","_titleAlign","_footerFontFamily","footerFontFamily","_footerFontStyle","footerFontSize","_footerAlign","legendColorBackground","getTitle","lines","getBeforeBody","getBody","bodyItems","bodyItem","before","after","getAfterBody","getFooter","existingModel","_active","alignment","backgroundPoint","tooltipSize","caretX","caretY","labelColors","labelTextColors","positioners","_eventPosition","itemSort","body","dataPoints","combinedBodyLength","titleLineCount","footerLineCount","widthPadding","maxLineWidth","getTooltipSize","lf","rf","olf","orf","yf","midX","midY","determineAlignment","vm","paddingAndSize","radiusAndPadding","getBackgroundPoint","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","drawTitle","drawBody","xLinePadding","fillLineOfText","drawColorBoxes","fillRect","strokeRect","textColor","drawFooter","drawBackground","quadraticCurveTo","closePath","hasTooltipContent","_lastActive","average","eventPosition","nearestElement","tp","inLabelRange","chartX","chartY","pointRelativePosition","betweenAngles","withinRadius","halfAngle","halfRadius","centreAngle","rangeFromCentre","sA","eA","lineJoin","currentVM","globalOptionLineElements","lastDrawnIndex","lineCap","xRange","yRange","drawPoint","isVertical","getBarBounds","halfWidth","halfHeight","signX","signY","barSize","halfStroke","borderLeft","borderRight","borderTop","borderBottom","corners","startCorner","cornerAt","corner","bounds","clearRect","roundedRect","rx","ry","rect","edgeLength","xOffset","yOffset","SQRT2","leftX","topY","sideSize","drawImage","clip","flip","bezierCurveTo","drawRoundedRectangle","defaultValue","thisArg","loopable","a0","a1","klen","_mergerIf","mergeIf","sources","callCallback","fromIndex","getValueOrDefault","getValueAtIndexOrDefault","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","asin","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","easingEffects","inputs","getContext","EXPANDO_KEY","CSS_PREFIX","CSS_RENDER_MONITOR","CSS_RENDER_ANIMATION","ANIMATION_START_EVENTS","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","readUsedSize","supportsEventListenerOptions","eventListenerOptions","supports","passive","createEvent","nativeEvent","addResizeListener","ticking","expando","resizer","createResizer","createElement","cls","cssText","className","innerHTML","expand","childNodes","shrink","_reset","scrollLeft","scrollTop","onScroll","bind","proxy","renderProxy","animationName","classList","watchForRender","insertBefore","firstChild","removeResizeListener","unwatchForRender","remove","removeChild","_enabled","keyframes","css","_style","setAttribute","getElementsByTagName","appendChild","createTextNode","getElementById","renderHeight","getAttribute","renderWidth","initial","displayWidth","displayHeight","initCanvas","removeAttribute","proxies","event","fromNativeEvent","addEvent","removeEvent","basic","dom","implementation","filler","propagate","mappers","boundary","decodeFill","computeBoundary","scaleBottom","scaleTop","scaleZero","getBasePosition","resolveTarget","visited","visible","createMapper","isDrawable","drawArea","curve0","curve1","len0","len1","afterDatasetsUpdate","$filler","mapper","beforeDatasetDraw","p0","d0","d1","span","doFill","ci","boxWidth","lineDash","getBoxWidth","labelOpts","usePointStyle","createNewLegendAndAttach","legendOpts","Legend","legendHitBoxes","doughnutMode","beforeBuildLabels","buildLabels","afterBuildLabels","legendItems","globalDefault","labelFont","hitboxes","lineWidths","totalHeight","vPadding","columnWidths","totalWidth","currentColWidth","currentColHeight","itemHeight","itemWidth","lineDefault","legendWidth","cursor","isLineWidthZero","offSet","drawLegendBox","halfFontSize","xLeft","yMiddle","lh","hitBox","beforeInit","afterEvent","createNewTitleBlockAndAttach","titleOpts","Title","titleBlock","lineCount","textSize","titleX","titleY","titleFont","DatasetScale","getLabels","xLabels","yLabels","minIndex","maxIndex","valueCategory","offsetAmt","valueWidth","widthOffset","valueHeight","heightOffset","horz","valueDimension","defaultConfig","LinearScale","LinearScaleBase","IDMatches","hasStacks","valuesPerStack","positiveValues","negativeValues","relativePoints","valuesForType","minVal","maxVal","handleTickRangeOptions","getTickLimit","tickFontSize","handleDirectionalChanges","innerDimension","ticksAsNumbers","minSign","maxSign","setMin","suggestedMin","setMax","suggestedMax","numericGeneratorOptions","fixedStepSize","LogarithmicScale","tickValues","newVal","animate","showLabelBackdrop","backdropColor","backdropPaddingY","backdropPaddingX","getValueCount","getPointLabelFontOptions","pointLabelOptions","determineLimits","getTextAlignForAngle","adjustPointPositionForLabelHeight","numberOrZero","param","LinearRadialScale","drawingArea","largestPossibleRadius","fitWithPointLabels","plFont","furthestLimits","furthestAngles","_pointLabelSizes","valueCount","getPointPosition","getIndexAngle","hLimits","vLimits","setReductions","setCenterPoint","radiusReductionLeft","radiusReductionRight","radiusReductionTop","radiusReductionBottom","leftMovement","rightMovement","topMovement","bottomMovement","maxRight","maxLeft","maxTop","maxBottom","scalingFactor","distanceFromCenter","thisAngle","tickFontStyle","tickFontFamily","tickLabelFont","yCenterOffset","drawRadiusLine","drawPointLabels","angleLineOpts","pointLabelOpts","outerDistance","outerPosition","pointLabelPosition","pointLabelFontColor","MIN_INTEGER","MIN_SAFE_INTEGER","MAX_INTEGER","MAX_SAFE_INTEGER","INTERVALS","steps","UNITS","sorter","arrayUnique","hash","table","skey","tkey","lo","mid","i0","i1","lookup","prev","momentify","parser","parse","generate","capacity","timeOpts","unitStepSize","majorTicksEnabled","interval","first","determineStepSize","factor","TimeScale","timestamp","timestamps","_horizontal","_table","_timestamps","displayFormats","getLabelCapacity","determineUnit","minUnit","majorUnit","determineMajorUnit","_unit","_majorUnit","_minorFormat","_majorFormat","buildLookupTable","distribution","curr","_offsets","computeOffsets","upper","lower","ticksFromTimestamps","tooltipFormat","tickFormatFunction","majorFormat","majorTime","majorTickOpts","formatter","getPixelForOffset","getLabelWidth","ticksOpts","tickLabelWidth","sinRotation","exampleTime","exampleLabel","innerWidth","displayFormat"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chartjs-lazy.min.js","sources":["../src/chartjs-lazy.js"],"sourcesContent":["/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.2.2\n *\n * Copyright 2016 Nick Downie\n * Released under the MIT license\n * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\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(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (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 lum2) {\n return (lum1 + 0.05) / (lum2 + 0.05);\n }\n return (lum2 + 0.05) / (lum1 + 0.05);\n },\n\n level: function (color2) {\n var contrastRatio = this.contrast(color2);\n if (contrastRatio >= 7.1) {\n return 'AAA';\n }\n\n return (contrastRatio >= 4.5) ? 'AA' : '';\n },\n\n dark: function () {\n // YIQ equation from http://24ways.org/2010/calculating-color-contrast\n var rgb = this.values.rgb;\n var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n return yiq < 128;\n },\n\n light: function () {\n return !this.dark();\n },\n\n negate: function () {\n var rgb = [];\n for (var i = 0; i < 3; i++) {\n rgb[i] = 255 - this.values.rgb[i];\n }\n this.setValues('rgb', rgb);\n return this;\n },\n\n lighten: function (ratio) {\n var hsl = this.values.hsl;\n hsl[2] += hsl[2] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n darken: function (ratio) {\n var hsl = this.values.hsl;\n hsl[2] -= hsl[2] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n saturate: function (ratio) {\n var hsl = this.values.hsl;\n hsl[1] += hsl[1] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n desaturate: function (ratio) {\n var hsl = this.values.hsl;\n hsl[1] -= hsl[1] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n whiten: function (ratio) {\n var hwb = this.values.hwb;\n hwb[1] += hwb[1] * ratio;\n this.setValues('hwb', hwb);\n return this;\n },\n\n blacken: function (ratio) {\n var hwb = this.values.hwb;\n hwb[2] += hwb[2] * ratio;\n this.setValues('hwb', hwb);\n return this;\n },\n\n greyscale: function () {\n var rgb = this.values.rgb;\n // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n this.setValues('rgb', [val, val, val]);\n return this;\n },\n\n clearer: function (ratio) {\n var alpha = this.values.alpha;\n this.setValues('alpha', alpha - (alpha * ratio));\n return this;\n },\n\n opaquer: function (ratio) {\n var alpha = this.values.alpha;\n this.setValues('alpha', alpha + (alpha * ratio));\n return this;\n },\n\n rotate: function (degrees) {\n var hsl = this.values.hsl;\n var hue = (hsl[0] + degrees) % 360;\n hsl[0] = hue < 0 ? 360 + hue : hue;\n this.setValues('hsl', hsl);\n return this;\n },\n\n /**\n * Ported from sass implementation in C\n * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n */\n mix: function (mixinColor, weight) {\n var color1 = this;\n var color2 = mixinColor;\n var p = weight === undefined ? 0.5 : weight;\n\n var w = 2 * p - 1;\n var a = color1.alpha() - color2.alpha();\n\n var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n var w2 = 1 - w1;\n\n return this\n .rgb(\n w1 * color1.red() + w2 * color2.red(),\n w1 * color1.green() + w2 * color2.green(),\n w1 * color1.blue() + w2 * color2.blue()\n )\n .alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n },\n\n toJSON: function () {\n return this.rgb();\n },\n\n clone: function () {\n // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n // making the final build way to big to embed in Chart.js. So let's do it manually,\n // assuming that values to clone are 1 dimension arrays containing only numbers,\n // except 'alpha' which is a number.\n var result = new Color();\n var source = this.values;\n var target = result.values;\n var value, type;\n\n for (var prop in source) {\n if (source.hasOwnProperty(prop)) {\n value = source[prop];\n type = ({}).toString.call(value);\n if (type === '[object Array]') {\n target[prop] = value.slice(0);\n } else if (type === '[object Number]') {\n target[prop] = value;\n } else {\n console.error('unexpected color value:', value);\n }\n }\n }\n\n return result;\n }\n };\n\n Color.prototype.spaces = {\n rgb: ['red', 'green', 'blue'],\n hsl: ['hue', 'saturation', 'lightness'],\n hsv: ['hue', 'saturation', 'value'],\n hwb: ['hue', 'whiteness', 'blackness'],\n cmyk: ['cyan', 'magenta', 'yellow', 'black']\n };\n\n Color.prototype.maxes = {\n rgb: [255, 255, 255],\n hsl: [360, 100, 100],\n hsv: [360, 100, 100],\n hwb: [360, 100, 100],\n cmyk: [100, 100, 100, 100]\n };\n\n Color.prototype.getValues = function (space) {\n var values = this.values;\n var vals = {};\n\n for (var i = 0; i < space.length; i++) {\n vals[space.charAt(i)] = values[space][i];\n }\n\n if (values.alpha !== 1) {\n vals.a = values.alpha;\n }\n\n // {r: 255, g: 255, b: 255, a: 0.4}\n return vals;\n };\n\n Color.prototype.setValues = function (space, vals) {\n var values = this.values;\n var spaces = this.spaces;\n var maxes = this.maxes;\n var alpha = 1;\n var i;\n\n this.valid = true;\n\n if (space === 'alpha') {\n alpha = vals;\n } else if (vals.length) {\n // [10, 10, 10]\n values[space] = vals.slice(0, space.length);\n alpha = vals[space.length];\n } else if (vals[space.charAt(0)] !== undefined) {\n // {r: 10, g: 10, b: 10}\n for (i = 0; i < space.length; i++) {\n values[space][i] = vals[space.charAt(i)];\n }\n\n alpha = vals.a;\n } else if (vals[spaces[space][0]] !== undefined) {\n // {red: 10, green: 10, blue: 10}\n var chans = spaces[space];\n\n for (i = 0; i < space.length; i++) {\n values[space][i] = vals[chans[i]];\n }\n\n alpha = vals.alpha;\n }\n\n values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));\n\n if (space === 'alpha') {\n return false;\n }\n\n var capped;\n\n // cap values of the space prior converting all values\n for (i = 0; i < space.length; i++) {\n capped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n values[space][i] = Math.round(capped);\n }\n\n // convert to all the other color spaces\n for (var sname in spaces) {\n if (sname !== space) {\n values[sname] = convert[space][sname](values[space]);\n }\n }\n\n return true;\n };\n\n Color.prototype.setSpace = function (space, args) {\n var vals = args[0];\n\n if (vals === undefined) {\n // color.rgb()\n return this.getValues(space);\n }\n\n // color.rgb(10, 10, 10)\n if (typeof vals === 'number') {\n vals = Array.prototype.slice.call(args);\n }\n\n this.setValues(space, vals);\n return this;\n };\n\n Color.prototype.setChannel = function (space, index, val) {\n var svalues = this.values[space];\n if (val === undefined) {\n // color.red()\n return svalues[index];\n } else if (val === svalues[index]) {\n // color.red(color.red())\n return this;\n }\n\n // color.red(100)\n svalues[index] = val;\n this.setValues(space, svalues);\n\n return this;\n };\n\n if (typeof window !== 'undefined') {\n window.Color = Color;\n }\n\n module.exports = Color;\n\n},{\"1\":1,\"4\":4}],3:[function(require,module,exports){\n\t/* MIT license */\n\n module.exports = {\n rgb2hsl: rgb2hsl,\n rgb2hsv: rgb2hsv,\n rgb2hwb: rgb2hwb,\n rgb2cmyk: rgb2cmyk,\n rgb2keyword: rgb2keyword,\n rgb2xyz: rgb2xyz,\n rgb2lab: rgb2lab,\n rgb2lch: rgb2lch,\n\n hsl2rgb: hsl2rgb,\n hsl2hsv: hsl2hsv,\n hsl2hwb: hsl2hwb,\n hsl2cmyk: hsl2cmyk,\n hsl2keyword: hsl2keyword,\n\n hsv2rgb: hsv2rgb,\n hsv2hsl: hsv2hsl,\n hsv2hwb: hsv2hwb,\n hsv2cmyk: hsv2cmyk,\n hsv2keyword: hsv2keyword,\n\n hwb2rgb: hwb2rgb,\n hwb2hsl: hwb2hsl,\n hwb2hsv: hwb2hsv,\n hwb2cmyk: hwb2cmyk,\n hwb2keyword: hwb2keyword,\n\n cmyk2rgb: cmyk2rgb,\n cmyk2hsl: cmyk2hsl,\n cmyk2hsv: cmyk2hsv,\n cmyk2hwb: cmyk2hwb,\n cmyk2keyword: cmyk2keyword,\n\n keyword2rgb: keyword2rgb,\n keyword2hsl: keyword2hsl,\n keyword2hsv: keyword2hsv,\n keyword2hwb: keyword2hwb,\n keyword2cmyk: keyword2cmyk,\n keyword2lab: keyword2lab,\n keyword2xyz: keyword2xyz,\n\n xyz2rgb: xyz2rgb,\n xyz2lab: xyz2lab,\n xyz2lch: xyz2lch,\n\n lab2xyz: lab2xyz,\n lab2rgb: lab2rgb,\n lab2lch: lab2lch,\n\n lch2lab: lch2lab,\n lch2xyz: lch2xyz,\n lch2rgb: lch2rgb\n }\n\n\n function rgb2hsl(rgb) {\n var r = rgb[0]/255,\n g = rgb[1]/255,\n b = rgb[2]/255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s, l;\n\n if (max == min)\n h = 0;\n else if (r == max)\n h = (g - b) / delta;\n else if (g == max)\n h = 2 + (b - r) / delta;\n else if (b == max)\n h = 4 + (r - g)/ delta;\n\n h = Math.min(h * 60, 360);\n\n if (h < 0)\n h += 360;\n\n l = (min + max) / 2;\n\n if (max == min)\n s = 0;\n else if (l <= 0.5)\n s = delta / (max + min);\n else\n s = delta / (2 - max - min);\n\n return [h, s * 100, l * 100];\n }\n\n function rgb2hsv(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s, v;\n\n if (max == 0)\n s = 0;\n else\n s = (delta/max * 1000)/10;\n\n if (max == min)\n h = 0;\n else if (r == max)\n h = (g - b) / delta;\n else if (g == max)\n h = 2 + (b - r) / delta;\n else if (b == max)\n h = 4 + (r - g) / delta;\n\n h = Math.min(h * 60, 360);\n\n if (h < 0)\n h += 360;\n\n v = ((max / 255) * 1000) / 10;\n\n return [h, s, v];\n }\n\n function rgb2hwb(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n h = rgb2hsl(rgb)[0],\n w = 1/255 * Math.min(r, Math.min(g, b)),\n b = 1 - 1/255 * Math.max(r, Math.max(g, b));\n\n return [h, w * 100, b * 100];\n }\n\n function rgb2cmyk(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255,\n c, m, y, k;\n\n k = Math.min(1 - r, 1 - g, 1 - b);\n c = (1 - r - k) / (1 - k) || 0;\n m = (1 - g - k) / (1 - k) || 0;\n y = (1 - b - k) / (1 - k) || 0;\n return [c * 100, m * 100, y * 100, k * 100];\n }\n\n function rgb2keyword(rgb) {\n return reverseKeywords[JSON.stringify(rgb)];\n }\n\n function rgb2xyz(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255;\n\n // assume sRGB\n r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n return [x * 100, y *100, z * 100];\n }\n\n function rgb2lab(rgb) {\n var xyz = rgb2xyz(rgb),\n x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l, a, b;\n\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n\n x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n l = (116 * y) - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n\n return [l, a, b];\n }\n\n function rgb2lch(args) {\n return lab2lch(rgb2lab(args));\n }\n\n function hsl2rgb(hsl) {\n var h = hsl[0] / 360,\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n t1, t2, t3, rgb, val;\n\n if (s == 0) {\n val = l * 255;\n return [val, val, val];\n }\n\n if (l < 0.5)\n t2 = l * (1 + s);\n else\n t2 = l + s - l * s;\n t1 = 2 * l - t2;\n\n rgb = [0, 0, 0];\n for (var i = 0; i < 3; i++) {\n t3 = h + 1 / 3 * - (i - 1);\n t3 < 0 && t3++;\n t3 > 1 && t3--;\n\n if (6 * t3 < 1)\n val = t1 + (t2 - t1) * 6 * t3;\n else if (2 * t3 < 1)\n val = t2;\n else if (3 * t3 < 2)\n val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n else\n val = t1;\n\n rgb[i] = val * 255;\n }\n\n return rgb;\n }\n\n function hsl2hsv(hsl) {\n var h = hsl[0],\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n sv, v;\n\n if(l === 0) {\n // no need to do calc on black\n // also avoids divide by 0 error\n return [0, 0, 0];\n }\n\n l *= 2;\n s *= (l <= 1) ? l : 2 - l;\n v = (l + s) / 2;\n sv = (2 * s) / (l + s);\n return [h, sv * 100, v * 100];\n }\n\n function hsl2hwb(args) {\n return rgb2hwb(hsl2rgb(args));\n }\n\n function hsl2cmyk(args) {\n return rgb2cmyk(hsl2rgb(args));\n }\n\n function hsl2keyword(args) {\n return rgb2keyword(hsl2rgb(args));\n }\n\n\n function hsv2rgb(hsv) {\n var h = hsv[0] / 60,\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n hi = Math.floor(h) % 6;\n\n var f = h - Math.floor(h),\n p = 255 * v * (1 - s),\n q = 255 * v * (1 - (s * f)),\n t = 255 * v * (1 - (s * (1 - f))),\n v = 255 * v;\n\n switch(hi) {\n case 0:\n return [v, t, p];\n case 1:\n return [q, v, p];\n case 2:\n return [p, v, t];\n case 3:\n return [p, q, v];\n case 4:\n return [t, p, v];\n case 5:\n return [v, p, q];\n }\n }\n\n function hsv2hsl(hsv) {\n var h = hsv[0],\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n sl, l;\n\n l = (2 - s) * v;\n sl = s * v;\n sl /= (l <= 1) ? l : 2 - l;\n sl = sl || 0;\n l /= 2;\n return [h, sl * 100, l * 100];\n }\n\n function hsv2hwb(args) {\n return rgb2hwb(hsv2rgb(args))\n }\n\n function hsv2cmyk(args) {\n return rgb2cmyk(hsv2rgb(args));\n }\n\n function hsv2keyword(args) {\n return rgb2keyword(hsv2rgb(args));\n }\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\n function hwb2rgb(hwb) {\n var h = hwb[0] / 360,\n wh = hwb[1] / 100,\n bl = hwb[2] / 100,\n ratio = wh + bl,\n i, v, f, n;\n\n // wh + bl cant be > 1\n if (ratio > 1) {\n wh /= ratio;\n bl /= ratio;\n }\n\n i = Math.floor(6 * h);\n v = 1 - bl;\n f = 6 * h - i;\n if ((i & 0x01) != 0) {\n f = 1 - f;\n }\n n = wh + f * (v - wh); // linear interpolation\n\n switch (i) {\n default:\n case 6:\n case 0: r = v; g = n; b = wh; break;\n case 1: r = n; g = v; b = wh; break;\n case 2: r = wh; g = v; b = n; break;\n case 3: r = wh; g = n; b = v; break;\n case 4: r = n; g = wh; b = v; break;\n case 5: r = v; g = wh; b = n; break;\n }\n\n return [r * 255, g * 255, b * 255];\n }\n\n function hwb2hsl(args) {\n return rgb2hsl(hwb2rgb(args));\n }\n\n function hwb2hsv(args) {\n return rgb2hsv(hwb2rgb(args));\n }\n\n function hwb2cmyk(args) {\n return rgb2cmyk(hwb2rgb(args));\n }\n\n function hwb2keyword(args) {\n return rgb2keyword(hwb2rgb(args));\n }\n\n function cmyk2rgb(cmyk) {\n var c = cmyk[0] / 100,\n m = cmyk[1] / 100,\n y = cmyk[2] / 100,\n k = cmyk[3] / 100,\n r, g, b;\n\n r = 1 - Math.min(1, c * (1 - k) + k);\n g = 1 - Math.min(1, m * (1 - k) + k);\n b = 1 - Math.min(1, y * (1 - k) + k);\n return [r * 255, g * 255, b * 255];\n }\n\n function cmyk2hsl(args) {\n return rgb2hsl(cmyk2rgb(args));\n }\n\n function cmyk2hsv(args) {\n return rgb2hsv(cmyk2rgb(args));\n }\n\n function cmyk2hwb(args) {\n return rgb2hwb(cmyk2rgb(args));\n }\n\n function cmyk2keyword(args) {\n return rgb2keyword(cmyk2rgb(args));\n }\n\n\n function xyz2rgb(xyz) {\n var x = xyz[0] / 100,\n y = xyz[1] / 100,\n z = xyz[2] / 100,\n r, g, b;\n\n r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n // assume sRGB\n r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n : r = (r * 12.92);\n\n g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n : g = (g * 12.92);\n\n b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n : b = (b * 12.92);\n\n r = Math.min(Math.max(0, r), 1);\n g = Math.min(Math.max(0, g), 1);\n b = Math.min(Math.max(0, b), 1);\n\n return [r * 255, g * 255, b * 255];\n }\n\n function xyz2lab(xyz) {\n var x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l, a, b;\n\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n\n x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n l = (116 * y) - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n\n return [l, a, b];\n }\n\n function xyz2lch(args) {\n return lab2lch(xyz2lab(args));\n }\n\n function lab2xyz(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n x, y, z, y2;\n\n if (l <= 8) {\n y = (l * 100) / 903.3;\n y2 = (7.787 * (y / 100)) + (16 / 116);\n } else {\n y = 100 * Math.pow((l + 16) / 116, 3);\n y2 = Math.pow(y / 100, 1/3);\n }\n\n x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n return [x, y, z];\n }\n\n function lab2lch(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n hr, h, c;\n\n hr = Math.atan2(b, a);\n h = hr * 360 / 2 / Math.PI;\n if (h < 0) {\n h += 360;\n }\n c = Math.sqrt(a * a + b * b);\n return [l, c, h];\n }\n\n function lab2rgb(args) {\n return xyz2rgb(lab2xyz(args));\n }\n\n function lch2lab(lch) {\n var l = lch[0],\n c = lch[1],\n h = lch[2],\n a, b, hr;\n\n hr = h / 360 * 2 * Math.PI;\n a = c * Math.cos(hr);\n b = c * Math.sin(hr);\n return [l, a, b];\n }\n\n function lch2xyz(args) {\n return lab2xyz(lch2lab(args));\n }\n\n function lch2rgb(args) {\n return lab2rgb(lch2lab(args));\n }\n\n function keyword2rgb(keyword) {\n return cssKeywords[keyword];\n }\n\n function keyword2hsl(args) {\n return rgb2hsl(keyword2rgb(args));\n }\n\n function keyword2hsv(args) {\n return rgb2hsv(keyword2rgb(args));\n }\n\n function keyword2hwb(args) {\n return rgb2hwb(keyword2rgb(args));\n }\n\n function keyword2cmyk(args) {\n return rgb2cmyk(keyword2rgb(args));\n }\n\n function keyword2lab(args) {\n return rgb2lab(keyword2rgb(args));\n }\n\n function keyword2xyz(args) {\n return rgb2xyz(keyword2rgb(args));\n }\n\n var cssKeywords = {\n aliceblue: [240,248,255],\n antiquewhite: [250,235,215],\n aqua: [0,255,255],\n aquamarine: [127,255,212],\n azure: [240,255,255],\n beige: [245,245,220],\n bisque: [255,228,196],\n black: [0,0,0],\n blanchedalmond: [255,235,205],\n blue: [0,0,255],\n blueviolet: [138,43,226],\n brown: [165,42,42],\n burlywood: [222,184,135],\n cadetblue: [95,158,160],\n chartreuse: [127,255,0],\n chocolate: [210,105,30],\n coral: [255,127,80],\n cornflowerblue: [100,149,237],\n cornsilk: [255,248,220],\n crimson: [220,20,60],\n cyan: [0,255,255],\n darkblue: [0,0,139],\n darkcyan: [0,139,139],\n darkgoldenrod: [184,134,11],\n darkgray: [169,169,169],\n darkgreen: [0,100,0],\n darkgrey: [169,169,169],\n darkkhaki: [189,183,107],\n darkmagenta: [139,0,139],\n darkolivegreen: [85,107,47],\n darkorange: [255,140,0],\n darkorchid: [153,50,204],\n darkred: [139,0,0],\n darksalmon: [233,150,122],\n darkseagreen: [143,188,143],\n darkslateblue: [72,61,139],\n darkslategray: [47,79,79],\n darkslategrey: [47,79,79],\n darkturquoise: [0,206,209],\n darkviolet: [148,0,211],\n deeppink: [255,20,147],\n deepskyblue: [0,191,255],\n dimgray: [105,105,105],\n dimgrey: [105,105,105],\n dodgerblue: [30,144,255],\n firebrick: [178,34,34],\n floralwhite: [255,250,240],\n forestgreen: [34,139,34],\n fuchsia: [255,0,255],\n gainsboro: [220,220,220],\n ghostwhite: [248,248,255],\n gold: [255,215,0],\n goldenrod: [218,165,32],\n gray: [128,128,128],\n green: [0,128,0],\n greenyellow: [173,255,47],\n grey: [128,128,128],\n honeydew: [240,255,240],\n hotpink: [255,105,180],\n indianred: [205,92,92],\n indigo: [75,0,130],\n ivory: [255,255,240],\n khaki: [240,230,140],\n lavender: [230,230,250],\n lavenderblush: [255,240,245],\n lawngreen: [124,252,0],\n lemonchiffon: [255,250,205],\n lightblue: [173,216,230],\n lightcoral: [240,128,128],\n lightcyan: [224,255,255],\n lightgoldenrodyellow: [250,250,210],\n lightgray: [211,211,211],\n lightgreen: [144,238,144],\n lightgrey: [211,211,211],\n lightpink: [255,182,193],\n lightsalmon: [255,160,122],\n lightseagreen: [32,178,170],\n lightskyblue: [135,206,250],\n lightslategray: [119,136,153],\n lightslategrey: [119,136,153],\n lightsteelblue: [176,196,222],\n lightyellow: [255,255,224],\n lime: [0,255,0],\n limegreen: [50,205,50],\n linen: [250,240,230],\n magenta: [255,0,255],\n maroon: [128,0,0],\n mediumaquamarine: [102,205,170],\n mediumblue: [0,0,205],\n mediumorchid: [186,85,211],\n mediumpurple: [147,112,219],\n mediumseagreen: [60,179,113],\n mediumslateblue: [123,104,238],\n mediumspringgreen: [0,250,154],\n mediumturquoise: [72,209,204],\n mediumvioletred: [199,21,133],\n midnightblue: [25,25,112],\n mintcream: [245,255,250],\n mistyrose: [255,228,225],\n moccasin: [255,228,181],\n navajowhite: [255,222,173],\n navy: [0,0,128],\n oldlace: [253,245,230],\n olive: [128,128,0],\n olivedrab: [107,142,35],\n orange: [255,165,0],\n orangered: [255,69,0],\n orchid: [218,112,214],\n palegoldenrod: [238,232,170],\n palegreen: [152,251,152],\n paleturquoise: [175,238,238],\n palevioletred: [219,112,147],\n papayawhip: [255,239,213],\n peachpuff: [255,218,185],\n peru: [205,133,63],\n pink: [255,192,203],\n plum: [221,160,221],\n powderblue: [176,224,230],\n purple: [128,0,128],\n rebeccapurple: [102, 51, 153],\n red: [255,0,0],\n rosybrown: [188,143,143],\n royalblue: [65,105,225],\n saddlebrown: [139,69,19],\n salmon: [250,128,114],\n sandybrown: [244,164,96],\n seagreen: [46,139,87],\n seashell: [255,245,238],\n sienna: [160,82,45],\n silver: [192,192,192],\n skyblue: [135,206,235],\n slateblue: [106,90,205],\n slategray: [112,128,144],\n slategrey: [112,128,144],\n snow: [255,250,250],\n springgreen: [0,255,127],\n steelblue: [70,130,180],\n tan: [210,180,140],\n teal: [0,128,128],\n thistle: [216,191,216],\n tomato: [255,99,71],\n turquoise: [64,224,208],\n violet: [238,130,238],\n wheat: [245,222,179],\n white: [255,255,255],\n whitesmoke: [245,245,245],\n yellow: [255,255,0],\n yellowgreen: [154,205,50]\n };\n\n var reverseKeywords = {};\n for (var key in cssKeywords) {\n reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n }\n\n},{}],4:[function(require,module,exports){\n var conversions = require(3);\n\n var convert = function() {\n return new Converter();\n }\n\n for (var func in conversions) {\n // export Raw versions\n convert[func + \"Raw\"] = (function(func) {\n // accept array or plain args\n return function(arg) {\n if (typeof arg == \"number\")\n arg = Array.prototype.slice.call(arguments);\n return conversions[func](arg);\n }\n })(func);\n\n var pair = /(\\w+)2(\\w+)/.exec(func),\n from = pair[1],\n to = pair[2];\n\n // export rgb2hsl and [\"rgb\"][\"hsl\"]\n convert[from] = convert[from] || {};\n\n convert[from][to] = convert[func] = (function(func) {\n return function(arg) {\n if (typeof arg == \"number\")\n arg = Array.prototype.slice.call(arguments);\n\n var val = conversions[func](arg);\n if (typeof val == \"string\" || val === undefined)\n return val; // keyword\n\n for (var i = 0; i < val.length; i++)\n val[i] = Math.round(val[i]);\n return val;\n }\n })(func);\n }\n\n\n\t/* Converter does lazy conversion and caching */\n var Converter = function() {\n this.convs = {};\n };\n\n\t/* Either get the values for a space or\n\t set the values for a space, depending on args */\n Converter.prototype.routeSpace = function(space, args) {\n var values = args[0];\n if (values === undefined) {\n // color.rgb()\n return this.getValues(space);\n }\n // color.rgb(10, 10, 10)\n if (typeof values == \"number\") {\n values = Array.prototype.slice.call(args);\n }\n\n return this.setValues(space, values);\n };\n\n\t/* Set the values for a space, invalidating cache */\n Converter.prototype.setValues = function(space, values) {\n this.space = space;\n this.convs = {};\n this.convs[space] = values;\n return this;\n };\n\n\t/* Get the values for a space. If there's already\n\t a conversion for the space, fetch it, otherwise\n\t compute it */\n Converter.prototype.getValues = function(space) {\n var vals = this.convs[space];\n if (!vals) {\n var fspace = this.space,\n from = this.convs[fspace];\n vals = convert[fspace][space](from);\n\n this.convs[space] = vals;\n }\n return vals;\n };\n\n [\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function(space) {\n Converter.prototype[space] = function(vals) {\n return this.routeSpace(space, arguments);\n }\n });\n\n module.exports = convert;\n},{\"3\":3}],5:[function(require,module,exports){\n 'use strict'\n\n module.exports = {\n \"aliceblue\": [240, 248, 255],\n \"antiquewhite\": [250, 235, 215],\n \"aqua\": [0, 255, 255],\n \"aquamarine\": [127, 255, 212],\n \"azure\": [240, 255, 255],\n \"beige\": [245, 245, 220],\n \"bisque\": [255, 228, 196],\n \"black\": [0, 0, 0],\n \"blanchedalmond\": [255, 235, 205],\n \"blue\": [0, 0, 255],\n \"blueviolet\": [138, 43, 226],\n \"brown\": [165, 42, 42],\n \"burlywood\": [222, 184, 135],\n \"cadetblue\": [95, 158, 160],\n \"chartreuse\": [127, 255, 0],\n \"chocolate\": [210, 105, 30],\n \"coral\": [255, 127, 80],\n \"cornflowerblue\": [100, 149, 237],\n \"cornsilk\": [255, 248, 220],\n \"crimson\": [220, 20, 60],\n \"cyan\": [0, 255, 255],\n \"darkblue\": [0, 0, 139],\n \"darkcyan\": [0, 139, 139],\n \"darkgoldenrod\": [184, 134, 11],\n \"darkgray\": [169, 169, 169],\n \"darkgreen\": [0, 100, 0],\n \"darkgrey\": [169, 169, 169],\n \"darkkhaki\": [189, 183, 107],\n \"darkmagenta\": [139, 0, 139],\n \"darkolivegreen\": [85, 107, 47],\n \"darkorange\": [255, 140, 0],\n \"darkorchid\": [153, 50, 204],\n \"darkred\": [139, 0, 0],\n \"darksalmon\": [233, 150, 122],\n \"darkseagreen\": [143, 188, 143],\n \"darkslateblue\": [72, 61, 139],\n \"darkslategray\": [47, 79, 79],\n \"darkslategrey\": [47, 79, 79],\n \"darkturquoise\": [0, 206, 209],\n \"darkviolet\": [148, 0, 211],\n \"deeppink\": [255, 20, 147],\n \"deepskyblue\": [0, 191, 255],\n \"dimgray\": [105, 105, 105],\n \"dimgrey\": [105, 105, 105],\n \"dodgerblue\": [30, 144, 255],\n \"firebrick\": [178, 34, 34],\n \"floralwhite\": [255, 250, 240],\n \"forestgreen\": [34, 139, 34],\n \"fuchsia\": [255, 0, 255],\n \"gainsboro\": [220, 220, 220],\n \"ghostwhite\": [248, 248, 255],\n \"gold\": [255, 215, 0],\n \"goldenrod\": [218, 165, 32],\n \"gray\": [128, 128, 128],\n \"green\": [0, 128, 0],\n \"greenyellow\": [173, 255, 47],\n \"grey\": [128, 128, 128],\n \"honeydew\": [240, 255, 240],\n \"hotpink\": [255, 105, 180],\n \"indianred\": [205, 92, 92],\n \"indigo\": [75, 0, 130],\n \"ivory\": [255, 255, 240],\n \"khaki\": [240, 230, 140],\n \"lavender\": [230, 230, 250],\n \"lavenderblush\": [255, 240, 245],\n \"lawngreen\": [124, 252, 0],\n \"lemonchiffon\": [255, 250, 205],\n \"lightblue\": [173, 216, 230],\n \"lightcoral\": [240, 128, 128],\n \"lightcyan\": [224, 255, 255],\n \"lightgoldenrodyellow\": [250, 250, 210],\n \"lightgray\": [211, 211, 211],\n \"lightgreen\": [144, 238, 144],\n \"lightgrey\": [211, 211, 211],\n \"lightpink\": [255, 182, 193],\n \"lightsalmon\": [255, 160, 122],\n \"lightseagreen\": [32, 178, 170],\n \"lightskyblue\": [135, 206, 250],\n \"lightslategray\": [119, 136, 153],\n \"lightslategrey\": [119, 136, 153],\n \"lightsteelblue\": [176, 196, 222],\n \"lightyellow\": [255, 255, 224],\n \"lime\": [0, 255, 0],\n \"limegreen\": [50, 205, 50],\n \"linen\": [250, 240, 230],\n \"magenta\": [255, 0, 255],\n \"maroon\": [128, 0, 0],\n \"mediumaquamarine\": [102, 205, 170],\n \"mediumblue\": [0, 0, 205],\n \"mediumorchid\": [186, 85, 211],\n \"mediumpurple\": [147, 112, 219],\n \"mediumseagreen\": [60, 179, 113],\n \"mediumslateblue\": [123, 104, 238],\n \"mediumspringgreen\": [0, 250, 154],\n \"mediumturquoise\": [72, 209, 204],\n \"mediumvioletred\": [199, 21, 133],\n \"midnightblue\": [25, 25, 112],\n \"mintcream\": [245, 255, 250],\n \"mistyrose\": [255, 228, 225],\n \"moccasin\": [255, 228, 181],\n \"navajowhite\": [255, 222, 173],\n \"navy\": [0, 0, 128],\n \"oldlace\": [253, 245, 230],\n \"olive\": [128, 128, 0],\n \"olivedrab\": [107, 142, 35],\n \"orange\": [255, 165, 0],\n \"orangered\": [255, 69, 0],\n \"orchid\": [218, 112, 214],\n \"palegoldenrod\": [238, 232, 170],\n \"palegreen\": [152, 251, 152],\n \"paleturquoise\": [175, 238, 238],\n \"palevioletred\": [219, 112, 147],\n \"papayawhip\": [255, 239, 213],\n \"peachpuff\": [255, 218, 185],\n \"peru\": [205, 133, 63],\n \"pink\": [255, 192, 203],\n \"plum\": [221, 160, 221],\n \"powderblue\": [176, 224, 230],\n \"purple\": [128, 0, 128],\n \"rebeccapurple\": [102, 51, 153],\n \"red\": [255, 0, 0],\n \"rosybrown\": [188, 143, 143],\n \"royalblue\": [65, 105, 225],\n \"saddlebrown\": [139, 69, 19],\n \"salmon\": [250, 128, 114],\n \"sandybrown\": [244, 164, 96],\n \"seagreen\": [46, 139, 87],\n \"seashell\": [255, 245, 238],\n \"sienna\": [160, 82, 45],\n \"silver\": [192, 192, 192],\n \"skyblue\": [135, 206, 235],\n \"slateblue\": [106, 90, 205],\n \"slategray\": [112, 128, 144],\n \"slategrey\": [112, 128, 144],\n \"snow\": [255, 250, 250],\n \"springgreen\": [0, 255, 127],\n \"steelblue\": [70, 130, 180],\n \"tan\": [210, 180, 140],\n \"teal\": [0, 128, 128],\n \"thistle\": [216, 191, 216],\n \"tomato\": [255, 99, 71],\n \"turquoise\": [64, 224, 208],\n \"violet\": [238, 130, 238],\n \"wheat\": [245, 222, 179],\n \"white\": [255, 255, 255],\n \"whitesmoke\": [245, 245, 245],\n \"yellow\": [255, 255, 0],\n \"yellowgreen\": [154, 205, 50]\n };\n\n},{}],6:[function(require,module,exports){\n//! moment.js\n//! version : 2.18.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n ;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.moment = factory()\n }(this, (function () { 'use strict';\n\n var hookCallback;\n\n function hooks () {\n return hookCallback.apply(null, arguments);\n }\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\n function setHookCallback (callback) {\n hookCallback = callback;\n }\n\n function isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n }\n\n function isObject(input) {\n // IE8 will treat undefined and null as object if it wasn't for\n // input != null\n return input != null && Object.prototype.toString.call(input) === '[object Object]';\n }\n\n function isObjectEmpty(obj) {\n var k;\n for (k in obj) {\n // even if its not own property I'd still call it non-empty\n return false;\n }\n return true;\n }\n\n function isUndefined(input) {\n return input === void 0;\n }\n\n function isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n }\n\n function isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n }\n\n function map(arr, fn) {\n var res = [], i;\n for (i = 0; i < arr.length; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n }\n\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n }\n\n function extend(a, b) {\n for (var i in b) {\n if (hasOwnProp(b, i)) {\n a[i] = b[i];\n }\n }\n\n if (hasOwnProp(b, 'toString')) {\n a.toString = b.toString;\n }\n\n if (hasOwnProp(b, 'valueOf')) {\n a.valueOf = b.valueOf;\n }\n\n return a;\n }\n\n function createUTC (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n }\n\n function defaultParsingFlags() {\n // We need to deep clone this object.\n return {\n empty : false,\n unusedTokens : [],\n unusedInput : [],\n overflow : -2,\n charsLeftOver : 0,\n nullInput : false,\n invalidMonth : null,\n invalidFormat : false,\n userInvalidated : false,\n iso : false,\n parsedDateParts : [],\n meridiem : null,\n rfc2822 : false,\n weekdayMismatch : false\n };\n }\n\n function getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n }\n\n var some;\n if (Array.prototype.some) {\n some = Array.prototype.some;\n } else {\n some = function (fun) {\n var t = Object(this);\n var len = t.length >>> 0;\n\n for (var i = 0; i < len; i++) {\n if (i in t && fun.call(this, t[i], i, t)) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n var some$1 = some;\n\n function isValid(m) {\n if (m._isValid == null) {\n var flags = getParsingFlags(m);\n var parsedParts = some$1.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n var isNowValid = !isNaN(m._d.getTime()) &&\n flags.overflow < 0 &&\n !flags.empty &&\n !flags.invalidMonth &&\n !flags.invalidWeekday &&\n !flags.nullInput &&\n !flags.invalidFormat &&\n !flags.userInvalidated &&\n (!flags.meridiem || (flags.meridiem && parsedParts));\n\n if (m._strict) {\n isNowValid = isNowValid &&\n flags.charsLeftOver === 0 &&\n flags.unusedTokens.length === 0 &&\n flags.bigHour === undefined;\n }\n\n if (Object.isFrozen == null || !Object.isFrozen(m)) {\n m._isValid = isNowValid;\n }\n else {\n return isNowValid;\n }\n }\n return m._isValid;\n }\n\n function createInvalid (flags) {\n var m = createUTC(NaN);\n if (flags != null) {\n extend(getParsingFlags(m), flags);\n }\n else {\n getParsingFlags(m).userInvalidated = true;\n }\n\n return m;\n }\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\n var momentProperties = hooks.momentProperties = [];\n\n function copyConfig(to, from) {\n var i, prop, val;\n\n if (!isUndefined(from._isAMomentObject)) {\n to._isAMomentObject = from._isAMomentObject;\n }\n if (!isUndefined(from._i)) {\n to._i = from._i;\n }\n if (!isUndefined(from._f)) {\n to._f = from._f;\n }\n if (!isUndefined(from._l)) {\n to._l = from._l;\n }\n if (!isUndefined(from._strict)) {\n to._strict = from._strict;\n }\n if (!isUndefined(from._tzm)) {\n to._tzm = from._tzm;\n }\n if (!isUndefined(from._isUTC)) {\n to._isUTC = from._isUTC;\n }\n if (!isUndefined(from._offset)) {\n to._offset = from._offset;\n }\n if (!isUndefined(from._pf)) {\n to._pf = getParsingFlags(from);\n }\n if (!isUndefined(from._locale)) {\n to._locale = from._locale;\n }\n\n if (momentProperties.length > 0) {\n for (i = 0; i < momentProperties.length; i++) {\n prop = momentProperties[i];\n val = from[prop];\n if (!isUndefined(val)) {\n to[prop] = val;\n }\n }\n }\n\n return to;\n }\n\n var updateInProgress = false;\n\n// Moment prototype object\n function Moment(config) {\n copyConfig(this, config);\n this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n if (!this.isValid()) {\n this._d = new Date(NaN);\n }\n // Prevent infinite loop in case updateOffset creates new moment\n // objects.\n if (updateInProgress === false) {\n updateInProgress = true;\n hooks.updateOffset(this);\n updateInProgress = false;\n }\n }\n\n function isMoment (obj) {\n return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n }\n\n function absFloor (number) {\n if (number < 0) {\n // -0 -> 0\n return Math.ceil(number) || 0;\n } else {\n return Math.floor(number);\n }\n }\n\n function toInt(argumentForCoercion) {\n var coercedNumber = +argumentForCoercion,\n value = 0;\n\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n\n return value;\n }\n\n// compare two arrays, return the number of differences\n function compareArrays(array1, array2, dontConvert) {\n var len = Math.min(array1.length, array2.length),\n lengthDiff = Math.abs(array1.length - array2.length),\n diffs = 0,\n i;\n for (i = 0; i < len; i++) {\n if ((dontConvert && array1[i] !== array2[i]) ||\n (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n }\n\n function warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n }\n\n function deprecate(msg, fn) {\n var firstTime = true;\n\n return extend(function () {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(null, msg);\n }\n if (firstTime) {\n var args = [];\n var arg;\n for (var i = 0; i < arguments.length; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (var key in arguments[0]) {\n arg += key + ': ' + arguments[0][key] + ', ';\n }\n arg = arg.slice(0, -2); // Remove trailing comma and space\n } else {\n arg = arguments[i];\n }\n args.push(arg);\n }\n warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n firstTime = false;\n }\n return fn.apply(this, arguments);\n }, fn);\n }\n\n var deprecations = {};\n\n function deprecateSimple(name, msg) {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(name, msg);\n }\n if (!deprecations[name]) {\n warn(msg);\n deprecations[name] = true;\n }\n }\n\n hooks.suppressDeprecationWarnings = false;\n hooks.deprecationHandler = null;\n\n function isFunction(input) {\n return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n }\n\n function set (config) {\n var prop, i;\n for (i in config) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\n }\n }\n this._config = config;\n // Lenient ordinal parsing accepts just a number in addition to\n // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n this._dayOfMonthOrdinalParseLenient = new RegExp(\n (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n '|' + (/\\d{1,2}/).source);\n }\n\n function mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig), prop;\n for (prop in childConfig) {\n if (hasOwnProp(childConfig, prop)) {\n if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n res[prop] = {};\n extend(res[prop], parentConfig[prop]);\n extend(res[prop], childConfig[prop]);\n } else if (childConfig[prop] != null) {\n res[prop] = childConfig[prop];\n } else {\n delete res[prop];\n }\n }\n }\n for (prop in parentConfig) {\n if (hasOwnProp(parentConfig, prop) &&\n !hasOwnProp(childConfig, prop) &&\n isObject(parentConfig[prop])) {\n // make sure changes to properties don't modify parent config\n res[prop] = extend({}, res[prop]);\n }\n }\n return res;\n }\n\n function Locale(config) {\n if (config != null) {\n this.set(config);\n }\n }\n\n var keys;\n\n if (Object.keys) {\n keys = Object.keys;\n } else {\n keys = function (obj) {\n var i, res = [];\n for (i in obj) {\n if (hasOwnProp(obj, i)) {\n res.push(i);\n }\n }\n return res;\n };\n }\n\n var keys$1 = keys;\n\n var defaultCalendar = {\n sameDay : '[Today at] LT',\n nextDay : '[Tomorrow at] LT',\n nextWeek : 'dddd [at] LT',\n lastDay : '[Yesterday at] LT',\n lastWeek : '[Last] dddd [at] LT',\n sameElse : 'L'\n };\n\n function calendar (key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n }\n\n var defaultLongDateFormat = {\n LTS : 'h:mm:ss A',\n LT : 'h:mm A',\n L : 'MM/DD/YYYY',\n LL : 'MMMM D, YYYY',\n LLL : 'MMMM D, YYYY h:mm A',\n LLLL : 'dddd, MMMM D, YYYY h:mm A'\n };\n\n function longDateFormat (key) {\n var format = this._longDateFormat[key],\n formatUpper = this._longDateFormat[key.toUpperCase()];\n\n if (format || !formatUpper) {\n return format;\n }\n\n this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n return val.slice(1);\n });\n\n return this._longDateFormat[key];\n }\n\n var defaultInvalidDate = 'Invalid date';\n\n function invalidDate () {\n return this._invalidDate;\n }\n\n var defaultOrdinal = '%d';\n var defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n function ordinal (number) {\n return this._ordinal.replace('%d', number);\n }\n\n var defaultRelativeTime = {\n future : 'in %s',\n past : '%s ago',\n s : 'a few seconds',\n ss : '%d seconds',\n m : 'a minute',\n mm : '%d minutes',\n h : 'an hour',\n hh : '%d hours',\n d : 'a day',\n dd : '%d days',\n M : 'a month',\n MM : '%d months',\n y : 'a year',\n yy : '%d years'\n };\n\n function relativeTime (number, withoutSuffix, string, isFuture) {\n var output = this._relativeTime[string];\n return (isFunction(output)) ?\n output(number, withoutSuffix, string, isFuture) :\n output.replace(/%d/i, number);\n }\n\n function pastFuture (diff, output) {\n var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n }\n\n var aliases = {};\n\n function addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n }\n\n function normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n }\n\n function normalizeObjectUnits(inputObject) {\n var normalizedInput = {},\n normalizedProp,\n prop;\n\n for (prop in inputObject) {\n if (hasOwnProp(inputObject, prop)) {\n normalizedProp = normalizeUnits(prop);\n if (normalizedProp) {\n normalizedInput[normalizedProp] = inputObject[prop];\n }\n }\n }\n\n return normalizedInput;\n }\n\n var priorities = {};\n\n function addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n }\n\n function getPrioritizedUnits(unitsObj) {\n var units = [];\n for (var u in unitsObj) {\n units.push({unit: u, priority: priorities[u]});\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\n }\n\n function makeGetSet (unit, keepTime) {\n return function (value) {\n if (value != null) {\n set$1(this, unit, value);\n hooks.updateOffset(this, keepTime);\n return this;\n } else {\n return get(this, unit);\n }\n };\n }\n\n function get (mom, unit) {\n return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n }\n\n function set$1 (mom, unit, value) {\n if (mom.isValid()) {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n }\n }\n\n// MOMENTS\n\n function stringGet (units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n }\n\n\n function stringSet (units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units);\n for (var i = 0; i < prioritized.length; i++) {\n this[prioritized[i].unit](units[prioritized[i].unit]);\n }\n } else {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units](value);\n }\n }\n return this;\n }\n\n function zeroFill(number, targetLength, forceSign) {\n var absNumber = '' + Math.abs(number),\n zerosToFill = targetLength - absNumber.length,\n sign = number >= 0;\n return (sign ? (forceSign ? '+' : '') : '-') +\n Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n }\n\n 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;\n\n var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n var formatFunctions = {};\n\n var formatTokenFunctions = {};\n\n// token: 'M'\n// padded: ['MM', 2]\n// ordinal: 'Mo'\n// callback: function () { this.month() + 1 }\n function addFormatToken (token, padded, ordinal, callback) {\n var func = callback;\n if (typeof callback === 'string') {\n func = function () {\n return this[callback]();\n };\n }\n if (token) {\n formatTokenFunctions[token] = func;\n }\n if (padded) {\n formatTokenFunctions[padded[0]] = function () {\n return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n };\n }\n if (ordinal) {\n formatTokenFunctions[ordinal] = function () {\n return this.localeData().ordinal(func.apply(this, arguments), token);\n };\n }\n }\n\n function removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n }\n\n function makeFormatFunction(format) {\n var array = format.match(formattingTokens), i, length;\n\n for (i = 0, length = array.length; i < length; i++) {\n if (formatTokenFunctions[array[i]]) {\n array[i] = formatTokenFunctions[array[i]];\n } else {\n array[i] = removeFormattingTokens(array[i]);\n }\n }\n\n return function (mom) {\n var output = '', i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n }\n return output;\n };\n }\n\n// format date using native date object\n function formatMoment(m, format) {\n if (!m.isValid()) {\n return m.localeData().invalidDate();\n }\n\n format = expandFormat(format, m.localeData());\n formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n return formatFunctions[format](m);\n }\n\n function expandFormat(format, locale) {\n var i = 5;\n\n function replaceLongDateFormatTokens(input) {\n return locale.longDateFormat(input) || input;\n }\n\n localFormattingTokens.lastIndex = 0;\n while (i >= 0 && localFormattingTokens.test(format)) {\n format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n\n return format;\n }\n\n var match1 = /\\d/; // 0 - 9\n var match2 = /\\d\\d/; // 00 - 99\n var match3 = /\\d{3}/; // 000 - 999\n var match4 = /\\d{4}/; // 0000 - 9999\n var match6 = /[+-]?\\d{6}/; // -999999 - 999999\n var match1to2 = /\\d\\d?/; // 0 - 99\n var match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\n var match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\n var match1to3 = /\\d{1,3}/; // 0 - 999\n var match1to4 = /\\d{1,4}/; // 0 - 9999\n var match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\n var matchUnsigned = /\\d+/; // 0 - inf\n var matchSigned = /[+-]?\\d+/; // -inf - inf\n\n var matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\n var matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;\n\n\n var regexes = {};\n\n function addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return (isStrict && strictRegex) ? strictRegex : regex;\n };\n }\n\n function getParseRegexForToken (token, config) {\n if (!hasOwnProp(regexes, token)) {\n return new RegExp(unescapeFormat(token));\n }\n\n return regexes[token](config._strict, config._locale);\n }\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n function unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n }\n\n function regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n\n var tokens = {};\n\n function addParseToken (token, callback) {\n var i, func = callback;\n if (typeof token === 'string') {\n token = [token];\n }\n if (isNumber(callback)) {\n func = function (input, array) {\n array[callback] = toInt(input);\n };\n }\n for (i = 0; i < token.length; i++) {\n tokens[token[i]] = func;\n }\n }\n\n function addWeekParseToken (token, callback) {\n addParseToken(token, function (input, array, config, token) {\n config._w = config._w || {};\n callback(input, config._w, config, token);\n });\n }\n\n function addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n }\n\n var YEAR = 0;\n var MONTH = 1;\n var DATE = 2;\n var HOUR = 3;\n var MINUTE = 4;\n var SECOND = 5;\n var MILLISECOND = 6;\n var WEEK = 7;\n var WEEKDAY = 8;\n\n var indexOf;\n\n if (Array.prototype.indexOf) {\n indexOf = Array.prototype.indexOf;\n } else {\n indexOf = function (o) {\n // I know\n var i;\n for (i = 0; i < this.length; ++i) {\n if (this[i] === o) {\n return i;\n }\n }\n return -1;\n };\n }\n\n var indexOf$1 = indexOf;\n\n function daysInMonth(year, month) {\n return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n }\n\n// FORMATTING\n\n addFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n });\n\n addFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n });\n\n addFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n });\n\n// ALIASES\n\n addUnitAlias('month', 'M');\n\n// PRIORITY\n\n addUnitPriority('month', 8);\n\n// PARSING\n\n addRegexToken('M', match1to2);\n addRegexToken('MM', match1to2, match2);\n addRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n });\n addRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n });\n\n addParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n });\n\n addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n var month = config._locale.monthsParse(input, token, config._strict);\n // if we didn't find a month name, mark the date as invalid.\n if (month != null) {\n array[MONTH] = month;\n } else {\n getParsingFlags(config).invalidMonth = input;\n }\n });\n\n// LOCALES\n\n var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\n var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n function localeMonths (m, format) {\n if (!m) {\n return isArray(this._months) ? this._months :\n this._months['standalone'];\n }\n return isArray(this._months) ? this._months[m.month()] :\n this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n function localeMonthsShort (m, format) {\n if (!m) {\n return isArray(this._monthsShort) ? this._monthsShort :\n this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n function handleStrictParse(monthName, format, strict) {\n var i, ii, mom, llc = monthName.toLocaleLowerCase();\n if (!this._monthsParse) {\n // this is not used\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n for (i = 0; i < 12; ++i) {\n mom = createUTC([2000, i]);\n this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'MMM') {\n ii = indexOf$1.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'MMM') {\n ii = indexOf$1.call(this._shortMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._longMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeMonthsParse (monthName, format, strict) {\n var i, mom, regex;\n\n if (this._monthsParseExact) {\n return handleStrictParse.call(this, monthName, format, strict);\n }\n\n if (!this._monthsParse) {\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n }\n\n // TODO: add sorting\n // Sorting makes sure if one month (or abbr) is a prefix of another\n // see sorting in computeMonthsParse\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n if (strict && !this._longMonthsParse[i]) {\n this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n }\n if (!strict && !this._monthsParse[i]) {\n regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n return i;\n } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n return i;\n } else if (!strict && this._monthsParse[i].test(monthName)) {\n return i;\n }\n }\n }\n\n// MOMENTS\n\n function setMonth (mom, value) {\n var dayOfMonth;\n\n if (!mom.isValid()) {\n // No op\n return mom;\n }\n\n if (typeof value === 'string') {\n if (/^\\d+$/.test(value)) {\n value = toInt(value);\n } else {\n value = mom.localeData().monthsParse(value);\n // TODO: Another silent failure?\n if (!isNumber(value)) {\n return mom;\n }\n }\n }\n\n dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n return mom;\n }\n\n function getSetMonth (value) {\n if (value != null) {\n setMonth(this, value);\n hooks.updateOffset(this, true);\n return this;\n } else {\n return get(this, 'Month');\n }\n }\n\n function getDaysInMonth () {\n return daysInMonth(this.year(), this.month());\n }\n\n var defaultMonthsShortRegex = matchWord;\n function monthsShortRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsShortStrictRegex;\n } else {\n return this._monthsShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsShortRegex')) {\n this._monthsShortRegex = defaultMonthsShortRegex;\n }\n return this._monthsShortStrictRegex && isStrict ?\n this._monthsShortStrictRegex : this._monthsShortRegex;\n }\n }\n\n var defaultMonthsRegex = matchWord;\n function monthsRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsStrictRegex;\n } else {\n return this._monthsRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsRegex')) {\n this._monthsRegex = defaultMonthsRegex;\n }\n return this._monthsStrictRegex && isStrict ?\n this._monthsStrictRegex : this._monthsRegex;\n }\n }\n\n function computeMonthsParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom;\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n shortPieces.push(this.monthsShort(mom, ''));\n longPieces.push(this.months(mom, ''));\n mixedPieces.push(this.months(mom, ''));\n mixedPieces.push(this.monthsShort(mom, ''));\n }\n // Sorting makes sure if one month (or abbr) is a prefix of another it\n // will match the longer piece.\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 12; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n }\n for (i = 0; i < 24; i++) {\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._monthsShortRegex = this._monthsRegex;\n this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n }\n\n// FORMATTING\n\n addFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + y;\n });\n\n addFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n });\n\n addFormatToken(0, ['YYYY', 4], 0, 'year');\n addFormatToken(0, ['YYYYY', 5], 0, 'year');\n addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\n addUnitAlias('year', 'y');\n\n// PRIORITIES\n\n addUnitPriority('year', 1);\n\n// PARSING\n\n addRegexToken('Y', matchSigned);\n addRegexToken('YY', match1to2, match2);\n addRegexToken('YYYY', match1to4, match4);\n addRegexToken('YYYYY', match1to6, match6);\n addRegexToken('YYYYYY', match1to6, match6);\n\n addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n addParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n });\n addParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n });\n addParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n });\n\n// HELPERS\n\n function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n }\n\n function isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n// HOOKS\n\n hooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n };\n\n// MOMENTS\n\n var getSetYear = makeGetSet('FullYear', true);\n\n function getIsLeapYear () {\n return isLeapYear(this.year());\n }\n\n function createDate (y, m, d, h, M, s, ms) {\n // can't just apply() to create a date:\n // https://stackoverflow.com/q/181348\n var date = new Date(y, m, d, h, M, s, ms);\n\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n return date;\n }\n\n function createUTCDate (y) {\n var date = new Date(Date.UTC.apply(null, arguments));\n\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\n }\n return date;\n }\n\n// start-of-first-week - start-of-year\n function firstWeekOffset(year, dow, doy) {\n var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n fwd = 7 + dow - doy,\n // first-week day local weekday -- which local weekday is fwd\n fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n return -fwdlw + fwd - 1;\n }\n\n// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n var localWeekday = (7 + weekday - dow) % 7,\n weekOffset = firstWeekOffset(year, dow, doy),\n dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n resYear, resDayOfYear;\n\n if (dayOfYear <= 0) {\n resYear = year - 1;\n resDayOfYear = daysInYear(resYear) + dayOfYear;\n } else if (dayOfYear > daysInYear(year)) {\n resYear = year + 1;\n resDayOfYear = dayOfYear - daysInYear(year);\n } else {\n resYear = year;\n resDayOfYear = dayOfYear;\n }\n\n return {\n year: resYear,\n dayOfYear: resDayOfYear\n };\n }\n\n function weekOfYear(mom, dow, doy) {\n var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n resWeek, resYear;\n\n if (week < 1) {\n resYear = mom.year() - 1;\n resWeek = week + weeksInYear(resYear, dow, doy);\n } else if (week > weeksInYear(mom.year(), dow, doy)) {\n resWeek = week - weeksInYear(mom.year(), dow, doy);\n resYear = mom.year() + 1;\n } else {\n resYear = mom.year();\n resWeek = week;\n }\n\n return {\n week: resWeek,\n year: resYear\n };\n }\n\n function weeksInYear(year, dow, doy) {\n var weekOffset = firstWeekOffset(year, dow, doy),\n weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n }\n\n// FORMATTING\n\n addFormatToken('w', ['ww', 2], 'wo', 'week');\n addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\n addUnitAlias('week', 'w');\n addUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\n addUnitPriority('week', 5);\n addUnitPriority('isoWeek', 5);\n\n// PARSING\n\n addRegexToken('w', match1to2);\n addRegexToken('ww', match1to2, match2);\n addRegexToken('W', match1to2);\n addRegexToken('WW', match1to2, match2);\n\n addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\n });\n\n// HELPERS\n\n// LOCALES\n\n function localeWeek (mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n }\n\n var defaultLocaleWeek = {\n dow : 0, // Sunday is the first day of the week.\n doy : 6 // The week that contains Jan 1st is the first week of the year.\n };\n\n function localeFirstDayOfWeek () {\n return this._week.dow;\n }\n\n function localeFirstDayOfYear () {\n return this._week.doy;\n }\n\n// MOMENTS\n\n function getSetWeek (input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n function getSetISOWeek (input) {\n var week = weekOfYear(this, 1, 4).week;\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n// FORMATTING\n\n addFormatToken('d', 0, 'do', 'day');\n\n addFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n });\n\n addFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n });\n\n addFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n });\n\n addFormatToken('e', 0, 0, 'weekday');\n addFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\n addUnitAlias('day', 'd');\n addUnitAlias('weekday', 'e');\n addUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\n addUnitPriority('day', 11);\n addUnitPriority('weekday', 11);\n addUnitPriority('isoWeekday', 11);\n\n// PARSING\n\n addRegexToken('d', match1to2);\n addRegexToken('e', match1to2);\n addRegexToken('E', match1to2);\n addRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n });\n addRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n });\n addRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n });\n\n addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n var weekday = config._locale.weekdaysParse(input, token, config._strict);\n // if we didn't get a weekday name, mark the date as invalid\n if (weekday != null) {\n week.d = weekday;\n } else {\n getParsingFlags(config).invalidWeekday = input;\n }\n });\n\n addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n });\n\n// HELPERS\n\n function parseWeekday(input, locale) {\n if (typeof input !== 'string') {\n return input;\n }\n\n if (!isNaN(input)) {\n return parseInt(input, 10);\n }\n\n input = locale.weekdaysParse(input);\n if (typeof input === 'number') {\n return input;\n }\n\n return null;\n }\n\n function parseIsoWeekday(input, locale) {\n if (typeof input === 'string') {\n return locale.weekdaysParse(input) % 7 || 7;\n }\n return isNaN(input) ? null : input;\n }\n\n// LOCALES\n\n var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n function localeWeekdays (m, format) {\n if (!m) {\n return isArray(this._weekdays) ? this._weekdays :\n this._weekdays['standalone'];\n }\n return isArray(this._weekdays) ? this._weekdays[m.day()] :\n this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n }\n\n var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n function localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n }\n\n var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n function localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n }\n\n function handleStrictParse$1(weekdayName, format, strict) {\n var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._minWeekdaysParse = [];\n\n for (i = 0; i < 7; ++i) {\n mom = createUTC([2000, 1]).day(i);\n this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'dddd') {\n ii = indexOf$1.call(this._weekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'dddd') {\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeWeekdaysParse (weekdayName, format, strict) {\n var i, mom, regex;\n\n if (this._weekdaysParseExact) {\n return handleStrictParse$1.call(this, weekdayName, format, strict);\n }\n\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._minWeekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._fullWeekdaysParse = [];\n }\n\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n\n mom = createUTC([2000, 1]).day(i);\n if (strict && !this._fullWeekdaysParse[i]) {\n this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n }\n if (!this._weekdaysParse[i]) {\n regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n return i;\n }\n }\n }\n\n// MOMENTS\n\n function getSetDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n if (input != null) {\n input = parseWeekday(input, this.localeData());\n return this.add(input - day, 'd');\n } else {\n return day;\n }\n }\n\n function getSetLocaleDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n return input == null ? weekday : this.add(input - weekday, 'd');\n }\n\n function getSetISODayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n\n // behaves the same as moment#day except\n // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n // as a setter, sunday should belong to the previous week.\n\n if (input != null) {\n var weekday = parseIsoWeekday(input, this.localeData());\n return this.day(this.day() % 7 ? weekday : weekday - 7);\n } else {\n return this.day() || 7;\n }\n }\n\n var defaultWeekdaysRegex = matchWord;\n function weekdaysRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysStrictRegex;\n } else {\n return this._weekdaysRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n this._weekdaysRegex = defaultWeekdaysRegex;\n }\n return this._weekdaysStrictRegex && isStrict ?\n this._weekdaysStrictRegex : this._weekdaysRegex;\n }\n }\n\n var defaultWeekdaysShortRegex = matchWord;\n function weekdaysShortRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysShortStrictRegex;\n } else {\n return this._weekdaysShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n }\n return this._weekdaysShortStrictRegex && isStrict ?\n this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n }\n }\n\n var defaultWeekdaysMinRegex = matchWord;\n function weekdaysMinRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysMinStrictRegex;\n } else {\n return this._weekdaysMinRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n }\n return this._weekdaysMinStrictRegex && isStrict ?\n this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n }\n }\n\n\n function computeWeekdaysParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom, minp, shortp, longp;\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, 1]).day(i);\n minp = this.weekdaysMin(mom, '');\n shortp = this.weekdaysShort(mom, '');\n longp = this.weekdays(mom, '');\n minPieces.push(minp);\n shortPieces.push(shortp);\n longPieces.push(longp);\n mixedPieces.push(minp);\n mixedPieces.push(shortp);\n mixedPieces.push(longp);\n }\n // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n // will match the longer piece.\n minPieces.sort(cmpLenRev);\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 7; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._weekdaysShortRegex = this._weekdaysRegex;\n this._weekdaysMinRegex = this._weekdaysRegex;\n\n this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n }\n\n// FORMATTING\n\n function hFormat() {\n return this.hours() % 12 || 12;\n }\n\n function kFormat() {\n return this.hours() || 24;\n }\n\n addFormatToken('H', ['HH', 2], 0, 'hour');\n addFormatToken('h', ['hh', 2], 0, hFormat);\n addFormatToken('k', ['kk', 2], 0, kFormat);\n\n addFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n addFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n function meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n }\n\n meridiem('a', true);\n meridiem('A', false);\n\n// ALIASES\n\n addUnitAlias('hour', 'h');\n\n// PRIORITY\n addUnitPriority('hour', 13);\n\n// PARSING\n\n function matchMeridiem (isStrict, locale) {\n return locale._meridiemParse;\n }\n\n addRegexToken('a', matchMeridiem);\n addRegexToken('A', matchMeridiem);\n addRegexToken('H', match1to2);\n addRegexToken('h', match1to2);\n addRegexToken('k', match1to2);\n addRegexToken('HH', match1to2, match2);\n addRegexToken('hh', match1to2, match2);\n addRegexToken('kk', match1to2, match2);\n\n addRegexToken('hmm', match3to4);\n addRegexToken('hmmss', match5to6);\n addRegexToken('Hmm', match3to4);\n addRegexToken('Hmmss', match5to6);\n\n addParseToken(['H', 'HH'], HOUR);\n addParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n });\n addParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n });\n addParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('Hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n });\n addParseToken('Hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n });\n\n// LOCALES\n\n function localeIsPM (input) {\n // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n // Using charAt should be more compatible.\n return ((input + '').toLowerCase().charAt(0) === 'p');\n }\n\n var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n function localeMeridiem (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'pm' : 'PM';\n } else {\n return isLower ? 'am' : 'AM';\n }\n }\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\n var getSetHour = makeGetSet('Hours', true);\n\n// months\n// week\n// weekdays\n// meridiem\n var baseConfig = {\n calendar: defaultCalendar,\n longDateFormat: defaultLongDateFormat,\n invalidDate: defaultInvalidDate,\n ordinal: defaultOrdinal,\n dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n relativeTime: defaultRelativeTime,\n\n months: defaultLocaleMonths,\n monthsShort: defaultLocaleMonthsShort,\n\n week: defaultLocaleWeek,\n\n weekdays: defaultLocaleWeekdays,\n weekdaysMin: defaultLocaleWeekdaysMin,\n weekdaysShort: defaultLocaleWeekdaysShort,\n\n meridiemParse: defaultLocaleMeridiemParse\n };\n\n// internal storage for locale config files\n var locales = {};\n var localeFamilies = {};\n var globalLocale;\n\n function normalizeLocale(key) {\n return key ? key.toLowerCase().replace('_', '-') : key;\n }\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n function chooseLocale(names) {\n var i = 0, j, next, locale, split;\n\n while (i < names.length) {\n split = normalizeLocale(names[i]).split('-');\n j = split.length;\n next = normalizeLocale(names[i + 1]);\n next = next ? next.split('-') : null;\n while (j > 0) {\n locale = loadLocale(split.slice(0, j).join('-'));\n if (locale) {\n return locale;\n }\n if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n //the next array item is better than a shallower substring of this one\n break;\n }\n j--;\n }\n i++;\n }\n return null;\n }\n\n function loadLocale(name) {\n var oldLocale = null;\n // TODO: Find a better way to register and load all the locales in Node\n if (!locales[name] && (typeof module !== 'undefined') &&\n module && module.exports) {\n try {\n oldLocale = globalLocale._abbr;\n require('./locale/' + name);\n // because defineLocale currently also sets the global locale, we\n // want to undo that for lazy loaded locales\n getSetGlobalLocale(oldLocale);\n } catch (e) { }\n }\n return locales[name];\n }\n\n// This function will load locale and then set the global locale. If\n// no arguments are passed in, it will simply return the current global\n// locale key.\n function getSetGlobalLocale (key, values) {\n var data;\n if (key) {\n if (isUndefined(values)) {\n data = getLocale(key);\n }\n else {\n data = defineLocale(key, values);\n }\n\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n }\n }\n\n return globalLocale._abbr;\n }\n\n function defineLocale (name, config) {\n if (config !== null) {\n var parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple('defineLocaleOverride',\n 'use moment.updateLocale(localeName, config) to change ' +\n 'an existing locale. moment.defineLocale(localeName, ' +\n 'config) should only be used for creating a new locale ' +\n 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n parentConfig = locales[name]._config;\n } else if (config.parentLocale != null) {\n if (locales[config.parentLocale] != null) {\n parentConfig = locales[config.parentLocale]._config;\n } else {\n if (!localeFamilies[config.parentLocale]) {\n localeFamilies[config.parentLocale] = [];\n }\n localeFamilies[config.parentLocale].push({\n name: name,\n config: config\n });\n return null;\n }\n }\n locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n if (localeFamilies[name]) {\n localeFamilies[name].forEach(function (x) {\n defineLocale(x.name, x.config);\n });\n }\n\n // backwards compat for now: also set the locale\n // make sure we set the locale AFTER all child locales have been\n // created, so we won't end up with the child locale set.\n getSetGlobalLocale(name);\n\n\n return locales[name];\n } else {\n // useful for testing\n delete locales[name];\n return null;\n }\n }\n\n function updateLocale(name, config) {\n if (config != null) {\n var locale, parentConfig = baseConfig;\n // MERGE\n if (locales[name] != null) {\n parentConfig = locales[name]._config;\n }\n config = mergeConfigs(parentConfig, config);\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\n\n // backwards compat for now: also set the locale\n getSetGlobalLocale(name);\n } else {\n // pass null for config to unupdate, useful for tests\n if (locales[name] != null) {\n if (locales[name].parentLocale != null) {\n locales[name] = locales[name].parentLocale;\n } else if (locales[name] != null) {\n delete locales[name];\n }\n }\n }\n return locales[name];\n }\n\n// returns locale data\n function getLocale (key) {\n var locale;\n\n if (key && key._locale && key._locale._abbr) {\n key = key._locale._abbr;\n }\n\n if (!key) {\n return globalLocale;\n }\n\n if (!isArray(key)) {\n //short-circuit everything else\n locale = loadLocale(key);\n if (locale) {\n return locale;\n }\n key = [key];\n }\n\n return chooseLocale(key);\n }\n\n function listLocales() {\n return keys$1(locales);\n }\n\n function checkOverflow (m) {\n var overflow;\n var a = m._a;\n\n if (a && getParsingFlags(m).overflow === -2) {\n overflow =\n a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :\n a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :\n a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :\n a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n -1;\n\n if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n overflow = DATE;\n }\n if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n overflow = WEEK;\n }\n if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n overflow = WEEKDAY;\n }\n\n getParsingFlags(m).overflow = overflow;\n }\n\n return m;\n }\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n 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)?)?$/;\n var 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)?)?$/;\n\n var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n var isoDates = [\n ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n ['YYYY-DDD', /\\d{4}-\\d{3}/],\n ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n ['YYYYYYMMDD', /[+-]\\d{10}/],\n ['YYYYMMDD', /\\d{8}/],\n // YYYYMM is NOT allowed by the standard\n ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n ['YYYYDDD', /\\d{7}/]\n ];\n\n// iso time formats and regexes\n var isoTimes = [\n ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n ['HH:mm', /\\d\\d:\\d\\d/],\n ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n ['HHmm', /\\d\\d\\d\\d/],\n ['HH', /\\d\\d/]\n ];\n\n var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\n function configFromISO(config) {\n var i, l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime, dateFormat, timeFormat, tzFormat;\n\n if (match) {\n getParsingFlags(config).iso = true;\n\n for (i = 0, l = isoDates.length; i < l; i++) {\n if (isoDates[i][1].exec(match[1])) {\n dateFormat = isoDates[i][0];\n allowTime = isoDates[i][2] !== false;\n break;\n }\n }\n if (dateFormat == null) {\n config._isValid = false;\n return;\n }\n if (match[3]) {\n for (i = 0, l = isoTimes.length; i < l; i++) {\n if (isoTimes[i][1].exec(match[3])) {\n // match[2] should be 'T' or space\n timeFormat = (match[2] || ' ') + isoTimes[i][0];\n break;\n }\n }\n if (timeFormat == null) {\n config._isValid = false;\n return;\n }\n }\n if (!allowTime && timeFormat != null) {\n config._isValid = false;\n return;\n }\n if (match[4]) {\n if (tzRegex.exec(match[4])) {\n tzFormat = 'Z';\n } else {\n config._isValid = false;\n return;\n }\n }\n config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n configFromStringAndFormat(config);\n } else {\n config._isValid = false;\n }\n }\n\n// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n var basicRfcRegex = /^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d?\\d\\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(?:\\d\\d)?\\d\\d\\s)(\\d\\d:\\d\\d)(\\:\\d\\d)?(\\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\\d{4}))$/;\n\n// date and time from ref 2822 format\n function configFromRFC2822(config) {\n var string, match, dayFormat,\n dateFormat, timeFormat, tzFormat;\n var timezones = {\n ' GMT': ' +0000',\n ' EDT': ' -0400',\n ' EST': ' -0500',\n ' CDT': ' -0500',\n ' CST': ' -0600',\n ' MDT': ' -0600',\n ' MST': ' -0700',\n ' PDT': ' -0700',\n ' PST': ' -0800'\n };\n var military = 'YXWVUTSRQPONZABCDEFGHIKLM';\n var timezone, timezoneIndex;\n\n string = config._i\n .replace(/\\([^\\)]*\\)|[\\n\\t]/g, ' ') // Remove comments and folding whitespace\n .replace(/(\\s\\s+)/g, ' ') // Replace multiple-spaces with a single space\n .replace(/^\\s|\\s$/g, ''); // Remove leading and trailing spaces\n match = basicRfcRegex.exec(string);\n\n if (match) {\n dayFormat = match[1] ? 'ddd' + ((match[1].length === 5) ? ', ' : ' ') : '';\n dateFormat = 'D MMM ' + ((match[2].length > 10) ? 'YYYY ' : 'YY ');\n timeFormat = 'HH:mm' + (match[4] ? ':ss' : '');\n\n // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n if (match[1]) { // day of week given\n var momentDate = new Date(match[2]);\n var momentDay = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][momentDate.getDay()];\n\n if (match[1].substr(0,3) !== momentDay) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return;\n }\n }\n\n switch (match[5].length) {\n case 2: // military\n if (timezoneIndex === 0) {\n timezone = ' +0000';\n } else {\n timezoneIndex = military.indexOf(match[5][1].toUpperCase()) - 12;\n timezone = ((timezoneIndex < 0) ? ' -' : ' +') +\n (('' + timezoneIndex).replace(/^-?/, '0')).match(/..$/)[0] + '00';\n }\n break;\n case 4: // Zone\n timezone = timezones[match[5]];\n break;\n default: // UT or +/-9999\n timezone = timezones[' GMT'];\n }\n match[5] = timezone;\n config._i = match.splice(1).join('');\n tzFormat = ' ZZ';\n config._f = dayFormat + dateFormat + timeFormat + tzFormat;\n configFromStringAndFormat(config);\n getParsingFlags(config).rfc2822 = true;\n } else {\n config._isValid = false;\n }\n }\n\n// date from iso format or fallback\n function configFromString(config) {\n var matched = aspNetJsonRegex.exec(config._i);\n\n if (matched !== null) {\n config._d = new Date(+matched[1]);\n return;\n }\n\n configFromISO(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n configFromRFC2822(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\n }\n\n hooks.createFromInputFallback = deprecate(\n 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n 'discouraged and will be removed in an upcoming major release. Please refer to ' +\n 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n function (config) {\n config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n }\n );\n\n// Pick the first defined of two or three arguments.\n function defaults(a, b, c) {\n if (a != null) {\n return a;\n }\n if (b != null) {\n return b;\n }\n return c;\n }\n\n function currentDateArray(config) {\n // hooks is actually the exported moment object\n var nowValue = new Date(hooks.now());\n if (config._useUTC) {\n return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n }\n return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n }\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\n function configFromArray (config) {\n var i, date, input = [], currentDate, yearToUse;\n\n if (config._d) {\n return;\n }\n\n currentDate = currentDateArray(config);\n\n //compute day of the year from weeks and weekdays\n if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n dayOfYearFromWeekInfo(config);\n }\n\n //if the day of the year is set, figure out what it is\n if (config._dayOfYear != null) {\n yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n getParsingFlags(config)._overflowDayOfYear = true;\n }\n\n date = createUTCDate(yearToUse, 0, config._dayOfYear);\n config._a[MONTH] = date.getUTCMonth();\n config._a[DATE] = date.getUTCDate();\n }\n\n // Default to current date.\n // * if no year, month, day of month are given, default to today\n // * if day of month is given, default month and year\n // * if month is given, default only year\n // * if year is given, don't default anything\n for (i = 0; i < 3 && config._a[i] == null; ++i) {\n config._a[i] = input[i] = currentDate[i];\n }\n\n // Zero out whatever was not defaulted, including time\n for (; i < 7; i++) {\n config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (config._a[HOUR] === 24 &&\n config._a[MINUTE] === 0 &&\n config._a[SECOND] === 0 &&\n config._a[MILLISECOND] === 0) {\n config._nextDay = true;\n config._a[HOUR] = 0;\n }\n\n config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n // Apply timezone offset from input. The actual utcOffset can be changed\n // with parseZone.\n if (config._tzm != null) {\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n }\n\n if (config._nextDay) {\n config._a[HOUR] = 24;\n }\n }\n\n function dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n w = config._w;\n if (w.GG != null || w.W != null || w.E != null) {\n dow = 1;\n doy = 4;\n\n // TODO: We need to take the current isoWeekYear, but that depends on\n // how we interpret now (local, utc, fixed offset). So create\n // a now version of current config (take local/utc/offset flags, and\n // create now).\n weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n week = defaults(w.W, 1);\n weekday = defaults(w.E, 1);\n if (weekday < 1 || weekday > 7) {\n weekdayOverflow = true;\n }\n } else {\n dow = config._locale._week.dow;\n doy = config._locale._week.doy;\n\n var curWeek = weekOfYear(createLocal(), dow, doy);\n\n weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n // Default to current week.\n week = defaults(w.w, curWeek.week);\n\n if (w.d != null) {\n // weekday -- low day numbers are considered next week\n weekday = w.d;\n if (weekday < 0 || weekday > 6) {\n weekdayOverflow = true;\n }\n } else if (w.e != null) {\n // local weekday -- counting starts from begining of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to begining of week\n weekday = dow;\n }\n }\n if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n getParsingFlags(config)._overflowWeeks = true;\n } else if (weekdayOverflow != null) {\n getParsingFlags(config)._overflowWeekday = true;\n } else {\n temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n config._a[YEAR] = temp.year;\n config._dayOfYear = temp.dayOfYear;\n }\n }\n\n// constant that refers to the ISO standard\n hooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\n hooks.RFC_2822 = function () {};\n\n// date from string and format string\n function configFromStringAndFormat(config) {\n // TODO: Move this to another part of the creation flow to prevent circular deps\n if (config._f === hooks.ISO_8601) {\n configFromISO(config);\n return;\n }\n if (config._f === hooks.RFC_2822) {\n configFromRFC2822(config);\n return;\n }\n config._a = [];\n getParsingFlags(config).empty = true;\n\n // This array is used to make a Date, either with `new Date` or `Date.UTC`\n var string = '' + config._i,\n i, parsedInput, tokens, token, skipped,\n stringLength = string.length,\n totalParsedInputLength = 0;\n\n tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n // console.log('token', token, 'parsedInput', parsedInput,\n // 'regex', getParseRegexForToken(token, config));\n if (parsedInput) {\n skipped = string.substr(0, string.indexOf(parsedInput));\n if (skipped.length > 0) {\n getParsingFlags(config).unusedInput.push(skipped);\n }\n string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n totalParsedInputLength += parsedInput.length;\n }\n // don't parse if it's not a known token\n if (formatTokenFunctions[token]) {\n if (parsedInput) {\n getParsingFlags(config).empty = false;\n }\n else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n }\n else if (config._strict && !parsedInput) {\n getParsingFlags(config).unusedTokens.push(token);\n }\n }\n\n // add remaining unparsed input length to the string\n getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n if (string.length > 0) {\n getParsingFlags(config).unusedInput.push(string);\n }\n\n // clear _12h flag if hour is <= 12\n if (config._a[HOUR] <= 12 &&\n getParsingFlags(config).bigHour === true &&\n config._a[HOUR] > 0) {\n getParsingFlags(config).bigHour = undefined;\n }\n\n getParsingFlags(config).parsedDateParts = config._a.slice(0);\n getParsingFlags(config).meridiem = config._meridiem;\n // handle meridiem\n config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n configFromArray(config);\n checkOverflow(config);\n }\n\n\n function meridiemFixWrap (locale, hour, meridiem) {\n var isPm;\n\n if (meridiem == null) {\n // nothing to do\n return hour;\n }\n if (locale.meridiemHour != null) {\n return locale.meridiemHour(hour, meridiem);\n } else if (locale.isPM != null) {\n // Fallback\n isPm = locale.isPM(meridiem);\n if (isPm && hour < 12) {\n hour += 12;\n }\n if (!isPm && hour === 12) {\n hour = 0;\n }\n return hour;\n } else {\n // this is not supposed to happen\n return hour;\n }\n }\n\n// date from string and array of format strings\n function configFromStringAndArray(config) {\n var tempConfig,\n bestMoment,\n\n scoreToBeat,\n i,\n currentScore;\n\n if (config._f.length === 0) {\n getParsingFlags(config).invalidFormat = true;\n config._d = new Date(NaN);\n return;\n }\n\n for (i = 0; i < config._f.length; i++) {\n currentScore = 0;\n tempConfig = copyConfig({}, config);\n if (config._useUTC != null) {\n tempConfig._useUTC = config._useUTC;\n }\n tempConfig._f = config._f[i];\n configFromStringAndFormat(tempConfig);\n\n if (!isValid(tempConfig)) {\n continue;\n }\n\n // if there is any input that was not parsed add a penalty for that format\n currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n //or tokens\n currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n getParsingFlags(tempConfig).score = currentScore;\n\n if (scoreToBeat == null || currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n }\n }\n\n extend(config, bestMoment || tempConfig);\n }\n\n function configFromObject(config) {\n if (config._d) {\n return;\n }\n\n var i = normalizeObjectUnits(config._i);\n config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n return obj && parseInt(obj, 10);\n });\n\n configFromArray(config);\n }\n\n function createFromConfig (config) {\n var res = new Moment(checkOverflow(prepareConfig(config)));\n if (res._nextDay) {\n // Adding is smart enough around DST\n res.add(1, 'd');\n res._nextDay = undefined;\n }\n\n return res;\n }\n\n function prepareConfig (config) {\n var input = config._i,\n format = config._f;\n\n config._locale = config._locale || getLocale(config._l);\n\n if (input === null || (format === undefined && input === '')) {\n return createInvalid({nullInput: true});\n }\n\n if (typeof input === 'string') {\n config._i = input = config._locale.preparse(input);\n }\n\n if (isMoment(input)) {\n return new Moment(checkOverflow(input));\n } else if (isDate(input)) {\n config._d = input;\n } else if (isArray(format)) {\n configFromStringAndArray(config);\n } else if (format) {\n configFromStringAndFormat(config);\n } else {\n configFromInput(config);\n }\n\n if (!isValid(config)) {\n config._d = null;\n }\n\n return config;\n }\n\n function configFromInput(config) {\n var input = config._i;\n if (isUndefined(input)) {\n config._d = new Date(hooks.now());\n } else if (isDate(input)) {\n config._d = new Date(input.valueOf());\n } else if (typeof input === 'string') {\n configFromString(config);\n } else if (isArray(input)) {\n config._a = map(input.slice(0), function (obj) {\n return parseInt(obj, 10);\n });\n configFromArray(config);\n } else if (isObject(input)) {\n configFromObject(config);\n } else if (isNumber(input)) {\n // from milliseconds\n config._d = new Date(input);\n } else {\n hooks.createFromInputFallback(config);\n }\n }\n\n function createLocalOrUTC (input, format, locale, strict, isUTC) {\n var c = {};\n\n if (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n\n if ((isObject(input) && isObjectEmpty(input)) ||\n (isArray(input) && input.length === 0)) {\n input = undefined;\n }\n // object construction must be done this way.\n // https://github.com/moment/moment/issues/1423\n c._isAMomentObject = true;\n c._useUTC = c._isUTC = isUTC;\n c._l = locale;\n c._i = input;\n c._f = format;\n c._strict = strict;\n\n return createFromConfig(c);\n }\n\n function createLocal (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n }\n\n var prototypeMin = deprecate(\n 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other < this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n var prototypeMax = deprecate(\n 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other > this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\n function pickBy(fn, moments) {\n var res, i;\n if (moments.length === 1 && isArray(moments[0])) {\n moments = moments[0];\n }\n if (!moments.length) {\n return createLocal();\n }\n res = moments[0];\n for (i = 1; i < moments.length; ++i) {\n if (!moments[i].isValid() || moments[i][fn](res)) {\n res = moments[i];\n }\n }\n return res;\n }\n\n// TODO: Use [].sort instead?\n function min () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n }\n\n function max () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n }\n\n var now = function () {\n return Date.now ? Date.now() : +(new Date());\n };\n\n var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n function isDurationValid(m) {\n for (var key in m) {\n if (!(ordering.indexOf(key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n return false;\n }\n }\n\n var unitHasDecimal = false;\n for (var i = 0; i < ordering.length; ++i) {\n if (m[ordering[i]]) {\n if (unitHasDecimal) {\n return false; // only allow non-integers for smallest unit\n }\n if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n unitHasDecimal = true;\n }\n }\n }\n\n return true;\n }\n\n function isValid$1() {\n return this._isValid;\n }\n\n function createInvalid$1() {\n return createDuration(NaN);\n }\n\n function Duration (duration) {\n var normalizedInput = normalizeObjectUnits(duration),\n years = normalizedInput.year || 0,\n quarters = normalizedInput.quarter || 0,\n months = normalizedInput.month || 0,\n weeks = normalizedInput.week || 0,\n days = normalizedInput.day || 0,\n hours = normalizedInput.hour || 0,\n minutes = normalizedInput.minute || 0,\n seconds = normalizedInput.second || 0,\n milliseconds = normalizedInput.millisecond || 0;\n\n this._isValid = isDurationValid(normalizedInput);\n\n // representation for dateAddRemove\n this._milliseconds = +milliseconds +\n seconds * 1e3 + // 1000\n minutes * 6e4 + // 1000 * 60\n hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n // Because of dateAddRemove treats 24 hours as different from a\n // day when working around DST, we need to store them separately\n this._days = +days +\n weeks * 7;\n // It is impossible translate months into days without knowing\n // which months you are are talking about, so we have to store\n // it separately.\n this._months = +months +\n quarters * 3 +\n years * 12;\n\n this._data = {};\n\n this._locale = getLocale();\n\n this._bubble();\n }\n\n function isDuration (obj) {\n return obj instanceof Duration;\n }\n\n function absRound (number) {\n if (number < 0) {\n return Math.round(-1 * number) * -1;\n } else {\n return Math.round(number);\n }\n }\n\n// FORMATTING\n\n function offset (token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset();\n var sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n });\n }\n\n offset('Z', ':');\n offset('ZZ', '');\n\n// PARSING\n\n addRegexToken('Z', matchShortOffset);\n addRegexToken('ZZ', matchShortOffset);\n addParseToken(['Z', 'ZZ'], function (input, array, config) {\n config._useUTC = true;\n config._tzm = offsetFromString(matchShortOffset, input);\n });\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10', '00']\n// '-1530' > ['-15', '30']\n var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n function offsetFromString(matcher, string) {\n var matches = (string || '').match(matcher);\n\n if (matches === null) {\n return null;\n }\n\n var chunk = matches[matches.length - 1] || [];\n var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n return minutes === 0 ?\n 0 :\n parts[0] === '+' ? minutes : -minutes;\n }\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\n function cloneWithOffset(input, model) {\n var res, diff;\n if (model._isUTC) {\n res = model.clone();\n diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n // Use low-level api, because this fn is low-level api.\n res._d.setTime(res._d.valueOf() + diff);\n hooks.updateOffset(res, false);\n return res;\n } else {\n return createLocal(input).local();\n }\n }\n\n function getDateOffset (m) {\n // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n // https://github.com/moment/moment/pull/1871\n return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n }\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\n hooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\n function getSetOffset (input, keepLocalTime, keepMinutes) {\n var offset = this._offset || 0,\n localAdjust;\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n if (input != null) {\n if (typeof input === 'string') {\n input = offsetFromString(matchShortOffset, input);\n if (input === null) {\n return this;\n }\n } else if (Math.abs(input) < 16 && !keepMinutes) {\n input = input * 60;\n }\n if (!this._isUTC && keepLocalTime) {\n localAdjust = getDateOffset(this);\n }\n this._offset = input;\n this._isUTC = true;\n if (localAdjust != null) {\n this.add(localAdjust, 'm');\n }\n if (offset !== input) {\n if (!keepLocalTime || this._changeInProgress) {\n addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n } else if (!this._changeInProgress) {\n this._changeInProgress = true;\n hooks.updateOffset(this, true);\n this._changeInProgress = null;\n }\n }\n return this;\n } else {\n return this._isUTC ? offset : getDateOffset(this);\n }\n }\n\n function getSetZone (input, keepLocalTime) {\n if (input != null) {\n if (typeof input !== 'string') {\n input = -input;\n }\n\n this.utcOffset(input, keepLocalTime);\n\n return this;\n } else {\n return -this.utcOffset();\n }\n }\n\n function setOffsetToUTC (keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n }\n\n function setOffsetToLocal (keepLocalTime) {\n if (this._isUTC) {\n this.utcOffset(0, keepLocalTime);\n this._isUTC = false;\n\n if (keepLocalTime) {\n this.subtract(getDateOffset(this), 'm');\n }\n }\n return this;\n }\n\n function setOffsetToParsedOffset () {\n if (this._tzm != null) {\n this.utcOffset(this._tzm, false, true);\n } else if (typeof this._i === 'string') {\n var tZone = offsetFromString(matchOffset, this._i);\n if (tZone != null) {\n this.utcOffset(tZone);\n }\n else {\n this.utcOffset(0, true);\n }\n }\n return this;\n }\n\n function hasAlignedHourOffset (input) {\n if (!this.isValid()) {\n return false;\n }\n input = input ? createLocal(input).utcOffset() : 0;\n\n return (this.utcOffset() - input) % 60 === 0;\n }\n\n function isDaylightSavingTime () {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n }\n\n function isDaylightSavingTimeShifted () {\n if (!isUndefined(this._isDSTShifted)) {\n return this._isDSTShifted;\n }\n\n var c = {};\n\n copyConfig(c, this);\n c = prepareConfig(c);\n\n if (c._a) {\n var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted = this.isValid() &&\n compareArrays(c._a, other.toArray()) > 0;\n } else {\n this._isDSTShifted = false;\n }\n\n return this._isDSTShifted;\n }\n\n function isLocal () {\n return this.isValid() ? !this._isUTC : false;\n }\n\n function isUtcOffset () {\n return this.isValid() ? this._isUTC : false;\n }\n\n function isUtc () {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n }\n\n// ASP.NET json date format regex\n var aspNetRegex = /^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\n var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;\n\n function createDuration (input, key) {\n var duration = input,\n // matching against regexp is expensive, do it on demand\n match = null,\n sign,\n ret,\n diffRes;\n\n if (isDuration(input)) {\n duration = {\n ms : input._milliseconds,\n d : input._days,\n M : input._months\n };\n } else if (isNumber(input)) {\n duration = {};\n if (key) {\n duration[key] = input;\n } else {\n duration.milliseconds = input;\n }\n } else if (!!(match = aspNetRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : 0,\n d : toInt(match[DATE]) * sign,\n h : toInt(match[HOUR]) * sign,\n m : toInt(match[MINUTE]) * sign,\n s : toInt(match[SECOND]) * sign,\n ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n };\n } else if (!!(match = isoRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : parseIso(match[2], sign),\n M : parseIso(match[3], sign),\n w : parseIso(match[4], sign),\n d : parseIso(match[5], sign),\n h : parseIso(match[6], sign),\n m : parseIso(match[7], sign),\n s : parseIso(match[8], sign)\n };\n } else if (duration == null) {// checks for null or undefined\n duration = {};\n } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n duration = {};\n duration.ms = diffRes.milliseconds;\n duration.M = diffRes.months;\n }\n\n ret = new Duration(duration);\n\n if (isDuration(input) && hasOwnProp(input, '_locale')) {\n ret._locale = input._locale;\n }\n\n return ret;\n }\n\n createDuration.fn = Duration.prototype;\n createDuration.invalid = createInvalid$1;\n\n function parseIso (inp, sign) {\n // We'd normally use ~~inp for this, but unfortunately it also\n // converts floats to ints.\n // inp may be undefined, so careful calling replace on it.\n var res = inp && parseFloat(inp.replace(',', '.'));\n // apply sign while we're at it\n return (isNaN(res) ? 0 : res) * sign;\n }\n\n function positiveMomentsDifference(base, other) {\n var res = {milliseconds: 0, months: 0};\n\n res.months = other.month() - base.month() +\n (other.year() - base.year()) * 12;\n if (base.clone().add(res.months, 'M').isAfter(other)) {\n --res.months;\n }\n\n res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n return res;\n }\n\n function momentsDifference(base, other) {\n var res;\n if (!(base.isValid() && other.isValid())) {\n return {milliseconds: 0, months: 0};\n }\n\n other = cloneWithOffset(other, base);\n if (base.isBefore(other)) {\n res = positiveMomentsDifference(base, other);\n } else {\n res = positiveMomentsDifference(other, base);\n res.milliseconds = -res.milliseconds;\n res.months = -res.months;\n }\n\n return res;\n }\n\n// TODO: remove 'name' arg after deprecation is removed\n function createAdder(direction, name) {\n return function (val, period) {\n var dur, tmp;\n //invert the arguments, but complain about it\n if (period !== null && !isNaN(+period)) {\n deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n tmp = val; val = period; period = tmp;\n }\n\n val = typeof val === 'string' ? +val : val;\n dur = createDuration(val, period);\n addSubtract(this, dur, direction);\n return this;\n };\n }\n\n function addSubtract (mom, duration, isAdding, updateOffset) {\n var milliseconds = duration._milliseconds,\n days = absRound(duration._days),\n months = absRound(duration._months);\n\n if (!mom.isValid()) {\n // No op\n return;\n }\n\n updateOffset = updateOffset == null ? true : updateOffset;\n\n if (milliseconds) {\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n }\n if (days) {\n set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n }\n if (months) {\n setMonth(mom, get(mom, 'Month') + months * isAdding);\n }\n if (updateOffset) {\n hooks.updateOffset(mom, days || months);\n }\n }\n\n var add = createAdder(1, 'add');\n var subtract = createAdder(-1, 'subtract');\n\n function getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6 ? 'sameElse' :\n diff < -1 ? 'lastWeek' :\n diff < 0 ? 'lastDay' :\n diff < 1 ? 'sameDay' :\n diff < 2 ? 'nextDay' :\n diff < 7 ? 'nextWeek' : 'sameElse';\n }\n\n function calendar$1 (time, formats) {\n // We want to compare the start of today, vs this.\n // Getting start-of-today depends on whether we're local/utc/offset or not.\n var now = time || createLocal(),\n sod = cloneWithOffset(now, this).startOf('day'),\n format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n }\n\n function clone () {\n return new Moment(this);\n }\n\n function isAfter (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() > localInput.valueOf();\n } else {\n return localInput.valueOf() < this.clone().startOf(units).valueOf();\n }\n }\n\n function isBefore (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() < localInput.valueOf();\n } else {\n return this.clone().endOf(units).valueOf() < localInput.valueOf();\n }\n }\n\n function isBetween (from, to, units, inclusivity) {\n inclusivity = inclusivity || '()';\n return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n }\n\n function isSame (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input),\n inputMs;\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units || 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() === localInput.valueOf();\n } else {\n inputMs = localInput.valueOf();\n return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n }\n }\n\n function isSameOrAfter (input, units) {\n return this.isSame(input, units) || this.isAfter(input,units);\n }\n\n function isSameOrBefore (input, units) {\n return this.isSame(input, units) || this.isBefore(input,units);\n }\n\n function diff (input, units, asFloat) {\n var that,\n zoneDelta,\n delta, output;\n\n if (!this.isValid()) {\n return NaN;\n }\n\n that = cloneWithOffset(input, this);\n\n if (!that.isValid()) {\n return NaN;\n }\n\n zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n units = normalizeUnits(units);\n\n if (units === 'year' || units === 'month' || units === 'quarter') {\n output = monthDiff(this, that);\n if (units === 'quarter') {\n output = output / 3;\n } else if (units === 'year') {\n output = output / 12;\n }\n } else {\n delta = this - that;\n output = units === 'second' ? delta / 1e3 : // 1000\n units === 'minute' ? delta / 6e4 : // 1000 * 60\n units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\n units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\n units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\n delta;\n }\n return asFloat ? output : absFloor(output);\n }\n\n function monthDiff (a, b) {\n // difference in months\n var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n // b is in (anchor - 1 month, anchor + 1 month)\n anchor = a.clone().add(wholeMonthDiff, 'months'),\n anchor2, adjust;\n\n if (b - anchor < 0) {\n anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor - anchor2);\n } else {\n anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor2 - anchor);\n }\n\n //check for negative zero, return zero if negative zero\n return -(wholeMonthDiff + adjust) || 0;\n }\n\n hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n function toString () {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n }\n\n function toISOString() {\n if (!this.isValid()) {\n return null;\n }\n var m = this.clone().utc();\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n }\n if (isFunction(Date.prototype.toISOString)) {\n // native implementation is ~50x faster, use it when we can\n return this.toDate().toISOString();\n }\n return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n }\n\n /**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\n function inspect () {\n if (!this.isValid()) {\n return 'moment.invalid(/* ' + this._i + ' */)';\n }\n var func = 'moment';\n var zone = '';\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n var prefix = '[' + func + '(\"]';\n var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n var suffix = zone + '[\")]';\n\n return this.format(prefix + year + datetime + suffix);\n }\n\n function format (inputString) {\n if (!inputString) {\n inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n }\n\n function from (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function fromNow (withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n }\n\n function to (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function toNow (withoutSuffix) {\n return this.to(createLocal(), withoutSuffix);\n }\n\n// If passed a locale key, it will set the locale for this\n// instance. Otherwise, it will return the locale configuration\n// variables for this instance.\n function locale (key) {\n var newLocaleData;\n\n if (key === undefined) {\n return this._locale._abbr;\n } else {\n newLocaleData = getLocale(key);\n if (newLocaleData != null) {\n this._locale = newLocaleData;\n }\n return this;\n }\n }\n\n var lang = deprecate(\n 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n function (key) {\n if (key === undefined) {\n return this.localeData();\n } else {\n return this.locale(key);\n }\n }\n );\n\n function localeData () {\n return this._locale;\n }\n\n function startOf (units) {\n units = normalizeUnits(units);\n // the following switch intentionally omits break keywords\n // to utilize falling through the cases.\n switch (units) {\n case 'year':\n this.month(0);\n\t\t\t\t/* falls through */\n case 'quarter':\n case 'month':\n this.date(1);\n\t\t\t\t/* falls through */\n case 'week':\n case 'isoWeek':\n case 'day':\n case 'date':\n this.hours(0);\n\t\t\t\t/* falls through */\n case 'hour':\n this.minutes(0);\n\t\t\t\t/* falls through */\n case 'minute':\n this.seconds(0);\n\t\t\t\t/* falls through */\n case 'second':\n this.milliseconds(0);\n }\n\n // weeks are a special case\n if (units === 'week') {\n this.weekday(0);\n }\n if (units === 'isoWeek') {\n this.isoWeekday(1);\n }\n\n // quarters are also special\n if (units === 'quarter') {\n this.month(Math.floor(this.month() / 3) * 3);\n }\n\n return this;\n }\n\n function endOf (units) {\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond') {\n return this;\n }\n\n // 'date' is an alias for 'day', so it should be considered as such.\n if (units === 'date') {\n units = 'day';\n }\n\n return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n }\n\n function valueOf () {\n return this._d.valueOf() - ((this._offset || 0) * 60000);\n }\n\n function unix () {\n return Math.floor(this.valueOf() / 1000);\n }\n\n function toDate () {\n return new Date(this.valueOf());\n }\n\n function toArray () {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n }\n\n function toObject () {\n var m = this;\n return {\n years: m.year(),\n months: m.month(),\n date: m.date(),\n hours: m.hours(),\n minutes: m.minutes(),\n seconds: m.seconds(),\n milliseconds: m.milliseconds()\n };\n }\n\n function toJSON () {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n }\n\n function isValid$2 () {\n return isValid(this);\n }\n\n function parsingFlags () {\n return extend({}, getParsingFlags(this));\n }\n\n function invalidAt () {\n return getParsingFlags(this).overflow;\n }\n\n function creationData() {\n return {\n input: this._i,\n format: this._f,\n locale: this._locale,\n isUTC: this._isUTC,\n strict: this._strict\n };\n }\n\n// FORMATTING\n\n addFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n });\n\n addFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n });\n\n function addWeekYearFormatToken (token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n }\n\n addWeekYearFormatToken('gggg', 'weekYear');\n addWeekYearFormatToken('ggggg', 'weekYear');\n addWeekYearFormatToken('GGGG', 'isoWeekYear');\n addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\n addUnitAlias('weekYear', 'gg');\n addUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\n addUnitPriority('weekYear', 1);\n addUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\n addRegexToken('G', matchSigned);\n addRegexToken('g', matchSigned);\n addRegexToken('GG', match1to2, match2);\n addRegexToken('gg', match1to2, match2);\n addRegexToken('GGGG', match1to4, match4);\n addRegexToken('gggg', match1to4, match4);\n addRegexToken('GGGGG', match1to6, match6);\n addRegexToken('ggggg', match1to6, match6);\n\n addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n });\n\n addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n });\n\n// MOMENTS\n\n function getSetWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input,\n this.week(),\n this.weekday(),\n this.localeData()._week.dow,\n this.localeData()._week.doy);\n }\n\n function getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n }\n\n function getISOWeeksInYear () {\n return weeksInYear(this.year(), 1, 4);\n }\n\n function getWeeksInYear () {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n }\n\n function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n var weeksTarget;\n if (input == null) {\n return weekOfYear(this, dow, doy).year;\n } else {\n weeksTarget = weeksInYear(input, dow, doy);\n if (week > weeksTarget) {\n week = weeksTarget;\n }\n return setWeekAll.call(this, input, week, weekday, dow, doy);\n }\n }\n\n function setWeekAll(weekYear, week, weekday, dow, doy) {\n var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n this.year(date.getUTCFullYear());\n this.month(date.getUTCMonth());\n this.date(date.getUTCDate());\n return this;\n }\n\n// FORMATTING\n\n addFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\n addUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\n addUnitPriority('quarter', 7);\n\n// PARSING\n\n addRegexToken('Q', match1);\n addParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n });\n\n// MOMENTS\n\n function getSetQuarter (input) {\n return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n }\n\n// FORMATTING\n\n addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\n addUnitAlias('date', 'D');\n\n// PRIOROITY\n addUnitPriority('date', 9);\n\n// PARSING\n\n addRegexToken('D', match1to2);\n addRegexToken('DD', match1to2, match2);\n addRegexToken('Do', function (isStrict, locale) {\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n return isStrict ?\n (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n locale._dayOfMonthOrdinalParseLenient;\n });\n\n addParseToken(['D', 'DD'], DATE);\n addParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0], 10);\n });\n\n// MOMENTS\n\n var getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\n addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\n addUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\n addUnitPriority('dayOfYear', 4);\n\n// PARSING\n\n addRegexToken('DDD', match1to3);\n addRegexToken('DDDD', match3);\n addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n });\n\n// HELPERS\n\n// MOMENTS\n\n function getSetDayOfYear (input) {\n var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n }\n\n// FORMATTING\n\n addFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\n addUnitAlias('minute', 'm');\n\n// PRIORITY\n\n addUnitPriority('minute', 14);\n\n// PARSING\n\n addRegexToken('m', match1to2);\n addRegexToken('mm', match1to2, match2);\n addParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\n var getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\n addFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\n addUnitAlias('second', 's');\n\n// PRIORITY\n\n addUnitPriority('second', 15);\n\n// PARSING\n\n addRegexToken('s', match1to2);\n addRegexToken('ss', match1to2, match2);\n addParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\n var getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\n addFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n });\n\n addFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n });\n\n addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n addFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n });\n addFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n });\n addFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n });\n addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n });\n addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n });\n addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n });\n\n\n// ALIASES\n\n addUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\n addUnitPriority('millisecond', 16);\n\n// PARSING\n\n addRegexToken('S', match1to3, match1);\n addRegexToken('SS', match1to3, match2);\n addRegexToken('SSS', match1to3, match3);\n\n var token;\n for (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n }\n\n function parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n }\n\n for (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n }\n// MOMENTS\n\n var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\n addFormatToken('z', 0, 0, 'zoneAbbr');\n addFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\n function getZoneAbbr () {\n return this._isUTC ? 'UTC' : '';\n }\n\n function getZoneName () {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n }\n\n var proto = Moment.prototype;\n\n proto.add = add;\n proto.calendar = calendar$1;\n proto.clone = clone;\n proto.diff = diff;\n proto.endOf = endOf;\n proto.format = format;\n proto.from = from;\n proto.fromNow = fromNow;\n proto.to = to;\n proto.toNow = toNow;\n proto.get = stringGet;\n proto.invalidAt = invalidAt;\n proto.isAfter = isAfter;\n proto.isBefore = isBefore;\n proto.isBetween = isBetween;\n proto.isSame = isSame;\n proto.isSameOrAfter = isSameOrAfter;\n proto.isSameOrBefore = isSameOrBefore;\n proto.isValid = isValid$2;\n proto.lang = lang;\n proto.locale = locale;\n proto.localeData = localeData;\n proto.max = prototypeMax;\n proto.min = prototypeMin;\n proto.parsingFlags = parsingFlags;\n proto.set = stringSet;\n proto.startOf = startOf;\n proto.subtract = subtract;\n proto.toArray = toArray;\n proto.toObject = toObject;\n proto.toDate = toDate;\n proto.toISOString = toISOString;\n proto.inspect = inspect;\n proto.toJSON = toJSON;\n proto.toString = toString;\n proto.unix = unix;\n proto.valueOf = valueOf;\n proto.creationData = creationData;\n\n// Year\n proto.year = getSetYear;\n proto.isLeapYear = getIsLeapYear;\n\n// Week Year\n proto.weekYear = getSetWeekYear;\n proto.isoWeekYear = getSetISOWeekYear;\n\n// Quarter\n proto.quarter = proto.quarters = getSetQuarter;\n\n// Month\n proto.month = getSetMonth;\n proto.daysInMonth = getDaysInMonth;\n\n// Week\n proto.week = proto.weeks = getSetWeek;\n proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n proto.weeksInYear = getWeeksInYear;\n proto.isoWeeksInYear = getISOWeeksInYear;\n\n// Day\n proto.date = getSetDayOfMonth;\n proto.day = proto.days = getSetDayOfWeek;\n proto.weekday = getSetLocaleDayOfWeek;\n proto.isoWeekday = getSetISODayOfWeek;\n proto.dayOfYear = getSetDayOfYear;\n\n// Hour\n proto.hour = proto.hours = getSetHour;\n\n// Minute\n proto.minute = proto.minutes = getSetMinute;\n\n// Second\n proto.second = proto.seconds = getSetSecond;\n\n// Millisecond\n proto.millisecond = proto.milliseconds = getSetMillisecond;\n\n// Offset\n proto.utcOffset = getSetOffset;\n proto.utc = setOffsetToUTC;\n proto.local = setOffsetToLocal;\n proto.parseZone = setOffsetToParsedOffset;\n proto.hasAlignedHourOffset = hasAlignedHourOffset;\n proto.isDST = isDaylightSavingTime;\n proto.isLocal = isLocal;\n proto.isUtcOffset = isUtcOffset;\n proto.isUtc = isUtc;\n proto.isUTC = isUtc;\n\n// Timezone\n proto.zoneAbbr = getZoneAbbr;\n proto.zoneName = getZoneName;\n\n// Deprecations\n proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n function createUnix (input) {\n return createLocal(input * 1000);\n }\n\n function createInZone () {\n return createLocal.apply(null, arguments).parseZone();\n }\n\n function preParsePostFormat (string) {\n return string;\n }\n\n var proto$1 = Locale.prototype;\n\n proto$1.calendar = calendar;\n proto$1.longDateFormat = longDateFormat;\n proto$1.invalidDate = invalidDate;\n proto$1.ordinal = ordinal;\n proto$1.preparse = preParsePostFormat;\n proto$1.postformat = preParsePostFormat;\n proto$1.relativeTime = relativeTime;\n proto$1.pastFuture = pastFuture;\n proto$1.set = set;\n\n// Month\n proto$1.months = localeMonths;\n proto$1.monthsShort = localeMonthsShort;\n proto$1.monthsParse = localeMonthsParse;\n proto$1.monthsRegex = monthsRegex;\n proto$1.monthsShortRegex = monthsShortRegex;\n\n// Week\n proto$1.week = localeWeek;\n proto$1.firstDayOfYear = localeFirstDayOfYear;\n proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n// Day of Week\n proto$1.weekdays = localeWeekdays;\n proto$1.weekdaysMin = localeWeekdaysMin;\n proto$1.weekdaysShort = localeWeekdaysShort;\n proto$1.weekdaysParse = localeWeekdaysParse;\n\n proto$1.weekdaysRegex = weekdaysRegex;\n proto$1.weekdaysShortRegex = weekdaysShortRegex;\n proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n// Hours\n proto$1.isPM = localeIsPM;\n proto$1.meridiem = localeMeridiem;\n\n function get$1 (format, index, field, setter) {\n var locale = getLocale();\n var utc = createUTC().set(setter, index);\n return locale[field](utc, format);\n }\n\n function listMonthsImpl (format, index, field) {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n\n if (index != null) {\n return get$1(format, index, field, 'month');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 12; i++) {\n out[i] = get$1(format, i, field, 'month');\n }\n return out;\n }\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\n function listWeekdaysImpl (localeSorted, format, index, field) {\n if (typeof localeSorted === 'boolean') {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n } else {\n format = localeSorted;\n index = format;\n localeSorted = false;\n\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n }\n\n var locale = getLocale(),\n shift = localeSorted ? locale._week.dow : 0;\n\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 7; i++) {\n out[i] = get$1(format, (i + shift) % 7, field, 'day');\n }\n return out;\n }\n\n function listMonths (format, index) {\n return listMonthsImpl(format, index, 'months');\n }\n\n function listMonthsShort (format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n }\n\n function listWeekdays (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n }\n\n function listWeekdaysShort (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n }\n\n function listWeekdaysMin (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n }\n\n getSetGlobalLocale('en', {\n dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal : function (number) {\n var b = number % 10,\n output = (toInt(number % 100 / 10) === 1) ? 'th' :\n (b === 1) ? 'st' :\n (b === 2) ? 'nd' :\n (b === 3) ? 'rd' : 'th';\n return number + output;\n }\n });\n\n// Side effect imports\n hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\n var mathAbs = Math.abs;\n\n function abs () {\n var data = this._data;\n\n this._milliseconds = mathAbs(this._milliseconds);\n this._days = mathAbs(this._days);\n this._months = mathAbs(this._months);\n\n data.milliseconds = mathAbs(data.milliseconds);\n data.seconds = mathAbs(data.seconds);\n data.minutes = mathAbs(data.minutes);\n data.hours = mathAbs(data.hours);\n data.months = mathAbs(data.months);\n data.years = mathAbs(data.years);\n\n return this;\n }\n\n function addSubtract$1 (duration, input, value, direction) {\n var other = createDuration(input, value);\n\n duration._milliseconds += direction * other._milliseconds;\n duration._days += direction * other._days;\n duration._months += direction * other._months;\n\n return duration._bubble();\n }\n\n// supports only 2.0-style add(1, 's') or add(duration)\n function add$1 (input, value) {\n return addSubtract$1(this, input, value, 1);\n }\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\n function subtract$1 (input, value) {\n return addSubtract$1(this, input, value, -1);\n }\n\n function absCeil (number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n }\n\n function bubble () {\n var milliseconds = this._milliseconds;\n var days = this._days;\n var months = this._months;\n var data = this._data;\n var seconds, minutes, hours, years, monthsFromDays;\n\n // if we have a mix of positive and negative values, bubble down first\n // check: https://github.com/moment/moment/issues/2166\n if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n (milliseconds <= 0 && days <= 0 && months <= 0))) {\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n days = 0;\n months = 0;\n }\n\n // The following code bubbles up values, see the tests for\n // examples of what that means.\n data.milliseconds = milliseconds % 1000;\n\n seconds = absFloor(milliseconds / 1000);\n data.seconds = seconds % 60;\n\n minutes = absFloor(seconds / 60);\n data.minutes = minutes % 60;\n\n hours = absFloor(minutes / 60);\n data.hours = hours % 24;\n\n days += absFloor(hours / 24);\n\n // convert days to months\n monthsFromDays = absFloor(daysToMonths(days));\n months += monthsFromDays;\n days -= absCeil(monthsToDays(monthsFromDays));\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n data.days = days;\n data.months = months;\n data.years = years;\n\n return this;\n }\n\n function daysToMonths (days) {\n // 400 years have 146097 days (taking into account leap year rules)\n // 400 years have 12 months === 4800\n return days * 4800 / 146097;\n }\n\n function monthsToDays (months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n }\n\n function as (units) {\n if (!this.isValid()) {\n return NaN;\n }\n var days;\n var months;\n var milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === 'month' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n return units === 'month' ? months : months / 12;\n } else {\n // handle milliseconds separately because of floating point math errors (issue #1867)\n days = this._days + Math.round(monthsToDays(this._months));\n switch (units) {\n case 'week' : return days / 7 + milliseconds / 6048e5;\n case 'day' : return days + milliseconds / 864e5;\n case 'hour' : return days * 24 + milliseconds / 36e5;\n case 'minute' : return days * 1440 + milliseconds / 6e4;\n case 'second' : return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n default: throw new Error('Unknown unit ' + units);\n }\n }\n }\n\n// TODO: Use this.as('ms')?\n function valueOf$1 () {\n if (!this.isValid()) {\n return NaN;\n }\n return (\n this._milliseconds +\n this._days * 864e5 +\n (this._months % 12) * 2592e6 +\n toInt(this._months / 12) * 31536e6\n );\n }\n\n function makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n }\n\n var asMilliseconds = makeAs('ms');\n var asSeconds = makeAs('s');\n var asMinutes = makeAs('m');\n var asHours = makeAs('h');\n var asDays = makeAs('d');\n var asWeeks = makeAs('w');\n var asMonths = makeAs('M');\n var asYears = makeAs('y');\n\n function get$2 (units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n }\n\n function makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n }\n\n var milliseconds = makeGetter('milliseconds');\n var seconds = makeGetter('seconds');\n var minutes = makeGetter('minutes');\n var hours = makeGetter('hours');\n var days = makeGetter('days');\n var months = makeGetter('months');\n var years = makeGetter('years');\n\n function weeks () {\n return absFloor(this.days() / 7);\n }\n\n var round = Math.round;\n var thresholds = {\n ss: 44, // a few seconds to seconds\n s : 45, // seconds to minute\n m : 45, // minutes to hour\n h : 22, // hours to day\n d : 26, // days to month\n M : 11 // months to year\n };\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n }\n\n function relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n var duration = createDuration(posNegDuration).abs();\n var seconds = round(duration.as('s'));\n var minutes = round(duration.as('m'));\n var hours = round(duration.as('h'));\n var days = round(duration.as('d'));\n var months = round(duration.as('M'));\n var years = round(duration.as('y'));\n\n var a = seconds <= thresholds.ss && ['s', seconds] ||\n seconds < thresholds.s && ['ss', seconds] ||\n minutes <= 1 && ['m'] ||\n minutes < thresholds.m && ['mm', minutes] ||\n hours <= 1 && ['h'] ||\n hours < thresholds.h && ['hh', hours] ||\n days <= 1 && ['d'] ||\n days < thresholds.d && ['dd', days] ||\n months <= 1 && ['M'] ||\n months < thresholds.M && ['MM', months] ||\n years <= 1 && ['y'] || ['yy', years];\n\n a[2] = withoutSuffix;\n a[3] = +posNegDuration > 0;\n a[4] = locale;\n return substituteTimeAgo.apply(null, a);\n }\n\n// This function allows you to set the rounding function for relative time strings\n function getSetRelativeTimeRounding (roundingFunction) {\n if (roundingFunction === undefined) {\n return round;\n }\n if (typeof(roundingFunction) === 'function') {\n round = roundingFunction;\n return true;\n }\n return false;\n }\n\n// This function allows you to set a threshold for relative time strings\n function getSetRelativeTimeThreshold (threshold, limit) {\n if (thresholds[threshold] === undefined) {\n return false;\n }\n if (limit === undefined) {\n return thresholds[threshold];\n }\n thresholds[threshold] = limit;\n if (threshold === 's') {\n thresholds.ss = limit - 1;\n }\n return true;\n }\n\n function humanize (withSuffix) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var locale = this.localeData();\n var output = relativeTime$1(this, !withSuffix, locale);\n\n if (withSuffix) {\n output = locale.pastFuture(+this, output);\n }\n\n return locale.postformat(output);\n }\n\n var abs$1 = Math.abs;\n\n function toISOString$1() {\n // for ISO strings we do not use the normal bubbling rules:\n // * milliseconds bubble up until they become hours\n // * days do not bubble at all\n // * months bubble up until they become years\n // This is because there is no context-free conversion between hours and days\n // (think of clock changes)\n // and also not between days and months (28-31 days per month)\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var seconds = abs$1(this._milliseconds) / 1000;\n var days = abs$1(this._days);\n var months = abs$1(this._months);\n var minutes, hours, years;\n\n // 3600 seconds -> 60 minutes -> 1 hour\n minutes = absFloor(seconds / 60);\n hours = absFloor(minutes / 60);\n seconds %= 60;\n minutes %= 60;\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n var Y = years;\n var M = months;\n var D = days;\n var h = hours;\n var m = minutes;\n var s = seconds;\n var total = this.asSeconds();\n\n if (!total) {\n // this is the same as C#'s (Noda) and python (isodate)...\n // but not other JS (goog.date)\n return 'P0D';\n }\n\n return (total < 0 ? '-' : '') +\n 'P' +\n (Y ? Y + 'Y' : '') +\n (M ? M + 'M' : '') +\n (D ? D + 'D' : '') +\n ((h || m || s) ? 'T' : '') +\n (h ? h + 'H' : '') +\n (m ? m + 'M' : '') +\n (s ? s + 'S' : '');\n }\n\n var proto$2 = Duration.prototype;\n\n proto$2.isValid = isValid$1;\n proto$2.abs = abs;\n proto$2.add = add$1;\n proto$2.subtract = subtract$1;\n proto$2.as = as;\n proto$2.asMilliseconds = asMilliseconds;\n proto$2.asSeconds = asSeconds;\n proto$2.asMinutes = asMinutes;\n proto$2.asHours = asHours;\n proto$2.asDays = asDays;\n proto$2.asWeeks = asWeeks;\n proto$2.asMonths = asMonths;\n proto$2.asYears = asYears;\n proto$2.valueOf = valueOf$1;\n proto$2._bubble = bubble;\n proto$2.get = get$2;\n proto$2.milliseconds = milliseconds;\n proto$2.seconds = seconds;\n proto$2.minutes = minutes;\n proto$2.hours = hours;\n proto$2.days = days;\n proto$2.weeks = weeks;\n proto$2.months = months;\n proto$2.years = years;\n proto$2.humanize = humanize;\n proto$2.toISOString = toISOString$1;\n proto$2.toString = toISOString$1;\n proto$2.toJSON = toISOString$1;\n proto$2.locale = locale;\n proto$2.localeData = localeData;\n\n// Deprecations\n proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n proto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\n addFormatToken('X', 0, 0, 'unix');\n addFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\n addRegexToken('x', matchSigned);\n addRegexToken('X', matchTimestamp);\n addParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input, 10) * 1000);\n });\n addParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n });\n\n// Side effect imports\n\n\n hooks.version = '2.18.1';\n\n setHookCallback(createLocal);\n\n hooks.fn = proto;\n hooks.min = min;\n hooks.max = max;\n hooks.now = now;\n hooks.utc = createUTC;\n hooks.unix = createUnix;\n hooks.months = listMonths;\n hooks.isDate = isDate;\n hooks.locale = getSetGlobalLocale;\n hooks.invalid = createInvalid;\n hooks.duration = createDuration;\n hooks.isMoment = isMoment;\n hooks.weekdays = listWeekdays;\n hooks.parseZone = createInZone;\n hooks.localeData = getLocale;\n hooks.isDuration = isDuration;\n hooks.monthsShort = listMonthsShort;\n hooks.weekdaysMin = listWeekdaysMin;\n hooks.defineLocale = defineLocale;\n hooks.updateLocale = updateLocale;\n hooks.locales = listLocales;\n hooks.weekdaysShort = listWeekdaysShort;\n hooks.normalizeUnits = normalizeUnits;\n hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n hooks.calendarFormat = getCalendarFormat;\n hooks.prototype = proto;\n\n return hooks;\n\n })));\n\n},{}],7:[function(require,module,exports){\n /**\n * @namespace Chart\n */\n var Chart = require(29)();\n\n Chart.helpers = require(45);\n\n// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\n require(27)(Chart);\n\n Chart.defaults = require(25);\n Chart.Element = require(26);\n Chart.elements = require(40);\n Chart.Interaction = require(28);\n Chart.platform = require(48);\n\n require(31)(Chart);\n require(22)(Chart);\n require(23)(Chart);\n require(24)(Chart);\n require(30)(Chart);\n require(33)(Chart);\n require(32)(Chart);\n require(35)(Chart);\n\n require(54)(Chart);\n require(52)(Chart);\n require(53)(Chart);\n require(55)(Chart);\n require(56)(Chart);\n require(57)(Chart);\n\n// Controllers must be loaded after elements\n// See Chart.core.datasetController.dataElementType\n require(15)(Chart);\n require(16)(Chart);\n require(17)(Chart);\n require(18)(Chart);\n require(19)(Chart);\n require(20)(Chart);\n require(21)(Chart);\n\n require(8)(Chart);\n require(9)(Chart);\n require(10)(Chart);\n require(11)(Chart);\n require(12)(Chart);\n require(13)(Chart);\n require(14)(Chart);\n\n// Loading built-it plugins\n var plugins = [];\n\n plugins.push(\n require(49)(Chart),\n require(50)(Chart),\n require(51)(Chart)\n );\n\n Chart.plugins.register(plugins);\n\n Chart.platform.initialize();\n\n module.exports = Chart;\n if (typeof window !== 'undefined') {\n window.Chart = Chart;\n }\n\n// DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\n * @namespace Chart.canvasHelpers\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n Chart.canvasHelpers = Chart.helpers.canvas;\n\n},{\"10\":10,\"11\":11,\"12\":12,\"13\":13,\"14\":14,\"15\":15,\"16\":16,\"17\":17,\"18\":18,\"19\":19,\"20\":20,\"21\":21,\"22\":22,\"23\":23,\"24\":24,\"25\":25,\"26\":26,\"27\":27,\"28\":28,\"29\":29,\"30\":30,\"31\":31,\"32\":32,\"33\":33,\"35\":35,\"40\":40,\"45\":45,\"48\":48,\"49\":49,\"50\":50,\"51\":51,\"52\":52,\"53\":53,\"54\":54,\"55\":55,\"56\":56,\"57\":57,\"8\":8,\"9\":9}],8:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Bar = function(context, config) {\n config.type = 'bar';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],9:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Bubble = function(context, config) {\n config.type = 'bubble';\n return new Chart(context, config);\n };\n\n };\n\n},{}],10:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Doughnut = function(context, config) {\n config.type = 'doughnut';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],11:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Line = function(context, config) {\n config.type = 'line';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],12:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.PolarArea = function(context, config) {\n config.type = 'polarArea';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],13:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Radar = function(context, config) {\n config.type = 'radar';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],14:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n Chart.Scatter = function(context, config) {\n config.type = 'scatter';\n return new Chart(context, config);\n };\n };\n\n},{}],15:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('bar', {\n hover: {\n mode: 'label'\n },\n\n scales: {\n xAxes: [{\n type: 'category',\n\n // Specific to Bar Controller\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n\n // offset settings\n offset: true,\n\n // grid line settings\n gridLines: {\n offsetGridLines: true\n }\n }],\n\n yAxes: [{\n type: 'linear'\n }]\n }\n });\n\n defaults._set('horizontalBar', {\n hover: {\n mode: 'index',\n axis: 'y'\n },\n\n scales: {\n xAxes: [{\n type: 'linear',\n position: 'bottom'\n }],\n\n yAxes: [{\n position: 'left',\n type: 'category',\n\n // Specific to Horizontal Bar Controller\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n\n // offset settings\n offset: true,\n\n // grid line settings\n gridLines: {\n offsetGridLines: true\n }\n }]\n },\n\n elements: {\n rectangle: {\n borderSkipped: 'left'\n }\n },\n\n tooltips: {\n callbacks: {\n title: function(item, data) {\n // Pick first xLabel for now\n var title = '';\n\n if (item.length > 0) {\n if (item[0].yLabel) {\n title = item[0].yLabel;\n } else if (data.labels.length > 0 && item[0].index < data.labels.length) {\n title = data.labels[item[0].index];\n }\n }\n\n return title;\n },\n\n label: function(item, data) {\n var datasetLabel = data.datasets[item.datasetIndex].label || '';\n return datasetLabel + ': ' + item.xLabel;\n }\n },\n mode: 'index',\n axis: 'y'\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.bar = Chart.DatasetController.extend({\n\n dataElementType: elements.Rectangle,\n\n initialize: function() {\n var me = this;\n var meta;\n\n Chart.DatasetController.prototype.initialize.apply(me, arguments);\n\n meta = me.getMeta();\n meta.stack = me.getDataset().stack;\n meta.bar = true;\n },\n\n update: function(reset) {\n var me = this;\n var rects = me.getMeta().data;\n var i, ilen;\n\n me._ruler = me.getRuler();\n\n for (i = 0, ilen = rects.length; i < ilen; ++i) {\n me.updateElement(rects[i], i, reset);\n }\n },\n\n updateElement: function(rectangle, index, reset) {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var dataset = me.getDataset();\n var custom = rectangle.custom || {};\n var rectangleOptions = chart.options.elements.rectangle;\n\n rectangle._xScale = me.getScaleForId(meta.xAxisID);\n rectangle._yScale = me.getScaleForId(meta.yAxisID);\n rectangle._datasetIndex = me.index;\n rectangle._index = index;\n\n rectangle._model = {\n datasetLabel: dataset.label,\n label: chart.data.labels[index],\n borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped,\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor),\n borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth)\n };\n\n me.updateElementGeometry(rectangle, index, reset);\n\n rectangle.pivot();\n },\n\n /**\n * @private\n */\n updateElementGeometry: function(rectangle, index, reset) {\n var me = this;\n var model = rectangle._model;\n var vscale = me.getValueScale();\n var base = vscale.getBasePixel();\n var horizontal = vscale.isHorizontal();\n var ruler = me._ruler || me.getRuler();\n var vpixels = me.calculateBarValuePixels(me.index, index);\n var ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n\n model.horizontal = horizontal;\n model.base = reset ? base : vpixels.base;\n model.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n model.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n model.height = horizontal ? ipixels.size : undefined;\n model.width = horizontal ? undefined : ipixels.size;\n },\n\n /**\n * @private\n */\n getValueScaleId: function() {\n return this.getMeta().yAxisID;\n },\n\n /**\n * @private\n */\n getIndexScaleId: function() {\n return this.getMeta().xAxisID;\n },\n\n /**\n * @private\n */\n getValueScale: function() {\n return this.getScaleForId(this.getValueScaleId());\n },\n\n /**\n * @private\n */\n getIndexScale: function() {\n return this.getScaleForId(this.getIndexScaleId());\n },\n\n /**\n * Returns the effective number of stacks based on groups and bar visibility.\n * @private\n */\n getStackCount: function(last) {\n var me = this;\n var chart = me.chart;\n var scale = me.getIndexScale();\n var stacked = scale.options.stacked;\n var ilen = last === undefined ? chart.data.datasets.length : last + 1;\n var stacks = [];\n var i, meta;\n\n for (i = 0; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n if (meta.bar && chart.isDatasetVisible(i) &&\n (stacked === false ||\n (stacked === true && stacks.indexOf(meta.stack) === -1) ||\n (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {\n stacks.push(meta.stack);\n }\n }\n\n return stacks.length;\n },\n\n /**\n * Returns the stack index for the given dataset based on groups and bar visibility.\n * @private\n */\n getStackIndex: function(datasetIndex) {\n return this.getStackCount(datasetIndex) - 1;\n },\n\n /**\n * @private\n */\n getRuler: function() {\n var me = this;\n var scale = me.getIndexScale();\n var stackCount = me.getStackCount();\n var datasetIndex = me.index;\n var pixels = [];\n var isHorizontal = scale.isHorizontal();\n var start = isHorizontal ? scale.left : scale.top;\n var end = start + (isHorizontal ? scale.width : scale.height);\n var i, ilen;\n\n for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n pixels.push(scale.getPixelForValue(null, i, datasetIndex));\n }\n\n return {\n pixels: pixels,\n start: start,\n end: end,\n stackCount: stackCount,\n scale: scale\n };\n },\n\n /**\n * Note: pixel values are not clamped to the scale area.\n * @private\n */\n calculateBarValuePixels: function(datasetIndex, index) {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var scale = me.getValueScale();\n var datasets = chart.data.datasets;\n var value = scale.getRightValue(datasets[datasetIndex].data[index]);\n var stacked = scale.options.stacked;\n var stack = meta.stack;\n var start = 0;\n var i, imeta, ivalue, base, head, size;\n\n if (stacked || (stacked === undefined && stack !== undefined)) {\n for (i = 0; i < datasetIndex; ++i) {\n imeta = chart.getDatasetMeta(i);\n\n if (imeta.bar &&\n imeta.stack === stack &&\n imeta.controller.getValueScaleId() === scale.id &&\n chart.isDatasetVisible(i)) {\n\n ivalue = scale.getRightValue(datasets[i].data[index]);\n if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {\n start += ivalue;\n }\n }\n }\n }\n\n base = scale.getPixelForValue(start);\n head = scale.getPixelForValue(start + value);\n size = (head - base) / 2;\n\n return {\n size: size,\n base: base,\n head: head,\n center: head + size / 2\n };\n },\n\n /**\n * @private\n */\n calculateBarIndexPixels: function(datasetIndex, index, ruler) {\n var me = this;\n var options = ruler.scale.options;\n var stackIndex = me.getStackIndex(datasetIndex);\n var pixels = ruler.pixels;\n var base = pixels[index];\n var length = pixels.length;\n var start = ruler.start;\n var end = ruler.end;\n var leftSampleSize, rightSampleSize, leftCategorySize, rightCategorySize, fullBarSize, size;\n\n if (length === 1) {\n leftSampleSize = base > start ? base - start : end - base;\n rightSampleSize = base < end ? end - base : base - start;\n } else {\n if (index > 0) {\n leftSampleSize = (base - pixels[index - 1]) / 2;\n if (index === length - 1) {\n rightSampleSize = leftSampleSize;\n }\n }\n if (index < length - 1) {\n rightSampleSize = (pixels[index + 1] - base) / 2;\n if (index === 0) {\n leftSampleSize = rightSampleSize;\n }\n }\n }\n\n leftCategorySize = leftSampleSize * options.categoryPercentage;\n rightCategorySize = rightSampleSize * options.categoryPercentage;\n fullBarSize = (leftCategorySize + rightCategorySize) / ruler.stackCount;\n size = fullBarSize * options.barPercentage;\n\n size = Math.min(\n helpers.valueOrDefault(options.barThickness, size),\n helpers.valueOrDefault(options.maxBarThickness, Infinity));\n\n base -= leftCategorySize;\n base += fullBarSize * stackIndex;\n base += (fullBarSize - size) / 2;\n\n return {\n size: size,\n base: base,\n head: base + size,\n center: base + size / 2\n };\n },\n\n draw: function() {\n var me = this;\n var chart = me.chart;\n var scale = me.getValueScale();\n var rects = me.getMeta().data;\n var dataset = me.getDataset();\n var ilen = rects.length;\n var i = 0;\n\n helpers.canvas.clipArea(chart.ctx, chart.chartArea);\n\n for (; i < ilen; ++i) {\n if (!isNaN(scale.getRightValue(dataset.data[i]))) {\n rects[i].draw();\n }\n }\n\n helpers.canvas.unclipArea(chart.ctx);\n },\n\n setHoverStyle: function(rectangle) {\n var dataset = this.chart.data.datasets[rectangle._datasetIndex];\n var index = rectangle._index;\n var custom = rectangle.custom || {};\n var model = rectangle._model;\n\n model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n },\n\n removeHoverStyle: function(rectangle) {\n var dataset = this.chart.data.datasets[rectangle._datasetIndex];\n var index = rectangle._index;\n var custom = rectangle.custom || {};\n var model = rectangle._model;\n var rectangleElementOptions = this.chart.options.elements.rectangle;\n\n model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor);\n model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor);\n model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth);\n }\n });\n\n Chart.controllers.horizontalBar = Chart.controllers.bar.extend({\n /**\n * @private\n */\n getValueScaleId: function() {\n return this.getMeta().xAxisID;\n },\n\n /**\n * @private\n */\n getIndexScaleId: function() {\n return this.getMeta().yAxisID;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],16:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('bubble', {\n hover: {\n mode: 'single'\n },\n\n scales: {\n xAxes: [{\n type: 'linear', // bubble should probably use a linear scale by default\n position: 'bottom',\n id: 'x-axis-0' // need an ID so datasets can reference the scale\n }],\n yAxes: [{\n type: 'linear',\n position: 'left',\n id: 'y-axis-0'\n }]\n },\n\n tooltips: {\n callbacks: {\n title: function() {\n // Title doesn't make sense for scatter since we format the data as a point\n return '';\n },\n label: function(item, data) {\n var datasetLabel = data.datasets[item.datasetIndex].label || '';\n var dataPoint = data.datasets[item.datasetIndex].data[item.index];\n return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n }\n }\n }\n });\n\n\n module.exports = function(Chart) {\n\n Chart.controllers.bubble = Chart.DatasetController.extend({\n /**\n * @protected\n */\n dataElementType: elements.Point,\n\n /**\n * @protected\n */\n update: function(reset) {\n var me = this;\n var meta = me.getMeta();\n var points = meta.data;\n\n // Update Points\n helpers.each(points, function(point, index) {\n me.updateElement(point, index, reset);\n });\n },\n\n /**\n * @protected\n */\n updateElement: function(point, index, reset) {\n var me = this;\n var meta = me.getMeta();\n var custom = point.custom || {};\n var xScale = me.getScaleForId(meta.xAxisID);\n var yScale = me.getScaleForId(meta.yAxisID);\n var options = me._resolveElementOptions(point, index);\n var data = me.getDataset().data[index];\n var dsIndex = me.index;\n\n var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);\n var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n\n point._xScale = xScale;\n point._yScale = yScale;\n point._options = options;\n point._datasetIndex = dsIndex;\n point._index = index;\n point._model = {\n backgroundColor: options.backgroundColor,\n borderColor: options.borderColor,\n borderWidth: options.borderWidth,\n hitRadius: options.hitRadius,\n pointStyle: options.pointStyle,\n radius: reset ? 0 : options.radius,\n skip: custom.skip || isNaN(x) || isNaN(y),\n x: x,\n y: y,\n };\n\n point.pivot();\n },\n\n /**\n * @protected\n */\n setHoverStyle: function(point) {\n var model = point._model;\n var options = point._options;\n\n model.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor));\n model.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor));\n model.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n model.radius = options.radius + options.hoverRadius;\n },\n\n /**\n * @protected\n */\n removeHoverStyle: function(point) {\n var model = point._model;\n var options = point._options;\n\n model.backgroundColor = options.backgroundColor;\n model.borderColor = options.borderColor;\n model.borderWidth = options.borderWidth;\n model.radius = options.radius;\n },\n\n /**\n * @private\n */\n _resolveElementOptions: function(point, index) {\n var me = this;\n var chart = me.chart;\n var datasets = chart.data.datasets;\n var dataset = datasets[me.index];\n var custom = point.custom || {};\n var options = chart.options.elements.point;\n var resolve = helpers.options.resolve;\n var data = dataset.data[index];\n var values = {};\n var i, ilen, key;\n\n // Scriptable options\n var context = {\n chart: chart,\n dataIndex: index,\n dataset: dataset,\n datasetIndex: me.index\n };\n\n var keys = [\n 'backgroundColor',\n 'borderColor',\n 'borderWidth',\n 'hoverBackgroundColor',\n 'hoverBorderColor',\n 'hoverBorderWidth',\n 'hoverRadius',\n 'hitRadius',\n 'pointStyle'\n ];\n\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n values[key] = resolve([\n custom[key],\n dataset[key],\n options[key]\n ], context, index);\n }\n\n // Custom radius resolution\n values.radius = resolve([\n custom.radius,\n data ? data.r : undefined,\n dataset.radius,\n options.radius\n ], context, index);\n\n return values;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],17:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('doughnut', {\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n hover: {\n mode: 'single'\n },\n legendCallback: function(chart) {\n var text = [];\n text.push('
            ');\n\n var data = chart.data;\n var datasets = data.datasets;\n var labels = data.labels;\n\n if (datasets.length) {\n for (var i = 0; i < datasets[0].data.length; ++i) {\n text.push('
          • ');\n if (labels[i]) {\n text.push(labels[i]);\n }\n text.push('
          • ');\n }\n }\n\n text.push('
          ');\n return text.join('');\n },\n legend: {\n labels: {\n generateLabels: function(chart) {\n var data = chart.data;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map(function(label, i) {\n var meta = chart.getDatasetMeta(0);\n var ds = data.datasets[0];\n var arc = meta.data[i];\n var custom = arc && arc.custom || {};\n var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n var arcOpts = chart.options.elements.arc;\n var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n return {\n text: label,\n fillStyle: fill,\n strokeStyle: stroke,\n lineWidth: bw,\n hidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick: function(e, legendItem) {\n var index = legendItem.index;\n var chart = this.chart;\n var i, ilen, meta;\n\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n // toggle visibility of index if exists\n if (meta.data[index]) {\n meta.data[index].hidden = !meta.data[index].hidden;\n }\n }\n\n chart.update();\n }\n },\n\n // The percentage of the chart that we cut out of the middle.\n cutoutPercentage: 50,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: Math.PI * -0.5,\n\n // The total circumference of the chart.\n circumference: Math.PI * 2.0,\n\n // Need to override these to give a nice default\n tooltips: {\n callbacks: {\n title: function() {\n return '';\n },\n label: function(tooltipItem, data) {\n var dataLabel = data.labels[tooltipItem.index];\n var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n if (helpers.isArray(dataLabel)) {\n // show value on first line of multiline label\n // need to clone because we are changing the value\n dataLabel = dataLabel.slice();\n dataLabel[0] += value;\n } else {\n dataLabel += value;\n }\n\n return dataLabel;\n }\n }\n }\n });\n\n defaults._set('pie', helpers.clone(defaults.doughnut));\n defaults._set('pie', {\n cutoutPercentage: 0\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n dataElementType: elements.Arc,\n\n linkScales: helpers.noop,\n\n // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n getRingIndex: function(datasetIndex) {\n var ringIndex = 0;\n\n for (var j = 0; j < datasetIndex; ++j) {\n if (this.chart.isDatasetVisible(j)) {\n ++ringIndex;\n }\n }\n\n return ringIndex;\n },\n\n update: function(reset) {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var opts = chart.options;\n var arcOpts = opts.elements.arc;\n var availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth;\n var availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth;\n var minSize = Math.min(availableWidth, availableHeight);\n var offset = {x: 0, y: 0};\n var meta = me.getMeta();\n var cutoutPercentage = opts.cutoutPercentage;\n var circumference = opts.circumference;\n\n // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n if (circumference < Math.PI * 2.0) {\n var startAngle = opts.rotation % (Math.PI * 2.0);\n startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n var endAngle = startAngle + circumference;\n var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};\n var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};\n var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);\n var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);\n var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);\n var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);\n var cutout = cutoutPercentage / 100.0;\n var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};\n var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};\n var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};\n minSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};\n }\n\n chart.borderWidth = me.getMaxBorderWidth(meta.data);\n chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);\n chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n chart.offsetX = offset.x * chart.outerRadius;\n chart.offsetY = offset.y * chart.outerRadius;\n\n meta.total = me.calculateTotal();\n\n me.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\n me.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n helpers.each(meta.data, function(arc, index) {\n me.updateElement(arc, index, reset);\n });\n },\n\n updateElement: function(arc, index, reset) {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var opts = chart.options;\n var animationOpts = opts.animation;\n var centerX = (chartArea.left + chartArea.right) / 2;\n var centerY = (chartArea.top + chartArea.bottom) / 2;\n var startAngle = opts.rotation; // non reset case handled later\n var endAngle = opts.rotation; // non reset case handled later\n var dataset = me.getDataset();\n var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));\n var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n helpers.extend(arc, {\n // Utility\n _datasetIndex: me.index,\n _index: index,\n\n // Desired view properties\n _model: {\n x: centerX + chart.offsetX,\n y: centerY + chart.offsetY,\n startAngle: startAngle,\n endAngle: endAngle,\n circumference: circumference,\n outerRadius: outerRadius,\n innerRadius: innerRadius,\n label: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n }\n });\n\n var model = arc._model;\n // Resets the visual styles\n this.removeHoverStyle(arc);\n\n // Set correct angles if not resetting\n if (!reset || !animationOpts.animateRotate) {\n if (index === 0) {\n model.startAngle = opts.rotation;\n } else {\n model.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n }\n\n model.endAngle = model.startAngle + model.circumference;\n }\n\n arc.pivot();\n },\n\n removeHoverStyle: function(arc) {\n Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n },\n\n calculateTotal: function() {\n var dataset = this.getDataset();\n var meta = this.getMeta();\n var total = 0;\n var value;\n\n helpers.each(meta.data, function(element, index) {\n value = dataset.data[index];\n if (!isNaN(value) && !element.hidden) {\n total += Math.abs(value);\n }\n });\n\n\t\t\t\t/* if (total === 0) {\n\t\t\t\t total = NaN;\n\t\t\t\t }*/\n\n return total;\n },\n\n calculateCircumference: function(value) {\n var total = this.getMeta().total;\n if (total > 0 && !isNaN(value)) {\n return (Math.PI * 2.0) * (value / total);\n }\n return 0;\n },\n\n // gets the max border or hover width to properly scale pie charts\n getMaxBorderWidth: function(arcs) {\n var max = 0;\n var index = this.index;\n var length = arcs.length;\n var borderWidth;\n var hoverWidth;\n\n for (var i = 0; i < length; i++) {\n borderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0;\n hoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n max = borderWidth > max ? borderWidth : max;\n max = hoverWidth > max ? hoverWidth : max;\n }\n return max;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],18:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('line', {\n showLines: true,\n spanGaps: false,\n\n hover: {\n mode: 'label'\n },\n\n scales: {\n xAxes: [{\n type: 'category',\n id: 'x-axis-0'\n }],\n yAxes: [{\n type: 'linear',\n id: 'y-axis-0'\n }]\n }\n });\n\n module.exports = function(Chart) {\n\n function lineEnabled(dataset, options) {\n return helpers.valueOrDefault(dataset.showLine, options.showLines);\n }\n\n Chart.controllers.line = Chart.DatasetController.extend({\n\n datasetElementType: elements.Line,\n\n dataElementType: elements.Point,\n\n update: function(reset) {\n var me = this;\n var meta = me.getMeta();\n var line = meta.dataset;\n var points = meta.data || [];\n var options = me.chart.options;\n var lineElementOptions = options.elements.line;\n var scale = me.getScaleForId(meta.yAxisID);\n var i, ilen, custom;\n var dataset = me.getDataset();\n var showLine = lineEnabled(dataset, options);\n\n // Update Line\n if (showLine) {\n custom = line.custom || {};\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n dataset.lineTension = dataset.tension;\n }\n\n // Utility\n line._scale = scale;\n line._datasetIndex = me.index;\n // Data\n line._children = points;\n // Model\n line._model = {\n // Appearance\n // The default behavior of lines is to break at null values, according\n // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n // This option gives lines the ability to span gaps\n spanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n steppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n cubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode),\n };\n\n line.pivot();\n }\n\n // Update Points\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n me.updateElement(points[i], i, reset);\n }\n\n if (showLine && line._model.tension !== 0) {\n me.updateBezierControlPoints();\n }\n\n // Now pivot the point for animation\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n points[i].pivot();\n }\n },\n\n getPointBackgroundColor: function(point, index) {\n var backgroundColor = this.chart.options.elements.point.backgroundColor;\n var dataset = this.getDataset();\n var custom = point.custom || {};\n\n if (custom.backgroundColor) {\n backgroundColor = custom.backgroundColor;\n } else if (dataset.pointBackgroundColor) {\n backgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n } else if (dataset.backgroundColor) {\n backgroundColor = dataset.backgroundColor;\n }\n\n return backgroundColor;\n },\n\n getPointBorderColor: function(point, index) {\n var borderColor = this.chart.options.elements.point.borderColor;\n var dataset = this.getDataset();\n var custom = point.custom || {};\n\n if (custom.borderColor) {\n borderColor = custom.borderColor;\n } else if (dataset.pointBorderColor) {\n borderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n } else if (dataset.borderColor) {\n borderColor = dataset.borderColor;\n }\n\n return borderColor;\n },\n\n getPointBorderWidth: function(point, index) {\n var borderWidth = this.chart.options.elements.point.borderWidth;\n var dataset = this.getDataset();\n var custom = point.custom || {};\n\n if (!isNaN(custom.borderWidth)) {\n borderWidth = custom.borderWidth;\n } else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) {\n borderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n } else if (!isNaN(dataset.borderWidth)) {\n borderWidth = dataset.borderWidth;\n }\n\n return borderWidth;\n },\n\n updateElement: function(point, index, reset) {\n var me = this;\n var meta = me.getMeta();\n var custom = point.custom || {};\n var dataset = me.getDataset();\n var datasetIndex = me.index;\n var value = dataset.data[index];\n var yScale = me.getScaleForId(meta.yAxisID);\n var xScale = me.getScaleForId(meta.xAxisID);\n var pointOptions = me.chart.options.elements.point;\n var x, y;\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n dataset.pointRadius = dataset.radius;\n }\n if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n dataset.pointHitRadius = dataset.hitRadius;\n }\n\n x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);\n y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n // Utility\n point._xScale = xScale;\n point._yScale = yScale;\n point._datasetIndex = datasetIndex;\n point._index = index;\n\n // Desired view properties\n point._model = {\n x: x,\n y: y,\n skip: custom.skip || isNaN(x) || isNaN(y),\n // Appearance\n radius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n pointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n backgroundColor: me.getPointBackgroundColor(point, index),\n borderColor: me.getPointBorderColor(point, index),\n borderWidth: me.getPointBorderWidth(point, index),\n tension: meta.dataset._model ? meta.dataset._model.tension : 0,\n steppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n // Tooltip\n hitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n };\n },\n\n calculatePointY: function(value, index, datasetIndex) {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var yScale = me.getScaleForId(meta.yAxisID);\n var sumPos = 0;\n var sumNeg = 0;\n var i, ds, dsMeta;\n\n if (yScale.options.stacked) {\n for (i = 0; i < datasetIndex; i++) {\n ds = chart.data.datasets[i];\n dsMeta = chart.getDatasetMeta(i);\n if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n var stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n if (stackedRightValue < 0) {\n sumNeg += stackedRightValue || 0;\n } else {\n sumPos += stackedRightValue || 0;\n }\n }\n }\n\n var rightValue = Number(yScale.getRightValue(value));\n if (rightValue < 0) {\n return yScale.getPixelForValue(sumNeg + rightValue);\n }\n return yScale.getPixelForValue(sumPos + rightValue);\n }\n\n return yScale.getPixelForValue(value);\n },\n\n updateBezierControlPoints: function() {\n var me = this;\n var meta = me.getMeta();\n var area = me.chart.chartArea;\n var points = (meta.data || []);\n var i, ilen, point, model, controlPoints;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (meta.dataset._model.spanGaps) {\n points = points.filter(function(pt) {\n return !pt._model.skip;\n });\n }\n\n function capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n }\n\n if (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n helpers.splineCurveMonotone(points);\n } else {\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n model = point._model;\n controlPoints = helpers.splineCurve(\n helpers.previousItem(points, i)._model,\n model,\n helpers.nextItem(points, i)._model,\n meta.dataset._model.tension\n );\n model.controlPointPreviousX = controlPoints.previous.x;\n model.controlPointPreviousY = controlPoints.previous.y;\n model.controlPointNextX = controlPoints.next.x;\n model.controlPointNextY = controlPoints.next.y;\n }\n }\n\n if (me.chart.options.elements.line.capBezierPoints) {\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n model = points[i]._model;\n model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n }\n }\n },\n\n draw: function() {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var points = meta.data || [];\n var area = chart.chartArea;\n var ilen = points.length;\n var i = 0;\n\n helpers.canvas.clipArea(chart.ctx, area);\n\n if (lineEnabled(me.getDataset(), chart.options)) {\n meta.dataset.draw();\n }\n\n helpers.canvas.unclipArea(chart.ctx);\n\n // Draw the points\n for (; i < ilen; ++i) {\n points[i].draw(area);\n }\n },\n\n setHoverStyle: function(point) {\n // Point\n var dataset = this.chart.data.datasets[point._datasetIndex];\n var index = point._index;\n var custom = point.custom || {};\n var model = point._model;\n\n model.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n model.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n },\n\n removeHoverStyle: function(point) {\n var me = this;\n var dataset = me.chart.data.datasets[point._datasetIndex];\n var index = point._index;\n var custom = point.custom || {};\n var model = point._model;\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n dataset.pointRadius = dataset.radius;\n }\n\n model.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius);\n model.backgroundColor = me.getPointBackgroundColor(point, index);\n model.borderColor = me.getPointBorderColor(point, index);\n model.borderWidth = me.getPointBorderWidth(point, index);\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],19:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('polarArea', {\n scale: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n gridLines: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n ticks: {\n beginAtZero: true\n }\n },\n\n // Boolean - Whether to animate the rotation of the chart\n animation: {\n animateRotate: true,\n animateScale: true\n },\n\n startAngle: -0.5 * Math.PI,\n legendCallback: function(chart) {\n var text = [];\n text.push('
            ');\n\n var data = chart.data;\n var datasets = data.datasets;\n var labels = data.labels;\n\n if (datasets.length) {\n for (var i = 0; i < datasets[0].data.length; ++i) {\n text.push('
          • ');\n if (labels[i]) {\n text.push(labels[i]);\n }\n text.push('
          • ');\n }\n }\n\n text.push('
          ');\n return text.join('');\n },\n legend: {\n labels: {\n generateLabels: function(chart) {\n var data = chart.data;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map(function(label, i) {\n var meta = chart.getDatasetMeta(0);\n var ds = data.datasets[0];\n var arc = meta.data[i];\n var custom = arc.custom || {};\n var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n var arcOpts = chart.options.elements.arc;\n var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n return {\n text: label,\n fillStyle: fill,\n strokeStyle: stroke,\n lineWidth: bw,\n hidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick: function(e, legendItem) {\n var index = legendItem.index;\n var chart = this.chart;\n var i, ilen, meta;\n\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n meta.data[index].hidden = !meta.data[index].hidden;\n }\n\n chart.update();\n }\n },\n\n // Need to override these to give a nice default\n tooltips: {\n callbacks: {\n title: function() {\n return '';\n },\n label: function(item, data) {\n return data.labels[item.index] + ': ' + item.yLabel;\n }\n }\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.polarArea = Chart.DatasetController.extend({\n\n dataElementType: elements.Arc,\n\n linkScales: helpers.noop,\n\n update: function(reset) {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var meta = me.getMeta();\n var opts = chart.options;\n var arcOpts = opts.elements.arc;\n var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n chart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n me.innerRadius = me.outerRadius - chart.radiusLength;\n\n meta.count = me.countVisibleElements();\n\n helpers.each(meta.data, function(arc, index) {\n me.updateElement(arc, index, reset);\n });\n },\n\n updateElement: function(arc, index, reset) {\n var me = this;\n var chart = me.chart;\n var dataset = me.getDataset();\n var opts = chart.options;\n var animationOpts = opts.animation;\n var scale = chart.scale;\n var labels = chart.data.labels;\n\n var circumference = me.calculateCircumference(dataset.data[index]);\n var centerX = scale.xCenter;\n var centerY = scale.yCenter;\n\n // If there is NaN data before us, we need to calculate the starting angle correctly.\n // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\n var visibleCount = 0;\n var meta = me.getMeta();\n for (var i = 0; i < index; ++i) {\n if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\n ++visibleCount;\n }\n }\n\n // var negHalfPI = -0.5 * Math.PI;\n var datasetStartAngle = opts.startAngle;\n var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n var startAngle = datasetStartAngle + (circumference * visibleCount);\n var endAngle = startAngle + (arc.hidden ? 0 : circumference);\n\n var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n helpers.extend(arc, {\n // Utility\n _datasetIndex: me.index,\n _index: index,\n _scale: scale,\n\n // Desired view properties\n _model: {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius: reset ? resetRadius : distance,\n startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n label: helpers.valueAtIndexOrDefault(labels, index, labels[index])\n }\n });\n\n // Apply border and fill style\n me.removeHoverStyle(arc);\n\n arc.pivot();\n },\n\n removeHoverStyle: function(arc) {\n Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n },\n\n countVisibleElements: function() {\n var dataset = this.getDataset();\n var meta = this.getMeta();\n var count = 0;\n\n helpers.each(meta.data, function(element, index) {\n if (!isNaN(dataset.data[index]) && !element.hidden) {\n count++;\n }\n });\n\n return count;\n },\n\n calculateCircumference: function(value) {\n var count = this.getMeta().count;\n if (count > 0 && !isNaN(value)) {\n return (2 * Math.PI) / count;\n }\n return 0;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],20:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('radar', {\n scale: {\n type: 'radialLinear'\n },\n elements: {\n line: {\n tension: 0 // no bezier in radar\n }\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.radar = Chart.DatasetController.extend({\n\n datasetElementType: elements.Line,\n\n dataElementType: elements.Point,\n\n linkScales: helpers.noop,\n\n update: function(reset) {\n var me = this;\n var meta = me.getMeta();\n var line = meta.dataset;\n var points = meta.data;\n var custom = line.custom || {};\n var dataset = me.getDataset();\n var lineElementOptions = me.chart.options.elements.line;\n var scale = me.chart.scale;\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n dataset.lineTension = dataset.tension;\n }\n\n helpers.extend(meta.dataset, {\n // Utility\n _datasetIndex: me.index,\n _scale: scale,\n // Data\n _children: points,\n _loop: true,\n // Model\n _model: {\n // Appearance\n tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n }\n });\n\n meta.dataset.pivot();\n\n // Update Points\n helpers.each(points, function(point, index) {\n me.updateElement(point, index, reset);\n }, me);\n\n // Update bezier control points\n me.updateBezierControlPoints();\n },\n updateElement: function(point, index, reset) {\n var me = this;\n var custom = point.custom || {};\n var dataset = me.getDataset();\n var scale = me.chart.scale;\n var pointElementOptions = me.chart.options.elements.point;\n var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n dataset.pointRadius = dataset.radius;\n }\n if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n dataset.pointHitRadius = dataset.hitRadius;\n }\n\n helpers.extend(point, {\n // Utility\n _datasetIndex: me.index,\n _index: index,\n _scale: scale,\n\n // Desired view properties\n _model: {\n x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n y: reset ? scale.yCenter : pointPosition.y,\n\n // Appearance\n tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n radius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n pointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\n // Tooltip\n hitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius)\n }\n });\n\n point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));\n },\n updateBezierControlPoints: function() {\n var chartArea = this.chart.chartArea;\n var meta = this.getMeta();\n\n helpers.each(meta.data, function(point, index) {\n var model = point._model;\n var controlPoints = helpers.splineCurve(\n helpers.previousItem(meta.data, index, true)._model,\n model,\n helpers.nextItem(meta.data, index, true)._model,\n model.tension\n );\n\n // Prevent the bezier going outside of the bounds of the graph\n model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n // Now pivot the point for animation\n point.pivot();\n });\n },\n\n setHoverStyle: function(point) {\n // Point\n var dataset = this.chart.data.datasets[point._datasetIndex];\n var custom = point.custom || {};\n var index = point._index;\n var model = point._model;\n\n model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n },\n\n removeHoverStyle: function(point) {\n var dataset = this.chart.data.datasets[point._datasetIndex];\n var custom = point.custom || {};\n var index = point._index;\n var model = point._model;\n var pointElementOptions = this.chart.options.elements.point;\n\n model.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius);\n model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);\n model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);\n model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],21:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n\n defaults._set('scatter', {\n hover: {\n mode: 'single'\n },\n\n scales: {\n xAxes: [{\n id: 'x-axis-1', // need an ID so datasets can reference the scale\n type: 'linear', // scatter should not use a category axis\n position: 'bottom'\n }],\n yAxes: [{\n id: 'y-axis-1',\n type: 'linear',\n position: 'left'\n }]\n },\n\n showLines: false,\n\n tooltips: {\n callbacks: {\n title: function() {\n return ''; // doesn't make sense for scatter since data are formatted as a point\n },\n label: function(item) {\n return '(' + item.xLabel + ', ' + item.yLabel + ')';\n }\n }\n }\n });\n\n module.exports = function(Chart) {\n\n // Scatter charts use line controllers\n Chart.controllers.scatter = Chart.controllers.line;\n\n };\n\n},{\"25\":25}],22:[function(require,module,exports){\n\t/* global window: false */\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n animation: {\n duration: 1000,\n easing: 'easeOutQuart',\n onProgress: helpers.noop,\n onComplete: helpers.noop\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.Animation = Element.extend({\n chart: null, // the animation associated chart instance\n currentStep: 0, // the current animation step\n numSteps: 60, // default number of steps\n easing: '', // the easing to use for this animation\n render: null, // render function used by the animation service\n\n onAnimationProgress: null, // user specified callback to fire on each step of the animation\n onAnimationComplete: null, // user specified callback to fire when the animation finishes\n });\n\n Chart.animationService = {\n frameDuration: 17,\n animations: [],\n dropFrames: 0,\n request: null,\n\n /**\n * @param {Chart} chart - The chart to animate.\n * @param {Chart.Animation} animation - The animation that we will animate.\n * @param {Number} duration - The animation duration in ms.\n * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n */\n addAnimation: function(chart, animation, duration, lazy) {\n var animations = this.animations;\n var i, ilen;\n\n animation.chart = chart;\n\n if (!lazy) {\n chart.animating = true;\n }\n\n for (i = 0, ilen = animations.length; i < ilen; ++i) {\n if (animations[i].chart === chart) {\n animations[i] = animation;\n return;\n }\n }\n\n animations.push(animation);\n\n // If there are no animations queued, manually kickstart a digest, for lack of a better word\n if (animations.length === 1) {\n this.requestAnimationFrame();\n }\n },\n\n cancelAnimation: function(chart) {\n var index = helpers.findIndex(this.animations, function(animation) {\n return animation.chart === chart;\n });\n\n if (index !== -1) {\n this.animations.splice(index, 1);\n chart.animating = false;\n }\n },\n\n requestAnimationFrame: function() {\n var me = this;\n if (me.request === null) {\n // Skip animation frame requests until the active one is executed.\n // This can happen when processing mouse events, e.g. 'mousemove'\n // and 'mouseout' events will trigger multiple renders.\n me.request = helpers.requestAnimFrame.call(window, function() {\n me.request = null;\n me.startDigest();\n });\n }\n },\n\n /**\n * @private\n */\n startDigest: function() {\n var me = this;\n var startTime = Date.now();\n var framesToDrop = 0;\n\n if (me.dropFrames > 1) {\n framesToDrop = Math.floor(me.dropFrames);\n me.dropFrames = me.dropFrames % 1;\n }\n\n me.advance(1 + framesToDrop);\n\n var endTime = Date.now();\n\n me.dropFrames += (endTime - startTime) / me.frameDuration;\n\n // Do we have more stuff to animate?\n if (me.animations.length > 0) {\n me.requestAnimationFrame();\n }\n },\n\n /**\n * @private\n */\n advance: function(count) {\n var animations = this.animations;\n var animation, chart;\n var i = 0;\n\n while (i < animations.length) {\n animation = animations[i];\n chart = animation.chart;\n\n animation.currentStep = (animation.currentStep || 0) + count;\n animation.currentStep = Math.min(animation.currentStep, animation.numSteps);\n\n helpers.callback(animation.render, [chart, animation], chart);\n helpers.callback(animation.onAnimationProgress, [animation], chart);\n\n if (animation.currentStep >= animation.numSteps) {\n helpers.callback(animation.onAnimationComplete, [animation], chart);\n chart.animating = false;\n animations.splice(i, 1);\n } else {\n ++i;\n }\n }\n }\n };\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 */\n Object.defineProperty(Chart.Animation.prototype, 'animationObject', {\n get: function() {\n return this;\n }\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 */\n Object.defineProperty(Chart.Animation.prototype, 'chartInstance', {\n get: function() {\n return this.chart;\n },\n set: function(value) {\n this.chart = value;\n }\n });\n\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],23:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n var Interaction = require(28);\n var platform = require(48);\n\n module.exports = function(Chart) {\n var plugins = Chart.plugins;\n\n // Create a dictionary of chart types, to allow for extension of existing types\n Chart.types = {};\n\n // Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n // Destroy method on the chart will remove the instance of the chart from this reference.\n Chart.instances = {};\n\n // Controllers available for dataset visualization eg. bar, line, slice, etc.\n Chart.controllers = {};\n\n /**\n * Initializes the given config with global and chart default values.\n */\n function initConfig(config) {\n config = config || {};\n\n // Do NOT use configMerge() for the data object because this method merges arrays\n // and so would change references to labels and datasets, preventing data updates.\n var data = config.data = config.data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n\n config.options = helpers.configMerge(\n defaults.global,\n defaults[config.type],\n config.options || {});\n\n return config;\n }\n\n /**\n * Updates the config of the chart\n * @param chart {Chart} chart to update the options for\n */\n function updateConfig(chart) {\n var newOptions = chart.options;\n\n // Update Scale(s) with options\n if (newOptions.scale) {\n chart.scale.options = newOptions.scale;\n } else if (newOptions.scales) {\n newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) {\n chart.scales[scaleOptions.id].options = scaleOptions;\n });\n }\n\n // Tooltip\n chart.tooltip._options = newOptions.tooltips;\n }\n\n function positionIsHorizontal(position) {\n return position === 'top' || position === 'bottom';\n }\n\n helpers.extend(Chart.prototype, /** @lends Chart */ {\n /**\n * @private\n */\n construct: function(item, config) {\n var me = this;\n\n config = initConfig(config);\n\n var context = platform.acquireContext(item, config);\n var canvas = context && context.canvas;\n var height = canvas && canvas.height;\n var width = canvas && canvas.width;\n\n me.id = helpers.uid();\n me.ctx = context;\n me.canvas = canvas;\n me.config = config;\n me.width = width;\n me.height = height;\n me.aspectRatio = height ? width / height : null;\n me.options = config.options;\n me._bufferedRender = false;\n\n /**\n * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n * the \"instance\" still need to be defined since it might be called from plugins.\n * @prop Chart#chart\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n me.chart = me;\n me.controller = me; // chart.chart.controller #inception\n\n // Add the chart instance to the global namespace\n Chart.instances[me.id] = me;\n\n // Define alias to the config data: `chart.data === chart.config.data`\n Object.defineProperty(me, 'data', {\n get: function() {\n return me.config.data;\n },\n set: function(value) {\n me.config.data = value;\n }\n });\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n me.initialize();\n me.update();\n },\n\n /**\n * @private\n */\n initialize: function() {\n var me = this;\n\n // Before init plugin notification\n plugins.notify(me, 'beforeInit');\n\n helpers.retinaScale(me, me.options.devicePixelRatio);\n\n me.bindEvents();\n\n if (me.options.responsive) {\n // Initial resize before chart draws (must be silent to preserve initial animations).\n me.resize(true);\n }\n\n // Make sure scales have IDs and are built before we build any controllers.\n me.ensureScalesHaveIDs();\n me.buildScales();\n me.initToolTip();\n\n // After init plugin notification\n plugins.notify(me, 'afterInit');\n\n return me;\n },\n\n clear: function() {\n helpers.canvas.clear(this);\n return this;\n },\n\n stop: function() {\n // Stops any current animation loop occurring\n Chart.animationService.cancelAnimation(this);\n return this;\n },\n\n resize: function(silent) {\n var me = this;\n var options = me.options;\n var canvas = me.canvas;\n var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;\n\n // the canvas render width and height will be casted to integers so make sure that\n // the canvas display style uses the same integer values to avoid blurring effect.\n\n // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased\n var newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas)));\n var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas)));\n\n if (me.width === newWidth && me.height === newHeight) {\n return;\n }\n\n canvas.width = me.width = newWidth;\n canvas.height = me.height = newHeight;\n canvas.style.width = newWidth + 'px';\n canvas.style.height = newHeight + 'px';\n\n helpers.retinaScale(me, options.devicePixelRatio);\n\n if (!silent) {\n // Notify any plugins about the resize\n var newSize = {width: newWidth, height: newHeight};\n plugins.notify(me, 'resize', [newSize]);\n\n // Notify of resize\n if (me.options.onResize) {\n me.options.onResize(me, newSize);\n }\n\n me.stop();\n me.update(me.options.responsiveAnimationDuration);\n }\n },\n\n ensureScalesHaveIDs: function() {\n var options = this.options;\n var scalesOptions = options.scales || {};\n var scaleOptions = options.scale;\n\n helpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {\n xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);\n });\n\n helpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {\n yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);\n });\n\n if (scaleOptions) {\n scaleOptions.id = scaleOptions.id || 'scale';\n }\n },\n\n /**\n * Builds a map of scale ID to scale object for future lookup.\n */\n buildScales: function() {\n var me = this;\n var options = me.options;\n var scales = me.scales = {};\n var items = [];\n\n if (options.scales) {\n items = items.concat(\n (options.scales.xAxes || []).map(function(xAxisOptions) {\n return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};\n }),\n (options.scales.yAxes || []).map(function(yAxisOptions) {\n return {options: yAxisOptions, dtype: 'linear', dposition: 'left'};\n })\n );\n }\n\n if (options.scale) {\n items.push({\n options: options.scale,\n dtype: 'radialLinear',\n isDefault: true,\n dposition: 'chartArea'\n });\n }\n\n helpers.each(items, function(item) {\n var scaleOptions = item.options;\n var scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype);\n var scaleClass = Chart.scaleService.getScaleConstructor(scaleType);\n if (!scaleClass) {\n return;\n }\n\n if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n var scale = new scaleClass({\n id: scaleOptions.id,\n options: scaleOptions,\n ctx: me.ctx,\n chart: me\n });\n\n scales[scale.id] = scale;\n scale.mergeTicksOptions();\n\n // TODO(SB): I think we should be able to remove this custom case (options.scale)\n // and consider it as a regular scale part of the \"scales\"\" map only! This would\n // make the logic easier and remove some useless? custom code.\n if (item.isDefault) {\n me.scale = scale;\n }\n });\n\n Chart.scaleService.addScalesToLayout(this);\n },\n\n buildOrUpdateControllers: function() {\n var me = this;\n var types = [];\n var newControllers = [];\n\n helpers.each(me.data.datasets, function(dataset, datasetIndex) {\n var meta = me.getDatasetMeta(datasetIndex);\n var type = dataset.type || me.config.type;\n\n if (meta.type && meta.type !== type) {\n me.destroyDatasetMeta(datasetIndex);\n meta = me.getDatasetMeta(datasetIndex);\n }\n meta.type = type;\n\n types.push(meta.type);\n\n if (meta.controller) {\n meta.controller.updateIndex(datasetIndex);\n } else {\n var ControllerClass = Chart.controllers[meta.type];\n if (ControllerClass === undefined) {\n throw new Error('\"' + meta.type + '\" is not a chart type.');\n }\n\n meta.controller = new ControllerClass(me, datasetIndex);\n newControllers.push(meta.controller);\n }\n }, me);\n\n return newControllers;\n },\n\n /**\n * Reset the elements of all datasets\n * @private\n */\n resetElements: function() {\n var me = this;\n helpers.each(me.data.datasets, function(dataset, datasetIndex) {\n me.getDatasetMeta(datasetIndex).controller.reset();\n }, me);\n },\n\n /**\n * Resets the chart back to it's state before the initial animation\n */\n reset: function() {\n this.resetElements();\n this.tooltip.initialize();\n },\n\n update: function(config) {\n var me = this;\n\n if (!config || typeof config !== 'object') {\n // backwards compatibility\n config = {\n duration: config,\n lazy: arguments[1]\n };\n }\n\n updateConfig(me);\n\n if (plugins.notify(me, 'beforeUpdate') === false) {\n return;\n }\n\n // In case the entire data object changed\n me.tooltip._data = me.data;\n\n // Make sure dataset controllers are updated and new controllers are reset\n var newControllers = me.buildOrUpdateControllers();\n\n // Make sure all dataset controllers have correct meta data counts\n helpers.each(me.data.datasets, function(dataset, datasetIndex) {\n me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n }, me);\n\n me.updateLayout();\n\n // Can only reset the new controllers after the scales have been updated\n helpers.each(newControllers, function(controller) {\n controller.reset();\n });\n\n me.updateDatasets();\n\n // Do this before render so that any plugins that need final scale updates can use it\n plugins.notify(me, 'afterUpdate');\n\n if (me._bufferedRender) {\n me._bufferedRequest = {\n duration: config.duration,\n easing: config.easing,\n lazy: config.lazy\n };\n } else {\n me.render(config);\n }\n },\n\n /**\n * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n * hook, in which case, plugins will not be called on `afterLayout`.\n * @private\n */\n updateLayout: function() {\n var me = this;\n\n if (plugins.notify(me, 'beforeLayout') === false) {\n return;\n }\n\n Chart.layoutService.update(this, this.width, this.height);\n\n /**\n * Provided for backward compatibility, use `afterLayout` instead.\n * @method IPlugin#afterScaleUpdate\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n plugins.notify(me, 'afterScaleUpdate');\n plugins.notify(me, 'afterLayout');\n },\n\n /**\n * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n * @private\n */\n updateDatasets: function() {\n var me = this;\n\n if (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n return;\n }\n\n for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me.updateDataset(i);\n }\n\n plugins.notify(me, 'afterDatasetsUpdate');\n },\n\n /**\n * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n * @private\n */\n updateDataset: function(index) {\n var me = this;\n var meta = me.getDatasetMeta(index);\n var args = {\n meta: meta,\n index: index\n };\n\n if (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n return;\n }\n\n meta.controller.update();\n\n plugins.notify(me, 'afterDatasetUpdate', [args]);\n },\n\n render: function(config) {\n var me = this;\n\n if (!config || typeof config !== 'object') {\n // backwards compatibility\n config = {\n duration: config,\n lazy: arguments[1]\n };\n }\n\n var duration = config.duration;\n var lazy = config.lazy;\n\n if (plugins.notify(me, 'beforeRender') === false) {\n return;\n }\n\n var animationOptions = me.options.animation;\n var onComplete = function(animation) {\n plugins.notify(me, 'afterRender');\n helpers.callback(animationOptions && animationOptions.onComplete, [animation], me);\n };\n\n if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\n var animation = new Chart.Animation({\n numSteps: (duration || animationOptions.duration) / 16.66, // 60 fps\n easing: config.easing || animationOptions.easing,\n\n render: function(chart, animationObject) {\n var easingFunction = helpers.easing.effects[animationObject.easing];\n var currentStep = animationObject.currentStep;\n var stepDecimal = currentStep / animationObject.numSteps;\n\n chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n },\n\n onAnimationProgress: animationOptions.onProgress,\n onAnimationComplete: onComplete\n });\n\n Chart.animationService.addAnimation(me, animation, duration, lazy);\n } else {\n me.draw();\n\n // See https://github.com/chartjs/Chart.js/issues/3781\n onComplete(new Chart.Animation({numSteps: 0, chart: me}));\n }\n\n return me;\n },\n\n draw: function(easingValue) {\n var me = this;\n\n me.clear();\n\n if (helpers.isNullOrUndef(easingValue)) {\n easingValue = 1;\n }\n\n me.transition(easingValue);\n\n if (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n return;\n }\n\n // Draw all the scales\n helpers.each(me.boxes, function(box) {\n box.draw(me.chartArea);\n }, me);\n\n if (me.scale) {\n me.scale.draw();\n }\n\n me.drawDatasets(easingValue);\n\n // Finally draw the tooltip\n me.tooltip.draw();\n\n plugins.notify(me, 'afterDraw', [easingValue]);\n },\n\n /**\n * @private\n */\n transition: function(easingValue) {\n var me = this;\n\n for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n if (me.isDatasetVisible(i)) {\n me.getDatasetMeta(i).controller.transition(easingValue);\n }\n }\n\n me.tooltip.transition(easingValue);\n },\n\n /**\n * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n * @private\n */\n drawDatasets: function(easingValue) {\n var me = this;\n\n if (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n return;\n }\n\n // Draw datasets reversed to support proper line stacking\n for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {\n if (me.isDatasetVisible(i)) {\n me.drawDataset(i, easingValue);\n }\n }\n\n plugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n },\n\n /**\n * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n * @private\n */\n drawDataset: function(index, easingValue) {\n var me = this;\n var meta = me.getDatasetMeta(index);\n var args = {\n meta: meta,\n index: index,\n easingValue: easingValue\n };\n\n if (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n return;\n }\n\n meta.controller.draw(easingValue);\n\n plugins.notify(me, 'afterDatasetDraw', [args]);\n },\n\n // Get the single element that was clicked on\n // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n getElementAtEvent: function(e) {\n return Interaction.modes.single(this, e);\n },\n\n getElementsAtEvent: function(e) {\n return Interaction.modes.label(this, e, {intersect: true});\n },\n\n getElementsAtXAxis: function(e) {\n return Interaction.modes['x-axis'](this, e, {intersect: true});\n },\n\n getElementsAtEventForMode: function(e, mode, options) {\n var method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options);\n }\n\n return [];\n },\n\n getDatasetAtEvent: function(e) {\n return Interaction.modes.dataset(this, e, {intersect: true});\n },\n\n getDatasetMeta: function(datasetIndex) {\n var me = this;\n var dataset = me.data.datasets[datasetIndex];\n if (!dataset._meta) {\n dataset._meta = {};\n }\n\n var meta = dataset._meta[me.id];\n if (!meta) {\n meta = dataset._meta[me.id] = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null\n };\n }\n\n return meta;\n },\n\n getVisibleDatasetCount: function() {\n var count = 0;\n for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n if (this.isDatasetVisible(i)) {\n count++;\n }\n }\n return count;\n },\n\n isDatasetVisible: function(datasetIndex) {\n var meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n },\n\n generateLegend: function() {\n return this.options.legendCallback(this);\n },\n\n /**\n * @private\n */\n destroyDatasetMeta: function(datasetIndex) {\n var id = this.id;\n var dataset = this.data.datasets[datasetIndex];\n var meta = dataset._meta && dataset._meta[id];\n\n if (meta) {\n meta.controller.destroy();\n delete dataset._meta[id];\n }\n },\n\n destroy: function() {\n var me = this;\n var canvas = me.canvas;\n var i, ilen;\n\n me.stop();\n\n // dataset controllers need to cleanup associated data\n for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me.destroyDatasetMeta(i);\n }\n\n if (canvas) {\n me.unbindEvents();\n helpers.canvas.clear(me);\n platform.releaseContext(me.ctx);\n me.canvas = null;\n me.ctx = null;\n }\n\n plugins.notify(me, 'destroy');\n\n delete Chart.instances[me.id];\n },\n\n toBase64Image: function() {\n return this.canvas.toDataURL.apply(this.canvas, arguments);\n },\n\n initToolTip: function() {\n var me = this;\n me.tooltip = new Chart.Tooltip({\n _chart: me,\n _chartInstance: me, // deprecated, backward compatibility\n _data: me.data,\n _options: me.options.tooltips\n }, me);\n },\n\n /**\n * @private\n */\n bindEvents: function() {\n var me = this;\n var listeners = me._listeners = {};\n var listener = function() {\n me.eventHandler.apply(me, arguments);\n };\n\n helpers.each(me.options.events, function(type) {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n });\n\n // Elements used to detect size change should not be injected for non responsive charts.\n // See https://github.com/chartjs/Chart.js/issues/2210\n if (me.options.responsive) {\n listener = function() {\n me.resize();\n };\n\n platform.addEventListener(me, 'resize', listener);\n listeners.resize = listener;\n }\n },\n\n /**\n * @private\n */\n unbindEvents: function() {\n var me = this;\n var listeners = me._listeners;\n if (!listeners) {\n return;\n }\n\n delete me._listeners;\n helpers.each(listeners, function(listener, type) {\n platform.removeEventListener(me, type, listener);\n });\n },\n\n updateHoverStyle: function(elements, mode, enabled) {\n var method = enabled ? 'setHoverStyle' : 'removeHoverStyle';\n var element, i, ilen;\n\n for (i = 0, ilen = elements.length; i < ilen; ++i) {\n element = elements[i];\n if (element) {\n this.getDatasetMeta(element._datasetIndex).controller[method](element);\n }\n }\n },\n\n /**\n * @private\n */\n eventHandler: function(e) {\n var me = this;\n var tooltip = me.tooltip;\n\n if (plugins.notify(me, 'beforeEvent', [e]) === false) {\n return;\n }\n\n // Buffer any update calls so that renders do not occur\n me._bufferedRender = true;\n me._bufferedRequest = null;\n\n var changed = me.handleEvent(e);\n changed |= tooltip && tooltip.handleEvent(e);\n\n plugins.notify(me, 'afterEvent', [e]);\n\n var bufferedRequest = me._bufferedRequest;\n if (bufferedRequest) {\n // If we have an update that was triggered, we need to do a normal render\n me.render(bufferedRequest);\n } else if (changed && !me.animating) {\n // If entering, leaving, or changing elements, animate the change via pivot\n me.stop();\n\n // We only need to render at this point. Updating will cause scales to be\n // recomputed generating flicker & using more memory than necessary.\n me.render(me.options.hover.animationDuration, true);\n }\n\n me._bufferedRender = false;\n me._bufferedRequest = null;\n\n return me;\n },\n\n /**\n * Handle an event\n * @private\n * @param {IEvent} event the event to handle\n * @return {Boolean} true if the chart needs to re-render\n */\n handleEvent: function(e) {\n var me = this;\n var options = me.options || {};\n var hoverOptions = options.hover;\n var changed = false;\n\n me.lastActive = me.lastActive || [];\n\n // Find Active Elements for hover and tooltips\n if (e.type === 'mouseout') {\n me.active = [];\n } else {\n me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n }\n\n // Invoke onHover hook\n // Need to call with native event here to not break backwards compatibility\n helpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);\n\n if (e.type === 'mouseup' || e.type === 'click') {\n if (options.onClick) {\n // Use e.native here for backwards compatibility\n options.onClick.call(me, e.native, me.active);\n }\n }\n\n // Remove styling for last active (even if it may still be active)\n if (me.lastActive.length) {\n me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n }\n\n // Built in hover styling\n if (me.active.length && hoverOptions.mode) {\n me.updateHoverStyle(me.active, hoverOptions.mode, true);\n }\n\n changed = !helpers.arrayEquals(me.active, me.lastActive);\n\n // Remember Last Actives\n me.lastActive = me.active;\n\n return changed;\n }\n });\n\n /**\n * Provided for backward compatibility, use Chart instead.\n * @class Chart.Controller\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n Chart.Controller = Chart;\n };\n\n},{\"25\":25,\"28\":28,\"45\":45,\"48\":48}],24:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n var 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 */\n function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach(function(key) {\n var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n var base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value: function() {\n var args = Array.prototype.slice.call(arguments);\n var res = base.apply(this, args);\n\n helpers.each(array._chartjs.listeners, function(object) {\n if (typeof object[method] === 'function') {\n object[method].apply(object, args);\n }\n });\n\n return res;\n }\n });\n });\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 */\n function unlistenArrayEvents(array, listener) {\n var stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n var listeners = stub.listeners;\n var index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach(function(key) {\n delete array[key];\n });\n\n delete array._chartjs;\n }\n\n // Base class for all dataset controllers (line, bar, etc)\n Chart.DatasetController = function(chart, datasetIndex) {\n this.initialize(chart, datasetIndex);\n };\n\n helpers.extend(Chart.DatasetController.prototype, {\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n * @type {Chart.core.element}\n */\n datasetElementType: null,\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.Point).\n * @type {Chart.core.element}\n */\n dataElementType: null,\n\n initialize: function(chart, datasetIndex) {\n var me = this;\n me.chart = chart;\n me.index = datasetIndex;\n me.linkScales();\n me.addElements();\n },\n\n updateIndex: function(datasetIndex) {\n this.index = datasetIndex;\n },\n\n linkScales: function() {\n var me = this;\n var meta = me.getMeta();\n var dataset = me.getDataset();\n\n if (meta.xAxisID === null) {\n meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n }\n if (meta.yAxisID === null) {\n meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n }\n },\n\n getDataset: function() {\n return this.chart.data.datasets[this.index];\n },\n\n getMeta: function() {\n return this.chart.getDatasetMeta(this.index);\n },\n\n getScaleForId: function(scaleID) {\n return this.chart.scales[scaleID];\n },\n\n reset: function() {\n this.update(true);\n },\n\n /**\n * @private\n */\n destroy: function() {\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n },\n\n createMetaDataset: function() {\n var me = this;\n var type = me.datasetElementType;\n return type && new type({\n _chart: me.chart,\n _datasetIndex: me.index\n });\n },\n\n createMetaData: function(index) {\n var me = this;\n var type = me.dataElementType;\n return type && new type({\n _chart: me.chart,\n _datasetIndex: me.index,\n _index: index\n });\n },\n\n addElements: function() {\n var me = this;\n var meta = me.getMeta();\n var data = me.getDataset().data || [];\n var metaData = meta.data;\n var i, ilen;\n\n for (i = 0, ilen = data.length; i < ilen; ++i) {\n metaData[i] = metaData[i] || me.createMetaData(i);\n }\n\n meta.dataset = meta.dataset || me.createMetaDataset();\n },\n\n addElementAndReset: function(index) {\n var element = this.createMetaData(index);\n this.getMeta().data.splice(index, 0, element);\n this.updateElement(element, index, true);\n },\n\n buildOrUpdateElements: function() {\n var me = this;\n var dataset = me.getDataset();\n var data = dataset.data || (dataset.data = []);\n\n // In order to correctly handle data addition/deletion animation (an thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal meta data accordingly.\n if (me._data !== data) {\n if (me._data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(me._data, me);\n }\n\n listenArrayEvents(data, me);\n me._data = data;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n me.resyncElements();\n },\n\n update: helpers.noop,\n\n transition: function(easingValue) {\n var meta = this.getMeta();\n var elements = meta.data || [];\n var ilen = elements.length;\n var i = 0;\n\n for (; i < ilen; ++i) {\n elements[i].transition(easingValue);\n }\n\n if (meta.dataset) {\n meta.dataset.transition(easingValue);\n }\n },\n\n draw: function() {\n var meta = this.getMeta();\n var elements = meta.data || [];\n var ilen = elements.length;\n var i = 0;\n\n if (meta.dataset) {\n meta.dataset.draw();\n }\n\n for (; i < ilen; ++i) {\n elements[i].draw();\n }\n },\n\n removeHoverStyle: function(element, elementOpts) {\n var dataset = this.chart.data.datasets[element._datasetIndex];\n var index = element._index;\n var custom = element.custom || {};\n var valueOrDefault = helpers.valueAtIndexOrDefault;\n var model = element._model;\n\n model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n model.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n model.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n },\n\n setHoverStyle: function(element) {\n var dataset = this.chart.data.datasets[element._datasetIndex];\n var index = element._index;\n var custom = element.custom || {};\n var valueOrDefault = helpers.valueAtIndexOrDefault;\n var getHoverColor = helpers.getHoverColor;\n var model = element._model;\n\n model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n },\n\n /**\n * @private\n */\n resyncElements: function() {\n var me = this;\n var meta = me.getMeta();\n var data = me.getDataset().data;\n var numMeta = meta.data.length;\n var numData = data.length;\n\n if (numData < numMeta) {\n meta.data.splice(numData, numMeta - numData);\n } else if (numData > numMeta) {\n me.insertElements(numMeta, numData - numMeta);\n }\n },\n\n /**\n * @private\n */\n insertElements: function(start, count) {\n for (var i = 0; i < count; ++i) {\n this.addElementAndReset(start + i);\n }\n },\n\n /**\n * @private\n */\n onDataPush: function() {\n this.insertElements(this.getDataset().data.length - 1, arguments.length);\n },\n\n /**\n * @private\n */\n onDataPop: function() {\n this.getMeta().data.pop();\n },\n\n /**\n * @private\n */\n onDataShift: function() {\n this.getMeta().data.shift();\n },\n\n /**\n * @private\n */\n onDataSplice: function(start, count) {\n this.getMeta().data.splice(start, count);\n this.insertElements(start, arguments.length - 2);\n },\n\n /**\n * @private\n */\n onDataUnshift: function() {\n this.insertElements(0, arguments.length);\n }\n });\n\n Chart.DatasetController.extend = helpers.inherits;\n };\n\n},{\"45\":45}],25:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n module.exports = {\n /**\n * @private\n */\n _set: function(scope, values) {\n return helpers.merge(this[scope] || (this[scope] = {}), values);\n }\n };\n\n},{\"45\":45}],26:[function(require,module,exports){\n 'use strict';\n\n var color = require(2);\n var helpers = require(45);\n\n function interpolate(start, view, model, ease) {\n var keys = Object.keys(model);\n var i, ilen, key, actual, origin, target, type, c0, c1;\n\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n\n target = model[key];\n\n // if a value is added to the model after pivot() has been called, the view\n // doesn't contain it, so let's initialize the view to the target value.\n if (!view.hasOwnProperty(key)) {\n view[key] = target;\n }\n\n actual = view[key];\n\n if (actual === target || key[0] === '_') {\n continue;\n }\n\n if (!start.hasOwnProperty(key)) {\n start[key] = actual;\n }\n\n origin = start[key];\n\n type = typeof target;\n\n if (type === typeof origin) {\n if (type === 'string') {\n c0 = color(origin);\n if (c0.valid) {\n c1 = color(target);\n if (c1.valid) {\n view[key] = c1.mix(c0, ease).rgbString();\n continue;\n }\n }\n } else if (type === 'number' && isFinite(origin) && isFinite(target)) {\n view[key] = origin + (target - origin) * ease;\n continue;\n }\n }\n\n view[key] = target;\n }\n }\n\n var Element = function(configuration) {\n helpers.extend(this, configuration);\n this.initialize.apply(this, arguments);\n };\n\n helpers.extend(Element.prototype, {\n\n initialize: function() {\n this.hidden = false;\n },\n\n pivot: function() {\n var me = this;\n if (!me._view) {\n me._view = helpers.clone(me._model);\n }\n me._start = {};\n return me;\n },\n\n transition: function(ease) {\n var me = this;\n var model = me._model;\n var start = me._start;\n var view = me._view;\n\n // No animation -> No Transition\n if (!model || ease === 1) {\n me._view = model;\n me._start = null;\n return me;\n }\n\n if (!view) {\n view = me._view = {};\n }\n\n if (!start) {\n start = me._start = {};\n }\n\n interpolate(start, view, model, ease);\n\n return me;\n },\n\n tooltipPosition: function() {\n return {\n x: this._model.x,\n y: this._model.y\n };\n },\n\n hasValue: function() {\n return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n }\n });\n\n Element.extend = helpers.inherits;\n\n module.exports = Element;\n\n},{\"2\":2,\"45\":45}],27:[function(require,module,exports){\n\t/* global window: false */\n\t/* global document: false */\n 'use strict';\n\n var color = require(2);\n var defaults = require(25);\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n // -- Basic js utility methods\n\n helpers.extend = function(base) {\n var setFn = function(value, key) {\n base[key] = value;\n };\n for (var i = 1, ilen = arguments.length; i < ilen; i++) {\n helpers.each(arguments[i], setFn);\n }\n return base;\n };\n\n helpers.configMerge = function(/* objects ... */) {\n return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n merger: function(key, target, source, options) {\n var tval = target[key] || {};\n var sval = source[key];\n\n if (key === 'scales') {\n // scale config merging is complex. Add our own function here for that\n target[key] = helpers.scaleMerge(tval, sval);\n } else if (key === 'scale') {\n // used in polar area & radar charts since there is only one scale\n target[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]);\n } else {\n helpers._merger(key, target, source, options);\n }\n }\n });\n };\n\n helpers.scaleMerge = function(/* objects ... */) {\n return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n merger: function(key, target, source, options) {\n if (key === 'xAxes' || key === 'yAxes') {\n var slen = source[key].length;\n var i, type, scale;\n\n if (!target[key]) {\n target[key] = [];\n }\n\n for (i = 0; i < slen; ++i) {\n scale = source[key][i];\n type = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear');\n\n if (i >= target[key].length) {\n target[key].push({});\n }\n\n if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) {\n // new/untyped scale or type changed: let's apply the new defaults\n // then merge source scale to correctly overwrite the defaults.\n helpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]);\n } else {\n // scales type are the same\n helpers.merge(target[key][i], scale);\n }\n }\n } else {\n helpers._merger(key, target, source, options);\n }\n }\n });\n };\n\n helpers.where = function(collection, filterCallback) {\n if (helpers.isArray(collection) && Array.prototype.filter) {\n return collection.filter(filterCallback);\n }\n var filtered = [];\n\n helpers.each(collection, function(item) {\n if (filterCallback(item)) {\n filtered.push(item);\n }\n });\n\n return filtered;\n };\n helpers.findIndex = Array.prototype.findIndex ?\n function(array, callback, scope) {\n return array.findIndex(callback, scope);\n } :\n function(array, callback, scope) {\n scope = scope === undefined ? array : scope;\n for (var i = 0, ilen = array.length; i < ilen; ++i) {\n if (callback.call(scope, array[i], i, array)) {\n return i;\n }\n }\n return -1;\n };\n helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\n // Default to start of the array\n if (helpers.isNullOrUndef(startIndex)) {\n startIndex = -1;\n }\n for (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n var currentItem = arrayToSearch[i];\n if (filterCallback(currentItem)) {\n return currentItem;\n }\n }\n };\n helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\n // Default to end of the array\n if (helpers.isNullOrUndef(startIndex)) {\n startIndex = arrayToSearch.length;\n }\n for (var i = startIndex - 1; i >= 0; i--) {\n var currentItem = arrayToSearch[i];\n if (filterCallback(currentItem)) {\n return currentItem;\n }\n }\n };\n helpers.inherits = function(extensions) {\n // Basic javascript inheritance based on the model created in Backbone.js\n var me = this;\n var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {\n return me.apply(this, arguments);\n };\n\n var Surrogate = function() {\n this.constructor = ChartElement;\n };\n Surrogate.prototype = me.prototype;\n ChartElement.prototype = new Surrogate();\n\n ChartElement.extend = helpers.inherits;\n\n if (extensions) {\n helpers.extend(ChartElement.prototype, extensions);\n }\n\n ChartElement.__super__ = me.prototype;\n\n return ChartElement;\n };\n // -- Math methods\n helpers.isNumber = function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n };\n helpers.almostEquals = function(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n };\n helpers.almostWhole = function(x, epsilon) {\n var rounded = Math.round(x);\n return (((rounded - epsilon) < x) && ((rounded + epsilon) > x));\n };\n helpers.max = function(array) {\n return array.reduce(function(max, value) {\n if (!isNaN(value)) {\n return Math.max(max, value);\n }\n return max;\n }, Number.NEGATIVE_INFINITY);\n };\n helpers.min = function(array) {\n return array.reduce(function(min, value) {\n if (!isNaN(value)) {\n return Math.min(min, value);\n }\n return min;\n }, Number.POSITIVE_INFINITY);\n };\n helpers.sign = Math.sign ?\n function(x) {\n return Math.sign(x);\n } :\n function(x) {\n x = +x; // convert to a number\n if (x === 0 || isNaN(x)) {\n return x;\n }\n return x > 0 ? 1 : -1;\n };\n helpers.log10 = Math.log10 ?\n function(x) {\n return Math.log10(x);\n } :\n function(x) {\n return Math.log(x) / Math.LN10;\n };\n helpers.toRadians = function(degrees) {\n return degrees * (Math.PI / 180);\n };\n helpers.toDegrees = function(radians) {\n return radians * (180 / Math.PI);\n };\n // Gets the angle from vertical upright to the point about a centre.\n helpers.getAngleFromPoint = function(centrePoint, anglePoint) {\n var distanceFromXCenter = anglePoint.x - centrePoint.x;\n var distanceFromYCenter = anglePoint.y - centrePoint.y;\n var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * Math.PI)) {\n angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle: angle,\n distance: radialDistanceFromCenter\n };\n };\n helpers.distanceBetweenPoints = function(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n };\n helpers.aliasPixel = function(pixelWidth) {\n return (pixelWidth % 2 === 0) ? 0 : 0.5;\n };\n helpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n var previous = firstPoint.skip ? middlePoint : firstPoint;\n var current = middlePoint;\n var next = afterPoint.skip ? middlePoint : afterPoint;\n\n var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n var s01 = d01 / (d01 + d12);\n var s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n var fa = t * s01; // scaling factor for triangle Ta\n var fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n };\n helpers.EPSILON = Number.EPSILON || 1e-14;\n helpers.splineCurveMonotone = function(points) {\n // This function calculates Bézier control points in a similar way than |splineCurve|,\n // but preserves monotonicity of the provided data and ensures no local extremums are added\n // between the dataset discrete points due to the interpolation.\n // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n var pointsWithTangents = (points || []).map(function(point) {\n return {\n model: point._model,\n deltaK: 0,\n mK: 0\n };\n });\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n var pointsLen = pointsWithTangents.length;\n var i, pointBefore, pointCurrent, pointAfter;\n for (i = 0; i < pointsLen; ++i) {\n pointCurrent = pointsWithTangents[i];\n if (pointCurrent.model.skip) {\n continue;\n }\n\n pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n if (pointAfter && !pointAfter.model.skip) {\n var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n }\n\n if (!pointBefore || pointBefore.model.skip) {\n pointCurrent.mK = pointCurrent.deltaK;\n } else if (!pointAfter || pointAfter.model.skip) {\n pointCurrent.mK = pointBefore.deltaK;\n } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n pointCurrent.mK = 0;\n } else {\n pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n }\n }\n\n // Adjust tangents to ensure monotonic properties\n var alphaK, betaK, tauK, squaredMagnitude;\n for (i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointsWithTangents[i];\n pointAfter = pointsWithTangents[i + 1];\n if (pointCurrent.model.skip || pointAfter.model.skip) {\n continue;\n }\n\n if (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n pointCurrent.mK = pointAfter.mK = 0;\n continue;\n }\n\n alphaK = pointCurrent.mK / pointCurrent.deltaK;\n betaK = pointAfter.mK / pointCurrent.deltaK;\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n pointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n }\n\n // Compute control points\n var deltaX;\n for (i = 0; i < pointsLen; ++i) {\n pointCurrent = pointsWithTangents[i];\n if (pointCurrent.model.skip) {\n continue;\n }\n\n pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n if (pointBefore && !pointBefore.model.skip) {\n deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n }\n if (pointAfter && !pointAfter.model.skip) {\n deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n }\n }\n };\n helpers.nextItem = function(collection, index, loop) {\n if (loop) {\n return index >= collection.length - 1 ? collection[0] : collection[index + 1];\n }\n return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n };\n helpers.previousItem = function(collection, index, loop) {\n if (loop) {\n return index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n }\n return index <= 0 ? collection[0] : collection[index - 1];\n };\n // Implementation of the nice number algorithm used in determining where axis labels will go\n helpers.niceNum = function(range, round) {\n var exponent = Math.floor(helpers.log10(range));\n var fraction = range / Math.pow(10, exponent);\n var niceFraction;\n\n if (round) {\n if (fraction < 1.5) {\n niceFraction = 1;\n } else if (fraction < 3) {\n niceFraction = 2;\n } else if (fraction < 7) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n } else if (fraction <= 1.0) {\n niceFraction = 1;\n } else if (fraction <= 2) {\n niceFraction = 2;\n } else if (fraction <= 5) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n\n return niceFraction * Math.pow(10, exponent);\n };\n // Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n helpers.requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n callback();\n };\n }\n return window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback) {\n return window.setTimeout(callback, 1000 / 60);\n };\n }());\n // -- DOM methods\n helpers.getRelativePosition = function(evt, chart) {\n var mouseX, mouseY;\n var e = evt.originalEvent || evt;\n var canvas = evt.currentTarget || evt.srcElement;\n var boundingRect = canvas.getBoundingClientRect();\n\n var touches = e.touches;\n if (touches && touches.length > 0) {\n mouseX = touches[0].clientX;\n mouseY = touches[0].clientY;\n\n } else {\n mouseX = e.clientX;\n mouseY = e.clientY;\n }\n\n // Scale mouse coordinates into canvas coordinates\n // by following the pattern laid out by 'jerryj' in the comments of\n // http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n var paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n var paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n var paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n var paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);\n mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);\n\n return {\n x: mouseX,\n y: mouseY\n };\n\n };\n\n // Private helper function to convert max-width/max-height values that may be percentages into a number\n function parseMaxStyle(styleValue, node, parentProperty) {\n var valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n }\n\n /**\n * Returns if the given value contains an effective constraint.\n * @private\n */\n function isConstrainedValue(value) {\n return value !== undefined && value !== null && value !== 'none';\n }\n\n // Private helper to get a constraint dimension\n // @param domNode : the node to check the constraint on\n // @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n // @param percentageProperty : property of parent to use when calculating width as a percentage\n // @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n function getConstraintDimension(domNode, maxStyle, percentageProperty) {\n var view = document.defaultView;\n var parentNode = domNode.parentNode;\n var constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n var hasCNode = isConstrainedValue(constrainedNode);\n var hasCContainer = isConstrainedValue(constrainedContainer);\n var infinity = Number.POSITIVE_INFINITY;\n\n if (hasCNode || hasCContainer) {\n return Math.min(\n hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,\n hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n }\n\n return 'none';\n }\n // returns Number or undefined if no constraint\n helpers.getConstraintWidth = function(domNode) {\n return getConstraintDimension(domNode, 'max-width', 'clientWidth');\n };\n // returns Number or undefined if no constraint\n helpers.getConstraintHeight = function(domNode) {\n return getConstraintDimension(domNode, 'max-height', 'clientHeight');\n };\n helpers.getMaximumWidth = function(domNode) {\n var container = domNode.parentNode;\n if (!container) {\n return domNode.clientWidth;\n }\n\n var paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10);\n var paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10);\n var w = container.clientWidth - paddingLeft - paddingRight;\n var cw = helpers.getConstraintWidth(domNode);\n return isNaN(cw) ? w : Math.min(w, cw);\n };\n helpers.getMaximumHeight = function(domNode) {\n var container = domNode.parentNode;\n if (!container) {\n return domNode.clientHeight;\n }\n\n var paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10);\n var paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10);\n var h = container.clientHeight - paddingTop - paddingBottom;\n var ch = helpers.getConstraintHeight(domNode);\n return isNaN(ch) ? h : Math.min(h, ch);\n };\n helpers.getStyle = function(el, property) {\n return el.currentStyle ?\n el.currentStyle[property] :\n document.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n };\n helpers.retinaScale = function(chart, forceRatio) {\n var pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1;\n if (pixelRatio === 1) {\n return;\n }\n\n var canvas = chart.canvas;\n var height = chart.height;\n var width = chart.width;\n\n canvas.height = height * pixelRatio;\n canvas.width = width * pixelRatio;\n chart.ctx.scale(pixelRatio, pixelRatio);\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n canvas.style.height = height + 'px';\n canvas.style.width = width + 'px';\n };\n // -- Canvas methods\n helpers.fontString = function(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n };\n helpers.longestText = function(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n var data = cache.data = cache.data || {};\n var gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.font = font;\n var longest = 0;\n helpers.each(arrayOfThings, function(thing) {\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n longest = helpers.measureText(ctx, data, gc, longest, thing);\n } else if (helpers.isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n helpers.each(thing, function(nestedThing) {\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n longest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n }\n });\n }\n });\n\n var gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (var i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n };\n helpers.measureText = function(ctx, data, gc, longest, string) {\n var textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n };\n helpers.numberOfLabelLines = function(arrayOfThings) {\n var numberOfLines = 1;\n helpers.each(arrayOfThings, function(thing) {\n if (helpers.isArray(thing)) {\n if (thing.length > numberOfLines) {\n numberOfLines = thing.length;\n }\n }\n });\n return numberOfLines;\n };\n\n helpers.color = !color ?\n function(value) {\n console.error('Color.js not found!');\n return value;\n } :\n function(value) {\n\t\t\t\t/* global CanvasGradient */\n if (value instanceof CanvasGradient) {\n value = defaults.global.defaultColor;\n }\n\n return color(value);\n };\n\n helpers.getHoverColor = function(colorValue) {\n\t\t\t/* global CanvasPattern */\n return (colorValue instanceof CanvasPattern) ?\n colorValue :\n helpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n };\n };\n\n},{\"2\":2,\"25\":25,\"45\":45}],28:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\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 {Point} the event position\n */\n function getRelativePosition(e, chart) {\n if (e.native) {\n return {\n x: e.x,\n y: e.y\n };\n }\n\n return helpers.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 handler {Function} the callback to execute for each visible item\n */\n function parseVisibleItems(chart, handler) {\n var datasets = chart.data.datasets;\n var meta, i, j, ilen, jlen;\n\n for (i = 0, ilen = datasets.length; i < ilen; ++i) {\n if (!chart.isDatasetVisible(i)) {\n continue;\n }\n\n meta = chart.getDatasetMeta(i);\n for (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n var element = meta.data[j];\n if (!element._view.skip) {\n handler(element);\n }\n }\n }\n }\n\n /**\n * Helper function to get the items that intersect the event position\n * @param items {ChartElement[]} elements to filter\n * @param position {Point} the point to be nearest to\n * @return {ChartElement[]} the nearest items\n */\n function getIntersectItems(chart, position) {\n var elements = [];\n\n parseVisibleItems(chart, function(element) {\n if (element.inRange(position.x, position.y)) {\n elements.push(element);\n }\n });\n\n return 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 position {Point} the point to be nearest to\n * @param intersect {Boolean} if true, only consider items that intersect the position\n * @param distanceMetric {Function} function to provide the distance between points\n * @return {ChartElement[]} the nearest items\n */\n function getNearestItems(chart, position, intersect, distanceMetric) {\n var minDistance = Number.POSITIVE_INFINITY;\n var nearestItems = [];\n\n parseVisibleItems(chart, function(element) {\n if (intersect && !element.inRange(position.x, position.y)) {\n return;\n }\n\n var center = element.getCenterPoint();\n var distance = distanceMetric(position, center);\n\n if (distance < minDistance) {\n nearestItems = [element];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n nearestItems.push(element);\n }\n });\n\n return 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 */\n function getDistanceMetricForAxis(axis) {\n var useX = axis.indexOf('x') !== -1;\n var useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n }\n\n function indexMode(chart, e, options) {\n var position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n options.axis = options.axis || 'x';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n var elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.data.datasets.forEach(function(dataset, datasetIndex) {\n if (chart.isDatasetVisible(datasetIndex)) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var element = meta.data[items[0]._index];\n\n // don't count items that are skipped (null data)\n if (element && !element._view.skip) {\n elements.push(element);\n }\n }\n });\n\n return 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 */\n module.exports = {\n // Helper function for different modes\n modes: {\n single: function(chart, e) {\n var position = getRelativePosition(e, chart);\n var elements = [];\n\n parseVisibleItems(chart, function(element) {\n if (element.inRange(position.x, position.y)) {\n elements.push(element);\n return elements;\n }\n });\n\n return elements.slice(0, 1);\n },\n\n /**\n * @function Chart.Interaction.modes.label\n * @deprecated since version 2.4.0\n * @todo remove at version 3\n * @private\n */\n label: indexMode,\n\n /**\n * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n * @function Chart.Interaction.modes.index\n * @since v2.4.0\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n index: indexMode,\n\n /**\n * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect is false, we find the nearest item and return the items in that dataset\n * @function Chart.Interaction.modes.dataset\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n dataset: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n options.axis = options.axis || 'xy';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\n if (items.length > 0) {\n items = chart.getDatasetMeta(items[0]._datasetIndex).data;\n }\n\n return items;\n },\n\n /**\n * @function Chart.Interaction.modes.x-axis\n * @deprecated since version 2.4.0. Use index mode and intersect == true\n * @todo remove at version 3\n * @private\n */\n 'x-axis': function(chart, e) {\n return indexMode(chart, e, {intersect: true});\n },\n\n /**\n * Point mode returns all elements that hit test based on the event position\n * of the event\n * @function Chart.Interaction.modes.intersect\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n point: function(chart, e) {\n var position = getRelativePosition(e, chart);\n return getIntersectItems(chart, position);\n },\n\n /**\n * nearest mode returns the element closest to the point\n * @function Chart.Interaction.modes.intersect\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n nearest: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n options.axis = options.axis || 'xy';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n var nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric);\n\n // We have multiple items at the same distance from the event. Now sort by smallest\n if (nearestItems.length > 1) {\n nearestItems.sort(function(a, b) {\n var sizeA = a.getArea();\n var sizeB = b.getArea();\n var ret = sizeA - sizeB;\n\n if (ret === 0) {\n // if equal sort by dataset index\n ret = a._datasetIndex - b._datasetIndex;\n }\n\n return ret;\n });\n }\n\n // Return only 1 item\n return nearestItems.slice(0, 1);\n },\n\n /**\n * x mode returns the elements that hit-test at the current x coordinate\n * @function Chart.Interaction.modes.x\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n x: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n var items = [];\n var intersectsItem = false;\n\n parseVisibleItems(chart, function(element) {\n if (element.inXRange(position.x)) {\n items.push(element);\n }\n\n if (element.inRange(position.x, position.y)) {\n intersectsItem = true;\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (options.intersect && !intersectsItem) {\n items = [];\n }\n return items;\n },\n\n /**\n * y mode returns the elements that hit-test at the current y coordinate\n * @function Chart.Interaction.modes.y\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n y: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n var items = [];\n var intersectsItem = false;\n\n parseVisibleItems(chart, function(element) {\n if (element.inYRange(position.y)) {\n items.push(element);\n }\n\n if (element.inRange(position.x, position.y)) {\n intersectsItem = true;\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (options.intersect && !intersectsItem) {\n items = [];\n }\n return items;\n }\n }\n };\n\n},{\"45\":45}],29:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n\n defaults._set('global', {\n responsive: true,\n responsiveAnimationDuration: 0,\n maintainAspectRatio: true,\n events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n hover: {\n onHover: null,\n mode: 'nearest',\n intersect: true,\n animationDuration: 400\n },\n onClick: null,\n defaultColor: 'rgba(0,0,0,0.1)',\n defaultFontColor: '#666',\n defaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n defaultFontSize: 12,\n defaultFontStyle: 'normal',\n showLines: true,\n\n // Element defaults defined in element extensions\n elements: {},\n\n // Layout options such as padding\n layout: {\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n }\n });\n\n module.exports = function() {\n\n // Occupy the global variable of Chart, and create a simple base class\n var Chart = function(item, config) {\n this.construct(item, config);\n return this;\n };\n\n Chart.Chart = Chart;\n\n return Chart;\n };\n\n},{\"25\":25}],30:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n function filterByPosition(array, position) {\n return helpers.where(array, function(v) {\n return v.position === position;\n });\n }\n\n function sortByWeight(array, reverse) {\n array.forEach(function(v, i) {\n v._tmpIndex_ = i;\n return v;\n });\n array.sort(function(a, b) {\n var v0 = reverse ? b : a;\n var v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0._tmpIndex_ - v1._tmpIndex_ :\n v0.weight - v1.weight;\n });\n array.forEach(function(v) {\n delete v._tmpIndex_;\n });\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.\n Chart.layoutService = {\n defaults: {},\n\n /**\n * Register a box to a chart.\n * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n * @param {Chart} chart - the chart to use\n * @param {ILayoutItem} item - the item to add to be layed out\n */\n addBox: function(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullWidth = item.fullWidth || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n\n chart.boxes.push(item);\n },\n\n /**\n * Remove a layoutItem from a chart\n * @param {Chart} chart - the chart to remove the box from\n * @param {Object} layoutItem - the item to remove from the layout\n */\n removeBox: function(chart, layoutItem) {\n var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n * Sets (or updates) options on the given `item`.\n * @param {Chart} chart - the chart in which the item lives (or will be added to)\n * @param {Object} item - the item to configure with the given options\n * @param {Object} options - the new item options.\n */\n configure: function(chart, item, options) {\n var props = ['fullWidth', 'position', 'weight'];\n var ilen = props.length;\n var i = 0;\n var prop;\n\n for (; i < ilen; ++i) {\n prop = props[i];\n if (options.hasOwnProperty(prop)) {\n item[prop] = options[prop];\n }\n }\n },\n\n /**\n * Fits boxes of the given chart into the given size by having each box measure itself\n * then running a fitting algorithm\n * @param {Chart} chart - the chart\n * @param {Number} width - the width to fit into\n * @param {Number} height - the height to fit into\n */\n update: function(chart, width, height) {\n if (!chart) {\n return;\n }\n\n var layoutOptions = chart.options.layout || {};\n var padding = helpers.options.toPadding(layoutOptions.padding);\n var leftPadding = padding.left;\n var rightPadding = padding.right;\n var topPadding = padding.top;\n var bottomPadding = padding.bottom;\n\n var leftBoxes = filterByPosition(chart.boxes, 'left');\n var rightBoxes = filterByPosition(chart.boxes, 'right');\n var topBoxes = filterByPosition(chart.boxes, 'top');\n var bottomBoxes = filterByPosition(chart.boxes, 'bottom');\n var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');\n\n // Sort boxes by weight. A higher weight is further away from the chart area\n sortByWeight(leftBoxes, true);\n sortByWeight(rightBoxes, false);\n sortByWeight(topBoxes, true);\n sortByWeight(bottomBoxes, false);\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n // What we do to find the best sizing, we do the following\n // 1. Determine the minimum size of the chart area.\n // 2. Split the remaining width equally between each vertical axis\n // 3. Split the remaining height equally between each horizontal axis\n // 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n // 5. Adjust the sizes of each axis based on it's minimum reported size.\n // 6. Refit each axis\n // 7. Position each axis in the final location\n // 8. Tell the chart the final location of the chart area\n // 9. Tell any axes that overlay the chart area the positions of the chart area\n\n // Step 1\n var chartWidth = width - leftPadding - rightPadding;\n var chartHeight = height - topPadding - bottomPadding;\n var chartAreaWidth = chartWidth / 2; // min 50%\n var chartAreaHeight = chartHeight / 2; // min 50%\n\n // Step 2\n var verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n // Step 3\n var horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n // Step 4\n var maxChartAreaWidth = chartWidth;\n var maxChartAreaHeight = chartHeight;\n var minBoxSizes = [];\n\n function getMinimumBoxSize(box) {\n var minSize;\n var isHorizontal = box.isHorizontal();\n\n if (isHorizontal) {\n minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n maxChartAreaHeight -= minSize.height;\n } else {\n minSize = box.update(verticalBoxWidth, chartAreaHeight);\n maxChartAreaWidth -= minSize.width;\n }\n\n minBoxSizes.push({\n horizontal: isHorizontal,\n minSize: minSize,\n box: box,\n });\n }\n\n helpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n var maxHorizontalLeftPadding = 0;\n var maxHorizontalRightPadding = 0;\n var maxVerticalTopPadding = 0;\n var maxVerticalBottomPadding = 0;\n\n helpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) {\n if (horizontalBox.getPadding) {\n var boxPadding = horizontalBox.getPadding();\n maxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n maxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n }\n });\n\n helpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) {\n if (verticalBox.getPadding) {\n var boxPadding = verticalBox.getPadding();\n maxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n maxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n }\n });\n\n // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n // be if the axes are drawn at their minimum sizes.\n // Steps 5 & 6\n var totalLeftBoxesWidth = leftPadding;\n var totalRightBoxesWidth = rightPadding;\n var totalTopBoxesHeight = topPadding;\n var totalBottomBoxesHeight = bottomPadding;\n\n // Function to fit a box\n function fitBox(box) {\n var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) {\n return minBox.box === box;\n });\n\n if (minBoxSize) {\n if (box.isHorizontal()) {\n var scaleMargin = {\n left: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n right: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n top: 0,\n bottom: 0\n };\n\n // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n // on the margin. Sometimes they need to increase in size slightly\n box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n } else {\n box.update(minBoxSize.minSize.width, maxChartAreaHeight);\n }\n }\n }\n\n // Update, and calculate the left and right margins for the horizontal boxes\n helpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n helpers.each(leftBoxes, function(box) {\n totalLeftBoxesWidth += box.width;\n });\n\n helpers.each(rightBoxes, function(box) {\n totalRightBoxesWidth += box.width;\n });\n\n // Set the Left and Right margins for the horizontal boxes\n helpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n // Figure out how much margin is on the top and bottom of the vertical boxes\n helpers.each(topBoxes, function(box) {\n totalTopBoxesHeight += box.height;\n });\n\n helpers.each(bottomBoxes, function(box) {\n totalBottomBoxesHeight += box.height;\n });\n\n function finalFitVerticalBox(box) {\n var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) {\n return minSize.box === box;\n });\n\n var scaleMargin = {\n left: 0,\n right: 0,\n top: totalTopBoxesHeight,\n bottom: totalBottomBoxesHeight\n };\n\n if (minBoxSize) {\n box.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n }\n }\n\n // Let the left layout know the final margin\n helpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n totalLeftBoxesWidth = leftPadding;\n totalRightBoxesWidth = rightPadding;\n totalTopBoxesHeight = topPadding;\n totalBottomBoxesHeight = bottomPadding;\n\n helpers.each(leftBoxes, function(box) {\n totalLeftBoxesWidth += box.width;\n });\n\n helpers.each(rightBoxes, function(box) {\n totalRightBoxesWidth += box.width;\n });\n\n helpers.each(topBoxes, function(box) {\n totalTopBoxesHeight += box.height;\n });\n helpers.each(bottomBoxes, function(box) {\n totalBottomBoxesHeight += box.height;\n });\n\n // We may be adding some padding to account for rotated x axis labels\n var leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n totalLeftBoxesWidth += leftPaddingAddition;\n totalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n var topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n totalTopBoxesHeight += topPaddingAddition;\n totalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n // Figure out if our chart area changed. This would occur if the dataset layout label rotation\n // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n // without calling `fit` again\n var newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n var newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n helpers.each(leftBoxes, function(box) {\n box.height = newMaxChartAreaHeight;\n });\n\n helpers.each(rightBoxes, function(box) {\n box.height = newMaxChartAreaHeight;\n });\n\n helpers.each(topBoxes, function(box) {\n if (!box.fullWidth) {\n box.width = newMaxChartAreaWidth;\n }\n });\n\n helpers.each(bottomBoxes, function(box) {\n if (!box.fullWidth) {\n box.width = newMaxChartAreaWidth;\n }\n });\n\n maxChartAreaHeight = newMaxChartAreaHeight;\n maxChartAreaWidth = newMaxChartAreaWidth;\n }\n\n // Step 7 - Position the boxes\n var left = leftPadding + leftPaddingAddition;\n var top = topPadding + topPaddingAddition;\n\n function placeBox(box) {\n if (box.isHorizontal()) {\n box.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth;\n box.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n box.top = top;\n box.bottom = top + box.height;\n\n // Move to next point\n top = box.bottom;\n\n } else {\n\n box.left = left;\n box.right = left + box.width;\n box.top = totalTopBoxesHeight;\n box.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n // Move to next point\n left = box.right;\n }\n }\n\n helpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n // Account for chart width and height\n left += maxChartAreaWidth;\n top += maxChartAreaHeight;\n\n helpers.each(rightBoxes, placeBox);\n helpers.each(bottomBoxes, placeBox);\n\n // Step 8\n chart.chartArea = {\n left: totalLeftBoxesWidth,\n top: totalTopBoxesHeight,\n right: totalLeftBoxesWidth + maxChartAreaWidth,\n bottom: totalTopBoxesHeight + maxChartAreaHeight\n };\n\n // Step 9\n helpers.each(chartAreaBoxes, function(box) {\n box.left = chart.chartArea.left;\n box.top = chart.chartArea.top;\n box.right = chart.chartArea.right;\n box.bottom = chart.chartArea.bottom;\n\n box.update(maxChartAreaWidth, maxChartAreaHeight);\n });\n }\n };\n };\n\n},{\"45\":45}],31:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n plugins: {}\n });\n\n module.exports = function(Chart) {\n\n /**\n * The plugin service singleton\n * @namespace Chart.plugins\n * @since 2.1.0\n */\n Chart.plugins = {\n /**\n * Globally registered plugins.\n * @private\n */\n _plugins: [],\n\n /**\n * This identifier is used to invalidate the descriptors cache attached to each chart\n * when a global plugin is registered or unregistered. In this case, the cache ID is\n * incremented and descriptors are regenerated during following API calls.\n * @private\n */\n _cacheId: 0,\n\n /**\n * Registers the given plugin(s) if not already registered.\n * @param {Array|Object} plugins plugin instance(s).\n */\n register: function(plugins) {\n var p = this._plugins;\n ([]).concat(plugins).forEach(function(plugin) {\n if (p.indexOf(plugin) === -1) {\n p.push(plugin);\n }\n });\n\n this._cacheId++;\n },\n\n /**\n * Unregisters the given plugin(s) only if registered.\n * @param {Array|Object} plugins plugin instance(s).\n */\n unregister: function(plugins) {\n var p = this._plugins;\n ([]).concat(plugins).forEach(function(plugin) {\n var idx = p.indexOf(plugin);\n if (idx !== -1) {\n p.splice(idx, 1);\n }\n });\n\n this._cacheId++;\n },\n\n /**\n * Remove all registered plugins.\n * @since 2.1.5\n */\n clear: function() {\n this._plugins = [];\n this._cacheId++;\n },\n\n /**\n * Returns the number of registered plugins?\n * @returns {Number}\n * @since 2.1.5\n */\n count: function() {\n return this._plugins.length;\n },\n\n /**\n * Returns all registered plugin instances.\n * @returns {Array} array of plugin objects.\n * @since 2.1.5\n */\n getAll: function() {\n return this._plugins;\n },\n\n /**\n * Calls enabled plugins for `chart` on the specified hook and with the given args.\n * This method immediately returns as soon as a plugin explicitly returns false. The\n * returned value can be used, for instance, to interrupt the current action.\n * @param {Object} chart - The chart instance for which plugins should be called.\n * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n * @param {Array} [args] - Extra arguments to apply to the hook call.\n * @returns {Boolean} false if any of the plugins return false, else returns true.\n */\n notify: function(chart, hook, args) {\n var descriptors = this.descriptors(chart);\n var ilen = descriptors.length;\n var i, descriptor, plugin, params, method;\n\n for (i = 0; i < ilen; ++i) {\n descriptor = descriptors[i];\n plugin = descriptor.plugin;\n method = plugin[hook];\n if (typeof method === 'function') {\n params = [chart].concat(args || []);\n params.push(descriptor.options);\n if (method.apply(plugin, params) === false) {\n return false;\n }\n }\n }\n\n return true;\n },\n\n /**\n * Returns descriptors of enabled plugins for the given chart.\n * @returns {Array} [{ plugin, options }]\n * @private\n */\n descriptors: function(chart) {\n var cache = chart._plugins || (chart._plugins = {});\n if (cache.id === this._cacheId) {\n return cache.descriptors;\n }\n\n var plugins = [];\n var descriptors = [];\n var config = (chart && chart.config) || {};\n var options = (config.options && config.options.plugins) || {};\n\n this._plugins.concat(config.plugins || []).forEach(function(plugin) {\n var idx = plugins.indexOf(plugin);\n if (idx !== -1) {\n return;\n }\n\n var id = plugin.id;\n var opts = options[id];\n if (opts === false) {\n return;\n }\n\n if (opts === true) {\n opts = helpers.clone(defaults.global.plugins[id]);\n }\n\n plugins.push(plugin);\n descriptors.push({\n plugin: plugin,\n options: opts || {}\n });\n });\n\n cache.descriptors = descriptors;\n cache.id = this._cacheId;\n return descriptors;\n }\n };\n\n /**\n * Plugin extension hooks.\n * @interface IPlugin\n * @since 2.1.0\n */\n /**\n * @method IPlugin#beforeInit\n * @desc Called before initializing `chart`.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#afterInit\n * @desc Called after `chart` has been initialized and before the first update.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeUpdate\n * @desc Called before updating `chart`. If any plugin returns `false`, the update\n * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart update.\n */\n /**\n * @method IPlugin#afterUpdate\n * @desc Called after `chart` has been updated and before rendering. Note that this\n * hook will not be called if the chart update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDatasetsUpdate\n * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n * the datasets update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} false to cancel the datasets update.\n * @since version 2.1.5\n */\n /**\n * @method IPlugin#afterDatasetsUpdate\n * @desc Called after the `chart` datasets have been updated. Note that this hook\n * will not be called if the datasets update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @since version 2.1.5\n */\n /**\n * @method IPlugin#beforeDatasetUpdate\n * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin\n * returns `false`, the datasets update is cancelled until another `update` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n /**\n * @method IPlugin#afterDatasetUpdate\n * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note\n * that this hook will not be called if the datasets update has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeLayout\n * @desc Called before laying out `chart`. If any plugin returns `false`,\n * the layout update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart layout.\n */\n /**\n * @method IPlugin#afterLayout\n * @desc Called after the `chart` has been layed out. Note that this hook will not\n * be called if the layout update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeRender\n * @desc Called before rendering `chart`. If any plugin returns `false`,\n * the rendering is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart rendering.\n */\n /**\n * @method IPlugin#afterRender\n * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n * that this hook will not be called if the rendering has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDraw\n * @desc Called before drawing `chart` at every animation frame specified by the given\n * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n * another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart drawing.\n */\n /**\n * @method IPlugin#afterDraw\n * @desc Called after the `chart` has been drawn for the specific easing value. Note\n * that this hook will not be called if the drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDatasetsDraw\n * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n * the datasets drawing is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n /**\n * @method IPlugin#afterDatasetsDraw\n * @desc Called after the `chart` datasets have been drawn. Note that this hook\n * will not be called if the datasets drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDatasetDraw\n * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets\n * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing\n * is cancelled until another `render` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n /**\n * @method IPlugin#afterDatasetDraw\n * @desc Called after the `chart` datasets at the given `args.index` have been drawn\n * (datasets are drawn in the reverse order). Note that this hook will not be called\n * if the datasets drawing has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeEvent\n * @desc Called before processing the specified `event`. If any plugin returns `false`,\n * the event will be discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#afterEvent\n * @desc Called after the `event` has been consumed. Note that this hook\n * will not be called if the `event` has been previously discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#resize\n * @desc Called after the chart as been resized.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#destroy\n * @desc Called after the chart as been destroyed.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\n /**\n * Provided for backward compatibility, use Chart.plugins instead\n * @namespace Chart.pluginService\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n Chart.pluginService = Chart.plugins;\n\n /**\n * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n * effect, instead simply create/register plugins via plain JavaScript objects.\n * @interface Chart.PluginBase\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n Chart.PluginBase = Element.extend({});\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],32:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n var Ticks = require(34);\n\n defaults._set('scale', {\n display: true,\n position: 'left',\n offset: false,\n\n // grid line settings\n gridLines: {\n display: true,\n color: 'rgba(0, 0, 0, 0.1)',\n lineWidth: 1,\n drawBorder: true,\n drawOnChartArea: true,\n drawTicks: true,\n tickMarkLength: 10,\n zeroLineWidth: 1,\n zeroLineColor: 'rgba(0,0,0,0.25)',\n zeroLineBorderDash: [],\n zeroLineBorderDashOffset: 0.0,\n offsetGridLines: false,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n // scale label\n scaleLabel: {\n // display property\n display: false,\n\n // actual label\n labelString: '',\n\n // line height\n lineHeight: 1.2,\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n beginAtZero: false,\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n padding: 0,\n reverse: false,\n display: true,\n autoSkip: true,\n autoSkipPadding: 0,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {}\n }\n });\n\n function labelsFromTicks(ticks) {\n var labels = [];\n var i, ilen;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n labels.push(ticks[i].label);\n }\n\n return labels;\n }\n\n function getLineValue(scale, index, offsetGridLines) {\n var lineValue = scale.getPixelForTick(index);\n\n if (offsetGridLines) {\n if (index === 0) {\n lineValue -= (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;\n }\n }\n return lineValue;\n }\n\n module.exports = function(Chart) {\n\n function computeTextSize(context, tick, font) {\n return helpers.isArray(tick) ?\n helpers.longestText(context, font, tick) :\n context.measureText(tick).width;\n }\n\n function parseFontOptions(options) {\n var valueOrDefault = helpers.valueOrDefault;\n var globalDefaults = defaults.global;\n var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n var style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n var family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n return {\n size: size,\n style: style,\n family: family,\n font: helpers.fontString(size, style, family)\n };\n }\n\n function parseLineHeight(options) {\n return helpers.options.toLineHeight(\n helpers.valueOrDefault(options.lineHeight, 1.2),\n helpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize));\n }\n\n Chart.Scale = Element.extend({\n /**\n * Get the padding needed for the scale\n * @method getPadding\n * @private\n * @returns {Padding} the necessary padding\n */\n getPadding: function() {\n var me = this;\n return {\n left: me.paddingLeft || 0,\n top: me.paddingTop || 0,\n right: me.paddingRight || 0,\n bottom: me.paddingBottom || 0\n };\n },\n\n /**\n * Returns the scale tick objects ({label, major})\n * @since 2.7\n */\n getTicks: function() {\n return this._ticks;\n },\n\n // These methods are ordered by lifecyle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n mergeTicksOptions: function() {\n var ticks = this.options.ticks;\n if (ticks.minor === false) {\n ticks.minor = {\n display: false\n };\n }\n if (ticks.major === false) {\n ticks.major = {\n display: false\n };\n }\n for (var key in ticks) {\n if (key !== 'major' && key !== 'minor') {\n if (typeof ticks.minor[key] === 'undefined') {\n ticks.minor[key] = ticks[key];\n }\n if (typeof ticks.major[key] === 'undefined') {\n ticks.major[key] = ticks[key];\n }\n }\n }\n },\n beforeUpdate: function() {\n helpers.callback(this.options.beforeUpdate, [this]);\n },\n update: function(maxWidth, maxHeight, margins) {\n var me = this;\n var i, ilen, labels, label, ticks, tick;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = helpers.extend({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n me.longestTextCache = me.longestTextCache || {};\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n\n // Data min/max\n me.beforeDataLimits();\n me.determineDataLimits();\n me.afterDataLimits();\n\n // Ticks - `this.ticks` is now DEPRECATED!\n // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n // and must not be accessed directly from outside this class. `this.ticks` being\n // around for long time and not marked as private, we can't change its structure\n // without unexpected breaking changes. If you need to access the scale ticks,\n // use scale.getTicks() instead.\n\n me.beforeBuildTicks();\n\n // New implementations should return an array of objects but for BACKWARD COMPAT,\n // we still support no return (`this.ticks` internally set by calling this method).\n ticks = me.buildTicks() || [];\n\n me.afterBuildTicks();\n\n me.beforeTickToLabelConversion();\n\n // New implementations should return the formatted tick labels but for BACKWARD\n // COMPAT, we still support no return (`this.ticks` internally changed by calling\n // this method and supposed to contain only string values).\n labels = me.convertTicksToLabels(ticks) || me.ticks;\n\n me.afterTickToLabelConversion();\n\n me.ticks = labels; // BACKWARD COMPATIBILITY\n\n // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!\n\n // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n tick = ticks[i];\n if (!tick) {\n ticks.push(tick = {\n label: label,\n major: false\n });\n } else {\n tick.label = label;\n }\n }\n\n me._ticks = ticks;\n\n // Tick Rotation\n me.beforeCalculateTickRotation();\n me.calculateTickRotation();\n me.afterCalculateTickRotation();\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n\n return me.minSize;\n\n },\n afterUpdate: function() {\n helpers.callback(this.options.afterUpdate, [this]);\n },\n\n //\n\n beforeSetDimensions: function() {\n helpers.callback(this.options.beforeSetDimensions, [this]);\n },\n setDimensions: function() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n },\n afterSetDimensions: function() {\n helpers.callback(this.options.afterSetDimensions, [this]);\n },\n\n // Data limits\n beforeDataLimits: function() {\n helpers.callback(this.options.beforeDataLimits, [this]);\n },\n determineDataLimits: helpers.noop,\n afterDataLimits: function() {\n helpers.callback(this.options.afterDataLimits, [this]);\n },\n\n //\n beforeBuildTicks: function() {\n helpers.callback(this.options.beforeBuildTicks, [this]);\n },\n buildTicks: helpers.noop,\n afterBuildTicks: function() {\n helpers.callback(this.options.afterBuildTicks, [this]);\n },\n\n beforeTickToLabelConversion: function() {\n helpers.callback(this.options.beforeTickToLabelConversion, [this]);\n },\n convertTicksToLabels: function() {\n var me = this;\n // Convert ticks to strings\n var tickOpts = me.options.ticks;\n me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n },\n afterTickToLabelConversion: function() {\n helpers.callback(this.options.afterTickToLabelConversion, [this]);\n },\n\n //\n\n beforeCalculateTickRotation: function() {\n helpers.callback(this.options.beforeCalculateTickRotation, [this]);\n },\n calculateTickRotation: function() {\n var me = this;\n var context = me.ctx;\n var tickOpts = me.options.ticks;\n var labels = labelsFromTicks(me._ticks);\n\n // Get the width of each grid by calculating the difference\n // between x offsets between 0 and 1.\n var tickFont = parseFontOptions(tickOpts);\n context.font = tickFont.font;\n\n var labelRotation = tickOpts.minRotation || 0;\n\n if (labels.length && me.options.display && me.isHorizontal()) {\n var originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache);\n var labelWidth = originalLabelWidth;\n var cosRotation, sinRotation;\n\n // Allow 3 pixels x2 padding either side for label readability\n var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n // Max label rotation can be set or default to 90 - also act as a loop counter\n while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n var angleRadians = helpers.toRadians(labelRotation);\n cosRotation = Math.cos(angleRadians);\n sinRotation = Math.sin(angleRadians);\n\n if (sinRotation * originalLabelWidth > me.maxHeight) {\n // go back one step\n labelRotation--;\n break;\n }\n\n labelRotation++;\n labelWidth = cosRotation * originalLabelWidth;\n }\n }\n\n me.labelRotation = labelRotation;\n },\n afterCalculateTickRotation: function() {\n helpers.callback(this.options.afterCalculateTickRotation, [this]);\n },\n\n //\n\n beforeFit: function() {\n helpers.callback(this.options.beforeFit, [this]);\n },\n fit: function() {\n var me = this;\n // Reset\n var minSize = me.minSize = {\n width: 0,\n height: 0\n };\n\n var labels = labelsFromTicks(me._ticks);\n\n var opts = me.options;\n var tickOpts = opts.ticks;\n var scaleLabelOpts = opts.scaleLabel;\n var gridLineOpts = opts.gridLines;\n var display = opts.display;\n var isHorizontal = me.isHorizontal();\n\n var tickFont = parseFontOptions(tickOpts);\n var tickMarkLength = opts.gridLines.tickMarkLength;\n\n // Width\n if (isHorizontal) {\n // subtract the margins to line up with the chartArea if we are a full width scale\n minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n } else {\n minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n }\n\n // height\n if (isHorizontal) {\n minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n } else {\n minSize.height = me.maxHeight; // fill all the height\n }\n\n // Are we showing a title for the scale?\n if (scaleLabelOpts.display && display) {\n var scaleLabelLineHeight = parseLineHeight(scaleLabelOpts);\n var scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding);\n var deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height;\n\n if (isHorizontal) {\n minSize.height += deltaHeight;\n } else {\n minSize.width += deltaHeight;\n }\n }\n\n // Don't bother fitting the ticks if we are not showing them\n if (tickOpts.display && display) {\n var largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache);\n var tallestLabelHeightInLines = helpers.numberOfLabelLines(labels);\n var lineSpace = tickFont.size * 0.5;\n var tickPadding = me.options.ticks.padding;\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n me.longestLabelWidth = largestTextWidth;\n\n var angleRadians = helpers.toRadians(me.labelRotation);\n var cosRotation = Math.cos(angleRadians);\n var sinRotation = Math.sin(angleRadians);\n\n // TODO - improve this calculation\n var labelHeight = (sinRotation * largestTextWidth)\n + (tickFont.size * tallestLabelHeightInLines)\n + (lineSpace * (tallestLabelHeightInLines - 1))\n + lineSpace; // padding\n\n minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n\n me.ctx.font = tickFont.font;\n var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font);\n var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font);\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (me.labelRotation !== 0) {\n me.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges\n me.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3;\n } else {\n me.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n me.paddingRight = lastLabelWidth / 2 + 3;\n }\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n if (tickOpts.mirror) {\n largestTextWidth = 0;\n } else {\n // use lineSpace for consistency with horizontal axis\n // tickPadding is not implemented for horizontal\n largestTextWidth += tickPadding + lineSpace;\n }\n\n minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n\n me.paddingTop = tickFont.size / 2;\n me.paddingBottom = tickFont.size / 2;\n }\n }\n\n me.handleMargins();\n\n me.width = minSize.width;\n me.height = minSize.height;\n },\n\n /**\n * Handle margins and padding interactions\n * @private\n */\n handleMargins: function() {\n var me = this;\n if (me.margins) {\n me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n }\n },\n\n afterFit: function() {\n helpers.callback(this.options.afterFit, [this]);\n },\n\n // Shared Methods\n isHorizontal: function() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n },\n isFullWidth: function() {\n return (this.options.fullWidth);\n },\n\n // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n getRightValue: function(rawValue) {\n // Null and undefined values first\n if (helpers.isNullOrUndef(rawValue)) {\n return NaN;\n }\n // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n if (typeof rawValue === 'number' && !isFinite(rawValue)) {\n return NaN;\n }\n // If it is in fact an object, dive in one more level\n if (rawValue) {\n if (this.isHorizontal()) {\n if (rawValue.x !== undefined) {\n return this.getRightValue(rawValue.x);\n }\n } else if (rawValue.y !== undefined) {\n return this.getRightValue(rawValue.y);\n }\n }\n\n // Value is good, return it\n return rawValue;\n },\n\n // Used to get the value to display in the tooltip for the data at the given index\n // function getLabelForIndex(index, datasetIndex)\n getLabelForIndex: helpers.noop,\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue: helpers.noop,\n\n // Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n getValueForPixel: helpers.noop,\n\n // Used for tick location, should\n getPixelForTick: function(index) {\n var me = this;\n var offset = me.options.offset;\n if (me.isHorizontal()) {\n var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n var pixel = (tickWidth * index) + me.paddingLeft;\n\n if (offset) {\n pixel += tickWidth / 2;\n }\n\n var finalVal = me.left + Math.round(pixel);\n finalVal += me.isFullWidth() ? me.margins.left : 0;\n return finalVal;\n }\n var innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n return me.top + (index * (innerHeight / (me._ticks.length - 1)));\n },\n\n // Utility for getting the pixel location of a percentage of scale\n getPixelForDecimal: function(decimal) {\n var me = this;\n if (me.isHorizontal()) {\n var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n var valueOffset = (innerWidth * decimal) + me.paddingLeft;\n\n var finalVal = me.left + Math.round(valueOffset);\n finalVal += me.isFullWidth() ? me.margins.left : 0;\n return finalVal;\n }\n return me.top + (decimal * me.height);\n },\n\n getBasePixel: function() {\n return this.getPixelForValue(this.getBaseValue());\n },\n\n getBaseValue: function() {\n var me = this;\n var min = me.min;\n var max = me.max;\n\n return me.beginAtZero ? 0 :\n min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n },\n\n /**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @private\n */\n _autoSkip: function(ticks) {\n var skipRatio;\n var me = this;\n var isHorizontal = me.isHorizontal();\n var optionTicks = me.options.ticks.minor;\n var tickCount = ticks.length;\n var labelRotationRadians = helpers.toRadians(me.labelRotation);\n var cosRotation = Math.cos(labelRotationRadians);\n var longestRotatedLabel = me.longestLabelWidth * cosRotation;\n var result = [];\n var i, tick, shouldSkip;\n\n // figure out the maximum number of gridlines to show\n var maxTicks;\n if (optionTicks.maxTicksLimit) {\n maxTicks = optionTicks.maxTicksLimit;\n }\n\n if (isHorizontal) {\n skipRatio = false;\n\n if ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) {\n skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight)));\n }\n\n // if they defined a max number of optionTicks,\n // increase skipRatio until that number is met\n if (maxTicks && tickCount > maxTicks) {\n skipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks));\n }\n }\n\n for (i = 0; i < tickCount; i++) {\n tick = ticks[i];\n\n // Since we always show the last tick,we need may need to hide the last shown one before\n shouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount);\n if (shouldSkip && i !== tickCount - 1 || helpers.isNullOrUndef(tick.label)) {\n // leave tick in place but make sure it's not displayed (#4635)\n delete tick.label;\n }\n result.push(tick);\n }\n return result;\n },\n\n // Actually draw the scale on the canvas\n // @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n draw: function(chartArea) {\n var me = this;\n var options = me.options;\n if (!options.display) {\n return;\n }\n\n var context = me.ctx;\n var globalDefaults = defaults.global;\n var optionTicks = options.ticks.minor;\n var optionMajorTicks = options.ticks.major || optionTicks;\n var gridLines = options.gridLines;\n var scaleLabel = options.scaleLabel;\n\n var isRotated = me.labelRotation !== 0;\n var isHorizontal = me.isHorizontal();\n\n var ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();\n var tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n var tickFont = parseFontOptions(optionTicks);\n var majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor);\n var majorTickFont = parseFontOptions(optionMajorTicks);\n\n var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\n var scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n var scaleLabelFont = parseFontOptions(scaleLabel);\n var scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding);\n var labelRotationRadians = helpers.toRadians(me.labelRotation);\n\n var itemsToDraw = [];\n\n var xTickStart = options.position === 'right' ? me.left : me.right - tl;\n var xTickEnd = options.position === 'right' ? me.left + tl : me.right;\n var yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl;\n var yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom;\n\n helpers.each(ticks, function(tick, index) {\n // autoskipper skipped this tick (#4635)\n if (tick.label === undefined) {\n return;\n }\n\n var label = tick.label;\n var lineWidth, lineColor, borderDash, borderDashOffset;\n if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {\n // Draw the first index specially\n lineWidth = gridLines.zeroLineWidth;\n lineColor = gridLines.zeroLineColor;\n borderDash = gridLines.zeroLineBorderDash;\n borderDashOffset = gridLines.zeroLineBorderDashOffset;\n } else {\n lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index);\n lineColor = helpers.valueAtIndexOrDefault(gridLines.color, index);\n borderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n borderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n }\n\n // Common properties\n var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n var textAlign = 'middle';\n var textBaseline = 'middle';\n var tickPadding = optionTicks.padding;\n\n if (isHorizontal) {\n var labelYOffset = tl + tickPadding;\n\n if (options.position === 'bottom') {\n // bottom\n textBaseline = !isRotated ? 'top' : 'middle';\n textAlign = !isRotated ? 'center' : 'right';\n labelY = me.top + labelYOffset;\n } else {\n // top\n textBaseline = !isRotated ? 'bottom' : 'middle';\n textAlign = !isRotated ? 'center' : 'left';\n labelY = me.bottom - labelYOffset;\n }\n\n var xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n if (xLineValue < me.left) {\n lineColor = 'rgba(0,0,0,0)';\n }\n xLineValue += helpers.aliasPixel(lineWidth);\n\n labelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n tx1 = tx2 = x1 = x2 = xLineValue;\n ty1 = yTickStart;\n ty2 = yTickEnd;\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n } else {\n var isLeft = options.position === 'left';\n var labelXOffset;\n\n if (optionTicks.mirror) {\n textAlign = isLeft ? 'left' : 'right';\n labelXOffset = tickPadding;\n } else {\n textAlign = isLeft ? 'right' : 'left';\n labelXOffset = tl + tickPadding;\n }\n\n labelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n var yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n if (yLineValue < me.top) {\n lineColor = 'rgba(0,0,0,0)';\n }\n yLineValue += helpers.aliasPixel(lineWidth);\n\n labelY = me.getPixelForTick(index) + optionTicks.labelOffset;\n\n tx1 = xTickStart;\n tx2 = xTickEnd;\n x1 = chartArea.left;\n x2 = chartArea.right;\n ty1 = ty2 = y1 = y2 = yLineValue;\n }\n\n itemsToDraw.push({\n tx1: tx1,\n ty1: ty1,\n tx2: tx2,\n ty2: ty2,\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2,\n labelX: labelX,\n labelY: labelY,\n glWidth: lineWidth,\n glColor: lineColor,\n glBorderDash: borderDash,\n glBorderDashOffset: borderDashOffset,\n rotation: -1 * labelRotationRadians,\n label: label,\n major: tick.major,\n textBaseline: textBaseline,\n textAlign: textAlign\n });\n });\n\n // Draw all of the tick labels, tick marks, and grid lines at the correct places\n helpers.each(itemsToDraw, function(itemToDraw) {\n if (gridLines.display) {\n context.save();\n context.lineWidth = itemToDraw.glWidth;\n context.strokeStyle = itemToDraw.glColor;\n if (context.setLineDash) {\n context.setLineDash(itemToDraw.glBorderDash);\n context.lineDashOffset = itemToDraw.glBorderDashOffset;\n }\n\n context.beginPath();\n\n if (gridLines.drawTicks) {\n context.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n context.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n }\n\n if (gridLines.drawOnChartArea) {\n context.moveTo(itemToDraw.x1, itemToDraw.y1);\n context.lineTo(itemToDraw.x2, itemToDraw.y2);\n }\n\n context.stroke();\n context.restore();\n }\n\n if (optionTicks.display) {\n // Make sure we draw text in the correct color and font\n context.save();\n context.translate(itemToDraw.labelX, itemToDraw.labelY);\n context.rotate(itemToDraw.rotation);\n context.font = itemToDraw.major ? majorTickFont.font : tickFont.font;\n context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;\n context.textBaseline = itemToDraw.textBaseline;\n context.textAlign = itemToDraw.textAlign;\n\n var label = itemToDraw.label;\n if (helpers.isArray(label)) {\n for (var i = 0, y = 0; i < label.length; ++i) {\n // We just make sure the multiline element is a string here..\n context.fillText('' + label[i], 0, y);\n // apply same lineSpacing as calculated @ L#320\n y += (tickFont.size * 1.5);\n }\n } else {\n context.fillText(label, 0, 0);\n }\n context.restore();\n }\n });\n\n if (scaleLabel.display) {\n // Draw the scale label\n var scaleLabelX;\n var scaleLabelY;\n var rotation = 0;\n var halfLineHeight = parseLineHeight(scaleLabel) / 2;\n\n if (isHorizontal) {\n scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\n scaleLabelY = options.position === 'bottom'\n ? me.bottom - halfLineHeight - scaleLabelPadding.bottom\n : me.top + halfLineHeight + scaleLabelPadding.top;\n } else {\n var isLeft = options.position === 'left';\n scaleLabelX = isLeft\n ? me.left + halfLineHeight + scaleLabelPadding.top\n : me.right - halfLineHeight - scaleLabelPadding.top;\n scaleLabelY = me.top + ((me.bottom - me.top) / 2);\n rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n }\n\n context.save();\n context.translate(scaleLabelX, scaleLabelY);\n context.rotate(rotation);\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n context.fillStyle = scaleLabelFontColor; // render in correct colour\n context.font = scaleLabelFont.font;\n context.fillText(scaleLabel.labelString, 0, 0);\n context.restore();\n }\n\n if (gridLines.drawBorder) {\n // Draw the line at the edge of the axis\n context.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0);\n context.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0);\n var x1 = me.left;\n var x2 = me.right;\n var y1 = me.top;\n var y2 = me.bottom;\n\n var aliasPixel = helpers.aliasPixel(context.lineWidth);\n if (isHorizontal) {\n y1 = y2 = options.position === 'top' ? me.bottom : me.top;\n y1 += aliasPixel;\n y2 += aliasPixel;\n } else {\n x1 = x2 = options.position === 'left' ? me.right : me.left;\n x1 += aliasPixel;\n x2 += aliasPixel;\n }\n\n context.beginPath();\n context.moveTo(x1, y1);\n context.lineTo(x2, y2);\n context.stroke();\n }\n }\n });\n };\n\n},{\"25\":25,\"26\":26,\"34\":34,\"45\":45}],33:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n Chart.scaleService = {\n // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n // use the new chart options to grab the correct scale\n constructors: {},\n // Use a registration function so that we can move to an ES6 map when we no longer need to support\n // old browsers\n\n // Scale config defaults\n defaults: {},\n registerScaleType: function(type, scaleConstructor, scaleDefaults) {\n this.constructors[type] = scaleConstructor;\n this.defaults[type] = helpers.clone(scaleDefaults);\n },\n getScaleConstructor: function(type) {\n return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n },\n getScaleDefaults: function(type) {\n // Return the scale defaults merged with the global settings so that we always use the latest ones\n return this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {};\n },\n updateScaleDefaults: function(type, additions) {\n var me = this;\n if (me.defaults.hasOwnProperty(type)) {\n me.defaults[type] = helpers.extend(me.defaults[type], additions);\n }\n },\n addScalesToLayout: function(chart) {\n // Adds each scale to the chart.boxes array to be sized accordingly\n helpers.each(chart.scales, function(scale) {\n // Set ILayoutItem parameters for backwards compatibility\n scale.fullWidth = scale.options.fullWidth;\n scale.position = scale.options.position;\n scale.weight = scale.options.weight;\n Chart.layoutService.addBox(chart, scale);\n });\n }\n };\n };\n\n},{\"25\":25,\"45\":45}],34:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n /**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\n module.exports = {\n /**\n * Namespace to hold generators for different types of ticks\n * @namespace Chart.Ticks.generators\n */\n generators: {\n /**\n * Interface for the options provided to the numeric tick generator\n * @interface INumericTickGenerationOptions\n */\n /**\n * The maximum number of ticks to display\n * @name INumericTickGenerationOptions#maxTicks\n * @type Number\n */\n /**\n * The distance between each tick.\n * @name INumericTickGenerationOptions#stepSize\n * @type Number\n * @optional\n */\n /**\n * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum\n * @name INumericTickGenerationOptions#min\n * @type Number\n * @optional\n */\n /**\n * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum\n * @name INumericTickGenerationOptions#max\n * @type Number\n * @optional\n */\n\n /**\n * Generate a set of linear ticks\n * @method Chart.Ticks.generators.linear\n * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n * @param dataRange {IRange} the range of the data\n * @returns {Array} array of tick values\n */\n linear: function(generationOptions, dataRange) {\n var ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n var spacing;\n if (generationOptions.stepSize && generationOptions.stepSize > 0) {\n spacing = generationOptions.stepSize;\n } else {\n var niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);\n spacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);\n }\n var niceMin = Math.floor(dataRange.min / spacing) * spacing;\n var niceMax = Math.ceil(dataRange.max / spacing) * spacing;\n\n // If min, max and stepSize is set and they make an evenly spaced scale use it.\n if (generationOptions.min && generationOptions.max && generationOptions.stepSize) {\n // If very close to our whole number, use it.\n if (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) {\n niceMin = generationOptions.min;\n niceMax = generationOptions.max;\n }\n }\n\n var numSpaces = (niceMax - niceMin) / spacing;\n // If very close to our rounded value, use it.\n if (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n\n // Put the values into the ticks array\n ticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin);\n for (var j = 1; j < numSpaces; ++j) {\n ticks.push(niceMin + (j * spacing));\n }\n ticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax);\n\n return ticks;\n },\n\n /**\n * Generate a set of logarithmic ticks\n * @method Chart.Ticks.generators.logarithmic\n * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n * @param dataRange {IRange} the range of the data\n * @returns {Array} array of tick values\n */\n logarithmic: function(generationOptions, dataRange) {\n var ticks = [];\n var valueOrDefault = helpers.valueOrDefault;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph\n var tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min))));\n\n var endExp = Math.floor(helpers.log10(dataRange.max));\n var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n var exp, significand;\n\n if (tickVal === 0) {\n exp = Math.floor(helpers.log10(dataRange.minNotZero));\n significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n ticks.push(tickVal);\n tickVal = significand * Math.pow(10, exp);\n } else {\n exp = Math.floor(helpers.log10(tickVal));\n significand = Math.floor(tickVal / Math.pow(10, exp));\n }\n\n do {\n ticks.push(tickVal);\n\n ++significand;\n if (significand === 10) {\n significand = 1;\n ++exp;\n }\n\n tickVal = significand * Math.pow(10, exp);\n } while (exp < endExp || (exp === endExp && significand < endSignificand));\n\n var lastTick = valueOrDefault(generationOptions.max, tickVal);\n ticks.push(lastTick);\n\n return ticks;\n }\n },\n\n /**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\n formatters: {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {String|Array} the label to display\n */\n values: function(value) {\n return helpers.isArray(value) ? value : '' + value;\n },\n\n /**\n * Formatter for linear numeric ticks\n * @method Chart.Ticks.formatters.linear\n * @param tickValue {Number} the value to be formatted\n * @param index {Number} the position of the tickValue parameter in the ticks array\n * @param ticks {Array} the list of ticks being converted\n * @return {String} string representation of the tickValue parameter\n */\n linear: function(tickValue, index, ticks) {\n // If we have lots of ticks, don't use the ones\n var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) > 1) {\n if (tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n }\n\n var logDelta = helpers.log10(Math.abs(delta));\n var tickString = '';\n\n if (tickValue !== 0) {\n var numDecimal = -1 * Math.floor(logDelta);\n numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n tickString = tickValue.toFixed(numDecimal);\n } else {\n tickString = '0'; // never show decimal places for 0\n }\n\n return tickString;\n },\n\n logarithmic: function(tickValue, index, ticks) {\n var remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue))));\n\n if (tickValue === 0) {\n return '0';\n } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n return tickValue.toExponential();\n }\n return '';\n }\n }\n };\n\n},{\"45\":45}],35:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n tooltips: {\n enabled: true,\n custom: null,\n mode: 'nearest',\n position: 'average',\n intersect: true,\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleFontStyle: 'bold',\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleFontColor: '#fff',\n titleAlign: 'left',\n bodySpacing: 2,\n bodyFontColor: '#fff',\n bodyAlign: 'left',\n footerFontStyle: 'bold',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFontColor: '#fff',\n footerAlign: 'left',\n yPadding: 6,\n xPadding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n multiKeyBackground: '#fff',\n displayColors: true,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n callbacks: {\n // Args are: (tooltipItems, data)\n beforeTitle: helpers.noop,\n title: function(tooltipItems, data) {\n // Pick first xLabel for now\n var title = '';\n var labels = data.labels;\n var labelCount = labels ? labels.length : 0;\n\n if (tooltipItems.length > 0) {\n var item = tooltipItems[0];\n\n if (item.xLabel) {\n title = item.xLabel;\n } else if (labelCount > 0 && item.index < labelCount) {\n title = labels[item.index];\n }\n }\n\n return title;\n },\n afterTitle: helpers.noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: helpers.noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: helpers.noop,\n label: function(tooltipItem, data) {\n var label = data.datasets[tooltipItem.datasetIndex].label || '';\n\n if (label) {\n label += ': ';\n }\n label += tooltipItem.yLabel;\n return label;\n },\n labelColor: function(tooltipItem, chart) {\n var meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n var activeElement = meta.data[tooltipItem.index];\n var view = activeElement._view;\n return {\n borderColor: view.borderColor,\n backgroundColor: view.backgroundColor\n };\n },\n labelTextColor: function() {\n return this._options.bodyFontColor;\n },\n afterLabel: helpers.noop,\n\n // Args are: (tooltipItems, data)\n afterBody: helpers.noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: helpers.noop,\n footer: helpers.noop,\n afterFooter: helpers.noop\n }\n }\n });\n\n module.exports = function(Chart) {\n\n /**\n * Helper method to merge the opacity into a color\n */\n function mergeOpacity(colorString, opacity) {\n var color = helpers.color(colorString);\n return color.alpha(opacity * color.alpha()).rgbaString();\n }\n\n // Helper to push or concat based on if the 2nd parameter is an array or not\n function pushOrConcat(base, toPush) {\n if (toPush) {\n if (helpers.isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n }\n\n // Private helper to create a tooltip item model\n // @param element : the chart element (point, arc, bar) to create the tooltip item for\n // @return : new tooltip item\n function createTooltipItem(element) {\n var xScale = element._xScale;\n var yScale = element._yScale || element._scale; // handle radar || polarArea charts\n var index = element._index;\n var datasetIndex = element._datasetIndex;\n\n return {\n xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n index: index,\n datasetIndex: datasetIndex,\n x: element._model.x,\n y: element._model.y\n };\n }\n\n /**\n * Helper to get the reset model for the tooltip\n * @param tooltipOpts {Object} the tooltip options\n */\n function getBaseModel(tooltipOpts) {\n var globalDefaults = defaults.global;\n var valueOrDefault = helpers.valueOrDefault;\n\n return {\n // Positioning\n xPadding: tooltipOpts.xPadding,\n yPadding: tooltipOpts.yPadding,\n xAlign: tooltipOpts.xAlign,\n yAlign: tooltipOpts.yAlign,\n\n // Body\n bodyFontColor: tooltipOpts.bodyFontColor,\n _bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n _bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n _bodyAlign: tooltipOpts.bodyAlign,\n bodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n bodySpacing: tooltipOpts.bodySpacing,\n\n // Title\n titleFontColor: tooltipOpts.titleFontColor,\n _titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n _titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n titleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n _titleAlign: tooltipOpts.titleAlign,\n titleSpacing: tooltipOpts.titleSpacing,\n titleMarginBottom: tooltipOpts.titleMarginBottom,\n\n // Footer\n footerFontColor: tooltipOpts.footerFontColor,\n _footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n _footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n footerFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n _footerAlign: tooltipOpts.footerAlign,\n footerSpacing: tooltipOpts.footerSpacing,\n footerMarginTop: tooltipOpts.footerMarginTop,\n\n // Appearance\n caretSize: tooltipOpts.caretSize,\n cornerRadius: tooltipOpts.cornerRadius,\n backgroundColor: tooltipOpts.backgroundColor,\n opacity: 0,\n legendColorBackground: tooltipOpts.multiKeyBackground,\n displayColors: tooltipOpts.displayColors,\n borderColor: tooltipOpts.borderColor,\n borderWidth: tooltipOpts.borderWidth\n };\n }\n\n /**\n * Get the size of the tooltip\n */\n function getTooltipSize(tooltip, model) {\n var ctx = tooltip._chart.ctx;\n\n var height = model.yPadding * 2; // Tooltip Padding\n var width = 0;\n\n // Count of all lines in the body\n var body = model.body;\n var combinedBodyLength = body.reduce(function(count, bodyItem) {\n return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n }, 0);\n combinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n var titleLineCount = model.title.length;\n var footerLineCount = model.footer.length;\n var titleFontSize = model.titleFontSize;\n var bodyFontSize = model.bodyFontSize;\n var footerFontSize = model.footerFontSize;\n\n height += titleLineCount * titleFontSize; // Title Lines\n height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n height += combinedBodyLength * bodyFontSize; // Body Lines\n height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n height += footerLineCount * (footerFontSize); // Footer Lines\n height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n // Title width\n var widthPadding = 0;\n var maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n helpers.each(model.title, maxLineWidth);\n\n // Body width\n ctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n helpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\n helpers.each(body, function(bodyItem) {\n helpers.each(bodyItem.before, maxLineWidth);\n helpers.each(bodyItem.lines, maxLineWidth);\n helpers.each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n helpers.each(model.footer, maxLineWidth);\n\n // Add padding\n width += 2 * model.xPadding;\n\n return {\n width: width,\n height: height\n };\n }\n\n /**\n * Helper to get the alignment of a tooltip given the size\n */\n function determineAlignment(tooltip, size) {\n var model = tooltip._model;\n var chart = tooltip._chart;\n var chartArea = tooltip._chart.chartArea;\n var xAlign = 'center';\n var yAlign = 'center';\n\n if (model.y < size.height) {\n yAlign = 'top';\n } else if (model.y > (chart.height - size.height)) {\n yAlign = 'bottom';\n }\n\n var lf, rf; // functions to determine left, right alignment\n var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n var midX = (chartArea.left + chartArea.right) / 2;\n var midY = (chartArea.top + chartArea.bottom) / 2;\n\n if (yAlign === 'center') {\n lf = function(x) {\n return x <= midX;\n };\n rf = function(x) {\n return x > midX;\n };\n } else {\n lf = function(x) {\n return x <= (size.width / 2);\n };\n rf = function(x) {\n return x >= (chart.width - (size.width / 2));\n };\n }\n\n olf = function(x) {\n return x + size.width > chart.width;\n };\n orf = function(x) {\n return x - size.width < 0;\n };\n yf = function(y) {\n return y <= midY ? 'top' : 'bottom';\n };\n\n if (lf(model.x)) {\n xAlign = 'left';\n\n // Is tooltip too wide and goes over the right side of the chart.?\n if (olf(model.x)) {\n xAlign = 'center';\n yAlign = yf(model.y);\n }\n } else if (rf(model.x)) {\n xAlign = 'right';\n\n // Is tooltip too wide and goes outside left edge of canvas?\n if (orf(model.x)) {\n xAlign = 'center';\n yAlign = yf(model.y);\n }\n }\n\n var opts = tooltip._options;\n return {\n xAlign: opts.xAlign ? opts.xAlign : xAlign,\n yAlign: opts.yAlign ? opts.yAlign : yAlign\n };\n }\n\n /**\n * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\n function getBackgroundPoint(vm, size, alignment) {\n // Background Position\n var x = vm.x;\n var y = vm.y;\n\n var caretSize = vm.caretSize;\n var caretPadding = vm.caretPadding;\n var cornerRadius = vm.cornerRadius;\n var xAlign = alignment.xAlign;\n var yAlign = alignment.yAlign;\n var paddingAndSize = caretSize + caretPadding;\n var radiusAndPadding = cornerRadius + caretPadding;\n\n if (xAlign === 'right') {\n x -= size.width;\n } else if (xAlign === 'center') {\n x -= (size.width / 2);\n }\n\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= size.height + paddingAndSize;\n } else {\n y -= (size.height / 2);\n }\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= radiusAndPadding;\n } else if (xAlign === 'right') {\n x += radiusAndPadding;\n }\n\n return {\n x: x,\n y: y\n };\n }\n\n Chart.Tooltip = Element.extend({\n initialize: function() {\n this._model = getBaseModel(this._options);\n },\n\n // Get the title\n // Args are: (tooltipItem, data)\n getTitle: function() {\n var me = this;\n var opts = me._options;\n var callbacks = opts.callbacks;\n\n var beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n var title = callbacks.title.apply(me, arguments);\n var afterTitle = callbacks.afterTitle.apply(me, arguments);\n\n var lines = [];\n lines = pushOrConcat(lines, beforeTitle);\n lines = pushOrConcat(lines, title);\n lines = pushOrConcat(lines, afterTitle);\n\n return lines;\n },\n\n // Args are: (tooltipItem, data)\n getBeforeBody: function() {\n var lines = this._options.callbacks.beforeBody.apply(this, arguments);\n return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n },\n\n // Args are: (tooltipItem, data)\n getBody: function(tooltipItems, data) {\n var me = this;\n var callbacks = me._options.callbacks;\n var bodyItems = [];\n\n helpers.each(tooltipItems, function(tooltipItem) {\n var bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n pushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\n pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n pushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n },\n\n // Args are: (tooltipItem, data)\n getAfterBody: function() {\n var lines = this._options.callbacks.afterBody.apply(this, arguments);\n return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n },\n\n // Get the footer and beforeFooter and afterFooter lines\n // Args are: (tooltipItem, data)\n getFooter: function() {\n var me = this;\n var callbacks = me._options.callbacks;\n\n var beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n var footer = callbacks.footer.apply(me, arguments);\n var afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n var lines = [];\n lines = pushOrConcat(lines, beforeFooter);\n lines = pushOrConcat(lines, footer);\n lines = pushOrConcat(lines, afterFooter);\n\n return lines;\n },\n\n update: function(changed) {\n var me = this;\n var opts = me._options;\n\n // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n // which breaks any animations.\n var existingModel = me._model;\n var model = me._model = getBaseModel(opts);\n var active = me._active;\n\n var data = me._data;\n\n // In the case where active.length === 0 we need to keep these at existing values for good animations\n var alignment = {\n xAlign: existingModel.xAlign,\n yAlign: existingModel.yAlign\n };\n var backgroundPoint = {\n x: existingModel.x,\n y: existingModel.y\n };\n var tooltipSize = {\n width: existingModel.width,\n height: existingModel.height\n };\n var tooltipPosition = {\n x: existingModel.caretX,\n y: existingModel.caretY\n };\n\n var i, len;\n\n if (active.length) {\n model.opacity = 1;\n\n var labelColors = [];\n var labelTextColors = [];\n tooltipPosition = Chart.Tooltip.positioners[opts.position](active, me._eventPosition);\n\n var tooltipItems = [];\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (opts.filter) {\n tooltipItems = tooltipItems.filter(function(a) {\n return opts.filter(a, data);\n });\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (opts.itemSort) {\n tooltipItems = tooltipItems.sort(function(a, b) {\n return opts.itemSort(a, b, data);\n });\n }\n\n // Determine colors for boxes\n helpers.each(tooltipItems, function(tooltipItem) {\n labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n });\n\n\n // Build the Text Lines\n model.title = me.getTitle(tooltipItems, data);\n model.beforeBody = me.getBeforeBody(tooltipItems, data);\n model.body = me.getBody(tooltipItems, data);\n model.afterBody = me.getAfterBody(tooltipItems, data);\n model.footer = me.getFooter(tooltipItems, data);\n\n // Initial positioning and colors\n model.x = Math.round(tooltipPosition.x);\n model.y = Math.round(tooltipPosition.y);\n model.caretPadding = opts.caretPadding;\n model.labelColors = labelColors;\n model.labelTextColors = labelTextColors;\n\n // data points\n model.dataPoints = tooltipItems;\n\n // We need to determine alignment of the tooltip\n tooltipSize = getTooltipSize(this, model);\n alignment = determineAlignment(this, tooltipSize);\n // Final Size and Position\n backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment);\n } else {\n model.opacity = 0;\n }\n\n model.xAlign = alignment.xAlign;\n model.yAlign = alignment.yAlign;\n model.x = backgroundPoint.x;\n model.y = backgroundPoint.y;\n model.width = tooltipSize.width;\n model.height = tooltipSize.height;\n\n // Point where the caret on the tooltip points to\n model.caretX = tooltipPosition.x;\n model.caretY = tooltipPosition.y;\n\n me._model = model;\n\n if (changed && opts.custom) {\n opts.custom.call(me, model);\n }\n\n return me;\n },\n drawCaret: function(tooltipPoint, size) {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n },\n getCaretPosition: function(tooltipPoint, size, vm) {\n var x1, x2, x3, y1, y2, y3;\n var caretSize = vm.caretSize;\n var cornerRadius = vm.cornerRadius;\n var xAlign = vm.xAlign;\n var yAlign = vm.yAlign;\n var ptX = tooltipPoint.x;\n var ptY = tooltipPoint.y;\n var width = size.width;\n var height = size.height;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n x3 = x1;\n\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n x3 = x1;\n\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n } else {\n if (xAlign === 'left') {\n x2 = ptX + cornerRadius + (caretSize);\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else if (xAlign === 'right') {\n x2 = ptX + width - cornerRadius - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n x2 = ptX + (width / 2);\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n y3 = y1;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n y3 = y1;\n // invert drawing order\n var tmp = x3;\n x3 = x1;\n x1 = tmp;\n }\n }\n return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};\n },\n drawTitle: function(pt, vm, ctx, opacity) {\n var title = vm.title;\n\n if (title.length) {\n ctx.textAlign = vm._titleAlign;\n ctx.textBaseline = 'top';\n\n var titleFontSize = vm.titleFontSize;\n var titleSpacing = vm.titleSpacing;\n\n ctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n var i, len;\n for (i = 0, len = title.length; i < len; ++i) {\n ctx.fillText(title[i], pt.x, pt.y);\n pt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n if (i + 1 === title.length) {\n pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n },\n drawBody: function(pt, vm, ctx, opacity) {\n var bodyFontSize = vm.bodyFontSize;\n var bodySpacing = vm.bodySpacing;\n var body = vm.body;\n\n ctx.textAlign = vm._bodyAlign;\n ctx.textBaseline = 'top';\n ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n // Before Body\n var xLinePadding = 0;\n var fillLineOfText = function(line) {\n ctx.fillText(line, pt.x + xLinePadding, pt.y);\n pt.y += bodyFontSize + bodySpacing;\n };\n\n // Before body lines\n helpers.each(vm.beforeBody, fillLineOfText);\n\n var drawColorBoxes = vm.displayColors;\n xLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\n\n // Draw body lines now\n helpers.each(body, function(bodyItem, i) {\n helpers.each(bodyItem.before, fillLineOfText);\n\n helpers.each(bodyItem.lines, function(line) {\n // Draw Legend-like boxes if needed\n if (drawColorBoxes) {\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n ctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n ctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n // Border\n ctx.lineWidth = 1;\n ctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n ctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n // Inner square\n ctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n ctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n var textColor = mergeOpacity(vm.labelTextColors[i], opacity);\n ctx.fillStyle = textColor;\n }\n\n fillLineOfText(line);\n });\n\n helpers.each(bodyItem.after, fillLineOfText);\n });\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n\n // After body lines\n helpers.each(vm.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n },\n drawFooter: function(pt, vm, ctx, opacity) {\n var footer = vm.footer;\n\n if (footer.length) {\n pt.y += vm.footerMarginTop;\n\n ctx.textAlign = vm._footerAlign;\n ctx.textBaseline = 'top';\n\n ctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n helpers.each(footer, function(line) {\n ctx.fillText(line, pt.x, pt.y);\n pt.y += vm.footerFontSize + vm.footerSpacing;\n });\n }\n },\n drawBackground: function(pt, vm, ctx, tooltipSize, opacity) {\n ctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n ctx.strokeStyle = mergeOpacity(vm.borderColor, opacity);\n ctx.lineWidth = vm.borderWidth;\n var xAlign = vm.xAlign;\n var yAlign = vm.yAlign;\n var x = pt.x;\n var y = pt.y;\n var width = tooltipSize.width;\n var height = tooltipSize.height;\n var radius = vm.cornerRadius;\n\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (vm.borderWidth > 0) {\n ctx.stroke();\n }\n },\n draw: function() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n\n if (vm.opacity === 0) {\n return;\n }\n\n var tooltipSize = {\n width: vm.width,\n height: vm.height\n };\n var pt = {\n x: vm.x,\n y: vm.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n // Truthy/falsey value for empty tooltip\n var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n if (this._options.enabled && hasTooltipContent) {\n // Draw Background\n this.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n // Draw Title, Body, and Footer\n pt.x += vm.xPadding;\n pt.y += vm.yPadding;\n\n // Titles\n this.drawTitle(pt, vm, ctx, opacity);\n\n // Body\n this.drawBody(pt, vm, ctx, opacity);\n\n // Footer\n this.drawFooter(pt, vm, ctx, opacity);\n }\n },\n\n /**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n * @returns {Boolean} true if the tooltip changed\n */\n handleEvent: function(e) {\n var me = this;\n var options = me._options;\n var changed = false;\n\n me._lastActive = me._lastActive || [];\n\n // Find Active Elements for tooltips\n if (e.type === 'mouseout') {\n me._active = [];\n } else {\n me._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n }\n\n // Remember Last Actives\n changed = !helpers.arrayEquals(me._active, me._lastActive);\n\n // If tooltip didn't change, do not handle the target event\n if (!changed) {\n return false;\n }\n\n me._lastActive = me._active;\n\n if (options.enabled || options.custom) {\n me._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n var model = me._model;\n me.update(true);\n me.pivot();\n\n // See if our tooltip position changed\n changed |= (model.x !== me._model.x) || (model.y !== me._model.y);\n }\n\n return changed;\n }\n });\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n Chart.Tooltip.positioners = {\n /**\n * Average mode places the tooltip at the average position of the elements shown\n * @function Chart.Tooltip.positioners.average\n * @param elements {ChartElement[]} the elements being displayed in the tooltip\n * @returns {Point} tooltip position\n */\n average: function(elements) {\n if (!elements.length) {\n return false;\n }\n\n var i, len;\n var x = 0;\n var y = 0;\n var count = 0;\n\n for (i = 0, len = elements.length; i < len; ++i) {\n var el = elements[i];\n if (el && el.hasValue()) {\n var pos = el.tooltipPosition();\n x += pos.x;\n y += pos.y;\n ++count;\n }\n }\n\n return {\n x: Math.round(x / count),\n y: Math.round(y / count)\n };\n },\n\n /**\n * Gets the tooltip position nearest of the item nearest to the event position\n * @function Chart.Tooltip.positioners.nearest\n * @param elements {Chart.Element[]} the tooltip elements\n * @param eventPosition {Point} the position of the event in canvas coordinates\n * @returns {Point} the tooltip position\n */\n nearest: function(elements, eventPosition) {\n var x = eventPosition.x;\n var y = eventPosition.y;\n var minDistance = Number.POSITIVE_INFINITY;\n var i, len, nearestElement;\n\n for (i = 0, len = elements.length; i < len; ++i) {\n var el = elements[i];\n if (el && el.hasValue()) {\n var center = el.getCenterPoint();\n var d = helpers.distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n var tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x: x,\n y: y\n };\n }\n };\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],36:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n elements: {\n arc: {\n backgroundColor: defaults.global.defaultColor,\n borderColor: '#fff',\n borderWidth: 2\n }\n }\n });\n\n module.exports = Element.extend({\n inLabelRange: function(mouseX) {\n var vm = this._view;\n\n if (vm) {\n return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));\n }\n return false;\n },\n\n inRange: function(chartX, chartY) {\n var vm = this._view;\n\n if (vm) {\n var pointRelativePosition = helpers.getAngleFromPoint(vm, {x: chartX, y: chartY});\n var\tangle = pointRelativePosition.angle;\n var distance = pointRelativePosition.distance;\n\n // Sanitise angle range\n var startAngle = vm.startAngle;\n var endAngle = vm.endAngle;\n while (endAngle < startAngle) {\n endAngle += 2.0 * Math.PI;\n }\n while (angle > endAngle) {\n angle -= 2.0 * Math.PI;\n }\n while (angle < startAngle) {\n angle += 2.0 * Math.PI;\n }\n\n // Check if within the range of the open/close angle\n var betweenAngles = (angle >= startAngle && angle <= endAngle);\n var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);\n\n return (betweenAngles && withinRadius);\n }\n return false;\n },\n\n getCenterPoint: function() {\n var vm = this._view;\n var halfAngle = (vm.startAngle + vm.endAngle) / 2;\n var halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n return {\n x: vm.x + Math.cos(halfAngle) * halfRadius,\n y: vm.y + Math.sin(halfAngle) * halfRadius\n };\n },\n\n getArea: function() {\n var vm = this._view;\n return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n },\n\n tooltipPosition: function() {\n var vm = this._view;\n var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2);\n var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\n return {\n x: vm.x + (Math.cos(centreAngle) * rangeFromCentre),\n y: vm.y + (Math.sin(centreAngle) * rangeFromCentre)\n };\n },\n\n draw: function() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var sA = vm.startAngle;\n var eA = vm.endAngle;\n\n ctx.beginPath();\n\n ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\n ctx.closePath();\n ctx.strokeStyle = vm.borderColor;\n ctx.lineWidth = vm.borderWidth;\n\n ctx.fillStyle = vm.backgroundColor;\n\n ctx.fill();\n ctx.lineJoin = 'bevel';\n\n if (vm.borderWidth) {\n ctx.stroke();\n }\n }\n });\n\n},{\"25\":25,\"26\":26,\"45\":45}],37:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n var globalDefaults = defaults.global;\n\n defaults._set('global', {\n elements: {\n line: {\n tension: 0.4,\n backgroundColor: globalDefaults.defaultColor,\n borderWidth: 3,\n borderColor: globalDefaults.defaultColor,\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0.0,\n borderJoinStyle: 'miter',\n capBezierPoints: true,\n fill: true, // do we fill in the area between the line and its base axis\n }\n }\n });\n\n module.exports = Element.extend({\n draw: function() {\n var me = this;\n var vm = me._view;\n var ctx = me._chart.ctx;\n var spanGaps = vm.spanGaps;\n var points = me._children.slice(); // clone array\n var globalOptionLineElements = globalDefaults.elements.line;\n var lastDrawnIndex = -1;\n var index, current, previous, currentVM;\n\n // If we are looping, adding the first point again\n if (me._loop && points.length) {\n points.push(points[0]);\n }\n\n ctx.save();\n\n // Stroke Line Options\n ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n // IE 9 and 10 do not support line dash\n if (ctx.setLineDash) {\n ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n }\n\n ctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset;\n ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n ctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth;\n ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n // Stroke Line\n ctx.beginPath();\n lastDrawnIndex = -1;\n\n for (index = 0; index < points.length; ++index) {\n current = points[index];\n previous = helpers.previousItem(points, index);\n currentVM = current._view;\n\n // First point moves to it's starting position no matter what\n if (index === 0) {\n if (!currentVM.skip) {\n ctx.moveTo(currentVM.x, currentVM.y);\n lastDrawnIndex = index;\n }\n } else {\n previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n if (!currentVM.skip) {\n if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {\n // There was a gap and this is the first point after the gap\n ctx.moveTo(currentVM.x, currentVM.y);\n } else {\n // Line to next point\n helpers.canvas.lineTo(ctx, previous._view, current._view);\n }\n lastDrawnIndex = index;\n }\n }\n }\n\n ctx.stroke();\n ctx.restore();\n }\n });\n\n},{\"25\":25,\"26\":26,\"45\":45}],38:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n var defaultColor = defaults.global.defaultColor;\n\n defaults._set('global', {\n elements: {\n point: {\n radius: 3,\n pointStyle: 'circle',\n backgroundColor: defaultColor,\n borderColor: defaultColor,\n borderWidth: 1,\n // Hover\n hitRadius: 1,\n hoverRadius: 4,\n hoverBorderWidth: 1\n }\n }\n });\n\n function xRange(mouseX) {\n var vm = this._view;\n return vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n }\n\n function yRange(mouseY) {\n var vm = this._view;\n return vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n }\n\n module.exports = Element.extend({\n inRange: function(mouseX, mouseY) {\n var vm = this._view;\n return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;\n },\n\n inLabelRange: xRange,\n inXRange: xRange,\n inYRange: yRange,\n\n getCenterPoint: function() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y\n };\n },\n\n getArea: function() {\n return Math.PI * Math.pow(this._view.radius, 2);\n },\n\n tooltipPosition: function() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y,\n padding: vm.radius + vm.borderWidth\n };\n },\n\n draw: function(chartArea) {\n var vm = this._view;\n var model = this._model;\n var ctx = this._chart.ctx;\n var pointStyle = vm.pointStyle;\n var radius = vm.radius;\n var x = vm.x;\n var y = vm.y;\n var color = helpers.color;\n var errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.)\n var ratio = 0;\n\n if (vm.skip) {\n return;\n }\n\n ctx.strokeStyle = vm.borderColor || defaultColor;\n ctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth);\n ctx.fillStyle = vm.backgroundColor || defaultColor;\n\n // Cliping for Points.\n // going out from inner charArea?\n if ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right * errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom * errMargin < model.y))) {\n // Point fade out\n if (model.x < chartArea.left) {\n ratio = (x - model.x) / (chartArea.left - model.x);\n } else if (chartArea.right * errMargin < model.x) {\n ratio = (model.x - x) / (model.x - chartArea.right);\n } else if (model.y < chartArea.top) {\n ratio = (y - model.y) / (chartArea.top - model.y);\n } else if (chartArea.bottom * errMargin < model.y) {\n ratio = (model.y - y) / (model.y - chartArea.bottom);\n }\n ratio = Math.round(ratio * 100) / 100;\n ctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString();\n ctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString();\n }\n\n helpers.canvas.drawPoint(ctx, pointStyle, radius, x, y);\n }\n });\n\n},{\"25\":25,\"26\":26,\"45\":45}],39:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n\n defaults._set('global', {\n elements: {\n rectangle: {\n backgroundColor: defaults.global.defaultColor,\n borderColor: defaults.global.defaultColor,\n borderSkipped: 'bottom',\n borderWidth: 0\n }\n }\n });\n\n function isVertical(bar) {\n return bar._view.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 */\n function getBarBounds(bar) {\n var vm = bar._view;\n var x1, x2, y1, y2;\n\n if (isVertical(bar)) {\n // vertical\n var halfWidth = vm.width / 2;\n x1 = vm.x - halfWidth;\n x2 = vm.x + halfWidth;\n y1 = Math.min(vm.y, vm.base);\n y2 = Math.max(vm.y, vm.base);\n } else {\n // horizontal bar\n var halfHeight = vm.height / 2;\n x1 = Math.min(vm.x, vm.base);\n x2 = Math.max(vm.x, vm.base);\n y1 = vm.y - halfHeight;\n y2 = vm.y + halfHeight;\n }\n\n return {\n left: x1,\n top: y1,\n right: x2,\n bottom: y2\n };\n }\n\n module.exports = Element.extend({\n draw: function() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var left, right, top, bottom, signX, signY, borderSkipped;\n var borderWidth = vm.borderWidth;\n\n if (!vm.horizontal) {\n // bar\n left = vm.x - vm.width / 2;\n right = vm.x + vm.width / 2;\n top = vm.y;\n bottom = vm.base;\n signX = 1;\n signY = bottom > top ? 1 : -1;\n borderSkipped = vm.borderSkipped || 'bottom';\n } else {\n // horizontal bar\n left = vm.base;\n right = vm.x;\n top = vm.y - vm.height / 2;\n bottom = vm.y + vm.height / 2;\n signX = right > left ? 1 : -1;\n signY = 1;\n borderSkipped = vm.borderSkipped || 'left';\n }\n\n // Canvas doesn't allow us to stroke inside the width so we can\n // adjust the sizes to fit if we're setting a stroke on the line\n if (borderWidth) {\n // borderWidth shold be less than bar width and bar height.\n var barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n borderWidth = borderWidth > barSize ? barSize : borderWidth;\n var halfStroke = borderWidth / 2;\n // Adjust borderWidth when bar top position is near vm.base(zero).\n var borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0);\n var borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0);\n var borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0);\n var borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0);\n // not become a vertical line?\n if (borderLeft !== borderRight) {\n top = borderTop;\n bottom = borderBottom;\n }\n // not become a horizontal line?\n if (borderTop !== borderBottom) {\n left = borderLeft;\n right = borderRight;\n }\n }\n\n ctx.beginPath();\n ctx.fillStyle = vm.backgroundColor;\n ctx.strokeStyle = vm.borderColor;\n ctx.lineWidth = borderWidth;\n\n // Corner points, from bottom-left to bottom-right clockwise\n // | 1 2 |\n // | 0 3 |\n var corners = [\n [left, bottom],\n [left, top],\n [right, top],\n [right, bottom]\n ];\n\n // Find first (starting) corner with fallback to 'bottom'\n var borders = ['bottom', 'left', 'top', 'right'];\n var startCorner = borders.indexOf(borderSkipped, 0);\n if (startCorner === -1) {\n startCorner = 0;\n }\n\n function cornerAt(index) {\n return corners[(startCorner + index) % 4];\n }\n\n // Draw rectangle from 'startCorner'\n var corner = cornerAt(0);\n ctx.moveTo(corner[0], corner[1]);\n\n for (var i = 1; i < 4; i++) {\n corner = cornerAt(i);\n ctx.lineTo(corner[0], corner[1]);\n }\n\n ctx.fill();\n if (borderWidth) {\n ctx.stroke();\n }\n },\n\n height: function() {\n var vm = this._view;\n return vm.base - vm.y;\n },\n\n inRange: function(mouseX, mouseY) {\n var inRange = false;\n\n if (this._view) {\n var bounds = getBarBounds(this);\n inRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;\n }\n\n return inRange;\n },\n\n inLabelRange: function(mouseX, mouseY) {\n var me = this;\n if (!me._view) {\n return false;\n }\n\n var inRange = false;\n var bounds = getBarBounds(me);\n\n if (isVertical(me)) {\n inRange = mouseX >= bounds.left && mouseX <= bounds.right;\n } else {\n inRange = mouseY >= bounds.top && mouseY <= bounds.bottom;\n }\n\n return inRange;\n },\n\n inXRange: function(mouseX) {\n var bounds = getBarBounds(this);\n return mouseX >= bounds.left && mouseX <= bounds.right;\n },\n\n inYRange: function(mouseY) {\n var bounds = getBarBounds(this);\n return mouseY >= bounds.top && mouseY <= bounds.bottom;\n },\n\n getCenterPoint: function() {\n var vm = this._view;\n var x, y;\n if (isVertical(this)) {\n x = vm.x;\n y = (vm.y + vm.base) / 2;\n } else {\n x = (vm.x + vm.base) / 2;\n y = vm.y;\n }\n\n return {x: x, y: y};\n },\n\n getArea: function() {\n var vm = this._view;\n return vm.width * Math.abs(vm.y - vm.base);\n },\n\n tooltipPosition: function() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y\n };\n }\n });\n\n},{\"25\":25,\"26\":26}],40:[function(require,module,exports){\n 'use strict';\n\n module.exports = {};\n module.exports.Arc = require(36);\n module.exports.Line = require(37);\n module.exports.Point = require(38);\n module.exports.Rectangle = require(39);\n\n},{\"36\":36,\"37\":37,\"38\":38,\"39\":39}],41:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(42);\n\n /**\n * @namespace Chart.helpers.canvas\n */\n var exports = module.exports = {\n /**\n * Clears the entire canvas associated to the given `chart`.\n * @param {Chart} chart - The chart for which to clear the canvas.\n */\n clear: function(chart) {\n chart.ctx.clearRect(0, 0, chart.width, chart.height);\n },\n\n /**\n * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\n * given size (width, height) and the same `radius` for all corners.\n * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\n * @param {Number} x - The x axis of the coordinate for the rectangle starting point.\n * @param {Number} y - The y axis of the coordinate for the rectangle starting point.\n * @param {Number} width - The rectangle's width.\n * @param {Number} height - The rectangle's height.\n * @param {Number} radius - The rounded amount (in pixels) for the four corners.\n * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\n */\n roundedRect: function(ctx, x, y, width, height, radius) {\n if (radius) {\n var rx = Math.min(radius, width / 2);\n var ry = Math.min(radius, height / 2);\n\n ctx.moveTo(x + rx, y);\n ctx.lineTo(x + width - rx, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + ry);\n ctx.lineTo(x + width, y + height - ry);\n ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height);\n ctx.lineTo(x + rx, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - ry);\n ctx.lineTo(x, y + ry);\n ctx.quadraticCurveTo(x, y, x + rx, y);\n } else {\n ctx.rect(x, y, width, height);\n }\n },\n\n drawPoint: function(ctx, style, radius, x, y) {\n var type, edgeLength, xOffset, yOffset, height, size;\n\n if (typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n switch (style) {\n // Default includes circle\n default:\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangle':\n ctx.beginPath();\n edgeLength = 3 * radius / Math.sqrt(3);\n height = edgeLength * Math.sqrt(3) / 2;\n ctx.moveTo(x - edgeLength / 2, y + height / 3);\n ctx.lineTo(x + edgeLength / 2, y + height / 3);\n ctx.lineTo(x, y - 2 * height / 3);\n ctx.closePath();\n ctx.fill();\n break;\n case 'rect':\n size = 1 / Math.SQRT2 * radius;\n ctx.beginPath();\n ctx.fillRect(x - size, y - size, 2 * size, 2 * size);\n ctx.strokeRect(x - size, y - size, 2 * size, 2 * size);\n break;\n case 'rectRounded':\n var offset = radius / Math.SQRT2;\n var leftX = x - offset;\n var topY = y - offset;\n var sideSize = Math.SQRT2 * radius;\n ctx.beginPath();\n this.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius / 2);\n ctx.closePath();\n ctx.fill();\n break;\n case 'rectRot':\n size = 1 / Math.SQRT2 * radius;\n ctx.beginPath();\n ctx.moveTo(x - size, y);\n ctx.lineTo(x, y + size);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x, y - size);\n ctx.closePath();\n ctx.fill();\n break;\n case 'cross':\n ctx.beginPath();\n ctx.moveTo(x, y + radius);\n ctx.lineTo(x, y - radius);\n ctx.moveTo(x - radius, y);\n ctx.lineTo(x + radius, y);\n ctx.closePath();\n break;\n case 'crossRot':\n ctx.beginPath();\n xOffset = Math.cos(Math.PI / 4) * radius;\n yOffset = Math.sin(Math.PI / 4) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x - xOffset, y + yOffset);\n ctx.lineTo(x + xOffset, y - yOffset);\n ctx.closePath();\n break;\n case 'star':\n ctx.beginPath();\n ctx.moveTo(x, y + radius);\n ctx.lineTo(x, y - radius);\n ctx.moveTo(x - radius, y);\n ctx.lineTo(x + radius, y);\n xOffset = Math.cos(Math.PI / 4) * radius;\n yOffset = Math.sin(Math.PI / 4) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x - xOffset, y + yOffset);\n ctx.lineTo(x + xOffset, y - yOffset);\n ctx.closePath();\n break;\n case 'line':\n ctx.beginPath();\n ctx.moveTo(x - radius, y);\n ctx.lineTo(x + radius, y);\n ctx.closePath();\n break;\n case 'dash':\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + radius, y);\n ctx.closePath();\n break;\n }\n\n ctx.stroke();\n },\n\n clipArea: function(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n },\n\n unclipArea: function(ctx) {\n ctx.restore();\n },\n\n lineTo: function(ctx, previous, target, flip) {\n if (target.steppedLine) {\n if ((target.steppedLine === 'after' && !flip) || (target.steppedLine !== 'after' && flip)) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n return;\n }\n\n if (!target.tension) {\n ctx.lineTo(target.x, target.y);\n return;\n }\n\n ctx.bezierCurveTo(\n flip ? previous.controlPointPreviousX : previous.controlPointNextX,\n flip ? previous.controlPointPreviousY : previous.controlPointNextY,\n flip ? target.controlPointNextX : target.controlPointPreviousX,\n flip ? target.controlPointNextY : target.controlPointPreviousY,\n target.x,\n target.y);\n }\n };\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 */\n helpers.clear = exports.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 */\n helpers.drawRoundedRectangle = function(ctx) {\n ctx.beginPath();\n exports.roundedRect.apply(exports, arguments);\n ctx.closePath();\n };\n\n},{\"42\":42}],42:[function(require,module,exports){\n 'use strict';\n\n /**\n * @namespace Chart.helpers\n */\n var helpers = {\n /**\n * An empty function that can be used, for example, for optional callback.\n */\n noop: function() {},\n\n /**\n * Returns a unique id, sequentially generated from a global variable.\n * @returns {Number}\n * @function\n */\n uid: (function() {\n var id = 0;\n return function() {\n return id++;\n };\n }()),\n\n /**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @since 2.7.0\n */\n isNullOrUndef: function(value) {\n return value === null || typeof value === 'undefined';\n },\n\n /**\n * Returns true if `value` is an array, else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @function\n */\n isArray: Array.isArray ? Array.isArray : function(value) {\n return Object.prototype.toString.call(value) === '[object Array]';\n },\n\n /**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @since 2.7.0\n */\n isObject: function(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n },\n\n /**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param {*} value - The value to return if defined.\n * @param {*} defaultValue - The value to return if `value` is undefined.\n * @returns {*}\n */\n valueOrDefault: function(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n },\n\n /**\n * Returns value at the given `index` in array if defined, else returns `defaultValue`.\n * @param {Array} value - The array to lookup for value at `index`.\n * @param {Number} index - The index in `value` to lookup for value.\n * @param {*} defaultValue - The value to return if `value[index]` is undefined.\n * @returns {*}\n */\n valueAtIndexOrDefault: function(value, index, defaultValue) {\n return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\n },\n\n /**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param {Function} fn - The function to call.\n * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @returns {*}\n */\n callback: function(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n },\n\n /**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param {Object|Array} loopable - The object or array to be iterated.\n * @param {Function} fn - The function to call for each item.\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @param {Boolean} [reverse] - If true, iterates backward on the loopable.\n */\n each: function(loopable, fn, thisArg, reverse) {\n var i, len, keys;\n if (helpers.isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (helpers.isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n },\n\n /**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @see http://stackoverflow.com/a/14853974\n * @param {Array} a0 - The array to compare\n * @param {Array} a1 - The array to compare\n * @returns {Boolean}\n */\n arrayEquals: function(a0, a1) {\n var i, ilen, v0, v1;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0 instanceof Array && v1 instanceof Array) {\n if (!helpers.arrayEquals(v0, v1)) {\n return false;\n }\n } else if (v0 !== v1) {\n // NOTE: two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param {*} source - The value to clone.\n * @returns {*}\n */\n clone: function(source) {\n if (helpers.isArray(source)) {\n return source.map(helpers.clone);\n }\n\n if (helpers.isObject(source)) {\n var target = {};\n var keys = Object.keys(source);\n var klen = keys.length;\n var k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = helpers.clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n },\n\n /**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): this method is also used by configMerge and scaleMerge as fallback.\n * @private\n */\n _merger: function(key, target, source, options) {\n var tval = target[key];\n var sval = source[key];\n\n if (helpers.isObject(tval) && helpers.isObject(sval)) {\n helpers.merge(tval, sval, options);\n } else {\n target[key] = helpers.clone(sval);\n }\n },\n\n /**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\n _mergerIf: function(key, target, source) {\n var tval = target[key];\n var sval = source[key];\n\n if (helpers.isObject(tval) && helpers.isObject(sval)) {\n helpers.mergeIf(tval, sval);\n } else if (!target.hasOwnProperty(key)) {\n target[key] = helpers.clone(sval);\n }\n },\n\n /**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {Object} target - The target object in which all sources are merged into.\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n * @param {Object} [options] - Merging options:\n * @param {Function} [options.merger] - The merge method (key, target, source, options)\n * @returns {Object} The `target` object.\n */\n merge: function(target, source, options) {\n var sources = helpers.isArray(source) ? source : [source];\n var ilen = sources.length;\n var merge, i, keys, klen, k;\n\n if (!helpers.isObject(target)) {\n return target;\n }\n\n options = options || {};\n merge = options.merger || helpers._merger;\n\n for (i = 0; i < ilen; ++i) {\n source = sources[i];\n if (!helpers.isObject(source)) {\n continue;\n }\n\n keys = Object.keys(source);\n for (k = 0, klen = keys.length; k < klen; ++k) {\n merge(keys[k], target, source, options);\n }\n }\n\n return target;\n },\n\n /**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {Object} target - The target object in which all sources are merged into.\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n * @returns {Object} The `target` object.\n */\n mergeIf: function(target, source) {\n return helpers.merge(target, source, {merger: helpers._mergerIf});\n }\n };\n\n module.exports = 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 */\n helpers.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 */\n helpers.indexOf = function(array, item, fromIndex) {\n return 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 */\n helpers.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 */\n helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n},{}],43:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(42);\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 */\n var effects = {\n linear: function(t) {\n return t;\n },\n\n easeInQuad: function(t) {\n return t * t;\n },\n\n easeOutQuad: function(t) {\n return -t * (t - 2);\n },\n\n easeInOutQuad: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t;\n }\n return -0.5 * ((--t) * (t - 2) - 1);\n },\n\n easeInCubic: function(t) {\n return t * t * t;\n },\n\n easeOutCubic: function(t) {\n return (t = t - 1) * t * t + 1;\n },\n\n easeInOutCubic: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t;\n }\n return 0.5 * ((t -= 2) * t * t + 2);\n },\n\n easeInQuart: function(t) {\n return t * t * t * t;\n },\n\n easeOutQuart: function(t) {\n return -((t = t - 1) * t * t * t - 1);\n },\n\n easeInOutQuart: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t * t;\n }\n return -0.5 * ((t -= 2) * t * t * t - 2);\n },\n\n easeInQuint: function(t) {\n return t * t * t * t * t;\n },\n\n easeOutQuint: function(t) {\n return (t = t - 1) * t * t * t * t + 1;\n },\n\n easeInOutQuint: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t * t * t;\n }\n return 0.5 * ((t -= 2) * t * t * t * t + 2);\n },\n\n easeInSine: function(t) {\n return -Math.cos(t * (Math.PI / 2)) + 1;\n },\n\n easeOutSine: function(t) {\n return Math.sin(t * (Math.PI / 2));\n },\n\n easeInOutSine: function(t) {\n return -0.5 * (Math.cos(Math.PI * t) - 1);\n },\n\n easeInExpo: function(t) {\n return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));\n },\n\n easeOutExpo: function(t) {\n return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;\n },\n\n easeInOutExpo: function(t) {\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if ((t /= 0.5) < 1) {\n return 0.5 * Math.pow(2, 10 * (t - 1));\n }\n return 0.5 * (-Math.pow(2, -10 * --t) + 2);\n },\n\n easeInCirc: function(t) {\n if (t >= 1) {\n return t;\n }\n return -(Math.sqrt(1 - t * t) - 1);\n },\n\n easeOutCirc: function(t) {\n return Math.sqrt(1 - (t = t - 1) * t);\n },\n\n easeInOutCirc: function(t) {\n if ((t /= 0.5) < 1) {\n return -0.5 * (Math.sqrt(1 - t * t) - 1);\n }\n return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n },\n\n easeInElastic: function(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if (!p) {\n p = 0.3;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n },\n\n easeOutElastic: function(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if (!p) {\n p = 0.3;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\n },\n\n easeInOutElastic: function(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if ((t /= 0.5) === 2) {\n return 1;\n }\n if (!p) {\n p = 0.45;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n }\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\n },\n easeInBack: function(t) {\n var s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack: function(t) {\n var s = 1.70158;\n return (t = t - 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack: function(t) {\n var s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: function(t) {\n return 1 - effects.easeOutBounce(1 - t);\n },\n\n easeOutBounce: function(t) {\n if (t < (1 / 2.75)) {\n return 7.5625 * t * t;\n }\n if (t < (2 / 2.75)) {\n return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;\n }\n if (t < (2.5 / 2.75)) {\n return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;\n }\n return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;\n },\n\n easeInOutBounce: function(t) {\n if (t < 0.5) {\n return effects.easeInBounce(t * 2) * 0.5;\n }\n return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n }\n };\n\n module.exports = {\n effects: 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 */\n helpers.easingEffects = effects;\n\n},{\"42\":42}],44:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(42);\n\n /**\n * @alias Chart.helpers.options\n * @namespace\n */\n module.exports = {\n /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param {Number} size - The font size (in pixels) used to resolve relative `value`.\n * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\n toLineHeight: function(value, size) {\n var matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n },\n\n /**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param {Number|Object} value - If a number, set the value to all TRBL component,\n * else, if and object, use defined properties and sets undefined ones to 0.\n * @returns {Object} The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\n toPadding: function(value) {\n var t, r, b, l;\n\n if (helpers.isObject(value)) {\n t = +value.top || 0;\n r = +value.right || 0;\n b = +value.bottom || 0;\n l = +value.left || 0;\n } else {\n t = r = b = l = +value || 0;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n height: t + b,\n width: l + r\n };\n },\n\n /**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param {Array[]} inputs - An array of values, falling back to the last value.\n * @param {Object} [context] - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param {Number} [index] - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @since 2.7.0\n */\n resolve: function(inputs, context, index) {\n var i, ilen, value;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n }\n if (index !== undefined && helpers.isArray(value)) {\n value = value[index];\n }\n if (value !== undefined) {\n return value;\n }\n }\n }\n };\n\n},{\"42\":42}],45:[function(require,module,exports){\n 'use strict';\n\n module.exports = require(42);\n module.exports.easing = require(43);\n module.exports.canvas = require(41);\n module.exports.options = require(44);\n\n},{\"41\":41,\"42\":42,\"43\":43,\"44\":44}],46:[function(require,module,exports){\n /**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\n module.exports = {\n acquireContext: function(item) {\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n\n return item && item.getContext('2d') || null;\n }\n };\n\n},{}],47:[function(require,module,exports){\n /**\n * Chart.Platform implementation for targeting a web browser\n */\n\n 'use strict';\n\n var helpers = require(45);\n\n var EXPANDO_KEY = '$chartjs';\n var CSS_PREFIX = 'chartjs-';\n var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\n var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\n var 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 */\n var EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: '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 */\n function readUsedSize(element, property) {\n var value = helpers.getStyle(element, property);\n var matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return 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 */\n function initCanvas(canvas, config) {\n var style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n var renderHeight = canvas.getAttribute('height');\n var renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n\n if (renderWidth === null || renderWidth === '') {\n var displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (renderHeight === null || renderHeight === '') {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (config.options.aspectRatio || 2);\n } else {\n var displayHeight = readUsedSize(canvas, 'height');\n if (displayWidth !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return 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 */\n var supportsEventListenerOptions = (function() {\n var supports = false;\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function() {\n supports = true;\n }\n });\n window.addEventListener('e', null, options);\n } catch (e) {\n // continue regardless of error\n }\n return 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\n var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\n function addEventListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n\n function removeEventListener(node, type, listener) {\n node.removeEventListener(type, listener, eventListenerOptions);\n }\n\n function createEvent(type, chart, x, y, nativeEvent) {\n return {\n type: type,\n chart: chart,\n native: nativeEvent || null,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n }\n\n function fromNativeEvent(event, chart) {\n var type = EVENT_TYPES[event.type] || event.type;\n var pos = helpers.getRelativePosition(event, chart);\n return createEvent(type, chart, pos.x, pos.y, event);\n }\n\n function throttled(fn, thisArg) {\n var ticking = false;\n var args = [];\n\n return function() {\n args = Array.prototype.slice.call(arguments);\n thisArg = thisArg || this;\n\n if (!ticking) {\n ticking = true;\n helpers.requestAnimFrame.call(window, function() {\n ticking = false;\n fn.apply(thisArg, args);\n });\n }\n };\n }\n\n// Implementation based on https://github.com/marcj/css-element-queries\n function createResizer(handler) {\n var resizer = document.createElement('div');\n var cls = CSS_PREFIX + 'size-monitor';\n var maxSize = 1000000;\n var style =\n 'position:absolute;' +\n 'left:0;' +\n 'top:0;' +\n 'right:0;' +\n 'bottom:0;' +\n 'overflow:hidden;' +\n 'pointer-events:none;' +\n 'visibility:hidden;' +\n 'z-index:-1;';\n\n resizer.style.cssText = style;\n resizer.className = cls;\n resizer.innerHTML =\n '
          ' +\n '
          ' +\n '
          ' +\n '
          ' +\n '
          ' +\n '
          ' +\n '
          ' +\n '
          ';\n\n var expand = resizer.childNodes[0];\n var shrink = resizer.childNodes[1];\n\n resizer._reset = function() {\n expand.scrollLeft = maxSize;\n expand.scrollTop = maxSize;\n shrink.scrollLeft = maxSize;\n shrink.scrollTop = maxSize;\n };\n var onScroll = function() {\n resizer._reset();\n handler();\n };\n\n addEventListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n addEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n\n return resizer;\n }\n\n// https://davidwalsh.name/detect-node-insertion\n function watchForRender(node, handler) {\n var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n var proxy = expando.renderProxy = function(e) {\n if (e.animationName === CSS_RENDER_ANIMATION) {\n handler();\n }\n };\n\n helpers.each(ANIMATION_START_EVENTS, function(type) {\n addEventListener(node, type, proxy);\n });\n\n node.classList.add(CSS_RENDER_MONITOR);\n }\n\n function unwatchForRender(node) {\n var expando = node[EXPANDO_KEY] || {};\n var proxy = expando.renderProxy;\n\n if (proxy) {\n helpers.each(ANIMATION_START_EVENTS, function(type) {\n removeEventListener(node, type, proxy);\n });\n\n delete expando.renderProxy;\n }\n\n node.classList.remove(CSS_RENDER_MONITOR);\n }\n\n function addResizeListener(node, listener, chart) {\n var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n // Let's keep track of this added resizer and thus avoid DOM query when removing it.\n var resizer = expando.resizer = createResizer(throttled(function() {\n if (expando.resizer) {\n return listener(createEvent('resize', chart));\n }\n }));\n\n // The resizer needs to be attached to the node parent, so we first need to be\n // sure that `node` is attached to the DOM before injecting the resizer element.\n watchForRender(node, function() {\n if (expando.resizer) {\n var container = node.parentNode;\n if (container && container !== resizer.parentNode) {\n container.insertBefore(resizer, container.firstChild);\n }\n\n // The container size might have changed, let's reset the resizer state.\n resizer._reset();\n }\n });\n }\n\n function removeResizeListener(node) {\n var expando = node[EXPANDO_KEY] || {};\n var resizer = expando.resizer;\n\n delete expando.resizer;\n unwatchForRender(node);\n\n if (resizer && resizer.parentNode) {\n resizer.parentNode.removeChild(resizer);\n }\n }\n\n function injectCSS(platform, css) {\n // http://stackoverflow.com/q/3922139\n var style = platform._style || document.createElement('style');\n if (!platform._style) {\n platform._style = style;\n css = '/* Chart.js */\\n' + css;\n style.setAttribute('type', 'text/css');\n document.getElementsByTagName('head')[0].appendChild(style);\n }\n\n style.appendChild(document.createTextNode(css));\n }\n\n module.exports = {\n /**\n * This property holds whether this platform is enabled for the current environment.\n * Currently used by platform.js to select the proper implementation.\n * @private\n */\n _enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\n\n initialize: function() {\n var keyframes = 'from{opacity:0.99}to{opacity:1}';\n\n injectCSS(this,\n // DOM rendering detection\n // https://davidwalsh.name/detect-node-insertion\n '@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n '@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n '.' + CSS_RENDER_MONITOR + '{' +\n '-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n 'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n '}'\n );\n },\n\n acquireContext: function(item, config) {\n if (typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n var context = item && item.getContext && item.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the item has a context2D which has item as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === item) {\n initCanvas(item, config);\n return context;\n }\n\n return null;\n },\n\n releaseContext: function(context) {\n var canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return;\n }\n\n var initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach(function(prop) {\n var value = initial[prop];\n if (helpers.isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n helpers.each(initial.style || {}, function(value, key) {\n canvas.style[key] = value;\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n },\n\n addEventListener: function(chart, type, listener) {\n var canvas = chart.canvas;\n if (type === 'resize') {\n // Note: the resize event is not supported on all browsers.\n addResizeListener(canvas, listener, chart);\n return;\n }\n\n var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\n var proxies = expando.proxies || (expando.proxies = {});\n var proxy = proxies[chart.id + '_' + type] = function(event) {\n listener(fromNativeEvent(event, chart));\n };\n\n addEventListener(canvas, type, proxy);\n },\n\n removeEventListener: function(chart, type, listener) {\n var canvas = chart.canvas;\n if (type === 'resize') {\n // Note: the resize event is not supported on all browsers.\n removeResizeListener(canvas, listener);\n return;\n }\n\n var expando = listener[EXPANDO_KEY] || {};\n var proxies = expando.proxies || {};\n var proxy = proxies[chart.id + '_' + type];\n if (!proxy) {\n return;\n }\n\n removeEventListener(canvas, type, proxy);\n }\n };\n\n// DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n * @function Chart.helpers.addEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.addEvent = addEventListener;\n\n /**\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\n * @function Chart.helpers.removeEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.removeEvent = removeEventListener;\n\n},{\"45\":45}],48:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n var basic = require(46);\n var dom = require(47);\n\n// @TODO Make possible to select another platform at build time.\n var implementation = dom._enabled ? dom : basic;\n\n /**\n * @namespace Chart.platform\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n * @since 2.4.0\n */\n module.exports = helpers.extend({\n /**\n * @since 2.7.0\n */\n initialize: function() {},\n\n /**\n * Called at chart construction time, returns a context2d instance implementing\n * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n * @param {*} item - The native item from which to acquire context (platform specific)\n * @param {Object} options - The chart options\n * @returns {CanvasRenderingContext2D} context2d instance\n */\n acquireContext: function() {},\n\n /**\n * Called at chart destruction time, releases any resources associated to the context\n * previously returned by the acquireContext() method.\n * @param {CanvasRenderingContext2D} context - The context2d instance\n * @returns {Boolean} true if the method succeeded, else false\n */\n releaseContext: function() {},\n\n /**\n * Registers the specified listener on the given chart.\n * @param {Chart} chart - Chart from which to listen for event\n * @param {String} type - The ({@link IEvent}) type to listen for\n * @param {Function} listener - Receives a notification (an object that implements\n * the {@link IEvent} interface) when an event of the specified type occurs.\n */\n addEventListener: function() {},\n\n /**\n * Removes the specified listener previously registered with addEventListener.\n * @param {Chart} chart -Chart from which to remove the listener\n * @param {String} type - The ({@link IEvent}) type to remove\n * @param {Function} listener - The listener function to remove from the event target.\n */\n removeEventListener: function() {}\n\n }, implementation);\n\n /**\n * @interface IPlatform\n * Allows abstracting platform dependencies away from the chart\n * @borrows Chart.platform.acquireContext as acquireContext\n * @borrows Chart.platform.releaseContext as releaseContext\n * @borrows Chart.platform.addEventListener as addEventListener\n * @borrows Chart.platform.removeEventListener as removeEventListener\n */\n\n /**\n * @interface IEvent\n * @prop {String} type - The event type name, possible values are:\n * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\n * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\n * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\n * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\n * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\n */\n\n},{\"45\":45,\"46\":46,\"47\":47}],49:[function(require,module,exports){\n /**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('global', {\n plugins: {\n filler: {\n propagate: true\n }\n }\n });\n\n module.exports = function() {\n\n var mappers = {\n dataset: function(source) {\n var index = source.fill;\n var chart = source.chart;\n var meta = chart.getDatasetMeta(index);\n var visible = meta && chart.isDatasetVisible(index);\n var points = (visible && meta.dataset._children) || [];\n var length = points.length || 0;\n\n return !length ? null : function(point, i) {\n return (i < length && points[i]._view) || null;\n };\n },\n\n boundary: function(source) {\n var boundary = source.boundary;\n var x = boundary ? boundary.x : null;\n var y = boundary ? boundary.y : null;\n\n return function(point) {\n return {\n x: x === null ? point.x : x,\n y: y === null ? point.y : y,\n };\n };\n }\n };\n\n // @todo if (fill[0] === '#')\n function decodeFill(el, index, count) {\n var model = el._model || {};\n var fill = model.fill;\n var target;\n\n if (fill === undefined) {\n fill = !!model.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n\n target = parseFloat(fill, 10);\n if (isFinite(target) && Math.floor(target) === target) {\n if (fill[0] === '-' || fill[0] === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n }\n\n switch (fill) {\n // compatibility\n case 'bottom':\n return 'start';\n case 'top':\n return 'end';\n case 'zero':\n return 'origin';\n // supported boundaries\n case 'origin':\n case 'start':\n case 'end':\n return fill;\n // invalid fill values\n default:\n return false;\n }\n }\n\n function computeBoundary(source) {\n var model = source.el._model || {};\n var scale = source.el._scale || {};\n var fill = source.fill;\n var target = null;\n var horizontal;\n\n if (isFinite(fill)) {\n return null;\n }\n\n // Backward compatibility: until v3, we still need to support boundary values set on\n // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n // controllers might still use it (e.g. the Smith chart).\n\n if (fill === 'start') {\n target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\n } else if (fill === 'end') {\n target = model.scaleTop === undefined ? scale.top : model.scaleTop;\n } else if (model.scaleZero !== undefined) {\n target = model.scaleZero;\n } else if (scale.getBasePosition) {\n target = scale.getBasePosition();\n } else if (scale.getBasePixel) {\n target = scale.getBasePixel();\n }\n\n if (target !== undefined && target !== null) {\n if (target.x !== undefined && target.y !== undefined) {\n return target;\n }\n\n if (typeof target === 'number' && isFinite(target)) {\n horizontal = scale.isHorizontal();\n return {\n x: horizontal ? target : null,\n y: horizontal ? null : target\n };\n }\n }\n\n return null;\n }\n\n function resolveTarget(sources, index, propagate) {\n var source = sources[index];\n var fill = source.fill;\n var visited = [index];\n var target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n }\n\n function createMapper(source) {\n var fill = source.fill;\n var type = 'dataset';\n\n if (fill === false) {\n return null;\n }\n\n if (!isFinite(fill)) {\n type = 'boundary';\n }\n\n return mappers[type](source);\n }\n\n function isDrawable(point) {\n return point && !point.skip;\n }\n\n function drawArea(ctx, curve0, curve1, len0, len1) {\n var i;\n\n if (!len0 || !len1) {\n return;\n }\n\n // building first area curve (normal)\n ctx.moveTo(curve0[0].x, curve0[0].y);\n for (i = 1; i < len0; ++i) {\n helpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\n }\n\n // joining the two area curves\n ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);\n\n // building opposite area curve (reverse)\n for (i = len1 - 1; i > 0; --i) {\n helpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\n }\n }\n\n function doFill(ctx, points, mapper, view, color, loop) {\n var count = points.length;\n var span = view.spanGaps;\n var curve0 = [];\n var curve1 = [];\n var len0 = 0;\n var len1 = 0;\n var i, ilen, index, p0, p1, d0, d1;\n\n ctx.beginPath();\n\n for (i = 0, ilen = (count + !!loop); i < ilen; ++i) {\n index = i % count;\n p0 = points[index]._view;\n p1 = mapper(p0, index, view);\n d0 = isDrawable(p0);\n d1 = isDrawable(p1);\n\n if (d0 && d1) {\n len0 = curve0.push(p0);\n len1 = curve1.push(p1);\n } else if (len0 && len1) {\n if (!span) {\n drawArea(ctx, curve0, curve1, len0, len1);\n len0 = len1 = 0;\n curve0 = [];\n curve1 = [];\n } else {\n if (d0) {\n curve0.push(p0);\n }\n if (d1) {\n curve1.push(p1);\n }\n }\n }\n }\n\n drawArea(ctx, curve0, curve1, len0, len1);\n\n ctx.closePath();\n ctx.fillStyle = color;\n ctx.fill();\n }\n\n return {\n id: 'filler',\n\n afterDatasetsUpdate: function(chart, options) {\n var count = (chart.data.datasets || []).length;\n var propagate = options.propagate;\n var sources = [];\n var meta, i, el, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n el = meta.dataset;\n source = null;\n\n if (el && el._model && el instanceof elements.Line) {\n source = {\n visible: chart.isDatasetVisible(i),\n fill: decodeFill(el, i, count),\n chart: chart,\n el: el\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source) {\n continue;\n }\n\n source.fill = resolveTarget(sources, i, propagate);\n source.boundary = computeBoundary(source);\n source.mapper = createMapper(source);\n }\n },\n\n beforeDatasetDraw: function(chart, args) {\n var meta = args.meta.$filler;\n if (!meta) {\n return;\n }\n\n var ctx = chart.ctx;\n var el = meta.el;\n var view = el._view;\n var points = el._children || [];\n var mapper = meta.mapper;\n var color = view.backgroundColor || defaults.global.defaultColor;\n\n if (mapper && color && points.length) {\n helpers.canvas.clipArea(ctx, chart.chartArea);\n doFill(ctx, points, mapper, view, color, el._loop);\n helpers.canvas.unclipArea(ctx);\n }\n }\n };\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],50:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n legend: {\n display: true,\n position: 'top',\n fullWidth: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick: function(e, legendItem) {\n var index = legendItem.datasetIndex;\n var ci = this.chart;\n var meta = ci.getDatasetMeta(index);\n\n // See controller.isDatasetVisible comment\n meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;\n\n // We hid a dataset ... rerender the chart\n ci.update();\n },\n\n onHover: null,\n\n labels: {\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels: function(chart) {\n var data = chart.data;\n return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\n return {\n text: dataset.label,\n fillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\n hidden: !chart.isDatasetVisible(i),\n lineCap: dataset.borderCapStyle,\n lineDash: dataset.borderDash,\n lineDashOffset: dataset.borderDashOffset,\n lineJoin: dataset.borderJoinStyle,\n lineWidth: dataset.borderWidth,\n strokeStyle: dataset.borderColor,\n pointStyle: dataset.pointStyle,\n\n // Below is extra data used for toggling the datasets\n datasetIndex: i\n };\n }, this) : [];\n }\n }\n },\n\n legendCallback: function(chart) {\n var text = [];\n text.push('
            ');\n for (var i = 0; i < chart.data.datasets.length; i++) {\n text.push('
          • ');\n if (chart.data.datasets[i].label) {\n text.push(chart.data.datasets[i].label);\n }\n text.push('
          • ');\n }\n text.push('
          ');\n return text.join('');\n }\n });\n\n module.exports = function(Chart) {\n\n var layout = Chart.layoutService;\n var noop = helpers.noop;\n\n /**\n * Helper function to get the box width based on the usePointStyle option\n * @param labelopts {Object} the label options on the legend\n * @param fontSize {Number} the label font size\n * @return {Number} width of the color box area\n */\n function getBoxWidth(labelOpts, fontSize) {\n return labelOpts.usePointStyle ?\n fontSize * Math.SQRT2 :\n labelOpts.boxWidth;\n }\n\n Chart.Legend = Element.extend({\n\n initialize: function(config) {\n helpers.extend(this, config);\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n },\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all legend types.\n // Any function can be extended by the legend type\n\n beforeUpdate: noop,\n update: function(maxWidth, maxHeight, margins) {\n var me = this;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = margins;\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n // Labels\n me.beforeBuildLabels();\n me.buildLabels();\n me.afterBuildLabels();\n\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n\n return me.minSize;\n },\n afterUpdate: noop,\n\n //\n\n beforeSetDimensions: noop,\n setDimensions: function() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n\n // Reset minSize\n me.minSize = {\n width: 0,\n height: 0\n };\n },\n afterSetDimensions: noop,\n\n //\n\n beforeBuildLabels: noop,\n buildLabels: function() {\n var me = this;\n var labelOpts = me.options.labels || {};\n var legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter(function(item) {\n return labelOpts.filter(item, me.chart.data);\n });\n }\n\n if (me.options.reverse) {\n legendItems.reverse();\n }\n\n me.legendItems = legendItems;\n },\n afterBuildLabels: noop,\n\n //\n\n beforeFit: noop,\n fit: function() {\n var me = this;\n var opts = me.options;\n var labelOpts = opts.labels;\n var display = opts.display;\n\n var ctx = me.ctx;\n\n var globalDefault = defaults.global;\n var valueOrDefault = helpers.valueOrDefault;\n var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n // Reset hit boxes\n var hitboxes = me.legendHitBoxes = [];\n\n var minSize = me.minSize;\n var isHorizontal = me.isHorizontal();\n\n if (isHorizontal) {\n minSize.width = me.maxWidth; // fill all the width\n minSize.height = display ? 10 : 0;\n } else {\n minSize.width = display ? 10 : 0;\n minSize.height = me.maxHeight; // fill all the height\n }\n\n // Increase sizes here\n if (display) {\n ctx.font = labelFont;\n\n if (isHorizontal) {\n // Labels\n\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n var lineWidths = me.lineWidths = [0];\n var totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n\n helpers.each(me.legendItems, function(legendItem, i) {\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\n totalHeight += fontSize + (labelOpts.padding);\n lineWidths[lineWidths.length] = me.left;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {\n left: 0,\n top: 0,\n width: width,\n height: fontSize\n };\n\n lineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n });\n\n minSize.height += totalHeight;\n\n } else {\n var vPadding = labelOpts.padding;\n var columnWidths = me.columnWidths = [];\n var totalWidth = labelOpts.padding;\n var currentColWidth = 0;\n var currentColHeight = 0;\n var itemHeight = fontSize + vPadding;\n\n helpers.each(me.legendItems, function(legendItem, i) {\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n // If too tall, go to new column\n if (currentColHeight + itemHeight > minSize.height) {\n totalWidth += currentColWidth + labelOpts.padding;\n columnWidths.push(currentColWidth); // previous column width\n\n currentColWidth = 0;\n currentColHeight = 0;\n }\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight;\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {\n left: 0,\n top: 0,\n width: itemWidth,\n height: fontSize\n };\n });\n\n totalWidth += currentColWidth;\n columnWidths.push(currentColWidth);\n minSize.width += totalWidth;\n }\n }\n\n me.width = minSize.width;\n me.height = minSize.height;\n },\n afterFit: noop,\n\n // Shared Methods\n isHorizontal: function() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n },\n\n // Actually draw the legend on the canvas\n draw: function() {\n var me = this;\n var opts = me.options;\n var labelOpts = opts.labels;\n var globalDefault = defaults.global;\n var lineDefault = globalDefault.elements.line;\n var legendWidth = me.width;\n var lineWidths = me.lineWidths;\n\n if (opts.display) {\n var ctx = me.ctx;\n var valueOrDefault = helpers.valueOrDefault;\n var fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor);\n var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n var cursor;\n\n // Canvas setup\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.strokeStyle = fontColor; // for strikethrough effect\n ctx.fillStyle = fontColor; // render in correct colour\n ctx.font = labelFont;\n\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var hitboxes = me.legendHitBoxes;\n\n // current position\n var drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\n var isLineWidthZero = (valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0);\n\n if (ctx.setLineDash) {\n // IE 9 and 10 do not support line dash\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash));\n }\n\n if (opts.labels && opts.labels.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n var radius = fontSize * Math.SQRT2 / 2;\n var offSet = radius / Math.SQRT2;\n var centerX = x + offSet;\n var centerY = y + offSet;\n\n // Draw pointStyle as legend symbol\n helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n } else {\n // Draw box as legend symbol\n if (!isLineWidthZero) {\n ctx.strokeRect(x, y, boxWidth, fontSize);\n }\n ctx.fillRect(x, y, boxWidth, fontSize);\n }\n\n ctx.restore();\n };\n var fillText = function(x, y, legendItem, textWidth) {\n var halfFontSize = fontSize / 2;\n var xLeft = boxWidth + halfFontSize + x;\n var yMiddle = y + halfFontSize;\n\n ctx.fillText(legendItem.text, xLeft, yMiddle);\n\n if (legendItem.hidden) {\n // Strikethrough the text if hidden\n ctx.beginPath();\n ctx.lineWidth = 2;\n ctx.moveTo(xLeft, yMiddle);\n ctx.lineTo(xLeft + textWidth, yMiddle);\n ctx.stroke();\n }\n };\n\n // Horizontal\n var isHorizontal = me.isHorizontal();\n if (isHorizontal) {\n cursor = {\n x: me.left + ((legendWidth - lineWidths[0]) / 2),\n y: me.top + labelOpts.padding,\n line: 0\n };\n } else {\n cursor = {\n x: me.left + labelOpts.padding,\n y: me.top + labelOpts.padding,\n line: 0\n };\n }\n\n var itemHeight = fontSize + labelOpts.padding;\n helpers.each(me.legendItems, function(legendItem, i) {\n var textWidth = ctx.measureText(legendItem.text).width;\n var width = boxWidth + (fontSize / 2) + textWidth;\n var x = cursor.x;\n var y = cursor.y;\n\n if (isHorizontal) {\n if (x + width >= legendWidth) {\n y = cursor.y += itemHeight;\n cursor.line++;\n x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);\n }\n } else if (y + itemHeight > me.bottom) {\n x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n y = cursor.y = me.top + labelOpts.padding;\n cursor.line++;\n }\n\n drawLegendBox(x, y, legendItem);\n\n hitboxes[i].left = x;\n hitboxes[i].top = y;\n\n // Fill the actual label\n fillText(x, y, legendItem, textWidth);\n\n if (isHorizontal) {\n cursor.x += width + (labelOpts.padding);\n } else {\n cursor.y += itemHeight;\n }\n\n });\n }\n },\n\n /**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n * @return {Boolean} true if a change occured\n */\n handleEvent: function(e) {\n var me = this;\n var opts = me.options;\n var type = e.type === 'mouseup' ? 'click' : e.type;\n var changed = false;\n\n if (type === 'mousemove') {\n if (!opts.onHover) {\n return;\n }\n } else if (type === 'click') {\n if (!opts.onClick) {\n return;\n }\n } else {\n return;\n }\n\n // Chart event already has relative position in it\n var x = e.x;\n var y = e.y;\n\n if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n // See if we are touching one of the dataset boxes\n var lh = me.legendHitBoxes;\n for (var i = 0; i < lh.length; ++i) {\n var hitBox = lh[i];\n\n if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n // Touching an element\n if (type === 'click') {\n // use e.native for backwards compatibility\n opts.onClick.call(me, e.native, me.legendItems[i]);\n changed = true;\n break;\n } else if (type === 'mousemove') {\n // use e.native for backwards compatibility\n opts.onHover.call(me, e.native, me.legendItems[i]);\n changed = true;\n break;\n }\n }\n }\n }\n\n return changed;\n }\n });\n\n function createNewLegendAndAttach(chart, legendOpts) {\n var legend = new Chart.Legend({\n ctx: chart.ctx,\n options: legendOpts,\n chart: chart\n });\n\n layout.configure(chart, legend, legendOpts);\n layout.addBox(chart, legend);\n chart.legend = legend;\n }\n\n return {\n id: 'legend',\n\n beforeInit: function(chart) {\n var legendOpts = chart.options.legend;\n\n if (legendOpts) {\n createNewLegendAndAttach(chart, legendOpts);\n }\n },\n\n beforeUpdate: function(chart) {\n var legendOpts = chart.options.legend;\n var legend = chart.legend;\n\n if (legendOpts) {\n helpers.mergeIf(legendOpts, defaults.global.legend);\n\n if (legend) {\n layout.configure(chart, legend, legendOpts);\n legend.options = legendOpts;\n } else {\n createNewLegendAndAttach(chart, legendOpts);\n }\n } else if (legend) {\n layout.removeBox(chart, legend);\n delete chart.legend;\n }\n },\n\n afterEvent: function(chart, e) {\n var legend = chart.legend;\n if (legend) {\n legend.handleEvent(e);\n }\n }\n };\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],51:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n title: {\n display: false,\n fontStyle: 'bold',\n fullWidth: true,\n lineHeight: 1.2,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000 // by default greater than legend (1000) to be above\n }\n });\n\n module.exports = function(Chart) {\n\n var layout = Chart.layoutService;\n var noop = helpers.noop;\n\n Chart.Title = Element.extend({\n initialize: function(config) {\n var me = this;\n helpers.extend(me, config);\n\n // Contains hit boxes for each dataset (in dataset order)\n me.legendHitBoxes = [];\n },\n\n // These methods are ordered by lifecycle. Utilities then follow.\n\n beforeUpdate: noop,\n update: function(maxWidth, maxHeight, margins) {\n var me = this;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = margins;\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n // Labels\n me.beforeBuildLabels();\n me.buildLabels();\n me.afterBuildLabels();\n\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n\n return me.minSize;\n\n },\n afterUpdate: noop,\n\n //\n\n beforeSetDimensions: noop,\n setDimensions: function() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n\n // Reset minSize\n me.minSize = {\n width: 0,\n height: 0\n };\n },\n afterSetDimensions: noop,\n\n //\n\n beforeBuildLabels: noop,\n buildLabels: noop,\n afterBuildLabels: noop,\n\n //\n\n beforeFit: noop,\n fit: function() {\n var me = this;\n var valueOrDefault = helpers.valueOrDefault;\n var opts = me.options;\n var display = opts.display;\n var fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize);\n var minSize = me.minSize;\n var lineCount = helpers.isArray(opts.text) ? opts.text.length : 1;\n var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n var textSize = display ? (lineCount * lineHeight) + (opts.padding * 2) : 0;\n\n if (me.isHorizontal()) {\n minSize.width = me.maxWidth; // fill all the width\n minSize.height = textSize;\n } else {\n minSize.width = textSize;\n minSize.height = me.maxHeight; // fill all the height\n }\n\n me.width = minSize.width;\n me.height = minSize.height;\n\n },\n afterFit: noop,\n\n // Shared Methods\n isHorizontal: function() {\n var pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n },\n\n // Actually draw the title block on the canvas\n draw: function() {\n var me = this;\n var ctx = me.ctx;\n var valueOrDefault = helpers.valueOrDefault;\n var opts = me.options;\n var globalDefaults = defaults.global;\n\n if (opts.display) {\n var fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize);\n var fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle);\n var fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily);\n var titleFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n var offset = lineHeight / 2 + opts.padding;\n var rotation = 0;\n var top = me.top;\n var left = me.left;\n var bottom = me.bottom;\n var right = me.right;\n var maxWidth, titleX, titleY;\n\n ctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\n ctx.font = titleFont;\n\n // Horizontal\n if (me.isHorizontal()) {\n titleX = left + ((right - left) / 2); // midpoint of the width\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n titleX = opts.position === 'left' ? left + offset : right - offset;\n titleY = top + ((bottom - top) / 2);\n maxWidth = bottom - top;\n rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n }\n\n ctx.save();\n ctx.translate(titleX, titleY);\n ctx.rotate(rotation);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n var text = opts.text;\n if (helpers.isArray(text)) {\n var y = 0;\n for (var i = 0; i < text.length; ++i) {\n ctx.fillText(text[i], 0, y, maxWidth);\n y += lineHeight;\n }\n } else {\n ctx.fillText(text, 0, 0, maxWidth);\n }\n\n ctx.restore();\n }\n }\n });\n\n function createNewTitleBlockAndAttach(chart, titleOpts) {\n var title = new Chart.Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart: chart\n });\n\n layout.configure(chart, title, titleOpts);\n layout.addBox(chart, title);\n chart.titleBlock = title;\n }\n\n return {\n id: 'title',\n\n beforeInit: function(chart) {\n var titleOpts = chart.options.title;\n\n if (titleOpts) {\n createNewTitleBlockAndAttach(chart, titleOpts);\n }\n },\n\n beforeUpdate: function(chart) {\n var titleOpts = chart.options.title;\n var titleBlock = chart.titleBlock;\n\n if (titleOpts) {\n helpers.mergeIf(titleOpts, defaults.global.title);\n\n if (titleBlock) {\n layout.configure(chart, titleBlock, titleOpts);\n titleBlock.options = titleOpts;\n } else {\n createNewTitleBlockAndAttach(chart, titleOpts);\n }\n } else if (titleBlock) {\n Chart.layoutService.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n }\n }\n };\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],52:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n // Default config for a category scale\n var defaultConfig = {\n position: 'bottom'\n };\n\n var DatasetScale = Chart.Scale.extend({\n /**\n * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n * else fall back to data.labels\n * @private\n */\n getLabels: function() {\n var data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n },\n\n determineDataLimits: function() {\n var me = this;\n var labels = me.getLabels();\n me.minIndex = 0;\n me.maxIndex = labels.length - 1;\n var findIndex;\n\n if (me.options.ticks.min !== undefined) {\n // user specified min value\n findIndex = labels.indexOf(me.options.ticks.min);\n me.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n }\n\n if (me.options.ticks.max !== undefined) {\n // user specified max value\n findIndex = labels.indexOf(me.options.ticks.max);\n me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n }\n\n me.min = labels[me.minIndex];\n me.max = labels[me.maxIndex];\n },\n\n buildTicks: function() {\n var me = this;\n var labels = me.getLabels();\n // If we are viewing some subset of labels, slice the original array\n me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n },\n\n getLabelForIndex: function(index, datasetIndex) {\n var me = this;\n var data = me.chart.data;\n var isHorizontal = me.isHorizontal();\n\n if (data.yLabels && !isHorizontal) {\n return me.getRightValue(data.datasets[datasetIndex].data[index]);\n }\n return me.ticks[index - me.minIndex];\n },\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue: function(value, index) {\n var me = this;\n var offset = me.options.offset;\n // 1 is added because we need the length but we have the indexes\n var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1);\n\n // If value is a data object, then index is the index in the data array,\n // not the index of the scale. We need to change that.\n var valueCategory;\n if (value !== undefined && value !== null) {\n valueCategory = me.isHorizontal() ? value.x : value.y;\n }\n if (valueCategory !== undefined || (value !== undefined && isNaN(index))) {\n var labels = me.getLabels();\n value = valueCategory || value;\n var idx = labels.indexOf(value);\n index = idx !== -1 ? idx : index;\n }\n\n if (me.isHorizontal()) {\n var valueWidth = me.width / offsetAmt;\n var widthOffset = (valueWidth * (index - me.minIndex));\n\n if (offset) {\n widthOffset += (valueWidth / 2);\n }\n\n return me.left + Math.round(widthOffset);\n }\n var valueHeight = me.height / offsetAmt;\n var heightOffset = (valueHeight * (index - me.minIndex));\n\n if (offset) {\n heightOffset += (valueHeight / 2);\n }\n\n return me.top + Math.round(heightOffset);\n },\n getPixelForTick: function(index) {\n return this.getPixelForValue(this.ticks[index], index + this.minIndex, null);\n },\n getValueForPixel: function(pixel) {\n var me = this;\n var offset = me.options.offset;\n var value;\n var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n var horz = me.isHorizontal();\n var valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n pixel -= horz ? me.left : me.top;\n\n if (offset) {\n pixel -= (valueDimension / 2);\n }\n\n if (pixel <= 0) {\n value = 0;\n } else {\n value = Math.round(pixel / valueDimension);\n }\n\n return value + me.minIndex;\n },\n getBasePixel: function() {\n return this.bottom;\n }\n });\n\n Chart.scaleService.registerScaleType('category', DatasetScale, defaultConfig);\n\n };\n\n},{}],53:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var defaultConfig = {\n position: 'left',\n ticks: {\n callback: Ticks.formatters.linear\n }\n };\n\n var LinearScale = Chart.LinearScaleBase.extend({\n\n determineDataLimits: function() {\n var me = this;\n var opts = me.options;\n var chart = me.chart;\n var data = chart.data;\n var datasets = data.datasets;\n var isHorizontal = me.isHorizontal();\n var DEFAULT_MIN = 0;\n var DEFAULT_MAX = 1;\n\n function IDMatches(meta) {\n return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n }\n\n // First Calculate the range\n me.min = null;\n me.max = null;\n\n var hasStacks = opts.stacked;\n if (hasStacks === undefined) {\n helpers.each(datasets, function(dataset, datasetIndex) {\n if (hasStacks) {\n return;\n }\n\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n meta.stack !== undefined) {\n hasStacks = true;\n }\n });\n }\n\n if (opts.stacked || hasStacks) {\n var valuesPerStack = {};\n\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var key = [\n meta.type,\n // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n meta.stack\n ].join('.');\n\n if (valuesPerStack[key] === undefined) {\n valuesPerStack[key] = {\n positiveValues: [],\n negativeValues: []\n };\n }\n\n // Store these per type\n var positiveValues = valuesPerStack[key].positiveValues;\n var negativeValues = valuesPerStack[key].negativeValues;\n\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n positiveValues[index] = positiveValues[index] || 0;\n negativeValues[index] = negativeValues[index] || 0;\n\n if (opts.relativePoints) {\n positiveValues[index] = 100;\n } else if (value < 0) {\n negativeValues[index] += value;\n } else {\n positiveValues[index] += value;\n }\n });\n }\n });\n\n helpers.each(valuesPerStack, function(valuesForType) {\n var values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n var minVal = helpers.min(values);\n var maxVal = helpers.max(values);\n me.min = me.min === null ? minVal : Math.min(me.min, minVal);\n me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n });\n\n } else {\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n if (me.min === null) {\n me.min = value;\n } else if (value < me.min) {\n me.min = value;\n }\n\n if (me.max === null) {\n me.max = value;\n } else if (value > me.max) {\n me.max = value;\n }\n });\n }\n });\n }\n\n me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\n me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;\n\n // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n this.handleTickRangeOptions();\n },\n getTickLimit: function() {\n var maxTicks;\n var me = this;\n var tickOpts = me.options.ticks;\n\n if (me.isHorizontal()) {\n maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\n } else {\n // The factor of 2 used to scale the font size has been experimentally determined.\n var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize);\n maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\n }\n\n return maxTicks;\n },\n // Called after the ticks are built. We need\n handleDirectionalChanges: function() {\n if (!this.isHorizontal()) {\n // We are in a vertical orientation. The top value is the highest. So reverse the array\n this.ticks.reverse();\n }\n },\n getLabelForIndex: function(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n // Utils\n getPixelForValue: function(value) {\n // This must be called after fit has been run so that\n // this.left, this.top, this.right, and this.bottom have been defined\n var me = this;\n var start = me.start;\n\n var rightValue = +me.getRightValue(value);\n var pixel;\n var range = me.end - start;\n\n if (me.isHorizontal()) {\n pixel = me.left + (me.width / range * (rightValue - start));\n return Math.round(pixel);\n }\n\n pixel = me.bottom - (me.height / range * (rightValue - start));\n return Math.round(pixel);\n },\n getValueForPixel: function(pixel) {\n var me = this;\n var isHorizontal = me.isHorizontal();\n var innerDimension = isHorizontal ? me.width : me.height;\n var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n return me.start + ((me.end - me.start) * offset);\n },\n getPixelForTick: function(index) {\n return this.getPixelForValue(this.ticksAsNumbers[index]);\n }\n });\n Chart.scaleService.registerScaleType('linear', LinearScale, defaultConfig);\n\n };\n\n},{\"25\":25,\"34\":34,\"45\":45}],54:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var noop = helpers.noop;\n\n Chart.LinearScaleBase = Chart.Scale.extend({\n getRightValue: function(value) {\n if (typeof value === 'string') {\n return +value;\n }\n return Chart.Scale.prototype.getRightValue.call(this, value);\n },\n\n handleTickRangeOptions: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n\n // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n // do nothing since that would make the chart weird. If the user really wants a weird chart\n // axis, they can manually override it\n if (tickOpts.beginAtZero) {\n var minSign = helpers.sign(me.min);\n var maxSign = helpers.sign(me.max);\n\n if (minSign < 0 && maxSign < 0) {\n // move the top up to 0\n me.max = 0;\n } else if (minSign > 0 && maxSign > 0) {\n // move the bottom down to 0\n me.min = 0;\n }\n }\n\n var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\n var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\n\n if (tickOpts.min !== undefined) {\n me.min = tickOpts.min;\n } else if (tickOpts.suggestedMin !== undefined) {\n if (me.min === null) {\n me.min = tickOpts.suggestedMin;\n } else {\n me.min = Math.min(me.min, tickOpts.suggestedMin);\n }\n }\n\n if (tickOpts.max !== undefined) {\n me.max = tickOpts.max;\n } else if (tickOpts.suggestedMax !== undefined) {\n if (me.max === null) {\n me.max = tickOpts.suggestedMax;\n } else {\n me.max = Math.max(me.max, tickOpts.suggestedMax);\n }\n }\n\n if (setMin !== setMax) {\n // We set the min or the max but not both.\n // So ensure that our range is good\n // Inverted or 0 length range can happen when\n // ticks.min is set, and no datasets are visible\n if (me.min >= me.max) {\n if (setMin) {\n me.max = me.min + 1;\n } else {\n me.min = me.max - 1;\n }\n }\n }\n\n if (me.min === me.max) {\n me.max++;\n\n if (!tickOpts.beginAtZero) {\n me.min--;\n }\n }\n },\n getTickLimit: noop,\n handleDirectionalChanges: noop,\n\n buildTicks: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n var maxTicks = me.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n var numericGeneratorOptions = {\n maxTicks: maxTicks,\n min: tickOpts.min,\n max: tickOpts.max,\n stepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n };\n var ticks = me.ticks = Ticks.generators.linear(numericGeneratorOptions, me);\n\n me.handleDirectionalChanges();\n\n // At this point, we need to update our max and min given the tick values since we have expanded the\n // range of the scale\n me.max = helpers.max(ticks);\n me.min = helpers.min(ticks);\n\n if (tickOpts.reverse) {\n ticks.reverse();\n\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n },\n convertTicksToLabels: function() {\n var me = this;\n me.ticksAsNumbers = me.ticks.slice();\n me.zeroLineIndex = me.ticks.indexOf(0);\n\n Chart.Scale.prototype.convertTicksToLabels.call(me);\n }\n });\n };\n\n},{\"34\":34,\"45\":45}],55:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var defaultConfig = {\n position: 'left',\n\n // label settings\n ticks: {\n callback: Ticks.formatters.logarithmic\n }\n };\n\n var LogarithmicScale = Chart.Scale.extend({\n determineDataLimits: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n var chart = me.chart;\n var data = chart.data;\n var datasets = data.datasets;\n var valueOrDefault = helpers.valueOrDefault;\n var isHorizontal = me.isHorizontal();\n function IDMatches(meta) {\n return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n }\n\n // Calculate Range\n me.min = null;\n me.max = null;\n me.minNotZero = null;\n\n var hasStacks = opts.stacked;\n if (hasStacks === undefined) {\n helpers.each(datasets, function(dataset, datasetIndex) {\n if (hasStacks) {\n return;\n }\n\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n meta.stack !== undefined) {\n hasStacks = true;\n }\n });\n }\n\n if (opts.stacked || hasStacks) {\n var valuesPerStack = {};\n\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var key = [\n meta.type,\n // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n meta.stack\n ].join('.');\n\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n if (valuesPerStack[key] === undefined) {\n valuesPerStack[key] = [];\n }\n\n helpers.each(dataset.data, function(rawValue, index) {\n var values = valuesPerStack[key];\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n values[index] = values[index] || 0;\n\n if (opts.relativePoints) {\n values[index] = 100;\n } else {\n // Don't need to split positive and negative since the log scale can't handle a 0 crossing\n values[index] += value;\n }\n });\n }\n });\n\n helpers.each(valuesPerStack, function(valuesForType) {\n var minVal = helpers.min(valuesForType);\n var maxVal = helpers.max(valuesForType);\n me.min = me.min === null ? minVal : Math.min(me.min, minVal);\n me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n });\n\n } else {\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n if (me.min === null) {\n me.min = value;\n } else if (value < me.min) {\n me.min = value;\n }\n\n if (me.max === null) {\n me.max = value;\n } else if (value > me.max) {\n me.max = value;\n }\n\n if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n me.minNotZero = value;\n }\n });\n }\n });\n }\n\n me.min = valueOrDefault(tickOpts.min, me.min);\n me.max = valueOrDefault(tickOpts.max, me.max);\n\n if (me.min === me.max) {\n if (me.min !== 0 && me.min !== null) {\n me.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\n me.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\n } else {\n me.min = 1;\n me.max = 10;\n }\n }\n },\n buildTicks: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n\n var generationOptions = {\n min: tickOpts.min,\n max: tickOpts.max\n };\n var ticks = me.ticks = Ticks.generators.logarithmic(generationOptions, me);\n\n if (!me.isHorizontal()) {\n // We are in a vertical orientation. The top value is the highest. So reverse the array\n ticks.reverse();\n }\n\n // At this point, we need to update our max and min given the tick values since we have expanded the\n // range of the scale\n me.max = helpers.max(ticks);\n me.min = helpers.min(ticks);\n\n if (tickOpts.reverse) {\n ticks.reverse();\n\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n },\n convertTicksToLabels: function() {\n this.tickValues = this.ticks.slice();\n\n Chart.Scale.prototype.convertTicksToLabels.call(this);\n },\n // Get the correct tooltip label\n getLabelForIndex: function(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n getPixelForTick: function(index) {\n return this.getPixelForValue(this.tickValues[index]);\n },\n getPixelForValue: function(value) {\n var me = this;\n var start = me.start;\n var newVal = +me.getRightValue(value);\n var opts = me.options;\n var tickOpts = opts.ticks;\n var innerDimension, pixel, range;\n\n if (me.isHorizontal()) {\n range = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0\n if (newVal === 0) {\n pixel = me.left;\n } else {\n innerDimension = me.width;\n pixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n }\n } else {\n // Bottom - top since pixels increase downward on a screen\n innerDimension = me.height;\n if (start === 0 && !tickOpts.reverse) {\n range = helpers.log10(me.end) - helpers.log10(me.minNotZero);\n if (newVal === start) {\n pixel = me.bottom;\n } else if (newVal === me.minNotZero) {\n pixel = me.bottom - innerDimension * 0.02;\n } else {\n pixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero)));\n }\n } else if (me.end === 0 && tickOpts.reverse) {\n range = helpers.log10(me.start) - helpers.log10(me.minNotZero);\n if (newVal === me.end) {\n pixel = me.top;\n } else if (newVal === me.minNotZero) {\n pixel = me.top + innerDimension * 0.02;\n } else {\n pixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero)));\n }\n } else if (newVal === 0) {\n pixel = tickOpts.reverse ? me.top : me.bottom;\n } else {\n range = helpers.log10(me.end) - helpers.log10(start);\n innerDimension = me.height;\n pixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n }\n }\n return pixel;\n },\n getValueForPixel: function(pixel) {\n var me = this;\n var range = helpers.log10(me.end) - helpers.log10(me.start);\n var value, innerDimension;\n\n if (me.isHorizontal()) {\n innerDimension = me.width;\n value = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension);\n } else { // todo: if start === 0\n innerDimension = me.height;\n value = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start;\n }\n return value;\n }\n });\n Chart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig);\n\n };\n\n},{\"34\":34,\"45\":45}],56:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var globalDefaults = defaults.global;\n\n var defaultConfig = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n color: 'rgba(0, 0, 0, 0.1)',\n lineWidth: 1\n },\n\n gridLines: {\n circular: false\n },\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n // String - The colour of the label backdrop\n backdropColor: 'rgba(255,255,255,0.75)',\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPaddingY: 2,\n\n // Number - The backdrop padding to the side of the label in pixels\n backdropPaddingX: 2,\n\n callback: Ticks.formatters.linear\n },\n\n pointLabels: {\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n fontSize: 10,\n\n // Function - Used to convert point labels\n callback: function(label) {\n return label;\n }\n }\n };\n\n function getValueCount(scale) {\n var opts = scale.options;\n return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;\n }\n\n function getPointLabelFontOptions(scale) {\n var pointLabelOptions = scale.options.pointLabels;\n var fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize);\n var fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle);\n var fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily);\n var font = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n return {\n size: fontSize,\n style: fontStyle,\n family: fontFamily,\n font: font\n };\n }\n\n function measureLabelSize(ctx, fontSize, label) {\n if (helpers.isArray(label)) {\n return {\n w: helpers.longestText(ctx, ctx.font, label),\n h: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize)\n };\n }\n\n return {\n w: ctx.measureText(label).width,\n h: fontSize\n };\n }\n\n function determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size - 5,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size + 5\n };\n }\n\n /**\n * Helper function to fit a radial linear scale with point labels\n */\n function fitWithPointLabels(scale) {\n\t\t\t/*\n\t\t\t * Right, this is really confusing and there is a lot of maths going on here\n\t\t\t * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n\t\t\t *\n\t\t\t * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n\t\t\t *\n\t\t\t * Solution:\n\t\t\t *\n\t\t\t * We assume the radius of the polygon is half the size of the canvas at first\n\t\t\t * at each index we check if the text overlaps.\n\t\t\t *\n\t\t\t * Where it does, we store that angle and that index.\n\t\t\t *\n\t\t\t * After finding the largest index and angle we calculate how much we need to remove\n\t\t\t * from the shape radius to move the point inwards by that x.\n\t\t\t *\n\t\t\t * We average the left and right distances to get the maximum shape radius that can fit in the box\n\t\t\t * along with labels.\n\t\t\t *\n\t\t\t * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n\t\t\t * on each side, removing that from the size, halving it and adding the left x protrusion width.\n\t\t\t *\n\t\t\t * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n\t\t\t * and position it in the most space efficient manner\n\t\t\t *\n\t\t\t * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\t\t\t */\n\n var plFont = getPointLabelFontOptions(scale);\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n var furthestLimits = {\n r: scale.width,\n l: 0,\n t: scale.height,\n b: 0\n };\n var furthestAngles = {};\n var i, textSize, pointPosition;\n\n scale.ctx.font = plFont.font;\n scale._pointLabelSizes = [];\n\n var valueCount = getValueCount(scale);\n for (i = 0; i < valueCount; i++) {\n pointPosition = scale.getPointPosition(i, largestPossibleRadius);\n textSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || '');\n scale._pointLabelSizes[i] = textSize;\n\n // Add quarter circle to make degree 0 mean top of circle\n var angleRadians = scale.getIndexAngle(i);\n var angle = helpers.toDegrees(angleRadians) % 360;\n var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n if (hLimits.start < furthestLimits.l) {\n furthestLimits.l = hLimits.start;\n furthestAngles.l = angleRadians;\n }\n\n if (hLimits.end > furthestLimits.r) {\n furthestLimits.r = hLimits.end;\n furthestAngles.r = angleRadians;\n }\n\n if (vLimits.start < furthestLimits.t) {\n furthestLimits.t = vLimits.start;\n furthestAngles.t = angleRadians;\n }\n\n if (vLimits.end > furthestLimits.b) {\n furthestLimits.b = vLimits.end;\n furthestAngles.b = angleRadians;\n }\n }\n\n scale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles);\n }\n\n /**\n * Helper function to fit a radial linear scale with no point labels\n */\n function fit(scale) {\n var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n scale.drawingArea = Math.round(largestPossibleRadius);\n scale.setCenterPoint(0, 0, 0, 0);\n }\n\n function getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n }\n\n function fillText(ctx, text, position, fontSize) {\n if (helpers.isArray(text)) {\n var y = position.y;\n var spacing = 1.5 * fontSize;\n\n for (var i = 0; i < text.length; ++i) {\n ctx.fillText(text[i], position.x, y);\n y += spacing;\n }\n } else {\n ctx.fillText(text, position.x, position.y);\n }\n }\n\n function adjustPointPositionForLabelHeight(angle, textSize, position) {\n if (angle === 90 || angle === 270) {\n position.y -= (textSize.h / 2);\n } else if (angle > 270 || angle < 90) {\n position.y -= textSize.h;\n }\n }\n\n function drawPointLabels(scale) {\n var ctx = scale.ctx;\n var valueOrDefault = helpers.valueOrDefault;\n var opts = scale.options;\n var angleLineOpts = opts.angleLines;\n var pointLabelOpts = opts.pointLabels;\n\n ctx.lineWidth = angleLineOpts.lineWidth;\n ctx.strokeStyle = angleLineOpts.color;\n\n var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n\n // Point Label Font\n var plFont = getPointLabelFontOptions(scale);\n\n ctx.textBaseline = 'top';\n\n for (var i = getValueCount(scale) - 1; i >= 0; i--) {\n if (angleLineOpts.display) {\n var outerPosition = scale.getPointPosition(i, outerDistance);\n ctx.beginPath();\n ctx.moveTo(scale.xCenter, scale.yCenter);\n ctx.lineTo(outerPosition.x, outerPosition.y);\n ctx.stroke();\n ctx.closePath();\n }\n\n if (pointLabelOpts.display) {\n // Extra 3px out for some label spacing\n var pointLabelPosition = scale.getPointPosition(i, outerDistance + 5);\n\n // Keep this in loop since we may support array properties here\n var pointLabelFontColor = valueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor);\n ctx.font = plFont.font;\n ctx.fillStyle = pointLabelFontColor;\n\n var angleRadians = scale.getIndexAngle(i);\n var angle = helpers.toDegrees(angleRadians);\n ctx.textAlign = getTextAlignForAngle(angle);\n adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size);\n }\n }\n }\n\n function drawRadiusLine(scale, gridLineOpts, radius, index) {\n var ctx = scale.ctx;\n ctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1);\n ctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\n\n if (scale.options.gridLines.circular) {\n // Draw circular arcs between the points\n ctx.beginPath();\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n ctx.closePath();\n ctx.stroke();\n } else {\n // Draw straight lines connecting each index\n var valueCount = getValueCount(scale);\n\n if (valueCount === 0) {\n return;\n }\n\n ctx.beginPath();\n var pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (var i = 1; i < valueCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n\n ctx.closePath();\n ctx.stroke();\n }\n }\n\n function numberOrZero(param) {\n return helpers.isNumber(param) ? param : 0;\n }\n\n var LinearRadialScale = Chart.LinearScaleBase.extend({\n setDimensions: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n // Set the unconstrained dimension before label rotation\n me.width = me.maxWidth;\n me.height = me.maxHeight;\n me.xCenter = Math.round(me.width / 2);\n me.yCenter = Math.round(me.height / 2);\n\n var minSize = helpers.min([me.height, me.width]);\n var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n me.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2);\n },\n determineDataLimits: function() {\n var me = this;\n var chart = me.chart;\n var min = Number.POSITIVE_INFINITY;\n var max = Number.NEGATIVE_INFINITY;\n\n helpers.each(chart.data.datasets, function(dataset, datasetIndex) {\n if (chart.isDatasetVisible(datasetIndex)) {\n var meta = chart.getDatasetMeta(datasetIndex);\n\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n min = Math.min(value, min);\n max = Math.max(value, max);\n });\n }\n });\n\n me.min = (min === Number.POSITIVE_INFINITY ? 0 : min);\n me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);\n\n // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n me.handleTickRangeOptions();\n },\n getTickLimit: function() {\n var tickOpts = this.options.ticks;\n var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n return Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\n },\n convertTicksToLabels: function() {\n var me = this;\n\n Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\n\n // Point labels\n me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n },\n getLabelForIndex: function(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n fit: function() {\n if (this.options.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n fit(this);\n }\n },\n /**\n * Set radius reductions and determine new radius and center point\n * @private\n */\n setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {\n var me = this;\n var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n var radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b);\n\n radiusReductionLeft = numberOrZero(radiusReductionLeft);\n radiusReductionRight = numberOrZero(radiusReductionRight);\n radiusReductionTop = numberOrZero(radiusReductionTop);\n radiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n me.drawingArea = Math.min(\n Math.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n Math.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n },\n setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {\n var me = this;\n var maxRight = me.width - rightMovement - me.drawingArea;\n var maxLeft = leftMovement + me.drawingArea;\n var maxTop = topMovement + me.drawingArea;\n var maxBottom = me.height - bottomMovement - me.drawingArea;\n\n me.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left);\n me.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top);\n },\n\n getIndexAngle: function(index) {\n var angleMultiplier = (Math.PI * 2) / getValueCount(this);\n var startAngle = this.chart.options && this.chart.options.startAngle ?\n this.chart.options.startAngle :\n 0;\n\n var startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n // Start from the top instead of right, so remove a quarter of the circle\n return index * angleMultiplier + startAngleRadians;\n },\n getDistanceFromCenterForValue: function(value) {\n var me = this;\n\n if (value === null) {\n return 0; // null always in center\n }\n\n // Take into account half font size + the yPadding of the top value\n var scalingFactor = me.drawingArea / (me.max - me.min);\n if (me.options.ticks.reverse) {\n return (me.max - value) * scalingFactor;\n }\n return (value - me.min) * scalingFactor;\n },\n getPointPosition: function(index, distanceFromCenter) {\n var me = this;\n var thisAngle = me.getIndexAngle(index) - (Math.PI / 2);\n return {\n x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\n y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\n };\n },\n getPointPositionForValue: function(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n },\n\n getBasePosition: function() {\n var me = this;\n var min = me.min;\n var max = me.max;\n\n return me.getPointPositionForValue(0,\n me.beginAtZero ? 0 :\n min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0);\n },\n\n draw: function() {\n var me = this;\n var opts = me.options;\n var gridLineOpts = opts.gridLines;\n var tickOpts = opts.ticks;\n var valueOrDefault = helpers.valueOrDefault;\n\n if (opts.display) {\n var ctx = me.ctx;\n var startAngle = this.getIndexAngle(0);\n\n // Tick Font\n var tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n var tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\n var tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\n var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\n helpers.each(me.ticks, function(label, index) {\n // Don't draw a centre value (if it is minimum)\n if (index > 0 || tickOpts.reverse) {\n var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\n // Draw circular lines around the scale\n if (gridLineOpts.display && index !== 0) {\n drawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n }\n\n if (tickOpts.display) {\n var tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\n ctx.font = tickLabelFont;\n\n ctx.save();\n ctx.translate(me.xCenter, me.yCenter);\n ctx.rotate(startAngle);\n\n if (tickOpts.showLabelBackdrop) {\n var labelWidth = ctx.measureText(label).width;\n ctx.fillStyle = tickOpts.backdropColor;\n ctx.fillRect(\n -labelWidth / 2 - tickOpts.backdropPaddingX,\n -yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY,\n labelWidth + tickOpts.backdropPaddingX * 2,\n tickFontSize + tickOpts.backdropPaddingY * 2\n );\n }\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = tickFontColor;\n ctx.fillText(label, 0, -yCenterOffset);\n ctx.restore();\n }\n }\n });\n\n if (opts.angleLines.display || opts.pointLabels.display) {\n drawPointLabels(me);\n }\n }\n }\n });\n Chart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig);\n\n };\n\n},{\"25\":25,\"34\":34,\"45\":45}],57:[function(require,module,exports){\n\t/* global window: false */\n 'use strict';\n\n var moment = require(6);\n moment = typeof moment === 'function' ? moment : window.moment;\n\n var defaults = require(25);\n var helpers = require(45);\n\n// Integer constants are from the ES6 spec.\n var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\n var INTERVALS = {\n millisecond: {\n major: true,\n size: 1,\n steps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n },\n second: {\n major: true,\n size: 1000,\n steps: [1, 2, 5, 10, 30]\n },\n minute: {\n major: true,\n size: 60000,\n steps: [1, 2, 5, 10, 30]\n },\n hour: {\n major: true,\n size: 3600000,\n steps: [1, 2, 3, 6, 12]\n },\n day: {\n major: true,\n size: 86400000,\n steps: [1, 2, 5]\n },\n week: {\n major: false,\n size: 604800000,\n steps: [1, 2, 3, 4]\n },\n month: {\n major: true,\n size: 2.628e9,\n steps: [1, 2, 3]\n },\n quarter: {\n major: false,\n size: 7.884e9,\n steps: [1, 2, 3, 4]\n },\n year: {\n major: true,\n size: 3.154e10\n }\n };\n\n var UNITS = Object.keys(INTERVALS);\n\n function sorter(a, b) {\n return a - b;\n }\n\n function arrayUnique(items) {\n var hash = {};\n var out = [];\n var i, ilen, item;\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n if (!hash[item]) {\n hash[item] = true;\n out.push(item);\n }\n }\n\n return out;\n }\n\n /**\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n * extremity (left + width or top + height). Note that it would be more optimized to directly\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n *\n * @param {Number[]} timestamps - timestamps sorted from lowest to highest.\n * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\n * If 'series', timestamps will be positioned at the same distance from each other. In this\n * case, only timestamps that break the time linearity are registered, meaning that in the\n * best case, all timestamps are linear, the table contains only min and max.\n */\n function buildLookupTable(timestamps, min, max, distribution) {\n if (distribution === 'linear' || !timestamps.length) {\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n var table = [];\n var items = [min];\n var i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr > min && curr < max) {\n items.push(curr);\n }\n }\n\n items.push(max);\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n\n return table;\n }\n\n// @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\n function lookup(table, key, value) {\n var lo = 0;\n var hi = table.length - 1;\n var mid, i0, i1;\n\n while (lo >= 0 && lo <= hi) {\n mid = (lo + hi) >> 1;\n i0 = table[mid - 1] || null;\n i1 = table[mid];\n\n if (!i0) {\n // given value is outside table (before first item)\n return {lo: null, hi: i1};\n } else if (i1[key] < value) {\n lo = mid + 1;\n } else if (i0[key] > value) {\n hi = mid - 1;\n } else {\n return {lo: i0, hi: i1};\n }\n }\n\n // given value is outside table (after last item)\n return {lo: i1, hi: null};\n }\n\n /**\n * Linearly interpolates the given source `value` using the table items `skey` values and\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\n * index [0, 1] or [n - 1, n] are used for the interpolation.\n */\n function interpolate(table, skey, sval, tkey) {\n var range = lookup(table, skey, sval);\n\n // Note: the lookup table ALWAYS contains at least 2 items (min and max)\n var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\n var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\n\n var span = next[skey] - prev[skey];\n var ratio = span ? (sval - prev[skey]) / span : 0;\n var offset = (next[tkey] - prev[tkey]) * ratio;\n\n return prev[tkey] + offset;\n }\n\n /**\n * Convert the given value to a moment object using the given time options.\n * @see http://momentjs.com/docs/#/parsing/\n */\n function momentify(value, options) {\n var parser = options.parser;\n var format = options.parser || options.format;\n\n if (typeof parser === 'function') {\n return parser(value);\n }\n\n if (typeof value === 'string' && typeof format === 'string') {\n return moment(value, format);\n }\n\n if (!(value instanceof moment)) {\n value = moment(value);\n }\n\n if (value.isValid()) {\n return value;\n }\n\n // Labels are in an incompatible moment format and no `parser` has been provided.\n // The user might still use the deprecated `format` option to convert his inputs.\n if (typeof format === 'function') {\n return format(value);\n }\n\n return value;\n }\n\n function parse(input, scale) {\n if (helpers.isNullOrUndef(input)) {\n return null;\n }\n\n var options = scale.options.time;\n var value = momentify(scale.getRightValue(input), options);\n if (!value.isValid()) {\n return null;\n }\n\n if (options.round) {\n value.startOf(options.round);\n }\n\n return value.valueOf();\n }\n\n /**\n * Returns the number of unit to skip to be able to display up to `capacity` number of ticks\n * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.\n */\n function determineStepSize(min, max, unit, capacity) {\n var range = max - min;\n var interval = INTERVALS[unit];\n var milliseconds = interval.size;\n var steps = interval.steps;\n var i, ilen, factor;\n\n if (!steps) {\n return Math.ceil(range / ((capacity || 1) * milliseconds));\n }\n\n for (i = 0, ilen = steps.length; i < ilen; ++i) {\n factor = steps[i];\n if (Math.ceil(range / (milliseconds * factor)) <= capacity) {\n break;\n }\n }\n\n return factor;\n }\n\n function determineUnit(minUnit, min, max, capacity) {\n var ilen = UNITS.length;\n var i, interval, factor;\n\n for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n interval = INTERVALS[UNITS[i]];\n factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;\n\n if (Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n }\n\n function determineMajorUnit(unit) {\n for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].major) {\n return UNITS[i];\n }\n }\n }\n\n /**\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n * `minor` unit, aligned on the `major` unit and using the given scale time `options`.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n */\n function generate(min, max, minor, major, capacity, options) {\n var timeOpts = options.time;\n var stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize);\n var weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n var majorTicksEnabled = options.ticks.major.enabled;\n var interval = INTERVALS[minor];\n var first = moment(min);\n var last = moment(max);\n var ticks = [];\n var time;\n\n if (!stepSize) {\n stepSize = determineStepSize(min, max, minor, capacity);\n }\n\n // For 'week' unit, handle the first day of week option\n if (weekday) {\n first = first.isoWeekday(weekday);\n last = last.isoWeekday(weekday);\n }\n\n // Align first/last ticks on unit\n first = first.startOf(weekday ? 'day' : minor);\n last = last.startOf(weekday ? 'day' : minor);\n\n // Make sure that the last tick include max\n if (last < max) {\n last.add(1, minor);\n }\n\n time = moment(first);\n\n if (majorTicksEnabled && major && !weekday && !timeOpts.round) {\n // Align the first tick on the previous `minor` unit aligned on the `major` unit:\n // we first aligned time on the previous `major` unit then add the number of full\n // stepSize there is between first and the previous major time.\n time.startOf(major);\n time.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor);\n }\n\n for (; time < last; time.add(stepSize, minor)) {\n ticks.push(+time);\n }\n\n ticks.push(+time);\n\n return ticks;\n }\n\n /**\n * Returns the right and left offsets from edges in the form of {left, right}.\n * Offsets are added when the `offset` option is true.\n */\n function computeOffsets(table, ticks, min, max, options) {\n var left = 0;\n var right = 0;\n var upper, lower;\n\n if (options.offset && ticks.length) {\n if (!options.time.min) {\n upper = ticks.length > 1 ? ticks[1] : max;\n lower = ticks[0];\n left = (\n interpolate(table, 'time', upper, 'pos') -\n interpolate(table, 'time', lower, 'pos')\n ) / 2;\n }\n if (!options.time.max) {\n upper = ticks[ticks.length - 1];\n lower = ticks.length > 1 ? ticks[ticks.length - 2] : min;\n right = (\n interpolate(table, 'time', upper, 'pos') -\n interpolate(table, 'time', lower, 'pos')\n ) / 2;\n }\n }\n\n return {left: left, right: right};\n }\n\n function ticksFromTimestamps(values, majorUnit) {\n var ticks = [];\n var i, ilen, value, major;\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n value = values[i];\n major = majorUnit ? value === +moment(value).startOf(majorUnit) : false;\n\n ticks.push({\n value: value,\n major: major\n });\n }\n\n return ticks;\n }\n\n module.exports = function(Chart) {\n\n var defaultConfig = {\n position: 'bottom',\n\n /**\n * Data distribution along the scale:\n * - 'linear': data are spread according to their time (distances can vary),\n * - 'series': data are spread at the same distance from each other.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n distribution: 'linear',\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n time: {\n parser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n displayFormat: false, // DEPRECATED\n isoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/\n minUnit: 'millisecond',\n\n // defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/\n displayFormats: {\n millisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM,\n second: 'h:mm:ss a', // 11:20:01 AM\n minute: 'h:mm a', // 11:20 AM\n hour: 'hA', // 5PM\n day: 'MMM D', // Sep 4\n week: 'll', // Week 46, or maybe \"[W]WW - YYYY\" ?\n month: 'MMM YYYY', // Sept 2015\n quarter: '[Q]Q - YYYY', // Q3\n year: 'YYYY' // 2015\n },\n },\n ticks: {\n autoSkip: false,\n\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n major: {\n enabled: false\n }\n }\n };\n\n var TimeScale = Chart.Scale.extend({\n initialize: function() {\n if (!moment) {\n throw new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');\n }\n\n this.mergeTicksOptions();\n\n Chart.Scale.prototype.initialize.call(this);\n },\n\n update: function() {\n var me = this;\n var options = me.options;\n\n // DEPRECATIONS: output a message only one time per update\n if (options.time && options.time.format) {\n console.warn('options.time.format is deprecated and replaced by options.time.parser.');\n }\n\n return Chart.Scale.prototype.update.apply(me, arguments);\n },\n\n /**\n * Allows data to be referenced via 't' attribute\n */\n getRightValue: function(rawValue) {\n if (rawValue && rawValue.t !== undefined) {\n rawValue = rawValue.t;\n }\n return Chart.Scale.prototype.getRightValue.call(this, rawValue);\n },\n\n determineDataLimits: function() {\n var me = this;\n var chart = me.chart;\n var timeOpts = me.options.time;\n var min = parse(timeOpts.min, me) || MAX_INTEGER;\n var max = parse(timeOpts.max, me) || MIN_INTEGER;\n var timestamps = [];\n var datasets = [];\n var labels = [];\n var i, j, ilen, jlen, data, timestamp;\n\n // Convert labels to timestamps\n for (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) {\n labels.push(parse(chart.data.labels[i], me));\n }\n\n // Convert data to timestamps\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n data = chart.data.datasets[i].data;\n\n // Let's consider that all data have the same format.\n if (helpers.isObject(data[0])) {\n datasets[i] = [];\n\n for (j = 0, jlen = data.length; j < jlen; ++j) {\n timestamp = parse(data[j], me);\n timestamps.push(timestamp);\n datasets[i][j] = timestamp;\n }\n } else {\n timestamps.push.apply(timestamps, labels);\n datasets[i] = labels.slice(0);\n }\n } else {\n datasets[i] = [];\n }\n }\n\n if (labels.length) {\n // Sort labels **after** data have been converted\n labels = arrayUnique(labels).sort(sorter);\n min = Math.min(min, labels[0]);\n max = Math.max(max, labels[labels.length - 1]);\n }\n\n if (timestamps.length) {\n timestamps = arrayUnique(timestamps).sort(sorter);\n min = Math.min(min, timestamps[0]);\n max = Math.max(max, timestamps[timestamps.length - 1]);\n }\n\n // In case there is no valid min/max, let's use today limits\n min = min === MAX_INTEGER ? +moment().startOf('day') : min;\n max = max === MIN_INTEGER ? +moment().endOf('day') + 1 : max;\n\n // Make sure that max is strictly higher than min (required by the lookup table)\n me.min = Math.min(min, max);\n me.max = Math.max(min + 1, max);\n\n // PRIVATE\n me._horizontal = me.isHorizontal();\n me._table = [];\n me._timestamps = {\n data: timestamps,\n datasets: datasets,\n labels: labels\n };\n },\n\n buildTicks: function() {\n var me = this;\n var min = me.min;\n var max = me.max;\n var options = me.options;\n var timeOpts = options.time;\n var formats = timeOpts.displayFormats;\n var capacity = me.getLabelCapacity(min);\n var unit = timeOpts.unit || determineUnit(timeOpts.minUnit, min, max, capacity);\n var majorUnit = determineMajorUnit(unit);\n var timestamps = [];\n var ticks = [];\n var i, ilen, timestamp;\n\n switch (options.ticks.source) {\n case 'data':\n timestamps = me._timestamps.data;\n break;\n case 'labels':\n timestamps = me._timestamps.labels;\n break;\n case 'auto':\n default:\n timestamps = generate(min, max, unit, majorUnit, capacity, options);\n }\n\n if (options.bounds === 'ticks' && timestamps.length) {\n min = timestamps[0];\n max = timestamps[timestamps.length - 1];\n }\n\n // Enforce limits with user min/max options\n min = parse(timeOpts.min, me) || min;\n max = parse(timeOpts.max, me) || max;\n\n // Remove ticks outside the min/max range\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n timestamp = timestamps[i];\n if (timestamp >= min && timestamp <= max) {\n ticks.push(timestamp);\n }\n }\n\n me.min = min;\n me.max = max;\n\n // PRIVATE\n me._unit = unit;\n me._majorUnit = majorUnit;\n me._minorFormat = formats[unit];\n me._majorFormat = formats[majorUnit];\n me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);\n me._offsets = computeOffsets(me._table, ticks, min, max, options);\n\n return ticksFromTimestamps(ticks, majorUnit);\n },\n\n getLabelForIndex: function(index, datasetIndex) {\n var me = this;\n var data = me.chart.data;\n var timeOpts = me.options.time;\n var label = data.labels && index < data.labels.length ? data.labels[index] : '';\n var value = data.datasets[datasetIndex].data[index];\n\n if (helpers.isObject(value)) {\n label = me.getRightValue(value);\n }\n if (timeOpts.tooltipFormat) {\n label = momentify(label, timeOpts).format(timeOpts.tooltipFormat);\n }\n\n return label;\n },\n\n /**\n * Function to format an individual tick mark\n * @private\n */\n tickFormatFunction: function(tick, index, ticks) {\n var me = this;\n var options = me.options;\n var time = tick.valueOf();\n var majorUnit = me._majorUnit;\n var majorFormat = me._majorFormat;\n var majorTime = tick.clone().startOf(me._majorUnit).valueOf();\n var majorTickOpts = options.ticks.major;\n var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;\n var label = tick.format(major ? majorFormat : me._minorFormat);\n var tickOpts = major ? majorTickOpts : options.ticks.minor;\n var formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback);\n\n return formatter ? formatter(label, index, ticks) : label;\n },\n\n convertTicksToLabels: function(ticks) {\n var labels = [];\n var i, ilen;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n labels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks));\n }\n\n return labels;\n },\n\n /**\n * @private\n */\n getPixelForOffset: function(time) {\n var me = this;\n var size = me._horizontal ? me.width : me.height;\n var start = me._horizontal ? me.left : me.top;\n var pos = interpolate(me._table, 'time', time, 'pos');\n\n return start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right);\n },\n\n getPixelForValue: function(value, index, datasetIndex) {\n var me = this;\n var time = null;\n\n if (index !== undefined && datasetIndex !== undefined) {\n time = me._timestamps.datasets[datasetIndex][index];\n }\n\n if (time === null) {\n time = parse(value, me);\n }\n\n if (time !== null) {\n return me.getPixelForOffset(time);\n }\n },\n\n getPixelForTick: function(index) {\n var ticks = this.getTicks();\n return index >= 0 && index < ticks.length ?\n this.getPixelForOffset(ticks[index].value) :\n null;\n },\n\n getValueForPixel: function(pixel) {\n var me = this;\n var size = me._horizontal ? me.width : me.height;\n var start = me._horizontal ? me.left : me.top;\n var pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right;\n var time = interpolate(me._table, 'pos', pos, 'time');\n\n return moment(time);\n },\n\n /**\n * Crude approximation of what the label width might be\n * @private\n */\n getLabelWidth: function(label) {\n var me = this;\n var ticksOpts = me.options.ticks;\n var tickLabelWidth = me.ctx.measureText(label).width;\n var angle = helpers.toRadians(ticksOpts.maxRotation);\n var cosRotation = Math.cos(angle);\n var sinRotation = Math.sin(angle);\n var tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize);\n\n return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\n },\n\n /**\n * @private\n */\n getLabelCapacity: function(exampleTime) {\n var me = this;\n\n me._minorFormat = me.options.time.displayFormats.millisecond;\t// Pick the longest format for guestimation\n\n var exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, []);\n var tickLabelWidth = me.getLabelWidth(exampleLabel);\n var innerWidth = me.isHorizontal() ? me.width : me.height;\n\n return Math.floor(innerWidth / tickLabelWidth);\n }\n });\n\n Chart.scaleService.registerScaleType('time', TimeScale, defaultConfig);\n };\n\n},{\"25\":25,\"45\":45,\"6\":6}]},{},[7])(7)\n});"],"names":["f","exports","module","define","amd","window","global","self","this","Chart","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","colorNames","getRgba","string","rgb","match","parseInt","slice","parseFloat","Math","round","scale","getHsla","alpha","isNaN","getHwb","rgbaString","rgba","undefined","percentaString","hslaString","hsla","num","min","max","hexDouble","str","toString","toUpperCase","getRgb","getHsl","getAlpha","vals","hexString","rgbString","percentString","g","b","hslString","hwbString","hwb","keyword","reverseNames","name","convert","Color","obj","valid","values","hsl","hsv","cmyk","setValues","_typeof","red","lightness","v","value","w","whiteness","c","cyan","prototype","isValid","setSpace","arguments","rgbArray","hslArray","hsvArray","hwbArray","concat","cmykArray","rgbaArray","hslaArray","val","setChannel","green","blue","hue","saturation","saturationv","blackness","magenta","yellow","black","rgbNumber","luminosity","lum","chan","pow","contrast","color2","lum1","lum2","level","contrastRatio","dark","light","negate","lighten","ratio","darken","saturate","desaturate","whiten","blacken","greyscale","clearer","opaquer","rotate","degrees","mix","mixinColor","weight","p","w1","w2","toJSON","clone","type","result","source","target","prop","hasOwnProperty","console","error","spaces","maxes","getValues","space","charAt","capped","chans","sname","args","Array","index","svalues","rgb2hsl","h","delta","rgb2hsv","rgb2hwb","rgb2cmyk","k","rgb2keyword","reverseKeywords","JSON","stringify","rgb2xyz","rgb2lab","xyz","x","y","z","hsl2rgb","t1","t2","t3","hsv2rgb","hi","floor","q","hwb2rgb","wh","bl","cmyk2rgb","m","xyz2rgb","xyz2lab","lab2xyz","lab","y2","lab2lch","atan2","PI","sqrt","lab2rgb","lch2lab","lch","hr","cos","sin","keyword2rgb","cssKeywords","rgb2lch","hsl2hsv","hsl2hwb","hsl2cmyk","hsl2keyword","hsv2hsl","sl","hsv2hwb","hsv2cmyk","hsv2keyword","hwb2hsl","hwb2hsv","hwb2cmyk","hwb2keyword","cmyk2hsl","cmyk2hsv","cmyk2hwb","cmyk2keyword","keyword2hsl","keyword2hsv","keyword2hwb","keyword2cmyk","keyword2lab","keyword2xyz","xyz2lch","lch2xyz","lch2rgb","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellowgreen","key","conversions","Converter","func","arg","pair","exec","from","to","convs","routeSpace","fspace","forEach","factory","moment","hookCallback","hooks","apply","isArray","input","Object","isObject","isUndefined","isNumber","isDate","Date","map","arr","fn","res","push","hasOwnProp","extend","valueOf","createUTC","format","locale","strict","createLocalOrUTC","utc","getParsingFlags","_pf","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","meridiem","rfc2822","weekdayMismatch","some$1","some","fun","len","_isValid","flags","parsedParts","isNowValid","_d","getTime","invalidWeekday","_strict","bigHour","isFrozen","createInvalid","NaN","momentProperties","copyConfig","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","updateInProgress","Moment","config","updateOffset","isMoment","absFloor","number","ceil","toInt","argumentForCoercion","coercedNumber","isFinite","compareArrays","array1","array2","dontConvert","lengthDiff","abs","diffs","warn","msg","suppressDeprecationWarnings","deprecate","firstTime","deprecationHandler","join","stack","deprecations","deprecateSimple","isFunction","Function","mergeConfigs","parentConfig","childConfig","Locale","set","keys$1","keys","aliases","addUnitAlias","unit","shorthand","lowerCase","toLowerCase","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","priorities","addUnitPriority","priority","makeGetSet","keepTime","set$1","get","mom","zeroFill","targetLength","forceSign","absNumber","zerosToFill","substr","formattingTokens","localFormattingTokens","formatFunctions","formatTokenFunctions","addFormatToken","token","padded","ordinal","callback","localeData","formatMoment","expandFormat","array","replace","output","makeFormatFunction","invalidDate","replaceLongDateFormatTokens","longDateFormat","lastIndex","test","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchOffset","matchShortOffset","matchWord","regexes","addRegexToken","regex","strictRegex","isStrict","getParseRegexForToken","RegExp","regexEscape","matched","p1","p2","p3","p4","tokens","addParseToken","addWeekParseToken","_w","addTimeToArrayFromToken","_a","indexOf$1","indexOf","daysInMonth","year","month","UTC","getUTCDate","monthsShort","months","monthsShortRegex","monthsRegex","monthsParse","MONTHS_IN_FORMAT","defaultLocaleMonths","split","defaultLocaleMonthsShort","handleStrictParse","monthName","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","setMonth","dayOfMonth","date","getSetMonth","defaultMonthsShortRegex","defaultMonthsRegex","computeMonthsParse","cmpLenRev","shortPieces","longPieces","mixedPieces","sort","_monthsRegex","_monthsShortRegex","_monthsStrictRegex","_monthsShortStrictRegex","daysInYear","isLeapYear","parseTwoDigitYear","getSetYear","createDate","d","M","ms","getFullYear","setFullYear","createUTCDate","getUTCFullYear","setUTCFullYear","firstWeekOffset","dow","doy","fwd","getUTCDay","dayOfYearFromWeeks","week","weekday","resYear","resDayOfYear","dayOfYear","weekOfYear","resWeek","weekOffset","weeksInYear","weekOffsetNext","weekdaysMin","weekdaysShort","weekdays","weekdaysMinRegex","weekdaysShortRegex","weekdaysRegex","weekdaysParse","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","day","defaultWeekdaysRegex","defaultWeekdaysShortRegex","defaultWeekdaysMinRegex","computeWeekdaysParse","minp","shortp","longp","minPieces","_weekdaysRegex","_weekdaysShortRegex","_weekdaysMinRegex","_weekdaysStrictRegex","_weekdaysShortStrictRegex","_weekdaysMinStrictRegex","hFormat","hours","lowercase","minutes","matchMeridiem","_meridiemParse","seconds","kInput","_isPm","isPM","_meridiem","pos","pos1","pos2","globalLocale","getSetHour","baseConfig","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","LTS","LT","L","LL","LLL","LLLL","dayOfMonthOrdinalParse","relativeTime","future","past","ss","mm","hh","dd","MM","yy","meridiemParse","locales","localeFamilies","normalizeLocale","loadLocale","oldLocale","_abbr","getSetGlobalLocale","data","getLocale","defineLocale","abbr","_config","parentLocale","names","j","next","chooseLocale","checkOverflow","_overflowDayOfYear","_overflowWeeks","_overflowWeekday","extendedIsoRegex","basicIsoRegex","tzRegex","isoDates","isoTimes","aspNetJsonRegex","configFromISO","allowTime","dateFormat","timeFormat","tzFormat","configFromStringAndFormat","basicRfcRegex","configFromRFC2822","dayFormat","timezone","timezoneIndex","timezones","momentDay","getDay","splice","defaults","configFromArray","currentDate","yearToUse","nowValue","now","_useUTC","getUTCMonth","getMonth","getDate","currentDateArray","weekYear","temp","weekdayOverflow","GG","W","E","createLocal","_week","curWeek","gg","_dayOfYear","dayOfYearFromWeekInfo","_nextDay","setUTCMinutes","getUTCMinutes","ISO_8601","RFC_2822","parsedInput","skipped","stringLength","totalParsedInputLength","hour","isPm","meridiemHour","meridiemFixWrap","prepareConfig","preparse","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromStringAndArray","createFromInputFallback","configFromString","minute","second","millisecond","configFromObject","configFromInput","isUTC","isObjectEmpty","add","prototypeMin","other","prototypeMax","pickBy","moments","ordering","Duration","duration","years","quarters","quarter","weeks","days","milliseconds","unitHasDecimal","isDurationValid","_milliseconds","_days","_months","_data","_bubble","isDuration","absRound","offset","separator","utcOffset","sign","offsetFromString","chunkOffset","matcher","matches","parts","cloneWithOffset","model","diff","setTime","local","getDateOffset","getTimezoneOffset","isUtc","aspNetRegex","isoRegex","createDuration","ret","diffRes","parseIso","base","isBefore","positiveMomentsDifference","momentsDifference","inp","isAfter","createAdder","direction","period","tmp","addSubtract","isAdding","invalid","subtract","newLocaleData","defaultFormat","defaultFormatUtc","lang","addWeekYearFormatToken","getter","getSetWeekYearHelper","weeksTarget","setWeekAll","dayOfYearData","isoWeekYear","_dayOfMonthOrdinalParse","_ordinalParse","_dayOfMonthOrdinalParseLenient","getSetDayOfMonth","getSetMinute","getSetSecond","parseMs","getSetMillisecond","proto","preParsePostFormat","time","formats","sod","startOf","calendarFormat","asFloat","that","zoneDelta","adjust","wholeMonthDiff","anchor","monthDiff","endOf","inputString","postformat","withoutSuffix","humanize","fromNow","toNow","invalidAt","localInput","isBetween","inclusivity","isSame","inputMs","isSameOrAfter","isSameOrBefore","parsingFlags","prioritized","unitsObj","getPrioritizedUnits","isoWeekday","toArray","toObject","toDate","toISOString","inspect","zone","isLocal","prefix","suffix","unix","creationData","isoWeek","isoWeeks","weekInfo","isoWeeksInYear","parseWeekday","parseIsoWeekday","keepLocalTime","keepMinutes","localAdjust","_changeInProgress","parseZone","tZone","hasAlignedHourOffset","isDST","isUtcOffset","zoneAbbr","zoneName","dates","isDSTShifted","_isDSTShifted","proto$1","get$1","field","setter","listMonthsImpl","out","listWeekdaysImpl","localeSorted","shift","_calendar","_longDateFormat","formatUpper","_invalidDate","_ordinal","isFuture","_relativeTime","pastFuture","isFormat","_monthsShort","_monthsParseExact","firstDayOfYear","firstDayOfWeek","_weekdays","_weekdaysMin","_weekdaysShort","_weekdaysParseExact","_fullWeekdaysParse","isLower","langData","mathAbs","addSubtract$1","absCeil","daysToMonths","monthsToDays","makeAs","alias","as","asMilliseconds","asSeconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","makeGetter","thresholds","substituteTimeAgo","abs$1","toISOString$1","Y","D","total","proto$2","monthsFromDays","withSuffix","posNegDuration","relativeTime$1","toIsoString","version","updateLocale","relativeTimeRounding","roundingFunction","relativeTimeThreshold","threshold","limit","myMoment","helpers","Element","elements","Interaction","platform","plugins","register","initialize","canvasHelpers","canvas","Bar","context","Bubble","Doughnut","Line","PolarArea","Radar","Scatter","_set","hover","mode","scales","xAxes","categoryPercentage","barPercentage","gridLines","offsetGridLines","yAxes","axis","position","rectangle","borderSkipped","tooltips","callbacks","title","item","yLabel","labels","label","datasets","datasetIndex","xLabel","controllers","bar","DatasetController","dataElementType","Rectangle","meta","me","getMeta","getDataset","update","reset","ilen","rects","_ruler","getRuler","updateElement","chart","dataset","custom","rectangleOptions","options","_xScale","getScaleForId","xAxisID","_yScale","yAxisID","_datasetIndex","_index","_model","datasetLabel","backgroundColor","valueAtIndexOrDefault","borderColor","borderWidth","updateElementGeometry","pivot","vscale","getValueScale","getBasePixel","horizontal","isHorizontal","ruler","vpixels","calculateBarValuePixels","ipixels","calculateBarIndexPixels","head","center","height","size","width","getValueScaleId","getIndexScaleId","getIndexScale","getStackCount","last","stacked","stacks","getDatasetMeta","isDatasetVisible","getStackIndex","stackCount","pixels","start","left","top","end","getPixelForValue","imeta","ivalue","getRightValue","controller","id","leftSampleSize","rightSampleSize","leftCategorySize","fullBarSize","stackIndex","valueOrDefault","barThickness","maxBarThickness","Infinity","draw","clipArea","ctx","chartArea","unclipArea","setHoverStyle","hoverBackgroundColor","getHoverColor","hoverBorderColor","hoverBorderWidth","removeHoverStyle","rectangleElementOptions","horizontalBar","dataPoint","bubble","Point","points","each","point","xScale","yScale","_resolveElementOptions","dsIndex","getPixelForDecimal","_options","hitRadius","pointStyle","radius","skip","hoverRadius","resolve","dataIndex","animation","animateRotate","animateScale","legendCallback","text","legend","generateLabels","ds","arc","arcOpts","fillStyle","strokeStyle","lineWidth","hidden","onClick","legendItem","cutoutPercentage","rotation","circumference","tooltipItem","dataLabel","doughnut","pie","Arc","linkScales","noop","getRingIndex","ringIndex","opts","availableWidth","right","availableHeight","bottom","minSize","startAngle","endAngle","contains0","contains90","contains180","contains270","cutout","getMaxBorderWidth","outerRadius","innerRadius","radiusLength","getVisibleDatasetCount","offsetX","offsetY","calculateTotal","animationOpts","centerX","centerY","calculateCircumference","element","arcs","hoverWidth","_chart","showLines","spanGaps","lineEnabled","showLine","line","datasetElementType","lineElementOptions","tension","lineTension","_scale","_children","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill","steppedLine","stepped","cubicInterpolationMode","updateBezierControlPoints","getPointBackgroundColor","pointBackgroundColor","getPointBorderColor","pointBorderColor","getPointBorderWidth","pointBorderWidth","pointOptions","pointRadius","pointHitRadius","calculatePointY","dsMeta","sumPos","sumNeg","stackedRightValue","Number","rightValue","controlPoints","area","capControlPoint","pt","filter","splineCurveMonotone","splineCurve","previousItem","nextItem","controlPointPreviousX","previous","controlPointPreviousY","controlPointNextX","controlPointNextY","capBezierPoints","pointHoverRadius","pointHoverBackgroundColor","pointHoverBorderColor","pointHoverBorderWidth","angleLines","display","circular","pointLabels","ticks","beginAtZero","polarArea","count","countVisibleElements","xCenter","yCenter","visibleCount","datasetStartAngle","distance","getDistanceFromCenterForValue","resetRadius","radar","_loop","pointElementOptions","pointPosition","getPointPositionForValue","scatter","easing","onProgress","onComplete","Animation","currentStep","numSteps","render","onAnimationProgress","onAnimationComplete","animationService","frameDuration","animations","dropFrames","request","addAnimation","lazy","animating","requestAnimationFrame","cancelAnimation","findIndex","requestAnimFrame","startDigest","startTime","framesToDrop","advance","endTime","defineProperty","updateConfig","newOptions","scaleOptions","tooltip","positionIsHorizontal","types","instances","construct","configMerge","initConfig","acquireContext","uid","aspectRatio","_bufferedRender","notify","retinaScale","devicePixelRatio","bindEvents","responsive","resize","ensureScalesHaveIDs","buildScales","initToolTip","clear","stop","silent","maintainAspectRatio","newWidth","getMaximumWidth","newHeight","getMaximumHeight","style","newSize","onResize","responsiveAnimationDuration","scalesOptions","xAxisOptions","yAxisOptions","items","dtype","dposition","isDefault","scaleType","scaleClass","scaleService","getScaleConstructor","mergeTicksOptions","addScalesToLayout","buildOrUpdateControllers","newControllers","destroyDatasetMeta","updateIndex","ControllerClass","resetElements","buildOrUpdateElements","updateLayout","updateDatasets","_bufferedRequest","layoutService","updateDataset","animationOptions","animationObject","easingFunction","effects","stepDecimal","easingValue","isNullOrUndef","transition","boxes","box","drawDatasets","drawDataset","getElementAtEvent","modes","single","getElementsAtEvent","intersect","getElementsAtXAxis","getElementsAtEventForMode","method","getDatasetAtEvent","_meta","generateLegend","destroy","unbindEvents","releaseContext","toBase64Image","toDataURL","Tooltip","_chartInstance","listeners","_listeners","listener","eventHandler","events","addEventListener","removeEventListener","updateHoverStyle","enabled","changed","handleEvent","bufferedRequest","animationDuration","hoverOptions","lastActive","active","onHover","native","arrayEquals","Controller","arrayEvents","unlistenArrayEvents","stub","_chartjs","addElements","scaleID","createMetaDataset","createMetaData","metaData","addElementAndReset","configurable","enumerable","object","resyncElements","elementOpts","numMeta","numData","insertElements","onDataPush","onDataPop","pop","onDataShift","onDataSplice","onDataUnshift","inherits","scope","merge","color","configuration","_view","_start","ease","view","actual","origin","c0","c1","interpolate","tooltipPosition","hasValue","parseMaxStyle","styleValue","node","parentProperty","valueInPixels","parentNode","isConstrainedValue","getConstraintDimension","domNode","maxStyle","percentageProperty","document","defaultView","constrainedNode","getComputedStyle","constrainedContainer","hasCNode","hasCContainer","infinity","POSITIVE_INFINITY","setFn","merger","tval","sval","scaleMerge","getScaleDefaults","_merger","slen","where","collection","filterCallback","filtered","findNextWhere","arrayToSearch","startIndex","currentItem","findPreviousWhere","extensions","ChartElement","constructor","Surrogate","__super__","almostEquals","epsilon","almostWhole","rounded","reduce","NEGATIVE_INFINITY","log10","log","LN10","toRadians","toDegrees","radians","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","distanceBetweenPoints","pt1","pt2","aliasPixel","pixelWidth","firstPoint","middlePoint","afterPoint","current","d01","d12","s01","s12","fa","fb","EPSILON","pointBefore","pointCurrent","pointAfter","alphaK","betaK","tauK","squaredMagnitude","deltaX","pointsWithTangents","deltaK","mK","pointsLen","slopeDeltaX","loop","niceNum","range","exponent","fraction","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","setTimeout","getRelativePosition","evt","mouseX","mouseY","originalEvent","currentTarget","srcElement","boundingRect","getBoundingClientRect","touches","clientX","clientY","paddingLeft","getStyle","paddingTop","paddingRight","paddingBottom","currentDevicePixelRatio","getConstraintWidth","getConstraintHeight","container","clientWidth","cw","clientHeight","ch","el","property","currentStyle","getPropertyValue","forceRatio","pixelRatio","fontString","pixelSize","fontStyle","fontFamily","longestText","font","arrayOfThings","cache","gc","garbageCollect","longest","thing","measureText","nestedThing","gcLen","textWidth","numberOfLabelLines","numberOfLines","CanvasGradient","defaultColor","colorValue","CanvasPattern","parseVisibleItems","handler","jlen","getIntersectItems","inRange","getNearestItems","distanceMetric","minDistance","nearestItems","getCenterPoint","getDistanceMetricForAxis","useX","useY","deltaY","indexMode","nearest","getArea","intersectsItem","inXRange","inYRange","defaultFontColor","defaultFontFamily","defaultFontSize","defaultFontStyle","layout","padding","filterByPosition","sortByWeight","reverse","_tmpIndex_","v0","v1","addBox","fullWidth","removeBox","layoutItem","configure","props","layoutOptions","toPadding","leftPadding","rightPadding","topPadding","bottomPadding","leftBoxes","rightBoxes","topBoxes","bottomBoxes","chartAreaBoxes","chartWidth","chartHeight","chartAreaHeight","verticalBoxWidth","horizontalBoxHeight","maxChartAreaWidth","maxChartAreaHeight","minBoxSizes","maxHorizontalLeftPadding","maxHorizontalRightPadding","maxVerticalTopPadding","maxVerticalBottomPadding","horizontalBox","getPadding","boxPadding","verticalBox","totalLeftBoxesWidth","totalRightBoxesWidth","totalTopBoxesHeight","totalBottomBoxesHeight","fitBox","minBoxSize","scaleMargin","leftPaddingAddition","topPaddingAddition","newMaxChartAreaHeight","newMaxChartAreaWidth","placeBox","minBox","_plugins","_cacheId","plugin","unregister","idx","getAll","hook","descriptor","params","descriptors","pluginService","PluginBase","Ticks","labelsFromTicks","getLineValue","lineValue","getPixelForTick","drawBorder","drawOnChartArea","drawTicks","tickMarkLength","zeroLineWidth","zeroLineColor","zeroLineBorderDash","zeroLineBorderDashOffset","scaleLabel","labelString","lineHeight","minRotation","maxRotation","mirror","autoSkip","autoSkipPadding","labelOffset","formatters","minor","major","computeTextSize","tick","parseFontOptions","globalDefaults","fontSize","family","parseLineHeight","toLineHeight","Scale","getTicks","_ticks","beforeUpdate","maxWidth","maxHeight","margins","longestTextCache","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","beforeTickToLabelConversion","convertTicksToLabels","afterTickToLabelConversion","beforeCalculateTickRotation","calculateTickRotation","afterCalculateTickRotation","beforeFit","fit","afterFit","afterUpdate","tickOpts","userCallback","tickFont","labelRotation","cosRotation","originalLabelWidth","labelWidth","tickWidth","angleRadians","scaleLabelOpts","gridLineOpts","isFullWidth","deltaHeight","largestTextWidth","tallestLabelHeightInLines","lineSpace","tickPadding","longestLabelWidth","labelHeight","firstLabelWidth","lastLabelWidth","handleMargins","rawValue","getLabelForIndex","getValueForPixel","pixel","finalVal","innerHeight","decimal","valueOffset","getBaseValue","_autoSkip","skipRatio","maxTicks","optionTicks","tickCount","labelRotationRadians","longestRotatedLabel","maxTicksLimit","optionMajorTicks","isRotated","tickFontColor","fontColor","majorTickFontColor","majorTickFont","tl","scaleLabelFontColor","scaleLabelFont","scaleLabelPadding","itemsToDraw","xTickStart","xTickEnd","yTickStart","yTickEnd","lineColor","tx1","ty1","tx2","ty2","x1","y1","x2","labelX","labelY","zeroLineIndex","textAlign","textBaseline","labelYOffset","xLineValue","labelXOffset","isLeft","yLineValue","glWidth","glColor","glBorderDash","glBorderDashOffset","itemToDraw","save","setLineDash","lineDashOffset","beginPath","moveTo","lineTo","stroke","restore","translate","fillText","scaleLabelX","scaleLabelY","halfLineHeight","constructors","registerScaleType","scaleConstructor","scaleDefaults","updateScaleDefaults","additions","generators","linear","generationOptions","dataRange","spacing","stepSize","niceRange","niceMin","niceMax","numSpaces","logarithmic","exp","significand","tickVal","endExp","endSignificand","minNotZero","lastTick","tickValue","logDelta","tickString","numDecimal","toFixed","remain","toExponential","titleFontStyle","titleSpacing","titleMarginBottom","titleFontColor","titleAlign","bodySpacing","bodyFontColor","bodyAlign","footerFontStyle","footerSpacing","footerMarginTop","footerFontColor","footerAlign","yPadding","xPadding","caretPadding","caretSize","cornerRadius","multiKeyBackground","displayColors","beforeTitle","tooltipItems","labelCount","afterTitle","beforeBody","beforeLabel","labelColor","labelTextColor","afterLabel","afterBody","beforeFooter","footer","afterFooter","mergeOpacity","colorString","opacity","pushOrConcat","toPush","getBaseModel","tooltipOpts","xAlign","yAlign","_bodyFontFamily","bodyFontFamily","_bodyFontStyle","bodyFontStyle","_bodyAlign","bodyFontSize","_titleFontFamily","titleFontFamily","_titleFontStyle","titleFontSize","_titleAlign","_footerFontFamily","footerFontFamily","_footerFontStyle","footerFontSize","_footerAlign","legendColorBackground","getTitle","lines","getBeforeBody","getBody","bodyItems","bodyItem","before","after","getAfterBody","getFooter","existingModel","_active","alignment","backgroundPoint","tooltipSize","caretX","caretY","labelColors","labelTextColors","positioners","_eventPosition","itemSort","body","dataPoints","combinedBodyLength","titleLineCount","footerLineCount","widthPadding","maxLineWidth","getTooltipSize","lf","rf","olf","orf","yf","midX","midY","determineAlignment","vm","paddingAndSize","radiusAndPadding","getBackgroundPoint","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","drawTitle","drawBody","xLinePadding","fillLineOfText","drawColorBoxes","fillRect","strokeRect","textColor","drawFooter","drawBackground","quadraticCurveTo","closePath","hasTooltipContent","_lastActive","average","eventPosition","nearestElement","tp","inLabelRange","chartX","chartY","pointRelativePosition","betweenAngles","withinRadius","halfAngle","halfRadius","centreAngle","rangeFromCentre","sA","eA","lineJoin","currentVM","globalOptionLineElements","lastDrawnIndex","lineCap","xRange","drawPoint","isVertical","getBarBounds","halfWidth","halfHeight","signX","signY","barSize","halfStroke","borderLeft","borderRight","borderTop","borderBottom","corners","startCorner","cornerAt","corner","bounds","clearRect","roundedRect","rx","ry","rect","edgeLength","xOffset","yOffset","SQRT2","leftX","topY","sideSize","drawImage","clip","flip","bezierCurveTo","drawRoundedRectangle","defaultValue","thisArg","loopable","a0","a1","klen","_mergerIf","mergeIf","sources","callCallback","fromIndex","getValueOrDefault","getValueAtIndexOrDefault","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","asin","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","easingEffects","inputs","getContext","ANIMATION_START_EVENTS","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","readUsedSize","eventListenerOptions","supports","passive","createEvent","nativeEvent","addResizeListener","ticking","expando","resizer","createElement","cls","CSS_PREFIX","cssText","className","innerHTML","expand","childNodes","shrink","_reset","scrollLeft","scrollTop","onScroll","bind","createResizer","proxy","renderProxy","animationName","classList","watchForRender","insertBefore","firstChild","removeResizeListener","remove","unwatchForRender","removeChild","_enabled","css","keyframes","_style","setAttribute","getElementsByTagName","appendChild","createTextNode","getElementById","renderHeight","getAttribute","renderWidth","initial","displayWidth","displayHeight","initCanvas","removeAttribute","proxies","event","fromNativeEvent","addEvent","removeEvent","basic","dom","implementation","filler","propagate","mappers","boundary","decodeFill","computeBoundary","scaleBottom","scaleTop","scaleZero","getBasePosition","resolveTarget","visited","visible","createMapper","isDrawable","drawArea","curve0","curve1","len0","len1","afterDatasetsUpdate","$filler","mapper","beforeDatasetDraw","p0","d0","d1","span","doFill","ci","boxWidth","lineDash","getBoxWidth","labelOpts","usePointStyle","createNewLegendAndAttach","legendOpts","Legend","legendHitBoxes","doughnutMode","beforeBuildLabels","buildLabels","afterBuildLabels","legendItems","globalDefault","labelFont","hitboxes","lineWidths","totalHeight","vPadding","columnWidths","totalWidth","currentColWidth","currentColHeight","itemHeight","itemWidth","lineDefault","legendWidth","cursor","isLineWidthZero","offSet","drawLegendBox","halfFontSize","xLeft","yMiddle","lh","hitBox","beforeInit","afterEvent","createNewTitleBlockAndAttach","titleOpts","Title","titleBlock","lineCount","textSize","titleX","titleY","titleFont","DatasetScale","getLabels","xLabels","yLabels","minIndex","maxIndex","valueCategory","offsetAmt","valueWidth","widthOffset","valueHeight","heightOffset","horz","valueDimension","defaultConfig","LinearScale","LinearScaleBase","IDMatches","hasStacks","valuesPerStack","positiveValues","negativeValues","relativePoints","valuesForType","minVal","maxVal","handleTickRangeOptions","getTickLimit","tickFontSize","handleDirectionalChanges","innerDimension","ticksAsNumbers","minSign","maxSign","setMin","suggestedMin","setMax","suggestedMax","numericGeneratorOptions","fixedStepSize","LogarithmicScale","tickValues","newVal","animate","showLabelBackdrop","backdropColor","backdropPaddingY","backdropPaddingX","getValueCount","getPointLabelFontOptions","pointLabelOptions","determineLimits","getTextAlignForAngle","adjustPointPositionForLabelHeight","numberOrZero","param","LinearRadialScale","drawingArea","largestPossibleRadius","plFont","furthestLimits","furthestAngles","_pointLabelSizes","valueCount","getPointPosition","getIndexAngle","hLimits","vLimits","setReductions","fitWithPointLabels","setCenterPoint","radiusReductionLeft","radiusReductionRight","radiusReductionTop","radiusReductionBottom","leftMovement","rightMovement","topMovement","bottomMovement","maxRight","maxLeft","maxTop","maxBottom","scalingFactor","distanceFromCenter","thisAngle","tickFontStyle","tickFontFamily","tickLabelFont","yCenterOffset","drawRadiusLine","angleLineOpts","pointLabelOpts","outerDistance","outerPosition","pointLabelPosition","pointLabelFontColor","drawPointLabels","MIN_INTEGER","MIN_SAFE_INTEGER","MAX_INTEGER","MAX_SAFE_INTEGER","INTERVALS","steps","UNITS","sorter","arrayUnique","hash","table","skey","tkey","mid","i0","i1","lo","lookup","prev","momentify","parser","parse","generate","capacity","timeOpts","unitStepSize","majorTicksEnabled","interval","first","factor","determineStepSize","TimeScale","timestamp","timestamps","_horizontal","_table","_timestamps","displayFormats","getLabelCapacity","minUnit","determineUnit","majorUnit","determineMajorUnit","_unit","_majorUnit","_minorFormat","_majorFormat","distribution","curr","buildLookupTable","_offsets","upper","lower","computeOffsets","ticksFromTimestamps","tooltipFormat","tickFormatFunction","majorFormat","majorTime","majorTickOpts","formatter","getPixelForOffset","getLabelWidth","ticksOpts","tickLabelWidth","sinRotation","exampleTime","exampleLabel","innerWidth","displayFormat"],"mappings":"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"} \ No newline at end of file diff --git a/lib/amd/build/chartjs.min.js.map b/lib/amd/build/chartjs.min.js.map index 18ff8d27be4..e86b350d4b9 100644 --- a/lib/amd/build/chartjs.min.js.map +++ b/lib/amd/build/chartjs.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chartjs.min.js","sources":["../src/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.js loader.\n *\n * @package core\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/chartjs-lazy'], function(ChartJS) {\n return ChartJS;\n});\n"],"names":["define","ChartJS"],"mappings":";;;;;;;AAsBAA,sBAAO,CAAC,sBAAsB,SAASC,SACnC,OAAOA,OACV"} \ No newline at end of file +{"version":3,"file":"chartjs.min.js","sources":["../src/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.js loader.\n *\n * @package core\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/chartjs-lazy'], function(ChartJS) {\n return ChartJS;\n});\n"],"names":["define","ChartJS"],"mappings":";;;;;;;AAsBAA,sBAAO,CAAC,sBAAsB,SAASC,gBAC5BA"} \ No newline at end of file diff --git a/lib/amd/build/checkbox-toggleall.min.js.map b/lib/amd/build/checkbox-toggleall.min.js.map index a33643cd4b8..adaa9cab2e6 100644 --- a/lib/amd/build/checkbox-toggleall.min.js.map +++ b/lib/amd/build/checkbox-toggleall.min.js.map @@ -1 +1 @@ -{"version":3,"file":"checkbox-toggleall.min.js","sources":["../src/checkbox-toggleall.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\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 help with toggle select/deselect all.\n *\n * @module core/checkbox-toggleall\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/pubsub'], function($, PubSub) {\n\n /**\n * Whether event listeners have already been registered.\n *\n * @private\n * @type {boolean}\n */\n var registered = false;\n\n /**\n * List of custom events that this module publishes.\n *\n * @private\n * @type {{checkboxToggled: string}}\n */\n var events = {\n checkboxToggled: 'core/checkbox-toggleall:checkboxToggled',\n };\n\n /**\n * Fetches elements that are member of a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name that we're searching form.\n * @param {boolean} exactMatch Whether we want an exact match we just want to match toggle groups that start with the given\n * toggle group name.\n * @returns {jQuery} The elements matching the given toggle group.\n */\n var getToggleGroupElements = function(root, toggleGroup, exactMatch) {\n if (exactMatch) {\n return root.find('[data-action=\"toggle\"][data-togglegroup=\"' + toggleGroup + '\"]');\n } else {\n return root.find('[data-action=\"toggle\"][data-togglegroup^=\"' + toggleGroup + '\"]');\n }\n };\n\n /**\n * Fetches the slave checkboxes for a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name.\n * @returns {jQuery} The slave checkboxes belonging to the toggle group.\n */\n var getAllSlaveCheckboxes = function(root, toggleGroup) {\n return getToggleGroupElements(root, toggleGroup, false).filter('[data-toggle=\"slave\"]');\n };\n\n /**\n * Fetches the master elements (checkboxes or buttons) that control the slave checkboxes in a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name.\n * @param {boolean} exactMatch\n * @returns {jQuery} The control elements belonging to the toggle group.\n */\n var getControlCheckboxes = function(root, toggleGroup, exactMatch) {\n return getToggleGroupElements(root, toggleGroup, exactMatch).filter('[data-toggle=\"master\"]');\n };\n\n /**\n * Fetches the action elements that perform actions on the selected checkboxes in a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name.\n * @returns {jQuery} The action elements belonging to the toggle group.\n */\n var getActionElements = function(root, toggleGroup) {\n return getToggleGroupElements(root, toggleGroup, true).filter('[data-toggle=\"action\"]');\n };\n\n /**\n * Toggles the slave checkboxes in a given toggle group when a master element in that toggle group is toggled.\n *\n * @private\n * @param {Object} e The event object.\n */\n var toggleSlavesFromMasters = function(e) {\n var root = e.data.root;\n var target = $(e.target);\n\n var toggleGroupName = target.data('togglegroup');\n var targetState;\n if (target.is(':checkbox')) {\n targetState = target.is(':checked');\n } else {\n targetState = target.data('checkall') === 1;\n }\n\n toggleSlavesToState(root, toggleGroupName, targetState);\n };\n\n /**\n * Toggles the slave checkboxes from the masters.\n *\n * @param {HTMLElement} root\n * @param {String} toggleGroupName\n */\n var updateSlavesFromMasterState = function(root, toggleGroupName) {\n // Normalise to jQuery Object.\n root = $(root);\n\n var target = getControlCheckboxes(root, toggleGroupName, false);\n var targetState;\n if (target.is(':checkbox')) {\n targetState = target.is(':checked');\n } else {\n targetState = target.data('checkall') === 1;\n }\n\n toggleSlavesToState(root, toggleGroupName, targetState);\n };\n\n /**\n * Toggles the master checkboxes and action elements in a given toggle group.\n *\n * @param {jQuery} root The root jQuery element.\n * @param {String} toggleGroupName The name of the toggle group\n */\n var toggleMastersAndActionElements = function(root, toggleGroupName) {\n var toggleGroupSlaves = getAllSlaveCheckboxes(root, toggleGroupName);\n if (toggleGroupSlaves.length > 0) {\n var toggleGroupCheckedSlaves = toggleGroupSlaves.filter(':checked');\n var targetState = toggleGroupSlaves.length === toggleGroupCheckedSlaves.length;\n\n // Make sure to toggle the exact master checkbox in the given toggle group.\n setMasterStates(root, toggleGroupName, targetState, true);\n // Enable the action elements if there's at least one checkbox checked in the given toggle group.\n // Disable otherwise.\n setActionElementStates(root, toggleGroupName, !toggleGroupCheckedSlaves.length);\n }\n };\n\n /**\n * Returns an array containing every toggle group level of a given toggle group.\n *\n * @param {String} toggleGroupName The name of the toggle group\n * @return {Array} toggleGroupLevels Array that contains every toggle group level of a given toggle group\n */\n var getToggleGroupLevels = function(toggleGroupName) {\n var toggleGroups = toggleGroupName.split(' ');\n var toggleGroupLevels = [];\n var toggleGroupLevel = '';\n\n toggleGroups.forEach(function(toggleGroupName) {\n toggleGroupLevel += ' ' + toggleGroupName;\n toggleGroupLevels.push(toggleGroupLevel.trim());\n });\n\n return toggleGroupLevels;\n };\n\n /**\n * Toggles the slave checkboxes to a specific state.\n *\n * @param {HTMLElement} root\n * @param {String} toggleGroupName\n * @param {Bool} targetState\n */\n var toggleSlavesToState = function(root, toggleGroupName, targetState) {\n var slaves = getAllSlaveCheckboxes(root, toggleGroupName);\n // Set the slave checkboxes from the masters and manually trigger the native 'change' event.\n slaves.prop('checked', targetState).trigger('change');\n // Get all checked slaves after the change of state.\n var checkedSlaves = slaves.filter(':checked');\n\n // Toggle the master checkbox in the given toggle group.\n setMasterStates(root, toggleGroupName, targetState, false);\n // Enable the action elements if there's at least one checkbox checked in the given toggle group. Disable otherwise.\n setActionElementStates(root, toggleGroupName, !checkedSlaves.length);\n\n // Get all toggle group levels and toggle accordingly all parent master checkboxes and action elements from each\n // level. Exclude the given toggle group (toggleGroupName) as the master checkboxes and action elements from this\n // level have been already toggled.\n var toggleGroupLevels = getToggleGroupLevels(toggleGroupName)\n .filter(toggleGroupLevel => toggleGroupLevel !== toggleGroupName);\n\n toggleGroupLevels.forEach(function(toggleGroupLevel) {\n // Toggle the master checkboxes action elements in the given toggle group level.\n toggleMastersAndActionElements(root, toggleGroupLevel);\n });\n\n PubSub.publish(events.checkboxToggled, {\n root: root,\n toggleGroupName: toggleGroupName,\n slaves: slaves,\n checkedSlaves: checkedSlaves,\n anyChecked: targetState,\n });\n };\n\n /**\n * Set the state for an entire group of checkboxes.\n *\n * @param {HTMLElement} root\n * @param {String} toggleGroupName\n * @param {Bool} targetState\n */\n var setGroupState = function(root, toggleGroupName, targetState) {\n // Normalise to jQuery Object.\n root = $(root);\n\n // Set the master and slaves.\n setMasterStates(root, toggleGroupName, targetState, true);\n toggleSlavesToState(root, toggleGroupName, targetState);\n };\n\n /**\n * Toggles the master checkboxes in a given toggle group when all or none of the slave checkboxes in the same toggle group\n * have been selected.\n *\n * @private\n * @param {Object} e The event object.\n */\n var toggleMastersFromSlaves = function(e) {\n var root = e.data.root;\n var target = $(e.target);\n var toggleGroupName = target.data('togglegroup');\n var slaves = getAllSlaveCheckboxes(root, toggleGroupName);\n var checkedSlaves = slaves.filter(':checked');\n\n // Get all toggle group levels for the given toggle group and toggle accordingly all master checkboxes\n // and action elements from each level.\n var toggleGroupLevels = getToggleGroupLevels(toggleGroupName);\n toggleGroupLevels.forEach(function(toggleGroupLevel) {\n // Toggle the master checkboxes action elements in the given toggle group level.\n toggleMastersAndActionElements(root, toggleGroupLevel);\n });\n\n PubSub.publish(events.checkboxToggled, {\n root: root,\n toggleGroupName: toggleGroupName,\n slaves: slaves,\n checkedSlaves: checkedSlaves,\n anyChecked: !!checkedSlaves.length,\n });\n };\n\n /**\n * Enables or disables the action elements.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroupName The toggle group name of the action element(s).\n * @param {boolean} disableActionElements Whether to disable or to enable the action elements.\n */\n var setActionElementStates = function(root, toggleGroupName, disableActionElements) {\n getActionElements(root, toggleGroupName).prop('disabled', disableActionElements);\n };\n\n /**\n * Selects or deselects the master elements.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroupName The toggle group name of the master element(s).\n * @param {boolean} targetState Whether to select (true) or deselect (false).\n * @param {boolean} exactMatch Whether to do an exact match for the toggle group name or not.\n */\n var setMasterStates = function(root, toggleGroupName, targetState, exactMatch) {\n // Set the master checkboxes value and ARIA labels..\n var masters = getControlCheckboxes(root, toggleGroupName, exactMatch);\n masters.prop('checked', targetState);\n masters.each(function(i, masterElement) {\n masterElement = $(masterElement);\n\n var targetString;\n if (targetState) {\n targetString = masterElement.data('toggle-deselectall');\n } else {\n targetString = masterElement.data('toggle-selectall');\n }\n\n if (masterElement.is(':checkbox')) {\n var masterLabel = root.find('[for=\"' + masterElement.attr('id') + '\"]');\n if (masterLabel.length) {\n if (masterLabel.html() !== targetString) {\n masterLabel.html(targetString);\n }\n }\n } else {\n masterElement.text(targetString);\n // Set the checkall data attribute.\n masterElement.data('checkall', targetState ? 0 : 1);\n }\n });\n };\n\n /**\n * Registers the event listeners.\n *\n * @private\n */\n var registerListeners = function() {\n if (!registered) {\n registered = true;\n\n var root = $(document.body);\n root.on('click', '[data-action=\"toggle\"][data-toggle=\"master\"]', {root: root}, toggleSlavesFromMasters);\n root.on('click', '[data-action=\"toggle\"][data-toggle=\"slave\"]', {root: root}, toggleMastersFromSlaves);\n }\n };\n\n return {\n init: function() {\n registerListeners();\n },\n events: events,\n setGroupState: setGroupState,\n updateSlavesFromMasterState: updateSlavesFromMasterState,\n };\n});\n"],"names":["define","$","PubSub","registered","events","checkboxToggled","getToggleGroupElements","root","toggleGroup","exactMatch","find","getAllSlaveCheckboxes","filter","getControlCheckboxes","toggleSlavesFromMasters","e","targetState","data","target","toggleGroupName","is","toggleSlavesToState","toggleMastersAndActionElements","toggleGroupSlaves","length","toggleGroupCheckedSlaves","setMasterStates","setActionElementStates","getToggleGroupLevels","toggleGroups","split","toggleGroupLevels","toggleGroupLevel","forEach","push","trim","slaves","prop","trigger","checkedSlaves","publish","anyChecked","toggleMastersFromSlaves","disableActionElements","getActionElements","masters","each","i","masterElement","targetString","masterLabel","attr","html","text","init","document","body","on","registerListeners","setGroupState","updateSlavesFromMasterState"],"mappings":";;;;;;;AAsBAA,OAAM,0BAAC,CAAC,SAAU,gBAAgB,SAASC,EAAGC,QAQtCC,IAAAA,YAAa,EAQbC,OAAS,CACTC,gBAAiB,2CAajBC,uBAAyB,SAASC,KAAMC,YAAaC,YACrD,OAAIA,WACOF,KAAKG,KAAK,4CAA8CF,YAAc,MAEtED,KAAKG,KAAK,6CAA+CF,YAAc,KAErF,EAUGG,sBAAwB,SAASJ,KAAMC,aACvC,OAAOF,uBAAuBC,KAAMC,aAAa,GAAOI,OAAO,wBAClE,EAWGC,qBAAuB,SAASN,KAAMC,YAAaC,YACnD,OAAOH,uBAAuBC,KAAMC,YAAaC,YAAYG,OAAO,yBACvE,EAoBGE,wBAA0B,SAASC,GACnC,IAIIC,YAJAT,KAAOQ,EAAEE,KAAKV,KACdW,OAASjB,EAAEc,EAAEG,QAEbC,gBAAkBD,OAAOD,KAAK,eAG9BD,YADAE,OAAOE,GAAG,aACIF,OAAOE,GAAG,YAEkB,IAA5BF,OAAOD,KAAK,YAG9BI,oBAAoBd,KAAMY,gBAAiBH,YAC9C,EA6BGM,+BAAiC,SAASf,KAAMY,iBAChD,IAAII,kBAAoBZ,sBAAsBJ,KAAMY,iBACpD,GAAII,kBAAkBC,OAAS,EAAG,CAC9B,IAAIC,yBAA2BF,kBAAkBX,OAAO,YACpDI,YAAcO,kBAAkBC,SAAWC,yBAAyBD,OAGxEE,gBAAgBnB,KAAMY,gBAAiBH,aAAa,GAGpDW,uBAAuBpB,KAAMY,iBAAkBM,yBAAyBD,OAC3E,CACJ,EAQGI,qBAAuB,SAAST,iBAChC,IAAIU,aAAeV,gBAAgBW,MAAM,KACrCC,kBAAoB,GACpBC,iBAAmB,GAOvB,OALAH,aAAaI,SAAQ,SAASd,iBAC1Ba,kBAAoB,IAAMb,gBAC1BY,kBAAkBG,KAAKF,iBAAiBG,OAC3C,IAEMJ,iBACV,EASGV,oBAAsB,SAASd,KAAMY,gBAAiBH,aACtD,IAAIoB,OAASzB,sBAAsBJ,KAAMY,iBAEzCiB,OAAOC,KAAK,UAAWrB,aAAasB,QAAQ,UAE5C,IAAIC,cAAgBH,OAAOxB,OAAO,YAGlCc,gBAAgBnB,KAAMY,gBAAiBH,aAAa,GAEpDW,uBAAuBpB,KAAMY,iBAAkBoB,cAAcf,QAKrCI,qBAAqBT,iBACxCP,QAAO,SAAAoB,kBAAoBA,OAAAA,mBAAqBb,eAAzB,IAEVc,SAAQ,SAASD,kBAE/BV,+BAA+Bf,KAAMyB,iBACxC,IAED9B,OAAOsC,QAAQpC,OAAOC,gBAAiB,CACnCE,KAAMA,KACNY,gBAAiBA,gBACjBiB,OAAQA,OACRG,cAAeA,cACfE,WAAYzB,aAEnB,EAyBG0B,wBAA0B,SAAS3B,GACnC,IAAIR,KAAOQ,EAAEE,KAAKV,KAEdY,gBADSlB,EAAEc,EAAEG,QACYD,KAAK,eAC9BmB,OAASzB,sBAAsBJ,KAAMY,iBACrCoB,cAAgBH,OAAOxB,OAAO,YAIVgB,qBAAqBT,iBAC3Bc,SAAQ,SAASD,kBAE/BV,+BAA+Bf,KAAMyB,iBACxC,IAED9B,OAAOsC,QAAQpC,OAAOC,gBAAiB,CACnCE,KAAMA,KACNY,gBAAiBA,gBACjBiB,OAAQA,OACRG,cAAeA,cACfE,aAAcF,cAAcf,QAEnC,EAUGG,uBAAyB,SAASpB,KAAMY,gBAAiBwB,wBAnLrC,SAASpC,KAAMC,aACnC,OAAOF,uBAAuBC,KAAMC,aAAa,GAAMI,OAAO,yBACjE,EAkLGgC,CAAkBrC,KAAMY,iBAAiBkB,KAAK,WAAYM,sBAC7D,EAWGjB,gBAAkB,SAASnB,KAAMY,gBAAiBH,YAAaP,YAE3DoC,IAAAA,QAAUhC,qBAAqBN,KAAMY,gBAAiBV,YAC1DoC,QAAQR,KAAK,UAAWrB,aACxB6B,QAAQC,MAAK,SAASC,EAAGC,eAGrB,IAAIC,aAOJ,GATAD,cAAgB/C,EAAE+C,eAIdC,aADAjC,YACegC,cAAc/B,KAAK,sBAEnB+B,cAAc/B,KAAK,oBAGlC+B,cAAc5B,GAAG,aAAc,CAC/B,IAAI8B,YAAc3C,KAAKG,KAAK,SAAWsC,cAAcG,KAAK,MAAQ,MAC9DD,YAAY1B,QACR0B,YAAYE,SAAWH,cACvBC,YAAYE,KAAKH,aAG5B,MACGD,cAAcK,KAAKJ,cAEnBD,cAAc/B,KAAK,WAAYD,YAAc,EAAI,EAExD,GACJ,EAiBM,MAAA,CACHsC,KAAM,YAXc,WAChB,IAACnD,WAAY,CACbA,YAAa,EAEb,IAAII,KAAON,EAAEsD,SAASC,MACtBjD,KAAKkD,GAAG,QAAS,+CAAgD,CAAClD,KAAMA,MAAOO,yBAC/EP,KAAKkD,GAAG,QAAS,8CAA+C,CAAClD,KAAMA,MAAOmC,wBACjF,CACJ,CAIOgB,EAFD,EAIHtD,OAAQA,OACRuD,cA9GgB,SAASpD,KAAMY,gBAAiBH,aAEhDT,KAAON,EAAEM,MAGTmB,gBAAgBnB,KAAMY,gBAAiBH,aAAa,GACpDK,oBAAoBd,KAAMY,gBAAiBH,YAC9C,EAwGG4C,4BAnN8B,SAASrD,KAAMY,iBAE7CZ,KAAON,EAAEM,MAELW,IACAF,YADAE,OAASL,qBAAqBN,KAAMY,iBAAiB,GAGrDH,YADAE,OAAOE,GAAG,aACIF,OAAOE,GAAG,YAEkB,IAA5BF,OAAOD,KAAK,YAG9BI,oBAAoBd,KAAMY,gBAAiBH,YAC9C,EAwMJ"} \ No newline at end of file +{"version":3,"file":"checkbox-toggleall.min.js","sources":["../src/checkbox-toggleall.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\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 help with toggle select/deselect all.\n *\n * @module core/checkbox-toggleall\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/pubsub'], function($, PubSub) {\n\n /**\n * Whether event listeners have already been registered.\n *\n * @private\n * @type {boolean}\n */\n var registered = false;\n\n /**\n * List of custom events that this module publishes.\n *\n * @private\n * @type {{checkboxToggled: string}}\n */\n var events = {\n checkboxToggled: 'core/checkbox-toggleall:checkboxToggled',\n };\n\n /**\n * Fetches elements that are member of a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name that we're searching form.\n * @param {boolean} exactMatch Whether we want an exact match we just want to match toggle groups that start with the given\n * toggle group name.\n * @returns {jQuery} The elements matching the given toggle group.\n */\n var getToggleGroupElements = function(root, toggleGroup, exactMatch) {\n if (exactMatch) {\n return root.find('[data-action=\"toggle\"][data-togglegroup=\"' + toggleGroup + '\"]');\n } else {\n return root.find('[data-action=\"toggle\"][data-togglegroup^=\"' + toggleGroup + '\"]');\n }\n };\n\n /**\n * Fetches the slave checkboxes for a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name.\n * @returns {jQuery} The slave checkboxes belonging to the toggle group.\n */\n var getAllSlaveCheckboxes = function(root, toggleGroup) {\n return getToggleGroupElements(root, toggleGroup, false).filter('[data-toggle=\"slave\"]');\n };\n\n /**\n * Fetches the master elements (checkboxes or buttons) that control the slave checkboxes in a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name.\n * @param {boolean} exactMatch\n * @returns {jQuery} The control elements belonging to the toggle group.\n */\n var getControlCheckboxes = function(root, toggleGroup, exactMatch) {\n return getToggleGroupElements(root, toggleGroup, exactMatch).filter('[data-toggle=\"master\"]');\n };\n\n /**\n * Fetches the action elements that perform actions on the selected checkboxes in a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name.\n * @returns {jQuery} The action elements belonging to the toggle group.\n */\n var getActionElements = function(root, toggleGroup) {\n return getToggleGroupElements(root, toggleGroup, true).filter('[data-toggle=\"action\"]');\n };\n\n /**\n * Toggles the slave checkboxes in a given toggle group when a master element in that toggle group is toggled.\n *\n * @private\n * @param {Object} e The event object.\n */\n var toggleSlavesFromMasters = function(e) {\n var root = e.data.root;\n var target = $(e.target);\n\n var toggleGroupName = target.data('togglegroup');\n var targetState;\n if (target.is(':checkbox')) {\n targetState = target.is(':checked');\n } else {\n targetState = target.data('checkall') === 1;\n }\n\n toggleSlavesToState(root, toggleGroupName, targetState);\n };\n\n /**\n * Toggles the slave checkboxes from the masters.\n *\n * @param {HTMLElement} root\n * @param {String} toggleGroupName\n */\n var updateSlavesFromMasterState = function(root, toggleGroupName) {\n // Normalise to jQuery Object.\n root = $(root);\n\n var target = getControlCheckboxes(root, toggleGroupName, false);\n var targetState;\n if (target.is(':checkbox')) {\n targetState = target.is(':checked');\n } else {\n targetState = target.data('checkall') === 1;\n }\n\n toggleSlavesToState(root, toggleGroupName, targetState);\n };\n\n /**\n * Toggles the master checkboxes and action elements in a given toggle group.\n *\n * @param {jQuery} root The root jQuery element.\n * @param {String} toggleGroupName The name of the toggle group\n */\n var toggleMastersAndActionElements = function(root, toggleGroupName) {\n var toggleGroupSlaves = getAllSlaveCheckboxes(root, toggleGroupName);\n if (toggleGroupSlaves.length > 0) {\n var toggleGroupCheckedSlaves = toggleGroupSlaves.filter(':checked');\n var targetState = toggleGroupSlaves.length === toggleGroupCheckedSlaves.length;\n\n // Make sure to toggle the exact master checkbox in the given toggle group.\n setMasterStates(root, toggleGroupName, targetState, true);\n // Enable the action elements if there's at least one checkbox checked in the given toggle group.\n // Disable otherwise.\n setActionElementStates(root, toggleGroupName, !toggleGroupCheckedSlaves.length);\n }\n };\n\n /**\n * Returns an array containing every toggle group level of a given toggle group.\n *\n * @param {String} toggleGroupName The name of the toggle group\n * @return {Array} toggleGroupLevels Array that contains every toggle group level of a given toggle group\n */\n var getToggleGroupLevels = function(toggleGroupName) {\n var toggleGroups = toggleGroupName.split(' ');\n var toggleGroupLevels = [];\n var toggleGroupLevel = '';\n\n toggleGroups.forEach(function(toggleGroupName) {\n toggleGroupLevel += ' ' + toggleGroupName;\n toggleGroupLevels.push(toggleGroupLevel.trim());\n });\n\n return toggleGroupLevels;\n };\n\n /**\n * Toggles the slave checkboxes to a specific state.\n *\n * @param {HTMLElement} root\n * @param {String} toggleGroupName\n * @param {Bool} targetState\n */\n var toggleSlavesToState = function(root, toggleGroupName, targetState) {\n var slaves = getAllSlaveCheckboxes(root, toggleGroupName);\n // Set the slave checkboxes from the masters and manually trigger the native 'change' event.\n slaves.prop('checked', targetState).trigger('change');\n // Get all checked slaves after the change of state.\n var checkedSlaves = slaves.filter(':checked');\n\n // Toggle the master checkbox in the given toggle group.\n setMasterStates(root, toggleGroupName, targetState, false);\n // Enable the action elements if there's at least one checkbox checked in the given toggle group. Disable otherwise.\n setActionElementStates(root, toggleGroupName, !checkedSlaves.length);\n\n // Get all toggle group levels and toggle accordingly all parent master checkboxes and action elements from each\n // level. Exclude the given toggle group (toggleGroupName) as the master checkboxes and action elements from this\n // level have been already toggled.\n var toggleGroupLevels = getToggleGroupLevels(toggleGroupName)\n .filter(toggleGroupLevel => toggleGroupLevel !== toggleGroupName);\n\n toggleGroupLevels.forEach(function(toggleGroupLevel) {\n // Toggle the master checkboxes action elements in the given toggle group level.\n toggleMastersAndActionElements(root, toggleGroupLevel);\n });\n\n PubSub.publish(events.checkboxToggled, {\n root: root,\n toggleGroupName: toggleGroupName,\n slaves: slaves,\n checkedSlaves: checkedSlaves,\n anyChecked: targetState,\n });\n };\n\n /**\n * Set the state for an entire group of checkboxes.\n *\n * @param {HTMLElement} root\n * @param {String} toggleGroupName\n * @param {Bool} targetState\n */\n var setGroupState = function(root, toggleGroupName, targetState) {\n // Normalise to jQuery Object.\n root = $(root);\n\n // Set the master and slaves.\n setMasterStates(root, toggleGroupName, targetState, true);\n toggleSlavesToState(root, toggleGroupName, targetState);\n };\n\n /**\n * Toggles the master checkboxes in a given toggle group when all or none of the slave checkboxes in the same toggle group\n * have been selected.\n *\n * @private\n * @param {Object} e The event object.\n */\n var toggleMastersFromSlaves = function(e) {\n var root = e.data.root;\n var target = $(e.target);\n var toggleGroupName = target.data('togglegroup');\n var slaves = getAllSlaveCheckboxes(root, toggleGroupName);\n var checkedSlaves = slaves.filter(':checked');\n\n // Get all toggle group levels for the given toggle group and toggle accordingly all master checkboxes\n // and action elements from each level.\n var toggleGroupLevels = getToggleGroupLevels(toggleGroupName);\n toggleGroupLevels.forEach(function(toggleGroupLevel) {\n // Toggle the master checkboxes action elements in the given toggle group level.\n toggleMastersAndActionElements(root, toggleGroupLevel);\n });\n\n PubSub.publish(events.checkboxToggled, {\n root: root,\n toggleGroupName: toggleGroupName,\n slaves: slaves,\n checkedSlaves: checkedSlaves,\n anyChecked: !!checkedSlaves.length,\n });\n };\n\n /**\n * Enables or disables the action elements.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroupName The toggle group name of the action element(s).\n * @param {boolean} disableActionElements Whether to disable or to enable the action elements.\n */\n var setActionElementStates = function(root, toggleGroupName, disableActionElements) {\n getActionElements(root, toggleGroupName).prop('disabled', disableActionElements);\n };\n\n /**\n * Selects or deselects the master elements.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroupName The toggle group name of the master element(s).\n * @param {boolean} targetState Whether to select (true) or deselect (false).\n * @param {boolean} exactMatch Whether to do an exact match for the toggle group name or not.\n */\n var setMasterStates = function(root, toggleGroupName, targetState, exactMatch) {\n // Set the master checkboxes value and ARIA labels..\n var masters = getControlCheckboxes(root, toggleGroupName, exactMatch);\n masters.prop('checked', targetState);\n masters.each(function(i, masterElement) {\n masterElement = $(masterElement);\n\n var targetString;\n if (targetState) {\n targetString = masterElement.data('toggle-deselectall');\n } else {\n targetString = masterElement.data('toggle-selectall');\n }\n\n if (masterElement.is(':checkbox')) {\n var masterLabel = root.find('[for=\"' + masterElement.attr('id') + '\"]');\n if (masterLabel.length) {\n if (masterLabel.html() !== targetString) {\n masterLabel.html(targetString);\n }\n }\n } else {\n masterElement.text(targetString);\n // Set the checkall data attribute.\n masterElement.data('checkall', targetState ? 0 : 1);\n }\n });\n };\n\n /**\n * Registers the event listeners.\n *\n * @private\n */\n var registerListeners = function() {\n if (!registered) {\n registered = true;\n\n var root = $(document.body);\n root.on('click', '[data-action=\"toggle\"][data-toggle=\"master\"]', {root: root}, toggleSlavesFromMasters);\n root.on('click', '[data-action=\"toggle\"][data-toggle=\"slave\"]', {root: root}, toggleMastersFromSlaves);\n }\n };\n\n return {\n init: function() {\n registerListeners();\n },\n events: events,\n setGroupState: setGroupState,\n updateSlavesFromMasterState: updateSlavesFromMasterState,\n };\n});\n"],"names":["define","$","PubSub","registered","events","checkboxToggled","getToggleGroupElements","root","toggleGroup","exactMatch","find","getAllSlaveCheckboxes","filter","getControlCheckboxes","toggleSlavesFromMasters","e","targetState","data","target","toggleGroupName","is","toggleSlavesToState","toggleMastersAndActionElements","toggleGroupSlaves","length","toggleGroupCheckedSlaves","setMasterStates","setActionElementStates","getToggleGroupLevels","toggleGroups","split","toggleGroupLevels","toggleGroupLevel","forEach","push","trim","slaves","prop","trigger","checkedSlaves","publish","anyChecked","toggleMastersFromSlaves","disableActionElements","getActionElements","masters","each","i","masterElement","targetString","masterLabel","attr","html","text","init","document","body","on","registerListeners","setGroupState","updateSlavesFromMasterState"],"mappings":"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"} \ No newline at end of file diff --git a/lib/amd/build/config.min.js.map b/lib/amd/build/config.min.js.map index b7c8f441659..09ea41e5c49 100644 --- a/lib/amd/build/config.min.js.map +++ b/lib/amd/build/config.min.js.map @@ -1 +1 @@ -{"version":3,"file":"config.min.js","sources":["../src/config.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Expose the M.cfg global variable.\n *\n * @module core/config\n * @class config\n * @package core\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(function() {\n\n // This module exposes only the raw data from M.cfg;\n return /** @alias module:core/config */ M.cfg;\n});\n"],"names":["define","M","cfg"],"mappings":";;;;;;;;;;AAyBAA,sBAAO,WAGqCC,OAAAA,EAAEC,GAC7C"} \ No newline at end of file +{"version":3,"file":"config.min.js","sources":["../src/config.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Expose the M.cfg global variable.\n *\n * @module core/config\n * @class config\n * @package core\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(function() {\n\n // This module exposes only the raw data from M.cfg;\n return /** @alias module:core/config */ M.cfg;\n});\n"],"names":["define","M","cfg"],"mappings":";;;;;;;;;;AAyBAA,sBAAO,kBAGqCC,EAAEC"} \ No newline at end of file diff --git a/lib/amd/build/custom_interaction_events.min.js.map b/lib/amd/build/custom_interaction_events.min.js.map index d89ea17c0f3..b936455b485 100644 --- a/lib/amd/build/custom_interaction_events.min.js.map +++ b/lib/amd/build/custom_interaction_events.min.js.map @@ -1 +1 @@ -{"version":3,"file":"custom_interaction_events.min.js","sources":["../src/custom_interaction_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 * This module provides a wrapper to encapsulate a lot of the common combinations of\n * user interaction we use in Moodle.\n *\n * @module core/custom_interaction_events\n * @class custom_interaction_events\n * @package core\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', 'core/key_codes'], function($, keyCodes) {\n // The list of events provided by this module. Namespaced to avoid clashes.\n var events = {\n activate: 'cie:activate',\n keyboardActivate: 'cie:keyboardactivate',\n escape: 'cie:escape',\n down: 'cie:down',\n up: 'cie:up',\n home: 'cie:home',\n end: 'cie:end',\n next: 'cie:next',\n previous: 'cie:previous',\n asterix: 'cie:asterix',\n scrollLock: 'cie:scrollLock',\n scrollTop: 'cie:scrollTop',\n scrollBottom: 'cie:scrollBottom',\n ctrlPageUp: 'cie:ctrlPageUp',\n ctrlPageDown: 'cie:ctrlPageDown',\n enter: 'cie:enter',\n accessibleChange: 'cie:accessibleChange',\n };\n // Static cache of jQuery events that have been handled. This should\n // only be populated by JavaScript generated events (which will keep it\n // fairly small).\n var triggeredEvents = {};\n\n /**\n * Check if the caller has asked for the given event type to be\n * registered.\n *\n * @method shouldAddEvent\n * @private\n * @param {string} eventType name of the event (see events above)\n * @param {array} include the list of events to be added\n * @return {bool} true if the event should be added, false otherwise.\n */\n var shouldAddEvent = function(eventType, include) {\n include = include || [];\n\n if (include.length && include.indexOf(eventType) !== -1) {\n return true;\n }\n\n return false;\n };\n\n /**\n * Check if any of the modifier keys have been pressed on the event.\n *\n * @method isModifierPressed\n * @private\n * @param {event} e jQuery event\n * @return {bool} true if shift, meta (command on Mac), alt or ctrl are pressed\n */\n var isModifierPressed = function(e) {\n return (e.shiftKey || e.metaKey || e.altKey || e.ctrlKey);\n };\n\n /**\n * Trigger the custom event for the given jQuery event.\n *\n * This function will only fire the custom event if one hasn't already been\n * fired for the jQuery event.\n *\n * This is to prevent multiple custom event handlers triggering multiple\n * custom events for a single jQuery event as it bubbles up the stack.\n *\n * @param {string} eventName The name of the custom event\n * @param {event} e The jQuery event\n * @return {void}\n */\n var triggerEvent = function(eventName, e) {\n var eventTypeKey = \"\";\n\n if (!e.hasOwnProperty('originalEvent')) {\n // This is a jQuery event generated from JavaScript not a browser event so\n // we need to build the cache key for the event.\n eventTypeKey = \"\" + eventName + e.type + e.timeStamp;\n\n if (!triggeredEvents.hasOwnProperty(eventTypeKey)) {\n // If we haven't seen this jQuery event before then fire a custom\n // event for it and remember the event for later.\n triggeredEvents[eventTypeKey] = true;\n $(e.target).trigger(eventName, [{originalEvent: e}]);\n }\n return;\n }\n\n eventTypeKey = \"triggeredCustom_\" + eventName;\n if (!e.originalEvent.hasOwnProperty(eventTypeKey)) {\n // If this is a jQuery event generated by the browser then set a\n // property on the original event to track that we've seen it before.\n // The property is set on the original event because it's the only part\n // of the jQuery event that is maintained through multiple event handlers.\n e.originalEvent[eventTypeKey] = true;\n $(e.target).trigger(eventName, [{originalEvent: e}]);\n return;\n }\n };\n\n /**\n * Register a keyboard event that ignores modifier keys.\n *\n * @method addKeyboardEvent\n * @private\n * @param {object} element A jQuery object of the element to bind events to\n * @param {string} event The custom interaction event name\n * @param {int} keyCode The key code.\n */\n var addKeyboardEvent = function(element, event, keyCode) {\n element.off('keydown.' + event).on('keydown.' + event, function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCode) {\n triggerEvent(event, e);\n }\n }\n });\n };\n\n /**\n * Trigger the activate event on the given element if it is clicked or the enter\n * or space key are pressed without a modifier key.\n *\n * @method addActivateListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addActivateListener = function(element) {\n element.off('click.cie.activate').on('click.cie.activate', function(e) {\n triggerEvent(events.activate, e);\n });\n element.off('keydown.cie.activate').on('keydown.cie.activate', function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCodes.enter || e.keyCode == keyCodes.space) {\n triggerEvent(events.activate, e);\n }\n }\n });\n };\n\n /**\n * Trigger the keyboard activate event on the given element if the enter\n * or space key are pressed without a modifier key.\n *\n * @method addKeyboardActivateListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addKeyboardActivateListener = function(element) {\n element.off('keydown.cie.keyboardactivate').on('keydown.cie.keyboardactivate', function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCodes.enter || e.keyCode == keyCodes.space) {\n triggerEvent(events.keyboardActivate, e);\n }\n }\n });\n };\n\n /**\n * Trigger the escape event on the given element if the escape key is pressed\n * without a modifier key.\n *\n * @method addEscapeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEscapeListener = function(element) {\n addKeyboardEvent(element, events.escape, keyCodes.escape);\n };\n\n /**\n * Trigger the down event on the given element if the down arrow key is pressed\n * without a modifier key.\n *\n * @method addDownListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addDownListener = function(element) {\n addKeyboardEvent(element, events.down, keyCodes.arrowDown);\n };\n\n /**\n * Trigger the up event on the given element if the up arrow key is pressed\n * without a modifier key.\n *\n * @method addUpListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addUpListener = function(element) {\n addKeyboardEvent(element, events.up, keyCodes.arrowUp);\n };\n\n /**\n * Trigger the home event on the given element if the home key is pressed\n * without a modifier key.\n *\n * @method addHomeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addHomeListener = function(element) {\n addKeyboardEvent(element, events.home, keyCodes.home);\n };\n\n /**\n * Trigger the end event on the given element if the end key is pressed\n * without a modifier key.\n *\n * @method addEndListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEndListener = function(element) {\n addKeyboardEvent(element, events.end, keyCodes.end);\n };\n\n /**\n * Trigger the next event on the given element if the right arrow key is pressed\n * without a modifier key in LTR mode or left arrow key in RTL mode.\n *\n * @method addNextListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addNextListener = function(element) {\n // Left and right are flipped in RTL mode.\n var keyCode = $('html').attr('dir') == \"rtl\" ? keyCodes.arrowLeft : keyCodes.arrowRight;\n\n addKeyboardEvent(element, events.next, keyCode);\n };\n\n /**\n * Trigger the previous event on the given element if the left arrow key is pressed\n * without a modifier key in LTR mode or right arrow key in RTL mode.\n *\n * @method addPreviousListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addPreviousListener = function(element) {\n // Left and right are flipped in RTL mode.\n var keyCode = $('html').attr('dir') == \"rtl\" ? keyCodes.arrowRight : keyCodes.arrowLeft;\n\n addKeyboardEvent(element, events.previous, keyCode);\n };\n\n /**\n * Trigger the asterix event on the given element if the asterix key is pressed\n * without a modifier key.\n *\n * @method addAsterixListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addAsterixListener = function(element) {\n addKeyboardEvent(element, events.asterix, keyCodes.asterix);\n };\n\n\n /**\n * Trigger the scrollTop event on the given element if the user scrolls to\n * the top of the given element.\n *\n * @method addScrollTopListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addScrollTopListener = function(element) {\n element.off('scroll.cie.scrollTop').on('scroll.cie.scrollTop', function(e) {\n var scrollTop = element.scrollTop();\n if (scrollTop === 0) {\n triggerEvent(events.scrollTop, e);\n }\n });\n };\n\n /**\n * Trigger the scrollBottom event on the given element if the user scrolls to\n * the bottom of the given element.\n *\n * @method addScrollBottomListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addScrollBottomListener = function(element) {\n element.off('scroll.cie.scrollBottom').on('scroll.cie.scrollBottom', function(e) {\n var scrollTop = element.scrollTop();\n var innerHeight = element.innerHeight();\n var scrollHeight = element[0].scrollHeight;\n\n if (scrollTop + innerHeight >= scrollHeight) {\n triggerEvent(events.scrollBottom, e);\n }\n });\n };\n\n /**\n * Trigger the scrollLock event on the given element if the user scrolls to\n * the bottom or top of the given element.\n *\n * @method addScrollLockListener\n * @private\n * @param {jQuery} element jQuery object to add event listeners to\n */\n var addScrollLockListener = function(element) {\n // Lock mousewheel scrolling within the element to stop the annoying window scroll.\n element.off('DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock')\n .on('DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock', function(e) {\n var scrollTop = element.scrollTop();\n var scrollHeight = element[0].scrollHeight;\n var height = element.height();\n var delta = (e.type == 'DOMMouseScroll' ?\n e.originalEvent.detail * -40 :\n e.originalEvent.wheelDelta);\n var up = delta > 0;\n\n if (!up && -delta > scrollHeight - height - scrollTop) {\n // Scrolling down past the bottom.\n element.scrollTop(scrollHeight);\n e.stopPropagation();\n e.preventDefault();\n e.returnValue = false;\n // Fire the scroll lock event.\n triggerEvent(events.scrollLock, e);\n\n return false;\n } else if (up && delta > scrollTop) {\n // Scrolling up past the top.\n element.scrollTop(0);\n e.stopPropagation();\n e.preventDefault();\n e.returnValue = false;\n // Fire the scroll lock event.\n triggerEvent(events.scrollLock, e);\n\n return false;\n }\n\n return true;\n });\n };\n\n /**\n * Trigger the ctrlPageUp event on the given element if the user presses the\n * control and page up key.\n *\n * @method addCtrlPageUpListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addCtrlPageUpListener = function(element) {\n element.off('keydown.cie.ctrlpageup').on('keydown.cie.ctrlpageup', function(e) {\n if (e.ctrlKey) {\n if (e.keyCode == keyCodes.pageUp) {\n triggerEvent(events.ctrlPageUp, e);\n }\n }\n });\n };\n\n /**\n * Trigger the ctrlPageDown event on the given element if the user presses the\n * control and page down key.\n *\n * @method addCtrlPageDownListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addCtrlPageDownListener = function(element) {\n element.off('keydown.cie.ctrlpagedown').on('keydown.cie.ctrlpagedown', function(e) {\n if (e.ctrlKey) {\n if (e.keyCode == keyCodes.pageDown) {\n triggerEvent(events.ctrlPageDown, e);\n }\n }\n });\n };\n\n /**\n * Trigger the enter event on the given element if the enter key is pressed\n * without a modifier key.\n *\n * @method addEnterListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEnterListener = function(element) {\n addKeyboardEvent(element, events.enter, keyCodes.enter);\n };\n\n /**\n * Trigger the AccessibleChange event on the given element if the value of the element is changed.\n *\n * @method addAccessibleChangeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addAccessibleChangeListener = function(element) {\n var onMac = navigator.userAgent.indexOf('Macintosh') !== -1;\n var touchEnabled = ('ontouchstart' in window) || (('msMaxTouchPoints' in navigator) && (navigator.msMaxTouchPoints > 0));\n if (onMac || touchEnabled) {\n // On Mac devices, and touch-enabled devices, the change event seems to be handled correctly and\n // consistently at this time.\n element.on('change', function(e) {\n triggerEvent(events.accessibleChange, e);\n });\n } else {\n // Some browsers have non-normalised behaviour for handling the selection of values in a boxes as a single-select,\n // and make use of a dropdown of action links like the Bootstrap Dropdown menu.\n var setInitialValue = function(target) {\n target.dataset.initValue = target.value;\n };\n var resetToInitialValue = function(target) {\n if ('initValue' in target.dataset) {\n target.value = target.dataset.initValue;\n }\n };\n var checkAndTriggerAccessibleChange = function(e) {\n if (!('initValue' in e.target.dataset)) {\n // Some browsers trigger click before focus, therefore it is possible that initValue is undefined.\n // In this case it's likely that it's being focused for the first time and we should therefore not submit.\n return;\n }\n\n if (e.target.value !== e.target.dataset.initValue) {\n // Update the initValue when the event is triggered.\n // This means that if the click handler fires before the focus handler on a subsequent interaction\n // with the element, the currently dispalyed value will be the best guess current value.\n e.target.dataset.initValue = e.target.value;\n triggerEvent(events.accessibleChange, e);\n }\n };\n var nativeElement = element.get()[0];\n // The `focus` and `blur` events do not support bubbling. Use Event Capture instead.\n nativeElement.addEventListener('focus', function(e) {\n setInitialValue(e.target);\n }, true);\n nativeElement.addEventListener('blur', function(e) {\n checkAndTriggerAccessibleChange(e);\n }, true);\n element.on('keydown', function(e) {\n if ((e.which === keyCodes.enter)) {\n checkAndTriggerAccessibleChange(e);\n } else if (e.which === keyCodes.escape) {\n resetToInitialValue(e.target);\n e.target.dataset.ignoreChange = true;\n } else {\n // Firefox triggers a change event when using the keyboard to scroll through the selection.\n // Set a data- attribute that the change listener can use to ignore the change event where it was\n // generated from a keyboard change such as typing to complete a value, or using arrow keys.\n e.target.dataset.ignoreChange = true;\n\n }\n });\n element.on('change', function(e) {\n if (e.target.dataset.ignoreChange) {\n // This change event was triggered from a keyboard change which is not yet complete.\n // Do not trigger the accessibleChange event until the selection is completed using the [return]\n // key.\n return;\n }\n\n checkAndTriggerAccessibleChange(e);\n });\n element.on('keyup', function(e) {\n // The key has been lifted. Stop ignoring the change event.\n delete e.target.dataset.ignoreChange;\n });\n element.on('click', function(e) {\n checkAndTriggerAccessibleChange(e);\n });\n }\n };\n\n /**\n * Get the list of events and their handlers.\n *\n * @method getHandlers\n * @private\n * @return {object} object key of event names and value of handler functions\n */\n var getHandlers = function() {\n var handlers = {};\n\n handlers[events.activate] = addActivateListener;\n handlers[events.keyboardActivate] = addKeyboardActivateListener;\n handlers[events.escape] = addEscapeListener;\n handlers[events.down] = addDownListener;\n handlers[events.up] = addUpListener;\n handlers[events.home] = addHomeListener;\n handlers[events.end] = addEndListener;\n handlers[events.next] = addNextListener;\n handlers[events.previous] = addPreviousListener;\n handlers[events.asterix] = addAsterixListener;\n handlers[events.scrollLock] = addScrollLockListener;\n handlers[events.scrollTop] = addScrollTopListener;\n handlers[events.scrollBottom] = addScrollBottomListener;\n handlers[events.ctrlPageUp] = addCtrlPageUpListener;\n handlers[events.ctrlPageDown] = addCtrlPageDownListener;\n handlers[events.enter] = addEnterListener;\n handlers[events.accessibleChange] = addAccessibleChangeListener;\n\n return handlers;\n };\n\n /**\n * Add all of the listeners on the given element for the requested events.\n *\n * @method define\n * @public\n * @param {object} element the DOM element to register event listeners on\n * @param {array} include the array of events to be triggered\n */\n var define = function(element, include) {\n element = $(element);\n include = include || [];\n\n if (!element.length || !include.length) {\n return;\n }\n\n $.each(getHandlers(), function(eventType, handler) {\n if (shouldAddEvent(eventType, include)) {\n handler(element);\n }\n });\n };\n\n return /** @module core/custom_interaction_events */ {\n define: define,\n events: events,\n };\n});\n"],"names":["define","$","keyCodes","events","activate","keyboardActivate","escape","down","up","home","end","next","previous","asterix","scrollLock","scrollTop","scrollBottom","ctrlPageUp","ctrlPageDown","enter","accessibleChange","triggeredEvents","isModifierPressed","e","shiftKey","metaKey","altKey","ctrlKey","triggerEvent","eventName","eventTypeKey","hasOwnProperty","originalEvent","target","trigger","type","timeStamp","addKeyboardEvent","element","event","keyCode","off","on","addActivateListener","space","addKeyboardActivateListener","addEscapeListener","addDownListener","arrowDown","addUpListener","arrowUp","addHomeListener","addEndListener","addNextListener","attr","arrowLeft","arrowRight","addPreviousListener","addAsterixListener","addScrollTopListener","addScrollBottomListener","innerHeight","scrollHeight","addScrollLockListener","height","delta","detail","wheelDelta","stopPropagation","preventDefault","returnValue","addCtrlPageUpListener","pageUp","addCtrlPageDownListener","pageDown","addEnterListener","addAccessibleChangeListener","onMac","navigator","userAgent","indexOf","touchEnabled","window","msMaxTouchPoints","checkAndTriggerAccessibleChange","dataset","value","initValue","nativeElement","get","addEventListener","which","ignoreChange","include","handlers","length","each","eventType","handler","shouldAddEvent"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"custom_interaction_events.min.js","sources":["../src/custom_interaction_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 * This module provides a wrapper to encapsulate a lot of the common combinations of\n * user interaction we use in Moodle.\n *\n * @module core/custom_interaction_events\n * @class custom_interaction_events\n * @package core\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', 'core/key_codes'], function($, keyCodes) {\n // The list of events provided by this module. Namespaced to avoid clashes.\n var events = {\n activate: 'cie:activate',\n keyboardActivate: 'cie:keyboardactivate',\n escape: 'cie:escape',\n down: 'cie:down',\n up: 'cie:up',\n home: 'cie:home',\n end: 'cie:end',\n next: 'cie:next',\n previous: 'cie:previous',\n asterix: 'cie:asterix',\n scrollLock: 'cie:scrollLock',\n scrollTop: 'cie:scrollTop',\n scrollBottom: 'cie:scrollBottom',\n ctrlPageUp: 'cie:ctrlPageUp',\n ctrlPageDown: 'cie:ctrlPageDown',\n enter: 'cie:enter',\n accessibleChange: 'cie:accessibleChange',\n };\n // Static cache of jQuery events that have been handled. This should\n // only be populated by JavaScript generated events (which will keep it\n // fairly small).\n var triggeredEvents = {};\n\n /**\n * Check if the caller has asked for the given event type to be\n * registered.\n *\n * @method shouldAddEvent\n * @private\n * @param {string} eventType name of the event (see events above)\n * @param {array} include the list of events to be added\n * @return {bool} true if the event should be added, false otherwise.\n */\n var shouldAddEvent = function(eventType, include) {\n include = include || [];\n\n if (include.length && include.indexOf(eventType) !== -1) {\n return true;\n }\n\n return false;\n };\n\n /**\n * Check if any of the modifier keys have been pressed on the event.\n *\n * @method isModifierPressed\n * @private\n * @param {event} e jQuery event\n * @return {bool} true if shift, meta (command on Mac), alt or ctrl are pressed\n */\n var isModifierPressed = function(e) {\n return (e.shiftKey || e.metaKey || e.altKey || e.ctrlKey);\n };\n\n /**\n * Trigger the custom event for the given jQuery event.\n *\n * This function will only fire the custom event if one hasn't already been\n * fired for the jQuery event.\n *\n * This is to prevent multiple custom event handlers triggering multiple\n * custom events for a single jQuery event as it bubbles up the stack.\n *\n * @param {string} eventName The name of the custom event\n * @param {event} e The jQuery event\n * @return {void}\n */\n var triggerEvent = function(eventName, e) {\n var eventTypeKey = \"\";\n\n if (!e.hasOwnProperty('originalEvent')) {\n // This is a jQuery event generated from JavaScript not a browser event so\n // we need to build the cache key for the event.\n eventTypeKey = \"\" + eventName + e.type + e.timeStamp;\n\n if (!triggeredEvents.hasOwnProperty(eventTypeKey)) {\n // If we haven't seen this jQuery event before then fire a custom\n // event for it and remember the event for later.\n triggeredEvents[eventTypeKey] = true;\n $(e.target).trigger(eventName, [{originalEvent: e}]);\n }\n return;\n }\n\n eventTypeKey = \"triggeredCustom_\" + eventName;\n if (!e.originalEvent.hasOwnProperty(eventTypeKey)) {\n // If this is a jQuery event generated by the browser then set a\n // property on the original event to track that we've seen it before.\n // The property is set on the original event because it's the only part\n // of the jQuery event that is maintained through multiple event handlers.\n e.originalEvent[eventTypeKey] = true;\n $(e.target).trigger(eventName, [{originalEvent: e}]);\n return;\n }\n };\n\n /**\n * Register a keyboard event that ignores modifier keys.\n *\n * @method addKeyboardEvent\n * @private\n * @param {object} element A jQuery object of the element to bind events to\n * @param {string} event The custom interaction event name\n * @param {int} keyCode The key code.\n */\n var addKeyboardEvent = function(element, event, keyCode) {\n element.off('keydown.' + event).on('keydown.' + event, function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCode) {\n triggerEvent(event, e);\n }\n }\n });\n };\n\n /**\n * Trigger the activate event on the given element if it is clicked or the enter\n * or space key are pressed without a modifier key.\n *\n * @method addActivateListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addActivateListener = function(element) {\n element.off('click.cie.activate').on('click.cie.activate', function(e) {\n triggerEvent(events.activate, e);\n });\n element.off('keydown.cie.activate').on('keydown.cie.activate', function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCodes.enter || e.keyCode == keyCodes.space) {\n triggerEvent(events.activate, e);\n }\n }\n });\n };\n\n /**\n * Trigger the keyboard activate event on the given element if the enter\n * or space key are pressed without a modifier key.\n *\n * @method addKeyboardActivateListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addKeyboardActivateListener = function(element) {\n element.off('keydown.cie.keyboardactivate').on('keydown.cie.keyboardactivate', function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCodes.enter || e.keyCode == keyCodes.space) {\n triggerEvent(events.keyboardActivate, e);\n }\n }\n });\n };\n\n /**\n * Trigger the escape event on the given element if the escape key is pressed\n * without a modifier key.\n *\n * @method addEscapeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEscapeListener = function(element) {\n addKeyboardEvent(element, events.escape, keyCodes.escape);\n };\n\n /**\n * Trigger the down event on the given element if the down arrow key is pressed\n * without a modifier key.\n *\n * @method addDownListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addDownListener = function(element) {\n addKeyboardEvent(element, events.down, keyCodes.arrowDown);\n };\n\n /**\n * Trigger the up event on the given element if the up arrow key is pressed\n * without a modifier key.\n *\n * @method addUpListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addUpListener = function(element) {\n addKeyboardEvent(element, events.up, keyCodes.arrowUp);\n };\n\n /**\n * Trigger the home event on the given element if the home key is pressed\n * without a modifier key.\n *\n * @method addHomeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addHomeListener = function(element) {\n addKeyboardEvent(element, events.home, keyCodes.home);\n };\n\n /**\n * Trigger the end event on the given element if the end key is pressed\n * without a modifier key.\n *\n * @method addEndListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEndListener = function(element) {\n addKeyboardEvent(element, events.end, keyCodes.end);\n };\n\n /**\n * Trigger the next event on the given element if the right arrow key is pressed\n * without a modifier key in LTR mode or left arrow key in RTL mode.\n *\n * @method addNextListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addNextListener = function(element) {\n // Left and right are flipped in RTL mode.\n var keyCode = $('html').attr('dir') == \"rtl\" ? keyCodes.arrowLeft : keyCodes.arrowRight;\n\n addKeyboardEvent(element, events.next, keyCode);\n };\n\n /**\n * Trigger the previous event on the given element if the left arrow key is pressed\n * without a modifier key in LTR mode or right arrow key in RTL mode.\n *\n * @method addPreviousListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addPreviousListener = function(element) {\n // Left and right are flipped in RTL mode.\n var keyCode = $('html').attr('dir') == \"rtl\" ? keyCodes.arrowRight : keyCodes.arrowLeft;\n\n addKeyboardEvent(element, events.previous, keyCode);\n };\n\n /**\n * Trigger the asterix event on the given element if the asterix key is pressed\n * without a modifier key.\n *\n * @method addAsterixListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addAsterixListener = function(element) {\n addKeyboardEvent(element, events.asterix, keyCodes.asterix);\n };\n\n\n /**\n * Trigger the scrollTop event on the given element if the user scrolls to\n * the top of the given element.\n *\n * @method addScrollTopListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addScrollTopListener = function(element) {\n element.off('scroll.cie.scrollTop').on('scroll.cie.scrollTop', function(e) {\n var scrollTop = element.scrollTop();\n if (scrollTop === 0) {\n triggerEvent(events.scrollTop, e);\n }\n });\n };\n\n /**\n * Trigger the scrollBottom event on the given element if the user scrolls to\n * the bottom of the given element.\n *\n * @method addScrollBottomListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addScrollBottomListener = function(element) {\n element.off('scroll.cie.scrollBottom').on('scroll.cie.scrollBottom', function(e) {\n var scrollTop = element.scrollTop();\n var innerHeight = element.innerHeight();\n var scrollHeight = element[0].scrollHeight;\n\n if (scrollTop + innerHeight >= scrollHeight) {\n triggerEvent(events.scrollBottom, e);\n }\n });\n };\n\n /**\n * Trigger the scrollLock event on the given element if the user scrolls to\n * the bottom or top of the given element.\n *\n * @method addScrollLockListener\n * @private\n * @param {jQuery} element jQuery object to add event listeners to\n */\n var addScrollLockListener = function(element) {\n // Lock mousewheel scrolling within the element to stop the annoying window scroll.\n element.off('DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock')\n .on('DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock', function(e) {\n var scrollTop = element.scrollTop();\n var scrollHeight = element[0].scrollHeight;\n var height = element.height();\n var delta = (e.type == 'DOMMouseScroll' ?\n e.originalEvent.detail * -40 :\n e.originalEvent.wheelDelta);\n var up = delta > 0;\n\n if (!up && -delta > scrollHeight - height - scrollTop) {\n // Scrolling down past the bottom.\n element.scrollTop(scrollHeight);\n e.stopPropagation();\n e.preventDefault();\n e.returnValue = false;\n // Fire the scroll lock event.\n triggerEvent(events.scrollLock, e);\n\n return false;\n } else if (up && delta > scrollTop) {\n // Scrolling up past the top.\n element.scrollTop(0);\n e.stopPropagation();\n e.preventDefault();\n e.returnValue = false;\n // Fire the scroll lock event.\n triggerEvent(events.scrollLock, e);\n\n return false;\n }\n\n return true;\n });\n };\n\n /**\n * Trigger the ctrlPageUp event on the given element if the user presses the\n * control and page up key.\n *\n * @method addCtrlPageUpListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addCtrlPageUpListener = function(element) {\n element.off('keydown.cie.ctrlpageup').on('keydown.cie.ctrlpageup', function(e) {\n if (e.ctrlKey) {\n if (e.keyCode == keyCodes.pageUp) {\n triggerEvent(events.ctrlPageUp, e);\n }\n }\n });\n };\n\n /**\n * Trigger the ctrlPageDown event on the given element if the user presses the\n * control and page down key.\n *\n * @method addCtrlPageDownListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addCtrlPageDownListener = function(element) {\n element.off('keydown.cie.ctrlpagedown').on('keydown.cie.ctrlpagedown', function(e) {\n if (e.ctrlKey) {\n if (e.keyCode == keyCodes.pageDown) {\n triggerEvent(events.ctrlPageDown, e);\n }\n }\n });\n };\n\n /**\n * Trigger the enter event on the given element if the enter key is pressed\n * without a modifier key.\n *\n * @method addEnterListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEnterListener = function(element) {\n addKeyboardEvent(element, events.enter, keyCodes.enter);\n };\n\n /**\n * Trigger the AccessibleChange event on the given element if the value of the element is changed.\n *\n * @method addAccessibleChangeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addAccessibleChangeListener = function(element) {\n var onMac = navigator.userAgent.indexOf('Macintosh') !== -1;\n var touchEnabled = ('ontouchstart' in window) || (('msMaxTouchPoints' in navigator) && (navigator.msMaxTouchPoints > 0));\n if (onMac || touchEnabled) {\n // On Mac devices, and touch-enabled devices, the change event seems to be handled correctly and\n // consistently at this time.\n element.on('change', function(e) {\n triggerEvent(events.accessibleChange, e);\n });\n } else {\n // Some browsers have non-normalised behaviour for handling the selection of values in a boxes as a single-select,\n // and make use of a dropdown of action links like the Bootstrap Dropdown menu.\n var setInitialValue = function(target) {\n target.dataset.initValue = target.value;\n };\n var resetToInitialValue = function(target) {\n if ('initValue' in target.dataset) {\n target.value = target.dataset.initValue;\n }\n };\n var checkAndTriggerAccessibleChange = function(e) {\n if (!('initValue' in e.target.dataset)) {\n // Some browsers trigger click before focus, therefore it is possible that initValue is undefined.\n // In this case it's likely that it's being focused for the first time and we should therefore not submit.\n return;\n }\n\n if (e.target.value !== e.target.dataset.initValue) {\n // Update the initValue when the event is triggered.\n // This means that if the click handler fires before the focus handler on a subsequent interaction\n // with the element, the currently dispalyed value will be the best guess current value.\n e.target.dataset.initValue = e.target.value;\n triggerEvent(events.accessibleChange, e);\n }\n };\n var nativeElement = element.get()[0];\n // The `focus` and `blur` events do not support bubbling. Use Event Capture instead.\n nativeElement.addEventListener('focus', function(e) {\n setInitialValue(e.target);\n }, true);\n nativeElement.addEventListener('blur', function(e) {\n checkAndTriggerAccessibleChange(e);\n }, true);\n element.on('keydown', function(e) {\n if ((e.which === keyCodes.enter)) {\n checkAndTriggerAccessibleChange(e);\n } else if (e.which === keyCodes.escape) {\n resetToInitialValue(e.target);\n e.target.dataset.ignoreChange = true;\n } else {\n // Firefox triggers a change event when using the keyboard to scroll through the selection.\n // Set a data- attribute that the change listener can use to ignore the change event where it was\n // generated from a keyboard change such as typing to complete a value, or using arrow keys.\n e.target.dataset.ignoreChange = true;\n\n }\n });\n element.on('change', function(e) {\n if (e.target.dataset.ignoreChange) {\n // This change event was triggered from a keyboard change which is not yet complete.\n // Do not trigger the accessibleChange event until the selection is completed using the [return]\n // key.\n return;\n }\n\n checkAndTriggerAccessibleChange(e);\n });\n element.on('keyup', function(e) {\n // The key has been lifted. Stop ignoring the change event.\n delete e.target.dataset.ignoreChange;\n });\n element.on('click', function(e) {\n checkAndTriggerAccessibleChange(e);\n });\n }\n };\n\n /**\n * Get the list of events and their handlers.\n *\n * @method getHandlers\n * @private\n * @return {object} object key of event names and value of handler functions\n */\n var getHandlers = function() {\n var handlers = {};\n\n handlers[events.activate] = addActivateListener;\n handlers[events.keyboardActivate] = addKeyboardActivateListener;\n handlers[events.escape] = addEscapeListener;\n handlers[events.down] = addDownListener;\n handlers[events.up] = addUpListener;\n handlers[events.home] = addHomeListener;\n handlers[events.end] = addEndListener;\n handlers[events.next] = addNextListener;\n handlers[events.previous] = addPreviousListener;\n handlers[events.asterix] = addAsterixListener;\n handlers[events.scrollLock] = addScrollLockListener;\n handlers[events.scrollTop] = addScrollTopListener;\n handlers[events.scrollBottom] = addScrollBottomListener;\n handlers[events.ctrlPageUp] = addCtrlPageUpListener;\n handlers[events.ctrlPageDown] = addCtrlPageDownListener;\n handlers[events.enter] = addEnterListener;\n handlers[events.accessibleChange] = addAccessibleChangeListener;\n\n return handlers;\n };\n\n /**\n * Add all of the listeners on the given element for the requested events.\n *\n * @method define\n * @public\n * @param {object} element the DOM element to register event listeners on\n * @param {array} include the array of events to be triggered\n */\n var define = function(element, include) {\n element = $(element);\n include = include || [];\n\n if (!element.length || !include.length) {\n return;\n }\n\n $.each(getHandlers(), function(eventType, handler) {\n if (shouldAddEvent(eventType, include)) {\n handler(element);\n }\n });\n };\n\n return /** @module core/custom_interaction_events */ {\n define: define,\n events: events,\n };\n});\n"],"names":["define","$","keyCodes","events","activate","keyboardActivate","escape","down","up","home","end","next","previous","asterix","scrollLock","scrollTop","scrollBottom","ctrlPageUp","ctrlPageDown","enter","accessibleChange","triggeredEvents","isModifierPressed","e","shiftKey","metaKey","altKey","ctrlKey","triggerEvent","eventName","eventTypeKey","hasOwnProperty","originalEvent","target","trigger","type","timeStamp","addKeyboardEvent","element","event","keyCode","off","on","addActivateListener","space","addKeyboardActivateListener","addEscapeListener","addDownListener","arrowDown","addUpListener","arrowUp","addHomeListener","addEndListener","addNextListener","attr","arrowLeft","arrowRight","addPreviousListener","addAsterixListener","addScrollTopListener","addScrollBottomListener","innerHeight","scrollHeight","addScrollLockListener","height","delta","detail","wheelDelta","stopPropagation","preventDefault","returnValue","addCtrlPageUpListener","pageUp","addCtrlPageDownListener","pageDown","addEnterListener","addAccessibleChangeListener","onMac","navigator","userAgent","indexOf","touchEnabled","window","msMaxTouchPoints","checkAndTriggerAccessibleChange","dataset","value","initValue","nativeElement","get","addEventListener","which","ignoreChange","include","handlers","length","each","eventType","handler","shouldAddEvent"],"mappings":"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"} \ No newline at end of file diff --git a/lib/amd/build/dragdrop.min.js.map b/lib/amd/build/dragdrop.min.js.map index b31b1b1dfe0..4f808056dfb 100644 --- a/lib/amd/build/dragdrop.min.js.map +++ b/lib/amd/build/dragdrop.min.js.map @@ -1 +1 @@ -{"version":3,"file":"dragdrop.min.js","sources":["../src/dragdrop.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\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 handle drag operations, including automatic scrolling.\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, you\n * can only drag one thing at a time, this is not a problem in practice.\n *\n * @module core/dragdrop\n * @class dragdrop\n * @package core\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', 'core/autoscroll'], function($, autoScroll) {\n /**\n * @alias module:core/dragdrop\n */\n var dragdrop = {\n /**\n * A boolean or options argument depending on whether browser supports passive events.\n * @private\n */\n eventCaptureOptions: {passive: false, capture: true},\n\n /**\n * Drag proxy if any.\n * @private\n */\n dragProxy: null,\n\n /**\n * Function called on move.\n * @private\n */\n onMove: null,\n\n /**\n * Function called on drop.\n * @private\n */\n onDrop: null,\n\n /**\n * Initial position of proxy at drag start.\n */\n initialPosition: null,\n\n /**\n * Initial page X of cursor at drag start.\n */\n initialX: null,\n\n /**\n * Initial page Y of cursor at drag start.\n */\n initialY: null,\n\n /**\n * If touch event is in progress, this will be the id, otherwise null\n */\n touching: null,\n\n /**\n * Prepares to begin a drag operation - call with a mousedown or touchstart event.\n *\n * If the returned object has 'start' true, then you can set up a drag proxy, and call\n * start. This function will call preventDefault automatically regardless of whether\n * starting or not.\n *\n * @public\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} Object with start (boolean flag) and x, y (only if flag true) values\n */\n prepare: function(event) {\n event.preventDefault();\n var start;\n if (event.type === 'touchstart') {\n // For touch, start if there's at least one touch and we are not currently doing\n // a touch event.\n start = (dragdrop.touching === null) && event.changedTouches.length > 0;\n } else {\n // For mousedown, start if it's the left button.\n start = event.which === 1;\n }\n if (start) {\n var details = dragdrop.getEventXY(event);\n details.start = true;\n return details;\n } else {\n return {start: false};\n }\n },\n\n /**\n * Call to start a drag operation, in response to a mouse down or touch start event.\n * Normally call this after calling prepare and receiving start true (you can probably\n * skip prepare if only supporting drag not touch).\n *\n * Note: The caller is responsible for creating a 'drag proxy' which is the\n * thing that actually gets dragged. At present, this doesn't really work\n * properly unless it is added directly within the body tag.\n *\n * You also need to ensure that there is CSS so the proxy is absolutely positioned,\n * and styled to look like it is floating.\n *\n * You also need to absolutely position the proxy where you want it to start.\n *\n * @public\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @param {jQuery} dragProxy An absolute-positioned element for dragging\n * @param {Object} onMove Function that receives X and Y page locations for a move\n * @param {Object} onDrop Function that receives X and Y page locations when dropped\n */\n start: function(event, dragProxy, onMove, onDrop) {\n var xy = dragdrop.getEventXY(event);\n dragdrop.initialX = xy.x;\n dragdrop.initialY = xy.y;\n dragdrop.initialPosition = dragProxy.offset();\n dragdrop.dragProxy = dragProxy;\n dragdrop.onMove = onMove;\n dragdrop.onDrop = onDrop;\n\n switch (event.type) {\n case 'mousedown':\n // Cannot use jQuery 'on' because events need to not be passive.\n dragdrop.addEventSpecial('mousemove', dragdrop.mouseMove);\n dragdrop.addEventSpecial('mouseup', dragdrop.mouseUp);\n break;\n case 'touchstart':\n dragdrop.addEventSpecial('touchend', dragdrop.touchEnd);\n dragdrop.addEventSpecial('touchcancel', dragdrop.touchEnd);\n dragdrop.addEventSpecial('touchmove', dragdrop.touchMove);\n dragdrop.touching = event.changedTouches[0].identifier;\n break;\n default:\n throw new Error('Unexpected event type: ' + event.type);\n }\n autoScroll.start(dragdrop.scroll);\n },\n\n /**\n * Adds an event listener with special event capture options (capture, not passive). If the\n * browser does not support passive events, it will fall back to the boolean for capture.\n *\n * @private\n * @param {Object} event Event type string\n * @param {Object} handler Handler function\n */\n addEventSpecial: function(event, handler) {\n try {\n window.addEventListener(event, handler, dragdrop.eventCaptureOptions);\n } catch (ex) {\n dragdrop.eventCaptureOptions = true;\n window.addEventListener(event, handler, dragdrop.eventCaptureOptions);\n }\n },\n\n /**\n * Gets X/Y co-ordinates of an event, which can be either touchstart or mousedown.\n *\n * @private\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} X/Y co-ordinates\n */\n getEventXY: function(event) {\n switch (event.type) {\n case 'touchstart':\n return {x: event.changedTouches[0].pageX,\n y: event.changedTouches[0].pageY};\n case 'mousedown':\n return {x: event.pageX, y: event.pageY};\n default:\n throw new Error('Unexpected event type: ' + event.type);\n }\n },\n\n /**\n * Event handler for touch move.\n *\n * @private\n * @param {Object} e Event\n */\n touchMove: function(e) {\n e.preventDefault();\n for (var i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === dragdrop.touching) {\n dragdrop.handleMove(e.changedTouches[i].pageX, e.changedTouches[i].pageY);\n }\n }\n },\n\n /**\n * Event handler for mouse move.\n *\n * @private\n * @param {Object} e Event\n */\n mouseMove: function(e) {\n dragdrop.handleMove(e.pageX, e.pageY);\n },\n\n /**\n * Shared handler for move event (mouse or touch).\n *\n * @private\n * @param {number} pageX X co-ordinate\n * @param {number} pageY Y co-ordinate\n */\n handleMove: function(pageX, pageY) {\n // Move the drag proxy, not letting you move it out of screen or window bounds.\n var current = dragdrop.dragProxy.offset();\n var topOffset = current.top - parseInt(dragdrop.dragProxy.css('top'));\n var leftOffset = current.left - parseInt(dragdrop.dragProxy.css('left'));\n var maxY = $(document).height() - dragdrop.dragProxy.outerHeight() - topOffset;\n var maxX = $(document).width() - dragdrop.dragProxy.outerWidth() - leftOffset;\n var minY = -topOffset;\n var minX = -leftOffset;\n var initial = dragdrop.initialPosition;\n var position = {\n top: Math.max(minY, Math.min(maxY, initial.top + (pageY - dragdrop.initialY) - topOffset)),\n left: Math.max(minX, Math.min(maxX, initial.left + (pageX - dragdrop.initialX) - leftOffset))\n };\n dragdrop.dragProxy.css(position);\n\n // Trigger move handler.\n dragdrop.onMove(pageX, pageY, dragdrop.dragProxy);\n },\n\n /**\n * Event handler for touch end.\n *\n * @private\n * @param {Object} e Event\n */\n touchEnd: function(e) {\n e.preventDefault();\n for (var i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === dragdrop.touching) {\n dragdrop.handleEnd(e.changedTouches[i].pageX, e.changedTouches[i].pageY);\n }\n }\n },\n\n /**\n * Event handler for mouse up.\n *\n * @private\n * @param {Object} e Event\n */\n mouseUp: function(e) {\n dragdrop.handleEnd(e.pageX, e.pageY);\n },\n\n /**\n * Shared handler for end drag (mouse or touch).\n *\n * @private\n * @param {number} pageX X\n * @param {number} pageY Y\n */\n handleEnd: function(pageX, pageY) {\n if (dragdrop.touching !== null) {\n window.removeEventListener('touchend', dragdrop.touchEnd, dragdrop.eventCaptureOptions);\n window.removeEventListener('touchcancel', dragdrop.touchEnd, dragdrop.eventCaptureOptions);\n window.removeEventListener('touchmove', dragdrop.touchMove, dragdrop.eventCaptureOptions);\n dragdrop.touching = null;\n } else {\n window.removeEventListener('mousemove', dragdrop.mouseMove, dragdrop.eventCaptureOptions);\n window.removeEventListener('mouseup', dragdrop.mouseUp, dragdrop.eventCaptureOptions);\n }\n autoScroll.stop();\n dragdrop.onDrop(pageX, pageY, dragdrop.dragProxy);\n },\n\n /**\n * Called when the page scrolls.\n *\n * @private\n * @param {number} offset Amount of scroll\n */\n scroll: function(offset) {\n // Move the proxy to match.\n var maxY = $(document).height() - dragdrop.dragProxy.outerHeight();\n var currentPosition = dragdrop.dragProxy.offset();\n currentPosition.top = Math.min(maxY, currentPosition.top + offset);\n dragdrop.dragProxy.css(currentPosition);\n }\n };\n\n return {\n /**\n * Prepares to begin a drag operation - call with a mousedown or touchstart event.\n *\n * If the returned object has 'start' true, then you can set up a drag proxy, and call\n * start. This function will call preventDefault automatically regardless of whether\n * starting or not.\n *\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} Object with start (boolean flag) and x, y (only if flag true) values\n */\n prepare: dragdrop.prepare,\n\n /**\n * Call to start a drag operation, in response to a mouse down or touch start event.\n * Normally call this after calling prepare and receiving start true (you can probably\n * skip prepare if only supporting drag not touch).\n *\n * Note: The caller is responsible for creating a 'drag proxy' which is the\n * thing that actually gets dragged. At present, this doesn't really work\n * properly unless it is added directly within the body tag.\n *\n * You also need to ensure that there is CSS so the proxy is absolutely positioned,\n * and styled to look like it is floating.\n *\n * You also need to absolutely position the proxy where you want it to start.\n *\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @param {jQuery} dragProxy An absolute-positioned element for dragging\n * @param {Object} onMove Function that receives X and Y page locations for a move\n * @param {Object} onDrop Function that receives X and Y page locations when dropped\n */\n start: dragdrop.start\n };\n});\n"],"names":["define","$","autoScroll","dragdrop","eventCaptureOptions","passive","capture","dragProxy","onMove","onDrop","initialPosition","initialX","initialY","touching","prepare","event","preventDefault","type","changedTouches","length","which","details","getEventXY","start","xy","x","y","offset","addEventSpecial","mouseMove","mouseUp","touchEnd","touchMove","identifier","Error","scroll","handler","window","addEventListener","ex","pageX","pageY","e","i","handleMove","current","topOffset","top","parseInt","css","leftOffset","left","maxY","document","height","outerHeight","maxX","width","outerWidth","minY","minX","initial","position","Math","max","min","handleEnd","removeEventListener","stop","currentPosition"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"dragdrop.min.js","sources":["../src/dragdrop.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\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 handle drag operations, including automatic scrolling.\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, you\n * can only drag one thing at a time, this is not a problem in practice.\n *\n * @module core/dragdrop\n * @class dragdrop\n * @package core\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', 'core/autoscroll'], function($, autoScroll) {\n /**\n * @alias module:core/dragdrop\n */\n var dragdrop = {\n /**\n * A boolean or options argument depending on whether browser supports passive events.\n * @private\n */\n eventCaptureOptions: {passive: false, capture: true},\n\n /**\n * Drag proxy if any.\n * @private\n */\n dragProxy: null,\n\n /**\n * Function called on move.\n * @private\n */\n onMove: null,\n\n /**\n * Function called on drop.\n * @private\n */\n onDrop: null,\n\n /**\n * Initial position of proxy at drag start.\n */\n initialPosition: null,\n\n /**\n * Initial page X of cursor at drag start.\n */\n initialX: null,\n\n /**\n * Initial page Y of cursor at drag start.\n */\n initialY: null,\n\n /**\n * If touch event is in progress, this will be the id, otherwise null\n */\n touching: null,\n\n /**\n * Prepares to begin a drag operation - call with a mousedown or touchstart event.\n *\n * If the returned object has 'start' true, then you can set up a drag proxy, and call\n * start. This function will call preventDefault automatically regardless of whether\n * starting or not.\n *\n * @public\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} Object with start (boolean flag) and x, y (only if flag true) values\n */\n prepare: function(event) {\n event.preventDefault();\n var start;\n if (event.type === 'touchstart') {\n // For touch, start if there's at least one touch and we are not currently doing\n // a touch event.\n start = (dragdrop.touching === null) && event.changedTouches.length > 0;\n } else {\n // For mousedown, start if it's the left button.\n start = event.which === 1;\n }\n if (start) {\n var details = dragdrop.getEventXY(event);\n details.start = true;\n return details;\n } else {\n return {start: false};\n }\n },\n\n /**\n * Call to start a drag operation, in response to a mouse down or touch start event.\n * Normally call this after calling prepare and receiving start true (you can probably\n * skip prepare if only supporting drag not touch).\n *\n * Note: The caller is responsible for creating a 'drag proxy' which is the\n * thing that actually gets dragged. At present, this doesn't really work\n * properly unless it is added directly within the body tag.\n *\n * You also need to ensure that there is CSS so the proxy is absolutely positioned,\n * and styled to look like it is floating.\n *\n * You also need to absolutely position the proxy where you want it to start.\n *\n * @public\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @param {jQuery} dragProxy An absolute-positioned element for dragging\n * @param {Object} onMove Function that receives X and Y page locations for a move\n * @param {Object} onDrop Function that receives X and Y page locations when dropped\n */\n start: function(event, dragProxy, onMove, onDrop) {\n var xy = dragdrop.getEventXY(event);\n dragdrop.initialX = xy.x;\n dragdrop.initialY = xy.y;\n dragdrop.initialPosition = dragProxy.offset();\n dragdrop.dragProxy = dragProxy;\n dragdrop.onMove = onMove;\n dragdrop.onDrop = onDrop;\n\n switch (event.type) {\n case 'mousedown':\n // Cannot use jQuery 'on' because events need to not be passive.\n dragdrop.addEventSpecial('mousemove', dragdrop.mouseMove);\n dragdrop.addEventSpecial('mouseup', dragdrop.mouseUp);\n break;\n case 'touchstart':\n dragdrop.addEventSpecial('touchend', dragdrop.touchEnd);\n dragdrop.addEventSpecial('touchcancel', dragdrop.touchEnd);\n dragdrop.addEventSpecial('touchmove', dragdrop.touchMove);\n dragdrop.touching = event.changedTouches[0].identifier;\n break;\n default:\n throw new Error('Unexpected event type: ' + event.type);\n }\n autoScroll.start(dragdrop.scroll);\n },\n\n /**\n * Adds an event listener with special event capture options (capture, not passive). If the\n * browser does not support passive events, it will fall back to the boolean for capture.\n *\n * @private\n * @param {Object} event Event type string\n * @param {Object} handler Handler function\n */\n addEventSpecial: function(event, handler) {\n try {\n window.addEventListener(event, handler, dragdrop.eventCaptureOptions);\n } catch (ex) {\n dragdrop.eventCaptureOptions = true;\n window.addEventListener(event, handler, dragdrop.eventCaptureOptions);\n }\n },\n\n /**\n * Gets X/Y co-ordinates of an event, which can be either touchstart or mousedown.\n *\n * @private\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} X/Y co-ordinates\n */\n getEventXY: function(event) {\n switch (event.type) {\n case 'touchstart':\n return {x: event.changedTouches[0].pageX,\n y: event.changedTouches[0].pageY};\n case 'mousedown':\n return {x: event.pageX, y: event.pageY};\n default:\n throw new Error('Unexpected event type: ' + event.type);\n }\n },\n\n /**\n * Event handler for touch move.\n *\n * @private\n * @param {Object} e Event\n */\n touchMove: function(e) {\n e.preventDefault();\n for (var i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === dragdrop.touching) {\n dragdrop.handleMove(e.changedTouches[i].pageX, e.changedTouches[i].pageY);\n }\n }\n },\n\n /**\n * Event handler for mouse move.\n *\n * @private\n * @param {Object} e Event\n */\n mouseMove: function(e) {\n dragdrop.handleMove(e.pageX, e.pageY);\n },\n\n /**\n * Shared handler for move event (mouse or touch).\n *\n * @private\n * @param {number} pageX X co-ordinate\n * @param {number} pageY Y co-ordinate\n */\n handleMove: function(pageX, pageY) {\n // Move the drag proxy, not letting you move it out of screen or window bounds.\n var current = dragdrop.dragProxy.offset();\n var topOffset = current.top - parseInt(dragdrop.dragProxy.css('top'));\n var leftOffset = current.left - parseInt(dragdrop.dragProxy.css('left'));\n var maxY = $(document).height() - dragdrop.dragProxy.outerHeight() - topOffset;\n var maxX = $(document).width() - dragdrop.dragProxy.outerWidth() - leftOffset;\n var minY = -topOffset;\n var minX = -leftOffset;\n var initial = dragdrop.initialPosition;\n var position = {\n top: Math.max(minY, Math.min(maxY, initial.top + (pageY - dragdrop.initialY) - topOffset)),\n left: Math.max(minX, Math.min(maxX, initial.left + (pageX - dragdrop.initialX) - leftOffset))\n };\n dragdrop.dragProxy.css(position);\n\n // Trigger move handler.\n dragdrop.onMove(pageX, pageY, dragdrop.dragProxy);\n },\n\n /**\n * Event handler for touch end.\n *\n * @private\n * @param {Object} e Event\n */\n touchEnd: function(e) {\n e.preventDefault();\n for (var i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === dragdrop.touching) {\n dragdrop.handleEnd(e.changedTouches[i].pageX, e.changedTouches[i].pageY);\n }\n }\n },\n\n /**\n * Event handler for mouse up.\n *\n * @private\n * @param {Object} e Event\n */\n mouseUp: function(e) {\n dragdrop.handleEnd(e.pageX, e.pageY);\n },\n\n /**\n * Shared handler for end drag (mouse or touch).\n *\n * @private\n * @param {number} pageX X\n * @param {number} pageY Y\n */\n handleEnd: function(pageX, pageY) {\n if (dragdrop.touching !== null) {\n window.removeEventListener('touchend', dragdrop.touchEnd, dragdrop.eventCaptureOptions);\n window.removeEventListener('touchcancel', dragdrop.touchEnd, dragdrop.eventCaptureOptions);\n window.removeEventListener('touchmove', dragdrop.touchMove, dragdrop.eventCaptureOptions);\n dragdrop.touching = null;\n } else {\n window.removeEventListener('mousemove', dragdrop.mouseMove, dragdrop.eventCaptureOptions);\n window.removeEventListener('mouseup', dragdrop.mouseUp, dragdrop.eventCaptureOptions);\n }\n autoScroll.stop();\n dragdrop.onDrop(pageX, pageY, dragdrop.dragProxy);\n },\n\n /**\n * Called when the page scrolls.\n *\n * @private\n * @param {number} offset Amount of scroll\n */\n scroll: function(offset) {\n // Move the proxy to match.\n var maxY = $(document).height() - dragdrop.dragProxy.outerHeight();\n var currentPosition = dragdrop.dragProxy.offset();\n currentPosition.top = Math.min(maxY, currentPosition.top + offset);\n dragdrop.dragProxy.css(currentPosition);\n }\n };\n\n return {\n /**\n * Prepares to begin a drag operation - call with a mousedown or touchstart event.\n *\n * If the returned object has 'start' true, then you can set up a drag proxy, and call\n * start. This function will call preventDefault automatically regardless of whether\n * starting or not.\n *\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} Object with start (boolean flag) and x, y (only if flag true) values\n */\n prepare: dragdrop.prepare,\n\n /**\n * Call to start a drag operation, in response to a mouse down or touch start event.\n * Normally call this after calling prepare and receiving start true (you can probably\n * skip prepare if only supporting drag not touch).\n *\n * Note: The caller is responsible for creating a 'drag proxy' which is the\n * thing that actually gets dragged. At present, this doesn't really work\n * properly unless it is added directly within the body tag.\n *\n * You also need to ensure that there is CSS so the proxy is absolutely positioned,\n * and styled to look like it is floating.\n *\n * You also need to absolutely position the proxy where you want it to start.\n *\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @param {jQuery} dragProxy An absolute-positioned element for dragging\n * @param {Object} onMove Function that receives X and Y page locations for a move\n * @param {Object} onDrop Function that receives X and Y page locations when dropped\n */\n start: dragdrop.start\n };\n});\n"],"names":["define","$","autoScroll","dragdrop","eventCaptureOptions","passive","capture","dragProxy","onMove","onDrop","initialPosition","initialX","initialY","touching","prepare","event","preventDefault","type","changedTouches","length","which","details","getEventXY","start","xy","x","y","offset","addEventSpecial","mouseMove","mouseUp","touchEnd","touchMove","identifier","Error","scroll","handler","window","addEventListener","ex","pageX","pageY","e","i","handleMove","current","topOffset","top","parseInt","css","leftOffset","left","maxY","document","height","outerHeight","maxX","width","outerWidth","minY","minX","initial","position","Math","max","min","handleEnd","removeEventListener","stop","currentPosition"],"mappings":"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"} \ No newline at end of file diff --git a/lib/amd/build/drawer.min.js.map b/lib/amd/build/drawer.min.js.map index 65be9a13be1..b2fa72e0251 100644 --- a/lib/amd/build/drawer.min.js.map +++ b/lib/amd/build/drawer.min.js.map @@ -1 +1 @@ -{"version":3,"file":"drawer.min.js","sources":["../src/drawer.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Controls the drawer.\n *\n * @module core/drawer\n * @copyright 2019 Jun Pataleta \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport $ from 'jquery';\nimport * as PubSub from 'core/pubsub';\nimport DrawerEvents from 'core/drawer_events';\n\n/**\n * Show the drawer.\n *\n * @param {Object} root The drawer container.\n */\nconst show = (root) => {\n root.removeClass('hidden');\n root.attr('aria-expanded', true);\n root.removeAttr('aria-hidden');\n root.focus();\n\n PubSub.publish(DrawerEvents.DRAWER_SHOWN, root);\n};\n\n/**\n * Hide the drawer.\n *\n * @param {Object} root The drawer container.\n */\nconst hide = (root) => {\n root.addClass('hidden');\n root.attr('aria-expanded', false);\n root.attr('aria-hidden', true);\n PubSub.publish(DrawerEvents.DRAWER_HIDDEN, root);\n};\n\n/**\n * Check if the drawer is visible.\n *\n * @param {Object} root The drawer container.\n * @return {boolean}\n */\nconst isVisible = (root) => {\n let isHidden = root.hasClass('hidden');\n return !isHidden;\n};\n\n/**\n * Toggle the drawer visibility.\n *\n * @param {Object} root The drawer container.\n */\nconst toggle = (root) => {\n if (isVisible(root)) {\n hide(root);\n } else {\n show(root);\n }\n};\n\n/**\n * Add event listeners to toggle the drawer.\n *\n * @param {Object} root The drawer container.\n * @param {Object} toggleElements The toggle elements.\n */\nconst registerToggles = (root, toggleElements) => {\n let openTrigger = null;\n toggleElements.attr('aria-expanded', isVisible(root));\n\n toggleElements.on('click', (e) => {\n e.preventDefault();\n const wasVisible = isVisible(root);\n toggle(root);\n toggleElements.attr('aria-expanded', !wasVisible);\n\n if (!wasVisible) {\n // Remember which trigger element opened the drawer.\n openTrigger = toggleElements.filter((index, element) => {\n return element == e.target || element.contains(e.target);\n });\n } else if (openTrigger) {\n // The drawer has gone from open to close so we need to set the focus back\n // to the element that openend it.\n openTrigger.focus();\n openTrigger = null;\n }\n });\n};\n\n/**\n * Find the root element of the drawer based on the using the drawer content root's ID.\n *\n * @param {Object} contentRoot The drawer content's root element.\n * @returns {*|jQuery}\n */\nconst getDrawerRoot = (contentRoot) => {\n contentRoot = $(contentRoot);\n return contentRoot.closest('[data-region=\"right-hand-drawer\"]');\n};\n\nexport default {\n hide: hide,\n show: show,\n isVisible: isVisible,\n toggle: toggle,\n registerToggles: registerToggles,\n getDrawerRoot: getDrawerRoot\n};\n"],"names":["_jquery","_interopRequireDefault","PubSub","_interopRequireWildcard","_drawer_events","show","root","removeClass","attr","removeAttr","focus","publish","DrawerEvents","DRAWER_SHOWN","hide","addClass","DRAWER_HIDDEN","isVisible","hasClass","toggle","_default","registerToggles","toggleElements","openTrigger","on","e","preventDefault","wasVisible","filter","index","element","target","contains","getDrawerRoot","contentRoot","closest"],"mappings":";;;;;;;qFAsBAA,QAAAC,uBAAAD,SACAE,spBAAAC,CAAAD,QACAE,eAAAH,uBAAAG,gBAOA,IAAMC,KAAO,SAACC,MACVA,KAAKC,YAAY,UACjBD,KAAKE,KAAK,iBAAiB,GAC3BF,KAAKG,WAAW,eAChBH,KAAKI,QAELR,OAAOS,QAAQC,eAAaC,QAAAA,aAAcP,KAC7C,EAOKQ,KAAO,SAACR,MACVA,KAAKS,SAAS,UACdT,KAAKE,KAAK,iBAAiB,GAC3BF,KAAKE,KAAK,eAAe,GACzBN,OAAOS,QAAQC,eAAaI,QAAAA,cAAeV,KAC9C,EAQKW,UAAY,SAACX,MAEf,OADeA,KAAKY,SAAS,SAEhC,EAOKC,OAAS,SAACb,MACRW,UAAUX,MACVQ,KAAKR,MAELD,KAAKC,KAEZ,EA2Ccc,SAAA,CACXN,KAAMA,KACNT,KAAMA,KACNY,UAAWA,UACXE,OAAQA,OACRE,gBAxCoB,SAACf,KAAMgB,gBACvBC,IAAAA,YAAc,KAClBD,eAAed,KAAK,gBAAiBS,UAAUX,OAE/CgB,eAAeE,GAAG,SAAS,SAACC,GACxBA,EAAEC,iBACF,IAAMC,WAAaV,UAAUX,MAC7Ba,OAAOb,MACPgB,eAAed,KAAK,iBAAkBmB,YAEjCA,WAKMJ,cAGPA,YAAYb,QACZa,YAAc,MAPdA,YAAcD,eAAeM,QAAO,SAACC,MAAOC,SACxC,OAAOA,SAAWL,EAAEM,QAAUD,QAAQE,SAASP,EAAEM,OACpD,GAOR,GACJ,EAmBGE,cAXkB,SAACC,aAEnB,OADAA,aAAc,EAAEA,QAAAA,SAAAA,cACGC,QAAQ,oCAC9B"} \ No newline at end of file +{"version":3,"file":"drawer.min.js","sources":["../src/drawer.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Controls the drawer.\n *\n * @module core/drawer\n * @copyright 2019 Jun Pataleta \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport $ from 'jquery';\nimport * as PubSub from 'core/pubsub';\nimport DrawerEvents from 'core/drawer_events';\n\n/**\n * Show the drawer.\n *\n * @param {Object} root The drawer container.\n */\nconst show = (root) => {\n root.removeClass('hidden');\n root.attr('aria-expanded', true);\n root.removeAttr('aria-hidden');\n root.focus();\n\n PubSub.publish(DrawerEvents.DRAWER_SHOWN, root);\n};\n\n/**\n * Hide the drawer.\n *\n * @param {Object} root The drawer container.\n */\nconst hide = (root) => {\n root.addClass('hidden');\n root.attr('aria-expanded', false);\n root.attr('aria-hidden', true);\n PubSub.publish(DrawerEvents.DRAWER_HIDDEN, root);\n};\n\n/**\n * Check if the drawer is visible.\n *\n * @param {Object} root The drawer container.\n * @return {boolean}\n */\nconst isVisible = (root) => {\n let isHidden = root.hasClass('hidden');\n return !isHidden;\n};\n\n/**\n * Toggle the drawer visibility.\n *\n * @param {Object} root The drawer container.\n */\nconst toggle = (root) => {\n if (isVisible(root)) {\n hide(root);\n } else {\n show(root);\n }\n};\n\n/**\n * Add event listeners to toggle the drawer.\n *\n * @param {Object} root The drawer container.\n * @param {Object} toggleElements The toggle elements.\n */\nconst registerToggles = (root, toggleElements) => {\n let openTrigger = null;\n toggleElements.attr('aria-expanded', isVisible(root));\n\n toggleElements.on('click', (e) => {\n e.preventDefault();\n const wasVisible = isVisible(root);\n toggle(root);\n toggleElements.attr('aria-expanded', !wasVisible);\n\n if (!wasVisible) {\n // Remember which trigger element opened the drawer.\n openTrigger = toggleElements.filter((index, element) => {\n return element == e.target || element.contains(e.target);\n });\n } else if (openTrigger) {\n // The drawer has gone from open to close so we need to set the focus back\n // to the element that openend it.\n openTrigger.focus();\n openTrigger = null;\n }\n });\n};\n\n/**\n * Find the root element of the drawer based on the using the drawer content root's ID.\n *\n * @param {Object} contentRoot The drawer content's root element.\n * @returns {*|jQuery}\n */\nconst getDrawerRoot = (contentRoot) => {\n contentRoot = $(contentRoot);\n return contentRoot.closest('[data-region=\"right-hand-drawer\"]');\n};\n\nexport default {\n hide: hide,\n show: show,\n isVisible: isVisible,\n toggle: toggle,\n registerToggles: registerToggles,\n getDrawerRoot: getDrawerRoot\n};\n"],"names":["show","root","removeClass","attr","removeAttr","focus","PubSub","publish","DrawerEvents","DRAWER_SHOWN","hide","addClass","DRAWER_HIDDEN","isVisible","hasClass","toggle","registerToggles","toggleElements","openTrigger","on","e","preventDefault","wasVisible","filter","index","element","target","contains","getDrawerRoot","contentRoot","closest"],"mappings":";;;;;;;s1BA+BMA,KAAO,SAACC,MACVA,KAAKC,YAAY,UACjBD,KAAKE,KAAK,iBAAiB,GAC3BF,KAAKG,WAAW,eAChBH,KAAKI,QAELC,OAAOC,QAAQC,uBAAaC,aAAcR,OAQxCS,KAAO,SAACT,MACVA,KAAKU,SAAS,UACdV,KAAKE,KAAK,iBAAiB,GAC3BF,KAAKE,KAAK,eAAe,GACzBG,OAAOC,QAAQC,uBAAaI,cAAeX,OASzCY,UAAY,SAACZ,aACAA,KAAKa,SAAS,WAS3BC,OAAS,SAACd,MACRY,UAAUZ,MACVS,KAAKT,MAELD,KAAKC,gBA6CE,CACXS,KAAMA,KACNV,KAAMA,KACNa,UAAWA,UACXE,OAAQA,OACRC,gBAxCoB,SAACf,KAAMgB,oBACvBC,YAAc,KAClBD,eAAed,KAAK,gBAAiBU,UAAUZ,OAE/CgB,eAAeE,GAAG,SAAS,SAACC,GACxBA,EAAEC,qBACIC,WAAaT,UAAUZ,MAC7Bc,OAAOd,MACPgB,eAAed,KAAK,iBAAkBmB,YAEjCA,WAKMJ,cAGPA,YAAYb,QACZa,YAAc,MAPdA,YAAcD,eAAeM,QAAO,SAACC,MAAOC,gBACjCA,SAAWL,EAAEM,QAAUD,QAAQE,SAASP,EAAEM,eA4B7DE,cAXkB,SAACC,oBACnBA,aAAc,mBAAEA,cACGC,QAAQ"} \ No newline at end of file diff --git a/lib/amd/build/emoji/auto_complete.min.js.map b/lib/amd/build/emoji/auto_complete.min.js.map index 1776658d9ca..ad4113ce265 100644 --- a/lib/amd/build/emoji/auto_complete.min.js.map +++ b/lib/amd/build/emoji/auto_complete.min.js.map @@ -1 +1 @@ -{"version":3,"file":"auto_complete.min.js","sources":["../../src/emoji/auto_complete.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Emoji auto complete.\n *\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport * as EmojiData from 'core/emoji/data';\nimport {render as renderTemplate} from 'core/templates';\nimport {debounce} from 'core/utils';\nimport LocalStorage from 'core/localstorage';\nimport KeyCodes from 'core/key_codes';\n\nconst INPUT_DEBOUNCE_TIMER = 200;\nconst SUGGESTION_LIMIT = 50;\nconst MAX_RECENT_COUNT = 27;\nconst RECENT_EMOJIS_STORAGE_KEY = 'moodle-recent-emojis';\n\nconst SELECTORS = {\n EMOJI_BUTTON: '[data-region=\"emoji-button\"]',\n ACTIVE_EMOJI_BUTTON: '[data-region=\"emoji-button\"].active',\n};\n\n/**\n * Get the list of recent emojis data from local storage.\n *\n * @return {Array}\n */\nconst getRecentEmojis = () => {\n const storedData = LocalStorage.get(RECENT_EMOJIS_STORAGE_KEY);\n return storedData ? JSON.parse(storedData) : [];\n};\n\n/**\n * Add an emoji data to the set of recent emojis. The new set of recent emojis are\n * saved in local storage.\n *\n * @param {String} unified The char chodes for the emoji\n * @param {String} shortName The emoji short name\n */\nconst addRecentEmoji = (unified, shortName) => {\n const newEmoji = {\n unified,\n shortnames: [shortName]\n };\n const recentEmojis = getRecentEmojis();\n // Add the new emoji to the start of the list of recent emojis.\n let newRecentEmojis = [newEmoji, ...recentEmojis.filter(emoji => emoji.unified != newEmoji.unified)];\n // Limit the number of recent emojis.\n newRecentEmojis = newRecentEmojis.slice(0, MAX_RECENT_COUNT);\n\n LocalStorage.set(RECENT_EMOJIS_STORAGE_KEY, JSON.stringify(newRecentEmojis));\n};\n\n/**\n * Get the actual emoji string from the short name.\n *\n * @param {String} shortName Emoji short name\n * @return {String|null}\n */\nconst getEmojiTextFromShortName = (shortName) => {\n const unified = EmojiData.byShortName[shortName];\n\n if (unified) {\n const charCodes = unified.split('-').map(code => `0x${code}`);\n return String.fromCodePoint.apply(null, charCodes);\n } else {\n return null;\n }\n};\n\n/**\n * Render the auto complete list for the given short names.\n *\n * @param {Element} root The root container for the emoji auto complete\n * @param {Array} shortNames The list of short names for emoji suggestions to show\n */\nconst render = async (root, shortNames) => {\n const renderContext = {\n emojis: shortNames.map((shortName, index) => {\n return {\n active: index === 0,\n emojitext: getEmojiTextFromShortName(shortName),\n displayshortname: `:${shortName}:`,\n shortname: shortName,\n unified: EmojiData.byShortName[shortName]\n };\n })\n };\n const html = await renderTemplate('core/emoji/auto_complete', renderContext);\n root.innerHTML = html;\n};\n\n/**\n * Get the list of emoji short names that include the given search term. If\n * the search term is an empty string then the list of recently used emojis\n * will be returned.\n *\n * @param {String} searchTerm Text to match on\n * @param {Number} limit Maximum number of results to return\n * @return {Array}\n */\nconst searchEmojis = (searchTerm, limit) => {\n if (searchTerm === '') {\n return getRecentEmojis().map(data => data.shortnames[0]).slice(0, limit);\n } else {\n searchTerm = searchTerm.toLowerCase();\n return Object.keys(EmojiData.byShortName)\n .filter(shortName => shortName.includes(searchTerm))\n .slice(0, limit);\n }\n};\n\n/**\n * Get the current word at the given position (index) within the text.\n *\n * @param {String} text The text to process\n * @param {Number} position The position (index) within the text to match the word\n * @return {String}\n */\nconst getWordFromPosition = (text, position) => {\n const startMatches = text.slice(0, position).match(/(\\S*)$/);\n const endMatches = text.slice(position).match(/^(\\S*)/);\n let startText = '';\n let endText = '';\n\n if (startMatches) {\n startText = startMatches[startMatches.length - 1];\n }\n\n if (endMatches) {\n endText = endMatches[endMatches.length - 1];\n }\n\n return `${startText}${endText}`;\n};\n\n/**\n * Check if the given text is a full short name, i.e. has leading and trialing colon\n * characters.\n *\n * @param {String} text The text to process\n * @return {Bool}\n */\nconst isCompleteShortName = text => /^:[^:\\s]+:$/.test(text);\n\n/**\n * Check if the given text is a partial short name, i.e. has a leading colon but no\n * trailing colon.\n *\n * @param {String} text The text to process\n * @return {Bool}\n */\nconst isPartialShortName = text => /^:[^:\\s]*$/.test(text);\n\n/**\n * Remove the colon characters from the given text.\n *\n * @param {String} text The text to process\n * @return {String}\n */\nconst getShortNameFromText = text => text.replace(/:/g, '');\n\n/**\n * Get the currently active emoji button element in the list of suggestions.\n *\n * @param {Element} root The emoji auto complete container element\n * @return {Element|null}\n */\nconst getActiveEmojiSuggestion = (root) => {\n return root.querySelector(SELECTORS.ACTIVE_EMOJI_BUTTON);\n};\n\n/**\n * Make the previous sibling of the current active emoji active.\n *\n * @param {Element} root The emoji auto complete container element\n */\nconst selectPreviousEmojiSuggestion = (root) => {\n const activeEmojiSuggestion = getActiveEmojiSuggestion(root);\n const previousSuggestion = activeEmojiSuggestion.previousElementSibling;\n\n if (previousSuggestion) {\n activeEmojiSuggestion.classList.remove('active');\n previousSuggestion.classList.add('active');\n previousSuggestion.scrollIntoView({behaviour: 'smooth', inline: 'center'});\n }\n};\n\n/**\n * Make the next sibling to the current active emoji active.\n *\n * @param {Element} root The emoji auto complete container element\n */\nconst selectNextEmojiSuggestion = (root) => {\n const activeEmojiSuggestion = getActiveEmojiSuggestion(root);\n const nextSuggestion = activeEmojiSuggestion.nextElementSibling;\n\n if (nextSuggestion) {\n activeEmojiSuggestion.classList.remove('active');\n nextSuggestion.classList.add('active');\n nextSuggestion.scrollIntoView({behaviour: 'smooth', inline: 'center'});\n }\n};\n\n/**\n * Trigger the select callback for the given emoji button element.\n *\n * @param {Element} element The emoji button element\n * @param {Function} selectCallback The callback for when the user selects an emoji\n */\nconst selectEmojiElement = (element, selectCallback) => {\n const shortName = element.getAttribute('data-short-name');\n const unified = element.getAttribute('data-unified');\n addRecentEmoji(unified, shortName);\n selectCallback(element.innerHTML.trim());\n};\n\n/**\n * Initialise the emoji auto complete.\n *\n * @param {Element} root The root container element for the auto complete\n * @param {Element} textArea The text area element to monitor for auto complete\n * @param {Function} hasSuggestionCallback Callback for when there are auto-complete suggestions\n * @param {Function} selectCallback Callback for when the user selects an emoji\n */\nexport default (root, textArea, hasSuggestionCallback, selectCallback) => {\n let hasSuggestions = false;\n let previousSearchText = '';\n\n // Debounce the listener so that each keypress delays the execution of the handler. The\n // handler should only run 200 milliseconds after the last keypress.\n textArea.addEventListener('keyup', debounce(() => {\n // This is a \"keyup\" listener so that it only executes after the text area value\n // has been updated.\n const text = textArea.value;\n const cursorPos = textArea.selectionStart;\n const searchText = getWordFromPosition(text, cursorPos);\n\n if (searchText === previousSearchText) {\n // Nothing has changed so no need to take any action.\n return;\n } else {\n previousSearchText = searchText;\n }\n\n if (isCompleteShortName(searchText)) {\n // If the user has entered a full short name (with leading and trialing colons)\n // then see if we can find a match for it and auto complete it.\n const shortName = getShortNameFromText(searchText);\n const emojiText = getEmojiTextFromShortName(shortName);\n hasSuggestions = false;\n if (emojiText) {\n addRecentEmoji(EmojiData.byShortName[shortName], shortName);\n selectCallback(emojiText);\n }\n } else if (isPartialShortName(searchText)) {\n // If the user has entered a partial short name (leading colon but no trailing) then\n // search on the text to see if we can find some suggestions for them.\n const suggestions = searchEmojis(getShortNameFromText(searchText), SUGGESTION_LIMIT);\n\n if (suggestions.length) {\n render(root, suggestions);\n hasSuggestions = true;\n } else {\n hasSuggestions = false;\n }\n } else {\n hasSuggestions = false;\n }\n\n hasSuggestionCallback(hasSuggestions);\n }, INPUT_DEBOUNCE_TIMER));\n\n textArea.addEventListener('keydown', (e) => {\n if (hasSuggestions) {\n const isModifierPressed = (e.shiftKey || e.metaKey || e.altKey || e.ctrlKey);\n if (!isModifierPressed) {\n switch (e.which) {\n case KeyCodes.escape:\n // Escape key closes the auto complete.\n hasSuggestions = false;\n hasSuggestionCallback(false);\n break;\n case KeyCodes.arrowLeft:\n // Arrow keys navigate through the list of suggetions.\n selectPreviousEmojiSuggestion(root);\n e.preventDefault();\n break;\n case KeyCodes.arrowRight:\n // Arrow keys navigate through the list of suggetions.\n selectNextEmojiSuggestion(root);\n e.preventDefault();\n break;\n case KeyCodes.enter:\n // Enter key selects the current suggestion.\n selectEmojiElement(getActiveEmojiSuggestion(root), selectCallback);\n e.preventDefault();\n e.stopPropagation();\n break;\n }\n }\n }\n });\n\n root.addEventListener('click', (e) => {\n const target = e.target;\n if (target.matches(SELECTORS.EMOJI_BUTTON)) {\n selectEmojiElement(target, selectCallback);\n }\n });\n};"],"names":["EmojiData","_interopRequireWildcard","_localstorage","_interopRequireDefault","_key_codes","INPUT_DEBOUNCE_TIMER","_ref","SELECTORS","getRecentEmojis","storedData","LocalStorage","get","JSON","parse","addRecentEmoji","unified","shortName","newEmoji","shortnames","recentEmojis","newRecentEmojis","concat","_toConsumableArray","filter","emoji","slice","set","stringify","getEmojiTextFromShortName","byShortName","charCodes","split","map","code","String","fromCodePoint","apply","render","regeneratorRuntime","mark","_callee","root","shortNames","renderContext","html","wrap","_context","prev","next","emojis","index","active","emojitext","displayshortname","shortname","_templates","sent","innerHTML","stop","_x","_x2","this","arguments","getShortNameFromText","text","replace","getActiveEmojiSuggestion","querySelector","selectEmojiElement","element","selectCallback","getAttribute","trim","textArea","hasSuggestionCallback","hasSuggestions","previousSearchText","addEventListener","searchText","position","startMatches","match","endMatches","startText","endText","length","getWordFromPosition","value","selectionStart","test","isCompleteShortName","emojiText","isPartialShortName","suggestions","searchTerm","limit","data","toLowerCase","Object","keys","includes","e","shiftKey","metaKey","altKey","ctrlKey","which","KeyCodes","escape","arrowLeft","activeEmojiSuggestion","previousSuggestion","previousElementSibling","classList","remove","add","scrollIntoView","behaviour","inline","selectPreviousEmojiSuggestion","preventDefault","arrowRight","nextSuggestion","nextElementSibling","selectNextEmojiSuggestion","enter","stopPropagation","target","matches"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto_complete.min.js","sources":["../../src/emoji/auto_complete.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Emoji auto complete.\n *\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport * as EmojiData from 'core/emoji/data';\nimport {render as renderTemplate} from 'core/templates';\nimport {debounce} from 'core/utils';\nimport LocalStorage from 'core/localstorage';\nimport KeyCodes from 'core/key_codes';\n\nconst INPUT_DEBOUNCE_TIMER = 200;\nconst SUGGESTION_LIMIT = 50;\nconst MAX_RECENT_COUNT = 27;\nconst RECENT_EMOJIS_STORAGE_KEY = 'moodle-recent-emojis';\n\nconst SELECTORS = {\n EMOJI_BUTTON: '[data-region=\"emoji-button\"]',\n ACTIVE_EMOJI_BUTTON: '[data-region=\"emoji-button\"].active',\n};\n\n/**\n * Get the list of recent emojis data from local storage.\n *\n * @return {Array}\n */\nconst getRecentEmojis = () => {\n const storedData = LocalStorage.get(RECENT_EMOJIS_STORAGE_KEY);\n return storedData ? JSON.parse(storedData) : [];\n};\n\n/**\n * Add an emoji data to the set of recent emojis. The new set of recent emojis are\n * saved in local storage.\n *\n * @param {String} unified The char chodes for the emoji\n * @param {String} shortName The emoji short name\n */\nconst addRecentEmoji = (unified, shortName) => {\n const newEmoji = {\n unified,\n shortnames: [shortName]\n };\n const recentEmojis = getRecentEmojis();\n // Add the new emoji to the start of the list of recent emojis.\n let newRecentEmojis = [newEmoji, ...recentEmojis.filter(emoji => emoji.unified != newEmoji.unified)];\n // Limit the number of recent emojis.\n newRecentEmojis = newRecentEmojis.slice(0, MAX_RECENT_COUNT);\n\n LocalStorage.set(RECENT_EMOJIS_STORAGE_KEY, JSON.stringify(newRecentEmojis));\n};\n\n/**\n * Get the actual emoji string from the short name.\n *\n * @param {String} shortName Emoji short name\n * @return {String|null}\n */\nconst getEmojiTextFromShortName = (shortName) => {\n const unified = EmojiData.byShortName[shortName];\n\n if (unified) {\n const charCodes = unified.split('-').map(code => `0x${code}`);\n return String.fromCodePoint.apply(null, charCodes);\n } else {\n return null;\n }\n};\n\n/**\n * Render the auto complete list for the given short names.\n *\n * @param {Element} root The root container for the emoji auto complete\n * @param {Array} shortNames The list of short names for emoji suggestions to show\n */\nconst render = async (root, shortNames) => {\n const renderContext = {\n emojis: shortNames.map((shortName, index) => {\n return {\n active: index === 0,\n emojitext: getEmojiTextFromShortName(shortName),\n displayshortname: `:${shortName}:`,\n shortname: shortName,\n unified: EmojiData.byShortName[shortName]\n };\n })\n };\n const html = await renderTemplate('core/emoji/auto_complete', renderContext);\n root.innerHTML = html;\n};\n\n/**\n * Get the list of emoji short names that include the given search term. If\n * the search term is an empty string then the list of recently used emojis\n * will be returned.\n *\n * @param {String} searchTerm Text to match on\n * @param {Number} limit Maximum number of results to return\n * @return {Array}\n */\nconst searchEmojis = (searchTerm, limit) => {\n if (searchTerm === '') {\n return getRecentEmojis().map(data => data.shortnames[0]).slice(0, limit);\n } else {\n searchTerm = searchTerm.toLowerCase();\n return Object.keys(EmojiData.byShortName)\n .filter(shortName => shortName.includes(searchTerm))\n .slice(0, limit);\n }\n};\n\n/**\n * Get the current word at the given position (index) within the text.\n *\n * @param {String} text The text to process\n * @param {Number} position The position (index) within the text to match the word\n * @return {String}\n */\nconst getWordFromPosition = (text, position) => {\n const startMatches = text.slice(0, position).match(/(\\S*)$/);\n const endMatches = text.slice(position).match(/^(\\S*)/);\n let startText = '';\n let endText = '';\n\n if (startMatches) {\n startText = startMatches[startMatches.length - 1];\n }\n\n if (endMatches) {\n endText = endMatches[endMatches.length - 1];\n }\n\n return `${startText}${endText}`;\n};\n\n/**\n * Check if the given text is a full short name, i.e. has leading and trialing colon\n * characters.\n *\n * @param {String} text The text to process\n * @return {Bool}\n */\nconst isCompleteShortName = text => /^:[^:\\s]+:$/.test(text);\n\n/**\n * Check if the given text is a partial short name, i.e. has a leading colon but no\n * trailing colon.\n *\n * @param {String} text The text to process\n * @return {Bool}\n */\nconst isPartialShortName = text => /^:[^:\\s]*$/.test(text);\n\n/**\n * Remove the colon characters from the given text.\n *\n * @param {String} text The text to process\n * @return {String}\n */\nconst getShortNameFromText = text => text.replace(/:/g, '');\n\n/**\n * Get the currently active emoji button element in the list of suggestions.\n *\n * @param {Element} root The emoji auto complete container element\n * @return {Element|null}\n */\nconst getActiveEmojiSuggestion = (root) => {\n return root.querySelector(SELECTORS.ACTIVE_EMOJI_BUTTON);\n};\n\n/**\n * Make the previous sibling of the current active emoji active.\n *\n * @param {Element} root The emoji auto complete container element\n */\nconst selectPreviousEmojiSuggestion = (root) => {\n const activeEmojiSuggestion = getActiveEmojiSuggestion(root);\n const previousSuggestion = activeEmojiSuggestion.previousElementSibling;\n\n if (previousSuggestion) {\n activeEmojiSuggestion.classList.remove('active');\n previousSuggestion.classList.add('active');\n previousSuggestion.scrollIntoView({behaviour: 'smooth', inline: 'center'});\n }\n};\n\n/**\n * Make the next sibling to the current active emoji active.\n *\n * @param {Element} root The emoji auto complete container element\n */\nconst selectNextEmojiSuggestion = (root) => {\n const activeEmojiSuggestion = getActiveEmojiSuggestion(root);\n const nextSuggestion = activeEmojiSuggestion.nextElementSibling;\n\n if (nextSuggestion) {\n activeEmojiSuggestion.classList.remove('active');\n nextSuggestion.classList.add('active');\n nextSuggestion.scrollIntoView({behaviour: 'smooth', inline: 'center'});\n }\n};\n\n/**\n * Trigger the select callback for the given emoji button element.\n *\n * @param {Element} element The emoji button element\n * @param {Function} selectCallback The callback for when the user selects an emoji\n */\nconst selectEmojiElement = (element, selectCallback) => {\n const shortName = element.getAttribute('data-short-name');\n const unified = element.getAttribute('data-unified');\n addRecentEmoji(unified, shortName);\n selectCallback(element.innerHTML.trim());\n};\n\n/**\n * Initialise the emoji auto complete.\n *\n * @param {Element} root The root container element for the auto complete\n * @param {Element} textArea The text area element to monitor for auto complete\n * @param {Function} hasSuggestionCallback Callback for when there are auto-complete suggestions\n * @param {Function} selectCallback Callback for when the user selects an emoji\n */\nexport default (root, textArea, hasSuggestionCallback, selectCallback) => {\n let hasSuggestions = false;\n let previousSearchText = '';\n\n // Debounce the listener so that each keypress delays the execution of the handler. The\n // handler should only run 200 milliseconds after the last keypress.\n textArea.addEventListener('keyup', debounce(() => {\n // This is a \"keyup\" listener so that it only executes after the text area value\n // has been updated.\n const text = textArea.value;\n const cursorPos = textArea.selectionStart;\n const searchText = getWordFromPosition(text, cursorPos);\n\n if (searchText === previousSearchText) {\n // Nothing has changed so no need to take any action.\n return;\n } else {\n previousSearchText = searchText;\n }\n\n if (isCompleteShortName(searchText)) {\n // If the user has entered a full short name (with leading and trialing colons)\n // then see if we can find a match for it and auto complete it.\n const shortName = getShortNameFromText(searchText);\n const emojiText = getEmojiTextFromShortName(shortName);\n hasSuggestions = false;\n if (emojiText) {\n addRecentEmoji(EmojiData.byShortName[shortName], shortName);\n selectCallback(emojiText);\n }\n } else if (isPartialShortName(searchText)) {\n // If the user has entered a partial short name (leading colon but no trailing) then\n // search on the text to see if we can find some suggestions for them.\n const suggestions = searchEmojis(getShortNameFromText(searchText), SUGGESTION_LIMIT);\n\n if (suggestions.length) {\n render(root, suggestions);\n hasSuggestions = true;\n } else {\n hasSuggestions = false;\n }\n } else {\n hasSuggestions = false;\n }\n\n hasSuggestionCallback(hasSuggestions);\n }, INPUT_DEBOUNCE_TIMER));\n\n textArea.addEventListener('keydown', (e) => {\n if (hasSuggestions) {\n const isModifierPressed = (e.shiftKey || e.metaKey || e.altKey || e.ctrlKey);\n if (!isModifierPressed) {\n switch (e.which) {\n case KeyCodes.escape:\n // Escape key closes the auto complete.\n hasSuggestions = false;\n hasSuggestionCallback(false);\n break;\n case KeyCodes.arrowLeft:\n // Arrow keys navigate through the list of suggetions.\n selectPreviousEmojiSuggestion(root);\n e.preventDefault();\n break;\n case KeyCodes.arrowRight:\n // Arrow keys navigate through the list of suggetions.\n selectNextEmojiSuggestion(root);\n e.preventDefault();\n break;\n case KeyCodes.enter:\n // Enter key selects the current suggestion.\n selectEmojiElement(getActiveEmojiSuggestion(root), selectCallback);\n e.preventDefault();\n e.stopPropagation();\n break;\n }\n }\n }\n });\n\n root.addEventListener('click', (e) => {\n const target = e.target;\n if (target.matches(SELECTORS.EMOJI_BUTTON)) {\n selectEmojiElement(target, selectCallback);\n }\n });\n};"],"names":["SELECTORS","getRecentEmojis","storedData","LocalStorage","get","JSON","parse","addRecentEmoji","unified","shortName","newEmoji","shortnames","recentEmojis","newRecentEmojis","filter","emoji","slice","set","stringify","getEmojiTextFromShortName","EmojiData","byShortName","charCodes","split","map","code","String","fromCodePoint","apply","render","root","shortNames","renderContext","emojis","index","active","emojitext","displayshortname","shortname","html","innerHTML","getShortNameFromText","text","replace","getActiveEmojiSuggestion","querySelector","selectEmojiElement","element","selectCallback","getAttribute","trim","textArea","hasSuggestionCallback","hasSuggestions","previousSearchText","addEventListener","searchText","position","startMatches","match","endMatches","startText","endText","length","getWordFromPosition","value","selectionStart","test","isCompleteShortName","emojiText","isPartialShortName","suggestions","searchTerm","limit","data","toLowerCase","Object","keys","includes","e","shiftKey","metaKey","altKey","ctrlKey","which","KeyCodes","escape","arrowLeft","activeEmojiSuggestion","previousSuggestion","previousElementSibling","classList","remove","add","scrollIntoView","behaviour","inline","selectPreviousEmojiSuggestion","preventDefault","arrowRight","nextSuggestion","nextElementSibling","selectNextEmojiSuggestion","enter","stopPropagation","target","matches"],"mappings":"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"} \ No newline at end of file diff --git a/lib/amd/build/emoji/data.min.js.map b/lib/amd/build/emoji/data.min.js.map index 2dd9cb98f49..53ea8f062c1 100644 --- a/lib/amd/build/emoji/data.min.js.map +++ b/lib/amd/build/emoji/data.min.js.map @@ -1 +1 @@ -{"version":3,"file":"data.min.js","sources":["../../src/emoji/data.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Emoji data based on the data available from https://github.com/iamcal/emoji-data.\n *\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nexport const byCategory = [\n {\n \"name\": \"Smileys & People\",\n \"emojis\": [\n {\n \"unified\": \"1F600\",\n \"shortnames\": [\n \"grinning\"\n ]\n },\n {\n \"unified\": \"1F601\",\n \"shortnames\": [\n \"grin\"\n ]\n },\n {\n \"unified\": \"1F602\",\n \"shortnames\": [\n \"joy\"\n ]\n },\n {\n \"unified\": \"1F923\",\n \"shortnames\": [\n \"rolling_on_the_floor_laughing\"\n ]\n },\n {\n \"unified\": \"1F603\",\n \"shortnames\": [\n \"smiley\"\n ]\n },\n {\n \"unified\": \"1F604\",\n \"shortnames\": [\n \"smile\"\n ]\n },\n {\n \"unified\": \"1F605\",\n \"shortnames\": [\n \"sweat_smile\"\n ]\n },\n {\n \"unified\": \"1F606\",\n \"shortnames\": [\n \"laughing\"\n ]\n },\n {\n \"unified\": \"1F609\",\n \"shortnames\": [\n \"wink\"\n ]\n },\n {\n \"unified\": \"1F60A\",\n \"shortnames\": [\n \"blush\"\n ]\n },\n {\n \"unified\": \"1F60B\",\n \"shortnames\": [\n \"yum\"\n ]\n },\n {\n \"unified\": \"1F60E\",\n \"shortnames\": [\n \"sunglasses\"\n ]\n },\n {\n \"unified\": \"1F60D\",\n \"shortnames\": [\n \"heart_eyes\"\n ]\n },\n {\n \"unified\": \"1F618\",\n \"shortnames\": [\n \"kissing_heart\"\n ]\n },\n {\n \"unified\": \"1F617\",\n \"shortnames\": [\n \"kissing\"\n ]\n },\n {\n \"unified\": \"1F619\",\n \"shortnames\": [\n \"kissing_smiling_eyes\"\n ]\n },\n {\n \"unified\": \"1F61A\",\n \"shortnames\": [\n \"kissing_closed_eyes\"\n ]\n },\n {\n \"unified\": \"263A-FE0F\",\n \"shortnames\": [\n \"relaxed\"\n ]\n },\n {\n \"unified\": \"1F642\",\n \"shortnames\": [\n \"slightly_smiling_face\"\n ]\n },\n {\n \"unified\": \"1F917\",\n \"shortnames\": [\n \"hugging_face\"\n ]\n },\n {\n \"unified\": \"1F929\",\n \"shortnames\": [\n \"star-struck\"\n ]\n },\n {\n \"unified\": \"1F914\",\n \"shortnames\": [\n \"thinking_face\"\n ]\n },\n {\n \"unified\": \"1F928\",\n \"shortnames\": [\n \"face_with_raised_eyebrow\"\n ]\n },\n {\n \"unified\": \"1F610\",\n \"shortnames\": [\n \"neutral_face\"\n ]\n },\n {\n \"unified\": \"1F611\",\n \"shortnames\": [\n \"expressionless\"\n ]\n },\n {\n \"unified\": \"1F636\",\n \"shortnames\": [\n \"no_mouth\"\n ]\n },\n {\n \"unified\": \"1F644\",\n \"shortnames\": [\n \"face_with_rolling_eyes\"\n ]\n },\n {\n \"unified\": \"1F60F\",\n \"shortnames\": [\n \"smirk\"\n ]\n },\n {\n \"unified\": \"1F623\",\n \"shortnames\": [\n \"persevere\"\n ]\n },\n {\n \"unified\": \"1F625\",\n \"shortnames\": [\n \"disappointed_relieved\"\n ]\n },\n {\n \"unified\": \"1F62E\",\n \"shortnames\": [\n \"open_mouth\"\n ]\n },\n {\n \"unified\": \"1F910\",\n \"shortnames\": [\n \"zipper_mouth_face\"\n ]\n },\n {\n \"unified\": \"1F62F\",\n \"shortnames\": [\n \"hushed\"\n ]\n },\n {\n \"unified\": \"1F62A\",\n \"shortnames\": [\n \"sleepy\"\n ]\n },\n {\n \"unified\": \"1F62B\",\n \"shortnames\": [\n \"tired_face\"\n ]\n },\n {\n \"unified\": \"1F634\",\n \"shortnames\": [\n \"sleeping\"\n ]\n },\n {\n \"unified\": \"1F60C\",\n \"shortnames\": [\n \"relieved\"\n ]\n },\n {\n \"unified\": \"1F61B\",\n \"shortnames\": [\n \"stuck_out_tongue\"\n ]\n },\n {\n \"unified\": \"1F61C\",\n \"shortnames\": [\n \"stuck_out_tongue_winking_eye\"\n ]\n },\n {\n \"unified\": \"1F61D\",\n \"shortnames\": [\n \"stuck_out_tongue_closed_eyes\"\n ]\n },\n {\n \"unified\": \"1F924\",\n \"shortnames\": [\n \"drooling_face\"\n ]\n },\n {\n \"unified\": \"1F612\",\n \"shortnames\": [\n \"unamused\"\n ]\n },\n {\n \"unified\": \"1F613\",\n \"shortnames\": [\n \"sweat\"\n ]\n },\n {\n \"unified\": \"1F614\",\n \"shortnames\": [\n \"pensive\"\n ]\n },\n {\n \"unified\": \"1F615\",\n \"shortnames\": [\n \"confused\"\n ]\n },\n {\n \"unified\": \"1F643\",\n \"shortnames\": [\n \"upside_down_face\"\n ]\n },\n {\n \"unified\": \"1F911\",\n \"shortnames\": [\n \"money_mouth_face\"\n ]\n },\n {\n \"unified\": \"1F632\",\n \"shortnames\": [\n \"astonished\"\n ]\n },\n {\n \"unified\": \"2639-FE0F\",\n \"shortnames\": [\n \"white_frowning_face\"\n ]\n },\n {\n \"unified\": \"1F641\",\n \"shortnames\": [\n \"slightly_frowning_face\"\n ]\n },\n {\n \"unified\": \"1F616\",\n \"shortnames\": [\n \"confounded\"\n ]\n },\n {\n \"unified\": \"1F61E\",\n \"shortnames\": [\n \"disappointed\"\n ]\n },\n {\n \"unified\": \"1F61F\",\n \"shortnames\": [\n \"worried\"\n ]\n },\n {\n \"unified\": \"1F624\",\n \"shortnames\": [\n \"triumph\"\n ]\n },\n {\n \"unified\": \"1F622\",\n \"shortnames\": [\n \"cry\"\n ]\n },\n {\n \"unified\": \"1F62D\",\n \"shortnames\": [\n \"sob\"\n ]\n },\n {\n \"unified\": \"1F626\",\n \"shortnames\": [\n \"frowning\"\n ]\n },\n {\n \"unified\": \"1F627\",\n \"shortnames\": [\n \"anguished\"\n ]\n },\n {\n \"unified\": \"1F628\",\n \"shortnames\": [\n \"fearful\"\n ]\n },\n {\n \"unified\": \"1F629\",\n \"shortnames\": [\n \"weary\"\n ]\n },\n {\n \"unified\": \"1F92F\",\n \"shortnames\": [\n \"exploding_head\"\n ]\n },\n {\n \"unified\": \"1F62C\",\n \"shortnames\": [\n \"grimacing\"\n ]\n },\n {\n \"unified\": \"1F630\",\n \"shortnames\": [\n \"cold_sweat\"\n ]\n },\n {\n \"unified\": \"1F631\",\n \"shortnames\": [\n \"scream\"\n ]\n },\n {\n \"unified\": \"1F633\",\n \"shortnames\": [\n \"flushed\"\n ]\n },\n {\n \"unified\": \"1F92A\",\n \"shortnames\": [\n \"zany_face\"\n ]\n },\n {\n \"unified\": \"1F635\",\n \"shortnames\": [\n \"dizzy_face\"\n ]\n },\n {\n \"unified\": \"1F621\",\n \"shortnames\": [\n \"rage\"\n ]\n },\n {\n \"unified\": \"1F620\",\n \"shortnames\": [\n \"angry\"\n ]\n },\n {\n \"unified\": \"1F92C\",\n \"shortnames\": [\n \"face_with_symbols_on_mouth\"\n ]\n },\n {\n \"unified\": \"1F637\",\n \"shortnames\": [\n \"mask\"\n ]\n },\n {\n \"unified\": \"1F912\",\n \"shortnames\": [\n \"face_with_thermometer\"\n ]\n },\n {\n \"unified\": \"1F915\",\n \"shortnames\": [\n \"face_with_head_bandage\"\n ]\n },\n {\n \"unified\": \"1F922\",\n \"shortnames\": [\n \"nauseated_face\"\n ]\n },\n {\n \"unified\": \"1F92E\",\n \"shortnames\": [\n \"face_vomiting\"\n ]\n },\n {\n \"unified\": \"1F927\",\n \"shortnames\": [\n \"sneezing_face\"\n ]\n },\n {\n \"unified\": \"1F607\",\n \"shortnames\": [\n \"innocent\"\n ]\n },\n {\n \"unified\": \"1F920\",\n \"shortnames\": [\n \"face_with_cowboy_hat\"\n ]\n },\n {\n \"unified\": \"1F921\",\n \"shortnames\": [\n \"clown_face\"\n ]\n },\n {\n \"unified\": \"1F925\",\n \"shortnames\": [\n \"lying_face\"\n ]\n },\n {\n \"unified\": \"1F92B\",\n \"shortnames\": [\n \"shushing_face\"\n ]\n },\n {\n \"unified\": \"1F92D\",\n \"shortnames\": [\n \"face_with_hand_over_mouth\"\n ]\n },\n {\n \"unified\": \"1F9D0\",\n \"shortnames\": [\n \"face_with_monocle\"\n ]\n },\n {\n \"unified\": \"1F913\",\n \"shortnames\": [\n \"nerd_face\"\n ]\n },\n {\n \"unified\": \"1F608\",\n \"shortnames\": [\n \"smiling_imp\"\n ]\n },\n {\n \"unified\": \"1F47F\",\n \"shortnames\": [\n \"imp\"\n ]\n },\n {\n \"unified\": \"1F479\",\n \"shortnames\": [\n \"japanese_ogre\"\n ]\n },\n {\n \"unified\": \"1F47A\",\n \"shortnames\": [\n \"japanese_goblin\"\n ]\n },\n {\n \"unified\": \"1F480\",\n \"shortnames\": [\n \"skull\"\n ]\n },\n {\n \"unified\": \"2620-FE0F\",\n \"shortnames\": [\n \"skull_and_crossbones\"\n ]\n },\n {\n \"unified\": \"1F47B\",\n \"shortnames\": [\n \"ghost\"\n ]\n },\n {\n \"unified\": \"1F47D\",\n \"shortnames\": [\n \"alien\"\n ]\n },\n {\n \"unified\": \"1F47E\",\n \"shortnames\": [\n \"space_invader\"\n ]\n },\n {\n \"unified\": \"1F916\",\n \"shortnames\": [\n \"robot_face\"\n ]\n },\n {\n \"unified\": \"1F4A9\",\n \"shortnames\": [\n \"hankey\"\n ]\n },\n {\n \"unified\": \"1F63A\",\n \"shortnames\": [\n \"smiley_cat\"\n ]\n },\n {\n \"unified\": \"1F638\",\n \"shortnames\": [\n \"smile_cat\"\n ]\n },\n {\n \"unified\": \"1F639\",\n \"shortnames\": [\n \"joy_cat\"\n ]\n },\n {\n \"unified\": \"1F63B\",\n \"shortnames\": [\n \"heart_eyes_cat\"\n ]\n },\n {\n \"unified\": \"1F63C\",\n \"shortnames\": [\n \"smirk_cat\"\n ]\n },\n {\n \"unified\": \"1F63D\",\n \"shortnames\": [\n \"kissing_cat\"\n ]\n },\n {\n \"unified\": \"1F640\",\n \"shortnames\": [\n \"scream_cat\"\n ]\n },\n {\n \"unified\": \"1F63F\",\n \"shortnames\": [\n \"crying_cat_face\"\n ]\n },\n {\n \"unified\": \"1F63E\",\n \"shortnames\": [\n \"pouting_cat\"\n ]\n },\n {\n \"unified\": \"1F648\",\n \"shortnames\": [\n \"see_no_evil\"\n ]\n },\n {\n \"unified\": \"1F649\",\n \"shortnames\": [\n \"hear_no_evil\"\n ]\n },\n {\n \"unified\": \"1F64A\",\n \"shortnames\": [\n \"speak_no_evil\"\n ]\n },\n {\n \"unified\": \"1F476\",\n \"shortnames\": [\n \"baby\"\n ]\n },\n {\n \"unified\": \"1F9D2\",\n \"shortnames\": [\n \"child\"\n ]\n },\n {\n \"unified\": \"1F466\",\n \"shortnames\": [\n \"boy\"\n ]\n },\n {\n \"unified\": \"1F467\",\n \"shortnames\": [\n \"girl\"\n ]\n },\n {\n \"unified\": \"1F9D1\",\n \"shortnames\": [\n \"adult\"\n ]\n },\n {\n \"unified\": \"1F468\",\n \"shortnames\": [\n \"man\"\n ]\n },\n {\n \"unified\": \"1F469\",\n \"shortnames\": [\n \"woman\"\n ]\n },\n {\n \"unified\": \"1F9D3\",\n \"shortnames\": [\n \"older_adult\"\n ]\n },\n {\n \"unified\": \"1F474\",\n \"shortnames\": [\n \"older_man\"\n ]\n },\n {\n \"unified\": \"1F475\",\n \"shortnames\": [\n \"older_woman\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2695-FE0F\",\n \"shortnames\": [\n \"male-doctor\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2695-FE0F\",\n \"shortnames\": [\n \"female-doctor\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F393\",\n \"shortnames\": [\n \"male-student\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F393\",\n \"shortnames\": [\n \"female-student\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3EB\",\n \"shortnames\": [\n \"male-teacher\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3EB\",\n \"shortnames\": [\n \"female-teacher\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2696-FE0F\",\n \"shortnames\": [\n \"male-judge\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2696-FE0F\",\n \"shortnames\": [\n \"female-judge\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F33E\",\n \"shortnames\": [\n \"male-farmer\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F33E\",\n \"shortnames\": [\n \"female-farmer\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F373\",\n \"shortnames\": [\n \"male-cook\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F373\",\n \"shortnames\": [\n \"female-cook\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F527\",\n \"shortnames\": [\n \"male-mechanic\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F527\",\n \"shortnames\": [\n \"female-mechanic\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3ED\",\n \"shortnames\": [\n \"male-factory-worker\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3ED\",\n \"shortnames\": [\n \"female-factory-worker\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F4BC\",\n \"shortnames\": [\n \"male-office-worker\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F4BC\",\n \"shortnames\": [\n \"female-office-worker\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F52C\",\n \"shortnames\": [\n \"male-scientist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F52C\",\n \"shortnames\": [\n \"female-scientist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F4BB\",\n \"shortnames\": [\n \"male-technologist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F4BB\",\n \"shortnames\": [\n \"female-technologist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3A4\",\n \"shortnames\": [\n \"male-singer\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3A4\",\n \"shortnames\": [\n \"female-singer\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3A8\",\n \"shortnames\": [\n \"male-artist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3A8\",\n \"shortnames\": [\n \"female-artist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2708-FE0F\",\n \"shortnames\": [\n \"male-pilot\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2708-FE0F\",\n \"shortnames\": [\n \"female-pilot\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F680\",\n \"shortnames\": [\n \"male-astronaut\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F680\",\n \"shortnames\": [\n \"female-astronaut\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F692\",\n \"shortnames\": [\n \"male-firefighter\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F692\",\n \"shortnames\": [\n \"female-firefighter\"\n ]\n },\n {\n \"unified\": \"1F46E-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-police-officer\",\n \"cop\"\n ]\n },\n {\n \"unified\": \"1F46E-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-police-officer\"\n ]\n },\n {\n \"unified\": \"1F575-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-detective\",\n \"sleuth_or_spy\"\n ]\n },\n {\n \"unified\": \"1F575-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-detective\"\n ]\n },\n {\n \"unified\": \"1F482-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-guard\",\n \"guardsman\"\n ]\n },\n {\n \"unified\": \"1F482-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-guard\"\n ]\n },\n {\n \"unified\": \"1F477-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-construction-worker\",\n \"construction_worker\"\n ]\n },\n {\n \"unified\": \"1F477-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-construction-worker\"\n ]\n },\n {\n \"unified\": \"1F934\",\n \"shortnames\": [\n \"prince\"\n ]\n },\n {\n \"unified\": \"1F478\",\n \"shortnames\": [\n \"princess\"\n ]\n },\n {\n \"unified\": \"1F473-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-wearing-turban\",\n \"man_with_turban\"\n ]\n },\n {\n \"unified\": \"1F473-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-wearing-turban\"\n ]\n },\n {\n \"unified\": \"1F472\",\n \"shortnames\": [\n \"man_with_gua_pi_mao\"\n ]\n },\n {\n \"unified\": \"1F9D5\",\n \"shortnames\": [\n \"person_with_headscarf\"\n ]\n },\n {\n \"unified\": \"1F9D4\",\n \"shortnames\": [\n \"bearded_person\"\n ]\n },\n {\n \"unified\": \"1F471-200D-2642-FE0F\",\n \"shortnames\": [\n \"blond-haired-man\",\n \"person_with_blond_hair\"\n ]\n },\n {\n \"unified\": \"1F471-200D-2640-FE0F\",\n \"shortnames\": [\n \"blond-haired-woman\"\n ]\n },\n {\n \"unified\": \"1F935\",\n \"shortnames\": [\n \"man_in_tuxedo\"\n ]\n },\n {\n \"unified\": \"1F470\",\n \"shortnames\": [\n \"bride_with_veil\"\n ]\n },\n {\n \"unified\": \"1F930\",\n \"shortnames\": [\n \"pregnant_woman\"\n ]\n },\n {\n \"unified\": \"1F931\",\n \"shortnames\": [\n \"breast-feeding\"\n ]\n },\n {\n \"unified\": \"1F47C\",\n \"shortnames\": [\n \"angel\"\n ]\n },\n {\n \"unified\": \"1F385\",\n \"shortnames\": [\n \"santa\"\n ]\n },\n {\n \"unified\": \"1F936\",\n \"shortnames\": [\n \"mrs_claus\"\n ]\n },\n {\n \"unified\": \"1F9D9-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_mage\",\n \"mage\"\n ]\n },\n {\n \"unified\": \"1F9D9-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_mage\"\n ]\n },\n {\n \"unified\": \"1F9DA-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_fairy\",\n \"fairy\"\n ]\n },\n {\n \"unified\": \"1F9DA-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_fairy\"\n ]\n },\n {\n \"unified\": \"1F9DB-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_vampire\",\n \"vampire\"\n ]\n },\n {\n \"unified\": \"1F9DB-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_vampire\"\n ]\n },\n {\n \"unified\": \"1F9DC-200D-2640-FE0F\",\n \"shortnames\": [\n \"mermaid\"\n ]\n },\n {\n \"unified\": \"1F9DC-200D-2642-FE0F\",\n \"shortnames\": [\n \"merman\",\n \"merperson\"\n ]\n },\n {\n \"unified\": \"1F9DD-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_elf\"\n ]\n },\n {\n \"unified\": \"1F9DD-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_elf\",\n \"elf\"\n ]\n },\n {\n \"unified\": \"1F9DE-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_genie\"\n ]\n },\n {\n \"unified\": \"1F9DE-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_genie\",\n \"genie\"\n ]\n },\n {\n \"unified\": \"1F9DF-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_zombie\"\n ]\n },\n {\n \"unified\": \"1F9DF-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_zombie\",\n \"zombie\"\n ]\n },\n {\n \"unified\": \"1F64D-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-frowning\"\n ]\n },\n {\n \"unified\": \"1F64D-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-frowning\",\n \"person_frowning\"\n ]\n },\n {\n \"unified\": \"1F64E-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-pouting\"\n ]\n },\n {\n \"unified\": \"1F64E-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-pouting\",\n \"person_with_pouting_face\"\n ]\n },\n {\n \"unified\": \"1F645-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-gesturing-no\"\n ]\n },\n {\n \"unified\": \"1F645-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-gesturing-no\",\n \"no_good\"\n ]\n },\n {\n \"unified\": \"1F646-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-gesturing-ok\"\n ]\n },\n {\n \"unified\": \"1F646-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-gesturing-ok\",\n \"ok_woman\"\n ]\n },\n {\n \"unified\": \"1F481-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-tipping-hand\"\n ]\n },\n {\n \"unified\": \"1F481-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-tipping-hand\",\n \"information_desk_person\"\n ]\n },\n {\n \"unified\": \"1F64B-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-raising-hand\"\n ]\n },\n {\n \"unified\": \"1F64B-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-raising-hand\",\n \"raising_hand\"\n ]\n },\n {\n \"unified\": \"1F647-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-bowing\",\n \"bow\"\n ]\n },\n {\n \"unified\": \"1F647-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-bowing\"\n ]\n },\n {\n \"unified\": \"1F926\",\n \"shortnames\": [\n \"face_palm\"\n ]\n },\n {\n \"unified\": \"1F926-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-facepalming\"\n ]\n },\n {\n \"unified\": \"1F926-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-facepalming\"\n ]\n },\n {\n \"unified\": \"1F937\",\n \"shortnames\": [\n \"shrug\"\n ]\n },\n {\n \"unified\": \"1F937-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-shrugging\"\n ]\n },\n {\n \"unified\": \"1F937-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-shrugging\"\n ]\n },\n {\n \"unified\": \"1F486-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-getting-massage\"\n ]\n },\n {\n \"unified\": \"1F486-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-getting-massage\",\n \"massage\"\n ]\n },\n {\n \"unified\": \"1F487-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-getting-haircut\"\n ]\n },\n {\n \"unified\": \"1F487-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-getting-haircut\",\n \"haircut\"\n ]\n },\n {\n \"unified\": \"1F6B6-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-walking\",\n \"walking\"\n ]\n },\n {\n \"unified\": \"1F6B6-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-walking\"\n ]\n },\n {\n \"unified\": \"1F3C3-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-running\",\n \"runner\"\n ]\n },\n {\n \"unified\": \"1F3C3-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-running\"\n ]\n },\n {\n \"unified\": \"1F483\",\n \"shortnames\": [\n \"dancer\"\n ]\n },\n {\n \"unified\": \"1F57A\",\n \"shortnames\": [\n \"man_dancing\"\n ]\n },\n {\n \"unified\": \"1F46F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-with-bunny-ears-partying\"\n ]\n },\n {\n \"unified\": \"1F46F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-with-bunny-ears-partying\",\n \"dancers\"\n ]\n },\n {\n \"unified\": \"1F9D6-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_in_steamy_room\"\n ]\n },\n {\n \"unified\": \"1F9D6-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_in_steamy_room\",\n \"person_in_steamy_room\"\n ]\n },\n {\n \"unified\": \"1F9D7-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_climbing\",\n \"person_climbing\"\n ]\n },\n {\n \"unified\": \"1F9D7-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_climbing\"\n ]\n },\n {\n \"unified\": \"1F9D8-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_in_lotus_position\",\n \"person_in_lotus_position\"\n ]\n },\n {\n \"unified\": \"1F9D8-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_in_lotus_position\"\n ]\n },\n {\n \"unified\": \"1F6C0\",\n \"shortnames\": [\n \"bath\"\n ]\n },\n {\n \"unified\": \"1F6CC\",\n \"shortnames\": [\n \"sleeping_accommodation\"\n ]\n },\n {\n \"unified\": \"1F574-FE0F\",\n \"shortnames\": [\n \"man_in_business_suit_levitating\"\n ]\n },\n {\n \"unified\": \"1F5E3-FE0F\",\n \"shortnames\": [\n \"speaking_head_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1F464\",\n \"shortnames\": [\n \"bust_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1F465\",\n \"shortnames\": [\n \"busts_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1F93A\",\n \"shortnames\": [\n \"fencer\"\n ]\n },\n {\n \"unified\": \"1F3C7\",\n \"shortnames\": [\n \"horse_racing\"\n ]\n },\n {\n \"unified\": \"26F7-FE0F\",\n \"shortnames\": [\n \"skier\"\n ]\n },\n {\n \"unified\": \"1F3C2\",\n \"shortnames\": [\n \"snowboarder\"\n ]\n },\n {\n \"unified\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-golfing\",\n \"golfer\"\n ]\n },\n {\n \"unified\": \"1F3CC-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-golfing\"\n ]\n },\n {\n \"unified\": \"1F3C4-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-surfing\",\n \"surfer\"\n ]\n },\n {\n \"unified\": \"1F3C4-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-surfing\"\n ]\n },\n {\n \"unified\": \"1F6A3-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-rowing-boat\",\n \"rowboat\"\n ]\n },\n {\n \"unified\": \"1F6A3-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-rowing-boat\"\n ]\n },\n {\n \"unified\": \"1F3CA-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-swimming\",\n \"swimmer\"\n ]\n },\n {\n \"unified\": \"1F3CA-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-swimming\"\n ]\n },\n {\n \"unified\": \"26F9-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-bouncing-ball\",\n \"person_with_ball\"\n ]\n },\n {\n \"unified\": \"26F9-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-bouncing-ball\"\n ]\n },\n {\n \"unified\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-lifting-weights\",\n \"weight_lifter\"\n ]\n },\n {\n \"unified\": \"1F3CB-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-lifting-weights\"\n ]\n },\n {\n \"unified\": \"1F6B4-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-biking\",\n \"bicyclist\"\n ]\n },\n {\n \"unified\": \"1F6B4-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-biking\"\n ]\n },\n {\n \"unified\": \"1F6B5-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-mountain-biking\",\n \"mountain_bicyclist\"\n ]\n },\n {\n \"unified\": \"1F6B5-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-mountain-biking\"\n ]\n },\n {\n \"unified\": \"1F3CE-FE0F\",\n \"shortnames\": [\n \"racing_car\"\n ]\n },\n {\n \"unified\": \"1F3CD-FE0F\",\n \"shortnames\": [\n \"racing_motorcycle\"\n ]\n },\n {\n \"unified\": \"1F938\",\n \"shortnames\": [\n \"person_doing_cartwheel\"\n ]\n },\n {\n \"unified\": \"1F938-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-cartwheeling\"\n ]\n },\n {\n \"unified\": \"1F938-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-cartwheeling\"\n ]\n },\n {\n \"unified\": \"1F93C\",\n \"shortnames\": [\n \"wrestlers\"\n ]\n },\n {\n \"unified\": \"1F93C-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-wrestling\"\n ]\n },\n {\n \"unified\": \"1F93C-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-wrestling\"\n ]\n },\n {\n \"unified\": \"1F93D\",\n \"shortnames\": [\n \"water_polo\"\n ]\n },\n {\n \"unified\": \"1F93D-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-playing-water-polo\"\n ]\n },\n {\n \"unified\": \"1F93D-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-playing-water-polo\"\n ]\n },\n {\n \"unified\": \"1F93E\",\n \"shortnames\": [\n \"handball\"\n ]\n },\n {\n \"unified\": \"1F93E-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-playing-handball\"\n ]\n },\n {\n \"unified\": \"1F93E-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-playing-handball\"\n ]\n },\n {\n \"unified\": \"1F939\",\n \"shortnames\": [\n \"juggling\"\n ]\n },\n {\n \"unified\": \"1F939-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-juggling\"\n ]\n },\n {\n \"unified\": \"1F939-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-juggling\"\n ]\n },\n {\n \"unified\": \"1F46B\",\n \"shortnames\": [\n \"couple\"\n ]\n },\n {\n \"unified\": \"1F46C\",\n \"shortnames\": [\n \"two_men_holding_hands\"\n ]\n },\n {\n \"unified\": \"1F46D\",\n \"shortnames\": [\n \"two_women_holding_hands\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"shortnames\": [\n \"woman-kiss-man\",\n \"couplekiss\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"shortnames\": [\n \"man-kiss-man\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\n \"shortnames\": [\n \"woman-kiss-woman\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"shortnames\": [\n \"woman-heart-man\",\n \"couple_with_heart\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2764-FE0F-200D-1F468\",\n \"shortnames\": [\n \"man-heart-man\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F469\",\n \"shortnames\": [\n \"woman-heart-woman\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F466\",\n \"shortnames\": [\n \"man-woman-boy\",\n \"family\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467\",\n \"shortnames\": [\n \"man-woman-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F466\",\n \"shortnames\": [\n \"man-man-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467\",\n \"shortnames\": [\n \"man-man-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-man-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-man-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-man-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467\",\n \"shortnames\": [\n \"woman-woman-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"woman-woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F466\",\n \"shortnames\": [\n \"man-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467\",\n \"shortnames\": [\n \"man-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F466\",\n \"shortnames\": [\n \"woman-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467\",\n \"shortnames\": [\n \"woman-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F933\",\n \"shortnames\": [\n \"selfie\"\n ]\n },\n {\n \"unified\": \"1F4AA\",\n \"shortnames\": [\n \"muscle\"\n ]\n },\n {\n \"unified\": \"1F448\",\n \"shortnames\": [\n \"point_left\"\n ]\n },\n {\n \"unified\": \"1F449\",\n \"shortnames\": [\n \"point_right\"\n ]\n },\n {\n \"unified\": \"261D-FE0F\",\n \"shortnames\": [\n \"point_up\"\n ]\n },\n {\n \"unified\": \"1F446\",\n \"shortnames\": [\n \"point_up_2\"\n ]\n },\n {\n \"unified\": \"1F595\",\n \"shortnames\": [\n \"middle_finger\"\n ]\n },\n {\n \"unified\": \"1F447\",\n \"shortnames\": [\n \"point_down\"\n ]\n },\n {\n \"unified\": \"270C-FE0F\",\n \"shortnames\": [\n \"v\"\n ]\n },\n {\n \"unified\": \"1F91E\",\n \"shortnames\": [\n \"crossed_fingers\"\n ]\n },\n {\n \"unified\": \"1F596\",\n \"shortnames\": [\n \"spock-hand\"\n ]\n },\n {\n \"unified\": \"1F918\",\n \"shortnames\": [\n \"the_horns\"\n ]\n },\n {\n \"unified\": \"1F919\",\n \"shortnames\": [\n \"call_me_hand\"\n ]\n },\n {\n \"unified\": \"1F590-FE0F\",\n \"shortnames\": [\n \"raised_hand_with_fingers_splayed\"\n ]\n },\n {\n \"unified\": \"270B\",\n \"shortnames\": [\n \"hand\"\n ]\n },\n {\n \"unified\": \"1F44C\",\n \"shortnames\": [\n \"ok_hand\"\n ]\n },\n {\n \"unified\": \"1F44D\",\n \"shortnames\": [\n \"+1\"\n ]\n },\n {\n \"unified\": \"1F44E\",\n \"shortnames\": [\n \"-1\"\n ]\n },\n {\n \"unified\": \"270A\",\n \"shortnames\": [\n \"fist\"\n ]\n },\n {\n \"unified\": \"1F44A\",\n \"shortnames\": [\n \"facepunch\"\n ]\n },\n {\n \"unified\": \"1F91B\",\n \"shortnames\": [\n \"left-facing_fist\"\n ]\n },\n {\n \"unified\": \"1F91C\",\n \"shortnames\": [\n \"right-facing_fist\"\n ]\n },\n {\n \"unified\": \"1F91A\",\n \"shortnames\": [\n \"raised_back_of_hand\"\n ]\n },\n {\n \"unified\": \"1F44B\",\n \"shortnames\": [\n \"wave\"\n ]\n },\n {\n \"unified\": \"1F91F\",\n \"shortnames\": [\n \"i_love_you_hand_sign\"\n ]\n },\n {\n \"unified\": \"270D-FE0F\",\n \"shortnames\": [\n \"writing_hand\"\n ]\n },\n {\n \"unified\": \"1F44F\",\n \"shortnames\": [\n \"clap\"\n ]\n },\n {\n \"unified\": \"1F450\",\n \"shortnames\": [\n \"open_hands\"\n ]\n },\n {\n \"unified\": \"1F64C\",\n \"shortnames\": [\n \"raised_hands\"\n ]\n },\n {\n \"unified\": \"1F932\",\n \"shortnames\": [\n \"palms_up_together\"\n ]\n },\n {\n \"unified\": \"1F64F\",\n \"shortnames\": [\n \"pray\"\n ]\n },\n {\n \"unified\": \"1F91D\",\n \"shortnames\": [\n \"handshake\"\n ]\n },\n {\n \"unified\": \"1F485\",\n \"shortnames\": [\n \"nail_care\"\n ]\n },\n {\n \"unified\": \"1F442\",\n \"shortnames\": [\n \"ear\"\n ]\n },\n {\n \"unified\": \"1F443\",\n \"shortnames\": [\n \"nose\"\n ]\n },\n {\n \"unified\": \"1F463\",\n \"shortnames\": [\n \"footprints\"\n ]\n },\n {\n \"unified\": \"1F440\",\n \"shortnames\": [\n \"eyes\"\n ]\n },\n {\n \"unified\": \"1F441-FE0F\",\n \"shortnames\": [\n \"eye\"\n ]\n },\n {\n \"unified\": \"1F441-FE0F-200D-1F5E8-FE0F\",\n \"shortnames\": [\n \"eye-in-speech-bubble\"\n ]\n },\n {\n \"unified\": \"1F9E0\",\n \"shortnames\": [\n \"brain\"\n ]\n },\n {\n \"unified\": \"1F445\",\n \"shortnames\": [\n \"tongue\"\n ]\n },\n {\n \"unified\": \"1F444\",\n \"shortnames\": [\n \"lips\"\n ]\n },\n {\n \"unified\": \"1F48B\",\n \"shortnames\": [\n \"kiss\"\n ]\n },\n {\n \"unified\": \"1F498\",\n \"shortnames\": [\n \"cupid\"\n ]\n },\n {\n \"unified\": \"2764-FE0F\",\n \"shortnames\": [\n \"heart\"\n ]\n },\n {\n \"unified\": \"1F493\",\n \"shortnames\": [\n \"heartbeat\"\n ]\n },\n {\n \"unified\": \"1F494\",\n \"shortnames\": [\n \"broken_heart\"\n ]\n },\n {\n \"unified\": \"1F495\",\n \"shortnames\": [\n \"two_hearts\"\n ]\n },\n {\n \"unified\": \"1F496\",\n \"shortnames\": [\n \"sparkling_heart\"\n ]\n },\n {\n \"unified\": \"1F497\",\n \"shortnames\": [\n \"heartpulse\"\n ]\n },\n {\n \"unified\": \"1F499\",\n \"shortnames\": [\n \"blue_heart\"\n ]\n },\n {\n \"unified\": \"1F49A\",\n \"shortnames\": [\n \"green_heart\"\n ]\n },\n {\n \"unified\": \"1F49B\",\n \"shortnames\": [\n \"yellow_heart\"\n ]\n },\n {\n \"unified\": \"1F9E1\",\n \"shortnames\": [\n \"orange_heart\"\n ]\n },\n {\n \"unified\": \"1F49C\",\n \"shortnames\": [\n \"purple_heart\"\n ]\n },\n {\n \"unified\": \"1F5A4\",\n \"shortnames\": [\n \"black_heart\"\n ]\n },\n {\n \"unified\": \"1F49D\",\n \"shortnames\": [\n \"gift_heart\"\n ]\n },\n {\n \"unified\": \"1F49E\",\n \"shortnames\": [\n \"revolving_hearts\"\n ]\n },\n {\n \"unified\": \"1F49F\",\n \"shortnames\": [\n \"heart_decoration\"\n ]\n },\n {\n \"unified\": \"2763-FE0F\",\n \"shortnames\": [\n \"heavy_heart_exclamation_mark_ornament\"\n ]\n },\n {\n \"unified\": \"1F48C\",\n \"shortnames\": [\n \"love_letter\"\n ]\n },\n {\n \"unified\": \"1F4A4\",\n \"shortnames\": [\n \"zzz\"\n ]\n },\n {\n \"unified\": \"1F4A2\",\n \"shortnames\": [\n \"anger\"\n ]\n },\n {\n \"unified\": \"1F4A3\",\n \"shortnames\": [\n \"bomb\"\n ]\n },\n {\n \"unified\": \"1F4A5\",\n \"shortnames\": [\n \"boom\"\n ]\n },\n {\n \"unified\": \"1F4A6\",\n \"shortnames\": [\n \"sweat_drops\"\n ]\n },\n {\n \"unified\": \"1F4A8\",\n \"shortnames\": [\n \"dash\"\n ]\n },\n {\n \"unified\": \"1F4AB\",\n \"shortnames\": [\n \"dizzy\"\n ]\n },\n {\n \"unified\": \"1F4AC\",\n \"shortnames\": [\n \"speech_balloon\"\n ]\n },\n {\n \"unified\": \"1F5E8-FE0F\",\n \"shortnames\": [\n \"left_speech_bubble\"\n ]\n },\n {\n \"unified\": \"1F5EF-FE0F\",\n \"shortnames\": [\n \"right_anger_bubble\"\n ]\n },\n {\n \"unified\": \"1F4AD\",\n \"shortnames\": [\n \"thought_balloon\"\n ]\n },\n {\n \"unified\": \"1F573-FE0F\",\n \"shortnames\": [\n \"hole\"\n ]\n },\n {\n \"unified\": \"1F453\",\n \"shortnames\": [\n \"eyeglasses\"\n ]\n },\n {\n \"unified\": \"1F576-FE0F\",\n \"shortnames\": [\n \"dark_sunglasses\"\n ]\n },\n {\n \"unified\": \"1F454\",\n \"shortnames\": [\n \"necktie\"\n ]\n },\n {\n \"unified\": \"1F455\",\n \"shortnames\": [\n \"shirt\"\n ]\n },\n {\n \"unified\": \"1F456\",\n \"shortnames\": [\n \"jeans\"\n ]\n },\n {\n \"unified\": \"1F9E3\",\n \"shortnames\": [\n \"scarf\"\n ]\n },\n {\n \"unified\": \"1F9E4\",\n \"shortnames\": [\n \"gloves\"\n ]\n },\n {\n \"unified\": \"1F9E5\",\n \"shortnames\": [\n \"coat\"\n ]\n },\n {\n \"unified\": \"1F9E6\",\n \"shortnames\": [\n \"socks\"\n ]\n },\n {\n \"unified\": \"1F457\",\n \"shortnames\": [\n \"dress\"\n ]\n },\n {\n \"unified\": \"1F458\",\n \"shortnames\": [\n \"kimono\"\n ]\n },\n {\n \"unified\": \"1F459\",\n \"shortnames\": [\n \"bikini\"\n ]\n },\n {\n \"unified\": \"1F45A\",\n \"shortnames\": [\n \"womans_clothes\"\n ]\n },\n {\n \"unified\": \"1F45B\",\n \"shortnames\": [\n \"purse\"\n ]\n },\n {\n \"unified\": \"1F45C\",\n \"shortnames\": [\n \"handbag\"\n ]\n },\n {\n \"unified\": \"1F45D\",\n \"shortnames\": [\n \"pouch\"\n ]\n },\n {\n \"unified\": \"1F6CD-FE0F\",\n \"shortnames\": [\n \"shopping_bags\"\n ]\n },\n {\n \"unified\": \"1F392\",\n \"shortnames\": [\n \"school_satchel\"\n ]\n },\n {\n \"unified\": \"1F45E\",\n \"shortnames\": [\n \"mans_shoe\"\n ]\n },\n {\n \"unified\": \"1F45F\",\n \"shortnames\": [\n \"athletic_shoe\"\n ]\n },\n {\n \"unified\": \"1F460\",\n \"shortnames\": [\n \"high_heel\"\n ]\n },\n {\n \"unified\": \"1F461\",\n \"shortnames\": [\n \"sandal\"\n ]\n },\n {\n \"unified\": \"1F462\",\n \"shortnames\": [\n \"boot\"\n ]\n },\n {\n \"unified\": \"1F451\",\n \"shortnames\": [\n \"crown\"\n ]\n },\n {\n \"unified\": \"1F452\",\n \"shortnames\": [\n \"womans_hat\"\n ]\n },\n {\n \"unified\": \"1F3A9\",\n \"shortnames\": [\n \"tophat\"\n ]\n },\n {\n \"unified\": \"1F393\",\n \"shortnames\": [\n \"mortar_board\"\n ]\n },\n {\n \"unified\": \"1F9E2\",\n \"shortnames\": [\n \"billed_cap\"\n ]\n },\n {\n \"unified\": \"26D1-FE0F\",\n \"shortnames\": [\n \"helmet_with_white_cross\"\n ]\n },\n {\n \"unified\": \"1F4FF\",\n \"shortnames\": [\n \"prayer_beads\"\n ]\n },\n {\n \"unified\": \"1F484\",\n \"shortnames\": [\n \"lipstick\"\n ]\n },\n {\n \"unified\": \"1F48D\",\n \"shortnames\": [\n \"ring\"\n ]\n },\n {\n \"unified\": \"1F48E\",\n \"shortnames\": [\n \"gem\"\n ]\n }\n ]\n },\n {\n \"name\": \"Animals & Nature\",\n \"emojis\": [\n {\n \"unified\": \"1F435\",\n \"shortnames\": [\n \"monkey_face\"\n ]\n },\n {\n \"unified\": \"1F412\",\n \"shortnames\": [\n \"monkey\"\n ]\n },\n {\n \"unified\": \"1F98D\",\n \"shortnames\": [\n \"gorilla\"\n ]\n },\n {\n \"unified\": \"1F436\",\n \"shortnames\": [\n \"dog\"\n ]\n },\n {\n \"unified\": \"1F415\",\n \"shortnames\": [\n \"dog2\"\n ]\n },\n {\n \"unified\": \"1F429\",\n \"shortnames\": [\n \"poodle\"\n ]\n },\n {\n \"unified\": \"1F43A\",\n \"shortnames\": [\n \"wolf\"\n ]\n },\n {\n \"unified\": \"1F98A\",\n \"shortnames\": [\n \"fox_face\"\n ]\n },\n {\n \"unified\": \"1F431\",\n \"shortnames\": [\n \"cat\"\n ]\n },\n {\n \"unified\": \"1F408\",\n \"shortnames\": [\n \"cat2\"\n ]\n },\n {\n \"unified\": \"1F981\",\n \"shortnames\": [\n \"lion_face\"\n ]\n },\n {\n \"unified\": \"1F42F\",\n \"shortnames\": [\n \"tiger\"\n ]\n },\n {\n \"unified\": \"1F405\",\n \"shortnames\": [\n \"tiger2\"\n ]\n },\n {\n \"unified\": \"1F406\",\n \"shortnames\": [\n \"leopard\"\n ]\n },\n {\n \"unified\": \"1F434\",\n \"shortnames\": [\n \"horse\"\n ]\n },\n {\n \"unified\": \"1F40E\",\n \"shortnames\": [\n \"racehorse\"\n ]\n },\n {\n \"unified\": \"1F984\",\n \"shortnames\": [\n \"unicorn_face\"\n ]\n },\n {\n \"unified\": \"1F993\",\n \"shortnames\": [\n \"zebra_face\"\n ]\n },\n {\n \"unified\": \"1F98C\",\n \"shortnames\": [\n \"deer\"\n ]\n },\n {\n \"unified\": \"1F42E\",\n \"shortnames\": [\n \"cow\"\n ]\n },\n {\n \"unified\": \"1F402\",\n \"shortnames\": [\n \"ox\"\n ]\n },\n {\n \"unified\": \"1F403\",\n \"shortnames\": [\n \"water_buffalo\"\n ]\n },\n {\n \"unified\": \"1F404\",\n \"shortnames\": [\n \"cow2\"\n ]\n },\n {\n \"unified\": \"1F437\",\n \"shortnames\": [\n \"pig\"\n ]\n },\n {\n \"unified\": \"1F416\",\n \"shortnames\": [\n \"pig2\"\n ]\n },\n {\n \"unified\": \"1F417\",\n \"shortnames\": [\n \"boar\"\n ]\n },\n {\n \"unified\": \"1F43D\",\n \"shortnames\": [\n \"pig_nose\"\n ]\n },\n {\n \"unified\": \"1F40F\",\n \"shortnames\": [\n \"ram\"\n ]\n },\n {\n \"unified\": \"1F411\",\n \"shortnames\": [\n \"sheep\"\n ]\n },\n {\n \"unified\": \"1F410\",\n \"shortnames\": [\n \"goat\"\n ]\n },\n {\n \"unified\": \"1F42A\",\n \"shortnames\": [\n \"dromedary_camel\"\n ]\n },\n {\n \"unified\": \"1F42B\",\n \"shortnames\": [\n \"camel\"\n ]\n },\n {\n \"unified\": \"1F992\",\n \"shortnames\": [\n \"giraffe_face\"\n ]\n },\n {\n \"unified\": \"1F418\",\n \"shortnames\": [\n \"elephant\"\n ]\n },\n {\n \"unified\": \"1F98F\",\n \"shortnames\": [\n \"rhinoceros\"\n ]\n },\n {\n \"unified\": \"1F42D\",\n \"shortnames\": [\n \"mouse\"\n ]\n },\n {\n \"unified\": \"1F401\",\n \"shortnames\": [\n \"mouse2\"\n ]\n },\n {\n \"unified\": \"1F400\",\n \"shortnames\": [\n \"rat\"\n ]\n },\n {\n \"unified\": \"1F439\",\n \"shortnames\": [\n \"hamster\"\n ]\n },\n {\n \"unified\": \"1F430\",\n \"shortnames\": [\n \"rabbit\"\n ]\n },\n {\n \"unified\": \"1F407\",\n \"shortnames\": [\n \"rabbit2\"\n ]\n },\n {\n \"unified\": \"1F43F-FE0F\",\n \"shortnames\": [\n \"chipmunk\"\n ]\n },\n {\n \"unified\": \"1F994\",\n \"shortnames\": [\n \"hedgehog\"\n ]\n },\n {\n \"unified\": \"1F987\",\n \"shortnames\": [\n \"bat\"\n ]\n },\n {\n \"unified\": \"1F43B\",\n \"shortnames\": [\n \"bear\"\n ]\n },\n {\n \"unified\": \"1F428\",\n \"shortnames\": [\n \"koala\"\n ]\n },\n {\n \"unified\": \"1F43C\",\n \"shortnames\": [\n \"panda_face\"\n ]\n },\n {\n \"unified\": \"1F43E\",\n \"shortnames\": [\n \"feet\"\n ]\n },\n {\n \"unified\": \"1F983\",\n \"shortnames\": [\n \"turkey\"\n ]\n },\n {\n \"unified\": \"1F414\",\n \"shortnames\": [\n \"chicken\"\n ]\n },\n {\n \"unified\": \"1F413\",\n \"shortnames\": [\n \"rooster\"\n ]\n },\n {\n \"unified\": \"1F423\",\n \"shortnames\": [\n \"hatching_chick\"\n ]\n },\n {\n \"unified\": \"1F424\",\n \"shortnames\": [\n \"baby_chick\"\n ]\n },\n {\n \"unified\": \"1F425\",\n \"shortnames\": [\n \"hatched_chick\"\n ]\n },\n {\n \"unified\": \"1F426\",\n \"shortnames\": [\n \"bird\"\n ]\n },\n {\n \"unified\": \"1F427\",\n \"shortnames\": [\n \"penguin\"\n ]\n },\n {\n \"unified\": \"1F54A-FE0F\",\n \"shortnames\": [\n \"dove_of_peace\"\n ]\n },\n {\n \"unified\": \"1F985\",\n \"shortnames\": [\n \"eagle\"\n ]\n },\n {\n \"unified\": \"1F986\",\n \"shortnames\": [\n \"duck\"\n ]\n },\n {\n \"unified\": \"1F989\",\n \"shortnames\": [\n \"owl\"\n ]\n },\n {\n \"unified\": \"1F438\",\n \"shortnames\": [\n \"frog\"\n ]\n },\n {\n \"unified\": \"1F40A\",\n \"shortnames\": [\n \"crocodile\"\n ]\n },\n {\n \"unified\": \"1F422\",\n \"shortnames\": [\n \"turtle\"\n ]\n },\n {\n \"unified\": \"1F98E\",\n \"shortnames\": [\n \"lizard\"\n ]\n },\n {\n \"unified\": \"1F40D\",\n \"shortnames\": [\n \"snake\"\n ]\n },\n {\n \"unified\": \"1F432\",\n \"shortnames\": [\n \"dragon_face\"\n ]\n },\n {\n \"unified\": \"1F409\",\n \"shortnames\": [\n \"dragon\"\n ]\n },\n {\n \"unified\": \"1F995\",\n \"shortnames\": [\n \"sauropod\"\n ]\n },\n {\n \"unified\": \"1F996\",\n \"shortnames\": [\n \"t-rex\"\n ]\n },\n {\n \"unified\": \"1F433\",\n \"shortnames\": [\n \"whale\"\n ]\n },\n {\n \"unified\": \"1F40B\",\n \"shortnames\": [\n \"whale2\"\n ]\n },\n {\n \"unified\": \"1F42C\",\n \"shortnames\": [\n \"dolphin\"\n ]\n },\n {\n \"unified\": \"1F41F\",\n \"shortnames\": [\n \"fish\"\n ]\n },\n {\n \"unified\": \"1F420\",\n \"shortnames\": [\n \"tropical_fish\"\n ]\n },\n {\n \"unified\": \"1F421\",\n \"shortnames\": [\n \"blowfish\"\n ]\n },\n {\n \"unified\": \"1F988\",\n \"shortnames\": [\n \"shark\"\n ]\n },\n {\n \"unified\": \"1F419\",\n \"shortnames\": [\n \"octopus\"\n ]\n },\n {\n \"unified\": \"1F41A\",\n \"shortnames\": [\n \"shell\"\n ]\n },\n {\n \"unified\": \"1F980\",\n \"shortnames\": [\n \"crab\"\n ]\n },\n {\n \"unified\": \"1F990\",\n \"shortnames\": [\n \"shrimp\"\n ]\n },\n {\n \"unified\": \"1F991\",\n \"shortnames\": [\n \"squid\"\n ]\n },\n {\n \"unified\": \"1F40C\",\n \"shortnames\": [\n \"snail\"\n ]\n },\n {\n \"unified\": \"1F98B\",\n \"shortnames\": [\n \"butterfly\"\n ]\n },\n {\n \"unified\": \"1F41B\",\n \"shortnames\": [\n \"bug\"\n ]\n },\n {\n \"unified\": \"1F41C\",\n \"shortnames\": [\n \"ant\"\n ]\n },\n {\n \"unified\": \"1F41D\",\n \"shortnames\": [\n \"bee\"\n ]\n },\n {\n \"unified\": \"1F41E\",\n \"shortnames\": [\n \"beetle\"\n ]\n },\n {\n \"unified\": \"1F997\",\n \"shortnames\": [\n \"cricket\"\n ]\n },\n {\n \"unified\": \"1F577-FE0F\",\n \"shortnames\": [\n \"spider\"\n ]\n },\n {\n \"unified\": \"1F578-FE0F\",\n \"shortnames\": [\n \"spider_web\"\n ]\n },\n {\n \"unified\": \"1F982\",\n \"shortnames\": [\n \"scorpion\"\n ]\n },\n {\n \"unified\": \"1F490\",\n \"shortnames\": [\n \"bouquet\"\n ]\n },\n {\n \"unified\": \"1F338\",\n \"shortnames\": [\n \"cherry_blossom\"\n ]\n },\n {\n \"unified\": \"1F4AE\",\n \"shortnames\": [\n \"white_flower\"\n ]\n },\n {\n \"unified\": \"1F3F5-FE0F\",\n \"shortnames\": [\n \"rosette\"\n ]\n },\n {\n \"unified\": \"1F339\",\n \"shortnames\": [\n \"rose\"\n ]\n },\n {\n \"unified\": \"1F940\",\n \"shortnames\": [\n \"wilted_flower\"\n ]\n },\n {\n \"unified\": \"1F33A\",\n \"shortnames\": [\n \"hibiscus\"\n ]\n },\n {\n \"unified\": \"1F33B\",\n \"shortnames\": [\n \"sunflower\"\n ]\n },\n {\n \"unified\": \"1F33C\",\n \"shortnames\": [\n \"blossom\"\n ]\n },\n {\n \"unified\": \"1F337\",\n \"shortnames\": [\n \"tulip\"\n ]\n },\n {\n \"unified\": \"1F331\",\n \"shortnames\": [\n \"seedling\"\n ]\n },\n {\n \"unified\": \"1F332\",\n \"shortnames\": [\n \"evergreen_tree\"\n ]\n },\n {\n \"unified\": \"1F333\",\n \"shortnames\": [\n \"deciduous_tree\"\n ]\n },\n {\n \"unified\": \"1F334\",\n \"shortnames\": [\n \"palm_tree\"\n ]\n },\n {\n \"unified\": \"1F335\",\n \"shortnames\": [\n \"cactus\"\n ]\n },\n {\n \"unified\": \"1F33E\",\n \"shortnames\": [\n \"ear_of_rice\"\n ]\n },\n {\n \"unified\": \"1F33F\",\n \"shortnames\": [\n \"herb\"\n ]\n },\n {\n \"unified\": \"2618-FE0F\",\n \"shortnames\": [\n \"shamrock\"\n ]\n },\n {\n \"unified\": \"1F340\",\n \"shortnames\": [\n \"four_leaf_clover\"\n ]\n },\n {\n \"unified\": \"1F341\",\n \"shortnames\": [\n \"maple_leaf\"\n ]\n },\n {\n \"unified\": \"1F342\",\n \"shortnames\": [\n \"fallen_leaf\"\n ]\n },\n {\n \"unified\": \"1F343\",\n \"shortnames\": [\n \"leaves\"\n ]\n }\n ]\n },\n {\n \"name\": \"Food & Drink\",\n \"emojis\": [\n {\n \"unified\": \"1F347\",\n \"shortnames\": [\n \"grapes\"\n ]\n },\n {\n \"unified\": \"1F348\",\n \"shortnames\": [\n \"melon\"\n ]\n },\n {\n \"unified\": \"1F349\",\n \"shortnames\": [\n \"watermelon\"\n ]\n },\n {\n \"unified\": \"1F34A\",\n \"shortnames\": [\n \"tangerine\"\n ]\n },\n {\n \"unified\": \"1F34B\",\n \"shortnames\": [\n \"lemon\"\n ]\n },\n {\n \"unified\": \"1F34C\",\n \"shortnames\": [\n \"banana\"\n ]\n },\n {\n \"unified\": \"1F34D\",\n \"shortnames\": [\n \"pineapple\"\n ]\n },\n {\n \"unified\": \"1F34E\",\n \"shortnames\": [\n \"apple\"\n ]\n },\n {\n \"unified\": \"1F34F\",\n \"shortnames\": [\n \"green_apple\"\n ]\n },\n {\n \"unified\": \"1F350\",\n \"shortnames\": [\n \"pear\"\n ]\n },\n {\n \"unified\": \"1F351\",\n \"shortnames\": [\n \"peach\"\n ]\n },\n {\n \"unified\": \"1F352\",\n \"shortnames\": [\n \"cherries\"\n ]\n },\n {\n \"unified\": \"1F353\",\n \"shortnames\": [\n \"strawberry\"\n ]\n },\n {\n \"unified\": \"1F95D\",\n \"shortnames\": [\n \"kiwifruit\"\n ]\n },\n {\n \"unified\": \"1F345\",\n \"shortnames\": [\n \"tomato\"\n ]\n },\n {\n \"unified\": \"1F965\",\n \"shortnames\": [\n \"coconut\"\n ]\n },\n {\n \"unified\": \"1F951\",\n \"shortnames\": [\n \"avocado\"\n ]\n },\n {\n \"unified\": \"1F346\",\n \"shortnames\": [\n \"eggplant\"\n ]\n },\n {\n \"unified\": \"1F954\",\n \"shortnames\": [\n \"potato\"\n ]\n },\n {\n \"unified\": \"1F955\",\n \"shortnames\": [\n \"carrot\"\n ]\n },\n {\n \"unified\": \"1F33D\",\n \"shortnames\": [\n \"corn\"\n ]\n },\n {\n \"unified\": \"1F336-FE0F\",\n \"shortnames\": [\n \"hot_pepper\"\n ]\n },\n {\n \"unified\": \"1F952\",\n \"shortnames\": [\n \"cucumber\"\n ]\n },\n {\n \"unified\": \"1F966\",\n \"shortnames\": [\n \"broccoli\"\n ]\n },\n {\n \"unified\": \"1F344\",\n \"shortnames\": [\n \"mushroom\"\n ]\n },\n {\n \"unified\": \"1F95C\",\n \"shortnames\": [\n \"peanuts\"\n ]\n },\n {\n \"unified\": \"1F330\",\n \"shortnames\": [\n \"chestnut\"\n ]\n },\n {\n \"unified\": \"1F35E\",\n \"shortnames\": [\n \"bread\"\n ]\n },\n {\n \"unified\": \"1F950\",\n \"shortnames\": [\n \"croissant\"\n ]\n },\n {\n \"unified\": \"1F956\",\n \"shortnames\": [\n \"baguette_bread\"\n ]\n },\n {\n \"unified\": \"1F968\",\n \"shortnames\": [\n \"pretzel\"\n ]\n },\n {\n \"unified\": \"1F95E\",\n \"shortnames\": [\n \"pancakes\"\n ]\n },\n {\n \"unified\": \"1F9C0\",\n \"shortnames\": [\n \"cheese_wedge\"\n ]\n },\n {\n \"unified\": \"1F356\",\n \"shortnames\": [\n \"meat_on_bone\"\n ]\n },\n {\n \"unified\": \"1F357\",\n \"shortnames\": [\n \"poultry_leg\"\n ]\n },\n {\n \"unified\": \"1F969\",\n \"shortnames\": [\n \"cut_of_meat\"\n ]\n },\n {\n \"unified\": \"1F953\",\n \"shortnames\": [\n \"bacon\"\n ]\n },\n {\n \"unified\": \"1F354\",\n \"shortnames\": [\n \"hamburger\"\n ]\n },\n {\n \"unified\": \"1F35F\",\n \"shortnames\": [\n \"fries\"\n ]\n },\n {\n \"unified\": \"1F355\",\n \"shortnames\": [\n \"pizza\"\n ]\n },\n {\n \"unified\": \"1F32D\",\n \"shortnames\": [\n \"hotdog\"\n ]\n },\n {\n \"unified\": \"1F96A\",\n \"shortnames\": [\n \"sandwich\"\n ]\n },\n {\n \"unified\": \"1F32E\",\n \"shortnames\": [\n \"taco\"\n ]\n },\n {\n \"unified\": \"1F32F\",\n \"shortnames\": [\n \"burrito\"\n ]\n },\n {\n \"unified\": \"1F959\",\n \"shortnames\": [\n \"stuffed_flatbread\"\n ]\n },\n {\n \"unified\": \"1F95A\",\n \"shortnames\": [\n \"egg\"\n ]\n },\n {\n \"unified\": \"1F373\",\n \"shortnames\": [\n \"fried_egg\"\n ]\n },\n {\n \"unified\": \"1F958\",\n \"shortnames\": [\n \"shallow_pan_of_food\"\n ]\n },\n {\n \"unified\": \"1F372\",\n \"shortnames\": [\n \"stew\"\n ]\n },\n {\n \"unified\": \"1F963\",\n \"shortnames\": [\n \"bowl_with_spoon\"\n ]\n },\n {\n \"unified\": \"1F957\",\n \"shortnames\": [\n \"green_salad\"\n ]\n },\n {\n \"unified\": \"1F37F\",\n \"shortnames\": [\n \"popcorn\"\n ]\n },\n {\n \"unified\": \"1F96B\",\n \"shortnames\": [\n \"canned_food\"\n ]\n },\n {\n \"unified\": \"1F371\",\n \"shortnames\": [\n \"bento\"\n ]\n },\n {\n \"unified\": \"1F358\",\n \"shortnames\": [\n \"rice_cracker\"\n ]\n },\n {\n \"unified\": \"1F359\",\n \"shortnames\": [\n \"rice_ball\"\n ]\n },\n {\n \"unified\": \"1F35A\",\n \"shortnames\": [\n \"rice\"\n ]\n },\n {\n \"unified\": \"1F35B\",\n \"shortnames\": [\n \"curry\"\n ]\n },\n {\n \"unified\": \"1F35C\",\n \"shortnames\": [\n \"ramen\"\n ]\n },\n {\n \"unified\": \"1F35D\",\n \"shortnames\": [\n \"spaghetti\"\n ]\n },\n {\n \"unified\": \"1F360\",\n \"shortnames\": [\n \"sweet_potato\"\n ]\n },\n {\n \"unified\": \"1F362\",\n \"shortnames\": [\n \"oden\"\n ]\n },\n {\n \"unified\": \"1F363\",\n \"shortnames\": [\n \"sushi\"\n ]\n },\n {\n \"unified\": \"1F364\",\n \"shortnames\": [\n \"fried_shrimp\"\n ]\n },\n {\n \"unified\": \"1F365\",\n \"shortnames\": [\n \"fish_cake\"\n ]\n },\n {\n \"unified\": \"1F361\",\n \"shortnames\": [\n \"dango\"\n ]\n },\n {\n \"unified\": \"1F95F\",\n \"shortnames\": [\n \"dumpling\"\n ]\n },\n {\n \"unified\": \"1F960\",\n \"shortnames\": [\n \"fortune_cookie\"\n ]\n },\n {\n \"unified\": \"1F961\",\n \"shortnames\": [\n \"takeout_box\"\n ]\n },\n {\n \"unified\": \"1F366\",\n \"shortnames\": [\n \"icecream\"\n ]\n },\n {\n \"unified\": \"1F367\",\n \"shortnames\": [\n \"shaved_ice\"\n ]\n },\n {\n \"unified\": \"1F368\",\n \"shortnames\": [\n \"ice_cream\"\n ]\n },\n {\n \"unified\": \"1F369\",\n \"shortnames\": [\n \"doughnut\"\n ]\n },\n {\n \"unified\": \"1F36A\",\n \"shortnames\": [\n \"cookie\"\n ]\n },\n {\n \"unified\": \"1F382\",\n \"shortnames\": [\n \"birthday\"\n ]\n },\n {\n \"unified\": \"1F370\",\n \"shortnames\": [\n \"cake\"\n ]\n },\n {\n \"unified\": \"1F967\",\n \"shortnames\": [\n \"pie\"\n ]\n },\n {\n \"unified\": \"1F36B\",\n \"shortnames\": [\n \"chocolate_bar\"\n ]\n },\n {\n \"unified\": \"1F36C\",\n \"shortnames\": [\n \"candy\"\n ]\n },\n {\n \"unified\": \"1F36D\",\n \"shortnames\": [\n \"lollipop\"\n ]\n },\n {\n \"unified\": \"1F36E\",\n \"shortnames\": [\n \"custard\"\n ]\n },\n {\n \"unified\": \"1F36F\",\n \"shortnames\": [\n \"honey_pot\"\n ]\n },\n {\n \"unified\": \"1F37C\",\n \"shortnames\": [\n \"baby_bottle\"\n ]\n },\n {\n \"unified\": \"1F95B\",\n \"shortnames\": [\n \"glass_of_milk\"\n ]\n },\n {\n \"unified\": \"2615\",\n \"shortnames\": [\n \"coffee\"\n ]\n },\n {\n \"unified\": \"1F375\",\n \"shortnames\": [\n \"tea\"\n ]\n },\n {\n \"unified\": \"1F376\",\n \"shortnames\": [\n \"sake\"\n ]\n },\n {\n \"unified\": \"1F37E\",\n \"shortnames\": [\n \"champagne\"\n ]\n },\n {\n \"unified\": \"1F377\",\n \"shortnames\": [\n \"wine_glass\"\n ]\n },\n {\n \"unified\": \"1F378\",\n \"shortnames\": [\n \"cocktail\"\n ]\n },\n {\n \"unified\": \"1F379\",\n \"shortnames\": [\n \"tropical_drink\"\n ]\n },\n {\n \"unified\": \"1F37A\",\n \"shortnames\": [\n \"beer\"\n ]\n },\n {\n \"unified\": \"1F37B\",\n \"shortnames\": [\n \"beers\"\n ]\n },\n {\n \"unified\": \"1F942\",\n \"shortnames\": [\n \"clinking_glasses\"\n ]\n },\n {\n \"unified\": \"1F943\",\n \"shortnames\": [\n \"tumbler_glass\"\n ]\n },\n {\n \"unified\": \"1F964\",\n \"shortnames\": [\n \"cup_with_straw\"\n ]\n },\n {\n \"unified\": \"1F962\",\n \"shortnames\": [\n \"chopsticks\"\n ]\n },\n {\n \"unified\": \"1F37D-FE0F\",\n \"shortnames\": [\n \"knife_fork_plate\"\n ]\n },\n {\n \"unified\": \"1F374\",\n \"shortnames\": [\n \"fork_and_knife\"\n ]\n },\n {\n \"unified\": \"1F944\",\n \"shortnames\": [\n \"spoon\"\n ]\n },\n {\n \"unified\": \"1F52A\",\n \"shortnames\": [\n \"hocho\"\n ]\n },\n {\n \"unified\": \"1F3FA\",\n \"shortnames\": [\n \"amphora\"\n ]\n }\n ]\n },\n {\n \"name\": \"Travel & Places\",\n \"emojis\": [\n {\n \"unified\": \"1F30D\",\n \"shortnames\": [\n \"earth_africa\"\n ]\n },\n {\n \"unified\": \"1F30E\",\n \"shortnames\": [\n \"earth_americas\"\n ]\n },\n {\n \"unified\": \"1F30F\",\n \"shortnames\": [\n \"earth_asia\"\n ]\n },\n {\n \"unified\": \"1F310\",\n \"shortnames\": [\n \"globe_with_meridians\"\n ]\n },\n {\n \"unified\": \"1F5FA-FE0F\",\n \"shortnames\": [\n \"world_map\"\n ]\n },\n {\n \"unified\": \"1F5FE\",\n \"shortnames\": [\n \"japan\"\n ]\n },\n {\n \"unified\": \"1F3D4-FE0F\",\n \"shortnames\": [\n \"snow_capped_mountain\"\n ]\n },\n {\n \"unified\": \"26F0-FE0F\",\n \"shortnames\": [\n \"mountain\"\n ]\n },\n {\n \"unified\": \"1F30B\",\n \"shortnames\": [\n \"volcano\"\n ]\n },\n {\n \"unified\": \"1F5FB\",\n \"shortnames\": [\n \"mount_fuji\"\n ]\n },\n {\n \"unified\": \"1F3D5-FE0F\",\n \"shortnames\": [\n \"camping\"\n ]\n },\n {\n \"unified\": \"1F3D6-FE0F\",\n \"shortnames\": [\n \"beach_with_umbrella\"\n ]\n },\n {\n \"unified\": \"1F3DC-FE0F\",\n \"shortnames\": [\n \"desert\"\n ]\n },\n {\n \"unified\": \"1F3DD-FE0F\",\n \"shortnames\": [\n \"desert_island\"\n ]\n },\n {\n \"unified\": \"1F3DE-FE0F\",\n \"shortnames\": [\n \"national_park\"\n ]\n },\n {\n \"unified\": \"1F3DF-FE0F\",\n \"shortnames\": [\n \"stadium\"\n ]\n },\n {\n \"unified\": \"1F3DB-FE0F\",\n \"shortnames\": [\n \"classical_building\"\n ]\n },\n {\n \"unified\": \"1F3D7-FE0F\",\n \"shortnames\": [\n \"building_construction\"\n ]\n },\n {\n \"unified\": \"1F3D8-FE0F\",\n \"shortnames\": [\n \"house_buildings\"\n ]\n },\n {\n \"unified\": \"1F3D9-FE0F\",\n \"shortnames\": [\n \"cityscape\"\n ]\n },\n {\n \"unified\": \"1F3DA-FE0F\",\n \"shortnames\": [\n \"derelict_house_building\"\n ]\n },\n {\n \"unified\": \"1F3E0\",\n \"shortnames\": [\n \"house\"\n ]\n },\n {\n \"unified\": \"1F3E1\",\n \"shortnames\": [\n \"house_with_garden\"\n ]\n },\n {\n \"unified\": \"1F3E2\",\n \"shortnames\": [\n \"office\"\n ]\n },\n {\n \"unified\": \"1F3E3\",\n \"shortnames\": [\n \"post_office\"\n ]\n },\n {\n \"unified\": \"1F3E4\",\n \"shortnames\": [\n \"european_post_office\"\n ]\n },\n {\n \"unified\": \"1F3E5\",\n \"shortnames\": [\n \"hospital\"\n ]\n },\n {\n \"unified\": \"1F3E6\",\n \"shortnames\": [\n \"bank\"\n ]\n },\n {\n \"unified\": \"1F3E8\",\n \"shortnames\": [\n \"hotel\"\n ]\n },\n {\n \"unified\": \"1F3E9\",\n \"shortnames\": [\n \"love_hotel\"\n ]\n },\n {\n \"unified\": \"1F3EA\",\n \"shortnames\": [\n \"convenience_store\"\n ]\n },\n {\n \"unified\": \"1F3EB\",\n \"shortnames\": [\n \"school\"\n ]\n },\n {\n \"unified\": \"1F3EC\",\n \"shortnames\": [\n \"department_store\"\n ]\n },\n {\n \"unified\": \"1F3ED\",\n \"shortnames\": [\n \"factory\"\n ]\n },\n {\n \"unified\": \"1F3EF\",\n \"shortnames\": [\n \"japanese_castle\"\n ]\n },\n {\n \"unified\": \"1F3F0\",\n \"shortnames\": [\n \"european_castle\"\n ]\n },\n {\n \"unified\": \"1F492\",\n \"shortnames\": [\n \"wedding\"\n ]\n },\n {\n \"unified\": \"1F5FC\",\n \"shortnames\": [\n \"tokyo_tower\"\n ]\n },\n {\n \"unified\": \"1F5FD\",\n \"shortnames\": [\n \"statue_of_liberty\"\n ]\n },\n {\n \"unified\": \"26EA\",\n \"shortnames\": [\n \"church\"\n ]\n },\n {\n \"unified\": \"1F54C\",\n \"shortnames\": [\n \"mosque\"\n ]\n },\n {\n \"unified\": \"1F54D\",\n \"shortnames\": [\n \"synagogue\"\n ]\n },\n {\n \"unified\": \"26E9-FE0F\",\n \"shortnames\": [\n \"shinto_shrine\"\n ]\n },\n {\n \"unified\": \"1F54B\",\n \"shortnames\": [\n \"kaaba\"\n ]\n },\n {\n \"unified\": \"26F2\",\n \"shortnames\": [\n \"fountain\"\n ]\n },\n {\n \"unified\": \"26FA\",\n \"shortnames\": [\n \"tent\"\n ]\n },\n {\n \"unified\": \"1F301\",\n \"shortnames\": [\n \"foggy\"\n ]\n },\n {\n \"unified\": \"1F303\",\n \"shortnames\": [\n \"night_with_stars\"\n ]\n },\n {\n \"unified\": \"1F304\",\n \"shortnames\": [\n \"sunrise_over_mountains\"\n ]\n },\n {\n \"unified\": \"1F305\",\n \"shortnames\": [\n \"sunrise\"\n ]\n },\n {\n \"unified\": \"1F306\",\n \"shortnames\": [\n \"city_sunset\"\n ]\n },\n {\n \"unified\": \"1F307\",\n \"shortnames\": [\n \"city_sunrise\"\n ]\n },\n {\n \"unified\": \"1F309\",\n \"shortnames\": [\n \"bridge_at_night\"\n ]\n },\n {\n \"unified\": \"2668-FE0F\",\n \"shortnames\": [\n \"hotsprings\"\n ]\n },\n {\n \"unified\": \"1F30C\",\n \"shortnames\": [\n \"milky_way\"\n ]\n },\n {\n \"unified\": \"1F3A0\",\n \"shortnames\": [\n \"carousel_horse\"\n ]\n },\n {\n \"unified\": \"1F3A1\",\n \"shortnames\": [\n \"ferris_wheel\"\n ]\n },\n {\n \"unified\": \"1F3A2\",\n \"shortnames\": [\n \"roller_coaster\"\n ]\n },\n {\n \"unified\": \"1F488\",\n \"shortnames\": [\n \"barber\"\n ]\n },\n {\n \"unified\": \"1F3AA\",\n \"shortnames\": [\n \"circus_tent\"\n ]\n },\n {\n \"unified\": \"1F3AD\",\n \"shortnames\": [\n \"performing_arts\"\n ]\n },\n {\n \"unified\": \"1F5BC-FE0F\",\n \"shortnames\": [\n \"frame_with_picture\"\n ]\n },\n {\n \"unified\": \"1F3A8\",\n \"shortnames\": [\n \"art\"\n ]\n },\n {\n \"unified\": \"1F3B0\",\n \"shortnames\": [\n \"slot_machine\"\n ]\n },\n {\n \"unified\": \"1F682\",\n \"shortnames\": [\n \"steam_locomotive\"\n ]\n },\n {\n \"unified\": \"1F683\",\n \"shortnames\": [\n \"railway_car\"\n ]\n },\n {\n \"unified\": \"1F684\",\n \"shortnames\": [\n \"bullettrain_side\"\n ]\n },\n {\n \"unified\": \"1F685\",\n \"shortnames\": [\n \"bullettrain_front\"\n ]\n },\n {\n \"unified\": \"1F686\",\n \"shortnames\": [\n \"train2\"\n ]\n },\n {\n \"unified\": \"1F687\",\n \"shortnames\": [\n \"metro\"\n ]\n },\n {\n \"unified\": \"1F688\",\n \"shortnames\": [\n \"light_rail\"\n ]\n },\n {\n \"unified\": \"1F689\",\n \"shortnames\": [\n \"station\"\n ]\n },\n {\n \"unified\": \"1F68A\",\n \"shortnames\": [\n \"tram\"\n ]\n },\n {\n \"unified\": \"1F69D\",\n \"shortnames\": [\n \"monorail\"\n ]\n },\n {\n \"unified\": \"1F69E\",\n \"shortnames\": [\n \"mountain_railway\"\n ]\n },\n {\n \"unified\": \"1F68B\",\n \"shortnames\": [\n \"train\"\n ]\n },\n {\n \"unified\": \"1F68C\",\n \"shortnames\": [\n \"bus\"\n ]\n },\n {\n \"unified\": \"1F68D\",\n \"shortnames\": [\n \"oncoming_bus\"\n ]\n },\n {\n \"unified\": \"1F68E\",\n \"shortnames\": [\n \"trolleybus\"\n ]\n },\n {\n \"unified\": \"1F690\",\n \"shortnames\": [\n \"minibus\"\n ]\n },\n {\n \"unified\": \"1F691\",\n \"shortnames\": [\n \"ambulance\"\n ]\n },\n {\n \"unified\": \"1F692\",\n \"shortnames\": [\n \"fire_engine\"\n ]\n },\n {\n \"unified\": \"1F693\",\n \"shortnames\": [\n \"police_car\"\n ]\n },\n {\n \"unified\": \"1F694\",\n \"shortnames\": [\n \"oncoming_police_car\"\n ]\n },\n {\n \"unified\": \"1F695\",\n \"shortnames\": [\n \"taxi\"\n ]\n },\n {\n \"unified\": \"1F696\",\n \"shortnames\": [\n \"oncoming_taxi\"\n ]\n },\n {\n \"unified\": \"1F697\",\n \"shortnames\": [\n \"car\"\n ]\n },\n {\n \"unified\": \"1F698\",\n \"shortnames\": [\n \"oncoming_automobile\"\n ]\n },\n {\n \"unified\": \"1F699\",\n \"shortnames\": [\n \"blue_car\"\n ]\n },\n {\n \"unified\": \"1F69A\",\n \"shortnames\": [\n \"truck\"\n ]\n },\n {\n \"unified\": \"1F69B\",\n \"shortnames\": [\n \"articulated_lorry\"\n ]\n },\n {\n \"unified\": \"1F69C\",\n \"shortnames\": [\n \"tractor\"\n ]\n },\n {\n \"unified\": \"1F6B2\",\n \"shortnames\": [\n \"bike\"\n ]\n },\n {\n \"unified\": \"1F6F4\",\n \"shortnames\": [\n \"scooter\"\n ]\n },\n {\n \"unified\": \"1F6F5\",\n \"shortnames\": [\n \"motor_scooter\"\n ]\n },\n {\n \"unified\": \"1F68F\",\n \"shortnames\": [\n \"busstop\"\n ]\n },\n {\n \"unified\": \"1F6E3-FE0F\",\n \"shortnames\": [\n \"motorway\"\n ]\n },\n {\n \"unified\": \"1F6E4-FE0F\",\n \"shortnames\": [\n \"railway_track\"\n ]\n },\n {\n \"unified\": \"26FD\",\n \"shortnames\": [\n \"fuelpump\"\n ]\n },\n {\n \"unified\": \"1F6A8\",\n \"shortnames\": [\n \"rotating_light\"\n ]\n },\n {\n \"unified\": \"1F6A5\",\n \"shortnames\": [\n \"traffic_light\"\n ]\n },\n {\n \"unified\": \"1F6A6\",\n \"shortnames\": [\n \"vertical_traffic_light\"\n ]\n },\n {\n \"unified\": \"1F6A7\",\n \"shortnames\": [\n \"construction\"\n ]\n },\n {\n \"unified\": \"1F6D1\",\n \"shortnames\": [\n \"octagonal_sign\"\n ]\n },\n {\n \"unified\": \"2693\",\n \"shortnames\": [\n \"anchor\"\n ]\n },\n {\n \"unified\": \"26F5\",\n \"shortnames\": [\n \"boat\"\n ]\n },\n {\n \"unified\": \"1F6F6\",\n \"shortnames\": [\n \"canoe\"\n ]\n },\n {\n \"unified\": \"1F6A4\",\n \"shortnames\": [\n \"speedboat\"\n ]\n },\n {\n \"unified\": \"1F6F3-FE0F\",\n \"shortnames\": [\n \"passenger_ship\"\n ]\n },\n {\n \"unified\": \"26F4-FE0F\",\n \"shortnames\": [\n \"ferry\"\n ]\n },\n {\n \"unified\": \"1F6E5-FE0F\",\n \"shortnames\": [\n \"motor_boat\"\n ]\n },\n {\n \"unified\": \"1F6A2\",\n \"shortnames\": [\n \"ship\"\n ]\n },\n {\n \"unified\": \"2708-FE0F\",\n \"shortnames\": [\n \"airplane\"\n ]\n },\n {\n \"unified\": \"1F6E9-FE0F\",\n \"shortnames\": [\n \"small_airplane\"\n ]\n },\n {\n \"unified\": \"1F6EB\",\n \"shortnames\": [\n \"airplane_departure\"\n ]\n },\n {\n \"unified\": \"1F6EC\",\n \"shortnames\": [\n \"airplane_arriving\"\n ]\n },\n {\n \"unified\": \"1F4BA\",\n \"shortnames\": [\n \"seat\"\n ]\n },\n {\n \"unified\": \"1F681\",\n \"shortnames\": [\n \"helicopter\"\n ]\n },\n {\n \"unified\": \"1F69F\",\n \"shortnames\": [\n \"suspension_railway\"\n ]\n },\n {\n \"unified\": \"1F6A0\",\n \"shortnames\": [\n \"mountain_cableway\"\n ]\n },\n {\n \"unified\": \"1F6A1\",\n \"shortnames\": [\n \"aerial_tramway\"\n ]\n },\n {\n \"unified\": \"1F6F0-FE0F\",\n \"shortnames\": [\n \"satellite\"\n ]\n },\n {\n \"unified\": \"1F680\",\n \"shortnames\": [\n \"rocket\"\n ]\n },\n {\n \"unified\": \"1F6F8\",\n \"shortnames\": [\n \"flying_saucer\"\n ]\n },\n {\n \"unified\": \"1F6CE-FE0F\",\n \"shortnames\": [\n \"bellhop_bell\"\n ]\n },\n {\n \"unified\": \"1F6AA\",\n \"shortnames\": [\n \"door\"\n ]\n },\n {\n \"unified\": \"1F6CF-FE0F\",\n \"shortnames\": [\n \"bed\"\n ]\n },\n {\n \"unified\": \"1F6CB-FE0F\",\n \"shortnames\": [\n \"couch_and_lamp\"\n ]\n },\n {\n \"unified\": \"1F6BD\",\n \"shortnames\": [\n \"toilet\"\n ]\n },\n {\n \"unified\": \"1F6BF\",\n \"shortnames\": [\n \"shower\"\n ]\n },\n {\n \"unified\": \"1F6C1\",\n \"shortnames\": [\n \"bathtub\"\n ]\n },\n {\n \"unified\": \"231B\",\n \"shortnames\": [\n \"hourglass\"\n ]\n },\n {\n \"unified\": \"23F3\",\n \"shortnames\": [\n \"hourglass_flowing_sand\"\n ]\n },\n {\n \"unified\": \"231A\",\n \"shortnames\": [\n \"watch\"\n ]\n },\n {\n \"unified\": \"23F0\",\n \"shortnames\": [\n \"alarm_clock\"\n ]\n },\n {\n \"unified\": \"23F1-FE0F\",\n \"shortnames\": [\n \"stopwatch\"\n ]\n },\n {\n \"unified\": \"23F2-FE0F\",\n \"shortnames\": [\n \"timer_clock\"\n ]\n },\n {\n \"unified\": \"1F570-FE0F\",\n \"shortnames\": [\n \"mantelpiece_clock\"\n ]\n },\n {\n \"unified\": \"1F55B\",\n \"shortnames\": [\n \"clock12\"\n ]\n },\n {\n \"unified\": \"1F567\",\n \"shortnames\": [\n \"clock1230\"\n ]\n },\n {\n \"unified\": \"1F550\",\n \"shortnames\": [\n \"clock1\"\n ]\n },\n {\n \"unified\": \"1F55C\",\n \"shortnames\": [\n \"clock130\"\n ]\n },\n {\n \"unified\": \"1F551\",\n \"shortnames\": [\n \"clock2\"\n ]\n },\n {\n \"unified\": \"1F55D\",\n \"shortnames\": [\n \"clock230\"\n ]\n },\n {\n \"unified\": \"1F552\",\n \"shortnames\": [\n \"clock3\"\n ]\n },\n {\n \"unified\": \"1F55E\",\n \"shortnames\": [\n \"clock330\"\n ]\n },\n {\n \"unified\": \"1F553\",\n \"shortnames\": [\n \"clock4\"\n ]\n },\n {\n \"unified\": \"1F55F\",\n \"shortnames\": [\n \"clock430\"\n ]\n },\n {\n \"unified\": \"1F554\",\n \"shortnames\": [\n \"clock5\"\n ]\n },\n {\n \"unified\": \"1F560\",\n \"shortnames\": [\n \"clock530\"\n ]\n },\n {\n \"unified\": \"1F555\",\n \"shortnames\": [\n \"clock6\"\n ]\n },\n {\n \"unified\": \"1F561\",\n \"shortnames\": [\n \"clock630\"\n ]\n },\n {\n \"unified\": \"1F556\",\n \"shortnames\": [\n \"clock7\"\n ]\n },\n {\n \"unified\": \"1F562\",\n \"shortnames\": [\n \"clock730\"\n ]\n },\n {\n \"unified\": \"1F557\",\n \"shortnames\": [\n \"clock8\"\n ]\n },\n {\n \"unified\": \"1F563\",\n \"shortnames\": [\n \"clock830\"\n ]\n },\n {\n \"unified\": \"1F558\",\n \"shortnames\": [\n \"clock9\"\n ]\n },\n {\n \"unified\": \"1F564\",\n \"shortnames\": [\n \"clock930\"\n ]\n },\n {\n \"unified\": \"1F559\",\n \"shortnames\": [\n \"clock10\"\n ]\n },\n {\n \"unified\": \"1F565\",\n \"shortnames\": [\n \"clock1030\"\n ]\n },\n {\n \"unified\": \"1F55A\",\n \"shortnames\": [\n \"clock11\"\n ]\n },\n {\n \"unified\": \"1F566\",\n \"shortnames\": [\n \"clock1130\"\n ]\n },\n {\n \"unified\": \"1F311\",\n \"shortnames\": [\n \"new_moon\"\n ]\n },\n {\n \"unified\": \"1F312\",\n \"shortnames\": [\n \"waxing_crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F313\",\n \"shortnames\": [\n \"first_quarter_moon\"\n ]\n },\n {\n \"unified\": \"1F314\",\n \"shortnames\": [\n \"moon\"\n ]\n },\n {\n \"unified\": \"1F315\",\n \"shortnames\": [\n \"full_moon\"\n ]\n },\n {\n \"unified\": \"1F316\",\n \"shortnames\": [\n \"waning_gibbous_moon\"\n ]\n },\n {\n \"unified\": \"1F317\",\n \"shortnames\": [\n \"last_quarter_moon\"\n ]\n },\n {\n \"unified\": \"1F318\",\n \"shortnames\": [\n \"waning_crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F319\",\n \"shortnames\": [\n \"crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F31A\",\n \"shortnames\": [\n \"new_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31B\",\n \"shortnames\": [\n \"first_quarter_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31C\",\n \"shortnames\": [\n \"last_quarter_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F321-FE0F\",\n \"shortnames\": [\n \"thermometer\"\n ]\n },\n {\n \"unified\": \"2600-FE0F\",\n \"shortnames\": [\n \"sunny\"\n ]\n },\n {\n \"unified\": \"1F31D\",\n \"shortnames\": [\n \"full_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31E\",\n \"shortnames\": [\n \"sun_with_face\"\n ]\n },\n {\n \"unified\": \"2B50\",\n \"shortnames\": [\n \"star\"\n ]\n },\n {\n \"unified\": \"1F31F\",\n \"shortnames\": [\n \"star2\"\n ]\n },\n {\n \"unified\": \"1F320\",\n \"shortnames\": [\n \"stars\"\n ]\n },\n {\n \"unified\": \"2601-FE0F\",\n \"shortnames\": [\n \"cloud\"\n ]\n },\n {\n \"unified\": \"26C5\",\n \"shortnames\": [\n \"partly_sunny\"\n ]\n },\n {\n \"unified\": \"26C8-FE0F\",\n \"shortnames\": [\n \"thunder_cloud_and_rain\"\n ]\n },\n {\n \"unified\": \"1F324-FE0F\",\n \"shortnames\": [\n \"mostly_sunny\"\n ]\n },\n {\n \"unified\": \"1F325-FE0F\",\n \"shortnames\": [\n \"barely_sunny\"\n ]\n },\n {\n \"unified\": \"1F326-FE0F\",\n \"shortnames\": [\n \"partly_sunny_rain\"\n ]\n },\n {\n \"unified\": \"1F327-FE0F\",\n \"shortnames\": [\n \"rain_cloud\"\n ]\n },\n {\n \"unified\": \"1F328-FE0F\",\n \"shortnames\": [\n \"snow_cloud\"\n ]\n },\n {\n \"unified\": \"1F329-FE0F\",\n \"shortnames\": [\n \"lightning\"\n ]\n },\n {\n \"unified\": \"1F32A-FE0F\",\n \"shortnames\": [\n \"tornado\"\n ]\n },\n {\n \"unified\": \"1F32B-FE0F\",\n \"shortnames\": [\n \"fog\"\n ]\n },\n {\n \"unified\": \"1F32C-FE0F\",\n \"shortnames\": [\n \"wind_blowing_face\"\n ]\n },\n {\n \"unified\": \"1F300\",\n \"shortnames\": [\n \"cyclone\"\n ]\n },\n {\n \"unified\": \"1F308\",\n \"shortnames\": [\n \"rainbow\"\n ]\n },\n {\n \"unified\": \"1F302\",\n \"shortnames\": [\n \"closed_umbrella\"\n ]\n },\n {\n \"unified\": \"2602-FE0F\",\n \"shortnames\": [\n \"umbrella\"\n ]\n },\n {\n \"unified\": \"2614\",\n \"shortnames\": [\n \"umbrella_with_rain_drops\"\n ]\n },\n {\n \"unified\": \"26F1-FE0F\",\n \"shortnames\": [\n \"umbrella_on_ground\"\n ]\n },\n {\n \"unified\": \"26A1\",\n \"shortnames\": [\n \"zap\"\n ]\n },\n {\n \"unified\": \"2744-FE0F\",\n \"shortnames\": [\n \"snowflake\"\n ]\n },\n {\n \"unified\": \"2603-FE0F\",\n \"shortnames\": [\n \"snowman\"\n ]\n },\n {\n \"unified\": \"26C4\",\n \"shortnames\": [\n \"snowman_without_snow\"\n ]\n },\n {\n \"unified\": \"2604-FE0F\",\n \"shortnames\": [\n \"comet\"\n ]\n },\n {\n \"unified\": \"1F525\",\n \"shortnames\": [\n \"fire\"\n ]\n },\n {\n \"unified\": \"1F4A7\",\n \"shortnames\": [\n \"droplet\"\n ]\n },\n {\n \"unified\": \"1F30A\",\n \"shortnames\": [\n \"ocean\"\n ]\n }\n ]\n },\n {\n \"name\": \"Activities\",\n \"emojis\": [\n {\n \"unified\": \"1F383\",\n \"shortnames\": [\n \"jack_o_lantern\"\n ]\n },\n {\n \"unified\": \"1F384\",\n \"shortnames\": [\n \"christmas_tree\"\n ]\n },\n {\n \"unified\": \"1F386\",\n \"shortnames\": [\n \"fireworks\"\n ]\n },\n {\n \"unified\": \"1F387\",\n \"shortnames\": [\n \"sparkler\"\n ]\n },\n {\n \"unified\": \"2728\",\n \"shortnames\": [\n \"sparkles\"\n ]\n },\n {\n \"unified\": \"1F388\",\n \"shortnames\": [\n \"balloon\"\n ]\n },\n {\n \"unified\": \"1F389\",\n \"shortnames\": [\n \"tada\"\n ]\n },\n {\n \"unified\": \"1F38A\",\n \"shortnames\": [\n \"confetti_ball\"\n ]\n },\n {\n \"unified\": \"1F38B\",\n \"shortnames\": [\n \"tanabata_tree\"\n ]\n },\n {\n \"unified\": \"1F38D\",\n \"shortnames\": [\n \"bamboo\"\n ]\n },\n {\n \"unified\": \"1F38E\",\n \"shortnames\": [\n \"dolls\"\n ]\n },\n {\n \"unified\": \"1F38F\",\n \"shortnames\": [\n \"flags\"\n ]\n },\n {\n \"unified\": \"1F390\",\n \"shortnames\": [\n \"wind_chime\"\n ]\n },\n {\n \"unified\": \"1F391\",\n \"shortnames\": [\n \"rice_scene\"\n ]\n },\n {\n \"unified\": \"1F380\",\n \"shortnames\": [\n \"ribbon\"\n ]\n },\n {\n \"unified\": \"1F381\",\n \"shortnames\": [\n \"gift\"\n ]\n },\n {\n \"unified\": \"1F397-FE0F\",\n \"shortnames\": [\n \"reminder_ribbon\"\n ]\n },\n {\n \"unified\": \"1F39F-FE0F\",\n \"shortnames\": [\n \"admission_tickets\"\n ]\n },\n {\n \"unified\": \"1F3AB\",\n \"shortnames\": [\n \"ticket\"\n ]\n },\n {\n \"unified\": \"1F396-FE0F\",\n \"shortnames\": [\n \"medal\"\n ]\n },\n {\n \"unified\": \"1F3C6\",\n \"shortnames\": [\n \"trophy\"\n ]\n },\n {\n \"unified\": \"1F3C5\",\n \"shortnames\": [\n \"sports_medal\"\n ]\n },\n {\n \"unified\": \"1F947\",\n \"shortnames\": [\n \"first_place_medal\"\n ]\n },\n {\n \"unified\": \"1F948\",\n \"shortnames\": [\n \"second_place_medal\"\n ]\n },\n {\n \"unified\": \"1F949\",\n \"shortnames\": [\n \"third_place_medal\"\n ]\n },\n {\n \"unified\": \"26BD\",\n \"shortnames\": [\n \"soccer\"\n ]\n },\n {\n \"unified\": \"26BE\",\n \"shortnames\": [\n \"baseball\"\n ]\n },\n {\n \"unified\": \"1F3C0\",\n \"shortnames\": [\n \"basketball\"\n ]\n },\n {\n \"unified\": \"1F3D0\",\n \"shortnames\": [\n \"volleyball\"\n ]\n },\n {\n \"unified\": \"1F3C8\",\n \"shortnames\": [\n \"football\"\n ]\n },\n {\n \"unified\": \"1F3C9\",\n \"shortnames\": [\n \"rugby_football\"\n ]\n },\n {\n \"unified\": \"1F3BE\",\n \"shortnames\": [\n \"tennis\"\n ]\n },\n {\n \"unified\": \"1F3B1\",\n \"shortnames\": [\n \"8ball\"\n ]\n },\n {\n \"unified\": \"1F3B3\",\n \"shortnames\": [\n \"bowling\"\n ]\n },\n {\n \"unified\": \"1F3CF\",\n \"shortnames\": [\n \"cricket_bat_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3D1\",\n \"shortnames\": [\n \"field_hockey_stick_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3D2\",\n \"shortnames\": [\n \"ice_hockey_stick_and_puck\"\n ]\n },\n {\n \"unified\": \"1F3D3\",\n \"shortnames\": [\n \"table_tennis_paddle_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3F8\",\n \"shortnames\": [\n \"badminton_racquet_and_shuttlecock\"\n ]\n },\n {\n \"unified\": \"1F94A\",\n \"shortnames\": [\n \"boxing_glove\"\n ]\n },\n {\n \"unified\": \"1F94B\",\n \"shortnames\": [\n \"martial_arts_uniform\"\n ]\n },\n {\n \"unified\": \"1F945\",\n \"shortnames\": [\n \"goal_net\"\n ]\n },\n {\n \"unified\": \"1F3AF\",\n \"shortnames\": [\n \"dart\"\n ]\n },\n {\n \"unified\": \"26F3\",\n \"shortnames\": [\n \"golf\"\n ]\n },\n {\n \"unified\": \"26F8-FE0F\",\n \"shortnames\": [\n \"ice_skate\"\n ]\n },\n {\n \"unified\": \"1F3A3\",\n \"shortnames\": [\n \"fishing_pole_and_fish\"\n ]\n },\n {\n \"unified\": \"1F3BD\",\n \"shortnames\": [\n \"running_shirt_with_sash\"\n ]\n },\n {\n \"unified\": \"1F3BF\",\n \"shortnames\": [\n \"ski\"\n ]\n },\n {\n \"unified\": \"1F6F7\",\n \"shortnames\": [\n \"sled\"\n ]\n },\n {\n \"unified\": \"1F94C\",\n \"shortnames\": [\n \"curling_stone\"\n ]\n },\n {\n \"unified\": \"1F3AE\",\n \"shortnames\": [\n \"video_game\"\n ]\n },\n {\n \"unified\": \"1F579-FE0F\",\n \"shortnames\": [\n \"joystick\"\n ]\n },\n {\n \"unified\": \"1F3B2\",\n \"shortnames\": [\n \"game_die\"\n ]\n },\n {\n \"unified\": \"2660-FE0F\",\n \"shortnames\": [\n \"spades\"\n ]\n },\n {\n \"unified\": \"2665-FE0F\",\n \"shortnames\": [\n \"hearts\"\n ]\n },\n {\n \"unified\": \"2666-FE0F\",\n \"shortnames\": [\n \"diamonds\"\n ]\n },\n {\n \"unified\": \"2663-FE0F\",\n \"shortnames\": [\n \"clubs\"\n ]\n },\n {\n \"unified\": \"1F0CF\",\n \"shortnames\": [\n \"black_joker\"\n ]\n },\n {\n \"unified\": \"1F004\",\n \"shortnames\": [\n \"mahjong\"\n ]\n },\n {\n \"unified\": \"1F3B4\",\n \"shortnames\": [\n \"flower_playing_cards\"\n ]\n }\n ]\n },\n {\n \"name\": \"Objects\",\n \"emojis\": [\n {\n \"unified\": \"1F507\",\n \"shortnames\": [\n \"mute\"\n ]\n },\n {\n \"unified\": \"1F508\",\n \"shortnames\": [\n \"speaker\"\n ]\n },\n {\n \"unified\": \"1F509\",\n \"shortnames\": [\n \"sound\"\n ]\n },\n {\n \"unified\": \"1F50A\",\n \"shortnames\": [\n \"loud_sound\"\n ]\n },\n {\n \"unified\": \"1F4E2\",\n \"shortnames\": [\n \"loudspeaker\"\n ]\n },\n {\n \"unified\": \"1F4E3\",\n \"shortnames\": [\n \"mega\"\n ]\n },\n {\n \"unified\": \"1F4EF\",\n \"shortnames\": [\n \"postal_horn\"\n ]\n },\n {\n \"unified\": \"1F514\",\n \"shortnames\": [\n \"bell\"\n ]\n },\n {\n \"unified\": \"1F515\",\n \"shortnames\": [\n \"no_bell\"\n ]\n },\n {\n \"unified\": \"1F3BC\",\n \"shortnames\": [\n \"musical_score\"\n ]\n },\n {\n \"unified\": \"1F3B5\",\n \"shortnames\": [\n \"musical_note\"\n ]\n },\n {\n \"unified\": \"1F3B6\",\n \"shortnames\": [\n \"notes\"\n ]\n },\n {\n \"unified\": \"1F399-FE0F\",\n \"shortnames\": [\n \"studio_microphone\"\n ]\n },\n {\n \"unified\": \"1F39A-FE0F\",\n \"shortnames\": [\n \"level_slider\"\n ]\n },\n {\n \"unified\": \"1F39B-FE0F\",\n \"shortnames\": [\n \"control_knobs\"\n ]\n },\n {\n \"unified\": \"1F3A4\",\n \"shortnames\": [\n \"microphone\"\n ]\n },\n {\n \"unified\": \"1F3A7\",\n \"shortnames\": [\n \"headphones\"\n ]\n },\n {\n \"unified\": \"1F4FB\",\n \"shortnames\": [\n \"radio\"\n ]\n },\n {\n \"unified\": \"1F3B7\",\n \"shortnames\": [\n \"saxophone\"\n ]\n },\n {\n \"unified\": \"1F3B8\",\n \"shortnames\": [\n \"guitar\"\n ]\n },\n {\n \"unified\": \"1F3B9\",\n \"shortnames\": [\n \"musical_keyboard\"\n ]\n },\n {\n \"unified\": \"1F3BA\",\n \"shortnames\": [\n \"trumpet\"\n ]\n },\n {\n \"unified\": \"1F3BB\",\n \"shortnames\": [\n \"violin\"\n ]\n },\n {\n \"unified\": \"1F941\",\n \"shortnames\": [\n \"drum_with_drumsticks\"\n ]\n },\n {\n \"unified\": \"1F4F1\",\n \"shortnames\": [\n \"iphone\"\n ]\n },\n {\n \"unified\": \"1F4F2\",\n \"shortnames\": [\n \"calling\"\n ]\n },\n {\n \"unified\": \"260E-FE0F\",\n \"shortnames\": [\n \"phone\"\n ]\n },\n {\n \"unified\": \"1F4DE\",\n \"shortnames\": [\n \"telephone_receiver\"\n ]\n },\n {\n \"unified\": \"1F4DF\",\n \"shortnames\": [\n \"pager\"\n ]\n },\n {\n \"unified\": \"1F4E0\",\n \"shortnames\": [\n \"fax\"\n ]\n },\n {\n \"unified\": \"1F50B\",\n \"shortnames\": [\n \"battery\"\n ]\n },\n {\n \"unified\": \"1F50C\",\n \"shortnames\": [\n \"electric_plug\"\n ]\n },\n {\n \"unified\": \"1F4BB\",\n \"shortnames\": [\n \"computer\"\n ]\n },\n {\n \"unified\": \"1F5A5-FE0F\",\n \"shortnames\": [\n \"desktop_computer\"\n ]\n },\n {\n \"unified\": \"1F5A8-FE0F\",\n \"shortnames\": [\n \"printer\"\n ]\n },\n {\n \"unified\": \"2328-FE0F\",\n \"shortnames\": [\n \"keyboard\"\n ]\n },\n {\n \"unified\": \"1F5B1-FE0F\",\n \"shortnames\": [\n \"three_button_mouse\"\n ]\n },\n {\n \"unified\": \"1F5B2-FE0F\",\n \"shortnames\": [\n \"trackball\"\n ]\n },\n {\n \"unified\": \"1F4BD\",\n \"shortnames\": [\n \"minidisc\"\n ]\n },\n {\n \"unified\": \"1F4BE\",\n \"shortnames\": [\n \"floppy_disk\"\n ]\n },\n {\n \"unified\": \"1F4BF\",\n \"shortnames\": [\n \"cd\"\n ]\n },\n {\n \"unified\": \"1F4C0\",\n \"shortnames\": [\n \"dvd\"\n ]\n },\n {\n \"unified\": \"1F3A5\",\n \"shortnames\": [\n \"movie_camera\"\n ]\n },\n {\n \"unified\": \"1F39E-FE0F\",\n \"shortnames\": [\n \"film_frames\"\n ]\n },\n {\n \"unified\": \"1F4FD-FE0F\",\n \"shortnames\": [\n \"film_projector\"\n ]\n },\n {\n \"unified\": \"1F3AC\",\n \"shortnames\": [\n \"clapper\"\n ]\n },\n {\n \"unified\": \"1F4FA\",\n \"shortnames\": [\n \"tv\"\n ]\n },\n {\n \"unified\": \"1F4F7\",\n \"shortnames\": [\n \"camera\"\n ]\n },\n {\n \"unified\": \"1F4F8\",\n \"shortnames\": [\n \"camera_with_flash\"\n ]\n },\n {\n \"unified\": \"1F4F9\",\n \"shortnames\": [\n \"video_camera\"\n ]\n },\n {\n \"unified\": \"1F4FC\",\n \"shortnames\": [\n \"vhs\"\n ]\n },\n {\n \"unified\": \"1F50D\",\n \"shortnames\": [\n \"mag\"\n ]\n },\n {\n \"unified\": \"1F50E\",\n \"shortnames\": [\n \"mag_right\"\n ]\n },\n {\n \"unified\": \"1F52C\",\n \"shortnames\": [\n \"microscope\"\n ]\n },\n {\n \"unified\": \"1F52D\",\n \"shortnames\": [\n \"telescope\"\n ]\n },\n {\n \"unified\": \"1F4E1\",\n \"shortnames\": [\n \"satellite_antenna\"\n ]\n },\n {\n \"unified\": \"1F56F-FE0F\",\n \"shortnames\": [\n \"candle\"\n ]\n },\n {\n \"unified\": \"1F4A1\",\n \"shortnames\": [\n \"bulb\"\n ]\n },\n {\n \"unified\": \"1F526\",\n \"shortnames\": [\n \"flashlight\"\n ]\n },\n {\n \"unified\": \"1F3EE\",\n \"shortnames\": [\n \"izakaya_lantern\"\n ]\n },\n {\n \"unified\": \"1F4D4\",\n \"shortnames\": [\n \"notebook_with_decorative_cover\"\n ]\n },\n {\n \"unified\": \"1F4D5\",\n \"shortnames\": [\n \"closed_book\"\n ]\n },\n {\n \"unified\": \"1F4D6\",\n \"shortnames\": [\n \"book\"\n ]\n },\n {\n \"unified\": \"1F4D7\",\n \"shortnames\": [\n \"green_book\"\n ]\n },\n {\n \"unified\": \"1F4D8\",\n \"shortnames\": [\n \"blue_book\"\n ]\n },\n {\n \"unified\": \"1F4D9\",\n \"shortnames\": [\n \"orange_book\"\n ]\n },\n {\n \"unified\": \"1F4DA\",\n \"shortnames\": [\n \"books\"\n ]\n },\n {\n \"unified\": \"1F4D3\",\n \"shortnames\": [\n \"notebook\"\n ]\n },\n {\n \"unified\": \"1F4D2\",\n \"shortnames\": [\n \"ledger\"\n ]\n },\n {\n \"unified\": \"1F4C3\",\n \"shortnames\": [\n \"page_with_curl\"\n ]\n },\n {\n \"unified\": \"1F4DC\",\n \"shortnames\": [\n \"scroll\"\n ]\n },\n {\n \"unified\": \"1F4C4\",\n \"shortnames\": [\n \"page_facing_up\"\n ]\n },\n {\n \"unified\": \"1F4F0\",\n \"shortnames\": [\n \"newspaper\"\n ]\n },\n {\n \"unified\": \"1F5DE-FE0F\",\n \"shortnames\": [\n \"rolled_up_newspaper\"\n ]\n },\n {\n \"unified\": \"1F4D1\",\n \"shortnames\": [\n \"bookmark_tabs\"\n ]\n },\n {\n \"unified\": \"1F516\",\n \"shortnames\": [\n \"bookmark\"\n ]\n },\n {\n \"unified\": \"1F3F7-FE0F\",\n \"shortnames\": [\n \"label\"\n ]\n },\n {\n \"unified\": \"1F4B0\",\n \"shortnames\": [\n \"moneybag\"\n ]\n },\n {\n \"unified\": \"1F4B4\",\n \"shortnames\": [\n \"yen\"\n ]\n },\n {\n \"unified\": \"1F4B5\",\n \"shortnames\": [\n \"dollar\"\n ]\n },\n {\n \"unified\": \"1F4B6\",\n \"shortnames\": [\n \"euro\"\n ]\n },\n {\n \"unified\": \"1F4B7\",\n \"shortnames\": [\n \"pound\"\n ]\n },\n {\n \"unified\": \"1F4B8\",\n \"shortnames\": [\n \"money_with_wings\"\n ]\n },\n {\n \"unified\": \"1F4B3\",\n \"shortnames\": [\n \"credit_card\"\n ]\n },\n {\n \"unified\": \"1F4B9\",\n \"shortnames\": [\n \"chart\"\n ]\n },\n {\n \"unified\": \"1F4B1\",\n \"shortnames\": [\n \"currency_exchange\"\n ]\n },\n {\n \"unified\": \"1F4B2\",\n \"shortnames\": [\n \"heavy_dollar_sign\"\n ]\n },\n {\n \"unified\": \"2709-FE0F\",\n \"shortnames\": [\n \"email\"\n ]\n },\n {\n \"unified\": \"1F4E7\",\n \"shortnames\": [\n \"e-mail\"\n ]\n },\n {\n \"unified\": \"1F4E8\",\n \"shortnames\": [\n \"incoming_envelope\"\n ]\n },\n {\n \"unified\": \"1F4E9\",\n \"shortnames\": [\n \"envelope_with_arrow\"\n ]\n },\n {\n \"unified\": \"1F4E4\",\n \"shortnames\": [\n \"outbox_tray\"\n ]\n },\n {\n \"unified\": \"1F4E5\",\n \"shortnames\": [\n \"inbox_tray\"\n ]\n },\n {\n \"unified\": \"1F4E6\",\n \"shortnames\": [\n \"package\"\n ]\n },\n {\n \"unified\": \"1F4EB\",\n \"shortnames\": [\n \"mailbox\"\n ]\n },\n {\n \"unified\": \"1F4EA\",\n \"shortnames\": [\n \"mailbox_closed\"\n ]\n },\n {\n \"unified\": \"1F4EC\",\n \"shortnames\": [\n \"mailbox_with_mail\"\n ]\n },\n {\n \"unified\": \"1F4ED\",\n \"shortnames\": [\n \"mailbox_with_no_mail\"\n ]\n },\n {\n \"unified\": \"1F4EE\",\n \"shortnames\": [\n \"postbox\"\n ]\n },\n {\n \"unified\": \"1F5F3-FE0F\",\n \"shortnames\": [\n \"ballot_box_with_ballot\"\n ]\n },\n {\n \"unified\": \"270F-FE0F\",\n \"shortnames\": [\n \"pencil2\"\n ]\n },\n {\n \"unified\": \"2712-FE0F\",\n \"shortnames\": [\n \"black_nib\"\n ]\n },\n {\n \"unified\": \"1F58B-FE0F\",\n \"shortnames\": [\n \"lower_left_fountain_pen\"\n ]\n },\n {\n \"unified\": \"1F58A-FE0F\",\n \"shortnames\": [\n \"lower_left_ballpoint_pen\"\n ]\n },\n {\n \"unified\": \"1F58C-FE0F\",\n \"shortnames\": [\n \"lower_left_paintbrush\"\n ]\n },\n {\n \"unified\": \"1F58D-FE0F\",\n \"shortnames\": [\n \"lower_left_crayon\"\n ]\n },\n {\n \"unified\": \"1F4DD\",\n \"shortnames\": [\n \"memo\"\n ]\n },\n {\n \"unified\": \"1F4BC\",\n \"shortnames\": [\n \"briefcase\"\n ]\n },\n {\n \"unified\": \"1F4C1\",\n \"shortnames\": [\n \"file_folder\"\n ]\n },\n {\n \"unified\": \"1F4C2\",\n \"shortnames\": [\n \"open_file_folder\"\n ]\n },\n {\n \"unified\": \"1F5C2-FE0F\",\n \"shortnames\": [\n \"card_index_dividers\"\n ]\n },\n {\n \"unified\": \"1F4C5\",\n \"shortnames\": [\n \"date\"\n ]\n },\n {\n \"unified\": \"1F4C6\",\n \"shortnames\": [\n \"calendar\"\n ]\n },\n {\n \"unified\": \"1F5D2-FE0F\",\n \"shortnames\": [\n \"spiral_note_pad\"\n ]\n },\n {\n \"unified\": \"1F5D3-FE0F\",\n \"shortnames\": [\n \"spiral_calendar_pad\"\n ]\n },\n {\n \"unified\": \"1F4C7\",\n \"shortnames\": [\n \"card_index\"\n ]\n },\n {\n \"unified\": \"1F4C8\",\n \"shortnames\": [\n \"chart_with_upwards_trend\"\n ]\n },\n {\n \"unified\": \"1F4C9\",\n \"shortnames\": [\n \"chart_with_downwards_trend\"\n ]\n },\n {\n \"unified\": \"1F4CA\",\n \"shortnames\": [\n \"bar_chart\"\n ]\n },\n {\n \"unified\": \"1F4CB\",\n \"shortnames\": [\n \"clipboard\"\n ]\n },\n {\n \"unified\": \"1F4CC\",\n \"shortnames\": [\n \"pushpin\"\n ]\n },\n {\n \"unified\": \"1F4CD\",\n \"shortnames\": [\n \"round_pushpin\"\n ]\n },\n {\n \"unified\": \"1F4CE\",\n \"shortnames\": [\n \"paperclip\"\n ]\n },\n {\n \"unified\": \"1F587-FE0F\",\n \"shortnames\": [\n \"linked_paperclips\"\n ]\n },\n {\n \"unified\": \"1F4CF\",\n \"shortnames\": [\n \"straight_ruler\"\n ]\n },\n {\n \"unified\": \"1F4D0\",\n \"shortnames\": [\n \"triangular_ruler\"\n ]\n },\n {\n \"unified\": \"2702-FE0F\",\n \"shortnames\": [\n \"scissors\"\n ]\n },\n {\n \"unified\": \"1F5C3-FE0F\",\n \"shortnames\": [\n \"card_file_box\"\n ]\n },\n {\n \"unified\": \"1F5C4-FE0F\",\n \"shortnames\": [\n \"file_cabinet\"\n ]\n },\n {\n \"unified\": \"1F5D1-FE0F\",\n \"shortnames\": [\n \"wastebasket\"\n ]\n },\n {\n \"unified\": \"1F512\",\n \"shortnames\": [\n \"lock\"\n ]\n },\n {\n \"unified\": \"1F513\",\n \"shortnames\": [\n \"unlock\"\n ]\n },\n {\n \"unified\": \"1F50F\",\n \"shortnames\": [\n \"lock_with_ink_pen\"\n ]\n },\n {\n \"unified\": \"1F510\",\n \"shortnames\": [\n \"closed_lock_with_key\"\n ]\n },\n {\n \"unified\": \"1F511\",\n \"shortnames\": [\n \"key\"\n ]\n },\n {\n \"unified\": \"1F5DD-FE0F\",\n \"shortnames\": [\n \"old_key\"\n ]\n },\n {\n \"unified\": \"1F528\",\n \"shortnames\": [\n \"hammer\"\n ]\n },\n {\n \"unified\": \"26CF-FE0F\",\n \"shortnames\": [\n \"pick\"\n ]\n },\n {\n \"unified\": \"2692-FE0F\",\n \"shortnames\": [\n \"hammer_and_pick\"\n ]\n },\n {\n \"unified\": \"1F6E0-FE0F\",\n \"shortnames\": [\n \"hammer_and_wrench\"\n ]\n },\n {\n \"unified\": \"1F5E1-FE0F\",\n \"shortnames\": [\n \"dagger_knife\"\n ]\n },\n {\n \"unified\": \"2694-FE0F\",\n \"shortnames\": [\n \"crossed_swords\"\n ]\n },\n {\n \"unified\": \"1F52B\",\n \"shortnames\": [\n \"gun\"\n ]\n },\n {\n \"unified\": \"1F3F9\",\n \"shortnames\": [\n \"bow_and_arrow\"\n ]\n },\n {\n \"unified\": \"1F6E1-FE0F\",\n \"shortnames\": [\n \"shield\"\n ]\n },\n {\n \"unified\": \"1F527\",\n \"shortnames\": [\n \"wrench\"\n ]\n },\n {\n \"unified\": \"1F529\",\n \"shortnames\": [\n \"nut_and_bolt\"\n ]\n },\n {\n \"unified\": \"2699-FE0F\",\n \"shortnames\": [\n \"gear\"\n ]\n },\n {\n \"unified\": \"1F5DC-FE0F\",\n \"shortnames\": [\n \"compression\"\n ]\n },\n {\n \"unified\": \"2697-FE0F\",\n \"shortnames\": [\n \"alembic\"\n ]\n },\n {\n \"unified\": \"2696-FE0F\",\n \"shortnames\": [\n \"scales\"\n ]\n },\n {\n \"unified\": \"1F517\",\n \"shortnames\": [\n \"link\"\n ]\n },\n {\n \"unified\": \"26D3-FE0F\",\n \"shortnames\": [\n \"chains\"\n ]\n },\n {\n \"unified\": \"1F489\",\n \"shortnames\": [\n \"syringe\"\n ]\n },\n {\n \"unified\": \"1F48A\",\n \"shortnames\": [\n \"pill\"\n ]\n },\n {\n \"unified\": \"1F6AC\",\n \"shortnames\": [\n \"smoking\"\n ]\n },\n {\n \"unified\": \"26B0-FE0F\",\n \"shortnames\": [\n \"coffin\"\n ]\n },\n {\n \"unified\": \"26B1-FE0F\",\n \"shortnames\": [\n \"funeral_urn\"\n ]\n },\n {\n \"unified\": \"1F5FF\",\n \"shortnames\": [\n \"moyai\"\n ]\n },\n {\n \"unified\": \"1F6E2-FE0F\",\n \"shortnames\": [\n \"oil_drum\"\n ]\n },\n {\n \"unified\": \"1F52E\",\n \"shortnames\": [\n \"crystal_ball\"\n ]\n },\n {\n \"unified\": \"1F6D2\",\n \"shortnames\": [\n \"shopping_trolley\"\n ]\n }\n ]\n },\n {\n \"name\": \"Symbols\",\n \"emojis\": [\n {\n \"unified\": \"1F3E7\",\n \"shortnames\": [\n \"atm\"\n ]\n },\n {\n \"unified\": \"1F6AE\",\n \"shortnames\": [\n \"put_litter_in_its_place\"\n ]\n },\n {\n \"unified\": \"1F6B0\",\n \"shortnames\": [\n \"potable_water\"\n ]\n },\n {\n \"unified\": \"267F\",\n \"shortnames\": [\n \"wheelchair\"\n ]\n },\n {\n \"unified\": \"1F6B9\",\n \"shortnames\": [\n \"mens\"\n ]\n },\n {\n \"unified\": \"1F6BA\",\n \"shortnames\": [\n \"womens\"\n ]\n },\n {\n \"unified\": \"1F6BB\",\n \"shortnames\": [\n \"restroom\"\n ]\n },\n {\n \"unified\": \"1F6BC\",\n \"shortnames\": [\n \"baby_symbol\"\n ]\n },\n {\n \"unified\": \"1F6BE\",\n \"shortnames\": [\n \"wc\"\n ]\n },\n {\n \"unified\": \"1F6C2\",\n \"shortnames\": [\n \"passport_control\"\n ]\n },\n {\n \"unified\": \"1F6C3\",\n \"shortnames\": [\n \"customs\"\n ]\n },\n {\n \"unified\": \"1F6C4\",\n \"shortnames\": [\n \"baggage_claim\"\n ]\n },\n {\n \"unified\": \"1F6C5\",\n \"shortnames\": [\n \"left_luggage\"\n ]\n },\n {\n \"unified\": \"26A0-FE0F\",\n \"shortnames\": [\n \"warning\"\n ]\n },\n {\n \"unified\": \"1F6B8\",\n \"shortnames\": [\n \"children_crossing\"\n ]\n },\n {\n \"unified\": \"26D4\",\n \"shortnames\": [\n \"no_entry\"\n ]\n },\n {\n \"unified\": \"1F6AB\",\n \"shortnames\": [\n \"no_entry_sign\"\n ]\n },\n {\n \"unified\": \"1F6B3\",\n \"shortnames\": [\n \"no_bicycles\"\n ]\n },\n {\n \"unified\": \"1F6AD\",\n \"shortnames\": [\n \"no_smoking\"\n ]\n },\n {\n \"unified\": \"1F6AF\",\n \"shortnames\": [\n \"do_not_litter\"\n ]\n },\n {\n \"unified\": \"1F6B1\",\n \"shortnames\": [\n \"non-potable_water\"\n ]\n },\n {\n \"unified\": \"1F6B7\",\n \"shortnames\": [\n \"no_pedestrians\"\n ]\n },\n {\n \"unified\": \"1F4F5\",\n \"shortnames\": [\n \"no_mobile_phones\"\n ]\n },\n {\n \"unified\": \"1F51E\",\n \"shortnames\": [\n \"underage\"\n ]\n },\n {\n \"unified\": \"2622-FE0F\",\n \"shortnames\": [\n \"radioactive_sign\"\n ]\n },\n {\n \"unified\": \"2623-FE0F\",\n \"shortnames\": [\n \"biohazard_sign\"\n ]\n },\n {\n \"unified\": \"2B06-FE0F\",\n \"shortnames\": [\n \"arrow_up\"\n ]\n },\n {\n \"unified\": \"2197-FE0F\",\n \"shortnames\": [\n \"arrow_upper_right\"\n ]\n },\n {\n \"unified\": \"27A1-FE0F\",\n \"shortnames\": [\n \"arrow_right\"\n ]\n },\n {\n \"unified\": \"2198-FE0F\",\n \"shortnames\": [\n \"arrow_lower_right\"\n ]\n },\n {\n \"unified\": \"2B07-FE0F\",\n \"shortnames\": [\n \"arrow_down\"\n ]\n },\n {\n \"unified\": \"2199-FE0F\",\n \"shortnames\": [\n \"arrow_lower_left\"\n ]\n },\n {\n \"unified\": \"2B05-FE0F\",\n \"shortnames\": [\n \"arrow_left\"\n ]\n },\n {\n \"unified\": \"2196-FE0F\",\n \"shortnames\": [\n \"arrow_upper_left\"\n ]\n },\n {\n \"unified\": \"2195-FE0F\",\n \"shortnames\": [\n \"arrow_up_down\"\n ]\n },\n {\n \"unified\": \"2194-FE0F\",\n \"shortnames\": [\n \"left_right_arrow\"\n ]\n },\n {\n \"unified\": \"21A9-FE0F\",\n \"shortnames\": [\n \"leftwards_arrow_with_hook\"\n ]\n },\n {\n \"unified\": \"21AA-FE0F\",\n \"shortnames\": [\n \"arrow_right_hook\"\n ]\n },\n {\n \"unified\": \"2934-FE0F\",\n \"shortnames\": [\n \"arrow_heading_up\"\n ]\n },\n {\n \"unified\": \"2935-FE0F\",\n \"shortnames\": [\n \"arrow_heading_down\"\n ]\n },\n {\n \"unified\": \"1F503\",\n \"shortnames\": [\n \"arrows_clockwise\"\n ]\n },\n {\n \"unified\": \"1F504\",\n \"shortnames\": [\n \"arrows_counterclockwise\"\n ]\n },\n {\n \"unified\": \"1F519\",\n \"shortnames\": [\n \"back\"\n ]\n },\n {\n \"unified\": \"1F51A\",\n \"shortnames\": [\n \"end\"\n ]\n },\n {\n \"unified\": \"1F51B\",\n \"shortnames\": [\n \"on\"\n ]\n },\n {\n \"unified\": \"1F51C\",\n \"shortnames\": [\n \"soon\"\n ]\n },\n {\n \"unified\": \"1F51D\",\n \"shortnames\": [\n \"top\"\n ]\n },\n {\n \"unified\": \"1F6D0\",\n \"shortnames\": [\n \"place_of_worship\"\n ]\n },\n {\n \"unified\": \"269B-FE0F\",\n \"shortnames\": [\n \"atom_symbol\"\n ]\n },\n {\n \"unified\": \"1F549-FE0F\",\n \"shortnames\": [\n \"om_symbol\"\n ]\n },\n {\n \"unified\": \"2721-FE0F\",\n \"shortnames\": [\n \"star_of_david\"\n ]\n },\n {\n \"unified\": \"2638-FE0F\",\n \"shortnames\": [\n \"wheel_of_dharma\"\n ]\n },\n {\n \"unified\": \"262F-FE0F\",\n \"shortnames\": [\n \"yin_yang\"\n ]\n },\n {\n \"unified\": \"271D-FE0F\",\n \"shortnames\": [\n \"latin_cross\"\n ]\n },\n {\n \"unified\": \"2626-FE0F\",\n \"shortnames\": [\n \"orthodox_cross\"\n ]\n },\n {\n \"unified\": \"262A-FE0F\",\n \"shortnames\": [\n \"star_and_crescent\"\n ]\n },\n {\n \"unified\": \"262E-FE0F\",\n \"shortnames\": [\n \"peace_symbol\"\n ]\n },\n {\n \"unified\": \"1F54E\",\n \"shortnames\": [\n \"menorah_with_nine_branches\"\n ]\n },\n {\n \"unified\": \"1F52F\",\n \"shortnames\": [\n \"six_pointed_star\"\n ]\n },\n {\n \"unified\": \"2648\",\n \"shortnames\": [\n \"aries\"\n ]\n },\n {\n \"unified\": \"2649\",\n \"shortnames\": [\n \"taurus\"\n ]\n },\n {\n \"unified\": \"264A\",\n \"shortnames\": [\n \"gemini\"\n ]\n },\n {\n \"unified\": \"264B\",\n \"shortnames\": [\n \"cancer\"\n ]\n },\n {\n \"unified\": \"264C\",\n \"shortnames\": [\n \"leo\"\n ]\n },\n {\n \"unified\": \"264D\",\n \"shortnames\": [\n \"virgo\"\n ]\n },\n {\n \"unified\": \"264E\",\n \"shortnames\": [\n \"libra\"\n ]\n },\n {\n \"unified\": \"264F\",\n \"shortnames\": [\n \"scorpius\"\n ]\n },\n {\n \"unified\": \"2650\",\n \"shortnames\": [\n \"sagittarius\"\n ]\n },\n {\n \"unified\": \"2651\",\n \"shortnames\": [\n \"capricorn\"\n ]\n },\n {\n \"unified\": \"2652\",\n \"shortnames\": [\n \"aquarius\"\n ]\n },\n {\n \"unified\": \"2653\",\n \"shortnames\": [\n \"pisces\"\n ]\n },\n {\n \"unified\": \"26CE\",\n \"shortnames\": [\n \"ophiuchus\"\n ]\n },\n {\n \"unified\": \"1F500\",\n \"shortnames\": [\n \"twisted_rightwards_arrows\"\n ]\n },\n {\n \"unified\": \"1F501\",\n \"shortnames\": [\n \"repeat\"\n ]\n },\n {\n \"unified\": \"1F502\",\n \"shortnames\": [\n \"repeat_one\"\n ]\n },\n {\n \"unified\": \"25B6-FE0F\",\n \"shortnames\": [\n \"arrow_forward\"\n ]\n },\n {\n \"unified\": \"23E9\",\n \"shortnames\": [\n \"fast_forward\"\n ]\n },\n {\n \"unified\": \"23ED-FE0F\",\n \"shortnames\": [\n \"black_right_pointing_double_triangle_with_vertical_bar\"\n ]\n },\n {\n \"unified\": \"23EF-FE0F\",\n \"shortnames\": [\n \"black_right_pointing_triangle_with_double_vertical_bar\"\n ]\n },\n {\n \"unified\": \"25C0-FE0F\",\n \"shortnames\": [\n \"arrow_backward\"\n ]\n },\n {\n \"unified\": \"23EA\",\n \"shortnames\": [\n \"rewind\"\n ]\n },\n {\n \"unified\": \"23EE-FE0F\",\n \"shortnames\": [\n \"black_left_pointing_double_triangle_with_vertical_bar\"\n ]\n },\n {\n \"unified\": \"1F53C\",\n \"shortnames\": [\n \"arrow_up_small\"\n ]\n },\n {\n \"unified\": \"23EB\",\n \"shortnames\": [\n \"arrow_double_up\"\n ]\n },\n {\n \"unified\": \"1F53D\",\n \"shortnames\": [\n \"arrow_down_small\"\n ]\n },\n {\n \"unified\": \"23EC\",\n \"shortnames\": [\n \"arrow_double_down\"\n ]\n },\n {\n \"unified\": \"23F8-FE0F\",\n \"shortnames\": [\n \"double_vertical_bar\"\n ]\n },\n {\n \"unified\": \"23F9-FE0F\",\n \"shortnames\": [\n \"black_square_for_stop\"\n ]\n },\n {\n \"unified\": \"23FA-FE0F\",\n \"shortnames\": [\n \"black_circle_for_record\"\n ]\n },\n {\n \"unified\": \"23CF-FE0F\",\n \"shortnames\": [\n \"eject\"\n ]\n },\n {\n \"unified\": \"1F3A6\",\n \"shortnames\": [\n \"cinema\"\n ]\n },\n {\n \"unified\": \"1F505\",\n \"shortnames\": [\n \"low_brightness\"\n ]\n },\n {\n \"unified\": \"1F506\",\n \"shortnames\": [\n \"high_brightness\"\n ]\n },\n {\n \"unified\": \"1F4F6\",\n \"shortnames\": [\n \"signal_strength\"\n ]\n },\n {\n \"unified\": \"1F4F3\",\n \"shortnames\": [\n \"vibration_mode\"\n ]\n },\n {\n \"unified\": \"1F4F4\",\n \"shortnames\": [\n \"mobile_phone_off\"\n ]\n },\n {\n \"unified\": \"2640-FE0F\",\n \"shortnames\": [\n \"female_sign\"\n ]\n },\n {\n \"unified\": \"2642-FE0F\",\n \"shortnames\": [\n \"male_sign\"\n ]\n },\n {\n \"unified\": \"2695-FE0F\",\n \"shortnames\": [\n \"medical_symbol\"\n ]\n },\n {\n \"unified\": \"267B-FE0F\",\n \"shortnames\": [\n \"recycle\"\n ]\n },\n {\n \"unified\": \"269C-FE0F\",\n \"shortnames\": [\n \"fleur_de_lis\"\n ]\n },\n {\n \"unified\": \"1F531\",\n \"shortnames\": [\n \"trident\"\n ]\n },\n {\n \"unified\": \"1F4DB\",\n \"shortnames\": [\n \"name_badge\"\n ]\n },\n {\n \"unified\": \"1F530\",\n \"shortnames\": [\n \"beginner\"\n ]\n },\n {\n \"unified\": \"2B55\",\n \"shortnames\": [\n \"o\"\n ]\n },\n {\n \"unified\": \"2705\",\n \"shortnames\": [\n \"white_check_mark\"\n ]\n },\n {\n \"unified\": \"2611-FE0F\",\n \"shortnames\": [\n \"ballot_box_with_check\"\n ]\n },\n {\n \"unified\": \"2714-FE0F\",\n \"shortnames\": [\n \"heavy_check_mark\"\n ]\n },\n {\n \"unified\": \"2716-FE0F\",\n \"shortnames\": [\n \"heavy_multiplication_x\"\n ]\n },\n {\n \"unified\": \"274C\",\n \"shortnames\": [\n \"x\"\n ]\n },\n {\n \"unified\": \"274E\",\n \"shortnames\": [\n \"negative_squared_cross_mark\"\n ]\n },\n {\n \"unified\": \"2795\",\n \"shortnames\": [\n \"heavy_plus_sign\"\n ]\n },\n {\n \"unified\": \"2796\",\n \"shortnames\": [\n \"heavy_minus_sign\"\n ]\n },\n {\n \"unified\": \"2797\",\n \"shortnames\": [\n \"heavy_division_sign\"\n ]\n },\n {\n \"unified\": \"27B0\",\n \"shortnames\": [\n \"curly_loop\"\n ]\n },\n {\n \"unified\": \"27BF\",\n \"shortnames\": [\n \"loop\"\n ]\n },\n {\n \"unified\": \"303D-FE0F\",\n \"shortnames\": [\n \"part_alternation_mark\"\n ]\n },\n {\n \"unified\": \"2733-FE0F\",\n \"shortnames\": [\n \"eight_spoked_asterisk\"\n ]\n },\n {\n \"unified\": \"2734-FE0F\",\n \"shortnames\": [\n \"eight_pointed_black_star\"\n ]\n },\n {\n \"unified\": \"2747-FE0F\",\n \"shortnames\": [\n \"sparkle\"\n ]\n },\n {\n \"unified\": \"203C-FE0F\",\n \"shortnames\": [\n \"bangbang\"\n ]\n },\n {\n \"unified\": \"2049-FE0F\",\n \"shortnames\": [\n \"interrobang\"\n ]\n },\n {\n \"unified\": \"2753\",\n \"shortnames\": [\n \"question\"\n ]\n },\n {\n \"unified\": \"2754\",\n \"shortnames\": [\n \"grey_question\"\n ]\n },\n {\n \"unified\": \"2755\",\n \"shortnames\": [\n \"grey_exclamation\"\n ]\n },\n {\n \"unified\": \"2757\",\n \"shortnames\": [\n \"exclamation\"\n ]\n },\n {\n \"unified\": \"3030-FE0F\",\n \"shortnames\": [\n \"wavy_dash\"\n ]\n },\n {\n \"unified\": \"00A9-FE0F\",\n \"shortnames\": [\n \"copyright\"\n ]\n },\n {\n \"unified\": \"00AE-FE0F\",\n \"shortnames\": [\n \"registered\"\n ]\n },\n {\n \"unified\": \"2122-FE0F\",\n \"shortnames\": [\n \"tm\"\n ]\n },\n {\n \"unified\": \"0023-FE0F-20E3\",\n \"shortnames\": [\n \"hash\"\n ]\n },\n {\n \"unified\": \"002A-FE0F-20E3\",\n \"shortnames\": [\n \"keycap_star\"\n ]\n },\n {\n \"unified\": \"0030-FE0F-20E3\",\n \"shortnames\": [\n \"zero\"\n ]\n },\n {\n \"unified\": \"0031-FE0F-20E3\",\n \"shortnames\": [\n \"one\"\n ]\n },\n {\n \"unified\": \"0032-FE0F-20E3\",\n \"shortnames\": [\n \"two\"\n ]\n },\n {\n \"unified\": \"0033-FE0F-20E3\",\n \"shortnames\": [\n \"three\"\n ]\n },\n {\n \"unified\": \"0034-FE0F-20E3\",\n \"shortnames\": [\n \"four\"\n ]\n },\n {\n \"unified\": \"0035-FE0F-20E3\",\n \"shortnames\": [\n \"five\"\n ]\n },\n {\n \"unified\": \"0036-FE0F-20E3\",\n \"shortnames\": [\n \"six\"\n ]\n },\n {\n \"unified\": \"0037-FE0F-20E3\",\n \"shortnames\": [\n \"seven\"\n ]\n },\n {\n \"unified\": \"0038-FE0F-20E3\",\n \"shortnames\": [\n \"eight\"\n ]\n },\n {\n \"unified\": \"0039-FE0F-20E3\",\n \"shortnames\": [\n \"nine\"\n ]\n },\n {\n \"unified\": \"1F51F\",\n \"shortnames\": [\n \"keycap_ten\"\n ]\n },\n {\n \"unified\": \"1F4AF\",\n \"shortnames\": [\n \"100\"\n ]\n },\n {\n \"unified\": \"1F520\",\n \"shortnames\": [\n \"capital_abcd\"\n ]\n },\n {\n \"unified\": \"1F521\",\n \"shortnames\": [\n \"abcd\"\n ]\n },\n {\n \"unified\": \"1F522\",\n \"shortnames\": [\n \"1234\"\n ]\n },\n {\n \"unified\": \"1F523\",\n \"shortnames\": [\n \"symbols\"\n ]\n },\n {\n \"unified\": \"1F524\",\n \"shortnames\": [\n \"abc\"\n ]\n },\n {\n \"unified\": \"1F170-FE0F\",\n \"shortnames\": [\n \"a\"\n ]\n },\n {\n \"unified\": \"1F18E\",\n \"shortnames\": [\n \"ab\"\n ]\n },\n {\n \"unified\": \"1F171-FE0F\",\n \"shortnames\": [\n \"b\"\n ]\n },\n {\n \"unified\": \"1F191\",\n \"shortnames\": [\n \"cl\"\n ]\n },\n {\n \"unified\": \"1F192\",\n \"shortnames\": [\n \"cool\"\n ]\n },\n {\n \"unified\": \"1F193\",\n \"shortnames\": [\n \"free\"\n ]\n },\n {\n \"unified\": \"2139-FE0F\",\n \"shortnames\": [\n \"information_source\"\n ]\n },\n {\n \"unified\": \"1F194\",\n \"shortnames\": [\n \"id\"\n ]\n },\n {\n \"unified\": \"24C2-FE0F\",\n \"shortnames\": [\n \"m\"\n ]\n },\n {\n \"unified\": \"1F195\",\n \"shortnames\": [\n \"new\"\n ]\n },\n {\n \"unified\": \"1F196\",\n \"shortnames\": [\n \"ng\"\n ]\n },\n {\n \"unified\": \"1F17E-FE0F\",\n \"shortnames\": [\n \"o2\"\n ]\n },\n {\n \"unified\": \"1F197\",\n \"shortnames\": [\n \"ok\"\n ]\n },\n {\n \"unified\": \"1F17F-FE0F\",\n \"shortnames\": [\n \"parking\"\n ]\n },\n {\n \"unified\": \"1F198\",\n \"shortnames\": [\n \"sos\"\n ]\n },\n {\n \"unified\": \"1F199\",\n \"shortnames\": [\n \"up\"\n ]\n },\n {\n \"unified\": \"1F19A\",\n \"shortnames\": [\n \"vs\"\n ]\n },\n {\n \"unified\": \"1F201\",\n \"shortnames\": [\n \"koko\"\n ]\n },\n {\n \"unified\": \"1F202-FE0F\",\n \"shortnames\": [\n \"sa\"\n ]\n },\n {\n \"unified\": \"1F237-FE0F\",\n \"shortnames\": [\n \"u6708\"\n ]\n },\n {\n \"unified\": \"1F236\",\n \"shortnames\": [\n \"u6709\"\n ]\n },\n {\n \"unified\": \"1F22F\",\n \"shortnames\": [\n \"u6307\"\n ]\n },\n {\n \"unified\": \"1F250\",\n \"shortnames\": [\n \"ideograph_advantage\"\n ]\n },\n {\n \"unified\": \"1F239\",\n \"shortnames\": [\n \"u5272\"\n ]\n },\n {\n \"unified\": \"1F21A\",\n \"shortnames\": [\n \"u7121\"\n ]\n },\n {\n \"unified\": \"1F232\",\n \"shortnames\": [\n \"u7981\"\n ]\n },\n {\n \"unified\": \"1F251\",\n \"shortnames\": [\n \"accept\"\n ]\n },\n {\n \"unified\": \"1F238\",\n \"shortnames\": [\n \"u7533\"\n ]\n },\n {\n \"unified\": \"1F234\",\n \"shortnames\": [\n \"u5408\"\n ]\n },\n {\n \"unified\": \"1F233\",\n \"shortnames\": [\n \"u7a7a\"\n ]\n },\n {\n \"unified\": \"3297-FE0F\",\n \"shortnames\": [\n \"congratulations\"\n ]\n },\n {\n \"unified\": \"3299-FE0F\",\n \"shortnames\": [\n \"secret\"\n ]\n },\n {\n \"unified\": \"1F23A\",\n \"shortnames\": [\n \"u55b6\"\n ]\n },\n {\n \"unified\": \"1F235\",\n \"shortnames\": [\n \"u6e80\"\n ]\n },\n {\n \"unified\": \"25AA-FE0F\",\n \"shortnames\": [\n \"black_small_square\"\n ]\n },\n {\n \"unified\": \"25AB-FE0F\",\n \"shortnames\": [\n \"white_small_square\"\n ]\n },\n {\n \"unified\": \"25FB-FE0F\",\n \"shortnames\": [\n \"white_medium_square\"\n ]\n },\n {\n \"unified\": \"25FC-FE0F\",\n \"shortnames\": [\n \"black_medium_square\"\n ]\n },\n {\n \"unified\": \"25FD\",\n \"shortnames\": [\n \"white_medium_small_square\"\n ]\n },\n {\n \"unified\": \"25FE\",\n \"shortnames\": [\n \"black_medium_small_square\"\n ]\n },\n {\n \"unified\": \"2B1B\",\n \"shortnames\": [\n \"black_large_square\"\n ]\n },\n {\n \"unified\": \"2B1C\",\n \"shortnames\": [\n \"white_large_square\"\n ]\n },\n {\n \"unified\": \"1F536\",\n \"shortnames\": [\n \"large_orange_diamond\"\n ]\n },\n {\n \"unified\": \"1F537\",\n \"shortnames\": [\n \"large_blue_diamond\"\n ]\n },\n {\n \"unified\": \"1F538\",\n \"shortnames\": [\n \"small_orange_diamond\"\n ]\n },\n {\n \"unified\": \"1F539\",\n \"shortnames\": [\n \"small_blue_diamond\"\n ]\n },\n {\n \"unified\": \"1F53A\",\n \"shortnames\": [\n \"small_red_triangle\"\n ]\n },\n {\n \"unified\": \"1F53B\",\n \"shortnames\": [\n \"small_red_triangle_down\"\n ]\n },\n {\n \"unified\": \"1F4A0\",\n \"shortnames\": [\n \"diamond_shape_with_a_dot_inside\"\n ]\n },\n {\n \"unified\": \"1F518\",\n \"shortnames\": [\n \"radio_button\"\n ]\n },\n {\n \"unified\": \"1F532\",\n \"shortnames\": [\n \"black_square_button\"\n ]\n },\n {\n \"unified\": \"1F533\",\n \"shortnames\": [\n \"white_square_button\"\n ]\n },\n {\n \"unified\": \"26AA\",\n \"shortnames\": [\n \"white_circle\"\n ]\n },\n {\n \"unified\": \"26AB\",\n \"shortnames\": [\n \"black_circle\"\n ]\n },\n {\n \"unified\": \"1F534\",\n \"shortnames\": [\n \"red_circle\"\n ]\n },\n {\n \"unified\": \"1F535\",\n \"shortnames\": [\n \"large_blue_circle\"\n ]\n }\n ]\n },\n {\n \"name\": \"Flags\",\n \"emojis\": [\n {\n \"unified\": \"1F3C1\",\n \"shortnames\": [\n \"checkered_flag\"\n ]\n },\n {\n \"unified\": \"1F6A9\",\n \"shortnames\": [\n \"triangular_flag_on_post\"\n ]\n },\n {\n \"unified\": \"1F38C\",\n \"shortnames\": [\n \"crossed_flags\"\n ]\n },\n {\n \"unified\": \"1F3F4\",\n \"shortnames\": [\n \"waving_black_flag\"\n ]\n },\n {\n \"unified\": \"1F3F3-FE0F\",\n \"shortnames\": [\n \"waving_white_flag\"\n ]\n },\n {\n \"unified\": \"1F3F3-FE0F-200D-1F308\",\n \"shortnames\": [\n \"rainbow-flag\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1E8\",\n \"shortnames\": [\n \"flag-ac\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1E9\",\n \"shortnames\": [\n \"flag-ad\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EA\",\n \"shortnames\": [\n \"flag-ae\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EB\",\n \"shortnames\": [\n \"flag-af\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EC\",\n \"shortnames\": [\n \"flag-ag\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EE\",\n \"shortnames\": [\n \"flag-ai\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F1\",\n \"shortnames\": [\n \"flag-al\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F2\",\n \"shortnames\": [\n \"flag-am\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F4\",\n \"shortnames\": [\n \"flag-ao\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F6\",\n \"shortnames\": [\n \"flag-aq\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F7\",\n \"shortnames\": [\n \"flag-ar\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F8\",\n \"shortnames\": [\n \"flag-as\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F9\",\n \"shortnames\": [\n \"flag-at\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FA\",\n \"shortnames\": [\n \"flag-au\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FC\",\n \"shortnames\": [\n \"flag-aw\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FD\",\n \"shortnames\": [\n \"flag-ax\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FF\",\n \"shortnames\": [\n \"flag-az\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E6\",\n \"shortnames\": [\n \"flag-ba\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E7\",\n \"shortnames\": [\n \"flag-bb\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E9\",\n \"shortnames\": [\n \"flag-bd\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EA\",\n \"shortnames\": [\n \"flag-be\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EB\",\n \"shortnames\": [\n \"flag-bf\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EC\",\n \"shortnames\": [\n \"flag-bg\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1ED\",\n \"shortnames\": [\n \"flag-bh\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EE\",\n \"shortnames\": [\n \"flag-bi\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EF\",\n \"shortnames\": [\n \"flag-bj\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F1\",\n \"shortnames\": [\n \"flag-bl\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F2\",\n \"shortnames\": [\n \"flag-bm\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F3\",\n \"shortnames\": [\n \"flag-bn\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F4\",\n \"shortnames\": [\n \"flag-bo\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F6\",\n \"shortnames\": [\n \"flag-bq\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F7\",\n \"shortnames\": [\n \"flag-br\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F8\",\n \"shortnames\": [\n \"flag-bs\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F9\",\n \"shortnames\": [\n \"flag-bt\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FB\",\n \"shortnames\": [\n \"flag-bv\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FC\",\n \"shortnames\": [\n \"flag-bw\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FE\",\n \"shortnames\": [\n \"flag-by\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FF\",\n \"shortnames\": [\n \"flag-bz\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E6\",\n \"shortnames\": [\n \"flag-ca\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E8\",\n \"shortnames\": [\n \"flag-cc\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E9\",\n \"shortnames\": [\n \"flag-cd\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EB\",\n \"shortnames\": [\n \"flag-cf\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EC\",\n \"shortnames\": [\n \"flag-cg\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1ED\",\n \"shortnames\": [\n \"flag-ch\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EE\",\n \"shortnames\": [\n \"flag-ci\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F0\",\n \"shortnames\": [\n \"flag-ck\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F1\",\n \"shortnames\": [\n \"flag-cl\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F2\",\n \"shortnames\": [\n \"flag-cm\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F3\",\n \"shortnames\": [\n \"cn\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F4\",\n \"shortnames\": [\n \"flag-co\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F5\",\n \"shortnames\": [\n \"flag-cp\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F7\",\n \"shortnames\": [\n \"flag-cr\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FA\",\n \"shortnames\": [\n \"flag-cu\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FB\",\n \"shortnames\": [\n \"flag-cv\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FC\",\n \"shortnames\": [\n \"flag-cw\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FD\",\n \"shortnames\": [\n \"flag-cx\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FE\",\n \"shortnames\": [\n \"flag-cy\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FF\",\n \"shortnames\": [\n \"flag-cz\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EA\",\n \"shortnames\": [\n \"de\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EC\",\n \"shortnames\": [\n \"flag-dg\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EF\",\n \"shortnames\": [\n \"flag-dj\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F0\",\n \"shortnames\": [\n \"flag-dk\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F2\",\n \"shortnames\": [\n \"flag-dm\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F4\",\n \"shortnames\": [\n \"flag-do\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1FF\",\n \"shortnames\": [\n \"flag-dz\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1E6\",\n \"shortnames\": [\n \"flag-ea\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1E8\",\n \"shortnames\": [\n \"flag-ec\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1EA\",\n \"shortnames\": [\n \"flag-ee\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1EC\",\n \"shortnames\": [\n \"flag-eg\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1ED\",\n \"shortnames\": [\n \"flag-eh\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F7\",\n \"shortnames\": [\n \"flag-er\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F8\",\n \"shortnames\": [\n \"es\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F9\",\n \"shortnames\": [\n \"flag-et\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1FA\",\n \"shortnames\": [\n \"flag-eu\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1EE\",\n \"shortnames\": [\n \"flag-fi\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1EF\",\n \"shortnames\": [\n \"flag-fj\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F0\",\n \"shortnames\": [\n \"flag-fk\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F2\",\n \"shortnames\": [\n \"flag-fm\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F4\",\n \"shortnames\": [\n \"flag-fo\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F7\",\n \"shortnames\": [\n \"fr\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E6\",\n \"shortnames\": [\n \"flag-ga\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E7\",\n \"shortnames\": [\n \"gb\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E9\",\n \"shortnames\": [\n \"flag-gd\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EA\",\n \"shortnames\": [\n \"flag-ge\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EB\",\n \"shortnames\": [\n \"flag-gf\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EC\",\n \"shortnames\": [\n \"flag-gg\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1ED\",\n \"shortnames\": [\n \"flag-gh\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EE\",\n \"shortnames\": [\n \"flag-gi\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F1\",\n \"shortnames\": [\n \"flag-gl\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F2\",\n \"shortnames\": [\n \"flag-gm\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F3\",\n \"shortnames\": [\n \"flag-gn\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F5\",\n \"shortnames\": [\n \"flag-gp\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F6\",\n \"shortnames\": [\n \"flag-gq\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F7\",\n \"shortnames\": [\n \"flag-gr\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F8\",\n \"shortnames\": [\n \"flag-gs\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F9\",\n \"shortnames\": [\n \"flag-gt\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FA\",\n \"shortnames\": [\n \"flag-gu\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FC\",\n \"shortnames\": [\n \"flag-gw\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FE\",\n \"shortnames\": [\n \"flag-gy\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F0\",\n \"shortnames\": [\n \"flag-hk\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F2\",\n \"shortnames\": [\n \"flag-hm\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F3\",\n \"shortnames\": [\n \"flag-hn\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F7\",\n \"shortnames\": [\n \"flag-hr\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F9\",\n \"shortnames\": [\n \"flag-ht\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1FA\",\n \"shortnames\": [\n \"flag-hu\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1E8\",\n \"shortnames\": [\n \"flag-ic\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1E9\",\n \"shortnames\": [\n \"flag-id\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1EA\",\n \"shortnames\": [\n \"flag-ie\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F1\",\n \"shortnames\": [\n \"flag-il\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F2\",\n \"shortnames\": [\n \"flag-im\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F3\",\n \"shortnames\": [\n \"flag-in\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F4\",\n \"shortnames\": [\n \"flag-io\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F6\",\n \"shortnames\": [\n \"flag-iq\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F7\",\n \"shortnames\": [\n \"flag-ir\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F8\",\n \"shortnames\": [\n \"flag-is\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F9\",\n \"shortnames\": [\n \"it\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1EA\",\n \"shortnames\": [\n \"flag-je\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F2\",\n \"shortnames\": [\n \"flag-jm\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F4\",\n \"shortnames\": [\n \"flag-jo\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F5\",\n \"shortnames\": [\n \"jp\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EA\",\n \"shortnames\": [\n \"flag-ke\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EC\",\n \"shortnames\": [\n \"flag-kg\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1ED\",\n \"shortnames\": [\n \"flag-kh\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EE\",\n \"shortnames\": [\n \"flag-ki\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F2\",\n \"shortnames\": [\n \"flag-km\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F3\",\n \"shortnames\": [\n \"flag-kn\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F5\",\n \"shortnames\": [\n \"flag-kp\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F7\",\n \"shortnames\": [\n \"kr\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FC\",\n \"shortnames\": [\n \"flag-kw\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FE\",\n \"shortnames\": [\n \"flag-ky\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FF\",\n \"shortnames\": [\n \"flag-kz\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E6\",\n \"shortnames\": [\n \"flag-la\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E7\",\n \"shortnames\": [\n \"flag-lb\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E8\",\n \"shortnames\": [\n \"flag-lc\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1EE\",\n \"shortnames\": [\n \"flag-li\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F0\",\n \"shortnames\": [\n \"flag-lk\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F7\",\n \"shortnames\": [\n \"flag-lr\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F8\",\n \"shortnames\": [\n \"flag-ls\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F9\",\n \"shortnames\": [\n \"flag-lt\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FA\",\n \"shortnames\": [\n \"flag-lu\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FB\",\n \"shortnames\": [\n \"flag-lv\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FE\",\n \"shortnames\": [\n \"flag-ly\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E6\",\n \"shortnames\": [\n \"flag-ma\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E8\",\n \"shortnames\": [\n \"flag-mc\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E9\",\n \"shortnames\": [\n \"flag-md\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EA\",\n \"shortnames\": [\n \"flag-me\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EB\",\n \"shortnames\": [\n \"flag-mf\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EC\",\n \"shortnames\": [\n \"flag-mg\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1ED\",\n \"shortnames\": [\n \"flag-mh\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F0\",\n \"shortnames\": [\n \"flag-mk\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F1\",\n \"shortnames\": [\n \"flag-ml\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F2\",\n \"shortnames\": [\n \"flag-mm\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F3\",\n \"shortnames\": [\n \"flag-mn\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F4\",\n \"shortnames\": [\n \"flag-mo\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F5\",\n \"shortnames\": [\n \"flag-mp\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F6\",\n \"shortnames\": [\n \"flag-mq\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F7\",\n \"shortnames\": [\n \"flag-mr\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F8\",\n \"shortnames\": [\n \"flag-ms\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F9\",\n \"shortnames\": [\n \"flag-mt\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FA\",\n \"shortnames\": [\n \"flag-mu\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FB\",\n \"shortnames\": [\n \"flag-mv\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FC\",\n \"shortnames\": [\n \"flag-mw\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FD\",\n \"shortnames\": [\n \"flag-mx\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FE\",\n \"shortnames\": [\n \"flag-my\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FF\",\n \"shortnames\": [\n \"flag-mz\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1E6\",\n \"shortnames\": [\n \"flag-na\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1E8\",\n \"shortnames\": [\n \"flag-nc\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EA\",\n \"shortnames\": [\n \"flag-ne\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EB\",\n \"shortnames\": [\n \"flag-nf\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EC\",\n \"shortnames\": [\n \"flag-ng\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EE\",\n \"shortnames\": [\n \"flag-ni\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F1\",\n \"shortnames\": [\n \"flag-nl\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F4\",\n \"shortnames\": [\n \"flag-no\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F5\",\n \"shortnames\": [\n \"flag-np\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F7\",\n \"shortnames\": [\n \"flag-nr\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1FA\",\n \"shortnames\": [\n \"flag-nu\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1FF\",\n \"shortnames\": [\n \"flag-nz\"\n ]\n },\n {\n \"unified\": \"1F1F4-1F1F2\",\n \"shortnames\": [\n \"flag-om\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1E6\",\n \"shortnames\": [\n \"flag-pa\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EA\",\n \"shortnames\": [\n \"flag-pe\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EB\",\n \"shortnames\": [\n \"flag-pf\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EC\",\n \"shortnames\": [\n \"flag-pg\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1ED\",\n \"shortnames\": [\n \"flag-ph\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F0\",\n \"shortnames\": [\n \"flag-pk\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F1\",\n \"shortnames\": [\n \"flag-pl\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F2\",\n \"shortnames\": [\n \"flag-pm\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F3\",\n \"shortnames\": [\n \"flag-pn\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F7\",\n \"shortnames\": [\n \"flag-pr\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F8\",\n \"shortnames\": [\n \"flag-ps\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F9\",\n \"shortnames\": [\n \"flag-pt\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1FC\",\n \"shortnames\": [\n \"flag-pw\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1FE\",\n \"shortnames\": [\n \"flag-py\"\n ]\n },\n {\n \"unified\": \"1F1F6-1F1E6\",\n \"shortnames\": [\n \"flag-qa\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1EA\",\n \"shortnames\": [\n \"flag-re\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1F4\",\n \"shortnames\": [\n \"flag-ro\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1F8\",\n \"shortnames\": [\n \"flag-rs\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1FA\",\n \"shortnames\": [\n \"ru\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1FC\",\n \"shortnames\": [\n \"flag-rw\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E6\",\n \"shortnames\": [\n \"flag-sa\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E7\",\n \"shortnames\": [\n \"flag-sb\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E8\",\n \"shortnames\": [\n \"flag-sc\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E9\",\n \"shortnames\": [\n \"flag-sd\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EA\",\n \"shortnames\": [\n \"flag-se\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EC\",\n \"shortnames\": [\n \"flag-sg\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1ED\",\n \"shortnames\": [\n \"flag-sh\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EE\",\n \"shortnames\": [\n \"flag-si\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EF\",\n \"shortnames\": [\n \"flag-sj\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F0\",\n \"shortnames\": [\n \"flag-sk\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F1\",\n \"shortnames\": [\n \"flag-sl\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F2\",\n \"shortnames\": [\n \"flag-sm\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F3\",\n \"shortnames\": [\n \"flag-sn\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F4\",\n \"shortnames\": [\n \"flag-so\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F7\",\n \"shortnames\": [\n \"flag-sr\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F8\",\n \"shortnames\": [\n \"flag-ss\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F9\",\n \"shortnames\": [\n \"flag-st\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FB\",\n \"shortnames\": [\n \"flag-sv\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FD\",\n \"shortnames\": [\n \"flag-sx\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FE\",\n \"shortnames\": [\n \"flag-sy\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FF\",\n \"shortnames\": [\n \"flag-sz\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E6\",\n \"shortnames\": [\n \"flag-ta\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E8\",\n \"shortnames\": [\n \"flag-tc\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E9\",\n \"shortnames\": [\n \"flag-td\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EB\",\n \"shortnames\": [\n \"flag-tf\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EC\",\n \"shortnames\": [\n \"flag-tg\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1ED\",\n \"shortnames\": [\n \"flag-th\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EF\",\n \"shortnames\": [\n \"flag-tj\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F0\",\n \"shortnames\": [\n \"flag-tk\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F1\",\n \"shortnames\": [\n \"flag-tl\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F2\",\n \"shortnames\": [\n \"flag-tm\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F3\",\n \"shortnames\": [\n \"flag-tn\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F4\",\n \"shortnames\": [\n \"flag-to\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F7\",\n \"shortnames\": [\n \"flag-tr\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F9\",\n \"shortnames\": [\n \"flag-tt\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FB\",\n \"shortnames\": [\n \"flag-tv\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FC\",\n \"shortnames\": [\n \"flag-tw\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FF\",\n \"shortnames\": [\n \"flag-tz\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1E6\",\n \"shortnames\": [\n \"flag-ua\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1EC\",\n \"shortnames\": [\n \"flag-ug\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F2\",\n \"shortnames\": [\n \"flag-um\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F3\",\n \"shortnames\": [\n \"flag-un\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F8\",\n \"shortnames\": [\n \"us\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1FE\",\n \"shortnames\": [\n \"flag-uy\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1FF\",\n \"shortnames\": [\n \"flag-uz\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1E6\",\n \"shortnames\": [\n \"flag-va\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1E8\",\n \"shortnames\": [\n \"flag-vc\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EA\",\n \"shortnames\": [\n \"flag-ve\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EC\",\n \"shortnames\": [\n \"flag-vg\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EE\",\n \"shortnames\": [\n \"flag-vi\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1F3\",\n \"shortnames\": [\n \"flag-vn\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1FA\",\n \"shortnames\": [\n \"flag-vu\"\n ]\n },\n {\n \"unified\": \"1F1FC-1F1EB\",\n \"shortnames\": [\n \"flag-wf\"\n ]\n },\n {\n \"unified\": \"1F1FC-1F1F8\",\n \"shortnames\": [\n \"flag-ws\"\n ]\n },\n {\n \"unified\": \"1F1FD-1F1F0\",\n \"shortnames\": [\n \"flag-xk\"\n ]\n },\n {\n \"unified\": \"1F1FE-1F1EA\",\n \"shortnames\": [\n \"flag-ye\"\n ]\n },\n {\n \"unified\": \"1F1FE-1F1F9\",\n \"shortnames\": [\n \"flag-yt\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1E6\",\n \"shortnames\": [\n \"flag-za\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1F2\",\n \"shortnames\": [\n \"flag-zm\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1FC\",\n \"shortnames\": [\n \"flag-zw\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\n \"shortnames\": [\n \"flag-england\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\n \"shortnames\": [\n \"flag-scotland\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\n \"shortnames\": [\n \"flag-wales\"\n ]\n }\n ]\n }\n];\n\nexport const byShortName = {\n \"hash\": \"0023-FE0F-20E3\",\n \"keycap_star\": \"002A-FE0F-20E3\",\n \"zero\": \"0030-FE0F-20E3\",\n \"one\": \"0031-FE0F-20E3\",\n \"two\": \"0032-FE0F-20E3\",\n \"three\": \"0033-FE0F-20E3\",\n \"four\": \"0034-FE0F-20E3\",\n \"five\": \"0035-FE0F-20E3\",\n \"six\": \"0036-FE0F-20E3\",\n \"seven\": \"0037-FE0F-20E3\",\n \"eight\": \"0038-FE0F-20E3\",\n \"nine\": \"0039-FE0F-20E3\",\n \"copyright\": \"00A9-FE0F\",\n \"registered\": \"00AE-FE0F\",\n \"mahjong\": \"1F004\",\n \"black_joker\": \"1F0CF\",\n \"a\": \"1F170-FE0F\",\n \"b\": \"1F171-FE0F\",\n \"o2\": \"1F17E-FE0F\",\n \"parking\": \"1F17F-FE0F\",\n \"ab\": \"1F18E\",\n \"cl\": \"1F191\",\n \"cool\": \"1F192\",\n \"free\": \"1F193\",\n \"id\": \"1F194\",\n \"new\": \"1F195\",\n \"ng\": \"1F196\",\n \"ok\": \"1F197\",\n \"sos\": \"1F198\",\n \"up\": \"1F199\",\n \"vs\": \"1F19A\",\n \"flag-ac\": \"1F1E6-1F1E8\",\n \"flag-ad\": \"1F1E6-1F1E9\",\n \"flag-ae\": \"1F1E6-1F1EA\",\n \"flag-af\": \"1F1E6-1F1EB\",\n \"flag-ag\": \"1F1E6-1F1EC\",\n \"flag-ai\": \"1F1E6-1F1EE\",\n \"flag-al\": \"1F1E6-1F1F1\",\n \"flag-am\": \"1F1E6-1F1F2\",\n \"flag-ao\": \"1F1E6-1F1F4\",\n \"flag-aq\": \"1F1E6-1F1F6\",\n \"flag-ar\": \"1F1E6-1F1F7\",\n \"flag-as\": \"1F1E6-1F1F8\",\n \"flag-at\": \"1F1E6-1F1F9\",\n \"flag-au\": \"1F1E6-1F1FA\",\n \"flag-aw\": \"1F1E6-1F1FC\",\n \"flag-ax\": \"1F1E6-1F1FD\",\n \"flag-az\": \"1F1E6-1F1FF\",\n \"flag-ba\": \"1F1E7-1F1E6\",\n \"flag-bb\": \"1F1E7-1F1E7\",\n \"flag-bd\": \"1F1E7-1F1E9\",\n \"flag-be\": \"1F1E7-1F1EA\",\n \"flag-bf\": \"1F1E7-1F1EB\",\n \"flag-bg\": \"1F1E7-1F1EC\",\n \"flag-bh\": \"1F1E7-1F1ED\",\n \"flag-bi\": \"1F1E7-1F1EE\",\n \"flag-bj\": \"1F1E7-1F1EF\",\n \"flag-bl\": \"1F1E7-1F1F1\",\n \"flag-bm\": \"1F1E7-1F1F2\",\n \"flag-bn\": \"1F1E7-1F1F3\",\n \"flag-bo\": \"1F1E7-1F1F4\",\n \"flag-bq\": \"1F1E7-1F1F6\",\n \"flag-br\": \"1F1E7-1F1F7\",\n \"flag-bs\": \"1F1E7-1F1F8\",\n \"flag-bt\": \"1F1E7-1F1F9\",\n \"flag-bv\": \"1F1E7-1F1FB\",\n \"flag-bw\": \"1F1E7-1F1FC\",\n \"flag-by\": \"1F1E7-1F1FE\",\n \"flag-bz\": \"1F1E7-1F1FF\",\n \"flag-ca\": \"1F1E8-1F1E6\",\n \"flag-cc\": \"1F1E8-1F1E8\",\n \"flag-cd\": \"1F1E8-1F1E9\",\n \"flag-cf\": \"1F1E8-1F1EB\",\n \"flag-cg\": \"1F1E8-1F1EC\",\n \"flag-ch\": \"1F1E8-1F1ED\",\n \"flag-ci\": \"1F1E8-1F1EE\",\n \"flag-ck\": \"1F1E8-1F1F0\",\n \"flag-cl\": \"1F1E8-1F1F1\",\n \"flag-cm\": \"1F1E8-1F1F2\",\n \"cn\": \"1F1E8-1F1F3\",\n \"flag-co\": \"1F1E8-1F1F4\",\n \"flag-cp\": \"1F1E8-1F1F5\",\n \"flag-cr\": \"1F1E8-1F1F7\",\n \"flag-cu\": \"1F1E8-1F1FA\",\n \"flag-cv\": \"1F1E8-1F1FB\",\n \"flag-cw\": \"1F1E8-1F1FC\",\n \"flag-cx\": \"1F1E8-1F1FD\",\n \"flag-cy\": \"1F1E8-1F1FE\",\n \"flag-cz\": \"1F1E8-1F1FF\",\n \"de\": \"1F1E9-1F1EA\",\n \"flag-dg\": \"1F1E9-1F1EC\",\n \"flag-dj\": \"1F1E9-1F1EF\",\n \"flag-dk\": \"1F1E9-1F1F0\",\n \"flag-dm\": \"1F1E9-1F1F2\",\n \"flag-do\": \"1F1E9-1F1F4\",\n \"flag-dz\": \"1F1E9-1F1FF\",\n \"flag-ea\": \"1F1EA-1F1E6\",\n \"flag-ec\": \"1F1EA-1F1E8\",\n \"flag-ee\": \"1F1EA-1F1EA\",\n \"flag-eg\": \"1F1EA-1F1EC\",\n \"flag-eh\": \"1F1EA-1F1ED\",\n \"flag-er\": \"1F1EA-1F1F7\",\n \"es\": \"1F1EA-1F1F8\",\n \"flag-et\": \"1F1EA-1F1F9\",\n \"flag-eu\": \"1F1EA-1F1FA\",\n \"flag-fi\": \"1F1EB-1F1EE\",\n \"flag-fj\": \"1F1EB-1F1EF\",\n \"flag-fk\": \"1F1EB-1F1F0\",\n \"flag-fm\": \"1F1EB-1F1F2\",\n \"flag-fo\": \"1F1EB-1F1F4\",\n \"fr\": \"1F1EB-1F1F7\",\n \"flag-ga\": \"1F1EC-1F1E6\",\n \"gb\": \"1F1EC-1F1E7\",\n \"flag-gd\": \"1F1EC-1F1E9\",\n \"flag-ge\": \"1F1EC-1F1EA\",\n \"flag-gf\": \"1F1EC-1F1EB\",\n \"flag-gg\": \"1F1EC-1F1EC\",\n \"flag-gh\": \"1F1EC-1F1ED\",\n \"flag-gi\": \"1F1EC-1F1EE\",\n \"flag-gl\": \"1F1EC-1F1F1\",\n \"flag-gm\": \"1F1EC-1F1F2\",\n \"flag-gn\": \"1F1EC-1F1F3\",\n \"flag-gp\": \"1F1EC-1F1F5\",\n \"flag-gq\": \"1F1EC-1F1F6\",\n \"flag-gr\": \"1F1EC-1F1F7\",\n \"flag-gs\": \"1F1EC-1F1F8\",\n \"flag-gt\": \"1F1EC-1F1F9\",\n \"flag-gu\": \"1F1EC-1F1FA\",\n \"flag-gw\": \"1F1EC-1F1FC\",\n \"flag-gy\": \"1F1EC-1F1FE\",\n \"flag-hk\": \"1F1ED-1F1F0\",\n \"flag-hm\": \"1F1ED-1F1F2\",\n \"flag-hn\": \"1F1ED-1F1F3\",\n \"flag-hr\": \"1F1ED-1F1F7\",\n \"flag-ht\": \"1F1ED-1F1F9\",\n \"flag-hu\": \"1F1ED-1F1FA\",\n \"flag-ic\": \"1F1EE-1F1E8\",\n \"flag-id\": \"1F1EE-1F1E9\",\n \"flag-ie\": \"1F1EE-1F1EA\",\n \"flag-il\": \"1F1EE-1F1F1\",\n \"flag-im\": \"1F1EE-1F1F2\",\n \"flag-in\": \"1F1EE-1F1F3\",\n \"flag-io\": \"1F1EE-1F1F4\",\n \"flag-iq\": \"1F1EE-1F1F6\",\n \"flag-ir\": \"1F1EE-1F1F7\",\n \"flag-is\": \"1F1EE-1F1F8\",\n \"it\": \"1F1EE-1F1F9\",\n \"flag-je\": \"1F1EF-1F1EA\",\n \"flag-jm\": \"1F1EF-1F1F2\",\n \"flag-jo\": \"1F1EF-1F1F4\",\n \"jp\": \"1F1EF-1F1F5\",\n \"flag-ke\": \"1F1F0-1F1EA\",\n \"flag-kg\": \"1F1F0-1F1EC\",\n \"flag-kh\": \"1F1F0-1F1ED\",\n \"flag-ki\": \"1F1F0-1F1EE\",\n \"flag-km\": \"1F1F0-1F1F2\",\n \"flag-kn\": \"1F1F0-1F1F3\",\n \"flag-kp\": \"1F1F0-1F1F5\",\n \"kr\": \"1F1F0-1F1F7\",\n \"flag-kw\": \"1F1F0-1F1FC\",\n \"flag-ky\": \"1F1F0-1F1FE\",\n \"flag-kz\": \"1F1F0-1F1FF\",\n \"flag-la\": \"1F1F1-1F1E6\",\n \"flag-lb\": \"1F1F1-1F1E7\",\n \"flag-lc\": \"1F1F1-1F1E8\",\n \"flag-li\": \"1F1F1-1F1EE\",\n \"flag-lk\": \"1F1F1-1F1F0\",\n \"flag-lr\": \"1F1F1-1F1F7\",\n \"flag-ls\": \"1F1F1-1F1F8\",\n \"flag-lt\": \"1F1F1-1F1F9\",\n \"flag-lu\": \"1F1F1-1F1FA\",\n \"flag-lv\": \"1F1F1-1F1FB\",\n \"flag-ly\": \"1F1F1-1F1FE\",\n \"flag-ma\": \"1F1F2-1F1E6\",\n \"flag-mc\": \"1F1F2-1F1E8\",\n \"flag-md\": \"1F1F2-1F1E9\",\n \"flag-me\": \"1F1F2-1F1EA\",\n \"flag-mf\": \"1F1F2-1F1EB\",\n \"flag-mg\": \"1F1F2-1F1EC\",\n \"flag-mh\": \"1F1F2-1F1ED\",\n \"flag-mk\": \"1F1F2-1F1F0\",\n \"flag-ml\": \"1F1F2-1F1F1\",\n \"flag-mm\": \"1F1F2-1F1F2\",\n \"flag-mn\": \"1F1F2-1F1F3\",\n \"flag-mo\": \"1F1F2-1F1F4\",\n \"flag-mp\": \"1F1F2-1F1F5\",\n \"flag-mq\": \"1F1F2-1F1F6\",\n \"flag-mr\": \"1F1F2-1F1F7\",\n \"flag-ms\": \"1F1F2-1F1F8\",\n \"flag-mt\": \"1F1F2-1F1F9\",\n \"flag-mu\": \"1F1F2-1F1FA\",\n \"flag-mv\": \"1F1F2-1F1FB\",\n \"flag-mw\": \"1F1F2-1F1FC\",\n \"flag-mx\": \"1F1F2-1F1FD\",\n \"flag-my\": \"1F1F2-1F1FE\",\n \"flag-mz\": \"1F1F2-1F1FF\",\n \"flag-na\": \"1F1F3-1F1E6\",\n \"flag-nc\": \"1F1F3-1F1E8\",\n \"flag-ne\": \"1F1F3-1F1EA\",\n \"flag-nf\": \"1F1F3-1F1EB\",\n \"flag-ng\": \"1F1F3-1F1EC\",\n \"flag-ni\": \"1F1F3-1F1EE\",\n \"flag-nl\": \"1F1F3-1F1F1\",\n \"flag-no\": \"1F1F3-1F1F4\",\n \"flag-np\": \"1F1F3-1F1F5\",\n \"flag-nr\": \"1F1F3-1F1F7\",\n \"flag-nu\": \"1F1F3-1F1FA\",\n \"flag-nz\": \"1F1F3-1F1FF\",\n \"flag-om\": \"1F1F4-1F1F2\",\n \"flag-pa\": \"1F1F5-1F1E6\",\n \"flag-pe\": \"1F1F5-1F1EA\",\n \"flag-pf\": \"1F1F5-1F1EB\",\n \"flag-pg\": \"1F1F5-1F1EC\",\n \"flag-ph\": \"1F1F5-1F1ED\",\n \"flag-pk\": \"1F1F5-1F1F0\",\n \"flag-pl\": \"1F1F5-1F1F1\",\n \"flag-pm\": \"1F1F5-1F1F2\",\n \"flag-pn\": \"1F1F5-1F1F3\",\n \"flag-pr\": \"1F1F5-1F1F7\",\n \"flag-ps\": \"1F1F5-1F1F8\",\n \"flag-pt\": \"1F1F5-1F1F9\",\n \"flag-pw\": \"1F1F5-1F1FC\",\n \"flag-py\": \"1F1F5-1F1FE\",\n \"flag-qa\": \"1F1F6-1F1E6\",\n \"flag-re\": \"1F1F7-1F1EA\",\n \"flag-ro\": \"1F1F7-1F1F4\",\n \"flag-rs\": \"1F1F7-1F1F8\",\n \"ru\": \"1F1F7-1F1FA\",\n \"flag-rw\": \"1F1F7-1F1FC\",\n \"flag-sa\": \"1F1F8-1F1E6\",\n \"flag-sb\": \"1F1F8-1F1E7\",\n \"flag-sc\": \"1F1F8-1F1E8\",\n \"flag-sd\": \"1F1F8-1F1E9\",\n \"flag-se\": \"1F1F8-1F1EA\",\n \"flag-sg\": \"1F1F8-1F1EC\",\n \"flag-sh\": \"1F1F8-1F1ED\",\n \"flag-si\": \"1F1F8-1F1EE\",\n \"flag-sj\": \"1F1F8-1F1EF\",\n \"flag-sk\": \"1F1F8-1F1F0\",\n \"flag-sl\": \"1F1F8-1F1F1\",\n \"flag-sm\": \"1F1F8-1F1F2\",\n \"flag-sn\": \"1F1F8-1F1F3\",\n \"flag-so\": \"1F1F8-1F1F4\",\n \"flag-sr\": \"1F1F8-1F1F7\",\n \"flag-ss\": \"1F1F8-1F1F8\",\n \"flag-st\": \"1F1F8-1F1F9\",\n \"flag-sv\": \"1F1F8-1F1FB\",\n \"flag-sx\": \"1F1F8-1F1FD\",\n \"flag-sy\": \"1F1F8-1F1FE\",\n \"flag-sz\": \"1F1F8-1F1FF\",\n \"flag-ta\": \"1F1F9-1F1E6\",\n \"flag-tc\": \"1F1F9-1F1E8\",\n \"flag-td\": \"1F1F9-1F1E9\",\n \"flag-tf\": \"1F1F9-1F1EB\",\n \"flag-tg\": \"1F1F9-1F1EC\",\n \"flag-th\": \"1F1F9-1F1ED\",\n \"flag-tj\": \"1F1F9-1F1EF\",\n \"flag-tk\": \"1F1F9-1F1F0\",\n \"flag-tl\": \"1F1F9-1F1F1\",\n \"flag-tm\": \"1F1F9-1F1F2\",\n \"flag-tn\": \"1F1F9-1F1F3\",\n \"flag-to\": \"1F1F9-1F1F4\",\n \"flag-tr\": \"1F1F9-1F1F7\",\n \"flag-tt\": \"1F1F9-1F1F9\",\n \"flag-tv\": \"1F1F9-1F1FB\",\n \"flag-tw\": \"1F1F9-1F1FC\",\n \"flag-tz\": \"1F1F9-1F1FF\",\n \"flag-ua\": \"1F1FA-1F1E6\",\n \"flag-ug\": \"1F1FA-1F1EC\",\n \"flag-um\": \"1F1FA-1F1F2\",\n \"flag-un\": \"1F1FA-1F1F3\",\n \"us\": \"1F1FA-1F1F8\",\n \"flag-uy\": \"1F1FA-1F1FE\",\n \"flag-uz\": \"1F1FA-1F1FF\",\n \"flag-va\": \"1F1FB-1F1E6\",\n \"flag-vc\": \"1F1FB-1F1E8\",\n \"flag-ve\": \"1F1FB-1F1EA\",\n \"flag-vg\": \"1F1FB-1F1EC\",\n \"flag-vi\": \"1F1FB-1F1EE\",\n \"flag-vn\": \"1F1FB-1F1F3\",\n \"flag-vu\": \"1F1FB-1F1FA\",\n \"flag-wf\": \"1F1FC-1F1EB\",\n \"flag-ws\": \"1F1FC-1F1F8\",\n \"flag-xk\": \"1F1FD-1F1F0\",\n \"flag-ye\": \"1F1FE-1F1EA\",\n \"flag-yt\": \"1F1FE-1F1F9\",\n \"flag-za\": \"1F1FF-1F1E6\",\n \"flag-zm\": \"1F1FF-1F1F2\",\n \"flag-zw\": \"1F1FF-1F1FC\",\n \"koko\": \"1F201\",\n \"sa\": \"1F202-FE0F\",\n \"u7121\": \"1F21A\",\n \"u6307\": \"1F22F\",\n \"u7981\": \"1F232\",\n \"u7a7a\": \"1F233\",\n \"u5408\": \"1F234\",\n \"u6e80\": \"1F235\",\n \"u6709\": \"1F236\",\n \"u6708\": \"1F237-FE0F\",\n \"u7533\": \"1F238\",\n \"u5272\": \"1F239\",\n \"u55b6\": \"1F23A\",\n \"ideograph_advantage\": \"1F250\",\n \"accept\": \"1F251\",\n \"cyclone\": \"1F300\",\n \"foggy\": \"1F301\",\n \"closed_umbrella\": \"1F302\",\n \"night_with_stars\": \"1F303\",\n \"sunrise_over_mountains\": \"1F304\",\n \"sunrise\": \"1F305\",\n \"city_sunset\": \"1F306\",\n \"city_sunrise\": \"1F307\",\n \"rainbow\": \"1F308\",\n \"bridge_at_night\": \"1F309\",\n \"ocean\": \"1F30A\",\n \"volcano\": \"1F30B\",\n \"milky_way\": \"1F30C\",\n \"earth_africa\": \"1F30D\",\n \"earth_americas\": \"1F30E\",\n \"earth_asia\": \"1F30F\",\n \"globe_with_meridians\": \"1F310\",\n \"new_moon\": \"1F311\",\n \"waxing_crescent_moon\": \"1F312\",\n \"first_quarter_moon\": \"1F313\",\n \"moon\": \"1F314\",\n \"full_moon\": \"1F315\",\n \"waning_gibbous_moon\": \"1F316\",\n \"last_quarter_moon\": \"1F317\",\n \"waning_crescent_moon\": \"1F318\",\n \"crescent_moon\": \"1F319\",\n \"new_moon_with_face\": \"1F31A\",\n \"first_quarter_moon_with_face\": \"1F31B\",\n \"last_quarter_moon_with_face\": \"1F31C\",\n \"full_moon_with_face\": \"1F31D\",\n \"sun_with_face\": \"1F31E\",\n \"star2\": \"1F31F\",\n \"stars\": \"1F320\",\n \"thermometer\": \"1F321-FE0F\",\n \"mostly_sunny\": \"1F324-FE0F\",\n \"barely_sunny\": \"1F325-FE0F\",\n \"partly_sunny_rain\": \"1F326-FE0F\",\n \"rain_cloud\": \"1F327-FE0F\",\n \"snow_cloud\": \"1F328-FE0F\",\n \"lightning\": \"1F329-FE0F\",\n \"tornado\": \"1F32A-FE0F\",\n \"fog\": \"1F32B-FE0F\",\n \"wind_blowing_face\": \"1F32C-FE0F\",\n \"hotdog\": \"1F32D\",\n \"taco\": \"1F32E\",\n \"burrito\": \"1F32F\",\n \"chestnut\": \"1F330\",\n \"seedling\": \"1F331\",\n \"evergreen_tree\": \"1F332\",\n \"deciduous_tree\": \"1F333\",\n \"palm_tree\": \"1F334\",\n \"cactus\": \"1F335\",\n \"hot_pepper\": \"1F336-FE0F\",\n \"tulip\": \"1F337\",\n \"cherry_blossom\": \"1F338\",\n \"rose\": \"1F339\",\n \"hibiscus\": \"1F33A\",\n \"sunflower\": \"1F33B\",\n \"blossom\": \"1F33C\",\n \"corn\": \"1F33D\",\n \"ear_of_rice\": \"1F33E\",\n \"herb\": \"1F33F\",\n \"four_leaf_clover\": \"1F340\",\n \"maple_leaf\": \"1F341\",\n \"fallen_leaf\": \"1F342\",\n \"leaves\": \"1F343\",\n \"mushroom\": \"1F344\",\n \"tomato\": \"1F345\",\n \"eggplant\": \"1F346\",\n \"grapes\": \"1F347\",\n \"melon\": \"1F348\",\n \"watermelon\": \"1F349\",\n \"tangerine\": \"1F34A\",\n \"lemon\": \"1F34B\",\n \"banana\": \"1F34C\",\n \"pineapple\": \"1F34D\",\n \"apple\": \"1F34E\",\n \"green_apple\": \"1F34F\",\n \"pear\": \"1F350\",\n \"peach\": \"1F351\",\n \"cherries\": \"1F352\",\n \"strawberry\": \"1F353\",\n \"hamburger\": \"1F354\",\n \"pizza\": \"1F355\",\n \"meat_on_bone\": \"1F356\",\n \"poultry_leg\": \"1F357\",\n \"rice_cracker\": \"1F358\",\n \"rice_ball\": \"1F359\",\n \"rice\": \"1F35A\",\n \"curry\": \"1F35B\",\n \"ramen\": \"1F35C\",\n \"spaghetti\": \"1F35D\",\n \"bread\": \"1F35E\",\n \"fries\": \"1F35F\",\n \"sweet_potato\": \"1F360\",\n \"dango\": \"1F361\",\n \"oden\": \"1F362\",\n \"sushi\": \"1F363\",\n \"fried_shrimp\": \"1F364\",\n \"fish_cake\": \"1F365\",\n \"icecream\": \"1F366\",\n \"shaved_ice\": \"1F367\",\n \"ice_cream\": \"1F368\",\n \"doughnut\": \"1F369\",\n \"cookie\": \"1F36A\",\n \"chocolate_bar\": \"1F36B\",\n \"candy\": \"1F36C\",\n \"lollipop\": \"1F36D\",\n \"custard\": \"1F36E\",\n \"honey_pot\": \"1F36F\",\n \"cake\": \"1F370\",\n \"bento\": \"1F371\",\n \"stew\": \"1F372\",\n \"fried_egg\": \"1F373\",\n \"fork_and_knife\": \"1F374\",\n \"tea\": \"1F375\",\n \"sake\": \"1F376\",\n \"wine_glass\": \"1F377\",\n \"cocktail\": \"1F378\",\n \"tropical_drink\": \"1F379\",\n \"beer\": \"1F37A\",\n \"beers\": \"1F37B\",\n \"baby_bottle\": \"1F37C\",\n \"knife_fork_plate\": \"1F37D-FE0F\",\n \"champagne\": \"1F37E\",\n \"popcorn\": \"1F37F\",\n \"ribbon\": \"1F380\",\n \"gift\": \"1F381\",\n \"birthday\": \"1F382\",\n \"jack_o_lantern\": \"1F383\",\n \"christmas_tree\": \"1F384\",\n \"santa\": \"1F385\",\n \"fireworks\": \"1F386\",\n \"sparkler\": \"1F387\",\n \"balloon\": \"1F388\",\n \"tada\": \"1F389\",\n \"confetti_ball\": \"1F38A\",\n \"tanabata_tree\": \"1F38B\",\n \"crossed_flags\": \"1F38C\",\n \"bamboo\": \"1F38D\",\n \"dolls\": \"1F38E\",\n \"flags\": \"1F38F\",\n \"wind_chime\": \"1F390\",\n \"rice_scene\": \"1F391\",\n \"school_satchel\": \"1F392\",\n \"mortar_board\": \"1F393\",\n \"medal\": \"1F396-FE0F\",\n \"reminder_ribbon\": \"1F397-FE0F\",\n \"studio_microphone\": \"1F399-FE0F\",\n \"level_slider\": \"1F39A-FE0F\",\n \"control_knobs\": \"1F39B-FE0F\",\n \"film_frames\": \"1F39E-FE0F\",\n \"admission_tickets\": \"1F39F-FE0F\",\n \"carousel_horse\": \"1F3A0\",\n \"ferris_wheel\": \"1F3A1\",\n \"roller_coaster\": \"1F3A2\",\n \"fishing_pole_and_fish\": \"1F3A3\",\n \"microphone\": \"1F3A4\",\n \"movie_camera\": \"1F3A5\",\n \"cinema\": \"1F3A6\",\n \"headphones\": \"1F3A7\",\n \"art\": \"1F3A8\",\n \"tophat\": \"1F3A9\",\n \"circus_tent\": \"1F3AA\",\n \"ticket\": \"1F3AB\",\n \"clapper\": \"1F3AC\",\n \"performing_arts\": \"1F3AD\",\n \"video_game\": \"1F3AE\",\n \"dart\": \"1F3AF\",\n \"slot_machine\": \"1F3B0\",\n \"8ball\": \"1F3B1\",\n \"game_die\": \"1F3B2\",\n \"bowling\": \"1F3B3\",\n \"flower_playing_cards\": \"1F3B4\",\n \"musical_note\": \"1F3B5\",\n \"notes\": \"1F3B6\",\n \"saxophone\": \"1F3B7\",\n \"guitar\": \"1F3B8\",\n \"musical_keyboard\": \"1F3B9\",\n \"trumpet\": \"1F3BA\",\n \"violin\": \"1F3BB\",\n \"musical_score\": \"1F3BC\",\n \"running_shirt_with_sash\": \"1F3BD\",\n \"tennis\": \"1F3BE\",\n \"ski\": \"1F3BF\",\n \"basketball\": \"1F3C0\",\n \"checkered_flag\": \"1F3C1\",\n \"snowboarder\": \"1F3C2\",\n \"woman-running\": \"1F3C3-200D-2640-FE0F\",\n \"man-running\": \"1F3C3-200D-2642-FE0F\",\n \"runner\": \"1F3C3-200D-2642-FE0F\",\n \"woman-surfing\": \"1F3C4-200D-2640-FE0F\",\n \"man-surfing\": \"1F3C4-200D-2642-FE0F\",\n \"surfer\": \"1F3C4-200D-2642-FE0F\",\n \"sports_medal\": \"1F3C5\",\n \"trophy\": \"1F3C6\",\n \"horse_racing\": \"1F3C7\",\n \"football\": \"1F3C8\",\n \"rugby_football\": \"1F3C9\",\n \"woman-swimming\": \"1F3CA-200D-2640-FE0F\",\n \"man-swimming\": \"1F3CA-200D-2642-FE0F\",\n \"swimmer\": \"1F3CA-200D-2642-FE0F\",\n \"woman-lifting-weights\": \"1F3CB-FE0F-200D-2640-FE0F\",\n \"man-lifting-weights\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"weight_lifter\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"woman-golfing\": \"1F3CC-FE0F-200D-2640-FE0F\",\n \"man-golfing\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"golfer\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"racing_motorcycle\": \"1F3CD-FE0F\",\n \"racing_car\": \"1F3CE-FE0F\",\n \"cricket_bat_and_ball\": \"1F3CF\",\n \"volleyball\": \"1F3D0\",\n \"field_hockey_stick_and_ball\": \"1F3D1\",\n \"ice_hockey_stick_and_puck\": \"1F3D2\",\n \"table_tennis_paddle_and_ball\": \"1F3D3\",\n \"snow_capped_mountain\": \"1F3D4-FE0F\",\n \"camping\": \"1F3D5-FE0F\",\n \"beach_with_umbrella\": \"1F3D6-FE0F\",\n \"building_construction\": \"1F3D7-FE0F\",\n \"house_buildings\": \"1F3D8-FE0F\",\n \"cityscape\": \"1F3D9-FE0F\",\n \"derelict_house_building\": \"1F3DA-FE0F\",\n \"classical_building\": \"1F3DB-FE0F\",\n \"desert\": \"1F3DC-FE0F\",\n \"desert_island\": \"1F3DD-FE0F\",\n \"national_park\": \"1F3DE-FE0F\",\n \"stadium\": \"1F3DF-FE0F\",\n \"house\": \"1F3E0\",\n \"house_with_garden\": \"1F3E1\",\n \"office\": \"1F3E2\",\n \"post_office\": \"1F3E3\",\n \"european_post_office\": \"1F3E4\",\n \"hospital\": \"1F3E5\",\n \"bank\": \"1F3E6\",\n \"atm\": \"1F3E7\",\n \"hotel\": \"1F3E8\",\n \"love_hotel\": \"1F3E9\",\n \"convenience_store\": \"1F3EA\",\n \"school\": \"1F3EB\",\n \"department_store\": \"1F3EC\",\n \"factory\": \"1F3ED\",\n \"izakaya_lantern\": \"1F3EE\",\n \"japanese_castle\": \"1F3EF\",\n \"european_castle\": \"1F3F0\",\n \"rainbow-flag\": \"1F3F3-FE0F-200D-1F308\",\n \"waving_white_flag\": \"1F3F3-FE0F\",\n \"flag-england\": \"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\n \"flag-scotland\": \"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\n \"flag-wales\": \"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\n \"waving_black_flag\": \"1F3F4\",\n \"rosette\": \"1F3F5-FE0F\",\n \"label\": \"1F3F7-FE0F\",\n \"badminton_racquet_and_shuttlecock\": \"1F3F8\",\n \"bow_and_arrow\": \"1F3F9\",\n \"amphora\": \"1F3FA\",\n \"skin-tone-2\": \"1F3FB\",\n \"skin-tone-3\": \"1F3FC\",\n \"skin-tone-4\": \"1F3FD\",\n \"skin-tone-5\": \"1F3FE\",\n \"skin-tone-6\": \"1F3FF\",\n \"rat\": \"1F400\",\n \"mouse2\": \"1F401\",\n \"ox\": \"1F402\",\n \"water_buffalo\": \"1F403\",\n \"cow2\": \"1F404\",\n \"tiger2\": \"1F405\",\n \"leopard\": \"1F406\",\n \"rabbit2\": \"1F407\",\n \"cat2\": \"1F408\",\n \"dragon\": \"1F409\",\n \"crocodile\": \"1F40A\",\n \"whale2\": \"1F40B\",\n \"snail\": \"1F40C\",\n \"snake\": \"1F40D\",\n \"racehorse\": \"1F40E\",\n \"ram\": \"1F40F\",\n \"goat\": \"1F410\",\n \"sheep\": \"1F411\",\n \"monkey\": \"1F412\",\n \"rooster\": \"1F413\",\n \"chicken\": \"1F414\",\n \"dog2\": \"1F415\",\n \"pig2\": \"1F416\",\n \"boar\": \"1F417\",\n \"elephant\": \"1F418\",\n \"octopus\": \"1F419\",\n \"shell\": \"1F41A\",\n \"bug\": \"1F41B\",\n \"ant\": \"1F41C\",\n \"bee\": \"1F41D\",\n \"beetle\": \"1F41E\",\n \"fish\": \"1F41F\",\n \"tropical_fish\": \"1F420\",\n \"blowfish\": \"1F421\",\n \"turtle\": \"1F422\",\n \"hatching_chick\": \"1F423\",\n \"baby_chick\": \"1F424\",\n \"hatched_chick\": \"1F425\",\n \"bird\": \"1F426\",\n \"penguin\": \"1F427\",\n \"koala\": \"1F428\",\n \"poodle\": \"1F429\",\n \"dromedary_camel\": \"1F42A\",\n \"camel\": \"1F42B\",\n \"dolphin\": \"1F42C\",\n \"mouse\": \"1F42D\",\n \"cow\": \"1F42E\",\n \"tiger\": \"1F42F\",\n \"rabbit\": \"1F430\",\n \"cat\": \"1F431\",\n \"dragon_face\": \"1F432\",\n \"whale\": \"1F433\",\n \"horse\": \"1F434\",\n \"monkey_face\": \"1F435\",\n \"dog\": \"1F436\",\n \"pig\": \"1F437\",\n \"frog\": \"1F438\",\n \"hamster\": \"1F439\",\n \"wolf\": \"1F43A\",\n \"bear\": \"1F43B\",\n \"panda_face\": \"1F43C\",\n \"pig_nose\": \"1F43D\",\n \"feet\": \"1F43E\",\n \"chipmunk\": \"1F43F-FE0F\",\n \"eyes\": \"1F440\",\n \"eye-in-speech-bubble\": \"1F441-FE0F-200D-1F5E8-FE0F\",\n \"eye\": \"1F441-FE0F\",\n \"ear\": \"1F442\",\n \"nose\": \"1F443\",\n \"lips\": \"1F444\",\n \"tongue\": \"1F445\",\n \"point_up_2\": \"1F446\",\n \"point_down\": \"1F447\",\n \"point_left\": \"1F448\",\n \"point_right\": \"1F449\",\n \"facepunch\": \"1F44A\",\n \"wave\": \"1F44B\",\n \"ok_hand\": \"1F44C\",\n \"+1\": \"1F44D\",\n \"-1\": \"1F44E\",\n \"clap\": \"1F44F\",\n \"open_hands\": \"1F450\",\n \"crown\": \"1F451\",\n \"womans_hat\": \"1F452\",\n \"eyeglasses\": \"1F453\",\n \"necktie\": \"1F454\",\n \"shirt\": \"1F455\",\n \"jeans\": \"1F456\",\n \"dress\": \"1F457\",\n \"kimono\": \"1F458\",\n \"bikini\": \"1F459\",\n \"womans_clothes\": \"1F45A\",\n \"purse\": \"1F45B\",\n \"handbag\": \"1F45C\",\n \"pouch\": \"1F45D\",\n \"mans_shoe\": \"1F45E\",\n \"athletic_shoe\": \"1F45F\",\n \"high_heel\": \"1F460\",\n \"sandal\": \"1F461\",\n \"boot\": \"1F462\",\n \"footprints\": \"1F463\",\n \"bust_in_silhouette\": \"1F464\",\n \"busts_in_silhouette\": \"1F465\",\n \"boy\": \"1F466\",\n \"girl\": \"1F467\",\n \"male-farmer\": \"1F468-200D-1F33E\",\n \"male-cook\": \"1F468-200D-1F373\",\n \"male-student\": \"1F468-200D-1F393\",\n \"male-singer\": \"1F468-200D-1F3A4\",\n \"male-artist\": \"1F468-200D-1F3A8\",\n \"male-teacher\": \"1F468-200D-1F3EB\",\n \"male-factory-worker\": \"1F468-200D-1F3ED\",\n \"man-boy-boy\": \"1F468-200D-1F466-200D-1F466\",\n \"man-boy\": \"1F468-200D-1F466\",\n \"man-girl-boy\": \"1F468-200D-1F467-200D-1F466\",\n \"man-girl-girl\": \"1F468-200D-1F467-200D-1F467\",\n \"man-girl\": \"1F468-200D-1F467\",\n \"man-man-boy\": \"1F468-200D-1F468-200D-1F466\",\n \"man-man-boy-boy\": \"1F468-200D-1F468-200D-1F466-200D-1F466\",\n \"man-man-girl\": \"1F468-200D-1F468-200D-1F467\",\n \"man-man-girl-boy\": \"1F468-200D-1F468-200D-1F467-200D-1F466\",\n \"man-man-girl-girl\": \"1F468-200D-1F468-200D-1F467-200D-1F467\",\n \"man-woman-boy\": \"1F468-200D-1F469-200D-1F466\",\n \"man-woman-boy-boy\": \"1F468-200D-1F469-200D-1F466-200D-1F466\",\n \"man-woman-girl\": \"1F468-200D-1F469-200D-1F467\",\n \"man-woman-girl-boy\": \"1F468-200D-1F469-200D-1F467-200D-1F466\",\n \"man-woman-girl-girl\": \"1F468-200D-1F469-200D-1F467-200D-1F467\",\n \"male-technologist\": \"1F468-200D-1F4BB\",\n \"male-office-worker\": \"1F468-200D-1F4BC\",\n \"male-mechanic\": \"1F468-200D-1F527\",\n \"male-scientist\": \"1F468-200D-1F52C\",\n \"male-astronaut\": \"1F468-200D-1F680\",\n \"male-firefighter\": \"1F468-200D-1F692\",\n \"male-doctor\": \"1F468-200D-2695-FE0F\",\n \"male-judge\": \"1F468-200D-2696-FE0F\",\n \"male-pilot\": \"1F468-200D-2708-FE0F\",\n \"man-heart-man\": \"1F468-200D-2764-FE0F-200D-1F468\",\n \"man-kiss-man\": \"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"man\": \"1F468\",\n \"female-farmer\": \"1F469-200D-1F33E\",\n \"female-cook\": \"1F469-200D-1F373\",\n \"female-student\": \"1F469-200D-1F393\",\n \"female-singer\": \"1F469-200D-1F3A4\",\n \"female-artist\": \"1F469-200D-1F3A8\",\n \"female-teacher\": \"1F469-200D-1F3EB\",\n \"female-factory-worker\": \"1F469-200D-1F3ED\",\n \"woman-boy-boy\": \"1F469-200D-1F466-200D-1F466\",\n \"woman-boy\": \"1F469-200D-1F466\",\n \"woman-girl-boy\": \"1F469-200D-1F467-200D-1F466\",\n \"woman-girl-girl\": \"1F469-200D-1F467-200D-1F467\",\n \"woman-girl\": \"1F469-200D-1F467\",\n \"woman-woman-boy\": \"1F469-200D-1F469-200D-1F466\",\n \"woman-woman-boy-boy\": \"1F469-200D-1F469-200D-1F466-200D-1F466\",\n \"woman-woman-girl\": \"1F469-200D-1F469-200D-1F467\",\n \"woman-woman-girl-boy\": \"1F469-200D-1F469-200D-1F467-200D-1F466\",\n \"woman-woman-girl-girl\": \"1F469-200D-1F469-200D-1F467-200D-1F467\",\n \"female-technologist\": \"1F469-200D-1F4BB\",\n \"female-office-worker\": \"1F469-200D-1F4BC\",\n \"female-mechanic\": \"1F469-200D-1F527\",\n \"female-scientist\": \"1F469-200D-1F52C\",\n \"female-astronaut\": \"1F469-200D-1F680\",\n \"female-firefighter\": \"1F469-200D-1F692\",\n \"female-doctor\": \"1F469-200D-2695-FE0F\",\n \"female-judge\": \"1F469-200D-2696-FE0F\",\n \"female-pilot\": \"1F469-200D-2708-FE0F\",\n \"woman-heart-man\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"woman-heart-woman\": \"1F469-200D-2764-FE0F-200D-1F469\",\n \"woman-kiss-man\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"woman-kiss-woman\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\n \"woman\": \"1F469\",\n \"family\": \"1F468-200D-1F469-200D-1F466\",\n \"couple\": \"1F46B\",\n \"two_men_holding_hands\": \"1F46C\",\n \"two_women_holding_hands\": \"1F46D\",\n \"female-police-officer\": \"1F46E-200D-2640-FE0F\",\n \"male-police-officer\": \"1F46E-200D-2642-FE0F\",\n \"cop\": \"1F46E-200D-2642-FE0F\",\n \"woman-with-bunny-ears-partying\": \"1F46F-200D-2640-FE0F\",\n \"man-with-bunny-ears-partying\": \"1F46F-200D-2642-FE0F\",\n \"dancers\": \"1F46F-200D-2640-FE0F\",\n \"bride_with_veil\": \"1F470\",\n \"blond-haired-woman\": \"1F471-200D-2640-FE0F\",\n \"blond-haired-man\": \"1F471-200D-2642-FE0F\",\n \"person_with_blond_hair\": \"1F471-200D-2642-FE0F\",\n \"man_with_gua_pi_mao\": \"1F472\",\n \"woman-wearing-turban\": \"1F473-200D-2640-FE0F\",\n \"man-wearing-turban\": \"1F473-200D-2642-FE0F\",\n \"man_with_turban\": \"1F473-200D-2642-FE0F\",\n \"older_man\": \"1F474\",\n \"older_woman\": \"1F475\",\n \"baby\": \"1F476\",\n \"female-construction-worker\": \"1F477-200D-2640-FE0F\",\n \"male-construction-worker\": \"1F477-200D-2642-FE0F\",\n \"construction_worker\": \"1F477-200D-2642-FE0F\",\n \"princess\": \"1F478\",\n \"japanese_ogre\": \"1F479\",\n \"japanese_goblin\": \"1F47A\",\n \"ghost\": \"1F47B\",\n \"angel\": \"1F47C\",\n \"alien\": \"1F47D\",\n \"space_invader\": \"1F47E\",\n \"imp\": \"1F47F\",\n \"skull\": \"1F480\",\n \"woman-tipping-hand\": \"1F481-200D-2640-FE0F\",\n \"man-tipping-hand\": \"1F481-200D-2642-FE0F\",\n \"information_desk_person\": \"1F481-200D-2640-FE0F\",\n \"female-guard\": \"1F482-200D-2640-FE0F\",\n \"male-guard\": \"1F482-200D-2642-FE0F\",\n \"guardsman\": \"1F482-200D-2642-FE0F\",\n \"dancer\": \"1F483\",\n \"lipstick\": \"1F484\",\n \"nail_care\": \"1F485\",\n \"woman-getting-massage\": \"1F486-200D-2640-FE0F\",\n \"man-getting-massage\": \"1F486-200D-2642-FE0F\",\n \"massage\": \"1F486-200D-2640-FE0F\",\n \"woman-getting-haircut\": \"1F487-200D-2640-FE0F\",\n \"man-getting-haircut\": \"1F487-200D-2642-FE0F\",\n \"haircut\": \"1F487-200D-2640-FE0F\",\n \"barber\": \"1F488\",\n \"syringe\": \"1F489\",\n \"pill\": \"1F48A\",\n \"kiss\": \"1F48B\",\n \"love_letter\": \"1F48C\",\n \"ring\": \"1F48D\",\n \"gem\": \"1F48E\",\n \"couplekiss\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"bouquet\": \"1F490\",\n \"couple_with_heart\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"wedding\": \"1F492\",\n \"heartbeat\": \"1F493\",\n \"broken_heart\": \"1F494\",\n \"two_hearts\": \"1F495\",\n \"sparkling_heart\": \"1F496\",\n \"heartpulse\": \"1F497\",\n \"cupid\": \"1F498\",\n \"blue_heart\": \"1F499\",\n \"green_heart\": \"1F49A\",\n \"yellow_heart\": \"1F49B\",\n \"purple_heart\": \"1F49C\",\n \"gift_heart\": \"1F49D\",\n \"revolving_hearts\": \"1F49E\",\n \"heart_decoration\": \"1F49F\",\n \"diamond_shape_with_a_dot_inside\": \"1F4A0\",\n \"bulb\": \"1F4A1\",\n \"anger\": \"1F4A2\",\n \"bomb\": \"1F4A3\",\n \"zzz\": \"1F4A4\",\n \"boom\": \"1F4A5\",\n \"sweat_drops\": \"1F4A6\",\n \"droplet\": \"1F4A7\",\n \"dash\": \"1F4A8\",\n \"hankey\": \"1F4A9\",\n \"muscle\": \"1F4AA\",\n \"dizzy\": \"1F4AB\",\n \"speech_balloon\": \"1F4AC\",\n \"thought_balloon\": \"1F4AD\",\n \"white_flower\": \"1F4AE\",\n \"100\": \"1F4AF\",\n \"moneybag\": \"1F4B0\",\n \"currency_exchange\": \"1F4B1\",\n \"heavy_dollar_sign\": \"1F4B2\",\n \"credit_card\": \"1F4B3\",\n \"yen\": \"1F4B4\",\n \"dollar\": \"1F4B5\",\n \"euro\": \"1F4B6\",\n \"pound\": \"1F4B7\",\n \"money_with_wings\": \"1F4B8\",\n \"chart\": \"1F4B9\",\n \"seat\": \"1F4BA\",\n \"computer\": \"1F4BB\",\n \"briefcase\": \"1F4BC\",\n \"minidisc\": \"1F4BD\",\n \"floppy_disk\": \"1F4BE\",\n \"cd\": \"1F4BF\",\n \"dvd\": \"1F4C0\",\n \"file_folder\": \"1F4C1\",\n \"open_file_folder\": \"1F4C2\",\n \"page_with_curl\": \"1F4C3\",\n \"page_facing_up\": \"1F4C4\",\n \"date\": \"1F4C5\",\n \"calendar\": \"1F4C6\",\n \"card_index\": \"1F4C7\",\n \"chart_with_upwards_trend\": \"1F4C8\",\n \"chart_with_downwards_trend\": \"1F4C9\",\n \"bar_chart\": \"1F4CA\",\n \"clipboard\": \"1F4CB\",\n \"pushpin\": \"1F4CC\",\n \"round_pushpin\": \"1F4CD\",\n \"paperclip\": \"1F4CE\",\n \"straight_ruler\": \"1F4CF\",\n \"triangular_ruler\": \"1F4D0\",\n \"bookmark_tabs\": \"1F4D1\",\n \"ledger\": \"1F4D2\",\n \"notebook\": \"1F4D3\",\n \"notebook_with_decorative_cover\": \"1F4D4\",\n \"closed_book\": \"1F4D5\",\n \"book\": \"1F4D6\",\n \"green_book\": \"1F4D7\",\n \"blue_book\": \"1F4D8\",\n \"orange_book\": \"1F4D9\",\n \"books\": \"1F4DA\",\n \"name_badge\": \"1F4DB\",\n \"scroll\": \"1F4DC\",\n \"memo\": \"1F4DD\",\n \"telephone_receiver\": \"1F4DE\",\n \"pager\": \"1F4DF\",\n \"fax\": \"1F4E0\",\n \"satellite_antenna\": \"1F4E1\",\n \"loudspeaker\": \"1F4E2\",\n \"mega\": \"1F4E3\",\n \"outbox_tray\": \"1F4E4\",\n \"inbox_tray\": \"1F4E5\",\n \"package\": \"1F4E6\",\n \"e-mail\": \"1F4E7\",\n \"incoming_envelope\": \"1F4E8\",\n \"envelope_with_arrow\": \"1F4E9\",\n \"mailbox_closed\": \"1F4EA\",\n \"mailbox\": \"1F4EB\",\n \"mailbox_with_mail\": \"1F4EC\",\n \"mailbox_with_no_mail\": \"1F4ED\",\n \"postbox\": \"1F4EE\",\n \"postal_horn\": \"1F4EF\",\n \"newspaper\": \"1F4F0\",\n \"iphone\": \"1F4F1\",\n \"calling\": \"1F4F2\",\n \"vibration_mode\": \"1F4F3\",\n \"mobile_phone_off\": \"1F4F4\",\n \"no_mobile_phones\": \"1F4F5\",\n \"signal_strength\": \"1F4F6\",\n \"camera\": \"1F4F7\",\n \"camera_with_flash\": \"1F4F8\",\n \"video_camera\": \"1F4F9\",\n \"tv\": \"1F4FA\",\n \"radio\": \"1F4FB\",\n \"vhs\": \"1F4FC\",\n \"film_projector\": \"1F4FD-FE0F\",\n \"prayer_beads\": \"1F4FF\",\n \"twisted_rightwards_arrows\": \"1F500\",\n \"repeat\": \"1F501\",\n \"repeat_one\": \"1F502\",\n \"arrows_clockwise\": \"1F503\",\n \"arrows_counterclockwise\": \"1F504\",\n \"low_brightness\": \"1F505\",\n \"high_brightness\": \"1F506\",\n \"mute\": \"1F507\",\n \"speaker\": \"1F508\",\n \"sound\": \"1F509\",\n \"loud_sound\": \"1F50A\",\n \"battery\": \"1F50B\",\n \"electric_plug\": \"1F50C\",\n \"mag\": \"1F50D\",\n \"mag_right\": \"1F50E\",\n \"lock_with_ink_pen\": \"1F50F\",\n \"closed_lock_with_key\": \"1F510\",\n \"key\": \"1F511\",\n \"lock\": \"1F512\",\n \"unlock\": \"1F513\",\n \"bell\": \"1F514\",\n \"no_bell\": \"1F515\",\n \"bookmark\": \"1F516\",\n \"link\": \"1F517\",\n \"radio_button\": \"1F518\",\n \"back\": \"1F519\",\n \"end\": \"1F51A\",\n \"on\": \"1F51B\",\n \"soon\": \"1F51C\",\n \"top\": \"1F51D\",\n \"underage\": \"1F51E\",\n \"keycap_ten\": \"1F51F\",\n \"capital_abcd\": \"1F520\",\n \"abcd\": \"1F521\",\n \"1234\": \"1F522\",\n \"symbols\": \"1F523\",\n \"abc\": \"1F524\",\n \"fire\": \"1F525\",\n \"flashlight\": \"1F526\",\n \"wrench\": \"1F527\",\n \"hammer\": \"1F528\",\n \"nut_and_bolt\": \"1F529\",\n \"hocho\": \"1F52A\",\n \"gun\": \"1F52B\",\n \"microscope\": \"1F52C\",\n \"telescope\": \"1F52D\",\n \"crystal_ball\": \"1F52E\",\n \"six_pointed_star\": \"1F52F\",\n \"beginner\": \"1F530\",\n \"trident\": \"1F531\",\n \"black_square_button\": \"1F532\",\n \"white_square_button\": \"1F533\",\n \"red_circle\": \"1F534\",\n \"large_blue_circle\": \"1F535\",\n \"large_orange_diamond\": \"1F536\",\n \"large_blue_diamond\": \"1F537\",\n \"small_orange_diamond\": \"1F538\",\n \"small_blue_diamond\": \"1F539\",\n \"small_red_triangle\": \"1F53A\",\n \"small_red_triangle_down\": \"1F53B\",\n \"arrow_up_small\": \"1F53C\",\n \"arrow_down_small\": \"1F53D\",\n \"om_symbol\": \"1F549-FE0F\",\n \"dove_of_peace\": \"1F54A-FE0F\",\n \"kaaba\": \"1F54B\",\n \"mosque\": \"1F54C\",\n \"synagogue\": \"1F54D\",\n \"menorah_with_nine_branches\": \"1F54E\",\n \"clock1\": \"1F550\",\n \"clock2\": \"1F551\",\n \"clock3\": \"1F552\",\n \"clock4\": \"1F553\",\n \"clock5\": \"1F554\",\n \"clock6\": \"1F555\",\n \"clock7\": \"1F556\",\n \"clock8\": \"1F557\",\n \"clock9\": \"1F558\",\n \"clock10\": \"1F559\",\n \"clock11\": \"1F55A\",\n \"clock12\": \"1F55B\",\n \"clock130\": \"1F55C\",\n \"clock230\": \"1F55D\",\n \"clock330\": \"1F55E\",\n \"clock430\": \"1F55F\",\n \"clock530\": \"1F560\",\n \"clock630\": \"1F561\",\n \"clock730\": \"1F562\",\n \"clock830\": \"1F563\",\n \"clock930\": \"1F564\",\n \"clock1030\": \"1F565\",\n \"clock1130\": \"1F566\",\n \"clock1230\": \"1F567\",\n \"candle\": \"1F56F-FE0F\",\n \"mantelpiece_clock\": \"1F570-FE0F\",\n \"hole\": \"1F573-FE0F\",\n \"man_in_business_suit_levitating\": \"1F574-FE0F\",\n \"female-detective\": \"1F575-FE0F-200D-2640-FE0F\",\n \"male-detective\": \"1F575-FE0F-200D-2642-FE0F\",\n \"sleuth_or_spy\": \"1F575-FE0F-200D-2642-FE0F\",\n \"dark_sunglasses\": \"1F576-FE0F\",\n \"spider\": \"1F577-FE0F\",\n \"spider_web\": \"1F578-FE0F\",\n \"joystick\": \"1F579-FE0F\",\n \"man_dancing\": \"1F57A\",\n \"linked_paperclips\": \"1F587-FE0F\",\n \"lower_left_ballpoint_pen\": \"1F58A-FE0F\",\n \"lower_left_fountain_pen\": \"1F58B-FE0F\",\n \"lower_left_paintbrush\": \"1F58C-FE0F\",\n \"lower_left_crayon\": \"1F58D-FE0F\",\n \"raised_hand_with_fingers_splayed\": \"1F590-FE0F\",\n \"middle_finger\": \"1F595\",\n \"spock-hand\": \"1F596\",\n \"black_heart\": \"1F5A4\",\n \"desktop_computer\": \"1F5A5-FE0F\",\n \"printer\": \"1F5A8-FE0F\",\n \"three_button_mouse\": \"1F5B1-FE0F\",\n \"trackball\": \"1F5B2-FE0F\",\n \"frame_with_picture\": \"1F5BC-FE0F\",\n \"card_index_dividers\": \"1F5C2-FE0F\",\n \"card_file_box\": \"1F5C3-FE0F\",\n \"file_cabinet\": \"1F5C4-FE0F\",\n \"wastebasket\": \"1F5D1-FE0F\",\n \"spiral_note_pad\": \"1F5D2-FE0F\",\n \"spiral_calendar_pad\": \"1F5D3-FE0F\",\n \"compression\": \"1F5DC-FE0F\",\n \"old_key\": \"1F5DD-FE0F\",\n \"rolled_up_newspaper\": \"1F5DE-FE0F\",\n \"dagger_knife\": \"1F5E1-FE0F\",\n \"speaking_head_in_silhouette\": \"1F5E3-FE0F\",\n \"left_speech_bubble\": \"1F5E8-FE0F\",\n \"right_anger_bubble\": \"1F5EF-FE0F\",\n \"ballot_box_with_ballot\": \"1F5F3-FE0F\",\n \"world_map\": \"1F5FA-FE0F\",\n \"mount_fuji\": \"1F5FB\",\n \"tokyo_tower\": \"1F5FC\",\n \"statue_of_liberty\": \"1F5FD\",\n \"japan\": \"1F5FE\",\n \"moyai\": \"1F5FF\",\n \"grinning\": \"1F600\",\n \"grin\": \"1F601\",\n \"joy\": \"1F602\",\n \"smiley\": \"1F603\",\n \"smile\": \"1F604\",\n \"sweat_smile\": \"1F605\",\n \"laughing\": \"1F606\",\n \"innocent\": \"1F607\",\n \"smiling_imp\": \"1F608\",\n \"wink\": \"1F609\",\n \"blush\": \"1F60A\",\n \"yum\": \"1F60B\",\n \"relieved\": \"1F60C\",\n \"heart_eyes\": \"1F60D\",\n \"sunglasses\": \"1F60E\",\n \"smirk\": \"1F60F\",\n \"neutral_face\": \"1F610\",\n \"expressionless\": \"1F611\",\n \"unamused\": \"1F612\",\n \"sweat\": \"1F613\",\n \"pensive\": \"1F614\",\n \"confused\": \"1F615\",\n \"confounded\": \"1F616\",\n \"kissing\": \"1F617\",\n \"kissing_heart\": \"1F618\",\n \"kissing_smiling_eyes\": \"1F619\",\n \"kissing_closed_eyes\": \"1F61A\",\n \"stuck_out_tongue\": \"1F61B\",\n \"stuck_out_tongue_winking_eye\": \"1F61C\",\n \"stuck_out_tongue_closed_eyes\": \"1F61D\",\n \"disappointed\": \"1F61E\",\n \"worried\": \"1F61F\",\n \"angry\": \"1F620\",\n \"rage\": \"1F621\",\n \"cry\": \"1F622\",\n \"persevere\": \"1F623\",\n \"triumph\": \"1F624\",\n \"disappointed_relieved\": \"1F625\",\n \"frowning\": \"1F626\",\n \"anguished\": \"1F627\",\n \"fearful\": \"1F628\",\n \"weary\": \"1F629\",\n \"sleepy\": \"1F62A\",\n \"tired_face\": \"1F62B\",\n \"grimacing\": \"1F62C\",\n \"sob\": \"1F62D\",\n \"open_mouth\": \"1F62E\",\n \"hushed\": \"1F62F\",\n \"cold_sweat\": \"1F630\",\n \"scream\": \"1F631\",\n \"astonished\": \"1F632\",\n \"flushed\": \"1F633\",\n \"sleeping\": \"1F634\",\n \"dizzy_face\": \"1F635\",\n \"no_mouth\": \"1F636\",\n \"mask\": \"1F637\",\n \"smile_cat\": \"1F638\",\n \"joy_cat\": \"1F639\",\n \"smiley_cat\": \"1F63A\",\n \"heart_eyes_cat\": \"1F63B\",\n \"smirk_cat\": \"1F63C\",\n \"kissing_cat\": \"1F63D\",\n \"pouting_cat\": \"1F63E\",\n \"crying_cat_face\": \"1F63F\",\n \"scream_cat\": \"1F640\",\n \"slightly_frowning_face\": \"1F641\",\n \"slightly_smiling_face\": \"1F642\",\n \"upside_down_face\": \"1F643\",\n \"face_with_rolling_eyes\": \"1F644\",\n \"woman-gesturing-no\": \"1F645-200D-2640-FE0F\",\n \"man-gesturing-no\": \"1F645-200D-2642-FE0F\",\n \"no_good\": \"1F645-200D-2640-FE0F\",\n \"woman-gesturing-ok\": \"1F646-200D-2640-FE0F\",\n \"man-gesturing-ok\": \"1F646-200D-2642-FE0F\",\n \"ok_woman\": \"1F646-200D-2640-FE0F\",\n \"woman-bowing\": \"1F647-200D-2640-FE0F\",\n \"man-bowing\": \"1F647-200D-2642-FE0F\",\n \"bow\": \"1F647-200D-2642-FE0F\",\n \"see_no_evil\": \"1F648\",\n \"hear_no_evil\": \"1F649\",\n \"speak_no_evil\": \"1F64A\",\n \"woman-raising-hand\": \"1F64B-200D-2640-FE0F\",\n \"man-raising-hand\": \"1F64B-200D-2642-FE0F\",\n \"raising_hand\": \"1F64B-200D-2640-FE0F\",\n \"raised_hands\": \"1F64C\",\n \"woman-frowning\": \"1F64D-200D-2640-FE0F\",\n \"man-frowning\": \"1F64D-200D-2642-FE0F\",\n \"person_frowning\": \"1F64D-200D-2640-FE0F\",\n \"woman-pouting\": \"1F64E-200D-2640-FE0F\",\n \"man-pouting\": \"1F64E-200D-2642-FE0F\",\n \"person_with_pouting_face\": \"1F64E-200D-2640-FE0F\",\n \"pray\": \"1F64F\",\n \"rocket\": \"1F680\",\n \"helicopter\": \"1F681\",\n \"steam_locomotive\": \"1F682\",\n \"railway_car\": \"1F683\",\n \"bullettrain_side\": \"1F684\",\n \"bullettrain_front\": \"1F685\",\n \"train2\": \"1F686\",\n \"metro\": \"1F687\",\n \"light_rail\": \"1F688\",\n \"station\": \"1F689\",\n \"tram\": \"1F68A\",\n \"train\": \"1F68B\",\n \"bus\": \"1F68C\",\n \"oncoming_bus\": \"1F68D\",\n \"trolleybus\": \"1F68E\",\n \"busstop\": \"1F68F\",\n \"minibus\": \"1F690\",\n \"ambulance\": \"1F691\",\n \"fire_engine\": \"1F692\",\n \"police_car\": \"1F693\",\n \"oncoming_police_car\": \"1F694\",\n \"taxi\": \"1F695\",\n \"oncoming_taxi\": \"1F696\",\n \"car\": \"1F697\",\n \"oncoming_automobile\": \"1F698\",\n \"blue_car\": \"1F699\",\n \"truck\": \"1F69A\",\n \"articulated_lorry\": \"1F69B\",\n \"tractor\": \"1F69C\",\n \"monorail\": \"1F69D\",\n \"mountain_railway\": \"1F69E\",\n \"suspension_railway\": \"1F69F\",\n \"mountain_cableway\": \"1F6A0\",\n \"aerial_tramway\": \"1F6A1\",\n \"ship\": \"1F6A2\",\n \"woman-rowing-boat\": \"1F6A3-200D-2640-FE0F\",\n \"man-rowing-boat\": \"1F6A3-200D-2642-FE0F\",\n \"rowboat\": \"1F6A3-200D-2642-FE0F\",\n \"speedboat\": \"1F6A4\",\n \"traffic_light\": \"1F6A5\",\n \"vertical_traffic_light\": \"1F6A6\",\n \"construction\": \"1F6A7\",\n \"rotating_light\": \"1F6A8\",\n \"triangular_flag_on_post\": \"1F6A9\",\n \"door\": \"1F6AA\",\n \"no_entry_sign\": \"1F6AB\",\n \"smoking\": \"1F6AC\",\n \"no_smoking\": \"1F6AD\",\n \"put_litter_in_its_place\": \"1F6AE\",\n \"do_not_litter\": \"1F6AF\",\n \"potable_water\": \"1F6B0\",\n \"non-potable_water\": \"1F6B1\",\n \"bike\": \"1F6B2\",\n \"no_bicycles\": \"1F6B3\",\n \"woman-biking\": \"1F6B4-200D-2640-FE0F\",\n \"man-biking\": \"1F6B4-200D-2642-FE0F\",\n \"bicyclist\": \"1F6B4-200D-2642-FE0F\",\n \"woman-mountain-biking\": \"1F6B5-200D-2640-FE0F\",\n \"man-mountain-biking\": \"1F6B5-200D-2642-FE0F\",\n \"mountain_bicyclist\": \"1F6B5-200D-2642-FE0F\",\n \"woman-walking\": \"1F6B6-200D-2640-FE0F\",\n \"man-walking\": \"1F6B6-200D-2642-FE0F\",\n \"walking\": \"1F6B6-200D-2642-FE0F\",\n \"no_pedestrians\": \"1F6B7\",\n \"children_crossing\": \"1F6B8\",\n \"mens\": \"1F6B9\",\n \"womens\": \"1F6BA\",\n \"restroom\": \"1F6BB\",\n \"baby_symbol\": \"1F6BC\",\n \"toilet\": \"1F6BD\",\n \"wc\": \"1F6BE\",\n \"shower\": \"1F6BF\",\n \"bath\": \"1F6C0\",\n \"bathtub\": \"1F6C1\",\n \"passport_control\": \"1F6C2\",\n \"customs\": \"1F6C3\",\n \"baggage_claim\": \"1F6C4\",\n \"left_luggage\": \"1F6C5\",\n \"couch_and_lamp\": \"1F6CB-FE0F\",\n \"sleeping_accommodation\": \"1F6CC\",\n \"shopping_bags\": \"1F6CD-FE0F\",\n \"bellhop_bell\": \"1F6CE-FE0F\",\n \"bed\": \"1F6CF-FE0F\",\n \"place_of_worship\": \"1F6D0\",\n \"octagonal_sign\": \"1F6D1\",\n \"shopping_trolley\": \"1F6D2\",\n \"hammer_and_wrench\": \"1F6E0-FE0F\",\n \"shield\": \"1F6E1-FE0F\",\n \"oil_drum\": \"1F6E2-FE0F\",\n \"motorway\": \"1F6E3-FE0F\",\n \"railway_track\": \"1F6E4-FE0F\",\n \"motor_boat\": \"1F6E5-FE0F\",\n \"small_airplane\": \"1F6E9-FE0F\",\n \"airplane_departure\": \"1F6EB\",\n \"airplane_arriving\": \"1F6EC\",\n \"satellite\": \"1F6F0-FE0F\",\n \"passenger_ship\": \"1F6F3-FE0F\",\n \"scooter\": \"1F6F4\",\n \"motor_scooter\": \"1F6F5\",\n \"canoe\": \"1F6F6\",\n \"sled\": \"1F6F7\",\n \"flying_saucer\": \"1F6F8\",\n \"zipper_mouth_face\": \"1F910\",\n \"money_mouth_face\": \"1F911\",\n \"face_with_thermometer\": \"1F912\",\n \"nerd_face\": \"1F913\",\n \"thinking_face\": \"1F914\",\n \"face_with_head_bandage\": \"1F915\",\n \"robot_face\": \"1F916\",\n \"hugging_face\": \"1F917\",\n \"the_horns\": \"1F918\",\n \"call_me_hand\": \"1F919\",\n \"raised_back_of_hand\": \"1F91A\",\n \"left-facing_fist\": \"1F91B\",\n \"right-facing_fist\": \"1F91C\",\n \"handshake\": \"1F91D\",\n \"crossed_fingers\": \"1F91E\",\n \"i_love_you_hand_sign\": \"1F91F\",\n \"face_with_cowboy_hat\": \"1F920\",\n \"clown_face\": \"1F921\",\n \"nauseated_face\": \"1F922\",\n \"rolling_on_the_floor_laughing\": \"1F923\",\n \"drooling_face\": \"1F924\",\n \"lying_face\": \"1F925\",\n \"woman-facepalming\": \"1F926-200D-2640-FE0F\",\n \"man-facepalming\": \"1F926-200D-2642-FE0F\",\n \"face_palm\": \"1F926\",\n \"sneezing_face\": \"1F927\",\n \"face_with_raised_eyebrow\": \"1F928\",\n \"star-struck\": \"1F929\",\n \"zany_face\": \"1F92A\",\n \"shushing_face\": \"1F92B\",\n \"face_with_symbols_on_mouth\": \"1F92C\",\n \"face_with_hand_over_mouth\": \"1F92D\",\n \"face_vomiting\": \"1F92E\",\n \"exploding_head\": \"1F92F\",\n \"pregnant_woman\": \"1F930\",\n \"breast-feeding\": \"1F931\",\n \"palms_up_together\": \"1F932\",\n \"selfie\": \"1F933\",\n \"prince\": \"1F934\",\n \"man_in_tuxedo\": \"1F935\",\n \"mrs_claus\": \"1F936\",\n \"woman-shrugging\": \"1F937-200D-2640-FE0F\",\n \"man-shrugging\": \"1F937-200D-2642-FE0F\",\n \"shrug\": \"1F937\",\n \"woman-cartwheeling\": \"1F938-200D-2640-FE0F\",\n \"man-cartwheeling\": \"1F938-200D-2642-FE0F\",\n \"person_doing_cartwheel\": \"1F938\",\n \"woman-juggling\": \"1F939-200D-2640-FE0F\",\n \"man-juggling\": \"1F939-200D-2642-FE0F\",\n \"juggling\": \"1F939\",\n \"fencer\": \"1F93A\",\n \"woman-wrestling\": \"1F93C-200D-2640-FE0F\",\n \"man-wrestling\": \"1F93C-200D-2642-FE0F\",\n \"wrestlers\": \"1F93C\",\n \"woman-playing-water-polo\": \"1F93D-200D-2640-FE0F\",\n \"man-playing-water-polo\": \"1F93D-200D-2642-FE0F\",\n \"water_polo\": \"1F93D\",\n \"woman-playing-handball\": \"1F93E-200D-2640-FE0F\",\n \"man-playing-handball\": \"1F93E-200D-2642-FE0F\",\n \"handball\": \"1F93E\",\n \"wilted_flower\": \"1F940\",\n \"drum_with_drumsticks\": \"1F941\",\n \"clinking_glasses\": \"1F942\",\n \"tumbler_glass\": \"1F943\",\n \"spoon\": \"1F944\",\n \"goal_net\": \"1F945\",\n \"first_place_medal\": \"1F947\",\n \"second_place_medal\": \"1F948\",\n \"third_place_medal\": \"1F949\",\n \"boxing_glove\": \"1F94A\",\n \"martial_arts_uniform\": \"1F94B\",\n \"curling_stone\": \"1F94C\",\n \"croissant\": \"1F950\",\n \"avocado\": \"1F951\",\n \"cucumber\": \"1F952\",\n \"bacon\": \"1F953\",\n \"potato\": \"1F954\",\n \"carrot\": \"1F955\",\n \"baguette_bread\": \"1F956\",\n \"green_salad\": \"1F957\",\n \"shallow_pan_of_food\": \"1F958\",\n \"stuffed_flatbread\": \"1F959\",\n \"egg\": \"1F95A\",\n \"glass_of_milk\": \"1F95B\",\n \"peanuts\": \"1F95C\",\n \"kiwifruit\": \"1F95D\",\n \"pancakes\": \"1F95E\",\n \"dumpling\": \"1F95F\",\n \"fortune_cookie\": \"1F960\",\n \"takeout_box\": \"1F961\",\n \"chopsticks\": \"1F962\",\n \"bowl_with_spoon\": \"1F963\",\n \"cup_with_straw\": \"1F964\",\n \"coconut\": \"1F965\",\n \"broccoli\": \"1F966\",\n \"pie\": \"1F967\",\n \"pretzel\": \"1F968\",\n \"cut_of_meat\": \"1F969\",\n \"sandwich\": \"1F96A\",\n \"canned_food\": \"1F96B\",\n \"crab\": \"1F980\",\n \"lion_face\": \"1F981\",\n \"scorpion\": \"1F982\",\n \"turkey\": \"1F983\",\n \"unicorn_face\": \"1F984\",\n \"eagle\": \"1F985\",\n \"duck\": \"1F986\",\n \"bat\": \"1F987\",\n \"shark\": \"1F988\",\n \"owl\": \"1F989\",\n \"fox_face\": \"1F98A\",\n \"butterfly\": \"1F98B\",\n \"deer\": \"1F98C\",\n \"gorilla\": \"1F98D\",\n \"lizard\": \"1F98E\",\n \"rhinoceros\": \"1F98F\",\n \"shrimp\": \"1F990\",\n \"squid\": \"1F991\",\n \"giraffe_face\": \"1F992\",\n \"zebra_face\": \"1F993\",\n \"hedgehog\": \"1F994\",\n \"sauropod\": \"1F995\",\n \"t-rex\": \"1F996\",\n \"cricket\": \"1F997\",\n \"cheese_wedge\": \"1F9C0\",\n \"face_with_monocle\": \"1F9D0\",\n \"adult\": \"1F9D1\",\n \"child\": \"1F9D2\",\n \"older_adult\": \"1F9D3\",\n \"bearded_person\": \"1F9D4\",\n \"person_with_headscarf\": \"1F9D5\",\n \"woman_in_steamy_room\": \"1F9D6-200D-2640-FE0F\",\n \"man_in_steamy_room\": \"1F9D6-200D-2642-FE0F\",\n \"person_in_steamy_room\": \"1F9D6-200D-2642-FE0F\",\n \"woman_climbing\": \"1F9D7-200D-2640-FE0F\",\n \"man_climbing\": \"1F9D7-200D-2642-FE0F\",\n \"person_climbing\": \"1F9D7-200D-2640-FE0F\",\n \"woman_in_lotus_position\": \"1F9D8-200D-2640-FE0F\",\n \"man_in_lotus_position\": \"1F9D8-200D-2642-FE0F\",\n \"person_in_lotus_position\": \"1F9D8-200D-2640-FE0F\",\n \"female_mage\": \"1F9D9-200D-2640-FE0F\",\n \"male_mage\": \"1F9D9-200D-2642-FE0F\",\n \"mage\": \"1F9D9-200D-2640-FE0F\",\n \"female_fairy\": \"1F9DA-200D-2640-FE0F\",\n \"male_fairy\": \"1F9DA-200D-2642-FE0F\",\n \"fairy\": \"1F9DA-200D-2640-FE0F\",\n \"female_vampire\": \"1F9DB-200D-2640-FE0F\",\n \"male_vampire\": \"1F9DB-200D-2642-FE0F\",\n \"vampire\": \"1F9DB-200D-2640-FE0F\",\n \"mermaid\": \"1F9DC-200D-2640-FE0F\",\n \"merman\": \"1F9DC-200D-2642-FE0F\",\n \"merperson\": \"1F9DC-200D-2642-FE0F\",\n \"female_elf\": \"1F9DD-200D-2640-FE0F\",\n \"male_elf\": \"1F9DD-200D-2642-FE0F\",\n \"elf\": \"1F9DD-200D-2642-FE0F\",\n \"female_genie\": \"1F9DE-200D-2640-FE0F\",\n \"male_genie\": \"1F9DE-200D-2642-FE0F\",\n \"genie\": \"1F9DE-200D-2642-FE0F\",\n \"female_zombie\": \"1F9DF-200D-2640-FE0F\",\n \"male_zombie\": \"1F9DF-200D-2642-FE0F\",\n \"zombie\": \"1F9DF-200D-2642-FE0F\",\n \"brain\": \"1F9E0\",\n \"orange_heart\": \"1F9E1\",\n \"billed_cap\": \"1F9E2\",\n \"scarf\": \"1F9E3\",\n \"gloves\": \"1F9E4\",\n \"coat\": \"1F9E5\",\n \"socks\": \"1F9E6\",\n \"bangbang\": \"203C-FE0F\",\n \"interrobang\": \"2049-FE0F\",\n \"tm\": \"2122-FE0F\",\n \"information_source\": \"2139-FE0F\",\n \"left_right_arrow\": \"2194-FE0F\",\n \"arrow_up_down\": \"2195-FE0F\",\n \"arrow_upper_left\": \"2196-FE0F\",\n \"arrow_upper_right\": \"2197-FE0F\",\n \"arrow_lower_right\": \"2198-FE0F\",\n \"arrow_lower_left\": \"2199-FE0F\",\n \"leftwards_arrow_with_hook\": \"21A9-FE0F\",\n \"arrow_right_hook\": \"21AA-FE0F\",\n \"watch\": \"231A\",\n \"hourglass\": \"231B\",\n \"keyboard\": \"2328-FE0F\",\n \"eject\": \"23CF-FE0F\",\n \"fast_forward\": \"23E9\",\n \"rewind\": \"23EA\",\n \"arrow_double_up\": \"23EB\",\n \"arrow_double_down\": \"23EC\",\n \"black_right_pointing_double_triangle_with_vertical_bar\": \"23ED-FE0F\",\n \"black_left_pointing_double_triangle_with_vertical_bar\": \"23EE-FE0F\",\n \"black_right_pointing_triangle_with_double_vertical_bar\": \"23EF-FE0F\",\n \"alarm_clock\": \"23F0\",\n \"stopwatch\": \"23F1-FE0F\",\n \"timer_clock\": \"23F2-FE0F\",\n \"hourglass_flowing_sand\": \"23F3\",\n \"double_vertical_bar\": \"23F8-FE0F\",\n \"black_square_for_stop\": \"23F9-FE0F\",\n \"black_circle_for_record\": \"23FA-FE0F\",\n \"m\": \"24C2-FE0F\",\n \"black_small_square\": \"25AA-FE0F\",\n \"white_small_square\": \"25AB-FE0F\",\n \"arrow_forward\": \"25B6-FE0F\",\n \"arrow_backward\": \"25C0-FE0F\",\n \"white_medium_square\": \"25FB-FE0F\",\n \"black_medium_square\": \"25FC-FE0F\",\n \"white_medium_small_square\": \"25FD\",\n \"black_medium_small_square\": \"25FE\",\n \"sunny\": \"2600-FE0F\",\n \"cloud\": \"2601-FE0F\",\n \"umbrella\": \"2602-FE0F\",\n \"snowman\": \"2603-FE0F\",\n \"comet\": \"2604-FE0F\",\n \"phone\": \"260E-FE0F\",\n \"ballot_box_with_check\": \"2611-FE0F\",\n \"umbrella_with_rain_drops\": \"2614\",\n \"coffee\": \"2615\",\n \"shamrock\": \"2618-FE0F\",\n \"point_up\": \"261D-FE0F\",\n \"skull_and_crossbones\": \"2620-FE0F\",\n \"radioactive_sign\": \"2622-FE0F\",\n \"biohazard_sign\": \"2623-FE0F\",\n \"orthodox_cross\": \"2626-FE0F\",\n \"star_and_crescent\": \"262A-FE0F\",\n \"peace_symbol\": \"262E-FE0F\",\n \"yin_yang\": \"262F-FE0F\",\n \"wheel_of_dharma\": \"2638-FE0F\",\n \"white_frowning_face\": \"2639-FE0F\",\n \"relaxed\": \"263A-FE0F\",\n \"female_sign\": \"2640-FE0F\",\n \"male_sign\": \"2642-FE0F\",\n \"aries\": \"2648\",\n \"taurus\": \"2649\",\n \"gemini\": \"264A\",\n \"cancer\": \"264B\",\n \"leo\": \"264C\",\n \"virgo\": \"264D\",\n \"libra\": \"264E\",\n \"scorpius\": \"264F\",\n \"sagittarius\": \"2650\",\n \"capricorn\": \"2651\",\n \"aquarius\": \"2652\",\n \"pisces\": \"2653\",\n \"spades\": \"2660-FE0F\",\n \"clubs\": \"2663-FE0F\",\n \"hearts\": \"2665-FE0F\",\n \"diamonds\": \"2666-FE0F\",\n \"hotsprings\": \"2668-FE0F\",\n \"recycle\": \"267B-FE0F\",\n \"wheelchair\": \"267F\",\n \"hammer_and_pick\": \"2692-FE0F\",\n \"anchor\": \"2693\",\n \"crossed_swords\": \"2694-FE0F\",\n \"medical_symbol\": \"2695-FE0F\",\n \"scales\": \"2696-FE0F\",\n \"alembic\": \"2697-FE0F\",\n \"gear\": \"2699-FE0F\",\n \"atom_symbol\": \"269B-FE0F\",\n \"fleur_de_lis\": \"269C-FE0F\",\n \"warning\": \"26A0-FE0F\",\n \"zap\": \"26A1\",\n \"white_circle\": \"26AA\",\n \"black_circle\": \"26AB\",\n \"coffin\": \"26B0-FE0F\",\n \"funeral_urn\": \"26B1-FE0F\",\n \"soccer\": \"26BD\",\n \"baseball\": \"26BE\",\n \"snowman_without_snow\": \"26C4\",\n \"partly_sunny\": \"26C5\",\n \"thunder_cloud_and_rain\": \"26C8-FE0F\",\n \"ophiuchus\": \"26CE\",\n \"pick\": \"26CF-FE0F\",\n \"helmet_with_white_cross\": \"26D1-FE0F\",\n \"chains\": \"26D3-FE0F\",\n \"no_entry\": \"26D4\",\n \"shinto_shrine\": \"26E9-FE0F\",\n \"church\": \"26EA\",\n \"mountain\": \"26F0-FE0F\",\n \"umbrella_on_ground\": \"26F1-FE0F\",\n \"fountain\": \"26F2\",\n \"golf\": \"26F3\",\n \"ferry\": \"26F4-FE0F\",\n \"boat\": \"26F5\",\n \"skier\": \"26F7-FE0F\",\n \"ice_skate\": \"26F8-FE0F\",\n \"woman-bouncing-ball\": \"26F9-FE0F-200D-2640-FE0F\",\n \"man-bouncing-ball\": \"26F9-FE0F-200D-2642-FE0F\",\n \"person_with_ball\": \"26F9-FE0F-200D-2642-FE0F\",\n \"tent\": \"26FA\",\n \"fuelpump\": \"26FD\",\n \"scissors\": \"2702-FE0F\",\n \"white_check_mark\": \"2705\",\n \"airplane\": \"2708-FE0F\",\n \"email\": \"2709-FE0F\",\n \"fist\": \"270A\",\n \"hand\": \"270B\",\n \"v\": \"270C-FE0F\",\n \"writing_hand\": \"270D-FE0F\",\n \"pencil2\": \"270F-FE0F\",\n \"black_nib\": \"2712-FE0F\",\n \"heavy_check_mark\": \"2714-FE0F\",\n \"heavy_multiplication_x\": \"2716-FE0F\",\n \"latin_cross\": \"271D-FE0F\",\n \"star_of_david\": \"2721-FE0F\",\n \"sparkles\": \"2728\",\n \"eight_spoked_asterisk\": \"2733-FE0F\",\n \"eight_pointed_black_star\": \"2734-FE0F\",\n \"snowflake\": \"2744-FE0F\",\n \"sparkle\": \"2747-FE0F\",\n \"x\": \"274C\",\n \"negative_squared_cross_mark\": \"274E\",\n \"question\": \"2753\",\n \"grey_question\": \"2754\",\n \"grey_exclamation\": \"2755\",\n \"exclamation\": \"2757\",\n \"heavy_heart_exclamation_mark_ornament\": \"2763-FE0F\",\n \"heart\": \"2764-FE0F\",\n \"heavy_plus_sign\": \"2795\",\n \"heavy_minus_sign\": \"2796\",\n \"heavy_division_sign\": \"2797\",\n \"arrow_right\": \"27A1-FE0F\",\n \"curly_loop\": \"27B0\",\n \"loop\": \"27BF\",\n \"arrow_heading_up\": \"2934-FE0F\",\n \"arrow_heading_down\": \"2935-FE0F\",\n \"arrow_left\": \"2B05-FE0F\",\n \"arrow_up\": \"2B06-FE0F\",\n \"arrow_down\": \"2B07-FE0F\",\n \"black_large_square\": \"2B1B\",\n \"white_large_square\": \"2B1C\",\n \"star\": \"2B50\",\n \"o\": \"2B55\",\n \"wavy_dash\": \"3030-FE0F\",\n \"part_alternation_mark\": \"303D-FE0F\",\n \"congratulations\": \"3297-FE0F\",\n \"secret\": \"3299-FE0F\"\n};\n"],"names":["name","emojis","unified","shortnames","hash","keycap_star","zero","one","two","three","four","five","six","seven","eight","nine","copyright","registered","mahjong","black_joker","a","b","o2","parking","ab","cl","cool","free","id","new","ng","ok","sos","up","vs","cn","de","es","fr","gb","it","jp","kr","ru","us","koko","sa","u7121","u6307","u7981","u7a7a","u5408","u6e80","u6709","u6708","u7533","u5272","u55b6","ideograph_advantage","accept","cyclone","foggy","closed_umbrella","night_with_stars","sunrise_over_mountains","sunrise","city_sunset","city_sunrise","rainbow","bridge_at_night","ocean","volcano","milky_way","earth_africa","earth_americas","earth_asia","globe_with_meridians","new_moon","waxing_crescent_moon","first_quarter_moon","moon","full_moon","waning_gibbous_moon","last_quarter_moon","waning_crescent_moon","crescent_moon","new_moon_with_face","first_quarter_moon_with_face","last_quarter_moon_with_face","full_moon_with_face","sun_with_face","star2","stars","thermometer","mostly_sunny","barely_sunny","partly_sunny_rain","rain_cloud","snow_cloud","lightning","tornado","fog","wind_blowing_face","hotdog","taco","burrito","chestnut","seedling","evergreen_tree","deciduous_tree","palm_tree","cactus","hot_pepper","tulip","cherry_blossom","rose","hibiscus","sunflower","blossom","corn","ear_of_rice","herb","four_leaf_clover","maple_leaf","fallen_leaf","leaves","mushroom","tomato","eggplant","grapes","melon","watermelon","tangerine","lemon","banana","pineapple","apple","green_apple","pear","peach","cherries","strawberry","hamburger","pizza","meat_on_bone","poultry_leg","rice_cracker","rice_ball","rice","curry","ramen","spaghetti","bread","fries","sweet_potato","dango","oden","sushi","fried_shrimp","fish_cake","icecream","shaved_ice","ice_cream","doughnut","cookie","chocolate_bar","candy","lollipop","custard","honey_pot","cake","bento","stew","fried_egg","fork_and_knife","tea","sake","wine_glass","cocktail","tropical_drink","beer","beers","baby_bottle","knife_fork_plate","champagne","popcorn","ribbon","gift","birthday","jack_o_lantern","christmas_tree","santa","fireworks","sparkler","balloon","tada","confetti_ball","tanabata_tree","crossed_flags","bamboo","dolls","flags","wind_chime","rice_scene","school_satchel","mortar_board","medal","reminder_ribbon","studio_microphone","level_slider","control_knobs","film_frames","admission_tickets","carousel_horse","ferris_wheel","roller_coaster","fishing_pole_and_fish","microphone","movie_camera","cinema","headphones","art","tophat","circus_tent","ticket","clapper","performing_arts","video_game","dart","slot_machine","game_die","bowling","flower_playing_cards","musical_note","notes","saxophone","guitar","musical_keyboard","trumpet","violin","musical_score","running_shirt_with_sash","tennis","ski","basketball","checkered_flag","snowboarder","runner","surfer","sports_medal","trophy","horse_racing","football","rugby_football","swimmer","weight_lifter","golfer","racing_motorcycle","racing_car","cricket_bat_and_ball","volleyball","field_hockey_stick_and_ball","ice_hockey_stick_and_puck","table_tennis_paddle_and_ball","snow_capped_mountain","camping","beach_with_umbrella","building_construction","house_buildings","cityscape","derelict_house_building","classical_building","desert","desert_island","national_park","stadium","house","house_with_garden","office","post_office","european_post_office","hospital","bank","atm","hotel","love_hotel","convenience_store","school","department_store","factory","izakaya_lantern","japanese_castle","european_castle","waving_white_flag","waving_black_flag","rosette","label","badminton_racquet_and_shuttlecock","bow_and_arrow","amphora","rat","mouse2","ox","water_buffalo","cow2","tiger2","leopard","rabbit2","cat2","dragon","crocodile","whale2","snail","snake","racehorse","ram","goat","sheep","monkey","rooster","chicken","dog2","pig2","boar","elephant","octopus","shell","bug","ant","bee","beetle","fish","tropical_fish","blowfish","turtle","hatching_chick","baby_chick","hatched_chick","bird","penguin","koala","poodle","dromedary_camel","camel","dolphin","mouse","cow","tiger","rabbit","cat","dragon_face","whale","horse","monkey_face","dog","pig","frog","hamster","wolf","bear","panda_face","pig_nose","feet","chipmunk","eyes","eye","ear","nose","lips","tongue","point_up_2","point_down","point_left","point_right","facepunch","wave","ok_hand","clap","open_hands","crown","womans_hat","eyeglasses","necktie","shirt","jeans","dress","kimono","bikini","womans_clothes","purse","handbag","pouch","mans_shoe","athletic_shoe","high_heel","sandal","boot","footprints","bust_in_silhouette","busts_in_silhouette","boy","girl","man","woman","family","couple","two_men_holding_hands","two_women_holding_hands","cop","dancers","bride_with_veil","person_with_blond_hair","man_with_gua_pi_mao","man_with_turban","older_man","older_woman","baby","construction_worker","princess","japanese_ogre","japanese_goblin","ghost","angel","alien","space_invader","imp","skull","information_desk_person","guardsman","dancer","lipstick","nail_care","massage","haircut","barber","syringe","pill","kiss","love_letter","ring","gem","couplekiss","bouquet","couple_with_heart","wedding","heartbeat","broken_heart","two_hearts","sparkling_heart","heartpulse","cupid","blue_heart","green_heart","yellow_heart","purple_heart","gift_heart","revolving_hearts","heart_decoration","diamond_shape_with_a_dot_inside","bulb","anger","bomb","zzz","boom","sweat_drops","droplet","dash","hankey","muscle","dizzy","speech_balloon","thought_balloon","white_flower","moneybag","currency_exchange","heavy_dollar_sign","credit_card","yen","dollar","euro","pound","money_with_wings","chart","seat","computer","briefcase","minidisc","floppy_disk","cd","dvd","file_folder","open_file_folder","page_with_curl","page_facing_up","date","calendar","card_index","chart_with_upwards_trend","chart_with_downwards_trend","bar_chart","clipboard","pushpin","round_pushpin","paperclip","straight_ruler","triangular_ruler","bookmark_tabs","ledger","notebook","notebook_with_decorative_cover","closed_book","book","green_book","blue_book","orange_book","books","name_badge","scroll","memo","telephone_receiver","pager","fax","satellite_antenna","loudspeaker","mega","outbox_tray","inbox_tray","package","incoming_envelope","envelope_with_arrow","mailbox_closed","mailbox","mailbox_with_mail","mailbox_with_no_mail","postbox","postal_horn","newspaper","iphone","calling","vibration_mode","mobile_phone_off","no_mobile_phones","signal_strength","camera","camera_with_flash","video_camera","tv","radio","vhs","film_projector","prayer_beads","twisted_rightwards_arrows","repeat","repeat_one","arrows_clockwise","arrows_counterclockwise","low_brightness","high_brightness","mute","speaker","sound","loud_sound","battery","electric_plug","mag","mag_right","lock_with_ink_pen","closed_lock_with_key","key","lock","unlock","bell","no_bell","bookmark","link","radio_button","back","end","on","soon","top","underage","keycap_ten","capital_abcd","abcd","symbols","abc","fire","flashlight","wrench","hammer","nut_and_bolt","hocho","gun","microscope","telescope","crystal_ball","six_pointed_star","beginner","trident","black_square_button","white_square_button","red_circle","large_blue_circle","large_orange_diamond","large_blue_diamond","small_orange_diamond","small_blue_diamond","small_red_triangle","small_red_triangle_down","arrow_up_small","arrow_down_small","om_symbol","dove_of_peace","kaaba","mosque","synagogue","menorah_with_nine_branches","clock1","clock2","clock3","clock4","clock5","clock6","clock7","clock8","clock9","clock10","clock11","clock12","clock130","clock230","clock330","clock430","clock530","clock630","clock730","clock830","clock930","clock1030","clock1130","clock1230","candle","mantelpiece_clock","hole","man_in_business_suit_levitating","sleuth_or_spy","dark_sunglasses","spider","spider_web","joystick","man_dancing","linked_paperclips","lower_left_ballpoint_pen","lower_left_fountain_pen","lower_left_paintbrush","lower_left_crayon","raised_hand_with_fingers_splayed","middle_finger","black_heart","desktop_computer","printer","three_button_mouse","trackball","frame_with_picture","card_index_dividers","card_file_box","file_cabinet","wastebasket","spiral_note_pad","spiral_calendar_pad","compression","old_key","rolled_up_newspaper","dagger_knife","speaking_head_in_silhouette","left_speech_bubble","right_anger_bubble","ballot_box_with_ballot","world_map","mount_fuji","tokyo_tower","statue_of_liberty","japan","moyai","grinning","grin","joy","smiley","smile","sweat_smile","laughing","innocent","smiling_imp","wink","blush","yum","relieved","heart_eyes","sunglasses","smirk","neutral_face","expressionless","unamused","sweat","pensive","confused","confounded","kissing","kissing_heart","kissing_smiling_eyes","kissing_closed_eyes","stuck_out_tongue","stuck_out_tongue_winking_eye","stuck_out_tongue_closed_eyes","disappointed","worried","angry","rage","cry","persevere","triumph","disappointed_relieved","frowning","anguished","fearful","weary","sleepy","tired_face","grimacing","sob","open_mouth","hushed","cold_sweat","scream","astonished","flushed","sleeping","dizzy_face","no_mouth","mask","smile_cat","joy_cat","smiley_cat","heart_eyes_cat","smirk_cat","kissing_cat","pouting_cat","crying_cat_face","scream_cat","slightly_frowning_face","slightly_smiling_face","upside_down_face","face_with_rolling_eyes","no_good","ok_woman","bow","see_no_evil","hear_no_evil","speak_no_evil","raising_hand","raised_hands","person_frowning","person_with_pouting_face","pray","rocket","helicopter","steam_locomotive","railway_car","bullettrain_side","bullettrain_front","train2","metro","light_rail","station","tram","train","bus","oncoming_bus","trolleybus","busstop","minibus","ambulance","fire_engine","police_car","oncoming_police_car","taxi","oncoming_taxi","car","oncoming_automobile","blue_car","truck","articulated_lorry","tractor","monorail","mountain_railway","suspension_railway","mountain_cableway","aerial_tramway","ship","rowboat","speedboat","traffic_light","vertical_traffic_light","construction","rotating_light","triangular_flag_on_post","door","no_entry_sign","smoking","no_smoking","put_litter_in_its_place","do_not_litter","potable_water","bike","no_bicycles","bicyclist","mountain_bicyclist","walking","no_pedestrians","children_crossing","mens","womens","restroom","baby_symbol","toilet","wc","shower","bath","bathtub","passport_control","customs","baggage_claim","left_luggage","couch_and_lamp","sleeping_accommodation","shopping_bags","bellhop_bell","bed","place_of_worship","octagonal_sign","shopping_trolley","hammer_and_wrench","shield","oil_drum","motorway","railway_track","motor_boat","small_airplane","airplane_departure","airplane_arriving","satellite","passenger_ship","scooter","motor_scooter","canoe","sled","flying_saucer","zipper_mouth_face","money_mouth_face","face_with_thermometer","nerd_face","thinking_face","face_with_head_bandage","robot_face","hugging_face","the_horns","call_me_hand","raised_back_of_hand","handshake","crossed_fingers","i_love_you_hand_sign","face_with_cowboy_hat","clown_face","nauseated_face","rolling_on_the_floor_laughing","drooling_face","lying_face","face_palm","sneezing_face","face_with_raised_eyebrow","zany_face","shushing_face","face_with_symbols_on_mouth","face_with_hand_over_mouth","face_vomiting","exploding_head","pregnant_woman","palms_up_together","selfie","prince","man_in_tuxedo","mrs_claus","shrug","person_doing_cartwheel","juggling","fencer","wrestlers","water_polo","handball","wilted_flower","drum_with_drumsticks","clinking_glasses","tumbler_glass","spoon","goal_net","first_place_medal","second_place_medal","third_place_medal","boxing_glove","martial_arts_uniform","curling_stone","croissant","avocado","cucumber","bacon","potato","carrot","baguette_bread","green_salad","shallow_pan_of_food","stuffed_flatbread","egg","glass_of_milk","peanuts","kiwifruit","pancakes","dumpling","fortune_cookie","takeout_box","chopsticks","bowl_with_spoon","cup_with_straw","coconut","broccoli","pie","pretzel","cut_of_meat","sandwich","canned_food","crab","lion_face","scorpion","turkey","unicorn_face","eagle","duck","bat","shark","owl","fox_face","butterfly","deer","gorilla","lizard","rhinoceros","shrimp","squid","giraffe_face","zebra_face","hedgehog","sauropod","cricket","cheese_wedge","face_with_monocle","adult","child","older_adult","bearded_person","person_with_headscarf","woman_in_steamy_room","man_in_steamy_room","person_in_steamy_room","woman_climbing","man_climbing","person_climbing","woman_in_lotus_position","man_in_lotus_position","person_in_lotus_position","female_mage","male_mage","mage","female_fairy","male_fairy","fairy","female_vampire","male_vampire","vampire","mermaid","merman","merperson","female_elf","male_elf","elf","female_genie","male_genie","genie","female_zombie","male_zombie","zombie","brain","orange_heart","billed_cap","scarf","gloves","coat","socks","bangbang","interrobang","tm","information_source","left_right_arrow","arrow_up_down","arrow_upper_left","arrow_upper_right","arrow_lower_right","arrow_lower_left","leftwards_arrow_with_hook","arrow_right_hook","watch","hourglass","keyboard","eject","fast_forward","rewind","arrow_double_up","arrow_double_down","black_right_pointing_double_triangle_with_vertical_bar","black_left_pointing_double_triangle_with_vertical_bar","black_right_pointing_triangle_with_double_vertical_bar","alarm_clock","stopwatch","timer_clock","hourglass_flowing_sand","double_vertical_bar","black_square_for_stop","black_circle_for_record","m","black_small_square","white_small_square","arrow_forward","arrow_backward","white_medium_square","black_medium_square","white_medium_small_square","black_medium_small_square","sunny","cloud","umbrella","snowman","comet","phone","ballot_box_with_check","umbrella_with_rain_drops","coffee","shamrock","point_up","skull_and_crossbones","radioactive_sign","biohazard_sign","orthodox_cross","star_and_crescent","peace_symbol","yin_yang","wheel_of_dharma","white_frowning_face","relaxed","female_sign","male_sign","aries","taurus","gemini","cancer","leo","virgo","libra","scorpius","sagittarius","capricorn","aquarius","pisces","spades","clubs","hearts","diamonds","hotsprings","recycle","wheelchair","hammer_and_pick","anchor","crossed_swords","medical_symbol","scales","alembic","gear","atom_symbol","fleur_de_lis","warning","zap","white_circle","black_circle","coffin","funeral_urn","soccer","baseball","snowman_without_snow","partly_sunny","thunder_cloud_and_rain","ophiuchus","pick","helmet_with_white_cross","chains","no_entry","shinto_shrine","church","mountain","umbrella_on_ground","fountain","golf","ferry","boat","skier","ice_skate","person_with_ball","tent","fuelpump","scissors","white_check_mark","airplane","email","fist","hand","v","writing_hand","pencil2","black_nib","heavy_check_mark","heavy_multiplication_x","latin_cross","star_of_david","sparkles","eight_spoked_asterisk","eight_pointed_black_star","snowflake","sparkle","x","negative_squared_cross_mark","question","grey_question","grey_exclamation","exclamation","heavy_heart_exclamation_mark_ornament","heart","heavy_plus_sign","heavy_minus_sign","heavy_division_sign","arrow_right","curly_loop","loop","arrow_heading_up","arrow_heading_down","arrow_left","arrow_up","arrow_down","black_large_square","white_large_square","star","o","wavy_dash","part_alternation_mark","congratulations","secret"],"mappings":"qLAsB0B,CACtB,CACIA,KAAQ,mBACRC,OAAU,CACN,CACIC,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,kCAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,YACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,0BAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,6BAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,2BAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,0BAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,iCAGR,CACID,QAAW,QACXC,WAAc,CACV,iCAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,YACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,2BAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,+BAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,0BAGR,CACID,QAAW,QACXC,WAAc,CACV,2BAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,8BAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,YACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,uBACXC,WAAc,CACV,gBAGR,CACID,QAAW,uBACXC,WAAc,CACV,kBAGR,CACID,QAAW,mBACXC,WAAc,CACV,iBAGR,CACID,QAAW,mBACXC,WAAc,CACV,mBAGR,CACID,QAAW,mBACXC,WAAc,CACV,iBAGR,CACID,QAAW,mBACXC,WAAc,CACV,mBAGR,CACID,QAAW,uBACXC,WAAc,CACV,eAGR,CACID,QAAW,uBACXC,WAAc,CACV,iBAGR,CACID,QAAW,mBACXC,WAAc,CACV,gBAGR,CACID,QAAW,mBACXC,WAAc,CACV,kBAGR,CACID,QAAW,mBACXC,WAAc,CACV,cAGR,CACID,QAAW,mBACXC,WAAc,CACV,gBAGR,CACID,QAAW,mBACXC,WAAc,CACV,kBAGR,CACID,QAAW,mBACXC,WAAc,CACV,oBAGR,CACID,QAAW,mBACXC,WAAc,CACV,wBAGR,CACID,QAAW,mBACXC,WAAc,CACV,0BAGR,CACID,QAAW,mBACXC,WAAc,CACV,uBAGR,CACID,QAAW,mBACXC,WAAc,CACV,yBAGR,CACID,QAAW,mBACXC,WAAc,CACV,mBAGR,CACID,QAAW,mBACXC,WAAc,CACV,qBAGR,CACID,QAAW,mBACXC,WAAc,CACV,sBAGR,CACID,QAAW,mBACXC,WAAc,CACV,wBAGR,CACID,QAAW,mBACXC,WAAc,CACV,gBAGR,CACID,QAAW,mBACXC,WAAc,CACV,kBAGR,CACID,QAAW,mBACXC,WAAc,CACV,gBAGR,CACID,QAAW,mBACXC,WAAc,CACV,kBAGR,CACID,QAAW,uBACXC,WAAc,CACV,eAGR,CACID,QAAW,uBACXC,WAAc,CACV,iBAGR,CACID,QAAW,mBACXC,WAAc,CACV,mBAGR,CACID,QAAW,mBACXC,WAAc,CACV,qBAGR,CACID,QAAW,mBACXC,WAAc,CACV,qBAGR,CACID,QAAW,mBACXC,WAAc,CACV,uBAGR,CACID,QAAW,uBACGC,WAAA,CACV,sBACA,QAGR,CACID,QAAW,uBACXC,WAAc,CACV,0BAGR,CACID,QAAW,4BACGC,WAAA,CACV,iBACA,kBAGR,CACID,QAAW,4BACXC,WAAc,CACV,qBAGR,CACID,QAAW,uBACGC,WAAA,CACV,aACA,cAGR,CACID,QAAW,uBACXC,WAAc,CACV,iBAGR,CACID,QAAW,uBACGC,WAAA,CACV,2BACA,wBAGR,CACID,QAAW,uBACXC,WAAc,CACV,+BAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,uBACGC,WAAA,CACV,qBACA,oBAGR,CACID,QAAW,uBACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,0BAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,uBACGC,WAAA,CACV,mBACA,2BAGR,CACID,QAAW,uBACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,uBACGC,WAAA,CACV,cACA,SAGR,CACID,QAAW,uBACXC,WAAc,CACV,cAGR,CACID,QAAW,uBACGC,WAAA,CACV,eACA,UAGR,CACID,QAAW,uBACXC,WAAc,CACV,eAGR,CACID,QAAW,uBACGC,WAAA,CACV,iBACA,YAGR,CACID,QAAW,uBACXC,WAAc,CACV,iBAGR,CACID,QAAW,uBACXC,WAAc,CACV,YAGR,CACID,QAAW,uBACGC,WAAA,CACV,SACA,cAGR,CACID,QAAW,uBACXC,WAAc,CACV,eAGR,CACID,QAAW,uBACGC,WAAA,CACV,WACA,QAGR,CACID,QAAW,uBACXC,WAAc,CACV,iBAGR,CACID,QAAW,uBACGC,WAAA,CACV,aACA,UAGR,CACID,QAAW,uBACXC,WAAc,CACV,kBAGR,CACID,QAAW,uBACGC,WAAA,CACV,cACA,WAGR,CACID,QAAW,uBACXC,WAAc,CACV,iBAGR,CACID,QAAW,uBACGC,WAAA,CACV,iBACA,oBAGR,CACID,QAAW,uBACXC,WAAc,CACV,gBAGR,CACID,QAAW,uBACGC,WAAA,CACV,gBACA,6BAGR,CACID,QAAW,uBACXC,WAAc,CACV,qBAGR,CACID,QAAW,uBACGC,WAAA,CACV,qBACA,YAGR,CACID,QAAW,uBACXC,WAAc,CACV,qBAGR,CACID,QAAW,uBACGC,WAAA,CACV,qBACA,aAGR,CACID,QAAW,uBACXC,WAAc,CACV,qBAGR,CACID,QAAW,uBACGC,WAAA,CACV,qBACA,4BAGR,CACID,QAAW,uBACXC,WAAc,CACV,qBAGR,CACID,QAAW,uBACGC,WAAA,CACV,qBACA,iBAGR,CACID,QAAW,uBACGC,WAAA,CACV,aACA,QAGR,CACID,QAAW,uBACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,uBACXC,WAAc,CACV,oBAGR,CACID,QAAW,uBACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,uBACXC,WAAc,CACV,kBAGR,CACID,QAAW,uBACXC,WAAc,CACV,oBAGR,CACID,QAAW,uBACXC,WAAc,CACV,wBAGR,CACID,QAAW,uBACGC,WAAA,CACV,wBACA,YAGR,CACID,QAAW,uBACXC,WAAc,CACV,wBAGR,CACID,QAAW,uBACGC,WAAA,CACV,wBACA,YAGR,CACID,QAAW,uBACGC,WAAA,CACV,cACA,YAGR,CACID,QAAW,uBACXC,WAAc,CACV,kBAGR,CACID,QAAW,uBACGC,WAAA,CACV,cACA,WAGR,CACID,QAAW,uBACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,uBACXC,WAAc,CACV,iCAGR,CACID,QAAW,uBACGC,WAAA,CACV,iCACA,YAGR,CACID,QAAW,uBACXC,WAAc,CACV,yBAGR,CACID,QAAW,uBACGC,WAAA,CACV,qBACA,0BAGR,CACID,QAAW,uBACGC,WAAA,CACV,iBACA,oBAGR,CACID,QAAW,uBACXC,WAAc,CACV,iBAGR,CACID,QAAW,uBACGC,WAAA,CACV,0BACA,6BAGR,CACID,QAAW,uBACXC,WAAc,CACV,0BAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,2BAGR,CACID,QAAW,aACXC,WAAc,CACV,oCAGR,CACID,QAAW,aACXC,WAAc,CACV,gCAGR,CACID,QAAW,QACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,YACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,4BACGC,WAAA,CACV,cACA,WAGR,CACID,QAAW,4BACXC,WAAc,CACV,kBAGR,CACID,QAAW,uBACGC,WAAA,CACV,cACA,WAGR,CACID,QAAW,uBACXC,WAAc,CACV,kBAGR,CACID,QAAW,uBACGC,WAAA,CACV,kBACA,YAGR,CACID,QAAW,uBACXC,WAAc,CACV,sBAGR,CACID,QAAW,uBACGC,WAAA,CACV,eACA,YAGR,CACID,QAAW,uBACXC,WAAc,CACV,mBAGR,CACID,QAAW,2BACGC,WAAA,CACV,oBACA,qBAGR,CACID,QAAW,2BACXC,WAAc,CACV,wBAGR,CACID,QAAW,4BACGC,WAAA,CACV,sBACA,kBAGR,CACID,QAAW,4BACXC,WAAc,CACV,0BAGR,CACID,QAAW,uBACGC,WAAA,CACV,aACA,cAGR,CACID,QAAW,uBACXC,WAAc,CACV,iBAGR,CACID,QAAW,uBACGC,WAAA,CACV,sBACA,uBAGR,CACID,QAAW,uBACXC,WAAc,CACV,0BAGR,CACID,QAAW,aACXC,WAAc,CACV,eAGR,CACID,QAAW,aACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,2BAGR,CACID,QAAW,uBACXC,WAAc,CACV,qBAGR,CACID,QAAW,uBACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,uBACXC,WAAc,CACV,kBAGR,CACID,QAAW,uBACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,uBACXC,WAAc,CACV,2BAGR,CACID,QAAW,uBACXC,WAAc,CACV,6BAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,uBACXC,WAAc,CACV,yBAGR,CACID,QAAW,uBACXC,WAAc,CACV,2BAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,uBACXC,WAAc,CACV,iBAGR,CACID,QAAW,uBACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,0BAGR,CACID,QAAW,QACXC,WAAc,CACV,4BAGR,CACID,QAAW,6CACGC,WAAA,CACV,iBACA,eAGR,CACID,QAAW,6CACXC,WAAc,CACV,iBAGR,CACID,QAAW,6CACXC,WAAc,CACV,qBAGR,CACID,QAAW,kCACGC,WAAA,CACV,kBACA,sBAGR,CACID,QAAW,kCACXC,WAAc,CACV,kBAGR,CACID,QAAW,kCACXC,WAAc,CACV,sBAGR,CACID,QAAW,8BACGC,WAAA,CACV,gBACA,WAGR,CACID,QAAW,8BACXC,WAAc,CACV,mBAGR,CACID,QAAW,yCACXC,WAAc,CACV,uBAGR,CACID,QAAW,yCACXC,WAAc,CACV,sBAGR,CACID,QAAW,yCACXC,WAAc,CACV,wBAGR,CACID,QAAW,8BACXC,WAAc,CACV,gBAGR,CACID,QAAW,8BACXC,WAAc,CACV,iBAGR,CACID,QAAW,yCACXC,WAAc,CACV,qBAGR,CACID,QAAW,yCACXC,WAAc,CACV,oBAGR,CACID,QAAW,yCACXC,WAAc,CACV,sBAGR,CACID,QAAW,8BACXC,WAAc,CACV,oBAGR,CACID,QAAW,8BACXC,WAAc,CACV,qBAGR,CACID,QAAW,yCACXC,WAAc,CACV,yBAGR,CACID,QAAW,yCACXC,WAAc,CACV,wBAGR,CACID,QAAW,yCACXC,WAAc,CACV,0BAGR,CACID,QAAW,mBACXC,WAAc,CACV,YAGR,CACID,QAAW,8BACXC,WAAc,CACV,gBAGR,CACID,QAAW,mBACXC,WAAc,CACV,aAGR,CACID,QAAW,8BACXC,WAAc,CACV,iBAGR,CACID,QAAW,8BACXC,WAAc,CACV,kBAGR,CACID,QAAW,mBACXC,WAAc,CACV,cAGR,CACID,QAAW,8BACXC,WAAc,CACV,kBAGR,CACID,QAAW,mBACXC,WAAc,CACV,eAGR,CACID,QAAW,8BACXC,WAAc,CACV,mBAGR,CACID,QAAW,8BACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,YACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,YACXC,WAAc,CACV,MAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,aACXC,WAAc,CACV,qCAGR,CACID,QAAW,OACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,OACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,YACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,aACXC,WAAc,CACV,QAGR,CACID,QAAW,6BACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,YACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,0CAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,aACXC,WAAc,CACV,uBAGR,CACID,QAAW,aACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,aACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,aACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,aACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,YACXC,WAAc,CACV,4BAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAKhB,CACIH,KAAQ,mBACRC,OAAU,CACN,CACIC,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,aACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,aACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,aACXC,WAAc,CACV,WAGR,CACID,QAAW,aACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,aACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,YACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAKhB,CACIH,KAAQ,eACRC,OAAU,CACN,CACIC,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,aACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,OACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,aACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,cAKhB,CACIH,KAAQ,kBACRC,OAAU,CACN,CACIC,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,aACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,aACXC,WAAc,CACV,yBAGR,CACID,QAAW,YACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,aACXC,WAAc,CACV,YAGR,CACID,QAAW,aACXC,WAAc,CACV,wBAGR,CACID,QAAW,aACXC,WAAc,CACV,WAGR,CACID,QAAW,aACXC,WAAc,CACV,kBAGR,CACID,QAAW,aACXC,WAAc,CACV,kBAGR,CACID,QAAW,aACXC,WAAc,CACV,YAGR,CACID,QAAW,aACXC,WAAc,CACV,uBAGR,CACID,QAAW,aACXC,WAAc,CACV,0BAGR,CACID,QAAW,aACXC,WAAc,CACV,oBAGR,CACID,QAAW,aACXC,WAAc,CACV,cAGR,CACID,QAAW,aACXC,WAAc,CACV,4BAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,OACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,YACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,OACXC,WAAc,CACV,aAGR,CACID,QAAW,OACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,2BAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,YACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,aACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,aACXC,WAAc,CACV,aAGR,CACID,QAAW,aACXC,WAAc,CACV,kBAGR,CACID,QAAW,OACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,2BAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,OACXC,WAAc,CACV,WAGR,CACID,QAAW,OACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,aACXC,WAAc,CACV,mBAGR,CACID,QAAW,YACXC,WAAc,CACV,UAGR,CACID,QAAW,aACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,YACXC,WAAc,CACV,aAGR,CACID,QAAW,aACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,aACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,aACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,aACXC,WAAc,CACV,QAGR,CACID,QAAW,aACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,OACXC,WAAc,CACV,cAGR,CACID,QAAW,OACXC,WAAc,CACV,2BAGR,CACID,QAAW,OACXC,WAAc,CACV,UAGR,CACID,QAAW,OACXC,WAAc,CACV,gBAGR,CACID,QAAW,YACXC,WAAc,CACV,cAGR,CACID,QAAW,YACXC,WAAc,CACV,gBAGR,CACID,QAAW,aACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,iCAGR,CACID,QAAW,QACXC,WAAc,CACV,gCAGR,CACID,QAAW,aACXC,WAAc,CACV,gBAGR,CACID,QAAW,YACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,OACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,YACXC,WAAc,CACV,UAGR,CACID,QAAW,OACXC,WAAc,CACV,iBAGR,CACID,QAAW,YACXC,WAAc,CACV,2BAGR,CACID,QAAW,aACXC,WAAc,CACV,iBAGR,CACID,QAAW,aACXC,WAAc,CACV,iBAGR,CACID,QAAW,aACXC,WAAc,CACV,sBAGR,CACID,QAAW,aACXC,WAAc,CACV,eAGR,CACID,QAAW,aACXC,WAAc,CACV,eAGR,CACID,QAAW,aACXC,WAAc,CACV,cAGR,CACID,QAAW,aACXC,WAAc,CACV,YAGR,CACID,QAAW,aACXC,WAAc,CACV,QAGR,CACID,QAAW,aACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,YACXC,WAAc,CACV,aAGR,CACID,QAAW,OACXC,WAAc,CACV,6BAGR,CACID,QAAW,YACXC,WAAc,CACV,uBAGR,CACID,QAAW,OACXC,WAAc,CACV,QAGR,CACID,QAAW,YACXC,WAAc,CACV,cAGR,CACID,QAAW,YACXC,WAAc,CACV,YAGR,CACID,QAAW,OACXC,WAAc,CACV,yBAGR,CACID,QAAW,YACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,YAKhB,CACIH,KAAQ,aACRC,OAAU,CACN,CACIC,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,OACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,aACXC,WAAc,CACV,oBAGR,CACID,QAAW,aACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,aACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,OACXC,WAAc,CACV,WAGR,CACID,QAAW,OACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,gCAGR,CACID,QAAW,QACXC,WAAc,CACV,8BAGR,CACID,QAAW,QACXC,WAAc,CACV,iCAGR,CACID,QAAW,QACXC,WAAc,CACV,sCAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,OACXC,WAAc,CACV,SAGR,CACID,QAAW,YACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,0BAGR,CACID,QAAW,QACXC,WAAc,CACV,4BAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,aACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,YACXC,WAAc,CACV,WAGR,CACID,QAAW,YACXC,WAAc,CACV,WAGR,CACID,QAAW,YACXC,WAAc,CACV,aAGR,CACID,QAAW,YACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,2BAKhB,CACIH,KAAQ,UACRC,OAAU,CACN,CACIC,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,aACXC,WAAc,CACV,sBAGR,CACID,QAAW,aACXC,WAAc,CACV,iBAGR,CACID,QAAW,aACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,YACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,aACXC,WAAc,CACV,qBAGR,CACID,QAAW,aACXC,WAAc,CACV,YAGR,CACID,QAAW,YACXC,WAAc,CACV,aAGR,CACID,QAAW,aACXC,WAAc,CACV,uBAGR,CACID,QAAW,aACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,aACXC,WAAc,CACV,gBAGR,CACID,QAAW,aACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,aACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,mCAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,aACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,aACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,YACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,aACXC,WAAc,CACV,2BAGR,CACID,QAAW,YACXC,WAAc,CACV,YAGR,CACID,QAAW,YACXC,WAAc,CACV,cAGR,CACID,QAAW,aACXC,WAAc,CACV,4BAGR,CACID,QAAW,aACXC,WAAc,CACV,6BAGR,CACID,QAAW,aACXC,WAAc,CACV,0BAGR,CACID,QAAW,aACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,aACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,aACXC,WAAc,CACV,oBAGR,CACID,QAAW,aACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,6BAGR,CACID,QAAW,QACXC,WAAc,CACV,+BAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,cAGR,CACID,QAAW,aACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,aAGR,CACID,QAAW,aACXC,WAAc,CACV,kBAGR,CACID,QAAW,aACXC,WAAc,CACV,iBAGR,CACID,QAAW,aACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,aACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,YACXC,WAAc,CACV,SAGR,CACID,QAAW,YACXC,WAAc,CACV,oBAGR,CACID,QAAW,aACXC,WAAc,CACV,sBAGR,CACID,QAAW,aACXC,WAAc,CACV,iBAGR,CACID,QAAW,YACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,aACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,YACXC,WAAc,CACV,SAGR,CACID,QAAW,aACXC,WAAc,CACV,gBAGR,CACID,QAAW,YACXC,WAAc,CACV,YAGR,CACID,QAAW,YACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,YACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,YACXC,WAAc,CACV,WAGR,CACID,QAAW,YACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,aACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,uBAKhB,CACIH,KAAQ,UACRC,OAAU,CACN,CACIC,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,4BAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,OACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,YACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,OACXC,WAAc,CACV,aAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,gBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,YACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,mBAGR,CACID,QAAW,YACXC,WAAc,CACV,aAGR,CACID,QAAW,YACXC,WAAc,CACV,sBAGR,CACID,QAAW,YACXC,WAAc,CACV,gBAGR,CACID,QAAW,YACXC,WAAc,CACV,sBAGR,CACID,QAAW,YACXC,WAAc,CACV,eAGR,CACID,QAAW,YACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,eAGR,CACID,QAAW,YACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,kBAGR,CACID,QAAW,YACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,8BAGR,CACID,QAAW,YACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,QACXC,WAAc,CACV,4BAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,gBAGR,CACID,QAAW,aACXC,WAAc,CACV,cAGR,CACID,QAAW,YACXC,WAAc,CACV,kBAGR,CACID,QAAW,YACXC,WAAc,CACV,oBAGR,CACID,QAAW,YACXC,WAAc,CACV,aAGR,CACID,QAAW,YACXC,WAAc,CACV,gBAGR,CACID,QAAW,YACXC,WAAc,CACV,mBAGR,CACID,QAAW,YACXC,WAAc,CACV,sBAGR,CACID,QAAW,YACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,+BAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,OACXC,WAAc,CACV,UAGR,CACID,QAAW,OACXC,WAAc,CACV,WAGR,CACID,QAAW,OACXC,WAAc,CACV,WAGR,CACID,QAAW,OACXC,WAAc,CACV,WAGR,CACID,QAAW,OACXC,WAAc,CACV,QAGR,CACID,QAAW,OACXC,WAAc,CACV,UAGR,CACID,QAAW,OACXC,WAAc,CACV,UAGR,CACID,QAAW,OACXC,WAAc,CACV,aAGR,CACID,QAAW,OACXC,WAAc,CACV,gBAGR,CACID,QAAW,OACXC,WAAc,CACV,cAGR,CACID,QAAW,OACXC,WAAc,CACV,aAGR,CACID,QAAW,OACXC,WAAc,CACV,WAGR,CACID,QAAW,OACXC,WAAc,CACV,cAGR,CACID,QAAW,QACXC,WAAc,CACV,8BAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,YACXC,WAAc,CACV,kBAGR,CACID,QAAW,OACXC,WAAc,CACV,iBAGR,CACID,QAAW,YACXC,WAAc,CACV,2DAGR,CACID,QAAW,YACXC,WAAc,CACV,2DAGR,CACID,QAAW,YACXC,WAAc,CACV,mBAGR,CACID,QAAW,OACXC,WAAc,CACV,WAGR,CACID,QAAW,YACXC,WAAc,CACV,0DAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,OACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,OACXC,WAAc,CACV,sBAGR,CACID,QAAW,YACXC,WAAc,CACV,wBAGR,CACID,QAAW,YACXC,WAAc,CACV,0BAGR,CACID,QAAW,YACXC,WAAc,CACV,4BAGR,CACID,QAAW,YACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,oBAGR,CACID,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,gBAGR,CACID,QAAW,YACXC,WAAc,CACV,cAGR,CACID,QAAW,YACXC,WAAc,CACV,mBAGR,CACID,QAAW,YACXC,WAAc,CACV,YAGR,CACID,QAAW,YACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,aAGR,CACID,QAAW,OACXC,WAAc,CACV,MAGR,CACID,QAAW,OACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,0BAGR,CACID,QAAW,YACXC,WAAc,CACV,qBAGR,CACID,QAAW,YACXC,WAAc,CACV,2BAGR,CACID,QAAW,OACXC,WAAc,CACV,MAGR,CACID,QAAW,OACXC,WAAc,CACV,gCAGR,CACID,QAAW,OACXC,WAAc,CACV,oBAGR,CACID,QAAW,OACXC,WAAc,CACV,qBAGR,CACID,QAAW,OACXC,WAAc,CACV,wBAGR,CACID,QAAW,OACXC,WAAc,CACV,eAGR,CACID,QAAW,OACXC,WAAc,CACV,SAGR,CACID,QAAW,YACXC,WAAc,CACV,0BAGR,CACID,QAAW,YACXC,WAAc,CACV,0BAGR,CACID,QAAW,YACXC,WAAc,CACV,6BAGR,CACID,QAAW,YACXC,WAAc,CACV,YAGR,CACID,QAAW,YACXC,WAAc,CACV,aAGR,CACID,QAAW,YACXC,WAAc,CACV,gBAGR,CACID,QAAW,OACXC,WAAc,CACV,aAGR,CACID,QAAW,OACXC,WAAc,CACV,kBAGR,CACID,QAAW,OACXC,WAAc,CACV,qBAGR,CACID,QAAW,OACXC,WAAc,CACV,gBAGR,CACID,QAAW,YACXC,WAAc,CACV,cAGR,CACID,QAAW,YACXC,WAAc,CACV,cAGR,CACID,QAAW,YACXC,WAAc,CACV,eAGR,CACID,QAAW,YACXC,WAAc,CACV,OAGR,CACID,QAAW,iBACXC,WAAc,CACV,SAGR,CACID,QAAW,iBACXC,WAAc,CACV,gBAGR,CACID,QAAW,iBACXC,WAAc,CACV,SAGR,CACID,QAAW,iBACXC,WAAc,CACV,QAGR,CACID,QAAW,iBACXC,WAAc,CACV,QAGR,CACID,QAAW,iBACXC,WAAc,CACV,UAGR,CACID,QAAW,iBACXC,WAAc,CACV,SAGR,CACID,QAAW,iBACXC,WAAc,CACV,SAGR,CACID,QAAW,iBACXC,WAAc,CACV,QAGR,CACID,QAAW,iBACXC,WAAc,CACV,UAGR,CACID,QAAW,iBACXC,WAAc,CACV,UAGR,CACID,QAAW,iBACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,aACXC,WAAc,CACV,MAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,aACXC,WAAc,CACV,MAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,YACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,YACXC,WAAc,CACV,MAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,aACXC,WAAc,CACV,OAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,aACXC,WAAc,CACV,YAGR,CACID,QAAW,QACXC,WAAc,CACV,QAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,QACXC,WAAc,CACV,OAGR,CACID,QAAW,QACXC,WAAc,CACV,SAGR,CACID,QAAW,aACXC,WAAc,CACV,OAGR,CACID,QAAW,aACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,YACXC,WAAc,CACV,oBAGR,CACID,QAAW,YACXC,WAAc,CACV,WAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,QACXC,WAAc,CACV,UAGR,CACID,QAAW,YACXC,WAAc,CACV,uBAGR,CACID,QAAW,YACXC,WAAc,CACV,uBAGR,CACID,QAAW,YACXC,WAAc,CACV,wBAGR,CACID,QAAW,YACXC,WAAc,CACV,wBAGR,CACID,QAAW,OACXC,WAAc,CACV,8BAGR,CACID,QAAW,OACXC,WAAc,CACV,8BAGR,CACID,QAAW,OACXC,WAAc,CACV,uBAGR,CACID,QAAW,OACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,yBAGR,CACID,QAAW,QACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,uBAGR,CACID,QAAW,QACXC,WAAc,CACV,4BAGR,CACID,QAAW,QACXC,WAAc,CACV,oCAGR,CACID,QAAW,QACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAGR,CACID,QAAW,OACXC,WAAc,CACV,iBAGR,CACID,QAAW,OACXC,WAAc,CACV,iBAGR,CACID,QAAW,QACXC,WAAc,CACV,eAGR,CACID,QAAW,QACXC,WAAc,CACV,wBAKhB,CACIH,KAAQ,QACRC,OAAU,CACN,CACIC,QAAW,QACXC,WAAc,CACV,mBAGR,CACID,QAAW,QACXC,WAAc,CACV,4BAGR,CACID,QAAW,QACXC,WAAc,CACV,kBAGR,CACID,QAAW,QACXC,WAAc,CACV,sBAGR,CACID,QAAW,aACXC,WAAc,CACV,sBAGR,CACID,QAAW,wBACXC,WAAc,CACV,iBAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,OAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,OAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,OAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,OAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,OAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,OAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,OAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,OAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,OAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,OAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,cACXC,WAAc,CACV,YAGR,CACID,QAAW,4CACXC,WAAc,CACV,iBAGR,CACID,QAAW,4CACXC,WAAc,CACV,kBAGR,CACID,QAAW,4CACXC,WAAc,CACV,uCAOO,CACvBC,KAAQ,iBACRC,YAAe,iBACfC,KAAQ,iBACRC,IAAO,iBACPC,IAAO,iBACPC,MAAS,iBACTC,KAAQ,iBACRC,KAAQ,iBACRC,IAAO,iBACPC,MAAS,iBACTC,MAAS,iBACTC,KAAQ,iBACRC,UAAa,YACbC,WAAc,YACdC,QAAW,QACXC,YAAe,QACfC,EAAK,aACLC,EAAK,aACLC,GAAM,aACNC,QAAW,aACXC,GAAM,QACNC,GAAM,QACNC,KAAQ,QACRC,KAAQ,QACRC,GAAM,QACNC,IAAO,QACPC,GAAM,QACNC,GAAM,QACNC,IAAO,QACPC,GAAM,QACNC,GAAM,QACN,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACXC,GAAM,cACN,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACXC,GAAM,cACN,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACXC,GAAM,cACN,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACXC,GAAM,cACN,UAAW,cACXC,GAAM,cACN,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACXC,GAAM,cACN,UAAW,cACX,UAAW,cACX,UAAW,cACXC,GAAM,cACN,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACXC,GAAM,cACN,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACXC,GAAM,cACN,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACXC,GAAM,cACN,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,cACX,UAAW,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"} \ No newline at end of file +{"version":3,"file":"data.min.js","sources":["../../src/emoji/data.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Emoji data based on the data available from https://github.com/iamcal/emoji-data.\n *\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nexport const byCategory = [\n {\n \"name\": \"Smileys & People\",\n \"emojis\": [\n {\n \"unified\": \"1F600\",\n \"shortnames\": [\n \"grinning\"\n ]\n },\n {\n \"unified\": \"1F601\",\n \"shortnames\": [\n \"grin\"\n ]\n },\n {\n \"unified\": \"1F602\",\n \"shortnames\": [\n \"joy\"\n ]\n },\n {\n \"unified\": \"1F923\",\n \"shortnames\": [\n \"rolling_on_the_floor_laughing\"\n ]\n },\n {\n \"unified\": \"1F603\",\n \"shortnames\": [\n \"smiley\"\n ]\n },\n {\n \"unified\": \"1F604\",\n \"shortnames\": [\n \"smile\"\n ]\n },\n {\n \"unified\": \"1F605\",\n \"shortnames\": [\n \"sweat_smile\"\n ]\n },\n {\n \"unified\": \"1F606\",\n \"shortnames\": [\n \"laughing\"\n ]\n },\n {\n \"unified\": \"1F609\",\n \"shortnames\": [\n \"wink\"\n ]\n },\n {\n \"unified\": \"1F60A\",\n \"shortnames\": [\n \"blush\"\n ]\n },\n {\n \"unified\": \"1F60B\",\n \"shortnames\": [\n \"yum\"\n ]\n },\n {\n \"unified\": \"1F60E\",\n \"shortnames\": [\n \"sunglasses\"\n ]\n },\n {\n \"unified\": \"1F60D\",\n \"shortnames\": [\n \"heart_eyes\"\n ]\n },\n {\n \"unified\": \"1F618\",\n \"shortnames\": [\n \"kissing_heart\"\n ]\n },\n {\n \"unified\": \"1F617\",\n \"shortnames\": [\n \"kissing\"\n ]\n },\n {\n \"unified\": \"1F619\",\n \"shortnames\": [\n \"kissing_smiling_eyes\"\n ]\n },\n {\n \"unified\": \"1F61A\",\n \"shortnames\": [\n \"kissing_closed_eyes\"\n ]\n },\n {\n \"unified\": \"263A-FE0F\",\n \"shortnames\": [\n \"relaxed\"\n ]\n },\n {\n \"unified\": \"1F642\",\n \"shortnames\": [\n \"slightly_smiling_face\"\n ]\n },\n {\n \"unified\": \"1F917\",\n \"shortnames\": [\n \"hugging_face\"\n ]\n },\n {\n \"unified\": \"1F929\",\n \"shortnames\": [\n \"star-struck\"\n ]\n },\n {\n \"unified\": \"1F914\",\n \"shortnames\": [\n \"thinking_face\"\n ]\n },\n {\n \"unified\": \"1F928\",\n \"shortnames\": [\n \"face_with_raised_eyebrow\"\n ]\n },\n {\n \"unified\": \"1F610\",\n \"shortnames\": [\n \"neutral_face\"\n ]\n },\n {\n \"unified\": \"1F611\",\n \"shortnames\": [\n \"expressionless\"\n ]\n },\n {\n \"unified\": \"1F636\",\n \"shortnames\": [\n \"no_mouth\"\n ]\n },\n {\n \"unified\": \"1F644\",\n \"shortnames\": [\n \"face_with_rolling_eyes\"\n ]\n },\n {\n \"unified\": \"1F60F\",\n \"shortnames\": [\n \"smirk\"\n ]\n },\n {\n \"unified\": \"1F623\",\n \"shortnames\": [\n \"persevere\"\n ]\n },\n {\n \"unified\": \"1F625\",\n \"shortnames\": [\n \"disappointed_relieved\"\n ]\n },\n {\n \"unified\": \"1F62E\",\n \"shortnames\": [\n \"open_mouth\"\n ]\n },\n {\n \"unified\": \"1F910\",\n \"shortnames\": [\n \"zipper_mouth_face\"\n ]\n },\n {\n \"unified\": \"1F62F\",\n \"shortnames\": [\n \"hushed\"\n ]\n },\n {\n \"unified\": \"1F62A\",\n \"shortnames\": [\n \"sleepy\"\n ]\n },\n {\n \"unified\": \"1F62B\",\n \"shortnames\": [\n \"tired_face\"\n ]\n },\n {\n \"unified\": \"1F634\",\n \"shortnames\": [\n \"sleeping\"\n ]\n },\n {\n \"unified\": \"1F60C\",\n \"shortnames\": [\n \"relieved\"\n ]\n },\n {\n \"unified\": \"1F61B\",\n \"shortnames\": [\n \"stuck_out_tongue\"\n ]\n },\n {\n \"unified\": \"1F61C\",\n \"shortnames\": [\n \"stuck_out_tongue_winking_eye\"\n ]\n },\n {\n \"unified\": \"1F61D\",\n \"shortnames\": [\n \"stuck_out_tongue_closed_eyes\"\n ]\n },\n {\n \"unified\": \"1F924\",\n \"shortnames\": [\n \"drooling_face\"\n ]\n },\n {\n \"unified\": \"1F612\",\n \"shortnames\": [\n \"unamused\"\n ]\n },\n {\n \"unified\": \"1F613\",\n \"shortnames\": [\n \"sweat\"\n ]\n },\n {\n \"unified\": \"1F614\",\n \"shortnames\": [\n \"pensive\"\n ]\n },\n {\n \"unified\": \"1F615\",\n \"shortnames\": [\n \"confused\"\n ]\n },\n {\n \"unified\": \"1F643\",\n \"shortnames\": [\n \"upside_down_face\"\n ]\n },\n {\n \"unified\": \"1F911\",\n \"shortnames\": [\n \"money_mouth_face\"\n ]\n },\n {\n \"unified\": \"1F632\",\n \"shortnames\": [\n \"astonished\"\n ]\n },\n {\n \"unified\": \"2639-FE0F\",\n \"shortnames\": [\n \"white_frowning_face\"\n ]\n },\n {\n \"unified\": \"1F641\",\n \"shortnames\": [\n \"slightly_frowning_face\"\n ]\n },\n {\n \"unified\": \"1F616\",\n \"shortnames\": [\n \"confounded\"\n ]\n },\n {\n \"unified\": \"1F61E\",\n \"shortnames\": [\n \"disappointed\"\n ]\n },\n {\n \"unified\": \"1F61F\",\n \"shortnames\": [\n \"worried\"\n ]\n },\n {\n \"unified\": \"1F624\",\n \"shortnames\": [\n \"triumph\"\n ]\n },\n {\n \"unified\": \"1F622\",\n \"shortnames\": [\n \"cry\"\n ]\n },\n {\n \"unified\": \"1F62D\",\n \"shortnames\": [\n \"sob\"\n ]\n },\n {\n \"unified\": \"1F626\",\n \"shortnames\": [\n \"frowning\"\n ]\n },\n {\n \"unified\": \"1F627\",\n \"shortnames\": [\n \"anguished\"\n ]\n },\n {\n \"unified\": \"1F628\",\n \"shortnames\": [\n \"fearful\"\n ]\n },\n {\n \"unified\": \"1F629\",\n \"shortnames\": [\n \"weary\"\n ]\n },\n {\n \"unified\": \"1F92F\",\n \"shortnames\": [\n \"exploding_head\"\n ]\n },\n {\n \"unified\": \"1F62C\",\n \"shortnames\": [\n \"grimacing\"\n ]\n },\n {\n \"unified\": \"1F630\",\n \"shortnames\": [\n \"cold_sweat\"\n ]\n },\n {\n \"unified\": \"1F631\",\n \"shortnames\": [\n \"scream\"\n ]\n },\n {\n \"unified\": \"1F633\",\n \"shortnames\": [\n \"flushed\"\n ]\n },\n {\n \"unified\": \"1F92A\",\n \"shortnames\": [\n \"zany_face\"\n ]\n },\n {\n \"unified\": \"1F635\",\n \"shortnames\": [\n \"dizzy_face\"\n ]\n },\n {\n \"unified\": \"1F621\",\n \"shortnames\": [\n \"rage\"\n ]\n },\n {\n \"unified\": \"1F620\",\n \"shortnames\": [\n \"angry\"\n ]\n },\n {\n \"unified\": \"1F92C\",\n \"shortnames\": [\n \"face_with_symbols_on_mouth\"\n ]\n },\n {\n \"unified\": \"1F637\",\n \"shortnames\": [\n \"mask\"\n ]\n },\n {\n \"unified\": \"1F912\",\n \"shortnames\": [\n \"face_with_thermometer\"\n ]\n },\n {\n \"unified\": \"1F915\",\n \"shortnames\": [\n \"face_with_head_bandage\"\n ]\n },\n {\n \"unified\": \"1F922\",\n \"shortnames\": [\n \"nauseated_face\"\n ]\n },\n {\n \"unified\": \"1F92E\",\n \"shortnames\": [\n \"face_vomiting\"\n ]\n },\n {\n \"unified\": \"1F927\",\n \"shortnames\": [\n \"sneezing_face\"\n ]\n },\n {\n \"unified\": \"1F607\",\n \"shortnames\": [\n \"innocent\"\n ]\n },\n {\n \"unified\": \"1F920\",\n \"shortnames\": [\n \"face_with_cowboy_hat\"\n ]\n },\n {\n \"unified\": \"1F921\",\n \"shortnames\": [\n \"clown_face\"\n ]\n },\n {\n \"unified\": \"1F925\",\n \"shortnames\": [\n \"lying_face\"\n ]\n },\n {\n \"unified\": \"1F92B\",\n \"shortnames\": [\n \"shushing_face\"\n ]\n },\n {\n \"unified\": \"1F92D\",\n \"shortnames\": [\n \"face_with_hand_over_mouth\"\n ]\n },\n {\n \"unified\": \"1F9D0\",\n \"shortnames\": [\n \"face_with_monocle\"\n ]\n },\n {\n \"unified\": \"1F913\",\n \"shortnames\": [\n \"nerd_face\"\n ]\n },\n {\n \"unified\": \"1F608\",\n \"shortnames\": [\n \"smiling_imp\"\n ]\n },\n {\n \"unified\": \"1F47F\",\n \"shortnames\": [\n \"imp\"\n ]\n },\n {\n \"unified\": \"1F479\",\n \"shortnames\": [\n \"japanese_ogre\"\n ]\n },\n {\n \"unified\": \"1F47A\",\n \"shortnames\": [\n \"japanese_goblin\"\n ]\n },\n {\n \"unified\": \"1F480\",\n \"shortnames\": [\n \"skull\"\n ]\n },\n {\n \"unified\": \"2620-FE0F\",\n \"shortnames\": [\n \"skull_and_crossbones\"\n ]\n },\n {\n \"unified\": \"1F47B\",\n \"shortnames\": [\n \"ghost\"\n ]\n },\n {\n \"unified\": \"1F47D\",\n \"shortnames\": [\n \"alien\"\n ]\n },\n {\n \"unified\": \"1F47E\",\n \"shortnames\": [\n \"space_invader\"\n ]\n },\n {\n \"unified\": \"1F916\",\n \"shortnames\": [\n \"robot_face\"\n ]\n },\n {\n \"unified\": \"1F4A9\",\n \"shortnames\": [\n \"hankey\"\n ]\n },\n {\n \"unified\": \"1F63A\",\n \"shortnames\": [\n \"smiley_cat\"\n ]\n },\n {\n \"unified\": \"1F638\",\n \"shortnames\": [\n \"smile_cat\"\n ]\n },\n {\n \"unified\": \"1F639\",\n \"shortnames\": [\n \"joy_cat\"\n ]\n },\n {\n \"unified\": \"1F63B\",\n \"shortnames\": [\n \"heart_eyes_cat\"\n ]\n },\n {\n \"unified\": \"1F63C\",\n \"shortnames\": [\n \"smirk_cat\"\n ]\n },\n {\n \"unified\": \"1F63D\",\n \"shortnames\": [\n \"kissing_cat\"\n ]\n },\n {\n \"unified\": \"1F640\",\n \"shortnames\": [\n \"scream_cat\"\n ]\n },\n {\n \"unified\": \"1F63F\",\n \"shortnames\": [\n \"crying_cat_face\"\n ]\n },\n {\n \"unified\": \"1F63E\",\n \"shortnames\": [\n \"pouting_cat\"\n ]\n },\n {\n \"unified\": \"1F648\",\n \"shortnames\": [\n \"see_no_evil\"\n ]\n },\n {\n \"unified\": \"1F649\",\n \"shortnames\": [\n \"hear_no_evil\"\n ]\n },\n {\n \"unified\": \"1F64A\",\n \"shortnames\": [\n \"speak_no_evil\"\n ]\n },\n {\n \"unified\": \"1F476\",\n \"shortnames\": [\n \"baby\"\n ]\n },\n {\n \"unified\": \"1F9D2\",\n \"shortnames\": [\n \"child\"\n ]\n },\n {\n \"unified\": \"1F466\",\n \"shortnames\": [\n \"boy\"\n ]\n },\n {\n \"unified\": \"1F467\",\n \"shortnames\": [\n \"girl\"\n ]\n },\n {\n \"unified\": \"1F9D1\",\n \"shortnames\": [\n \"adult\"\n ]\n },\n {\n \"unified\": \"1F468\",\n \"shortnames\": [\n \"man\"\n ]\n },\n {\n \"unified\": \"1F469\",\n \"shortnames\": [\n \"woman\"\n ]\n },\n {\n \"unified\": \"1F9D3\",\n \"shortnames\": [\n \"older_adult\"\n ]\n },\n {\n \"unified\": \"1F474\",\n \"shortnames\": [\n \"older_man\"\n ]\n },\n {\n \"unified\": \"1F475\",\n \"shortnames\": [\n \"older_woman\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2695-FE0F\",\n \"shortnames\": [\n \"male-doctor\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2695-FE0F\",\n \"shortnames\": [\n \"female-doctor\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F393\",\n \"shortnames\": [\n \"male-student\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F393\",\n \"shortnames\": [\n \"female-student\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3EB\",\n \"shortnames\": [\n \"male-teacher\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3EB\",\n \"shortnames\": [\n \"female-teacher\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2696-FE0F\",\n \"shortnames\": [\n \"male-judge\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2696-FE0F\",\n \"shortnames\": [\n \"female-judge\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F33E\",\n \"shortnames\": [\n \"male-farmer\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F33E\",\n \"shortnames\": [\n \"female-farmer\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F373\",\n \"shortnames\": [\n \"male-cook\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F373\",\n \"shortnames\": [\n \"female-cook\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F527\",\n \"shortnames\": [\n \"male-mechanic\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F527\",\n \"shortnames\": [\n \"female-mechanic\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3ED\",\n \"shortnames\": [\n \"male-factory-worker\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3ED\",\n \"shortnames\": [\n \"female-factory-worker\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F4BC\",\n \"shortnames\": [\n \"male-office-worker\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F4BC\",\n \"shortnames\": [\n \"female-office-worker\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F52C\",\n \"shortnames\": [\n \"male-scientist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F52C\",\n \"shortnames\": [\n \"female-scientist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F4BB\",\n \"shortnames\": [\n \"male-technologist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F4BB\",\n \"shortnames\": [\n \"female-technologist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3A4\",\n \"shortnames\": [\n \"male-singer\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3A4\",\n \"shortnames\": [\n \"female-singer\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F3A8\",\n \"shortnames\": [\n \"male-artist\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F3A8\",\n \"shortnames\": [\n \"female-artist\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2708-FE0F\",\n \"shortnames\": [\n \"male-pilot\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2708-FE0F\",\n \"shortnames\": [\n \"female-pilot\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F680\",\n \"shortnames\": [\n \"male-astronaut\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F680\",\n \"shortnames\": [\n \"female-astronaut\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F692\",\n \"shortnames\": [\n \"male-firefighter\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F692\",\n \"shortnames\": [\n \"female-firefighter\"\n ]\n },\n {\n \"unified\": \"1F46E-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-police-officer\",\n \"cop\"\n ]\n },\n {\n \"unified\": \"1F46E-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-police-officer\"\n ]\n },\n {\n \"unified\": \"1F575-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-detective\",\n \"sleuth_or_spy\"\n ]\n },\n {\n \"unified\": \"1F575-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-detective\"\n ]\n },\n {\n \"unified\": \"1F482-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-guard\",\n \"guardsman\"\n ]\n },\n {\n \"unified\": \"1F482-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-guard\"\n ]\n },\n {\n \"unified\": \"1F477-200D-2642-FE0F\",\n \"shortnames\": [\n \"male-construction-worker\",\n \"construction_worker\"\n ]\n },\n {\n \"unified\": \"1F477-200D-2640-FE0F\",\n \"shortnames\": [\n \"female-construction-worker\"\n ]\n },\n {\n \"unified\": \"1F934\",\n \"shortnames\": [\n \"prince\"\n ]\n },\n {\n \"unified\": \"1F478\",\n \"shortnames\": [\n \"princess\"\n ]\n },\n {\n \"unified\": \"1F473-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-wearing-turban\",\n \"man_with_turban\"\n ]\n },\n {\n \"unified\": \"1F473-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-wearing-turban\"\n ]\n },\n {\n \"unified\": \"1F472\",\n \"shortnames\": [\n \"man_with_gua_pi_mao\"\n ]\n },\n {\n \"unified\": \"1F9D5\",\n \"shortnames\": [\n \"person_with_headscarf\"\n ]\n },\n {\n \"unified\": \"1F9D4\",\n \"shortnames\": [\n \"bearded_person\"\n ]\n },\n {\n \"unified\": \"1F471-200D-2642-FE0F\",\n \"shortnames\": [\n \"blond-haired-man\",\n \"person_with_blond_hair\"\n ]\n },\n {\n \"unified\": \"1F471-200D-2640-FE0F\",\n \"shortnames\": [\n \"blond-haired-woman\"\n ]\n },\n {\n \"unified\": \"1F935\",\n \"shortnames\": [\n \"man_in_tuxedo\"\n ]\n },\n {\n \"unified\": \"1F470\",\n \"shortnames\": [\n \"bride_with_veil\"\n ]\n },\n {\n \"unified\": \"1F930\",\n \"shortnames\": [\n \"pregnant_woman\"\n ]\n },\n {\n \"unified\": \"1F931\",\n \"shortnames\": [\n \"breast-feeding\"\n ]\n },\n {\n \"unified\": \"1F47C\",\n \"shortnames\": [\n \"angel\"\n ]\n },\n {\n \"unified\": \"1F385\",\n \"shortnames\": [\n \"santa\"\n ]\n },\n {\n \"unified\": \"1F936\",\n \"shortnames\": [\n \"mrs_claus\"\n ]\n },\n {\n \"unified\": \"1F9D9-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_mage\",\n \"mage\"\n ]\n },\n {\n \"unified\": \"1F9D9-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_mage\"\n ]\n },\n {\n \"unified\": \"1F9DA-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_fairy\",\n \"fairy\"\n ]\n },\n {\n \"unified\": \"1F9DA-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_fairy\"\n ]\n },\n {\n \"unified\": \"1F9DB-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_vampire\",\n \"vampire\"\n ]\n },\n {\n \"unified\": \"1F9DB-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_vampire\"\n ]\n },\n {\n \"unified\": \"1F9DC-200D-2640-FE0F\",\n \"shortnames\": [\n \"mermaid\"\n ]\n },\n {\n \"unified\": \"1F9DC-200D-2642-FE0F\",\n \"shortnames\": [\n \"merman\",\n \"merperson\"\n ]\n },\n {\n \"unified\": \"1F9DD-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_elf\"\n ]\n },\n {\n \"unified\": \"1F9DD-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_elf\",\n \"elf\"\n ]\n },\n {\n \"unified\": \"1F9DE-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_genie\"\n ]\n },\n {\n \"unified\": \"1F9DE-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_genie\",\n \"genie\"\n ]\n },\n {\n \"unified\": \"1F9DF-200D-2640-FE0F\",\n \"shortnames\": [\n \"female_zombie\"\n ]\n },\n {\n \"unified\": \"1F9DF-200D-2642-FE0F\",\n \"shortnames\": [\n \"male_zombie\",\n \"zombie\"\n ]\n },\n {\n \"unified\": \"1F64D-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-frowning\"\n ]\n },\n {\n \"unified\": \"1F64D-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-frowning\",\n \"person_frowning\"\n ]\n },\n {\n \"unified\": \"1F64E-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-pouting\"\n ]\n },\n {\n \"unified\": \"1F64E-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-pouting\",\n \"person_with_pouting_face\"\n ]\n },\n {\n \"unified\": \"1F645-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-gesturing-no\"\n ]\n },\n {\n \"unified\": \"1F645-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-gesturing-no\",\n \"no_good\"\n ]\n },\n {\n \"unified\": \"1F646-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-gesturing-ok\"\n ]\n },\n {\n \"unified\": \"1F646-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-gesturing-ok\",\n \"ok_woman\"\n ]\n },\n {\n \"unified\": \"1F481-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-tipping-hand\"\n ]\n },\n {\n \"unified\": \"1F481-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-tipping-hand\",\n \"information_desk_person\"\n ]\n },\n {\n \"unified\": \"1F64B-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-raising-hand\"\n ]\n },\n {\n \"unified\": \"1F64B-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-raising-hand\",\n \"raising_hand\"\n ]\n },\n {\n \"unified\": \"1F647-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-bowing\",\n \"bow\"\n ]\n },\n {\n \"unified\": \"1F647-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-bowing\"\n ]\n },\n {\n \"unified\": \"1F926\",\n \"shortnames\": [\n \"face_palm\"\n ]\n },\n {\n \"unified\": \"1F926-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-facepalming\"\n ]\n },\n {\n \"unified\": \"1F926-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-facepalming\"\n ]\n },\n {\n \"unified\": \"1F937\",\n \"shortnames\": [\n \"shrug\"\n ]\n },\n {\n \"unified\": \"1F937-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-shrugging\"\n ]\n },\n {\n \"unified\": \"1F937-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-shrugging\"\n ]\n },\n {\n \"unified\": \"1F486-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-getting-massage\"\n ]\n },\n {\n \"unified\": \"1F486-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-getting-massage\",\n \"massage\"\n ]\n },\n {\n \"unified\": \"1F487-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-getting-haircut\"\n ]\n },\n {\n \"unified\": \"1F487-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-getting-haircut\",\n \"haircut\"\n ]\n },\n {\n \"unified\": \"1F6B6-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-walking\",\n \"walking\"\n ]\n },\n {\n \"unified\": \"1F6B6-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-walking\"\n ]\n },\n {\n \"unified\": \"1F3C3-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-running\",\n \"runner\"\n ]\n },\n {\n \"unified\": \"1F3C3-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-running\"\n ]\n },\n {\n \"unified\": \"1F483\",\n \"shortnames\": [\n \"dancer\"\n ]\n },\n {\n \"unified\": \"1F57A\",\n \"shortnames\": [\n \"man_dancing\"\n ]\n },\n {\n \"unified\": \"1F46F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-with-bunny-ears-partying\"\n ]\n },\n {\n \"unified\": \"1F46F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-with-bunny-ears-partying\",\n \"dancers\"\n ]\n },\n {\n \"unified\": \"1F9D6-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_in_steamy_room\"\n ]\n },\n {\n \"unified\": \"1F9D6-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_in_steamy_room\",\n \"person_in_steamy_room\"\n ]\n },\n {\n \"unified\": \"1F9D7-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_climbing\",\n \"person_climbing\"\n ]\n },\n {\n \"unified\": \"1F9D7-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_climbing\"\n ]\n },\n {\n \"unified\": \"1F9D8-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman_in_lotus_position\",\n \"person_in_lotus_position\"\n ]\n },\n {\n \"unified\": \"1F9D8-200D-2642-FE0F\",\n \"shortnames\": [\n \"man_in_lotus_position\"\n ]\n },\n {\n \"unified\": \"1F6C0\",\n \"shortnames\": [\n \"bath\"\n ]\n },\n {\n \"unified\": \"1F6CC\",\n \"shortnames\": [\n \"sleeping_accommodation\"\n ]\n },\n {\n \"unified\": \"1F574-FE0F\",\n \"shortnames\": [\n \"man_in_business_suit_levitating\"\n ]\n },\n {\n \"unified\": \"1F5E3-FE0F\",\n \"shortnames\": [\n \"speaking_head_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1F464\",\n \"shortnames\": [\n \"bust_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1F465\",\n \"shortnames\": [\n \"busts_in_silhouette\"\n ]\n },\n {\n \"unified\": \"1F93A\",\n \"shortnames\": [\n \"fencer\"\n ]\n },\n {\n \"unified\": \"1F3C7\",\n \"shortnames\": [\n \"horse_racing\"\n ]\n },\n {\n \"unified\": \"26F7-FE0F\",\n \"shortnames\": [\n \"skier\"\n ]\n },\n {\n \"unified\": \"1F3C2\",\n \"shortnames\": [\n \"snowboarder\"\n ]\n },\n {\n \"unified\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-golfing\",\n \"golfer\"\n ]\n },\n {\n \"unified\": \"1F3CC-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-golfing\"\n ]\n },\n {\n \"unified\": \"1F3C4-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-surfing\",\n \"surfer\"\n ]\n },\n {\n \"unified\": \"1F3C4-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-surfing\"\n ]\n },\n {\n \"unified\": \"1F6A3-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-rowing-boat\",\n \"rowboat\"\n ]\n },\n {\n \"unified\": \"1F6A3-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-rowing-boat\"\n ]\n },\n {\n \"unified\": \"1F3CA-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-swimming\",\n \"swimmer\"\n ]\n },\n {\n \"unified\": \"1F3CA-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-swimming\"\n ]\n },\n {\n \"unified\": \"26F9-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-bouncing-ball\",\n \"person_with_ball\"\n ]\n },\n {\n \"unified\": \"26F9-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-bouncing-ball\"\n ]\n },\n {\n \"unified\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-lifting-weights\",\n \"weight_lifter\"\n ]\n },\n {\n \"unified\": \"1F3CB-FE0F-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-lifting-weights\"\n ]\n },\n {\n \"unified\": \"1F6B4-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-biking\",\n \"bicyclist\"\n ]\n },\n {\n \"unified\": \"1F6B4-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-biking\"\n ]\n },\n {\n \"unified\": \"1F6B5-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-mountain-biking\",\n \"mountain_bicyclist\"\n ]\n },\n {\n \"unified\": \"1F6B5-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-mountain-biking\"\n ]\n },\n {\n \"unified\": \"1F3CE-FE0F\",\n \"shortnames\": [\n \"racing_car\"\n ]\n },\n {\n \"unified\": \"1F3CD-FE0F\",\n \"shortnames\": [\n \"racing_motorcycle\"\n ]\n },\n {\n \"unified\": \"1F938\",\n \"shortnames\": [\n \"person_doing_cartwheel\"\n ]\n },\n {\n \"unified\": \"1F938-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-cartwheeling\"\n ]\n },\n {\n \"unified\": \"1F938-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-cartwheeling\"\n ]\n },\n {\n \"unified\": \"1F93C\",\n \"shortnames\": [\n \"wrestlers\"\n ]\n },\n {\n \"unified\": \"1F93C-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-wrestling\"\n ]\n },\n {\n \"unified\": \"1F93C-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-wrestling\"\n ]\n },\n {\n \"unified\": \"1F93D\",\n \"shortnames\": [\n \"water_polo\"\n ]\n },\n {\n \"unified\": \"1F93D-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-playing-water-polo\"\n ]\n },\n {\n \"unified\": \"1F93D-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-playing-water-polo\"\n ]\n },\n {\n \"unified\": \"1F93E\",\n \"shortnames\": [\n \"handball\"\n ]\n },\n {\n \"unified\": \"1F93E-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-playing-handball\"\n ]\n },\n {\n \"unified\": \"1F93E-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-playing-handball\"\n ]\n },\n {\n \"unified\": \"1F939\",\n \"shortnames\": [\n \"juggling\"\n ]\n },\n {\n \"unified\": \"1F939-200D-2642-FE0F\",\n \"shortnames\": [\n \"man-juggling\"\n ]\n },\n {\n \"unified\": \"1F939-200D-2640-FE0F\",\n \"shortnames\": [\n \"woman-juggling\"\n ]\n },\n {\n \"unified\": \"1F46B\",\n \"shortnames\": [\n \"couple\"\n ]\n },\n {\n \"unified\": \"1F46C\",\n \"shortnames\": [\n \"two_men_holding_hands\"\n ]\n },\n {\n \"unified\": \"1F46D\",\n \"shortnames\": [\n \"two_women_holding_hands\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"shortnames\": [\n \"woman-kiss-man\",\n \"couplekiss\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"shortnames\": [\n \"man-kiss-man\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\n \"shortnames\": [\n \"woman-kiss-woman\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"shortnames\": [\n \"woman-heart-man\",\n \"couple_with_heart\"\n ]\n },\n {\n \"unified\": \"1F468-200D-2764-FE0F-200D-1F468\",\n \"shortnames\": [\n \"man-heart-man\"\n ]\n },\n {\n \"unified\": \"1F469-200D-2764-FE0F-200D-1F469\",\n \"shortnames\": [\n \"woman-heart-woman\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F466\",\n \"shortnames\": [\n \"man-woman-boy\",\n \"family\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467\",\n \"shortnames\": [\n \"man-woman-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F466\",\n \"shortnames\": [\n \"man-man-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467\",\n \"shortnames\": [\n \"man-man-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-man-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-man-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F468-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-man-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467\",\n \"shortnames\": [\n \"woman-woman-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"woman-woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"woman-woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F466\",\n \"shortnames\": [\n \"man-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"man-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467\",\n \"shortnames\": [\n \"man-girl\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"man-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F468-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"man-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F466\",\n \"shortnames\": [\n \"woman-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F466-200D-1F466\",\n \"shortnames\": [\n \"woman-boy-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467\",\n \"shortnames\": [\n \"woman-girl\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467-200D-1F466\",\n \"shortnames\": [\n \"woman-girl-boy\"\n ]\n },\n {\n \"unified\": \"1F469-200D-1F467-200D-1F467\",\n \"shortnames\": [\n \"woman-girl-girl\"\n ]\n },\n {\n \"unified\": \"1F933\",\n \"shortnames\": [\n \"selfie\"\n ]\n },\n {\n \"unified\": \"1F4AA\",\n \"shortnames\": [\n \"muscle\"\n ]\n },\n {\n \"unified\": \"1F448\",\n \"shortnames\": [\n \"point_left\"\n ]\n },\n {\n \"unified\": \"1F449\",\n \"shortnames\": [\n \"point_right\"\n ]\n },\n {\n \"unified\": \"261D-FE0F\",\n \"shortnames\": [\n \"point_up\"\n ]\n },\n {\n \"unified\": \"1F446\",\n \"shortnames\": [\n \"point_up_2\"\n ]\n },\n {\n \"unified\": \"1F595\",\n \"shortnames\": [\n \"middle_finger\"\n ]\n },\n {\n \"unified\": \"1F447\",\n \"shortnames\": [\n \"point_down\"\n ]\n },\n {\n \"unified\": \"270C-FE0F\",\n \"shortnames\": [\n \"v\"\n ]\n },\n {\n \"unified\": \"1F91E\",\n \"shortnames\": [\n \"crossed_fingers\"\n ]\n },\n {\n \"unified\": \"1F596\",\n \"shortnames\": [\n \"spock-hand\"\n ]\n },\n {\n \"unified\": \"1F918\",\n \"shortnames\": [\n \"the_horns\"\n ]\n },\n {\n \"unified\": \"1F919\",\n \"shortnames\": [\n \"call_me_hand\"\n ]\n },\n {\n \"unified\": \"1F590-FE0F\",\n \"shortnames\": [\n \"raised_hand_with_fingers_splayed\"\n ]\n },\n {\n \"unified\": \"270B\",\n \"shortnames\": [\n \"hand\"\n ]\n },\n {\n \"unified\": \"1F44C\",\n \"shortnames\": [\n \"ok_hand\"\n ]\n },\n {\n \"unified\": \"1F44D\",\n \"shortnames\": [\n \"+1\"\n ]\n },\n {\n \"unified\": \"1F44E\",\n \"shortnames\": [\n \"-1\"\n ]\n },\n {\n \"unified\": \"270A\",\n \"shortnames\": [\n \"fist\"\n ]\n },\n {\n \"unified\": \"1F44A\",\n \"shortnames\": [\n \"facepunch\"\n ]\n },\n {\n \"unified\": \"1F91B\",\n \"shortnames\": [\n \"left-facing_fist\"\n ]\n },\n {\n \"unified\": \"1F91C\",\n \"shortnames\": [\n \"right-facing_fist\"\n ]\n },\n {\n \"unified\": \"1F91A\",\n \"shortnames\": [\n \"raised_back_of_hand\"\n ]\n },\n {\n \"unified\": \"1F44B\",\n \"shortnames\": [\n \"wave\"\n ]\n },\n {\n \"unified\": \"1F91F\",\n \"shortnames\": [\n \"i_love_you_hand_sign\"\n ]\n },\n {\n \"unified\": \"270D-FE0F\",\n \"shortnames\": [\n \"writing_hand\"\n ]\n },\n {\n \"unified\": \"1F44F\",\n \"shortnames\": [\n \"clap\"\n ]\n },\n {\n \"unified\": \"1F450\",\n \"shortnames\": [\n \"open_hands\"\n ]\n },\n {\n \"unified\": \"1F64C\",\n \"shortnames\": [\n \"raised_hands\"\n ]\n },\n {\n \"unified\": \"1F932\",\n \"shortnames\": [\n \"palms_up_together\"\n ]\n },\n {\n \"unified\": \"1F64F\",\n \"shortnames\": [\n \"pray\"\n ]\n },\n {\n \"unified\": \"1F91D\",\n \"shortnames\": [\n \"handshake\"\n ]\n },\n {\n \"unified\": \"1F485\",\n \"shortnames\": [\n \"nail_care\"\n ]\n },\n {\n \"unified\": \"1F442\",\n \"shortnames\": [\n \"ear\"\n ]\n },\n {\n \"unified\": \"1F443\",\n \"shortnames\": [\n \"nose\"\n ]\n },\n {\n \"unified\": \"1F463\",\n \"shortnames\": [\n \"footprints\"\n ]\n },\n {\n \"unified\": \"1F440\",\n \"shortnames\": [\n \"eyes\"\n ]\n },\n {\n \"unified\": \"1F441-FE0F\",\n \"shortnames\": [\n \"eye\"\n ]\n },\n {\n \"unified\": \"1F441-FE0F-200D-1F5E8-FE0F\",\n \"shortnames\": [\n \"eye-in-speech-bubble\"\n ]\n },\n {\n \"unified\": \"1F9E0\",\n \"shortnames\": [\n \"brain\"\n ]\n },\n {\n \"unified\": \"1F445\",\n \"shortnames\": [\n \"tongue\"\n ]\n },\n {\n \"unified\": \"1F444\",\n \"shortnames\": [\n \"lips\"\n ]\n },\n {\n \"unified\": \"1F48B\",\n \"shortnames\": [\n \"kiss\"\n ]\n },\n {\n \"unified\": \"1F498\",\n \"shortnames\": [\n \"cupid\"\n ]\n },\n {\n \"unified\": \"2764-FE0F\",\n \"shortnames\": [\n \"heart\"\n ]\n },\n {\n \"unified\": \"1F493\",\n \"shortnames\": [\n \"heartbeat\"\n ]\n },\n {\n \"unified\": \"1F494\",\n \"shortnames\": [\n \"broken_heart\"\n ]\n },\n {\n \"unified\": \"1F495\",\n \"shortnames\": [\n \"two_hearts\"\n ]\n },\n {\n \"unified\": \"1F496\",\n \"shortnames\": [\n \"sparkling_heart\"\n ]\n },\n {\n \"unified\": \"1F497\",\n \"shortnames\": [\n \"heartpulse\"\n ]\n },\n {\n \"unified\": \"1F499\",\n \"shortnames\": [\n \"blue_heart\"\n ]\n },\n {\n \"unified\": \"1F49A\",\n \"shortnames\": [\n \"green_heart\"\n ]\n },\n {\n \"unified\": \"1F49B\",\n \"shortnames\": [\n \"yellow_heart\"\n ]\n },\n {\n \"unified\": \"1F9E1\",\n \"shortnames\": [\n \"orange_heart\"\n ]\n },\n {\n \"unified\": \"1F49C\",\n \"shortnames\": [\n \"purple_heart\"\n ]\n },\n {\n \"unified\": \"1F5A4\",\n \"shortnames\": [\n \"black_heart\"\n ]\n },\n {\n \"unified\": \"1F49D\",\n \"shortnames\": [\n \"gift_heart\"\n ]\n },\n {\n \"unified\": \"1F49E\",\n \"shortnames\": [\n \"revolving_hearts\"\n ]\n },\n {\n \"unified\": \"1F49F\",\n \"shortnames\": [\n \"heart_decoration\"\n ]\n },\n {\n \"unified\": \"2763-FE0F\",\n \"shortnames\": [\n \"heavy_heart_exclamation_mark_ornament\"\n ]\n },\n {\n \"unified\": \"1F48C\",\n \"shortnames\": [\n \"love_letter\"\n ]\n },\n {\n \"unified\": \"1F4A4\",\n \"shortnames\": [\n \"zzz\"\n ]\n },\n {\n \"unified\": \"1F4A2\",\n \"shortnames\": [\n \"anger\"\n ]\n },\n {\n \"unified\": \"1F4A3\",\n \"shortnames\": [\n \"bomb\"\n ]\n },\n {\n \"unified\": \"1F4A5\",\n \"shortnames\": [\n \"boom\"\n ]\n },\n {\n \"unified\": \"1F4A6\",\n \"shortnames\": [\n \"sweat_drops\"\n ]\n },\n {\n \"unified\": \"1F4A8\",\n \"shortnames\": [\n \"dash\"\n ]\n },\n {\n \"unified\": \"1F4AB\",\n \"shortnames\": [\n \"dizzy\"\n ]\n },\n {\n \"unified\": \"1F4AC\",\n \"shortnames\": [\n \"speech_balloon\"\n ]\n },\n {\n \"unified\": \"1F5E8-FE0F\",\n \"shortnames\": [\n \"left_speech_bubble\"\n ]\n },\n {\n \"unified\": \"1F5EF-FE0F\",\n \"shortnames\": [\n \"right_anger_bubble\"\n ]\n },\n {\n \"unified\": \"1F4AD\",\n \"shortnames\": [\n \"thought_balloon\"\n ]\n },\n {\n \"unified\": \"1F573-FE0F\",\n \"shortnames\": [\n \"hole\"\n ]\n },\n {\n \"unified\": \"1F453\",\n \"shortnames\": [\n \"eyeglasses\"\n ]\n },\n {\n \"unified\": \"1F576-FE0F\",\n \"shortnames\": [\n \"dark_sunglasses\"\n ]\n },\n {\n \"unified\": \"1F454\",\n \"shortnames\": [\n \"necktie\"\n ]\n },\n {\n \"unified\": \"1F455\",\n \"shortnames\": [\n \"shirt\"\n ]\n },\n {\n \"unified\": \"1F456\",\n \"shortnames\": [\n \"jeans\"\n ]\n },\n {\n \"unified\": \"1F9E3\",\n \"shortnames\": [\n \"scarf\"\n ]\n },\n {\n \"unified\": \"1F9E4\",\n \"shortnames\": [\n \"gloves\"\n ]\n },\n {\n \"unified\": \"1F9E5\",\n \"shortnames\": [\n \"coat\"\n ]\n },\n {\n \"unified\": \"1F9E6\",\n \"shortnames\": [\n \"socks\"\n ]\n },\n {\n \"unified\": \"1F457\",\n \"shortnames\": [\n \"dress\"\n ]\n },\n {\n \"unified\": \"1F458\",\n \"shortnames\": [\n \"kimono\"\n ]\n },\n {\n \"unified\": \"1F459\",\n \"shortnames\": [\n \"bikini\"\n ]\n },\n {\n \"unified\": \"1F45A\",\n \"shortnames\": [\n \"womans_clothes\"\n ]\n },\n {\n \"unified\": \"1F45B\",\n \"shortnames\": [\n \"purse\"\n ]\n },\n {\n \"unified\": \"1F45C\",\n \"shortnames\": [\n \"handbag\"\n ]\n },\n {\n \"unified\": \"1F45D\",\n \"shortnames\": [\n \"pouch\"\n ]\n },\n {\n \"unified\": \"1F6CD-FE0F\",\n \"shortnames\": [\n \"shopping_bags\"\n ]\n },\n {\n \"unified\": \"1F392\",\n \"shortnames\": [\n \"school_satchel\"\n ]\n },\n {\n \"unified\": \"1F45E\",\n \"shortnames\": [\n \"mans_shoe\"\n ]\n },\n {\n \"unified\": \"1F45F\",\n \"shortnames\": [\n \"athletic_shoe\"\n ]\n },\n {\n \"unified\": \"1F460\",\n \"shortnames\": [\n \"high_heel\"\n ]\n },\n {\n \"unified\": \"1F461\",\n \"shortnames\": [\n \"sandal\"\n ]\n },\n {\n \"unified\": \"1F462\",\n \"shortnames\": [\n \"boot\"\n ]\n },\n {\n \"unified\": \"1F451\",\n \"shortnames\": [\n \"crown\"\n ]\n },\n {\n \"unified\": \"1F452\",\n \"shortnames\": [\n \"womans_hat\"\n ]\n },\n {\n \"unified\": \"1F3A9\",\n \"shortnames\": [\n \"tophat\"\n ]\n },\n {\n \"unified\": \"1F393\",\n \"shortnames\": [\n \"mortar_board\"\n ]\n },\n {\n \"unified\": \"1F9E2\",\n \"shortnames\": [\n \"billed_cap\"\n ]\n },\n {\n \"unified\": \"26D1-FE0F\",\n \"shortnames\": [\n \"helmet_with_white_cross\"\n ]\n },\n {\n \"unified\": \"1F4FF\",\n \"shortnames\": [\n \"prayer_beads\"\n ]\n },\n {\n \"unified\": \"1F484\",\n \"shortnames\": [\n \"lipstick\"\n ]\n },\n {\n \"unified\": \"1F48D\",\n \"shortnames\": [\n \"ring\"\n ]\n },\n {\n \"unified\": \"1F48E\",\n \"shortnames\": [\n \"gem\"\n ]\n }\n ]\n },\n {\n \"name\": \"Animals & Nature\",\n \"emojis\": [\n {\n \"unified\": \"1F435\",\n \"shortnames\": [\n \"monkey_face\"\n ]\n },\n {\n \"unified\": \"1F412\",\n \"shortnames\": [\n \"monkey\"\n ]\n },\n {\n \"unified\": \"1F98D\",\n \"shortnames\": [\n \"gorilla\"\n ]\n },\n {\n \"unified\": \"1F436\",\n \"shortnames\": [\n \"dog\"\n ]\n },\n {\n \"unified\": \"1F415\",\n \"shortnames\": [\n \"dog2\"\n ]\n },\n {\n \"unified\": \"1F429\",\n \"shortnames\": [\n \"poodle\"\n ]\n },\n {\n \"unified\": \"1F43A\",\n \"shortnames\": [\n \"wolf\"\n ]\n },\n {\n \"unified\": \"1F98A\",\n \"shortnames\": [\n \"fox_face\"\n ]\n },\n {\n \"unified\": \"1F431\",\n \"shortnames\": [\n \"cat\"\n ]\n },\n {\n \"unified\": \"1F408\",\n \"shortnames\": [\n \"cat2\"\n ]\n },\n {\n \"unified\": \"1F981\",\n \"shortnames\": [\n \"lion_face\"\n ]\n },\n {\n \"unified\": \"1F42F\",\n \"shortnames\": [\n \"tiger\"\n ]\n },\n {\n \"unified\": \"1F405\",\n \"shortnames\": [\n \"tiger2\"\n ]\n },\n {\n \"unified\": \"1F406\",\n \"shortnames\": [\n \"leopard\"\n ]\n },\n {\n \"unified\": \"1F434\",\n \"shortnames\": [\n \"horse\"\n ]\n },\n {\n \"unified\": \"1F40E\",\n \"shortnames\": [\n \"racehorse\"\n ]\n },\n {\n \"unified\": \"1F984\",\n \"shortnames\": [\n \"unicorn_face\"\n ]\n },\n {\n \"unified\": \"1F993\",\n \"shortnames\": [\n \"zebra_face\"\n ]\n },\n {\n \"unified\": \"1F98C\",\n \"shortnames\": [\n \"deer\"\n ]\n },\n {\n \"unified\": \"1F42E\",\n \"shortnames\": [\n \"cow\"\n ]\n },\n {\n \"unified\": \"1F402\",\n \"shortnames\": [\n \"ox\"\n ]\n },\n {\n \"unified\": \"1F403\",\n \"shortnames\": [\n \"water_buffalo\"\n ]\n },\n {\n \"unified\": \"1F404\",\n \"shortnames\": [\n \"cow2\"\n ]\n },\n {\n \"unified\": \"1F437\",\n \"shortnames\": [\n \"pig\"\n ]\n },\n {\n \"unified\": \"1F416\",\n \"shortnames\": [\n \"pig2\"\n ]\n },\n {\n \"unified\": \"1F417\",\n \"shortnames\": [\n \"boar\"\n ]\n },\n {\n \"unified\": \"1F43D\",\n \"shortnames\": [\n \"pig_nose\"\n ]\n },\n {\n \"unified\": \"1F40F\",\n \"shortnames\": [\n \"ram\"\n ]\n },\n {\n \"unified\": \"1F411\",\n \"shortnames\": [\n \"sheep\"\n ]\n },\n {\n \"unified\": \"1F410\",\n \"shortnames\": [\n \"goat\"\n ]\n },\n {\n \"unified\": \"1F42A\",\n \"shortnames\": [\n \"dromedary_camel\"\n ]\n },\n {\n \"unified\": \"1F42B\",\n \"shortnames\": [\n \"camel\"\n ]\n },\n {\n \"unified\": \"1F992\",\n \"shortnames\": [\n \"giraffe_face\"\n ]\n },\n {\n \"unified\": \"1F418\",\n \"shortnames\": [\n \"elephant\"\n ]\n },\n {\n \"unified\": \"1F98F\",\n \"shortnames\": [\n \"rhinoceros\"\n ]\n },\n {\n \"unified\": \"1F42D\",\n \"shortnames\": [\n \"mouse\"\n ]\n },\n {\n \"unified\": \"1F401\",\n \"shortnames\": [\n \"mouse2\"\n ]\n },\n {\n \"unified\": \"1F400\",\n \"shortnames\": [\n \"rat\"\n ]\n },\n {\n \"unified\": \"1F439\",\n \"shortnames\": [\n \"hamster\"\n ]\n },\n {\n \"unified\": \"1F430\",\n \"shortnames\": [\n \"rabbit\"\n ]\n },\n {\n \"unified\": \"1F407\",\n \"shortnames\": [\n \"rabbit2\"\n ]\n },\n {\n \"unified\": \"1F43F-FE0F\",\n \"shortnames\": [\n \"chipmunk\"\n ]\n },\n {\n \"unified\": \"1F994\",\n \"shortnames\": [\n \"hedgehog\"\n ]\n },\n {\n \"unified\": \"1F987\",\n \"shortnames\": [\n \"bat\"\n ]\n },\n {\n \"unified\": \"1F43B\",\n \"shortnames\": [\n \"bear\"\n ]\n },\n {\n \"unified\": \"1F428\",\n \"shortnames\": [\n \"koala\"\n ]\n },\n {\n \"unified\": \"1F43C\",\n \"shortnames\": [\n \"panda_face\"\n ]\n },\n {\n \"unified\": \"1F43E\",\n \"shortnames\": [\n \"feet\"\n ]\n },\n {\n \"unified\": \"1F983\",\n \"shortnames\": [\n \"turkey\"\n ]\n },\n {\n \"unified\": \"1F414\",\n \"shortnames\": [\n \"chicken\"\n ]\n },\n {\n \"unified\": \"1F413\",\n \"shortnames\": [\n \"rooster\"\n ]\n },\n {\n \"unified\": \"1F423\",\n \"shortnames\": [\n \"hatching_chick\"\n ]\n },\n {\n \"unified\": \"1F424\",\n \"shortnames\": [\n \"baby_chick\"\n ]\n },\n {\n \"unified\": \"1F425\",\n \"shortnames\": [\n \"hatched_chick\"\n ]\n },\n {\n \"unified\": \"1F426\",\n \"shortnames\": [\n \"bird\"\n ]\n },\n {\n \"unified\": \"1F427\",\n \"shortnames\": [\n \"penguin\"\n ]\n },\n {\n \"unified\": \"1F54A-FE0F\",\n \"shortnames\": [\n \"dove_of_peace\"\n ]\n },\n {\n \"unified\": \"1F985\",\n \"shortnames\": [\n \"eagle\"\n ]\n },\n {\n \"unified\": \"1F986\",\n \"shortnames\": [\n \"duck\"\n ]\n },\n {\n \"unified\": \"1F989\",\n \"shortnames\": [\n \"owl\"\n ]\n },\n {\n \"unified\": \"1F438\",\n \"shortnames\": [\n \"frog\"\n ]\n },\n {\n \"unified\": \"1F40A\",\n \"shortnames\": [\n \"crocodile\"\n ]\n },\n {\n \"unified\": \"1F422\",\n \"shortnames\": [\n \"turtle\"\n ]\n },\n {\n \"unified\": \"1F98E\",\n \"shortnames\": [\n \"lizard\"\n ]\n },\n {\n \"unified\": \"1F40D\",\n \"shortnames\": [\n \"snake\"\n ]\n },\n {\n \"unified\": \"1F432\",\n \"shortnames\": [\n \"dragon_face\"\n ]\n },\n {\n \"unified\": \"1F409\",\n \"shortnames\": [\n \"dragon\"\n ]\n },\n {\n \"unified\": \"1F995\",\n \"shortnames\": [\n \"sauropod\"\n ]\n },\n {\n \"unified\": \"1F996\",\n \"shortnames\": [\n \"t-rex\"\n ]\n },\n {\n \"unified\": \"1F433\",\n \"shortnames\": [\n \"whale\"\n ]\n },\n {\n \"unified\": \"1F40B\",\n \"shortnames\": [\n \"whale2\"\n ]\n },\n {\n \"unified\": \"1F42C\",\n \"shortnames\": [\n \"dolphin\"\n ]\n },\n {\n \"unified\": \"1F41F\",\n \"shortnames\": [\n \"fish\"\n ]\n },\n {\n \"unified\": \"1F420\",\n \"shortnames\": [\n \"tropical_fish\"\n ]\n },\n {\n \"unified\": \"1F421\",\n \"shortnames\": [\n \"blowfish\"\n ]\n },\n {\n \"unified\": \"1F988\",\n \"shortnames\": [\n \"shark\"\n ]\n },\n {\n \"unified\": \"1F419\",\n \"shortnames\": [\n \"octopus\"\n ]\n },\n {\n \"unified\": \"1F41A\",\n \"shortnames\": [\n \"shell\"\n ]\n },\n {\n \"unified\": \"1F980\",\n \"shortnames\": [\n \"crab\"\n ]\n },\n {\n \"unified\": \"1F990\",\n \"shortnames\": [\n \"shrimp\"\n ]\n },\n {\n \"unified\": \"1F991\",\n \"shortnames\": [\n \"squid\"\n ]\n },\n {\n \"unified\": \"1F40C\",\n \"shortnames\": [\n \"snail\"\n ]\n },\n {\n \"unified\": \"1F98B\",\n \"shortnames\": [\n \"butterfly\"\n ]\n },\n {\n \"unified\": \"1F41B\",\n \"shortnames\": [\n \"bug\"\n ]\n },\n {\n \"unified\": \"1F41C\",\n \"shortnames\": [\n \"ant\"\n ]\n },\n {\n \"unified\": \"1F41D\",\n \"shortnames\": [\n \"bee\"\n ]\n },\n {\n \"unified\": \"1F41E\",\n \"shortnames\": [\n \"beetle\"\n ]\n },\n {\n \"unified\": \"1F997\",\n \"shortnames\": [\n \"cricket\"\n ]\n },\n {\n \"unified\": \"1F577-FE0F\",\n \"shortnames\": [\n \"spider\"\n ]\n },\n {\n \"unified\": \"1F578-FE0F\",\n \"shortnames\": [\n \"spider_web\"\n ]\n },\n {\n \"unified\": \"1F982\",\n \"shortnames\": [\n \"scorpion\"\n ]\n },\n {\n \"unified\": \"1F490\",\n \"shortnames\": [\n \"bouquet\"\n ]\n },\n {\n \"unified\": \"1F338\",\n \"shortnames\": [\n \"cherry_blossom\"\n ]\n },\n {\n \"unified\": \"1F4AE\",\n \"shortnames\": [\n \"white_flower\"\n ]\n },\n {\n \"unified\": \"1F3F5-FE0F\",\n \"shortnames\": [\n \"rosette\"\n ]\n },\n {\n \"unified\": \"1F339\",\n \"shortnames\": [\n \"rose\"\n ]\n },\n {\n \"unified\": \"1F940\",\n \"shortnames\": [\n \"wilted_flower\"\n ]\n },\n {\n \"unified\": \"1F33A\",\n \"shortnames\": [\n \"hibiscus\"\n ]\n },\n {\n \"unified\": \"1F33B\",\n \"shortnames\": [\n \"sunflower\"\n ]\n },\n {\n \"unified\": \"1F33C\",\n \"shortnames\": [\n \"blossom\"\n ]\n },\n {\n \"unified\": \"1F337\",\n \"shortnames\": [\n \"tulip\"\n ]\n },\n {\n \"unified\": \"1F331\",\n \"shortnames\": [\n \"seedling\"\n ]\n },\n {\n \"unified\": \"1F332\",\n \"shortnames\": [\n \"evergreen_tree\"\n ]\n },\n {\n \"unified\": \"1F333\",\n \"shortnames\": [\n \"deciduous_tree\"\n ]\n },\n {\n \"unified\": \"1F334\",\n \"shortnames\": [\n \"palm_tree\"\n ]\n },\n {\n \"unified\": \"1F335\",\n \"shortnames\": [\n \"cactus\"\n ]\n },\n {\n \"unified\": \"1F33E\",\n \"shortnames\": [\n \"ear_of_rice\"\n ]\n },\n {\n \"unified\": \"1F33F\",\n \"shortnames\": [\n \"herb\"\n ]\n },\n {\n \"unified\": \"2618-FE0F\",\n \"shortnames\": [\n \"shamrock\"\n ]\n },\n {\n \"unified\": \"1F340\",\n \"shortnames\": [\n \"four_leaf_clover\"\n ]\n },\n {\n \"unified\": \"1F341\",\n \"shortnames\": [\n \"maple_leaf\"\n ]\n },\n {\n \"unified\": \"1F342\",\n \"shortnames\": [\n \"fallen_leaf\"\n ]\n },\n {\n \"unified\": \"1F343\",\n \"shortnames\": [\n \"leaves\"\n ]\n }\n ]\n },\n {\n \"name\": \"Food & Drink\",\n \"emojis\": [\n {\n \"unified\": \"1F347\",\n \"shortnames\": [\n \"grapes\"\n ]\n },\n {\n \"unified\": \"1F348\",\n \"shortnames\": [\n \"melon\"\n ]\n },\n {\n \"unified\": \"1F349\",\n \"shortnames\": [\n \"watermelon\"\n ]\n },\n {\n \"unified\": \"1F34A\",\n \"shortnames\": [\n \"tangerine\"\n ]\n },\n {\n \"unified\": \"1F34B\",\n \"shortnames\": [\n \"lemon\"\n ]\n },\n {\n \"unified\": \"1F34C\",\n \"shortnames\": [\n \"banana\"\n ]\n },\n {\n \"unified\": \"1F34D\",\n \"shortnames\": [\n \"pineapple\"\n ]\n },\n {\n \"unified\": \"1F34E\",\n \"shortnames\": [\n \"apple\"\n ]\n },\n {\n \"unified\": \"1F34F\",\n \"shortnames\": [\n \"green_apple\"\n ]\n },\n {\n \"unified\": \"1F350\",\n \"shortnames\": [\n \"pear\"\n ]\n },\n {\n \"unified\": \"1F351\",\n \"shortnames\": [\n \"peach\"\n ]\n },\n {\n \"unified\": \"1F352\",\n \"shortnames\": [\n \"cherries\"\n ]\n },\n {\n \"unified\": \"1F353\",\n \"shortnames\": [\n \"strawberry\"\n ]\n },\n {\n \"unified\": \"1F95D\",\n \"shortnames\": [\n \"kiwifruit\"\n ]\n },\n {\n \"unified\": \"1F345\",\n \"shortnames\": [\n \"tomato\"\n ]\n },\n {\n \"unified\": \"1F965\",\n \"shortnames\": [\n \"coconut\"\n ]\n },\n {\n \"unified\": \"1F951\",\n \"shortnames\": [\n \"avocado\"\n ]\n },\n {\n \"unified\": \"1F346\",\n \"shortnames\": [\n \"eggplant\"\n ]\n },\n {\n \"unified\": \"1F954\",\n \"shortnames\": [\n \"potato\"\n ]\n },\n {\n \"unified\": \"1F955\",\n \"shortnames\": [\n \"carrot\"\n ]\n },\n {\n \"unified\": \"1F33D\",\n \"shortnames\": [\n \"corn\"\n ]\n },\n {\n \"unified\": \"1F336-FE0F\",\n \"shortnames\": [\n \"hot_pepper\"\n ]\n },\n {\n \"unified\": \"1F952\",\n \"shortnames\": [\n \"cucumber\"\n ]\n },\n {\n \"unified\": \"1F966\",\n \"shortnames\": [\n \"broccoli\"\n ]\n },\n {\n \"unified\": \"1F344\",\n \"shortnames\": [\n \"mushroom\"\n ]\n },\n {\n \"unified\": \"1F95C\",\n \"shortnames\": [\n \"peanuts\"\n ]\n },\n {\n \"unified\": \"1F330\",\n \"shortnames\": [\n \"chestnut\"\n ]\n },\n {\n \"unified\": \"1F35E\",\n \"shortnames\": [\n \"bread\"\n ]\n },\n {\n \"unified\": \"1F950\",\n \"shortnames\": [\n \"croissant\"\n ]\n },\n {\n \"unified\": \"1F956\",\n \"shortnames\": [\n \"baguette_bread\"\n ]\n },\n {\n \"unified\": \"1F968\",\n \"shortnames\": [\n \"pretzel\"\n ]\n },\n {\n \"unified\": \"1F95E\",\n \"shortnames\": [\n \"pancakes\"\n ]\n },\n {\n \"unified\": \"1F9C0\",\n \"shortnames\": [\n \"cheese_wedge\"\n ]\n },\n {\n \"unified\": \"1F356\",\n \"shortnames\": [\n \"meat_on_bone\"\n ]\n },\n {\n \"unified\": \"1F357\",\n \"shortnames\": [\n \"poultry_leg\"\n ]\n },\n {\n \"unified\": \"1F969\",\n \"shortnames\": [\n \"cut_of_meat\"\n ]\n },\n {\n \"unified\": \"1F953\",\n \"shortnames\": [\n \"bacon\"\n ]\n },\n {\n \"unified\": \"1F354\",\n \"shortnames\": [\n \"hamburger\"\n ]\n },\n {\n \"unified\": \"1F35F\",\n \"shortnames\": [\n \"fries\"\n ]\n },\n {\n \"unified\": \"1F355\",\n \"shortnames\": [\n \"pizza\"\n ]\n },\n {\n \"unified\": \"1F32D\",\n \"shortnames\": [\n \"hotdog\"\n ]\n },\n {\n \"unified\": \"1F96A\",\n \"shortnames\": [\n \"sandwich\"\n ]\n },\n {\n \"unified\": \"1F32E\",\n \"shortnames\": [\n \"taco\"\n ]\n },\n {\n \"unified\": \"1F32F\",\n \"shortnames\": [\n \"burrito\"\n ]\n },\n {\n \"unified\": \"1F959\",\n \"shortnames\": [\n \"stuffed_flatbread\"\n ]\n },\n {\n \"unified\": \"1F95A\",\n \"shortnames\": [\n \"egg\"\n ]\n },\n {\n \"unified\": \"1F373\",\n \"shortnames\": [\n \"fried_egg\"\n ]\n },\n {\n \"unified\": \"1F958\",\n \"shortnames\": [\n \"shallow_pan_of_food\"\n ]\n },\n {\n \"unified\": \"1F372\",\n \"shortnames\": [\n \"stew\"\n ]\n },\n {\n \"unified\": \"1F963\",\n \"shortnames\": [\n \"bowl_with_spoon\"\n ]\n },\n {\n \"unified\": \"1F957\",\n \"shortnames\": [\n \"green_salad\"\n ]\n },\n {\n \"unified\": \"1F37F\",\n \"shortnames\": [\n \"popcorn\"\n ]\n },\n {\n \"unified\": \"1F96B\",\n \"shortnames\": [\n \"canned_food\"\n ]\n },\n {\n \"unified\": \"1F371\",\n \"shortnames\": [\n \"bento\"\n ]\n },\n {\n \"unified\": \"1F358\",\n \"shortnames\": [\n \"rice_cracker\"\n ]\n },\n {\n \"unified\": \"1F359\",\n \"shortnames\": [\n \"rice_ball\"\n ]\n },\n {\n \"unified\": \"1F35A\",\n \"shortnames\": [\n \"rice\"\n ]\n },\n {\n \"unified\": \"1F35B\",\n \"shortnames\": [\n \"curry\"\n ]\n },\n {\n \"unified\": \"1F35C\",\n \"shortnames\": [\n \"ramen\"\n ]\n },\n {\n \"unified\": \"1F35D\",\n \"shortnames\": [\n \"spaghetti\"\n ]\n },\n {\n \"unified\": \"1F360\",\n \"shortnames\": [\n \"sweet_potato\"\n ]\n },\n {\n \"unified\": \"1F362\",\n \"shortnames\": [\n \"oden\"\n ]\n },\n {\n \"unified\": \"1F363\",\n \"shortnames\": [\n \"sushi\"\n ]\n },\n {\n \"unified\": \"1F364\",\n \"shortnames\": [\n \"fried_shrimp\"\n ]\n },\n {\n \"unified\": \"1F365\",\n \"shortnames\": [\n \"fish_cake\"\n ]\n },\n {\n \"unified\": \"1F361\",\n \"shortnames\": [\n \"dango\"\n ]\n },\n {\n \"unified\": \"1F95F\",\n \"shortnames\": [\n \"dumpling\"\n ]\n },\n {\n \"unified\": \"1F960\",\n \"shortnames\": [\n \"fortune_cookie\"\n ]\n },\n {\n \"unified\": \"1F961\",\n \"shortnames\": [\n \"takeout_box\"\n ]\n },\n {\n \"unified\": \"1F366\",\n \"shortnames\": [\n \"icecream\"\n ]\n },\n {\n \"unified\": \"1F367\",\n \"shortnames\": [\n \"shaved_ice\"\n ]\n },\n {\n \"unified\": \"1F368\",\n \"shortnames\": [\n \"ice_cream\"\n ]\n },\n {\n \"unified\": \"1F369\",\n \"shortnames\": [\n \"doughnut\"\n ]\n },\n {\n \"unified\": \"1F36A\",\n \"shortnames\": [\n \"cookie\"\n ]\n },\n {\n \"unified\": \"1F382\",\n \"shortnames\": [\n \"birthday\"\n ]\n },\n {\n \"unified\": \"1F370\",\n \"shortnames\": [\n \"cake\"\n ]\n },\n {\n \"unified\": \"1F967\",\n \"shortnames\": [\n \"pie\"\n ]\n },\n {\n \"unified\": \"1F36B\",\n \"shortnames\": [\n \"chocolate_bar\"\n ]\n },\n {\n \"unified\": \"1F36C\",\n \"shortnames\": [\n \"candy\"\n ]\n },\n {\n \"unified\": \"1F36D\",\n \"shortnames\": [\n \"lollipop\"\n ]\n },\n {\n \"unified\": \"1F36E\",\n \"shortnames\": [\n \"custard\"\n ]\n },\n {\n \"unified\": \"1F36F\",\n \"shortnames\": [\n \"honey_pot\"\n ]\n },\n {\n \"unified\": \"1F37C\",\n \"shortnames\": [\n \"baby_bottle\"\n ]\n },\n {\n \"unified\": \"1F95B\",\n \"shortnames\": [\n \"glass_of_milk\"\n ]\n },\n {\n \"unified\": \"2615\",\n \"shortnames\": [\n \"coffee\"\n ]\n },\n {\n \"unified\": \"1F375\",\n \"shortnames\": [\n \"tea\"\n ]\n },\n {\n \"unified\": \"1F376\",\n \"shortnames\": [\n \"sake\"\n ]\n },\n {\n \"unified\": \"1F37E\",\n \"shortnames\": [\n \"champagne\"\n ]\n },\n {\n \"unified\": \"1F377\",\n \"shortnames\": [\n \"wine_glass\"\n ]\n },\n {\n \"unified\": \"1F378\",\n \"shortnames\": [\n \"cocktail\"\n ]\n },\n {\n \"unified\": \"1F379\",\n \"shortnames\": [\n \"tropical_drink\"\n ]\n },\n {\n \"unified\": \"1F37A\",\n \"shortnames\": [\n \"beer\"\n ]\n },\n {\n \"unified\": \"1F37B\",\n \"shortnames\": [\n \"beers\"\n ]\n },\n {\n \"unified\": \"1F942\",\n \"shortnames\": [\n \"clinking_glasses\"\n ]\n },\n {\n \"unified\": \"1F943\",\n \"shortnames\": [\n \"tumbler_glass\"\n ]\n },\n {\n \"unified\": \"1F964\",\n \"shortnames\": [\n \"cup_with_straw\"\n ]\n },\n {\n \"unified\": \"1F962\",\n \"shortnames\": [\n \"chopsticks\"\n ]\n },\n {\n \"unified\": \"1F37D-FE0F\",\n \"shortnames\": [\n \"knife_fork_plate\"\n ]\n },\n {\n \"unified\": \"1F374\",\n \"shortnames\": [\n \"fork_and_knife\"\n ]\n },\n {\n \"unified\": \"1F944\",\n \"shortnames\": [\n \"spoon\"\n ]\n },\n {\n \"unified\": \"1F52A\",\n \"shortnames\": [\n \"hocho\"\n ]\n },\n {\n \"unified\": \"1F3FA\",\n \"shortnames\": [\n \"amphora\"\n ]\n }\n ]\n },\n {\n \"name\": \"Travel & Places\",\n \"emojis\": [\n {\n \"unified\": \"1F30D\",\n \"shortnames\": [\n \"earth_africa\"\n ]\n },\n {\n \"unified\": \"1F30E\",\n \"shortnames\": [\n \"earth_americas\"\n ]\n },\n {\n \"unified\": \"1F30F\",\n \"shortnames\": [\n \"earth_asia\"\n ]\n },\n {\n \"unified\": \"1F310\",\n \"shortnames\": [\n \"globe_with_meridians\"\n ]\n },\n {\n \"unified\": \"1F5FA-FE0F\",\n \"shortnames\": [\n \"world_map\"\n ]\n },\n {\n \"unified\": \"1F5FE\",\n \"shortnames\": [\n \"japan\"\n ]\n },\n {\n \"unified\": \"1F3D4-FE0F\",\n \"shortnames\": [\n \"snow_capped_mountain\"\n ]\n },\n {\n \"unified\": \"26F0-FE0F\",\n \"shortnames\": [\n \"mountain\"\n ]\n },\n {\n \"unified\": \"1F30B\",\n \"shortnames\": [\n \"volcano\"\n ]\n },\n {\n \"unified\": \"1F5FB\",\n \"shortnames\": [\n \"mount_fuji\"\n ]\n },\n {\n \"unified\": \"1F3D5-FE0F\",\n \"shortnames\": [\n \"camping\"\n ]\n },\n {\n \"unified\": \"1F3D6-FE0F\",\n \"shortnames\": [\n \"beach_with_umbrella\"\n ]\n },\n {\n \"unified\": \"1F3DC-FE0F\",\n \"shortnames\": [\n \"desert\"\n ]\n },\n {\n \"unified\": \"1F3DD-FE0F\",\n \"shortnames\": [\n \"desert_island\"\n ]\n },\n {\n \"unified\": \"1F3DE-FE0F\",\n \"shortnames\": [\n \"national_park\"\n ]\n },\n {\n \"unified\": \"1F3DF-FE0F\",\n \"shortnames\": [\n \"stadium\"\n ]\n },\n {\n \"unified\": \"1F3DB-FE0F\",\n \"shortnames\": [\n \"classical_building\"\n ]\n },\n {\n \"unified\": \"1F3D7-FE0F\",\n \"shortnames\": [\n \"building_construction\"\n ]\n },\n {\n \"unified\": \"1F3D8-FE0F\",\n \"shortnames\": [\n \"house_buildings\"\n ]\n },\n {\n \"unified\": \"1F3D9-FE0F\",\n \"shortnames\": [\n \"cityscape\"\n ]\n },\n {\n \"unified\": \"1F3DA-FE0F\",\n \"shortnames\": [\n \"derelict_house_building\"\n ]\n },\n {\n \"unified\": \"1F3E0\",\n \"shortnames\": [\n \"house\"\n ]\n },\n {\n \"unified\": \"1F3E1\",\n \"shortnames\": [\n \"house_with_garden\"\n ]\n },\n {\n \"unified\": \"1F3E2\",\n \"shortnames\": [\n \"office\"\n ]\n },\n {\n \"unified\": \"1F3E3\",\n \"shortnames\": [\n \"post_office\"\n ]\n },\n {\n \"unified\": \"1F3E4\",\n \"shortnames\": [\n \"european_post_office\"\n ]\n },\n {\n \"unified\": \"1F3E5\",\n \"shortnames\": [\n \"hospital\"\n ]\n },\n {\n \"unified\": \"1F3E6\",\n \"shortnames\": [\n \"bank\"\n ]\n },\n {\n \"unified\": \"1F3E8\",\n \"shortnames\": [\n \"hotel\"\n ]\n },\n {\n \"unified\": \"1F3E9\",\n \"shortnames\": [\n \"love_hotel\"\n ]\n },\n {\n \"unified\": \"1F3EA\",\n \"shortnames\": [\n \"convenience_store\"\n ]\n },\n {\n \"unified\": \"1F3EB\",\n \"shortnames\": [\n \"school\"\n ]\n },\n {\n \"unified\": \"1F3EC\",\n \"shortnames\": [\n \"department_store\"\n ]\n },\n {\n \"unified\": \"1F3ED\",\n \"shortnames\": [\n \"factory\"\n ]\n },\n {\n \"unified\": \"1F3EF\",\n \"shortnames\": [\n \"japanese_castle\"\n ]\n },\n {\n \"unified\": \"1F3F0\",\n \"shortnames\": [\n \"european_castle\"\n ]\n },\n {\n \"unified\": \"1F492\",\n \"shortnames\": [\n \"wedding\"\n ]\n },\n {\n \"unified\": \"1F5FC\",\n \"shortnames\": [\n \"tokyo_tower\"\n ]\n },\n {\n \"unified\": \"1F5FD\",\n \"shortnames\": [\n \"statue_of_liberty\"\n ]\n },\n {\n \"unified\": \"26EA\",\n \"shortnames\": [\n \"church\"\n ]\n },\n {\n \"unified\": \"1F54C\",\n \"shortnames\": [\n \"mosque\"\n ]\n },\n {\n \"unified\": \"1F54D\",\n \"shortnames\": [\n \"synagogue\"\n ]\n },\n {\n \"unified\": \"26E9-FE0F\",\n \"shortnames\": [\n \"shinto_shrine\"\n ]\n },\n {\n \"unified\": \"1F54B\",\n \"shortnames\": [\n \"kaaba\"\n ]\n },\n {\n \"unified\": \"26F2\",\n \"shortnames\": [\n \"fountain\"\n ]\n },\n {\n \"unified\": \"26FA\",\n \"shortnames\": [\n \"tent\"\n ]\n },\n {\n \"unified\": \"1F301\",\n \"shortnames\": [\n \"foggy\"\n ]\n },\n {\n \"unified\": \"1F303\",\n \"shortnames\": [\n \"night_with_stars\"\n ]\n },\n {\n \"unified\": \"1F304\",\n \"shortnames\": [\n \"sunrise_over_mountains\"\n ]\n },\n {\n \"unified\": \"1F305\",\n \"shortnames\": [\n \"sunrise\"\n ]\n },\n {\n \"unified\": \"1F306\",\n \"shortnames\": [\n \"city_sunset\"\n ]\n },\n {\n \"unified\": \"1F307\",\n \"shortnames\": [\n \"city_sunrise\"\n ]\n },\n {\n \"unified\": \"1F309\",\n \"shortnames\": [\n \"bridge_at_night\"\n ]\n },\n {\n \"unified\": \"2668-FE0F\",\n \"shortnames\": [\n \"hotsprings\"\n ]\n },\n {\n \"unified\": \"1F30C\",\n \"shortnames\": [\n \"milky_way\"\n ]\n },\n {\n \"unified\": \"1F3A0\",\n \"shortnames\": [\n \"carousel_horse\"\n ]\n },\n {\n \"unified\": \"1F3A1\",\n \"shortnames\": [\n \"ferris_wheel\"\n ]\n },\n {\n \"unified\": \"1F3A2\",\n \"shortnames\": [\n \"roller_coaster\"\n ]\n },\n {\n \"unified\": \"1F488\",\n \"shortnames\": [\n \"barber\"\n ]\n },\n {\n \"unified\": \"1F3AA\",\n \"shortnames\": [\n \"circus_tent\"\n ]\n },\n {\n \"unified\": \"1F3AD\",\n \"shortnames\": [\n \"performing_arts\"\n ]\n },\n {\n \"unified\": \"1F5BC-FE0F\",\n \"shortnames\": [\n \"frame_with_picture\"\n ]\n },\n {\n \"unified\": \"1F3A8\",\n \"shortnames\": [\n \"art\"\n ]\n },\n {\n \"unified\": \"1F3B0\",\n \"shortnames\": [\n \"slot_machine\"\n ]\n },\n {\n \"unified\": \"1F682\",\n \"shortnames\": [\n \"steam_locomotive\"\n ]\n },\n {\n \"unified\": \"1F683\",\n \"shortnames\": [\n \"railway_car\"\n ]\n },\n {\n \"unified\": \"1F684\",\n \"shortnames\": [\n \"bullettrain_side\"\n ]\n },\n {\n \"unified\": \"1F685\",\n \"shortnames\": [\n \"bullettrain_front\"\n ]\n },\n {\n \"unified\": \"1F686\",\n \"shortnames\": [\n \"train2\"\n ]\n },\n {\n \"unified\": \"1F687\",\n \"shortnames\": [\n \"metro\"\n ]\n },\n {\n \"unified\": \"1F688\",\n \"shortnames\": [\n \"light_rail\"\n ]\n },\n {\n \"unified\": \"1F689\",\n \"shortnames\": [\n \"station\"\n ]\n },\n {\n \"unified\": \"1F68A\",\n \"shortnames\": [\n \"tram\"\n ]\n },\n {\n \"unified\": \"1F69D\",\n \"shortnames\": [\n \"monorail\"\n ]\n },\n {\n \"unified\": \"1F69E\",\n \"shortnames\": [\n \"mountain_railway\"\n ]\n },\n {\n \"unified\": \"1F68B\",\n \"shortnames\": [\n \"train\"\n ]\n },\n {\n \"unified\": \"1F68C\",\n \"shortnames\": [\n \"bus\"\n ]\n },\n {\n \"unified\": \"1F68D\",\n \"shortnames\": [\n \"oncoming_bus\"\n ]\n },\n {\n \"unified\": \"1F68E\",\n \"shortnames\": [\n \"trolleybus\"\n ]\n },\n {\n \"unified\": \"1F690\",\n \"shortnames\": [\n \"minibus\"\n ]\n },\n {\n \"unified\": \"1F691\",\n \"shortnames\": [\n \"ambulance\"\n ]\n },\n {\n \"unified\": \"1F692\",\n \"shortnames\": [\n \"fire_engine\"\n ]\n },\n {\n \"unified\": \"1F693\",\n \"shortnames\": [\n \"police_car\"\n ]\n },\n {\n \"unified\": \"1F694\",\n \"shortnames\": [\n \"oncoming_police_car\"\n ]\n },\n {\n \"unified\": \"1F695\",\n \"shortnames\": [\n \"taxi\"\n ]\n },\n {\n \"unified\": \"1F696\",\n \"shortnames\": [\n \"oncoming_taxi\"\n ]\n },\n {\n \"unified\": \"1F697\",\n \"shortnames\": [\n \"car\"\n ]\n },\n {\n \"unified\": \"1F698\",\n \"shortnames\": [\n \"oncoming_automobile\"\n ]\n },\n {\n \"unified\": \"1F699\",\n \"shortnames\": [\n \"blue_car\"\n ]\n },\n {\n \"unified\": \"1F69A\",\n \"shortnames\": [\n \"truck\"\n ]\n },\n {\n \"unified\": \"1F69B\",\n \"shortnames\": [\n \"articulated_lorry\"\n ]\n },\n {\n \"unified\": \"1F69C\",\n \"shortnames\": [\n \"tractor\"\n ]\n },\n {\n \"unified\": \"1F6B2\",\n \"shortnames\": [\n \"bike\"\n ]\n },\n {\n \"unified\": \"1F6F4\",\n \"shortnames\": [\n \"scooter\"\n ]\n },\n {\n \"unified\": \"1F6F5\",\n \"shortnames\": [\n \"motor_scooter\"\n ]\n },\n {\n \"unified\": \"1F68F\",\n \"shortnames\": [\n \"busstop\"\n ]\n },\n {\n \"unified\": \"1F6E3-FE0F\",\n \"shortnames\": [\n \"motorway\"\n ]\n },\n {\n \"unified\": \"1F6E4-FE0F\",\n \"shortnames\": [\n \"railway_track\"\n ]\n },\n {\n \"unified\": \"26FD\",\n \"shortnames\": [\n \"fuelpump\"\n ]\n },\n {\n \"unified\": \"1F6A8\",\n \"shortnames\": [\n \"rotating_light\"\n ]\n },\n {\n \"unified\": \"1F6A5\",\n \"shortnames\": [\n \"traffic_light\"\n ]\n },\n {\n \"unified\": \"1F6A6\",\n \"shortnames\": [\n \"vertical_traffic_light\"\n ]\n },\n {\n \"unified\": \"1F6A7\",\n \"shortnames\": [\n \"construction\"\n ]\n },\n {\n \"unified\": \"1F6D1\",\n \"shortnames\": [\n \"octagonal_sign\"\n ]\n },\n {\n \"unified\": \"2693\",\n \"shortnames\": [\n \"anchor\"\n ]\n },\n {\n \"unified\": \"26F5\",\n \"shortnames\": [\n \"boat\"\n ]\n },\n {\n \"unified\": \"1F6F6\",\n \"shortnames\": [\n \"canoe\"\n ]\n },\n {\n \"unified\": \"1F6A4\",\n \"shortnames\": [\n \"speedboat\"\n ]\n },\n {\n \"unified\": \"1F6F3-FE0F\",\n \"shortnames\": [\n \"passenger_ship\"\n ]\n },\n {\n \"unified\": \"26F4-FE0F\",\n \"shortnames\": [\n \"ferry\"\n ]\n },\n {\n \"unified\": \"1F6E5-FE0F\",\n \"shortnames\": [\n \"motor_boat\"\n ]\n },\n {\n \"unified\": \"1F6A2\",\n \"shortnames\": [\n \"ship\"\n ]\n },\n {\n \"unified\": \"2708-FE0F\",\n \"shortnames\": [\n \"airplane\"\n ]\n },\n {\n \"unified\": \"1F6E9-FE0F\",\n \"shortnames\": [\n \"small_airplane\"\n ]\n },\n {\n \"unified\": \"1F6EB\",\n \"shortnames\": [\n \"airplane_departure\"\n ]\n },\n {\n \"unified\": \"1F6EC\",\n \"shortnames\": [\n \"airplane_arriving\"\n ]\n },\n {\n \"unified\": \"1F4BA\",\n \"shortnames\": [\n \"seat\"\n ]\n },\n {\n \"unified\": \"1F681\",\n \"shortnames\": [\n \"helicopter\"\n ]\n },\n {\n \"unified\": \"1F69F\",\n \"shortnames\": [\n \"suspension_railway\"\n ]\n },\n {\n \"unified\": \"1F6A0\",\n \"shortnames\": [\n \"mountain_cableway\"\n ]\n },\n {\n \"unified\": \"1F6A1\",\n \"shortnames\": [\n \"aerial_tramway\"\n ]\n },\n {\n \"unified\": \"1F6F0-FE0F\",\n \"shortnames\": [\n \"satellite\"\n ]\n },\n {\n \"unified\": \"1F680\",\n \"shortnames\": [\n \"rocket\"\n ]\n },\n {\n \"unified\": \"1F6F8\",\n \"shortnames\": [\n \"flying_saucer\"\n ]\n },\n {\n \"unified\": \"1F6CE-FE0F\",\n \"shortnames\": [\n \"bellhop_bell\"\n ]\n },\n {\n \"unified\": \"1F6AA\",\n \"shortnames\": [\n \"door\"\n ]\n },\n {\n \"unified\": \"1F6CF-FE0F\",\n \"shortnames\": [\n \"bed\"\n ]\n },\n {\n \"unified\": \"1F6CB-FE0F\",\n \"shortnames\": [\n \"couch_and_lamp\"\n ]\n },\n {\n \"unified\": \"1F6BD\",\n \"shortnames\": [\n \"toilet\"\n ]\n },\n {\n \"unified\": \"1F6BF\",\n \"shortnames\": [\n \"shower\"\n ]\n },\n {\n \"unified\": \"1F6C1\",\n \"shortnames\": [\n \"bathtub\"\n ]\n },\n {\n \"unified\": \"231B\",\n \"shortnames\": [\n \"hourglass\"\n ]\n },\n {\n \"unified\": \"23F3\",\n \"shortnames\": [\n \"hourglass_flowing_sand\"\n ]\n },\n {\n \"unified\": \"231A\",\n \"shortnames\": [\n \"watch\"\n ]\n },\n {\n \"unified\": \"23F0\",\n \"shortnames\": [\n \"alarm_clock\"\n ]\n },\n {\n \"unified\": \"23F1-FE0F\",\n \"shortnames\": [\n \"stopwatch\"\n ]\n },\n {\n \"unified\": \"23F2-FE0F\",\n \"shortnames\": [\n \"timer_clock\"\n ]\n },\n {\n \"unified\": \"1F570-FE0F\",\n \"shortnames\": [\n \"mantelpiece_clock\"\n ]\n },\n {\n \"unified\": \"1F55B\",\n \"shortnames\": [\n \"clock12\"\n ]\n },\n {\n \"unified\": \"1F567\",\n \"shortnames\": [\n \"clock1230\"\n ]\n },\n {\n \"unified\": \"1F550\",\n \"shortnames\": [\n \"clock1\"\n ]\n },\n {\n \"unified\": \"1F55C\",\n \"shortnames\": [\n \"clock130\"\n ]\n },\n {\n \"unified\": \"1F551\",\n \"shortnames\": [\n \"clock2\"\n ]\n },\n {\n \"unified\": \"1F55D\",\n \"shortnames\": [\n \"clock230\"\n ]\n },\n {\n \"unified\": \"1F552\",\n \"shortnames\": [\n \"clock3\"\n ]\n },\n {\n \"unified\": \"1F55E\",\n \"shortnames\": [\n \"clock330\"\n ]\n },\n {\n \"unified\": \"1F553\",\n \"shortnames\": [\n \"clock4\"\n ]\n },\n {\n \"unified\": \"1F55F\",\n \"shortnames\": [\n \"clock430\"\n ]\n },\n {\n \"unified\": \"1F554\",\n \"shortnames\": [\n \"clock5\"\n ]\n },\n {\n \"unified\": \"1F560\",\n \"shortnames\": [\n \"clock530\"\n ]\n },\n {\n \"unified\": \"1F555\",\n \"shortnames\": [\n \"clock6\"\n ]\n },\n {\n \"unified\": \"1F561\",\n \"shortnames\": [\n \"clock630\"\n ]\n },\n {\n \"unified\": \"1F556\",\n \"shortnames\": [\n \"clock7\"\n ]\n },\n {\n \"unified\": \"1F562\",\n \"shortnames\": [\n \"clock730\"\n ]\n },\n {\n \"unified\": \"1F557\",\n \"shortnames\": [\n \"clock8\"\n ]\n },\n {\n \"unified\": \"1F563\",\n \"shortnames\": [\n \"clock830\"\n ]\n },\n {\n \"unified\": \"1F558\",\n \"shortnames\": [\n \"clock9\"\n ]\n },\n {\n \"unified\": \"1F564\",\n \"shortnames\": [\n \"clock930\"\n ]\n },\n {\n \"unified\": \"1F559\",\n \"shortnames\": [\n \"clock10\"\n ]\n },\n {\n \"unified\": \"1F565\",\n \"shortnames\": [\n \"clock1030\"\n ]\n },\n {\n \"unified\": \"1F55A\",\n \"shortnames\": [\n \"clock11\"\n ]\n },\n {\n \"unified\": \"1F566\",\n \"shortnames\": [\n \"clock1130\"\n ]\n },\n {\n \"unified\": \"1F311\",\n \"shortnames\": [\n \"new_moon\"\n ]\n },\n {\n \"unified\": \"1F312\",\n \"shortnames\": [\n \"waxing_crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F313\",\n \"shortnames\": [\n \"first_quarter_moon\"\n ]\n },\n {\n \"unified\": \"1F314\",\n \"shortnames\": [\n \"moon\"\n ]\n },\n {\n \"unified\": \"1F315\",\n \"shortnames\": [\n \"full_moon\"\n ]\n },\n {\n \"unified\": \"1F316\",\n \"shortnames\": [\n \"waning_gibbous_moon\"\n ]\n },\n {\n \"unified\": \"1F317\",\n \"shortnames\": [\n \"last_quarter_moon\"\n ]\n },\n {\n \"unified\": \"1F318\",\n \"shortnames\": [\n \"waning_crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F319\",\n \"shortnames\": [\n \"crescent_moon\"\n ]\n },\n {\n \"unified\": \"1F31A\",\n \"shortnames\": [\n \"new_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31B\",\n \"shortnames\": [\n \"first_quarter_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31C\",\n \"shortnames\": [\n \"last_quarter_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F321-FE0F\",\n \"shortnames\": [\n \"thermometer\"\n ]\n },\n {\n \"unified\": \"2600-FE0F\",\n \"shortnames\": [\n \"sunny\"\n ]\n },\n {\n \"unified\": \"1F31D\",\n \"shortnames\": [\n \"full_moon_with_face\"\n ]\n },\n {\n \"unified\": \"1F31E\",\n \"shortnames\": [\n \"sun_with_face\"\n ]\n },\n {\n \"unified\": \"2B50\",\n \"shortnames\": [\n \"star\"\n ]\n },\n {\n \"unified\": \"1F31F\",\n \"shortnames\": [\n \"star2\"\n ]\n },\n {\n \"unified\": \"1F320\",\n \"shortnames\": [\n \"stars\"\n ]\n },\n {\n \"unified\": \"2601-FE0F\",\n \"shortnames\": [\n \"cloud\"\n ]\n },\n {\n \"unified\": \"26C5\",\n \"shortnames\": [\n \"partly_sunny\"\n ]\n },\n {\n \"unified\": \"26C8-FE0F\",\n \"shortnames\": [\n \"thunder_cloud_and_rain\"\n ]\n },\n {\n \"unified\": \"1F324-FE0F\",\n \"shortnames\": [\n \"mostly_sunny\"\n ]\n },\n {\n \"unified\": \"1F325-FE0F\",\n \"shortnames\": [\n \"barely_sunny\"\n ]\n },\n {\n \"unified\": \"1F326-FE0F\",\n \"shortnames\": [\n \"partly_sunny_rain\"\n ]\n },\n {\n \"unified\": \"1F327-FE0F\",\n \"shortnames\": [\n \"rain_cloud\"\n ]\n },\n {\n \"unified\": \"1F328-FE0F\",\n \"shortnames\": [\n \"snow_cloud\"\n ]\n },\n {\n \"unified\": \"1F329-FE0F\",\n \"shortnames\": [\n \"lightning\"\n ]\n },\n {\n \"unified\": \"1F32A-FE0F\",\n \"shortnames\": [\n \"tornado\"\n ]\n },\n {\n \"unified\": \"1F32B-FE0F\",\n \"shortnames\": [\n \"fog\"\n ]\n },\n {\n \"unified\": \"1F32C-FE0F\",\n \"shortnames\": [\n \"wind_blowing_face\"\n ]\n },\n {\n \"unified\": \"1F300\",\n \"shortnames\": [\n \"cyclone\"\n ]\n },\n {\n \"unified\": \"1F308\",\n \"shortnames\": [\n \"rainbow\"\n ]\n },\n {\n \"unified\": \"1F302\",\n \"shortnames\": [\n \"closed_umbrella\"\n ]\n },\n {\n \"unified\": \"2602-FE0F\",\n \"shortnames\": [\n \"umbrella\"\n ]\n },\n {\n \"unified\": \"2614\",\n \"shortnames\": [\n \"umbrella_with_rain_drops\"\n ]\n },\n {\n \"unified\": \"26F1-FE0F\",\n \"shortnames\": [\n \"umbrella_on_ground\"\n ]\n },\n {\n \"unified\": \"26A1\",\n \"shortnames\": [\n \"zap\"\n ]\n },\n {\n \"unified\": \"2744-FE0F\",\n \"shortnames\": [\n \"snowflake\"\n ]\n },\n {\n \"unified\": \"2603-FE0F\",\n \"shortnames\": [\n \"snowman\"\n ]\n },\n {\n \"unified\": \"26C4\",\n \"shortnames\": [\n \"snowman_without_snow\"\n ]\n },\n {\n \"unified\": \"2604-FE0F\",\n \"shortnames\": [\n \"comet\"\n ]\n },\n {\n \"unified\": \"1F525\",\n \"shortnames\": [\n \"fire\"\n ]\n },\n {\n \"unified\": \"1F4A7\",\n \"shortnames\": [\n \"droplet\"\n ]\n },\n {\n \"unified\": \"1F30A\",\n \"shortnames\": [\n \"ocean\"\n ]\n }\n ]\n },\n {\n \"name\": \"Activities\",\n \"emojis\": [\n {\n \"unified\": \"1F383\",\n \"shortnames\": [\n \"jack_o_lantern\"\n ]\n },\n {\n \"unified\": \"1F384\",\n \"shortnames\": [\n \"christmas_tree\"\n ]\n },\n {\n \"unified\": \"1F386\",\n \"shortnames\": [\n \"fireworks\"\n ]\n },\n {\n \"unified\": \"1F387\",\n \"shortnames\": [\n \"sparkler\"\n ]\n },\n {\n \"unified\": \"2728\",\n \"shortnames\": [\n \"sparkles\"\n ]\n },\n {\n \"unified\": \"1F388\",\n \"shortnames\": [\n \"balloon\"\n ]\n },\n {\n \"unified\": \"1F389\",\n \"shortnames\": [\n \"tada\"\n ]\n },\n {\n \"unified\": \"1F38A\",\n \"shortnames\": [\n \"confetti_ball\"\n ]\n },\n {\n \"unified\": \"1F38B\",\n \"shortnames\": [\n \"tanabata_tree\"\n ]\n },\n {\n \"unified\": \"1F38D\",\n \"shortnames\": [\n \"bamboo\"\n ]\n },\n {\n \"unified\": \"1F38E\",\n \"shortnames\": [\n \"dolls\"\n ]\n },\n {\n \"unified\": \"1F38F\",\n \"shortnames\": [\n \"flags\"\n ]\n },\n {\n \"unified\": \"1F390\",\n \"shortnames\": [\n \"wind_chime\"\n ]\n },\n {\n \"unified\": \"1F391\",\n \"shortnames\": [\n \"rice_scene\"\n ]\n },\n {\n \"unified\": \"1F380\",\n \"shortnames\": [\n \"ribbon\"\n ]\n },\n {\n \"unified\": \"1F381\",\n \"shortnames\": [\n \"gift\"\n ]\n },\n {\n \"unified\": \"1F397-FE0F\",\n \"shortnames\": [\n \"reminder_ribbon\"\n ]\n },\n {\n \"unified\": \"1F39F-FE0F\",\n \"shortnames\": [\n \"admission_tickets\"\n ]\n },\n {\n \"unified\": \"1F3AB\",\n \"shortnames\": [\n \"ticket\"\n ]\n },\n {\n \"unified\": \"1F396-FE0F\",\n \"shortnames\": [\n \"medal\"\n ]\n },\n {\n \"unified\": \"1F3C6\",\n \"shortnames\": [\n \"trophy\"\n ]\n },\n {\n \"unified\": \"1F3C5\",\n \"shortnames\": [\n \"sports_medal\"\n ]\n },\n {\n \"unified\": \"1F947\",\n \"shortnames\": [\n \"first_place_medal\"\n ]\n },\n {\n \"unified\": \"1F948\",\n \"shortnames\": [\n \"second_place_medal\"\n ]\n },\n {\n \"unified\": \"1F949\",\n \"shortnames\": [\n \"third_place_medal\"\n ]\n },\n {\n \"unified\": \"26BD\",\n \"shortnames\": [\n \"soccer\"\n ]\n },\n {\n \"unified\": \"26BE\",\n \"shortnames\": [\n \"baseball\"\n ]\n },\n {\n \"unified\": \"1F3C0\",\n \"shortnames\": [\n \"basketball\"\n ]\n },\n {\n \"unified\": \"1F3D0\",\n \"shortnames\": [\n \"volleyball\"\n ]\n },\n {\n \"unified\": \"1F3C8\",\n \"shortnames\": [\n \"football\"\n ]\n },\n {\n \"unified\": \"1F3C9\",\n \"shortnames\": [\n \"rugby_football\"\n ]\n },\n {\n \"unified\": \"1F3BE\",\n \"shortnames\": [\n \"tennis\"\n ]\n },\n {\n \"unified\": \"1F3B1\",\n \"shortnames\": [\n \"8ball\"\n ]\n },\n {\n \"unified\": \"1F3B3\",\n \"shortnames\": [\n \"bowling\"\n ]\n },\n {\n \"unified\": \"1F3CF\",\n \"shortnames\": [\n \"cricket_bat_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3D1\",\n \"shortnames\": [\n \"field_hockey_stick_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3D2\",\n \"shortnames\": [\n \"ice_hockey_stick_and_puck\"\n ]\n },\n {\n \"unified\": \"1F3D3\",\n \"shortnames\": [\n \"table_tennis_paddle_and_ball\"\n ]\n },\n {\n \"unified\": \"1F3F8\",\n \"shortnames\": [\n \"badminton_racquet_and_shuttlecock\"\n ]\n },\n {\n \"unified\": \"1F94A\",\n \"shortnames\": [\n \"boxing_glove\"\n ]\n },\n {\n \"unified\": \"1F94B\",\n \"shortnames\": [\n \"martial_arts_uniform\"\n ]\n },\n {\n \"unified\": \"1F945\",\n \"shortnames\": [\n \"goal_net\"\n ]\n },\n {\n \"unified\": \"1F3AF\",\n \"shortnames\": [\n \"dart\"\n ]\n },\n {\n \"unified\": \"26F3\",\n \"shortnames\": [\n \"golf\"\n ]\n },\n {\n \"unified\": \"26F8-FE0F\",\n \"shortnames\": [\n \"ice_skate\"\n ]\n },\n {\n \"unified\": \"1F3A3\",\n \"shortnames\": [\n \"fishing_pole_and_fish\"\n ]\n },\n {\n \"unified\": \"1F3BD\",\n \"shortnames\": [\n \"running_shirt_with_sash\"\n ]\n },\n {\n \"unified\": \"1F3BF\",\n \"shortnames\": [\n \"ski\"\n ]\n },\n {\n \"unified\": \"1F6F7\",\n \"shortnames\": [\n \"sled\"\n ]\n },\n {\n \"unified\": \"1F94C\",\n \"shortnames\": [\n \"curling_stone\"\n ]\n },\n {\n \"unified\": \"1F3AE\",\n \"shortnames\": [\n \"video_game\"\n ]\n },\n {\n \"unified\": \"1F579-FE0F\",\n \"shortnames\": [\n \"joystick\"\n ]\n },\n {\n \"unified\": \"1F3B2\",\n \"shortnames\": [\n \"game_die\"\n ]\n },\n {\n \"unified\": \"2660-FE0F\",\n \"shortnames\": [\n \"spades\"\n ]\n },\n {\n \"unified\": \"2665-FE0F\",\n \"shortnames\": [\n \"hearts\"\n ]\n },\n {\n \"unified\": \"2666-FE0F\",\n \"shortnames\": [\n \"diamonds\"\n ]\n },\n {\n \"unified\": \"2663-FE0F\",\n \"shortnames\": [\n \"clubs\"\n ]\n },\n {\n \"unified\": \"1F0CF\",\n \"shortnames\": [\n \"black_joker\"\n ]\n },\n {\n \"unified\": \"1F004\",\n \"shortnames\": [\n \"mahjong\"\n ]\n },\n {\n \"unified\": \"1F3B4\",\n \"shortnames\": [\n \"flower_playing_cards\"\n ]\n }\n ]\n },\n {\n \"name\": \"Objects\",\n \"emojis\": [\n {\n \"unified\": \"1F507\",\n \"shortnames\": [\n \"mute\"\n ]\n },\n {\n \"unified\": \"1F508\",\n \"shortnames\": [\n \"speaker\"\n ]\n },\n {\n \"unified\": \"1F509\",\n \"shortnames\": [\n \"sound\"\n ]\n },\n {\n \"unified\": \"1F50A\",\n \"shortnames\": [\n \"loud_sound\"\n ]\n },\n {\n \"unified\": \"1F4E2\",\n \"shortnames\": [\n \"loudspeaker\"\n ]\n },\n {\n \"unified\": \"1F4E3\",\n \"shortnames\": [\n \"mega\"\n ]\n },\n {\n \"unified\": \"1F4EF\",\n \"shortnames\": [\n \"postal_horn\"\n ]\n },\n {\n \"unified\": \"1F514\",\n \"shortnames\": [\n \"bell\"\n ]\n },\n {\n \"unified\": \"1F515\",\n \"shortnames\": [\n \"no_bell\"\n ]\n },\n {\n \"unified\": \"1F3BC\",\n \"shortnames\": [\n \"musical_score\"\n ]\n },\n {\n \"unified\": \"1F3B5\",\n \"shortnames\": [\n \"musical_note\"\n ]\n },\n {\n \"unified\": \"1F3B6\",\n \"shortnames\": [\n \"notes\"\n ]\n },\n {\n \"unified\": \"1F399-FE0F\",\n \"shortnames\": [\n \"studio_microphone\"\n ]\n },\n {\n \"unified\": \"1F39A-FE0F\",\n \"shortnames\": [\n \"level_slider\"\n ]\n },\n {\n \"unified\": \"1F39B-FE0F\",\n \"shortnames\": [\n \"control_knobs\"\n ]\n },\n {\n \"unified\": \"1F3A4\",\n \"shortnames\": [\n \"microphone\"\n ]\n },\n {\n \"unified\": \"1F3A7\",\n \"shortnames\": [\n \"headphones\"\n ]\n },\n {\n \"unified\": \"1F4FB\",\n \"shortnames\": [\n \"radio\"\n ]\n },\n {\n \"unified\": \"1F3B7\",\n \"shortnames\": [\n \"saxophone\"\n ]\n },\n {\n \"unified\": \"1F3B8\",\n \"shortnames\": [\n \"guitar\"\n ]\n },\n {\n \"unified\": \"1F3B9\",\n \"shortnames\": [\n \"musical_keyboard\"\n ]\n },\n {\n \"unified\": \"1F3BA\",\n \"shortnames\": [\n \"trumpet\"\n ]\n },\n {\n \"unified\": \"1F3BB\",\n \"shortnames\": [\n \"violin\"\n ]\n },\n {\n \"unified\": \"1F941\",\n \"shortnames\": [\n \"drum_with_drumsticks\"\n ]\n },\n {\n \"unified\": \"1F4F1\",\n \"shortnames\": [\n \"iphone\"\n ]\n },\n {\n \"unified\": \"1F4F2\",\n \"shortnames\": [\n \"calling\"\n ]\n },\n {\n \"unified\": \"260E-FE0F\",\n \"shortnames\": [\n \"phone\"\n ]\n },\n {\n \"unified\": \"1F4DE\",\n \"shortnames\": [\n \"telephone_receiver\"\n ]\n },\n {\n \"unified\": \"1F4DF\",\n \"shortnames\": [\n \"pager\"\n ]\n },\n {\n \"unified\": \"1F4E0\",\n \"shortnames\": [\n \"fax\"\n ]\n },\n {\n \"unified\": \"1F50B\",\n \"shortnames\": [\n \"battery\"\n ]\n },\n {\n \"unified\": \"1F50C\",\n \"shortnames\": [\n \"electric_plug\"\n ]\n },\n {\n \"unified\": \"1F4BB\",\n \"shortnames\": [\n \"computer\"\n ]\n },\n {\n \"unified\": \"1F5A5-FE0F\",\n \"shortnames\": [\n \"desktop_computer\"\n ]\n },\n {\n \"unified\": \"1F5A8-FE0F\",\n \"shortnames\": [\n \"printer\"\n ]\n },\n {\n \"unified\": \"2328-FE0F\",\n \"shortnames\": [\n \"keyboard\"\n ]\n },\n {\n \"unified\": \"1F5B1-FE0F\",\n \"shortnames\": [\n \"three_button_mouse\"\n ]\n },\n {\n \"unified\": \"1F5B2-FE0F\",\n \"shortnames\": [\n \"trackball\"\n ]\n },\n {\n \"unified\": \"1F4BD\",\n \"shortnames\": [\n \"minidisc\"\n ]\n },\n {\n \"unified\": \"1F4BE\",\n \"shortnames\": [\n \"floppy_disk\"\n ]\n },\n {\n \"unified\": \"1F4BF\",\n \"shortnames\": [\n \"cd\"\n ]\n },\n {\n \"unified\": \"1F4C0\",\n \"shortnames\": [\n \"dvd\"\n ]\n },\n {\n \"unified\": \"1F3A5\",\n \"shortnames\": [\n \"movie_camera\"\n ]\n },\n {\n \"unified\": \"1F39E-FE0F\",\n \"shortnames\": [\n \"film_frames\"\n ]\n },\n {\n \"unified\": \"1F4FD-FE0F\",\n \"shortnames\": [\n \"film_projector\"\n ]\n },\n {\n \"unified\": \"1F3AC\",\n \"shortnames\": [\n \"clapper\"\n ]\n },\n {\n \"unified\": \"1F4FA\",\n \"shortnames\": [\n \"tv\"\n ]\n },\n {\n \"unified\": \"1F4F7\",\n \"shortnames\": [\n \"camera\"\n ]\n },\n {\n \"unified\": \"1F4F8\",\n \"shortnames\": [\n \"camera_with_flash\"\n ]\n },\n {\n \"unified\": \"1F4F9\",\n \"shortnames\": [\n \"video_camera\"\n ]\n },\n {\n \"unified\": \"1F4FC\",\n \"shortnames\": [\n \"vhs\"\n ]\n },\n {\n \"unified\": \"1F50D\",\n \"shortnames\": [\n \"mag\"\n ]\n },\n {\n \"unified\": \"1F50E\",\n \"shortnames\": [\n \"mag_right\"\n ]\n },\n {\n \"unified\": \"1F52C\",\n \"shortnames\": [\n \"microscope\"\n ]\n },\n {\n \"unified\": \"1F52D\",\n \"shortnames\": [\n \"telescope\"\n ]\n },\n {\n \"unified\": \"1F4E1\",\n \"shortnames\": [\n \"satellite_antenna\"\n ]\n },\n {\n \"unified\": \"1F56F-FE0F\",\n \"shortnames\": [\n \"candle\"\n ]\n },\n {\n \"unified\": \"1F4A1\",\n \"shortnames\": [\n \"bulb\"\n ]\n },\n {\n \"unified\": \"1F526\",\n \"shortnames\": [\n \"flashlight\"\n ]\n },\n {\n \"unified\": \"1F3EE\",\n \"shortnames\": [\n \"izakaya_lantern\"\n ]\n },\n {\n \"unified\": \"1F4D4\",\n \"shortnames\": [\n \"notebook_with_decorative_cover\"\n ]\n },\n {\n \"unified\": \"1F4D5\",\n \"shortnames\": [\n \"closed_book\"\n ]\n },\n {\n \"unified\": \"1F4D6\",\n \"shortnames\": [\n \"book\"\n ]\n },\n {\n \"unified\": \"1F4D7\",\n \"shortnames\": [\n \"green_book\"\n ]\n },\n {\n \"unified\": \"1F4D8\",\n \"shortnames\": [\n \"blue_book\"\n ]\n },\n {\n \"unified\": \"1F4D9\",\n \"shortnames\": [\n \"orange_book\"\n ]\n },\n {\n \"unified\": \"1F4DA\",\n \"shortnames\": [\n \"books\"\n ]\n },\n {\n \"unified\": \"1F4D3\",\n \"shortnames\": [\n \"notebook\"\n ]\n },\n {\n \"unified\": \"1F4D2\",\n \"shortnames\": [\n \"ledger\"\n ]\n },\n {\n \"unified\": \"1F4C3\",\n \"shortnames\": [\n \"page_with_curl\"\n ]\n },\n {\n \"unified\": \"1F4DC\",\n \"shortnames\": [\n \"scroll\"\n ]\n },\n {\n \"unified\": \"1F4C4\",\n \"shortnames\": [\n \"page_facing_up\"\n ]\n },\n {\n \"unified\": \"1F4F0\",\n \"shortnames\": [\n \"newspaper\"\n ]\n },\n {\n \"unified\": \"1F5DE-FE0F\",\n \"shortnames\": [\n \"rolled_up_newspaper\"\n ]\n },\n {\n \"unified\": \"1F4D1\",\n \"shortnames\": [\n \"bookmark_tabs\"\n ]\n },\n {\n \"unified\": \"1F516\",\n \"shortnames\": [\n \"bookmark\"\n ]\n },\n {\n \"unified\": \"1F3F7-FE0F\",\n \"shortnames\": [\n \"label\"\n ]\n },\n {\n \"unified\": \"1F4B0\",\n \"shortnames\": [\n \"moneybag\"\n ]\n },\n {\n \"unified\": \"1F4B4\",\n \"shortnames\": [\n \"yen\"\n ]\n },\n {\n \"unified\": \"1F4B5\",\n \"shortnames\": [\n \"dollar\"\n ]\n },\n {\n \"unified\": \"1F4B6\",\n \"shortnames\": [\n \"euro\"\n ]\n },\n {\n \"unified\": \"1F4B7\",\n \"shortnames\": [\n \"pound\"\n ]\n },\n {\n \"unified\": \"1F4B8\",\n \"shortnames\": [\n \"money_with_wings\"\n ]\n },\n {\n \"unified\": \"1F4B3\",\n \"shortnames\": [\n \"credit_card\"\n ]\n },\n {\n \"unified\": \"1F4B9\",\n \"shortnames\": [\n \"chart\"\n ]\n },\n {\n \"unified\": \"1F4B1\",\n \"shortnames\": [\n \"currency_exchange\"\n ]\n },\n {\n \"unified\": \"1F4B2\",\n \"shortnames\": [\n \"heavy_dollar_sign\"\n ]\n },\n {\n \"unified\": \"2709-FE0F\",\n \"shortnames\": [\n \"email\"\n ]\n },\n {\n \"unified\": \"1F4E7\",\n \"shortnames\": [\n \"e-mail\"\n ]\n },\n {\n \"unified\": \"1F4E8\",\n \"shortnames\": [\n \"incoming_envelope\"\n ]\n },\n {\n \"unified\": \"1F4E9\",\n \"shortnames\": [\n \"envelope_with_arrow\"\n ]\n },\n {\n \"unified\": \"1F4E4\",\n \"shortnames\": [\n \"outbox_tray\"\n ]\n },\n {\n \"unified\": \"1F4E5\",\n \"shortnames\": [\n \"inbox_tray\"\n ]\n },\n {\n \"unified\": \"1F4E6\",\n \"shortnames\": [\n \"package\"\n ]\n },\n {\n \"unified\": \"1F4EB\",\n \"shortnames\": [\n \"mailbox\"\n ]\n },\n {\n \"unified\": \"1F4EA\",\n \"shortnames\": [\n \"mailbox_closed\"\n ]\n },\n {\n \"unified\": \"1F4EC\",\n \"shortnames\": [\n \"mailbox_with_mail\"\n ]\n },\n {\n \"unified\": \"1F4ED\",\n \"shortnames\": [\n \"mailbox_with_no_mail\"\n ]\n },\n {\n \"unified\": \"1F4EE\",\n \"shortnames\": [\n \"postbox\"\n ]\n },\n {\n \"unified\": \"1F5F3-FE0F\",\n \"shortnames\": [\n \"ballot_box_with_ballot\"\n ]\n },\n {\n \"unified\": \"270F-FE0F\",\n \"shortnames\": [\n \"pencil2\"\n ]\n },\n {\n \"unified\": \"2712-FE0F\",\n \"shortnames\": [\n \"black_nib\"\n ]\n },\n {\n \"unified\": \"1F58B-FE0F\",\n \"shortnames\": [\n \"lower_left_fountain_pen\"\n ]\n },\n {\n \"unified\": \"1F58A-FE0F\",\n \"shortnames\": [\n \"lower_left_ballpoint_pen\"\n ]\n },\n {\n \"unified\": \"1F58C-FE0F\",\n \"shortnames\": [\n \"lower_left_paintbrush\"\n ]\n },\n {\n \"unified\": \"1F58D-FE0F\",\n \"shortnames\": [\n \"lower_left_crayon\"\n ]\n },\n {\n \"unified\": \"1F4DD\",\n \"shortnames\": [\n \"memo\"\n ]\n },\n {\n \"unified\": \"1F4BC\",\n \"shortnames\": [\n \"briefcase\"\n ]\n },\n {\n \"unified\": \"1F4C1\",\n \"shortnames\": [\n \"file_folder\"\n ]\n },\n {\n \"unified\": \"1F4C2\",\n \"shortnames\": [\n \"open_file_folder\"\n ]\n },\n {\n \"unified\": \"1F5C2-FE0F\",\n \"shortnames\": [\n \"card_index_dividers\"\n ]\n },\n {\n \"unified\": \"1F4C5\",\n \"shortnames\": [\n \"date\"\n ]\n },\n {\n \"unified\": \"1F4C6\",\n \"shortnames\": [\n \"calendar\"\n ]\n },\n {\n \"unified\": \"1F5D2-FE0F\",\n \"shortnames\": [\n \"spiral_note_pad\"\n ]\n },\n {\n \"unified\": \"1F5D3-FE0F\",\n \"shortnames\": [\n \"spiral_calendar_pad\"\n ]\n },\n {\n \"unified\": \"1F4C7\",\n \"shortnames\": [\n \"card_index\"\n ]\n },\n {\n \"unified\": \"1F4C8\",\n \"shortnames\": [\n \"chart_with_upwards_trend\"\n ]\n },\n {\n \"unified\": \"1F4C9\",\n \"shortnames\": [\n \"chart_with_downwards_trend\"\n ]\n },\n {\n \"unified\": \"1F4CA\",\n \"shortnames\": [\n \"bar_chart\"\n ]\n },\n {\n \"unified\": \"1F4CB\",\n \"shortnames\": [\n \"clipboard\"\n ]\n },\n {\n \"unified\": \"1F4CC\",\n \"shortnames\": [\n \"pushpin\"\n ]\n },\n {\n \"unified\": \"1F4CD\",\n \"shortnames\": [\n \"round_pushpin\"\n ]\n },\n {\n \"unified\": \"1F4CE\",\n \"shortnames\": [\n \"paperclip\"\n ]\n },\n {\n \"unified\": \"1F587-FE0F\",\n \"shortnames\": [\n \"linked_paperclips\"\n ]\n },\n {\n \"unified\": \"1F4CF\",\n \"shortnames\": [\n \"straight_ruler\"\n ]\n },\n {\n \"unified\": \"1F4D0\",\n \"shortnames\": [\n \"triangular_ruler\"\n ]\n },\n {\n \"unified\": \"2702-FE0F\",\n \"shortnames\": [\n \"scissors\"\n ]\n },\n {\n \"unified\": \"1F5C3-FE0F\",\n \"shortnames\": [\n \"card_file_box\"\n ]\n },\n {\n \"unified\": \"1F5C4-FE0F\",\n \"shortnames\": [\n \"file_cabinet\"\n ]\n },\n {\n \"unified\": \"1F5D1-FE0F\",\n \"shortnames\": [\n \"wastebasket\"\n ]\n },\n {\n \"unified\": \"1F512\",\n \"shortnames\": [\n \"lock\"\n ]\n },\n {\n \"unified\": \"1F513\",\n \"shortnames\": [\n \"unlock\"\n ]\n },\n {\n \"unified\": \"1F50F\",\n \"shortnames\": [\n \"lock_with_ink_pen\"\n ]\n },\n {\n \"unified\": \"1F510\",\n \"shortnames\": [\n \"closed_lock_with_key\"\n ]\n },\n {\n \"unified\": \"1F511\",\n \"shortnames\": [\n \"key\"\n ]\n },\n {\n \"unified\": \"1F5DD-FE0F\",\n \"shortnames\": [\n \"old_key\"\n ]\n },\n {\n \"unified\": \"1F528\",\n \"shortnames\": [\n \"hammer\"\n ]\n },\n {\n \"unified\": \"26CF-FE0F\",\n \"shortnames\": [\n \"pick\"\n ]\n },\n {\n \"unified\": \"2692-FE0F\",\n \"shortnames\": [\n \"hammer_and_pick\"\n ]\n },\n {\n \"unified\": \"1F6E0-FE0F\",\n \"shortnames\": [\n \"hammer_and_wrench\"\n ]\n },\n {\n \"unified\": \"1F5E1-FE0F\",\n \"shortnames\": [\n \"dagger_knife\"\n ]\n },\n {\n \"unified\": \"2694-FE0F\",\n \"shortnames\": [\n \"crossed_swords\"\n ]\n },\n {\n \"unified\": \"1F52B\",\n \"shortnames\": [\n \"gun\"\n ]\n },\n {\n \"unified\": \"1F3F9\",\n \"shortnames\": [\n \"bow_and_arrow\"\n ]\n },\n {\n \"unified\": \"1F6E1-FE0F\",\n \"shortnames\": [\n \"shield\"\n ]\n },\n {\n \"unified\": \"1F527\",\n \"shortnames\": [\n \"wrench\"\n ]\n },\n {\n \"unified\": \"1F529\",\n \"shortnames\": [\n \"nut_and_bolt\"\n ]\n },\n {\n \"unified\": \"2699-FE0F\",\n \"shortnames\": [\n \"gear\"\n ]\n },\n {\n \"unified\": \"1F5DC-FE0F\",\n \"shortnames\": [\n \"compression\"\n ]\n },\n {\n \"unified\": \"2697-FE0F\",\n \"shortnames\": [\n \"alembic\"\n ]\n },\n {\n \"unified\": \"2696-FE0F\",\n \"shortnames\": [\n \"scales\"\n ]\n },\n {\n \"unified\": \"1F517\",\n \"shortnames\": [\n \"link\"\n ]\n },\n {\n \"unified\": \"26D3-FE0F\",\n \"shortnames\": [\n \"chains\"\n ]\n },\n {\n \"unified\": \"1F489\",\n \"shortnames\": [\n \"syringe\"\n ]\n },\n {\n \"unified\": \"1F48A\",\n \"shortnames\": [\n \"pill\"\n ]\n },\n {\n \"unified\": \"1F6AC\",\n \"shortnames\": [\n \"smoking\"\n ]\n },\n {\n \"unified\": \"26B0-FE0F\",\n \"shortnames\": [\n \"coffin\"\n ]\n },\n {\n \"unified\": \"26B1-FE0F\",\n \"shortnames\": [\n \"funeral_urn\"\n ]\n },\n {\n \"unified\": \"1F5FF\",\n \"shortnames\": [\n \"moyai\"\n ]\n },\n {\n \"unified\": \"1F6E2-FE0F\",\n \"shortnames\": [\n \"oil_drum\"\n ]\n },\n {\n \"unified\": \"1F52E\",\n \"shortnames\": [\n \"crystal_ball\"\n ]\n },\n {\n \"unified\": \"1F6D2\",\n \"shortnames\": [\n \"shopping_trolley\"\n ]\n }\n ]\n },\n {\n \"name\": \"Symbols\",\n \"emojis\": [\n {\n \"unified\": \"1F3E7\",\n \"shortnames\": [\n \"atm\"\n ]\n },\n {\n \"unified\": \"1F6AE\",\n \"shortnames\": [\n \"put_litter_in_its_place\"\n ]\n },\n {\n \"unified\": \"1F6B0\",\n \"shortnames\": [\n \"potable_water\"\n ]\n },\n {\n \"unified\": \"267F\",\n \"shortnames\": [\n \"wheelchair\"\n ]\n },\n {\n \"unified\": \"1F6B9\",\n \"shortnames\": [\n \"mens\"\n ]\n },\n {\n \"unified\": \"1F6BA\",\n \"shortnames\": [\n \"womens\"\n ]\n },\n {\n \"unified\": \"1F6BB\",\n \"shortnames\": [\n \"restroom\"\n ]\n },\n {\n \"unified\": \"1F6BC\",\n \"shortnames\": [\n \"baby_symbol\"\n ]\n },\n {\n \"unified\": \"1F6BE\",\n \"shortnames\": [\n \"wc\"\n ]\n },\n {\n \"unified\": \"1F6C2\",\n \"shortnames\": [\n \"passport_control\"\n ]\n },\n {\n \"unified\": \"1F6C3\",\n \"shortnames\": [\n \"customs\"\n ]\n },\n {\n \"unified\": \"1F6C4\",\n \"shortnames\": [\n \"baggage_claim\"\n ]\n },\n {\n \"unified\": \"1F6C5\",\n \"shortnames\": [\n \"left_luggage\"\n ]\n },\n {\n \"unified\": \"26A0-FE0F\",\n \"shortnames\": [\n \"warning\"\n ]\n },\n {\n \"unified\": \"1F6B8\",\n \"shortnames\": [\n \"children_crossing\"\n ]\n },\n {\n \"unified\": \"26D4\",\n \"shortnames\": [\n \"no_entry\"\n ]\n },\n {\n \"unified\": \"1F6AB\",\n \"shortnames\": [\n \"no_entry_sign\"\n ]\n },\n {\n \"unified\": \"1F6B3\",\n \"shortnames\": [\n \"no_bicycles\"\n ]\n },\n {\n \"unified\": \"1F6AD\",\n \"shortnames\": [\n \"no_smoking\"\n ]\n },\n {\n \"unified\": \"1F6AF\",\n \"shortnames\": [\n \"do_not_litter\"\n ]\n },\n {\n \"unified\": \"1F6B1\",\n \"shortnames\": [\n \"non-potable_water\"\n ]\n },\n {\n \"unified\": \"1F6B7\",\n \"shortnames\": [\n \"no_pedestrians\"\n ]\n },\n {\n \"unified\": \"1F4F5\",\n \"shortnames\": [\n \"no_mobile_phones\"\n ]\n },\n {\n \"unified\": \"1F51E\",\n \"shortnames\": [\n \"underage\"\n ]\n },\n {\n \"unified\": \"2622-FE0F\",\n \"shortnames\": [\n \"radioactive_sign\"\n ]\n },\n {\n \"unified\": \"2623-FE0F\",\n \"shortnames\": [\n \"biohazard_sign\"\n ]\n },\n {\n \"unified\": \"2B06-FE0F\",\n \"shortnames\": [\n \"arrow_up\"\n ]\n },\n {\n \"unified\": \"2197-FE0F\",\n \"shortnames\": [\n \"arrow_upper_right\"\n ]\n },\n {\n \"unified\": \"27A1-FE0F\",\n \"shortnames\": [\n \"arrow_right\"\n ]\n },\n {\n \"unified\": \"2198-FE0F\",\n \"shortnames\": [\n \"arrow_lower_right\"\n ]\n },\n {\n \"unified\": \"2B07-FE0F\",\n \"shortnames\": [\n \"arrow_down\"\n ]\n },\n {\n \"unified\": \"2199-FE0F\",\n \"shortnames\": [\n \"arrow_lower_left\"\n ]\n },\n {\n \"unified\": \"2B05-FE0F\",\n \"shortnames\": [\n \"arrow_left\"\n ]\n },\n {\n \"unified\": \"2196-FE0F\",\n \"shortnames\": [\n \"arrow_upper_left\"\n ]\n },\n {\n \"unified\": \"2195-FE0F\",\n \"shortnames\": [\n \"arrow_up_down\"\n ]\n },\n {\n \"unified\": \"2194-FE0F\",\n \"shortnames\": [\n \"left_right_arrow\"\n ]\n },\n {\n \"unified\": \"21A9-FE0F\",\n \"shortnames\": [\n \"leftwards_arrow_with_hook\"\n ]\n },\n {\n \"unified\": \"21AA-FE0F\",\n \"shortnames\": [\n \"arrow_right_hook\"\n ]\n },\n {\n \"unified\": \"2934-FE0F\",\n \"shortnames\": [\n \"arrow_heading_up\"\n ]\n },\n {\n \"unified\": \"2935-FE0F\",\n \"shortnames\": [\n \"arrow_heading_down\"\n ]\n },\n {\n \"unified\": \"1F503\",\n \"shortnames\": [\n \"arrows_clockwise\"\n ]\n },\n {\n \"unified\": \"1F504\",\n \"shortnames\": [\n \"arrows_counterclockwise\"\n ]\n },\n {\n \"unified\": \"1F519\",\n \"shortnames\": [\n \"back\"\n ]\n },\n {\n \"unified\": \"1F51A\",\n \"shortnames\": [\n \"end\"\n ]\n },\n {\n \"unified\": \"1F51B\",\n \"shortnames\": [\n \"on\"\n ]\n },\n {\n \"unified\": \"1F51C\",\n \"shortnames\": [\n \"soon\"\n ]\n },\n {\n \"unified\": \"1F51D\",\n \"shortnames\": [\n \"top\"\n ]\n },\n {\n \"unified\": \"1F6D0\",\n \"shortnames\": [\n \"place_of_worship\"\n ]\n },\n {\n \"unified\": \"269B-FE0F\",\n \"shortnames\": [\n \"atom_symbol\"\n ]\n },\n {\n \"unified\": \"1F549-FE0F\",\n \"shortnames\": [\n \"om_symbol\"\n ]\n },\n {\n \"unified\": \"2721-FE0F\",\n \"shortnames\": [\n \"star_of_david\"\n ]\n },\n {\n \"unified\": \"2638-FE0F\",\n \"shortnames\": [\n \"wheel_of_dharma\"\n ]\n },\n {\n \"unified\": \"262F-FE0F\",\n \"shortnames\": [\n \"yin_yang\"\n ]\n },\n {\n \"unified\": \"271D-FE0F\",\n \"shortnames\": [\n \"latin_cross\"\n ]\n },\n {\n \"unified\": \"2626-FE0F\",\n \"shortnames\": [\n \"orthodox_cross\"\n ]\n },\n {\n \"unified\": \"262A-FE0F\",\n \"shortnames\": [\n \"star_and_crescent\"\n ]\n },\n {\n \"unified\": \"262E-FE0F\",\n \"shortnames\": [\n \"peace_symbol\"\n ]\n },\n {\n \"unified\": \"1F54E\",\n \"shortnames\": [\n \"menorah_with_nine_branches\"\n ]\n },\n {\n \"unified\": \"1F52F\",\n \"shortnames\": [\n \"six_pointed_star\"\n ]\n },\n {\n \"unified\": \"2648\",\n \"shortnames\": [\n \"aries\"\n ]\n },\n {\n \"unified\": \"2649\",\n \"shortnames\": [\n \"taurus\"\n ]\n },\n {\n \"unified\": \"264A\",\n \"shortnames\": [\n \"gemini\"\n ]\n },\n {\n \"unified\": \"264B\",\n \"shortnames\": [\n \"cancer\"\n ]\n },\n {\n \"unified\": \"264C\",\n \"shortnames\": [\n \"leo\"\n ]\n },\n {\n \"unified\": \"264D\",\n \"shortnames\": [\n \"virgo\"\n ]\n },\n {\n \"unified\": \"264E\",\n \"shortnames\": [\n \"libra\"\n ]\n },\n {\n \"unified\": \"264F\",\n \"shortnames\": [\n \"scorpius\"\n ]\n },\n {\n \"unified\": \"2650\",\n \"shortnames\": [\n \"sagittarius\"\n ]\n },\n {\n \"unified\": \"2651\",\n \"shortnames\": [\n \"capricorn\"\n ]\n },\n {\n \"unified\": \"2652\",\n \"shortnames\": [\n \"aquarius\"\n ]\n },\n {\n \"unified\": \"2653\",\n \"shortnames\": [\n \"pisces\"\n ]\n },\n {\n \"unified\": \"26CE\",\n \"shortnames\": [\n \"ophiuchus\"\n ]\n },\n {\n \"unified\": \"1F500\",\n \"shortnames\": [\n \"twisted_rightwards_arrows\"\n ]\n },\n {\n \"unified\": \"1F501\",\n \"shortnames\": [\n \"repeat\"\n ]\n },\n {\n \"unified\": \"1F502\",\n \"shortnames\": [\n \"repeat_one\"\n ]\n },\n {\n \"unified\": \"25B6-FE0F\",\n \"shortnames\": [\n \"arrow_forward\"\n ]\n },\n {\n \"unified\": \"23E9\",\n \"shortnames\": [\n \"fast_forward\"\n ]\n },\n {\n \"unified\": \"23ED-FE0F\",\n \"shortnames\": [\n \"black_right_pointing_double_triangle_with_vertical_bar\"\n ]\n },\n {\n \"unified\": \"23EF-FE0F\",\n \"shortnames\": [\n \"black_right_pointing_triangle_with_double_vertical_bar\"\n ]\n },\n {\n \"unified\": \"25C0-FE0F\",\n \"shortnames\": [\n \"arrow_backward\"\n ]\n },\n {\n \"unified\": \"23EA\",\n \"shortnames\": [\n \"rewind\"\n ]\n },\n {\n \"unified\": \"23EE-FE0F\",\n \"shortnames\": [\n \"black_left_pointing_double_triangle_with_vertical_bar\"\n ]\n },\n {\n \"unified\": \"1F53C\",\n \"shortnames\": [\n \"arrow_up_small\"\n ]\n },\n {\n \"unified\": \"23EB\",\n \"shortnames\": [\n \"arrow_double_up\"\n ]\n },\n {\n \"unified\": \"1F53D\",\n \"shortnames\": [\n \"arrow_down_small\"\n ]\n },\n {\n \"unified\": \"23EC\",\n \"shortnames\": [\n \"arrow_double_down\"\n ]\n },\n {\n \"unified\": \"23F8-FE0F\",\n \"shortnames\": [\n \"double_vertical_bar\"\n ]\n },\n {\n \"unified\": \"23F9-FE0F\",\n \"shortnames\": [\n \"black_square_for_stop\"\n ]\n },\n {\n \"unified\": \"23FA-FE0F\",\n \"shortnames\": [\n \"black_circle_for_record\"\n ]\n },\n {\n \"unified\": \"23CF-FE0F\",\n \"shortnames\": [\n \"eject\"\n ]\n },\n {\n \"unified\": \"1F3A6\",\n \"shortnames\": [\n \"cinema\"\n ]\n },\n {\n \"unified\": \"1F505\",\n \"shortnames\": [\n \"low_brightness\"\n ]\n },\n {\n \"unified\": \"1F506\",\n \"shortnames\": [\n \"high_brightness\"\n ]\n },\n {\n \"unified\": \"1F4F6\",\n \"shortnames\": [\n \"signal_strength\"\n ]\n },\n {\n \"unified\": \"1F4F3\",\n \"shortnames\": [\n \"vibration_mode\"\n ]\n },\n {\n \"unified\": \"1F4F4\",\n \"shortnames\": [\n \"mobile_phone_off\"\n ]\n },\n {\n \"unified\": \"2640-FE0F\",\n \"shortnames\": [\n \"female_sign\"\n ]\n },\n {\n \"unified\": \"2642-FE0F\",\n \"shortnames\": [\n \"male_sign\"\n ]\n },\n {\n \"unified\": \"2695-FE0F\",\n \"shortnames\": [\n \"medical_symbol\"\n ]\n },\n {\n \"unified\": \"267B-FE0F\",\n \"shortnames\": [\n \"recycle\"\n ]\n },\n {\n \"unified\": \"269C-FE0F\",\n \"shortnames\": [\n \"fleur_de_lis\"\n ]\n },\n {\n \"unified\": \"1F531\",\n \"shortnames\": [\n \"trident\"\n ]\n },\n {\n \"unified\": \"1F4DB\",\n \"shortnames\": [\n \"name_badge\"\n ]\n },\n {\n \"unified\": \"1F530\",\n \"shortnames\": [\n \"beginner\"\n ]\n },\n {\n \"unified\": \"2B55\",\n \"shortnames\": [\n \"o\"\n ]\n },\n {\n \"unified\": \"2705\",\n \"shortnames\": [\n \"white_check_mark\"\n ]\n },\n {\n \"unified\": \"2611-FE0F\",\n \"shortnames\": [\n \"ballot_box_with_check\"\n ]\n },\n {\n \"unified\": \"2714-FE0F\",\n \"shortnames\": [\n \"heavy_check_mark\"\n ]\n },\n {\n \"unified\": \"2716-FE0F\",\n \"shortnames\": [\n \"heavy_multiplication_x\"\n ]\n },\n {\n \"unified\": \"274C\",\n \"shortnames\": [\n \"x\"\n ]\n },\n {\n \"unified\": \"274E\",\n \"shortnames\": [\n \"negative_squared_cross_mark\"\n ]\n },\n {\n \"unified\": \"2795\",\n \"shortnames\": [\n \"heavy_plus_sign\"\n ]\n },\n {\n \"unified\": \"2796\",\n \"shortnames\": [\n \"heavy_minus_sign\"\n ]\n },\n {\n \"unified\": \"2797\",\n \"shortnames\": [\n \"heavy_division_sign\"\n ]\n },\n {\n \"unified\": \"27B0\",\n \"shortnames\": [\n \"curly_loop\"\n ]\n },\n {\n \"unified\": \"27BF\",\n \"shortnames\": [\n \"loop\"\n ]\n },\n {\n \"unified\": \"303D-FE0F\",\n \"shortnames\": [\n \"part_alternation_mark\"\n ]\n },\n {\n \"unified\": \"2733-FE0F\",\n \"shortnames\": [\n \"eight_spoked_asterisk\"\n ]\n },\n {\n \"unified\": \"2734-FE0F\",\n \"shortnames\": [\n \"eight_pointed_black_star\"\n ]\n },\n {\n \"unified\": \"2747-FE0F\",\n \"shortnames\": [\n \"sparkle\"\n ]\n },\n {\n \"unified\": \"203C-FE0F\",\n \"shortnames\": [\n \"bangbang\"\n ]\n },\n {\n \"unified\": \"2049-FE0F\",\n \"shortnames\": [\n \"interrobang\"\n ]\n },\n {\n \"unified\": \"2753\",\n \"shortnames\": [\n \"question\"\n ]\n },\n {\n \"unified\": \"2754\",\n \"shortnames\": [\n \"grey_question\"\n ]\n },\n {\n \"unified\": \"2755\",\n \"shortnames\": [\n \"grey_exclamation\"\n ]\n },\n {\n \"unified\": \"2757\",\n \"shortnames\": [\n \"exclamation\"\n ]\n },\n {\n \"unified\": \"3030-FE0F\",\n \"shortnames\": [\n \"wavy_dash\"\n ]\n },\n {\n \"unified\": \"00A9-FE0F\",\n \"shortnames\": [\n \"copyright\"\n ]\n },\n {\n \"unified\": \"00AE-FE0F\",\n \"shortnames\": [\n \"registered\"\n ]\n },\n {\n \"unified\": \"2122-FE0F\",\n \"shortnames\": [\n \"tm\"\n ]\n },\n {\n \"unified\": \"0023-FE0F-20E3\",\n \"shortnames\": [\n \"hash\"\n ]\n },\n {\n \"unified\": \"002A-FE0F-20E3\",\n \"shortnames\": [\n \"keycap_star\"\n ]\n },\n {\n \"unified\": \"0030-FE0F-20E3\",\n \"shortnames\": [\n \"zero\"\n ]\n },\n {\n \"unified\": \"0031-FE0F-20E3\",\n \"shortnames\": [\n \"one\"\n ]\n },\n {\n \"unified\": \"0032-FE0F-20E3\",\n \"shortnames\": [\n \"two\"\n ]\n },\n {\n \"unified\": \"0033-FE0F-20E3\",\n \"shortnames\": [\n \"three\"\n ]\n },\n {\n \"unified\": \"0034-FE0F-20E3\",\n \"shortnames\": [\n \"four\"\n ]\n },\n {\n \"unified\": \"0035-FE0F-20E3\",\n \"shortnames\": [\n \"five\"\n ]\n },\n {\n \"unified\": \"0036-FE0F-20E3\",\n \"shortnames\": [\n \"six\"\n ]\n },\n {\n \"unified\": \"0037-FE0F-20E3\",\n \"shortnames\": [\n \"seven\"\n ]\n },\n {\n \"unified\": \"0038-FE0F-20E3\",\n \"shortnames\": [\n \"eight\"\n ]\n },\n {\n \"unified\": \"0039-FE0F-20E3\",\n \"shortnames\": [\n \"nine\"\n ]\n },\n {\n \"unified\": \"1F51F\",\n \"shortnames\": [\n \"keycap_ten\"\n ]\n },\n {\n \"unified\": \"1F4AF\",\n \"shortnames\": [\n \"100\"\n ]\n },\n {\n \"unified\": \"1F520\",\n \"shortnames\": [\n \"capital_abcd\"\n ]\n },\n {\n \"unified\": \"1F521\",\n \"shortnames\": [\n \"abcd\"\n ]\n },\n {\n \"unified\": \"1F522\",\n \"shortnames\": [\n \"1234\"\n ]\n },\n {\n \"unified\": \"1F523\",\n \"shortnames\": [\n \"symbols\"\n ]\n },\n {\n \"unified\": \"1F524\",\n \"shortnames\": [\n \"abc\"\n ]\n },\n {\n \"unified\": \"1F170-FE0F\",\n \"shortnames\": [\n \"a\"\n ]\n },\n {\n \"unified\": \"1F18E\",\n \"shortnames\": [\n \"ab\"\n ]\n },\n {\n \"unified\": \"1F171-FE0F\",\n \"shortnames\": [\n \"b\"\n ]\n },\n {\n \"unified\": \"1F191\",\n \"shortnames\": [\n \"cl\"\n ]\n },\n {\n \"unified\": \"1F192\",\n \"shortnames\": [\n \"cool\"\n ]\n },\n {\n \"unified\": \"1F193\",\n \"shortnames\": [\n \"free\"\n ]\n },\n {\n \"unified\": \"2139-FE0F\",\n \"shortnames\": [\n \"information_source\"\n ]\n },\n {\n \"unified\": \"1F194\",\n \"shortnames\": [\n \"id\"\n ]\n },\n {\n \"unified\": \"24C2-FE0F\",\n \"shortnames\": [\n \"m\"\n ]\n },\n {\n \"unified\": \"1F195\",\n \"shortnames\": [\n \"new\"\n ]\n },\n {\n \"unified\": \"1F196\",\n \"shortnames\": [\n \"ng\"\n ]\n },\n {\n \"unified\": \"1F17E-FE0F\",\n \"shortnames\": [\n \"o2\"\n ]\n },\n {\n \"unified\": \"1F197\",\n \"shortnames\": [\n \"ok\"\n ]\n },\n {\n \"unified\": \"1F17F-FE0F\",\n \"shortnames\": [\n \"parking\"\n ]\n },\n {\n \"unified\": \"1F198\",\n \"shortnames\": [\n \"sos\"\n ]\n },\n {\n \"unified\": \"1F199\",\n \"shortnames\": [\n \"up\"\n ]\n },\n {\n \"unified\": \"1F19A\",\n \"shortnames\": [\n \"vs\"\n ]\n },\n {\n \"unified\": \"1F201\",\n \"shortnames\": [\n \"koko\"\n ]\n },\n {\n \"unified\": \"1F202-FE0F\",\n \"shortnames\": [\n \"sa\"\n ]\n },\n {\n \"unified\": \"1F237-FE0F\",\n \"shortnames\": [\n \"u6708\"\n ]\n },\n {\n \"unified\": \"1F236\",\n \"shortnames\": [\n \"u6709\"\n ]\n },\n {\n \"unified\": \"1F22F\",\n \"shortnames\": [\n \"u6307\"\n ]\n },\n {\n \"unified\": \"1F250\",\n \"shortnames\": [\n \"ideograph_advantage\"\n ]\n },\n {\n \"unified\": \"1F239\",\n \"shortnames\": [\n \"u5272\"\n ]\n },\n {\n \"unified\": \"1F21A\",\n \"shortnames\": [\n \"u7121\"\n ]\n },\n {\n \"unified\": \"1F232\",\n \"shortnames\": [\n \"u7981\"\n ]\n },\n {\n \"unified\": \"1F251\",\n \"shortnames\": [\n \"accept\"\n ]\n },\n {\n \"unified\": \"1F238\",\n \"shortnames\": [\n \"u7533\"\n ]\n },\n {\n \"unified\": \"1F234\",\n \"shortnames\": [\n \"u5408\"\n ]\n },\n {\n \"unified\": \"1F233\",\n \"shortnames\": [\n \"u7a7a\"\n ]\n },\n {\n \"unified\": \"3297-FE0F\",\n \"shortnames\": [\n \"congratulations\"\n ]\n },\n {\n \"unified\": \"3299-FE0F\",\n \"shortnames\": [\n \"secret\"\n ]\n },\n {\n \"unified\": \"1F23A\",\n \"shortnames\": [\n \"u55b6\"\n ]\n },\n {\n \"unified\": \"1F235\",\n \"shortnames\": [\n \"u6e80\"\n ]\n },\n {\n \"unified\": \"25AA-FE0F\",\n \"shortnames\": [\n \"black_small_square\"\n ]\n },\n {\n \"unified\": \"25AB-FE0F\",\n \"shortnames\": [\n \"white_small_square\"\n ]\n },\n {\n \"unified\": \"25FB-FE0F\",\n \"shortnames\": [\n \"white_medium_square\"\n ]\n },\n {\n \"unified\": \"25FC-FE0F\",\n \"shortnames\": [\n \"black_medium_square\"\n ]\n },\n {\n \"unified\": \"25FD\",\n \"shortnames\": [\n \"white_medium_small_square\"\n ]\n },\n {\n \"unified\": \"25FE\",\n \"shortnames\": [\n \"black_medium_small_square\"\n ]\n },\n {\n \"unified\": \"2B1B\",\n \"shortnames\": [\n \"black_large_square\"\n ]\n },\n {\n \"unified\": \"2B1C\",\n \"shortnames\": [\n \"white_large_square\"\n ]\n },\n {\n \"unified\": \"1F536\",\n \"shortnames\": [\n \"large_orange_diamond\"\n ]\n },\n {\n \"unified\": \"1F537\",\n \"shortnames\": [\n \"large_blue_diamond\"\n ]\n },\n {\n \"unified\": \"1F538\",\n \"shortnames\": [\n \"small_orange_diamond\"\n ]\n },\n {\n \"unified\": \"1F539\",\n \"shortnames\": [\n \"small_blue_diamond\"\n ]\n },\n {\n \"unified\": \"1F53A\",\n \"shortnames\": [\n \"small_red_triangle\"\n ]\n },\n {\n \"unified\": \"1F53B\",\n \"shortnames\": [\n \"small_red_triangle_down\"\n ]\n },\n {\n \"unified\": \"1F4A0\",\n \"shortnames\": [\n \"diamond_shape_with_a_dot_inside\"\n ]\n },\n {\n \"unified\": \"1F518\",\n \"shortnames\": [\n \"radio_button\"\n ]\n },\n {\n \"unified\": \"1F532\",\n \"shortnames\": [\n \"black_square_button\"\n ]\n },\n {\n \"unified\": \"1F533\",\n \"shortnames\": [\n \"white_square_button\"\n ]\n },\n {\n \"unified\": \"26AA\",\n \"shortnames\": [\n \"white_circle\"\n ]\n },\n {\n \"unified\": \"26AB\",\n \"shortnames\": [\n \"black_circle\"\n ]\n },\n {\n \"unified\": \"1F534\",\n \"shortnames\": [\n \"red_circle\"\n ]\n },\n {\n \"unified\": \"1F535\",\n \"shortnames\": [\n \"large_blue_circle\"\n ]\n }\n ]\n },\n {\n \"name\": \"Flags\",\n \"emojis\": [\n {\n \"unified\": \"1F3C1\",\n \"shortnames\": [\n \"checkered_flag\"\n ]\n },\n {\n \"unified\": \"1F6A9\",\n \"shortnames\": [\n \"triangular_flag_on_post\"\n ]\n },\n {\n \"unified\": \"1F38C\",\n \"shortnames\": [\n \"crossed_flags\"\n ]\n },\n {\n \"unified\": \"1F3F4\",\n \"shortnames\": [\n \"waving_black_flag\"\n ]\n },\n {\n \"unified\": \"1F3F3-FE0F\",\n \"shortnames\": [\n \"waving_white_flag\"\n ]\n },\n {\n \"unified\": \"1F3F3-FE0F-200D-1F308\",\n \"shortnames\": [\n \"rainbow-flag\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1E8\",\n \"shortnames\": [\n \"flag-ac\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1E9\",\n \"shortnames\": [\n \"flag-ad\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EA\",\n \"shortnames\": [\n \"flag-ae\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EB\",\n \"shortnames\": [\n \"flag-af\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EC\",\n \"shortnames\": [\n \"flag-ag\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1EE\",\n \"shortnames\": [\n \"flag-ai\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F1\",\n \"shortnames\": [\n \"flag-al\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F2\",\n \"shortnames\": [\n \"flag-am\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F4\",\n \"shortnames\": [\n \"flag-ao\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F6\",\n \"shortnames\": [\n \"flag-aq\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F7\",\n \"shortnames\": [\n \"flag-ar\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F8\",\n \"shortnames\": [\n \"flag-as\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1F9\",\n \"shortnames\": [\n \"flag-at\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FA\",\n \"shortnames\": [\n \"flag-au\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FC\",\n \"shortnames\": [\n \"flag-aw\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FD\",\n \"shortnames\": [\n \"flag-ax\"\n ]\n },\n {\n \"unified\": \"1F1E6-1F1FF\",\n \"shortnames\": [\n \"flag-az\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E6\",\n \"shortnames\": [\n \"flag-ba\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E7\",\n \"shortnames\": [\n \"flag-bb\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1E9\",\n \"shortnames\": [\n \"flag-bd\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EA\",\n \"shortnames\": [\n \"flag-be\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EB\",\n \"shortnames\": [\n \"flag-bf\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EC\",\n \"shortnames\": [\n \"flag-bg\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1ED\",\n \"shortnames\": [\n \"flag-bh\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EE\",\n \"shortnames\": [\n \"flag-bi\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1EF\",\n \"shortnames\": [\n \"flag-bj\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F1\",\n \"shortnames\": [\n \"flag-bl\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F2\",\n \"shortnames\": [\n \"flag-bm\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F3\",\n \"shortnames\": [\n \"flag-bn\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F4\",\n \"shortnames\": [\n \"flag-bo\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F6\",\n \"shortnames\": [\n \"flag-bq\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F7\",\n \"shortnames\": [\n \"flag-br\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F8\",\n \"shortnames\": [\n \"flag-bs\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1F9\",\n \"shortnames\": [\n \"flag-bt\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FB\",\n \"shortnames\": [\n \"flag-bv\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FC\",\n \"shortnames\": [\n \"flag-bw\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FE\",\n \"shortnames\": [\n \"flag-by\"\n ]\n },\n {\n \"unified\": \"1F1E7-1F1FF\",\n \"shortnames\": [\n \"flag-bz\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E6\",\n \"shortnames\": [\n \"flag-ca\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E8\",\n \"shortnames\": [\n \"flag-cc\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1E9\",\n \"shortnames\": [\n \"flag-cd\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EB\",\n \"shortnames\": [\n \"flag-cf\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EC\",\n \"shortnames\": [\n \"flag-cg\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1ED\",\n \"shortnames\": [\n \"flag-ch\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1EE\",\n \"shortnames\": [\n \"flag-ci\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F0\",\n \"shortnames\": [\n \"flag-ck\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F1\",\n \"shortnames\": [\n \"flag-cl\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F2\",\n \"shortnames\": [\n \"flag-cm\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F3\",\n \"shortnames\": [\n \"cn\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F4\",\n \"shortnames\": [\n \"flag-co\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F5\",\n \"shortnames\": [\n \"flag-cp\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1F7\",\n \"shortnames\": [\n \"flag-cr\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FA\",\n \"shortnames\": [\n \"flag-cu\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FB\",\n \"shortnames\": [\n \"flag-cv\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FC\",\n \"shortnames\": [\n \"flag-cw\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FD\",\n \"shortnames\": [\n \"flag-cx\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FE\",\n \"shortnames\": [\n \"flag-cy\"\n ]\n },\n {\n \"unified\": \"1F1E8-1F1FF\",\n \"shortnames\": [\n \"flag-cz\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EA\",\n \"shortnames\": [\n \"de\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EC\",\n \"shortnames\": [\n \"flag-dg\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1EF\",\n \"shortnames\": [\n \"flag-dj\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F0\",\n \"shortnames\": [\n \"flag-dk\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F2\",\n \"shortnames\": [\n \"flag-dm\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1F4\",\n \"shortnames\": [\n \"flag-do\"\n ]\n },\n {\n \"unified\": \"1F1E9-1F1FF\",\n \"shortnames\": [\n \"flag-dz\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1E6\",\n \"shortnames\": [\n \"flag-ea\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1E8\",\n \"shortnames\": [\n \"flag-ec\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1EA\",\n \"shortnames\": [\n \"flag-ee\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1EC\",\n \"shortnames\": [\n \"flag-eg\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1ED\",\n \"shortnames\": [\n \"flag-eh\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F7\",\n \"shortnames\": [\n \"flag-er\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F8\",\n \"shortnames\": [\n \"es\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1F9\",\n \"shortnames\": [\n \"flag-et\"\n ]\n },\n {\n \"unified\": \"1F1EA-1F1FA\",\n \"shortnames\": [\n \"flag-eu\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1EE\",\n \"shortnames\": [\n \"flag-fi\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1EF\",\n \"shortnames\": [\n \"flag-fj\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F0\",\n \"shortnames\": [\n \"flag-fk\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F2\",\n \"shortnames\": [\n \"flag-fm\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F4\",\n \"shortnames\": [\n \"flag-fo\"\n ]\n },\n {\n \"unified\": \"1F1EB-1F1F7\",\n \"shortnames\": [\n \"fr\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E6\",\n \"shortnames\": [\n \"flag-ga\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E7\",\n \"shortnames\": [\n \"gb\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1E9\",\n \"shortnames\": [\n \"flag-gd\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EA\",\n \"shortnames\": [\n \"flag-ge\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EB\",\n \"shortnames\": [\n \"flag-gf\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EC\",\n \"shortnames\": [\n \"flag-gg\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1ED\",\n \"shortnames\": [\n \"flag-gh\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1EE\",\n \"shortnames\": [\n \"flag-gi\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F1\",\n \"shortnames\": [\n \"flag-gl\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F2\",\n \"shortnames\": [\n \"flag-gm\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F3\",\n \"shortnames\": [\n \"flag-gn\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F5\",\n \"shortnames\": [\n \"flag-gp\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F6\",\n \"shortnames\": [\n \"flag-gq\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F7\",\n \"shortnames\": [\n \"flag-gr\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F8\",\n \"shortnames\": [\n \"flag-gs\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1F9\",\n \"shortnames\": [\n \"flag-gt\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FA\",\n \"shortnames\": [\n \"flag-gu\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FC\",\n \"shortnames\": [\n \"flag-gw\"\n ]\n },\n {\n \"unified\": \"1F1EC-1F1FE\",\n \"shortnames\": [\n \"flag-gy\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F0\",\n \"shortnames\": [\n \"flag-hk\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F2\",\n \"shortnames\": [\n \"flag-hm\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F3\",\n \"shortnames\": [\n \"flag-hn\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F7\",\n \"shortnames\": [\n \"flag-hr\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1F9\",\n \"shortnames\": [\n \"flag-ht\"\n ]\n },\n {\n \"unified\": \"1F1ED-1F1FA\",\n \"shortnames\": [\n \"flag-hu\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1E8\",\n \"shortnames\": [\n \"flag-ic\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1E9\",\n \"shortnames\": [\n \"flag-id\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1EA\",\n \"shortnames\": [\n \"flag-ie\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F1\",\n \"shortnames\": [\n \"flag-il\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F2\",\n \"shortnames\": [\n \"flag-im\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F3\",\n \"shortnames\": [\n \"flag-in\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F4\",\n \"shortnames\": [\n \"flag-io\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F6\",\n \"shortnames\": [\n \"flag-iq\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F7\",\n \"shortnames\": [\n \"flag-ir\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F8\",\n \"shortnames\": [\n \"flag-is\"\n ]\n },\n {\n \"unified\": \"1F1EE-1F1F9\",\n \"shortnames\": [\n \"it\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1EA\",\n \"shortnames\": [\n \"flag-je\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F2\",\n \"shortnames\": [\n \"flag-jm\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F4\",\n \"shortnames\": [\n \"flag-jo\"\n ]\n },\n {\n \"unified\": \"1F1EF-1F1F5\",\n \"shortnames\": [\n \"jp\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EA\",\n \"shortnames\": [\n \"flag-ke\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EC\",\n \"shortnames\": [\n \"flag-kg\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1ED\",\n \"shortnames\": [\n \"flag-kh\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1EE\",\n \"shortnames\": [\n \"flag-ki\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F2\",\n \"shortnames\": [\n \"flag-km\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F3\",\n \"shortnames\": [\n \"flag-kn\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F5\",\n \"shortnames\": [\n \"flag-kp\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1F7\",\n \"shortnames\": [\n \"kr\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FC\",\n \"shortnames\": [\n \"flag-kw\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FE\",\n \"shortnames\": [\n \"flag-ky\"\n ]\n },\n {\n \"unified\": \"1F1F0-1F1FF\",\n \"shortnames\": [\n \"flag-kz\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E6\",\n \"shortnames\": [\n \"flag-la\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E7\",\n \"shortnames\": [\n \"flag-lb\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1E8\",\n \"shortnames\": [\n \"flag-lc\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1EE\",\n \"shortnames\": [\n \"flag-li\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F0\",\n \"shortnames\": [\n \"flag-lk\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F7\",\n \"shortnames\": [\n \"flag-lr\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F8\",\n \"shortnames\": [\n \"flag-ls\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1F9\",\n \"shortnames\": [\n \"flag-lt\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FA\",\n \"shortnames\": [\n \"flag-lu\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FB\",\n \"shortnames\": [\n \"flag-lv\"\n ]\n },\n {\n \"unified\": \"1F1F1-1F1FE\",\n \"shortnames\": [\n \"flag-ly\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E6\",\n \"shortnames\": [\n \"flag-ma\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E8\",\n \"shortnames\": [\n \"flag-mc\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1E9\",\n \"shortnames\": [\n \"flag-md\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EA\",\n \"shortnames\": [\n \"flag-me\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EB\",\n \"shortnames\": [\n \"flag-mf\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1EC\",\n \"shortnames\": [\n \"flag-mg\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1ED\",\n \"shortnames\": [\n \"flag-mh\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F0\",\n \"shortnames\": [\n \"flag-mk\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F1\",\n \"shortnames\": [\n \"flag-ml\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F2\",\n \"shortnames\": [\n \"flag-mm\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F3\",\n \"shortnames\": [\n \"flag-mn\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F4\",\n \"shortnames\": [\n \"flag-mo\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F5\",\n \"shortnames\": [\n \"flag-mp\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F6\",\n \"shortnames\": [\n \"flag-mq\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F7\",\n \"shortnames\": [\n \"flag-mr\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F8\",\n \"shortnames\": [\n \"flag-ms\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1F9\",\n \"shortnames\": [\n \"flag-mt\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FA\",\n \"shortnames\": [\n \"flag-mu\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FB\",\n \"shortnames\": [\n \"flag-mv\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FC\",\n \"shortnames\": [\n \"flag-mw\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FD\",\n \"shortnames\": [\n \"flag-mx\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FE\",\n \"shortnames\": [\n \"flag-my\"\n ]\n },\n {\n \"unified\": \"1F1F2-1F1FF\",\n \"shortnames\": [\n \"flag-mz\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1E6\",\n \"shortnames\": [\n \"flag-na\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1E8\",\n \"shortnames\": [\n \"flag-nc\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EA\",\n \"shortnames\": [\n \"flag-ne\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EB\",\n \"shortnames\": [\n \"flag-nf\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EC\",\n \"shortnames\": [\n \"flag-ng\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1EE\",\n \"shortnames\": [\n \"flag-ni\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F1\",\n \"shortnames\": [\n \"flag-nl\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F4\",\n \"shortnames\": [\n \"flag-no\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F5\",\n \"shortnames\": [\n \"flag-np\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1F7\",\n \"shortnames\": [\n \"flag-nr\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1FA\",\n \"shortnames\": [\n \"flag-nu\"\n ]\n },\n {\n \"unified\": \"1F1F3-1F1FF\",\n \"shortnames\": [\n \"flag-nz\"\n ]\n },\n {\n \"unified\": \"1F1F4-1F1F2\",\n \"shortnames\": [\n \"flag-om\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1E6\",\n \"shortnames\": [\n \"flag-pa\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EA\",\n \"shortnames\": [\n \"flag-pe\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EB\",\n \"shortnames\": [\n \"flag-pf\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1EC\",\n \"shortnames\": [\n \"flag-pg\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1ED\",\n \"shortnames\": [\n \"flag-ph\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F0\",\n \"shortnames\": [\n \"flag-pk\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F1\",\n \"shortnames\": [\n \"flag-pl\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F2\",\n \"shortnames\": [\n \"flag-pm\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F3\",\n \"shortnames\": [\n \"flag-pn\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F7\",\n \"shortnames\": [\n \"flag-pr\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F8\",\n \"shortnames\": [\n \"flag-ps\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1F9\",\n \"shortnames\": [\n \"flag-pt\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1FC\",\n \"shortnames\": [\n \"flag-pw\"\n ]\n },\n {\n \"unified\": \"1F1F5-1F1FE\",\n \"shortnames\": [\n \"flag-py\"\n ]\n },\n {\n \"unified\": \"1F1F6-1F1E6\",\n \"shortnames\": [\n \"flag-qa\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1EA\",\n \"shortnames\": [\n \"flag-re\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1F4\",\n \"shortnames\": [\n \"flag-ro\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1F8\",\n \"shortnames\": [\n \"flag-rs\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1FA\",\n \"shortnames\": [\n \"ru\"\n ]\n },\n {\n \"unified\": \"1F1F7-1F1FC\",\n \"shortnames\": [\n \"flag-rw\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E6\",\n \"shortnames\": [\n \"flag-sa\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E7\",\n \"shortnames\": [\n \"flag-sb\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E8\",\n \"shortnames\": [\n \"flag-sc\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1E9\",\n \"shortnames\": [\n \"flag-sd\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EA\",\n \"shortnames\": [\n \"flag-se\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EC\",\n \"shortnames\": [\n \"flag-sg\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1ED\",\n \"shortnames\": [\n \"flag-sh\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EE\",\n \"shortnames\": [\n \"flag-si\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1EF\",\n \"shortnames\": [\n \"flag-sj\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F0\",\n \"shortnames\": [\n \"flag-sk\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F1\",\n \"shortnames\": [\n \"flag-sl\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F2\",\n \"shortnames\": [\n \"flag-sm\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F3\",\n \"shortnames\": [\n \"flag-sn\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F4\",\n \"shortnames\": [\n \"flag-so\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F7\",\n \"shortnames\": [\n \"flag-sr\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F8\",\n \"shortnames\": [\n \"flag-ss\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1F9\",\n \"shortnames\": [\n \"flag-st\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FB\",\n \"shortnames\": [\n \"flag-sv\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FD\",\n \"shortnames\": [\n \"flag-sx\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FE\",\n \"shortnames\": [\n \"flag-sy\"\n ]\n },\n {\n \"unified\": \"1F1F8-1F1FF\",\n \"shortnames\": [\n \"flag-sz\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E6\",\n \"shortnames\": [\n \"flag-ta\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E8\",\n \"shortnames\": [\n \"flag-tc\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1E9\",\n \"shortnames\": [\n \"flag-td\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EB\",\n \"shortnames\": [\n \"flag-tf\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EC\",\n \"shortnames\": [\n \"flag-tg\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1ED\",\n \"shortnames\": [\n \"flag-th\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1EF\",\n \"shortnames\": [\n \"flag-tj\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F0\",\n \"shortnames\": [\n \"flag-tk\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F1\",\n \"shortnames\": [\n \"flag-tl\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F2\",\n \"shortnames\": [\n \"flag-tm\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F3\",\n \"shortnames\": [\n \"flag-tn\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F4\",\n \"shortnames\": [\n \"flag-to\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F7\",\n \"shortnames\": [\n \"flag-tr\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1F9\",\n \"shortnames\": [\n \"flag-tt\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FB\",\n \"shortnames\": [\n \"flag-tv\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FC\",\n \"shortnames\": [\n \"flag-tw\"\n ]\n },\n {\n \"unified\": \"1F1F9-1F1FF\",\n \"shortnames\": [\n \"flag-tz\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1E6\",\n \"shortnames\": [\n \"flag-ua\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1EC\",\n \"shortnames\": [\n \"flag-ug\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F2\",\n \"shortnames\": [\n \"flag-um\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F3\",\n \"shortnames\": [\n \"flag-un\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1F8\",\n \"shortnames\": [\n \"us\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1FE\",\n \"shortnames\": [\n \"flag-uy\"\n ]\n },\n {\n \"unified\": \"1F1FA-1F1FF\",\n \"shortnames\": [\n \"flag-uz\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1E6\",\n \"shortnames\": [\n \"flag-va\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1E8\",\n \"shortnames\": [\n \"flag-vc\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EA\",\n \"shortnames\": [\n \"flag-ve\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EC\",\n \"shortnames\": [\n \"flag-vg\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1EE\",\n \"shortnames\": [\n \"flag-vi\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1F3\",\n \"shortnames\": [\n \"flag-vn\"\n ]\n },\n {\n \"unified\": \"1F1FB-1F1FA\",\n \"shortnames\": [\n \"flag-vu\"\n ]\n },\n {\n \"unified\": \"1F1FC-1F1EB\",\n \"shortnames\": [\n \"flag-wf\"\n ]\n },\n {\n \"unified\": \"1F1FC-1F1F8\",\n \"shortnames\": [\n \"flag-ws\"\n ]\n },\n {\n \"unified\": \"1F1FD-1F1F0\",\n \"shortnames\": [\n \"flag-xk\"\n ]\n },\n {\n \"unified\": \"1F1FE-1F1EA\",\n \"shortnames\": [\n \"flag-ye\"\n ]\n },\n {\n \"unified\": \"1F1FE-1F1F9\",\n \"shortnames\": [\n \"flag-yt\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1E6\",\n \"shortnames\": [\n \"flag-za\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1F2\",\n \"shortnames\": [\n \"flag-zm\"\n ]\n },\n {\n \"unified\": \"1F1FF-1F1FC\",\n \"shortnames\": [\n \"flag-zw\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\n \"shortnames\": [\n \"flag-england\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\n \"shortnames\": [\n \"flag-scotland\"\n ]\n },\n {\n \"unified\": \"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\n \"shortnames\": [\n \"flag-wales\"\n ]\n }\n ]\n }\n];\n\nexport const byShortName = {\n \"hash\": \"0023-FE0F-20E3\",\n \"keycap_star\": \"002A-FE0F-20E3\",\n \"zero\": \"0030-FE0F-20E3\",\n \"one\": \"0031-FE0F-20E3\",\n \"two\": \"0032-FE0F-20E3\",\n \"three\": \"0033-FE0F-20E3\",\n \"four\": \"0034-FE0F-20E3\",\n \"five\": \"0035-FE0F-20E3\",\n \"six\": \"0036-FE0F-20E3\",\n \"seven\": \"0037-FE0F-20E3\",\n \"eight\": \"0038-FE0F-20E3\",\n \"nine\": \"0039-FE0F-20E3\",\n \"copyright\": \"00A9-FE0F\",\n \"registered\": \"00AE-FE0F\",\n \"mahjong\": \"1F004\",\n \"black_joker\": \"1F0CF\",\n \"a\": \"1F170-FE0F\",\n \"b\": \"1F171-FE0F\",\n \"o2\": \"1F17E-FE0F\",\n \"parking\": \"1F17F-FE0F\",\n \"ab\": \"1F18E\",\n \"cl\": \"1F191\",\n \"cool\": \"1F192\",\n \"free\": \"1F193\",\n \"id\": \"1F194\",\n \"new\": \"1F195\",\n \"ng\": \"1F196\",\n \"ok\": \"1F197\",\n \"sos\": \"1F198\",\n \"up\": \"1F199\",\n \"vs\": \"1F19A\",\n \"flag-ac\": \"1F1E6-1F1E8\",\n \"flag-ad\": \"1F1E6-1F1E9\",\n \"flag-ae\": \"1F1E6-1F1EA\",\n \"flag-af\": \"1F1E6-1F1EB\",\n \"flag-ag\": \"1F1E6-1F1EC\",\n \"flag-ai\": \"1F1E6-1F1EE\",\n \"flag-al\": \"1F1E6-1F1F1\",\n \"flag-am\": \"1F1E6-1F1F2\",\n \"flag-ao\": \"1F1E6-1F1F4\",\n \"flag-aq\": \"1F1E6-1F1F6\",\n \"flag-ar\": \"1F1E6-1F1F7\",\n \"flag-as\": \"1F1E6-1F1F8\",\n \"flag-at\": \"1F1E6-1F1F9\",\n \"flag-au\": \"1F1E6-1F1FA\",\n \"flag-aw\": \"1F1E6-1F1FC\",\n \"flag-ax\": \"1F1E6-1F1FD\",\n \"flag-az\": \"1F1E6-1F1FF\",\n \"flag-ba\": \"1F1E7-1F1E6\",\n \"flag-bb\": \"1F1E7-1F1E7\",\n \"flag-bd\": \"1F1E7-1F1E9\",\n \"flag-be\": \"1F1E7-1F1EA\",\n \"flag-bf\": \"1F1E7-1F1EB\",\n \"flag-bg\": \"1F1E7-1F1EC\",\n \"flag-bh\": \"1F1E7-1F1ED\",\n \"flag-bi\": \"1F1E7-1F1EE\",\n \"flag-bj\": \"1F1E7-1F1EF\",\n \"flag-bl\": \"1F1E7-1F1F1\",\n \"flag-bm\": \"1F1E7-1F1F2\",\n \"flag-bn\": \"1F1E7-1F1F3\",\n \"flag-bo\": \"1F1E7-1F1F4\",\n \"flag-bq\": \"1F1E7-1F1F6\",\n \"flag-br\": \"1F1E7-1F1F7\",\n \"flag-bs\": \"1F1E7-1F1F8\",\n \"flag-bt\": \"1F1E7-1F1F9\",\n \"flag-bv\": \"1F1E7-1F1FB\",\n \"flag-bw\": \"1F1E7-1F1FC\",\n \"flag-by\": \"1F1E7-1F1FE\",\n \"flag-bz\": \"1F1E7-1F1FF\",\n \"flag-ca\": \"1F1E8-1F1E6\",\n \"flag-cc\": \"1F1E8-1F1E8\",\n \"flag-cd\": \"1F1E8-1F1E9\",\n \"flag-cf\": \"1F1E8-1F1EB\",\n \"flag-cg\": \"1F1E8-1F1EC\",\n \"flag-ch\": \"1F1E8-1F1ED\",\n \"flag-ci\": \"1F1E8-1F1EE\",\n \"flag-ck\": \"1F1E8-1F1F0\",\n \"flag-cl\": \"1F1E8-1F1F1\",\n \"flag-cm\": \"1F1E8-1F1F2\",\n \"cn\": \"1F1E8-1F1F3\",\n \"flag-co\": \"1F1E8-1F1F4\",\n \"flag-cp\": \"1F1E8-1F1F5\",\n \"flag-cr\": \"1F1E8-1F1F7\",\n \"flag-cu\": \"1F1E8-1F1FA\",\n \"flag-cv\": \"1F1E8-1F1FB\",\n \"flag-cw\": \"1F1E8-1F1FC\",\n \"flag-cx\": \"1F1E8-1F1FD\",\n \"flag-cy\": \"1F1E8-1F1FE\",\n \"flag-cz\": \"1F1E8-1F1FF\",\n \"de\": \"1F1E9-1F1EA\",\n \"flag-dg\": \"1F1E9-1F1EC\",\n \"flag-dj\": \"1F1E9-1F1EF\",\n \"flag-dk\": \"1F1E9-1F1F0\",\n \"flag-dm\": \"1F1E9-1F1F2\",\n \"flag-do\": \"1F1E9-1F1F4\",\n \"flag-dz\": \"1F1E9-1F1FF\",\n \"flag-ea\": \"1F1EA-1F1E6\",\n \"flag-ec\": \"1F1EA-1F1E8\",\n \"flag-ee\": \"1F1EA-1F1EA\",\n \"flag-eg\": \"1F1EA-1F1EC\",\n \"flag-eh\": \"1F1EA-1F1ED\",\n \"flag-er\": \"1F1EA-1F1F7\",\n \"es\": \"1F1EA-1F1F8\",\n \"flag-et\": \"1F1EA-1F1F9\",\n \"flag-eu\": \"1F1EA-1F1FA\",\n \"flag-fi\": \"1F1EB-1F1EE\",\n \"flag-fj\": \"1F1EB-1F1EF\",\n \"flag-fk\": \"1F1EB-1F1F0\",\n \"flag-fm\": \"1F1EB-1F1F2\",\n \"flag-fo\": \"1F1EB-1F1F4\",\n \"fr\": \"1F1EB-1F1F7\",\n \"flag-ga\": \"1F1EC-1F1E6\",\n \"gb\": \"1F1EC-1F1E7\",\n \"flag-gd\": \"1F1EC-1F1E9\",\n \"flag-ge\": \"1F1EC-1F1EA\",\n \"flag-gf\": \"1F1EC-1F1EB\",\n \"flag-gg\": \"1F1EC-1F1EC\",\n \"flag-gh\": \"1F1EC-1F1ED\",\n \"flag-gi\": \"1F1EC-1F1EE\",\n \"flag-gl\": \"1F1EC-1F1F1\",\n \"flag-gm\": \"1F1EC-1F1F2\",\n \"flag-gn\": \"1F1EC-1F1F3\",\n \"flag-gp\": \"1F1EC-1F1F5\",\n \"flag-gq\": \"1F1EC-1F1F6\",\n \"flag-gr\": \"1F1EC-1F1F7\",\n \"flag-gs\": \"1F1EC-1F1F8\",\n \"flag-gt\": \"1F1EC-1F1F9\",\n \"flag-gu\": \"1F1EC-1F1FA\",\n \"flag-gw\": \"1F1EC-1F1FC\",\n \"flag-gy\": \"1F1EC-1F1FE\",\n \"flag-hk\": \"1F1ED-1F1F0\",\n \"flag-hm\": \"1F1ED-1F1F2\",\n \"flag-hn\": \"1F1ED-1F1F3\",\n \"flag-hr\": \"1F1ED-1F1F7\",\n \"flag-ht\": \"1F1ED-1F1F9\",\n \"flag-hu\": \"1F1ED-1F1FA\",\n \"flag-ic\": \"1F1EE-1F1E8\",\n \"flag-id\": \"1F1EE-1F1E9\",\n \"flag-ie\": \"1F1EE-1F1EA\",\n \"flag-il\": \"1F1EE-1F1F1\",\n \"flag-im\": \"1F1EE-1F1F2\",\n \"flag-in\": \"1F1EE-1F1F3\",\n \"flag-io\": \"1F1EE-1F1F4\",\n \"flag-iq\": \"1F1EE-1F1F6\",\n \"flag-ir\": \"1F1EE-1F1F7\",\n \"flag-is\": \"1F1EE-1F1F8\",\n \"it\": \"1F1EE-1F1F9\",\n \"flag-je\": \"1F1EF-1F1EA\",\n \"flag-jm\": \"1F1EF-1F1F2\",\n \"flag-jo\": \"1F1EF-1F1F4\",\n \"jp\": \"1F1EF-1F1F5\",\n \"flag-ke\": \"1F1F0-1F1EA\",\n \"flag-kg\": \"1F1F0-1F1EC\",\n \"flag-kh\": \"1F1F0-1F1ED\",\n \"flag-ki\": \"1F1F0-1F1EE\",\n \"flag-km\": \"1F1F0-1F1F2\",\n \"flag-kn\": \"1F1F0-1F1F3\",\n \"flag-kp\": \"1F1F0-1F1F5\",\n \"kr\": \"1F1F0-1F1F7\",\n \"flag-kw\": \"1F1F0-1F1FC\",\n \"flag-ky\": \"1F1F0-1F1FE\",\n \"flag-kz\": \"1F1F0-1F1FF\",\n \"flag-la\": \"1F1F1-1F1E6\",\n \"flag-lb\": \"1F1F1-1F1E7\",\n \"flag-lc\": \"1F1F1-1F1E8\",\n \"flag-li\": \"1F1F1-1F1EE\",\n \"flag-lk\": \"1F1F1-1F1F0\",\n \"flag-lr\": \"1F1F1-1F1F7\",\n \"flag-ls\": \"1F1F1-1F1F8\",\n \"flag-lt\": \"1F1F1-1F1F9\",\n \"flag-lu\": \"1F1F1-1F1FA\",\n \"flag-lv\": \"1F1F1-1F1FB\",\n \"flag-ly\": \"1F1F1-1F1FE\",\n \"flag-ma\": \"1F1F2-1F1E6\",\n \"flag-mc\": \"1F1F2-1F1E8\",\n \"flag-md\": \"1F1F2-1F1E9\",\n \"flag-me\": \"1F1F2-1F1EA\",\n \"flag-mf\": \"1F1F2-1F1EB\",\n \"flag-mg\": \"1F1F2-1F1EC\",\n \"flag-mh\": \"1F1F2-1F1ED\",\n \"flag-mk\": \"1F1F2-1F1F0\",\n \"flag-ml\": \"1F1F2-1F1F1\",\n \"flag-mm\": \"1F1F2-1F1F2\",\n \"flag-mn\": \"1F1F2-1F1F3\",\n \"flag-mo\": \"1F1F2-1F1F4\",\n \"flag-mp\": \"1F1F2-1F1F5\",\n \"flag-mq\": \"1F1F2-1F1F6\",\n \"flag-mr\": \"1F1F2-1F1F7\",\n \"flag-ms\": \"1F1F2-1F1F8\",\n \"flag-mt\": \"1F1F2-1F1F9\",\n \"flag-mu\": \"1F1F2-1F1FA\",\n \"flag-mv\": \"1F1F2-1F1FB\",\n \"flag-mw\": \"1F1F2-1F1FC\",\n \"flag-mx\": \"1F1F2-1F1FD\",\n \"flag-my\": \"1F1F2-1F1FE\",\n \"flag-mz\": \"1F1F2-1F1FF\",\n \"flag-na\": \"1F1F3-1F1E6\",\n \"flag-nc\": \"1F1F3-1F1E8\",\n \"flag-ne\": \"1F1F3-1F1EA\",\n \"flag-nf\": \"1F1F3-1F1EB\",\n \"flag-ng\": \"1F1F3-1F1EC\",\n \"flag-ni\": \"1F1F3-1F1EE\",\n \"flag-nl\": \"1F1F3-1F1F1\",\n \"flag-no\": \"1F1F3-1F1F4\",\n \"flag-np\": \"1F1F3-1F1F5\",\n \"flag-nr\": \"1F1F3-1F1F7\",\n \"flag-nu\": \"1F1F3-1F1FA\",\n \"flag-nz\": \"1F1F3-1F1FF\",\n \"flag-om\": \"1F1F4-1F1F2\",\n \"flag-pa\": \"1F1F5-1F1E6\",\n \"flag-pe\": \"1F1F5-1F1EA\",\n \"flag-pf\": \"1F1F5-1F1EB\",\n \"flag-pg\": \"1F1F5-1F1EC\",\n \"flag-ph\": \"1F1F5-1F1ED\",\n \"flag-pk\": \"1F1F5-1F1F0\",\n \"flag-pl\": \"1F1F5-1F1F1\",\n \"flag-pm\": \"1F1F5-1F1F2\",\n \"flag-pn\": \"1F1F5-1F1F3\",\n \"flag-pr\": \"1F1F5-1F1F7\",\n \"flag-ps\": \"1F1F5-1F1F8\",\n \"flag-pt\": \"1F1F5-1F1F9\",\n \"flag-pw\": \"1F1F5-1F1FC\",\n \"flag-py\": \"1F1F5-1F1FE\",\n \"flag-qa\": \"1F1F6-1F1E6\",\n \"flag-re\": \"1F1F7-1F1EA\",\n \"flag-ro\": \"1F1F7-1F1F4\",\n \"flag-rs\": \"1F1F7-1F1F8\",\n \"ru\": \"1F1F7-1F1FA\",\n \"flag-rw\": \"1F1F7-1F1FC\",\n \"flag-sa\": \"1F1F8-1F1E6\",\n \"flag-sb\": \"1F1F8-1F1E7\",\n \"flag-sc\": \"1F1F8-1F1E8\",\n \"flag-sd\": \"1F1F8-1F1E9\",\n \"flag-se\": \"1F1F8-1F1EA\",\n \"flag-sg\": \"1F1F8-1F1EC\",\n \"flag-sh\": \"1F1F8-1F1ED\",\n \"flag-si\": \"1F1F8-1F1EE\",\n \"flag-sj\": \"1F1F8-1F1EF\",\n \"flag-sk\": \"1F1F8-1F1F0\",\n \"flag-sl\": \"1F1F8-1F1F1\",\n \"flag-sm\": \"1F1F8-1F1F2\",\n \"flag-sn\": \"1F1F8-1F1F3\",\n \"flag-so\": \"1F1F8-1F1F4\",\n \"flag-sr\": \"1F1F8-1F1F7\",\n \"flag-ss\": \"1F1F8-1F1F8\",\n \"flag-st\": \"1F1F8-1F1F9\",\n \"flag-sv\": \"1F1F8-1F1FB\",\n \"flag-sx\": \"1F1F8-1F1FD\",\n \"flag-sy\": \"1F1F8-1F1FE\",\n \"flag-sz\": \"1F1F8-1F1FF\",\n \"flag-ta\": \"1F1F9-1F1E6\",\n \"flag-tc\": \"1F1F9-1F1E8\",\n \"flag-td\": \"1F1F9-1F1E9\",\n \"flag-tf\": \"1F1F9-1F1EB\",\n \"flag-tg\": \"1F1F9-1F1EC\",\n \"flag-th\": \"1F1F9-1F1ED\",\n \"flag-tj\": \"1F1F9-1F1EF\",\n \"flag-tk\": \"1F1F9-1F1F0\",\n \"flag-tl\": \"1F1F9-1F1F1\",\n \"flag-tm\": \"1F1F9-1F1F2\",\n \"flag-tn\": \"1F1F9-1F1F3\",\n \"flag-to\": \"1F1F9-1F1F4\",\n \"flag-tr\": \"1F1F9-1F1F7\",\n \"flag-tt\": \"1F1F9-1F1F9\",\n \"flag-tv\": \"1F1F9-1F1FB\",\n \"flag-tw\": \"1F1F9-1F1FC\",\n \"flag-tz\": \"1F1F9-1F1FF\",\n \"flag-ua\": \"1F1FA-1F1E6\",\n \"flag-ug\": \"1F1FA-1F1EC\",\n \"flag-um\": \"1F1FA-1F1F2\",\n \"flag-un\": \"1F1FA-1F1F3\",\n \"us\": \"1F1FA-1F1F8\",\n \"flag-uy\": \"1F1FA-1F1FE\",\n \"flag-uz\": \"1F1FA-1F1FF\",\n \"flag-va\": \"1F1FB-1F1E6\",\n \"flag-vc\": \"1F1FB-1F1E8\",\n \"flag-ve\": \"1F1FB-1F1EA\",\n \"flag-vg\": \"1F1FB-1F1EC\",\n \"flag-vi\": \"1F1FB-1F1EE\",\n \"flag-vn\": \"1F1FB-1F1F3\",\n \"flag-vu\": \"1F1FB-1F1FA\",\n \"flag-wf\": \"1F1FC-1F1EB\",\n \"flag-ws\": \"1F1FC-1F1F8\",\n \"flag-xk\": \"1F1FD-1F1F0\",\n \"flag-ye\": \"1F1FE-1F1EA\",\n \"flag-yt\": \"1F1FE-1F1F9\",\n \"flag-za\": \"1F1FF-1F1E6\",\n \"flag-zm\": \"1F1FF-1F1F2\",\n \"flag-zw\": \"1F1FF-1F1FC\",\n \"koko\": \"1F201\",\n \"sa\": \"1F202-FE0F\",\n \"u7121\": \"1F21A\",\n \"u6307\": \"1F22F\",\n \"u7981\": \"1F232\",\n \"u7a7a\": \"1F233\",\n \"u5408\": \"1F234\",\n \"u6e80\": \"1F235\",\n \"u6709\": \"1F236\",\n \"u6708\": \"1F237-FE0F\",\n \"u7533\": \"1F238\",\n \"u5272\": \"1F239\",\n \"u55b6\": \"1F23A\",\n \"ideograph_advantage\": \"1F250\",\n \"accept\": \"1F251\",\n \"cyclone\": \"1F300\",\n \"foggy\": \"1F301\",\n \"closed_umbrella\": \"1F302\",\n \"night_with_stars\": \"1F303\",\n \"sunrise_over_mountains\": \"1F304\",\n \"sunrise\": \"1F305\",\n \"city_sunset\": \"1F306\",\n \"city_sunrise\": \"1F307\",\n \"rainbow\": \"1F308\",\n \"bridge_at_night\": \"1F309\",\n \"ocean\": \"1F30A\",\n \"volcano\": \"1F30B\",\n \"milky_way\": \"1F30C\",\n \"earth_africa\": \"1F30D\",\n \"earth_americas\": \"1F30E\",\n \"earth_asia\": \"1F30F\",\n \"globe_with_meridians\": \"1F310\",\n \"new_moon\": \"1F311\",\n \"waxing_crescent_moon\": \"1F312\",\n \"first_quarter_moon\": \"1F313\",\n \"moon\": \"1F314\",\n \"full_moon\": \"1F315\",\n \"waning_gibbous_moon\": \"1F316\",\n \"last_quarter_moon\": \"1F317\",\n \"waning_crescent_moon\": \"1F318\",\n \"crescent_moon\": \"1F319\",\n \"new_moon_with_face\": \"1F31A\",\n \"first_quarter_moon_with_face\": \"1F31B\",\n \"last_quarter_moon_with_face\": \"1F31C\",\n \"full_moon_with_face\": \"1F31D\",\n \"sun_with_face\": \"1F31E\",\n \"star2\": \"1F31F\",\n \"stars\": \"1F320\",\n \"thermometer\": \"1F321-FE0F\",\n \"mostly_sunny\": \"1F324-FE0F\",\n \"barely_sunny\": \"1F325-FE0F\",\n \"partly_sunny_rain\": \"1F326-FE0F\",\n \"rain_cloud\": \"1F327-FE0F\",\n \"snow_cloud\": \"1F328-FE0F\",\n \"lightning\": \"1F329-FE0F\",\n \"tornado\": \"1F32A-FE0F\",\n \"fog\": \"1F32B-FE0F\",\n \"wind_blowing_face\": \"1F32C-FE0F\",\n \"hotdog\": \"1F32D\",\n \"taco\": \"1F32E\",\n \"burrito\": \"1F32F\",\n \"chestnut\": \"1F330\",\n \"seedling\": \"1F331\",\n \"evergreen_tree\": \"1F332\",\n \"deciduous_tree\": \"1F333\",\n \"palm_tree\": \"1F334\",\n \"cactus\": \"1F335\",\n \"hot_pepper\": \"1F336-FE0F\",\n \"tulip\": \"1F337\",\n \"cherry_blossom\": \"1F338\",\n \"rose\": \"1F339\",\n \"hibiscus\": \"1F33A\",\n \"sunflower\": \"1F33B\",\n \"blossom\": \"1F33C\",\n \"corn\": \"1F33D\",\n \"ear_of_rice\": \"1F33E\",\n \"herb\": \"1F33F\",\n \"four_leaf_clover\": \"1F340\",\n \"maple_leaf\": \"1F341\",\n \"fallen_leaf\": \"1F342\",\n \"leaves\": \"1F343\",\n \"mushroom\": \"1F344\",\n \"tomato\": \"1F345\",\n \"eggplant\": \"1F346\",\n \"grapes\": \"1F347\",\n \"melon\": \"1F348\",\n \"watermelon\": \"1F349\",\n \"tangerine\": \"1F34A\",\n \"lemon\": \"1F34B\",\n \"banana\": \"1F34C\",\n \"pineapple\": \"1F34D\",\n \"apple\": \"1F34E\",\n \"green_apple\": \"1F34F\",\n \"pear\": \"1F350\",\n \"peach\": \"1F351\",\n \"cherries\": \"1F352\",\n \"strawberry\": \"1F353\",\n \"hamburger\": \"1F354\",\n \"pizza\": \"1F355\",\n \"meat_on_bone\": \"1F356\",\n \"poultry_leg\": \"1F357\",\n \"rice_cracker\": \"1F358\",\n \"rice_ball\": \"1F359\",\n \"rice\": \"1F35A\",\n \"curry\": \"1F35B\",\n \"ramen\": \"1F35C\",\n \"spaghetti\": \"1F35D\",\n \"bread\": \"1F35E\",\n \"fries\": \"1F35F\",\n \"sweet_potato\": \"1F360\",\n \"dango\": \"1F361\",\n \"oden\": \"1F362\",\n \"sushi\": \"1F363\",\n \"fried_shrimp\": \"1F364\",\n \"fish_cake\": \"1F365\",\n \"icecream\": \"1F366\",\n \"shaved_ice\": \"1F367\",\n \"ice_cream\": \"1F368\",\n \"doughnut\": \"1F369\",\n \"cookie\": \"1F36A\",\n \"chocolate_bar\": \"1F36B\",\n \"candy\": \"1F36C\",\n \"lollipop\": \"1F36D\",\n \"custard\": \"1F36E\",\n \"honey_pot\": \"1F36F\",\n \"cake\": \"1F370\",\n \"bento\": \"1F371\",\n \"stew\": \"1F372\",\n \"fried_egg\": \"1F373\",\n \"fork_and_knife\": \"1F374\",\n \"tea\": \"1F375\",\n \"sake\": \"1F376\",\n \"wine_glass\": \"1F377\",\n \"cocktail\": \"1F378\",\n \"tropical_drink\": \"1F379\",\n \"beer\": \"1F37A\",\n \"beers\": \"1F37B\",\n \"baby_bottle\": \"1F37C\",\n \"knife_fork_plate\": \"1F37D-FE0F\",\n \"champagne\": \"1F37E\",\n \"popcorn\": \"1F37F\",\n \"ribbon\": \"1F380\",\n \"gift\": \"1F381\",\n \"birthday\": \"1F382\",\n \"jack_o_lantern\": \"1F383\",\n \"christmas_tree\": \"1F384\",\n \"santa\": \"1F385\",\n \"fireworks\": \"1F386\",\n \"sparkler\": \"1F387\",\n \"balloon\": \"1F388\",\n \"tada\": \"1F389\",\n \"confetti_ball\": \"1F38A\",\n \"tanabata_tree\": \"1F38B\",\n \"crossed_flags\": \"1F38C\",\n \"bamboo\": \"1F38D\",\n \"dolls\": \"1F38E\",\n \"flags\": \"1F38F\",\n \"wind_chime\": \"1F390\",\n \"rice_scene\": \"1F391\",\n \"school_satchel\": \"1F392\",\n \"mortar_board\": \"1F393\",\n \"medal\": \"1F396-FE0F\",\n \"reminder_ribbon\": \"1F397-FE0F\",\n \"studio_microphone\": \"1F399-FE0F\",\n \"level_slider\": \"1F39A-FE0F\",\n \"control_knobs\": \"1F39B-FE0F\",\n \"film_frames\": \"1F39E-FE0F\",\n \"admission_tickets\": \"1F39F-FE0F\",\n \"carousel_horse\": \"1F3A0\",\n \"ferris_wheel\": \"1F3A1\",\n \"roller_coaster\": \"1F3A2\",\n \"fishing_pole_and_fish\": \"1F3A3\",\n \"microphone\": \"1F3A4\",\n \"movie_camera\": \"1F3A5\",\n \"cinema\": \"1F3A6\",\n \"headphones\": \"1F3A7\",\n \"art\": \"1F3A8\",\n \"tophat\": \"1F3A9\",\n \"circus_tent\": \"1F3AA\",\n \"ticket\": \"1F3AB\",\n \"clapper\": \"1F3AC\",\n \"performing_arts\": \"1F3AD\",\n \"video_game\": \"1F3AE\",\n \"dart\": \"1F3AF\",\n \"slot_machine\": \"1F3B0\",\n \"8ball\": \"1F3B1\",\n \"game_die\": \"1F3B2\",\n \"bowling\": \"1F3B3\",\n \"flower_playing_cards\": \"1F3B4\",\n \"musical_note\": \"1F3B5\",\n \"notes\": \"1F3B6\",\n \"saxophone\": \"1F3B7\",\n \"guitar\": \"1F3B8\",\n \"musical_keyboard\": \"1F3B9\",\n \"trumpet\": \"1F3BA\",\n \"violin\": \"1F3BB\",\n \"musical_score\": \"1F3BC\",\n \"running_shirt_with_sash\": \"1F3BD\",\n \"tennis\": \"1F3BE\",\n \"ski\": \"1F3BF\",\n \"basketball\": \"1F3C0\",\n \"checkered_flag\": \"1F3C1\",\n \"snowboarder\": \"1F3C2\",\n \"woman-running\": \"1F3C3-200D-2640-FE0F\",\n \"man-running\": \"1F3C3-200D-2642-FE0F\",\n \"runner\": \"1F3C3-200D-2642-FE0F\",\n \"woman-surfing\": \"1F3C4-200D-2640-FE0F\",\n \"man-surfing\": \"1F3C4-200D-2642-FE0F\",\n \"surfer\": \"1F3C4-200D-2642-FE0F\",\n \"sports_medal\": \"1F3C5\",\n \"trophy\": \"1F3C6\",\n \"horse_racing\": \"1F3C7\",\n \"football\": \"1F3C8\",\n \"rugby_football\": \"1F3C9\",\n \"woman-swimming\": \"1F3CA-200D-2640-FE0F\",\n \"man-swimming\": \"1F3CA-200D-2642-FE0F\",\n \"swimmer\": \"1F3CA-200D-2642-FE0F\",\n \"woman-lifting-weights\": \"1F3CB-FE0F-200D-2640-FE0F\",\n \"man-lifting-weights\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"weight_lifter\": \"1F3CB-FE0F-200D-2642-FE0F\",\n \"woman-golfing\": \"1F3CC-FE0F-200D-2640-FE0F\",\n \"man-golfing\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"golfer\": \"1F3CC-FE0F-200D-2642-FE0F\",\n \"racing_motorcycle\": \"1F3CD-FE0F\",\n \"racing_car\": \"1F3CE-FE0F\",\n \"cricket_bat_and_ball\": \"1F3CF\",\n \"volleyball\": \"1F3D0\",\n \"field_hockey_stick_and_ball\": \"1F3D1\",\n \"ice_hockey_stick_and_puck\": \"1F3D2\",\n \"table_tennis_paddle_and_ball\": \"1F3D3\",\n \"snow_capped_mountain\": \"1F3D4-FE0F\",\n \"camping\": \"1F3D5-FE0F\",\n \"beach_with_umbrella\": \"1F3D6-FE0F\",\n \"building_construction\": \"1F3D7-FE0F\",\n \"house_buildings\": \"1F3D8-FE0F\",\n \"cityscape\": \"1F3D9-FE0F\",\n \"derelict_house_building\": \"1F3DA-FE0F\",\n \"classical_building\": \"1F3DB-FE0F\",\n \"desert\": \"1F3DC-FE0F\",\n \"desert_island\": \"1F3DD-FE0F\",\n \"national_park\": \"1F3DE-FE0F\",\n \"stadium\": \"1F3DF-FE0F\",\n \"house\": \"1F3E0\",\n \"house_with_garden\": \"1F3E1\",\n \"office\": \"1F3E2\",\n \"post_office\": \"1F3E3\",\n \"european_post_office\": \"1F3E4\",\n \"hospital\": \"1F3E5\",\n \"bank\": \"1F3E6\",\n \"atm\": \"1F3E7\",\n \"hotel\": \"1F3E8\",\n \"love_hotel\": \"1F3E9\",\n \"convenience_store\": \"1F3EA\",\n \"school\": \"1F3EB\",\n \"department_store\": \"1F3EC\",\n \"factory\": \"1F3ED\",\n \"izakaya_lantern\": \"1F3EE\",\n \"japanese_castle\": \"1F3EF\",\n \"european_castle\": \"1F3F0\",\n \"rainbow-flag\": \"1F3F3-FE0F-200D-1F308\",\n \"waving_white_flag\": \"1F3F3-FE0F\",\n \"flag-england\": \"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\n \"flag-scotland\": \"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\n \"flag-wales\": \"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\n \"waving_black_flag\": \"1F3F4\",\n \"rosette\": \"1F3F5-FE0F\",\n \"label\": \"1F3F7-FE0F\",\n \"badminton_racquet_and_shuttlecock\": \"1F3F8\",\n \"bow_and_arrow\": \"1F3F9\",\n \"amphora\": \"1F3FA\",\n \"skin-tone-2\": \"1F3FB\",\n \"skin-tone-3\": \"1F3FC\",\n \"skin-tone-4\": \"1F3FD\",\n \"skin-tone-5\": \"1F3FE\",\n \"skin-tone-6\": \"1F3FF\",\n \"rat\": \"1F400\",\n \"mouse2\": \"1F401\",\n \"ox\": \"1F402\",\n \"water_buffalo\": \"1F403\",\n \"cow2\": \"1F404\",\n \"tiger2\": \"1F405\",\n \"leopard\": \"1F406\",\n \"rabbit2\": \"1F407\",\n \"cat2\": \"1F408\",\n \"dragon\": \"1F409\",\n \"crocodile\": \"1F40A\",\n \"whale2\": \"1F40B\",\n \"snail\": \"1F40C\",\n \"snake\": \"1F40D\",\n \"racehorse\": \"1F40E\",\n \"ram\": \"1F40F\",\n \"goat\": \"1F410\",\n \"sheep\": \"1F411\",\n \"monkey\": \"1F412\",\n \"rooster\": \"1F413\",\n \"chicken\": \"1F414\",\n \"dog2\": \"1F415\",\n \"pig2\": \"1F416\",\n \"boar\": \"1F417\",\n \"elephant\": \"1F418\",\n \"octopus\": \"1F419\",\n \"shell\": \"1F41A\",\n \"bug\": \"1F41B\",\n \"ant\": \"1F41C\",\n \"bee\": \"1F41D\",\n \"beetle\": \"1F41E\",\n \"fish\": \"1F41F\",\n \"tropical_fish\": \"1F420\",\n \"blowfish\": \"1F421\",\n \"turtle\": \"1F422\",\n \"hatching_chick\": \"1F423\",\n \"baby_chick\": \"1F424\",\n \"hatched_chick\": \"1F425\",\n \"bird\": \"1F426\",\n \"penguin\": \"1F427\",\n \"koala\": \"1F428\",\n \"poodle\": \"1F429\",\n \"dromedary_camel\": \"1F42A\",\n \"camel\": \"1F42B\",\n \"dolphin\": \"1F42C\",\n \"mouse\": \"1F42D\",\n \"cow\": \"1F42E\",\n \"tiger\": \"1F42F\",\n \"rabbit\": \"1F430\",\n \"cat\": \"1F431\",\n \"dragon_face\": \"1F432\",\n \"whale\": \"1F433\",\n \"horse\": \"1F434\",\n \"monkey_face\": \"1F435\",\n \"dog\": \"1F436\",\n \"pig\": \"1F437\",\n \"frog\": \"1F438\",\n \"hamster\": \"1F439\",\n \"wolf\": \"1F43A\",\n \"bear\": \"1F43B\",\n \"panda_face\": \"1F43C\",\n \"pig_nose\": \"1F43D\",\n \"feet\": \"1F43E\",\n \"chipmunk\": \"1F43F-FE0F\",\n \"eyes\": \"1F440\",\n \"eye-in-speech-bubble\": \"1F441-FE0F-200D-1F5E8-FE0F\",\n \"eye\": \"1F441-FE0F\",\n \"ear\": \"1F442\",\n \"nose\": \"1F443\",\n \"lips\": \"1F444\",\n \"tongue\": \"1F445\",\n \"point_up_2\": \"1F446\",\n \"point_down\": \"1F447\",\n \"point_left\": \"1F448\",\n \"point_right\": \"1F449\",\n \"facepunch\": \"1F44A\",\n \"wave\": \"1F44B\",\n \"ok_hand\": \"1F44C\",\n \"+1\": \"1F44D\",\n \"-1\": \"1F44E\",\n \"clap\": \"1F44F\",\n \"open_hands\": \"1F450\",\n \"crown\": \"1F451\",\n \"womans_hat\": \"1F452\",\n \"eyeglasses\": \"1F453\",\n \"necktie\": \"1F454\",\n \"shirt\": \"1F455\",\n \"jeans\": \"1F456\",\n \"dress\": \"1F457\",\n \"kimono\": \"1F458\",\n \"bikini\": \"1F459\",\n \"womans_clothes\": \"1F45A\",\n \"purse\": \"1F45B\",\n \"handbag\": \"1F45C\",\n \"pouch\": \"1F45D\",\n \"mans_shoe\": \"1F45E\",\n \"athletic_shoe\": \"1F45F\",\n \"high_heel\": \"1F460\",\n \"sandal\": \"1F461\",\n \"boot\": \"1F462\",\n \"footprints\": \"1F463\",\n \"bust_in_silhouette\": \"1F464\",\n \"busts_in_silhouette\": \"1F465\",\n \"boy\": \"1F466\",\n \"girl\": \"1F467\",\n \"male-farmer\": \"1F468-200D-1F33E\",\n \"male-cook\": \"1F468-200D-1F373\",\n \"male-student\": \"1F468-200D-1F393\",\n \"male-singer\": \"1F468-200D-1F3A4\",\n \"male-artist\": \"1F468-200D-1F3A8\",\n \"male-teacher\": \"1F468-200D-1F3EB\",\n \"male-factory-worker\": \"1F468-200D-1F3ED\",\n \"man-boy-boy\": \"1F468-200D-1F466-200D-1F466\",\n \"man-boy\": \"1F468-200D-1F466\",\n \"man-girl-boy\": \"1F468-200D-1F467-200D-1F466\",\n \"man-girl-girl\": \"1F468-200D-1F467-200D-1F467\",\n \"man-girl\": \"1F468-200D-1F467\",\n \"man-man-boy\": \"1F468-200D-1F468-200D-1F466\",\n \"man-man-boy-boy\": \"1F468-200D-1F468-200D-1F466-200D-1F466\",\n \"man-man-girl\": \"1F468-200D-1F468-200D-1F467\",\n \"man-man-girl-boy\": \"1F468-200D-1F468-200D-1F467-200D-1F466\",\n \"man-man-girl-girl\": \"1F468-200D-1F468-200D-1F467-200D-1F467\",\n \"man-woman-boy\": \"1F468-200D-1F469-200D-1F466\",\n \"man-woman-boy-boy\": \"1F468-200D-1F469-200D-1F466-200D-1F466\",\n \"man-woman-girl\": \"1F468-200D-1F469-200D-1F467\",\n \"man-woman-girl-boy\": \"1F468-200D-1F469-200D-1F467-200D-1F466\",\n \"man-woman-girl-girl\": \"1F468-200D-1F469-200D-1F467-200D-1F467\",\n \"male-technologist\": \"1F468-200D-1F4BB\",\n \"male-office-worker\": \"1F468-200D-1F4BC\",\n \"male-mechanic\": \"1F468-200D-1F527\",\n \"male-scientist\": \"1F468-200D-1F52C\",\n \"male-astronaut\": \"1F468-200D-1F680\",\n \"male-firefighter\": \"1F468-200D-1F692\",\n \"male-doctor\": \"1F468-200D-2695-FE0F\",\n \"male-judge\": \"1F468-200D-2696-FE0F\",\n \"male-pilot\": \"1F468-200D-2708-FE0F\",\n \"man-heart-man\": \"1F468-200D-2764-FE0F-200D-1F468\",\n \"man-kiss-man\": \"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"man\": \"1F468\",\n \"female-farmer\": \"1F469-200D-1F33E\",\n \"female-cook\": \"1F469-200D-1F373\",\n \"female-student\": \"1F469-200D-1F393\",\n \"female-singer\": \"1F469-200D-1F3A4\",\n \"female-artist\": \"1F469-200D-1F3A8\",\n \"female-teacher\": \"1F469-200D-1F3EB\",\n \"female-factory-worker\": \"1F469-200D-1F3ED\",\n \"woman-boy-boy\": \"1F469-200D-1F466-200D-1F466\",\n \"woman-boy\": \"1F469-200D-1F466\",\n \"woman-girl-boy\": \"1F469-200D-1F467-200D-1F466\",\n \"woman-girl-girl\": \"1F469-200D-1F467-200D-1F467\",\n \"woman-girl\": \"1F469-200D-1F467\",\n \"woman-woman-boy\": \"1F469-200D-1F469-200D-1F466\",\n \"woman-woman-boy-boy\": \"1F469-200D-1F469-200D-1F466-200D-1F466\",\n \"woman-woman-girl\": \"1F469-200D-1F469-200D-1F467\",\n \"woman-woman-girl-boy\": \"1F469-200D-1F469-200D-1F467-200D-1F466\",\n \"woman-woman-girl-girl\": \"1F469-200D-1F469-200D-1F467-200D-1F467\",\n \"female-technologist\": \"1F469-200D-1F4BB\",\n \"female-office-worker\": \"1F469-200D-1F4BC\",\n \"female-mechanic\": \"1F469-200D-1F527\",\n \"female-scientist\": \"1F469-200D-1F52C\",\n \"female-astronaut\": \"1F469-200D-1F680\",\n \"female-firefighter\": \"1F469-200D-1F692\",\n \"female-doctor\": \"1F469-200D-2695-FE0F\",\n \"female-judge\": \"1F469-200D-2696-FE0F\",\n \"female-pilot\": \"1F469-200D-2708-FE0F\",\n \"woman-heart-man\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"woman-heart-woman\": \"1F469-200D-2764-FE0F-200D-1F469\",\n \"woman-kiss-man\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"woman-kiss-woman\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\n \"woman\": \"1F469\",\n \"family\": \"1F468-200D-1F469-200D-1F466\",\n \"couple\": \"1F46B\",\n \"two_men_holding_hands\": \"1F46C\",\n \"two_women_holding_hands\": \"1F46D\",\n \"female-police-officer\": \"1F46E-200D-2640-FE0F\",\n \"male-police-officer\": \"1F46E-200D-2642-FE0F\",\n \"cop\": \"1F46E-200D-2642-FE0F\",\n \"woman-with-bunny-ears-partying\": \"1F46F-200D-2640-FE0F\",\n \"man-with-bunny-ears-partying\": \"1F46F-200D-2642-FE0F\",\n \"dancers\": \"1F46F-200D-2640-FE0F\",\n \"bride_with_veil\": \"1F470\",\n \"blond-haired-woman\": \"1F471-200D-2640-FE0F\",\n \"blond-haired-man\": \"1F471-200D-2642-FE0F\",\n \"person_with_blond_hair\": \"1F471-200D-2642-FE0F\",\n \"man_with_gua_pi_mao\": \"1F472\",\n \"woman-wearing-turban\": \"1F473-200D-2640-FE0F\",\n \"man-wearing-turban\": \"1F473-200D-2642-FE0F\",\n \"man_with_turban\": \"1F473-200D-2642-FE0F\",\n \"older_man\": \"1F474\",\n \"older_woman\": \"1F475\",\n \"baby\": \"1F476\",\n \"female-construction-worker\": \"1F477-200D-2640-FE0F\",\n \"male-construction-worker\": \"1F477-200D-2642-FE0F\",\n \"construction_worker\": \"1F477-200D-2642-FE0F\",\n \"princess\": \"1F478\",\n \"japanese_ogre\": \"1F479\",\n \"japanese_goblin\": \"1F47A\",\n \"ghost\": \"1F47B\",\n \"angel\": \"1F47C\",\n \"alien\": \"1F47D\",\n \"space_invader\": \"1F47E\",\n \"imp\": \"1F47F\",\n \"skull\": \"1F480\",\n \"woman-tipping-hand\": \"1F481-200D-2640-FE0F\",\n \"man-tipping-hand\": \"1F481-200D-2642-FE0F\",\n \"information_desk_person\": \"1F481-200D-2640-FE0F\",\n \"female-guard\": \"1F482-200D-2640-FE0F\",\n \"male-guard\": \"1F482-200D-2642-FE0F\",\n \"guardsman\": \"1F482-200D-2642-FE0F\",\n \"dancer\": \"1F483\",\n \"lipstick\": \"1F484\",\n \"nail_care\": \"1F485\",\n \"woman-getting-massage\": \"1F486-200D-2640-FE0F\",\n \"man-getting-massage\": \"1F486-200D-2642-FE0F\",\n \"massage\": \"1F486-200D-2640-FE0F\",\n \"woman-getting-haircut\": \"1F487-200D-2640-FE0F\",\n \"man-getting-haircut\": \"1F487-200D-2642-FE0F\",\n \"haircut\": \"1F487-200D-2640-FE0F\",\n \"barber\": \"1F488\",\n \"syringe\": \"1F489\",\n \"pill\": \"1F48A\",\n \"kiss\": \"1F48B\",\n \"love_letter\": \"1F48C\",\n \"ring\": \"1F48D\",\n \"gem\": \"1F48E\",\n \"couplekiss\": \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n \"bouquet\": \"1F490\",\n \"couple_with_heart\": \"1F469-200D-2764-FE0F-200D-1F468\",\n \"wedding\": \"1F492\",\n \"heartbeat\": \"1F493\",\n \"broken_heart\": \"1F494\",\n \"two_hearts\": \"1F495\",\n \"sparkling_heart\": \"1F496\",\n \"heartpulse\": \"1F497\",\n \"cupid\": \"1F498\",\n \"blue_heart\": \"1F499\",\n \"green_heart\": \"1F49A\",\n \"yellow_heart\": \"1F49B\",\n \"purple_heart\": \"1F49C\",\n \"gift_heart\": \"1F49D\",\n \"revolving_hearts\": \"1F49E\",\n \"heart_decoration\": \"1F49F\",\n \"diamond_shape_with_a_dot_inside\": \"1F4A0\",\n \"bulb\": \"1F4A1\",\n \"anger\": \"1F4A2\",\n \"bomb\": \"1F4A3\",\n \"zzz\": \"1F4A4\",\n \"boom\": \"1F4A5\",\n \"sweat_drops\": \"1F4A6\",\n \"droplet\": \"1F4A7\",\n \"dash\": \"1F4A8\",\n \"hankey\": \"1F4A9\",\n \"muscle\": \"1F4AA\",\n \"dizzy\": \"1F4AB\",\n \"speech_balloon\": \"1F4AC\",\n \"thought_balloon\": \"1F4AD\",\n \"white_flower\": \"1F4AE\",\n \"100\": \"1F4AF\",\n \"moneybag\": \"1F4B0\",\n \"currency_exchange\": \"1F4B1\",\n \"heavy_dollar_sign\": \"1F4B2\",\n \"credit_card\": \"1F4B3\",\n \"yen\": \"1F4B4\",\n \"dollar\": \"1F4B5\",\n \"euro\": \"1F4B6\",\n \"pound\": \"1F4B7\",\n \"money_with_wings\": \"1F4B8\",\n \"chart\": \"1F4B9\",\n \"seat\": \"1F4BA\",\n \"computer\": \"1F4BB\",\n \"briefcase\": \"1F4BC\",\n \"minidisc\": \"1F4BD\",\n \"floppy_disk\": \"1F4BE\",\n \"cd\": \"1F4BF\",\n \"dvd\": \"1F4C0\",\n \"file_folder\": \"1F4C1\",\n \"open_file_folder\": \"1F4C2\",\n \"page_with_curl\": \"1F4C3\",\n \"page_facing_up\": \"1F4C4\",\n \"date\": \"1F4C5\",\n \"calendar\": \"1F4C6\",\n \"card_index\": \"1F4C7\",\n \"chart_with_upwards_trend\": \"1F4C8\",\n \"chart_with_downwards_trend\": \"1F4C9\",\n \"bar_chart\": \"1F4CA\",\n \"clipboard\": \"1F4CB\",\n \"pushpin\": \"1F4CC\",\n \"round_pushpin\": \"1F4CD\",\n \"paperclip\": \"1F4CE\",\n \"straight_ruler\": \"1F4CF\",\n \"triangular_ruler\": \"1F4D0\",\n \"bookmark_tabs\": \"1F4D1\",\n \"ledger\": \"1F4D2\",\n \"notebook\": \"1F4D3\",\n \"notebook_with_decorative_cover\": \"1F4D4\",\n \"closed_book\": \"1F4D5\",\n \"book\": \"1F4D6\",\n \"green_book\": \"1F4D7\",\n \"blue_book\": \"1F4D8\",\n \"orange_book\": \"1F4D9\",\n \"books\": \"1F4DA\",\n \"name_badge\": \"1F4DB\",\n \"scroll\": \"1F4DC\",\n \"memo\": \"1F4DD\",\n \"telephone_receiver\": \"1F4DE\",\n \"pager\": \"1F4DF\",\n \"fax\": \"1F4E0\",\n \"satellite_antenna\": \"1F4E1\",\n \"loudspeaker\": \"1F4E2\",\n \"mega\": \"1F4E3\",\n \"outbox_tray\": \"1F4E4\",\n \"inbox_tray\": \"1F4E5\",\n \"package\": \"1F4E6\",\n \"e-mail\": \"1F4E7\",\n \"incoming_envelope\": \"1F4E8\",\n \"envelope_with_arrow\": \"1F4E9\",\n \"mailbox_closed\": \"1F4EA\",\n \"mailbox\": \"1F4EB\",\n \"mailbox_with_mail\": \"1F4EC\",\n \"mailbox_with_no_mail\": \"1F4ED\",\n \"postbox\": \"1F4EE\",\n \"postal_horn\": \"1F4EF\",\n \"newspaper\": \"1F4F0\",\n \"iphone\": \"1F4F1\",\n \"calling\": \"1F4F2\",\n \"vibration_mode\": \"1F4F3\",\n \"mobile_phone_off\": \"1F4F4\",\n \"no_mobile_phones\": \"1F4F5\",\n \"signal_strength\": \"1F4F6\",\n \"camera\": \"1F4F7\",\n \"camera_with_flash\": \"1F4F8\",\n \"video_camera\": \"1F4F9\",\n \"tv\": \"1F4FA\",\n \"radio\": \"1F4FB\",\n \"vhs\": \"1F4FC\",\n \"film_projector\": \"1F4FD-FE0F\",\n \"prayer_beads\": \"1F4FF\",\n \"twisted_rightwards_arrows\": \"1F500\",\n \"repeat\": \"1F501\",\n \"repeat_one\": \"1F502\",\n \"arrows_clockwise\": \"1F503\",\n \"arrows_counterclockwise\": \"1F504\",\n \"low_brightness\": \"1F505\",\n \"high_brightness\": \"1F506\",\n \"mute\": \"1F507\",\n \"speaker\": \"1F508\",\n \"sound\": \"1F509\",\n \"loud_sound\": \"1F50A\",\n \"battery\": \"1F50B\",\n \"electric_plug\": \"1F50C\",\n \"mag\": \"1F50D\",\n \"mag_right\": \"1F50E\",\n \"lock_with_ink_pen\": \"1F50F\",\n \"closed_lock_with_key\": \"1F510\",\n \"key\": \"1F511\",\n \"lock\": \"1F512\",\n \"unlock\": \"1F513\",\n \"bell\": \"1F514\",\n \"no_bell\": \"1F515\",\n \"bookmark\": \"1F516\",\n \"link\": \"1F517\",\n \"radio_button\": \"1F518\",\n \"back\": \"1F519\",\n \"end\": \"1F51A\",\n \"on\": \"1F51B\",\n \"soon\": \"1F51C\",\n \"top\": \"1F51D\",\n \"underage\": \"1F51E\",\n \"keycap_ten\": \"1F51F\",\n \"capital_abcd\": \"1F520\",\n \"abcd\": \"1F521\",\n \"1234\": \"1F522\",\n \"symbols\": \"1F523\",\n \"abc\": \"1F524\",\n \"fire\": \"1F525\",\n \"flashlight\": \"1F526\",\n \"wrench\": \"1F527\",\n \"hammer\": \"1F528\",\n \"nut_and_bolt\": \"1F529\",\n \"hocho\": \"1F52A\",\n \"gun\": \"1F52B\",\n \"microscope\": \"1F52C\",\n \"telescope\": \"1F52D\",\n \"crystal_ball\": \"1F52E\",\n \"six_pointed_star\": \"1F52F\",\n \"beginner\": \"1F530\",\n \"trident\": \"1F531\",\n \"black_square_button\": \"1F532\",\n \"white_square_button\": \"1F533\",\n \"red_circle\": \"1F534\",\n \"large_blue_circle\": \"1F535\",\n \"large_orange_diamond\": \"1F536\",\n \"large_blue_diamond\": \"1F537\",\n \"small_orange_diamond\": \"1F538\",\n \"small_blue_diamond\": \"1F539\",\n \"small_red_triangle\": \"1F53A\",\n \"small_red_triangle_down\": \"1F53B\",\n \"arrow_up_small\": \"1F53C\",\n \"arrow_down_small\": \"1F53D\",\n \"om_symbol\": \"1F549-FE0F\",\n \"dove_of_peace\": \"1F54A-FE0F\",\n \"kaaba\": \"1F54B\",\n \"mosque\": \"1F54C\",\n \"synagogue\": \"1F54D\",\n \"menorah_with_nine_branches\": \"1F54E\",\n \"clock1\": \"1F550\",\n \"clock2\": \"1F551\",\n \"clock3\": \"1F552\",\n \"clock4\": \"1F553\",\n \"clock5\": \"1F554\",\n \"clock6\": \"1F555\",\n \"clock7\": \"1F556\",\n \"clock8\": \"1F557\",\n \"clock9\": \"1F558\",\n \"clock10\": \"1F559\",\n \"clock11\": \"1F55A\",\n \"clock12\": \"1F55B\",\n \"clock130\": \"1F55C\",\n \"clock230\": \"1F55D\",\n \"clock330\": \"1F55E\",\n \"clock430\": \"1F55F\",\n \"clock530\": \"1F560\",\n \"clock630\": \"1F561\",\n \"clock730\": \"1F562\",\n \"clock830\": \"1F563\",\n \"clock930\": \"1F564\",\n \"clock1030\": \"1F565\",\n \"clock1130\": \"1F566\",\n \"clock1230\": \"1F567\",\n \"candle\": \"1F56F-FE0F\",\n \"mantelpiece_clock\": \"1F570-FE0F\",\n \"hole\": \"1F573-FE0F\",\n \"man_in_business_suit_levitating\": \"1F574-FE0F\",\n \"female-detective\": \"1F575-FE0F-200D-2640-FE0F\",\n \"male-detective\": \"1F575-FE0F-200D-2642-FE0F\",\n \"sleuth_or_spy\": \"1F575-FE0F-200D-2642-FE0F\",\n \"dark_sunglasses\": \"1F576-FE0F\",\n \"spider\": \"1F577-FE0F\",\n \"spider_web\": \"1F578-FE0F\",\n \"joystick\": \"1F579-FE0F\",\n \"man_dancing\": \"1F57A\",\n \"linked_paperclips\": \"1F587-FE0F\",\n \"lower_left_ballpoint_pen\": \"1F58A-FE0F\",\n \"lower_left_fountain_pen\": \"1F58B-FE0F\",\n \"lower_left_paintbrush\": \"1F58C-FE0F\",\n \"lower_left_crayon\": \"1F58D-FE0F\",\n \"raised_hand_with_fingers_splayed\": \"1F590-FE0F\",\n \"middle_finger\": \"1F595\",\n \"spock-hand\": \"1F596\",\n \"black_heart\": \"1F5A4\",\n \"desktop_computer\": \"1F5A5-FE0F\",\n \"printer\": \"1F5A8-FE0F\",\n \"three_button_mouse\": \"1F5B1-FE0F\",\n \"trackball\": \"1F5B2-FE0F\",\n \"frame_with_picture\": \"1F5BC-FE0F\",\n \"card_index_dividers\": \"1F5C2-FE0F\",\n \"card_file_box\": \"1F5C3-FE0F\",\n \"file_cabinet\": \"1F5C4-FE0F\",\n \"wastebasket\": \"1F5D1-FE0F\",\n \"spiral_note_pad\": \"1F5D2-FE0F\",\n \"spiral_calendar_pad\": \"1F5D3-FE0F\",\n \"compression\": \"1F5DC-FE0F\",\n \"old_key\": \"1F5DD-FE0F\",\n \"rolled_up_newspaper\": \"1F5DE-FE0F\",\n \"dagger_knife\": \"1F5E1-FE0F\",\n \"speaking_head_in_silhouette\": \"1F5E3-FE0F\",\n \"left_speech_bubble\": \"1F5E8-FE0F\",\n \"right_anger_bubble\": \"1F5EF-FE0F\",\n \"ballot_box_with_ballot\": \"1F5F3-FE0F\",\n \"world_map\": \"1F5FA-FE0F\",\n \"mount_fuji\": \"1F5FB\",\n \"tokyo_tower\": \"1F5FC\",\n \"statue_of_liberty\": \"1F5FD\",\n \"japan\": \"1F5FE\",\n \"moyai\": \"1F5FF\",\n \"grinning\": \"1F600\",\n \"grin\": \"1F601\",\n \"joy\": \"1F602\",\n \"smiley\": \"1F603\",\n \"smile\": \"1F604\",\n \"sweat_smile\": \"1F605\",\n \"laughing\": \"1F606\",\n \"innocent\": \"1F607\",\n \"smiling_imp\": \"1F608\",\n \"wink\": \"1F609\",\n \"blush\": \"1F60A\",\n \"yum\": \"1F60B\",\n \"relieved\": \"1F60C\",\n \"heart_eyes\": \"1F60D\",\n \"sunglasses\": \"1F60E\",\n \"smirk\": \"1F60F\",\n \"neutral_face\": \"1F610\",\n \"expressionless\": \"1F611\",\n \"unamused\": \"1F612\",\n \"sweat\": \"1F613\",\n \"pensive\": \"1F614\",\n \"confused\": \"1F615\",\n \"confounded\": \"1F616\",\n \"kissing\": \"1F617\",\n \"kissing_heart\": \"1F618\",\n \"kissing_smiling_eyes\": \"1F619\",\n \"kissing_closed_eyes\": \"1F61A\",\n \"stuck_out_tongue\": \"1F61B\",\n \"stuck_out_tongue_winking_eye\": \"1F61C\",\n \"stuck_out_tongue_closed_eyes\": \"1F61D\",\n \"disappointed\": \"1F61E\",\n \"worried\": \"1F61F\",\n \"angry\": \"1F620\",\n \"rage\": \"1F621\",\n \"cry\": \"1F622\",\n \"persevere\": \"1F623\",\n \"triumph\": \"1F624\",\n \"disappointed_relieved\": \"1F625\",\n \"frowning\": \"1F626\",\n \"anguished\": \"1F627\",\n \"fearful\": \"1F628\",\n \"weary\": \"1F629\",\n \"sleepy\": \"1F62A\",\n \"tired_face\": \"1F62B\",\n \"grimacing\": \"1F62C\",\n \"sob\": \"1F62D\",\n \"open_mouth\": \"1F62E\",\n \"hushed\": \"1F62F\",\n \"cold_sweat\": \"1F630\",\n \"scream\": \"1F631\",\n \"astonished\": \"1F632\",\n \"flushed\": \"1F633\",\n \"sleeping\": \"1F634\",\n \"dizzy_face\": \"1F635\",\n \"no_mouth\": \"1F636\",\n \"mask\": \"1F637\",\n \"smile_cat\": \"1F638\",\n \"joy_cat\": \"1F639\",\n \"smiley_cat\": \"1F63A\",\n \"heart_eyes_cat\": \"1F63B\",\n \"smirk_cat\": \"1F63C\",\n \"kissing_cat\": \"1F63D\",\n \"pouting_cat\": \"1F63E\",\n \"crying_cat_face\": \"1F63F\",\n \"scream_cat\": \"1F640\",\n \"slightly_frowning_face\": \"1F641\",\n \"slightly_smiling_face\": \"1F642\",\n \"upside_down_face\": \"1F643\",\n \"face_with_rolling_eyes\": \"1F644\",\n \"woman-gesturing-no\": \"1F645-200D-2640-FE0F\",\n \"man-gesturing-no\": \"1F645-200D-2642-FE0F\",\n \"no_good\": \"1F645-200D-2640-FE0F\",\n \"woman-gesturing-ok\": \"1F646-200D-2640-FE0F\",\n \"man-gesturing-ok\": \"1F646-200D-2642-FE0F\",\n \"ok_woman\": \"1F646-200D-2640-FE0F\",\n \"woman-bowing\": \"1F647-200D-2640-FE0F\",\n \"man-bowing\": \"1F647-200D-2642-FE0F\",\n \"bow\": \"1F647-200D-2642-FE0F\",\n \"see_no_evil\": \"1F648\",\n \"hear_no_evil\": \"1F649\",\n \"speak_no_evil\": \"1F64A\",\n \"woman-raising-hand\": \"1F64B-200D-2640-FE0F\",\n \"man-raising-hand\": \"1F64B-200D-2642-FE0F\",\n \"raising_hand\": \"1F64B-200D-2640-FE0F\",\n \"raised_hands\": \"1F64C\",\n \"woman-frowning\": \"1F64D-200D-2640-FE0F\",\n \"man-frowning\": \"1F64D-200D-2642-FE0F\",\n \"person_frowning\": \"1F64D-200D-2640-FE0F\",\n \"woman-pouting\": \"1F64E-200D-2640-FE0F\",\n \"man-pouting\": \"1F64E-200D-2642-FE0F\",\n \"person_with_pouting_face\": \"1F64E-200D-2640-FE0F\",\n \"pray\": \"1F64F\",\n \"rocket\": \"1F680\",\n \"helicopter\": \"1F681\",\n \"steam_locomotive\": \"1F682\",\n \"railway_car\": \"1F683\",\n \"bullettrain_side\": \"1F684\",\n \"bullettrain_front\": \"1F685\",\n \"train2\": \"1F686\",\n \"metro\": \"1F687\",\n \"light_rail\": \"1F688\",\n \"station\": \"1F689\",\n \"tram\": \"1F68A\",\n \"train\": \"1F68B\",\n \"bus\": \"1F68C\",\n \"oncoming_bus\": \"1F68D\",\n \"trolleybus\": \"1F68E\",\n \"busstop\": \"1F68F\",\n \"minibus\": \"1F690\",\n \"ambulance\": \"1F691\",\n \"fire_engine\": \"1F692\",\n \"police_car\": \"1F693\",\n \"oncoming_police_car\": \"1F694\",\n \"taxi\": \"1F695\",\n \"oncoming_taxi\": \"1F696\",\n \"car\": \"1F697\",\n \"oncoming_automobile\": \"1F698\",\n \"blue_car\": \"1F699\",\n \"truck\": \"1F69A\",\n \"articulated_lorry\": \"1F69B\",\n \"tractor\": \"1F69C\",\n \"monorail\": \"1F69D\",\n \"mountain_railway\": \"1F69E\",\n \"suspension_railway\": \"1F69F\",\n \"mountain_cableway\": \"1F6A0\",\n \"aerial_tramway\": \"1F6A1\",\n \"ship\": \"1F6A2\",\n \"woman-rowing-boat\": \"1F6A3-200D-2640-FE0F\",\n \"man-rowing-boat\": \"1F6A3-200D-2642-FE0F\",\n \"rowboat\": \"1F6A3-200D-2642-FE0F\",\n \"speedboat\": \"1F6A4\",\n \"traffic_light\": \"1F6A5\",\n \"vertical_traffic_light\": \"1F6A6\",\n \"construction\": \"1F6A7\",\n \"rotating_light\": \"1F6A8\",\n \"triangular_flag_on_post\": \"1F6A9\",\n \"door\": \"1F6AA\",\n \"no_entry_sign\": \"1F6AB\",\n \"smoking\": \"1F6AC\",\n \"no_smoking\": \"1F6AD\",\n \"put_litter_in_its_place\": \"1F6AE\",\n \"do_not_litter\": \"1F6AF\",\n \"potable_water\": \"1F6B0\",\n \"non-potable_water\": \"1F6B1\",\n \"bike\": \"1F6B2\",\n \"no_bicycles\": \"1F6B3\",\n \"woman-biking\": \"1F6B4-200D-2640-FE0F\",\n \"man-biking\": \"1F6B4-200D-2642-FE0F\",\n \"bicyclist\": \"1F6B4-200D-2642-FE0F\",\n \"woman-mountain-biking\": \"1F6B5-200D-2640-FE0F\",\n \"man-mountain-biking\": \"1F6B5-200D-2642-FE0F\",\n \"mountain_bicyclist\": \"1F6B5-200D-2642-FE0F\",\n \"woman-walking\": \"1F6B6-200D-2640-FE0F\",\n \"man-walking\": \"1F6B6-200D-2642-FE0F\",\n \"walking\": \"1F6B6-200D-2642-FE0F\",\n \"no_pedestrians\": \"1F6B7\",\n \"children_crossing\": \"1F6B8\",\n \"mens\": \"1F6B9\",\n \"womens\": \"1F6BA\",\n \"restroom\": \"1F6BB\",\n \"baby_symbol\": \"1F6BC\",\n \"toilet\": \"1F6BD\",\n \"wc\": \"1F6BE\",\n \"shower\": \"1F6BF\",\n \"bath\": \"1F6C0\",\n \"bathtub\": \"1F6C1\",\n \"passport_control\": \"1F6C2\",\n \"customs\": \"1F6C3\",\n \"baggage_claim\": \"1F6C4\",\n \"left_luggage\": \"1F6C5\",\n \"couch_and_lamp\": \"1F6CB-FE0F\",\n \"sleeping_accommodation\": \"1F6CC\",\n \"shopping_bags\": \"1F6CD-FE0F\",\n \"bellhop_bell\": \"1F6CE-FE0F\",\n \"bed\": \"1F6CF-FE0F\",\n \"place_of_worship\": \"1F6D0\",\n \"octagonal_sign\": \"1F6D1\",\n \"shopping_trolley\": \"1F6D2\",\n \"hammer_and_wrench\": \"1F6E0-FE0F\",\n \"shield\": \"1F6E1-FE0F\",\n \"oil_drum\": \"1F6E2-FE0F\",\n \"motorway\": \"1F6E3-FE0F\",\n \"railway_track\": \"1F6E4-FE0F\",\n \"motor_boat\": \"1F6E5-FE0F\",\n \"small_airplane\": \"1F6E9-FE0F\",\n \"airplane_departure\": \"1F6EB\",\n \"airplane_arriving\": \"1F6EC\",\n \"satellite\": \"1F6F0-FE0F\",\n \"passenger_ship\": \"1F6F3-FE0F\",\n \"scooter\": \"1F6F4\",\n \"motor_scooter\": \"1F6F5\",\n \"canoe\": \"1F6F6\",\n \"sled\": \"1F6F7\",\n \"flying_saucer\": \"1F6F8\",\n \"zipper_mouth_face\": \"1F910\",\n \"money_mouth_face\": \"1F911\",\n \"face_with_thermometer\": \"1F912\",\n \"nerd_face\": \"1F913\",\n \"thinking_face\": \"1F914\",\n \"face_with_head_bandage\": \"1F915\",\n \"robot_face\": \"1F916\",\n \"hugging_face\": \"1F917\",\n \"the_horns\": \"1F918\",\n \"call_me_hand\": \"1F919\",\n \"raised_back_of_hand\": \"1F91A\",\n \"left-facing_fist\": \"1F91B\",\n \"right-facing_fist\": \"1F91C\",\n \"handshake\": \"1F91D\",\n \"crossed_fingers\": \"1F91E\",\n \"i_love_you_hand_sign\": \"1F91F\",\n \"face_with_cowboy_hat\": \"1F920\",\n \"clown_face\": \"1F921\",\n \"nauseated_face\": \"1F922\",\n \"rolling_on_the_floor_laughing\": \"1F923\",\n \"drooling_face\": \"1F924\",\n \"lying_face\": \"1F925\",\n \"woman-facepalming\": \"1F926-200D-2640-FE0F\",\n \"man-facepalming\": \"1F926-200D-2642-FE0F\",\n \"face_palm\": \"1F926\",\n \"sneezing_face\": \"1F927\",\n \"face_with_raised_eyebrow\": \"1F928\",\n \"star-struck\": \"1F929\",\n \"zany_face\": \"1F92A\",\n \"shushing_face\": \"1F92B\",\n \"face_with_symbols_on_mouth\": \"1F92C\",\n \"face_with_hand_over_mouth\": \"1F92D\",\n \"face_vomiting\": \"1F92E\",\n \"exploding_head\": \"1F92F\",\n \"pregnant_woman\": \"1F930\",\n \"breast-feeding\": \"1F931\",\n \"palms_up_together\": \"1F932\",\n \"selfie\": \"1F933\",\n \"prince\": \"1F934\",\n \"man_in_tuxedo\": \"1F935\",\n \"mrs_claus\": \"1F936\",\n \"woman-shrugging\": \"1F937-200D-2640-FE0F\",\n \"man-shrugging\": \"1F937-200D-2642-FE0F\",\n \"shrug\": \"1F937\",\n \"woman-cartwheeling\": \"1F938-200D-2640-FE0F\",\n \"man-cartwheeling\": \"1F938-200D-2642-FE0F\",\n \"person_doing_cartwheel\": \"1F938\",\n \"woman-juggling\": \"1F939-200D-2640-FE0F\",\n \"man-juggling\": \"1F939-200D-2642-FE0F\",\n \"juggling\": \"1F939\",\n \"fencer\": \"1F93A\",\n \"woman-wrestling\": \"1F93C-200D-2640-FE0F\",\n \"man-wrestling\": \"1F93C-200D-2642-FE0F\",\n \"wrestlers\": \"1F93C\",\n \"woman-playing-water-polo\": \"1F93D-200D-2640-FE0F\",\n \"man-playing-water-polo\": \"1F93D-200D-2642-FE0F\",\n \"water_polo\": \"1F93D\",\n \"woman-playing-handball\": \"1F93E-200D-2640-FE0F\",\n \"man-playing-handball\": \"1F93E-200D-2642-FE0F\",\n \"handball\": \"1F93E\",\n \"wilted_flower\": \"1F940\",\n \"drum_with_drumsticks\": \"1F941\",\n \"clinking_glasses\": \"1F942\",\n \"tumbler_glass\": \"1F943\",\n \"spoon\": \"1F944\",\n \"goal_net\": \"1F945\",\n \"first_place_medal\": \"1F947\",\n \"second_place_medal\": \"1F948\",\n \"third_place_medal\": \"1F949\",\n \"boxing_glove\": \"1F94A\",\n \"martial_arts_uniform\": \"1F94B\",\n \"curling_stone\": \"1F94C\",\n \"croissant\": \"1F950\",\n \"avocado\": \"1F951\",\n \"cucumber\": \"1F952\",\n \"bacon\": \"1F953\",\n \"potato\": \"1F954\",\n \"carrot\": \"1F955\",\n \"baguette_bread\": \"1F956\",\n \"green_salad\": \"1F957\",\n \"shallow_pan_of_food\": \"1F958\",\n \"stuffed_flatbread\": \"1F959\",\n \"egg\": \"1F95A\",\n \"glass_of_milk\": \"1F95B\",\n \"peanuts\": \"1F95C\",\n \"kiwifruit\": \"1F95D\",\n \"pancakes\": \"1F95E\",\n \"dumpling\": \"1F95F\",\n \"fortune_cookie\": \"1F960\",\n \"takeout_box\": \"1F961\",\n \"chopsticks\": \"1F962\",\n \"bowl_with_spoon\": \"1F963\",\n \"cup_with_straw\": \"1F964\",\n \"coconut\": \"1F965\",\n \"broccoli\": \"1F966\",\n \"pie\": \"1F967\",\n \"pretzel\": \"1F968\",\n \"cut_of_meat\": \"1F969\",\n \"sandwich\": \"1F96A\",\n \"canned_food\": \"1F96B\",\n \"crab\": \"1F980\",\n \"lion_face\": \"1F981\",\n \"scorpion\": \"1F982\",\n \"turkey\": \"1F983\",\n \"unicorn_face\": \"1F984\",\n \"eagle\": \"1F985\",\n \"duck\": \"1F986\",\n \"bat\": \"1F987\",\n \"shark\": \"1F988\",\n \"owl\": \"1F989\",\n \"fox_face\": \"1F98A\",\n \"butterfly\": \"1F98B\",\n \"deer\": \"1F98C\",\n \"gorilla\": \"1F98D\",\n \"lizard\": \"1F98E\",\n \"rhinoceros\": \"1F98F\",\n \"shrimp\": \"1F990\",\n \"squid\": \"1F991\",\n \"giraffe_face\": \"1F992\",\n \"zebra_face\": \"1F993\",\n \"hedgehog\": \"1F994\",\n \"sauropod\": \"1F995\",\n \"t-rex\": \"1F996\",\n \"cricket\": \"1F997\",\n \"cheese_wedge\": \"1F9C0\",\n \"face_with_monocle\": \"1F9D0\",\n \"adult\": \"1F9D1\",\n \"child\": \"1F9D2\",\n \"older_adult\": \"1F9D3\",\n \"bearded_person\": \"1F9D4\",\n \"person_with_headscarf\": \"1F9D5\",\n \"woman_in_steamy_room\": \"1F9D6-200D-2640-FE0F\",\n \"man_in_steamy_room\": \"1F9D6-200D-2642-FE0F\",\n \"person_in_steamy_room\": \"1F9D6-200D-2642-FE0F\",\n \"woman_climbing\": \"1F9D7-200D-2640-FE0F\",\n \"man_climbing\": \"1F9D7-200D-2642-FE0F\",\n \"person_climbing\": \"1F9D7-200D-2640-FE0F\",\n \"woman_in_lotus_position\": \"1F9D8-200D-2640-FE0F\",\n \"man_in_lotus_position\": \"1F9D8-200D-2642-FE0F\",\n \"person_in_lotus_position\": \"1F9D8-200D-2640-FE0F\",\n \"female_mage\": \"1F9D9-200D-2640-FE0F\",\n \"male_mage\": \"1F9D9-200D-2642-FE0F\",\n \"mage\": \"1F9D9-200D-2640-FE0F\",\n \"female_fairy\": \"1F9DA-200D-2640-FE0F\",\n \"male_fairy\": \"1F9DA-200D-2642-FE0F\",\n \"fairy\": \"1F9DA-200D-2640-FE0F\",\n \"female_vampire\": \"1F9DB-200D-2640-FE0F\",\n \"male_vampire\": \"1F9DB-200D-2642-FE0F\",\n \"vampire\": \"1F9DB-200D-2640-FE0F\",\n \"mermaid\": \"1F9DC-200D-2640-FE0F\",\n \"merman\": \"1F9DC-200D-2642-FE0F\",\n \"merperson\": \"1F9DC-200D-2642-FE0F\",\n \"female_elf\": \"1F9DD-200D-2640-FE0F\",\n \"male_elf\": \"1F9DD-200D-2642-FE0F\",\n \"elf\": \"1F9DD-200D-2642-FE0F\",\n \"female_genie\": \"1F9DE-200D-2640-FE0F\",\n \"male_genie\": \"1F9DE-200D-2642-FE0F\",\n \"genie\": \"1F9DE-200D-2642-FE0F\",\n \"female_zombie\": \"1F9DF-200D-2640-FE0F\",\n \"male_zombie\": \"1F9DF-200D-2642-FE0F\",\n \"zombie\": \"1F9DF-200D-2642-FE0F\",\n \"brain\": \"1F9E0\",\n \"orange_heart\": \"1F9E1\",\n \"billed_cap\": \"1F9E2\",\n \"scarf\": \"1F9E3\",\n \"gloves\": \"1F9E4\",\n \"coat\": \"1F9E5\",\n \"socks\": \"1F9E6\",\n \"bangbang\": \"203C-FE0F\",\n \"interrobang\": \"2049-FE0F\",\n \"tm\": \"2122-FE0F\",\n \"information_source\": \"2139-FE0F\",\n \"left_right_arrow\": \"2194-FE0F\",\n \"arrow_up_down\": \"2195-FE0F\",\n \"arrow_upper_left\": \"2196-FE0F\",\n \"arrow_upper_right\": \"2197-FE0F\",\n \"arrow_lower_right\": \"2198-FE0F\",\n \"arrow_lower_left\": \"2199-FE0F\",\n \"leftwards_arrow_with_hook\": \"21A9-FE0F\",\n \"arrow_right_hook\": \"21AA-FE0F\",\n \"watch\": \"231A\",\n \"hourglass\": \"231B\",\n \"keyboard\": \"2328-FE0F\",\n \"eject\": \"23CF-FE0F\",\n \"fast_forward\": \"23E9\",\n \"rewind\": \"23EA\",\n \"arrow_double_up\": \"23EB\",\n \"arrow_double_down\": \"23EC\",\n \"black_right_pointing_double_triangle_with_vertical_bar\": \"23ED-FE0F\",\n \"black_left_pointing_double_triangle_with_vertical_bar\": \"23EE-FE0F\",\n \"black_right_pointing_triangle_with_double_vertical_bar\": \"23EF-FE0F\",\n \"alarm_clock\": \"23F0\",\n \"stopwatch\": \"23F1-FE0F\",\n \"timer_clock\": \"23F2-FE0F\",\n \"hourglass_flowing_sand\": \"23F3\",\n \"double_vertical_bar\": \"23F8-FE0F\",\n \"black_square_for_stop\": \"23F9-FE0F\",\n \"black_circle_for_record\": \"23FA-FE0F\",\n \"m\": \"24C2-FE0F\",\n \"black_small_square\": \"25AA-FE0F\",\n \"white_small_square\": \"25AB-FE0F\",\n \"arrow_forward\": \"25B6-FE0F\",\n \"arrow_backward\": \"25C0-FE0F\",\n \"white_medium_square\": \"25FB-FE0F\",\n \"black_medium_square\": \"25FC-FE0F\",\n \"white_medium_small_square\": \"25FD\",\n \"black_medium_small_square\": \"25FE\",\n \"sunny\": \"2600-FE0F\",\n \"cloud\": \"2601-FE0F\",\n \"umbrella\": \"2602-FE0F\",\n \"snowman\": \"2603-FE0F\",\n \"comet\": \"2604-FE0F\",\n \"phone\": \"260E-FE0F\",\n \"ballot_box_with_check\": \"2611-FE0F\",\n \"umbrella_with_rain_drops\": \"2614\",\n \"coffee\": \"2615\",\n \"shamrock\": \"2618-FE0F\",\n \"point_up\": \"261D-FE0F\",\n \"skull_and_crossbones\": \"2620-FE0F\",\n \"radioactive_sign\": \"2622-FE0F\",\n \"biohazard_sign\": \"2623-FE0F\",\n \"orthodox_cross\": \"2626-FE0F\",\n \"star_and_crescent\": \"262A-FE0F\",\n \"peace_symbol\": \"262E-FE0F\",\n \"yin_yang\": \"262F-FE0F\",\n \"wheel_of_dharma\": \"2638-FE0F\",\n \"white_frowning_face\": \"2639-FE0F\",\n \"relaxed\": \"263A-FE0F\",\n \"female_sign\": \"2640-FE0F\",\n \"male_sign\": \"2642-FE0F\",\n \"aries\": \"2648\",\n \"taurus\": \"2649\",\n \"gemini\": \"264A\",\n \"cancer\": \"264B\",\n \"leo\": \"264C\",\n \"virgo\": \"264D\",\n \"libra\": \"264E\",\n \"scorpius\": \"264F\",\n \"sagittarius\": \"2650\",\n \"capricorn\": \"2651\",\n \"aquarius\": \"2652\",\n \"pisces\": \"2653\",\n \"spades\": \"2660-FE0F\",\n \"clubs\": \"2663-FE0F\",\n \"hearts\": \"2665-FE0F\",\n \"diamonds\": \"2666-FE0F\",\n \"hotsprings\": \"2668-FE0F\",\n \"recycle\": \"267B-FE0F\",\n \"wheelchair\": \"267F\",\n \"hammer_and_pick\": \"2692-FE0F\",\n \"anchor\": \"2693\",\n \"crossed_swords\": \"2694-FE0F\",\n \"medical_symbol\": \"2695-FE0F\",\n \"scales\": \"2696-FE0F\",\n \"alembic\": \"2697-FE0F\",\n \"gear\": \"2699-FE0F\",\n \"atom_symbol\": \"269B-FE0F\",\n \"fleur_de_lis\": \"269C-FE0F\",\n \"warning\": \"26A0-FE0F\",\n \"zap\": \"26A1\",\n \"white_circle\": \"26AA\",\n \"black_circle\": \"26AB\",\n \"coffin\": \"26B0-FE0F\",\n \"funeral_urn\": \"26B1-FE0F\",\n \"soccer\": \"26BD\",\n \"baseball\": \"26BE\",\n \"snowman_without_snow\": \"26C4\",\n \"partly_sunny\": \"26C5\",\n \"thunder_cloud_and_rain\": \"26C8-FE0F\",\n \"ophiuchus\": \"26CE\",\n \"pick\": \"26CF-FE0F\",\n \"helmet_with_white_cross\": \"26D1-FE0F\",\n \"chains\": \"26D3-FE0F\",\n \"no_entry\": \"26D4\",\n \"shinto_shrine\": \"26E9-FE0F\",\n \"church\": \"26EA\",\n \"mountain\": \"26F0-FE0F\",\n \"umbrella_on_ground\": \"26F1-FE0F\",\n \"fountain\": \"26F2\",\n \"golf\": \"26F3\",\n \"ferry\": \"26F4-FE0F\",\n \"boat\": \"26F5\",\n \"skier\": \"26F7-FE0F\",\n \"ice_skate\": \"26F8-FE0F\",\n \"woman-bouncing-ball\": \"26F9-FE0F-200D-2640-FE0F\",\n \"man-bouncing-ball\": \"26F9-FE0F-200D-2642-FE0F\",\n \"person_with_ball\": \"26F9-FE0F-200D-2642-FE0F\",\n \"tent\": \"26FA\",\n \"fuelpump\": \"26FD\",\n \"scissors\": \"2702-FE0F\",\n \"white_check_mark\": \"2705\",\n \"airplane\": \"2708-FE0F\",\n \"email\": \"2709-FE0F\",\n \"fist\": \"270A\",\n \"hand\": \"270B\",\n \"v\": \"270C-FE0F\",\n \"writing_hand\": \"270D-FE0F\",\n \"pencil2\": \"270F-FE0F\",\n \"black_nib\": \"2712-FE0F\",\n \"heavy_check_mark\": \"2714-FE0F\",\n \"heavy_multiplication_x\": \"2716-FE0F\",\n \"latin_cross\": \"271D-FE0F\",\n \"star_of_david\": \"2721-FE0F\",\n \"sparkles\": \"2728\",\n \"eight_spoked_asterisk\": \"2733-FE0F\",\n \"eight_pointed_black_star\": \"2734-FE0F\",\n \"snowflake\": \"2744-FE0F\",\n \"sparkle\": \"2747-FE0F\",\n \"x\": \"274C\",\n \"negative_squared_cross_mark\": \"274E\",\n \"question\": \"2753\",\n \"grey_question\": \"2754\",\n \"grey_exclamation\": \"2755\",\n \"exclamation\": \"2757\",\n \"heavy_heart_exclamation_mark_ornament\": \"2763-FE0F\",\n \"heart\": \"2764-FE0F\",\n \"heavy_plus_sign\": \"2795\",\n \"heavy_minus_sign\": \"2796\",\n \"heavy_division_sign\": \"2797\",\n \"arrow_right\": \"27A1-FE0F\",\n \"curly_loop\": \"27B0\",\n \"loop\": \"27BF\",\n \"arrow_heading_up\": \"2934-FE0F\",\n \"arrow_heading_down\": \"2935-FE0F\",\n \"arrow_left\": \"2B05-FE0F\",\n \"arrow_up\": \"2B06-FE0F\",\n \"arrow_down\": \"2B07-FE0F\",\n \"black_large_square\": \"2B1B\",\n \"white_large_square\": \"2B1C\",\n \"star\": \"2B50\",\n \"o\": \"2B55\",\n \"wavy_dash\": \"3030-FE0F\",\n \"part_alternation_mark\": \"303D-FE0F\",\n \"congratulations\": \"3297-FE0F\",\n \"secret\": \"3299-FE0F\"\n};\n"],"names":[],"mappings":"qLAsB0B,CACtB,MACY,0BACE,CACN,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,kCAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,wBAGR,SACe,uBACG,CACV,YAGR,SACe,mBACG,CACV,0BAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,6BAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,2BAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,0BAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,iCAGR,SACe,mBACG,CACV,iCAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,eAGR,SACe,uBACG,CACV,wBAGR,SACe,mBACG,CACV,2BAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,+BAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,0BAGR,SACe,mBACG,CACV,2BAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,8BAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,UAGR,SACe,uBACG,CACV,yBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,gBAGR,SACe,kCACG,CACV,gBAGR,SACe,kCACG,CACV,kBAGR,SACe,8BACG,CACV,iBAGR,SACe,8BACG,CACV,mBAGR,SACe,8BACG,CACV,iBAGR,SACe,8BACG,CACV,mBAGR,SACe,kCACG,CACV,eAGR,SACe,kCACG,CACV,iBAGR,SACe,8BACG,CACV,gBAGR,SACe,8BACG,CACV,kBAGR,SACe,8BACG,CACV,cAGR,SACe,8BACG,CACV,gBAGR,SACe,8BACG,CACV,kBAGR,SACe,8BACG,CACV,oBAGR,SACe,8BACG,CACV,wBAGR,SACe,8BACG,CACV,0BAGR,SACe,8BACG,CACV,uBAGR,SACe,8BACG,CACV,yBAGR,SACe,8BACG,CACV,mBAGR,SACe,8BACG,CACV,qBAGR,SACe,8BACG,CACV,sBAGR,SACe,8BACG,CACV,wBAGR,SACe,8BACG,CACV,gBAGR,SACe,8BACG,CACV,kBAGR,SACe,8BACG,CACV,gBAGR,SACe,8BACG,CACV,kBAGR,SACe,kCACG,CACV,eAGR,SACe,kCACG,CACV,iBAGR,SACe,8BACG,CACV,mBAGR,SACe,8BACG,CACV,qBAGR,SACe,8BACG,CACV,qBAGR,SACe,8BACG,CACV,uBAGR,SACe,kCACG,CACV,sBACA,QAGR,SACe,kCACG,CACV,0BAGR,SACe,uCACG,CACV,iBACA,kBAGR,SACe,uCACG,CACV,qBAGR,SACe,kCACG,CACV,aACA,cAGR,SACe,kCACG,CACV,iBAGR,SACe,kCACG,CACV,2BACA,wBAGR,SACe,kCACG,CACV,+BAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,kCACG,CACV,qBACA,oBAGR,SACe,kCACG,CACV,yBAGR,SACe,mBACG,CACV,wBAGR,SACe,mBACG,CACV,0BAGR,SACe,mBACG,CACV,mBAGR,SACe,kCACG,CACV,mBACA,2BAGR,SACe,kCACG,CACV,uBAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,cAGR,SACe,kCACG,CACV,cACA,SAGR,SACe,kCACG,CACV,cAGR,SACe,kCACG,CACV,eACA,UAGR,SACe,kCACG,CACV,eAGR,SACe,kCACG,CACV,iBACA,YAGR,SACe,kCACG,CACV,iBAGR,SACe,kCACG,CACV,YAGR,SACe,kCACG,CACV,SACA,cAGR,SACe,kCACG,CACV,eAGR,SACe,kCACG,CACV,WACA,QAGR,SACe,kCACG,CACV,iBAGR,SACe,kCACG,CACV,aACA,UAGR,SACe,kCACG,CACV,kBAGR,SACe,kCACG,CACV,cACA,WAGR,SACe,kCACG,CACV,iBAGR,SACe,kCACG,CACV,iBACA,oBAGR,SACe,kCACG,CACV,gBAGR,SACe,kCACG,CACV,gBACA,6BAGR,SACe,kCACG,CACV,qBAGR,SACe,kCACG,CACV,qBACA,YAGR,SACe,kCACG,CACV,qBAGR,SACe,kCACG,CACV,qBACA,aAGR,SACe,kCACG,CACV,qBAGR,SACe,kCACG,CACV,qBACA,4BAGR,SACe,kCACG,CACV,qBAGR,SACe,kCACG,CACV,qBACA,iBAGR,SACe,kCACG,CACV,aACA,QAGR,SACe,kCACG,CACV,iBAGR,SACe,mBACG,CACV,cAGR,SACe,kCACG,CACV,oBAGR,SACe,kCACG,CACV,sBAGR,SACe,mBACG,CACV,UAGR,SACe,kCACG,CACV,kBAGR,SACe,kCACG,CACV,oBAGR,SACe,kCACG,CACV,wBAGR,SACe,kCACG,CACV,wBACA,YAGR,SACe,kCACG,CACV,wBAGR,SACe,kCACG,CACV,wBACA,YAGR,SACe,kCACG,CACV,cACA,YAGR,SACe,kCACG,CACV,kBAGR,SACe,kCACG,CACV,cACA,WAGR,SACe,kCACG,CACV,kBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,gBAGR,SACe,kCACG,CACV,iCAGR,SACe,kCACG,CACV,iCACA,YAGR,SACe,kCACG,CACV,yBAGR,SACe,kCACG,CACV,qBACA,0BAGR,SACe,kCACG,CACV,iBACA,oBAGR,SACe,kCACG,CACV,iBAGR,SACe,kCACG,CACV,0BACA,6BAGR,SACe,kCACG,CACV,0BAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,2BAGR,SACe,wBACG,CACV,oCAGR,SACe,wBACG,CACV,gCAGR,SACe,mBACG,CACV,uBAGR,SACe,mBACG,CACV,wBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,iBAGR,SACe,uBACG,CACV,UAGR,SACe,mBACG,CACV,gBAGR,SACe,uCACG,CACV,cACA,WAGR,SACe,uCACG,CACV,kBAGR,SACe,kCACG,CACV,cACA,WAGR,SACe,kCACG,CACV,kBAGR,SACe,kCACG,CACV,kBACA,YAGR,SACe,kCACG,CACV,sBAGR,SACe,kCACG,CACV,eACA,YAGR,SACe,kCACG,CACV,mBAGR,SACe,sCACG,CACV,oBACA,qBAGR,SACe,sCACG,CACV,wBAGR,SACe,uCACG,CACV,sBACA,kBAGR,SACe,uCACG,CACV,0BAGR,SACe,kCACG,CACV,aACA,cAGR,SACe,kCACG,CACV,iBAGR,SACe,kCACG,CACV,sBACA,uBAGR,SACe,kCACG,CACV,0BAGR,SACe,wBACG,CACV,eAGR,SACe,wBACG,CACV,sBAGR,SACe,mBACG,CACV,2BAGR,SACe,kCACG,CACV,qBAGR,SACe,kCACG,CACV,uBAGR,SACe,mBACG,CACV,cAGR,SACe,kCACG,CACV,kBAGR,SACe,kCACG,CACV,oBAGR,SACe,mBACG,CACV,eAGR,SACe,kCACG,CACV,2BAGR,SACe,kCACG,CACV,6BAGR,SACe,mBACG,CACV,aAGR,SACe,kCACG,CACV,yBAGR,SACe,kCACG,CACV,2BAGR,SACe,mBACG,CACV,aAGR,SACe,kCACG,CACV,iBAGR,SACe,kCACG,CACV,mBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,0BAGR,SACe,mBACG,CACV,4BAGR,SACe,wDACG,CACV,iBACA,eAGR,SACe,wDACG,CACV,iBAGR,SACe,wDACG,CACV,qBAGR,SACe,6CACG,CACV,kBACA,sBAGR,SACe,6CACG,CACV,kBAGR,SACe,6CACG,CACV,sBAGR,SACe,yCACG,CACV,gBACA,WAGR,SACe,yCACG,CACV,mBAGR,SACe,oDACG,CACV,uBAGR,SACe,oDACG,CACV,sBAGR,SACe,oDACG,CACV,wBAGR,SACe,yCACG,CACV,gBAGR,SACe,yCACG,CACV,iBAGR,SACe,oDACG,CACV,qBAGR,SACe,oDACG,CACV,oBAGR,SACe,oDACG,CACV,sBAGR,SACe,yCACG,CACV,oBAGR,SACe,yCACG,CACV,qBAGR,SACe,oDACG,CACV,yBAGR,SACe,oDACG,CACV,wBAGR,SACe,oDACG,CACV,0BAGR,SACe,8BACG,CACV,YAGR,SACe,yCACG,CACV,gBAGR,SACe,8BACG,CACV,aAGR,SACe,yCACG,CACV,iBAGR,SACe,yCACG,CACV,kBAGR,SACe,8BACG,CACV,cAGR,SACe,yCACG,CACV,kBAGR,SACe,8BACG,CACV,eAGR,SACe,yCACG,CACV,mBAGR,SACe,yCACG,CACV,oBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,gBAGR,SACe,uBACG,CACV,aAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,eAGR,SACe,uBACG,CACV,MAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,iBAGR,SACe,wBACG,CACV,qCAGR,SACe,kBACG,CACV,SAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,OAGR,SACe,mBACG,CACV,OAGR,SACe,kBACG,CACV,SAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,wBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,yBAGR,SACe,uBACG,CACV,iBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,SAGR,SACe,wBACG,CACV,QAGR,SACe,wCACG,CACV,yBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,uBACG,CACV,UAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,qBAGR,SACe,uBACG,CACV,0CAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,mBAGR,SACe,wBACG,CACV,uBAGR,SACe,wBACG,CACV,uBAGR,SACe,mBACG,CACV,oBAGR,SACe,wBACG,CACV,SAGR,SACe,mBACG,CACV,eAGR,SACe,wBACG,CACV,oBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,UAGR,SACe,wBACG,CACV,kBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,eAGR,SACe,uBACG,CACV,4BAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAKhB,MACY,0BACE,CACN,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,OAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,YAGR,SACe,wBACG,CACV,aAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,YAGR,SACe,wBACG,CACV,kBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,YAGR,SACe,wBACG,CACV,WAGR,SACe,wBACG,CACV,eAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,iBAGR,SACe,wBACG,CACV,YAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,SAGR,SACe,uBACG,CACV,aAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,aAKhB,MACY,sBACE,CACN,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,SAGR,SACe,wBACG,CACV,eAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,wBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,kBAGR,SACe,kBACG,CACV,WAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,eAGR,SACe,wBACG,CACV,qBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,cAKhB,MACY,yBACE,CACN,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,yBAGR,SACe,wBACG,CACV,cAGR,SACe,mBACG,CACV,UAGR,SACe,wBACG,CACV,yBAGR,SACe,uBACG,CACV,aAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,eAGR,SACe,wBACG,CACV,YAGR,SACe,wBACG,CACV,wBAGR,SACe,wBACG,CACV,WAGR,SACe,wBACG,CACV,kBAGR,SACe,wBACG,CACV,kBAGR,SACe,wBACG,CACV,YAGR,SACe,wBACG,CACV,uBAGR,SACe,wBACG,CACV,0BAGR,SACe,wBACG,CACV,oBAGR,SACe,wBACG,CACV,cAGR,SACe,wBACG,CACV,4BAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,sBAGR,SACe,kBACG,CACV,WAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,cAGR,SACe,uBACG,CACV,kBAGR,SACe,mBACG,CACV,UAGR,SACe,kBACG,CACV,aAGR,SACe,kBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,2BAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,oBAGR,SACe,uBACG,CACV,eAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,oBAGR,SACe,wBACG,CACV,uBAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,wBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,wBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,YAGR,SACe,wBACG,CACV,aAGR,SACe,wBACG,CACV,kBAGR,SACe,kBACG,CACV,aAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,2BAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,mBAGR,SACe,kBACG,CACV,WAGR,SACe,kBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,cAGR,SACe,wBACG,CACV,mBAGR,SACe,uBACG,CACV,UAGR,SACe,wBACG,CACV,eAGR,SACe,mBACG,CACV,SAGR,SACe,uBACG,CACV,aAGR,SACe,wBACG,CACV,mBAGR,SACe,mBACG,CACV,uBAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,uBAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,mBAGR,SACe,wBACG,CACV,cAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,kBAGR,SACe,wBACG,CACV,iBAGR,SACe,mBACG,CACV,SAGR,SACe,wBACG,CACV,QAGR,SACe,wBACG,CACV,mBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,YAGR,SACe,kBACG,CACV,cAGR,SACe,kBACG,CACV,2BAGR,SACe,kBACG,CACV,UAGR,SACe,kBACG,CACV,gBAGR,SACe,uBACG,CACV,cAGR,SACe,uBACG,CACV,gBAGR,SACe,wBACG,CACV,sBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,uBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,wBAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,uBAGR,SACe,mBACG,CACV,iCAGR,SACe,mBACG,CACV,gCAGR,SACe,wBACG,CACV,gBAGR,SACe,uBACG,CACV,UAGR,SACe,mBACG,CACV,wBAGR,SACe,mBACG,CACV,kBAGR,SACe,kBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,uBACG,CACV,UAGR,SACe,kBACG,CACV,iBAGR,SACe,uBACG,CACV,2BAGR,SACe,wBACG,CACV,iBAGR,SACe,wBACG,CACV,iBAGR,SACe,wBACG,CACV,sBAGR,SACe,wBACG,CACV,eAGR,SACe,wBACG,CACV,eAGR,SACe,wBACG,CACV,cAGR,SACe,wBACG,CACV,YAGR,SACe,wBACG,CACV,QAGR,SACe,wBACG,CACV,sBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,oBAGR,SACe,uBACG,CACV,aAGR,SACe,kBACG,CACV,6BAGR,SACe,uBACG,CACV,uBAGR,SACe,kBACG,CACV,QAGR,SACe,uBACG,CACV,cAGR,SACe,uBACG,CACV,YAGR,SACe,kBACG,CACV,yBAGR,SACe,uBACG,CACV,UAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,YAKhB,MACY,oBACE,CACN,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,aAGR,SACe,kBACG,CACV,aAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,SAGR,SACe,wBACG,CACV,oBAGR,SACe,wBACG,CACV,sBAGR,SACe,mBACG,CACV,WAGR,SACe,wBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,uBAGR,SACe,mBACG,CACV,sBAGR,SACe,kBACG,CACV,WAGR,SACe,kBACG,CACV,aAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,gCAGR,SACe,mBACG,CACV,8BAGR,SACe,mBACG,CACV,iCAGR,SACe,mBACG,CACV,sCAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,SAGR,SACe,kBACG,CACV,SAGR,SACe,uBACG,CACV,cAGR,SACe,mBACG,CACV,0BAGR,SACe,mBACG,CACV,4BAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,eAGR,SACe,wBACG,CACV,aAGR,SACe,mBACG,CACV,aAGR,SACe,uBACG,CACV,WAGR,SACe,uBACG,CACV,WAGR,SACe,uBACG,CACV,aAGR,SACe,uBACG,CACV,UAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,2BAKhB,MACY,iBACE,CACN,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,UAGR,SACe,wBACG,CACV,sBAGR,SACe,wBACG,CACV,iBAGR,SACe,wBACG,CACV,kBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,YAGR,SACe,uBACG,CACV,UAGR,SACe,mBACG,CACV,uBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,aAGR,SACe,wBACG,CACV,qBAGR,SACe,wBACG,CACV,YAGR,SACe,uBACG,CACV,aAGR,SACe,wBACG,CACV,uBAGR,SACe,wBACG,CACV,cAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,OAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,iBAGR,SACe,wBACG,CACV,gBAGR,SACe,wBACG,CACV,mBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,OAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,sBAGR,SACe,wBACG,CACV,WAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,mCAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,cAGR,SACe,wBACG,CACV,wBAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,aAGR,SACe,wBACG,CACV,UAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,sBAGR,SACe,uBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,wBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,YAGR,SACe,wBACG,CACV,2BAGR,SACe,uBACG,CACV,YAGR,SACe,uBACG,CACV,cAGR,SACe,wBACG,CACV,4BAGR,SACe,wBACG,CACV,6BAGR,SACe,wBACG,CACV,0BAGR,SACe,wBACG,CACV,sBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,qBAGR,SACe,wBACG,CACV,wBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,aAGR,SACe,wBACG,CACV,oBAGR,SACe,wBACG,CACV,wBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,6BAGR,SACe,mBACG,CACV,+BAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,cAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,cAGR,SACe,wBACG,CACV,sBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,qBAGR,SACe,uBACG,CACV,aAGR,SACe,wBACG,CACV,kBAGR,SACe,wBACG,CACV,iBAGR,SACe,wBACG,CACV,gBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,QAGR,SACe,wBACG,CACV,YAGR,SACe,mBACG,CACV,WAGR,SACe,uBACG,CACV,SAGR,SACe,uBACG,CACV,oBAGR,SACe,wBACG,CACV,sBAGR,SACe,wBACG,CACV,iBAGR,SACe,uBACG,CACV,mBAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,kBAGR,SACe,wBACG,CACV,WAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,iBAGR,SACe,uBACG,CACV,SAGR,SACe,wBACG,CACV,gBAGR,SACe,uBACG,CACV,YAGR,SACe,uBACG,CACV,WAGR,SACe,mBACG,CACV,SAGR,SACe,uBACG,CACV,WAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,YAGR,SACe,uBACG,CACV,WAGR,SACe,uBACG,CACV,gBAGR,SACe,mBACG,CACV,UAGR,SACe,wBACG,CACV,aAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,uBAKhB,MACY,iBACE,CACN,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,4BAGR,SACe,mBACG,CACV,kBAGR,SACe,kBACG,CACV,eAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,aAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,OAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,iBAGR,SACe,uBACG,CACV,YAGR,SACe,mBACG,CACV,sBAGR,SACe,kBACG,CACV,aAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,gBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,sBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,aAGR,SACe,uBACG,CACV,qBAGR,SACe,uBACG,CACV,mBAGR,SACe,uBACG,CACV,aAGR,SACe,uBACG,CACV,sBAGR,SACe,uBACG,CACV,gBAGR,SACe,uBACG,CACV,sBAGR,SACe,uBACG,CACV,eAGR,SACe,uBACG,CACV,qBAGR,SACe,uBACG,CACV,eAGR,SACe,uBACG,CACV,qBAGR,SACe,uBACG,CACV,kBAGR,SACe,uBACG,CACV,qBAGR,SACe,uBACG,CACV,8BAGR,SACe,uBACG,CACV,qBAGR,SACe,uBACG,CACV,qBAGR,SACe,uBACG,CACV,uBAGR,SACe,mBACG,CACV,qBAGR,SACe,mBACG,CACV,4BAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,OAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,qBAGR,SACe,uBACG,CACV,gBAGR,SACe,wBACG,CACV,cAGR,SACe,uBACG,CACV,kBAGR,SACe,uBACG,CACV,oBAGR,SACe,uBACG,CACV,aAGR,SACe,uBACG,CACV,gBAGR,SACe,uBACG,CACV,mBAGR,SACe,uBACG,CACV,sBAGR,SACe,uBACG,CACV,iBAGR,SACe,mBACG,CACV,+BAGR,SACe,mBACG,CACV,qBAGR,SACe,kBACG,CACV,UAGR,SACe,kBACG,CACV,WAGR,SACe,kBACG,CACV,WAGR,SACe,kBACG,CACV,WAGR,SACe,kBACG,CACV,QAGR,SACe,kBACG,CACV,UAGR,SACe,kBACG,CACV,UAGR,SACe,kBACG,CACV,aAGR,SACe,kBACG,CACV,gBAGR,SACe,kBACG,CACV,cAGR,SACe,kBACG,CACV,aAGR,SACe,kBACG,CACV,WAGR,SACe,kBACG,CACV,cAGR,SACe,mBACG,CACV,8BAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,eAGR,SACe,uBACG,CACV,kBAGR,SACe,kBACG,CACV,iBAGR,SACe,uBACG,CACV,2DAGR,SACe,uBACG,CACV,2DAGR,SACe,uBACG,CACV,mBAGR,SACe,kBACG,CACV,WAGR,SACe,uBACG,CACV,0DAGR,SACe,mBACG,CACV,mBAGR,SACe,kBACG,CACV,oBAGR,SACe,mBACG,CACV,qBAGR,SACe,kBACG,CACV,sBAGR,SACe,uBACG,CACV,wBAGR,SACe,uBACG,CACV,0BAGR,SACe,uBACG,CACV,4BAGR,SACe,uBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,oBAGR,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,qBAGR,SACe,uBACG,CACV,gBAGR,SACe,uBACG,CACV,cAGR,SACe,uBACG,CACV,mBAGR,SACe,uBACG,CACV,YAGR,SACe,uBACG,CACV,iBAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,aAGR,SACe,kBACG,CACV,MAGR,SACe,kBACG,CACV,qBAGR,SACe,uBACG,CACV,0BAGR,SACe,uBACG,CACV,qBAGR,SACe,uBACG,CACV,2BAGR,SACe,kBACG,CACV,MAGR,SACe,kBACG,CACV,gCAGR,SACe,kBACG,CACV,oBAGR,SACe,kBACG,CACV,qBAGR,SACe,kBACG,CACV,wBAGR,SACe,kBACG,CACV,eAGR,SACe,kBACG,CACV,SAGR,SACe,uBACG,CACV,0BAGR,SACe,uBACG,CACV,0BAGR,SACe,uBACG,CACV,6BAGR,SACe,uBACG,CACV,YAGR,SACe,uBACG,CACV,aAGR,SACe,uBACG,CACV,gBAGR,SACe,kBACG,CACV,aAGR,SACe,kBACG,CACV,kBAGR,SACe,kBACG,CACV,qBAGR,SACe,kBACG,CACV,gBAGR,SACe,uBACG,CACV,cAGR,SACe,uBACG,CACV,cAGR,SACe,uBACG,CACV,eAGR,SACe,uBACG,CACV,OAGR,SACe,4BACG,CACV,SAGR,SACe,4BACG,CACV,gBAGR,SACe,4BACG,CACV,SAGR,SACe,4BACG,CACV,QAGR,SACe,4BACG,CACV,QAGR,SACe,4BACG,CACV,UAGR,SACe,4BACG,CACV,SAGR,SACe,4BACG,CACV,SAGR,SACe,4BACG,CACV,QAGR,SACe,4BACG,CACV,UAGR,SACe,4BACG,CACV,UAGR,SACe,4BACG,CACV,SAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,YAGR,SACe,mBACG,CACV,QAGR,SACe,wBACG,CACV,MAGR,SACe,mBACG,CACV,OAGR,SACe,wBACG,CACV,MAGR,SACe,mBACG,CACV,OAGR,SACe,mBACG,CACV,SAGR,SACe,mBACG,CACV,SAGR,SACe,uBACG,CACV,uBAGR,SACe,mBACG,CACV,OAGR,SACe,uBACG,CACV,MAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,OAGR,SACe,wBACG,CACV,OAGR,SACe,mBACG,CACV,OAGR,SACe,wBACG,CACV,YAGR,SACe,mBACG,CACV,QAGR,SACe,mBACG,CACV,OAGR,SACe,mBACG,CACV,OAGR,SACe,mBACG,CACV,SAGR,SACe,wBACG,CACV,OAGR,SACe,wBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,wBAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,WAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,uBACG,CACV,oBAGR,SACe,uBACG,CACV,WAGR,SACe,mBACG,CACV,UAGR,SACe,mBACG,CACV,UAGR,SACe,uBACG,CACV,uBAGR,SACe,uBACG,CACV,uBAGR,SACe,uBACG,CACV,wBAGR,SACe,uBACG,CACV,wBAGR,SACe,kBACG,CACV,8BAGR,SACe,kBACG,CACV,8BAGR,SACe,kBACG,CACV,uBAGR,SACe,kBACG,CACV,uBAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,uBAGR,SACe,mBACG,CACV,yBAGR,SACe,mBACG,CACV,uBAGR,SACe,mBACG,CACV,uBAGR,SACe,mBACG,CACV,4BAGR,SACe,mBACG,CACV,oCAGR,SACe,mBACG,CACV,iBAGR,SACe,mBACG,CACV,wBAGR,SACe,mBACG,CACV,wBAGR,SACe,kBACG,CACV,iBAGR,SACe,kBACG,CACV,iBAGR,SACe,mBACG,CACV,eAGR,SACe,mBACG,CACV,wBAKhB,MACY,eACE,CACN,SACe,mBACG,CACV,mBAGR,SACe,mBACG,CACV,4BAGR,SACe,mBACG,CACV,kBAGR,SACe,mBACG,CACV,sBAGR,SACe,wBACG,CACV,sBAGR,SACe,mCACG,CACV,iBAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,OAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,OAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,OAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,OAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,OAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,OAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,OAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,OAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,OAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,OAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,yBACG,CACV,YAGR,SACe,uDACG,CACV,iBAGR,SACe,uDACG,CACV,kBAGR,SACe,uDACG,CACV,uCAOO,MACf,6BACO,sBACP,qBACD,qBACA,uBACE,sBACD,sBACA,qBACD,uBACE,uBACA,sBACD,2BACK,uBACC,oBACH,oBACI,UACV,eACA,gBACC,qBACK,gBACL,WACA,aACE,aACA,WACF,YACC,WACD,WACA,YACC,WACD,WACA,kBACK,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,iBACL,wBACK,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,iBACL,wBACK,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,iBACL,wBACK,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,iBACL,wBACK,iBACL,wBACK,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,iBACL,wBACK,wBACA,wBACA,iBACL,wBACK,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,iBACL,wBACK,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,iBACL,wBACK,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,iBACL,wBACK,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,wBACA,mBACH,WACF,mBACG,cACA,cACA,cACA,cACA,cACA,cACA,cACA,mBACA,cACA,cACA,4BACc,eACb,gBACC,cACF,wBACU,yBACC,+BACM,gBACf,oBACI,qBACC,gBACL,wBACQ,cACV,gBACE,kBACE,qBACG,uBACE,mBACJ,6BACU,iBACZ,6BACY,2BACF,aACd,kBACK,4BACU,0BACF,6BACG,sBACP,2BACK,qCACU,oCACD,4BACR,sBACN,cACR,cACA,oBACM,0BACC,0BACA,+BACK,wBACP,wBACA,uBACD,qBACF,iBACJ,+BACc,oBACX,aACF,gBACG,iBACC,iBACA,uBACM,uBACA,kBACL,eACH,mBACI,mBACL,uBACS,aACV,iBACI,kBACC,gBACF,aACH,oBACO,aACP,yBACY,mBACN,oBACC,eACL,iBACE,eACF,iBACE,eACF,cACD,mBACK,kBACD,cACJ,eACC,kBACG,cACJ,oBACM,aACP,cACC,iBACG,mBACE,kBACD,cACJ,qBACO,oBACD,qBACC,kBACH,aACL,cACC,cACA,kBACI,cACJ,cACA,qBACO,cACP,aACD,cACC,qBACO,kBACH,iBACD,mBACE,kBACD,iBACD,eACF,sBACO,cACR,iBACG,gBACD,kBACE,aACL,cACC,aACD,kBACK,uBACK,YACX,aACC,mBACM,iBACF,uBACM,aACV,cACC,oBACM,yBACK,uBACP,gBACF,eACD,aACF,iBACI,uBACM,uBACA,cACT,kBACI,iBACD,gBACD,aACH,sBACS,sBACA,sBACA,eACP,cACD,cACA,mBACK,mBACA,uBACI,qBACF,cACP,6BACU,+BACE,0BACL,2BACC,yBACF,+BACM,4BACH,qBACF,uBACE,8BACO,mBACX,qBACE,eACN,mBACI,YACP,eACG,oBACK,eACL,gBACC,wBACQ,mBACL,aACN,qBACQ,gBACP,iBACG,gBACD,6BACa,qBACR,cACP,kBACI,eACH,yBACU,gBACT,eACD,sBACO,gCACU,eACjB,YACH,mBACO,uBACI,oBACH,wBACE,qCACF,8BACL,uCACO,qCACF,8BACL,oCACM,eACN,qBACM,iBACJ,uBACM,yBACA,sCACF,+BACL,+CACc,kDACF,0CACN,4CACA,0CACF,mCACL,8CACW,wBACP,kCACU,mBACV,oCACiB,kCACF,qCACG,6BACR,qBACb,iCACY,mCACE,6BACN,uBACN,qCACc,gCACL,oBACZ,2BACO,2BACA,qBACN,mBACF,0BACY,eACX,oBACK,6BACS,iBACZ,aACJ,YACD,cACE,mBACK,0BACO,eACX,yBACU,gBACT,wBACQ,wBACA,wBACA,uBACH,0CACK,4BACL,4DACC,yDACH,8DACO,gBACV,mBACF,+CAC4B,sBACpB,gBACN,sBACI,sBACA,sBACA,sBACA,sBACA,YACR,eACG,WACJ,sBACW,aACT,eACE,gBACC,gBACA,aACH,eACE,kBACG,eACH,cACD,cACA,kBACI,YACN,aACC,cACC,eACC,gBACC,gBACA,aACH,aACA,aACA,iBACI,gBACD,cACF,YACF,YACA,YACA,eACG,aACF,sBACS,iBACL,eACF,uBACQ,mBACJ,sBACG,aACT,gBACG,cACF,eACC,wBACS,cACV,gBACE,cACF,YACF,cACE,eACC,YACH,oBACQ,cACN,cACA,oBACM,YACR,YACA,aACC,gBACG,aACH,aACA,mBACM,iBACF,aACJ,iBACI,kBACJ,+BACgB,iCACjB,iBACA,aACC,aACA,eACE,mBACI,mBACA,mBACA,oBACC,kBACF,aACL,gBACG,aACL,aACA,aACE,mBACM,cACL,mBACK,mBACA,gBACH,cACF,cACA,cACA,eACC,eACA,uBACQ,cACT,gBACE,cACF,kBACI,sBACI,kBACJ,eACH,aACF,mBACM,2BACQ,4BACC,YAChB,aACC,sBACO,+BACF,kCACG,iCACD,iCACA,kCACC,yCACO,iCACR,wCACJ,kCACK,8CACC,yCACL,iCACG,gDACI,wDACH,iDACI,6DACC,yDACJ,kDACI,0DACH,mDACI,+DACC,6DACF,wCACC,mCACL,oCACC,oCACA,sCACE,iCACL,oCACD,oCACA,uCACG,iDACD,iDACT,wBACU,iCACF,oCACG,mCACD,mCACA,oCACC,2CACO,mCACR,0CACJ,oCACK,gDACC,2CACL,qCACK,oDACI,4DACH,qDACI,iEACC,+DACF,0CACC,qCACL,sCACC,sCACA,wCACE,mCACL,sCACD,sCACA,yCACG,sDACE,mDACH,gEACE,mDACX,eACC,qCACA,8BACe,gCACE,gCACF,6CACF,2BAChB,wDAC2B,sDACF,+BACrB,uCACQ,6BACG,0CACF,8CACM,2CACH,+BACC,4CACF,uCACH,iCACN,oBACE,aACP,qCACsB,kDACF,2CACL,gCACX,sBACK,wBACE,cACV,cACA,cACA,sBACQ,YACV,cACE,6BACa,0CACF,+CACO,sCACX,oCACF,iCACD,8BACH,iBACE,kBACC,gCACY,6CACF,+BACZ,+CACc,6CACF,+BACZ,8BACD,gBACC,aACH,aACA,oBACO,aACP,YACD,mBACO,qDACH,0BACU,0CACV,kBACE,qBACG,mBACF,wBACK,mBACL,cACL,mBACK,oBACC,qBACC,qBACA,mBACF,yBACM,yBACA,wCACe,aAC3B,cACC,aACD,YACD,aACC,oBACO,gBACJ,aACH,eACE,eACA,cACD,uBACS,wBACC,qBACH,YACT,iBACK,0BACS,0BACA,oBACN,YACR,eACG,aACF,cACC,yBACW,cACX,aACD,iBACI,kBACC,iBACD,oBACG,WACT,YACC,oBACQ,yBACK,uBACF,uBACA,aACV,iBACI,mBACE,iCACc,mCACE,kBACjB,kBACA,gBACF,sBACM,kBACJ,uBACK,yBACE,sBACH,eACP,iBACE,uCACsB,oBACnB,aACP,mBACM,kBACD,oBACE,cACN,mBACK,eACJ,aACF,2BACc,cACb,YACF,0BACc,oBACN,aACP,oBACO,mBACD,gBACH,iBACD,0BACW,4BACE,uBACL,gBACP,0BACU,6BACG,gBACb,oBACI,kBACF,eACH,gBACC,uBACO,yBACE,yBACA,wBACD,eACT,0BACW,qBACL,WACV,cACG,YACF,uBACW,0BACF,kCACa,eACnB,mBACI,yBACM,gCACO,uBACT,wBACC,aACX,gBACG,cACF,mBACK,gBACH,sBACM,YACV,kBACM,0BACQ,6BACG,YACjB,aACC,eACE,aACF,gBACG,iBACC,aACJ,qBACQ,aACR,YACD,WACD,aACE,YACD,iBACK,mBACE,qBACE,aACR,aACA,gBACG,YACJ,aACC,mBACM,eACJ,eACA,qBACM,cACP,YACF,mBACO,kBACD,qBACG,yBACI,iBACR,gBACD,4BACY,4BACA,mBACT,0BACO,6BACG,2BACF,6BACE,2BACF,2BACA,gCACK,uBACT,yBACE,kBACP,2BACI,mBACR,eACC,kBACG,mCACiB,eACpB,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,gBACC,gBACA,gBACA,iBACC,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,kBACC,kBACA,kBACA,eACH,+BACW,kBACb,6CAC2B,gCACf,6CACF,0CACD,4CACE,oBACT,wBACI,sBACF,yBACG,0BACM,sCACO,qCACD,mCACF,+BACJ,8CACe,2BACnB,qBACH,oBACC,yBACK,qBACT,gCACW,uBACT,gCACS,iCACC,2BACN,0BACD,yBACD,6BACI,iCACI,yBACR,qBACJ,iCACY,0BACP,yCACe,gCACT,gCACA,oCACI,uBACb,wBACC,oBACC,0BACM,cACZ,cACA,iBACG,aACJ,YACD,eACG,cACD,oBACM,iBACH,iBACA,oBACG,aACP,cACC,YACF,iBACK,mBACE,mBACA,cACL,qBACO,uBACE,iBACN,cACH,gBACE,iBACC,mBACE,gBACH,sBACM,6BACO,4BACD,yBACH,qCACY,qCACA,qBAChB,gBACL,cACF,aACD,YACD,kBACM,gBACF,8BACc,iBACb,kBACC,gBACF,cACF,eACC,mBACI,kBACD,YACN,mBACO,eACJ,mBACI,eACJ,mBACI,gBACH,iBACC,mBACE,iBACF,aACJ,kBACK,gBACF,mBACG,uBACI,kBACL,oBACE,oBACA,wBACI,mBACL,+BACY,8BACD,yBACL,+BACM,6BACJ,0CACF,+BACT,4CACW,0CACF,gCACR,sCACI,oCACF,2BACP,mCACQ,qBACC,sBACC,6BACK,0CACF,oCACJ,oCACA,yBACE,sCACF,uCACG,uCACF,qCACF,gDACa,4BACpB,eACE,mBACI,yBACM,oBACL,yBACK,0BACC,eACX,cACD,mBACK,gBACH,aACH,cACC,YACF,qBACS,mBACF,gBACH,gBACA,kBACE,oBACE,mBACD,4BACS,aACf,sBACS,YACV,4BACgB,iBACX,cACH,0BACY,gBACV,iBACC,yBACQ,2BACE,0BACD,uBACH,aACV,4BACa,yCACF,+BACR,iCACE,sBACI,+BACS,qBACV,uBACE,gCACS,aACnB,sBACS,gBACN,mBACG,gCACa,sBACV,sBACA,4BACI,aACb,oBACO,uBACC,oCACF,iCACD,+CACY,6CACF,0CACD,uCACL,qCACF,+BACJ,sCACO,0BACG,aACb,eACE,iBACE,oBACG,eACL,WACJ,eACI,aACF,gBACG,yBACS,gBACT,sBACM,qBACD,uBACE,oCACQ,sBACT,0BACD,iBACT,8BACa,uBACF,yBACE,0BACC,oBACX,sBACE,sBACA,2BACK,wBACH,4BACI,gCACI,0BACD,kBACR,4BACK,qBACP,sBACM,cACR,aACD,sBACS,0BACI,yBACD,8BACK,kBACZ,sBACI,+BACS,mBACZ,qBACE,kBACH,qBACG,4BACO,2BACH,4BACC,kBACR,wBACM,6BACK,6BACA,mBACV,uBACI,sCACe,sBAChB,mBACH,4BACO,yCACF,iCACN,sBACI,iCACW,sBACb,kBACF,sBACI,mCACa,kCACD,sBACZ,uBACC,uBACA,yBACA,0BACG,eACX,eACA,sBACO,kBACJ,0BACM,uCACF,6BACR,6BACa,0CACF,8CACM,yBACR,sCACF,gCACJ,eACF,0BACS,uCACF,iCACJ,mCACe,gDACF,kCACZ,iCACY,8CACF,gCACZ,sBACK,6BACO,yBACJ,sBACH,cACR,iBACG,0BACS,2BACC,0BACD,qBACL,6BACQ,sBACP,kBACJ,gBACF,iBACC,cACH,eACC,eACA,uBACQ,oBACH,4BACQ,0BACF,YACd,sBACU,gBACN,kBACE,iBACD,iBACA,uBACM,oBACH,mBACD,wBACK,uBACD,gBACP,iBACC,YACL,gBACI,oBACI,iBACH,oBACG,aACP,kBACK,iBACD,eACF,qBACM,cACP,aACD,YACD,cACE,YACF,iBACK,kBACC,aACL,gBACG,eACD,mBACI,eACJ,cACD,qBACO,mBACF,iBACF,iBACA,gBACH,gBACE,qBACK,0BACK,cACZ,cACA,oBACM,uBACG,8BACO,6BACD,0CACF,6CACG,sCACP,oCACF,uCACG,+CACQ,6CACF,gDACG,mCACb,iCACF,4BACL,oCACQ,kCACF,6BACL,sCACS,oCACF,+BACL,+BACA,8BACD,iCACG,kCACC,gCACF,2BACL,oCACS,kCACF,6BACL,qCACQ,mCACF,8BACL,6BACD,qBACO,mBACF,cACL,eACC,aACF,cACC,iBACG,wBACG,eACT,+BACgB,6BACF,0BACH,6BACG,8BACC,8BACA,6BACD,sCACS,6BACT,kBACX,iBACI,gBACD,kBACH,yBACO,cACN,uBACS,yBACE,8DACqC,kEACD,mEACC,wBAC3C,iBACF,wBACE,mCACW,2BACH,kCACE,oCACE,cACtB,+BACiB,+BACA,0BACL,2BACC,gCACK,gCACA,sCACM,iCACA,aACpB,kBACA,qBACG,oBACD,kBACF,kBACA,kCACgB,qCACG,cAClB,gBACE,qBACA,iCACY,6BACJ,2BACF,2BACA,8BACG,yBACL,qBACJ,4BACO,gCACI,oBACZ,wBACI,sBACF,kBACJ,cACC,cACA,cACA,WACH,aACE,aACA,gBACG,mBACG,iBACF,gBACD,cACF,cACA,kBACD,mBACC,qBACE,uBACE,oBACH,uBACG,uBACK,mBACT,sBACQ,2BACA,mBACR,oBACC,iBACH,wBACO,yBACC,oBACL,gBACJ,oBACS,oBACA,cACN,wBACK,mBACL,gBACE,4BACY,oBACR,8BACU,sBACb,YACL,oCACmB,mBACjB,qBACE,qBACK,mBACP,gBACE,+BACU,qBACV,YACJ,aACC,iBACD,aACC,sBACI,kCACU,+CACF,4CACD,gCACZ,gBACI,gBACA,6BACQ,gBACR,kBACH,iBACD,YACA,SACH,yBACW,oBACL,sBACE,6BACO,mCACM,wBACX,0BACE,qBACL,6BACa,qCACG,sBACf,oBACF,cACN,mCAC0B,gBACnB,qBACK,wBACG,mBACL,6CAC0B,kBAChC,4BACU,wBACC,2BACG,mBACR,uBACD,YACN,wBACY,+BACE,uBACR,qBACF,uBACE,+BACQ,0BACA,YACd,SACH,iBACQ,kCACY,4BACN,mBACT"} \ No newline at end of file diff --git a/lib/amd/build/emoji/picker.min.js b/lib/amd/build/emoji/picker.min.js index b2dc771a500..2edee6a88a4 100644 --- a/lib/amd/build/emoji/picker.min.js +++ b/lib/amd/build/emoji/picker.min.js @@ -1,3 +1,3 @@ -define("core/emoji/picker",["exports","core/localstorage","core/emoji/data","core/utils","core/str","core/templates"],(function(_exports,_localstorage,EmojiData,_utils,_str,_templates){var obj;function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}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 _toConsumableArray(arr){return function(arr){if(Array.isArray(arr))return _arrayLikeToArray(arr)}(arr)||function(iter){if("undefined"!=typeof Symbol&&null!=iter[Symbol.iterator]||null!=iter["@@iterator"])return Array.from(iter)}(arr)||_unsupportedIterableToArray(arr)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}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)||_unsupportedIterableToArray(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 _unsupportedIterableToArray(o,minLen){if(o){if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return"Object"===n&&o.constructor&&(n=o.constructor.name),"Map"===n||"Set"===n?Array.from(o):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(o,minLen):void 0}}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);ib?1:0}));var _positions$reduce=positions.reduce((function(carry,candidate){var _candidate=_slicedToArray(candidate,2),categoryPosition=_candidate[0],categoryName=_candidate[1];return categoryPosition<=position?(carry.categoryName=categoryName,carry.previousPosition=carry.currentPosition,carry.currentPosition=position):null===carry.nextPosition&&(carry.nextPosition=categoryPosition),carry}),{categoryName:null,currentPosition:null,previousPosition:null,nextPosition:null}),categoryName=_positions$reduce.categoryName,previousPosition=_positions$reduce.previousPosition,nextPosition=_positions$reduce.nextPosition;return[getCategorySelectorByCategoryName(root,categoryName),previousPosition,nextPosition]},getRecentEmojis=function(){var storedData=_localstorage.default.get("moodle-recent-emojis");return storedData?JSON.parse(storedData):[]},addRecentEmoji=function(rowData,recentEmojiRowCount,newEmoji){var categoryName=rowData[0].data.name,categoryDisplayName=rowData[0].data.displayName,recentEmojis=getRecentEmojis(),newRecentEmojis=[newEmoji].concat(_toConsumableArray(recentEmojis.filter((function(emoji){return emoji.unified!=newEmoji.unified}))));newRecentEmojis=newRecentEmojis.slice(0,21);var newRecentEmojiRowData=createRowDataForCategory(categoryName,categoryDisplayName,newRecentEmojis);return function(recentEmojis){_localstorage.default.set("moodle-recent-emojis",JSON.stringify(recentEmojis))}(newRecentEmojis),[addIndexesToRowData(newRecentEmojiRowData.concat(rowData.slice(recentEmojiRowCount))),newRecentEmojiRowData.length]},getRowsToRender=function(scrollPosition,visibleRowCount,rowData){var minVisibleRow=scrollPosition>ROW_HEIGHT_RAW?Math.floor(scrollPosition/ROW_HEIGHT_RAW):0,start=minVisibleRow>=5?minVisibleRow-5:minVisibleRow,end=minVisibleRow+visibleRowCount+5;return rowData.slice(start,end)},createRowElement=(_ref7=_asyncToGenerator(regeneratorRuntime.mark((function _callee3(rowData){var row;return regeneratorRuntime.wrap((function(_context3){for(;;)switch(_context3.prev=_context3.next){case 0:if(row=null,rowData.type!==ROW_TYPE_HEADER){_context3.next=7;break}return _context3.next=4,createHeaderRow(rowData.index,rowData.data.displayName);case 4:row=_context3.sent,_context3.next=10;break;case 7:return _context3.next=9,createEmojiRow(rowData.index,rowData.data);case 9:row=_context3.sent;case 10:return row.style.position="absolute",row.style.left=0,row.style.right=0,row.style.top="".concat(rowData.index*ROW_HEIGHT_RAW,"px"),_context3.abrupt("return",row);case 15:case"end":return _context3.stop()}}),_callee3)}))),function(_x5){return _ref7.apply(this,arguments)}),doRowsMatch=function(a,b){if(a.index!==b.index)return!1;if(a.type!==b.type)return!1;if(_typeof(a.data)!=_typeof(b.data))return!1;if(a.type===ROW_TYPE_HEADER)return a.data.name===b.data.name;if(a.data.length!==b.data.length)return!1;for(var i=0;irowData.index){nextRowIndex=i;break}if(null!==nextRowIndex){var nextRowData=toKeep[nextRowIndex],nextRowNode=rowContainer.querySelector('[data-row="'.concat(nextRowData.index,'"]'));rowContainer.insertBefore(row,nextRowNode),toKeep.splice(nextRowIndex,0,toKeep)}else toKeep.push(rowData),rowContainer.appendChild(row)})),toRemoveElements.forEach((function(rows){for(var i=0;i2&&void 0!==arguments[2]?arguments[2]:VISIBLE_ROW_COUNT,rowData),renderNextRows(),rowCount!==rowData.length&&(rowContainer.style.height="".concat(rowData.length*ROW_HEIGHT_RAW,"px")),rowCount=rowData.length}},showSearchResults=function(emojiContainer,searchResultsContainer){searchResultsContainer.classList.remove("hidden"),emojiContainer.classList.add("hidden")},clearSearch=function(emojiContainer,searchResultsContainer,searchInput){searchResultsContainer.classList.add("hidden"),emojiContainer.classList.remove("hidden"),searchInput.value=""},getHandleMouseEnter=function(emojiPreview,emojiShortName){return function(e){var target=e.target;isEmojiElement(target)&&(emojiShortName.textContent=target.getAttribute("data-short-names"),emojiPreview.textContent=target.textContent)}},getHandleMouseLeave=function(emojiPreview,emojiShortName){return function(e){var target=e.target;isEmojiElement(target)&&(emojiShortName.textContent="",emojiPreview.textContent="")}},getHandleScroll=function(root,currentVisibleRowScrollPosition,emojiContainer,initialCategoryScrollPositions,renderAtPosition){var _getCategoryByScrollP2=_slicedToArray(getCategoryByScrollPosition(root,emojiContainer.scrollTop,initialCategoryScrollPositions),3),currentCategoryElement=_getCategoryByScrollP2[0],previousCategoryPosition=_getCategoryByScrollP2[1],nextCategoryPosition=_getCategoryByScrollP2[2];return function(categoryScrollPositions,rowData){var newScrollPosition=emojiContainer.scrollTop,updateRenderRows=newScrollPositioncurrentVisibleRowScrollPosition+ROW_HEIGHT_RAW;if(newScrollPosition>=nextCategoryPosition||newScrollPositionarr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);ib?1:0}));var _positions$reduce=positions.reduce((function(carry,candidate){var _candidate=_slicedToArray(candidate,2),categoryPosition=_candidate[0],categoryName=_candidate[1];return categoryPosition<=position?(carry.categoryName=categoryName,carry.previousPosition=carry.currentPosition,carry.currentPosition=position):null===carry.nextPosition&&(carry.nextPosition=categoryPosition),carry}),{categoryName:null,currentPosition:null,previousPosition:null,nextPosition:null}),categoryName=_positions$reduce.categoryName,previousPosition=_positions$reduce.previousPosition,nextPosition=_positions$reduce.nextPosition;return[getCategorySelectorByCategoryName(root,categoryName),previousPosition,nextPosition]},getRecentEmojis=function(){var storedData=_localstorage.default.get("moodle-recent-emojis");return storedData?JSON.parse(storedData):[]},addRecentEmoji=function(rowData,recentEmojiRowCount,newEmoji){var categoryName=rowData[0].data.name,categoryDisplayName=rowData[0].data.displayName,recentEmojis=getRecentEmojis(),newRecentEmojis=[newEmoji].concat(_toConsumableArray(recentEmojis.filter((function(emoji){return emoji.unified!=newEmoji.unified}))));newRecentEmojis=newRecentEmojis.slice(0,21);var newRecentEmojiRowData=createRowDataForCategory(categoryName,categoryDisplayName,newRecentEmojis);return function(recentEmojis){_localstorage.default.set("moodle-recent-emojis",JSON.stringify(recentEmojis))}(newRecentEmojis),[addIndexesToRowData(newRecentEmojiRowData.concat(rowData.slice(recentEmojiRowCount))),newRecentEmojiRowData.length]},getRowsToRender=function(scrollPosition,visibleRowCount,rowData){var minVisibleRow=scrollPosition>40?Math.floor(scrollPosition/40):0,start=minVisibleRow>=5?minVisibleRow-5:minVisibleRow,end=minVisibleRow+visibleRowCount+5;return rowData.slice(start,end)},createRowElement=(_ref7=_asyncToGenerator(regeneratorRuntime.mark((function _callee3(rowData){var row;return regeneratorRuntime.wrap((function(_context3){for(;;)switch(_context3.prev=_context3.next){case 0:if(row=null,rowData.type!==ROW_TYPE_HEADER){_context3.next=7;break}return _context3.next=4,createHeaderRow(rowData.index,rowData.data.displayName);case 4:row=_context3.sent,_context3.next=10;break;case 7:return _context3.next=9,createEmojiRow(rowData.index,rowData.data);case 9:row=_context3.sent;case 10:return row.style.position="absolute",row.style.left=0,row.style.right=0,row.style.top="".concat(40*rowData.index,"px"),_context3.abrupt("return",row);case 15:case"end":return _context3.stop()}}),_callee3)}))),function(_x5){return _ref7.apply(this,arguments)}),doRowsMatch=function(a,b){if(a.index!==b.index)return!1;if(a.type!==b.type)return!1;if(_typeof(a.data)!=_typeof(b.data))return!1;if(a.type===ROW_TYPE_HEADER)return a.data.name===b.data.name;if(a.data.length!==b.data.length)return!1;for(var i=0;irowData.index){nextRowIndex=i;break}if(null!==nextRowIndex){var nextRowData=toKeep[nextRowIndex],nextRowNode=rowContainer.querySelector('[data-row="'.concat(nextRowData.index,'"]'));rowContainer.insertBefore(row,nextRowNode),toKeep.splice(nextRowIndex,0,toKeep)}else toKeep.push(rowData),rowContainer.appendChild(row)})),toRemoveElements.forEach((function(rows){for(var i=0;i2&&void 0!==arguments[2]?arguments[2]:10;nextRows=getRowsToRender(scrollPosition,rowLimit,rowData),renderNextRows(),rowCount!==rowData.length&&(rowContainer.style.height="".concat(40*rowData.length,"px")),rowCount=rowData.length}},showSearchResults=function(emojiContainer,searchResultsContainer){searchResultsContainer.classList.remove("hidden"),emojiContainer.classList.add("hidden")},clearSearch=function(emojiContainer,searchResultsContainer,searchInput){searchResultsContainer.classList.add("hidden"),emojiContainer.classList.remove("hidden"),searchInput.value=""},getHandleMouseEnter=function(emojiPreview,emojiShortName){return function(e){var target=e.target;isEmojiElement(target)&&(emojiShortName.textContent=target.getAttribute("data-short-names"),emojiPreview.textContent=target.textContent)}},getHandleMouseLeave=function(emojiPreview,emojiShortName){return function(e){var target=e.target;isEmojiElement(target)&&(emojiShortName.textContent="",emojiPreview.textContent="")}},getHandleScroll=function(root,currentVisibleRowScrollPosition,emojiContainer,initialCategoryScrollPositions,renderAtPosition){var _getCategoryByScrollP2=_slicedToArray(getCategoryByScrollPosition(root,emojiContainer.scrollTop,initialCategoryScrollPositions),3),currentCategoryElement=_getCategoryByScrollP2[0],previousCategoryPosition=_getCategoryByScrollP2[1],nextCategoryPosition=_getCategoryByScrollP2[2];return function(categoryScrollPositions,rowData){var newScrollPosition=emojiContainer.scrollTop,updateRenderRows=newScrollPositioncurrentVisibleRowScrollPosition+40;if(newScrollPosition>=nextCategoryPosition||newScrollPosition.\n\n/**\n * Emoji picker.\n *\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport LocalStorage from 'core/localstorage';\nimport * as EmojiData from 'core/emoji/data';\nimport {throttle, debounce} from 'core/utils';\nimport {get_string} from 'core/str';\nimport {render as renderTemplate} from 'core/templates';\n\nconst VISIBLE_ROW_COUNT = 10;\nconst ROW_RENDER_BUFFER_COUNT = 5;\nconst RECENT_EMOJIS_STORAGE_KEY = 'moodle-recent-emojis';\nconst ROW_HEIGHT_RAW = 40;\nconst EMOJIS_PER_ROW = 7;\nconst MAX_RECENT_COUNT = EMOJIS_PER_ROW * 3;\nconst ROW_TYPE = {\n EMOJI: 0,\n HEADER: 1\n};\nconst SELECTORS = {\n CATEGORY_SELECTOR: '[data-action=\"show-category\"]',\n EMOJIS_CONTAINER: '[data-region=\"emojis-container\"]',\n EMOJI_PREVIEW: '[data-region=\"emoji-preview\"]',\n EMOJI_SHORT_NAME: '[data-region=\"emoji-short-name\"]',\n ROW_CONTAINER: '[data-region=\"row-container\"]',\n SEARCH_INPUT: '[data-region=\"search-input\"]',\n SEARCH_RESULTS_CONTAINER: '[data-region=\"search-results-container\"]'\n};\n\n/**\n * Create the row data for a category.\n *\n * @param {String} categoryName The category name\n * @param {String} categoryDisplayName The category display name\n * @param {Array} emojis The emoji data\n * @param {Number} totalRowCount The total number of rows generated so far\n * @return {Array}\n */\nconst createRowDataForCategory = (categoryName, categoryDisplayName, emojis, totalRowCount) => {\n const rowData = [];\n rowData.push({\n index: totalRowCount + rowData.length,\n type: ROW_TYPE.HEADER,\n data: {\n name: categoryName,\n displayName: categoryDisplayName\n }\n });\n\n for (let i = 0; i < emojis.length; i += EMOJIS_PER_ROW) {\n const rowEmojis = emojis.slice(i, i + EMOJIS_PER_ROW);\n rowData.push({\n index: totalRowCount + rowData.length,\n type: ROW_TYPE.EMOJI,\n data: rowEmojis\n });\n }\n\n return rowData;\n};\n\n/**\n * Add each row's index to it's value in the row data.\n *\n * @param {Array} rowData List of emoji row data\n * @return {Array}\n */\nconst addIndexesToRowData = (rowData) => {\n return rowData.map((data, index) => {\n return {...data, index};\n });\n};\n\n/**\n * Calculate the scroll position for the beginning of each category from\n * the row data.\n *\n * @param {Array} rowData List of emoji row data\n * @return {Object}\n */\nconst getCategoryScrollPositionsFromRowData = (rowData) => {\n return rowData.reduce((carry, row, index) => {\n if (row.type === ROW_TYPE.HEADER) {\n carry[row.data.name] = index * ROW_HEIGHT_RAW;\n }\n return carry;\n }, {});\n};\n\n/**\n * Create a header row element for the category name.\n *\n * @param {Number} rowIndex Index of the row in the row data\n * @param {String} name The category display name\n * @return {Element}\n */\nconst createHeaderRow = async (rowIndex, name) => {\n const context = {\n index: rowIndex,\n text: name\n };\n const html = await renderTemplate('core/emoji/header_row', context);\n const temp = document.createElement('div');\n temp.innerHTML = html;\n return temp.firstChild;\n};\n\n/**\n * Create an emoji row element.\n *\n * @param {Number} rowIndex Index of the row in the row data\n * @param {Array} emojis The list of emoji data for the row\n * @return {Element}\n */\nconst createEmojiRow = async (rowIndex, emojis) => {\n const context = {\n index: rowIndex,\n emojis: emojis.map(emojiData => {\n const charCodes = emojiData.unified.split('-').map(code => `0x${code}`);\n const emojiText = String.fromCodePoint.apply(null, charCodes);\n return {\n shortnames: `:${emojiData.shortnames.join(': :')}:`,\n unified: emojiData.unified,\n text: emojiText,\n spacer: false\n };\n }),\n spacers: Array(EMOJIS_PER_ROW - emojis.length).fill(true)\n };\n const html = await renderTemplate('core/emoji/emoji_row', context);\n const temp = document.createElement('div');\n temp.innerHTML = html;\n return temp.firstChild;\n};\n\n/**\n * Check if the element is an emoji element.\n *\n * @param {Element} element Element to check\n * @return {Bool}\n */\nconst isEmojiElement = element => element.getAttribute('data-short-names') !== null;\n\n/**\n * Search from an element and up through it's ancestors to fine the category\n * selector element and return it.\n *\n * @param {Element} element Element to begin searching from\n * @return {Element|null}\n */\nconst findCategorySelectorFromElement = element => {\n if (!element) {\n return null;\n }\n\n if (element.getAttribute('data-action') === 'show-category') {\n return element;\n } else {\n return findCategorySelectorFromElement(element.parentElement);\n }\n};\n\nconst getCategorySelectorByCategoryName = (root, name) => {\n return root.querySelector(`[data-category=\"${name}\"]`);\n};\n\n/**\n * Sets the given category selector element as active.\n *\n * @param {Element} root The root picker element\n * @param {Element} element The category selector element to make active\n */\nconst setCategorySelectorActive = (root, element) => {\n const allCategorySelectors = root.querySelectorAll(SELECTORS.CATEGORY_SELECTOR);\n\n for (let i = 0; i < allCategorySelectors.length; i++) {\n const selector = allCategorySelectors[i];\n selector.classList.remove('selected');\n }\n\n element.classList.add('selected');\n};\n\n/**\n * Get the category selector element and the scroll positions for the previous and\n * next categories for the given scroll position.\n *\n * @param {Element} root The picker root element\n * @param {Number} position The position to get the category for\n * @param {Object} categoryScrollPositions Set of scroll positions for all categories\n * @return {Array}\n */\nconst getCategoryByScrollPosition = (root, position, categoryScrollPositions) => {\n let positions = [];\n\n if (position < 0) {\n position = 0;\n }\n\n // Get all of the category positions.\n for (const categoryName in categoryScrollPositions) {\n const categoryPosition = categoryScrollPositions[categoryName];\n positions.push([categoryPosition, categoryName]);\n }\n\n // Sort the positions in ascending order.\n positions.sort(([a], [b]) => {\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n } else {\n return 0;\n }\n });\n\n // Get the current category name as well as the previous and next category\n // positions from the sorted list of positions.\n const {categoryName, previousPosition, nextPosition} = positions.reduce(\n (carry, candidate) => {\n const [categoryPosition, categoryName] = candidate;\n\n if (categoryPosition <= position) {\n carry.categoryName = categoryName;\n carry.previousPosition = carry.currentPosition;\n carry.currentPosition = position;\n } else if (carry.nextPosition === null) {\n carry.nextPosition = categoryPosition;\n }\n\n return carry;\n },\n {\n categoryName: null,\n currentPosition: null,\n previousPosition: null,\n nextPosition: null\n }\n );\n\n return [getCategorySelectorByCategoryName(root, categoryName), previousPosition, nextPosition];\n};\n\n/**\n * Get the list of recent emojis data from local storage.\n *\n * @return {Array}\n */\nconst getRecentEmojis = () => {\n const storedData = LocalStorage.get(RECENT_EMOJIS_STORAGE_KEY);\n return storedData ? JSON.parse(storedData) : [];\n};\n\n/**\n * Save the list of recent emojis in local storage.\n *\n * @param {Array} recentEmojis List of emoji data to save\n */\nconst saveRecentEmoji = (recentEmojis) => {\n LocalStorage.set(RECENT_EMOJIS_STORAGE_KEY, JSON.stringify(recentEmojis));\n};\n\n/**\n * Add an emoji data to the set of recent emojis. This function will update the row\n * data to ensure that the recent emoji rows are correct and all of the rows are\n * re-indexed.\n *\n * The new set of recent emojis are saved in local storage and the full set of updated\n * row data and new emoji row count are returned.\n *\n * @param {Array} rowData The emoji rows data\n * @param {Number} recentEmojiRowCount Count of the recent emoji rows\n * @param {Object} newEmoji The emoji data for the emoji to add to the recent emoji list\n * @return {Array}\n */\nconst addRecentEmoji = (rowData, recentEmojiRowCount, newEmoji) => {\n // The first set of rows is always the recent emojis.\n const categoryName = rowData[0].data.name;\n const categoryDisplayName = rowData[0].data.displayName;\n const recentEmojis = getRecentEmojis();\n // Add the new emoji to the start of the list of recent emojis.\n let newRecentEmojis = [newEmoji, ...recentEmojis.filter(emoji => emoji.unified != newEmoji.unified)];\n // Limit the number of recent emojis.\n newRecentEmojis = newRecentEmojis.slice(0, MAX_RECENT_COUNT);\n const newRecentEmojiRowData = createRowDataForCategory(categoryName, categoryDisplayName, newRecentEmojis);\n\n // Save the new list in local storage.\n saveRecentEmoji(newRecentEmojis);\n\n return [\n // Return the new rowData and re-index it to make sure it's all correct.\n addIndexesToRowData(newRecentEmojiRowData.concat(rowData.slice(recentEmojiRowCount))),\n newRecentEmojiRowData.length\n ];\n};\n\n/**\n * Calculate which rows should be visible based on the given scroll position. Adds a\n * buffer to amount to either side of the total number of requested rows so that\n * scrolling the emoji rows container is smooth.\n *\n * @param {Number} scrollPosition Scroll position within the emoji container\n * @param {Number} visibleRowCount How many rows should be visible\n * @param {Array} rowData The emoji rows data\n * @return {Array}\n */\nconst getRowsToRender = (scrollPosition, visibleRowCount, rowData) => {\n const minVisibleRow = scrollPosition > ROW_HEIGHT_RAW ? Math.floor(scrollPosition / ROW_HEIGHT_RAW) : 0;\n const start = minVisibleRow >= ROW_RENDER_BUFFER_COUNT ? minVisibleRow - ROW_RENDER_BUFFER_COUNT : minVisibleRow;\n const end = minVisibleRow + visibleRowCount + ROW_RENDER_BUFFER_COUNT;\n const rows = rowData.slice(start, end);\n return rows;\n};\n\n/**\n * Create a row element from the row data.\n *\n * @param {Object} rowData The emoji row data\n * @return {Element}\n */\nconst createRowElement = async (rowData) => {\n let row = null;\n if (rowData.type === ROW_TYPE.HEADER) {\n row = await createHeaderRow(rowData.index, rowData.data.displayName);\n } else {\n row = await createEmojiRow(rowData.index, rowData.data);\n }\n\n row.style.position = 'absolute';\n row.style.left = 0;\n row.style.right = 0;\n row.style.top = `${rowData.index * ROW_HEIGHT_RAW}px`;\n\n return row;\n};\n\n/**\n * Check if the given rows match.\n *\n * @param {Object} a The first row\n * @param {Object} b The second row\n * @return {Bool}\n */\nconst doRowsMatch = (a, b) => {\n if (a.index !== b.index) {\n return false;\n }\n\n if (a.type !== b.type) {\n return false;\n }\n\n if (typeof a.data != typeof b.data) {\n return false;\n }\n\n if (a.type === ROW_TYPE.HEADER) {\n return a.data.name === b.data.name;\n } else {\n if (a.data.length !== b.data.length) {\n return false;\n }\n\n for (let i = 0; i < a.data.length; i++) {\n if (a.data[i].unified != b.data[i].unified) {\n return false;\n }\n }\n }\n\n return true;\n};\n\n/**\n * Update the visible rows. Deletes any row elements that should no longer\n * be visible and creates the newly visible row elements. Any rows that haven't\n * changed visibility will be left untouched.\n *\n * @param {Element} rowContainer The container element for the emoji rows\n * @param {Array} currentRows List of row data that matches the currently visible rows\n * @param {Array} nextRows List of row data containing the new list of rows to be made visible\n */\nconst renderRows = async (rowContainer, currentRows, nextRows) => {\n // We need to add any rows that are in nextRows but not in currentRows.\n const toAdd = nextRows.filter(nextRow => !currentRows.some(currentRow => doRowsMatch(currentRow, nextRow)));\n // Remember which rows will still be visible so that we can insert our element in the correct place in the DOM.\n let toKeep = currentRows.filter(currentRow => nextRows.some(nextRow => doRowsMatch(currentRow, nextRow)));\n // We need to remove any rows that are in currentRows but not in nextRows.\n const toRemove = currentRows.filter(currentRow => !nextRows.some(nextRow => doRowsMatch(currentRow, nextRow)));\n const toRemoveElements = toRemove.map(rowData => rowContainer.querySelectorAll(`[data-row=\"${rowData.index}\"]`));\n\n // Render all of the templates first.\n const rows = await Promise.all(toAdd.map(rowData => createRowElement(rowData)));\n\n rows.forEach((row, index) => {\n const rowData = toAdd[index];\n let nextRowIndex = null;\n\n for (let i = 0; i < toKeep.length; i++) {\n const candidate = toKeep[i];\n if (candidate.index > rowData.index) {\n nextRowIndex = i;\n break;\n }\n }\n\n // Make sure the elements get added to the DOM in the correct order (ascending by row data index)\n // so that they appear naturally in the tab order.\n if (nextRowIndex !== null) {\n const nextRowData = toKeep[nextRowIndex];\n const nextRowNode = rowContainer.querySelector(`[data-row=\"${nextRowData.index}\"]`);\n\n rowContainer.insertBefore(row, nextRowNode);\n toKeep.splice(nextRowIndex, 0, toKeep);\n } else {\n toKeep.push(rowData);\n rowContainer.appendChild(row);\n }\n });\n\n toRemoveElements.forEach(rows => {\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n rowContainer.removeChild(row);\n }\n });\n};\n\n/**\n * Build a function to render the visible emoji rows for a given scroll\n * position.\n *\n * @param {Element} rowContainer The container element for the emoji rows\n * @return {Function}\n */\nconst generateRenderRowsAtPositionFunction = (rowContainer) => {\n let currentRows = [];\n let nextRows = [];\n let rowCount = 0;\n let isRendering = false;\n const renderNextRows = async () => {\n if (!nextRows.length) {\n return;\n }\n\n if (isRendering) {\n return;\n }\n\n isRendering = true;\n const nextRowsToRender = nextRows.slice();\n nextRows = [];\n\n await renderRows(rowContainer, currentRows, nextRowsToRender);\n currentRows = nextRowsToRender;\n isRendering = false;\n renderNextRows();\n };\n\n return (scrollPosition, rowData, rowLimit = VISIBLE_ROW_COUNT) => {\n nextRows = getRowsToRender(scrollPosition, rowLimit, rowData);\n renderNextRows();\n\n if (rowCount !== rowData.length) {\n // Adjust the height of the container to match the number of rows.\n rowContainer.style.height = `${rowData.length * ROW_HEIGHT_RAW}px`;\n }\n\n rowCount = rowData.length;\n };\n};\n\n/**\n * Show the search results container and hide the emoji container.\n *\n * @param {Element} emojiContainer The emojis container\n * @param {Element} searchResultsContainer The search results container\n */\nconst showSearchResults = (emojiContainer, searchResultsContainer) => {\n searchResultsContainer.classList.remove('hidden');\n emojiContainer.classList.add('hidden');\n};\n\n/**\n * Hide the search result container and show the emojis container.\n *\n * @param {Element} emojiContainer The emojis container\n * @param {Element} searchResultsContainer The search results container\n * @param {Element} searchInput The search input\n */\nconst clearSearch = (emojiContainer, searchResultsContainer, searchInput) => {\n searchResultsContainer.classList.add('hidden');\n emojiContainer.classList.remove('hidden');\n searchInput.value = '';\n};\n\n/**\n * Build function to handle mouse hovering an emoji. Shows the preview.\n *\n * @param {Element} emojiPreview The emoji preview element\n * @param {Element} emojiShortName The emoji short name element\n * @return {Function}\n */\nconst getHandleMouseEnter = (emojiPreview, emojiShortName) => {\n return (e) => {\n const target = e.target;\n if (isEmojiElement(target)) {\n emojiShortName.textContent = target.getAttribute('data-short-names');\n emojiPreview.textContent = target.textContent;\n }\n };\n};\n\n/**\n * Build function to handle mouse leaving an emoji. Removes the preview.\n *\n * @param {Element} emojiPreview The emoji preview element\n * @param {Element} emojiShortName The emoji short name element\n * @return {Function}\n */\nconst getHandleMouseLeave = (emojiPreview, emojiShortName) => {\n return (e) => {\n const target = e.target;\n if (isEmojiElement(target)) {\n emojiShortName.textContent = '';\n emojiPreview.textContent = '';\n }\n };\n};\n\n/**\n * Build the function to handle a user clicking something in the picker.\n *\n * The function currently handles clicking on the category selector or selecting\n * a specific emoji.\n *\n * @param {Number} recentEmojiRowCount Number of rows of recent emojis\n * @param {Element} emojiContainer Container element for the visible of emojis\n * @param {Element} searchResultsContainer Contaienr element for the search results\n * @param {Element} searchInput Search input element\n * @param {Function} selectCallback Callback function to execute when a user selects an emoji\n * @param {Function} renderAtPosition Render function to display current visible emojis\n * @return {Function}\n */\nconst getHandleClick = (\n recentEmojiRowCount,\n emojiContainer,\n searchResultsContainer,\n searchInput,\n selectCallback,\n renderAtPosition\n) => {\n return (e, rowData, categoryScrollPositions) => {\n const target = e.target;\n let newRowData = rowData;\n let newCategoryScrollPositions = categoryScrollPositions;\n\n // Hide the search results if they are visible.\n clearSearch(emojiContainer, searchResultsContainer, searchInput);\n\n if (isEmojiElement(target)) {\n // Emoji selected.\n const unified = target.getAttribute('data-unified');\n const shortnames = target.getAttribute('data-short-names').replace(/:/g, '').split(' ');\n // Build the emoji data from the selected element.\n const emojiData = {unified, shortnames};\n const currentScrollTop = emojiContainer.scrollTop;\n const isRecentEmojiRowVisible = emojiContainer.querySelector(`[data-row=\"${recentEmojiRowCount - 1}\"]`) !== null;\n // Save the selected emoji in the recent emojis list.\n [newRowData, recentEmojiRowCount] = addRecentEmoji(rowData, recentEmojiRowCount, emojiData);\n // Re-index the category scroll positions because the additional recent emoji may have\n // changed their positions.\n newCategoryScrollPositions = getCategoryScrollPositionsFromRowData(newRowData);\n\n if (isRecentEmojiRowVisible) {\n // If the list of recent emojis is currently visible then we need to re-render the emojis\n // to update the display and show the newly selected recent emoji.\n renderAtPosition(currentScrollTop, newRowData);\n }\n\n // Call the client's callback function with the selected emoji.\n selectCallback(target.textContent);\n // Return the newly calculated row data and scroll positions.\n return [newRowData, newCategoryScrollPositions];\n }\n\n const categorySelector = findCategorySelectorFromElement(target);\n if (categorySelector) {\n // Category selector.\n const selectedCategory = categorySelector.getAttribute('data-category');\n const position = categoryScrollPositions[selectedCategory];\n // Scroll the container to the selected category. This will trigger the\n // on scroll handler to re-render the visibile emojis.\n emojiContainer.scrollTop = position;\n }\n\n return [newRowData, newCategoryScrollPositions];\n };\n};\n\n/**\n * Build the function that handles scrolling of the emoji container to display the\n * correct emojis.\n *\n * We render the emoji rows as they are needed rather than all up front so that we\n * can avoid adding tends of thousands of elements to the DOM unnecessarily which\n * would bog down performance.\n *\n * @param {Element} root The picker root element\n * @param {Number} currentVisibleRowScrollPosition The current scroll position of the container\n * @param {Element} emojiContainer The emojis container element\n * @param {Object} initialCategoryScrollPositions Scroll positions for each category\n * @param {Function} renderAtPosition Function to render the appropriate emojis for a scroll position\n * @return {Function}\n */\nconst getHandleScroll = (\n root,\n currentVisibleRowScrollPosition,\n emojiContainer,\n initialCategoryScrollPositions,\n renderAtPosition\n) => {\n // Scope some local variables to track the scroll positions of the categories. We need to\n // recalculate these because adding recent emojis can change those positions by adding\n // additional rows.\n let [\n currentCategoryElement,\n previousCategoryPosition,\n nextCategoryPosition\n ] = getCategoryByScrollPosition(root, emojiContainer.scrollTop, initialCategoryScrollPositions);\n\n return (categoryScrollPositions, rowData) => {\n const newScrollPosition = emojiContainer.scrollTop;\n const upperScrollBound = currentVisibleRowScrollPosition + ROW_HEIGHT_RAW;\n const lowerScrollBound = currentVisibleRowScrollPosition - ROW_HEIGHT_RAW;\n // We only need to update the active category indicator if the user has scrolled into a\n // new category scroll position.\n const updateActiveCategory = (newScrollPosition >= nextCategoryPosition) ||\n (newScrollPosition < previousCategoryPosition);\n // We only need to render new emoji rows if the user has scrolled far enough that a new row\n // would be visible (i.e. they've scrolled up or down more than 40px - the height of a row).\n const updateRenderRows = (newScrollPosition < lowerScrollBound) || (newScrollPosition > upperScrollBound);\n\n if (updateActiveCategory) {\n // New category is visible so update the active category selector and re-index the\n // positions incase anything has changed.\n [\n currentCategoryElement,\n previousCategoryPosition,\n nextCategoryPosition\n ] = getCategoryByScrollPosition(root, newScrollPosition, categoryScrollPositions);\n setCategorySelectorActive(root, currentCategoryElement);\n }\n\n if (updateRenderRows) {\n // A new row should be visible so re-render the visible emojis at this new position.\n // We request an animation frame from the browser so that we're not blocking anything.\n // The animation only needs to occur as soon as the browser is ready not immediately.\n requestAnimationFrame(() => {\n renderAtPosition(newScrollPosition, rowData);\n // Remember the updated position.\n currentVisibleRowScrollPosition = newScrollPosition;\n });\n }\n };\n};\n\n/**\n * Build the function that handles search input from the user.\n *\n * @param {Element} searchInput The search input element\n * @param {Element} searchResultsContainer Container element to display the search results\n * @param {Element} emojiContainer Container element for the emoji rows\n * @return {Function}\n */\nconst getHandleSearch = (searchInput, searchResultsContainer, emojiContainer) => {\n const rowContainer = searchResultsContainer.querySelector(SELECTORS.ROW_CONTAINER);\n // Build a render function for the search results.\n const renderSearchResultsAtPosition = generateRenderRowsAtPositionFunction(rowContainer);\n searchResultsContainer.appendChild(rowContainer);\n\n return async () => {\n const searchTerm = searchInput.value.toLowerCase();\n\n if (searchTerm) {\n // Display the search results container and hide the emojis container.\n showSearchResults(emojiContainer, searchResultsContainer);\n\n // Find which emojis match the user's search input.\n const matchingEmojis = Object.keys(EmojiData.byShortName).reduce((carry, shortName) => {\n if (shortName.includes(searchTerm)) {\n carry.push({\n shortnames: [shortName],\n unified: EmojiData.byShortName[shortName]\n });\n }\n return carry;\n }, []);\n\n const searchResultsString = await get_string('searchresults', 'core');\n const rowData = createRowDataForCategory(searchResultsString, searchResultsString, matchingEmojis, 0);\n // Show the emoji rows for the search results.\n renderSearchResultsAtPosition(0, rowData, rowData.length);\n } else {\n // Hide the search container and show the emojis container.\n clearSearch(emojiContainer, searchResultsContainer, searchInput);\n }\n };\n};\n\n/**\n * Register the emoji picker event listeners.\n *\n * @param {Element} root The picker root element\n * @param {Element} emojiContainer Root element containing the list of visible emojis\n * @param {Function} renderAtPosition Function to render the visible emojis at a given scroll position\n * @param {Number} currentVisibleRowScrollPosition What is the current scroll position\n * @param {Function} selectCallback Function to execute when the user picks an emoji\n * @param {Object} categoryScrollPositions Scroll positions for where each of the emoji categories begin\n * @param {Array} rowData Data representing each of the display rows for hte emoji container\n * @param {Number} recentEmojiRowCount Number of rows of recent emojis\n */\nconst registerEventListeners = (\n root,\n emojiContainer,\n renderAtPosition,\n currentVisibleRowScrollPosition,\n selectCallback,\n categoryScrollPositions,\n rowData,\n recentEmojiRowCount\n) => {\n const searchInput = root.querySelector(SELECTORS.SEARCH_INPUT);\n const searchResultsContainer = root.querySelector(SELECTORS.SEARCH_RESULTS_CONTAINER);\n const emojiPreview = root.querySelector(SELECTORS.EMOJI_PREVIEW);\n const emojiShortName = root.querySelector(SELECTORS.EMOJI_SHORT_NAME);\n // Build the click handler function.\n const clickHandler = getHandleClick(\n recentEmojiRowCount,\n emojiContainer,\n searchResultsContainer,\n searchInput,\n selectCallback,\n renderAtPosition\n );\n // Build the scroll handler function.\n const scrollHandler = getHandleScroll(\n root,\n currentVisibleRowScrollPosition,\n emojiContainer,\n categoryScrollPositions,\n renderAtPosition\n );\n const searchHandler = getHandleSearch(searchInput, searchResultsContainer, emojiContainer);\n\n // Mouse enter/leave events to show the emoji preview on hover or focus.\n root.addEventListener('focus', getHandleMouseEnter(emojiPreview, emojiShortName), true);\n root.addEventListener('blur', getHandleMouseLeave(emojiPreview, emojiShortName), true);\n root.addEventListener('mouseenter', getHandleMouseEnter(emojiPreview, emojiShortName), true);\n root.addEventListener('mouseleave', getHandleMouseLeave(emojiPreview, emojiShortName), true);\n // User selects an emoji or clicks on one of the emoji category selectors.\n root.addEventListener('click', e => {\n // Update the row data and category scroll positions because they may have changes if the\n // user selects an emoji which updates the recent emojis list.\n [rowData, categoryScrollPositions] = clickHandler(e, rowData, categoryScrollPositions);\n });\n // Throttle the scroll event to only execute once every 50 milliseconds to prevent performance issues\n // in the browser when re-rendering the picker emojis. The scroll event fires a lot otherwise.\n emojiContainer.addEventListener('scroll', throttle(() => scrollHandler(categoryScrollPositions, rowData), 50));\n // Debounce the search input so that it only executes 200 milliseconds after the user has finished typing.\n searchInput.addEventListener('input', debounce(searchHandler, 200));\n};\n\n/**\n * Initialise the emoji picker.\n *\n * @param {Element} root The root element for the picker\n * @param {Function} selectCallback Callback for when the user selects an emoji\n */\nexport default (root, selectCallback) => {\n const emojiContainer = root.querySelector(SELECTORS.EMOJIS_CONTAINER);\n const rowContainer = emojiContainer.querySelector(SELECTORS.ROW_CONTAINER);\n const recentEmojis = getRecentEmojis();\n // Add the recent emojis category to the list of standard categories.\n const allData = [{\n name: 'Recent',\n emojis: recentEmojis\n }, ...EmojiData.byCategory];\n let rowData = [];\n let recentEmojiRowCount = 0;\n\n /**\n * Split categories data into rows which represent how they will be displayed in the\n * picker. Each category will add a row containing the display name for the category\n * and a row for every 9 emojis in the category. The row data will be used to calculate\n * which emojis should be visible in the picker at any given time.\n *\n * E.g.\n * input = [\n * {name: 'example1', emojis: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]},\n * {name: 'example2', emojis: [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]},\n * ]\n * output = [\n * {type: 'categoryName': data: 'Example 1'},\n * {type: 'emojiRow': data: [1, 2, 3, 4, 5, 6, 7, 8, 9]},\n * {type: 'emojiRow': data: [10, 11, 12]},\n * {type: 'categoryName': data: 'Example 2'},\n * {type: 'emojiRow': data: [13, 14, 15, 16, 17, 18, 19, 20, 21]},\n * {type: 'emojiRow': data: [22, 23]},\n * ]\n */\n allData.forEach(category => {\n const categorySelector = getCategorySelectorByCategoryName(root, category.name);\n // Get the display name from the category selector button so that we don't need to\n // send an ajax request for the string.\n const categoryDisplayName = categorySelector.title;\n const categoryRowData = createRowDataForCategory(category.name, categoryDisplayName, category.emojis, rowData.length);\n\n if (category.name === 'Recent') {\n // Remember how many recent emoji rows there are because it needs to be used to\n // re-index the row data later when we're adding more recent emojis.\n recentEmojiRowCount = categoryRowData.length;\n }\n\n rowData = rowData.concat(categoryRowData);\n });\n\n // Index the row data so that we can calculate which rows should be visible.\n rowData = addIndexesToRowData(rowData);\n // Calculate the scroll positions for each of the categories within the emoji container.\n // These are used to know where to jump to when the user selects a specific category.\n const categoryScrollPositions = getCategoryScrollPositionsFromRowData(rowData);\n const renderAtPosition = generateRenderRowsAtPositionFunction(rowContainer);\n // Display the initial set of emojis.\n renderAtPosition(0, rowData);\n\n registerEventListeners(\n root,\n emojiContainer,\n renderAtPosition,\n 0,\n selectCallback,\n categoryScrollPositions,\n rowData,\n recentEmojiRowCount\n );\n};"],"names":["_localstorage","EmojiData","_interopRequireWildcard","VISIBLE_ROW_COUNT","_ref","_ref2","_ref7","_ref8","ROW_HEIGHT_RAW","ROW_TYPE","SELECTORS","createRowDataForCategory","categoryName","categoryDisplayName","emojis","totalRowCount","rowData","push","index","length","type","data","name","displayName","i","rowEmojis","slice","addIndexesToRowData","map","_objectSpread","getCategoryScrollPositionsFromRowData","reduce","carry","row","createHeaderRow","_asyncToGenerator","regeneratorRuntime","mark","_callee","rowIndex","context","html","temp","wrap","_context","prev","next","text","_templates","render","sent","document","createElement","innerHTML","firstChild","stop","_x","_x2","apply","this","arguments","createEmojiRow","_callee2","_context2","emojiData","charCodes","unified","split","code","concat","emojiText","String","fromCodePoint","shortnames","join","spacer","spacers","Array","fill","_x3","_x4","isEmojiElement","element","getAttribute","findCategorySelectorFromElement","parentElement","getCategorySelectorByCategoryName","root","querySelector","getCategoryByScrollPosition","position","categoryScrollPositions","positions","categoryPosition","sort","_ref3","_ref4","a","_slicedToArray","b","candidate","_candidate","previousPosition","currentPosition","nextPosition","getRecentEmojis","storedData","LocalStorage","get","JSON","parse","addRecentEmoji","recentEmojiRowCount","newEmoji","recentEmojis","newRecentEmojis","_toConsumableArray","filter","emoji","EMOJIS_PER_ROW","newRecentEmojiRowData","set","stringify","saveRecentEmoji","getRowsToRender","scrollPosition","visibleRowCount","minVisibleRow","Math","floor","start","end","createRowElement","_context3","style","left","right","top","abrupt","_callee3","_x5","doRowsMatch","_typeof","renderRows","rowContainer","currentRows","nextRows","toAdd","toKeep","toRemove","toRemoveElements","_context4","Promise","nextRow","some","currentRow","querySelectorAll","all","forEach","nextRowIndex","nextRowData","nextRowNode","insertBefore","splice","appendChild","rows","removeChild","_callee4","_x6","_x7","_x8","generateRenderRowsAtPositionFunction","_ref9","rowCount","isRendering","renderNextRows","_callee5","nextRowsToRender","_context5","height","showSearchResults","emojiContainer","searchResultsContainer","classList","remove","add","clearSearch","searchInput","value","getHandleMouseEnter","emojiPreview","emojiShortName","e","target","textContent","getHandleMouseLeave","getHandleScroll","currentVisibleRowScrollPosition","initialCategoryScrollPositions","renderAtPosition","_getCategoryByScrollP2","scrollTop","currentCategoryElement","previousCategoryPosition","nextCategoryPosition","newScrollPosition","updateRenderRows","_getCategoryByScrollP4","allCategorySelectors","setCategorySelectorActive","requestAnimationFrame","registerEventListeners","selectCallback","clickHandler","newRowData","newCategoryScrollPositions","replace","currentScrollTop","isRecentEmojiRowVisible","_addRecentEmoji2","categorySelector","getHandleClick","scrollHandler","searchHandler","renderSearchResultsAtPosition","_callee6","searchTerm","matchingEmojis","searchResultsString","_context6","toLowerCase","Object","keys","byShortName","shortName","includes","_str","get_string","getHandleSearch","addEventListener","_clickHandler2","_utils","throttle","allData","byCategory","category","title","categoryRowData"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"picker.min.js","sources":["../../src/emoji/picker.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Emoji picker.\n *\n * @copyright 2019 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport LocalStorage from 'core/localstorage';\nimport * as EmojiData from 'core/emoji/data';\nimport {throttle, debounce} from 'core/utils';\nimport {get_string} from 'core/str';\nimport {render as renderTemplate} from 'core/templates';\n\nconst VISIBLE_ROW_COUNT = 10;\nconst ROW_RENDER_BUFFER_COUNT = 5;\nconst RECENT_EMOJIS_STORAGE_KEY = 'moodle-recent-emojis';\nconst ROW_HEIGHT_RAW = 40;\nconst EMOJIS_PER_ROW = 7;\nconst MAX_RECENT_COUNT = EMOJIS_PER_ROW * 3;\nconst ROW_TYPE = {\n EMOJI: 0,\n HEADER: 1\n};\nconst SELECTORS = {\n CATEGORY_SELECTOR: '[data-action=\"show-category\"]',\n EMOJIS_CONTAINER: '[data-region=\"emojis-container\"]',\n EMOJI_PREVIEW: '[data-region=\"emoji-preview\"]',\n EMOJI_SHORT_NAME: '[data-region=\"emoji-short-name\"]',\n ROW_CONTAINER: '[data-region=\"row-container\"]',\n SEARCH_INPUT: '[data-region=\"search-input\"]',\n SEARCH_RESULTS_CONTAINER: '[data-region=\"search-results-container\"]'\n};\n\n/**\n * Create the row data for a category.\n *\n * @param {String} categoryName The category name\n * @param {String} categoryDisplayName The category display name\n * @param {Array} emojis The emoji data\n * @param {Number} totalRowCount The total number of rows generated so far\n * @return {Array}\n */\nconst createRowDataForCategory = (categoryName, categoryDisplayName, emojis, totalRowCount) => {\n const rowData = [];\n rowData.push({\n index: totalRowCount + rowData.length,\n type: ROW_TYPE.HEADER,\n data: {\n name: categoryName,\n displayName: categoryDisplayName\n }\n });\n\n for (let i = 0; i < emojis.length; i += EMOJIS_PER_ROW) {\n const rowEmojis = emojis.slice(i, i + EMOJIS_PER_ROW);\n rowData.push({\n index: totalRowCount + rowData.length,\n type: ROW_TYPE.EMOJI,\n data: rowEmojis\n });\n }\n\n return rowData;\n};\n\n/**\n * Add each row's index to it's value in the row data.\n *\n * @param {Array} rowData List of emoji row data\n * @return {Array}\n */\nconst addIndexesToRowData = (rowData) => {\n return rowData.map((data, index) => {\n return {...data, index};\n });\n};\n\n/**\n * Calculate the scroll position for the beginning of each category from\n * the row data.\n *\n * @param {Array} rowData List of emoji row data\n * @return {Object}\n */\nconst getCategoryScrollPositionsFromRowData = (rowData) => {\n return rowData.reduce((carry, row, index) => {\n if (row.type === ROW_TYPE.HEADER) {\n carry[row.data.name] = index * ROW_HEIGHT_RAW;\n }\n return carry;\n }, {});\n};\n\n/**\n * Create a header row element for the category name.\n *\n * @param {Number} rowIndex Index of the row in the row data\n * @param {String} name The category display name\n * @return {Element}\n */\nconst createHeaderRow = async (rowIndex, name) => {\n const context = {\n index: rowIndex,\n text: name\n };\n const html = await renderTemplate('core/emoji/header_row', context);\n const temp = document.createElement('div');\n temp.innerHTML = html;\n return temp.firstChild;\n};\n\n/**\n * Create an emoji row element.\n *\n * @param {Number} rowIndex Index of the row in the row data\n * @param {Array} emojis The list of emoji data for the row\n * @return {Element}\n */\nconst createEmojiRow = async (rowIndex, emojis) => {\n const context = {\n index: rowIndex,\n emojis: emojis.map(emojiData => {\n const charCodes = emojiData.unified.split('-').map(code => `0x${code}`);\n const emojiText = String.fromCodePoint.apply(null, charCodes);\n return {\n shortnames: `:${emojiData.shortnames.join(': :')}:`,\n unified: emojiData.unified,\n text: emojiText,\n spacer: false\n };\n }),\n spacers: Array(EMOJIS_PER_ROW - emojis.length).fill(true)\n };\n const html = await renderTemplate('core/emoji/emoji_row', context);\n const temp = document.createElement('div');\n temp.innerHTML = html;\n return temp.firstChild;\n};\n\n/**\n * Check if the element is an emoji element.\n *\n * @param {Element} element Element to check\n * @return {Bool}\n */\nconst isEmojiElement = element => element.getAttribute('data-short-names') !== null;\n\n/**\n * Search from an element and up through it's ancestors to fine the category\n * selector element and return it.\n *\n * @param {Element} element Element to begin searching from\n * @return {Element|null}\n */\nconst findCategorySelectorFromElement = element => {\n if (!element) {\n return null;\n }\n\n if (element.getAttribute('data-action') === 'show-category') {\n return element;\n } else {\n return findCategorySelectorFromElement(element.parentElement);\n }\n};\n\nconst getCategorySelectorByCategoryName = (root, name) => {\n return root.querySelector(`[data-category=\"${name}\"]`);\n};\n\n/**\n * Sets the given category selector element as active.\n *\n * @param {Element} root The root picker element\n * @param {Element} element The category selector element to make active\n */\nconst setCategorySelectorActive = (root, element) => {\n const allCategorySelectors = root.querySelectorAll(SELECTORS.CATEGORY_SELECTOR);\n\n for (let i = 0; i < allCategorySelectors.length; i++) {\n const selector = allCategorySelectors[i];\n selector.classList.remove('selected');\n }\n\n element.classList.add('selected');\n};\n\n/**\n * Get the category selector element and the scroll positions for the previous and\n * next categories for the given scroll position.\n *\n * @param {Element} root The picker root element\n * @param {Number} position The position to get the category for\n * @param {Object} categoryScrollPositions Set of scroll positions for all categories\n * @return {Array}\n */\nconst getCategoryByScrollPosition = (root, position, categoryScrollPositions) => {\n let positions = [];\n\n if (position < 0) {\n position = 0;\n }\n\n // Get all of the category positions.\n for (const categoryName in categoryScrollPositions) {\n const categoryPosition = categoryScrollPositions[categoryName];\n positions.push([categoryPosition, categoryName]);\n }\n\n // Sort the positions in ascending order.\n positions.sort(([a], [b]) => {\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n } else {\n return 0;\n }\n });\n\n // Get the current category name as well as the previous and next category\n // positions from the sorted list of positions.\n const {categoryName, previousPosition, nextPosition} = positions.reduce(\n (carry, candidate) => {\n const [categoryPosition, categoryName] = candidate;\n\n if (categoryPosition <= position) {\n carry.categoryName = categoryName;\n carry.previousPosition = carry.currentPosition;\n carry.currentPosition = position;\n } else if (carry.nextPosition === null) {\n carry.nextPosition = categoryPosition;\n }\n\n return carry;\n },\n {\n categoryName: null,\n currentPosition: null,\n previousPosition: null,\n nextPosition: null\n }\n );\n\n return [getCategorySelectorByCategoryName(root, categoryName), previousPosition, nextPosition];\n};\n\n/**\n * Get the list of recent emojis data from local storage.\n *\n * @return {Array}\n */\nconst getRecentEmojis = () => {\n const storedData = LocalStorage.get(RECENT_EMOJIS_STORAGE_KEY);\n return storedData ? JSON.parse(storedData) : [];\n};\n\n/**\n * Save the list of recent emojis in local storage.\n *\n * @param {Array} recentEmojis List of emoji data to save\n */\nconst saveRecentEmoji = (recentEmojis) => {\n LocalStorage.set(RECENT_EMOJIS_STORAGE_KEY, JSON.stringify(recentEmojis));\n};\n\n/**\n * Add an emoji data to the set of recent emojis. This function will update the row\n * data to ensure that the recent emoji rows are correct and all of the rows are\n * re-indexed.\n *\n * The new set of recent emojis are saved in local storage and the full set of updated\n * row data and new emoji row count are returned.\n *\n * @param {Array} rowData The emoji rows data\n * @param {Number} recentEmojiRowCount Count of the recent emoji rows\n * @param {Object} newEmoji The emoji data for the emoji to add to the recent emoji list\n * @return {Array}\n */\nconst addRecentEmoji = (rowData, recentEmojiRowCount, newEmoji) => {\n // The first set of rows is always the recent emojis.\n const categoryName = rowData[0].data.name;\n const categoryDisplayName = rowData[0].data.displayName;\n const recentEmojis = getRecentEmojis();\n // Add the new emoji to the start of the list of recent emojis.\n let newRecentEmojis = [newEmoji, ...recentEmojis.filter(emoji => emoji.unified != newEmoji.unified)];\n // Limit the number of recent emojis.\n newRecentEmojis = newRecentEmojis.slice(0, MAX_RECENT_COUNT);\n const newRecentEmojiRowData = createRowDataForCategory(categoryName, categoryDisplayName, newRecentEmojis);\n\n // Save the new list in local storage.\n saveRecentEmoji(newRecentEmojis);\n\n return [\n // Return the new rowData and re-index it to make sure it's all correct.\n addIndexesToRowData(newRecentEmojiRowData.concat(rowData.slice(recentEmojiRowCount))),\n newRecentEmojiRowData.length\n ];\n};\n\n/**\n * Calculate which rows should be visible based on the given scroll position. Adds a\n * buffer to amount to either side of the total number of requested rows so that\n * scrolling the emoji rows container is smooth.\n *\n * @param {Number} scrollPosition Scroll position within the emoji container\n * @param {Number} visibleRowCount How many rows should be visible\n * @param {Array} rowData The emoji rows data\n * @return {Array}\n */\nconst getRowsToRender = (scrollPosition, visibleRowCount, rowData) => {\n const minVisibleRow = scrollPosition > ROW_HEIGHT_RAW ? Math.floor(scrollPosition / ROW_HEIGHT_RAW) : 0;\n const start = minVisibleRow >= ROW_RENDER_BUFFER_COUNT ? minVisibleRow - ROW_RENDER_BUFFER_COUNT : minVisibleRow;\n const end = minVisibleRow + visibleRowCount + ROW_RENDER_BUFFER_COUNT;\n const rows = rowData.slice(start, end);\n return rows;\n};\n\n/**\n * Create a row element from the row data.\n *\n * @param {Object} rowData The emoji row data\n * @return {Element}\n */\nconst createRowElement = async (rowData) => {\n let row = null;\n if (rowData.type === ROW_TYPE.HEADER) {\n row = await createHeaderRow(rowData.index, rowData.data.displayName);\n } else {\n row = await createEmojiRow(rowData.index, rowData.data);\n }\n\n row.style.position = 'absolute';\n row.style.left = 0;\n row.style.right = 0;\n row.style.top = `${rowData.index * ROW_HEIGHT_RAW}px`;\n\n return row;\n};\n\n/**\n * Check if the given rows match.\n *\n * @param {Object} a The first row\n * @param {Object} b The second row\n * @return {Bool}\n */\nconst doRowsMatch = (a, b) => {\n if (a.index !== b.index) {\n return false;\n }\n\n if (a.type !== b.type) {\n return false;\n }\n\n if (typeof a.data != typeof b.data) {\n return false;\n }\n\n if (a.type === ROW_TYPE.HEADER) {\n return a.data.name === b.data.name;\n } else {\n if (a.data.length !== b.data.length) {\n return false;\n }\n\n for (let i = 0; i < a.data.length; i++) {\n if (a.data[i].unified != b.data[i].unified) {\n return false;\n }\n }\n }\n\n return true;\n};\n\n/**\n * Update the visible rows. Deletes any row elements that should no longer\n * be visible and creates the newly visible row elements. Any rows that haven't\n * changed visibility will be left untouched.\n *\n * @param {Element} rowContainer The container element for the emoji rows\n * @param {Array} currentRows List of row data that matches the currently visible rows\n * @param {Array} nextRows List of row data containing the new list of rows to be made visible\n */\nconst renderRows = async (rowContainer, currentRows, nextRows) => {\n // We need to add any rows that are in nextRows but not in currentRows.\n const toAdd = nextRows.filter(nextRow => !currentRows.some(currentRow => doRowsMatch(currentRow, nextRow)));\n // Remember which rows will still be visible so that we can insert our element in the correct place in the DOM.\n let toKeep = currentRows.filter(currentRow => nextRows.some(nextRow => doRowsMatch(currentRow, nextRow)));\n // We need to remove any rows that are in currentRows but not in nextRows.\n const toRemove = currentRows.filter(currentRow => !nextRows.some(nextRow => doRowsMatch(currentRow, nextRow)));\n const toRemoveElements = toRemove.map(rowData => rowContainer.querySelectorAll(`[data-row=\"${rowData.index}\"]`));\n\n // Render all of the templates first.\n const rows = await Promise.all(toAdd.map(rowData => createRowElement(rowData)));\n\n rows.forEach((row, index) => {\n const rowData = toAdd[index];\n let nextRowIndex = null;\n\n for (let i = 0; i < toKeep.length; i++) {\n const candidate = toKeep[i];\n if (candidate.index > rowData.index) {\n nextRowIndex = i;\n break;\n }\n }\n\n // Make sure the elements get added to the DOM in the correct order (ascending by row data index)\n // so that they appear naturally in the tab order.\n if (nextRowIndex !== null) {\n const nextRowData = toKeep[nextRowIndex];\n const nextRowNode = rowContainer.querySelector(`[data-row=\"${nextRowData.index}\"]`);\n\n rowContainer.insertBefore(row, nextRowNode);\n toKeep.splice(nextRowIndex, 0, toKeep);\n } else {\n toKeep.push(rowData);\n rowContainer.appendChild(row);\n }\n });\n\n toRemoveElements.forEach(rows => {\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n rowContainer.removeChild(row);\n }\n });\n};\n\n/**\n * Build a function to render the visible emoji rows for a given scroll\n * position.\n *\n * @param {Element} rowContainer The container element for the emoji rows\n * @return {Function}\n */\nconst generateRenderRowsAtPositionFunction = (rowContainer) => {\n let currentRows = [];\n let nextRows = [];\n let rowCount = 0;\n let isRendering = false;\n const renderNextRows = async () => {\n if (!nextRows.length) {\n return;\n }\n\n if (isRendering) {\n return;\n }\n\n isRendering = true;\n const nextRowsToRender = nextRows.slice();\n nextRows = [];\n\n await renderRows(rowContainer, currentRows, nextRowsToRender);\n currentRows = nextRowsToRender;\n isRendering = false;\n renderNextRows();\n };\n\n return (scrollPosition, rowData, rowLimit = VISIBLE_ROW_COUNT) => {\n nextRows = getRowsToRender(scrollPosition, rowLimit, rowData);\n renderNextRows();\n\n if (rowCount !== rowData.length) {\n // Adjust the height of the container to match the number of rows.\n rowContainer.style.height = `${rowData.length * ROW_HEIGHT_RAW}px`;\n }\n\n rowCount = rowData.length;\n };\n};\n\n/**\n * Show the search results container and hide the emoji container.\n *\n * @param {Element} emojiContainer The emojis container\n * @param {Element} searchResultsContainer The search results container\n */\nconst showSearchResults = (emojiContainer, searchResultsContainer) => {\n searchResultsContainer.classList.remove('hidden');\n emojiContainer.classList.add('hidden');\n};\n\n/**\n * Hide the search result container and show the emojis container.\n *\n * @param {Element} emojiContainer The emojis container\n * @param {Element} searchResultsContainer The search results container\n * @param {Element} searchInput The search input\n */\nconst clearSearch = (emojiContainer, searchResultsContainer, searchInput) => {\n searchResultsContainer.classList.add('hidden');\n emojiContainer.classList.remove('hidden');\n searchInput.value = '';\n};\n\n/**\n * Build function to handle mouse hovering an emoji. Shows the preview.\n *\n * @param {Element} emojiPreview The emoji preview element\n * @param {Element} emojiShortName The emoji short name element\n * @return {Function}\n */\nconst getHandleMouseEnter = (emojiPreview, emojiShortName) => {\n return (e) => {\n const target = e.target;\n if (isEmojiElement(target)) {\n emojiShortName.textContent = target.getAttribute('data-short-names');\n emojiPreview.textContent = target.textContent;\n }\n };\n};\n\n/**\n * Build function to handle mouse leaving an emoji. Removes the preview.\n *\n * @param {Element} emojiPreview The emoji preview element\n * @param {Element} emojiShortName The emoji short name element\n * @return {Function}\n */\nconst getHandleMouseLeave = (emojiPreview, emojiShortName) => {\n return (e) => {\n const target = e.target;\n if (isEmojiElement(target)) {\n emojiShortName.textContent = '';\n emojiPreview.textContent = '';\n }\n };\n};\n\n/**\n * Build the function to handle a user clicking something in the picker.\n *\n * The function currently handles clicking on the category selector or selecting\n * a specific emoji.\n *\n * @param {Number} recentEmojiRowCount Number of rows of recent emojis\n * @param {Element} emojiContainer Container element for the visible of emojis\n * @param {Element} searchResultsContainer Contaienr element for the search results\n * @param {Element} searchInput Search input element\n * @param {Function} selectCallback Callback function to execute when a user selects an emoji\n * @param {Function} renderAtPosition Render function to display current visible emojis\n * @return {Function}\n */\nconst getHandleClick = (\n recentEmojiRowCount,\n emojiContainer,\n searchResultsContainer,\n searchInput,\n selectCallback,\n renderAtPosition\n) => {\n return (e, rowData, categoryScrollPositions) => {\n const target = e.target;\n let newRowData = rowData;\n let newCategoryScrollPositions = categoryScrollPositions;\n\n // Hide the search results if they are visible.\n clearSearch(emojiContainer, searchResultsContainer, searchInput);\n\n if (isEmojiElement(target)) {\n // Emoji selected.\n const unified = target.getAttribute('data-unified');\n const shortnames = target.getAttribute('data-short-names').replace(/:/g, '').split(' ');\n // Build the emoji data from the selected element.\n const emojiData = {unified, shortnames};\n const currentScrollTop = emojiContainer.scrollTop;\n const isRecentEmojiRowVisible = emojiContainer.querySelector(`[data-row=\"${recentEmojiRowCount - 1}\"]`) !== null;\n // Save the selected emoji in the recent emojis list.\n [newRowData, recentEmojiRowCount] = addRecentEmoji(rowData, recentEmojiRowCount, emojiData);\n // Re-index the category scroll positions because the additional recent emoji may have\n // changed their positions.\n newCategoryScrollPositions = getCategoryScrollPositionsFromRowData(newRowData);\n\n if (isRecentEmojiRowVisible) {\n // If the list of recent emojis is currently visible then we need to re-render the emojis\n // to update the display and show the newly selected recent emoji.\n renderAtPosition(currentScrollTop, newRowData);\n }\n\n // Call the client's callback function with the selected emoji.\n selectCallback(target.textContent);\n // Return the newly calculated row data and scroll positions.\n return [newRowData, newCategoryScrollPositions];\n }\n\n const categorySelector = findCategorySelectorFromElement(target);\n if (categorySelector) {\n // Category selector.\n const selectedCategory = categorySelector.getAttribute('data-category');\n const position = categoryScrollPositions[selectedCategory];\n // Scroll the container to the selected category. This will trigger the\n // on scroll handler to re-render the visibile emojis.\n emojiContainer.scrollTop = position;\n }\n\n return [newRowData, newCategoryScrollPositions];\n };\n};\n\n/**\n * Build the function that handles scrolling of the emoji container to display the\n * correct emojis.\n *\n * We render the emoji rows as they are needed rather than all up front so that we\n * can avoid adding tends of thousands of elements to the DOM unnecessarily which\n * would bog down performance.\n *\n * @param {Element} root The picker root element\n * @param {Number} currentVisibleRowScrollPosition The current scroll position of the container\n * @param {Element} emojiContainer The emojis container element\n * @param {Object} initialCategoryScrollPositions Scroll positions for each category\n * @param {Function} renderAtPosition Function to render the appropriate emojis for a scroll position\n * @return {Function}\n */\nconst getHandleScroll = (\n root,\n currentVisibleRowScrollPosition,\n emojiContainer,\n initialCategoryScrollPositions,\n renderAtPosition\n) => {\n // Scope some local variables to track the scroll positions of the categories. We need to\n // recalculate these because adding recent emojis can change those positions by adding\n // additional rows.\n let [\n currentCategoryElement,\n previousCategoryPosition,\n nextCategoryPosition\n ] = getCategoryByScrollPosition(root, emojiContainer.scrollTop, initialCategoryScrollPositions);\n\n return (categoryScrollPositions, rowData) => {\n const newScrollPosition = emojiContainer.scrollTop;\n const upperScrollBound = currentVisibleRowScrollPosition + ROW_HEIGHT_RAW;\n const lowerScrollBound = currentVisibleRowScrollPosition - ROW_HEIGHT_RAW;\n // We only need to update the active category indicator if the user has scrolled into a\n // new category scroll position.\n const updateActiveCategory = (newScrollPosition >= nextCategoryPosition) ||\n (newScrollPosition < previousCategoryPosition);\n // We only need to render new emoji rows if the user has scrolled far enough that a new row\n // would be visible (i.e. they've scrolled up or down more than 40px - the height of a row).\n const updateRenderRows = (newScrollPosition < lowerScrollBound) || (newScrollPosition > upperScrollBound);\n\n if (updateActiveCategory) {\n // New category is visible so update the active category selector and re-index the\n // positions incase anything has changed.\n [\n currentCategoryElement,\n previousCategoryPosition,\n nextCategoryPosition\n ] = getCategoryByScrollPosition(root, newScrollPosition, categoryScrollPositions);\n setCategorySelectorActive(root, currentCategoryElement);\n }\n\n if (updateRenderRows) {\n // A new row should be visible so re-render the visible emojis at this new position.\n // We request an animation frame from the browser so that we're not blocking anything.\n // The animation only needs to occur as soon as the browser is ready not immediately.\n requestAnimationFrame(() => {\n renderAtPosition(newScrollPosition, rowData);\n // Remember the updated position.\n currentVisibleRowScrollPosition = newScrollPosition;\n });\n }\n };\n};\n\n/**\n * Build the function that handles search input from the user.\n *\n * @param {Element} searchInput The search input element\n * @param {Element} searchResultsContainer Container element to display the search results\n * @param {Element} emojiContainer Container element for the emoji rows\n * @return {Function}\n */\nconst getHandleSearch = (searchInput, searchResultsContainer, emojiContainer) => {\n const rowContainer = searchResultsContainer.querySelector(SELECTORS.ROW_CONTAINER);\n // Build a render function for the search results.\n const renderSearchResultsAtPosition = generateRenderRowsAtPositionFunction(rowContainer);\n searchResultsContainer.appendChild(rowContainer);\n\n return async () => {\n const searchTerm = searchInput.value.toLowerCase();\n\n if (searchTerm) {\n // Display the search results container and hide the emojis container.\n showSearchResults(emojiContainer, searchResultsContainer);\n\n // Find which emojis match the user's search input.\n const matchingEmojis = Object.keys(EmojiData.byShortName).reduce((carry, shortName) => {\n if (shortName.includes(searchTerm)) {\n carry.push({\n shortnames: [shortName],\n unified: EmojiData.byShortName[shortName]\n });\n }\n return carry;\n }, []);\n\n const searchResultsString = await get_string('searchresults', 'core');\n const rowData = createRowDataForCategory(searchResultsString, searchResultsString, matchingEmojis, 0);\n // Show the emoji rows for the search results.\n renderSearchResultsAtPosition(0, rowData, rowData.length);\n } else {\n // Hide the search container and show the emojis container.\n clearSearch(emojiContainer, searchResultsContainer, searchInput);\n }\n };\n};\n\n/**\n * Register the emoji picker event listeners.\n *\n * @param {Element} root The picker root element\n * @param {Element} emojiContainer Root element containing the list of visible emojis\n * @param {Function} renderAtPosition Function to render the visible emojis at a given scroll position\n * @param {Number} currentVisibleRowScrollPosition What is the current scroll position\n * @param {Function} selectCallback Function to execute when the user picks an emoji\n * @param {Object} categoryScrollPositions Scroll positions for where each of the emoji categories begin\n * @param {Array} rowData Data representing each of the display rows for hte emoji container\n * @param {Number} recentEmojiRowCount Number of rows of recent emojis\n */\nconst registerEventListeners = (\n root,\n emojiContainer,\n renderAtPosition,\n currentVisibleRowScrollPosition,\n selectCallback,\n categoryScrollPositions,\n rowData,\n recentEmojiRowCount\n) => {\n const searchInput = root.querySelector(SELECTORS.SEARCH_INPUT);\n const searchResultsContainer = root.querySelector(SELECTORS.SEARCH_RESULTS_CONTAINER);\n const emojiPreview = root.querySelector(SELECTORS.EMOJI_PREVIEW);\n const emojiShortName = root.querySelector(SELECTORS.EMOJI_SHORT_NAME);\n // Build the click handler function.\n const clickHandler = getHandleClick(\n recentEmojiRowCount,\n emojiContainer,\n searchResultsContainer,\n searchInput,\n selectCallback,\n renderAtPosition\n );\n // Build the scroll handler function.\n const scrollHandler = getHandleScroll(\n root,\n currentVisibleRowScrollPosition,\n emojiContainer,\n categoryScrollPositions,\n renderAtPosition\n );\n const searchHandler = getHandleSearch(searchInput, searchResultsContainer, emojiContainer);\n\n // Mouse enter/leave events to show the emoji preview on hover or focus.\n root.addEventListener('focus', getHandleMouseEnter(emojiPreview, emojiShortName), true);\n root.addEventListener('blur', getHandleMouseLeave(emojiPreview, emojiShortName), true);\n root.addEventListener('mouseenter', getHandleMouseEnter(emojiPreview, emojiShortName), true);\n root.addEventListener('mouseleave', getHandleMouseLeave(emojiPreview, emojiShortName), true);\n // User selects an emoji or clicks on one of the emoji category selectors.\n root.addEventListener('click', e => {\n // Update the row data and category scroll positions because they may have changes if the\n // user selects an emoji which updates the recent emojis list.\n [rowData, categoryScrollPositions] = clickHandler(e, rowData, categoryScrollPositions);\n });\n // Throttle the scroll event to only execute once every 50 milliseconds to prevent performance issues\n // in the browser when re-rendering the picker emojis. The scroll event fires a lot otherwise.\n emojiContainer.addEventListener('scroll', throttle(() => scrollHandler(categoryScrollPositions, rowData), 50));\n // Debounce the search input so that it only executes 200 milliseconds after the user has finished typing.\n searchInput.addEventListener('input', debounce(searchHandler, 200));\n};\n\n/**\n * Initialise the emoji picker.\n *\n * @param {Element} root The root element for the picker\n * @param {Function} selectCallback Callback for when the user selects an emoji\n */\nexport default (root, selectCallback) => {\n const emojiContainer = root.querySelector(SELECTORS.EMOJIS_CONTAINER);\n const rowContainer = emojiContainer.querySelector(SELECTORS.ROW_CONTAINER);\n const recentEmojis = getRecentEmojis();\n // Add the recent emojis category to the list of standard categories.\n const allData = [{\n name: 'Recent',\n emojis: recentEmojis\n }, ...EmojiData.byCategory];\n let rowData = [];\n let recentEmojiRowCount = 0;\n\n /**\n * Split categories data into rows which represent how they will be displayed in the\n * picker. Each category will add a row containing the display name for the category\n * and a row for every 9 emojis in the category. The row data will be used to calculate\n * which emojis should be visible in the picker at any given time.\n *\n * E.g.\n * input = [\n * {name: 'example1', emojis: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]},\n * {name: 'example2', emojis: [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]},\n * ]\n * output = [\n * {type: 'categoryName': data: 'Example 1'},\n * {type: 'emojiRow': data: [1, 2, 3, 4, 5, 6, 7, 8, 9]},\n * {type: 'emojiRow': data: [10, 11, 12]},\n * {type: 'categoryName': data: 'Example 2'},\n * {type: 'emojiRow': data: [13, 14, 15, 16, 17, 18, 19, 20, 21]},\n * {type: 'emojiRow': data: [22, 23]},\n * ]\n */\n allData.forEach(category => {\n const categorySelector = getCategorySelectorByCategoryName(root, category.name);\n // Get the display name from the category selector button so that we don't need to\n // send an ajax request for the string.\n const categoryDisplayName = categorySelector.title;\n const categoryRowData = createRowDataForCategory(category.name, categoryDisplayName, category.emojis, rowData.length);\n\n if (category.name === 'Recent') {\n // Remember how many recent emoji rows there are because it needs to be used to\n // re-index the row data later when we're adding more recent emojis.\n recentEmojiRowCount = categoryRowData.length;\n }\n\n rowData = rowData.concat(categoryRowData);\n });\n\n // Index the row data so that we can calculate which rows should be visible.\n rowData = addIndexesToRowData(rowData);\n // Calculate the scroll positions for each of the categories within the emoji container.\n // These are used to know where to jump to when the user selects a specific category.\n const categoryScrollPositions = getCategoryScrollPositionsFromRowData(rowData);\n const renderAtPosition = generateRenderRowsAtPositionFunction(rowContainer);\n // Display the initial set of emojis.\n renderAtPosition(0, rowData);\n\n registerEventListeners(\n root,\n emojiContainer,\n renderAtPosition,\n 0,\n selectCallback,\n categoryScrollPositions,\n rowData,\n recentEmojiRowCount\n );\n};"],"names":["ROW_TYPE","SELECTORS","createRowDataForCategory","categoryName","categoryDisplayName","emojis","totalRowCount","rowData","push","index","length","type","data","name","displayName","i","rowEmojis","slice","addIndexesToRowData","map","getCategoryScrollPositionsFromRowData","reduce","carry","row","createHeaderRow","rowIndex","context","text","html","temp","document","createElement","innerHTML","firstChild","createEmojiRow","emojiData","charCodes","unified","split","code","emojiText","String","fromCodePoint","apply","shortnames","join","spacer","spacers","Array","fill","isEmojiElement","element","getAttribute","findCategorySelectorFromElement","parentElement","getCategorySelectorByCategoryName","root","querySelector","getCategoryByScrollPosition","position","categoryScrollPositions","positions","categoryPosition","sort","a","b","candidate","previousPosition","currentPosition","nextPosition","getRecentEmojis","storedData","LocalStorage","get","JSON","parse","addRecentEmoji","recentEmojiRowCount","newEmoji","recentEmojis","newRecentEmojis","filter","emoji","EMOJIS_PER_ROW","newRecentEmojiRowData","set","stringify","saveRecentEmoji","concat","getRowsToRender","scrollPosition","visibleRowCount","minVisibleRow","Math","floor","start","end","createRowElement","style","left","right","top","doRowsMatch","_typeof","renderRows","rowContainer","currentRows","nextRows","toAdd","nextRow","some","currentRow","toKeep","toRemove","toRemoveElements","querySelectorAll","Promise","all","forEach","nextRowIndex","nextRowData","nextRowNode","insertBefore","splice","appendChild","rows","removeChild","generateRenderRowsAtPositionFunction","rowCount","isRendering","renderNextRows","nextRowsToRender","rowLimit","height","showSearchResults","emojiContainer","searchResultsContainer","classList","remove","add","clearSearch","searchInput","value","getHandleMouseEnter","emojiPreview","emojiShortName","e","target","textContent","getHandleMouseLeave","getHandleScroll","currentVisibleRowScrollPosition","initialCategoryScrollPositions","renderAtPosition","scrollTop","currentCategoryElement","previousCategoryPosition","nextCategoryPosition","newScrollPosition","updateRenderRows","allCategorySelectors","setCategorySelectorActive","requestAnimationFrame","registerEventListeners","selectCallback","clickHandler","newRowData","newCategoryScrollPositions","replace","currentScrollTop","isRecentEmojiRowVisible","categorySelector","getHandleClick","scrollHandler","searchHandler","renderSearchResultsAtPosition","searchTerm","toLowerCase","matchingEmojis","Object","keys","EmojiData","byShortName","shortName","includes","searchResultsString","getHandleSearch","addEventListener","allData","byCategory","category","title","categoryRowData"],"mappings":"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"} \ No newline at end of file diff --git a/lib/amd/build/event.min.js.map b/lib/amd/build/event.min.js.map index 200af10d398..c6838f6c29e 100644 --- a/lib/amd/build/event.min.js.map +++ b/lib/amd/build/event.min.js.map @@ -1 +1 @@ -{"version":3,"file":"event.min.js","sources":["../src/event.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Global registry of core events that can be triggered/listened for.\n *\n * @module core/event\n * @package core\n * @class event\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.0\n */\ndefine(['jquery', 'core/yui'],\n function($, Y) {\n\n return /** @alias module:core/event */ {\n\n\n // Public variables and functions.\n // These are AMD only events - no backwards compatibility for new things.\n Events: {\n FORM_FIELD_VALIDATION: \"core_form-field-validation\"\n },\n\n /**\n * Load the legacy YUI module which defines events in M.core.event and return it.\n *\n * @method getLegacyEvents\n * @return {Promise}\n */\n getLegacyEvents: function() {\n var result = $.Deferred();\n Y.use('event', 'moodle-core-event', function() {\n result.resolve(window.M.core.event);\n });\n return result.promise();\n },\n\n /**\n * Trigger an event using both JQuery and YUI\n *\n * @method notifyFilterContentUpdated\n * @param {string|JQuery} nodes - Selector or list of elements that were inserted.\n */\n notifyFilterContentUpdated: function(nodes) {\n nodes = $(nodes);\n Y.use('event', 'moodle-core-event', function(Y) {\n // Trigger it the JQuery way.\n $(document).trigger(M.core.event.FILTER_CONTENT_UPDATED, [nodes]);\n\n // Create a YUI NodeList from our JQuery Object.\n var yuiNodes = new Y.NodeList(nodes.get());\n\n // And again for YUI.\n Y.fire(M.core.event.FILTER_CONTENT_UPDATED, {nodes: yuiNodes});\n });\n },\n\n /**\n * Trigger an event using both JQuery and YUI\n *\n * @method notifyFormSubmittedAjax\n * @param {DOMElement} form\n * @param {boolean} skipValidation Submit the form without validation. E.g. \"Cancel\".\n */\n notifyFormSubmitAjax: function(form, skipValidation) {\n\n // Argument is optional.\n skipValidation = skipValidation || false;\n\n Y.use('event', 'moodle-core-event', function(Y) {\n if (skipValidation) {\n window.skipClientValidation = true;\n }\n // Trigger it the JQuery way.\n $(form).trigger(M.core.event.FORM_SUBMIT_AJAX);\n\n // And again for YUI.\n Y.one(form).fire(M.core.event.FORM_SUBMIT_AJAX, {currentTarget: Y.one(form)});\n\n if (skipValidation) {\n window.skipClientValidation = false;\n }\n });\n },\n\n /**\n * Trigger an event using both JQuery and YUI\n * This event alerts the world that the editor has restored some content.\n *\n * @method notifyEditorContentRestored\n */\n notifyEditorContentRestored: function() {\n Y.use('event', 'moodle-core-event', function(Y) {\n // Trigger it the JQuery way.\n $(document).trigger(M.core.event.EDITOR_CONTENT_RESTORED);\n\n // And again for YUI.\n Y.fire(M.core.event.EDITOR_CONTENT_RESTORED);\n });\n },\n };\n});\n"],"names":["define","$","Y","Events","FORM_FIELD_VALIDATION","getLegacyEvents","result","Deferred","use","resolve","window","M","core","event","promise","notifyFilterContentUpdated","nodes","document","trigger","FILTER_CONTENT_UPDATED","yuiNodes","NodeList","get","fire","notifyFormSubmitAjax","form","skipValidation","skipClientValidation","FORM_SUBMIT_AJAX","one","currentTarget","notifyEditorContentRestored","EDITOR_CONTENT_RESTORED"],"mappings":";;;;;;;;;;AAyBAA,OAAM,aAAC,CAAC,SAAU,aACX,SAASC,EAAGC,GAEwB,MAAA,CAKnCC,OAAQ,CACJC,sBAAuB,8BAS3BC,gBAAiB,WACb,IAAIC,OAASL,EAAEM,WAIRD,OAHPJ,EAAEM,IAAI,QAAS,qBAAqB,WAChCF,OAAOG,QAAQC,OAAOC,EAAEC,KAAKC,MAChC,IACMP,OAAOQ,SApBiB,EA6BnCC,2BAA4B,SAASC,OACjCA,MAAQf,EAAEe,OACVd,EAAEM,IAAI,QAAS,qBAAqB,SAASN,GAEzCD,EAAEgB,UAAUC,QAAQP,EAAEC,KAAKC,MAAMM,uBAAwB,CAACH,QAGtDI,IAAAA,SAAW,IAAIlB,EAAEmB,SAASL,MAAMM,OAGpCpB,EAAEqB,KAAKZ,EAAEC,KAAKC,MAAMM,uBAAwB,CAACH,MAAOI,UACvD,GAxC8B,EAkDnCI,qBAAsB,SAASC,KAAMC,gBAGjCA,eAAiBA,iBAAkB,EAEnCxB,EAAEM,IAAI,QAAS,qBAAqB,SAASN,GACrCwB,iBACAhB,OAAOiB,sBAAuB,GAGlC1B,EAAEwB,MAAMP,QAAQP,EAAEC,KAAKC,MAAMe,kBAG7B1B,EAAE2B,IAAIJ,MAAMF,KAAKZ,EAAEC,KAAKC,MAAMe,iBAAkB,CAACE,cAAe5B,EAAE2B,IAAIJ,QAElEC,iBACAhB,OAAOiB,sBAAuB,EAErC,GApE8B,EA6EnCI,4BAA6B,WACzB7B,EAAEM,IAAI,QAAS,qBAAqB,SAASN,GAEzCD,EAAEgB,UAAUC,QAAQP,EAAEC,KAAKC,MAAMmB,yBAGjC9B,EAAEqB,KAAKZ,EAAEC,KAAKC,MAAMmB,wBACvB,GACJ,EAER"} \ No newline at end of file +{"version":3,"file":"event.min.js","sources":["../src/event.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Global registry of core events that can be triggered/listened for.\n *\n * @module core/event\n * @package core\n * @class event\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.0\n */\ndefine(['jquery', 'core/yui'],\n function($, Y) {\n\n return /** @alias module:core/event */ {\n\n\n // Public variables and functions.\n // These are AMD only events - no backwards compatibility for new things.\n Events: {\n FORM_FIELD_VALIDATION: \"core_form-field-validation\"\n },\n\n /**\n * Load the legacy YUI module which defines events in M.core.event and return it.\n *\n * @method getLegacyEvents\n * @return {Promise}\n */\n getLegacyEvents: function() {\n var result = $.Deferred();\n Y.use('event', 'moodle-core-event', function() {\n result.resolve(window.M.core.event);\n });\n return result.promise();\n },\n\n /**\n * Trigger an event using both JQuery and YUI\n *\n * @method notifyFilterContentUpdated\n * @param {string|JQuery} nodes - Selector or list of elements that were inserted.\n */\n notifyFilterContentUpdated: function(nodes) {\n nodes = $(nodes);\n Y.use('event', 'moodle-core-event', function(Y) {\n // Trigger it the JQuery way.\n $(document).trigger(M.core.event.FILTER_CONTENT_UPDATED, [nodes]);\n\n // Create a YUI NodeList from our JQuery Object.\n var yuiNodes = new Y.NodeList(nodes.get());\n\n // And again for YUI.\n Y.fire(M.core.event.FILTER_CONTENT_UPDATED, {nodes: yuiNodes});\n });\n },\n\n /**\n * Trigger an event using both JQuery and YUI\n *\n * @method notifyFormSubmittedAjax\n * @param {DOMElement} form\n * @param {boolean} skipValidation Submit the form without validation. E.g. \"Cancel\".\n */\n notifyFormSubmitAjax: function(form, skipValidation) {\n\n // Argument is optional.\n skipValidation = skipValidation || false;\n\n Y.use('event', 'moodle-core-event', function(Y) {\n if (skipValidation) {\n window.skipClientValidation = true;\n }\n // Trigger it the JQuery way.\n $(form).trigger(M.core.event.FORM_SUBMIT_AJAX);\n\n // And again for YUI.\n Y.one(form).fire(M.core.event.FORM_SUBMIT_AJAX, {currentTarget: Y.one(form)});\n\n if (skipValidation) {\n window.skipClientValidation = false;\n }\n });\n },\n\n /**\n * Trigger an event using both JQuery and YUI\n * This event alerts the world that the editor has restored some content.\n *\n * @method notifyEditorContentRestored\n */\n notifyEditorContentRestored: function() {\n Y.use('event', 'moodle-core-event', function(Y) {\n // Trigger it the JQuery way.\n $(document).trigger(M.core.event.EDITOR_CONTENT_RESTORED);\n\n // And again for YUI.\n Y.fire(M.core.event.EDITOR_CONTENT_RESTORED);\n });\n },\n };\n});\n"],"names":["define","$","Y","Events","FORM_FIELD_VALIDATION","getLegacyEvents","result","Deferred","use","resolve","window","M","core","event","promise","notifyFilterContentUpdated","nodes","document","trigger","FILTER_CONTENT_UPDATED","yuiNodes","NodeList","get","fire","notifyFormSubmitAjax","form","skipValidation","skipClientValidation","FORM_SUBMIT_AJAX","one","currentTarget","notifyEditorContentRestored","EDITOR_CONTENT_RESTORED"],"mappings":";;;;;;;;;;AAyBAA,oBAAO,CAAC,SAAU,aACX,SAASC,EAAGC,SAEwB,CAKnCC,OAAQ,CACJC,sBAAuB,8BAS3BC,gBAAiB,eACTC,OAASL,EAAEM,kBACfL,EAAEM,IAAI,QAAS,qBAAqB,WAChCF,OAAOG,QAAQC,OAAOC,EAAEC,KAAKC,UAE1BP,OAAOQ,WASlBC,2BAA4B,SAASC,OACjCA,MAAQf,EAAEe,OACVd,EAAEM,IAAI,QAAS,qBAAqB,SAASN,GAEzCD,EAAEgB,UAAUC,QAAQP,EAAEC,KAAKC,MAAMM,uBAAwB,CAACH,YAGtDI,SAAW,IAAIlB,EAAEmB,SAASL,MAAMM,OAGpCpB,EAAEqB,KAAKZ,EAAEC,KAAKC,MAAMM,uBAAwB,CAACH,MAAOI,eAW5DI,qBAAsB,SAASC,KAAMC,gBAGjCA,eAAiBA,iBAAkB,EAEnCxB,EAAEM,IAAI,QAAS,qBAAqB,SAASN,GACrCwB,iBACAhB,OAAOiB,sBAAuB,GAGlC1B,EAAEwB,MAAMP,QAAQP,EAAEC,KAAKC,MAAMe,kBAG7B1B,EAAE2B,IAAIJ,MAAMF,KAAKZ,EAAEC,KAAKC,MAAMe,iBAAkB,CAACE,cAAe5B,EAAE2B,IAAIJ,QAElEC,iBACAhB,OAAOiB,sBAAuB,OAW1CI,4BAA6B,WACzB7B,EAAEM,IAAI,QAAS,qBAAqB,SAASN,GAEzCD,EAAEgB,UAAUC,QAAQP,EAAEC,KAAKC,MAAMmB,yBAGjC9B,EAAEqB,KAAKZ,EAAEC,KAAKC,MAAMmB"} \ No newline at end of file diff --git a/lib/amd/build/first.min.js.map b/lib/amd/build/first.min.js.map index d6c3b083ac6..3aefbd63932 100644 --- a/lib/amd/build/first.min.js.map +++ b/lib/amd/build/first.min.js.map @@ -1 +1 @@ -{"version":3,"file":"first.min.js","sources":["../src/first.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\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 is an empty module, that is required before all other modules.\n * Because every module is returned from a request for any other module, this\n * forces the loading of all modules with a single request.\n *\n * This function also sets up the listeners for ajax requests so we can tell\n * if any requests are still in progress.\n *\n * @module core/first\n * @package core\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'], function($) {\n $(document).bind(\"ajaxStart\", function() {\n M.util.js_pending('jq');\n }).bind(\"ajaxStop\", function() {\n M.util.js_complete('jq');\n });\n});\n"],"names":["define","$","document","bind","M","util","js_pending","js_complete"],"mappings":";;;;;;;;;;;;;;AA6BAA,oBAAO,CAAC,WAAW,SAASC,GACxBA,EAAEC,UAAUC,KAAK,aAAa,WAC1BC,EAAEC,KAAKC,WAAW,KACrB,IAAEH,KAAK,YAAY,WAChBC,EAAEC,KAAKE,YAAY,KACtB,GACJ"} \ No newline at end of file +{"version":3,"file":"first.min.js","sources":["../src/first.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\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 is an empty module, that is required before all other modules.\n * Because every module is returned from a request for any other module, this\n * forces the loading of all modules with a single request.\n *\n * This function also sets up the listeners for ajax requests so we can tell\n * if any requests are still in progress.\n *\n * @module core/first\n * @package core\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'], function($) {\n $(document).bind(\"ajaxStart\", function() {\n M.util.js_pending('jq');\n }).bind(\"ajaxStop\", function() {\n M.util.js_complete('jq');\n });\n});\n"],"names":["define","$","document","bind","M","util","js_pending","js_complete"],"mappings":";;;;;;;;;;;;;;AA6BAA,oBAAO,CAAC,WAAW,SAASC,GACxBA,EAAEC,UAAUC,KAAK,aAAa,WAC1BC,EAAEC,KAAKC,WAAW,SACnBH,KAAK,YAAY,WAChBC,EAAEC,KAAKE,YAAY"} \ No newline at end of file diff --git a/lib/amd/build/form-autocomplete.min.js.map b/lib/amd/build/form-autocomplete.min.js.map index 6ff1d136930..8910ae6e14c 100644 --- a/lib/amd/build/form-autocomplete.min.js.map +++ b/lib/amd/build/form-autocomplete.min.js.map @@ -1 +1 @@ -{"version":3,"file":"form-autocomplete.min.js","sources":["../src/form-autocomplete.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Autocomplete wrapper for select2 library.\n *\n * @module core/form-autocomplete\n * @class autocomplete\n * @package core\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.0\n */\n/* globals require: false */\ndefine(\n ['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification', 'core/loadingicon'],\nfunction($, log, str, templates, notification, LoadingIcon) {\n\n // Private functions and variables.\n /** @var {Object} KEYS - List of keycode constants. */\n var KEYS = {\n DOWN: 40,\n ENTER: 13,\n SPACE: 32,\n ESCAPE: 27,\n COMMA: 44,\n UP: 38,\n LEFT: 37,\n RIGHT: 39\n };\n\n var uniqueId = Date.now();\n\n /**\n * Make an item in the selection list \"active\".\n *\n * @method activateSelection\n * @private\n * @param {Number} index The index in the current (visible) list of selection.\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var activateSelection = function(index, state) {\n // Find the elements in the DOM.\n var selectionElement = $(document.getElementById(state.selectionId));\n\n // Count the visible items.\n var length = selectionElement.children('[aria-selected=true]').length;\n // Limit the index to the upper/lower bounds of the list (wrap in both directions).\n index = index % length;\n while (index < 0) {\n index += length;\n }\n // Find the specified element.\n var element = $(selectionElement.children('[aria-selected=true]').get(index));\n // Create an id we can assign to this element.\n var itemId = state.selectionId + '-' + index;\n\n // Deselect all the selections.\n selectionElement.children().attr('data-active-selection', null).attr('id', '');\n\n // Select only this suggestion and assign it the id.\n element.attr('data-active-selection', true).attr('id', itemId);\n\n // Tell the input field it has a new active descendant so the item is announced.\n selectionElement.attr('aria-activedescendant', itemId);\n selectionElement.attr('data-active-value', element.attr('data-value'));\n\n return $.Deferred().resolve();\n };\n\n /**\n * Get the actively selected element from the state object.\n *\n * @param {Object} state\n * @returns {jQuery}\n */\n var getActiveElementFromState = function(state) {\n var selectionRegion = $(document.getElementById(state.selectionId));\n var activeId = selectionRegion.attr('aria-activedescendant');\n\n if (activeId) {\n var activeElement = $(document.getElementById(activeId));\n if (activeElement.length) {\n // The active descendent still exists.\n return activeElement;\n }\n }\n\n var activeValue = selectionRegion.attr('data-active-value');\n return selectionRegion.find('[data-value=\"' + activeValue + '\"]');\n };\n\n /**\n * Update the active selection from the given state object.\n *\n * @param {Object} state\n */\n var updateActiveSelectionFromState = function(state) {\n var activeElement = getActiveElementFromState(state);\n var activeValue = activeElement.attr('data-value');\n\n var selectionRegion = $(document.getElementById(state.selectionId));\n if (activeValue) {\n // Find the index of the currently selected index.\n var activeIndex = selectionRegion.find('[aria-selected=true]').index(activeElement);\n\n if (activeIndex !== -1) {\n activateSelection(activeIndex, state);\n return;\n }\n }\n\n // Either the active index was not set, or it could not be found.\n // Select the first value instead.\n activateSelection(0, state);\n };\n\n /**\n * Update the element that shows the currently selected items.\n *\n * @method updateSelectionList\n * @private\n * @param {Object} options Original options for this autocomplete element.\n * @param {Object} state State variables for this autocomplete element.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var updateSelectionList = function(options, state, originalSelect) {\n var pendingKey = 'form-autocomplete-updateSelectionList-' + state.inputId;\n M.util.js_pending(pendingKey);\n\n // Build up a valid context to re-render the template.\n var items = [];\n var newSelection = $(document.getElementById(state.selectionId));\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).prop('selected')) {\n var label;\n if ($(ele).data('html')) {\n label = $(ele).data('html');\n } else {\n label = $(ele).html();\n }\n if (label !== '') {\n items.push({label: label, value: $(ele).attr('value')});\n }\n }\n });\n\n if (!hasItemListChanged(state, items)) {\n M.util.js_complete(pendingKey);\n return Promise.resolve();\n }\n\n state.items = items;\n\n var context = $.extend(options, state);\n // Render the template.\n return templates.render(options.templates.items, context)\n .then(function(html, js) {\n // Add it to the page.\n templates.replaceNodeContents(newSelection, html, js);\n\n updateActiveSelectionFromState(state);\n\n return;\n })\n .then(function() {\n return M.util.js_complete(pendingKey);\n })\n .catch(notification.exception);\n };\n\n /**\n * Check whether the list of items stored in the state has changed.\n *\n * @param {Object} state\n * @param {Array} items\n */\n var hasItemListChanged = function(state, items) {\n if (state.items.length !== items.length) {\n return true;\n }\n\n // Check for any items in the state items which are not present in the new items list.\n return state.items.filter(item => items.indexOf(item) === -1).length > 0;\n };\n\n /**\n * Notify of a change in the selection.\n *\n * @param {jQuery} originalSelect The jQuery object matching the hidden select list.\n */\n var notifyChange = function(originalSelect) {\n if (typeof M.core_formchangechecker !== 'undefined') {\n M.core_formchangechecker.set_form_changed();\n }\n\n // Note, jQuery .change() was not working here.\n var event;\n if (typeof Event === 'function') {\n event = new Event('change');\n } else {\n // Support IE.\n event = document.createEvent('Event');\n event.initEvent('change', true, true);\n }\n originalSelect[0].dispatchEvent(event);\n };\n\n /**\n * Remove the given item from the list of selected things.\n *\n * @method deselectItem\n * @private\n * @param {Object} options Original options for this autocomplete element.\n * @param {Object} state State variables for this autocomplete element.\n * @param {Element} item The item to be deselected.\n * @param {Element} originalSelect The original select list.\n * @return {Promise}\n */\n var deselectItem = function(options, state, item, originalSelect) {\n var selectedItemValue = $(item).attr('data-value');\n\n // Look for a match, and toggle the selected property if there is a match.\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).attr('value') == selectedItemValue) {\n $(ele).prop('selected', false);\n // We remove newly created custom tags from the suggestions list when they are deselected.\n if ($(ele).attr('data-iscustom')) {\n $(ele).remove();\n }\n }\n });\n // Rerender the selection list.\n return updateSelectionList(options, state, originalSelect)\n .then(function() {\n // Notify that the selection changed.\n notifyChange(originalSelect);\n\n return;\n });\n };\n\n /**\n * Make an item in the suggestions \"active\" (about to be selected).\n *\n * @method activateItem\n * @private\n * @param {Number} index The index in the current (visible) list of suggestions.\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activateItem = function(index, state) {\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Count the visible items.\n var length = suggestionsElement.children('[aria-hidden=false]').length;\n // Limit the index to the upper/lower bounds of the list (wrap in both directions).\n index = index % length;\n while (index < 0) {\n index += length;\n }\n // Find the specified element.\n var element = $(suggestionsElement.children('[aria-hidden=false]').get(index));\n // Find the index of this item in the full list of suggestions (including hidden).\n var globalIndex = $(suggestionsElement.children('[role=option]')).index(element);\n // Create an id we can assign to this element.\n var itemId = state.suggestionsId + '-' + globalIndex;\n\n // Deselect all the suggestions.\n suggestionsElement.children().attr('aria-selected', false).attr('id', '');\n // Select only this suggestion and assign it the id.\n element.attr('aria-selected', true).attr('id', itemId);\n // Tell the input field it has a new active descendant so the item is announced.\n inputElement.attr('aria-activedescendant', itemId);\n\n // Scroll it into view.\n var scrollPos = element.offset().top\n - suggestionsElement.offset().top\n + suggestionsElement.scrollTop()\n - (suggestionsElement.height() / 2);\n return suggestionsElement.animate({\n scrollTop: scrollPos\n }, 100).promise();\n };\n\n /**\n * Find the index of the current active suggestion, and activate the next one.\n *\n * @method activateNextItem\n * @private\n * @param {Object} state State variable for this auto complete element.\n * @return {Promise}\n */\n var activateNextItem = function(state) {\n // Find the list of suggestions.\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Find the active one.\n var element = suggestionsElement.children('[aria-selected=true]');\n // Find it's index.\n var current = suggestionsElement.children('[aria-hidden=false]').index(element);\n // Activate the next one.\n return activateItem(current + 1, state);\n };\n\n /**\n * Find the index of the current active selection, and activate the previous one.\n *\n * @method activatePreviousSelection\n * @private\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activatePreviousSelection = function(state) {\n // Find the list of selections.\n var selectionsElement = $(document.getElementById(state.selectionId));\n // Find the active one.\n var element = selectionsElement.children('[data-active-selection]');\n if (!element) {\n return activateSelection(0, state);\n }\n // Find it's index.\n var current = selectionsElement.children('[aria-selected=true]').index(element);\n // Activate the next one.\n return activateSelection(current - 1, state);\n };\n\n /**\n * Find the index of the current active selection, and activate the next one.\n *\n * @method activateNextSelection\n * @private\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activateNextSelection = function(state) {\n // Find the list of selections.\n var selectionsElement = $(document.getElementById(state.selectionId));\n\n // Find the active one.\n var element = selectionsElement.children('[data-active-selection]');\n var current = 0;\n\n if (element) {\n // The element was found. Determine the index and move to the next one.\n current = selectionsElement.children('[aria-selected=true]').index(element);\n current = current + 1;\n } else {\n // No selected item found. Move to the first.\n current = 0;\n }\n\n return activateSelection(current, state);\n };\n\n /**\n * Find the index of the current active suggestion, and activate the previous one.\n *\n * @method activatePreviousItem\n * @private\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var activatePreviousItem = function(state) {\n // Find the list of suggestions.\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Find the active one.\n var element = suggestionsElement.children('[aria-selected=true]');\n\n // Find it's index.\n var current = suggestionsElement.children('[aria-hidden=false]').index(element);\n\n // Activate the previous one.\n return activateItem(current - 1, state);\n };\n\n /**\n * Close the list of suggestions.\n *\n * @method closeSuggestions\n * @private\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var closeSuggestions = function(state) {\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n if (inputElement.attr('aria-expanded') === \"true\") {\n // Announce the list of suggestions was closed.\n inputElement.attr('aria-expanded', false);\n }\n // Read the current list of selections.\n inputElement.attr('aria-activedescendant', state.selectionId);\n\n // Hide the suggestions list (from screen readers too).\n suggestionsElement.hide().attr('aria-hidden', true);\n\n return $.Deferred().resolve();\n };\n\n /**\n * Rebuild the list of suggestions based on the current values in the select list, and the query.\n *\n * @method updateSuggestions\n * @private\n * @param {Object} options The original options for this autocomplete.\n * @param {Object} state The state variables for this autocomplete.\n * @param {String} query The current text for the search string.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var updateSuggestions = function(options, state, query, originalSelect) {\n var pendingKey = 'form-autocomplete-updateSuggestions-' + state.inputId;\n M.util.js_pending(pendingKey);\n\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Used to track if we found any visible suggestions.\n var matchingElements = false;\n // Options is used by the context when rendering the suggestions from a template.\n var suggestions = [];\n originalSelect.children('option').each(function(index, option) {\n if ($(option).prop('selected') !== true) {\n suggestions[suggestions.length] = {label: option.innerHTML, value: $(option).attr('value')};\n }\n });\n\n // Re-render the list of suggestions.\n var searchquery = state.caseSensitive ? query : query.toLocaleLowerCase();\n var context = $.extend({options: suggestions}, options, state);\n var returnVal = templates.render(\n 'core/form_autocomplete_suggestions',\n context\n )\n .then(function(html, js) {\n // We have the new template, insert it in the page.\n templates.replaceNode(suggestionsElement, html, js);\n\n // Get the element again.\n suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Show it if it is hidden.\n suggestionsElement.show().attr('aria-hidden', false);\n // For each option in the list, hide it if it doesn't match the query.\n suggestionsElement.children().each(function(index, node) {\n node = $(node);\n if ((options.caseSensitive && node.text().indexOf(searchquery) > -1) ||\n (!options.caseSensitive && node.text().toLocaleLowerCase().indexOf(searchquery) > -1)) {\n node.show().attr('aria-hidden', false);\n matchingElements = true;\n } else {\n node.hide().attr('aria-hidden', true);\n }\n });\n // If we found any matches, show the list.\n inputElement.attr('aria-expanded', true);\n if (originalSelect.attr('data-notice')) {\n // Display a notice rather than actual suggestions.\n suggestionsElement.html(originalSelect.attr('data-notice'));\n } else if (matchingElements) {\n // We only activate the first item in the list if tags is false,\n // because otherwise \"Enter\" would select the first item, instead of\n // creating a new tag.\n if (!options.tags) {\n activateItem(0, state);\n }\n } else {\n // Nothing matches. Tell them that.\n str.get_string('nosuggestions', 'form').done(function(nosuggestionsstr) {\n suggestionsElement.html(nosuggestionsstr);\n });\n }\n\n return suggestionsElement;\n })\n .then(function() {\n return M.util.js_complete(pendingKey);\n })\n .catch(notification.exception);\n\n return returnVal;\n };\n\n /**\n * Create a new item for the list (a tag).\n *\n * @method createItem\n * @private\n * @param {Object} options The original options for the autocomplete.\n * @param {Object} state State variables for the autocomplete.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var createItem = function(options, state, originalSelect) {\n // Find the element in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n // Get the current text in the input field.\n var query = inputElement.val();\n var tags = query.split(',');\n var found = false;\n\n $.each(tags, function(tagindex, tag) {\n // If we can only select one at a time, deselect any current value.\n tag = tag.trim();\n if (tag !== '') {\n if (!options.multiple) {\n originalSelect.children('option').prop('selected', false);\n }\n // Look for an existing option in the select list that matches this new tag.\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).attr('value') == tag) {\n found = true;\n $(ele).prop('selected', true);\n }\n });\n // Only create the item if it's new.\n if (!found) {\n var option = $('