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 79.0
Jewell Kreiger repudiandae officiis qui 66.0
Jewell Swaniawski repudiandae officiis qui 91.0
Joelle Hodkiewicz repudiandae officiis qui 63.0
Johnny Spinka repudiandae officiis qui 90.0
Jon Lindgren repudiandae officiis qui 79.0
Juliana Hauck repudiandae officiis qui 60.0
Kaye Greenfelder repudiandae officiis qui 63.0
Kellie Cassin repudiandae officiis qui 28.0
Lesia Hyatt repudiandae officiis qui 108.0
Li Considine repudiandae officiis qui 95.0
Lillie Hamill repudiandae officiis qui 85.0
Lynell Stamm repudiandae officiis qui 75.0
Malvina Zulauf repudiandae officiis qui 116.0
Marna Ritchie repudiandae officiis qui 62.0
Maryanna Medhurst repudiandae officiis qui 70.0
Micheal Jenkins repudiandae officiis qui 53.0
Milagros Lemke repudiandae officiis qui 35.0
Mi Prosacco repudiandae officiis qui 68.0
Myriam Von repudiandae officiis qui 88.0
Myrtle O'Conner repudiandae officiis qui 49.0
Nelson Leannon repudiandae officiis qui 92.0
Ophelia Hermiston repudiandae officiis qui 60.0
Palmira Fay repudiandae officiis qui 75.0
Pearlie McGlynn repudiandae officiis qui 70.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>