mod/forum/amd/src/discussion_list.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/>.

/**
 * Module for the list of discussions on when viewing a forum.
 *
 * @module     mod_forum/discussion_list
 * @copyright  2019 Andrew Nicols <andrew@nicols.co.uk>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
define([
    'jquery',
    'core/templates',
    'core/str',
    'core/notification',
    'mod_forum/subscription_toggle',
    'mod_forum/selectors',
    'mod_forum/repository',
    'core/pubsub',
    'mod_forum/forum_events',
    'core_form/changechecker',
], function(
    $,
    Templates,
    Str,
    Notification,
    SubscriptionToggle,
    Selectors,
    Repository,
    PubSub,
    ForumEvents,
    FormChangeChecker
) {
    var registerEventListeners = function(root) {
        PubSub.subscribe(ForumEvents.SUBSCRIPTION_TOGGLED, function(data) {
            var discussionId = data.discussionId;
            var subscribed = data.subscriptionState;
            var discussionListItem = root.find(Selectors.discussion.item + '[data-discussionid= ' + discussionId + ']');
            var subscribedLabel = discussionListItem.find(Selectors.discussion.subscribedLabel);
            if (subscribed) {
                discussionListItem.addClass('subscribed');
                subscribedLabel.removeAttr('hidden');
            } else {
                discussionListItem.removeClass('subscribed');
                subscribedLabel.attr('hidden', true);
            }
        });

        root.on('click', Selectors.post.inpageCancelButton, function(e) {
            // Tell formchangechecker to reset the form state.
            FormChangeChecker.resetFormDirtyState(e.currentTarget);
        });

        root.on('click', Selectors.favourite.toggle, function(e) {
            e.preventDefault();

            var toggleElement = $(this);
            var forumId = toggleElement.data('forumid');
            var discussionId = toggleElement.data('discussionid');
            var subscriptionState = toggleElement.data('targetstate');
            Repository.setFavouriteDiscussionState(forumId, discussionId, subscriptionState)
                .then(function() {
                    return location.reload();
                })
                .catch(Notification.exception);
        });

        root.on('click', Selectors.pin.toggle, function(e) {
            e.preventDefault();
            var toggleElement = $(this);
            var forumId = toggleElement.data('forumid');
            var discussionId = toggleElement.data('discussionid');
            var state = toggleElement.data('targetstate');
            Repository.setPinDiscussionState(forumId, discussionId, state)
                .then(function() {
                    return location.reload();
                })
                .catch(Notification.exception);
        });

        root.on('click', Selectors.lock.toggle, function(e) {
            var toggleElement = $(this);
            var forumId = toggleElement.data('forumid');
            var discussionId = toggleElement.data('discussionid');
            var state = toggleElement.data('state');

            Repository.setDiscussionLockState(forumId, discussionId, state)
                .then(function(context) {
                    var icon = toggleElement.parents(Selectors.summary.actions).find(Selectors.lock.icon);
                    var lockedLabel = toggleElement.parents(Selectors.discussion.item).find(Selectors.discussion.lockedLabel);
                    if (context.locked) {
                        icon.removeClass('hidden');
                        lockedLabel.removeAttr('hidden');
                    } else {
                        icon.addClass('hidden');
                        lockedLabel.attr('hidden', true);
                    }
                    return context;
                })
                .then(function(context) {
                    context.forumid = forumId;
                    return Templates.render('mod_forum/discussion_lock_toggle', context);
                })
                .then(function(html, js) {
                    return Templates.replaceNode(toggleElement, html, js);
                })
                .then(function() {
                    return Str.get_string('lockupdated', 'forum')
                        .done(function(s) {
                            return Notification.addNotification({
                                message: s,
                                type: "info"
                            });
                        });
                })
                .catch(Notification.exception);

            e.preventDefault();
        });
    };

    return {
        init: function(root) {
            SubscriptionToggle.init(root, false, function(toggleElement, context) {
                var toggleId = toggleElement.attr('id');
                var newTargetState = context.userstate.subscribed ? 0 : 1;
                toggleElement.data('targetstate', newTargetState);

                var stringKey = context.userstate.subscribed ? 'unsubscribediscussion' : 'subscribediscussion';
                return Str.get_string(stringKey, 'mod_forum')
                    .then(function(string) {
                        toggleElement.closest('td').find('label[for="' + toggleId + '"]').find('span').text(string);
                        return string;
                    });
            });
            registerEventListeners(root);
        }
    };
});