##// END OF EJS Templates
add locks to update everywhere by using options to pass this...
add locks to update everywhere by using options to pass this (and check for this)

File last commit:

r14570:4e85339b
r14570:4e85339b
Show More
widget_multicontainer.js
225 lines | 8.7 KiB | application/javascript | JavascriptLexer
/ IPython / html / static / notebook / js / widgets / widget_multicontainer.js
Jonathan Frederic
Added standard IPY JS header to widget JS files.
r14366 //----------------------------------------------------------------------------
// Copyright (C) 2013 The IPython Development Team
//
// Distributed under the terms of the BSD License. The full license is in
// the file COPYING, distributed as part of this software.
//----------------------------------------------------------------------------
//============================================================================
// MultiContainerWidget
//============================================================================
/**
* @module IPython
* @namespace IPython
**/
Jonathan Frederic
Updated require.js references
r14537 define(["notebook/js/widgets/widget"], function(widget_manager){
Jonathan Frederic
Added multicontainer widget
r14284 var MulticontainerModel = IPython.WidgetModel.extend({});
Jonathan Frederic
Changed require.js load calls to allow require.js to pass...
r14374 widget_manager.register_widget_model('MulticontainerWidgetModel', MulticontainerModel);
Jonathan Frederic
Added multicontainer widget
r14284
Jonathan Frederic
s/BaseWidgetView/WidgetView and s/WidgetView/DOMWidgetView
r14564 var AccordionView = IPython.DOMWidgetView.extend({
Jonathan Frederic
Added multicontainer widget
r14284
render: function(){
Jonathan Frederic
Make sure DOM element ids start with alphabetic characters, not numeric.
r14398 var guid = 'accordion' + IPython.utils.uuid();
Jonathan Frederic
Fixed backbone event handling for accordion view
r14455 this.$el
.attr('id', guid)
Jonathan Frederic
Added multicontainer widget
r14284 .addClass('accordion');
this.containers = [];
Jason Grout
Live updates for children automatically change container views....
r14503 this.update_children([], this.model.get('children'));
this.model.on('change:children', function(model, value, options) {
Jonathan Frederic
Added `update_children` pattern to remaining parent widgets
r14507 this.update_children(model.previous('children'), value);
}, this);
Jason Grout
Live updates for children automatically change container views....
r14503 },
update_children: function(old_list, new_list) {
_.each(this.containers, function(element, index, list) {
element.remove();
}, this);
this.containers = [];
this.update_child_views(old_list, new_list);
_.each(new_list, function(element, index, list) {
this.add_child_view(this.child_views[element]);
}, this)
Jonathan Frederic
Added multicontainer widget
r14284 },
Jason Grout
Live updates for children automatically change container views....
r14503
Jonathan Frederic
add locks to update everywhere by using options to pass this...
r14570 update: function(options) {
Jonathan Frederic
make JS update comment more descriptive (english)
r14568 // Update the contents of this view
//
// Called when the model is changed. The model may have been
// changed by another view or by a state update from the back-end.
Jonathan Frederic
add locks to update everywhere by using options to pass this...
r14570
if (options === undefined || options.updated_view != this) {
// Set tab titles
var titles = this.model.get('_titles');
for (var page_index in titles) {
var accordian = this.containers[page_index];
if (accordian !== undefined) {
accordian
.find('.accordion-heading')
.find('.accordion-toggle')
.html(titles[page_index]);
}
Jonathan Frederic
Added ability to title multicontainer pages before multicontainer display()
r14289 }
Jonathan Frederic
Added multicontainer widget
r14284
Jonathan Frederic
add locks to update everywhere by using options to pass this...
r14570 // Set selected page
var selected_index = this.model.get("selected_index");
if (0 <= selected_index && selected_index < this.containers.length) {
for (var index in this.containers) {
if (index==selected_index) {
this.containers[index].find('.accordion-body').collapse('show');
} else {
this.containers[index].find('.accordion-body').collapse('hide');
}
Jonathan Frederic
Added selected_index support to accordion view.
r14370 }
}
}
Jonathan Frederic
s/BaseWidgetView/WidgetView and s/WidgetView/DOMWidgetView
r14564 return IPython.DOMWidgetView.prototype.update.call(this);
Jonathan Frederic
Added multicontainer widget
r14284 },
Jason Grout
Change accordion to use a children attribute
r14489 add_child_view: function(view) {
Jonathan Frederic
Added multicontainer widget
r14284
var index = this.containers.length;
var uuid = IPython.utils.uuid();
var accordion_group = $('<div />')
.addClass('accordion-group')
.appendTo(this.$el);
var accordion_heading = $('<div />')
.addClass('accordion-heading')
.appendTo(accordion_group);
Jonathan Frederic
Added selected_index support to accordion view.
r14370 var that = this;
Jonathan Frederic
Added multicontainer widget
r14284 var accordion_toggle = $('<a />')
.addClass('accordion-toggle')
.attr('data-toggle', 'collapse')
.attr('data-parent', '#' + this.$el.attr('id'))
.attr('href', '#' + uuid)
Jonathan Frederic
Added selected_index support to accordion view.
r14370 .click(function(evt){
Jonathan Frederic
comment model.set, so we know that it triggers update on other views
r14569
// Calling model.set will trigger all of the other views of the
// model to update.
Jonathan Frederic
add locks to update everywhere by using options to pass this...
r14570 that.model.set("selected_index", index, {updated_view: this});
Jonathan Frederic
Moved touch logic out of model into view....
r14482 that.touch();
Jonathan Frederic
Added selected_index support to accordion view.
r14370 })
Jonathan Frederic
Added multicontainer widget
r14284 .html('Page ' + index)
.appendTo(accordion_heading);
var accordion_body = $('<div />', {id: uuid})
Jonathan Frederic
Added ability to set container page titles for widget multicontainer
r14288 .addClass('accordion-body collapse')
Jonathan Frederic
Added multicontainer widget
r14284 .appendTo(accordion_group);
var accordion_inner = $('<div />')
.addClass('accordion-inner')
.appendTo(accordion_body);
this.containers.push(accordion_group);
accordion_inner.append(view.$el);
Jonathan Frederic
Added selected_index support to accordion view.
r14370
Jonathan Frederic
Added ability to title multicontainer pages before multicontainer display()
r14289 this.update();
Jonathan Frederic
Added selected_index support to accordion view.
r14370
// Stupid workaround to close the bootstrap accordion tabs which
// open by default even though they don't have the `in` class
// attached to them. For some reason a delay is required.
// TODO: Better fix.
Jonathan Frederic
jslint /widgets
r14466 setTimeout(function(){ that.update(); }, 500);
Jonathan Frederic
Added multicontainer widget
r14284 },
});
Jonathan Frederic
Changed require.js load calls to allow require.js to pass...
r14374 widget_manager.register_widget_view('AccordionView', AccordionView);
Jonathan Frederic
Added TabView to multicontainer
r14290
Jonathan Frederic
s/BaseWidgetView/WidgetView and s/WidgetView/DOMWidgetView
r14564 var TabView = IPython.DOMWidgetView.extend({
Jonathan Frederic
Added TabView to multicontainer
r14290
Jonathan Frederic
Added `update_children` pattern to remaining parent widgets
r14507 initialize: function() {
this.containers = [];
Jonathan Frederic
s/BaseWidgetView/WidgetView and s/WidgetView/DOMWidgetView
r14564 IPython.DOMWidgetView.prototype.initialize.apply(this, arguments);
Jonathan Frederic
Added `update_children` pattern to remaining parent widgets
r14507 },
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486
Jonathan Frederic
Added TabView to multicontainer
r14290 render: function(){
Jonathan Frederic
Make sure DOM element ids start with alphabetic characters, not numeric.
r14398 var uuid = 'tabs'+IPython.utils.uuid();
Jonathan Frederic
Added selected_index property to TabView
r14307 var that = this;
Jonathan Frederic
Added TabView to multicontainer
r14290 this.$tabs = $('<div />', {id: uuid})
.addClass('nav')
.addClass('nav-tabs')
.appendTo(this.$el);
this.$tab_contents = $('<div />', {id: uuid + 'Content'})
.addClass('tab-content')
.appendTo(this.$el);
Jonathan Frederic
Added `update_children` pattern to remaining parent widgets
r14507 this.containers = [];
this.update_children([], this.model.get('children'));
this.model.on('change:children', function(model, value, options) {
this.update_children(model.previous('children'), value);
}, this);
},
update_children: function(old_list, new_list) {
_.each(this.containers, function(element, index, list) {
element.remove();
}, this);
this.containers = [];
this.update_child_views(old_list, new_list);
_.each(new_list, function(element, index, list) {
this.add_child_view(this.child_views[element]);
}, this)
Jonathan Frederic
Added TabView to multicontainer
r14290 },
Jonathan Frederic
Added selected_index support to accordion view.
r14370
Jonathan Frederic
add locks to update everywhere by using options to pass this...
r14570 update: function(options) {
Jonathan Frederic
make JS update comment more descriptive (english)
r14568 // Update the contents of this view
//
// Called when the model is changed. The model may have been
// changed by another view or by a state update from the back-end.
Jonathan Frederic
add locks to update everywhere by using options to pass this...
r14570 if (options === undefined || options.updated_view != this) {
// Set tab titles
var titles = this.model.get('_titles');
for (var page_index in titles) {
var tab_text = this.containers[page_index];
if (tab_text !== undefined) {
tab_text.html(titles[page_index]);
}
Jonathan Frederic
Added TabView to multicontainer
r14290 }
Jonathan Frederic
add locks to update everywhere by using options to pass this...
r14570 var selected_index = this.model.get('selected_index');
if (0 <= selected_index && selected_index < this.containers.length) {
this.select_page(selected_index);
}
Jonathan Frederic
Added selected_index property to TabView
r14307 }
Jonathan Frederic
s/BaseWidgetView/WidgetView and s/WidgetView/DOMWidgetView
r14564 return IPython.DOMWidgetView.prototype.update.call(this);
Jonathan Frederic
Added TabView to multicontainer
r14290 },
Jason Grout
Remove the automatic _children_attr and _children_lists_attr....
r14487 add_child_view: function(view) {
Jonathan Frederic
Added TabView to multicontainer
r14290 var index = this.containers.length;
var uuid = IPython.utils.uuid();
var that = this;
var tab = $('<li />')
.css('list-style-type', 'none')
.appendTo(this.$tabs);
var tab_text = $('<a />')
.attr('href', '#' + uuid)
.attr('data-toggle', 'tab')
.html('Page ' + index)
.appendTo(tab)
.click(function (e) {
Jonathan Frederic
comment model.set, so we know that it triggers update on other views
r14569
// Calling model.set will trigger all of the other views of the
// model to update.
Jonathan Frederic
add locks to update everywhere by using options to pass this...
r14570 that.model.set("selected_index", index, {updated_view: this});
Jonathan Frederic
Moved touch logic out of model into view....
r14482 that.touch();
Jonathan Frederic
Added selected_index property to TabView
r14307 that.select_page(index);
Jonathan Frederic
Added TabView to multicontainer
r14290 });
this.containers.push(tab_text);
var contents_div = $('<div />', {id: uuid})
.addClass('tab-pane')
.addClass('fade')
.append(view.$el)
.appendTo(this.$tab_contents);
},
Jonathan Frederic
Added selected_index property to TabView
r14307
select_page: function(index) {
this.$tabs.find('li')
.removeClass('active');
this.containers[index].tab('show');
},
Jonathan Frederic
Added TabView to multicontainer
r14290 });
Jonathan Frederic
Changed require.js load calls to allow require.js to pass...
r14374 widget_manager.register_widget_view('TabView', TabView);
Jonathan Frederic
Added TabView to multicontainer
r14290 });