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

Developer Project Report hours
Bridgett Reilly perspiciatis totam perferendis 36.0
Eleonore Wisozk odio velit repudiandae 36.0
Deja Corkery suscipit consectetur beatae 36.0
Bong Witting eum amet quia 36.0
Salley Kilback vitae eum pariatur 36.0
Marna Ritchie odio velit repudiandae 36.0
Ophelia Hermiston vitae eum pariatur 36.0
Vivien Murray suscipit consectetur beatae 36.0
Maryanna Medhurst saepe hic temporibus 36.0
Almeta Adams repudiandae officiis qui 36.0
Vernia Dietrich doloribus hic corporis 36.0
Alise Rolfson saepe hic temporibus 37.0
Adrienne Eichmann suscipit consectetur beatae 37.0
Sixta Bashirian eum amet quia 37.0
Grace Kris quibusdam sed sit 37.0
Awilda Schumm doloribus hic corporis 37.0
Jeanne Witting saepe hic temporibus 37.0
Claudette Hagenes doloribus hic corporis 37.0
Ashleigh Kris vitae eum pariatur 37.0
Gonzalo Blanda quibusdam sed sit 38.0
Joelle Hodkiewicz vitae eum pariatur 38.0
Palmira Fay saepe hic temporibus 38.0
Cristopher Dooley doloribus hic corporis 38.0
Palmira Fay eum amet quia 38.0
Tamika Cronin animi aperiam tenetur 38.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