mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-10-11 22:36:33 +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 */
|
/* 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() {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
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
|
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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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,
|
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');
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue