Users (Basic) Time Sheets (Advanced) Issues (API)

Developer Project Company Report hours
Adrienne Eichmann quibusdam sed sit
Apple
73.0
Alex Legros quibusdam sed sit
Apple
44.0
Alise Rolfson quibusdam sed sit
Apple
90.0
Almeta Adams quibusdam sed sit
Apple
65.0
Arnita Smith quibusdam sed sit
Apple
33.0
Ashleigh Kris quibusdam sed sit
Apple
69.0
Awilda Schumm quibusdam sed sit
Apple
44.0
Benita Thompson quibusdam sed sit
Apple
78.0
Beverlee Auer quibusdam sed sit
Apple
70.0
Blake Hoppe quibusdam sed sit
Apple
63.0
Bok Wolf quibusdam sed sit
Apple
82.0
Bong Witting quibusdam sed sit
Apple
26.0
Bridgett Reilly quibusdam sed sit
Apple
50.0
Brigid McLaughlin quibusdam sed sit
Apple
52.0
Britney Ruecker quibusdam sed sit
Apple
79.0
Carlota Gottlieb quibusdam sed sit
Apple
55.0
Cathey Prohaska quibusdam sed sit
Apple
55.0
Cherly Kovacek quibusdam sed sit
Apple
46.0
Claudette Hagenes quibusdam sed sit
Apple
46.0
Clifton Hintz quibusdam sed sit
Apple
102.0
Crissy Brekke quibusdam sed sit
Apple
58.0
Cristopher Dooley quibusdam sed sit
Apple
92.0
Dahlia Hilll quibusdam sed sit
Apple
49.0
Dania Crona quibusdam sed sit
Apple
75.0
Deja Corkery quibusdam sed sit
Apple
77.0

Grid:

class TimeEntriesGrid < ApplicationGrid

  #
  # 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_with model: @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