Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


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