Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Jeanne Witting suscipit consectetur beatae 54.0
Jewell Kreiger suscipit consectetur beatae 111.0
Jewell Swaniawski suscipit consectetur beatae 66.0
Joelle Hodkiewicz suscipit consectetur beatae 70.0
Johnny Spinka suscipit consectetur beatae 77.0
Jon Lindgren suscipit consectetur beatae 47.0
Juliana Hauck suscipit consectetur beatae 60.0
Kaye Greenfelder suscipit consectetur beatae 77.0
Kellie Cassin suscipit consectetur beatae 82.0
Lesia Hyatt suscipit consectetur beatae 58.0
Li Considine suscipit consectetur beatae 79.0
Lillie Hamill suscipit consectetur beatae 80.0
Lynell Stamm suscipit consectetur beatae 63.0
Malvina Zulauf suscipit consectetur beatae 54.0
Marna Ritchie suscipit consectetur beatae 54.0
Maryanna Medhurst suscipit consectetur beatae 92.0
Micheal Jenkins suscipit consectetur beatae 56.0
Milagros Lemke suscipit consectetur beatae 84.0
Mi Prosacco suscipit consectetur beatae 72.0
Myriam Von suscipit consectetur beatae 49.0
Myrtle O'Conner suscipit consectetur beatae 64.0
Nelson Leannon suscipit consectetur beatae 73.0
Ophelia Hermiston suscipit consectetur beatae 85.0
Palmira Fay suscipit consectetur beatae 51.0
Pearlie McGlynn suscipit consectetur beatae 98.0

Grid:

class TimeEntriesGrid < BaseGrid

  #
  # 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[:g]) 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>