Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Brigid McLaughlin animi aperiam tenetur 56.0
Bridgett Reilly saepe hic temporibus 56.0
Maryanna Medhurst animi aperiam tenetur 56.0
Jarvis Ryan odio velit repudiandae 56.0
Vernia Dietrich saepe hic temporibus 56.0
Palmira Fay quibusdam sed sit 56.0
Verla Friesen suscipit consectetur beatae 56.0
Tamera Bogan vitae eum pariatur 56.0
Elsa Goodwin quibusdam sed sit 56.0
Malvina Zulauf odio velit repudiandae 56.0
Sixta Bashirian repudiandae officiis qui 56.0
Huong McKenzie animi aperiam tenetur 56.0
Benita Thompson doloribus hic corporis 56.0
Wen Daniel doloribus hic corporis 56.0
Verla Friesen doloribus hic corporis 55.0
Jeanne Witting odio velit repudiandae 55.0
Gwendolyn Satterfield eum amet quia 55.0
Marna Ritchie perspiciatis totam perferendis 55.0
Verla Friesen vitae eum pariatur 55.0
Lillie Hamill odio velit repudiandae 55.0
Elli Dietrich suscipit consectetur beatae 55.0
Sylvester Hane doloribus hic corporis 55.0
Adrienne Eichmann saepe hic temporibus 55.0
Maryanna Medhurst saepe hic temporibus 55.0
Lynell Stamm suscipit consectetur beatae 55.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>