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

View file

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

View file

@ -5,6 +5,7 @@ module RepositoryColumns
before_action :load_column, only: %i(update destroy) before_action :load_column, only: %i(update destroy)
before_action :check_create_permissions, only: :create before_action :check_create_permissions, only: :create
before_action :check_manage_permissions, only: %i(update destroy) before_action :check_manage_permissions, only: %i(update destroy)
helper_method :delimiters
def create def create
service = RepositoryColumns::CreateColumnService service = RepositoryColumns::CreateColumnService
@ -47,7 +48,14 @@ module RepositoryColumns
private private
def repository_column_params 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 end
end end

View file

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

View file

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

View file

@ -977,7 +977,12 @@ class Constants
REPOSITORY_LIST_ITEMS_PER_COLUMN = 500 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 IMPORT_REPOSITORY_ITEMS_LIMIT = 2000

View file

@ -1147,6 +1147,7 @@ en:
list_type: list_type:
delimiter_label: "Delimiter" delimiter_label: "Delimiter"
dropdown_items_label: "Dropdown items" dropdown_items_label: "Dropdown items"
dropdown_item_select_option: "Select option..."
delimiters: delimiters:
auto: "Auto" auto: "Auto"
return: "Return" 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, name character varying,
data_type integer NOT NULL, data_type integer NOT NULL,
created_at timestamp without time zone, 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'), ('20191001133557'),
('20191003091614'), ('20191003091614'),
('20191007144622'), ('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(:succeed?)).and_return(true)
allow(service).to(receive(:column)).and_return(repository_column) 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 end
context 'when columnd is updated' do 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(:succeed?)).and_return(false)
allow(service).to(receive(:errors)).and_return({}) 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 end
it 'respons with status 422' do it 'respons with status 422' do