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 36.0
Wen Daniel repudiandae officiis qui 57.0
Wen Daniel saepe hic temporibus 71.0
Wen Daniel suscipit consectetur beatae 45.0
Wen Daniel vitae eum pariatur 75.0
Wiley Wuckert animi aperiam tenetur 91.0
Wiley Wuckert doloribus hic corporis 59.0
Wiley Wuckert eum amet quia 52.0
Wiley Wuckert odio velit repudiandae 64.0
Wiley Wuckert perspiciatis totam perferendis 73.0
Wiley Wuckert quibusdam sed sit 53.0
Wiley Wuckert repudiandae officiis qui 58.0
Wiley Wuckert saepe hic temporibus 71.0
Wiley Wuckert suscipit consectetur beatae 63.0
Wiley Wuckert vitae eum pariatur 44.0
Winfred Franecki animi aperiam tenetur 59.0
Winfred Franecki doloribus hic corporis 60.0
Winfred Franecki eum amet quia 62.0
Winfred Franecki odio velit repudiandae 58.0
Winfred Franecki perspiciatis totam perferendis 49.0
Winfred Franecki quibusdam sed sit 78.0
Winfred Franecki repudiandae officiis qui 49.0
Winfred Franecki saepe hic temporibus 46.0
Winfred Franecki suscipit consectetur beatae 69.0
Winfred Franecki vitae eum pariatur 67.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>