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 72.0
Broderick Cartwright voluptatem quaerat architecto 83.0
Broderick Cartwright dolor numquam cumque 80.0
Broderick Cartwright molestiae laudantium quo 63.0
Broderick Cartwright quos aut impedit 86.0
Carmel Huel et pariatur ut 70.0
Carmel Huel consequuntur nihil quo 109.0
Carmel Huel minus quaerat quo 87.0
Carmel Huel voluptatem quaerat architecto 47.0
Carmel Huel dolor numquam cumque 65.0
Carmel Huel quos aut impedit 20.0
Carmel Huel perferendis quaerat qui 80.0
Carmel Huel molestiae laudantium quo 54.0
Carmel Huel sint ut ea 72.0
Carmel Huel non et est 42.0
Cathryn Boehm et pariatur ut 66.0
Cathryn Boehm molestiae laudantium quo 63.0
Cathryn Boehm non et est 60.0
Cathryn Boehm dolor numquam cumque 93.0
Cathryn Boehm perferendis quaerat qui 78.0
Cathryn Boehm quos aut impedit 34.0
Cathryn Boehm minus quaerat quo 60.0
Cathryn Boehm voluptatem quaerat architecto 104.0
Cathryn Boehm consequuntur nihil quo 42.0
Cathryn Boehm sint ut ea 61.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>