Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Bridgett Reilly quibusdam sed sit 95.0
Elsa Goodwin eum amet quia 96.0
Tamika Cronin odio velit repudiandae 96.0
Jeanne Witting animi aperiam tenetur 97.0
Alex Legros perspiciatis totam perferendis 97.0
Ophelia Hermiston doloribus hic corporis 97.0
Adrienne Eichmann suscipit consectetur beatae 97.0
Jamie Stehr suscipit consectetur beatae 98.0
Alise Rolfson doloribus hic corporis 98.0
Thaddeus Stanton vitae eum pariatur 99.0
Tamika Cronin suscipit consectetur beatae 99.0
Elli Dietrich saepe hic temporibus 99.0
Lynell Stamm doloribus hic corporis 100.0
Awilda Schumm repudiandae officiis qui 101.0
Juliana Hauck eum amet quia 101.0
Johnny Spinka animi aperiam tenetur 101.0
Benita Thompson odio velit repudiandae 102.0
Treena Wolf suscipit consectetur beatae 102.0
Almeta Adams odio velit repudiandae 102.0
Royce Spencer vitae eum pariatur 103.0
Beverlee Auer saepe hic temporibus 103.0
Lillie Hamill doloribus hic corporis 103.0
Jarvis Ryan saepe hic temporibus 103.0
Awilda Schumm saepe hic temporibus 103.0
Jon Lindgren odio velit repudiandae 103.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>