Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Rebecca Rempel quibusdam sed sit 77.0
Rebecca Rempel repudiandae officiis qui 76.0
Rebecca Rempel saepe hic temporibus 76.0
Rebecca Rempel suscipit consectetur beatae 54.0
Rebecca Rempel vitae eum pariatur 69.0
Reinaldo Heidenreich animi aperiam tenetur 95.0
Reinaldo Heidenreich doloribus hic corporis 65.0
Reinaldo Heidenreich eum amet quia 86.0
Reinaldo Heidenreich odio velit repudiandae 63.0
Reinaldo Heidenreich perspiciatis totam perferendis 65.0
Reinaldo Heidenreich quibusdam sed sit 53.0
Reinaldo Heidenreich repudiandae officiis qui 43.0
Reinaldo Heidenreich saepe hic temporibus 73.0
Reinaldo Heidenreich suscipit consectetur beatae 80.0
Reinaldo Heidenreich vitae eum pariatur 97.0
Rossana Schneider animi aperiam tenetur 66.0
Rossana Schneider doloribus hic corporis 75.0
Rossana Schneider eum amet quia 61.0
Rossana Schneider odio velit repudiandae 48.0
Rossana Schneider perspiciatis totam perferendis 46.0
Rossana Schneider quibusdam sed sit 32.0
Rossana Schneider repudiandae officiis qui 50.0
Rossana Schneider saepe hic temporibus 93.0
Rossana Schneider suscipit consectetur beatae 57.0
Rossana Schneider vitae eum pariatur 61.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>