Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Jon Lindgren saepe hic temporibus 58.0
Jarvis Ryan doloribus hic corporis 58.0
Bong Witting eum amet quia 58.0
Wiley Wuckert repudiandae officiis qui 58.0
Marna Ritchie suscipit consectetur beatae 58.0
Thaddeus Stanton animi aperiam tenetur 58.0
Ophelia Hermiston suscipit consectetur beatae 58.0
Rebecca Rempel suscipit consectetur beatae 58.0
Royce Spencer suscipit consectetur beatae 58.0
Pearlie McGlynn vitae eum pariatur 58.0
Jamie Stehr repudiandae officiis qui 58.0
Clifton Hintz odio velit repudiandae 58.0
Elisa Wintheiser animi aperiam tenetur 58.0
Bong Witting quibusdam sed sit 58.0
Tess Nikolaus quibusdam sed sit 58.0
Desmond Murray vitae eum pariatur 58.0
Winfred Franecki odio velit repudiandae 58.0
Ashleigh Kris perspiciatis totam perferendis 58.0
Eleonore Wisozk doloribus hic corporis 57.0
Carlota Gottlieb odio velit repudiandae 57.0
Ashleigh Kris quibusdam sed sit 57.0
Awilda Schumm vitae eum pariatur 57.0
Kaye Greenfelder odio velit repudiandae 57.0
Myrtle O'Conner animi aperiam tenetur 57.0
Nelson Leannon vitae eum pariatur 57.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>