MDL-68169 user: Add keyword filter
[moodle.git] / user / amd / build / local / participantsfilter / filter.min.js.map
1 {"version":3,"sources":["../../../src/local/participantsfilter/filter.js"],"names":["getOptionsForSelect","select","querySelectorAll","filterType","rootNode","addValueSelector","filterValueNode","getFilterValueNode","innerHTML","getSourceDataForFilter","outerHTML","dataSource","querySelector","Autocomplete","dataset","allowCustom","placeholder","showSuggestions","multiple","items","layout","selection","enhance","filterDataNode","Selectors","filterset","regions","datasource","data","fields","byName","filterRoot","filter","values","join","value","filterValueSelect","Object","map","option","rawValues","parseInt","name","jointype"],"mappings":"mNAuBA,OACA,O,srBAWMA,CAAAA,CAAmB,CAAG,SAAAC,CAAM,CAAI,CAClC,MAAOA,CAAAA,CAAM,CAACC,gBAAP,CAAwB,UAAxB,CACV,C,cAUG,WAAYC,CAAZ,CAAwBC,CAAxB,CAAkC,WAC9B,KAAKD,UAAL,CAAkBA,CAAlB,CACA,KAAKC,QAAL,CAAgBA,CAAhB,CAEA,KAAKC,gBAAL,EACH,C,8CAKU,CAEV,C,iLAwBSC,C,CAAkB,KAAKC,kBAAL,E,CAGxBD,CAAe,CAACE,SAAhB,CAA4B,KAAKC,sBAAL,GAA8BC,SAA1D,CAEMC,C,CAAaL,CAAe,CAACM,aAAhB,CAA8B,QAA9B,C,MAEnBC,S,MAEIF,C,MAGkC,GAAlC,EAAAA,CAAU,CAACG,OAAX,CAAmBC,W,gBAMb,MAAKC,W,yBAMX,KAAKC,e,MAML,CAACN,CAAU,CAACO,Q,MAGZ,CACIC,KAAK,CAAE,iEADX,CAEIC,MAAM,CAAE,wDAFZ,CAGIC,SAAS,CAAE,2DAHf,C,MA1BSC,O,qBAQT,I,cAYA,I,yMA4BiB,CACrB,GAAMC,CAAAA,CAAc,CAAG,KAAKnB,QAAL,CAAcQ,aAAd,CAA4BY,UAAUC,SAAV,CAAoBC,OAApB,CAA4BC,UAAxD,CAAvB,CAEA,MAAOJ,CAAAA,CAAc,CAACX,aAAf,CAA6BY,UAAUI,IAAV,CAAeC,MAAf,CAAsBC,MAAtB,CAA6B,KAAK3B,UAAlC,CAA7B,CACV,C,+DAOoB,CACjB,MAAO,MAAK4B,UAAL,CAAgBnB,aAAhB,CAA8BY,UAAUQ,MAAV,CAAiBN,OAAjB,CAAyBO,MAAvD,CACV,C,uCArFiB,CACd,MAAO,iBAAU,yBAAV,CAAqC,WAArC,CACV,C,2CAOqB,CAClB,QACH,C,sCAoDgB,CACb,MAAO,MAAK7B,QAAL,CAAcQ,aAAd,CAA4BY,UAAUQ,MAAV,CAAiBF,MAAjB,CAAwB,KAAK3B,UAA7B,CAA5B,CACV,C,gCA2BU,CACP,MAAO,MAAKA,UACf,C,oCAOc,CACX,MAAO,MAAK4B,UAAL,CAAgBnB,aAAhB,CAA8BY,UAAUQ,MAAV,CAAiBH,MAAjB,CAAwBK,IAAtD,EAA4DC,KACtE,C,qCAOe,IACN7B,CAAAA,CAAe,CAAG,KAAKC,kBAAL,EADZ,CAEN6B,CAAiB,CAAG9B,CAAe,CAACM,aAAhB,CAA8B,QAA9B,CAFd,CAIZ,MAAOyB,CAAAA,MAAM,CAACJ,MAAP,CAAcjC,CAAmB,CAACoC,CAAD,CAAjC,EAAsDE,GAAtD,CAA0D,SAAAC,CAAM,QAAIA,CAAAA,CAAM,CAACJ,KAAX,CAAhE,CACV,C,kCAOY,CACT,MAAO,MAAKK,SAAL,CAAeF,GAAf,CAAmB,SAAAC,CAAM,QAAIE,CAAAA,QAAQ,CAACF,CAAD,CAAS,EAAT,CAAZ,CAAzB,CACV,C,uCAOiB,CACd,MAAO,CACHG,IAAI,CAAE,KAAKA,IADR,CAEHC,QAAQ,CAAE,KAAKA,QAFZ,CAGHV,MAAM,CAAE,KAAKA,MAHV,CAKV,C","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 * Base Filter class for a filter type in the participants filter UI.\n *\n * @module     core_user/local/participantsfilter/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 */\nimport Autocomplete from 'core/form-autocomplete';\nimport Selectors from './selectors';\nimport {get_string as getString} from 'core/str';\n\n/**\n * Fetch all checked options in the select.\n *\n * This is a poor-man's polyfill for select.selectedOptions, which is not available in IE11.\n *\n * @param {HTMLSelectElement} select\n * @returns {HTMLOptionElement[]} All selected options\n */\nconst getOptionsForSelect = select => {\n    return select.querySelectorAll(':checked');\n};\n\nexport default class {\n\n    /**\n     * Constructor for a new filter.\n     *\n     * @param {String} filterType The type of filter that this relates to\n     * @param {HTMLElement} rootNode The root node for the participants filterset\n     */\n    constructor(filterType, rootNode) {\n        this.filterType = filterType;\n        this.rootNode = rootNode;\n\n        this.addValueSelector();\n    }\n\n    /**\n     * Perform any tear-down for this filter type.\n     */\n    tearDown() {\n        // eslint-disable-line no-empty-function\n    }\n\n    /**\n     * Get the placeholder to use when showing the value selector.\n     *\n     * @return {Promise} Resolving to a String\n     */\n    get placeholder() {\n        return getString('placeholdertypeorselect', 'core_user');\n    }\n\n    /**\n     * Whether to show suggestions in the autocomplete.\n     *\n     * @return {Boolean}\n     */\n    get showSuggestions() {\n        return true;\n    }\n\n    /**\n     * Add the value selector to the filter row.\n     */\n    async addValueSelector() {\n        const filterValueNode = this.getFilterValueNode();\n\n        // Copy the data in place.\n        filterValueNode.innerHTML = this.getSourceDataForFilter().outerHTML;\n\n        const dataSource = filterValueNode.querySelector('select');\n\n        Autocomplete.enhance(\n            // The source select element.\n            dataSource,\n\n            // Whether to allow 'tags' (custom entries).\n            dataSource.dataset.allowCustom == \"1\",\n\n            // We do not require AJAX at all as standard.\n            null,\n\n            // The string to use as a placeholder.\n            await this.placeholder,\n\n            // Disable case sensitivity on searches.\n            false,\n\n            // Show suggestions.\n            this.showSuggestions,\n\n            // Do not override the 'no suggestions' string.\n            null,\n\n            // Close the suggestions if this is not a multi-select.\n            !dataSource.multiple,\n\n            // Template overrides.\n            {\n                items: 'core_user/local/participantsfilter/autocomplete_selection_items',\n                layout: 'core_user/local/participantsfilter/autocomplete_layout',\n                selection: 'core_user/local/participantsfilter/autocomplete_selection',\n            }\n        );\n    }\n\n    /**\n     * Get the root node for this filter.\n     *\n     * @returns {HTMLElement}\n     */\n    get filterRoot() {\n        return this.rootNode.querySelector(Selectors.filter.byName(this.filterType));\n    }\n\n    /**\n     * Get the possible data for this filter type.\n     *\n     * @returns {Array}\n     */\n    getSourceDataForFilter() {\n        const filterDataNode = this.rootNode.querySelector(Selectors.filterset.regions.datasource);\n\n        return filterDataNode.querySelector(Selectors.data.fields.byName(this.filterType));\n    }\n\n    /**\n     * Get the HTMLElement which contains the value selector.\n     *\n     * @returns {HTMLElement}\n     */\n    getFilterValueNode() {\n        return this.filterRoot.querySelector(Selectors.filter.regions.values);\n    }\n\n    /**\n     * Get the name of this filter.\n     *\n     * @returns {String}\n     */\n    get name() {\n        return this.filterType;\n    }\n\n    /**\n     * Get the type of join specified.\n     *\n     * @returns {Number}\n     */\n    get jointype() {\n        return this.filterRoot.querySelector(Selectors.filter.fields.join).value;\n    }\n\n    /**\n     * Get the list of raw values for this filter type.\n     *\n     * @returns {Array}\n     */\n    get rawValues() {\n        const filterValueNode = this.getFilterValueNode();\n        const filterValueSelect = filterValueNode.querySelector('select');\n\n        return Object.values(getOptionsForSelect(filterValueSelect)).map(option => option.value);\n    }\n\n    /**\n     * Get the list of values for this filter type.\n     *\n     * @returns {Array}\n     */\n    get values() {\n        return this.rawValues.map(option => parseInt(option, 10));\n    }\n\n    /**\n     * Get the composed value for this filter.\n     *\n     * @returns {Object}\n     */\n    get filterValue() {\n        return {\n            name: this.name,\n            jointype: this.jointype,\n            values: this.values,\n        };\n    }\n}\n"],"file":"filter.min.js"}