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 66.0
Jewell Kreiger repudiandae officiis qui 81.0
Jewell Swaniawski repudiandae officiis qui 58.0
Joelle Hodkiewicz repudiandae officiis qui 54.0
Johnny Spinka repudiandae officiis qui 73.0
Jon Lindgren repudiandae officiis qui 76.0
Juliana Hauck repudiandae officiis qui 53.0
Kaye Greenfelder repudiandae officiis qui 63.0
Kellie Cassin repudiandae officiis qui 34.0
Lesia Hyatt repudiandae officiis qui 79.0
Li Considine repudiandae officiis qui 99.0
Lillie Hamill repudiandae officiis qui 61.0
Lynell Stamm repudiandae officiis qui 50.0
Malvina Zulauf repudiandae officiis qui 59.0
Marna Ritchie repudiandae officiis qui 56.0
Maryanna Medhurst repudiandae officiis qui 80.0
Micheal Jenkins repudiandae officiis qui 81.0
Milagros Lemke repudiandae officiis qui 92.0
Mi Prosacco repudiandae officiis qui 86.0
Myriam Von repudiandae officiis qui 98.0
Myrtle O'Conner repudiandae officiis qui 53.0
Nelson Leannon repudiandae officiis qui 100.0
Ophelia Hermiston repudiandae officiis qui 111.0
Palmira Fay repudiandae officiis qui 85.0
Pearlie McGlynn repudiandae officiis qui 103.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>