Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Carlota Gottlieb animi aperiam tenetur 35.0
Carlota Gottlieb doloribus hic corporis 35.0
Carlota Gottlieb eum amet quia 66.0
Carlota Gottlieb odio velit repudiandae 40.0
Carlota Gottlieb perspiciatis totam perferendis 105.0
Carlota Gottlieb quibusdam sed sit 50.0
Carlota Gottlieb repudiandae officiis qui 70.0
Carlota Gottlieb saepe hic temporibus 65.0
Carlota Gottlieb suscipit consectetur beatae 81.0
Carlota Gottlieb vitae eum pariatur 65.0
Cathey Prohaska animi aperiam tenetur 81.0
Cathey Prohaska doloribus hic corporis 80.0
Cathey Prohaska eum amet quia 68.0
Cathey Prohaska odio velit repudiandae 36.0
Cathey Prohaska perspiciatis totam perferendis 98.0
Cathey Prohaska quibusdam sed sit 79.0
Cathey Prohaska repudiandae officiis qui 49.0
Cathey Prohaska saepe hic temporibus 94.0
Cathey Prohaska suscipit consectetur beatae 63.0
Cathey Prohaska vitae eum pariatur 64.0
Cherly Kovacek animi aperiam tenetur 65.0
Cherly Kovacek doloribus hic corporis 53.0
Cherly Kovacek eum amet quia 90.0
Cherly Kovacek odio velit repudiandae 48.0
Cherly Kovacek perspiciatis totam perferendis 33.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>