Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


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