Add error handling for saving filters [SCI-6488] (#3835)

* Add error handling for saving filters [SCI-6488]

* Refactor and clean up filter element validations [SCI-6488]

Co-authored-by: Anton <anton@scinote.net>
Co-authored-by: Martin Artnik <martin@scinote.net>
This commit is contained in:
aignatov-bio 2022-02-11 13:32:27 +01:00 committed by GitHub
parent afce0e34c4
commit 97898fef7a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 58 additions and 15 deletions

View file

@ -198,6 +198,10 @@
}
function initFilterSaving() {
$(document).on('click', '#newFilterLink', function() {
$('#modalSaveRepositoryTableFilter #repository_table_filter_name').val('');
});
$(document).on('click', '#overwriteFilterLink', function() {
var $modal = $('#modalSaveRepositoryTableFilter');
@ -208,6 +212,9 @@
$modal.on('hidden.bs.modal', function() {
$modal.removeData('overwrite');
});
$('#modalSaveRepositoryTableFilter #repository_table_filter_name')
.val($modal.data('repositoryTableFilterName'));
});
$(document).on('click', '#saveRepositoryTableFilterButton', function() {
@ -244,8 +251,10 @@
$modal.modal('hide');
$overwriteLink.removeClass('hidden');
$modal.data('repositoryTableFilterId', response.data.id);
$modal.data('repositoryTableFilterName', response.data.attributes.name);
$('#currentFilterName').html(response.data.attributes.name);
if (existingFilterIndex > -1) {
repositoryFilterObject.savedFilters = repositoryFilterObject.savedFilters.map((f) => {
return f.id === response.data.id ? response.data : f;
@ -260,6 +269,7 @@
error: function(response) {
HelperModule.flashAlertMsg(response.responseJSON.message, 'danger');
$button.removeClass('disabled');
$modal.modal('hide');
}
});
});

View file

@ -18,31 +18,27 @@ class RepositoryTableFiltersController < ApplicationController
end
def create
repository_table_filter = @repository.repository_table_filters.new(
@repository_table_filter = @repository.repository_table_filters.new(
name: repository_table_filter_params[:name],
default_columns: repository_table_filter_elements_params[:default_columns],
created_by: current_user
)
repository_table_filter.transaction do
repository_table_filter.save!
@repository_table_filter.transaction do
repository_table_filter_elements_params[:custom_columns].each do |custom_column_params|
repository_table_filter.repository_table_filter_elements.create!(custom_column_params)
@repository_table_filter.repository_table_filter_elements.build(custom_column_params)
end
@repository_table_filter.save!
end
render json: repository_table_filter, serializer: RepositoryFilterSerializer
render json: @repository_table_filter, serializer: RepositoryFilterSerializer
rescue ActiveRecord::RecordInvalid
error_key =
repository_table_filter.errors[:repository_table_filter_elements] ? 'repository_column.must_exist' : 'general'
message = I18n.t("activerecord.errors.models.repository_table_filter_element.attributes.#{error_key}")
render json: { message: message }, status: :unprocessable_entity
render_errors
end
def update
@repository_table_filter.transaction do
@repository_table_filter.name = repository_table_filter_params[:name]
@repository_table_filter.default_columns = repository_table_filter_elements_params[:default_columns]
@repository_table_filter.save!
repository_column_ids =
repository_table_filter_elements_params[:custom_columns].map { |r| r['repository_column_id'] }
@ -54,16 +50,15 @@ class RepositoryTableFiltersController < ApplicationController
repository_table_filter_elements_params[:custom_columns].each do |custom_column_params|
@repository_table_filter.repository_table_filter_elements
.find_or_initialize_by(repository_column_id: custom_column_params['repository_column_id'])
.update!(custom_column_params)
.assign_attributes(custom_column_params)
end
@repository_table_filter.save!
end
render json: @repository_table_filter, serializer: RepositoryFilterSerializer
rescue ActiveRecord::RecordInvalid
error_key =
@repository_table_filter.errors[:repository_table_filter_elements] ? 'repository_column.must_exist' : 'general'
message = I18n.t("activerecord.errors.models.repository_table_filter_element.attributes.#{error_key}")
render json: { message: message }, status: :unprocessable_entity
render_errors
end
def destroy
@ -94,6 +89,17 @@ class RepositoryTableFiltersController < ApplicationController
render_403 unless can_manage_repository_filters?(@repository)
end
def render_errors
message = if @repository_table_filter.errors[:repository_table_filter_elements]
I18n.t('activerecord.errors.models.repository_table_filter_element.attributes.parameters.must_be_valid')
elsif @repository_table_filter.errors[:repository_column].present?
I18n.t('activerecord.errors.models.repository_table_filter_element.attributes.repository_column.must_exist')
else
I18n.t('activerecord.errors.models.repository_table_filter_element.general')
end
render json: { message: message }, status: :unprocessable_entity
end
def repository_table_filter_elements_params
columns = JSON.parse(repository_table_filter_params[:repository_table_filter_elements_json])

View file

@ -134,6 +134,7 @@
$overwriteLink.removeClass('hidden');
$saveFiltersModal.data('repositoryTableFilterId', data.data.id);
$('#currentFilterName').html(data.data.attributes.name);
$saveFiltersModal.data('repositoryTableFilterName', data.data.attributes.name);
});
},
closeSavedFilters() {

View file

@ -6,4 +6,5 @@ class RepositoryTableFilter < ApplicationRecord
has_many :repository_table_filter_elements, dependent: :destroy
validates :name, :repository, :created_by, presence: true
validates_associated :repository_table_filter_elements
end

View file

@ -31,4 +31,29 @@ class RepositoryTableFilterElement < ApplicationRecord
inclusion: { in: proc { |record|
record.repository_table_filter.repository.repository_columns
} }
validate :items_exist
private
def items_exist
invalid = case repository_column&.data_type
when 'RepositoryChecklistValue'
items = repository_column.repository_checklist_items.where(id: parameters['item_ids'])
items.count != parameters['item_ids'].length
when 'RepositoryListValue'
items = repository_column.repository_list_items.where(id: parameters['item_ids'])
items.count != parameters['item_ids'].length
when 'RepositoryStatusValue'
items = repository_column.repository_status_items.where(id: parameters['item_ids'])
items.count != parameters['item_ids'].length
end
if invalid
errors.add(
:column_items,
I18n.t('activerecord.errors.models.repository_table_filter_element.attributes.parameters.must_be_valid')
)
end
end
end