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 37.0
Dahlia Hilll repudiandae officiis qui 69.0
Dahlia Hilll saepe hic temporibus 55.0
Dahlia Hilll suscipit consectetur beatae 82.0
Dahlia Hilll vitae eum pariatur 56.0
Dania Crona animi aperiam tenetur 43.0
Dania Crona doloribus hic corporis 85.0
Dania Crona eum amet quia 55.0
Dania Crona odio velit repudiandae 66.0
Dania Crona perspiciatis totam perferendis 94.0
Dania Crona quibusdam sed sit 59.0
Dania Crona repudiandae officiis qui 58.0
Dania Crona saepe hic temporibus 95.0
Dania Crona suscipit consectetur beatae 88.0
Dania Crona vitae eum pariatur 84.0
Deja Corkery animi aperiam tenetur 31.0
Deja Corkery doloribus hic corporis 49.0
Deja Corkery eum amet quia 61.0
Deja Corkery odio velit repudiandae 75.0
Deja Corkery perspiciatis totam perferendis 61.0
Deja Corkery quibusdam sed sit 52.0
Deja Corkery repudiandae officiis qui 70.0
Deja Corkery saepe hic temporibus 73.0
Deja Corkery suscipit consectetur beatae 42.0
Deja Corkery vitae eum pariatur 56.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>