Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

{"version":3,"file":"contenttree.min.js","sources":["../../../src/local/courseeditor/contenttree.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License 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 * Course index keyboard navigation and aria-tree compatibility.\n *\n * Node tree and bootstrap collapsibles don't use the same HTML structure. However,\n * all keybindings and logic is compatible. This class translate the primitive opetations\n * to a bootstrap collapsible structure.\n *\n * @module     core_courseformat/local/courseeditor/contenttree\n * @class      core_courseformat/local/courseeditor/contenttree\n * @copyright  2021 Ferran Recio <ferran@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n// The core/tree uses jQuery to expand all nodes.\nimport jQuery from 'jquery';\nimport Tree from 'core/tree';\nimport {getList} from 'core/normalise';\n\nexport default class extends Tree {\n\n    /**\n     * Setup the core/tree keyboard navigation.\n     *\n     * @param {Element|undefined} mainElement an alternative main element in case it is not from the parent component\n     * @param {Object|undefined} selectors alternative selectors\n     * @param {boolean} preventcache if the elements cache must be disabled.\n     */\n    constructor(mainElement, selectors, preventcache) {\n        // Init this value with the parent DOM element.\n        super(mainElement);\n\n        // Get selectors from parent.\n        this.selectors = {\n            SECTION: selectors.SECTION,\n            TOGGLER: selectors.TOGGLER,\n            COLLAPSE: selectors.COLLAPSE,\n            ENTER: selectors.ENTER ?? selectors.TOGGLER,\n        };\n\n        // The core/tree library saves the visible elements cache inside the main tree node.\n        // However, in edit mode content can change suddenly so we need to refresh caches when needed.\n        if (preventcache) {\n            this._getVisibleItems = this.getVisibleItems;\n            this.getVisibleItems = () => {\n                this.refreshVisibleItemsCache();\n                return this._getVisibleItems();\n            };\n        }\n        // All jQuery events can be replaced when MDL-71979 is integrated.\n        this.treeRoot.on('hidden.bs.collapse shown.bs.collapse', () => {\n            this.refreshVisibleItemsCache();\n        });\n        // Register a custom callback for pressing enter key.\n        this.registerEnterCallback(this.enterCallback.bind(this));\n    }\n\n    /**\n     * Return the current active node.\n     *\n     * @return {Element|undefined} the active item if any\n     */\n    getActiveItem() {\n        const activeItem = this.treeRoot.data('activeItem');\n        if (activeItem) {\n            return getList(activeItem)[0];\n        }\n        return undefined;\n    }\n\n    /**\n     * Handle enter key on a collpasible node.\n     *\n     * @param {JQuery} jQueryItem the jQuery object\n     */\n    enterCallback(jQueryItem) {\n        const item = getList(jQueryItem)[0];\n        if (this.isGroupItem(jQueryItem)) {\n            // Group elements is like clicking a topic but without loosing the focus.\n            const enter = item.querySelector(this.selectors.ENTER);\n            if (enter.getAttribute('href') !== '#') {\n                window.location.href = enter.getAttribute('href');\n            }\n            enter.click();\n        } else {\n            // Activity links just follow the link href.\n            const link = item.querySelector('a');\n            if (link.getAttribute('href') !== '#') {\n                window.location.href = link.getAttribute('href');\n            } else {\n                link.click();\n            }\n            return;\n        }\n    }\n\n    /**\n     * Handle an item click.\n     *\n     * @param {Event} event the click event\n     * @param {jQuery} jQueryItem the item clicked\n     */\n    handleItemClick(event, jQueryItem) {\n        const isChevron = event.target.closest(this.selectors.COLLAPSE);\n        // Only chevron clicks toogle the sections always.\n        if (isChevron) {\n            super.handleItemClick(event, jQueryItem);\n            return;\n        }\n        // This is a title or activity name click.\n        jQueryItem.focus();\n        if (this.isGroupItem(jQueryItem)) {\n            this.expandGroup(jQueryItem);\n        }\n    }\n\n    /**\n     * Check if a gorup item is collapsed.\n     *\n     * @param {JQuery} jQueryItem  the jQuery object\n     * @returns {boolean} if the element is collapsed\n     */\n    isGroupCollapsed(jQueryItem) {\n        const item = getList(jQueryItem)[0];\n        const toggler = item.querySelector(`[aria-expanded]`);\n        return toggler.getAttribute('aria-expanded') === 'false';\n    }\n\n    /**\n     * Toggle a group item.\n     *\n     * @param {JQuery} item  the jQuery object\n     */\n    toggleGroup(item) {\n        // All jQuery in this segment of code can be replaced when MDL-71979 is integrated.\n        const toggler = item.find(this.selectors.COLLAPSE);\n        let collapsibleId = toggler.data('target') ?? toggler.attr('href');\n        if (!collapsibleId) {\n            return;\n        }\n        collapsibleId = collapsibleId.replace('#', '');\n\n        // Bootstrap 4 uses jQuery to interact with collapsibles.\n        const collapsible = jQuery(`#${collapsibleId}`);\n        if (collapsible.length) {\n            jQuery(`#${collapsibleId}`).collapse('toggle');\n        }\n    }\n\n    /**\n     * Expand a group item.\n     *\n     * @param {JQuery} item  the jQuery object\n     */\n    expandGroup(item) {\n        if (this.isGroupCollapsed(item)) {\n            this.toggleGroup(item);\n        }\n    }\n\n    /**\n     * Collpase a group item.\n     *\n     * @param {JQuery} item  the jQuery object\n     */\n    collapseGroup(item) {\n        if (!this.isGroupCollapsed(item)) {\n            this.toggleGroup(item);\n        }\n    }\n\n    /**\n     * Expand all groups.\n     */\n    expandAllGroups() {\n        const togglers = getList(this.treeRoot)[0].querySelectorAll(this.selectors.SECTION);\n        togglers.forEach(item => {\n            this.expandGroup(jQuery(item));\n        });\n    }\n}\n"],"names":["Tree","constructor","mainElement","selectors","preventcache","SECTION","TOGGLER","COLLAPSE","ENTER","_getVisibleItems","this","getVisibleItems","refreshVisibleItemsCache","treeRoot","on","registerEnterCallback","enterCallback","bind","getActiveItem","activeItem","data","jQueryItem","item","isGroupItem","enter","querySelector","getAttribute","window","location","href","click","link","handleItemClick","event","target","closest","focus","expandGroup","isGroupCollapsed","toggleGroup","toggler","find","collapsibleId","attr","replace","length","collapse","collapseGroup","expandAllGroups","querySelectorAll","forEach"],"mappings":";;;;;;;;;;;;wLAiC6BA,cASzBC,YAAYC,YAAaC,UAAWC,yCAE1BF,kBAGDC,UAAY,CACbE,QAASF,UAAUE,QACnBC,QAASH,UAAUG,QACnBC,SAAUJ,UAAUI,SACpBC,+BAAOL,UAAUK,mDAASL,UAAUG,SAKpCF,oBACKK,iBAAmBC,KAAKC,qBACxBA,gBAAkB,UACdC,2BACEF,KAAKD,0BAIfI,SAASC,GAAG,wCAAwC,UAChDF,mCAGJG,sBAAsBL,KAAKM,cAAcC,KAAKP,OAQvDQ,sBACUC,WAAaT,KAAKG,SAASO,KAAK,iBAClCD,kBACO,sBAAQA,YAAY,GAUnCH,cAAcK,kBACJC,MAAO,sBAAQD,YAAY,MAC7BX,KAAKa,YAAYF,YAAa,OAExBG,MAAQF,KAAKG,cAAcf,KAAKP,UAAUK,OACb,MAA/BgB,MAAME,aAAa,UACnBC,OAAOC,SAASC,KAAOL,MAAME,aAAa,SAE9CF,MAAMM,mBAGAC,KAAOT,KAAKG,cAAc,KACE,MAA9BM,KAAKL,aAAa,QAClBC,OAAOC,SAASC,KAAOE,KAAKL,aAAa,QAEzCK,KAAKD,SAYjBE,gBAAgBC,MAAOZ,YACDY,MAAMC,OAAOC,QAAQzB,KAAKP,UAAUI,gBAG5CyB,gBAAgBC,MAAOZ,aAIjCA,WAAWe,QACP1B,KAAKa,YAAYF,kBACZgB,YAAYhB,aAUzBiB,iBAAiBjB,kBAGoC,WAFpC,sBAAQA,YAAY,GACZI,iCACNC,aAAa,iBAQhCa,YAAYjB,8BAEFkB,QAAUlB,KAAKmB,KAAK/B,KAAKP,UAAUI,cACrCmC,oCAAgBF,QAAQpB,KAAK,iDAAaoB,QAAQG,KAAK,YACtDD,qBAGLA,cAAgBA,cAAcE,QAAQ,IAAK,KAGvB,8BAAWF,gBACfG,uCACDH,gBAAiBI,SAAS,UAS7CT,YAAYf,MACJZ,KAAK4B,iBAAiBhB,YACjBiB,YAAYjB,MASzByB,cAAczB,MACLZ,KAAK4B,iBAAiBhB,YAClBiB,YAAYjB,MAOzB0B,mBACqB,sBAAQtC,KAAKG,UAAU,GAAGoC,iBAAiBvC,KAAKP,UAAUE,SAClE6C,SAAQ5B,YACRe,aAAY,mBAAOf"}