Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Benita Thompson vitae eum pariatur 36.0
Clifton Hintz animi aperiam tenetur 36.0
Elli Dietrich vitae eum pariatur 36.0
Treena Wolf doloribus hic corporis 36.0
Carlota Gottlieb eum amet quia 36.0
Jackson Kozey eum amet quia 36.0
Adrienne Eichmann quibusdam sed sit 37.0
Elise Waelchi saepe hic temporibus 37.0
Nelson Leannon vitae eum pariatur 37.0
Jarvis Ryan animi aperiam tenetur 37.0
Imelda Heidenreich quibusdam sed sit 37.0
Tess Nikolaus doloribus hic corporis 37.0
Jeanne Witting eum amet quia 37.0
Deja Corkery eum amet quia 37.0
Sylvester Hane suscipit consectetur beatae 37.0
Jewell Swaniawski saepe hic temporibus 37.0
Deja Corkery perspiciatis totam perferendis 38.0
Dania Crona odio velit repudiandae 38.0
Elida Zulauf repudiandae officiis qui 38.0
Terisa Ruecker odio velit repudiandae 38.0
Clifton Hintz doloribus hic corporis 38.0
Sylvester Hane quibusdam sed sit 38.0
Milagros Lemke repudiandae officiis qui 38.0
Penney Schowalter suscipit consectetur beatae 38.0
Elli Dietrich doloribus hic corporis 38.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>