Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Ophelia Hermiston quibusdam sed sit 88.0
Ophelia Hermiston repudiandae officiis qui 52.0
Ophelia Hermiston saepe hic temporibus 32.0
Ophelia Hermiston suscipit consectetur beatae 85.0
Ophelia Hermiston vitae eum pariatur 79.0
Nelson Leannon animi aperiam tenetur 75.0
Nelson Leannon doloribus hic corporis 64.0
Nelson Leannon eum amet quia 62.0
Nelson Leannon odio velit repudiandae 65.0
Nelson Leannon perspiciatis totam perferendis 60.0
Nelson Leannon quibusdam sed sit 48.0
Nelson Leannon repudiandae officiis qui 31.0
Nelson Leannon saepe hic temporibus 73.0
Nelson Leannon suscipit consectetur beatae 73.0
Nelson Leannon vitae eum pariatur 47.0
Myrtle O'Conner animi aperiam tenetur 114.0
Myrtle O'Conner doloribus hic corporis 58.0
Myrtle O'Conner eum amet quia 33.0
Myrtle O'Conner odio velit repudiandae 57.0
Myrtle O'Conner perspiciatis totam perferendis 51.0
Myrtle O'Conner quibusdam sed sit 56.0
Myrtle O'Conner repudiandae officiis qui 89.0
Myrtle O'Conner saepe hic temporibus 87.0
Myrtle O'Conner suscipit consectetur beatae 64.0
Myrtle O'Conner vitae eum pariatur 77.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>