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 63.0
Broderick Cartwright voluptatem quaerat architecto 56.0
Broderick Cartwright dolor numquam cumque 92.0
Broderick Cartwright molestiae laudantium quo 76.0
Broderick Cartwright quos aut impedit 36.0
Carmel Huel et pariatur ut 44.0
Carmel Huel consequuntur nihil quo 71.0
Carmel Huel minus quaerat quo 47.0
Carmel Huel voluptatem quaerat architecto 58.0
Carmel Huel dolor numquam cumque 86.0
Carmel Huel quos aut impedit 86.0
Carmel Huel perferendis quaerat qui 51.0
Carmel Huel molestiae laudantium quo 107.0
Carmel Huel sint ut ea 77.0
Carmel Huel non et est 62.0
Cathryn Boehm et pariatur ut 92.0
Cathryn Boehm molestiae laudantium quo 102.0
Cathryn Boehm non et est 80.0
Cathryn Boehm dolor numquam cumque 84.0
Cathryn Boehm perferendis quaerat qui 53.0
Cathryn Boehm quos aut impedit 32.0
Cathryn Boehm minus quaerat quo 34.0
Cathryn Boehm voluptatem quaerat architecto 99.0
Cathryn Boehm consequuntur nihil quo 69.0
Cathryn Boehm sint ut ea 58.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>