{"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 * @package    core_contentbank\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 {get_string as getString} from 'core/str';\nimport Prefetch from 'core/prefetch';\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\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', 'lastmodified', 'size', 'type']);\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    // The search.\n    const fileArea = document.querySelector(selectors.regions.filearea);\n    const shownItems = fileArea.querySelectorAll(selectors.elements.listitem);\n\n    // The view buttons.\n    const viewGrid = contentBank.querySelector(selectors.actions.viewgrid);\n    const viewList = contentBank.querySelector(selectors.actions.viewlist);\n\n    viewGrid.addEventListener('click', () => {\n        contentBank.classList.remove('view-list');\n        contentBank.classList.add('view-grid');\n        viewGrid.classList.add('active');\n        viewList.classList.remove('active');\n        setViewListPreference(false);\n    });\n\n    viewList.addEventListener('click', () => {\n        contentBank.classList.remove('view-grid');\n        contentBank.classList.add('view-list');\n        viewList.classList.add('active');\n        viewGrid.classList.remove('active');\n        setViewListPreference(true);\n    });\n\n    // Sort by file name alphabetical\n    const sortByName = contentBank.querySelector(selectors.actions.sortname);\n    sortByName.addEventListener('click', () => {\n        const ascending = updateSortButtons(contentBank, sortByName);\n        updateSortOrder(fileArea, shownItems, 'data-file', ascending);\n    });\n\n    // Sort by date.\n    const sortByDate = contentBank.querySelector(selectors.actions.sortdate);\n    sortByDate.addEventListener('click', () => {\n        const ascending = updateSortButtons(contentBank, sortByDate);\n        updateSortOrder(fileArea, shownItems, 'data-timemodified', ascending);\n    });\n\n    // Sort by size.\n    const sortBySize = contentBank.querySelector(selectors.actions.sortsize);\n    sortBySize.addEventListener('click', () => {\n        const ascending = updateSortButtons(contentBank, sortBySize);\n        updateSortOrder(fileArea, shownItems, 'data-bytes', ascending);\n    });\n\n    // Sort by type\n    const sortByType = contentBank.querySelector(selectors.actions.sorttype);\n    sortByType.addEventListener('click', () => {\n        const ascending = updateSortButtons(contentBank, sortByType);\n        updateSortOrder(fileArea, shownItems, 'data-type', ascending);\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    const request = {\n        methodname: 'core_user_update_user_preferences',\n        args: {\n            preferences: [\n                {\n                    type: 'core_contentbank_view_list',\n                    value: viewList\n                }\n            ]\n        }\n    };\n\n    return Ajax.call([request])[0].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            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    } else if (sortButton.classList.contains('dir-asc')) {\n        sortButton.classList.remove('dir-asc');\n        sortButton.classList.add('dir-desc');\n        ascending = false;\n    } else if (sortButton.classList.contains('dir-desc')) {\n        sortButton.classList.remove('dir-desc');\n        sortButton.classList.add('dir-asc');\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","fileArea","filearea","shownItems","querySelectorAll","elements","listitem","viewGrid","actions","viewgrid","viewList","viewlist","addEventListener","classList","remove","add","setViewListPreference","sortByName","sortname","ascending","updateSortButtons","updateSortOrder","sortByDate","sortdate","sortBySize","sortsize","sortByType","sorttype","request","methodname","args","preferences","type","value","Ajax","call","catch","Notification","exception","sortButton","sortbutton","forEach","button","updateButtonTitle","contains","sortString","dataset","string","then","columnName","sortByString","setAttribute","itemList","attribute","slice","sort","a","b","aa","getAttribute","bb","isNaN","parseInt","listItem","appendChild"],"mappings":"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"}