Skip to content

Commit 6ebd6cd

Browse files
committedMar 16, 2012
Adds pagination; after a lot of 'vada poche' moments
Signed-off-by: Akash Manohar J <akash@akash.im>
1 parent 6ab6f30 commit 6ebd6cd

17 files changed

+129
-23
lines changed
 

‎Gemfile

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ gem 'devise_bushido_authenticatable'
1111
gem 'bushido'
1212
gem 'thin'
1313
gem 'faye'
14+
gem 'kaminari'
1415

1516
# Gems used only for assets and not required
1617
# in production environments by default.

‎Gemfile.lock

+5
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ GEM
116116
railties (>= 3.2.0, < 5.0)
117117
thor (~> 0.14)
118118
json (1.6.5)
119+
kaminari (0.13.0)
120+
actionpack (>= 3.0.0)
121+
activesupport (>= 3.0.0)
122+
railties (>= 3.0.0)
119123
libv8 (3.3.10.4)
120124
mail (2.4.3)
121125
i18n (>= 0.4.0)
@@ -221,6 +225,7 @@ DEPENDENCIES
221225
faye
222226
jasmine!
223227
jquery-rails
228+
kaminari
224229
rails (= 3.2.2)
225230
rspec-rails
226231
sass-rails (~> 3.2.3)
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
class Kandan.Collections.Activities extends Backbone.Collection
22

3-
urlRoot: ()->
3+
url: ()->
44
"channels/#{@channel_id}/activities"
55

6-
initialize: (options)->
7-
@channel_id = @get('channel_id')
6+
initialize: (models, options)->
7+
@channel_id = options.channel_id
8+
9+
parse: (response)->
10+
@more_activities = response.more_activities
11+
response.activities
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,58 @@
11
class Kandan.Helpers.Channels
22

3-
@channel_el: (channel_id)->
4-
$("#channels-#{channel_id}")
3+
@channel_activities_el: (channel_id)->
4+
$("#channel-activities-#{channel_id}")
5+
6+
@channel_pagination_el: (channel_id)->
7+
$("#channels-#{channel_id} .pagination")
58

69
@selected_tab: ()->
710
$('#channels').tabs('option', 'selected')
811

12+
913
@get_active_channel_id: ()->
1014
$("#channels .ui-tabs-panel")
1115
.eq(@selected_tab())
1216
.data('channel_id')
1317

18+
1419
@new_activity_view: (activity_attributes)->
1520
activity = new Kandan.Models.Activity(activity_attributes)
1621
activity_view = new Kandan.Views.ShowActivity({activity: activity})
1722
return activity_view
1823

24+
1925
@add_activity: (activity_attributes, state)->
2026
if activity_attributes.channel_id
2127
@add_message(activity_attributes, state)
2228
else
2329
@add_notification(activity_attributes)
2430

31+
2532
@add_message: (activity_attributes, state)->
26-
@channel_el(activity_attributes.channel_id)
33+
@channel_activities_el(activity_attributes.channel_id)
2734
.append(@new_activity_view(activity_attributes).render().el)
35+
@set_pagination_data(activity_attributes.channel_id)
36+
2837

2938
@add_notification: (activity_attributes)->
30-
$channel_elements = $("#channels .ui-tabs-panel")
39+
$channel_elements = $(".channel-activities")
3140
for el in $channel_elements
32-
$(el).append(@new_activity_view(activity_attributes).render().el)
41+
$(el).append(@new_activity_view(activity_attributes).render().el)
42+
43+
44+
@set_pagination_state: (channel_id, more_activities, oldest)->
45+
@channel_pagination_el(channel_id).data('oldest', oldest)
46+
if more_activities == true
47+
console.log "show pagination"
48+
@channel_pagination_el(channel_id).show()
49+
else
50+
console.log "hide pagination"
51+
@channel_pagination_el(channel_id).hide()
52+
53+
54+
@set_pagination_data: (channel_id)->
55+
$oldest_activity = @channel_activities_el(channel_id).find(".activity").first()
56+
if $oldest_activity.length != 0
57+
console.log "oldest activity id", $oldest_activity.data('activity_id')
58+
@channel_pagination_el(channel_id).data('oldest', $oldest_activity.data('activity_id'))

