Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
b54f2c5
add orange color
wendyyang Jan 14, 2026
86cbf2e
add validation of i7, i5 column
wendyyang Jan 21, 2026
cc016ff
add unit test
wendyyang Jan 21, 2026
c74bdc8
Merge branch 'develop' into 5291-y25-604---making-tag-columns-orange-…
wendyyang Jan 21, 2026
6092baa
add i7/i5 to the test fiile
wendyyang Jan 21, 2026
772bc94
update the test
wendyyang Jan 22, 2026
3a4574e
fix linting
wendyyang Jan 22, 2026
d6489dc
fix the test
wendyyang Jan 22, 2026
6fbcef5
Merge branch 'develop' into 5291-y25-604---making-tag-columns-orange-…
wendyyang Jan 26, 2026
3efdfc4
Merge branch 'develop' into 5291-y25-604---making-tag-columns-orange-…
wendyyang Feb 2, 2026
177f438
add more columns to be orange
wendyyang Feb 4, 2026
9493c6f
wip: adds scrna core cdna pooling plan download link to submission sh…
BenTopping Feb 6, 2026
58f2ee8
wip: initial attempt at fleshing out pooling plan logic
BenTopping Feb 6, 2026
91d3780
tests: adds pooling download tests
BenTopping Feb 9, 2026
1dd45b2
feat(submission): adds submission helper method to identify scrna cor…
BenTopping Feb 9, 2026
0f8b90a
feat(submission): correct scrna core pooling plan pool distribution l…
BenTopping Feb 9, 2026
e81cf1e
refactor: clean up pool allocation logic
BenTopping Feb 9, 2026
bc60325
feat(submission): moves scrna core pooling plan csv file generation t…
BenTopping Feb 10, 2026
b6df3bd
tests: adds generate_pooling_plan tests for ScrnaCoreCdnaPrepPoolingP…
BenTopping Feb 11, 2026
f0e3bad
fix: changes ScrnaCoreCdnaPrepPoolingPlanGenerator to group submissio…
BenTopping Feb 11, 2026
ffc80ce
Merge branch 'develop' of https://github.com/sanger/sequencescape int…
BenTopping Feb 11, 2026
fc5e0a6
fix: adds asset uniqueness logic to ScrnaCoreCdnaPrepPoolingPlanGener…
BenTopping Feb 11, 2026
587e9eb
fix: fixes multiplexed_library_tube throwing errors if no creation_re…
BenTopping Feb 12, 2026
b4ab11b
Merge branch 'develop' of https://github.com/sanger/sequencescape int…
BenTopping Feb 12, 2026
dc27bf9
Merge branch 'develop' into 5291-y25-604---making-tag-columns-orange-…
wendyyang Feb 12, 2026
9ac5b15
save working version
wendyyang Feb 12, 2026
42b8ad1
refactor: removes cnda term from scrna core pooling plan to avoid con…
BenTopping Feb 13, 2026
5383dab
Update Node.js to version 24.13.1
depfu[bot] Feb 17, 2026
87217c0
feat: add built-in rails endpoint
StephenHulme Feb 18, 2026
87ee016
refactor: order and group routes
StephenHulme Feb 18, 2026
01ca40b
save working version
wendyyang Feb 18, 2026
3ab74d7
save changes
wendyyang Feb 18, 2026
ceecf8b
fix linting
wendyyang Feb 18, 2026
6625aba
remove redundant codes
wendyyang Feb 18, 2026
e46dd53
remove duplicate warnings
wendyyang Feb 18, 2026
330d88e
refactor to fix linting
wendyyang Feb 18, 2026
e45b8b7
Merge branch 'develop' into 5291-y25-604---making-tag-columns-orange-…
wendyyang Feb 19, 2026
7da2aaa
update the i7/i5 conditional formatting
wendyyang Feb 19, 2026
540115d
add new conditional formatings to test data files
wendyyang Feb 19, 2026
409c514
remove not valid test
wendyyang Feb 19, 2026
0dcc9b8
fix tests
wendyyang Feb 19, 2026
c60a670
add LCM Triomics RNASeq template
wendyyang Feb 19, 2026
e4f9c37
fix linting
wendyyang Feb 19, 2026
8778e37
add request type etc
wendyyang Feb 20, 2026
7144dca
add project name to submission template
wendyyang Feb 20, 2026
01e59f0
Update mocha to version 3.0.2
depfu[bot] Feb 20, 2026
7392901
Merge pull request #5548 from sanger/depfu/engine/yarn/nodejs-24.13.1
StephenHulme Feb 23, 2026
546e842
fix: allow flashes to render described lists
StephenHulme Feb 23, 2026
52a9761
refactor: use new hash-style flash
StephenHulme Feb 23, 2026
9dca071
refactor: remove unused css classes
StephenHulme Feb 23, 2026
72ac228
test: update specs
StephenHulme Feb 23, 2026
fe16d81
Merge pull request #5567 from sanger/sh51/add-dictionary-format-to-fl…
StephenHulme Feb 23, 2026
abfd39b
Update vite-plugin-ruby to version 5.1.3
depfu[bot] Feb 23, 2026
9d4e8d4
Merge branch 'develop' into 5291-y25-604---making-tag-columns-orange-…
wendyyang Feb 23, 2026
8b59388
Update ruby-prof to version 2.0.2
depfu[bot] Feb 24, 2026
52cd773
Merge pull request #5560 from sanger/depfu/update/mocha-3.0.2
StephenHulme Feb 24, 2026
3719381
Merge pull request #5568 from sanger/depfu/update/yarn/vite-plugin-ru…
StephenHulme Feb 24, 2026
a794def
Merge pull request #5569 from sanger/depfu/update/ruby-prof-2.0.2
StephenHulme Feb 24, 2026
78d0499
Merge branch 'develop' into sh51/health
StephenHulme Feb 24, 2026
399d60b
fix: makes creation_requests return consistent type
BenTopping Feb 24, 2026
5cada12
Merge branch 'develop' of https://github.com/sanger/sequencescape int…
BenTopping Feb 24, 2026
487159c
Update rspec-rails to version 8.0.3
depfu[bot] Feb 24, 2026
b0bcc10
Merge branch 'develop' into 5291-y25-604---making-tag-columns-orange-…
wendyyang Feb 25, 2026
c9e0bb1
Merge branch 'develop' into Y26-004--lcm-triomics-add_RNAseq_template
wendyyang Feb 25, 2026
52dbf91
Merge pull request #5542 from sanger/Y26-011-pool-released-dead-letters
BenTopping Feb 25, 2026
8b95cb6
Merge branch 'develop' of https://github.com/sanger/sequencescape int…
BenTopping Feb 26, 2026
52254ab
Merge pull request #5550 from sanger/sh51/health
StephenHulme Feb 26, 2026
816ea76
Merge pull request #5570 from sanger/depfu/update/rspec-rails-8.0.3
StephenHulme Feb 26, 2026
6429211
Merge branch 'develop' into Y25-016-scrna-submission-pooling-plan
BenTopping Feb 26, 2026
8893a36
Merge pull request #5525 from sanger/Y25-016-scrna-submission-pooling…
BenTopping Feb 26, 2026
c7eaab4
Update selenium-webdriver to version 4.41.0
depfu[bot] Feb 27, 2026
7abb2b2
Merge pull request #5571 from sanger/depfu/update/selenium-webdriver-…
StephenHulme Feb 27, 2026
34defdd
Update bootsnap to version 1.23.0
depfu[bot] Mar 2, 2026
b2048af
rename the updated config files
wendyyang Mar 3, 2026
3ed2d8e
Merge branch 'develop' into Y26-004--lcm-triomics-add_RNAseq_template
wendyyang Mar 3, 2026
8279684
Merge branch 'develop' into 5291-y25-604---making-tag-columns-orange-…
wendyyang Mar 3, 2026
852747a
Merge pull request #5579 from sanger/depfu/update/bootsnap-1.23.0
StephenHulme Mar 3, 2026
78f3a63
move the new code into separte files
wendyyang Mar 3, 2026
556b078
update the file
wendyyang Mar 3, 2026
2345a13
reverse existing config
wendyyang Mar 3, 2026
98e2d35
Merge branch 'develop' into Y26-004--lcm-triomics-add_RNAseq_template
wendyyang Mar 3, 2026
a46dd6f
Merge pull request #5559 from sanger/Y26-004--lcm-triomics-add_RNAseq…
wendyyang Mar 3, 2026
59e1e3e
build: update datatables
StephenHulme Mar 3, 2026
a797b5b
Merge pull request #5583 from sanger/sh51/update-datatables
StephenHulme Mar 3, 2026
a9c4ef3
Update Node.js to version 24.14.0
depfu[bot] Mar 4, 2026
c3646da
Merge pull request #5585 from sanger/depfu/engine/yarn/nodejs-24.14.0
StephenHulme Mar 4, 2026
fd0ca2b
Update flipper to version 1.4.0
depfu[bot] Mar 5, 2026
c825545
Merge branch 'develop' into 5291-y25-604---making-tag-columns-orange-…
wendyyang Mar 5, 2026
0429a67
Merge pull request #5483 from sanger/5291-y25-604---making-tag-column…
wendyyang Mar 5, 2026
bd18995
Merge pull request #5589 from sanger/depfu/update/flipper-1.4.0
StephenHulme Mar 6, 2026
f5ed910
misc: bumps release version
BenTopping Mar 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
24.13.0
24.14.0
2 changes: 1 addition & 1 deletion .release-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
14.88.0
14.89.0
54 changes: 28 additions & 26 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,8 @@ GEM
backports (3.25.2)
base64 (0.3.0)
benchmark (0.5.0)
bigdecimal (3.3.1)
bootsnap (1.22.0)
bigdecimal (4.0.1)
bootsnap (1.23.0)
msgpack (~> 1.2)
builder (3.3.0)
bullet (8.1.0)
Expand Down Expand Up @@ -167,7 +167,7 @@ GEM
marcel (~> 1.0)
nokogiri (~> 1.10, >= 1.10.4)
rubyzip (>= 2.4, < 4)
cgi (0.5.0)
cgi (0.5.1)
childprocess (5.1.0)
logger (~> 1.5)
choice (0.2.0)
Expand Down Expand Up @@ -247,14 +247,14 @@ GEM
ffi (1.17.3-arm64-darwin)
ffi (1.17.3-x86_64-darwin)
ffi (1.17.3-x86_64-linux-gnu)
flipper (1.3.6)
flipper (1.4.0)
concurrent-ruby (< 2)
flipper-active_record (1.3.6)
flipper-active_record (1.4.0)
activerecord (>= 4.2, < 9)
flipper (~> 1.3.6)
flipper-ui (1.3.6)
flipper (~> 1.4.0)
flipper-ui (1.4.0)
erubi (>= 1.0.0, < 2.0.0)
flipper (~> 1.3.6)
flipper (~> 1.4.0)
rack (>= 1.4, < 4)
rack-protection (>= 1.5.3, < 5.0.0)
rack-session (>= 1.0.2, < 3.0.0)
Expand All @@ -272,14 +272,15 @@ GEM
http-accept (1.7.0)
http-cookie (1.1.0)
domain_name (~> 0.5)
i18n (1.14.7)
i18n (1.14.8)
concurrent-ruby (~> 1.0)
image_processing (1.14.0)
mini_magick (>= 4.9.5, < 6)
ruby-vips (>= 2.0.17, < 3)
io-console (0.8.1)
irb (1.15.3)
io-console (0.8.2)
irb (1.17.0)
pp (>= 0.6.0)
prism (>= 1.3.0)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.18.1)
Expand All @@ -302,7 +303,7 @@ GEM
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
logger (1.7.0)
loofah (2.24.1)
loofah (2.25.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.9.0)
Expand All @@ -327,7 +328,7 @@ GEM
minitest-profiler (0.0.2)
activesupport (>= 4.1.0)
minitest (>= 5.3.3)
mocha (3.0.1)
mocha (3.0.2)
ruby2_keywords (>= 0.0.5)
msgpack (1.8.0)
multi_json (1.17.0)
Expand Down Expand Up @@ -430,8 +431,8 @@ GEM
activesupport (>= 4.2)
choice (~> 0.2.0)
ruby-graphviz (~> 1.2)
rails-html-sanitizer (1.6.2)
loofah (~> 2.21)
rails-html-sanitizer (1.7.0)
loofah (~> 2.25)
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
rails-perftest (0.0.7)
railties (7.2.3)
Expand All @@ -454,7 +455,7 @@ GEM
rbtree (0.4.6)
rdoc (6.3.4.1)
regexp_parser (2.11.3)
reline (0.6.2)
reline (0.6.3)
io-console (~> 0.5)
rest-client (2.1.0)
http-accept (>= 1.7.0, < 2.0)
Expand All @@ -474,9 +475,9 @@ GEM
rspec-mocks (~> 3.13.0)
rspec-collection_matchers (1.2.1)
rspec-expectations (>= 2.99.0.beta1)
rspec-core (3.13.3)
rspec-core (3.13.6)
rspec-support (~> 3.13.0)
rspec-expectations (3.13.3)
rspec-expectations (3.13.5)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-github (3.0.0)
Expand All @@ -487,18 +488,18 @@ GEM
rspec-json_expectations (2.2.0)
rspec-longrun (3.1.0)
rspec-core (>= 3.5.0, < 4)
rspec-mocks (3.13.2)
rspec-mocks (3.13.7)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-rails (8.0.2)
rspec-rails (8.0.3)
actionpack (>= 7.2)
activesupport (>= 7.2)
railties (>= 7.2)
rspec-core (~> 3.13)
rspec-expectations (~> 3.13)
rspec-mocks (~> 3.13)
rspec-support (~> 3.13)
rspec-support (3.13.2)
rspec-support (3.13.7)
rubocop (1.84.1)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
Expand Down Expand Up @@ -542,8 +543,9 @@ GEM
rubocop-rspec (~> 3.5)
ruby-graphviz (1.2.5)
rexml
ruby-prof (1.7.2)
ruby-prof (2.0.2)
base64
ostruct
ruby-progressbar (1.13.0)
ruby-units (4.1.0)
ruby-vips (2.2.3)
Expand All @@ -560,7 +562,7 @@ GEM
crass (~> 1.0.2)
nokogiri (>= 1.16.8)
securerandom (0.4.1)
selenium-webdriver (4.40.0)
selenium-webdriver (4.41.0)
base64 (~> 0.2)
logger (~> 1.4)
rexml (~> 3.2, >= 3.2.5)
Expand Down Expand Up @@ -604,7 +606,7 @@ GEM
logger
temple (0.10.4)
test-prof (1.5.2)
thor (1.4.0)
thor (1.5.0)
tilt (2.6.1)
timecop (0.9.10)
timeout (0.4.4)
Expand Down Expand Up @@ -633,7 +635,7 @@ GEM
addressable (>= 2.8.0)
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
webrick (1.9.1)
webrick (1.9.2)
websocket (1.2.11)
websocket-driver (0.8.0)
base64
Expand All @@ -655,7 +657,7 @@ GEM
ostruct
rainbow
yard
zeitwerk (2.7.3)
zeitwerk (2.7.5)

