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

Developer Project Company Report hours
Jeanne Witting eum amet quia
Google
88.0
Jewell Kreiger eum amet quia
Google
86.0
Jewell Swaniawski eum amet quia
Google
68.0
Joelle Hodkiewicz eum amet quia
Google
56.0
Johnny Spinka eum amet quia
Google
105.0
Jon Lindgren eum amet quia
Google
67.0
Juliana Hauck eum amet quia
Google
69.0
Kaye Greenfelder eum amet quia
Google
96.0
Kellie Cassin eum amet quia
Google
98.0
Lesia Hyatt eum amet quia
Google
44.0
Li Considine eum amet quia
Google
71.0
Lillie Hamill eum amet quia
Google
70.0
Lynell Stamm eum amet quia
Google
49.0
Malvina Zulauf eum amet quia
Google
90.0
Marna Ritchie eum amet quia
Google
62.0
Maryanna Medhurst eum amet quia
Google
51.0
Micheal Jenkins eum amet quia
Google
107.0
Milagros Lemke eum amet quia
Google
78.0
Mi Prosacco eum amet quia
Google
49.0
Myriam Von eum amet quia
Google
109.0
Myrtle O'Conner eum amet quia
Google
93.0
Nelson Leannon eum amet quia
Google
63.0
Ophelia Hermiston eum amet quia
Google
49.0
Palmira Fay eum amet quia
Google
38.0
Pearlie McGlynn eum amet quia
Google
72.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