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 45.0
Jewell Swaniawski repudiandae officiis qui 95.0
Joelle Hodkiewicz repudiandae officiis qui 57.0
Johnny Spinka repudiandae officiis qui 64.0
Jon Lindgren repudiandae officiis qui 74.0
Juliana Hauck repudiandae officiis qui 103.0
Kaye Greenfelder repudiandae officiis qui 68.0
Kellie Cassin repudiandae officiis qui 52.0
Lesia Hyatt repudiandae officiis qui 102.0
Li Considine repudiandae officiis qui 64.0
Lillie Hamill repudiandae officiis qui 41.0
Lynell Stamm repudiandae officiis qui 42.0
Malvina Zulauf repudiandae officiis qui 55.0
Marna Ritchie repudiandae officiis qui 58.0
Maryanna Medhurst repudiandae officiis qui 73.0
Micheal Jenkins repudiandae officiis qui 108.0
Milagros Lemke repudiandae officiis qui 38.0
Mi Prosacco repudiandae officiis qui 51.0
Myriam Von repudiandae officiis qui 64.0
Myrtle O'Conner repudiandae officiis qui 107.0
Nelson Leannon repudiandae officiis qui 42.0
Ophelia Hermiston repudiandae officiis qui 64.0
Palmira Fay repudiandae officiis qui 81.0
Pearlie McGlynn repudiandae officiis qui 101.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>