MDL-68169 user: Limit the number of filter conditions
[moodle.git] / user / amd / build / participantsfilter.min.js.map
1 {"version":3,"sources":["../src/participantsfilter.js"],"names":["init","participantsRegionId","filterSet","document","querySelector","activeFilters","courseid","CourseFilter","getFilterRegion","Selectors","filterset","regions","filterlist","addFilterRow","Templates","renderForPromise","then","html","js","newContentNodes","appendNodeContents","filterRow","typeList","data","forEach","contentNode","contentTypeList","filter","fields","type","innerHTML","updateFiltersOptions","catch","Notification","exception","getFilterDataSource","filterType","filterDataNode","datasource","byName","addFilter","dataset","Filter","GenericFilter","filterTypeClass","typeField","disabled","getFilterObject","name","removeOrReplaceFilterRow","filterCount","querySelectorAll","region","length","replaceFilterRow","removeFilterRow","removeFilterObject","remove","updateTableFromFilter","replaceNode","filterName","tearDown","removeAllFilters","filters","options","option","value","classList","add","addRowButton","actions","addRow","all","setAttribute","removeAttribute","filtermatch","join","DynamicTable","setFilters","getTableFromId","tableRegion","Object","values","map","filterValue","jointype","addEventListener","e","target","closest","preventDefault","applyFilters","resetFilters","filterverb"],"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 * Participants filter managemnet.\n *\n * @module     core_user/participants_filter\n * @package    core_user\n * @copyright  2020 Andrew Nicols <andrew@nicols.co.uk>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport CourseFilter from './local/participantsfilter/filtertypes/courseid';\nimport * as DynamicTable from 'core_table/dynamic';\nimport GenericFilter from './local/participantsfilter/filter';\nimport Notification from 'core/notification';\nimport Selectors from './local/participantsfilter/selectors';\nimport Templates from 'core/templates';\n\n/**\n * Initialise the participants filter on the element with the given id.\n *\n * @param {String} participantsRegionId\n */\nexport const init = participantsRegionId => {\n    // Keep a reference to the filterset.\n    const filterSet = document.querySelector(`#${participantsRegionId}`);\n\n    // Keep a reference to all of the active filters.\n    const activeFilters = {\n        courseid: new CourseFilter('courseid', filterSet),\n    };\n\n    /**\n     * Get the filter list region.\n     *\n     * @return {HTMLElement}\n     */\n    const getFilterRegion = () => filterSet.querySelector(Selectors.filterset.regions.filterlist);\n\n    /**\n     * Add an unselected filter row.\n     *\n     * @return {Promise}\n     */\n    const addFilterRow = () => {\n        return Templates.renderForPromise('core_user/local/participantsfilter/filterrow', {})\n        .then(({html, js}) => {\n            const newContentNodes = Templates.appendNodeContents(getFilterRegion(), html, js);\n\n            return newContentNodes;\n        })\n        .then(filterRow => {\n            // Note: This is a nasty hack.\n            // We should try to find a better way of doing this.\n            // We do not have the list of types in a readily consumable format, so we take the pre-rendered one and copy\n            // it in place.\n            const typeList = filterSet.querySelector(Selectors.data.typeList);\n\n            filterRow.forEach(contentNode => {\n                const contentTypeList = contentNode.querySelector(Selectors.filter.fields.type);\n\n                if (contentTypeList) {\n                    contentTypeList.innerHTML = typeList.innerHTML;\n                }\n            });\n\n            return filterRow;\n        })\n        .then(filterRow => {\n            updateFiltersOptions();\n\n            return filterRow;\n        })\n        .catch(Notification.exception);\n    };\n\n    /**\n     * Get the filter data source node fro the specified filter type.\n     *\n     * @param {String} filterType\n     * @return {HTMLElement}\n     */\n    const getFilterDataSource = filterType => {\n        const filterDataNode = filterSet.querySelector(Selectors.filterset.regions.datasource);\n\n        return filterDataNode.querySelector(Selectors.data.fields.byName(filterType));\n    };\n\n    /**\n     * Add a filter to the list of active filters, performing any necessary setup.\n     *\n     * @param {HTMLElement} filterRow\n     * @param {String} filterType\n     */\n    const addFilter = async(filterRow, filterType) => {\n        // Name the filter on the filter row.\n        filterRow.dataset.filterType = filterType;\n\n        const filterDataNode = getFilterDataSource(filterType);\n\n        // Instantiate the Filter class.\n        let Filter = GenericFilter;\n        if (filterDataNode.dataset.filterTypeClass) {\n            Filter = await import(filterDataNode.dataset.filterTypeClass);\n        }\n        activeFilters[filterType] = new Filter(filterType, filterSet);\n\n        // Disable the select.\n        const typeField = filterRow.querySelector(Selectors.filter.fields.type);\n        typeField.disabled = 'disabled';\n\n        // Update the list of available filter types.\n        updateFiltersOptions();\n    };\n\n    /**\n     * Get the registered filter class for the named filter.\n     *\n     * @param {String} name\n     * @return {Object} See the Filter class.\n     */\n    const getFilterObject = name => {\n        return activeFilters[name];\n    };\n\n    /**\n     * Remove or replace the specified filter row and associated class, ensuring that if there is only one filter row,\n     * that it is replaced instead of being removed.\n     *\n     * @param {HTMLElement} filterRow\n     */\n    const removeOrReplaceFilterRow = filterRow => {\n        const filterCount = getFilterRegion().querySelectorAll(Selectors.filter.region).length;\n\n        if (filterCount === 1) {\n            replaceFilterRow(filterRow);\n        } else {\n            removeFilterRow(filterRow);\n        }\n    };\n\n    /**\n     * Remove the specified filter row and associated class.\n     *\n     * @param {HTMLElement} filterRow\n     */\n    const removeFilterRow = filterRow => {\n        // Remove the filter object.\n        removeFilterObject(filterRow.dataset.filterType);\n\n        // Remove the actual filter HTML.\n        filterRow.remove();\n\n        // Refresh the table.\n        updateTableFromFilter();\n\n        // Update the list of available filter types.\n        updateFiltersOptions();\n    };\n\n    /**\n     * Replace the specified filter row with a new one.\n     *\n     * @param {HTMLElement} filterRow\n     * @return {Promise}\n     */\n    const replaceFilterRow = filterRow => {\n        // Remove the filter object.\n        removeFilterObject(filterRow.dataset.filterType);\n\n        return Templates.renderForPromise('core_user/local/participantsfilter/filterrow', {})\n        .then(({html, js}) => {\n            const newContentNodes = Templates.replaceNode(filterRow, html, js);\n\n            return newContentNodes;\n        })\n        .then(filterRow => {\n            // Note: This is a nasty hack.\n            // We should try to find a better way of doing this.\n            // We do not have the list of types in a readily consumable format, so we take the pre-rendered one and copy\n            // it in place.\n            const typeList = filterSet.querySelector(Selectors.data.typeList);\n\n            filterRow.forEach(contentNode => {\n                const contentTypeList = contentNode.querySelector(Selectors.filter.fields.type);\n\n                if (contentTypeList) {\n                    contentTypeList.innerHTML = typeList.innerHTML;\n                }\n            });\n\n            return filterRow;\n        })\n        .then(filterRow => {\n            updateFiltersOptions();\n\n            return filterRow;\n        })\n        .then(filterRow => {\n            // Refresh the table.\n            updateTableFromFilter();\n\n            return filterRow;\n        })\n        .catch(Notification.exception);\n    };\n\n    /**\n     * Remove the Filter Object from the register.\n     *\n     * @param {string} filterName The name of the filter to be removed\n     */\n    const removeFilterObject = filterName => {\n        if (filterName) {\n            const filter = getFilterObject(filterName);\n            if (filter) {\n                filter.tearDown();\n\n                // Remove from the list of active filters.\n                delete activeFilters[filterName];\n            }\n        }\n    };\n\n    /**\n     * Remove all filters.\n     */\n    const removeAllFilters = async() => {\n        const filters = getFilterRegion().querySelectorAll(Selectors.filter.region);\n        filters.forEach((filterRow) => {\n            removeOrReplaceFilterRow(filterRow);\n        });\n\n        // Refresh the table.\n        updateTableFromFilter();\n    };\n\n    /**\n     * Update the list of filter types to filter out those already selected.\n     */\n    const updateFiltersOptions = () => {\n        const filters = getFilterRegion().querySelectorAll(Selectors.filter.region);\n        filters.forEach(filterRow => {\n            const options = filterRow.querySelectorAll(Selectors.filter.fields.type + ' option');\n            options.forEach(option => {\n                if (option.value === filterRow.dataset.filterType) {\n                    option.classList.remove('hidden');\n                    option.disabled = false;\n                } else if (activeFilters[option.value]) {\n                    option.classList.add('hidden');\n                    option.disabled = true;\n                } else {\n                    option.classList.remove('hidden');\n                    option.disabled = false;\n                }\n            });\n        });\n\n        // Configure the state of the \"Add row\" button.\n        // This button is disabled when there is a filter row available for each condition.\n        const addRowButton = filterSet.querySelector(Selectors.filterset.actions.addRow);\n        const filterDataNode = filterSet.querySelectorAll(Selectors.data.fields.all);\n        if (filterDataNode.length <= filters.length) {\n            addRowButton.setAttribute('disabled', 'disabled');\n        } else {\n            addRowButton.removeAttribute('disabled');\n        }\n\n        if (filters.length === 1) {\n            filterSet.querySelector(Selectors.filterset.regions.filtermatch).classList.add('hidden');\n            filterSet.querySelector(Selectors.filterset.fields.join).value = 1;\n        } else {\n            filterSet.querySelector(Selectors.filterset.regions.filtermatch).classList.remove('hidden');\n        }\n    };\n\n    /**\n     * Update the Dynamic table based upon the current filter.\n     *\n     * @return {Promise}\n     */\n    const updateTableFromFilter = () => {\n        return DynamicTable.setFilters(\n            DynamicTable.getTableFromId(filterSet.dataset.tableRegion),\n            {\n                filters: Object.values(activeFilters).map(filter => filter.filterValue),\n                jointype: filterSet.querySelector(Selectors.filterset.fields.join).value,\n            }\n        );\n    };\n\n    // Add listeners for the main actions.\n    filterSet.querySelector(Selectors.filterset.region).addEventListener('click', e => {\n        if (e.target.closest(Selectors.filterset.actions.addRow)) {\n            e.preventDefault();\n\n            addFilterRow();\n        }\n\n        if (e.target.closest(Selectors.filterset.actions.applyFilters)) {\n            e.preventDefault();\n\n            updateTableFromFilter();\n        }\n\n        if (e.target.closest(Selectors.filterset.actions.resetFilters)) {\n            e.preventDefault();\n\n            removeAllFilters();\n        }\n    });\n\n    // Add the listener to remove a single filter.\n    filterSet.querySelector(Selectors.filterset.regions.filterlist).addEventListener('click', e => {\n        if (e.target.closest(Selectors.filter.actions.remove)) {\n            e.preventDefault();\n\n            removeOrReplaceFilterRow(e.target.closest(Selectors.filter.region));\n        }\n    });\n\n    // Add listeners for the filter type selection.\n    filterSet.querySelector(Selectors.filterset.regions.filterlist).addEventListener('change', e => {\n        const typeField = e.target.closest(Selectors.filter.fields.type);\n        if (typeField && typeField.value) {\n            const filter = e.target.closest(Selectors.filter.region);\n\n            addFilter(filter, typeField.value);\n        }\n    });\n\n    filterSet.querySelector(Selectors.filterset.fields.join).addEventListener('change', e => {\n        filterSet.dataset.filterverb = e.target.value;\n    });\n};\n"],"file":"participantsfilter.min.js"}