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
Alayna Swaniawski non et est 102.0
Shayne Strosin consequuntur nihil quo 102.0
Ike Bergnaum et pariatur ut 101.0
Fausto Larkin minus quaerat quo 101.0
Ashlynn Wilderman dolor numquam cumque 101.0
Alayna Swaniawski molestiae laudantium quo 101.0
Gretchen Lowe quos aut impedit 100.0
Garfield Altenwerth perferendis quaerat qui 100.0
Ernie Considine sint ut ea 100.0
Constance Ward minus quaerat quo 100.0
Talon Kuhlman voluptatem quaerat architecto 99.0
Greta Dach molestiae laudantium quo 99.0
Darius Bins non et est 98.0
King Schmidt non et est 98.0
Alayna Swaniawski sint ut ea 98.0
Isabel Okuneva quos aut impedit 98.0
Lora Kilback minus quaerat quo 98.0
Lora Kilback non et est 98.0
Domingo Franecki non et est 98.0
Maximillian Ryan perferendis quaerat qui 98.0
Evert Lakin quos aut impedit 98.0
Makenna Stark quos aut impedit 97.0
Gus Jewess voluptatem quaerat architecto 97.0
Talon Kuhlman molestiae laudantium quo 97.0
Isabel Okuneva perferendis quaerat qui 97.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>