Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Vernia Dietrich animi aperiam tenetur 63.0
Vernia Dietrich doloribus hic corporis 43.0
Vernia Dietrich eum amet quia 84.0
Vernia Dietrich odio velit repudiandae 55.0
Vernia Dietrich perspiciatis totam perferendis 52.0
Vernia Dietrich quibusdam sed sit 79.0
Vernia Dietrich repudiandae officiis qui 75.0
Vernia Dietrich saepe hic temporibus 68.0
Vernia Dietrich suscipit consectetur beatae 59.0
Vernia Dietrich vitae eum pariatur 62.0
Vivien Murray animi aperiam tenetur 67.0
Vivien Murray doloribus hic corporis 84.0
Vivien Murray eum amet quia 41.0
Vivien Murray odio velit repudiandae 39.0
Vivien Murray perspiciatis totam perferendis 63.0
Vivien Murray quibusdam sed sit 102.0
Vivien Murray repudiandae officiis qui 58.0
Vivien Murray saepe hic temporibus 80.0
Vivien Murray suscipit consectetur beatae 40.0
Vivien Murray vitae eum pariatur 38.0
Wen Daniel animi aperiam tenetur 89.0
Wen Daniel doloribus hic corporis 53.0
Wen Daniel eum amet quia 63.0
Wen Daniel odio velit repudiandae 47.0
Wen Daniel perspiciatis totam perferendis 50.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>