MDL-74054 qbank: Miscellaneous coding style fixes
[moodle.git] / question / amd / build / filter.min.js.map
blobbc59bbb3f50cd7507b5d82dad3fd2e79a3906986
1 {"version":3,"file":"filter.min.js","sources":["../src/filter.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 * Question bank filter management.\n *\n * @module     core_question/filter\n * @copyright  2021 Tomo Tsuyuki <tomotsuyuki@catalyst-au.net>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport CoreFilter from 'core/datafilter';\nimport Notification from 'core/notification';\nimport Selectors from 'core/datafilter/selectors';\nimport Templates from 'core/templates';\nimport Fragment from 'core/fragment';\n\n/**\n * Initialise the question bank filter on the element with the given id.\n *\n * @param {String} filterRegionId ID of the HTML element containing the filters.\n * @param {String} defaultcourseid Course ID for the default course to pass back to the view.\n * @param {String} defaultcategoryid Question bank category ID for the default course to pass back to the view.\n * @param {Number} perpage The number of questions to display per page.\n * @param {Number} contextId Context ID of the question bank view.\n * @param {string} component Frankenstyle name of the component for the fragment API callback (e.g. core_question)\n * @param {string} callback Name of the callback for the fragment API (e.g question_data)\n * @param {string} view The class name of the question bank view class used for this page.\n * @param {Number} cmid If we are in an activitiy, the course module ID.\n * @param {string} pagevars JSON-encoded parameters from passed from the view, including filters and jointype.\n * @param {string} extraparams JSON-encoded additional parameters specific to this view class, used for re-rendering the view.\n */\nexport const init = (\n    filterRegionId,\n    defaultcourseid,\n    defaultcategoryid,\n    perpage,\n    contextId,\n    component,\n    callback,\n    view,\n    cmid,\n    pagevars,\n    extraparams\n) => {\n\n    const SELECTORS = {\n        QUESTION_CONTAINER_ID: '#questionscontainer',\n        QUESTION_TABLE: '#questionscontainer table',\n        SORT_LINK: '#questionscontainer div.sorters a',\n        PAGINATION_LINK: '#questionscontainer a[href].page-link',\n        LASTCHANGED_FIELD: '#questionsubmit input[name=lastchanged]',\n        BULK_ACTIONS: '#bulkactionsui-container input',\n        MENU_ACTIONS: '.menu-action',\n        EDIT_SWITCH: '.editmode-switch-form input[name=setmode]',\n        EDIT_SWITCH_URL: '.editmode-switch-form input[name=pageurl]',\n    };\n\n    const filterSet = document.querySelector(`#${filterRegionId}`);\n\n    const viewData = {\n        extraparams,\n        cmid,\n        view,\n        cat: defaultcategoryid,\n        courseid: defaultcourseid,\n        filter: {},\n        jointype: 0,\n        qpage: 0,\n        qperpage: perpage,\n        sortdata: {},\n        lastchanged: document.querySelector(SELECTORS.LASTCHANGED_FIELD)?.value ?? null,\n    };\n\n    let sortData = {};\n    const defaultSort = document.querySelector(SELECTORS.QUESTION_TABLE)?.dataset?.defaultsort;\n    if (defaultSort) {\n        sortData = JSON.parse(defaultSort);\n    }\n\n    /**\n     * Retrieve table data.\n     *\n     * @param {Object} filterdata data\n     * @param {Promise} pendingPromise pending promise\n     */\n    const applyFilter = (filterdata, pendingPromise) => {\n        // Reload the questions based on the specified filters. If no filters are provided,\n        // use the default category filter condition.\n        if (filterdata) {\n            // Main join types.\n            viewData.jointype = parseInt(filterSet.dataset.filterverb, 10);\n            delete filterdata.jointype;\n            // Retrieve filter info.\n            viewData.filter = filterdata;\n            if (Object.keys(filterdata).length !== 0) {\n                if (!isNaN(viewData.jointype)) {\n                    filterdata.jointype = viewData.jointype;\n                }\n                updateUrlParams(filterdata);\n            }\n        }\n        // Load questions for first page.\n        viewData.filter = JSON.stringify(filterdata);\n        viewData.sortdata = JSON.stringify(sortData);\n        Fragment.loadFragment(component, callback, contextId, viewData)\n            // Render questions for first page and pagination.\n            .then((questionhtml, jsfooter) => {\n                const questionscontainer = document.querySelector(SELECTORS.QUESTION_CONTAINER_ID);\n                if (questionhtml === undefined) {\n                    questionhtml = '';\n                }\n                if (jsfooter === undefined) {\n                    jsfooter = '';\n                }\n                Templates.replaceNode(questionscontainer, questionhtml, jsfooter);\n                // Resolve filter promise.\n                if (pendingPromise) {\n                    pendingPromise.resolve();\n                }\n                return {questionhtml, jsfooter};\n            })\n            .catch(Notification.exception);\n    };\n\n    // Init core filter processor with apply callback.\n    const coreFilter = new CoreFilter(filterSet, applyFilter);\n    coreFilter.activeFilters = {}; // Unset useless courseid filter.\n    coreFilter.init();\n\n    /**\n     * Update URL Param based upon the current filter.\n     *\n     * @param {Object} filters Active filters.\n     */\n    const updateUrlParams = (filters) => {\n        const url = new URL(location.href);\n        const filterQuery = JSON.stringify(filters);\n        url.searchParams.set('filter', filterQuery);\n        history.pushState(filters, '', url);\n        const editSwitch = document.querySelector(SELECTORS.EDIT_SWITCH);\n        if (editSwitch) {\n            const editSwitchUrlInput = document.querySelector(SELECTORS.EDIT_SWITCH_URL);\n            const editSwitchUrl = new URL(editSwitchUrlInput.value);\n            editSwitchUrl.searchParams.set('filter', filterQuery);\n            editSwitchUrlInput.value = editSwitchUrl;\n            editSwitch.dataset.pageurl = editSwitchUrl;\n        }\n    };\n\n    /**\n     * Cleans URL parameters.\n     */\n    const cleanUrlParams = () => {\n        const queryString = location.search;\n        const urlParams = new URLSearchParams(queryString);\n        if (urlParams.has('cmid')) {\n            const cleanedUrl = new URL(location.href.replace(location.search, ''));\n            cleanedUrl.searchParams.set('cmid', urlParams.get('cmid'));\n            history.pushState({}, '', cleanedUrl);\n        }\n\n        if (urlParams.has('courseid')) {\n            const cleanedUrl = new URL(location.href.replace(location.search, ''));\n            cleanedUrl.searchParams.set('courseid', urlParams.get('courseid'));\n            history.pushState({}, '', cleanedUrl);\n        }\n    };\n\n    // Add listeners for the sorting, paging and clear actions.\n    document.addEventListener('click', e => {\n        const sortableLink = e.target.closest(SELECTORS.SORT_LINK);\n        const paginationLink = e.target.closest(SELECTORS.PAGINATION_LINK);\n        const clearLink = e.target.closest(Selectors.filterset.actions.resetFilters);\n        if (sortableLink) {\n            e.preventDefault();\n            const oldSort = sortData;\n            sortData = {};\n            sortData[sortableLink.dataset.sortname] = sortableLink.dataset.sortorder;\n            for (const sortname in oldSort) {\n                if (sortname !== sortableLink.dataset.sortname) {\n                    sortData[sortname] = oldSort[sortname];\n                }\n            }\n            viewData.qpage = 0;\n            coreFilter.updateTableFromFilter();\n        }\n        if (paginationLink) {\n            e.preventDefault();\n            const paginationURL = new URL(paginationLink.getAttribute(\"href\"));\n            const qpage = paginationURL.searchParams.get('qpage');\n            if (paginationURL.search !== null) {\n                viewData.qpage = qpage;\n                coreFilter.updateTableFromFilter();\n            }\n        }\n        if (clearLink) {\n            cleanUrlParams();\n        }\n    });\n\n    // Run apply filter at page load.\n    pagevars = JSON.parse(pagevars);\n    let initialFilters;\n    let jointype = null;\n    if (pagevars.filter) {\n        // Load initial filter based on page vars.\n        initialFilters = pagevars.filter;\n        if (pagevars.jointype) {\n            jointype = pagevars.jointype;\n        }\n    }\n\n    if (Object.entries(initialFilters).length !== 0) {\n        // Remove the default empty filter row.\n        const emptyFilterRow = filterSet.querySelector(Selectors.filterset.regions.emptyFilterRow);\n        if (emptyFilterRow) {\n            emptyFilterRow.remove();\n        }\n\n        // Add filters.\n        let rowcount = 0;\n        for (const urlFilter in initialFilters) {\n            if (urlFilter === 'jointype') {\n                jointype = initialFilters[urlFilter];\n                continue;\n            }\n            // Add each filter row.\n            rowcount += 1;\n            const filterdata = {\n                filtertype: urlFilter,\n                values:  initialFilters[urlFilter].values,\n                jointype: initialFilters[urlFilter].jointype,\n                filteroptions: initialFilters[urlFilter].filteroptions,\n                rownum: rowcount\n            };\n            coreFilter.addFilterRow(filterdata);\n        }\n        coreFilter.filterSet.dataset.filterverb = jointype;\n\n        // Since we must filter by category, it does not make sense to allow the top-level \"match any\" or \"match none\" conditions,\n        // as this would exclude the category. Remove those options and disable the select.\n        const join = coreFilter.filterSet.querySelector(Selectors.filterset.fields.join);\n        join.querySelectorAll(`option:not([value=\"${jointype}\"])`).forEach((option) => option.remove());\n        join.disabled = true;\n    }\n};\n"],"names":["filterRegionId","defaultcourseid","defaultcategoryid","perpage","contextId","component","callback","view","cmid","pagevars","extraparams","SELECTORS","filterSet","document","querySelector","viewData","cat","courseid","filter","jointype","qpage","qperpage","sortdata","lastchanged","_document$querySelect2","value","sortData","defaultSort","_document$querySelect3","dataset","_document$querySelect4","defaultsort","JSON","parse","coreFilter","CoreFilter","filterdata","pendingPromise","parseInt","filterverb","Object","keys","length","isNaN","updateUrlParams","stringify","loadFragment","then","questionhtml","jsfooter","questionscontainer","undefined","replaceNode","resolve","catch","Notification","exception","activeFilters","init","filters","url","URL","location","href","filterQuery","searchParams","set","history","pushState","editSwitch","editSwitchUrlInput","editSwitchUrl","pageurl","initialFilters","addEventListener","e","sortableLink","target","closest","paginationLink","clearLink","Selectors","filterset","actions","resetFilters","preventDefault","oldSort","sortname","sortorder","updateTableFromFilter","paginationURL","getAttribute","get","search","queryString","urlParams","URLSearchParams","has","cleanedUrl","replace","cleanUrlParams","entries","emptyFilterRow","regions","remove","rowcount","urlFilter","filtertype","values","filteroptions","rownum","addFilterRow","join","fields","querySelectorAll","forEach","option","disabled"],"mappings":"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"}