-
Notifications
You must be signed in to change notification settings - Fork 11
/
datastream.coffee
77 lines (67 loc) · 2.69 KB
/
datastream.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Template.datastream.loaded = -> Session.equals("dataSubReady", true)
# We want events to exist and events.length > 0 to display
# So we get all docs where events either doesn't exist or it's of size 0
dataSelector = {
$or: [
{ events: {$exists: false} },
{ events: {$size: 0} }
]
}
Template.dataList.data = ->
selector = if TurkServer.isAdmin()
dataSelector # Ignoring hidden values
else
_.extend({}, dataSelector, { hidden: {$exists: false} })
return Datastream.find(selector, sort: {num: 1}) # Sort in increasing insertion order
Template.dataList.rendered = ->
# See reference implementation at packages/ui/domrange.js
# TODO update this for final API of UI hooks
parent = @firstNode
$parent = $(parent)
parent._uihooks =
insertElement: (node, next) ->
parent.insertBefore(node, next)
moveElement: (node, next) ->
parent.insertBefore(node, next)
removeElement: (node) ->
$node = $(node)
# We need to compute these before the fadeOut, or the height will be incorrect
# Moreover, it is logically correct to compare the position of the node before any scrolling
# to the position of the viewport after any scrolling that happens during the fade (right?)
nodeTop = node.offsetTop
# The space we need to adjust - including top and bottom margins, if applicable
nodeHeight = $node.outerHeight(true)
# Fade out the node, and when completed remove it and adjust the scroll height
$node.fadeOut "slow", ->
$(this).remove() # equiv to parent.removeChild(node) or $node.remove()
# Adjust scroll position around the removed element, if it was above the viewport
if (nodeTop + nodeHeight/2) < (parent.scrollTop + $parent.height()/2)
parent.scrollTop = parent.scrollTop - nodeHeight
return
Template.dataList.events =
"click .data-cell": (e, t) -> Mapper.selectData(@_id)
"click .action-data-hide": (e) -> Meteor.call "dataHide", @_id
dragHelper = ->
# Make sure we are on events
Mapper.switchTab("events")
# Set explicit width on the clone
currentWidth = $(this).width()
return $(this).clone().width(currentWidth)
dragProps =
addClasses: false
# cancel: ".data-text"
# containment: "window"
cursorAt: { top: 0, left: 0 }
distance: 5
handle: ".label" # the header
helper: dragHelper
revert: "invalid"
scroll: false
# Make it really obvious where to drop these
start: Mapper.highlightEvents
stop: Mapper.unhighlightEvents
zIndex: 1000
Template.dataItem.rendered = ->
# Only visible elements are rendered in the #each helper so no optimization to do here
$(@firstNode).draggable dragProps
Template.dataItem.hidden = -> if @hidden then "data-cell-hidden" else ""