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
Kasey Lemke molestiae laudantium quo 132.0
Sheldon Harvey molestiae laudantium quo 131.0
Isabel Okuneva molestiae laudantium quo 125.0
Ike Bergnaum perferendis quaerat qui 122.0
Triston Lynch sint ut ea 118.0
King Schmidt quos aut impedit 116.0
Juliana Blick non et est 115.0
Lora Kilback quos aut impedit 113.0
Sheldon Harvey consequuntur nihil quo 113.0
Reta Boyer non et est 110.0
Jalyn Mante molestiae laudantium quo 109.0
Keyon DuBuque consequuntur nihil quo 108.0
Louisa Franecki dolor numquam cumque 108.0
Anderson Brown non et est 108.0
Mikayla Goldner molestiae laudantium quo 107.0
Berniece Weimann molestiae laudantium quo 107.0
Diego Marvin sint ut ea 107.0
Gus Jewess perferendis quaerat qui 106.0
Evert Lakin consequuntur nihil quo 105.0
Rodolfo Lueilwitz voluptatem quaerat architecto 105.0
Jacky Kreiger molestiae laudantium quo 105.0
Isabel Okuneva voluptatem quaerat architecto 104.0
Garfield Altenwerth voluptatem quaerat architecto 103.0
Frida Goyette sint ut ea 103.0
Shayne Strosin consequuntur nihil quo 102.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>