From 8bec85c7b9592b9fd1493feb162fde7e8127d593 Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Wed, 24 Apr 2019 19:17:31 +0200 Subject: [PATCH 01/17] Switch to memory_store for caching in production [SCI-3182] --- config/environments/development.rb | 2 +- config/environments/production.rb | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/config/environments/development.rb b/config/environments/development.rb index e6868c381..22df30016 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -118,7 +118,7 @@ Rails.application.configure do if Rails.root.join('tmp/caching-dev.txt').exist? config.action_controller.perform_caching = true - config.cache_store = :memory_store + config.cache_store = :memory_store, { size: (ENV['RAILS_MEM_CACHE_SIZE_MB'] || 32).to_i.megabytes } config.public_file_server.headers = { 'Cache-Control' => "public, max-age=#{2.days.seconds.to_i}" } diff --git a/config/environments/production.rb b/config/environments/production.rb index cd3a69326..079ff7600 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -78,9 +78,6 @@ Rails.application.configure do # Use a different logger for distributed setups. # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) - # Use a different cache store in production. - # config.cache_store = :mem_cache_store - # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.action_controller.asset_host = 'http://assets.example.com' @@ -129,7 +126,7 @@ Rails.application.configure do end # Use a different cache store in production. - # config.cache_store = :mem_cache_store + config.cache_store = :memory_store, { size: (ENV['RAILS_MEM_CACHE_SIZE_MB'] || 32).to_i.megabytes } # Use a real queuing backend for Active Job (and separate queues per environment) config.active_job.queue_adapter = :delayed_job From 077ad52d4bbf958b239e5e6159611eed53b484d6 Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Fri, 26 Apr 2019 17:37:01 +0200 Subject: [PATCH 02/17] Fix TinyMCE for results [SCI-3398] --- app/assets/javascripts/my_modules/results.js.erb | 5 +++-- app/assets/javascripts/results/result_texts.js | 7 +++---- app/assets/javascripts/sitewide/tiny_mce.js | 2 +- .../sitewide/tiny_mce_file_upload_plugin.js | 6 ++++-- app/views/result_texts/_edit.html.erb | 12 ++++++------ app/views/result_texts/_new.html.erb | 9 +++++---- app/views/results/_result_text.html.erb | 2 +- 7 files changed, 23 insertions(+), 20 deletions(-) diff --git a/app/assets/javascripts/my_modules/results.js.erb b/app/assets/javascripts/my_modules/results.js.erb index 781e392f1..72457fb1c 100644 --- a/app/assets/javascripts/my_modules/results.js.erb +++ b/app/assets/javascripts/my_modules/results.js.erb @@ -146,8 +146,8 @@ var $nameInput = $form.find('#result_name'); var nameValid = textValidator(ev, $nameInput, 0, <%= Constants::NAME_MAX_LENGTH %>); - var $descrTextarea = $form.find("#result_result_text_attributes_text"); - var $tinyMCEInput = TinyMCE.init('#result_result_text_attributes_text');; + var $descrTextarea = $form.find("#result_text_attributes_textarea"); + var $tinyMCEInput = TinyMCE.getContent(); textValidator(ev, $descrTextarea, 1, <%= Constants::RICH_TEXT_MAX_LENGTH %>, false, $tinyMCEInput); break; case ResultTypeEnum.COMMENT: @@ -216,6 +216,7 @@ event.stopImmediatePropagation(); $(form).remove(); toggleResultEditButtons(true); + TinyMCE.destroyAll(); callback(); }); } diff --git a/app/assets/javascripts/results/result_texts.js b/app/assets/javascripts/results/result_texts.js index b80f71d10..de56b76e7 100644 --- a/app/assets/javascripts/results/result_texts.js +++ b/app/assets/javascripts/results/result_texts.js @@ -27,8 +27,7 @@ formAjaxResultText($form); Results.initCancelFormButton($form, initNewReslutText); Results.toggleResultEditButtons(false); - TinyMCE.refresh(); - TinyMCE.highlight(); + TinyMCE.init('#result_text_attributes_textarea'); $('#result_name').focus(); }, error: function() { @@ -55,11 +54,11 @@ $form.after($prevResult); $form.remove(); applyEditResultTextCallback(); + TinyMCE.destroyAll(); Results.toggleResultEditButtons(true); }); Results.toggleResultEditButtons(false); - TinyMCE.refresh(); - TinyMCE.init('#result_result_text_attributes_text'); + TinyMCE.init('#result_text_attributes_textarea'); $('#result_name').focus(); }); } diff --git a/app/assets/javascripts/sitewide/tiny_mce.js b/app/assets/javascripts/sitewide/tiny_mce.js index 025df38b0..a0abbdaf4 100644 --- a/app/assets/javascripts/sitewide/tiny_mce.js +++ b/app/assets/javascripts/sitewide/tiny_mce.js @@ -46,7 +46,7 @@ var TinyMCE = (function() { // Hide element containing HTML view of RTE field tinyMceContainer = $(selector).closest('form').find('.tinymce-view'); tinyMceInitSize = tinyMceContainer.height(); - $(selector).closest('form').find('.form-group') + $(selector).closest('.form-group') .before('
'); tinyMceContainer.addClass('hidden'); diff --git a/app/assets/javascripts/sitewide/tiny_mce_file_upload_plugin.js b/app/assets/javascripts/sitewide/tiny_mce_file_upload_plugin.js index d62b794ac..7fc8eae0d 100644 --- a/app/assets/javascripts/sitewide/tiny_mce_file_upload_plugin.js +++ b/app/assets/javascripts/sitewide/tiny_mce_file_upload_plugin.js @@ -300,7 +300,9 @@ images = $.map($('img', iframe), e => { return e.dataset.mceToken; }); - $('#' + editor.id).next()[0].value = JSON.stringify(images); + if ($('#' + editor.id).next()[0]) { + $('#' + editor.id).next()[0].value = JSON.stringify(images); + } return JSON.stringify(images); } @@ -334,4 +336,4 @@ 'customimageuploader', tinymce.plugins.CustomImageUploader ); -})(); +}()); diff --git a/app/views/result_texts/_edit.html.erb b/app/views/result_texts/_edit.html.erb index f84dab479..e11c24eb6 100644 --- a/app/views/result_texts/_edit.html.erb +++ b/app/views/result_texts/_edit.html.erb @@ -2,12 +2,12 @@ <%= bootstrap_form_for(@result, url: result_text_path(format: :json), remote: :true) do |f| %> <%= f.text_field :name, style: "margin-top: 10px;" %>
<%= f.fields_for :result_text do |ff| %> -
- <%= ff.tiny_mce_editor(:text, - value: @result.result_text.tinymce_render(:text), - data: { object_type: 'result_text', - object_id: @result.result_text.id }) %> -
+ <%= ff.tiny_mce_editor(:text, + id: :result_text_attributes_textarea, + value: @result.result_text.tinymce_render(:text), + data: { object_type: 'result_text', + object_id: @result.result_text.id, + highlightjs_path: asset_path('highlightjs-github-theme.css') }) %> <% end %>
\ No newline at end of file From 46e8f80965372facc5d7fbe5f8fec06d90128dd3 Mon Sep 17 00:00:00 2001 From: Mojca Lorber Date: Mon, 6 May 2019 17:14:19 +0200 Subject: [PATCH 10/17] Fix bug when saving empty step description --- app/assets/javascripts/protocols/steps.js.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/protocols/steps.js.erb b/app/assets/javascripts/protocols/steps.js.erb index 3592fce11..cf59c4dc4 100644 --- a/app/assets/javascripts/protocols/steps.js.erb +++ b/app/assets/javascripts/protocols/steps.js.erb @@ -530,7 +530,7 @@ var $nameInput = $form.find("#step_name"); var nameValid = textValidator(ev, $nameInput, 1, <%= Constants::NAME_MAX_LENGTH %>); - var $descrTextarea = $form.find("#step_description"); + var $descrTextarea = $form.find("#step_description_textarea"); var $tinyMCEInput = TinyMCE.getContent(); var descriptionValid = textValidator(ev, $descrTextarea, 0, <%= Constants::RICH_TEXT_MAX_LENGTH %>, false, $tinyMCEInput); From 7d54f2ab0108650f1e486375f9667306608b4040 Mon Sep 17 00:00:00 2001 From: aignatov-bio <47317017+aignatov-bio@users.noreply.github.com> Date: Tue, 7 May 2019 10:24:02 +0200 Subject: [PATCH 11/17] Fix issue with TInyMCE upload plugin (#1723) --- .../sitewide/tiny_mce_file_upload_plugin.js | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/sitewide/tiny_mce_file_upload_plugin.js b/app/assets/javascripts/sitewide/tiny_mce_file_upload_plugin.js index 7fc8eae0d..87d32cdb1 100644 --- a/app/assets/javascripts/sitewide/tiny_mce_file_upload_plugin.js +++ b/app/assets/javascripts/sitewide/tiny_mce_file_upload_plugin.js @@ -293,16 +293,24 @@ return null; } + // Create hidden field for images + function createImageHiddenField() { + textAreaElement.parent().find('input#tiny-mce-images').remove(); + $('').insertAfter(textAreaElement); + } + // Finding images in text function updateActiveImages() { var images; + var imageContainer = $('#' + editor.id).next()[0]; iframe = $('#' + editor.id).prev().find('.mce-edit-area iframe').contents(); images = $.map($('img', iframe), e => { return e.dataset.mceToken; }); - if ($('#' + editor.id).next()[0]) { - $('#' + editor.id).next()[0].value = JSON.stringify(images); + if (imageContainer === undefined) { + createImageHiddenField(); } + imageContainer.value = JSON.stringify(images); return JSON.stringify(images); } @@ -321,12 +329,14 @@ onclick: showDialog }); - ed.on('NodeChange', () => { - updateActiveImages(ed); + ed.on('NodeChange', function() { + // Check editor status + if (this.initialized) { + updateActiveImages(ed); + } }); - textAreaElement.parent().find('input#tiny-mce-images').remove(); - $('').insertAfter(textAreaElement); + createImageHiddenField(); } From 7f296b35fad164e137eb82db52d7c8aea2b47658 Mon Sep 17 00:00:00 2001 From: Anton Ignatov Date: Tue, 7 May 2019 13:22:55 +0200 Subject: [PATCH 12/17] Update team exporter for new tinymce images --- app/models/tiny_mce_asset.rb | 2 +- app/services/team_importer.rb | 34 ++++++++++++++++++---------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/app/models/tiny_mce_asset.rb b/app/models/tiny_mce_asset.rb index b07f662d1..a43392a5f 100644 --- a/app/models/tiny_mce_asset.rb +++ b/app/models/tiny_mce_asset.rb @@ -105,7 +105,7 @@ class TinyMceAsset < ApplicationRecord def self.update_old_tinymce(description) description.scan(/\[~tiny_mce_id:(\w+)\]/).flatten.each do |token| old_format = /\[~tiny_mce_id:#{token}\]/ - new_format = "" + new_format = "" description.sub!(old_format, new_format) end description diff --git a/app/services/team_importer.rb b/app/services/team_importer.rb index b140f23d6..74ed1dfcb 100644 --- a/app/services/team_importer.rb +++ b/app/services/team_importer.rb @@ -312,7 +312,11 @@ class TeamImporter end unless activity.values['message_items'].blank? activity.values['message_items'].each_value do |item| + next unless item['type'] + mappings = instance_variable_get("@#{item['type'].underscore}_mappings") + next unless mappings + item['id'] = mappings[item['id']] end end @@ -331,27 +335,25 @@ class TeamImporter ) do |tiny_mce_file| orig_tmce_id = tiny_mce_asset.id tiny_mce_asset.id = nil - if tiny_mce_asset.step_id.present? - tiny_mce_asset.step_id = @step_mappings[tiny_mce_asset.step_id] - end - if tiny_mce_asset.result_text_id.present? - tiny_mce_asset.result_text_id = - @result_text_mappings[tiny_mce_asset.result_text_id] + if tiny_mce_asset.object_id.present? + mappings = instance_variable_get("@#{tiny_mce_asset.object_type.underscore}_mappings") + tiny_mce_asset.object_id = mappings[tiny_mce_asset.object_id] end tiny_mce_asset.team = team tiny_mce_asset.image = tiny_mce_file tiny_mce_asset.save! @mce_asset_counter += 1 - if tiny_mce_asset.step_id.present? - step = Step.find_by_id(tiny_mce_asset.step_id) - step.description.sub!("[~tiny_mce_id:#{orig_tmce_id}]", - "[~tiny_mce_id:#{tiny_mce_asset.id}]") - step.save! - end - if tiny_mce_asset.result_text_id.present? - result_text = ResultText.find_by_id(tiny_mce_asset.result_text_id) - result_text.text.sub!("[~tiny_mce_id:#{orig_tmce_id}]", - "[~tiny_mce_id:#{tiny_mce_asset.id}]") + if tiny_mce_asset.object_id.present? + object = tiny_mce_asset.object + object_field = Extends::RICH_TEXT_FIELD_MAPPINGS[object.class.name] + encoded_id = Base62.encode(tiny_mce_asset.id) + object.public_send(object_field).sub!("data-mce-token=\"#{Base62.encode(orig_tmce_id)}\"", + "data-mce-token=\"#{encoded_id}\"") + # Check for old fields + new_asset_format = "" + object.public_send(object_field).sub!("[~tiny_mce_id:#{orig_tmce_id}]", + new_asset_format) + object.save! end end end From 72a1c9b9bdc70586bc9e56801c54ba1249ddf1ec Mon Sep 17 00:00:00 2001 From: Anton Ignatov Date: Tue, 7 May 2019 13:27:57 +0200 Subject: [PATCH 13/17] Fix merge conflict --- Gemfile.lock | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 21834e26a..c1256a4b9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -211,19 +211,11 @@ GEM diff-lcs (1.3) discard (1.0.0) activerecord (>= 4.2, < 6) -<<<<<<< HEAD - docile (1.1.5) - doorkeeper (5.0.0) - railties (>= 4.2) - erubi (1.8.0) - et-orbi (1.1.7) -======= docile (1.3.1) doorkeeper (5.1.0) railties (>= 5) erubi (1.8.0) et-orbi (1.2.0) ->>>>>>> master tzinfo execjs (2.7.0) factory_bot (4.8.2) @@ -375,11 +367,7 @@ GEM puma (3.12.1) raabro (1.1.6) rack (2.0.7) -<<<<<<< HEAD - rack-attack (5.4.1) -======= rack-attack (6.0.0) ->>>>>>> master rack (>= 1.0, < 3) rack-proxy (0.6.5) rack From 168424a0350d59df2710a39ca990d78ff1511395 Mon Sep 17 00:00:00 2001 From: Anton Ignatov Date: Tue, 7 May 2019 14:47:44 +0200 Subject: [PATCH 14/17] Add tag on enter button --- app/assets/javascripts/select2_customization.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/select2_customization.js b/app/assets/javascripts/select2_customization.js index 2605e7f59..4ce47deca 100644 --- a/app/assets/javascripts/select2_customization.js +++ b/app/assets/javascripts/select2_customization.js @@ -145,12 +145,15 @@ $.fn.extend({ $('.select2').find('input, .select2-selection__rendered').off('keydown').on('keydown', function(e) { var activeElement = $('.select2-results .arrow_pointer'); + var firstElement = $('.select2-results .select2-results__option').first(); var groupElement = activeElement.find('.select2-results__group'); if (e.keyCode === 13) { if (groupElement.length > 0) { groupElement.click(); - } else { + } else if (activeElement.length > 0) { activeElement.mouseup(); + } else { + firstElement.mouseup(); } setTimeout(() => { From 826ed63f179f44b135b7ded6ab749a84951b18a6 Mon Sep 17 00:00:00 2001 From: Anton Ignatov Date: Tue, 7 May 2019 15:21:15 +0200 Subject: [PATCH 15/17] Fix floating tool bar and scroll issue after leaving editor --- app/assets/javascripts/sitewide/tiny_mce.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/sitewide/tiny_mce.js b/app/assets/javascripts/sitewide/tiny_mce.js index a0abbdaf4..2e807c876 100644 --- a/app/assets/javascripts/sitewide/tiny_mce.js +++ b/app/assets/javascripts/sitewide/tiny_mce.js @@ -137,6 +137,7 @@ var TinyMCE = (function() { setTimeout(() => { $(editor.editorContainer).addClass('show'); $('.tinymce-placeholder').remove(); + moveToolbar(editor, editorToolbar, editorToolbaroffset); }, 400); // Init saved status label if (editor.getContent() !== '') { @@ -144,12 +145,18 @@ var TinyMCE = (function() { } // Init Floating toolbar - - moveToolbar(editor, editorToolbar, editorToolbaroffset); $(window).on('scroll', function() { moveToolbar(editor, editorToolbar, editorToolbaroffset); }); + + // Update scroll position after exit + function updateScrollPosition() { + if (editorForm.offset().top < $(window).scrollTop()) { + $(window).scrollTop(editorForm.offset().top - 150); + } + } + // Init Save button editorForm .find('.tinymce-save-button') @@ -161,6 +168,7 @@ var TinyMCE = (function() { editor.setProgressState(1); editor.save(); editorForm.submit(); + updateScrollPosition(); }); // After save action @@ -190,6 +198,7 @@ var TinyMCE = (function() { editorForm.find('.tinymce-status-badge').addClass('hidden'); editorForm.find('.tinymce-view').removeClass('hidden'); editor.remove(); + updateScrollPosition(); }) .removeClass('hidden'); From ea545801aaf0593a11e8c7af47e20d60064b2cbe Mon Sep 17 00:00:00 2001 From: Anton Ignatov Date: Tue, 7 May 2019 15:54:32 +0200 Subject: [PATCH 16/17] Clear edit textarea status before going to editmode --- app/assets/javascripts/protocols/steps.js.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/protocols/steps.js.erb b/app/assets/javascripts/protocols/steps.js.erb index 3592fce11..31970e535 100644 --- a/app/assets/javascripts/protocols/steps.js.erb +++ b/app/assets/javascripts/protocols/steps.js.erb @@ -150,6 +150,7 @@ animateSpinner(null, false); FilePreviewModal.init(); DragNDropSteps.clearFiles(); + if (tinyMCE.editors.step_description_textarea) tinyMCE.editors.step_description_textarea.remove(); TinyMCE.init('#step_description_textarea'); $("#new-step-checklists fieldset.nested_step_checklists ul").each(function () { enableCheckboxSorting(this); From d08bdd771e43081e429e4ba7d06acf7921d0ef88 Mon Sep 17 00:00:00 2001 From: aignatov-bio <47317017+aignatov-bio@users.noreply.github.com> Date: Wed, 8 May 2019 10:21:59 +0200 Subject: [PATCH 17/17] Fix task tag cut off (#1734) --- app/assets/javascripts/my_modules.js | 3 ++- app/assets/javascripts/select2_customization.js | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/my_modules.js b/app/assets/javascripts/my_modules.js index 6d04d4493..ae6197a15 100644 --- a/app/assets/javascripts/my_modules.js +++ b/app/assets/javascripts/my_modules.js @@ -290,7 +290,8 @@ function initTagsSelector() { closeOnSelect: true, withoutArrow: true, dynamicCreation: true, - dynamicCreationDelimiter: [','] + dynamicCreationDelimiter: [','], + placeholderSize: '250px' }).on('select2:select', (e) => { var params = e.params.data; var newTag = null; diff --git a/app/assets/javascripts/select2_customization.js b/app/assets/javascripts/select2_customization.js index 4ce47deca..b1739b2b8 100644 --- a/app/assets/javascripts/select2_customization.js +++ b/app/assets/javascripts/select2_customization.js @@ -57,7 +57,9 @@ $.fn.extend({ // Placeholder fix for ajax fields if (config.ajax) { setTimeout(() => { - select2.next().find('.select2-search__field').css('width', 'auto'); + select2.next().find('.select2-search__field').css( + 'width', config.placeholderSize || 'auto' + ); }, 0); }