Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Elise Waelchi quibusdam sed sit 66.0
Elise Waelchi repudiandae officiis qui 82.0
Elise Waelchi saepe hic temporibus 100.0
Elise Waelchi suscipit consectetur beatae 86.0
Elise Waelchi vitae eum pariatur 52.0
Elli Dietrich animi aperiam tenetur 70.0
Elli Dietrich doloribus hic corporis 57.0
Elli Dietrich eum amet quia 57.0
Elli Dietrich odio velit repudiandae 74.0
Elli Dietrich perspiciatis totam perferendis 143.0
Elli Dietrich quibusdam sed sit 58.0
Elli Dietrich repudiandae officiis qui 57.0
Elli Dietrich saepe hic temporibus 27.0
Elli Dietrich suscipit consectetur beatae 82.0
Elli Dietrich vitae eum pariatur 93.0
Elsa Goodwin animi aperiam tenetur 75.0
Elsa Goodwin doloribus hic corporis 42.0
Elsa Goodwin eum amet quia 59.0
Elsa Goodwin odio velit repudiandae 67.0
Elsa Goodwin perspiciatis totam perferendis 61.0
Elsa Goodwin quibusdam sed sit 46.0
Elsa Goodwin repudiandae officiis qui 60.0
Elsa Goodwin saepe hic temporibus 48.0
Elsa Goodwin suscipit consectetur beatae 54.0
Elsa Goodwin vitae eum pariatur 62.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>