From afe376b3a364acc427aa5868e11828951a048423 Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Fri, 16 Jul 2021 10:49:41 +0200 Subject: [PATCH 01/10] Fix sorting by role with filtering in team members table [SCI-5908] --- app/datatables/custom_datatable.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/datatables/custom_datatable.rb b/app/datatables/custom_datatable.rb index 0b60d9e12..033bb49b8 100644 --- a/app/datatables/custom_datatable.rb +++ b/app/datatables/custom_datatable.rb @@ -18,8 +18,8 @@ class CustomDatatable < AjaxDatatablesRails::Base def fetch_records records = get_raw_records - records = sort_records(records) if order_params.present? records = filter_records(records) if dt_params[:search].present? + records = sort_records(records) if order_params.present? records = paginate_records(records) unless dt_params[:length].present? && dt_params[:length] == '-1' records From 4bfc52b583d17ee98381d6d39219833ffff33802 Mon Sep 17 00:00:00 2001 From: miha Date: Mon, 19 Jul 2021 10:16:05 +0200 Subject: [PATCH 02/10] Bump version to 1.22.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6fee2fedb..89144dbc3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.22.2 +1.22.3 From 5d5f406e9a039bc1436f7d47c06fe564968df6a8 Mon Sep 17 00:00:00 2001 From: Martin Artnik Date: Wed, 11 Aug 2021 13:18:58 +0200 Subject: [PATCH 03/10] Downcase all user emails, downcase when finding user [SCI-5963] --- app/controllers/users/omniauth_callbacks_controller.rb | 2 +- app/models/user.rb | 7 +++++++ db/migrate/20210811103123_downcase_user_emails.rb | 7 +++++++ db/structure.sql | 3 ++- spec/models/user_spec.rb | 8 ++++++++ 5 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20210811103123_downcase_user_emails.rb diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index b779d6118..7d7b804cc 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -38,7 +38,7 @@ module Users return redirect_to after_omniauth_failure_path_for(resource_name) end - user = User.find_by(email: email) + user = User.find_by(email: email.downcase) if user.blank? # Create new user and identity diff --git a/app/models/user.rb b/app/models/user.rb index 1ecd1c7d0..1bf64a1e8 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -291,6 +291,7 @@ class User < ApplicationRecord foreign_key: :resource_owner_id, dependent: :delete_all + before_validation :downcase_email! before_destroy :destroy_notifications def name @@ -674,6 +675,12 @@ class User < ApplicationRecord private + def downcase_email! + return unless email + + self.email = email.downcase + end + def destroy_notifications # Find all notifications where user is the only reference # on the notification, and destroy all such notifications diff --git a/db/migrate/20210811103123_downcase_user_emails.rb b/db/migrate/20210811103123_downcase_user_emails.rb new file mode 100644 index 000000000..a6d42085f --- /dev/null +++ b/db/migrate/20210811103123_downcase_user_emails.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class DowncaseUserEmails < ActiveRecord::Migration[6.1] + def up + execute('UPDATE users SET email = LOWER(email)') + end +end diff --git a/db/structure.sql b/db/structure.sql index 471211d62..6db6edefc 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -7488,6 +7488,7 @@ INSERT INTO "schema_migrations" (version) VALUES ('20210622101238'), ('20210715125349'), ('20210716124649'), -('20210720112050'); +('20210720112050'), +('20210811103123'); diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 8efc7f7bd..18fc48490 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -322,6 +322,14 @@ describe User, type: :model do it { is_expected.to have_many(:system_notifications) } end + describe 'Email downcase' do + it 'downcases email before validating and saving user' do + user = User.new(email: 'Test@Email.com') + user.save + expect(user.email).to eq('test@email.com') + end + end + describe 'valid_otp?' do let(:user) { create :user } before do From d67f7691a14b73e2b17b4bccad6d9f7fe1267d2c Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Thu, 26 Aug 2021 14:08:15 +0200 Subject: [PATCH 04/10] Add configuration variable for webhooks, disable by default [SCI-6031] --- app/models/activity.rb | 3 ++- app/models/webhook.rb | 7 +++++++ app/permissions/organization.rb | 2 +- config/application.rb | 2 ++ config/locales/en.yml | 2 ++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/models/activity.rb b/app/models/activity.rb index 3a5f0c5be..0a66fe3cf 100644 --- a/app/models/activity.rb +++ b/app/models/activity.rb @@ -74,7 +74,8 @@ class Activity < ApplicationRecord breadcrumbs: {} ) - after_create ->(activity) { Activities::DispatchWebhooksJob.perform_later(activity) } + after_create ->(activity) { Activities::DispatchWebhooksJob.perform_later(activity) }, + if: -> { Rails.application.config.x.webhooks_enabled } def self.activity_types_list activity_list = type_ofs.map do |key, value| diff --git a/app/models/webhook.rb b/app/models/webhook.rb index 2388f0ebc..4fc61105f 100644 --- a/app/models/webhook.rb +++ b/app/models/webhook.rb @@ -6,12 +6,19 @@ class Webhook < ApplicationRecord belongs_to :activity_filter validates :http_method, presence: true validates :url, presence: true + validate :enabled? validate :valid_url scope :active, -> { where(active: true) } private + def enabled? + unless Rails.application.config.x.webhooks_enabled + errors.add(:configuration, I18n.t('activerecord.errors.models.webhook.attributes.configuration.disabled')) + end + end + def valid_url unless /\A#{URI::DEFAULT_PARSER.make_regexp(%w(http https))}\z/.match?(url) errors.add(:url, I18n.t('activerecord.errors.models.webhook.attributes.url.not_valid')) diff --git a/app/permissions/organization.rb b/app/permissions/organization.rb index e702e0347..7a11acb37 100644 --- a/app/permissions/organization.rb +++ b/app/permissions/organization.rb @@ -14,7 +14,7 @@ module Organization end can :create_acitivity_filters do - true + Rails.application.config.x.webhooks_enabled end end end diff --git a/config/application.rb b/config/application.rb index 2451162ff..eccd405fa 100644 --- a/config/application.rb +++ b/config/application.rb @@ -40,6 +40,8 @@ module Scinote # Max uploaded file size in MB config.x.file_max_size_mb = (ENV['FILE_MAX_SIZE_MB'] || 50).to_i + config.x.webhooks_enabled = ENV['ENABLE_WEBHOOKS'] == 'true' + # Logging config.log_formatter = proc do |severity, datetime, progname, msg| "[#{datetime}] #{severity}: #{msg}\n" diff --git a/config/locales/en.yml b/config/locales/en.yml index ddceb65ff..51b91ee5f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -148,6 +148,8 @@ en: per_column_limit: "Too many items in the column" webhook: attributes: + configuration: + disabled: 'Webhooks are disabled' url: not_valid: 'Not valid URL' From 6d92af4b2feca30918d840fa377e28b6fcfd998e Mon Sep 17 00:00:00 2001 From: Martin Artnik Date: Mon, 30 Aug 2021 14:41:31 +0200 Subject: [PATCH 05/10] Made barcode search globally available [SCI-6022] --- app/assets/javascripts/application.js.erb | 1 + .../javascripts/my_modules/repositories.js | 1 + app/assets/javascripts/repositories/show.js | 21 ----------- .../javascripts/shared/barcode_search.js | 20 +++++++++++ app/assets/stylesheets/repositories.scss | 36 +++++++++---------- 5 files changed, 40 insertions(+), 39 deletions(-) create mode 100644 app/assets/javascripts/shared/barcode_search.js diff --git a/app/assets/javascripts/application.js.erb b/app/assets/javascripts/application.js.erb index 3daeec359..1c4c4dfc1 100644 --- a/app/assets/javascripts/application.js.erb +++ b/app/assets/javascripts/application.js.erb @@ -41,6 +41,7 @@ //= require repository_columns/index //= require perfect-scrollbar.min //= require shared/inline_editing +//= require shared/barcode_search //= require activestorage //= require global_activities/side_pane //= require protocols/header diff --git a/app/assets/javascripts/my_modules/repositories.js b/app/assets/javascripts/my_modules/repositories.js index ba38e0d9e..e6e8571da 100644 --- a/app/assets/javascripts/my_modules/repositories.js +++ b/app/assets/javascripts/my_modules/repositories.js @@ -172,6 +172,7 @@ var MyModuleRepositories = (function() { var dataTableWrapper = $(tableContainer).closest('.dataTables_wrapper'); DataTableHelpers.initLengthApearance(dataTableWrapper); DataTableHelpers.initSearchField(dataTableWrapper, I18n.t('repositories.show.filter_inventory_items')); + $('').appendTo($('.search-container')); dataTableWrapper.find('.main-actions, .pagination-row').removeClass('hidden'); if (options.assign_mode) { renderFullViewAssignButtons(); diff --git a/app/assets/javascripts/repositories/show.js b/app/assets/javascripts/repositories/show.js index f03fe0021..76ac28dd1 100644 --- a/app/assets/javascripts/repositories/show.js +++ b/app/assets/javascripts/repositories/show.js @@ -174,27 +174,6 @@ $('.create-new-repository').initSubmitModal('#create-repo-modal', 'repository'); - $('.repository-show').on('click', '.barcode-scanner', function() { - var search = $('.search-container .search-field'); - var input = $('').attr('type', 'text').css('opacity', 0).appendTo('body'); - search.val(''); - search.attr('disabled', true).addClass('barcode-mode'); - - input.focus(); - input.one('change', function() { - search.val($(this).val()); - search.trigger('keyup'); - $(document).click(); - }); - - setTimeout(function() { - $(document).one('click', function() { - search.attr('disabled', false).removeClass('barcode-mode'); - input.remove(); - }); - }); - }); - function initArchivingActionsInDropdown() { $('.archive-repository-option').on('click', function(event) { event.preventDefault(); diff --git a/app/assets/javascripts/shared/barcode_search.js b/app/assets/javascripts/shared/barcode_search.js new file mode 100644 index 000000000..996f3bbf5 --- /dev/null +++ b/app/assets/javascripts/shared/barcode_search.js @@ -0,0 +1,20 @@ +$(document).on('click', '.barcode-scanner', function() { + var search = $('.search-container .search-field'); + var input = $('').attr('type', 'text').css('opacity', 0).appendTo('body'); + search.val(''); + search.attr('disabled', true).addClass('barcode-mode'); + + input.focus(); + input.one('change', function() { + search.val($(this).val()); + search.trigger('keyup'); + $(document).click(); + }); + + setTimeout(function() { + $(document).one('click', function() { + search.attr('disabled', false).removeClass('barcode-mode'); + input.remove(); + }); + }); +}); diff --git a/app/assets/stylesheets/repositories.scss b/app/assets/stylesheets/repositories.scss index 3e3af7fc9..bdd14baff 100644 --- a/app/assets/stylesheets/repositories.scss +++ b/app/assets/stylesheets/repositories.scss @@ -127,24 +127,6 @@ } } - .barcode-scanner { - cursor: pointer; - position: absolute; - right: 12px; - top: 12px; - } - - .search-container { - .search-field { - padding-right: 32px; - - &.barcode-mode { - background-color: $brand-primary; - opacity: .3; - } - } - } - .main-actions { align-items: center; background-color: $color-white; @@ -597,3 +579,21 @@ max-height: 290px; } } + +.barcode-scanner { + cursor: pointer; + position: absolute; + right: 12px; + top: 12px; +} + +.search-container { + .search-field { + padding-right: 32px; + + &.barcode-mode { + background-color: $brand-primary; + opacity: .3; + } + } +} From 73241e87bb803cf31c4ba34883c98951f7dff021 Mon Sep 17 00:00:00 2001 From: Martin Artnik Date: Tue, 31 Aug 2021 14:37:02 +0200 Subject: [PATCH 06/10] Fix barcode scanning in modals [SCI-6022] --- app/assets/javascripts/shared/barcode_search.js | 3 ++- app/views/repositories/_repository_row_info_modal.html.erb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/shared/barcode_search.js b/app/assets/javascripts/shared/barcode_search.js index 996f3bbf5..797f2afb0 100644 --- a/app/assets/javascripts/shared/barcode_search.js +++ b/app/assets/javascripts/shared/barcode_search.js @@ -1,6 +1,7 @@ $(document).on('click', '.barcode-scanner', function() { var search = $('.search-container .search-field'); - var input = $('').attr('type', 'text').css('opacity', 0).appendTo('body'); + var input = $('').attr('type', 'text').css({ position: 'absolute', right: 0, opacity: 0 }) + .appendTo($('.search-container').parent()); search.val(''); search.attr('disabled', true).addClass('barcode-mode'); diff --git a/app/views/repositories/_repository_row_info_modal.html.erb b/app/views/repositories/_repository_row_info_modal.html.erb index f80c6e376..e3359f13a 100644 --- a/app/views/repositories/_repository_row_info_modal.html.erb +++ b/app/views/repositories/_repository_row_info_modal.html.erb @@ -46,7 +46,7 @@

