Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Brigid McLaughlin odio velit repudiandae 55.0
Bong Witting perspiciatis totam perferendis 55.0
Juliana Hauck doloribus hic corporis 55.0
Malvina Zulauf saepe hic temporibus 55.0
Maryanna Medhurst saepe hic temporibus 55.0
Marna Ritchie perspiciatis totam perferendis 55.0
Verla Friesen repudiandae officiis qui 55.0
Cherly Kovacek perspiciatis totam perferendis 55.0
Johnny Spinka perspiciatis totam perferendis 55.0
Elli Dietrich suscipit consectetur beatae 55.0
Ethyl Ankunding saepe hic temporibus 55.0
Elsa Goodwin quibusdam sed sit 56.0
Juliana Hauck quibusdam sed sit 56.0
Brigid McLaughlin animi aperiam tenetur 56.0
Elli Dietrich perspiciatis totam perferendis 56.0
Sixta Bashirian repudiandae officiis qui 56.0
Benita Thompson doloribus hic corporis 56.0
Claudette Hagenes perspiciatis totam perferendis 56.0
Wen Daniel doloribus hic corporis 56.0
Malvina Zulauf odio velit repudiandae 56.0
Huong McKenzie animi aperiam tenetur 56.0
Reinaldo Heidenreich doloribus hic corporis 56.0
Jarvis Ryan odio velit repudiandae 56.0
Verla Friesen suscipit consectetur beatae 56.0
Lesia Hyatt perspiciatis totam perferendis 56.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>