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
Gretchen Lowe perferendis quaerat qui 90.0
Josefa Spinka perferendis quaerat qui 90.0
Dorothea Schimmel minus quaerat quo 90.0
Floy Bergnaum non et est 90.0
Floy Bergnaum dolor numquam cumque 89.0
Domingo Franecki consequuntur nihil quo 89.0
Sheldon Harvey perferendis quaerat qui 89.0
Michael King dolor numquam cumque 89.0
Mittie Quigley non et est 89.0
Kasey Lemke quos aut impedit 89.0
Louisa Franecki consequuntur nihil quo 89.0
Dell Champlin non et est 89.0
Walter Cremin dolor numquam cumque 89.0
Earline Hahn molestiae laudantium quo 89.0
Ike Bergnaum dolor numquam cumque 88.0
Earline Hahn sint ut ea 88.0
Estevan Reilly et pariatur ut 88.0
Albina Morissette minus quaerat quo 88.0
Makenna Jakubowski voluptatem quaerat architecto 88.0
Monroe Rowe consequuntur nihil quo 88.0
Fausto Larkin consequuntur nihil quo 88.0
Garfield Altenwerth sint ut ea 87.0
King Schmidt sint ut ea 87.0
Clyde Bruen dolor numquam cumque 87.0
Triston Lynch non et est 87.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>