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 repudiandae officiis qui 63.0
Jewell Kreiger repudiandae officiis qui 83.0
Jewell Swaniawski repudiandae officiis qui 75.0
Joelle Hodkiewicz repudiandae officiis qui 60.0
Johnny Spinka repudiandae officiis qui 59.0
Jon Lindgren repudiandae officiis qui 52.0
Juliana Hauck repudiandae officiis qui 73.0
Kaye Greenfelder repudiandae officiis qui 100.0
Kellie Cassin repudiandae officiis qui 85.0
Lesia Hyatt repudiandae officiis qui 52.0
Li Considine repudiandae officiis qui 54.0
Lillie Hamill repudiandae officiis qui 68.0
Lynell Stamm repudiandae officiis qui 78.0
Malvina Zulauf repudiandae officiis qui 48.0
Marna Ritchie repudiandae officiis qui 39.0
Maryanna Medhurst repudiandae officiis qui 50.0
Micheal Jenkins repudiandae officiis qui 59.0
Milagros Lemke repudiandae officiis qui 55.0
Mi Prosacco repudiandae officiis qui 64.0
Myriam Von repudiandae officiis qui 62.0
Myrtle O'Conner repudiandae officiis qui 62.0
Nelson Leannon repudiandae officiis qui 68.0
Ophelia Hermiston repudiandae officiis qui 47.0
Palmira Fay repudiandae officiis qui 44.0
Pearlie McGlynn repudiandae officiis qui 53.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>