{"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 <http://www.gnu.org/licenses/>.\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 <john@moodle.com>\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 = $('<ul></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 = $('<li></li>');\n            var p = $('<p></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 = $('<a title=\"' + node.title + '\" href=\"' + node.link + '\"></a>');\n\n                eleToAddIcon = link;\n                link.append('<span class=\"item-content-wrap\">' + node.name + '</span>');\n\n                if (node.hidden) {\n                    link.addClass('dimmed');\n                }\n\n                p.append(link);\n            } else {\n                var span = $('<span></span>');\n\n                eleToAddIcon = span;\n                span.append('<span class=\"item-content-wrap\">' + node.name + '</span>');\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 = $('<img/>');\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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"}