Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Rebecca Rempel doloribus hic corporis 73.0
Carlota Gottlieb perspiciatis totam perferendis 73.0
Johnny Spinka doloribus hic corporis 73.0
Jewell Kreiger doloribus hic corporis 73.0
Jamie Stehr doloribus hic corporis 73.0
Nelson Leannon odio velit repudiandae 73.0
Rossana Schneider perspiciatis totam perferendis 73.0
Penney Schowalter quibusdam sed sit 73.0
Wiley Wuckert perspiciatis totam perferendis 73.0
Malvina Zulauf suscipit consectetur beatae 73.0
Desmond Murray quibusdam sed sit 72.0
Deja Corkery quibusdam sed sit 72.0
Tamika Cronin perspiciatis totam perferendis 72.0
Elenora Brakus eum amet quia 72.0
Alex Legros suscipit consectetur beatae 72.0
Elida Zulauf saepe hic temporibus 72.0
Vivien Murray doloribus hic corporis 72.0
Treena Wolf animi aperiam tenetur 72.0
Adrienne Eichmann repudiandae officiis qui 72.0
Palmira Fay doloribus hic corporis 72.0
Grace Kris suscipit consectetur beatae 72.0
Joelle Hodkiewicz vitae eum pariatur 72.0
Cristopher Dooley vitae eum pariatur 72.0
Dorthey Turner doloribus hic corporis 72.0
Kaye Greenfelder eum amet quia 72.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>