Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Tamika Cronin saepe hic temporibus 42.0
Marna Ritchie saepe hic temporibus 42.0
Nelson Leannon perspiciatis totam perferendis 42.0
Johnny Spinka odio velit repudiandae 42.0
Jeanne Witting suscipit consectetur beatae 42.0
Sylvester Hane eum amet quia 42.0
Elsa Goodwin saepe hic temporibus 42.0
Mi Prosacco suscipit consectetur beatae 42.0
Alise Rolfson quibusdam sed sit 42.0
Nelson Leannon repudiandae officiis qui 42.0
Lynell Stamm repudiandae officiis qui 42.0
Bridgett Reilly vitae eum pariatur 42.0
Gwendolyn Satterfield animi aperiam tenetur 42.0
Felisa Jaskolski vitae eum pariatur 42.0
Brigid McLaughlin repudiandae officiis qui 42.0
Joelle Hodkiewicz vitae eum pariatur 42.0
Vivien Murray eum amet quia 41.0
Clifton Hintz eum amet quia 41.0
Thaddeus Stanton quibusdam sed sit 41.0
Huong McKenzie doloribus hic corporis 41.0
Claudette Hagenes quibusdam sed sit 41.0
German Murphy quibusdam sed sit 41.0
Lillie Hamill repudiandae officiis qui 41.0
Cathey Prohaska repudiandae officiis qui 41.0
Johnny Spinka eum amet quia 41.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>