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 animi aperiam tenetur 49.0
Gonzalo Blanda suscipit consectetur beatae 49.0
Verla Friesen saepe hic temporibus 49.0
Shannon Botsford doloribus hic corporis 49.0
Isidro McCullough eum amet quia 48.0
Adrienne Eichmann repudiandae officiis qui 48.0
Elsa Goodwin saepe hic temporibus 48.0
Gwendolyn Satterfield saepe hic temporibus 48.0
Jamie Stehr quibusdam sed sit 48.0
Vivien Murray saepe hic temporibus 48.0
Mi Prosacco animi aperiam tenetur 48.0
Cathey Prohaska suscipit consectetur beatae 48.0
Elisa Wintheiser suscipit consectetur beatae 48.0
Benita Thompson eum amet quia 48.0
Brigid McLaughlin eum amet quia 48.0
Elise Waelchi eum amet quia 48.0
Imelda Heidenreich odio velit repudiandae 48.0
Jarvis Ryan vitae eum pariatur 48.0
Jewell Swaniawski vitae eum pariatur 48.0
Britney Ruecker odio velit repudiandae 48.0
Malvina Zulauf repudiandae officiis qui 48.0
Vernia Dietrich odio velit repudiandae 47.0
Benita Thompson perspiciatis totam perferendis 47.0
Bok Wolf odio velit repudiandae 47.0
Tess Nikolaus repudiandae officiis qui 47.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>