Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Pearlie McGlynn doloribus hic corporis 46.0
Crissy Brekke repudiandae officiis qui 46.0
Salley Kilback vitae eum pariatur 45.0
Deja Corkery saepe hic temporibus 45.0
Wen Daniel suscipit consectetur beatae 45.0
Tami Gibson animi aperiam tenetur 45.0
Rossana Schneider animi aperiam tenetur 45.0
Brigid McLaughlin repudiandae officiis qui 45.0
Treena Wolf odio velit repudiandae 45.0
Wen Daniel eum amet quia 45.0
Jon Lindgren doloribus hic corporis 45.0
Shane Glover quibusdam sed sit 45.0
Vivien Murray repudiandae officiis qui 45.0
Bok Wolf eum amet quia 44.0
Tami Gibson doloribus hic corporis 44.0
Shannon Botsford odio velit repudiandae 44.0
Palmira Fay odio velit repudiandae 44.0
Cherly Kovacek suscipit consectetur beatae 44.0
Dania Crona suscipit consectetur beatae 44.0
Dahlia Hilll eum amet quia 44.0
Bridgett Reilly odio velit repudiandae 44.0
Benita Thompson saepe hic temporibus 44.0
Isidro McCullough suscipit consectetur beatae 44.0
Myrtle O'Conner doloribus hic corporis 44.0
Wiley Wuckert vitae eum pariatur 44.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>