calendar/amd/src/calendar_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/>.

/**
 * This module is responsible for the calendar filter.
 *
 * @module     core_calendar/calendar_filter
 * @copyright  2017 Andrew Nicols <andrew@nicols.co.uk>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
define([
    'jquery',
    'core_calendar/selectors',
    'core_calendar/events',
    'core/str',
    'core/templates',
],
function(
    $,
    CalendarSelectors,
    CalendarEvents,
    Str,
    Templates
) {

    var registerEventListeners = function(root) {
        root.on('click', CalendarSelectors.eventFilterItem, function(e) {
            var target = $(e.currentTarget);

            toggleFilter(target);

            e.preventDefault();
        });

        $('body').on(CalendarEvents.viewUpdated, function() {
            var filters = root.find(CalendarSelectors.eventFilterItem);

            filters.each(function(i, filter) {
                filter = $(filter);
                if (filter.data('eventtype-hidden')) {
                    var data = getFilterData(filter);
                    fireFilterChangedEvent(data);
                }
            });
        });
    };

    var toggleFilter = function(target) {
        var data = getFilterData(target);

        // Toggle the hidden. We need to render the template before we change the value.
        data.hidden = !data.hidden;

        M.util.js_pending("core_calendar/calendar_filter:toggleFilter");
        return Str.get_string('eventtype' + data.eventtype, 'calendar')
        .then(function(nameStr) {
            data.name = nameStr;
            data.icon = true;
            data.key = 'i/' + data.eventtype + 'event';
            data.component = 'core';

            return data;
        })
        .then(function(context) {
            return Templates.render('core_calendar/event_filter_key', context);
        })
        .then(function(html, js) {
            return Templates.replaceNode(target, html, js);
        })
        .then(function() {
            fireFilterChangedEvent(data);
            M.util.js_complete("core_calendar/calendar_filter:toggleFilter");
            return;
        });
    };

    /**
     * Fire the filterChanged event for the specified data.
     *
     * @param   {object} data The data to include
     */
    var fireFilterChangedEvent = function(data) {
        M.util.js_pending("month-mini-filterChanged");
        $('body').trigger(CalendarEvents.filterChanged, {
            type: data.eventtype,
            hidden: data.hidden,
        });
        M.util.js_complete("month-mini-filterChanged");
    };

    /**
     * Get the filter data for the specified target.
     *
     * @param   {jQuery} target The target node
     * @return  {Object}
     */
    var getFilterData = function(target) {
        return {
            eventtype: target.data('eventtype'),
            hidden: target.data('eventtype-hidden'),
        };
    };

    return {
        init: function(root) {
            root = $(root);

            registerEventListeners(root);
        }
    };
});