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; return data;
} }
}, }, {
{
targets: 'row-stock', targets: 'row-stock',
className: 'item-stock', className: 'item-stock',
sWidth: '1%', sWidth: '1%',
@ -541,7 +540,9 @@ var RepositoryDatatable = (function(global) {
// Show number of selected rows near pages info // Show number of selected rows near pages info
$('#repository-table_info').append('<span id="selected_info"></span>'); $('#repository-table_info').append('<span id="selected_info"></span>');
$('#selected_info').html(' (' + rowsSelected.length + ' entries selected)'); $('#selected_info').html(' (' + rowsSelected.length + ' entries selected)');
checkArchivedColumnsState(); if ($('.repository-show').hasClass('archived')) {
TABLE.columns([6, 7]).visible(true);
}
}, },
preDrawCallback: function() { preDrawCallback: function() {
var archived = $('.repository-show').hasClass('archived'); 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() { function renderFiltersDropdown() {
let dropdown = $('#repositoryFilterTemplate').html(); let dropdown = $('#repositoryFilterTemplate').html();
$('.toolbar-filters').html(dropdown); $('.toolbar-filters').html(dropdown);

View file

@ -19,15 +19,15 @@ module InputSanitizeHelper
end end
def custom_auto_link(text, options = {}) def custom_auto_link(text, options = {})
simple_f = options.fetch(:simple_format) { true } simple_f = options.fetch(:simple_format, true)
team = options.fetch(:team) { nil } team = options.fetch(:team, nil)
wrapper_tag = options.fetch(:wrapper_tag) { {} } wrapper_tag = options.fetch(:wrapper_tag) { {} }
tags = options.fetch(:tags) { [] } 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) 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 = 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( auto_link(
custom_link_open_new_tab(smart_annotation_parser(text, team, base64_encoded_imgs, preview_repository)), custom_link_open_new_tab(smart_annotation_parser(text, team, base64_encoded_imgs, preview_repository)),
link: :urls, link: :urls,

View file

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

View file

@ -10,7 +10,7 @@ module RepositoryDatatable
datetime: object.data.strftime('%Y/%m/%d %H:%M') 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'] reminder_delta = scope[:column].metadata['reminder_delta']
if !scope[:repository].is_a?(RepositorySnapshot) && reminder_delta if !scope[:repository].is_a?(RepositorySnapshot) && reminder_delta
data[:reminder] = reminder_delta.to_i + DateTime.now.to_i >= object.data.to_i 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') 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'] reminder_delta = scope[:column].metadata['reminder_delta']
if !scope[:repository].is_a?(RepositorySnapshot) && reminder_delta if !scope[:repository].is_a?(RepositorySnapshot) && reminder_delta
data[:reminder] = DateTime.now + reminder_delta.to_i.seconds >= object.data data[:reminder] = DateTime.now + reminder_delta.to_i.seconds >= object.data

View file

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

View file

@ -3,7 +3,7 @@
json.draw @draw json.draw @draw
json.data do json.data do
json.array! prepare_simple_view_row_columns( 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 end
json.recordsFiltered @repository_rows.first ? @repository_rows.first.filtered_count : 0 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, json.array! prepare_snapshot_row_columns(@repository_rows,
@columns_mappings, @columns_mappings,
@repository_snapshot.team, @repository_snapshot.team,
@repository_snapshot, @repository_snapshot)
{ include_stock_consumption: @repository_snapshot.has_stock_management? })
end end
json.recordsFiltered @repository_rows.first ? @repository_rows.first.filtered_count : 0 json.recordsFiltered @repository_rows.first ? @repository_rows.first.filtered_count : 0
json.recordsTotal @all_rows_count json.recordsTotal @all_rows_count

View file

@ -45,7 +45,7 @@
<% end %> <% end %>
</div> </div>
<div class="comment-message"> <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 %> <% if edit_mode %>
<%= text_area_tag 'message', comment.message, disabled: true, class: 'smart-text-area hidden' %> <%= text_area_tag 'message', comment.message, disabled: true, class: 'smart-text-area hidden' %>
<% end %> <% end %>