Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced) Document Grid (Mongoid)

Time Entries Grid


Developer Project Report hours
Mikayla Goldner dolor numquam cumque 40.0
Kolby Murazik non et est 40.0
Wyman McClure voluptatem quaerat architecto 40.0
Keyon DuBuque et pariatur ut 40.0
Reta Boyer dolor numquam cumque 40.0
Broderick Cartwright quos aut impedit 40.0
Cathryn Boehm voluptatem quaerat architecto 40.0
Greta Dach consequuntur nihil quo 40.0
Devante Hegmann voluptatem quaerat architecto 40.0
Anahi Rice minus quaerat quo 40.0
Oleta Rau sint ut ea 40.0
Estevan Reilly perferendis quaerat qui 40.0
Minnie Lueilwitz quos aut impedit 41.0
Nora Hagenes quos aut impedit 41.0
Earline Hahn voluptatem quaerat architecto 41.0
Alayna Swaniawski voluptatem quaerat architecto 41.0
Oleta Rau dolor numquam cumque 41.0
Nora Hagenes molestiae laudantium quo 41.0
Rodolfo Lueilwitz perferendis quaerat qui 41.0
Garfield Altenwerth consequuntur nihil quo 41.0
Michael King perferendis quaerat qui 41.0
Danika Bins consequuntur nihil quo 41.0
Leonardo Smith dolor numquam cumque 41.0
Garfield Altenwerth dolor numquam cumque 41.0
Rodolfo Lueilwitz quos aut impedit 42.0

Grid:

class TimeEntriesGrid

  include Datagrid

  #
  # Scope
  #

  scope do
    User.select(
      "users.name, projects.name as project_name, accounts.name as account_name, sum(time_entries.hours) as report_hours"
    ).joins(:time_entries => {:project => :account}).group("projects.name", "users.name", "accounts.name").order("users.name")

  end


  #
  # Filters
  #

  filter(:project_id, :enum,
    :select => lambda {Project.all.map {|p| [p.name, p.id]}},
    :multiple => true,
    :include_blank => false
  ) do |value|
    self.where(:time_entries => {:project_id => value})
  end


  filter(:year, :enum,
         :select => lambda { TimeEntry.all.any? ? (TimeEntry.minimum(:date).year..TimeEntry.maximum(:date).year) : []},
    :include_blank => false,
    :default => lambda {Date.today.year}
  ) do |value|
    self.where(["extract(year from time_entries.date) = ?", value.to_i])
  end

  filter(:month, :enum,
         :select => Date::MONTHNAMES[1..12].enum_for(:each_with_index).collect {|name, index| [name, index + 1]},
         :include_blank => false,
         :default => lambda {Date.today.month}
        ) do |value|

    self.where(["extract(month from time_entries.date) = ?", value.to_i])
  end


  #
  # Columns
  #

  column(:user_name, :header => "Developer", :order => "users.name") do
    self.name
  end
  column(:project_name, :header => "Project", :order => "projects.name")
  column(
    :account_name,
    :header => "Company",
    :order => "accounts.name",
  ) do |model|
    format(model.account_name) do
      render :partial => "time_entries/company", :locals => {:model => model}
    end
  end

  column(:report_hours, order: "sum(time_entries.hours)")

end

Controller:

class TimeEntriesController < ApplicationController

  def index
    @time_entries_grid = TimeEntriesGrid.new(params[:time_entries_grid]) do |scope|
      scope.page(params[:page])
    end
  end
end

View:


<h3>Time Entries Grid</h3>


<div class="left">
  <%= datagrid_form_for @time_entries_grid, url: time_entries_path %>
  <br/>

  <%= datagrid_table(@time_entries_grid) %>
  <%= paginate @time_entries_grid.assets %>

</div>

<div class="right">
  <%= render :partial => "shared/source", :object => @time_entries_grid %>
</div>