- +
From 554fb057381d6a7e933cf03b282e5c30f38500a1 Mon Sep 17 00:00:00 2001 From: Miha Mencin Date: Wed, 1 Sep 2021 09:30:31 +0200 Subject: [PATCH 07/10] Bump version to 1.22.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6fee2fedb..89144dbc3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.22.2 +1.22.3 From 8052d4c8d19f3459264f6a62bf76c06debcd6861 Mon Sep 17 00:00:00 2001 From: Miha Mencin Date: Wed, 1 Sep 2021 09:40:20 +0200 Subject: [PATCH 08/10] Bump version to 1.22.4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 89144dbc3..2a0ba77cc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.22.3 +1.22.4 From 3a70aadea4f991aaed3ad67e491fab2d4d5de50e Mon Sep 17 00:00:00 2001 From: Martin Artnik Date: Thu, 2 Sep 2021 09:52:52 +0200 Subject: [PATCH 09/10] Added specific html class to printer settings section [SCI-6039] --- app/views/users/settings/account/addons/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/users/settings/account/addons/index.html.erb b/app/views/users/settings/account/addons/index.html.erb index fee31ea9b..dae490942 100644 --- a/app/views/users/settings/account/addons/index.html.erb +++ b/app/views/users/settings/account/addons/index.html.erb @@ -17,7 +17,7 @@ -
+

