Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Jeanne Witting quibusdam sed sit 31.0
Shara Labadie doloribus hic corporis 31.0
Kellie Cassin vitae eum pariatur 31.0
Bong Witting repudiandae officiis qui 30.0
Carlota Gottlieb quibusdam sed sit 30.0
Winfred Franecki quibusdam sed sit 30.0
Terisa Ruecker suscipit consectetur beatae 30.0
Cherly Kovacek animi aperiam tenetur 29.0
Lillie Hamill doloribus hic corporis 29.0
Ophelia Hermiston animi aperiam tenetur 29.0
Raquel Runolfsson suscipit consectetur beatae 28.0
Dona Gutkowski odio velit repudiandae 28.0
Bridgett Reilly suscipit consectetur beatae 27.0
Pearlie McGlynn odio velit repudiandae 27.0
Alise Rolfson odio velit repudiandae 27.0
Dania Crona doloribus hic corporis 27.0
Shane Glover repudiandae officiis qui 27.0
Tamera Bogan vitae eum pariatur 26.0
Dahlia Hilll eum amet quia 26.0
Jamie Stehr eum amet quia 26.0
Elisa Wintheiser eum amet quia 25.0
Tamera Bogan saepe hic temporibus 24.0
Shannon Botsford repudiandae officiis qui 23.0
Jewell Kreiger perspiciatis totam perferendis 22.0
Malvina Zulauf quibusdam sed sit 13.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>