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 53.0
Broderick Cartwright voluptatem quaerat architecto 54.0
Broderick Cartwright dolor numquam cumque 48.0
Broderick Cartwright molestiae laudantium quo 82.0
Broderick Cartwright quos aut impedit 40.0
Carmel Huel et pariatur ut 58.0
Carmel Huel consequuntur nihil quo 67.0
Carmel Huel minus quaerat quo 55.0
Carmel Huel voluptatem quaerat architecto 72.0
Carmel Huel dolor numquam cumque 62.0
Carmel Huel quos aut impedit 87.0
Carmel Huel perferendis quaerat qui 56.0
Carmel Huel molestiae laudantium quo 76.0
Carmel Huel sint ut ea 43.0
Carmel Huel non et est 49.0
Cathryn Boehm et pariatur ut 80.0
Cathryn Boehm molestiae laudantium quo 87.0
Cathryn Boehm non et est 64.0
Cathryn Boehm dolor numquam cumque 26.0
Cathryn Boehm perferendis quaerat qui 52.0
Cathryn Boehm quos aut impedit 65.0
Cathryn Boehm minus quaerat quo 81.0
Cathryn Boehm voluptatem quaerat architecto 40.0
Cathryn Boehm consequuntur nihil quo 69.0
Cathryn Boehm sint ut ea 55.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>