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
Blaise Lang sint ut ea 69.0
Anderson Brown dolor numquam cumque 58.0
King Schmidt non et est 98.0
Gretchen Lowe dolor numquam cumque 45.0
Anahi Rice non et est 90.0
Alycia Stracke non et est 80.0
Demetrius Bergstrom non et est 70.0
Evert Lakin non et est 74.0
Floy Bergnaum sint ut ea 29.0
Kolby Murazik sint ut ea 49.0
Leonardo Smith dolor numquam cumque 41.0
Nora Hagenes sint ut ea 72.0
Joshuah Wilderman sint ut ea 63.0
Laury Jewess sint ut ea 56.0
Monroe Rowe non et est 43.0
Jennings Stroman sint ut ea 75.0
Tod Heller non et est 51.0
Mittie Quigley dolor numquam cumque 97.0
Cathryn Boehm dolor numquam cumque 26.0
Hortense Leffler dolor numquam cumque 38.0
Sheldon Harvey dolor numquam cumque 46.0
Elaina Schiller non et est 48.0
Wyman McClure dolor numquam cumque 79.0
Josefa Spinka dolor numquam cumque 66.0
Rodolfo Lueilwitz sint ut ea 57.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>