diff --git a/app/assets/javascripts/repository_columns/columns_initializers/list_column_type.js b/app/assets/javascripts/repository_columns/columns_initializers/list_column_type.js index 033b362dd..b5ba2ab26 100644 --- a/app/assets/javascripts/repository_columns/columns_initializers/list_column_type.js +++ b/app/assets/javascripts/repository_columns/columns_initializers/list_column_type.js @@ -13,7 +13,6 @@ var RepositoryListColumnType = (function() { return: '\n', comma: ',', semicolon: ';', - pipe: '|', space: ' ' }; @@ -51,21 +50,55 @@ var RepositoryListColumnType = (function() { }); } + function refreshCounter(number) { + var $manageModal = $(manageModal); + $manageModal.find('.list-items-count').html(number); + + if (number > GLOBAL_CONSTANTS.REPOSITORY_LIST_ITEMS_PER_COLUMN) { + $manageModal.find('.limit-counter-container').addClass('error-to-many-items'); + $manageModal.find('button[data-action="save"]').prop('disabled', true); + } else { + $manageModal.find('.limit-counter-container').removeClass('error-to-many-items'); + $manageModal.find('button[data-action="save"]').prop('disabled', false); + } + } + + function refreshPreviewDropdownList() { + var listItemsTextarea = '[data-column-type="RepositoryListValue"] #list-items-textarea'; + var dropdownDelimiter = 'select#delimiter'; + + var items = textToItems($(listItemsTextarea).val(), $(dropdownDelimiter).val()); + var hashItems = []; + drawDropdownPreview(items); + refreshCounter(items.length); + + $.each(items, (index, option) => { + hashItems.push({ data: option }); + }); + + $('#dropdown_options').val(JSON.stringify(hashItems)); + } + function initDropdownItemsTextArea() { var $manageModal = $(manageModal); var listItemsTextarea = '[data-column-type="RepositoryListValue"] #list-items-textarea'; var dropdownDelimiter = 'select#delimiter'; + var columnNameInput = 'input#repository-column-name'; $manageModal.off('change keyup paste', listItemsTextarea).on('change keyup paste', listItemsTextarea, function() { - var items = textToItems($(listItemsTextarea).val(), $(dropdownDelimiter).val()); - drawDropdownPreview(items); - $('#dropdown_options').val(items); + refreshPreviewDropdownList(); }); $manageModal.off('change', dropdownDelimiter).on('change', dropdownDelimiter, function() { - var items = textToItems($(listItemsTextarea).val(), $(dropdownDelimiter).val()); - drawDropdownPreview(items); - $('#dropdown_options').val(items); + refreshPreviewDropdownList(); + }); + + $manageModal.off('columnModal::partialLoaded').on('columnModal::partialLoaded', function() { + refreshPreviewDropdownList(); + }); + + $manageModal.off('keyup change', columnNameInput).on('keyup change', columnNameInput, function() { + $manageModal.find('.preview-label').html($manageModal.find(columnNameInput).val()); }); } diff --git a/app/assets/javascripts/repository_columns/index.js b/app/assets/javascripts/repository_columns/index.js index 6e73dcec9..96ecc8d15 100644 --- a/app/assets/javascripts/repository_columns/index.js +++ b/app/assets/javascripts/repository_columns/index.js @@ -83,7 +83,7 @@ var RepositoryColumns = (function() { function loadSpecificParams(type, params) { var newParams = params; if (type === 'RepositoryListValue') { - newParams.repository_column.list_items = $('#dropdown_options').val(); + newParams.repository_column.repository_list_items_attributes = JSON.parse($('#dropdown_options').val()); } return newParams; } @@ -95,13 +95,20 @@ var RepositoryColumns = (function() { var params = { repository_column: { name: $('#repository-column-name').val() } }; var selectedType = $('#repository-column-data-type').find(':selected').val(); params = loadSpecificParams(selectedType, params); - $.post(url, params, (result) => { - var data = result.data; - insertNewListItem(data); - HelperModule.flashAlertMsg(data.attributes.message, 'success'); - $manageModal.modal('hide'); - }).error((error) => { - $('#new-repository-column').renderFormErrors('repository_column', error.responseJSON.repository_column, true); + $.ajax({ + url: url, + type: 'POST', + data: JSON.stringify(params), + contentType: 'application/json', + success: function(result) { + var data = result.data; + insertNewListItem(data); + HelperModule.flashAlertMsg(data.attributes.message, 'success'); + $manageModal.modal('hide'); + }, + error: function(error) { + $('#new-repository-column').renderFormErrors('repository_column', error.responseJSON.repository_column, true); + } }); }); } @@ -116,7 +123,9 @@ var RepositoryColumns = (function() { $.ajax({ url: url, type: 'PUT', - data: params, + data: JSON.stringify(params), + dataType: 'json', + contentType: 'application/json', success: function(result) { var data = result.data; updateListItem(data); @@ -135,16 +144,20 @@ var RepositoryColumns = (function() { $('.repository-column-edtior').off('click', '.manage-repo-column').on('click', '.manage-repo-column', function() { var button = $(this); var modalUrl = button.data('modal-url'); + var columnType; $.get(modalUrl, (data) => { $manageModal.modal('show').find('.modal-content').html(data.html) .find('#repository-column-name') .focus(); + $manageModal.trigger('columnModal::partialLoaded'); if (button.data('action') === 'new') { $('[data-column-type="RepositoryTextValue"]').show(); $('#new-repo-column-submit').show(); } else { + columnType = $('#repository-column-data-type').find(':selected').val(); $('#update-repo-column-submit').show(); + $('[data-column-type=' + columnType + ']').show(); } }).fail(function() { HelperModule.flashAlertMsg(I18n.t('libraries.repository_columns.no_permissions'), 'danger'); diff --git a/app/assets/javascripts/sitewide/constants.js.erb b/app/assets/javascripts/sitewide/constants.js.erb index ad08eef1d..ca8d2291b 100644 --- a/app/assets/javascripts/sitewide/constants.js.erb +++ b/app/assets/javascripts/sitewide/constants.js.erb @@ -3,5 +3,6 @@ const GLOBAL_CONSTANTS = { NAME_MAX_LENGTH: <%= Constants::NAME_MAX_LENGTH %>, FILENAME_TRUNCATION_LENGTH: <%= Constants::FILENAME_TRUNCATION_LENGTH %>, FILE_MAX_SIZE_MB: <%= Rails.configuration.x.file_max_size_mb %>, - IS_SAFARI: /^((?!chrome|android).)*safari/i.test(navigator.userAgent) + IS_SAFARI: /^((?!chrome|android).)*safari/i.test(navigator.userAgent), + REPOSITORY_LIST_ITEMS_PER_COLUMN: <%= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN %> }; diff --git a/app/assets/stylesheets/repositories.scss b/app/assets/stylesheets/repositories.scss index b8dbd8394..57de26b0f 100644 --- a/app/assets/stylesheets/repositories.scss +++ b/app/assets/stylesheets/repositories.scss @@ -290,5 +290,31 @@ .preview-block { flex-basis: 200px; + position: relative; + } + + .limit-counter-container { + bottom: 0; + color: $color-silver-chalice; + left: 100%; + line-height: 34px; + margin-left: 15px; + position: absolute; + width: 100px; + + .list-items-limit { + display: none; + } + + &.error-to-many-items { + .list-items-count { + color: $brand-danger; + font-weight: bold; + } + + .list-items-limit { + display: inline; + } + } } } diff --git a/app/controllers/repository_columns/list_columns_controller.rb b/app/controllers/repository_columns/list_columns_controller.rb index b2a435d01..361bdf814 100644 --- a/app/controllers/repository_columns/list_columns_controller.rb +++ b/app/controllers/repository_columns/list_columns_controller.rb @@ -20,11 +20,11 @@ module RepositoryColumns end def update - service = RepositoryColumns::UpdateColumnService + service = RepositoryColumns::UpdateListColumnService .call(user: current_user, - team: current_team, - column: @repository_column, - params: update_repository_column_params) + team: current_team, + column: @repository_column, + params: repository_column_params) if service.succeed? render json: service.column, status: :ok @@ -49,9 +49,5 @@ module RepositoryColumns def repository_column_params params.require(:repository_column).permit(:name, repository_list_items_attributes: %i(data)) end - - def update_repository_column_params - params.require(:repository_column).permit(:name, repository_list_items_attributes: %i(id data _destroy)) - end end end diff --git a/app/services/repository_columns/update_list_column_service.rb b/app/services/repository_columns/update_list_column_service.rb index 92357324e..3bde5d3eb 100644 --- a/app/services/repository_columns/update_list_column_service.rb +++ b/app/services/repository_columns/update_list_column_service.rb @@ -21,7 +21,7 @@ module RepositoryColumns if @column.repository_list_items.size - to_be_deleted.size + to_be_created.size >= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN - @errors[:repository_column] = { repository_list_items: 'too many items dude!' } + @errors[:repository_column] = { repository_list_items: 'too many items' } end return self unless valid? diff --git a/app/views/repository_columns/_manage_column_modal_content.html.erb b/app/views/repository_columns/_manage_column_modal_content.html.erb index 282a08440..6cb2be6d1 100644 --- a/app/views/repository_columns/_manage_column_modal_content.html.erb +++ b/app/views/repository_columns/_manage_column_modal_content.html.erb @@ -67,7 +67,7 @@ <%= render partial: "repository_columns/manage_column_partials/asset.html.erb" %>