diff --git a/cms/static/coffee/src/views/tabs.coffee b/cms/static/coffee/src/views/tabs.coffee deleted file mode 100644 index 9d00bd425ad38fa779726e8ab4aed319131ce03c..0000000000000000000000000000000000000000 --- a/cms/static/coffee/src/views/tabs.coffee +++ /dev/null @@ -1,133 +0,0 @@ -define ["underscore", "jquery", "jquery.ui", "backbone", "common/js/components/views/feedback_prompt", - "common/js/components/views/feedback_notification", "coffee/src/views/module_edit", "js/models/module_info", "js/utils/module"], -(_, $, ui, Backbone, PromptView, NotificationView, ModuleEditView, ModuleModel, ModuleUtils) -> - class TabsEdit extends Backbone.View - - initialize: (options) => - @$('.component').each((idx, element) => - model = new ModuleModel({ - id: $(element).data('locator') - }) - - new ModuleEditView( - el: element, - onDelete: @deleteTab, - model: model - ) - ) - @options = _.extend({}, options) - @options.mast.find('.new-tab').on('click', @addNewTab) - $('.add-pages .new-tab').on('click', @addNewTab) - $('.toggle-checkbox').on('click', @toggleVisibilityOfTab) - @$('.course-nav-list').sortable( - handle: '.drag-handle' - update: @tabMoved - helper: 'clone' - opacity: '0.5' - placeholder: 'component-placeholder' - forcePlaceholderSize: true - axis: 'y' - items: '> .is-movable' - ) - - toggleVisibilityOfTab: (event, ui) => - checkbox_element = event.target - tab_element = $(checkbox_element).parents(".course-tab")[0] - - saving = new NotificationView.Mini({title: gettext("Saving")}) - saving.show() - - $.ajax({ - type:'POST', - url: @model.url(), - data: JSON.stringify({ - tab_id_locator : { - tab_id: $(tab_element).data('tab-id'), - tab_locator: $(tab_element).data('locator') - }, - is_hidden : $(checkbox_element).is(':checked') - }), - contentType: 'application/json' - }).success(=> saving.hide()) - - tabMoved: (event, ui) => - tabs = [] - @$('.course-tab').each((idx, element) => - tabs.push( - { - tab_id: $(element).data('tab-id'), - tab_locator: $(element).data('locator') - } - ) - ) - - analytics.track "Reordered Pages", - course: course_location_analytics - - saving = new NotificationView.Mini({title: gettext("Saving")}) - saving.show() - - $.ajax({ - type:'POST', - url: @model.url(), - data: JSON.stringify({ - tabs : tabs - }), - contentType: 'application/json' - }).success(=> saving.hide()) - - addNewTab: (event) => - event.preventDefault() - - editor = new ModuleEditView( - onDelete: @deleteTab - model: new ModuleModel() - ) - - $('.new-component-item').before(editor.$el) - editor.$el.addClass('course-tab is-movable') - editor.$el.addClass('new') - setTimeout(=> - editor.$el.removeClass('new') - , 1000) - $('html, body').animate {scrollTop: $('.new-component-item').offset().top}, 500 - - - editor.createItem( - @model.get('id'), - {category: 'static_tab'} - ) - - analytics.track "Added Page", - course: course_location_analytics - - deleteTab: (event) => - confirm = new PromptView.Warning - title: gettext('Delete Page Confirmation') - message: gettext('Are you sure you want to delete this page? This action cannot be undone.') - actions: - primary: - text: gettext("OK") - click: (view) -> - view.hide() - $component = $(event.currentTarget).parents('.component') - - analytics.track "Deleted Page", - course: course_location_analytics - id: $component.data('locator') - deleting = new NotificationView.Mini - title: gettext('Deleting') - deleting.show() - $.ajax({ - type: 'DELETE', - url: ModuleUtils.getUpdateUrl($component.data('locator')) - }).success(=> - $component.remove() - deleting.hide() - ) - secondary: [ - text: gettext('Cancel') - click: (view) -> - view.hide() - ] - confirm.show() diff --git a/cms/static/js/factories/edit_tabs.js b/cms/static/js/factories/edit_tabs.js index 34ad04d12a81d51a3b1b86a01ccfb9c79664bae6..71ba0f42b6449ce95f0a54a268a734f36f319560 100644 --- a/cms/static/js/factories/edit_tabs.js +++ b/cms/static/js/factories/edit_tabs.js @@ -1,5 +1,5 @@ define([ - 'js/models/explicit_url', 'coffee/src/views/tabs', 'xmodule', 'coffee/src/main', 'xblock/cms.runtime.v1' + 'js/models/explicit_url', 'js/views/tabs', 'xmodule', 'coffee/src/main', 'xblock/cms.runtime.v1' ], function (TabsModel, TabsEditView, xmoduleLoader) { 'use strict'; return function (courseLocation, explicitUrl) { diff --git a/cms/static/js/views/tabs.js b/cms/static/js/views/tabs.js new file mode 100644 index 0000000000000000000000000000000000000000..9f83edeb19c95ce3014836a7148e153d6ea6b9a8 --- /dev/null +++ b/cms/static/js/views/tabs.js @@ -0,0 +1,203 @@ +(function(analytics, course_location_analytics) { + 'use strict'; + + var __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { + var key; + for (key in parent) { + if (__hasProp.call(parent, key)) { + child[key] = parent[key]; + } + } + function Ctor() { + this.constructor = child; + } + Ctor.prototype = parent.prototype; + child.prototype = new Ctor(); + child.__super__ = parent.prototype; + return child; + }; + + define(['underscore', 'jquery', 'jquery.ui', 'backbone', 'common/js/components/views/feedback_prompt', + 'common/js/components/views/feedback_notification', 'coffee/src/views/module_edit', + 'js/models/module_info', 'js/utils/module'], + function(_, $, ui, Backbone, PromptView, NotificationView, ModuleEditView, ModuleModel, ModuleUtils) { + var TabsEdit; + TabsEdit = (function(_super) { + + __extends(TabsEdit, _super); + + function TabsEdit() { + var self = this; + this.deleteTab = function() { + return TabsEdit.prototype.deleteTab.apply(self, arguments); + }; + this.addNewTab = function() { + return TabsEdit.prototype.addNewTab.apply(self, arguments); + }; + this.tabMoved = function() { + return TabsEdit.prototype.tabMoved.apply(self, arguments); + }; + this.toggleVisibilityOfTab = function() { + return TabsEdit.prototype.toggleVisibilityOfTab.apply(self, arguments); + }; + this.initialize = function() { + return TabsEdit.prototype.initialize.apply(self, arguments); + }; + return TabsEdit.__super__.constructor.apply(this, arguments); + } + + TabsEdit.prototype.initialize = function(options) { + var self = this; + this.$('.component').each(function(idx, element) { + var model; + model = new ModuleModel({ + id: $(element).data('locator') + }); + return new ModuleEditView({ + el: element, + onDelete: self.deleteTab, + model: model + }); + }); + this.options = _.extend({}, options); + this.options.mast.find('.new-tab').on('click', this.addNewTab); + $('.add-pages .new-tab').on('click', this.addNewTab); + $('.toggle-checkbox').on('click', this.toggleVisibilityOfTab); + return this.$('.course-nav-list').sortable({ + handle: '.drag-handle', + update: this.tabMoved, + helper: 'clone', + opacity: '0.5', + placeholder: 'component-placeholder', + forcePlaceholderSize: true, + axis: 'y', + items: '> .is-movable' + }); + }; + + TabsEdit.prototype.toggleVisibilityOfTab = function(event) { + var checkbox_element, saving, tab_element; + checkbox_element = event.target; + tab_element = $(checkbox_element).parents('.course-tab')[0]; + saving = new NotificationView.Mini({ + title: gettext('Saving') + }); + saving.show(); + return $.ajax({ + type: 'POST', + url: this.model.url(), + data: JSON.stringify({ + tab_id_locator: { + tab_id: $(tab_element).data('tab-id'), + tab_locator: $(tab_element).data('locator') + }, + is_hidden: $(checkbox_element).is(':checked') + }), + contentType: 'application/json' + }).success(function() { + return saving.hide(); + }); + }; + + TabsEdit.prototype.tabMoved = function() { + var saving, tabs; + tabs = []; + this.$('.course-tab').each(function(idx, element) { + return tabs.push({ + tab_id: $(element).data('tab-id'), + tab_locator: $(element).data('locator') + }); + }); + analytics.track('Reordered Pages', { + course: course_location_analytics + }); + saving = new NotificationView.Mini({ + title: gettext('Saving') + }); + saving.show(); + return $.ajax({ + type: 'POST', + url: this.model.url(), + data: JSON.stringify({ + tabs: tabs + }), + contentType: 'application/json' + }).success(function() { + return saving.hide(); + }); + }; + + TabsEdit.prototype.addNewTab = function(event) { + var editor; + event.preventDefault(); + editor = new ModuleEditView({ + onDelete: this.deleteTab, + model: new ModuleModel() + }); + $('.new-component-item').before(editor.$el); + editor.$el.addClass('course-tab is-movable'); + editor.$el.addClass('new'); + setTimeout(function() { + return editor.$el.removeClass('new'); + }, 1000); + $('html, body').animate({ + scrollTop: $('.new-component-item').offset().top + }, 500); + editor.createItem(this.model.get('id'), { + category: 'static_tab' + }); + return analytics.track('Added Page', { + course: course_location_analytics + }); + }; + + TabsEdit.prototype.deleteTab = function(event) { + var confirm; + confirm = new PromptView.Warning({ + title: gettext('Delete Page Confirmation'), + message: gettext('Are you sure you want to delete this page? This action cannot be undone.'), + actions: { + primary: { + text: gettext('OK'), + click: function(view) { + var $component, deleting; + view.hide(); + $component = $(event.currentTarget).parents('.component'); + analytics.track('Deleted Page', { + course: course_location_analytics, + id: $component.data('locator') + }); + deleting = new NotificationView.Mini({ + title: gettext('Deleting') + }); + deleting.show(); + return $.ajax({ + type: 'DELETE', + url: ModuleUtils.getUpdateUrl($component.data('locator')) + }).success(function() { + $component.remove(); + return deleting.hide(); + }); + } + }, + secondary: [ + { + text: gettext('Cancel'), + click: function(view) { + return view.hide(); + } + } + ] + } + }); + return confirm.show(); + }; + + return TabsEdit; + + })(Backbone.View); + return TabsEdit; + }); + +}).call(this, analytics, course_location_analytics); //jshint ignore:line diff --git a/common/djangoapps/terrain/ui_helpers.py b/common/djangoapps/terrain/ui_helpers.py index 749a68e1224a274ec39b18b9c03ac7d5e0312966..905b84f09670a0ea58365867a3354ec357991efb 100644 --- a/common/djangoapps/terrain/ui_helpers.py +++ b/common/djangoapps/terrain/ui_helpers.py @@ -59,7 +59,7 @@ REQUIREJS_WAIT = { # Pages re.compile(r'^Pages \|'): [ - 'js/models/explicit_url', 'coffee/src/views/tabs', + 'js/models/explicit_url', 'js/views/tabs', 'xmodule', 'coffee/src/main', 'xblock/cms.runtime.v1' ], }