Proyectos de Subversion Moodle

Rev

Rev 1 | Autoría | Comparar con el anterior | 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 Collapse from 'theme_boost/bootstrap/collapse';\nimport jQuery from 'jquery';\nimport Tree from 'core/tree';\nimport {getList, getFirst} 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        this.treeRoot[0].querySelectorAll(selectors.COLLAPSE).forEach(toggler => {\n            const collapsible = document.getElementById(toggler.getAttribute('href').replace('#', ''));\n            collapsible.addEventListener('hidden.bs.collapse', () => this.refreshVisibleItemsCache());\n            collapsible.addEventListener('shown.bs.collapse', () => 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        const toggler = getFirst(item).querySelector(this.selectors.COLLAPSE);\n        let collapsibleId = toggler.dataset?.target ?? toggler.getAttribute('href');\n        if (!collapsibleId) {\n            return;\n        }\n        collapsibleId = collapsibleId.replace('#', '');\n\n        const collapsible = document.getElementById(collapsibleId);\n        if (collapsible) {\n            Collapse.getOrCreateInstance(collapsible).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","querySelectorAll","forEach","toggler","collapsible","document","getElementById","getAttribute","replace","addEventListener","registerEnterCallback","enterCallback","bind","getActiveItem","activeItem","data","jQueryItem","item","isGroupItem","enter","querySelector","window","location","href","click","link","handleItemClick","event","target","closest","focus","expandGroup","isGroupCollapsed","toggleGroup","collapsibleId","dataset","_toggler$dataset","getOrCreateInstance","toggle","collapseGroup","expandAllGroups"],"mappings":";;;;;;;;;;;;oOAkC6BA,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,0BAGfI,SAAS,GAAGC,iBAAiBX,UAAUI,UAAUQ,SAAQC,gBACpDC,YAAcC,SAASC,eAAeH,QAAQI,aAAa,QAAQC,QAAQ,IAAK,KACtFJ,YAAYK,iBAAiB,sBAAsB,IAAMZ,KAAKE,6BAC9DK,YAAYK,iBAAiB,qBAAqB,IAAMZ,KAAKE,qCAG5DW,sBAAsBb,KAAKc,cAAcC,KAAKf,OAQvDgB,sBACUC,WAAajB,KAAKG,SAASe,KAAK,iBAClCD,kBACO,sBAAQA,YAAY,GAUnCH,cAAcK,kBACJC,MAAO,sBAAQD,YAAY,MAC7BnB,KAAKqB,YAAYF,YAAa,OAExBG,MAAQF,KAAKG,cAAcvB,KAAKP,UAAUK,OACb,MAA/BwB,MAAMZ,aAAa,UACnBc,OAAOC,SAASC,KAAOJ,MAAMZ,aAAa,SAE9CY,MAAMK,mBAGAC,KAAOR,KAAKG,cAAc,KACE,MAA9BK,KAAKlB,aAAa,QAClBc,OAAOC,SAASC,KAAOE,KAAKlB,aAAa,QAEzCkB,KAAKD,SAYjBE,gBAAgBC,MAAOX,YACDW,MAAMC,OAAOC,QAAQhC,KAAKP,UAAUI,gBAG5CgC,gBAAgBC,MAAOX,aAIjCA,WAAWc,QACPjC,KAAKqB,YAAYF,kBACZe,YAAYf,aAUzBgB,iBAAiBhB,kBAGoC,WAFpC,sBAAQA,YAAY,GACZI,iCACNb,aAAa,iBAQhC0B,YAAYhB,uDACFd,SAAU,uBAASc,MAAMG,cAAcvB,KAAKP,UAAUI,cACxDwC,qEAAgB/B,QAAQgC,2CAARC,iBAAiBR,8DAAUzB,QAAQI,aAAa,YAC/D2B,qBAGLA,cAAgBA,cAAc1B,QAAQ,IAAK,UAErCJ,YAAcC,SAASC,eAAe4B,eACxC9B,+BACSiC,oBAAoBjC,aAAakC,SASlDP,YAAYd,MACJpB,KAAKmC,iBAAiBf,YACjBgB,YAAYhB,MASzBsB,cAActB,MACLpB,KAAKmC,iBAAiBf,YAClBgB,YAAYhB,MAOzBuB,mBACqB,sBAAQ3C,KAAKG,UAAU,GAAGC,iBAAiBJ,KAAKP,UAAUE,SAClEU,SAAQe,YACRc,aAAY,mBAAOd"}