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
Kolby Murazik sint ut ea 49.0
Jacky Kreiger sint ut ea 49.0
Berniece Weimann sint ut ea 63.0
King Schmidt sint ut ea 87.0
Wyman McClure sint ut ea 77.0
Charley Carter sint ut ea 67.0
Mikayla Goldner sint ut ea 69.0
Diego Marvin sint ut ea 107.0
Walter Cremin sint ut ea 50.0
Makenna Stark sint ut ea 67.0
Syble Ziemann sint ut ea 51.0
Pierre Abernathy sint ut ea 37.0
Shayne Strosin sint ut ea 85.0
Lula Hyatt sint ut ea 63.0
Rylee Fadel sint ut ea 63.0
Joshuah Wilderman sint ut ea 63.0
Lemuel Cummings sint ut ea 52.0
Earline Hahn sint ut ea 88.0
Anahi Rice sint ut ea 33.0
Joelle Jenkins sint ut ea 38.0
Rodolfo Lueilwitz sint ut ea 57.0
Clyde Bruen sint ut ea 93.0
Jeffry Osinski sint ut ea 31.0
Blaise Lang sint ut ea 69.0
Estevan Reilly sint ut ea 65.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>