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

Developer Project Company Report hours
Penney Schowalter vitae eum pariatur
Google
46.0
Raquel Runolfsson vitae eum pariatur
Google
79.0
Rebecca Rempel vitae eum pariatur
Google
48.0
Reinaldo Heidenreich vitae eum pariatur
Google
64.0
Rossana Schneider vitae eum pariatur
Google
59.0
Royce Spencer vitae eum pariatur
Google
72.0
Salley Kilback vitae eum pariatur
Google
96.0
Shane Glover vitae eum pariatur
Google
69.0
Shannon Botsford vitae eum pariatur
Google
49.0
Shara Labadie vitae eum pariatur
Google
53.0
Sixta Bashirian vitae eum pariatur
Google
88.0
Sylvester Hane vitae eum pariatur
Google
84.0
Tamera Bogan vitae eum pariatur
Google
36.0
Tami Gibson vitae eum pariatur
Google
61.0
Tamika Cronin vitae eum pariatur
Google
48.0
Terisa Ruecker vitae eum pariatur
Google
69.0
Tess Nikolaus vitae eum pariatur
Google
74.0
Thaddeus Stanton vitae eum pariatur
Google
94.0
Treena Wolf vitae eum pariatur
Google
38.0
Verla Friesen vitae eum pariatur
Google
64.0
Vernia Dietrich vitae eum pariatur
Google
52.0
Vivien Murray vitae eum pariatur
Google
112.0
Wen Daniel vitae eum pariatur
Google
38.0
Wiley Wuckert vitae eum pariatur
Google
110.0
Winfred Franecki vitae eum pariatur
Google
69.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