/
kandan.js.coffee
142 lines (120 loc) · 4.25 KB
/
kandan.js.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#= require_self
#= require_tree ../../templates
#= require_tree ./models
#= require_tree ./collections
#= require_tree ./views
#= require_tree ./routers
#= require_tree ./helpers
window.Kandan =
Models: {}
Collections: {}
Views: {}
Routers: {}
Helpers: {}
Broadcasters: {}
Data: {}
Plugins: {}
options: ->
@_options ?= $('body').data('kandan-config')
# TODO this is a helper method to register plugins
# in the order required until we come up with plugin management
registerPlugins: ->
plugins = [
"UserList"
,"Pastie"
,"Mentions"
,"Notifications"
,"MusicPlayer"
,"YouTubeEmbed"
,"VimeoEmbed"
,"ImageEmbed"
,"LinkEmbed"
,"Attachments"
,"MeAnnounce"
,"Emoticons"
,"Emojis"
,"RgbColorEmbed"
,"HexColorEmbed"
]
for plugin in plugins
Kandan.Plugins.register "Kandan.Plugins.#{plugin}"
registerAppEvents: ()->
Kandan.Data.ActiveUsers.registerCallback "change", (data)->
Kandan.Helpers.Channels.addActivity({
user: data.entity,
action: data.event.split("#")[1]
})
$(window).focus(->
Kandan.Helpers.Utils.browserTabFocused = true
Kandan.Helpers.Utils.resetUnreadActivities()
Kandan.Plugins.Notifications?.resetUnreadActivities()
$(document).attr('title', 'Kandan')
)
$(window).blur(->
Kandan.Helpers.Utils.browserTabFocused = false
)
initBroadcasterAndSubscribe: ()->
Kandan.broadcaster = eval "new Kandan.Broadcasters.#{@options().broadcaster.name}Broadcaster()"
Kandan.broadcaster.subscribe "/channels/*"
@registerAppEvents()
initTabs: ()->
$('#kandan').tabs({
select: (event, ui)->
if ui.tab.id == "create_channel" then return false
$(document).data('active-channel-id',
Kandan.Helpers.Channels.getChannelIdByTabIndex(ui.index))
#the need for the delay feels hacky to me.
#It is there because the chat area has to render before scrollHeight can be determined.
theId = Kandan.Helpers.Channels.getActiveChannelId()
delay = (ms, func) -> setTimeout func, ms
delay 1, -> Kandan.Helpers.Channels.scrollToLatestMessage(theId)
Kandan.Data.Channels.runCallbacks('change')
add: (event, ui) ->
$('.header .ui-tabs-panel:last').detach().appendTo('#channels')
$('#kandan').tabs('option', 'disabled', [])
$('.header ul a').undelegate('cite.close_channel','click').
delegate('cite.close_channel', 'click', window.tabViewGlobal.deleteChannel)
})
$("#kandan").tabs 'option', 'tabTemplate', '''
<li>
<a href="#{href}" class="show_channel">
<span class="tab_right"></span>
<span class="tab_left"></span>
<span class="tab_content">
<cite>#{label}</cite>
<cite class="close_channel" title="close channel">x</cite>
</span>
</a>
</li>
'''
initChatArea: (channels)->
chatArea = new Kandan.Views.ChatArea({channels: channels})
$(".main-area").append(chatArea.render().el)
onFetchActiveUsers: (channels)=>
return (activeUsers)=>
if not Kandan.Helpers.ActiveUsers.collectionHasCurrentUser(activeUsers)
activeUsers.add([Kandan.Helpers.Users.currentUser()])
Kandan.Helpers.ActiveUsers.setFromCollection(activeUsers)
Kandan.registerPlugins()
Kandan.Plugins.initAll()
Kandan.initChatArea(channels)
Kandan.initTabs()
Kandan.Widgets.initAll()
Kandan.Helpers.Channels.scrollToLatestMessage()
Kandan.Plugins.Mentions.initUsersMentions(Kandan.Helpers.ActiveUsers.all())
Kandan.Plugins.Emojis.attachToChatbox()
return
registerUtilityEvents: ()->
window.setInterval(=>
for el in $(".posted_at")
$(el).text (new Date($(el).data("timestamp"))).toRelativeTime(@options().now_threshold)
, @options().timestamp_refresh_interval)
init: ->
channels = new Kandan.Collections.Channels()
channels.fetch({
success: (channelsCollection)=>
@initBroadcasterAndSubscribe()
activeUsers = new Kandan.Collections.ActiveUsers()
activeUsers.fetch({success: @onFetchActiveUsers(channelsCollection)})
})
@registerUtilityEvents()