mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-02-24 15:54:00 +08:00
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:
parent
afce0e34c4
commit
97898fef7a
5 changed files with 58 additions and 15 deletions
|
@ -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');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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])
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue