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

Developer Project Report hours
Ethyl Ankunding animi aperiam tenetur 83.0
Ethyl Ankunding doloribus hic corporis 38.0
Ethyl Ankunding eum amet quia 48.0
Ethyl Ankunding odio velit repudiandae 80.0
Ethyl Ankunding perspiciatis totam perferendis 62.0
Ethyl Ankunding quibusdam sed sit 38.0
Ethyl Ankunding repudiandae officiis qui 37.0
Ethyl Ankunding saepe hic temporibus 41.0
Ethyl Ankunding suscipit consectetur beatae 96.0
Ethyl Ankunding vitae eum pariatur 37.0
Evangelina Pfeffer animi aperiam tenetur 70.0
Evangelina Pfeffer doloribus hic corporis 68.0
Evangelina Pfeffer eum amet quia 98.0
Evangelina Pfeffer odio velit repudiandae 54.0
Evangelina Pfeffer perspiciatis totam perferendis 69.0
Evangelina Pfeffer quibusdam sed sit 98.0
Evangelina Pfeffer repudiandae officiis qui 70.0
Evangelina Pfeffer saepe hic temporibus 48.0
Evangelina Pfeffer suscipit consectetur beatae 53.0
Evangelina Pfeffer vitae eum pariatur 37.0
Felisa Jaskolski animi aperiam tenetur 39.0
Felisa Jaskolski doloribus hic corporis 24.0
Felisa Jaskolski eum amet quia 45.0
Felisa Jaskolski odio velit repudiandae 69.0
Felisa Jaskolski perspiciatis totam perferendis 32.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