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
Erika Zboncak non et est 82.0
Itzel Littel non et est 75.0
Keyon DuBuque sint ut ea 68.0
Michael King non et est 75.0
Greta Dach non et est 71.0
River Bergnaum dolor numquam cumque 93.0
Juliana Blick sint ut ea 87.0
Evert Lakin sint ut ea 82.0
Mikayla Goldner dolor numquam cumque 40.0
Ike Bergnaum sint ut ea 59.0
Syble Ziemann dolor numquam cumque 57.0
Makenna Stark dolor numquam cumque 81.0
Kayli Swaniawski sint ut ea 58.0
Josefa Spinka non et est 48.0
Jacky Kreiger dolor numquam cumque 65.0
Cristopher Considine dolor numquam cumque 71.0
Keyon DuBuque non et est 86.0
Ike Bergnaum non et est 73.0
Kattie Langosh dolor numquam cumque 36.0
Pierre Abernathy dolor numquam cumque 75.0
Jacky Kreiger sint ut ea 49.0
Jeffry Osinski dolor numquam cumque 84.0
Itzel Littel dolor numquam cumque 68.0
Gus Jewess non et est 31.0
Lula Hyatt dolor numquam cumque 90.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>