Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Dahlia Hilll vitae eum pariatur 44.0
Tami Gibson doloribus hic corporis 44.0
Dania Crona suscipit consectetur beatae 44.0
Tess Nikolaus eum amet quia 44.0
Tamera Bogan animi aperiam tenetur 44.0
Benita Thompson saepe hic temporibus 44.0
Cherly Kovacek suscipit consectetur beatae 44.0
Myrtle O'Conner doloribus hic corporis 44.0
Bok Wolf eum amet quia 44.0
Palmira Fay odio velit repudiandae 44.0
Dahlia Hilll repudiandae officiis qui 44.0
Shannon Botsford odio velit repudiandae 44.0
Deja Corkery saepe hic temporibus 45.0
Treena Wolf odio velit repudiandae 45.0
Wen Daniel eum amet quia 45.0
Salley Kilback vitae eum pariatur 45.0
Tami Gibson animi aperiam tenetur 45.0
Rossana Schneider animi aperiam tenetur 45.0
Jon Lindgren doloribus hic corporis 45.0
Vivien Murray repudiandae officiis qui 45.0
Brigid McLaughlin repudiandae officiis qui 45.0
Shane Glover quibusdam sed sit 45.0
Wen Daniel suscipit consectetur beatae 45.0
Lesia Hyatt animi aperiam tenetur 46.0
Crissy Brekke repudiandae officiis qui 46.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>