Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Jackson Kozey suscipit consectetur beatae 60.0
Claudette Hagenes animi aperiam tenetur 60.0
Isidro McCullough suscipit consectetur beatae 60.0
Isidro McCullough saepe hic temporibus 60.0
Ethyl Ankunding vitae eum pariatur 60.0
Cristopher Dooley animi aperiam tenetur 60.0
Tamera Bogan odio velit repudiandae 60.0
Dania Crona quibusdam sed sit 60.0
Dania Crona animi aperiam tenetur 60.0
Jamison Hagenes vitae eum pariatur 60.0
Wiley Wuckert repudiandae officiis qui 60.0
Gonzalo Blanda animi aperiam tenetur 60.0
Jewell Swaniawski vitae eum pariatur 60.0
Cathey Prohaska suscipit consectetur beatae 60.0
Felisa Jaskolski quibusdam sed sit 61.0
Pearlie McGlynn perspiciatis totam perferendis 61.0
Dahlia Hilll eum amet quia 61.0
Ophelia Hermiston perspiciatis totam perferendis 61.0
Tamika Cronin suscipit consectetur beatae 61.0
Jeanne Witting animi aperiam tenetur 61.0
Rebecca Rempel saepe hic temporibus 61.0
Jamison Hagenes suscipit consectetur beatae 61.0
Nelson Leannon eum amet quia 61.0
Terisa Ruecker odio velit repudiandae 61.0
Myrtle O'Conner saepe hic temporibus 61.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>