Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced) Document Grid (Mongoid)

Time Entries Grid


Developer Project Report hours
Charley Carter et pariatur ut 43.0
Charley Carter dolor numquam cumque 50.0
Charley Carter perferendis quaerat qui 67.0
Charley Carter molestiae laudantium quo 79.0
Charley Carter minus quaerat quo 71.0
Charley Carter non et est 77.0
Charley Carter sint ut ea 51.0
Charley Carter consequuntur nihil quo 59.0
Charley Carter quos aut impedit 97.0
Charley Carter voluptatem quaerat architecto 46.0
Christa Smith dolor numquam cumque 57.0
Christa Smith non et est 53.0
Christa Smith perferendis quaerat qui 71.0
Christa Smith sint ut ea 63.0
Christa Smith et pariatur ut 53.0
Christa Smith minus quaerat quo 73.0
Christa Smith voluptatem quaerat architecto 96.0
Christa Smith quos aut impedit 35.0
Christa Smith consequuntur nihil quo 73.0
Christa Smith molestiae laudantium quo 60.0
Clyde Bruen non et est 81.0
Clyde Bruen consequuntur nihil quo 81.0
Clyde Bruen dolor numquam cumque 67.0
Clyde Bruen quos aut impedit 66.0
Clyde Bruen minus quaerat quo 73.0

Grid:

class TimeEntriesGrid

  include Datagrid

  #
  # 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[:time_entries_grid]) 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>