Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Beverlee Auer odio velit repudiandae 75.0
Jewell Kreiger saepe hic temporibus 75.0
German Murphy eum amet quia 75.0
Cathey Prohaska animi aperiam tenetur 75.0
Elisa Wintheiser doloribus hic corporis 75.0
Dona Gutkowski suscipit consectetur beatae 76.0
Elida Zulauf perspiciatis totam perferendis 76.0
Pearlie McGlynn doloribus hic corporis 76.0
Tamera Bogan suscipit consectetur beatae 76.0
Clifton Hintz doloribus hic corporis 76.0
Winfred Franecki eum amet quia 76.0
Li Considine suscipit consectetur beatae 76.0
Cathey Prohaska perspiciatis totam perferendis 76.0
Raquel Runolfsson perspiciatis totam perferendis 76.0
Micheal Jenkins doloribus hic corporis 76.0
Imelda Heidenreich vitae eum pariatur 76.0
Sylvester Hane repudiandae officiis qui 76.0
Shane Glover odio velit repudiandae 76.0
Felisa Jaskolski vitae eum pariatur 76.0
Jarvis Ryan suscipit consectetur beatae 76.0
Tamera Bogan doloribus hic corporis 76.0
Kaye Greenfelder odio velit repudiandae 77.0
Almeta Adams animi aperiam tenetur 77.0
Palmira Fay perspiciatis totam perferendis 77.0
Johnny Spinka odio velit repudiandae 77.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>