Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Jeanne Witting quibusdam sed sit 50.0
Jewell Kreiger quibusdam sed sit 65.0
Jewell Swaniawski quibusdam sed sit 97.0
Joelle Hodkiewicz quibusdam sed sit 78.0
Johnny Spinka quibusdam sed sit 14.0
Jon Lindgren quibusdam sed sit 45.0
Juliana Hauck quibusdam sed sit 70.0
Kaye Greenfelder quibusdam sed sit 37.0
Kellie Cassin quibusdam sed sit 39.0
Lesia Hyatt quibusdam sed sit 55.0
Li Considine quibusdam sed sit 81.0
Lillie Hamill quibusdam sed sit 50.0
Lynell Stamm quibusdam sed sit 45.0
Malvina Zulauf quibusdam sed sit 105.0
Marna Ritchie quibusdam sed sit 35.0
Maryanna Medhurst quibusdam sed sit 114.0
Micheal Jenkins quibusdam sed sit 77.0
Milagros Lemke quibusdam sed sit 54.0
Mi Prosacco quibusdam sed sit 28.0
Myriam Von quibusdam sed sit 86.0
Myrtle O'Conner quibusdam sed sit 77.0
Nelson Leannon quibusdam sed sit 68.0
Ophelia Hermiston quibusdam sed sit 107.0
Palmira Fay quibusdam sed sit 44.0
Pearlie McGlynn quibusdam sed sit 25.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>