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

Developer Project Company Report hours
Jewell Swaniawski odio velit repudiandae
Apple
88.0
Alex Legros eum amet quia
Google
88.0
Vivien Murray animi aperiam tenetur
Google
88.0
Joelle Hodkiewicz odio velit repudiandae
Apple
88.0
Thaddeus Stanton saepe hic temporibus
Microsoft
89.0
Winfred Franecki animi aperiam tenetur
Google
89.0
Bridgett Reilly animi aperiam tenetur
Google
89.0
German Murphy animi aperiam tenetur
Google
89.0
Alex Legros repudiandae officiis qui
Google
89.0
Penney Schowalter suscipit consectetur beatae
Google
89.0
Isidro McCullough saepe hic temporibus
Microsoft
89.0
Myrtle O'Conner repudiandae officiis qui
Google
89.0
Rebecca Rempel animi aperiam tenetur
Google
89.0
Palmira Fay saepe hic temporibus
Microsoft
89.0
Blake Hoppe suscipit consectetur beatae
Google
90.0
Myriam Von repudiandae officiis qui
Google
90.0
Adrienne Eichmann odio velit repudiandae
Apple
90.0
Gwendolyn Satterfield suscipit consectetur beatae
Google
90.0
Royce Spencer eum amet quia
Google
90.0
Cherly Kovacek eum amet quia
Google
90.0
Tami Gibson odio velit repudiandae
Apple
90.0
Lesia Hyatt perspiciatis totam perferendis
Apple
90.0
Claudette Hagenes repudiandae officiis qui
Google
90.0
Jeanne Witting eum amet quia
Google
91.0
Juliana Hauck animi aperiam tenetur
Google
91.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