Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Malvina Zulauf animi aperiam tenetur 61.0
Jamison Hagenes suscipit consectetur beatae 61.0
Dona Gutkowski suscipit consectetur beatae 61.0
Winfred Franecki saepe hic temporibus 61.0
Ophelia Hermiston perspiciatis totam perferendis 61.0
Pearlie McGlynn perspiciatis totam perferendis 61.0
Rebecca Rempel saepe hic temporibus 61.0
Nelson Leannon eum amet quia 61.0
Lillie Hamill repudiandae officiis qui 61.0
Felisa Jaskolski quibusdam sed sit 61.0
Dahlia Hilll eum amet quia 61.0
Brigid McLaughlin odio velit repudiandae 60.0
Cathey Prohaska suscipit consectetur beatae 60.0
Lynell Stamm perspiciatis totam perferendis 60.0
Isidro McCullough saepe hic temporibus 60.0
Tamera Bogan odio velit repudiandae 60.0
Wiley Wuckert repudiandae officiis qui 60.0
Isidro McCullough suscipit consectetur beatae 60.0
Ophelia Hermiston saepe hic temporibus 60.0
Brigid McLaughlin vitae eum pariatur 60.0
Bridgett Reilly eum amet quia 60.0
Jeanne Witting suscipit consectetur beatae 60.0
Dania Crona quibusdam sed sit 60.0
Cristopher Dooley animi aperiam tenetur 60.0
Jewell Swaniawski vitae eum pariatur 60.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>