Improve Inventory table loading time [SCI-6886]

This commit is contained in:
Oleksii Kriuchykhin 2022-06-08 13:23:39 +02:00
parent bb067974b4
commit 07716e56a5
4 changed files with 18 additions and 12 deletions

View file

@ -26,6 +26,7 @@ class RepositoryRowsController < ApplicationController
@repository_rows = datatable_service.repository_rows @repository_rows = datatable_service.repository_rows
.preload(:repository_columns, .preload(:repository_columns,
:created_by, :created_by,
:archived_by,
repository_cells: { value: @repository.cell_preload_includes }) repository_cells: { value: @repository.cell_preload_includes })
.page(page) .page(page)
.per(per_page) .per(per_page)

View file

@ -5,6 +5,7 @@ module RepositoryDatatableHelper
def prepare_row_columns(repository_rows, repository, columns_mappings, team, options = {}) def prepare_row_columns(repository_rows, repository, columns_mappings, team, options = {})
reminder_row_ids = repository_reminder_row_ids(repository_rows, repository) reminder_row_ids = repository_reminder_row_ids(repository_rows, repository)
has_stock_management = repository.has_stock_management?
repository_rows.map do |record| repository_rows.map do |record|
default_cells = public_send("#{repository.class.name.underscore}_default_columns", record) default_cells = public_send("#{repository.class.name.underscore}_default_columns", record)
@ -21,7 +22,7 @@ module RepositoryDatatableHelper
) )
}.merge(default_cells) }.merge(default_cells)
if record.repository.has_stock_management? if has_stock_management
row['manageStockUrl'] = if record.has_stock? row['manageStockUrl'] = if record.has_stock?
Rails.application.routes.url_helpers Rails.application.routes.url_helpers
.edit_repository_stock_repository_repository_row_url( .edit_repository_stock_repository_repository_row_url(
@ -46,21 +47,23 @@ module RepositoryDatatableHelper
row['0'] = record[:row_assigned] if options[:my_module] row['0'] = record[:row_assigned] if options[:my_module]
# Add custom columns # Add custom columns
custom_cells = record.repository_cells.where.not(value_type: 'RepositoryStockValue') custom_cells = record.repository_cells.filter { |cell| cell.value_type != 'RepositoryStockValue' }
custom_cells.each do |cell| custom_cells.each do |cell|
row[columns_mappings[cell.repository_column.id]] = row[columns_mappings[cell.repository_column.id]] =
display_cell_value(cell, team, repository) display_cell_value(cell, team, repository)
end end
stock_present = record.repository_stock_cell.present? stock_cell = record.repository_cells.find { |cell| cell.value_type == 'RepositoryStockValue' }
stock_managable = !options[:disable_stock_management] && can_manage_repository_stock?(record.repository) stock_managable = has_stock_management &&
!options[:disable_stock_management] &&
can_manage_repository_stock?(record.repository)
# always add stock cell, even if empty # always add stock cell, even if empty
row['stock'] = stock_present ? display_cell_value(record.repository_stock_cell, team, repository) : {} row['stock'] = stock_cell.present? ? display_cell_value(record.repository_stock_cell, team, repository) : {}
row['stock'][:stock_managable] = stock_managable row['stock'][:stock_managable] = stock_managable
row['stock']['displayWarnings'] = display_stock_warnings?(repository) row['stock']['displayWarnings'] = display_stock_warnings?(repository)
row['stock'][:stock_status] = record.repository_stock_cell&.value&.status row['stock'][:stock_status] = stock_cell&.value&.status
row['stock']['value_type'] = 'RepositoryStockValue' row['stock']['value_type'] = 'RepositoryStockValue'
@ -73,7 +76,7 @@ module RepositoryDatatableHelper
strip_insignificant_zeros: true strip_insignificant_zeros: true
) )
row['consumedStock'] = { row['consumedStock'] = {
stock_present: stock_present, stock_present: stock_cell.present?,
consumptionPermitted: stock_consumption_permitted?(repository, options[:my_module]), consumptionPermitted: stock_consumption_permitted?(repository, options[:my_module]),
consumptionManagable: consumption_managable, consumptionManagable: consumption_managable,
updateStockConsumptionUrl: Rails.application.routes.url_helpers.consume_modal_my_module_repository_path( updateStockConsumptionUrl: Rails.application.routes.url_helpers.consume_modal_my_module_repository_path(

View file

@ -13,17 +13,19 @@ module ReminderRepositoryCellJoinable
'(repository_date_time_values.data - NOW()) <= '\ '(repository_date_time_values.data - NOW()) <= '\
'(repository_columns.metadata ->> \'reminder_delta\')::int * interval \'1 sec\'' '(repository_columns.metadata ->> \'reminder_delta\')::int * interval \'1 sec\''
).joins( # stock reminders ).joins( # stock reminders
'LEFT OUTER JOIN "repository_stock_values" ON "repository_stock_values"."id" = "repository_cells"."value_id" AND '\ 'LEFT OUTER JOIN "repository_stock_values" ON '\
'"repository_cells"."value_type" = \'RepositoryStockValue\' AND '\ '"repository_cells"."value_type" = \'RepositoryStockValue\' AND '\
'"repository_stock_values"."id" = "repository_cells"."value_id" AND '\
'(repository_stock_values.amount <= repository_stock_values.low_stock_threshold OR '\ '(repository_stock_values.amount <= repository_stock_values.low_stock_threshold OR '\
' repository_stock_values.amount <= 0)' ' repository_stock_values.amount <= 0)'
).joins( ).joins(
'LEFT OUTER JOIN "hidden_repository_cell_reminders" ON '\ 'LEFT OUTER JOIN "hidden_repository_cell_reminders" ON '\
'"repository_cells"."id" = "hidden_repository_cell_reminders"."repository_cell_id" AND '\ '"repository_cells"."id" = "hidden_repository_cell_reminders"."repository_cell_id"'
'"hidden_repository_cell_reminders"."user_id" = ' + user.id.to_s
).where( ).where(
'"hidden_repository_cell_reminders"."user_id" = ? AND '\
'hidden_repository_cell_reminders.id IS NULL AND '\ 'hidden_repository_cell_reminders.id IS NULL AND '\
'(repository_date_time_values.id IS NOT NULL OR repository_stock_values.id IS NOT NULL)' '(repository_date_time_values.id IS NOT NULL OR repository_stock_values.id IS NOT NULL)',
user.id
) )
end end
end end

View file

@ -64,7 +64,7 @@ Canaid::Permissions.register_for(Repository) do
if repository.shared_with?(user.current_team) if repository.shared_with?(user.current_team)
repository.shared_with_write?(user.current_team) && user.is_normal_user_or_admin_of_team?(user.current_team) repository.shared_with_write?(user.current_team) && user.is_normal_user_or_admin_of_team?(user.current_team)
elsif user.teams.include?(repository.team) else
user.is_normal_user_or_admin_of_team?(repository.team) user.is_normal_user_or_admin_of_team?(repository.team)
end end
end end