<%= t('users.settings.account.addons.label_printers') %>

From ccc2964aff29122262ca054da9aa70b14bf4d3fc Mon Sep 17 00:00:00 2001 From: aignatov-bio <47317017+aignatov-bio@users.noreply.github.com> Date: Mon, 6 Sep 2021 10:13:30 +0200 Subject: [PATCH 10/10] Add error message on empty BioEddie save [SCI-5993] (#3526) --- app/assets/javascripts/sitewide/bio_eddie.js | 6 +++++- config/locales/en.yml | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/sitewide/bio_eddie.js b/app/assets/javascripts/sitewide/bio_eddie.js index 93137e21b..1bedde823 100644 --- a/app/assets/javascripts/sitewide/bio_eddie.js +++ b/app/assets/javascripts/sitewide/bio_eddie.js @@ -92,6 +92,11 @@ var bioEddieEditor = (function() { } else { saveMolecule(svg, structure, scheduleForRegistration); } + }) + .catch(() => { + if (structure === '$$$$V2.0') { + HelperModule.flashAlertMsg(I18n.t('bio_eddie.empty_molecule_error'), 'danger'); + } }); } @@ -129,7 +134,6 @@ var bioEddieEditor = (function() { bioEddieModal.data('update-url', updateUrl); bioEddieModal.find('.file-name input').val(name); bioEddieModal.modal('show'); - } }; }()); diff --git a/config/locales/en.yml b/config/locales/en.yml index 51b91ee5f..9ad8c21c1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2688,6 +2688,7 @@ en: molecule_name_placeholder: "Click here to enter Molecule name" no_molecules_found: "No Molecules Found" save_and_register: "Save & Register to Biomolecule Toolkit" + empty_molecule_error: "An error occurred. The molecule can't be empty." marvinjs: new_sketch: "New Chemical Drawing"