From 20ef08907a442a804225fdd3e211b8ce16dec8bb Mon Sep 17 00:00:00 2001 From: artoscinote <85488244+artoscinote@users.noreply.github.com> Date: Tue, 8 Mar 2022 14:52:45 +0100 Subject: [PATCH] Stock column fixes [SCI-6455] (#3878) * Fix issues with stock column management [SCI-6455] * Refactor stock column in datatables [SCI-6455] --- .../javascripts/my_modules/repositories.js | 29 ++++++++-------- app/assets/javascripts/repositories/index.js | 9 +++++ .../repositories/renderers/view_renderers.js | 34 ++++++++++--------- .../repositories/repository_datatable.js | 16 +++++++-- .../columns_initializers/stock_column_type.js | 2 +- .../my_module_repositories_controller.rb | 2 ++ app/helpers/repository_datatable_helper.rb | 14 ++++++-- .../repository_stock_value_serializer.rb | 2 ++ .../update_stock_column_service.rb | 2 +- .../repositories/_full_view_table.html.erb | 2 +- .../repositories/_repository_table.html.erb | 2 +- .../_manage_column_modal_content.html.erb | 9 ----- 12 files changed, 74 insertions(+), 49 deletions(-) diff --git a/app/assets/javascripts/my_modules/repositories.js b/app/assets/javascripts/my_modules/repositories.js index 3e0ad483b..50791f220 100644 --- a/app/assets/javascripts/my_modules/repositories.js +++ b/app/assets/javascripts/my_modules/repositories.js @@ -11,7 +11,7 @@ var MyModuleRepositories = (function() { var FULL_VIEW_TABLE_SCROLLBAR; var SELECTED_ROWS = {}; - function stockManagementColumns(otherColumnCount) { + function stockManagementColumns() { return [ { visible: true, @@ -65,17 +65,20 @@ var MyModuleRepositories = (function() { columns[i].defaultContent = ''; if (skipCheckbox && i === 0) columns[i].visible = false; } + customColumns.each((i, column) => { - columns.push({ - visible: true, - searchable: true, - data: String(columns.length), - defaultContent: $.fn.dataTable.render['default' + column.dataset.type](column.id) - }); + if (!$(column).hasClass('item-stock')) { + columns.push({ + visible: true, + searchable: true, + data: String(columns.length), + defaultContent: $.fn.dataTable.render['default' + column.dataset.type](column.id) + }); + } }); if ($(tableContainer).data('stock-management')) { - columns.push(stockManagementColumns(columns.length)[1]); + columns = columns.concat(stockManagementColumns()); } return columns; @@ -121,6 +124,9 @@ var MyModuleRepositories = (function() { }); } + if ($(tableContainer).data('stock-management')) { + columnDefs = columnDefs.concat(stockManagementColumnDefs()); + } columnDefs.push( { @@ -137,11 +143,6 @@ var MyModuleRepositories = (function() { } ); - if ($(tableContainer).data('stock-management')) { - let stockColumnDef = stockManagementColumnDefs()[1]; - columnDefs.push(stockColumnDef); - } - return columnDefs; } @@ -155,7 +156,7 @@ var MyModuleRepositories = (function() { ]; if ($(tableContainer).data('stock-management')) { - columns = columns.concat(stockManagementColumns(columns.length)); + columns = columns.concat(stockManagementColumns()); } return columns; diff --git a/app/assets/javascripts/repositories/index.js b/app/assets/javascripts/repositories/index.js index 5d31ec948..30280b6d7 100644 --- a/app/assets/javascripts/repositories/index.js +++ b/app/assets/javascripts/repositories/index.js @@ -86,6 +86,15 @@ }, { targets: 8, visible: archived + }, + { + visible: true, + searchable: false, + data: 'stock', + render: { + _: 'display', + sort: 'sort' + } }], fnInitComplete: function(e) { var dataTableWrapper = $(e.nTableWrapper); diff --git a/app/assets/javascripts/repositories/renderers/view_renderers.js b/app/assets/javascripts/repositories/renderers/view_renderers.js index 282971193..7a27530b3 100644 --- a/app/assets/javascripts/repositories/renderers/view_renderers.js +++ b/app/assets/javascripts/repositories/renderers/view_renderers.js @@ -181,24 +181,26 @@ $.fn.dataTable.render.AssignedTasksValue = function(data) { return "
0
"; }; -$.fn.dataTable.render.RepositoryStockValue = function(data, row) { - if (data && data.value) { - if (row && row.manageStockUrl) { - return ` +$.fn.dataTable.render.RepositoryStockValue = function(data) { + if (data) { + if (data.value) { + if (data.stock_managable) { + return ` + ${data.value.stock_formatted} + `; + } + return ` ${data.value.stock_formatted} - `; + `; + } + if (data.stock_managable) { + return ` + + ${I18n.t('libraries.manange_modal_column.stock_type.add_stock')} + `; } - return ` - ${data.value.stock_formatted} - `; - } - if (data && row && row.manageStockUrl) { - return ` - - ${I18n.t('libraries.manange_modal_column.stock_type.add_stock')} - `; } return ` ${I18n.t('libraries.manange_modal_column.stock_type.no_item_stock')} diff --git a/app/assets/javascripts/repositories/repository_datatable.js b/app/assets/javascripts/repositories/repository_datatable.js index 86ba3866b..331f88442 100644 --- a/app/assets/javascripts/repositories/repository_datatable.js +++ b/app/assets/javascripts/repositories/repository_datatable.js @@ -458,12 +458,20 @@ var RepositoryDatatable = (function(global) { visible: true }, { targets: '_all', - render: function(data, type, row) { + render: function(data) { if (typeof data === 'object' && $.fn.dataTable.render[data.value_type]) { - return $.fn.dataTable.render[data.value_type](data, row); + return $.fn.dataTable.render[data.value_type](data); } return data; } + }, + { + targets: 'row-stock', + className: 'item-stock', + sWidth: '1%', + render: function(data) { + return $.fn.dataTable.render.RepositoryStockValue(data); + } }], language: { emptyTable: I18n.t('repositories.show.no_items'), @@ -488,13 +496,15 @@ var RepositoryDatatable = (function(global) { columns[i].defaultContent = ''; } customColumns.each((i, column) => { + var columnData = $(column).data('type') === 'RepositoryStockValue' ? 'stock' : String(columns.length); columns.push({ visible: true, searchable: true, - data: String(columns.length), + data: columnData, defaultContent: $.fn.dataTable.render['default' + column.dataset.type](column.id) }); }); + return columns; }()), drawCallback: function() { diff --git a/app/assets/javascripts/repository_columns/columns_initializers/stock_column_type.js b/app/assets/javascripts/repository_columns/columns_initializers/stock_column_type.js index 01519ebfb..b093ee3f8 100644 --- a/app/assets/javascripts/repository_columns/columns_initializers/stock_column_type.js +++ b/app/assets/javascripts/repository_columns/columns_initializers/stock_column_type.js @@ -5,7 +5,7 @@ var RepositoryStockColumnType = (function() { var delimiterDropdown = '.stock-column-type #delimiter'; var itemsTextarea = '.stock-column-type .items-textarea'; var previewContainer = '.stock-column-type .dropdown-preview'; - var dropdownOptions = '.stock-column-type .dropdown-options'; + var dropdownOptions = '.stock-column-type #dropdown-options'; function initStockUnitDropdown() { dropdownSelector.init(previewContainer + ' .preview-select', { diff --git a/app/controllers/my_module_repositories_controller.rb b/app/controllers/my_module_repositories_controller.rb index 0e6dee9ca..d876db0ee 100644 --- a/app/controllers/my_module_repositories_controller.rb +++ b/app/controllers/my_module_repositories_controller.rb @@ -162,6 +162,8 @@ class MyModuleRepositoriesController < ApplicationController module_repository_row.with_lock do module_repository_row.assign_attributes( stock_consumption: params[:stock_consumption], + repository_stock_unit_item_id: + module_repository_row.repository_row.repository_stock_value.repository_stock_unit_item_id, last_modified_by: current_user, comment: params[:comment] ) diff --git a/app/helpers/repository_datatable_helper.rb b/app/helpers/repository_datatable_helper.rb index b838b3ab5..7d7aa13f3 100644 --- a/app/helpers/repository_datatable_helper.rb +++ b/app/helpers/repository_datatable_helper.rb @@ -46,15 +46,22 @@ module RepositoryDatatableHelper row['0'] = record[:row_assigned] if options[:my_module] # Add custom columns - custom_cells = record.repository_cells + custom_cells = record.repository_cells.where.not(value_type: 'RepositoryStockValue') custom_cells.each do |cell| row[columns_mappings[cell.repository_column.id]] = display_cell_value(cell, team) end + stock_present = record.repository_stock_cell.present? + stock_managable = !options[:include_stock_consumption] && can_manage_repository_rows?(record.repository) + + # always add stock cell, even if empty + row['stock'] = stock_present ? display_cell_value(record.repository_stock_cell, team) : {} + row['stock'][:stock_managable] = stock_managable + row['stock']['value_type'] = 'RepositoryStockValue' + if options[:include_stock_consumption] && record.repository.has_stock_management? && options[:my_module] - stock_present = record.repository_stock_cell.present? consumption_managable = stock_present && record.repository.is_a?(Repository) && can_update_my_module_stock_consumption?(options[:my_module]) @@ -68,7 +75,8 @@ module RepositoryDatatableHelper ), value: { consumed_stock: record.consumed_stock, - unit: record.repository_stock_value&.repository_stock_unit_item&.data + consumed_stock_formatted: + "#{record.consumed_stock} #{record.repository_stock_value&.repository_stock_unit_item&.data}" } } end diff --git a/app/serializers/repository_datatable/repository_stock_value_serializer.rb b/app/serializers/repository_datatable/repository_stock_value_serializer.rb index 2892cbaa6..81baf372d 100644 --- a/app/serializers/repository_datatable/repository_stock_value_serializer.rb +++ b/app/serializers/repository_datatable/repository_stock_value_serializer.rb @@ -2,6 +2,8 @@ module RepositoryDatatable class RepositoryStockValueSerializer < RepositoryBaseValueSerializer + include Canaid::Helpers::PermissionsHelper + def value { stock_formatted: object.formatted, diff --git a/app/services/repository_columns/update_stock_column_service.rb b/app/services/repository_columns/update_stock_column_service.rb index f73cf96b7..717856963 100644 --- a/app/services/repository_columns/update_stock_column_service.rb +++ b/app/services/repository_columns/update_stock_column_service.rb @@ -13,7 +13,7 @@ module RepositoryColumns @column.lock! - updating_units_names = @params[:repository_stock_unit_items_attributes].to_a.map { |e| e[:data] } + updating_units_names = @params[:repository_stock_unit_items_attributes].to_a.pluck(:data) existing_units_names = @column.repository_stock_unit_items.pluck(:data) to_be_deleted = existing_units_names - updating_units_names to_be_created = updating_units_names - existing_units_names diff --git a/app/views/my_modules/repositories/_full_view_table.html.erb b/app/views/my_modules/repositories/_full_view_table.html.erb index 374633b83..851532bd6 100644 --- a/app/views/my_modules/repositories/_full_view_table.html.erb +++ b/app/views/my_modules/repositories/_full_view_table.html.erb @@ -28,7 +28,7 @@ <%= t("repositories.table.archived_by") %> <% @repository.repository_columns.order(:id).each do |column| %> diff --git a/app/views/repositories/_repository_table.html.erb b/app/views/repositories/_repository_table.html.erb index 14f353075..109897d64 100644 --- a/app/views/repositories/_repository_table.html.erb +++ b/app/views/repositories/_repository_table.html.erb @@ -40,7 +40,7 @@ <%= t("repositories.table.archived_by") %> <% repository.repository_columns.order(:id).each do |column| %> > <%= t('libraries.manange_modal_column.select.repository_time_value') %> - - - -