Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Joelle Hodkiewicz repudiandae officiis qui 54.0
Shannon Botsford eum amet quia 54.0
Salley Kilback eum amet quia 54.0
Rossana Schneider eum amet quia 54.0
Dona Gutkowski saepe hic temporibus 54.0
Marna Ritchie eum amet quia 54.0
Cathey Prohaska quibusdam sed sit 55.0
Sixta Bashirian quibusdam sed sit 55.0
Treena Wolf odio velit repudiandae 55.0
Elida Zulauf quibusdam sed sit 55.0
Terisa Ruecker doloribus hic corporis 55.0
Cherly Kovacek perspiciatis totam perferendis 55.0
Tamika Cronin saepe hic temporibus 55.0
Almeta Adams repudiandae officiis qui 55.0
Ophelia Hermiston vitae eum pariatur 55.0
Lesia Hyatt quibusdam sed sit 55.0
Gwendolyn Satterfield odio velit repudiandae 55.0
Bok Wolf suscipit consectetur beatae 55.0
Malvina Zulauf doloribus hic corporis 55.0
Royce Spencer repudiandae officiis qui 55.0
Penney Schowalter animi aperiam tenetur 55.0
Jewell Kreiger vitae eum pariatur 55.0
Gwendolyn Satterfield doloribus hic corporis 55.0
Imelda Heidenreich vitae eum pariatur 55.0
Micheal Jenkins animi aperiam tenetur 55.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>