Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Myriam Von repudiandae officiis qui 88.0
Elise Waelchi odio velit repudiandae 88.0
Salley Kilback doloribus hic corporis 88.0
Flavia Will doloribus hic corporis 88.0
Shannon Botsford eum amet quia 88.0
Bok Wolf doloribus hic corporis 88.0
Benita Thompson repudiandae officiis qui 88.0
Joelle Hodkiewicz animi aperiam tenetur 89.0
Jamison Hagenes vitae eum pariatur 89.0
Jeanne Witting saepe hic temporibus 89.0
Terisa Ruecker repudiandae officiis qui 89.0
Adrienne Eichmann odio velit repudiandae 89.0
Verla Friesen saepe hic temporibus 90.0
Grace Kris quibusdam sed sit 90.0
Crissy Brekke saepe hic temporibus 90.0
Felisa Jaskolski quibusdam sed sit 90.0
Johnny Spinka repudiandae officiis qui 90.0
Lesia Hyatt doloribus hic corporis 90.0
Dorthey Turner odio velit repudiandae 90.0
Sylvester Hane repudiandae officiis qui 90.0
Wiley Wuckert animi aperiam tenetur 91.0
Alise Rolfson odio velit repudiandae 91.0
Blake Hoppe eum amet quia 91.0
Jewell Swaniawski repudiandae officiis qui 91.0
Lillie Hamill suscipit consectetur beatae 92.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>