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
Triston Lynch quos aut impedit 35.0
Nora Hagenes minus quaerat quo 35.0
Benedict Muller sint ut ea 35.0
Isabel Okuneva dolor numquam cumque 35.0
Austin Heathcote non et est 35.0
Kattie Langosh dolor numquam cumque 36.0
Charley Carter quos aut impedit 36.0
Itzel Littel minus quaerat quo 36.0
Rylee Fadel quos aut impedit 36.0
Jennings Stroman non et est 36.0
Bernhard Buckridge et pariatur ut 36.0
Myra Ullrich non et est 36.0
Joshuah Wilderman voluptatem quaerat architecto 36.0
King Schmidt dolor numquam cumque 36.0
Moises Kuhlman molestiae laudantium quo 36.0
Pierre Abernathy sint ut ea 37.0
Makenna Jakubowski minus quaerat quo 37.0
Frida Goyette voluptatem quaerat architecto 37.0
Clyde Bruen non et est 37.0
Wyman McClure consequuntur nihil quo 37.0
Colin Harber non et est 37.0
Ernie Considine perferendis quaerat qui 37.0
Albina Morissette et pariatur ut 37.0
Gretchen Lowe voluptatem quaerat architecto 37.0
Lemuel Cummings non et est 37.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>