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
Alycia Stracke dolor numquam cumque 60.0
Makenna Jakubowski dolor numquam cumque 57.0
Joshuah Wilderman dolor numquam cumque 66.0
Michael King dolor numquam cumque 89.0
Ashlynn Wilderman dolor numquam cumque 101.0
Dell Champlin dolor numquam cumque 45.0
Sheldon Harvey dolor numquam cumque 46.0
Greta Dach dolor numquam cumque 49.0
Garfield Altenwerth dolor numquam cumque 41.0
Zack Strosin dolor numquam cumque 52.0
Charley Carter dolor numquam cumque 62.0
Bernhard Buckridge dolor numquam cumque 77.0
Leonardo Smith dolor numquam cumque 41.0
Wyman McClure dolor numquam cumque 79.0
Nola Goyette dolor numquam cumque 57.0
Walter Cremin dolor numquam cumque 89.0
Lemuel Cummings dolor numquam cumque 82.0
Maximillian Ryan dolor numquam cumque 78.0
Talon Kuhlman dolor numquam cumque 62.0
Albina Morissette dolor numquam cumque 73.0
King Schmidt dolor numquam cumque 36.0
Nora Hagenes dolor numquam cumque 24.0
Jennings Stroman dolor numquam cumque 77.0
Gretchen Lowe dolor numquam cumque 45.0
Broderick Cartwright dolor numquam cumque 48.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>