Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Cherly Kovacek saepe hic temporibus 62.0
Milagros Lemke saepe hic temporibus 62.0
Beverlee Auer repudiandae officiis qui 62.0
Tamera Bogan suscipit consectetur beatae 62.0
Treena Wolf quibusdam sed sit 62.0
Sylvester Hane quibusdam sed sit 62.0
Shara Labadie saepe hic temporibus 62.0
Palmira Fay quibusdam sed sit 62.0
Johnny Spinka eum amet quia 62.0
Nelson Leannon eum amet quia 62.0
Brigid McLaughlin odio velit repudiandae 63.0
Cathey Prohaska suscipit consectetur beatae 63.0
Lynell Stamm suscipit consectetur beatae 63.0
Britney Ruecker quibusdam sed sit 63.0
German Murphy odio velit repudiandae 63.0
Eleonore Wisozk odio velit repudiandae 63.0
Blake Hoppe odio velit repudiandae 63.0
German Murphy quibusdam sed sit 63.0
Tami Gibson eum amet quia 63.0
Kaye Greenfelder quibusdam sed sit 63.0
Wen Daniel saepe hic temporibus 63.0
Ashleigh Kris vitae eum pariatur 63.0
Beverlee Auer vitae eum pariatur 63.0
Tamika Cronin quibusdam sed sit 63.0
Awilda Schumm eum amet quia 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>