PLATFORMS
arm64-darwin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def create
return error('No file attached') if params[:upload].blank?

if upload_manifest
success('Sample manifest successfully uploaded.')
set_upload_flash_message
else
error('Your sample manifest couldn\'t be uploaded.')
end
Expand All @@ -27,6 +27,29 @@ def upload_manifest
@uploader.run!
end

def set_upload_flash_message
warning_rows = rows_with_warnings
return success('Sample manifest successfully uploaded.') if warning_rows.empty?

apply_warning_flash(warning_rows)
end

def rows_with_warnings
@uploader.upload.rows.select do |row|
row.respond_to?(:warnings) && row.warnings.any?
end
end

def apply_warning_flash(rows)
flash[:warning] = {
'Sample manifest uploaded with warnings!':
rows.flat_map { |row| row.warnings.full_messages }.uniq
}

redirect_target = (@uploader.study.present? ? sample_manifests_study_path(@uploader.study) : sample_manifests_path)
redirect_to redirect_target
end

def success(message)
flash[:notice] = message
redirect_target = (@uploader.study.present? ? sample_manifests_study_path(@uploader.study) : sample_manifests_path)
Expand Down
23 changes: 23 additions & 0 deletions app/controllers/submissions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,29 @@ def study
@submissions = @study.submissions
end

