Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 35 additions & 13 deletions app/controllers/grade_entry_forms_controller.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# The actions necessary for managing grade entry forms.

class GradeEntryFormsController < ApplicationController
include PaginationHelper
include GradeEntryFormsPaginationHelper
include GradeEntryFormsHelper

before_filter :authorize_only_for_admin,
Expand All @@ -26,13 +26,24 @@ class GradeEntryFormsController < ApplicationController
:per_pages => [15, 30, 50, 100, 150],
:filters => {'none' => {
:display => 'Show All',
:proc => lambda { |ignored_1, ignored_2|
Student.all(:conditions => {
:proc => lambda { |sort_by, order|
if !sort_by.blank?
if sort_by == "section"
Student.joins(:section).all(:conditions => {
:hidden => false},
:order => "sections.name "+order)
else
Student.all(:conditions => {
:hidden => false},
:order => sort_by+" "+order)
end
else
Student.all(:conditions => {
:hidden => false},
:order => "user_name")}}},
:sorts => {'last_name' => lambda {
|a,b| a.last_name.downcase <=>
b.last_name.downcase}}}
:order => "user_name "+order)
end
}}}
}

# Create a new grade entry form
def new
Expand Down Expand Up @@ -79,17 +90,28 @@ def grades
@filter = 'none'

# Pagination options
@per_page = 15
if(!params[:per_page].blank?)
@per_page = params[:per_page]
else
@per_page = 15
end

@current_page = 1
@sort_by = 'last_name'
@desc = false
c_sort_by = current_user.id.to_s + "_"+ @grade_entry_form.id.to_s+ "_sort_by_grades"
if !params[:sort_by].blank?
cookies[c_sort_by] = params[:sort_by]
else
params[:sort_by] = 'last_name'
end
@sort_by = cookies[c_sort_by]
@desc = params[:desc]
@filters = get_filters(G_TABLE_PARAMS)
@per_pages = G_TABLE_PARAMS[:per_pages]

all_students = get_filtered_items(G_TABLE_PARAMS,
@filter,
@sort_by,
{:grade_entry_form => @grade_entry_form})
params[:desc])
@students = all_students.paginate(:per_page => @per_page,
:page => @current_page)
@students_total = all_students.size
Expand All @@ -98,6 +120,7 @@ def grades
@students.total_pages)
session[:alpha_pagination_options] = @alpha_pagination_options
@alpha_category = @alpha_pagination_options.first
@sort_by = cookies[c_sort_by]
end

