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
Leonardo Smith dolor numquam cumque 41.0
Nola Goyette dolor numquam cumque 57.0
Domingo Franecki dolor numquam cumque 49.0
Benedict Muller dolor numquam cumque 73.0
Gretchen Lowe dolor numquam cumque 45.0
Kasey Lemke dolor numquam cumque 35.0
Davion Koepp dolor numquam cumque 77.0
Zackery Dibbert dolor numquam cumque 83.0
Myra Ullrich dolor numquam cumque 70.0
Elaina Schiller dolor numquam cumque 55.0
Rylee Fadel dolor numquam cumque 68.0
Alayna Swaniawski dolor numquam cumque 63.0
Bernhard Buckridge dolor numquam cumque 77.0
Lemuel Cummings dolor numquam cumque 82.0
Kayli Swaniawski dolor numquam cumque 69.0
Austin Heathcote dolor numquam cumque 78.0
Josefa Spinka dolor numquam cumque 66.0
Earline Hahn dolor numquam cumque 55.0
Fausto Larkin dolor numquam cumque 46.0
Anderson Brown dolor numquam cumque 58.0
Eunice Flatley dolor numquam cumque 84.0
Louisa Franecki dolor numquam cumque 108.0
Moises Kuhlman dolor numquam cumque 72.0
Makenna Stark dolor numquam cumque 81.0
Mikayla Goldner dolor numquam cumque 40.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>