Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Cathey Prohaska vitae eum pariatur 71.0
Tami Gibson quibusdam sed sit 71.0
Reinaldo Heidenreich saepe hic temporibus 71.0
Bok Wolf animi aperiam tenetur 71.0
Jackson Kozey saepe hic temporibus 71.0
Gwendolyn Satterfield animi aperiam tenetur 71.0
Arnita Smith repudiandae officiis qui 71.0
Gonzalo Blanda odio velit repudiandae 71.0
Bong Witting repudiandae officiis qui 71.0
Salley Kilback animi aperiam tenetur 71.0
Dahlia Hilll repudiandae officiis qui 71.0
Jewell Kreiger vitae eum pariatur 71.0
Ophelia Hermiston animi aperiam tenetur 71.0
Jamison Hagenes repudiandae officiis qui 71.0
Adrienne Eichmann vitae eum pariatur 71.0
Grace Kris doloribus hic corporis 71.0
Tess Nikolaus odio velit repudiandae 71.0
Rossana Schneider eum amet quia 71.0
Evangelina Pfeffer perspiciatis totam perferendis 71.0
Jewell Swaniawski quibusdam sed sit 71.0
Li Considine eum amet quia 71.0
Rossana Schneider suscipit consectetur beatae 70.0
Mi Prosacco quibusdam sed sit 70.0
Britney Ruecker eum amet quia 70.0
Blake Hoppe eum amet quia 70.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>