From 435fd05ef46e9dffdebd55cb033a71401b94b5f7 Mon Sep 17 00:00:00 2001 From: Arthur Barrett Date: Mon, 4 Feb 2013 18:25:09 -0500 Subject: [PATCH] Refactored the coffeescript behavior so it is a bit more testable. --- .../xmodule/css/annotatable/display.scss | 4 + .../xmodule/js/src/annotatable/display.coffee | 85 ++++++++++++++----- lms/templates/annotatable.html | 6 +- 3 files changed, 70 insertions(+), 25 deletions(-) diff --git a/common/lib/xmodule/xmodule/css/annotatable/display.scss b/common/lib/xmodule/xmodule/css/annotatable/display.scss index 9bfa031bba..3c5437dac7 100644 --- a/common/lib/xmodule/xmodule/css/annotatable/display.scss +++ b/common/lib/xmodule/xmodule/css/annotatable/display.scss @@ -60,4 +60,8 @@ span.annotatable { right: 8px; margin-top: 4px; } + + &.opaque { + opacity: 0.4; + } } diff --git a/common/lib/xmodule/xmodule/js/src/annotatable/display.coffee b/common/lib/xmodule/xmodule/js/src/annotatable/display.coffee index 1c750fba7d..31d213a613 100644 --- a/common/lib/xmodule/xmodule/js/src/annotatable/display.coffee +++ b/common/lib/xmodule/xmodule/js/src/annotatable/display.coffee @@ -1,29 +1,72 @@ class @Annotatable @_debug: true + + wrapperSelector: '.annotatable-wrapper' + spanSelector: 'span.annotatable[data-span-id]' + discussionSelector: '.annotatable-discussion[data-discussion-id]' + constructor: (el) -> console.log 'loaded Annotatable' if @_debug @el = el - @spandata = $('.annotatable-wrapper', @el).data "spans" - @initSpans() + @init() - initSpans: () -> - selector = 'span.annotatable[data-span-id]' - $(@el).find(selector).on 'click', (e) => - @onClickSpan.call this, e + init: () -> + @loadSpanData() + @initEvents() - onClickSpan: (e) -> - span_id = e.target.getAttribute('data-span-id') - discussion_id = @spandata[span_id] - selector = '.annotatable-discussion[data-discussion-id="'+discussion_id+'"]'; - $discussion = $(selector, @el) - padding = 20 - top = $discussion.offset().top - padding - highlighted = false - complete = () -> - if !highlighted - $discussion.effect('highlight', {}, 1000) - highlighted = true + initEvents: () -> + $(@wrapperSelector, @el).delegate(@spanSelector, { + 'click': @_bind @onSpanEvent @onClickSpan + 'mouseenter': @_bind @onSpanEvent @onEnterSpan + 'mouseleave': @_bind @onSpanEvent @onLeaveSpan + }) - $('html, body').animate({ - scrollTop: top, - }, 1000, 'swing', complete) + loadSpanData: () -> + @spandata = $(@wrapperSelector, @el).data('spans') + + getDiscussionId: (span_id) -> + @spandata[span_id] + + getDiscussionEl: (discussion_id) -> + $(@discussionSelector, @el).filter('[data-discussion-id="'+discussion_id+'"]') + + onSpanEvent: (fn) -> + (e) => + span_id = e.target.getAttribute('data-span-id') + discussion_id = @getDiscussionId(span_id) + span = { + id: span_id, + el: e.target + } + discussion = { + id: discussion_id, + el: @getDiscussionEl(discussion_id) + } + fn.call this, span, discussion + + onClickSpan: (span, discussion) -> + @scrollToDiscussion(discussion.el) + + onEnterSpan: (span, discussion) -> + $(@discussionSelector, @el).not(discussion.el).toggleClass('opaque', true) + + onLeaveSpan: (span, discussion) -> + $(@discussionSelector, @el).not(discussion.el).toggleClass('opaque', false) + + scrollToDiscussion: (el) -> + complete = @makeHighlighter(el) + top = el.offset().top - 20 # with some padding + + $('html, body').animate({ scrollTop: top }, 750, 'swing', complete) + + makeHighlighter: (el) -> + return @_once -> el.effect('highlight', {}, 750) + + _once: (fn) -> + done = false + return => + fn.call this unless done + done = true + + _bind: (fn) -> + return => fn.apply(this, arguments) diff --git a/lms/templates/annotatable.html b/lms/templates/annotatable.html index c88a7eebb6..fb0b36d9ee 100644 --- a/lms/templates/annotatable.html +++ b/lms/templates/annotatable.html @@ -1,4 +1,4 @@ -
+
@@ -14,9 +14,7 @@