Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Myrtle O'Conner animi aperiam tenetur 73.0
Myrtle O'Conner doloribus hic corporis 47.0
Myrtle O'Conner eum amet quia 93.0
Myrtle O'Conner odio velit repudiandae 41.0
Myrtle O'Conner perspiciatis totam perferendis 63.0
Myrtle O'Conner quibusdam sed sit 93.0
Myrtle O'Conner repudiandae officiis qui 62.0
Myrtle O'Conner saepe hic temporibus 52.0
Myrtle O'Conner suscipit consectetur beatae 34.0
Myrtle O'Conner vitae eum pariatur 78.0
Nelson Leannon animi aperiam tenetur 55.0
Nelson Leannon doloribus hic corporis 75.0
Nelson Leannon eum amet quia 63.0
Nelson Leannon odio velit repudiandae 53.0
Nelson Leannon perspiciatis totam perferendis 105.0
Nelson Leannon quibusdam sed sit 72.0
Nelson Leannon repudiandae officiis qui 68.0
Nelson Leannon saepe hic temporibus 83.0
Nelson Leannon suscipit consectetur beatae 80.0
Nelson Leannon vitae eum pariatur 93.0
Ophelia Hermiston animi aperiam tenetur 71.0
Ophelia Hermiston doloribus hic corporis 67.0
Ophelia Hermiston eum amet quia 49.0
Ophelia Hermiston odio velit repudiandae 85.0
Ophelia Hermiston perspiciatis totam perferendis 92.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>