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