Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Arnita Smith animi aperiam tenetur 101.0
Desmond Murray doloribus hic corporis 101.0
Pearlie McGlynn repudiandae officiis qui 101.0
Awilda Schumm suscipit consectetur beatae 99.0
Huong McKenzie perspiciatis totam perferendis 99.0
Jamie Stehr odio velit repudiandae 99.0
Clifton Hintz quibusdam sed sit 98.0
Dahlia Hilll doloribus hic corporis 98.0
Micheal Jenkins quibusdam sed sit 98.0
Elisa Wintheiser perspiciatis totam perferendis 98.0
Dahlia Hilll vitae eum pariatur 97.0
Reinaldo Heidenreich vitae eum pariatur 97.0
Crissy Brekke eum amet quia 96.0
Maryanna Medhurst doloribus hic corporis 96.0
Pearlie McGlynn quibusdam sed sit 96.0
Dahlia Hilll suscipit consectetur beatae 96.0
Salley Kilback vitae eum pariatur 96.0
Dona Gutkowski suscipit consectetur beatae 96.0
Deja Corkery quibusdam sed sit 95.0
Jamison Hagenes suscipit consectetur beatae 95.0
Shannon Botsford saepe hic temporibus 95.0
Milagros Lemke animi aperiam tenetur 95.0
Reinaldo Heidenreich animi aperiam tenetur 95.0
Beverlee Auer repudiandae officiis qui 95.0
Jewell Swaniawski repudiandae officiis qui 95.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>