Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Milagros Lemke quibusdam sed sit 56.0
Milagros Lemke repudiandae officiis qui 66.0
Milagros Lemke saepe hic temporibus 62.0
Milagros Lemke suscipit consectetur beatae 84.0
Milagros Lemke vitae eum pariatur 57.0
Micheal Jenkins animi aperiam tenetur 59.0
Micheal Jenkins doloribus hic corporis 79.0
Micheal Jenkins eum amet quia 67.0
Micheal Jenkins odio velit repudiandae 50.0
Micheal Jenkins perspiciatis totam perferendis 73.0
Micheal Jenkins quibusdam sed sit 76.0
Micheal Jenkins repudiandae officiis qui 54.0
Micheal Jenkins saepe hic temporibus 61.0
Micheal Jenkins suscipit consectetur beatae 56.0
Micheal Jenkins vitae eum pariatur 75.0
Maryanna Medhurst animi aperiam tenetur 29.0
Maryanna Medhurst doloribus hic corporis 44.0
Maryanna Medhurst eum amet quia 54.0
Maryanna Medhurst odio velit repudiandae 69.0
Maryanna Medhurst perspiciatis totam perferendis 80.0
Maryanna Medhurst quibusdam sed sit 48.0
Maryanna Medhurst repudiandae officiis qui 87.0
Maryanna Medhurst saepe hic temporibus 71.0
Maryanna Medhurst suscipit consectetur beatae 92.0
Maryanna Medhurst vitae eum pariatur 60.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>