Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Elenora Brakus quibusdam sed sit 69.0
Carlota Gottlieb quibusdam sed sit 69.0
Bong Witting quibusdam sed sit 69.0
Verla Friesen perspiciatis totam perferendis 69.0
Kellie Cassin saepe hic temporibus 69.0
Desmond Murray perspiciatis totam perferendis 69.0
Sixta Bashirian saepe hic temporibus 69.0
Beverlee Auer perspiciatis totam perferendis 69.0
Almeta Adams perspiciatis totam perferendis 69.0
Adrienne Eichmann suscipit consectetur beatae 69.0
Bridgett Reilly suscipit consectetur beatae 69.0
Jewell Swaniawski odio velit repudiandae 69.0
German Murphy suscipit consectetur beatae 69.0
Kellie Cassin suscipit consectetur beatae 69.0
Maryanna Medhurst suscipit consectetur beatae 69.0
Nelson Leannon doloribus hic corporis 69.0
Kellie Cassin doloribus hic corporis 69.0
Jamie Stehr doloribus hic corporis 69.0
Pearlie McGlynn vitae eum pariatur 69.0
Juliana Hauck quibusdam sed sit 70.0
Evangelina Pfeffer repudiandae officiis qui 70.0
Flavia Will suscipit consectetur beatae 70.0
Rebecca Rempel repudiandae officiis qui 70.0
Myrtle O'Conner suscipit consectetur beatae 70.0
Penney Schowalter saepe hic temporibus 71.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>