Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Tamera Bogan repudiandae officiis qui 80.0
Gonzalo Blanda perspiciatis totam perferendis 80.0
Cristopher Dooley repudiandae officiis qui 80.0
Awilda Schumm animi aperiam tenetur 79.0
Myriam Von perspiciatis totam perferendis 79.0
Isidro McCullough vitae eum pariatur 79.0
Bong Witting odio velit repudiandae 79.0
Dona Gutkowski repudiandae officiis qui 79.0
Lesia Hyatt repudiandae officiis qui 79.0
Ashleigh Kris perspiciatis totam perferendis 79.0
Raquel Runolfsson saepe hic temporibus 79.0
Raquel Runolfsson odio velit repudiandae 79.0
Maryanna Medhurst vitae eum pariatur 79.0
Crissy Brekke doloribus hic corporis 78.0
Claudette Hagenes doloribus hic corporis 78.0
Joelle Hodkiewicz animi aperiam tenetur 78.0
Vivien Murray doloribus hic corporis 78.0
Joelle Hodkiewicz quibusdam sed sit 78.0
Elli Dietrich suscipit consectetur beatae 78.0
Royce Spencer suscipit consectetur beatae 78.0
Penney Schowalter vitae eum pariatur 78.0
Britney Ruecker animi aperiam tenetur 77.0
Thaddeus Stanton perspiciatis totam perferendis 77.0
Micheal Jenkins quibusdam sed sit 77.0
Vernia Dietrich eum amet quia 77.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>