NOBUG: Fixed SVG browser compatibility
[moodle.git] / contentbank / amd / build / sort.min.js.map
blobc888b7dd187bb76c1156982bd168fac00f718a66
1 {"version":3,"file":"sort.min.js","sources":["../src/sort.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 * Content bank UI actions.\n *\n * @module     core_contentbank/sort\n * @copyright  2020 Bas Brands <bas@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport selectors from './selectors';\nimport {getString} from 'core/str';\nimport Prefetch from 'core/prefetch';\nimport Notification from 'core/notification';\nimport {setUserPreference} from 'core_user/repository';\n\n/**\n * Set up the contentbank views.\n *\n * @method init\n */\nexport const init = () => {\n    const contentBank = document.querySelector(selectors.regions.contentbank);\n    Prefetch.prefetchStrings('contentbank', ['contentname', 'uses', 'lastmodified', 'size', 'type', 'author']);\n    Prefetch.prefetchStrings('moodle', ['sortbyx', 'sortbyxreverse']);\n    registerListenerEvents(contentBank);\n};\n\n/**\n * Register contentbank related event listeners.\n *\n * @method registerListenerEvents\n * @param {HTMLElement} contentBank The DOM node of the content bank\n */\nconst registerListenerEvents = (contentBank) => {\n\n    contentBank.addEventListener('click', e => {\n        const viewList = contentBank.querySelector(selectors.actions.viewlist);\n        const viewGrid = contentBank.querySelector(selectors.actions.viewgrid);\n        const fileArea = contentBank.querySelector(selectors.regions.filearea);\n        const shownItems = fileArea.querySelectorAll(selectors.elements.listitem);\n\n        // View as Grid button.\n        if (e.target.closest(selectors.actions.viewgrid)) {\n            contentBank.classList.remove('view-list');\n            contentBank.classList.add('view-grid');\n            if (fileArea && shownItems) {\n                fileArea.setAttribute('role', 'list');\n                shownItems.forEach(listItem => {\n                    listItem.setAttribute('role', 'listitem');\n                    listItem.querySelectorAll(selectors.elements.cell).forEach(cell => cell.removeAttribute('role'));\n                });\n\n                const heading = fileArea.querySelector(selectors.elements.heading);\n                if (heading) {\n                    heading.removeAttribute('role');\n                    heading.querySelectorAll(selectors.elements.cell).forEach(cell => cell.removeAttribute('role'));\n                }\n            }\n            viewGrid.classList.add('active');\n            viewList.classList.remove('active');\n            setViewListPreference(false);\n\n            return;\n        }\n\n        // View as List button.\n        if (e.target.closest(selectors.actions.viewlist)) {\n            contentBank.classList.remove('view-grid');\n            contentBank.classList.add('view-list');\n            if (fileArea && shownItems) {\n                fileArea.setAttribute('role', 'table');\n                shownItems.forEach(listItem => {\n                    listItem.setAttribute('role', 'row');\n                    listItem.querySelectorAll(selectors.elements.cell).forEach(cell => cell.setAttribute('role', 'cell'));\n                });\n\n                const heading = fileArea.querySelector(selectors.elements.heading);\n                if (heading) {\n                    heading.setAttribute('role', 'row');\n                    heading.querySelectorAll(selectors.elements.cell).forEach(cell => cell.setAttribute('role', 'columnheader'));\n                }\n            }\n            viewList.classList.add('active');\n            viewGrid.classList.remove('active');\n            setViewListPreference(true);\n\n            return;\n        }\n\n        if (fileArea && shownItems) {\n\n            // Sort by file name alphabetical\n            const sortByName = e.target.closest(selectors.actions.sortname);\n            if (sortByName) {\n                const ascending = updateSortButtons(contentBank, sortByName);\n                updateSortOrder(fileArea, shownItems, 'data-file', ascending);\n                return;\n            }\n\n            // Sort by uses.\n            const sortByUses = e.target.closest(selectors.actions.sortuses);\n            if (sortByUses) {\n                const ascending = updateSortButtons(contentBank, sortByUses);\n                updateSortOrder(fileArea, shownItems, 'data-uses', ascending);\n                return;\n            }\n\n            // Sort by date.\n            const sortByDate = e.target.closest(selectors.actions.sortdate);\n            if (sortByDate) {\n                const ascending = updateSortButtons(contentBank, sortByDate);\n                updateSortOrder(fileArea, shownItems, 'data-timemodified', ascending);\n                return;\n            }\n\n            // Sort by size.\n            const sortBySize = e.target.closest(selectors.actions.sortsize);\n            if (sortBySize) {\n                const ascending = updateSortButtons(contentBank, sortBySize);\n                updateSortOrder(fileArea, shownItems, 'data-bytes', ascending);\n                return;\n            }\n\n            // Sort by type.\n            const sortByType = e.target.closest(selectors.actions.sorttype);\n            if (sortByType) {\n                const ascending = updateSortButtons(contentBank, sortByType);\n                updateSortOrder(fileArea, shownItems, 'data-type', ascending);\n                return;\n            }\n\n            // Sort by author.\n            const sortByAuthor = e.target.closest(selectors.actions.sortauthor);\n            if (sortByAuthor) {\n                const ascending = updateSortButtons(contentBank, sortByAuthor);\n                updateSortOrder(fileArea, shownItems, 'data-author', ascending);\n            }\n            return;\n        }\n    });\n};\n\n\n/**\n * Set the contentbank user preference in list view\n *\n * @param  {Bool} viewList view ContentBank as list.\n * @return {Promise} Repository promise.\n */\nconst setViewListPreference = function(viewList) {\n\n    // If the given status is not hidden, the preference has to be deleted with a null value.\n    if (viewList === false) {\n        viewList = null;\n    }\n\n    return setUserPreference('core_contentbank_view_list', viewList)\n        .catch(Notification.exception);\n};\n\n/**\n * Update the sort button view.\n *\n * @method updateSortButtons\n * @param {HTMLElement} contentBank The DOM node of the contentbank button\n * @param {HTMLElement} sortButton The DOM node of the sort button\n * @return {Bool} sort ascending\n */\nconst updateSortButtons = (contentBank, sortButton) => {\n    const sortButtons = contentBank.querySelectorAll(selectors.elements.sortbutton);\n\n    sortButtons.forEach((button) => {\n        if (button !== sortButton) {\n            button.classList.remove('dir-asc');\n            button.classList.remove('dir-desc');\n            button.classList.add('dir-none');\n\n            button.closest(selectors.elements.cell).setAttribute('aria-sort', 'none');\n\n            updateButtonTitle(button, false);\n        }\n    });\n\n    let ascending = true;\n\n    if (sortButton.classList.contains('dir-none')) {\n        sortButton.classList.remove('dir-none');\n        sortButton.classList.add('dir-asc');\n        sortButton.closest(selectors.elements.cell).setAttribute('aria-sort', 'ascending');\n    } else if (sortButton.classList.contains('dir-asc')) {\n        sortButton.classList.remove('dir-asc');\n        sortButton.classList.add('dir-desc');\n        sortButton.closest(selectors.elements.cell).setAttribute('aria-sort', 'descending');\n        ascending = false;\n    } else if (sortButton.classList.contains('dir-desc')) {\n        sortButton.classList.remove('dir-desc');\n        sortButton.classList.add('dir-asc');\n        sortButton.closest(selectors.elements.cell).setAttribute('aria-sort', 'ascending');\n    }\n\n    updateButtonTitle(sortButton, ascending);\n\n    return ascending;\n};\n\n/**\n * Update the button title.\n *\n * @method updateButtonTitle\n * @param {HTMLElement} button Button to update\n * @param {Bool} ascending Sort direction\n * @return {Promise} string promise\n */\nconst updateButtonTitle = (button, ascending) => {\n\n    const sortString = (ascending ? 'sortbyxreverse' : 'sortbyx');\n\n    return getString(button.dataset.string, 'contentbank')\n    .then(columnName => {\n        return getString(sortString, 'core', columnName);\n    })\n    .then(sortByString => {\n        button.setAttribute('title', sortByString);\n        return sortByString;\n    })\n    .catch();\n};\n\n/**\n * Update the sort order of the itemlist and update the DOM\n *\n * @method updateSortOrder\n * @param {HTMLElement} fileArea the Dom container for the itemlist\n * @param {Array} itemList Nodelist of Dom elements\n * @param {String} attribute the attribut to sort on\n * @param {Bool} ascending Sort Ascending\n */\nconst updateSortOrder = (fileArea, itemList, attribute, ascending) => {\n    const sortList = [].slice.call(itemList).sort(function(a, b) {\n\n        let aa = a.getAttribute(attribute);\n        let bb = b.getAttribute(attribute);\n        if (!isNaN(aa)) {\n           aa = parseInt(aa);\n           bb = parseInt(bb);\n        }\n\n        if (ascending) {\n            return aa > bb ? 1 : -1;\n        } else {\n            return aa < bb ? 1 : -1;\n        }\n    });\n    sortList.forEach(listItem => fileArea.appendChild(listItem));\n};\n"],"names":["contentBank","document","querySelector","selectors","regions","contentbank","prefetchStrings","registerListenerEvents","addEventListener","e","viewList","actions","viewlist","viewGrid","viewgrid","fileArea","filearea","shownItems","querySelectorAll","elements","listitem","target","closest","classList","remove","add","setAttribute","forEach","listItem","cell","removeAttribute","heading","setViewListPreference","sortByName","sortname","ascending","updateSortButtons","updateSortOrder","sortByUses","sortuses","sortByDate","sortdate","sortBySize","sortsize","sortByType","sorttype","sortByAuthor","sortauthor","catch","Notification","exception","sortButton","sortbutton","button","updateButtonTitle","contains","sortString","dataset","string","then","columnName","sortByString","itemList","attribute","slice","call","sort","a","b","aa","getAttribute","bb","isNaN","parseInt","appendChild"],"mappings":"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"}