diff --git a/cms/templates/textbooks.html b/cms/templates/textbooks.html index e684a54195..8f02e0ddf4 100644 --- a/cms/templates/textbooks.html +++ b/cms/templates/textbooks.html @@ -33,6 +33,9 @@ CMS.Models.Textbook = Backbone.Model.extend({ initialize: function() { this.chapters = new CMS.Collections.ChapterSet; this.chapters.add([{}]); + }, + isEmpty: function() { + return !this.get('name'); } }) CMS.Views.TextbookShow = Backbone.View.extend({ @@ -42,6 +45,7 @@ CMS.Views.TextbookShow = Backbone.View.extend({ }, events: { "click .edit": "editTextbook", + "click .delete": "removeSelf" }, render: function() { var attrs = $.extend({}, this.model.attributes); @@ -52,68 +56,10 @@ CMS.Views.TextbookShow = Backbone.View.extend({ editTextbook: function(e) { if(e && e.preventDefault) { e.preventDefault(); } this.model.collection.trigger("editOne", this.model); - } -}) -CMS.Collections.TextbookSet = Backbone.Collection.extend({ - model: CMS.Models.Textbook, - initialize: function() { - this.listenTo(this, "editOne", this.editOne); }, - editOne: function(textbook) { - // the old TextbookEdit view is listening for the editOne event, and - // will remove itself when the event is fired, so this method doesnt - // need to worry about it. - $(".inner-wrapper").append( - new CMS.Views.TextbookEdit({model: textbook}).render().el - ); - } -}) -CMS.Views.ListTextbooks = Backbone.View.extend({ - initialize: function() { - this.emptyTemplate = _.template($("#no-textbooks-tpl").text()); - this.listenTo(this.collection, 'all', this.render); - }, - tagName: "ul", - className: "textbooks", - render: function() { - if(this.collection.length === 0) { - this.$el.html(this.emptyTemplate()); - } else { - var $el = this.$el; - $el.empty(); - this.collection.each(function(textbook) { - $el.append( - new CMS.Views.TextbookShow({model: textbook}).render().el - ); - }) - } - return this; - }, - events: { - "click .new-button": "addOne" - }, - addOne: function(e) { + removeSelf: function(e) { if(e && e.preventDefault) { e.preventDefault(); } - var m = new this.collection.model; - this.collection.add(m); - this.collection.trigger("editOne", m); - } -}) -CMS.Models.Chapter = Backbone.Model.extend({ - defaults: function() { - return { - name: "", - asset_path: "", - order: this.collection ? this.collection.nextOrder() : 1 - } - } -}) -CMS.Collections.ChapterSet = Backbone.Collection.extend({ - model: CMS.Models.Chapter, - comparator: "order", - nextOrder: function() { - if(!this.length) return 1; - return this.last().get('order') + 1; + this.model.collection.remove(this.model); } }) CMS.Views.TextbookEdit = Backbone.View.extend({ @@ -136,7 +82,7 @@ CMS.Views.TextbookEdit = Backbone.View.extend({ return this; }, events: { - "submit": "saveAndRemove", + "submit": "saveAndClose", "click .action-cancel": "cancel", "click .action-add-chapter": "createChapter" }, @@ -166,16 +112,91 @@ CMS.Views.TextbookEdit = Backbone.View.extend({ }); return this; }, - saveAndRemove: function(e) { + saveAndClose: function(e) { if(e && e.preventDefault) { e.preventDefault(); } - return this.save().remove(); + return this.save().close(); }, cancel: function(e) { if(e && e.preventDefault) { e.preventDefault(); } + return this.close(); + }, + close: function() { + var textbooks = this.model.collection; + delete textbooks.editing; this.remove(); + // if the textbook has no content, remove it from the collection + var chapterIsEmpty = function(chapter) { return chapter.isEmpty(); } + if(this.model.isEmpty() && this.model.chapters.every(chapterIsEmpty)) { + textbooks.remove(this.model); + } + textbooks.trigger('render'); return this; } - +}) +CMS.Collections.TextbookSet = Backbone.Collection.extend({ + model: CMS.Models.Textbook, + initialize: function() { + this.listenTo(this, "editOne", this.editOne); + }, + editOne: function(textbook) { + this.editing = textbook; + } +}) +CMS.Views.ListTextbooks = Backbone.View.extend({ + initialize: function() { + this.emptyTemplate = _.template($("#no-textbooks-tpl").text()); + this.listenTo(this.collection, 'all', this.render); + }, + tagName: "ul", + className: "textbooks", + render: function() { + var textbooks = this.collection; + if(textbooks.length === 0) { + this.$el.html(this.emptyTemplate()); + } else { + var $el = this.$el; + $el.empty(); + textbooks.each(function(textbook) { + var view; + if (textbook === textbooks.editing) { + view = new CMS.Views.TextbookEdit({model: textbook}); + } else { + view = new CMS.Views.TextbookShow({model: textbook}); + } + $el.append(view.render().el); + }) + } + return this; + }, + events: { + "click .new-button": "addOne" + }, + addOne: function(e) { + if(e && e.preventDefault) { e.preventDefault(); } + var m = new this.collection.model; + this.collection.add(m); + this.collection.trigger("editOne", m); + } +}) +CMS.Models.Chapter = Backbone.Model.extend({ + defaults: function() { + return { + name: "", + asset_path: "", + order: this.collection ? this.collection.nextOrder() : 1 + } + }, + isEmpty: function() { + return !this.get('name') && !this.get('asset_path'); + } +}) +CMS.Collections.ChapterSet = Backbone.Collection.extend({ + model: CMS.Models.Chapter, + comparator: "order", + nextOrder: function() { + if(!this.length) return 1; + return this.last().get('order') + 1; + } }) CMS.Views.ChapterEdit = Backbone.View.extend({ initialize: function() {