mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-09-11 07:34:41 +08:00
Add delimiter column for repository_column
This commit is contained in:
parent
b2b6296cb5
commit
b2ce600820
12 changed files with 76 additions and 27 deletions
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
9
app/helpers/repository_columns_helper.rb
Normal file
9
app/helpers/repository_columns_helper.rb
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddDelimiterToRepositoryColumn < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
add_column :repository_columns, :delimiter, :string
|
||||
end
|
||||
end
|
|
@ -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');
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue