Skip to content

Commit

Permalink
Adds pagination; after a lot of 'vada poche' moments
Browse files Browse the repository at this point in the history
Signed-off-by: Akash Manohar J <akash@akash.im>
  • Loading branch information
HashNuke committed Mar 16, 2012
1 parent 6ab6f30 commit 6ebd6cd
Show file tree
Hide file tree
Showing 17 changed files with 129 additions and 23 deletions.
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ gem 'devise_bushido_authenticatable'
gem 'bushido'
gem 'thin'
gem 'faye'
gem 'kaminari'

# Gems used only for assets and not required
# in production environments by default.
Expand Down
5 changes: 5 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@ GEM
railties (>= 3.2.0, < 5.0)
thor (~> 0.14)
json (1.6.5)
kaminari (0.13.0)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
railties (>= 3.0.0)
libv8 (3.3.10.4)
mail (2.4.3)
i18n (>= 0.4.0)
Expand Down Expand Up @@ -221,6 +225,7 @@ DEPENDENCIES
faye
jasmine!
jquery-rails
kaminari
rails (= 3.2.2)
rspec-rails
sass-rails (~> 3.2.3)
Expand Down
10 changes: 7 additions & 3 deletions app/assets/javascripts/backbone/collections/activities.js.coffee
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
class Kandan.Collections.Activities extends Backbone.Collection

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

initialize: (options)->
@channel_id = @get('channel_id')
initialize: (models, options)->
@channel_id = options.channel_id

parse: (response)->
@more_activities = response.more_activities
response.activities
36 changes: 31 additions & 5 deletions app/assets/javascripts/backbone/helpers/channels.js.coffee
Original file line number Diff line number Diff line change
@@ -1,32 +1,58 @@
class Kandan.Helpers.Channels

@channel_el: (channel_id)->
$("#channels-#{channel_id}")
@channel_activities_el: (channel_id)->
$("#channel-activities-#{channel_id}")

@channel_pagination_el: (channel_id)->
$("#channels-#{channel_id} .pagination")

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


@get_active_channel_id: ()->
$("#channels .ui-tabs-panel")
.eq(@selected_tab())
.data('channel_id')


@new_activity_view: (activity_attributes)->
activity = new Kandan.Models.Activity(activity_attributes)
activity_view = new Kandan.Views.ShowActivity({activity: activity})
return activity_view


@add_activity: (activity_attributes, state)->
if activity_attributes.channel_id
@add_message(activity_attributes, state)
else
@add_notification(activity_attributes)


@add_message: (activity_attributes, state)->
@channel_el(activity_attributes.channel_id)
@channel_activities_el(activity_attributes.channel_id)
.append(@new_activity_view(activity_attributes).render().el)
@set_pagination_data(activity_attributes.channel_id)


@add_notification: (activity_attributes)->
$channel_elements = $("#channels .ui-tabs-panel")
$channel_elements = $(".channel-activities")
for el in $channel_elements
$(el).append(@new_activity_view(activity_attributes).render().el)
$(el).append(@new_activity_view(activity_attributes).render().el)


@set_pagination_state: (channel_id, more_activities, oldest)->
@channel_pagination_el(channel_id).data('oldest', oldest)
if more_activities == true
console.log "show pagination"
@channel_pagination_el(channel_id).show()
else
console.log "hide pagination"
@channel_pagination_el(channel_id).hide()


@set_pagination_data: (channel_id)->
$oldest_activity = @channel_activities_el(channel_id).find(".activity").first()
if $oldest_activity.length != 0
console.log "oldest activity id", $oldest_activity.data('activity_id')
@channel_pagination_el(channel_id).data('oldest', $oldest_activity.data('activity_id'))
2 changes: 1 addition & 1 deletion app/assets/javascripts/backbone/models/activity.js.coffee
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
class Kandan.Models.Activity extends Backbone.Model
urlRoot: ()->
url: ()->
"channels/#{@get('channel_id')}/activities"

initialize: (options)->
Expand Down
4 changes: 3 additions & 1 deletion app/assets/javascripts/backbone/models/channel.js.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ class Kandan.Models.Channel extends Backbone.Model
# console.log @activities

parse: (response)->
activities = new Kandan.Collections.Activities()
activities = new Kandan.Collections.Activities([], {channel_id: response.id})
activities.add(response.activities)
@activities = activities
@more_activities = response.more_activities

response
1 change: 0 additions & 1 deletion app/assets/javascripts/backbone/plugins/embeds.js.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ class Kandan.Plugins.Embeds
@register_image_modifier: ()->
Kandan.Modifiers.register @image_regex, (message, state)=>
message.content = @image_template({ image_url: message.content })
console.log message.content
return Kandan.Helpers.Activities.build_from_message_template(message)


Expand Down
41 changes: 36 additions & 5 deletions app/assets/javascripts/backbone/views/list_activities.js.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,41 @@ class Kandan.Views.ListActivities extends Backbone.View
tagName: 'div'
# className: 'activities'

events: {
"click .pagination": "load_more_activities"
}