‎app/assets/javascripts/backbone/models/activity.js.coffee

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class Kandan.Models.Activity extends Backbone.Model
2-
urlRoot: ()->
2+
url: ()->
33
"channels/#{@get('channel_id')}/activities"
44

55
initialize: (options)->

‎app/assets/javascripts/backbone/models/channel.js.coffee

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ class Kandan.Models.Channel extends Backbone.Model
55
# console.log @activities
66

77
parse: (response)->
8-
activities = new Kandan.Collections.Activities()
8+
activities = new Kandan.Collections.Activities([], {channel_id: response.id})
99
activities.add(response.activities)
1010
@activities = activities
11+
@more_activities = response.more_activities
12+
1113
response

‎app/assets/javascripts/backbone/plugins/embeds.js.coffee

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ class Kandan.Plugins.Embeds
2222
@register_image_modifier: ()->
2323
Kandan.Modifiers.register @image_regex, (message, state)=>
2424
message.content = @image_template({ image_url: message.content })
25-
console.log message.content
2625
return Kandan.Helpers.Activities.build_from_message_template(message)
2726

2827

‎app/assets/javascripts/backbone/views/list_activities.js.coffee

+36-5
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,41 @@ class Kandan.Views.ListActivities extends Backbone.View
22
tagName: 'div'
33
# className: 'activities'
44

5+
events: {
6+
"click .pagination": "load_more_activities"
7+
}
8+
59
render: ()->
6-
for activity in @options.channel.activities.models
10+
@channel = @options.channel
11+
$activities_list = $("<div class='channel-activities'></div>").attr('id', "channel-activities-#{@channel.get('id')}")
12+
for activity in @channel.activities.models
713
activity_view = new Kandan.Views.ShowActivity({activity: activity, state: Kandan.Helpers.Activities.HISTORY_STATE})
8-
$(@el).append(activity_view.render().el)
9-
$(@el).attr('id', "channels-#{@options.channel.get('id')}")
10-
$(@el).data('channel_id', @options.channel.get('id'))
11-
@
14+
$activities_list.append(activity_view.render().el)
15+
16+
$pagination = $("<div class='pagination'>previous messages</div>")
17+
oldest = 0
18+
oldest = @channel.activities.toJSON()[0].id if @channel.activities.toJSON()[0]
19+
20+
$pagination.data('oldest', oldest)
21+
$(@el).append($pagination)
22+
$(@el).find(".pagination").hide() if @channel.more_activities == false
23+
$(@el).append($activities_list)
24+
$(@el).attr('id', "channels-#{@channel.get('id')}")
25+
$(@el).data('channel_id', @channel.get('id'))
26+
@
27+
28+
load_more_activities: ()->
29+
oldest = $(@el).find(".pagination").data('oldest')
30+
activities = new Kandan.Collections.Activities([], {channel_id: @channel.get('id')})
31+
activities.fetch({
32+
data: { oldest: oldest },
33+
success: (collection)=>
34+
_.each collection.models.reverse(), (activity)=>
35+
activity_view = new Kandan.Views.ShowActivity({activity: activity})
36+
$(@el).find(".channel-activities").prepend(activity_view.render().el)
37+
Kandan.Helpers.Channels.set_pagination_state(
38+
collection.channel_id,
39+
collection.more_activities,
40+
_.last(collection.models).get('id')
41+
)
42+
})

‎app/assets/javascripts/backbone/views/list_channel_activity_areas.js.coffee

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
class Kandan.Views.ListChannelActivityAreas extends Backbone.View
22
# template: JST['list_channel_activity_areas']
33

