Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Ophelia Hermiston quibusdam sed sit 52.0
Ophelia Hermiston repudiandae officiis qui 64.0
Ophelia Hermiston saepe hic temporibus 46.0
Ophelia Hermiston suscipit consectetur beatae 39.0
Ophelia Hermiston vitae eum pariatur 86.0
Palmira Fay animi aperiam tenetur 61.0
Palmira Fay doloribus hic corporis 74.0
Palmira Fay eum amet quia 58.0
Palmira Fay odio velit repudiandae 77.0
Palmira Fay perspiciatis totam perferendis 77.0
Palmira Fay quibusdam sed sit 54.0
Palmira Fay repudiandae officiis qui 81.0
Palmira Fay saepe hic temporibus 56.0
Palmira Fay suscipit consectetur beatae 90.0
Palmira Fay vitae eum pariatur 104.0
Pearlie McGlynn animi aperiam tenetur 64.0
Pearlie McGlynn doloribus hic corporis 49.0
Pearlie McGlynn eum amet quia 83.0
Pearlie McGlynn odio velit repudiandae 27.0
Pearlie McGlynn perspiciatis totam perferendis 92.0
Pearlie McGlynn quibusdam sed sit 96.0
Pearlie McGlynn repudiandae officiis qui 101.0
Pearlie McGlynn saepe hic temporibus 49.0
Pearlie McGlynn suscipit consectetur beatae 70.0
Pearlie McGlynn vitae eum pariatur 64.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>