render: ()->
for activity in @options.channel.activities.models
@channel = @options.channel
$activities_list = $("<div class='channel-activities'></div>").attr('id', "channel-activities-#{@channel.get('id')}")
for activity in @channel.activities.models
activity_view = new Kandan.Views.ShowActivity({activity: activity, state: Kandan.Helpers.Activities.HISTORY_STATE})
$(@el).append(activity_view.render().el)
$(@el).attr('id', "channels-#{@options.channel.get('id')}")
$(@el).data('channel_id', @options.channel.get('id'))
@
$activities_list.append(activity_view.render().el)

$pagination = $("<div class='pagination'>previous messages</div>")
oldest = 0
oldest = @channel.activities.toJSON()[0].id if @channel.activities.toJSON()[0]

$pagination.data('oldest', oldest)
$(@el).append($pagination)
$(@el).find(".pagination").hide() if @channel.more_activities == false
$(@el).append($activities_list)
$(@el).attr('id', "channels-#{@channel.get('id')}")
$(@el).data('channel_id', @channel.get('id'))
@

load_more_activities: ()->
oldest = $(@el).find(".pagination").data('oldest')
activities = new Kandan.Collections.Activities([], {channel_id: @channel.get('id')})
activities.fetch({
data: { oldest: oldest },
success: (collection)=>
_.each collection.models.reverse(), (activity)=>
activity_view = new Kandan.Views.ShowActivity({activity: activity})
$(@el).find(".channel-activities").prepend(activity_view.render().el)
Kandan.Helpers.Channels.set_pagination_state(
collection.channel_id,
collection.more_activities,
_.last(collection.models).get('id')
)
})
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
class Kandan.Views.ListChannelActivityAreas extends Backbone.View
# template: JST['list_channel_activity_areas']


render: ()->
for channel in @options.channels.models
view = new Kandan.Views.ListActivities({activities: channel.activities})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class Kandan.Views.ShowActivity extends Backbone.View
else
@compiled_template = Kandan.Helpers.Activities.build_from_message_template $.extend(activity, {content: _.escape(activity.content)})


$(@el).data('activity_id', activity.id)
$(@el).attr('id', "activity-#{activity.id}")
$(@el).html(@compiled_template)
@
1 change: 0 additions & 1 deletion app/assets/javascripts/backbone/widgets.js.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ class Kandan.Widgets
widget_names

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

@init: (widget_name)->
Expand Down
3 changes: 3 additions & 0 deletions app/assets/templates/list_channel_activity_areas.jst.eco
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div class="pagination"><%= pagination_text %></div>
<div class="channel-activities">
</div>
20 changes: 18 additions & 2 deletions app/controllers/activities_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,25 @@ class ActivitiesController < ApplicationController
before_filter :authenticate_user!

def index
@activities = Channel.find(params[:channel_id]).activities.includes(:user).all
oldest = params[:oldest] || 1
first_activity_id = 1
activities = Channel.find(params[:channel_id]).
activities.
includes(:user).
order('id DESC').
where("id < ?", oldest).
limit(Kandan::Config.options[:per_page])


first_activity = Activity.order('id').where(:channel_id => params[:channel_id]).first
first_activity_id = first_activity.id if not first_activity.nil?

# NOTE if the action is accessed then there's definitely activities, so skip check for #first to be nil
puts "#{first_activity_id} < #{activities.last.id}"
more_activities = first_activity_id < activities.last.id

respond_to do |format|
format.json { render :json => @activities, :include => :user }
format.json { render :text => {:activities => activities.reverse, :more_activities => more_activities }.to_json(:include => :user) }
end
end

Expand Down
18 changes: 16 additions & 2 deletions app/controllers/channels_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,24 @@ class ChannelsController < ApplicationController
before_filter :authenticate_user!

def index
@channels = Channel.includes(:activities => :user).all
# NOTE Eager loading doesn't respect limit
@channels = Channel.find(:all)
nested_channel_data = []

# TODO this can be shortened
@channels.each do |channel|
activities = []
more_activities = (channel.activities.count > Kandan::Config.options[:per_page])
channel.activities.order('id DESC').includes(:user).page.each do |activity|
activities.push activity.attributes.merge({:user => activity.user.attributes})
end

nested_channel_data.push channel.attributes.merge({:activities => activities.reverse, :more_activities => more_activities})
end

respond_to do |format|
format.json do
render :json => @channels, :include => {:activities => {:include=>:user}}
render :text => nested_channel_data.to_json
end
end
end
Expand Down
2 changes: 2 additions & 0 deletions app/models/activity.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
class Activity < ActiveRecord::Base
belongs_to :user
belongs_to :channel

paginates_per Kandan::Config.options[:per_page]
end
2 changes: 2 additions & 0 deletions config/kandan_settings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@
# valid options: Faye
:broadcaster:
:name: "Faye"

:per_page: 5
2 changes: 1 addition & 1 deletion lib/faye_extensions/devise_auth.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def incoming(message, callback)
message['error'] = "Invalid auth token"
end
end
puts "Message: #{message.inspect}"
# puts "Message: #{message.inspect}"
callback.call(message)
end

Expand Down

0 comments on commit 6ebd6cd

Please sign in to comment.