Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Cathey Prohaska quibusdam sed sit 55.0
Bok Wolf suscipit consectetur beatae 55.0
Gwendolyn Satterfield doloribus hic corporis 55.0
Tamika Cronin saepe hic temporibus 55.0
Royce Spencer repudiandae officiis qui 55.0
Elida Zulauf quibusdam sed sit 55.0
Terisa Ruecker doloribus hic corporis 55.0
Sixta Bashirian quibusdam sed sit 55.0
Almeta Adams repudiandae officiis qui 55.0
Lesia Hyatt quibusdam sed sit 55.0
Gwendolyn Satterfield odio velit repudiandae 55.0
Cherly Kovacek perspiciatis totam perferendis 55.0
Treena Wolf odio velit repudiandae 55.0
Penney Schowalter animi aperiam tenetur 55.0
Imelda Heidenreich vitae eum pariatur 55.0
Micheal Jenkins animi aperiam tenetur 55.0
Jewell Kreiger vitae eum pariatur 55.0
Kaye Greenfelder eum amet quia 55.0
Ophelia Hermiston vitae eum pariatur 55.0
Myrtle O'Conner doloribus hic corporis 54.0
Elsa Goodwin eum amet quia 54.0
Jon Lindgren odio velit repudiandae 54.0
Milagros Lemke quibusdam sed sit 54.0
Treena Wolf eum amet quia 54.0
Joelle Hodkiewicz eum amet quia 54.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>