Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Gonzalo Blanda quibusdam sed sit 38.0
Palmira Fay eum amet quia 38.0
Tamika Cronin animi aperiam tenetur 38.0
Verla Friesen vitae eum pariatur 38.0
Palmira Fay saepe hic temporibus 38.0
Joelle Hodkiewicz vitae eum pariatur 38.0
Claudette Hagenes doloribus hic corporis 37.0
Alise Rolfson saepe hic temporibus 37.0
Sixta Bashirian eum amet quia 37.0
Grace Kris quibusdam sed sit 37.0
Awilda Schumm doloribus hic corporis 37.0
Ashleigh Kris vitae eum pariatur 37.0
Adrienne Eichmann suscipit consectetur beatae 37.0
Jeanne Witting saepe hic temporibus 37.0
Marna Ritchie odio velit repudiandae 36.0
Vivien Murray suscipit consectetur beatae 36.0
Bong Witting eum amet quia 36.0
Maryanna Medhurst saepe hic temporibus 36.0
Eleonore Wisozk odio velit repudiandae 36.0
Almeta Adams repudiandae officiis qui 36.0
Deja Corkery suscipit consectetur beatae 36.0
Ophelia Hermiston vitae eum pariatur 36.0
Salley Kilback vitae eum pariatur 36.0
Vernia Dietrich doloribus hic corporis 36.0
Bridgett Reilly perspiciatis totam perferendis 36.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>