Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Wen Daniel quibusdam sed sit 58.0
Elisa Wintheiser vitae eum pariatur 58.0
Dania Crona repudiandae officiis qui 58.0
Imelda Heidenreich animi aperiam tenetur 58.0
Flavia Will odio velit repudiandae 58.0
Elisa Wintheiser odio velit repudiandae 58.0
Dahlia Hilll vitae eum pariatur 58.0
Jewell Swaniawski repudiandae officiis qui 58.0
Tess Nikolaus eum amet quia 58.0
Marna Ritchie animi aperiam tenetur 58.0
Malvina Zulauf repudiandae officiis qui 59.0
Jackson Kozey eum amet quia 59.0
Arnita Smith suscipit consectetur beatae 59.0
Jackson Kozey saepe hic temporibus 59.0
Jamison Hagenes saepe hic temporibus 59.0
Eleonore Wisozk eum amet quia 59.0
Clifton Hintz saepe hic temporibus 59.0
Claudette Hagenes eum amet quia 59.0
Grace Kris saepe hic temporibus 59.0
Alise Rolfson animi aperiam tenetur 59.0
Bridgett Reilly saepe hic temporibus 59.0
Dorthey Turner perspiciatis totam perferendis 59.0
Brigid McLaughlin perspiciatis totam perferendis 59.0
Vernia Dietrich odio velit repudiandae 59.0
Verla Friesen odio velit repudiandae 59.0

Grid:

class TimeEntriesGrid < BaseGrid

  #
  # 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[:g]) 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>