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
Moises Kuhlman sint ut ea 77.0
Itzel Littel non et est 75.0
Shayne Strosin sint ut ea 85.0
Dell Champlin sint ut ea 57.0
Darius Bins sint ut ea 50.0
Wyman McClure non et est 64.0
Hortense Leffler non et est 59.0
Tod Heller sint ut ea 39.0
Nola Goyette dolor numquam cumque 57.0
Rodolfo Lueilwitz non et est 59.0
Ernie Considine sint ut ea 100.0
Austin Heathcote sint ut ea 33.0
Sheldon Harvey sint ut ea 71.0
Eunice Flatley sint ut ea 68.0
Anahi Rice dolor numquam cumque 72.0
Fausto Larkin sint ut ea 53.0
Josefa Spinka dolor numquam cumque 66.0
Diego Marvin sint ut ea 107.0
Reta Boyer sint ut ea 77.0
Broderick Cartwright non et est 69.0
Floy Bergnaum dolor numquam cumque 89.0
Charley Carter non et est 81.0
Jalyn Mante sint ut ea 79.0
Myra Ullrich dolor numquam cumque 70.0
Kolby Murazik non et est 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>