Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
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
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
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>