Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Blake Hoppe odio velit repudiandae 63.0
Ashleigh Kris vitae eum pariatur 63.0
Brigid McLaughlin odio velit repudiandae 63.0
Tami Gibson eum amet quia 63.0
Malvina Zulauf doloribus hic corporis 63.0
Lynell Stamm suscipit consectetur beatae 63.0
Eleonore Wisozk odio velit repudiandae 63.0
Jeanne Witting vitae eum pariatur 63.0
Wen Daniel saepe hic temporibus 63.0
Jon Lindgren vitae eum pariatur 63.0
Britney Ruecker quibusdam sed sit 63.0
German Murphy odio velit repudiandae 63.0
Awilda Schumm eum amet quia 63.0
Li Considine vitae eum pariatur 63.0
Cathey Prohaska suscipit consectetur beatae 63.0
Beverlee Auer repudiandae officiis qui 62.0
Milagros Lemke saepe hic temporibus 62.0
Terisa Ruecker doloribus hic corporis 62.0
Tamera Bogan suscipit consectetur beatae 62.0
Palmira Fay quibusdam sed sit 62.0
Huong McKenzie suscipit consectetur beatae 62.0
Sylvester Hane quibusdam sed sit 62.0
Johnny Spinka saepe hic temporibus 62.0
Pearlie McGlynn vitae eum pariatur 62.0
Thaddeus Stanton animi aperiam tenetur 62.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>