(function(define) { 'use strict'; define(['jquery', 'underscore', 'backbone', 'gettext', 'js/models/notification', 'js/views/notification'], function($, _, Backbone, gettext) { /* global NotificationModel, NotificationView */ var DividedDiscussionConfigurationView = Backbone.View.extend({ /** * Add/Remove the disabled attribute on given element. * @param {object} $element - The element to disable/enable. * @param {bool} disable - The flag to add/remove 'disabled' attribute. */ setDisabled: function($element, disable) { $element.prop('disabled', disable ? 'disabled' : false); }, /** * Returns the divided discussions list. * @param {string} selector - To select the discussion elements whose ids to return. * @returns {Array} - Divided discussions. */ getDividedDiscussions: function(selector) { var self = this, dividedDiscussions = []; _.each(self.$(selector), function(topic) { dividedDiscussions.push($(topic).data('id')); }); return dividedDiscussions; }, /** * Save the discussionSettings' changed attributes to the server via PATCH method. * It shows the error message(s) if any. * @param {object} $element - Messages would be shown before this element. * @param {object} fieldData - Data to update on the server. */ saveForm: function($element, fieldData) { var self = this, discussionSettingsModel = this.discussionSettings, saveOperation = $.Deferred(), showErrorMessage; showErrorMessage = function(message) { self.showMessage(message, $element, 'error'); }; this.removeNotification(); discussionSettingsModel.save( fieldData, {patch: true, wait: true} ).done(function() { saveOperation.resolve(); }).fail(function(result) { var errorMessage = null, jsonResponse; try { jsonResponse = JSON.parse(result.responseText); errorMessage = jsonResponse.error; } catch (e) { // Ignore the exception and show the default error message instead. } if (!errorMessage) { errorMessage = gettext("We've encountered an error. Refresh your browser and then try again."); // eslint-disable-line max-len } showErrorMessage(errorMessage); saveOperation.reject(); }); return saveOperation.promise(); }, /** * Shows the notification messages before given element using the NotificationModel. * @param {string} message - Text message to show. * @param {object} $element - Message would be shown before this element. * @param {string} type - Type of message to show e.g. confirmation or error. */ showMessage: function(message, $element, type) { var model = new NotificationModel({type: type || 'confirmation', title: message}); this.removeNotification(); this.notification = new NotificationView({ model: model }); $element.before(this.notification.$el); this.notification.render(); }, /** *Removes the notification messages. */ removeNotification: function() { if (this.notification) { this.notification.remove(); } } }); return DividedDiscussionConfigurationView; }); }).call(this, define || RequireJS.define);