Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Verla Friesen odio velit repudiandae 85.0
Isidro McCullough repudiandae officiis qui 85.0
Desmond Murray saepe hic temporibus 85.0
German Murphy saepe hic temporibus 85.0
Bong Witting odio velit repudiandae 85.0
Ophelia Hermiston suscipit consectetur beatae 85.0
Cherly Kovacek repudiandae officiis qui 85.0
Cristopher Dooley suscipit consectetur beatae 85.0
Adrienne Eichmann vitae eum pariatur 85.0
Eleonore Wisozk animi aperiam tenetur 84.0
Juliana Hauck perspiciatis totam perferendis 84.0
Jarvis Ryan suscipit consectetur beatae 84.0
Crissy Brekke perspiciatis totam perferendis 84.0
Dona Gutkowski perspiciatis totam perferendis 84.0
Jamie Stehr animi aperiam tenetur 84.0
Milagros Lemke suscipit consectetur beatae 84.0
Dania Crona vitae eum pariatur 84.0
Jackson Kozey animi aperiam tenetur 84.0
Awilda Schumm quibusdam sed sit 84.0
Vernia Dietrich doloribus hic corporis 84.0
Shane Glover suscipit consectetur beatae 84.0
Britney Ruecker saepe hic temporibus 84.0
Evangelina Pfeffer quibusdam sed sit 84.0
Lesia Hyatt saepe hic temporibus 84.0
Royce Spencer suscipit consectetur beatae 84.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>