# Handle pagination for grades table
Expand Down Expand Up @@ -130,7 +153,7 @@ def g_table_paginate
G_TABLE_PARAMS,
@filter,
@sort_by,
{:grade_entry_form => @grade_entry_form})
@desc)
@alpha_pagination_options = @grade_entry_form.alpha_paginate(
all_students,
@per_page,
Expand All @@ -142,7 +165,6 @@ def g_table_paginate
@alpha_category = params[:alpha_category]
end
end

# Update a grade in the table
def update_grade
grade_entry_form = GradeEntryForm.find_by_id(params[:id])
Expand Down
76 changes: 76 additions & 0 deletions app/helpers/grade_entry_forms_pagination_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
require 'will_paginate'

=begin How to Use the Grades Entry Form Pagination Helper
hash requires:
:model * the type of data that needs pagination
:per_pages * an array of integers, each integer representing
a selection of pagination size for the user
:filters * a list of possible filters that can be applied
to the data of type :model
a name for each filter
:display * the text the user sees
:proc => lambda * the processing done to each instance of the :model
:sorts
for each sort
"name" * the string that will appear in the URL of a GET
or AJAX request
=> lambda * the lambda expression that handles the sorting
=end
module GradeEntryFormsPaginationHelper
# For the hash that's passed to handle_ap_event, these are the required
# fields.
AP_REQUIRED_KEYS = [:model, :filters]
AP_DEFAULT_PER_PAGE = 30
AP_DEFAULT_PAGE = 1

def handle_paginate_event(hash, object_hash, params)
# First, let's make sure we have the required fields.
# I'll take the keys from the hash, and difference it from
# the AP_REQUIRED_FIELDS. If there are any symbols left over
# in the difference, the hash wasn't complete, and we should bail out.
if (AP_REQUIRED_KEYS - hash.keys).size > 0
# Fail loud, fail proud
raise "handle_paginate_event received an incomplete parameter hash"
end
# Ok, we have everything we need, let's get to work
filter = params[:filter]
desc = params[:desc]
sorts = hash[:sorts]
filters = hash[:filters]
if(!filters.include?(filter))
raise "Could not find filter #{filter}"
end
items = get_filtered_items(hash, filter, params[:sort_by], desc)
if params[:per_page].blank?
params[:per_page] = AP_DEFAULT_PER_PAGE
end
if params[:page].blank?
params[:page] = AP_DEFAULT_PAGE
end

return items.paginate(:per_page => params[:per_page], :page => params[:page]).clone, items.size

end

def get_filters(params)
result = {}
params[:filters].each do |filter_key, filter|
result[filter[:display]] = filter_key
end
return result
end

def get_filtered_items(hash, filter, sort_by, desc)
if !desc.blank?
order = "DESC"
else
order = "ASC"
end

items = hash[:filters][filter][:proc].call(sort_by, order)

return items
end

end

10 changes: 5 additions & 5 deletions app/helpers/pagination_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,7 @@ def handle_paginate_event(hash, object_hash, params)
if(!filters.include?(filter))
raise "Could not find filter #{filter}"
end
items = get_filtered_items(hash, filter, params[:sort_by], object_hash)
if !params[:desc].blank?
items.reverse!
end
items = get_filtered_items(hash, filter, params[:sort_by], object_hash, desc)
if params[:per_page].blank?
params[:per_page] = AP_DEFAULT_PER_PAGE
end
Expand All @@ -63,7 +60,7 @@ def get_filters(params)
return result
end

def get_filtered_items(hash, filter, sort_by, object_hash)
def get_filtered_items(hash, filter, sort_by, object_hash, desc)
to_include = []
#eager load only the tables needed for the type of sort, eager load the rest
#of the tables after the groupings have been paginated
Expand All @@ -80,6 +77,9 @@ def get_filtered_items(hash, filter, sort_by, object_hash)
if !sort_by.blank?
items = items.sort{|a,b| hash[:sorts][sort_by].call(a,b)}
end
if !desc.blank?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be better to retrieve items in the right order in the first place. This retrieves items and later reverses the list if desc is not blank. I.e. does things twice where once is more than enough.

items.reverse!
end
return items
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
:page => 1,
:per_page => per_page,
:sort_by => sort_by,
:desc => desc,
:alpha_category => alpha_pagination_options[0],
:update_alpha_pagination_options => "false"),
:remote => true,
Expand All @@ -26,6 +27,7 @@
:page => current_page - 1,
:per_page => per_page,
:sort_by => sort_by,
:desc => desc,
:alpha_category => alpha_pagination_options[current_page - 2],
:update_alpha_pagination_options => "false"),
:remote => :true,
Expand All @@ -44,6 +46,7 @@
:page => current_page + 1,
:per_page => per_page,
:sort_by => sort_by,
:desc => desc,
:alpha_category => alpha_pagination_options[current_page],
:update_alpha_pagination_options => "false"),
:remote => true,
Expand All @@ -58,6 +61,7 @@
:page => last_page,
:per_page => per_page,
:sort_by => sort_by,
:desc => desc,
:alpha_category => alpha_pagination_options[last_page - 1],
:update_alpha_pagination_options => "false"),
:remote => true,
Expand Down
64 changes: 59 additions & 5 deletions app/views/grade_entry_forms/_grades_table_column_names.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,71 @@
%>

<tr>
<% if @current_user.admin? %>
<% if @current_user.admin?%>
<% # Extra column heading for release/unrelease checkbox
%>
<th></th>
<% end %>
<% # Display headings for: student ID, last name,first name, section
%>
<th><%= t('user.user_name') %></th>
<th><%= t('user.last_name') %></th>
<th><%= t('user.first_name') %></th>
<th><%= t('user.section') %></th>
<% #only sorting functionality for admins %>
<th
<% if @current_user.admin? || @current_user.ta?%>
class="<%="ap_sorting_by" if (sort_by == 'user_name')%>
<%="ap_sorting_by_desc" if (sort_by == 'user_name' && !desc.blank?)%>">
<%= link_to I18n.t("user.user_name"),
:desc => (sort_by == 'user_name' && desc.blank?),
:sort_by => 'user_name',
:per_page => per_page,
:filter =>filter,
:controller =>controller,
:action => action%>
<% else %>
><%= t('user.user_name') %>
<% end %>
</th>
<th
<% if @current_user.admin? || @current_user.ta?%>
class="<%="ap_sorting_by" if (sort_by == 'last_name')%>
<%="ap_sorting_by_desc" if (sort_by == 'last_name' && !desc.blank?)%>">
<%= link_to I18n.t("user.last_name"),
:desc => (sort_by == 'last_name' && desc.blank?),
:sort_by => 'last_name',
:per_page => per_page,
:filter =>filter,
:controller =>controller,
:action => action%>
<% else %>
><%= t('user.last_name') %>
<% end %>
</th>
<th
<% if @current_user.admin? || @current_user.ta?%>
class="<%="ap_sorting_by" if (sort_by == 'first_name')%>
<%="ap_sorting_by_desc" if (sort_by == 'first_name' && !desc.blank?)%>">
<%= link_to I18n.t("user.first_name"),
:desc => (sort_by == 'first_name' && desc.blank?),
:sort_by => 'first_name',
:per_page => per_page,
:filter =>filter,
:controller =>controller,
:action => action%>
<% else %>
><%= t('user.first_name') %>
<% end %>
</th>
<% if @current_user.admin? || @current_user.ta?%>
<th class="<%="ap_sorting_by" if (sort_by == 'section')%>
<%="ap_sorting_by_desc" if (sort_by == 'section' && !desc.blank?)%>">
<%= link_to I18n.t("user.section"),
:desc => (sort_by == 'section' && desc.blank?),
:sort_by => 'section',
:per_page => per_page,
:filter =>filter,
:controller =>controller,
:action => action%>
</th>
<% end %>

