Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Salley Kilback vitae eum pariatur 36.0
Marna Ritchie odio velit repudiandae 36.0
Deja Corkery suscipit consectetur beatae 36.0
Ophelia Hermiston vitae eum pariatur 36.0
Bong Witting eum amet quia 36.0
Eleonore Wisozk odio velit repudiandae 36.0
Bridgett Reilly perspiciatis totam perferendis 36.0
Maryanna Medhurst saepe hic temporibus 36.0
Vernia Dietrich doloribus hic corporis 36.0
Vivien Murray suscipit consectetur beatae 36.0
Almeta Adams repudiandae officiis qui 36.0
Awilda Schumm doloribus hic corporis 37.0
Adrienne Eichmann suscipit consectetur beatae 37.0
Sixta Bashirian eum amet quia 37.0
Grace Kris quibusdam sed sit 37.0
Claudette Hagenes doloribus hic corporis 37.0
Jeanne Witting saepe hic temporibus 37.0
Ashleigh Kris vitae eum pariatur 37.0
Alise Rolfson saepe hic temporibus 37.0
Gonzalo Blanda quibusdam sed sit 38.0
Cristopher Dooley doloribus hic corporis 38.0
Palmira Fay eum amet quia 38.0
Palmira Fay saepe hic temporibus 38.0
Tamika Cronin animi aperiam tenetur 38.0
Joelle Hodkiewicz vitae eum pariatur 38.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>