Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Li Considine doloribus hic corporis 49.0
Jamison Hagenes saepe hic temporibus 49.0
Nelson Leannon quibusdam sed sit 49.0
Winfred Franecki repudiandae officiis qui 49.0
Jeanne Witting perspiciatis totam perferendis 49.0
Alex Legros saepe hic temporibus 49.0
Vernia Dietrich quibusdam sed sit 49.0
Pearlie McGlynn odio velit repudiandae 49.0
Tamika Cronin eum amet quia 50.0
Clifton Hintz perspiciatis totam perferendis 50.0
Jon Lindgren animi aperiam tenetur 50.0
Rebecca Rempel saepe hic temporibus 50.0
Cathey Prohaska odio velit repudiandae 50.0
Lynell Stamm vitae eum pariatur 50.0
Rossana Schneider saepe hic temporibus 50.0
Wen Daniel animi aperiam tenetur 50.0
Jewell Swaniawski quibusdam sed sit 50.0
Li Considine quibusdam sed sit 50.0
Jamison Hagenes repudiandae officiis qui 50.0
Blake Hoppe animi aperiam tenetur 50.0
Claudette Hagenes animi aperiam tenetur 50.0
Tami Gibson quibusdam sed sit 50.0
Grace Kris doloribus hic corporis 50.0
Marna Ritchie eum amet quia 50.0
Awilda Schumm suscipit consectetur beatae 50.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>