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"