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
Zack Strosin sint ut ea 24.0
Zack Strosin molestiae laudantium quo 60.0
Zack Strosin voluptatem quaerat architecto 93.0
Zack Strosin perferendis quaerat qui 87.0
Zack Strosin dolor numquam cumque 52.0
Zack Strosin quos aut impedit 82.0
Zack Strosin et pariatur ut 59.0
Zack Strosin minus quaerat quo 58.0
Zack Strosin non et est 95.0
Zack Strosin consequuntur nihil quo 53.0
Zackery Dibbert molestiae laudantium quo 57.0
Zackery Dibbert sint ut ea 65.0
Zackery Dibbert perferendis quaerat qui 51.0
Zackery Dibbert non et est 38.0
Zackery Dibbert consequuntur nihil quo 63.0
Zackery Dibbert dolor numquam cumque 83.0
Zackery Dibbert et pariatur ut 56.0
Zackery Dibbert voluptatem quaerat architecto 70.0
Zackery Dibbert quos aut impedit 71.0
Zackery Dibbert minus quaerat quo 80.0
Wyman McClure non et est 64.0
Wyman McClure voluptatem quaerat architecto 40.0
Wyman McClure minus quaerat quo 51.0
Wyman McClure perferendis quaerat qui 48.0
Wyman McClure consequuntur nihil quo 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>