Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Myriam Von animi aperiam tenetur 43.0
Myriam Von doloribus hic corporis 71.0
Myriam Von eum amet quia 55.0
Myriam Von odio velit repudiandae 43.0
Myriam Von perspiciatis totam perferendis 59.0
Myriam Von quibusdam sed sit 82.0
Myriam Von repudiandae officiis qui 90.0
Myriam Von saepe hic temporibus 82.0
Myriam Von suscipit consectetur beatae 49.0
Myriam Von vitae eum pariatur 57.0
Mi Prosacco animi aperiam tenetur 47.0
Mi Prosacco doloribus hic corporis 69.0
Mi Prosacco eum amet quia 35.0
Mi Prosacco odio velit repudiandae 48.0
Mi Prosacco perspiciatis totam perferendis 51.0
Mi Prosacco quibusdam sed sit 45.0
Mi Prosacco repudiandae officiis qui 71.0
Mi Prosacco saepe hic temporibus 56.0
Mi Prosacco suscipit consectetur beatae 72.0
Mi Prosacco vitae eum pariatur 32.0
Milagros Lemke animi aperiam tenetur 40.0
Milagros Lemke doloribus hic corporis 66.0
Milagros Lemke eum amet quia 80.0
Milagros Lemke odio velit repudiandae 59.0
Milagros Lemke perspiciatis totam perferendis 74.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>