Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Treena Wolf eum amet quia 34.0
Kaye Greenfelder repudiandae officiis qui 34.0
Almeta Adams perspiciatis totam perferendis 34.0
Flavia Will vitae eum pariatur 34.0
Rebecca Rempel suscipit consectetur beatae 34.0
Palmira Fay vitae eum pariatur 34.0
Carlota Gottlieb doloribus hic corporis 35.0
Mi Prosacco eum amet quia 35.0
Carlota Gottlieb animi aperiam tenetur 35.0
Beverlee Auer doloribus hic corporis 36.0
Cathey Prohaska odio velit repudiandae 36.0
Alise Rolfson quibusdam sed sit 36.0
Almeta Adams quibusdam sed sit 36.0
Elida Zulauf saepe hic temporibus 36.0
Malvina Zulauf eum amet quia 36.0
Dorthey Turner perspiciatis totam perferendis 36.0
Ashleigh Kris perspiciatis totam perferendis 36.0
Elsa Goodwin odio velit repudiandae 36.0
Blake Hoppe perspiciatis totam perferendis 37.0
Vernia Dietrich saepe hic temporibus 37.0
Dona Gutkowski saepe hic temporibus 37.0
Almeta Adams vitae eum pariatur 37.0
Imelda Heidenreich eum amet quia 37.0
Felisa Jaskolski animi aperiam tenetur 37.0
Juliana Hauck saepe hic temporibus 37.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>