Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

/**
 * Handles filtering of items on download center page
 *
 * @module        local_downloadcenter/modfilter
 * @author        Simeon Naydenov (moniNaydenov@gmail.com)
 * @copyright     2022 Academic Moodle Cooperation {@link http://www.academic-moodle-cooperation.org}
 * @license       http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

/**
 * @module local_downloadcenter/modfilter
 */
define(['jquery', 'core/str', 'core/url'], function($, Str, url) {

    const ModFilter = function(modnames) {

        const instance = this;
        this.modnames = modnames;
        this.strings = {};
        this.formid = null;
        this.currentlyshown = false;
        this.modlist = null;

        Str.get_strings([
            {key: 'all', component: 'moodle'},
            {key: 'none', component: 'moodle'},
            {key: 'select', component: 'moodle'},
            {key: 'showtypes', component: 'backup'},
            {key: 'hidetypes', component: 'backup'}
        ]).done(function(strs) {
            // Init strings.. new moodle super cool way...
            instance.strings['all'] = strs[0];
            instance.strings['none'] = strs[1];
            instance.strings['select'] = strs[2];
            instance.strings['showtypes'] = strs[3];
            instance.strings['hidetypes'] = strs[4];

            const firstsection = $('div[role="main"] > form .card.block').first();
            instance.formid = firstsection.closest('form').prop('id');

            // Add global select all/none options.
            const showTypeOptionsLink = '<span class="font-weight-bold ml-3 text-nowrap">' +
                '(<a id="downloadcenter-bytype" href="#">' + instance.strings['showtypes'] + '</a>)' + '</span>';
            let html = instance.html_generator('included', instance.strings['select']);
            let links = $(document.createElement('div'));
            links.addClass('grouped_settings section_level block card');
            links.html(html);
            links.find('.downloadcenter_selector .col-md-9').append(showTypeOptionsLink);

            links.insertBefore(firstsection);

            // For each module type on the course, add hidden select all/none options.
            instance.modlist = $(document.createElement('div'));
            instance.modlist.prop('id', 'mod_select_links');
            instance.modlist.prop('class', 'm-l-2');
            instance.modlist.appendTo(links);
            instance.modlist.hide();

            for (let mod in instance.modnames) {
                // Only include actual values from the list..
                if (!instance.modnames.hasOwnProperty(mod)) {
                    continue;
                }

                const img = '<img src="' + url.imageUrl('icon', 'mod_' + mod) + '" class="activityicon" />';
                html = instance.html_generator('mod_' + mod, img + instance.modnames[mod]);
                const modlinks = $(document.createElement('div'));
                modlinks.addClass('grouped_settings section_level');
                modlinks.html(html);
                modlinks.appendTo(instance.modlist);
                instance.initlinks(modlinks, mod);
            }

            // Attach events to links!
            $('#downloadcenter-all-included').click(function(e) { instance.helper(e, true,  'item_'); });
            $('#downloadcenter-none-included').click(function(e) { instance.helper(e, false, 'item_'); });
            $('#downloadcenter-bytype').click(function(e) { e.preventDefault(); instance.toggletypes(); });
            // Attach event to checkboxes!
            $('input.form-check-input').click(function() { instance.checkboxhandler($(this)); instance.updateFormState(); });
        });

    };

    ModFilter.prototype.checkboxhandler = function($checkbox) {
        const prefix = 'item_topic';
        const shortprefix = 'item_';
        const name = $checkbox.prop('name');
        const checked = $checkbox.prop('checked');
        if (name.substring(0, shortprefix.length) === shortprefix) {
            const $parent = $checkbox.parentsUntil('form', '.card');
            if (name.substring(0, prefix.length) === prefix) {
                $parent.find('input.form-check-input').prop('checked', checked);
            } else {
                if (checked) {
                    $parent.find('input.form-check-input[name^="item_topic"]').prop('checked', true);
                }
            }
        }
    };

    ModFilter.prototype.updateFormState = function() {
        // At this point, we really need to persuade the form we are part of to
        // update all of its disabledIf rules. However, as far as I can see,
        // given the way that lib/form/form.js is written, that is impossible.
        if (this.formid && M.form && M.form.updateFormState) {
            M.form.updateFormState(this.formid);
        }
    };

    // Toggles the display of the hidden module select all/none links.
    ModFilter.prototype.toggletypes = function() {
        // Change text of type toggle link.
        const link = $('#downloadcenter-bytype');
        if (this.currentlyshown) {
            link.text(this.strings['showtypes']);
        } else {
            link.text(this.strings['hidetypes']);
        }
        this.modlist.animate({height: 'toggle' }, 500, 'swing');

        this.currentlyshown = !this.currentlyshown;

    };

    ModFilter.prototype.initlinks = function(links, mod) {
        const instance = this;
        $('#downloadcenter-all-mod_' + mod).click(function(e) { instance.helper(e, true, 'item_', mod); });
        $('#downloadcenter-none-mod_' + mod).click(function(e) { instance.helper(e, false, 'item_', mod); });

    };

    ModFilter.prototype.helper = function(e, check, type, mod) {
        e.preventDefault();
        let prefix = '';
        if (typeof mod !== 'undefined') {
            prefix = 'item_' + mod + '_';
        }

        const len = type.length;

        $('input[type="checkbox"]').each(function(i, checkbox) {
            checkbox = $(checkbox);
            const name = checkbox.prop('name');

            // If a prefix has been set, ignore checkboxes which don't have that prefix.
            if (prefix && name.substring(0, prefix.length) !== prefix) {
                return;
            }
            if (name.substring(0, len) === type) {
                checkbox.prop('checked', check);
            }
            if (check) {
                checkbox.closest('.card.block').find('.form-group:first-child input').prop('checked', check);
            }
        });

        this.updateFormState();
    };

    ModFilter.prototype.html_generator = function(idtype, heading) {
        let links = '<a id="downloadcenter-all-' + idtype + '" href="#">' + this.strings['all'] + '</a> / ';
        links += '<a id="downloadcenter-none-' + idtype + '" href="#">' + this.strings['none'] + '</a>';
        return this.row_generator(heading, links);
    };

    ModFilter.prototype.row_generator = function(heading, content) {
        let ret = '<div class="form-group row fitem downloadcenter_selector">';
        ret += '<div class="col-md-3"></div>';
        ret += '<div class="col-md-9">';
        ret += '<label><span class="itemtitle">' + heading + '</span></label>';
        ret += '<span class="text-nowrap">' + content + '</span>';
        ret += '</div>';
        ret += '</div>';
        return ret;
    };

    return {
        init: function(modnames) {
            return new ModFilter(modnames);
        }
    };
});