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
Rodolfo Lueilwitz sint ut ea 98.0
Rodolfo Lueilwitz molestiae laudantium quo 70.0
Rodolfo Lueilwitz dolor numquam cumque 73.0
Rodolfo Lueilwitz et pariatur ut 72.0
Rodolfo Lueilwitz perferendis quaerat qui 47.0
Rosanna Schowalter dolor numquam cumque 44.0
Rosanna Schowalter quos aut impedit 45.0
Rosanna Schowalter et pariatur ut 60.0
Rosanna Schowalter voluptatem quaerat architecto 74.0
Rosanna Schowalter molestiae laudantium quo 58.0
Rosanna Schowalter consequuntur nihil quo 59.0
Rosanna Schowalter perferendis quaerat qui 79.0
Rosanna Schowalter minus quaerat quo 98.0
Rosanna Schowalter sint ut ea 59.0
Rosanna Schowalter non et est 101.0
Rylee Fadel sint ut ea 91.0
Rylee Fadel voluptatem quaerat architecto 64.0
Rylee Fadel consequuntur nihil quo 84.0
Rylee Fadel non et est 52.0
Rylee Fadel dolor numquam cumque 83.0
Rylee Fadel et pariatur ut 50.0
Rylee Fadel minus quaerat quo 77.0
Rylee Fadel molestiae laudantium quo 81.0
Rylee Fadel quos aut impedit 85.0
Rylee Fadel perferendis quaerat qui 63.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>