Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Cathey Prohaska quibusdam sed sit 30.0
Almeta Adams eum amet quia 30.0
Myriam Von animi aperiam tenetur 30.0
Jewell Swaniawski doloribus hic corporis 30.0
Elise Waelchi doloribus hic corporis 31.0
Sixta Bashirian quibusdam sed sit 31.0
Elida Zulauf odio velit repudiandae 31.0
Dona Gutkowski doloribus hic corporis 31.0
Felisa Jaskolski doloribus hic corporis 31.0
Treena Wolf quibusdam sed sit 31.0
Cherly Kovacek saepe hic temporibus 31.0
Cherly Kovacek vitae eum pariatur 31.0
Li Considine eum amet quia 31.0
Dania Crona eum amet quia 32.0
Dania Crona animi aperiam tenetur 32.0
Thaddeus Stanton repudiandae officiis qui 32.0
Shara Labadie eum amet quia 32.0
Claudette Hagenes doloribus hic corporis 32.0
Kellie Cassin vitae eum pariatur 32.0
Crissy Brekke eum amet quia 32.0
Myriam Von perspiciatis totam perferendis 32.0
Huong McKenzie quibusdam sed sit 33.0
Palmira Fay suscipit consectetur beatae 33.0
Grace Kris repudiandae officiis qui 33.0
Cathey Prohaska eum amet quia 33.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>