Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Johnny Spinka saepe hic temporibus 84.0
Tami Gibson quibusdam sed sit 84.0
Bong Witting perspiciatis totam perferendis 84.0
Winfred Franecki repudiandae officiis qui 84.0
Pearlie McGlynn odio velit repudiandae 84.0
Milagros Lemke perspiciatis totam perferendis 84.0
Cathey Prohaska animi aperiam tenetur 84.0
Elli Dietrich doloribus hic corporis 84.0
Jewell Swaniawski eum amet quia 84.0
Thaddeus Stanton suscipit consectetur beatae 84.0
Lillie Hamill animi aperiam tenetur 83.0
Winfred Franecki perspiciatis totam perferendis 83.0
Awilda Schumm repudiandae officiis qui 83.0
Benita Thompson quibusdam sed sit 83.0
Royce Spencer perspiciatis totam perferendis 83.0
Bok Wolf odio velit repudiandae 83.0
Flavia Will doloribus hic corporis 83.0
Carlota Gottlieb animi aperiam tenetur 83.0
Palmira Fay saepe hic temporibus 82.0
Jeanne Witting saepe hic temporibus 82.0
Winfred Franecki eum amet quia 82.0
Sixta Bashirian vitae eum pariatur 82.0
Tess Nikolaus animi aperiam tenetur 82.0
Johnny Spinka suscipit consectetur beatae 82.0
Elli Dietrich vitae eum pariatur 82.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>