Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Lesia Hyatt perspiciatis totam perferendis 39.0
Royce Spencer quibusdam sed sit 39.0
Thaddeus Stanton vitae eum pariatur 39.0
Huong McKenzie repudiandae officiis qui 39.0
Tami Gibson repudiandae officiis qui 40.0
Cristopher Dooley eum amet quia 40.0
Gwendolyn Satterfield quibusdam sed sit 40.0
Tamika Cronin doloribus hic corporis 40.0
Wen Daniel doloribus hic corporis 40.0
Imelda Heidenreich eum amet quia 40.0
Dorthey Turner suscipit consectetur beatae 40.0
Lesia Hyatt odio velit repudiandae 40.0
Shara Labadie vitae eum pariatur 40.0
Mi Prosacco saepe hic temporibus 40.0
Dahlia Hilll repudiandae officiis qui 41.0
Ethyl Ankunding suscipit consectetur beatae 41.0
Cathey Prohaska odio velit repudiandae 41.0
Elisa Wintheiser eum amet quia 41.0
Mi Prosacco perspiciatis totam perferendis 41.0
Lillie Hamill odio velit repudiandae 41.0
Crissy Brekke vitae eum pariatur 41.0
German Murphy doloribus hic corporis 41.0
Mi Prosacco animi aperiam tenetur 41.0
Felisa Jaskolski doloribus hic corporis 41.0
Verla Friesen doloribus hic corporis 41.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>