Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Crissy Brekke repudiandae officiis qui 72.0
Gonzalo Blanda vitae eum pariatur 72.0
Awilda Schumm doloribus hic corporis 72.0
Benita Thompson doloribus hic corporis 72.0
Deja Corkery vitae eum pariatur 72.0
Imelda Heidenreich eum amet quia 72.0
Elisa Wintheiser suscipit consectetur beatae 72.0
Elsa Goodwin odio velit repudiandae 72.0
Desmond Murray suscipit consectetur beatae 72.0
Shara Labadie quibusdam sed sit 72.0
Desmond Murray perspiciatis totam perferendis 72.0
Salley Kilback saepe hic temporibus 72.0
Eleonore Wisozk perspiciatis totam perferendis 72.0
Mi Prosacco perspiciatis totam perferendis 72.0
Kellie Cassin perspiciatis totam perferendis 73.0
Isidro McCullough repudiandae officiis qui 73.0
Jeanne Witting odio velit repudiandae 73.0
Maryanna Medhurst repudiandae officiis qui 73.0
Benita Thompson suscipit consectetur beatae 73.0
Tess Nikolaus odio velit repudiandae 73.0
Huong McKenzie quibusdam sed sit 73.0
Salley Kilback perspiciatis totam perferendis 73.0
Tamera Bogan suscipit consectetur beatae 73.0
Reinaldo Heidenreich saepe hic temporibus 73.0
Ashleigh Kris vitae eum pariatur 73.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>