<% # Display the question names and totals
%>
Expand Down
7 changes: 5 additions & 2 deletions app/views/grade_entry_forms/_grades_table_filters.html.erb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<% # Allow the user to jump to a page containing certain students
%>
<% if sort_by == 'last_name' %>
<%= label_tag "alpha_category", t('pagination.jump_to'), :class => "inline_label" %>
<%= select_tag "alpha_category",
options_for_select(alpha_pagination_options, alpha_category),
Expand All @@ -18,7 +19,8 @@
+ '&update_alpha_pagination_options=' + false
+ '&authenticity_token=' + AUTH_TOKEN })" -%>

<input type="hidden" name="alpha_category" value="<%=alpha_category%>">
<input type="hidden" name="alpha_category" value="<%=alpha_category%>" >
<% end %>

<% # Allow the user to modify the number of students displayed per page
%>
Expand All @@ -29,7 +31,8 @@
g_table_paginate_grade_entry_form_path(
:id => grade_entry_form.id,
:filter => filter,
:sort_by => sort_by)+ "',
:sort_by => sort_by,
:desc => desc)+ "',
{ asynchronous:true,
evalScripts:true,
onComplete:function(request){ap_thinking_stop();},
Expand Down
18 changes: 14 additions & 4 deletions app/views/grade_entry_forms/g_table_paginate.rjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,41 @@ page.replace_html 'ap_page_links_1', :partial => 'ajax_paginate/initial_paginate
:locals => {:per_page => @per_page, :current_page => @current_page.to_i,
:page_items => @students.size, :total_items => @students_total,
:assignment => @grade_entry_form, :filter => @filter,
:sort_by => @sort_by, :action => 'g_table_paginate',
:sort_by => @sort_by, :desc => @desc, :action => 'g_table_paginate',
:table_name => 'grades', :alpha_category => @alpha_category,
:alpha_pagination_options => @alpha_pagination_options}

page.replace_html 'ap_page_links_2', :partial => 'ajax_paginate/initial_paginate_links_alpha',
:locals => {:per_page => @per_page, :current_page => @current_page.to_i,
:page_items => @students.size, :total_items => @students_total,
:assignment => @grade_entry_form, :filter => @filter,
:sort_by => @sort_by, :action => 'g_table_paginate',
:sort_by => @sort_by, :desc => @desc, :action => 'g_table_paginate',
:table_name => 'grades', :alpha_category => @alpha_category,
:alpha_pagination_options => @alpha_pagination_options}

page.replace_html 'ap_filters_1', :partial => 'grades_table_filters',
:locals => {:filter => @filter, :sort_by => @sort_by,
:locals => {:filter => @filter, :sort_by => @sort_by, :desc => @desc,
:grade_entry_form => @grade_entry_form, :filters => @filters,
:per_page => @per_page, :per_pages => @per_pages,
:alpha_pagination_options => @alpha_pagination_options,
:alpha_category => @alpha_category}

page.replace_html 'ap_filters_2', :partial => 'grades_table_filters',
:locals => {:filter => @filter, :sort_by => @sort_by,
:locals => {:filter => @filter, :sort_by => @sort_by, :desc => @desc,
:grade_entry_form => @grade_entry_form, :filters => @filters,
:per_page => @per_page, :per_pages => @per_pages,
:alpha_pagination_options => @alpha_pagination_options,
:alpha_category => @alpha_category}

page.replace_html 'grades_table_head', :partial => 'grades_table_column_names',
:locals => {:filter => @filter, :per_page => @per_page,
:sort_by => @sort_by, :desc => @desc, :controller => 'grade_entry_forms',
:action => 'grades'}

page.replace_html 'grades_table_footer', :partial => 'grades_table_column_names',
:locals => {:filter => @filter, :per_page => @per_page,
:sort_by => @sort_by, :desc => @desc, :controller => 'grade_entry_forms',
:action => 'grades'}

page.replace_html 'ap_selects', :partial => 'ajax_paginate/selects', :locals => {:page_items => @students.size, :total_items => @students_total}

Loading