def download_scrna_core_pooling_plan # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
begin
submission = Submission.find(params[:id])
rescue ActiveRecord::RecordNotFound
flash[:error] = "Submission not found with id #{params[:id]}"
redirect_to submissions_path
return
end

unless submission.scrna_core_cdna_prep_gem_x_5p_submission?
flash[:error] =
'This submission does not have the correct template for downloading a scRNA Core pooling plan'
redirect_to submission
return
end

# Generate the pooling plan CSV string using the ScrnaCoreCdnaPrepPoolingPlanGenerator module
csv_string = Submission::ScrnaCoreCdnaPrepPoolingPlanGenerator.generate_pooling_plan(submission)

send_data csv_string, type: 'text/plain', filename: "#{params[:id]}_scrna_core_pooling_plan.csv",
disposition: 'attachment'
end

################################################### AJAX ROUTES
# TODO[sd9]: These AJAX routes could be re-factored

Expand Down
6 changes: 5 additions & 1 deletion app/frontend/stylesheets/all/sequencescape.scss
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,10 @@ h3.card-header-custom {
}
}

.alert-error ul {
.alert-error ul,
.alert-warning ul,
.alert-notice ul,
.alert-success ul {
margin: 0;
}

Expand All @@ -171,6 +174,7 @@ h3.card-header-custom {
.alert-cancelled {
@extend .alert-warning;
}

.text-notice,
.text-passed {
@extend .text-success;
Expand Down
34 changes: 27 additions & 7 deletions app/helpers/application_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,17 +76,37 @@ def render_flashes
nil
end

# A helper method for render_flashes - If multiple messages, render them as a list, else render as a single div
# @param messages [Array<String>, String] The flash message or messages to be rendered
def render_message(messages)
messages = Array(messages)
if messages.size > 1
tag.ul { messages.each { |m| concat tag.li(m) } }
# A helper method for render_flashes.
# If messages is a Hash, renders them as a described list, with the keys as the description and
# the values as the items.
# If messages is an Array with multiple messages, renders them as a list.
# If a single message, renders as a single div.
#
# @param messages [Hash, Array<String>, String] The flash message or messages to be rendered
# @return [ActiveSupport::SafeBuffer] HTML-safe string for rendering the messages
def render_message(messages) # rubocop:disable Metrics/MethodLength
case messages
when Hash
safe_join(
messages.map do |description, items|
tag.div(description) + render_in_list(Array(items))
end
)
when Array
if messages.size > 1
render_in_list(messages)
else # messages has only one element, render it as a single div
tag.div(messages.first)
end
else
tag.div(messages.first)
tag.div(messages)
end
end

def render_in_list(messages)
tag.ul { messages.each { |message| concat tag.li(message) } }
end

def api_data
{ api_version: RELEASE.api_version }
end
Expand Down
2 changes: 1 addition & 1 deletion app/models/ability/base_user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def grant_privileges # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
can %i[read create], Study
can :print_asset_group_labels, Study, owners: { id: user.id }
can :print_asset_group_labels, Study, managers: { id: user.id }
can %i[read create update edit], Submission
can %i[read create update edit download_scrna_core_pooling_plan], Submission
can :read, [TagGroup, TagLayoutTemplate, TagSet]
can %i[read update print_swipecard], User, { id: user.id }
can %i[projects study_reports], User
Expand Down
6 changes: 4 additions & 2 deletions app/models/multiplexed_library_tube.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def asset_type_for_request_types
end

def team
creation_requests.first&.product_line
creation_requests&.first&.product_line
end

def role
Expand All @@ -41,6 +41,8 @@ def creation_requests
direct = requests_as_target.where_is_a(Request::LibraryCreation)
return direct unless direct.empty?

parents.includes(:requests_as_target).first.requests_as_target
# Parents should exist but in the case they don't (e.g. asset_links are yet to be created)
# we want to avoid an error and just return an empty array.
parents.includes(:requests_as_target).first&.requests_as_target || []
end
end
5 changes: 5 additions & 0 deletions app/models/submission.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class Submission < ApplicationRecord # rubocop:todo Metrics/ClassLength
include Submission::Priorities

PER_ORDER_REQUEST_OPTIONS = %w[pre_capture_plex_level gigabases_expected].freeze
SCRNA_CORE_CDNA_PREP_GEM_X_5P = 'Limber-Htp - scRNA Core cDNA Prep GEM-X 5p'

self.per_page = 500

Expand Down Expand Up @@ -125,6 +126,10 @@ def multiplexed?
orders.any?(&:multiplexed?)
end

def scrna_core_cdna_prep_gem_x_5p_submission?
orders.first.template_name == SCRNA_CORE_CDNA_PREP_GEM_X_5P
end

# Attempts to find the multiplexed asset (usually a multiplexed library tube) associated
# with the submission. Useful when trying to pool requests into a pre-existing tube at the
# end of the process.
Expand Down
Loading
Loading