Commit 65ab3c05 by Prem Sichanugrist

Rewrite Tab module, refactor Sequence module

parent 7d8fcecf
...@@ -52,13 +52,12 @@ class Module(XModule): ...@@ -52,13 +52,12 @@ class Module(XModule):
child_classes = [set([i.tag for i in e.iter()]) for e in self.xmltree] child_classes = [set([i.tag for i in e.iter()]) for e in self.xmltree]
titles = ["\n".join([i.get("name").strip() for i in e.iter() if i.get("name") != None]) \ titles = ["\n".join([i.get("name").strip() for i in e.iter() if i.get("name") != None]) \
for e in self.xmltree] for e in self.xmltree]
self.contents = [j(self.render_function(e)) \ self.contents = [j(self.render_function(e)) for e in self.xmltree]
for e in self.xmltree]
for i in range(len(self.contents)): for i in range(len(self.contents)):
self.contents[i]['title'] = titles[i] self.contents[i]['title'] = titles[i]
for (content, element_class) in zip(self.contents, child_classes): for (content, element_class) in zip(self.contents, child_classes):
new_class = 'other' new_class = 'other'
...@@ -83,7 +82,6 @@ class Module(XModule): ...@@ -83,7 +82,6 @@ class Module(XModule):
if self.xmltree.tag in ['sequential', 'videosequence']: if self.xmltree.tag in ['sequential', 'videosequence']:
self.content=render_to_string('seq_module.html',params) self.content=render_to_string('seq_module.html',params)
if self.xmltree.tag == 'tab': if self.xmltree.tag == 'tab':
params['id'] = 'tab'
self.content=render_to_string('tab_module.html',params) self.content=render_to_string('tab_module.html',params)
self.rendered = True self.rendered = True
......
...@@ -23,11 +23,15 @@ describe 'Courseware', -> ...@@ -23,11 +23,15 @@ describe 'Courseware', ->
describe 'bind', -> describe 'bind', ->
beforeEach -> beforeEach ->
@courseware = new Courseware @courseware = new Courseware
setFixtures """<div id="seq_content"></div>""" setFixtures """
<div class="course-content">
<div class="sequence"></div>
</div>
"""
it 'binds the sequential content change event', -> it 'binds the content change event', ->
@courseware.bind() @courseware.bind()
expect($('#seq_content')).toHandleWith 'contentChanged', @courseware.render expect($('.course-content .sequence')).toHandleWith 'contentChanged', @courseware.render
describe 'render', -> describe 'render', ->
beforeEach -> beforeEach ->
......
...@@ -26,11 +26,11 @@ ...@@ -26,11 +26,11 @@
describe('bind', function() { describe('bind', function() {
beforeEach(function() { beforeEach(function() {
this.courseware = new Courseware; this.courseware = new Courseware;
return setFixtures("<div id=\"seq_content\"></div>"); return setFixtures("<div class=\"course-content\">\n <div class=\"sequence\"></div>\n</div>");
}); });
return it('binds the sequential content change event', function() { return it('binds the content change event', function() {
this.courseware.bind(); this.courseware.bind();
return expect($('#seq_content')).toHandleWith('contentChanged', this.courseware.render); return expect($('.course-content .sequence')).toHandleWith('contentChanged', this.courseware.render);
}); });
}); });
return describe('render', function() { return describe('render', function() {
......
...@@ -11,8 +11,8 @@ class @Courseware ...@@ -11,8 +11,8 @@ class @Courseware
new Courseware new Courseware
bind: -> bind: ->
if $('#seq_content').length $('.course-content .sequence, .course-content .tab')
$('#seq_content').bind 'contentChanged', @render .bind 'contentChanged', @render
render: -> render: ->
$('.course-content .video').each -> $('.course-content .video').each ->
......
class window.Sequence class @Sequence
constructor: (@id, @elements, @tag, position) -> constructor: (@id, @elements, @tag, position) ->
@element = $("#sequence_#{@id}")
@buildNavigation() @buildNavigation()
@bind() @bind()
@render position @render position
$: (selector) ->
$(selector, @element)
bind: -> bind: ->
$('#sequence-list a').click @goto @element.bind 'contentChanged', @toggleArrows
$('#seq_content').change @toggleArrows @$('#sequence-list a').click @goto
buildNavigation: -> buildNavigation: ->
$.each @elements, (index, item) -> $.each @elements, (index, item) ->
link = $('<a>').attr class: "seq_#{item.type}_inactive", 'data-element': index + 1 link = $('<a>').attr class: "seq_#{item.type}_inactive", 'data-element': index + 1
title = $('<p>').html(item.title) title = $('<p>').html(item.title)
list_item = $('<li>').append(link.append(title)) list_item = $('<li>').append(link.append(title))
$('#sequence-list').append list_item @$('#sequence-list').append list_item
toggleArrows: => toggleArrows: =>
$('.sequence-nav-buttons a').unbind('click') @$('.sequence-nav-buttons a').unbind('click')
if @position == 1 if @position == 1
$('.sequence-nav-buttons .prev a').addClass('disabled') @$('.sequence-nav-buttons .prev a').addClass('disabled')
else else
$('.sequence-nav-buttons .prev a').removeClass('disabled').click(@previous) @$('.sequence-nav-buttons .prev a').removeClass('disabled').click(@previous)
if @position == @elements.length if @position == @elements.length
$('.sequence-nav-buttons .next a').addClass('disabled') @$('.sequence-nav-buttons .next a').addClass('disabled')
else else
$('.sequence-nav-buttons .next a').removeClass('disabled').click(@next) @$('.sequence-nav-buttons .next a').removeClass('disabled').click(@next)
render: (new_position) -> render: (new_position) ->
if @position != undefined if @position != undefined
...@@ -35,11 +39,11 @@ class window.Sequence ...@@ -35,11 +39,11 @@ class window.Sequence
if @position != new_position if @position != new_position
@mark_active new_position @mark_active new_position
$('#seq_content').html eval(@elements[new_position - 1].content) @$('#seq_content').html eval(@elements[new_position - 1].content)
MathJax.Hub.Queue(["Typeset",MathJax.Hub]) MathJax.Hub.Queue(["Typeset",MathJax.Hub])
@position = new_position @position = new_position
$('#seq_content').trigger 'contentChanged' @element.trigger 'contentChanged'
goto: (event) => goto: (event) =>
event.preventDefault() event.preventDefault()
...@@ -60,7 +64,7 @@ class window.Sequence ...@@ -60,7 +64,7 @@ class window.Sequence
@render new_position @render new_position
link_for: (position) -> link_for: (position) ->
$("#sequence-list a[data-element=#{position}]") @$("#sequence-list a[data-element=#{position}]")
mark_visited: (position) -> mark_visited: (position) ->
@link_for(position).attr class: "seq_#{@elements[position - 1].type}_visited" @link_for(position).attr class: "seq_#{@elements[position - 1].type}_visited"
......
class @Tab
constructor: (@id, @items) ->
@element = $("#tab_#{id}")
@render()
$: (selector) ->
$(selector, @element)
render: ->
$.each @items, (index, item) =>
tab = $('<a>').attr(href: "##{@tabId(index)}").html(item.title)
@$('.navigation').append($('<li>').append(tab))
@element.append($('<section>').attr(id: @tabId(index)))
@element.tabs
show: @onShow
onShow: (element, ui) =>
@$('section.ui-tabs-hide').html('')
@$("##{@tabId(ui.index)}").html(eval(@items[ui.index]['content']))
@element.trigger 'contentChanged'
tabId: (index) ->
"tab-#{@id}-#{index}"
<div id="tabs"> <div id="tab_${id}" class="tab">
<ul> <ul class="navigation"></ul>
% for t in items:
<li> <a href="#tabs-${items.index(t)}">${t[0]}</a>
% endfor
</ul>
% for t in items:
<div id="tabs-${items.index(t)}">
</div>
% endfor
</div> </div>
<%block name="js_extra">
<script type="text/javascript">
$(function(){
new Tab('${id}', ${items});
});
</script>
</%block>
// IMPORTANT TODO: Namespace
var ${ id }contents=["",
%for t in items:
${t[1]['content']} ,
%endfor
""
];
var ${ id }init_functions=["",
%for t in items:
function(){ ${t[1]['init_js']} },
%endfor
""];
var ${ id }destroy_functions=["",
%for t in items:
function(){ ${t[1]['destroy_js']} },
%endfor
""];
var ${ id }loc = -1;
function ${ id }goto(i) {
if (${ id }loc!=-1)
${ id }destroy_functions[ ${ id }loc ]();
$('#tabs-'+(i-1)).html(${ id }contents[i]);
${ id }init_functions[i]()
$('#tt_'+${ id }loc).attr("style", "background-color:grey");
${ id }loc=i;
$('#tt_'+i).attr("style", "background-color:red");
MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
}
$("#tabs").tabs({select:function(event, ui){
//global=ui;
return true;
},
show:function(event,ui){
//global=ui;
${ id }goto(ui.index+1);
return true;
},
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment