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
Talon Kuhlman et pariatur ut 97.0
Mittie Quigley dolor numquam cumque 97.0
Makenna Stark quos aut impedit 97.0
Isabel Okuneva perferendis quaerat qui 97.0
Lula Hyatt minus quaerat quo 96.0
Laury Jewess quos aut impedit 96.0
Evert Lakin molestiae laudantium quo 96.0
Zack Strosin non et est 95.0
Itzel Littel consequuntur nihil quo 95.0
Dell Champlin quos aut impedit 95.0
Jacky Kreiger et pariatur ut 95.0
Constance Ward dolor numquam cumque 95.0
Eunice Flatley minus quaerat quo 95.0
Rosanna Schowalter non et est 95.0
Pierre Abernathy non et est 94.0
Hortense Leffler molestiae laudantium quo 94.0
Darius Bins voluptatem quaerat architecto 94.0
Blaise Lang et pariatur ut 94.0
Colin Harber minus quaerat quo 94.0
Earline Hahn quos aut impedit 94.0
Frida Goyette dolor numquam cumque 94.0
Joshuah Wilderman perferendis quaerat qui 93.0
Clyde Bruen sint ut ea 93.0
Mikayla Goldner et pariatur ut 93.0
Zack Strosin voluptatem quaerat architecto 93.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>