Add delimiter column for repository_column

This commit is contained in:
Urban Rotnik 2019-11-06 11:29:00 +01:00
parent b2b6296cb5
commit b2ce600820
12 changed files with 76 additions and 27 deletions

View file

@ -1,4 +1,4 @@
/* global GLOBAL_CONSTANTS */
/* global GLOBAL_CONSTANTS I18n */
/* eslint-disable no-unused-vars */
var RepositoryListColumnType = (function() {
var manageModal = '#manageRepositoryColumn';
@ -9,6 +9,7 @@ var RepositoryListColumnType = (function() {
function textToItems(text, delimiter) {
var res = [];
var usedDelimiter = '';
var definedDelimiters = {
return: '\n',
comma: ',',
@ -16,18 +17,23 @@ var RepositoryListColumnType = (function() {
space: ' '
};
var delimiters = []
var delimiters = [];
if (delimiter === 'auto') {
delimiters = ['\n', ',', ';', '|', ' '];
delimiters = ['\n', ',', ';', ' '];
} else {
delimiters.push(definedDelimiters[delimiter]);
}
$.each(delimiters, (index, currentDelimiter) => {
res = text.trim().split(currentDelimiter);
usedDelimiter = Object
.keys(definedDelimiters)
.find(key => definedDelimiters[key] === currentDelimiter);
if (res.length > 1) {
return false;
}
return true;
});
res = res.filter(Boolean).filter(onlyUnique);
@ -35,9 +41,16 @@ var RepositoryListColumnType = (function() {
$.each(res, (index, option) => {
res[index] = option.slice(0, GLOBAL_CONSTANTS.NAME_MAX_LENGTH);
});
$('select#delimiter').attr('data-used-delimiter', usedDelimiter);
return res;
}
function pluralizeWord(count, noun, suffix = 's') {
return `${noun}${count !== 1 ? suffix : ''}`;
}
function drawDropdownPreview(items) {
var $manageModal = $(manageModal);
var $dropdownPreview = $manageModal.find('.dropdown-preview select');
@ -48,6 +61,13 @@ var RepositoryListColumnType = (function() {
text: item
}));
});
if (items.length === 0) {
$dropdownPreview.append($('<option>', {
value: '',
text: I18n.t('libraries.manange_modal_column.list_type.dropdown_item_select_option')
}));
}
}
function refreshCounter(number) {
@ -77,6 +97,7 @@ var RepositoryListColumnType = (function() {
});
$('#dropdown_options').val(JSON.stringify(hashItems));
$('.limit-counter-container .items-label').html(pluralizeWord(items.length, 'item'));
}
function initDropdownItemsTextArea() {

View file

@ -84,6 +84,7 @@ var RepositoryColumns = (function() {
var newParams = params;
if (type === 'RepositoryListValue') {
newParams.repository_column.repository_list_items_attributes = JSON.parse($('#dropdown_options').val());
newParams.repository_column.delimiter = $('select#delimiter').data('used-delimiter');
}
return newParams;
}

View file

@ -5,6 +5,7 @@ module RepositoryColumns
before_action :load_column, only: %i(update destroy)
before_action :check_create_permissions, only: :create
before_action :check_manage_permissions, only: %i(update destroy)
helper_method :delimiters
def create
service = RepositoryColumns::CreateColumnService
@ -47,7 +48,14 @@ module RepositoryColumns
private
def repository_column_params
params.require(:repository_column).permit(:name, repository_list_items_attributes: %i(data))
params.require(:repository_column).permit(:name, :delimiter, repository_list_items_attributes: %i(data))
end
def delimiters
Constants::REPOSITORY_LIST_ITEMS_DELIMITERS
.split(',')
.map { |e| Hash[t('libraries.manange_modal_column.list_type.delimiters.' + e), e] }
.inject(:merge)
end
end
end

View file

@ -1,5 +1,7 @@
class RepositoryColumnsController < ApplicationController
include InputSanitizeHelper
include RepositoryColumnsHelper
ACTIONS = %i(
create index create_html available_asset_type_columns available_columns
).freeze
@ -73,15 +75,7 @@ class RepositoryColumnsController < ApplicationController
end
def edit
respond_to do |format|
format.json do
render json: {
html: render_to_string(
partial: 'repository_columns/manage_column_modal_content.html.erb'
)
}
end
end
render json: { html: render_to_string(partial: 'repository_columns/manage_column_modal_content.html.erb') }
end
def update

View file

@ -0,0 +1,9 @@
# frozen_string_literal: true
module RepositoryColumnsHelper
def defined_delimiters_options
(%i(auto) + Constants::REPOSITORY_LIST_ITEMS_DELIMITERS_MAP.keys)
.map { |e| Hash[t('libraries.manange_modal_column.list_type.delimiters.' + e.to_s), e] }
.inject(:merge)
end
end

View file

@ -25,7 +25,7 @@ module RepositoryColumns
end
return self unless valid?
@errors[:repository_column] = @column.errors.messages unless @column.update(@params.slice(:name))
@errors[:repository_column] = @column.errors.messages unless @column.update(@params.slice(:name, :delimiter))
return self unless valid?
ActiveRecord::Base.transaction do

View file

@ -1,7 +1,8 @@
<% delimiters = Constants::REPOSITORY_LIST_ITEMS_DELIMITERS
.split(',')
.map {|e| Hash[t('libraries.manange_modal_column.list_type.delimiters.' + e), e]}
.inject(:merge) %>
<%
delimiters = defined_delimiters_options
selected_delimiter = column.delimiter || 'return'
selected_delimiter_char = Constants::REPOSITORY_LIST_ITEMS_DELIMITERS_MAP[selected_delimiter.to_sym]
%>
<%= hidden_field_tag 'dropdown_options' %>
<div class="form-group">
@ -9,7 +10,7 @@
<%= t('libraries.manange_modal_column.list_type.delimiter_label') %>
</label>
<div class="col-sm-9">
<%= select_tag('delimiter', options_for_select(delimiters, 'auto'), class: 'form-control') %>
<%= select_tag('delimiter', options_for_select(delimiters, selected_delimiter), class: 'form-control') %>
</div>
</div>
<div class="form-group">
@ -17,7 +18,7 @@
<%= t('libraries.manange_modal_column.list_type.dropdown_items_label') %>
</label>
<div class="col-sm-9">
<%= text_area_tag 'list-items-textarea', column.repository_list_items.pluck(:data).join("\n"), rows: 10, class: 'form-control' %>
<%= text_area_tag 'list-items-textarea', column.repository_list_items.pluck(:data).join(selected_delimiter_char), rows: 10, class: 'form-control' %>
</div>
</div>
<div class="dropdown-preview">
@ -28,7 +29,7 @@
</select>
<div class="limit-counter-container">
<span class="list-items-count"></span>
<span class="list-items-limit">/<%= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN %></span>
<span> items</span></div>
<span class="list-items-limit">/<%= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN %> </span>
<span class="items-label"></span></div>
</div>
</div>

View file

@ -977,7 +977,12 @@ class Constants
REPOSITORY_LIST_ITEMS_PER_COLUMN = 500
REPOSITORY_LIST_ITEMS_DELIMITERS = 'auto,return,comma,semicolon,space'.freeze
REPOSITORY_LIST_ITEMS_DELIMITERS_MAP = {
return: "\n",
comma: ',',
semicolon: ';',
space: ' '
}.freeze
IMPORT_REPOSITORY_ITEMS_LIMIT = 2000

View file

@ -1147,6 +1147,7 @@ en:
list_type:
delimiter_label: "Delimiter"
dropdown_items_label: "Dropdown items"
dropdown_item_select_option: "Select option..."
delimiters:
auto: "Auto"
return: "Return"

View file

@ -0,0 +1,7 @@
# frozen_string_literal: true
class AddDelimiterToRepositoryColumn < ActiveRecord::Migration[6.0]
def change
add_column :repository_columns, :delimiter, :string
end
end

View file

@ -1201,7 +1201,8 @@ CREATE TABLE public.repository_columns (
name character varying,
data_type integer NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone
updated_at timestamp without time zone,
delimiter character varying
);
@ -6749,6 +6750,7 @@ INSERT INTO "schema_migrations" (version) VALUES
('20191001133557'),
('20191003091614'),
('20191007144622'),
('20191009146101');
('20191009146101'),
('20191105143702');

View file

@ -103,7 +103,7 @@ RSpec.describe RepositoryColumns::ListColumnsController, type: :controller do
allow(service).to(receive(:succeed?)).and_return(true)
allow(service).to(receive(:column)).and_return(repository_column)
allow_any_instance_of(RepositoryColumns::UpdateColumnService).to(receive(:call)).and_return(service)
allow_any_instance_of(RepositoryColumns::UpdateListColumnService).to(receive(:call)).and_return(service)
end
context 'when columnd is updated' do
@ -151,7 +151,7 @@ RSpec.describe RepositoryColumns::ListColumnsController, type: :controller do
allow(service).to(receive(:succeed?)).and_return(false)
allow(service).to(receive(:errors)).and_return({})
allow_any_instance_of(RepositoryColumns::UpdateColumnService).to(receive(:call)).and_return(service)
allow_any_instance_of(RepositoryColumns::UpdateListColumnService).to(receive(:call)).and_return(service)
end
it 'respons with status 422' do