82 lines
3.6 KiB
JavaScript
82 lines
3.6 KiB
JavaScript
/**
|
|
* This is a simple component that renders add buttons for all available XBlock template types.
|
|
*/
|
|
define(['jquery', 'underscore', 'gettext', 'js/views/baseview', 'common/js/components/utils/view_utils',
|
|
'js/views/components/add_xblock_button', 'js/views/components/add_xblock_menu',
|
|
'edx-ui-toolkit/js/utils/html-utils'],
|
|
function($, _, gettext, BaseView, ViewUtils, AddXBlockButton, AddXBlockMenu, HtmlUtils) {
|
|
'use strict';
|
|
var AddXBlockComponent = BaseView.extend({
|
|
events: {
|
|
'click .new-component .new-component-type .multiple-templates': 'showComponentTemplates',
|
|
'click .new-component .new-component-type .single-template': 'createNewComponent',
|
|
'click .new-component .cancel-button': 'closeNewComponent',
|
|
'click .new-component-templates .new-component-template .button-component': 'createNewComponent',
|
|
'click .new-component-templates .cancel-button': 'closeNewComponent'
|
|
},
|
|
|
|
initialize: function(options) {
|
|
BaseView.prototype.initialize.call(this, options);
|
|
this.template = this.loadTemplate('add-xblock-component');
|
|
},
|
|
|
|
render: function() {
|
|
var that;
|
|
if (!this.$el.html()) {
|
|
that = this;
|
|
this.$el.html(HtmlUtils.HTML(this.template({})).toString());
|
|
this.collection.each(
|
|
function(componentModel) {
|
|
var view, menu;
|
|
|
|
view = new AddXBlockButton({model: componentModel});
|
|
that.$el.find('.new-component-type').append(view.render().el);
|
|
|
|
menu = new AddXBlockMenu({model: componentModel});
|
|
that.$el.append(menu.render().el);
|
|
}
|
|
);
|
|
}
|
|
},
|
|
|
|
showComponentTemplates: function(event) {
|
|
var type;
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
type = $(event.currentTarget).data('type');
|
|
this.$('.new-component').slideUp(250);
|
|
this.$('.new-component-' + type).slideDown(250);
|
|
this.$('.new-component-' + type + ' div').focus();
|
|
},
|
|
|
|
closeNewComponent: function(event) {
|
|
var type;
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
type = $(event.currentTarget).data('type');
|
|
this.$('.new-component').slideDown(250);
|
|
this.$('.new-component-templates').slideUp(250);
|
|
this.$('ul.new-component-type li button[data-type=' + type + ']').focus();
|
|
},
|
|
|
|
createNewComponent: function(event) {
|
|
var self = this,
|
|
$element = $(event.currentTarget),
|
|
saveData = $element.data(),
|
|
oldOffset = ViewUtils.getScrollOffset(this.$el);
|
|
event.preventDefault();
|
|
this.closeNewComponent(event);
|
|
ViewUtils.runOperationShowingMessage(
|
|
gettext('Adding'),
|
|
_.bind(this.options.createComponent, this, saveData, $element)
|
|
).always(function() {
|
|
// Restore the scroll position of the buttons so that the new
|
|
// component appears above them.
|
|
ViewUtils.setScrollOffset(self.$el, oldOffset);
|
|
});
|
|
}
|
|
});
|
|
|
|
return AddXBlockComponent;
|
|
}); // end define();
|