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
Alycia Stracke molestiae laudantium quo 140.0
Tod Heller perferendis quaerat qui 127.0
Lula Hyatt perferendis quaerat qui 124.0
Hortense Leffler et pariatur ut 117.0
Kayli Swaniawski et pariatur ut 116.0
Constance Ward et pariatur ut 115.0
Devante Hegmann et pariatur ut 113.0
Lora Kilback consequuntur nihil quo 112.0
Walter Cremin molestiae laudantium quo 112.0
Moises Kuhlman quos aut impedit 110.0
Christa Smith et pariatur ut 110.0
Myra Ullrich sint ut ea 110.0
Kolby Murazik voluptatem quaerat architecto 110.0
Charley Carter voluptatem quaerat architecto 108.0
Shayne Strosin minus quaerat quo 108.0
Gus Jewess minus quaerat quo 108.0
Rodolfo Lueilwitz voluptatem quaerat architecto 107.0
Carmel Huel et pariatur ut 106.0
Tod Heller et pariatur ut 105.0
Lula Hyatt dolor numquam cumque 105.0
Juliana Blick minus quaerat quo 105.0
Nora Hagenes et pariatur ut 104.0
Laury Jewess quos aut impedit 104.0
Lula Hyatt consequuntur nihil quo 104.0
Domingo Franecki molestiae laudantium quo 103.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>