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 61.0
Vernia Dietrich doloribus hic corporis 84.0
Vernia Dietrich eum amet quia 57.0
Vernia Dietrich odio velit repudiandae 17.0
Vernia Dietrich perspiciatis totam perferendis 61.0
Vernia Dietrich quibusdam sed sit 75.0
Vernia Dietrich repudiandae officiis qui 51.0
Vernia Dietrich saepe hic temporibus 37.0
Vernia Dietrich suscipit consectetur beatae 77.0
Vernia Dietrich vitae eum pariatur 51.0
Vivien Murray animi aperiam tenetur 88.0
Vivien Murray doloribus hic corporis 64.0
Vivien Murray eum amet quia 61.0
Vivien Murray odio velit repudiandae 72.0
Vivien Murray perspiciatis totam perferendis 77.0
Vivien Murray quibusdam sed sit 53.0
Vivien Murray repudiandae officiis qui 49.0
Vivien Murray saepe hic temporibus 55.0
Vivien Murray suscipit consectetur beatae 33.0
Vivien Murray vitae eum pariatur 70.0
Wen Daniel animi aperiam tenetur 58.0
Wen Daniel doloribus hic corporis 53.0
Wen Daniel eum amet quia 96.0
Wen Daniel odio velit repudiandae 82.0
Wen Daniel perspiciatis totam perferendis 70.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>