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
Broderick Cartwright et pariatur ut 69.0
Broderick Cartwright voluptatem quaerat architecto 62.0
Broderick Cartwright dolor numquam cumque 97.0
Broderick Cartwright molestiae laudantium quo 46.0
Broderick Cartwright quos aut impedit 32.0
Carmel Huel et pariatur ut 89.0
Carmel Huel consequuntur nihil quo 67.0
Carmel Huel minus quaerat quo 36.0
Carmel Huel voluptatem quaerat architecto 69.0
Carmel Huel dolor numquam cumque 86.0
Carmel Huel quos aut impedit 57.0
Carmel Huel perferendis quaerat qui 75.0
Carmel Huel molestiae laudantium quo 57.0
Carmel Huel sint ut ea 67.0
Carmel Huel non et est 40.0
Cathryn Boehm et pariatur ut 52.0
Cathryn Boehm molestiae laudantium quo 75.0
Cathryn Boehm non et est 48.0
Cathryn Boehm dolor numquam cumque 48.0
Cathryn Boehm perferendis quaerat qui 46.0
Cathryn Boehm quos aut impedit 24.0
Cathryn Boehm minus quaerat quo 63.0
Cathryn Boehm voluptatem quaerat architecto 76.0
Cathryn Boehm consequuntur nihil quo 65.0
Cathryn Boehm sint ut ea 92.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>