Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


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