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
Greta Dach molestiae laudantium quo 123.0
Triston Lynch molestiae laudantium quo 121.0
Ike Bergnaum non et est 120.0
Nola Goyette non et est 120.0
Davion Koepp voluptatem quaerat architecto 119.0
Benedict Muller sint ut ea 116.0
Mathilde Huels perferendis quaerat qui 112.0
Zack Strosin molestiae laudantium quo 112.0
Talon Kuhlman minus quaerat quo 109.0
Demetrius Bergstrom voluptatem quaerat architecto 109.0
Christa Smith quos aut impedit 108.0
Ashlynn Wilderman molestiae laudantium quo 107.0
Wyman McClure sint ut ea 107.0
Carmel Huel molestiae laudantium quo 107.0
River Bergnaum non et est 106.0
Joelle Jenkins non et est 105.0
Ambrose Marvin non et est 105.0
Eunice Flatley perferendis quaerat qui 105.0
Alayna Swaniawski dolor numquam cumque 103.0
Cathryn Boehm molestiae laudantium quo 102.0
Zackery Dibbert perferendis quaerat qui 102.0
Oleta Rau molestiae laudantium quo 101.0
Shayne Strosin sint ut ea 101.0
Rosanna Schowalter non et est 101.0
Gretchen Lowe non et est 101.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>