Improve repository table loading speed [SCI-7002]

This commit is contained in:
Oleksii Kriuchykhin 2022-07-25 15:39:11 +02:00
parent b9d953b3a4
commit 382d54320e
9 changed files with 35 additions and 42 deletions

View file

@ -487,8 +487,7 @@ var RepositoryDatatable = (function(global) {
}
return data;
}
},
{
}, {
targets: 'row-stock',
className: 'item-stock',
sWidth: '1%',
@ -541,7 +540,9 @@ var RepositoryDatatable = (function(global) {
// Show number of selected rows near pages info
$('#repository-table_info').append('<span id="selected_info"></span>');
$('#selected_info').html(' (' + rowsSelected.length + ' entries selected)');
checkArchivedColumnsState();
if ($('.repository-show').hasClass('archived')) {
TABLE.columns([6, 7]).visible(true);
}
},
preDrawCallback: function() {
var archived = $('.repository-show').hasClass('archived');
@ -870,15 +871,6 @@ var RepositoryDatatable = (function(global) {
});
}
function checkArchivedColumnsState() {
var archived = $('.repository-show').hasClass('archived');
$.each(TABLE.context[0].aoColumns, function(i, column) {
if (['archived-on', 'archived-by'].includes(column.nTh.id)) {
TABLE.column(column.idx).visible(archived);
}
});
}
function renderFiltersDropdown() {
let dropdown = $('#repositoryFilterTemplate').html();
$('.toolbar-filters').html(dropdown);

View file

@ -19,15 +19,15 @@ module InputSanitizeHelper
end
def custom_auto_link(text, options = {})
simple_f = options.fetch(:simple_format) { true }
team = options.fetch(:team) { nil }
simple_f = options.fetch(:simple_format, true)
team = options.fetch(:team, nil)
wrapper_tag = options.fetch(:wrapper_tag) { {} }
tags = options.fetch(:tags) { [] }
preview_repository = options.fetch(:preview_repository) { false }
preview_repository = options.fetch(:preview_repository, false)
format_opt = wrapper_tag.merge(sanitize: false)
base64_encoded_imgs = options.fetch(:base64_encoded_imgs) { false }
base64_encoded_imgs = options.fetch(:base64_encoded_imgs, false)
text = sanitize_input(text, tags)
text = simple_format(sanitize_input(text), {}, format_opt) if simple_f
text = simple_format(text, {}, format_opt) if simple_f
auto_link(
custom_link_open_new_tab(smart_annotation_parser(text, team, base64_encoded_imgs, preview_repository)),
link: :urls,

View file

@ -4,17 +4,18 @@ module RepositoryDatatableHelper
include InputSanitizeHelper
def prepare_row_columns(repository_rows, repository, columns_mappings, team, options = {})
reminder_row_ids = repository_reminder_row_ids(repository_rows, repository)
has_stock_management = repository.has_stock_management?
reminders_enabled = Repository.reminders_enabled?
reminder_row_ids = reminders_enabled ? repository_reminder_row_ids(repository_rows, repository) : []
repository_rows.map do |record|
default_cells = public_send("#{repository.class.name.underscore}_default_columns", record)
row = {
'DT_RowId': record.id,
'DT_RowAttr': { 'data-state': row_style(record) },
'recordInfoUrl': Rails.application.routes.url_helpers.repository_repository_row_path(repository, record),
'hasActiveReminders': reminder_row_ids.include?(record.id),
'rowRemindersUrl':
DT_RowId: record.id,
DT_RowAttr: { 'data-state': row_style(record) },
recordInfoUrl: Rails.application.routes.url_helpers.repository_repository_row_path(repository, record),
hasActiveReminders: reminder_row_ids.include?(record.id),
rowRemindersUrl:
Rails.application.routes.url_helpers
.active_reminder_repository_cells_repository_repository_row_url(
repository,
@ -51,7 +52,7 @@ module RepositoryDatatableHelper
custom_cells.each do |cell|
row[columns_mappings[cell.repository_column.id]] =
display_cell_value(cell, team, repository)
display_cell_value(cell, team, repository, reminders_enabled: reminders_enabled)
end
stock_cell = record.repository_cells.find { |cell| cell.value_type == 'RepositoryStockValue' }
@ -67,7 +68,7 @@ module RepositoryDatatableHelper
row['stock']['value_type'] = 'RepositoryStockValue'
if options[:include_stock_consumption] && record.repository.has_stock_management? && options[:my_module]
if options[:include_stock_consumption] && has_stock_management && options[:my_module]
consumption_managable = stock_consumption_managable?(record, repository, options[:my_module])
consumed_stock_formatted =
number_with_precision(
@ -97,7 +98,9 @@ module RepositoryDatatableHelper
end
def prepare_simple_view_row_columns(repository_rows, repository, my_module, options = {})
reminder_row_ids = repository_reminder_row_ids(repository_rows, repository)
has_stock_management = repository.has_stock_management?
reminders_enabled = Repository.reminders_enabled?
reminder_row_ids = reminders_enabled ? repository_reminder_row_ids(repository_rows, repository) : []
repository_rows.map do |record|
row = {
@ -105,8 +108,8 @@ module RepositoryDatatableHelper
DT_RowAttr: { 'data-state': row_style(record) },
'0': escape_input(record.name),
recordInfoUrl: Rails.application.routes.url_helpers.repository_repository_row_path(record.repository, record),
'hasActiveReminders': reminder_row_ids.include?(record.id),
'rowRemindersUrl':
hasActiveReminders: reminder_row_ids.include?(record.id),
rowRemindersUrl:
Rails.application.routes.url_helpers
.active_reminder_repository_cells_repository_repository_row_url(
record.repository,
@ -114,7 +117,7 @@ module RepositoryDatatableHelper
)
}
if options[:include_stock_consumption] && record.repository.has_stock_management?
if has_stock_management
stock_present = record.repository_stock_cell.present?
# Always disabled in a simple view
stock_managable = false
@ -164,6 +167,7 @@ module RepositoryDatatableHelper
end
def prepare_snapshot_row_columns(repository_rows, columns_mappings, team, repository_snapshot, options = {})
has_stock_management = repository_snapshot.has_stock_management?
repository_rows.map do |record|
row = {
'DT_RowId': record.id,
@ -180,7 +184,7 @@ module RepositoryDatatableHelper
row[columns_mappings[cell.repository_column.id]] = display_cell_value(cell, team, repository_snapshot)
end
if options[:include_stock_consumption] && repository_snapshot.has_stock_management?
if has_stock_management
row['stock'] = if record.repository_stock_cell.present?
display_cell_value(record.repository_stock_cell, team, repository_snapshot)
else
@ -251,7 +255,7 @@ module RepositoryDatatableHelper
}
end
def display_cell_value(cell, team, repository)
def display_cell_value(cell, team, repository, options = {})
serializer_class = "RepositoryDatatable::#{cell.repository_column.data_type}Serializer".constantize
serializer_class.new(
cell.value,
@ -259,7 +263,8 @@ module RepositoryDatatableHelper
team: team,
user: current_user,
column: cell.repository_column,
repository: repository
repository: repository,
options: options
}
).serializable_hash
end
@ -271,9 +276,6 @@ module RepositoryDatatableHelper
end
def repository_reminder_row_ids(repository_rows, repository)
# don't load reminders if the stock management feature is disabled
return [] unless RepositoryBase.stock_management_enabled?
# don't load reminders for archived repositories
return [] if repository_rows.blank? || repository.archived?

View file

@ -10,7 +10,7 @@ module RepositoryDatatable
datetime: object.data.strftime('%Y/%m/%d %H:%M')
}
if RepositoryBase.reminders_enabled?
if scope.dig(:options, :reminders_enabled)
reminder_delta = scope[:column].metadata['reminder_delta']
if !scope[:repository].is_a?(RepositorySnapshot) && reminder_delta
data[:reminder] = reminder_delta.to_i + DateTime.now.to_i >= object.data.to_i

View file

@ -8,7 +8,7 @@ module RepositoryDatatable
datetime: object.data.strftime('%Y/%m/%d %H:%M')
}
if RepositoryBase.reminders_enabled?
if scope.dig(:options, :reminders_enabled)
reminder_delta = scope[:column].metadata['reminder_delta']
if !scope[:repository].is_a?(RepositorySnapshot) && reminder_delta
data[:reminder] = DateTime.now + reminder_delta.to_i.seconds >= object.data

View file

@ -10,7 +10,7 @@ module RepositoryDatatable
@user = scope[:user]
{
view: custom_auto_link(object.data, simple_format: true, team: scope[:team]),
edit: sanitize_input(object.data)
edit: object.data
}
end
end

View file

@ -3,7 +3,7 @@
json.draw @draw
json.data do
json.array! prepare_simple_view_row_columns(
@repository_rows, @repository, @my_module, { include_stock_consumption: @repository.has_stock_management? }
@repository_rows, @repository, @my_module
)
end
json.recordsFiltered @repository_rows.first ? @repository_rows.first.filtered_count : 0

View file

@ -5,8 +5,7 @@ json.data do
json.array! prepare_snapshot_row_columns(@repository_rows,
@columns_mappings,
@repository_snapshot.team,
@repository_snapshot,
{ include_stock_consumption: @repository_snapshot.has_stock_management? })
@repository_snapshot)
end
json.recordsFiltered @repository_rows.first ? @repository_rows.first.filtered_count : 0
json.recordsTotal @all_rows_count

View file

@ -45,7 +45,7 @@
<% end %>
</div>
<div class="comment-message">
<div class="view-mode"><%= custom_auto_link(comment.message, team: current_team, simple_format: true).html_safe %></div>
<div class="view-mode"><%= custom_auto_link(comment.message, team: current_team, simple_format: true) %></div>
<% if edit_mode %>
<%= text_area_tag 'message', comment.message, disabled: true, class: 'smart-text-area hidden' %>
<% end %>