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
Mathilde Huels quos aut impedit 18.0
King Schmidt quos aut impedit 18.0
Albina Morissette perferendis quaerat qui 21.0
Berniece Weimann molestiae laudantium quo 23.0
Makenna Jakubowski perferendis quaerat qui 23.0
Michael King perferendis quaerat qui 24.0
Domingo Franecki minus quaerat quo 24.0
Carmel Huel quos aut impedit 24.0
Gus Jewess perferendis quaerat qui 25.0
Makenna Jakubowski et pariatur ut 26.0
Ashlynn Wilderman et pariatur ut 27.0
Louisa Franecki voluptatem quaerat architecto 28.0
Ashlynn Wilderman non et est 28.0
Fausto Larkin minus quaerat quo 28.0
Lula Hyatt minus quaerat quo 29.0
Broderick Cartwright et pariatur ut 29.0
Joelle Jenkins voluptatem quaerat architecto 30.0
Mikayla Goldner et pariatur ut 30.0
Estevan Reilly dolor numquam cumque 31.0
Maximillian Ryan quos aut impedit 31.0
Michael King molestiae laudantium quo 31.0
Kayli Swaniawski dolor numquam cumque 31.0
Kasey Lemke sint ut ea 32.0
Hortense Leffler molestiae laudantium quo 32.0
Monroe Rowe non et est 32.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>