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
Berniece Weimann perferendis quaerat qui 39.0
Berniece Weimann voluptatem quaerat architecto 40.0
Berniece Weimann et pariatur ut 63.0
Berniece Weimann minus quaerat quo 34.0
Berniece Weimann quos aut impedit 56.0
Berniece Weimann sint ut ea 56.0
Berniece Weimann molestiae laudantium quo 74.0
Berniece Weimann dolor numquam cumque 58.0
Berniece Weimann consequuntur nihil quo 48.0
Berniece Weimann non et est 83.0
Blaise Lang molestiae laudantium quo 72.0
Blaise Lang quos aut impedit 61.0
Blaise Lang sint ut ea 48.0
Blaise Lang non et est 62.0
Blaise Lang consequuntur nihil quo 58.0
Blaise Lang et pariatur ut 57.0
Blaise Lang voluptatem quaerat architecto 102.0
Blaise Lang minus quaerat quo 52.0
Blaise Lang dolor numquam cumque 49.0
Blaise Lang perferendis quaerat qui 61.0
Broderick Cartwright molestiae laudantium quo 46.0
Broderick Cartwright non et est 84.0
Broderick Cartwright et pariatur ut 69.0
Broderick Cartwright quos aut impedit 32.0
Broderick Cartwright sint ut ea 40.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>