CMS.Views.SectionShow = Backbone.View.extend({ template: _.template('<span data-tooltip="<%= gettext("Edit this section\'s name") %>" class="section-name-span"><%= name %></span>'), render: function() { var attrs = { name: this.model.escape('name') }; this.$el.html(this.template(attrs)); this.delegateEvents(); return this; }, events: { "click": "switchToEditView" }, switchToEditView: function() { if(!this.editView) { this.editView = new CMS.Views.SectionEdit({ model: this.model, el: this.el, showView: this}); } this.undelegateEvents(); this.editView.render(); } }); CMS.Views.SectionEdit = Backbone.View.extend({ render: function() { var attrs = { name: this.model.escape('name') }; this.$el.html(this.template(attrs)); this.delegateEvents(); return this; }, initialize: function() { this.template = _.template($("#section-name-edit-tpl").text()); this.listenTo(this.model, "invalid", this.showInvalidMessage); this.render(); }, events: { "click .save-button": "saveName", "submit": "saveName", "click .cancel-button": "switchToShowView" }, saveName: function(e) { if (e) { e.preventDefault(); } var name = this.$("input[type=text]").val(); var that = this; this.model.save("name", name, { success: function() { analytics.track('Edited Section Name', { 'course': course_location_analytics, 'display_name': that.model.get('name'), 'id': that.model.get('id') }); that.switchToShowView(); } }); }, switchToShowView: function() { if(!this.showView) { this.showView = new CMS.Views.SectionShow({ model: this.model, el: this.el, editView: this}); } this.undelegateEvents(); this.stopListening(); this.showView.render(); }, showInvalidMessage: function(model, error, options) { model.set("name", model.previous("name")); var that = this; var prompt = new CMS.Views.Prompt.Error({ title: gettext("Your change could not be saved"), message: error, actions: { primary: { text: gettext("Return and resolve this issue"), click: function(view) { view.hide(); that.$("input[type=text]").focus(); } } } }); prompt.show(); } });