Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Wen Daniel quibusdam sed sit 58.0
Wen Daniel repudiandae officiis qui 33.0
Wen Daniel saepe hic temporibus 51.0
Wen Daniel suscipit consectetur beatae 57.0
Wen Daniel vitae eum pariatur 65.0
Wiley Wuckert animi aperiam tenetur 59.0
Wiley Wuckert doloribus hic corporis 58.0
Wiley Wuckert eum amet quia 53.0
Wiley Wuckert odio velit repudiandae 27.0
Wiley Wuckert perspiciatis totam perferendis 74.0
Wiley Wuckert quibusdam sed sit 56.0
Wiley Wuckert repudiandae officiis qui 60.0
Wiley Wuckert saepe hic temporibus 74.0
Wiley Wuckert suscipit consectetur beatae 46.0
Wiley Wuckert vitae eum pariatur 99.0
Winfred Franecki animi aperiam tenetur 76.0
Winfred Franecki doloribus hic corporis 32.0
Winfred Franecki eum amet quia 82.0
Winfred Franecki odio velit repudiandae 105.0
Winfred Franecki perspiciatis totam perferendis 83.0
Winfred Franecki quibusdam sed sit 46.0
Winfred Franecki repudiandae officiis qui 84.0
Winfred Franecki saepe hic temporibus 61.0
Winfred Franecki suscipit consectetur beatae 65.0
Winfred Franecki vitae eum pariatur 26.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>