Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Vernia Dietrich saepe hic temporibus 37.0
Almeta Adams vitae eum pariatur 37.0
Imelda Heidenreich eum amet quia 37.0
Jarvis Ryan perspiciatis totam perferendis 37.0
Dona Gutkowski saepe hic temporibus 37.0
Felisa Jaskolski animi aperiam tenetur 37.0
Dahlia Hilll quibusdam sed sit 37.0
Beverlee Auer doloribus hic corporis 36.0
Dorthey Turner perspiciatis totam perferendis 36.0
Ashleigh Kris perspiciatis totam perferendis 36.0
Almeta Adams quibusdam sed sit 36.0
Malvina Zulauf eum amet quia 36.0
Alise Rolfson quibusdam sed sit 36.0
Elsa Goodwin odio velit repudiandae 36.0
Elida Zulauf saepe hic temporibus 36.0
Cathey Prohaska odio velit repudiandae 36.0
Carlota Gottlieb doloribus hic corporis 35.0
Mi Prosacco eum amet quia 35.0
Carlota Gottlieb animi aperiam tenetur 35.0
Brigid McLaughlin animi aperiam tenetur 34.0
Almeta Adams perspiciatis totam perferendis 34.0
Kaye Greenfelder repudiandae officiis qui 34.0
Treena Wolf eum amet quia 34.0
Palmira Fay vitae eum pariatur 34.0
Gwendolyn Satterfield vitae eum pariatur 34.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>