3eed2c12a9554e2f9901f836b4190e5a583444fb
[moodle.git] / lib / amd / build / tree.min.js.map
1 {"version":3,"sources":["../src/tree.js"],"names":["define","$","SELECTORS","ITEM","GROUP","CLOSED_GROUP","FIRST_ITEM","VISIBLE_ITEM","UNLOADED_AJAX_ITEM","Tree","selector","selectCallback","treeRoot","data","keys","tab","enter","space","pageup","pagedown","end","home","left","up","right","down","asterisk","initialiseNodes","setActiveItem","find","refreshVisibleItemsCache","bindEventHandlers","prototype","registerEnterCallback","callback","enterCallback","getVisibleItems","item","currentActive","attr","isGroupItem","is","getGroupFromItem","ariaowns","plain","children","length","isGroupCollapsed","isGroupCollapsible","node","removeAllFromTabOrder","setAriaSelectedFalseOnItems","thisTree","each","unloadedNode","collapseGroup","expandGroup","expandAllGroups","groupNode","done","expandAllChildGroups","promise","Deferred","moduleName","closest","addClass","require","loader","load","finishExpandingGroup","removeClass","resolve","group","removeAttr","toggleGroup","handleKeyDown","e","currentIndex","index","altKey","ctrlKey","metaKey","shiftKey","keyCode","first","focus","preventDefault","last","links","not","triggerHandler","window","location","href","firstLink","focusParent","tree","filter","has","prev","eq","next","handleClick","handleFocus","thisObj","on","click","keydown"],"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 * Implement an accessible aria tree widget, from a nested unordered list.\n * Based on http://oaa-accessibility.org/example/41/.\n *\n * @module     tool_lp/tree\n * @package    core\n * @copyright  2015 Damyon Wiese <damyon@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n    // Private variables and functions.\n    var SELECTORS = {\n        ITEM: '[role=treeitem]',\n        GROUP: '[role=treeitem]:has([role=group]), [role=treeitem][aria-owns], [role=treeitem][data-requires-ajax=true]',\n        CLOSED_GROUP: '[role=treeitem]:has([role=group])[aria-expanded=false], [role=treeitem][aria-owns][aria-expanded=false], ' +\n                 '[role=treeitem][data-requires-ajax=true][aria-expanded=false]',\n        FIRST_ITEM: '[role=treeitem]:first',\n        VISIBLE_ITEM: '[role=treeitem]:visible',\n        UNLOADED_AJAX_ITEM: '[role=treeitem][data-requires-ajax=true][data-loaded=false][aria-expanded=true]'\n    };\n\n    /**\n     * Constructor.\n     *\n     * @param {String} selector\n     * @param {function} selectCallback Called when the active node is changed.\n     */\n    var Tree = function(selector, selectCallback) {\n        this.treeRoot = $(selector);\n\n        this.treeRoot.data('activeItem', null);\n        this.selectCallback = selectCallback;\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            asterisk: 106\n        };\n\n        // Apply the standard default initialisation for all nodes, starting with the tree root.\n        this.initialiseNodes(this.treeRoot);\n        // Make the first item the active item for the tree so that it is added to the tab order.\n        this.setActiveItem(this.treeRoot.find(SELECTORS.FIRST_ITEM));\n        // Create the cache of the visible items.\n        this.refreshVisibleItemsCache();\n        // Create the event handlers for the tree.\n        this.bindEventHandlers();\n    };\n\n    Tree.prototype.registerEnterCallback = function(callback) {\n        this.enterCallback = callback;\n    };\n\n    /**\n     * Find all visible tree items and save a cache of them on the tree object.\n     *\n     * @method refreshVisibleItemsCache\n     */\n    Tree.prototype.refreshVisibleItemsCache = function() {\n        this.treeRoot.data('visibleItems', this.treeRoot.find(SELECTORS.VISIBLE_ITEM));\n    };\n\n    /**\n     * Get all visible tree items.\n     *\n     * @method getVisibleItems\n     * @return {Object} visible items\n     */\n    Tree.prototype.getVisibleItems = function() {\n        return this.treeRoot.data('visibleItems');\n    };\n\n    /**\n     * Mark the given item as active within the tree and fire the callback for when the active item is set.\n     *\n     * @method setActiveItem\n     * @param {object} item jquery object representing an item on the tree.\n     */\n    Tree.prototype.setActiveItem = function(item) {\n        var currentActive = this.treeRoot.data('activeItem');\n        if (item === currentActive) {\n            return;\n        }\n\n        // Remove previous active from tab order.\n        if (currentActive) {\n            currentActive.attr('tabindex', '-1');\n            currentActive.attr('aria-selected', 'false');\n        }\n        item.attr('tabindex', '0');\n        item.attr('aria-selected', 'true');\n\n        // Set the new active item.\n        this.treeRoot.data('activeItem', item);\n\n        if (typeof this.selectCallback === 'function') {\n            this.selectCallback(item);\n        }\n    };\n\n    /**\n     * Determines if the given item is a group item (contains child tree items) in the tree.\n     *\n     * @method isGroupItem\n     * @param {object} item jquery object representing an item on the tree.\n     * @returns {bool}\n     */\n    Tree.prototype.isGroupItem = function(item) {\n        return item.is(SELECTORS.GROUP);\n    };\n\n    /**\n     * Determines if the given item is a group item (contains child tree items) in the tree.\n     *\n     * @method isGroupItem\n     * @param {object} item jquery object representing an item on the tree.\n     * @returns {bool}\n     */\n    Tree.prototype.getGroupFromItem = function(item) {\n        var ariaowns = this.treeRoot.find('#' + item.attr('aria-owns'));\n        var plain = item.children('[role=group]');\n        if (ariaowns.length > plain.length) {\n            return ariaowns;\n        } else {\n            return plain;\n        }\n    };\n\n    /**\n     * Determines if the given group item (contains child tree items) is collapsed.\n     *\n     * @method isGroupCollapsed\n     * @param {object} item jquery object representing a group item on the tree.\n     * @returns {bool}\n     */\n    Tree.prototype.isGroupCollapsed = function(item) {\n        return item.attr('aria-expanded') === 'false';\n    };\n\n    /**\n     * Determines if the given group item (contains child tree items) can be collapsed.\n     *\n     * @method isGroupCollapsible\n     * @param {object} item jquery object representing a group item on the tree.\n     * @returns {bool}\n     */\n    Tree.prototype.isGroupCollapsible = function(item) {\n        return item.attr('data-collapsible') !== 'false';\n    };\n\n    /**\n     * Performs the tree initialisation for all child items from the given node,\n     * such as removing everything from the tab order and setting aria selected\n     * on items.\n     *\n     * @method initialiseNodes\n     * @param {object} node jquery object representing a node.\n     */\n    Tree.prototype.initialiseNodes = function(node) {\n        this.removeAllFromTabOrder(node);\n        this.setAriaSelectedFalseOnItems(node);\n\n        // Get all ajax nodes that have been rendered as expanded but haven't loaded the child items yet.\n        var thisTree = this;\n        node.find(SELECTORS.UNLOADED_AJAX_ITEM).each(function() {\n            var unloadedNode = $(this);\n            // Collapse and then expand to trigger the ajax loading.\n            thisTree.collapseGroup(unloadedNode);\n            thisTree.expandGroup(unloadedNode);\n        });\n    };\n\n    /**\n     * Removes all child DOM elements of the given node from the tab order.\n     *\n     * @method removeAllFromTabOrder\n     * @param {object} node jquery object representing a node.\n     */\n    Tree.prototype.removeAllFromTabOrder = function(node) {\n        node.find('*').attr('tabindex', '-1');\n        this.getGroupFromItem($(node)).find('*').attr('tabindex', '-1');\n    };\n\n    /**\n     * Find all child tree items from the given node and set the aria selected attribute to false.\n     *\n     * @method setAriaSelectedFalseOnItems\n     * @param {object} node jquery object representing a node.\n     */\n    Tree.prototype.setAriaSelectedFalseOnItems = function(node) {\n        node.find(SELECTORS.ITEM).attr('aria-selected', 'false');\n    };\n\n    /**\n     * Expand all group nodes within the tree.\n     *\n     * @method expandAllGroups\n     */\n    Tree.prototype.expandAllGroups = function() {\n        var thisTree = this;\n\n        this.treeRoot.find(SELECTORS.CLOSED_GROUP).each(function() {\n            var groupNode = $(this);\n\n            thisTree.expandGroup($(this)).done(function() {\n                thisTree.expandAllChildGroups(groupNode);\n            });\n        });\n    };\n\n    /**\n     * Find all child group nodes from the given node and expand them.\n     *\n     * @method expandAllChildGroups\n     * @param {Object} item is the jquery id of the group.\n     */\n    Tree.prototype.expandAllChildGroups = function(item) {\n        var thisTree = this;\n\n        this.getGroupFromItem(item).find(SELECTORS.CLOSED_GROUP).each(function() {\n            var groupNode = $(this);\n\n            thisTree.expandGroup($(this)).done(function() {\n                thisTree.expandAllChildGroups(groupNode);\n            });\n        });\n    };\n\n    /**\n     * Expand a collapsed group.\n     *\n     * Handles expanding nodes that are ajax loaded (marked with a data-requires-ajax attribute).\n     *\n     * @method expandGroup\n     * @param {Object} item is the jquery id of the parent item of the group.\n     * @return {Object} a promise that is resolved when the group has been expanded.\n     */\n    Tree.prototype.expandGroup = function(item) {\n        var promise = $.Deferred();\n        // Ignore nodes that are explicitly maked as not expandable or are already expanded.\n        if (item.attr('data-expandable') !== 'false' && this.isGroupCollapsed(item)) {\n            // If this node requires ajax load and we haven't already loaded it.\n            if (item.attr('data-requires-ajax') === 'true' && item.attr('data-loaded') !== 'true') {\n                item.attr('data-loaded', false);\n                // Get the closes ajax loading module specificed in the tree.\n                var moduleName = item.closest('[data-ajax-loader]').attr('data-ajax-loader');\n                var thisTree = this;\n                // Flag this node as loading.\n                item.addClass('loading');\n                // Require the ajax module (must be AMD) and try to load the items.\n                require([moduleName], function(loader) {\n                    // All ajax module must implement a \"load\" method.\n                    loader.load(item).done(function() {\n                        item.attr('data-loaded', true);\n\n                        // Set defaults on the newly constructed part of the tree.\n                        thisTree.initialiseNodes(item);\n                        thisTree.finishExpandingGroup(item);\n                        // Make sure no child elements of the item we just loaded are tabbable.\n                        item.removeClass('loading');\n                        promise.resolve();\n                    });\n                });\n            } else {\n                this.finishExpandingGroup(item);\n                promise.resolve();\n            }\n        } else {\n            promise.resolve();\n        }\n        return promise;\n    };\n\n    /**\n     * Perform the necessary DOM changes to display a group item.\n     *\n     * @method finishExpandingGroup\n     * @param {Object} item is the jquery id of the parent item of the group.\n     */\n    Tree.prototype.finishExpandingGroup = function(item) {\n        // Expand the group.\n        var group = this.getGroupFromItem(item);\n        group.removeAttr('aria-hidden');\n        item.attr('aria-expanded', 'true');\n\n        // Update the list of visible items.\n        this.refreshVisibleItemsCache();\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        // If the item is not collapsible or already collapsed then do nothing.\n        if (!this.isGroupCollapsible(item) || this.isGroupCollapsed(item)) {\n            return;\n        }\n\n        // Collapse the group.\n        var group = this.getGroupFromItem(item);\n        group.attr('aria-hidden', 'true');\n        item.attr('aria-expanded', 'false');\n\n        // Update the list of visible items.\n        this.refreshVisibleItemsCache();\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     * 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     */\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.getVisibleItems().index(item);\n\n        if ((e.altKey || e.ctrlKey || e.metaKey) || (e.shiftKey && e.keyCode != this.keys.tab)) {\n            // Do nothing.\n            return;\n        }\n\n        switch (e.keyCode) {\n            case this.keys.home: {\n                // Jump to first item in tree.\n                this.getVisibleItems().first().focus();\n\n                e.preventDefault();\n                return;\n            }\n            case this.keys.end: {\n                // Jump to last visible item.\n                this.getVisibleItems().last().focus();\n\n                e.preventDefault();\n                return;\n            }\n            case this.keys.enter: {\n                var links = item.children('a').length ? item.children('a') : item.children().not(SELECTORS.GROUP).find('a');\n                if (links.length) {\n                    if (links.first().data('overrides-tree-activation-key-handler')) {\n                        // If the link overrides handling of activation keys, let it do so.\n                        links.first().triggerHandler(e);\n                    } else if (typeof this.enterCallback === 'function') {\n                        // Use callback if there is one.\n                        this.enterCallback(item);\n                    } else {\n                        window.location.href = links.first().attr('href');\n                    }\n                } else if (this.isGroupItem(item)) {\n                    this.toggleGroup(item, true);\n                }\n\n                e.preventDefault();\n                return;\n            }\n            case this.keys.space: {\n                if (this.isGroupItem(item)) {\n                    this.toggleGroup(item, true);\n                } else if (item.children('a').length) {\n                    var firstLink = item.children('a').first();\n\n                    if (firstLink.data('overrides-tree-activation-key-handler')) {\n                        firstLink.triggerHandler(e);\n                    }\n                }\n\n                e.preventDefault();\n                return;\n            }\n            case this.keys.left: {\n                var focusParent = function(tree) {\n                    // Get the immediate visible parent group item that contains this element.\n                    tree.getVisibleItems().filter(function() {\n                        return tree.getGroupFromItem($(this)).has(item).length;\n                    }).focus();\n                };\n\n                // If this is a goup item then collapse it and focus the parent group\n                // in accordance with the aria spec.\n                if (this.isGroupItem(item)) {\n                    if (this.isGroupCollapsed(item)) {\n                        focusParent(this);\n                    } else {\n                        this.collapseGroup(item);\n                    }\n                } else {\n                    focusParent(this);\n                }\n\n                e.preventDefault();\n                return;\n            }\n            case this.keys.right: {\n                // If this is a group item then expand it and focus the first child item\n                // in accordance with the aria spec.\n                if (this.isGroupItem(item)) {\n                    if (this.isGroupCollapsed(item)) {\n                        this.expandGroup(item);\n                    } else {\n                        // Move to the first item in the child group.\n                        this.getGroupFromItem(item).find(SELECTORS.ITEM).first().focus();\n                    }\n                }\n\n                e.preventDefault();\n                return;\n            }\n            case this.keys.up: {\n\n                if (currentIndex > 0) {\n                    var prev = this.getVisibleItems().eq(currentIndex - 1);\n\n                    prev.focus();\n                }\n\n                e.preventDefault();\n                return;\n            }\n            case this.keys.down: {\n\n                if (currentIndex < this.getVisibleItems().length - 1) {\n                    var next = this.getVisibleItems().eq(currentIndex + 1);\n\n                    next.focus();\n                }\n\n                e.preventDefault();\n                return;\n            }\n            case this.keys.asterisk: {\n                // Expand all groups.\n                this.expandAllGroups();\n                e.preventDefault();\n                return;\n            }\n        }\n    };\n\n    /**\n     * Handle a click (select).\n     *\n     * @method handleClick\n     * @param {Object} item The jquery id of the parent item of the group.\n     * @param {Event} e The event.\n     */\n    Tree.prototype.handleClick = function(item, e) {\n\n        if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {\n            // Do nothing.\n            return;\n        }\n\n        // Update the active item.\n        item.focus();\n\n        // If the item is a group node.\n        if (this.isGroupItem(item)) {\n            this.toggleGroup(item);\n        }\n    };\n\n    /**\n     * Handle a focus event.\n     *\n     * @method handleFocus\n     * @param {Object} item The jquery id of the parent item of the group.\n     * @param {Event} e The event.\n     */\n    Tree.prototype.handleFocus = function(item) {\n\n        this.setActiveItem(item);\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 event handlers to the tree items. Use event delegates to allow\n        // for dynamically loaded parts of the tree.\n        this.treeRoot.on({\n            click: function(e) {\n              return thisObj.handleClick($(this), e);\n            },\n            keydown: function(e) {\n              return thisObj.handleKeyDown($(this), e);\n            },\n            focus: function() {\n              return thisObj.handleFocus($(this));\n            },\n        }, SELECTORS.ITEM);\n    };\n\n    return /** @alias module:tool_lp/tree */ Tree;\n});\n"],"file":"tree.min.js"}