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 animi aperiam tenetur 50.0
Jeanne Witting doloribus hic corporis 54.0
Jeanne Witting eum amet quia 91.0
Jeanne Witting odio velit repudiandae 71.0
Jeanne Witting perspiciatis totam perferendis 80.0
Jeanne Witting quibusdam sed sit 64.0
Jeanne Witting repudiandae officiis qui 43.0
Jeanne Witting saepe hic temporibus 73.0
Jeanne Witting suscipit consectetur beatae 54.0
Jeanne Witting vitae eum pariatur 63.0
Jewell Kreiger animi aperiam tenetur 69.0
Jewell Kreiger doloribus hic corporis 71.0
Jewell Kreiger eum amet quia 47.0
Jewell Kreiger odio velit repudiandae 83.0
Jewell Kreiger perspiciatis totam perferendis 33.0
Jewell Kreiger quibusdam sed sit 46.0
Jewell Kreiger repudiandae officiis qui 73.0
Jewell Kreiger saepe hic temporibus 59.0
Jewell Kreiger suscipit consectetur beatae 111.0
Jewell Kreiger vitae eum pariatur 68.0
Jewell Swaniawski animi aperiam tenetur 47.0
Jewell Swaniawski doloribus hic corporis 58.0
Jewell Swaniawski eum amet quia 48.0
Jewell Swaniawski odio velit repudiandae 88.0
Jewell Swaniawski perspiciatis totam perferendis 83.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>