4+
45
render: ()->
56
for channel in @options.channels.models
67
view = new Kandan.Views.ListActivities({activities: channel.activities})

‎app/assets/javascripts/backbone/views/show_activity.js.coffee

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class Kandan.Views.ShowActivity extends Backbone.View
1515
else
1616
@compiled_template = Kandan.Helpers.Activities.build_from_message_template $.extend(activity, {content: _.escape(activity.content)})
1717

18-
18+
$(@el).data('activity_id', activity.id)
19+
$(@el).attr('id', "activity-#{activity.id}")
1920
$(@el).html(@compiled_template)
2021
@

‎app/assets/javascripts/backbone/widgets.js.coffee

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ class Kandan.Widgets
1414
widget_names
1515

1616
@init_all: ()->
17-
console.log "widget_names", @widget_names()
1817
@init(widget_name) for widget_name in @widget_names()
1918

2019
@init: (widget_name)->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div class="pagination"><%= pagination_text %></div>
2+
<div class="channel-activities">
3+
</div>

‎app/controllers/activities_controller.rb

+18-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,25 @@ class ActivitiesController < ApplicationController
22
before_filter :authenticate_user!
33

44
def index
5-
@activities = Channel.find(params[:channel_id]).activities.includes(:user).all
5+
oldest = params[:oldest] || 1
6+
first_activity_id = 1
7+
activities = Channel.find(params[:channel_id]).
8+
activities.
9+
includes(:user).
10+
order('id DESC').
11+
where("id < ?", oldest).
12+
limit(Kandan::Config.options[:per_page])
13+
14+
15+
first_activity = Activity.order('id').where(:channel_id => params[:channel_id]).first
16+
first_activity_id = first_activity.id if not first_activity.nil?
17+
18+
# NOTE if the action is accessed then there's definitely activities, so skip check for #first to be nil
19+
puts "#{first_activity_id} < #{activities.last.id}"
20+
more_activities = first_activity_id < activities.last.id
21+
622
respond_to do |format|
7-
format.json { render :json => @activities, :include => :user }
23+
format.json { render :text => {:activities => activities.reverse, :more_activities => more_activities }.to_json(:include => :user) }
824
end
925
end
1026

‎app/controllers/channels_controller.rb

+16-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,24 @@ class ChannelsController < ApplicationController
22
before_filter :authenticate_user!
33

44
def index
5-
@channels = Channel.includes(:activities => :user).all
5+
# NOTE Eager loading doesn't respect limit
6+
@channels = Channel.find(:all)
7+
nested_channel_data = []
8+
9+
# TODO this can be shortened
10+
@channels.each do |channel|
11+
activities = []
12+
more_activities = (channel.activities.count > Kandan::Config.options[:per_page])
13+
channel.activities.order('id DESC').includes(:user).page.each do |activity|
14+
activities.push activity.attributes.merge({:user => activity.user.attributes})
15+
end
16+
17+
nested_channel_data.push channel.attributes.merge({:activities => activities.reverse, :more_activities => more_activities})
18+
end
19+
620
respond_to do |format|
721
format.json do
8-
render :json => @channels, :include => {:activities => {:include=>:user}}
22+
render :text => nested_channel_data.to_json
923
end
1024
end
1125
end

‎app/models/activity.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
class Activity < ActiveRecord::Base
22
belongs_to :user
33
belongs_to :channel
4+
5+
paginates_per Kandan::Config.options[:per_page]
46
end

‎config/kandan_settings.yml

+2
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@
77
# valid options: Faye
88
:broadcaster:
99
:name: "Faye"
10+
11+
:per_page: 5

‎lib/faye_extensions/devise_auth.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def incoming(message, callback)
1010
message['error'] = "Invalid auth token"
1111
end
1212
end
13-
puts "Message: #{message.inspect}"
13+
# puts "Message: #{message.inspect}"
1414
callback.call(message)
1515
end
1616

0 commit comments

Comments
 (0)
Please sign in to comment.