Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Dahlia Hilll quibusdam sed sit 56.0
Dahlia Hilll repudiandae officiis qui 41.0
Dahlia Hilll saepe hic temporibus 109.0
Dahlia Hilll suscipit consectetur beatae 53.0
Dahlia Hilll vitae eum pariatur 58.0
Dania Crona animi aperiam tenetur 60.0
Dania Crona doloribus hic corporis 65.0
Dania Crona eum amet quia 67.0
Dania Crona odio velit repudiandae 59.0
Dania Crona perspiciatis totam perferendis 65.0
Dania Crona quibusdam sed sit 60.0
Dania Crona repudiandae officiis qui 58.0
Dania Crona saepe hic temporibus 76.0
Dania Crona suscipit consectetur beatae 33.0
Dania Crona vitae eum pariatur 53.0
Deja Corkery animi aperiam tenetur 50.0
Deja Corkery doloribus hic corporis 32.0
Deja Corkery eum amet quia 52.0
Deja Corkery odio velit repudiandae 51.0
Deja Corkery perspiciatis totam perferendis 88.0
Deja Corkery quibusdam sed sit 44.0
Deja Corkery repudiandae officiis qui 69.0
Deja Corkery saepe hic temporibus 68.0
Deja Corkery suscipit consectetur beatae 50.0
Deja Corkery vitae eum pariatur 72.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>