admin/tool/policy/amd/src/acceptances_filter.js

// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * Unified filter page JS module for the course participants page.
 *
 * @module     tool_policy/acceptances_filter
 * @copyright  2017 Jun Pataleta
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
define(['jquery', 'core/form-autocomplete', 'core/str', 'core/notification'],
    function($, Autocomplete, Str, Notification) {

        /**
         * Selectors.
         *
         * @access private
         * @type {{UNIFIED_FILTERS: string}}
         */
        var SELECTORS = {
            UNIFIED_FILTERS: '#unified-filters'
        };

        /**
         * Init function.
         *
         * @method init
         * @private
         */
        var init = function() {
            var stringkeys = [{
                key: 'filterplaceholder',
                component: 'tool_policy'
            }, {
                key: 'nofiltersapplied',
                component: 'tool_policy'
            }];

            M.util.js_pending('acceptances_filter_datasource');
            Str.get_strings(stringkeys).done(function(langstrings) {
                var placeholder = langstrings[0];
                var noSelectionString = langstrings[1];
                Autocomplete.enhance(SELECTORS.UNIFIED_FILTERS, true, 'tool_policy/acceptances_filter_datasource', placeholder,
                    false, true, noSelectionString, true)
                    .then(function() {
                        M.util.js_complete('acceptances_filter_datasource');

                        return;
                    })
                    .fail(Notification.exception);
            }).fail(Notification.exception);

            var last = $(SELECTORS.UNIFIED_FILTERS).val();
            $(SELECTORS.UNIFIED_FILTERS).on('change', function() {
                var current = $(this).val();
                var listoffilters = [];
                var textfilters = [];
                var updatedselectedfilters = false;

                $.each(current, function(index, catoption) {
                    var catandoption = catoption.split(':', 2);
                    if (catandoption.length !== 2) {
                        textfilters.push(catoption);
                        return true; // Text search filter.
                    }

                    var category = catandoption[0];
                    var option = catandoption[1];

                    // The last option (eg. 'Teacher') out of a category (eg. 'Role') in this loop is the one that was last
                    // selected, so we want to use that if there are multiple options from the same category. Eg. The user
                    // may have chosen to filter by the 'Student' role, then wanted to filter by the 'Teacher' role - the
                    // last option in the category to be selected (in this case 'Teacher') will come last, so will overwrite
                    // 'Student' (after this if). We want to let the JS know that the filters have been updated.
                    if (typeof listoffilters[category] !== 'undefined') {
                        updatedselectedfilters = true;
                    }

                    listoffilters[category] = option;
                    return true;
                });

                // Check if we have something to remove from the list of filters.
                if (updatedselectedfilters) {
                    // Go through and put the list into something we can use to update the list of filters.
                    var updatefilters = [];
                    for (var category in listoffilters) {
                        updatefilters.push(category + ":" + listoffilters[category]);
                    }
                    updatefilters = updatefilters.concat(textfilters);
                    $(this).val(updatefilters);
                }

                // Prevent form from submitting unnecessarily, eg. on blur when no filter is selected.
                if (last.join(',') != current.join(',')) {
                    this.form.submit();
                }
            });
        };

        /**
         * Return the unified user filter form.
         *
         * @method getForm
         * @return {DOMElement}
         */
        var getForm = function() {
            return $(SELECTORS.UNIFIED_FILTERS).closest('form');
        };

        return /** @alias module:core/form-autocomplete */ {
            /**
             * Initialise the unified user filter.
             *
             * @method init
             */
            init: function() {
                init();
            },

            /**
             * Return the unified user filter form.
             *
             * @method getForm
             * @return {DOMElement}
             */
            getForm: function() {
                return getForm();
            }
        };
    });