diff --git a/app/models/repository_list_item.rb b/app/models/repository_list_item.rb
index e3dbeeb5f..99f66c597 100644
--- a/app/models/repository_list_item.rb
+++ b/app/models/repository_list_item.rb
@@ -1,4 +1,5 @@
class RepositoryListItem < ApplicationRecord
+ include ActiveModel::Validations
has_many :repository_list_values, inverse_of: :repository_list_item
belongs_to :repository, inverse_of: :repository_list_items
belongs_to :repository_column, inverse_of: :repository_list_items
@@ -12,4 +13,5 @@ class RepositoryListItem < ApplicationRecord
presence: true,
uniqueness: { scope: :repository_column, case_sensitive: false },
length: { maximum: Constants::TEXT_MAX_LENGTH }
+ validates_with RepositoryListItemValidator
end
diff --git a/app/validators/repository_list_item_validator.rb b/app/validators/repository_list_item_validator.rb
new file mode 100644
index 000000000..740bb9afc
--- /dev/null
+++ b/app/validators/repository_list_item_validator.rb
@@ -0,0 +1,9 @@
+class RepositoryListItemValidator < ActiveModel::Validator
+ def validate(record)
+ return unless record.repository_column
+ items_length = record.repository_column.repository_list_items.size
+ if items_length >= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN
+ record.errors[:items_limit] << 'Maximum number of list items reached!'
+ end
+ end
+end
diff --git a/app/views/repositories/_parse_records_modal.html.erb b/app/views/repositories/_parse_records_modal.html.erb
index 44c398a16..14536ce18 100644
--- a/app/views/repositories/_parse_records_modal.html.erb
+++ b/app/views/repositories/_parse_records_modal.html.erb
@@ -64,8 +64,8 @@
- - <%= t('repositories.modal_parse.warning_1') %>
- - <%= t('repositories.modal_parse.warning_2') %>
+ - <%=t 'repositories.modal_parse.warning_1', limit: Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN %>
+ - <%=t 'repositories.modal_parse.warning_2' %>
diff --git a/config/initializers/constants.rb b/config/initializers/constants.rb
index 54a793cc1..bface4e3e 100644
--- a/config/initializers/constants.rb
+++ b/config/initializers/constants.rb
@@ -868,6 +868,8 @@ class Constants
EXPORTABLE_ZIP_EXPIRATION_DAYS = 7
+ REPOSITORY_LIST_ITEMS_PER_COLUMN = 500
+
# Very basic regex to check for validity of emails
BASIC_EMAIL_REGEX = URI::MailTo::EMAIL_REGEXP
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 31847fa5c..e5410189b 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -966,7 +966,7 @@ en:
delete: "Delete column"
modal_parse:
title: 'Import items'
- warning_1: 'Be careful when importing into Dropdown column/s! Each new unique cell value from the file will create a new Dropdown option. This could result in large amounts of Dropdown options.'
+ warning_1: 'Be careful when importing into Dropdown column/s! Each new unique cell value from the file will create a new Dropdown option. Maximum nr. of Dropdown options is %{limit}.'
warning_2: 'Importing into file columns is not supported.'
modal_import:
title: 'Import items'
diff --git a/spec/models/repository_list_item_spec.rb b/spec/models/repository_list_item_spec.rb
index dde1ae856..40f9937e8 100644
--- a/spec/models/repository_list_item_spec.rb
+++ b/spec/models/repository_list_item_spec.rb
@@ -22,14 +22,14 @@ RSpec.describe RepositoryListItem, type: :model do
end
describe 'Validations' do
+ let!(:user) { create :user }
+ let!(:repository_one) { create :repository }
it { should validate_presence_of(:data) }
it do
should validate_length_of(:data).is_at_most(Constants::TEXT_MAX_LENGTH)
end
context 'has a uniq data scoped on repository column' do
- let!(:user) { create :user }
- let!(:repository_one) { create :repository }
let!(:repository_column) do
create :repository_column, name: 'My column', repository: repository_one
end