Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Bok Wolf odio velit repudiandae 47.0
Jarvis Ryan perspiciatis totam perferendis 47.0
Rebecca Rempel perspiciatis totam perferendis 47.0
Ophelia Hermiston repudiandae officiis qui 47.0
Imelda Heidenreich odio velit repudiandae 48.0
Jarvis Ryan vitae eum pariatur 48.0
Jewell Swaniawski vitae eum pariatur 48.0
Jamie Stehr quibusdam sed sit 48.0
Malvina Zulauf repudiandae officiis qui 48.0
Vivien Murray saepe hic temporibus 48.0
Benita Thompson eum amet quia 48.0
Brigid McLaughlin eum amet quia 48.0
Adrienne Eichmann repudiandae officiis qui 48.0
Britney Ruecker odio velit repudiandae 48.0
Isidro McCullough eum amet quia 48.0
Elise Waelchi eum amet quia 48.0
Elisa Wintheiser suscipit consectetur beatae 48.0
Gwendolyn Satterfield saepe hic temporibus 48.0
Mi Prosacco animi aperiam tenetur 48.0
Elsa Goodwin saepe hic temporibus 48.0
Cathey Prohaska suscipit consectetur beatae 48.0
Mi Prosacco eum amet quia 49.0
Verla Friesen saepe hic temporibus 49.0
Huong McKenzie quibusdam sed sit 49.0
Lynell Stamm eum amet quia 49.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>