mirrored from git://git.moodle.org/moodle.git
-
Notifications
You must be signed in to change notification settings - Fork 6.4k
/
dynamic_tabs.min.js.map
1 lines (1 loc) · 11.9 KB
/
dynamic_tabs.min.js.map
1
{"version":3,"sources":["../src/dynamic_tabs.js"],"names":["SELECTORS","dynamicTabs","activeTab","allActiveTabs","tabContent","tabToggle","tabPane","forTabName","tabName","forTabId","init","on","event","preventDefault","stopPropagation","key","component","then","strChangesMade","strChangesMadeReally","strConfirm","Notification","confirm","target","trigger","type","catch","exception","tab","attr","length","loadTab","openTabFromHash","tabs","document","querySelector","openTab","getAttribute","classList","add","indicateNodeIsLoading","node","Templates","render","html","js","replaceNodeContents","getActiveTabName","element","getFirstTabName","dataset","additionalData","pendingPromise","Pending","tabdata","closest","wsData","reportid","id","tabjs","textContent","tabClass","JSON","stringify","data","javascript","template","parse","content","resolve","getTab","getTabPane","getElementById","hash","location","match","replace"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Dynamic Tabs UI element with AJAX loading of tabs content\n *\n * @module core/dynamic_tabs\n * @copyright 2021 David Matamoros <davidmc@moodle.com> based on code from Marina Glancy\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 Pending from 'core/pending';\nimport {get_strings as getStrings} from 'core/str';\nimport {getContent} from 'core/local/repository/dynamic_tabs';\nimport {isAnyWatchedFormDirty, resetAllFormDirtyStates} from 'core_form/changechecker';\n\nconst SELECTORS = {\n dynamicTabs: '.dynamictabs',\n activeTab: '.dynamictabs .nav-link.active',\n allActiveTabs: '.dynamictabs .nav-link[data-toggle=\"tab\"]:not(.disabled)',\n tabContent: '.dynamictabs .tab-pane [data-tab-content]',\n tabToggle: 'a[data-toggle=\"tab\"]',\n tabPane: '.dynamictabs .tab-pane',\n};\n\nSELECTORS.forTabName = tabName => `.dynamictabs [data-tab-content=\"${tabName}\"]`;\nSELECTORS.forTabId = tabName => `.dynamictabs [data-toggle=\"tab\"][href=\"#${tabName}\"]`;\n\n/**\n * Initialises the tabs view on the page (only one tabs view per page is supported)\n */\nexport const init = () => {\n const tabToggle = $(SELECTORS.tabToggle);\n\n // Listen to click, warn user if they are navigating away with unsaved form changes.\n tabToggle.on('click', (event) => {\n if (!isAnyWatchedFormDirty()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n getStrings([\n {key: 'changesmade', component: 'moodle'},\n {key: 'changesmadereallygoaway', component: 'moodle'},\n {key: 'confirm', component: 'moodle'},\n ]).then(([strChangesMade, strChangesMadeReally, strConfirm]) =>\n // Reset form dirty state on confirmation, re-trigger the event.\n Notification.confirm(strChangesMade, strChangesMadeReally, strConfirm, null, () => {\n resetAllFormDirtyStates();\n $(event.target).trigger(event.type);\n })\n ).catch(Notification.exception);\n });\n\n // This code listens to Bootstrap event 'shown.bs.tab' which is triggered using JQuery and\n // can not be converted yet to native events.\n tabToggle.on('shown.bs.tab', function() {\n const tab = $($(this).attr('href'));\n if (tab.length !== 1) {\n return;\n }\n loadTab(tab.attr('id'));\n });\n\n if (!openTabFromHash()) {\n const tabs = document.querySelector(SELECTORS.allActiveTabs);\n if (tabs) {\n openTab(tabs.getAttribute('aria-controls'));\n } else {\n // We may hide tabs if there is only one available, just load the contents of the first tab.\n const tabPane = document.querySelector(SELECTORS.tabPane);\n if (tabPane) {\n tabPane.classList.add('active', 'show');\n loadTab(tabPane.getAttribute('id'));\n }\n }\n }\n};\n\n/**\n * Show \"loading\" template instead of a node\n *\n * @param {HTMLElement} node\n * @return {Promise}\n */\nconst indicateNodeIsLoading = (node) => {\n return Templates.render('core/loading', {})\n .then((html, js) => {\n return Templates.replaceNodeContents(node, html, js);\n }).catch(Notification.exception);\n};\n\n/**\n * Returns id/name of the currently active tab\n *\n * @return {String|null}\n */\nconst getActiveTabName = () => {\n const element = document.querySelector(SELECTORS.activeTab);\n return element?.getAttribute('aria-controls') || null;\n};\n\n/**\n * Returns the id/name of the first tab\n *\n * @return {String|null}\n */\nconst getFirstTabName = () => {\n const element = document.querySelector(SELECTORS.tabContent);\n return element?.dataset.tabContent || null;\n};\n\n/**\n * Loads contents of a tab using an AJAX request\n *\n * @param {String} tabName\n * @param {Object} additionalData additional data to pass to WS\n */\nconst loadTab = (tabName, additionalData = {}) => {\n // If tabName is not specified find the active tab, or if is not defined, the first available tab.\n tabName = tabName ?? getActiveTabName() ?? getFirstTabName();\n\n const tab = document.querySelector(SELECTORS.forTabName(tabName));\n if (!tab) {\n return;\n }\n\n const pendingPromise = new Pending('core/dynamic_tabs:loadTab:' + tabName);\n const tabdata = tab.closest(SELECTORS.dynamicTabs);\n const wsData = {\n 'reportid': tabdata.dataset.reportid,\n 'id': tabdata.dataset.id,\n ...additionalData\n };\n let tabjs = '';\n tab.textContent = '';\n\n indicateNodeIsLoading(tab)\n .then(() => {\n return getContent(tab.dataset.tabClass, JSON.stringify(wsData));\n })\n .then((data) => {\n tabjs = data.javascript;\n return Templates.render(data.template, JSON.parse(data.content));\n })\n .then((html, js) => {\n return Templates.replaceNodeContents(tab, html, js + tabjs);\n })\n .then(() => {\n pendingPromise.resolve();\n return null;\n })\n .catch(Notification.exception);\n};\n\n/**\n * Return the tab given the tab name\n *\n * @param {String} tabName\n * @return {HTMLElement}\n */\nconst getTab = (tabName) => {\n return document.querySelector(SELECTORS.forTabId(tabName));\n};\n\n/**\n * Return the tab pane given the tab name\n *\n * @param {String} tabName\n * @return {HTMLElement}\n */\nconst getTabPane = (tabName) => {\n return document.getElementById(tabName);\n};\n\n/**\n * Open the tab on page load. If this script loads before theme_boost/tab we need to open tab ourselves\n *\n * @param {String} tabName\n * @return {Boolean}\n */\nconst openTab = (tabName) => {\n const tab = getTab(tabName);\n if (!tab) {\n return false;\n }\n\n loadTab(tabName);\n tab.classList.add('active');\n getTabPane(tabName).classList.add('active', 'show');\n return true;\n};\n\n/**\n * If there is a location hash that is the same as the tab name - open this tab.\n *\n * @return {Boolean}\n */\nconst openTabFromHash = () => {\n const hash = document.location.hash;\n if (hash.match(/^#\\w+$/g)) {\n return openTab(hash.replace(/^#/g, ''));\n }\n\n return false;\n};\n"],"file":"dynamic_tabs.min.js"}