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
Eunice Flatley voluptatem quaerat architecto 102.0
Frida Goyette sint ut ea 103.0
Garfield Altenwerth voluptatem quaerat architecto 103.0
Isabel Okuneva voluptatem quaerat architecto 104.0
Jacky Kreiger molestiae laudantium quo 105.0
Evert Lakin consequuntur nihil quo 105.0
Rodolfo Lueilwitz voluptatem quaerat architecto 105.0
Gus Jewess perferendis quaerat qui 106.0
Mikayla Goldner molestiae laudantium quo 107.0
Berniece Weimann molestiae laudantium quo 107.0
Diego Marvin sint ut ea 107.0
Louisa Franecki dolor numquam cumque 108.0
Anderson Brown non et est 108.0
Keyon DuBuque consequuntur nihil quo 108.0
Jalyn Mante molestiae laudantium quo 109.0
Reta Boyer non et est 110.0
Sheldon Harvey consequuntur nihil quo 113.0
Lora Kilback quos aut impedit 113.0
Juliana Blick non et est 115.0
King Schmidt quos aut impedit 116.0
Triston Lynch sint ut ea 118.0
Ike Bergnaum perferendis quaerat qui 122.0
Isabel Okuneva molestiae laudantium quo 125.0
Sheldon Harvey molestiae laudantium quo 131.0
Kasey Lemke molestiae laudantium quo 132.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>