Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Deja Corkery animi aperiam tenetur 37.0
Deja Corkery doloribus hic corporis 53.0
Deja Corkery eum amet quia 51.0
Deja Corkery odio velit repudiandae 59.0
Deja Corkery perspiciatis totam perferendis 71.0
Deja Corkery quibusdam sed sit 72.0
Deja Corkery repudiandae officiis qui 82.0
Deja Corkery saepe hic temporibus 45.0
Deja Corkery suscipit consectetur beatae 64.0
Deja Corkery vitae eum pariatur 63.0
Dania Crona animi aperiam tenetur 32.0
Dania Crona doloribus hic corporis 52.0
Dania Crona eum amet quia 32.0
Dania Crona odio velit repudiandae 105.0
Dania Crona perspiciatis totam perferendis 61.0
Dania Crona quibusdam sed sit 78.0
Dania Crona repudiandae officiis qui 74.0
Dania Crona saepe hic temporibus 57.0
Dania Crona suscipit consectetur beatae 44.0
Dania Crona vitae eum pariatur 65.0
Dahlia Hilll animi aperiam tenetur 36.0
Dahlia Hilll doloribus hic corporis 57.0
Dahlia Hilll eum amet quia 44.0
Dahlia Hilll odio velit repudiandae 59.0
Dahlia Hilll perspiciatis totam perferendis 35.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>