##// END OF EJS Templates
Container assumes the children attribute is not None...
Container assumes the children attribute is not None Thanks to @SylvainCorlay for pointing this out.

File last commit:

r17216:08b8fbc9
r17266:a9dd34fc
Show More
widget_selectioncontainer.js
267 lines | 10.3 KiB | application/javascript | JavascriptLexer
/ IPython / html / static / widgets / js / widget_selectioncontainer.js
Jonathan Frederic
Almost done!...
r17198 // Copyright (c) IPython Development Team.
// Distributed under the terms of the Modified BSD License.
Jonathan Frederic
Added standard IPY JS header to widget JS files.
r14366
Jonathan Frederic
Almost done!...
r17198 define([
"widgets/js/widget",
Jonathan Frederic
Done with major changes,...
r17199 "base/js/utils",
Jonathan Frederic
Fix all the tests
r17216 "jquery",
"components/bootstrap/js/bootstrap.min",
], function(widget, utils, $){
Jonathan Frederic
Added standard IPY JS header to widget JS files.
r14366
Jonathan Frederic
Almost done!...
r17198 var AccordionView = widget.DOMWidgetView.extend({
Jonathan Frederic
Added multicontainer widget
r14284 render: function(){
Jonathan Frederic
Added PEP8 style comments to all of the JS code.
r14609 // Called when view is rendered.
Jonathan Frederic
Done with major changes,...
r17199 var guid = 'panel-group' + utils.uuid();
Jonathan Frederic
Fixed backbone event handling for accordion view
r14455 this.$el
.attr('id', guid)
Jonathan Frederic
Ran jdfreder/bootstrap2to3
r16913 .addClass('panel-group');
Jonathan Frederic
Added multicontainer widget
r14284 this.containers = [];
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 this.model_containers = {};
Jonathan Frederic
Fixed buggy behavior
r17173 this.update_children([], this.model.get('children'));
this.model.on('change:children', function(model, value, options) {
this.update_children(model.previous('children'), value);
Jonathan Frederic
Added `update_children` pattern to remaining parent widgets
r14507 }, this);
Jonathan Frederic
Fix broken accordion widget,...
r15950 this.model.on('change:selected_index', function(model, value, options) {
this.update_selected_index(model.previous('selected_index'), value, options);
}, this);
this.model.on('change:_titles', function(model, value, options) {
this.update_titles(value);
}, this);
Jonathan Frederic
Fixed bugs in displayed event triggering for containers
r16660 var that = this;
Jonathan Frederic
Move displayed event to view.
r17179 this.on('displayed', function() {
Jonathan Frederic
Add displayed property....
r15955 this.update_titles();
Jonathan Frederic
Fixed bugs in displayed event triggering for containers
r16660 // Trigger model displayed events for any models that are child to
// this model when this model is displayed.
that.is_displayed = true;
for (var property in that.child_views) {
if (that.child_views.hasOwnProperty(property)) {
Jonathan Frederic
Move displayed event to view.
r17179 that.child_views[property].trigger('displayed');
Jonathan Frederic
Fixed bugs in displayed event triggering for containers
r16660 }
}
Jonathan Frederic
Add displayed property....
r15955 }, this);
Jason Grout
Live updates for children automatically change container views....
r14503 },
Jonathan Frederic
Added multicontainer widget
r14284
Jonathan Frederic
Fix broken accordion widget,...
r15950 update_titles: function(titles) {
// Set tab titles
Jonathan Frederic
Add displayed property....
r15955 if (!titles) {
titles = this.model.get('_titles');
}
Jonathan Frederic
Fix broken accordion widget,...
r15950 var that = this;
_.each(titles, function(title, page_index) {
var accordian = that.containers[page_index];
if (accordian !== undefined) {
accordian
Jonathan Frederic
Ran jdfreder/bootstrap2to3
r16913 .find('.panel-heading')
Jonathan Frederic
Fix broken accordion widget,...
r15950 .find('.accordion-toggle')
.text(title);
}
});
},
update_selected_index: function(old_index, new_index, options) {
// Only update the selection if the selection wasn't triggered
// by the front-end. It must be triggered by the back-end.
if (options === undefined || options.updated_view != this) {
Jonathan Frederic
Ran jdfreder/bootstrap2to3
r16913 this.containers[old_index].find('.panel-collapse').collapse('hide');
Jonathan Frederic
Fix broken accordion widget,...
r15950 if (0 <= new_index && new_index < this.containers.length) {
Jonathan Frederic
Ran jdfreder/bootstrap2to3
r16913 this.containers[new_index].find('.panel-collapse').collapse('show');
Jonathan Frederic
Added selected_index support to accordion view.
r14370 }
}
Jonathan Frederic
Added multicontainer widget
r14284 },
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598
update_children: function(old_list, new_list) {
Jonathan Frederic
Added PEP8 style comments to all of the JS code.
r14609 // Called when the children list is modified.
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 this.do_diff(old_list,
new_list,
$.proxy(this.remove_child_model, this),
$.proxy(this.add_child_model, this));
},
Jonathan Frederic
Added multicontainer widget
r14284
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 remove_child_model: function(model) {
Jonathan Frederic
Added PEP8 style comments to all of the JS code.
r14609 // Called when a child is removed from children list.
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 var accordion_group = this.model_containers[model.id];
this.containers.splice(accordion_group.container_index, 1);
delete this.model_containers[model.id];
accordion_group.remove();
Jonathan Frederic
Review comments
r17178 this.pop_child_view(model);
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 },
Jonathan Frederic
Added multicontainer widget
r14284
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 add_child_model: function(model) {
Jonathan Frederic
Added PEP8 style comments to all of the JS code.
r14609 // Called when a child is added to children list.
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 var view = this.create_child_view(model);
Jonathan Frederic
Added multicontainer widget
r14284 var index = this.containers.length;
Jonathan Frederic
Done with major changes,...
r17199 var uuid = utils.uuid();
Jonathan Frederic
Added multicontainer widget
r14284 var accordion_group = $('<div />')
Jonathan Frederic
Ran jdfreder/bootstrap2to3
r16913 .addClass('panel panel-default')
Jonathan Frederic
Added multicontainer widget
r14284 .appendTo(this.$el);
var accordion_heading = $('<div />')
Jonathan Frederic
Ran jdfreder/bootstrap2to3
r16913 .addClass('panel-heading')
Jonathan Frederic
Added multicontainer widget
r14284 .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
Fix broken accordion widget,...
r15950 that.model.set("selected_index", index, {updated_view: that});
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
Replace .html with .text everywhere possible
r14663 .text('Page ' + index)
Jonathan Frederic
Added multicontainer widget
r14284 .appendTo(accordion_heading);
var accordion_body = $('<div />', {id: uuid})
Jonathan Frederic
Ran jdfreder/bootstrap2to3
r16913 .addClass('panel-collapse collapse')
Jonathan Frederic
Added multicontainer widget
r14284 .appendTo(accordion_group);
var accordion_inner = $('<div />')
Jonathan Frederic
Ran jdfreder/bootstrap2to3
r16913 .addClass('panel-body')
Jonathan Frederic
Added multicontainer widget
r14284 .appendTo(accordion_body);
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 var container_index = this.containers.push(accordion_group) - 1;
accordion_group.container_index = container_index;
this.model_containers[model.id] = accordion_group;
Jonathan Frederic
Added multicontainer widget
r14284 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
Add displayed property....
r15955 this.update_titles();
Jonathan Frederic
Fixed bugs in displayed event triggering for containers
r16660
// Trigger the displayed event if this model is displayed.
if (this.is_displayed) {
Jonathan Frederic
Move displayed event to view.
r17179 view.trigger('displayed');
Jonathan Frederic
Fixed bugs in displayed event triggering for containers
r16660 }
Jonathan Frederic
Added multicontainer widget
r14284 },
});
Jonathan Frederic
Added TabView to multicontainer
r14290
Jonathan Frederic
Added PEP8 style comments to all of the JS code.
r14609
Jonathan Frederic
Almost done!...
r17198 var TabView = widget.DOMWidgetView.extend({
Jonathan Frederic
Added `update_children` pattern to remaining parent widgets
r14507 initialize: function() {
Jonathan Frederic
Added PEP8 style comments to all of the JS code.
r14609 // Public constructor.
Jonathan Frederic
Added `update_children` pattern to remaining parent widgets
r14507 this.containers = [];
Jonathan Frederic
Many checks off the todo list, test fixes
r14583 TabView.__super__.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
Added PEP8 style comments to all of the JS code.
r14609 // Called when view is rendered.
Jonathan Frederic
Done with major changes,...
r17199 var uuid = 'tabs'+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 = [];
Jonathan Frederic
Fixed buggy behavior
r17173 this.update_children([], this.model.get('children'));
this.model.on('change:children', function(model, value, options) {
this.update_children(model.previous('children'), value);
Jonathan Frederic
Added `update_children` pattern to remaining parent widgets
r14507 }, this);
Jonathan Frederic
Fixed bugs in displayed event triggering for containers
r16660
// Trigger model displayed events for any models that are child to
// this model when this model is displayed.
Jonathan Frederic
Move displayed event to view.
r17179 this.on('displayed', function(){
Jonathan Frederic
Fixed bugs in displayed event triggering for containers
r16660 that.is_displayed = true;
for (var property in that.child_views) {
if (that.child_views.hasOwnProperty(property)) {
Jonathan Frederic
Move displayed event to view.
r17179 that.child_views[property].trigger('displayed');
Jonathan Frederic
Fixed bugs in displayed event triggering for containers
r16660 }
}
});
Jonathan Frederic
Added `update_children` pattern to remaining parent widgets
r14507 },
Jonathan Frederic
Added PEP8 style comments to all of the JS code.
r14609
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 update_children: function(old_list, new_list) {
Jonathan Frederic
Added PEP8 style comments to all of the JS code.
r14609 // Called when the children list is modified.
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 this.do_diff(old_list,
new_list,
$.proxy(this.remove_child_model, this),
$.proxy(this.add_child_model, this));
},
Jonathan Frederic
Added selected_index support to accordion view.
r14370
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 remove_child_model: function(model) {
Jonathan Frederic
Added PEP8 style comments to all of the JS code.
r14609 // Called when a child is removed from children list.
Jonathan Frederic
Review comments
r17178 var view = this.pop_child_view(model);
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 this.containers.splice(view.parent_tab.tab_text_index, 1);
view.parent_tab.remove();
view.parent_container.remove();
view.remove();
Jonathan Frederic
Added TabView to multicontainer
r14290 },
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 add_child_model: function(model) {
Jonathan Frederic
Added PEP8 style comments to all of the JS code.
r14609 // Called when a child is added to children list.
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 var view = this.create_child_view(model);
Jonathan Frederic
Added TabView to multicontainer
r14290 var index = this.containers.length;
Jonathan Frederic
Done with major changes,...
r17199 var uuid = utils.uuid();
Jonathan Frederic
Added TabView to multicontainer
r14290
var that = this;
var tab = $('<li />')
.css('list-style-type', 'none')
.appendTo(this.$tabs);
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 view.parent_tab = tab;
Jonathan Frederic
Added TabView to multicontainer
r14290 var tab_text = $('<a />')
.attr('href', '#' + uuid)
.attr('data-toggle', 'tab')
Jonathan Frederic
Replace .html with .text everywhere possible
r14663 .text('Page ' + index)
Jonathan Frederic
Added TabView to multicontainer
r14290 .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 });
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 tab.tab_text_index = this.containers.push(tab_text) - 1;
Jonathan Frederic
Added TabView to multicontainer
r14290
var contents_div = $('<div />', {id: uuid})
.addClass('tab-pane')
.addClass('fade')
.append(view.$el)
.appendTo(this.$tab_contents);
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 view.parent_container = contents_div;
Jonathan Frederic
Fixed bugs in displayed event triggering for containers
r16660
// Trigger the displayed event if this model is displayed.
if (this.is_displayed) {
Jonathan Frederic
Move displayed event to view.
r17179 view.trigger('displayed');
Jonathan Frederic
Fixed bugs in displayed event triggering for containers
r16660 }
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 },
update: function(options) {
// 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.
if (options === undefined || options.updated_view != this) {
// Set tab titles
var titles = this.model.get('_titles');
Jonathan Frederic
Fixed context errors and a couple of typos to get the tests working again
r14686 var that = this;
Jonathan Frederic
Removed for () loops where necessary. Replaced with _.each
r14664 _.each(titles, function(title, page_index) {
Jonathan Frederic
Fixed context errors and a couple of typos to get the tests working again
r14686 var tab_text = that.containers[page_index];
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598 if (tab_text !== undefined) {
Jonathan Frederic
Removed for () loops where necessary. Replaced with _.each
r14664 tab_text.text(title);
}
});
Jonathan Frederic
Got containers and mutlicontainers working! Yay
r14598
var selected_index = this.model.get('selected_index');
if (0 <= selected_index && selected_index < this.containers.length) {
this.select_page(selected_index);
}
}
return TabView.__super__.update.apply(this);
Jonathan Frederic
Added TabView to multicontainer
r14290 },
Jonathan Frederic
Added selected_index property to TabView
r14307
select_page: function(index) {
Jonathan Frederic
Added PEP8 style comments to all of the JS code.
r14609 // Select a page.
Jonathan Frederic
Added selected_index property to TabView
r14307 this.$tabs.find('li')
.removeClass('active');
this.containers[index].tab('show');
},
Jonathan Frederic
Added TabView to multicontainer
r14290 });
Jonathan Frederic
Almost done!...
r17198
return {
'AccordionView': AccordionView,
'TabView': TabView,
};
Jonathan Frederic
Added TabView to multicontainer
r14290 });