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 43.0
Jewell Kreiger repudiandae officiis qui 73.0
Jewell Swaniawski repudiandae officiis qui 52.0
Joelle Hodkiewicz repudiandae officiis qui 54.0
Johnny Spinka repudiandae officiis qui 61.0
Jon Lindgren repudiandae officiis qui 31.0
Juliana Hauck repudiandae officiis qui 51.0
Kaye Greenfelder repudiandae officiis qui 34.0
Kellie Cassin repudiandae officiis qui 67.0
Lesia Hyatt repudiandae officiis qui 56.0
Li Considine repudiandae officiis qui 45.0
Lillie Hamill repudiandae officiis qui 75.0
Lynell Stamm repudiandae officiis qui 56.0
Malvina Zulauf repudiandae officiis qui 94.0
Marna Ritchie repudiandae officiis qui 76.0
Maryanna Medhurst repudiandae officiis qui 87.0
Micheal Jenkins repudiandae officiis qui 54.0
Milagros Lemke repudiandae officiis qui 66.0
Mi Prosacco repudiandae officiis qui 71.0
Myriam Von repudiandae officiis qui 90.0
Myrtle O'Conner repudiandae officiis qui 89.0
Nelson Leannon repudiandae officiis qui 31.0
Ophelia Hermiston repudiandae officiis qui 52.0
Palmira Fay repudiandae officiis qui 44.0
Pearlie McGlynn repudiandae officiis qui 63.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>