Commit 435fd05e by Arthur Barrett

Refactored the coffeescript behavior so it is a bit more testable.

parent 0ca71319
...@@ -60,4 +60,8 @@ span.annotatable { ...@@ -60,4 +60,8 @@ span.annotatable {
right: 8px; right: 8px;
margin-top: 4px; margin-top: 4px;
} }
&.opaque {
opacity: 0.4;
}
} }
class @Annotatable class @Annotatable
@_debug: true @_debug: true
wrapperSelector: '.annotatable-wrapper'
spanSelector: 'span.annotatable[data-span-id]'
discussionSelector: '.annotatable-discussion[data-discussion-id]'
constructor: (el) -> constructor: (el) ->
console.log 'loaded Annotatable' if @_debug console.log 'loaded Annotatable' if @_debug
@el = el @el = el
@spandata = $('.annotatable-wrapper', @el).data "spans" @init()
@initSpans()
init: () ->
initSpans: () -> @loadSpanData()
selector = 'span.annotatable[data-span-id]' @initEvents()
$(@el).find(selector).on 'click', (e) =>
@onClickSpan.call this, e initEvents: () ->
$(@wrapperSelector, @el).delegate(@spanSelector, {
onClickSpan: (e) -> 'click': @_bind @onSpanEvent @onClickSpan
span_id = e.target.getAttribute('data-span-id') 'mouseenter': @_bind @onSpanEvent @onEnterSpan
discussion_id = @spandata[span_id] 'mouseleave': @_bind @onSpanEvent @onLeaveSpan
selector = '.annotatable-discussion[data-discussion-id="'+discussion_id+'"]'; })
$discussion = $(selector, @el)
padding = 20 loadSpanData: () ->
top = $discussion.offset().top - padding @spandata = $(@wrapperSelector, @el).data('spans')
highlighted = false
complete = () -> getDiscussionId: (span_id) ->
if !highlighted @spandata[span_id]
$discussion.effect('highlight', {}, 1000)
highlighted = true getDiscussionEl: (discussion_id) ->
$(@discussionSelector, @el).filter('[data-discussion-id="'+discussion_id+'"]')
$('html, body').animate({
scrollTop: top, onSpanEvent: (fn) ->
}, 1000, 'swing', complete) (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)
<div class="annotatable-wrapper" id="${element_id}"> <div class="annotatable-wrapper" id="${element_id}-wrapper">
<div class="annotatable-header"> <div class="annotatable-header">
<div class="help-icon"></div> <div class="help-icon"></div>
...@@ -14,9 +14,7 @@ ...@@ -14,9 +14,7 @@
<script> <script>
$(function() { $(function() {
// TODO pass spans to module directly $('#${element_id}-wrapper').data('spans', ${json_discussion_for});
var el = $('#${element_id}.annotatable-wrapper');
el.data('spans', ${json_discussion_for});
}); });
</script> </script>
......
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