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
Tod Heller et pariatur ut 62.0
Tod Heller non et est 51.0
Tod Heller dolor numquam cumque 80.0
Tod Heller voluptatem quaerat architecto 86.0
Tod Heller perferendis quaerat qui 56.0
Tod Heller molestiae laudantium quo 59.0
Tod Heller quos aut impedit 54.0
Tod Heller minus quaerat quo 37.0
Tod Heller consequuntur nihil quo 46.0
Tod Heller sint ut ea 39.0
Talon Kuhlman sint ut ea 85.0
Talon Kuhlman dolor numquam cumque 62.0
Talon Kuhlman consequuntur nihil quo 87.0
Talon Kuhlman minus quaerat quo 74.0
Talon Kuhlman perferendis quaerat qui 58.0
Talon Kuhlman non et est 49.0
Talon Kuhlman et pariatur ut 97.0
Talon Kuhlman voluptatem quaerat architecto 99.0
Talon Kuhlman molestiae laudantium quo 97.0
Talon Kuhlman quos aut impedit 63.0
Syble Ziemann perferendis quaerat qui 55.0
Syble Ziemann quos aut impedit 92.0
Syble Ziemann non et est 50.0
Syble Ziemann dolor numquam cumque 57.0
Syble Ziemann molestiae laudantium quo 80.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>