mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-11-10 00:11:22 +08:00
Fix import and validation for containers without box [SCI-11065]
This commit is contained in:
parent
656e386cdd
commit
3fc6f20bd4
5 changed files with 35 additions and 10 deletions
|
|
@ -31,7 +31,7 @@ class StorageLocationRepositoryRowsController < ApplicationController
|
||||||
render json: @storage_location_repository_row,
|
render json: @storage_location_repository_row,
|
||||||
serializer: Lists::StorageLocationRepositoryRowSerializer
|
serializer: Lists::StorageLocationRepositoryRowSerializer
|
||||||
else
|
else
|
||||||
render json: @storage_location_repository_row.errors, status: :unprocessable_entity
|
render json: { errors: @storage_location_repository_row.errors.full_messages }, status: :unprocessable_entity
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -45,7 +45,7 @@ class StorageLocationRepositoryRowsController < ApplicationController
|
||||||
render json: @storage_location_repository_row,
|
render json: @storage_location_repository_row,
|
||||||
serializer: Lists::StorageLocationRepositoryRowSerializer
|
serializer: Lists::StorageLocationRepositoryRowSerializer
|
||||||
else
|
else
|
||||||
render json: @storage_location_repository_row.errors, status: :unprocessable_entity
|
render json: { errors: @storage_location_repository_row.errors.full_messages }, status: :unprocessable_entity
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,8 @@ export default {
|
||||||
metadata: { position: this.position?.map((pos) => parseInt(pos, 10)) }
|
metadata: { position: this.position?.map((pos) => parseInt(pos, 10)) }
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.$emit('close');
|
this.$emit('close');
|
||||||
|
}).catch((error) => {
|
||||||
|
HelperModule.flashAlertMsg(error.response.data.errors.join(', '), 'danger');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,10 @@ class StorageLocationRepositoryRow < ApplicationRecord
|
||||||
validate :ensure_uniq_position
|
validate :ensure_uniq_position
|
||||||
end
|
end
|
||||||
|
|
||||||
|
with_options if: -> { storage_location.container && storage_location.metadata['display_type'] != 'grid' } do
|
||||||
|
validate :unique_repository_row
|
||||||
|
end
|
||||||
|
|
||||||
def human_readable_position
|
def human_readable_position
|
||||||
return unless metadata['position']
|
return unless metadata['position']
|
||||||
|
|
||||||
|
|
@ -34,4 +38,12 @@ class StorageLocationRepositoryRow < ApplicationRecord
|
||||||
errors.add(:base, I18n.t('activerecord.errors.models.storage_location.not_uniq_position'))
|
errors.add(:base, I18n.t('activerecord.errors.models.storage_location.not_uniq_position'))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def unique_repository_row
|
||||||
|
if storage_location.storage_location_repository_rows
|
||||||
|
.where(repository_row_id: repository_row_id)
|
||||||
|
.where.not(id: id).exists?
|
||||||
|
errors.add(:base, I18n.t('activerecord.errors.models.storage_location.not_uniq_repository_row'))
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,13 @@ module StorageLocations
|
||||||
return { status: :error, message: I18n.t('storage_locations.show.import_modal.errors.invalid_position') }
|
return { status: :error, message: I18n.t('storage_locations.show.import_modal.errors.invalid_position') }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Check if duplicate repository rows are present in the file
|
||||||
|
if !@storage_location.with_grid? && @rows.pluck(:repository_row_id).uniq.length != @rows.length
|
||||||
|
return { status: :error, message: I18n.t('storage_locations.show.import_modal.errors.duplicate_items') }
|
||||||
|
end
|
||||||
|
|
||||||
ActiveRecord::Base.transaction do
|
ActiveRecord::Base.transaction do
|
||||||
unassign_repository_rows!
|
unassign_repository_rows! if @storage_location.with_grid?
|
||||||
|
|
||||||
@rows.each do |row|
|
@rows.each do |row|
|
||||||
if @storage_location.with_grid? && !position_valid?(row[:position])
|
if @storage_location.with_grid? && !position_valid?(row[:position])
|
||||||
|
|
@ -59,18 +64,22 @@ module StorageLocations
|
||||||
row = SpreadsheetParser.parse_row(r, @sheet)
|
row = SpreadsheetParser.parse_row(r, @sheet)
|
||||||
{
|
{
|
||||||
position: convert_position_letter_to_number(row[0]),
|
position: convert_position_letter_to_number(row[0]),
|
||||||
repository_row_id: row[1].gsub('IT', '').to_i
|
repository_row_id: row[1].to_s.gsub('IT', '').to_i
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def import_row!(row)
|
def import_row!(row)
|
||||||
storage_location_repository_row =
|
storage_location_repository_row = if @storage_location.with_grid?
|
||||||
@storage_location.storage_location_repository_rows
|
@storage_location.storage_location_repository_rows
|
||||||
.find_or_initialize_by(
|
.find_or_initialize_by(
|
||||||
repository_row_id: row[:repository_row_id],
|
repository_row_id: row[:repository_row_id],
|
||||||
metadata: { position: row[:position] }
|
metadata: { position: row[:position] }
|
||||||
)
|
)
|
||||||
|
else
|
||||||
|
@storage_location.storage_location_repository_rows
|
||||||
|
.find_or_initialize_by(repository_row_id: row[:repository_row_id])
|
||||||
|
end
|
||||||
|
|
||||||
if storage_location_repository_row.new_record?
|
if storage_location_repository_row.new_record?
|
||||||
@assigned_count += 1
|
@assigned_count += 1
|
||||||
|
|
|
||||||
|
|
@ -264,6 +264,7 @@ en:
|
||||||
storage_location:
|
storage_location:
|
||||||
missing_position: 'Missing position metadata'
|
missing_position: 'Missing position metadata'
|
||||||
not_uniq_position: 'Position already taken'
|
not_uniq_position: 'Position already taken'
|
||||||
|
not_uniq_repository_row: 'Inventory item already exists'
|
||||||
attributes:
|
attributes:
|
||||||
parent_storage_location: "Storage location cannot be parent to itself"
|
parent_storage_location: "Storage location cannot be parent to itself"
|
||||||
parent_storage_location_child: "Storage location cannot be moved to it's child"
|
parent_storage_location_child: "Storage location cannot be moved to it's child"
|
||||||
|
|
@ -2709,6 +2710,7 @@ en:
|
||||||
errors:
|
errors:
|
||||||
invalid_structure: "The imported file content doesn't meet criteria."
|
invalid_structure: "The imported file content doesn't meet criteria."
|
||||||
invalid_position: "Positions in the file must match with the box."
|
invalid_position: "Positions in the file must match with the box."
|
||||||
|
duplicate_items: "Item ID has duplicates in the imported file"
|
||||||
invalid_item: "Item ID %{row_id} doesn't exist."
|
invalid_item: "Item ID %{row_id} doesn't exist."
|
||||||
index:
|
index:
|
||||||
head_title: "Locations"
|
head_title: "Locations"
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue