diff --git a/app/assets/javascripts/my_modules/repositories.js b/app/assets/javascripts/my_modules/repositories.js index 9064429a7..4668666c1 100644 --- a/app/assets/javascripts/my_modules/repositories.js +++ b/app/assets/javascripts/my_modules/repositories.js @@ -97,6 +97,62 @@ var MyModuleRepositories = (function() { return columnDefs; } + function simpleTableColumns(tableContainer) { + let columns = [ + { + visible: true, + searchable: false, + data: 0 + } + ]; + + if ($(tableContainer).data('stock-management')) { + columns.push({ + visible: true, + searchable: false, + data: 1 + }); + columns.push({ + visible: true, + searchable: false, + data: 2 + }); + } + + return columns; + } + + function simpleViewColumnDefs(tableContainer) { + let columnDefs = [{ + targets: 0, + className: 'item-name', + render: function(data, type, row) { + return "" + data + ''; + } + }]; + + if ($(tableContainer).data('stock-management')) { + columnDefs.push({ + targets: 1, + className: 'item-stock', + sWidth: '1%', + render: function(data) { + return $.fn.dataTable.render.RepositoryStockValue(data); + } + }, { + targets: 2, + className: 'item-consumed-stock', + sWidth: '1%', + render: function(data) { + return $.fn.dataTable.render.RepositoryConsumedStockValue(data); + } + }); + } + + return columnDefs; + } + function renderSimpleTable(tableContainer) { if (SIMPLE_TABLE) SIMPLE_TABLE.destroy(); SIMPLE_TABLE = $(tableContainer).DataTable({ @@ -121,14 +177,8 @@ var MyModuleRepositories = (function() { global: false, type: 'POST' }, - columnDefs: [{ - targets: 0, - className: 'item-name', - render: function(data, type, row) { - return "" + data + ''; - } - }], + columns: simpleTableColumns(tableContainer), + columnDefs: simpleViewColumnDefs(tableContainer), drawCallback: function() { var repositoryContainer = $(this).closest('.assigned-repository-container'); repositoryContainer.find('.table.dataTable').removeClass('hidden'); @@ -299,12 +349,13 @@ var MyModuleRepositories = (function() { function initSimpleTable() { $('#assigned-items-container').on('shown.bs.collapse', '.assigned-repository-container', function() { var repositoryContainer = $(this); - var repositoryTemplate = $($('#myModuleRepositorySimpleTemplate').html()); - repositoryTemplate.attr('data-source', $(this).data('repository-url')); - repositoryTemplate.attr('data-version-label', $(this).data('footer-label')); - repositoryTemplate.attr('data-name-column-id', $(this).data('name-column-id')); - repositoryContainer.html(repositoryTemplate); - renderSimpleTable(repositoryTemplate); + var repositoryTable = repositoryContainer.find('.table'); + repositoryTable.attr('data-source', $(this).data('repository-url')); + repositoryTable.attr('data-version-label', $(this).data('footer-label')); + repositoryTable.attr('data-name-column-id', $(this).data('name-column-id')); + repositoryTable.attr('data-stock-management', $(this).data('data-stock-management')); + repositoryContainer.html(repositoryTable); + renderSimpleTable(repositoryTable); }); $('#wrapper').on('sideBar::shown sideBar::hidden', function() { diff --git a/app/assets/javascripts/repositories/renderers/view_renderers.js b/app/assets/javascripts/repositories/renderers/view_renderers.js index 735445844..4638fa1b6 100644 --- a/app/assets/javascripts/repositories/renderers/view_renderers.js +++ b/app/assets/javascripts/repositories/renderers/view_renderers.js @@ -194,7 +194,8 @@ $.fn.dataTable.render.RepositoryStockValue = function(data) { ${data.value.stock_amount <= 0 ? 'stock-alert' : ''}"> ${data.value.stock_formatted} `; - } else if (canManage) { + } + if (canManage) { return ` ${I18n.t('libraries.manange_modal_column.stock_type.add_stock')} @@ -205,6 +206,27 @@ $.fn.dataTable.render.RepositoryStockValue = function(data) { `; }; +$.fn.dataTable.render.RepositoryConsumedStockValue = function(data) { + let canManage = $('.repository-table').data('stock-consumption-editable'); + if (data && data.value.consumed_stock_formatted) { + if (canManage) { + return ` + ${data.value.consumed_stock_formatted} + `; + } + return ` + ${data.value.consumed_stock_formatted} + `; + } + if (canManage && data && data.stock_present) { + return ` + + ${I18n.t('libraries.manange_modal_column.stock_type.add_stock_consumption')} + `; + } + return ' - '; +}; + $.fn.dataTable.render.defaultRepositoryStockValue = function() { return $.fn.dataTable.render.RepositoryStockValue(); }; diff --git a/app/helpers/repository_datatable_helper.rb b/app/helpers/repository_datatable_helper.rb index 1a4cc7f66..ef80a1455 100644 --- a/app/helpers/repository_datatable_helper.rb +++ b/app/helpers/repository_datatable_helper.rb @@ -52,12 +52,27 @@ module RepositoryDatatableHelper def prepare_simple_view_row_columns(repository_rows) repository_rows.map do |record| - { - 'DT_RowId': record.id, - 'DT_RowAttr': { 'data-state': row_style(record) }, + row = { + DT_RowId: record.id, + 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) + recordInfoUrl: Rails.application.routes.url_helpers.repository_repository_row_path(record.repository, record) } + + if record.repository.has_stock_management? + row['1'] = + if record.repository_stock_cell.present? + display_cell_value(record.repository_stock_cell, record.repository.team) + end + row['2'] = { + stock_present: record.repository_stock_cell.present?, + value: { + consumed_stock_formatted: record.consumed_stock + } + } + end + + row end end diff --git a/app/models/repository.rb b/app/models/repository.rb index 086d339cb..5696bccea 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -211,6 +211,14 @@ class Repository < RepositoryBase .destroy_all end + def self.stock_management_enabled? + true + end + + def has_stock_management? + self.class.stock_management_enabled? && repository_columns.stock_type.exists? + end + private def sync_name_with_snapshots diff --git a/app/models/repository_base.rb b/app/models/repository_base.rb index 715710107..c7d3187a6 100644 --- a/app/models/repository_base.rb +++ b/app/models/repository_base.rb @@ -10,6 +10,12 @@ class RepositoryBase < ApplicationRecord belongs_to :team belongs_to :created_by, foreign_key: :created_by_id, class_name: 'User' has_many :repository_columns, foreign_key: :repository_id, inverse_of: :repository, dependent: :destroy + has_one :repository_stock_column, + -> { where(data_type: 'RepositoryStockValue') }, + class_name: 'RepositoryColumn', + foreign_key: :repository_id, + inverse_of: :repository, + dependent: :destroy has_many :repository_rows, foreign_key: :repository_id, inverse_of: :repository, dependent: :destroy has_many :repository_table_states, foreign_key: :repository_id, inverse_of: :repository, dependent: :destroy has_many :report_elements, inverse_of: :repository, dependent: :destroy, foreign_key: :repository_id diff --git a/app/models/repository_column.rb b/app/models/repository_column.rb index 97238d175..da2a68ad4 100644 --- a/app/models/repository_column.rb +++ b/app/models/repository_column.rb @@ -40,7 +40,7 @@ class RepositoryColumn < ApplicationRecord scope :asset_type, -> { where(data_type: 'RepositoryAssetValue') } scope :status_type, -> { where(data_type: 'RepositoryStatusValue') } scope :checkbox_type, -> { where(data_type: 'RepositoryChecklistValue') } - scope :stock_unit_type, -> { where(data_type: 'RepositoryStockUnitValue') } + scope :stock_type, -> { where(data_type: 'RepositoryStockValue') } def self.name_like(query) where('repository_columns.name ILIKE ?', "%#{query}%") diff --git a/app/services/repository_datatable_service.rb b/app/services/repository_datatable_service.rb index efa66d9b8..0ea58d19d 100644 --- a/app/services/repository_datatable_service.rb +++ b/app/services/repository_datatable_service.rb @@ -37,6 +37,10 @@ class RepositoryDatatableService if @params[:assigned] == 'assigned' repository_rows = repository_rows.joins(:my_module_repository_rows) .where(my_module_repository_rows: { my_module_id: @my_module }) + if @repository.has_stock_management? + repository_rows = repository_rows + .select('SUM(my_module_repository_rows.stock_consumption) AS "consumed_stock"') + end else repository_rows = repository_rows .joins(:repository) diff --git a/app/views/my_modules/repositories/_repositories_list.html.erb b/app/views/my_modules/repositories/_repositories_list.html.erb index 287ea5042..7684a5a52 100644 --- a/app/views/my_modules/repositories/_repositories_list.html.erb +++ b/app/views/my_modules/repositories/_repositories_list.html.erb @@ -27,17 +27,20 @@ data-footer-label="<%= assigned_repository_simple_view_footer_label(repository) %>" data-name-column-id="<%= assigned_repository_simple_view_name_column_id(repository) %>" > + + + + + <% if repository.has_stock_management? %> + + + <% end %> + + + + <% end %> - - diff --git a/config/locales/en.yml b/config/locales/en.yml index 3f7204857..f6ae1b43e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1391,6 +1391,7 @@ en: no_items_matched: "No items matched your search request" no_archived_items: "No archived items here" no_archived_items_matched: "No archived items matched your search request" + no_stock: "No item stock" table: id: 'ID' @@ -1402,6 +1403,7 @@ en: added_by: "Added by" archived_on: "Archived on" archived_by: "Archived by" + row_consumption: "Consumed" enter_row_name: "Enter name" locked_item: "This is read-only item." assets: @@ -1617,6 +1619,7 @@ en: stock_units: 'Stock units' units_description: 'These units will appear when managing your stock. You can always add, remove or rename them in the list.' add_stock: 'Add stock' + add_stock_consumption: 'Consume' no_item_stock: 'No item stock' checklist_type: multiple_options: 'selected'