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 63.0
Dahlia Hilll repudiandae officiis qui 44.0
Dahlia Hilll saepe hic temporibus 34.0
Dahlia Hilll suscipit consectetur beatae 52.0
Dahlia Hilll vitae eum pariatur 44.0
Dania Crona animi aperiam tenetur 32.0
Dania Crona doloribus hic corporis 52.0
Dania Crona eum amet quia 32.0
Dania Crona odio velit repudiandae 105.0
Dania Crona perspiciatis totam perferendis 61.0
Dania Crona quibusdam sed sit 78.0
Dania Crona repudiandae officiis qui 74.0
Dania Crona saepe hic temporibus 57.0
Dania Crona suscipit consectetur beatae 44.0
Dania Crona vitae eum pariatur 65.0
Deja Corkery animi aperiam tenetur 37.0
Deja Corkery doloribus hic corporis 53.0
Deja Corkery eum amet quia 51.0
Deja Corkery odio velit repudiandae 59.0
Deja Corkery perspiciatis totam perferendis 71.0
Deja Corkery quibusdam sed sit 72.0
Deja Corkery repudiandae officiis qui 82.0
Deja Corkery saepe hic temporibus 45.0
Deja Corkery suscipit consectetur beatae 64.0
Deja Corkery vitae eum pariatur 63.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>