Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Jarvis Ryan saepe hic temporibus 71.0
Myrtle O'Conner suscipit consectetur beatae 70.0
Rebecca Rempel repudiandae officiis qui 70.0
Flavia Will suscipit consectetur beatae 70.0
Evangelina Pfeffer repudiandae officiis qui 70.0
Juliana Hauck quibusdam sed sit 70.0
Elenora Brakus quibusdam sed sit 69.0
Bong Witting quibusdam sed sit 69.0
Carlota Gottlieb quibusdam sed sit 69.0
Maryanna Medhurst suscipit consectetur beatae 69.0
Deja Corkery repudiandae officiis qui 69.0
Bridgett Reilly suscipit consectetur beatae 69.0
Kellie Cassin suscipit consectetur beatae 69.0
Desmond Murray perspiciatis totam perferendis 69.0
Beverlee Auer perspiciatis totam perferendis 69.0
Nelson Leannon doloribus hic corporis 69.0
Pearlie McGlynn vitae eum pariatur 69.0
Kellie Cassin doloribus hic corporis 69.0
Kellie Cassin saepe hic temporibus 69.0
Flavia Will saepe hic temporibus 69.0
Jamie Stehr doloribus hic corporis 69.0
German Murphy suscipit consectetur beatae 69.0
Verla Friesen perspiciatis totam perferendis 69.0
Adrienne Eichmann suscipit consectetur beatae 69.0
Sixta Bashirian saepe hic temporibus 69.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>