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 repudiandae officiis qui 66.0
Micheal Jenkins suscipit consectetur beatae 66.0
Myriam Von doloribus hic corporis 66.0
Grace Kris suscipit consectetur beatae 66.0
Lillie Hamill saepe hic temporibus 66.0
Dahlia Hilll odio velit repudiandae 66.0
Kaye Greenfelder suscipit consectetur beatae 66.0
Cherly Kovacek repudiandae officiis qui 66.0
Desmond Murray quibusdam sed sit 66.0
Jackson Kozey perspiciatis totam perferendis 66.0
Dania Crona doloribus hic corporis 65.0
Dorthey Turner animi aperiam tenetur 65.0
Raquel Runolfsson vitae eum pariatur 65.0
Micheal Jenkins perspiciatis totam perferendis 65.0
Dona Gutkowski animi aperiam tenetur 65.0
Clifton Hintz quibusdam sed sit 65.0
Shara Labadie suscipit consectetur beatae 65.0
Arnita Smith eum amet quia 65.0
Dania Crona perspiciatis totam perferendis 65.0
Ashleigh Kris animi aperiam tenetur 65.0
Shane Glover odio velit repudiandae 65.0
Flavia Will quibusdam sed sit 65.0
Shannon Botsford doloribus hic corporis 65.0
Kaye Greenfelder odio velit repudiandae 65.0
Bridgett Reilly odio velit repudiandae 65.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>