Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Elenora Brakus doloribus hic corporis 77.0
Shara Labadie eum amet quia 76.0
Brigid McLaughlin doloribus hic corporis 76.0
Johnny Spinka vitae eum pariatur 76.0
Terisa Ruecker odio velit repudiandae 76.0
Marna Ritchie repudiandae officiis qui 76.0
Shannon Botsford animi aperiam tenetur 76.0
Terisa Ruecker quibusdam sed sit 76.0
Rebecca Rempel quibusdam sed sit 76.0
Shannon Botsford vitae eum pariatur 76.0
Micheal Jenkins quibusdam sed sit 76.0
Eleonore Wisozk suscipit consectetur beatae 76.0
Dona Gutkowski odio velit repudiandae 75.0
Isidro McCullough eum amet quia 75.0
Terisa Ruecker perspiciatis totam perferendis 75.0
Deja Corkery odio velit repudiandae 75.0
Jamison Hagenes animi aperiam tenetur 75.0
Vernia Dietrich quibusdam sed sit 75.0
Elsa Goodwin repudiandae officiis qui 75.0
Dona Gutkowski suscipit consectetur beatae 75.0
Shara Labadie animi aperiam tenetur 75.0
Tami Gibson quibusdam sed sit 75.0
Nelson Leannon animi aperiam tenetur 75.0
Lillie Hamill repudiandae officiis qui 75.0
Micheal Jenkins vitae eum pariatur 75.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>