Developer | Project | Company | Report hours |
---|---|---|---|
Adrienne Eichmann | doloribus hic corporis |
Microsoft
|
73.0 |
Alex Legros | doloribus hic corporis |
Microsoft
|
89.0 |
Alise Rolfson | doloribus hic corporis |
Microsoft
|
64.0 |
Almeta Adams | doloribus hic corporis |
Microsoft
|
81.0 |
Arnita Smith | doloribus hic corporis |
Microsoft
|
63.0 |
Ashleigh Kris | doloribus hic corporis |
Microsoft
|
79.0 |
Awilda Schumm | doloribus hic corporis |
Microsoft
|
37.0 |
Benita Thompson | doloribus hic corporis |
Microsoft
|
27.0 |
Beverlee Auer | doloribus hic corporis |
Microsoft
|
43.0 |
Blake Hoppe | doloribus hic corporis |
Microsoft
|
72.0 |
Bok Wolf | doloribus hic corporis |
Microsoft
|
71.0 |
Bong Witting | doloribus hic corporis |
Microsoft
|
92.0 |
Bridgett Reilly | doloribus hic corporis |
Microsoft
|
86.0 |
Brigid McLaughlin | doloribus hic corporis |
Microsoft
|
96.0 |
Britney Ruecker | doloribus hic corporis |
Microsoft
|
90.0 |
Carlota Gottlieb | doloribus hic corporis |
Microsoft
|
84.0 |
Cathey Prohaska | doloribus hic corporis |
Microsoft
|
57.0 |
Cherly Kovacek | doloribus hic corporis |
Microsoft
|
52.0 |
Claudette Hagenes | doloribus hic corporis |
Microsoft
|
37.0 |
Clifton Hintz | doloribus hic corporis |
Microsoft
|
76.0 |
Crissy Brekke | doloribus hic corporis |
Microsoft
|
69.0 |
Cristopher Dooley | doloribus hic corporis |
Microsoft
|
38.0 |
Dahlia Hilll | doloribus hic corporis |
Microsoft
|
88.0 |
Dania Crona | doloribus hic corporis |
Microsoft
|
53.0 |
Deja Corkery | doloribus hic corporis |
Microsoft
|
68.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 => :project_id_select,
:multiple => true,
:include_blank => false
) do |value|
self.where(:time_entries => {:project_id => value})
end
filter(
:year, :enum,
:select => :year_select,
: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 => :month_select,
: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)")
protected
def year_select
TimeEntry.all.any? ? (TimeEntry.minimum(:date).year..TimeEntry.maximum(:date).year) : []
end
def month_select
Date::MONTHNAMES[1..12].enum_for(:each_with_index).collect {|name, index| [name, index + 1]}
end
def project_id_select
Project.all.map {|p| [p.name, p.id]}
end
end
Controller:
class TimeEntriesController < ApplicationController
def index
@time_entries_grid = TimeEntriesGrid.new(params[:g]) do |scope|
scope.page(params[:page] )
end
end
end
View:
.grid-index-grid
%div{class: 'overflow-x-auto p-4'}
= datagrid_form_for @time_entries_grid, url: time_entries_path
%br/
= datagrid_table(@time_entries_grid)
= paginate @time_entries_grid.assets, window: 2
%div
= render :partial => "shared/source", :object => @time_entries_grid