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 quibusdam sed sit 64.0
Tess Nikolaus doloribus hic corporis 64.0
Wiley Wuckert odio velit repudiandae 65.0
Marna Ritchie doloribus hic corporis 65.0
Arnita Smith odio velit repudiandae 65.0
Kellie Cassin animi aperiam tenetur 65.0
Tess Nikolaus animi aperiam tenetur 65.0
Shara Labadie perspiciatis totam perferendis 65.0
Huong McKenzie doloribus hic corporis 65.0
Carlota Gottlieb saepe hic temporibus 65.0
Almeta Adams suscipit consectetur beatae 65.0
Penney Schowalter perspiciatis totam perferendis 65.0
Britney Ruecker doloribus hic corporis 65.0
Shane Glover vitae eum pariatur 65.0
Nelson Leannon odio velit repudiandae 65.0
Awilda Schumm doloribus hic corporis 65.0
Elli Dietrich repudiandae officiis qui 65.0
Carlota Gottlieb vitae eum pariatur 65.0
Verla Friesen quibusdam sed sit 65.0
Cherly Kovacek animi aperiam tenetur 65.0
Blake Hoppe quibusdam sed sit 66.0
Carlota Gottlieb eum amet quia 66.0
Treena Wolf perspiciatis totam perferendis 66.0
Shannon Botsford odio velit repudiandae 66.0
Tamera Bogan odio velit repudiandae 66.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>