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 29.0
Broderick Cartwright voluptatem quaerat architecto 85.0
Broderick Cartwright dolor numquam cumque 72.0
Broderick Cartwright molestiae laudantium quo 103.0
Broderick Cartwright quos aut impedit 66.0
Carmel Huel et pariatur ut 71.0
Carmel Huel consequuntur nihil quo 72.0
Carmel Huel minus quaerat quo 69.0
Carmel Huel voluptatem quaerat architecto 64.0
Carmel Huel dolor numquam cumque 68.0
Carmel Huel quos aut impedit 24.0
Carmel Huel perferendis quaerat qui 50.0
Carmel Huel molestiae laudantium quo 32.0
Carmel Huel sint ut ea 44.0
Carmel Huel non et est 87.0
Cathryn Boehm et pariatur ut 80.0
Cathryn Boehm molestiae laudantium quo 90.0
Cathryn Boehm non et est 66.0
Cathryn Boehm dolor numquam cumque 81.0
Cathryn Boehm perferendis quaerat qui 63.0
Cathryn Boehm quos aut impedit 38.0
Cathryn Boehm minus quaerat quo 66.0
Cathryn Boehm voluptatem quaerat architecto 51.0
Cathryn Boehm consequuntur nihil quo 56.0
Cathryn Boehm sint ut ea 48.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>