From 737addb6616000cc867ea4bca46add62da32445e Mon Sep 17 00:00:00 2001 From: "jack.coggin" Date: Thu, 23 Nov 2023 15:20:36 +0000 Subject: [PATCH] Add new module indicator tag --- app/assets/stylesheets/card.scss | 10 ++++++++ app/services/course_progress.rb | 11 +++++--- app/views/learning/_card.html.slim | 3 ++- app/views/learning/show.html.slim | 5 +++- spec/services/course_progress_spec.rb | 37 +++++++++++++++++++++++++++ 5 files changed, 61 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/card.scss b/app/assets/stylesheets/card.scss index 866e80a83..3b8ff0963 100644 --- a/app/assets/stylesheets/card.scss +++ b/app/assets/stylesheets/card.scss @@ -54,6 +54,11 @@ Progress bar max-width: 300px; } +.govuk-tag--ey { + width: min-content; + margin: 5px 0; +} + &-container { display: flex; flex-direction: column; @@ -108,6 +113,11 @@ Progress bar .bar-ball { background-color: govuk-colour('yellow'); } + + .govuk-tag { + background-color: govuk-colour('light-grey'); + color: govuk-colour('blue'); + } } &:hover &-link--retake { diff --git a/app/services/course_progress.rb b/app/services/course_progress.rb index def0d932c..3927083ae 100644 --- a/app/services/course_progress.rb +++ b/app/services/course_progress.rb @@ -27,6 +27,11 @@ def completed_modules end end + # @return [Array] Modules released since user's last visit + def new_modules + available_modules.select { |mod| new_module?(mod) } + end + # @return [Boolean] def course_completed? published_modules.all? { |mod| completed?(mod) } @@ -61,10 +66,10 @@ def completed?(mod) # @param mod [Training::Module] # @return [Boolean] module released since user's last visit def new_module?(mod) - return false unless user.visits.any? - + return false unless user.visits.count > 1 + mod_release = ModuleRelease.find_by(module_position: mod.position) - last_visit = user.visits.last + last_visit = user.visits.order(started_at: :desc).second last_visit.started_at < mod_release.first_published_at end diff --git a/app/views/learning/_card.html.slim b/app/views/learning/_card.html.slim index 533865ca6..bd27f76e0 100644 --- a/app/views/learning/_card.html.slim +++ b/app/views/learning/_card.html.slim @@ -1,7 +1,8 @@ .card .card-container = training_module_image(mod) - + - if current_user.course.new_module?(mod) + span.govuk-tag.govuk-tag--ey NEW h3.govuk-heading-s = govuk_link_to mod.card_title, training_module_path(mod.name), no_visited_state: true, class: 'card-link--header' diff --git a/app/views/learning/show.html.slim b/app/views/learning/show.html.slim index c42c2caf2..12041b175 100644 --- a/app/views/learning/show.html.slim +++ b/app/views/learning/show.html.slim @@ -27,7 +27,10 @@ hr.govuk-section-break.govuk-section-break--visible.govuk-section-break--l #available.govuk-grid-row .govuk-grid-column-full - h2.govuk-heading-m Available modules + h2.govuk-heading-m + | Available modules + - if current_user.course.new_modules.any? + span.govuk-tag class="govuk-!-margin-left-1" NEW MODULE AVAILABLE - if current_user.course.available_modules.any? .grid-container - current_user.course.available_modules.each do |mod| diff --git a/spec/services/course_progress_spec.rb b/spec/services/course_progress_spec.rb index 67326c467..b2c0db4a4 100644 --- a/spec/services/course_progress_spec.rb +++ b/spec/services/course_progress_spec.rb @@ -5,6 +5,15 @@ include_context 'with progress' + before do + create(:release, id: 1) + create(:module_release, release_id: 1, module_position: 1, name: 'alpha', first_published_at: 2.days.ago) + create(:release, id: 2) + create(:module_release, release_id: 2, module_position: 2, name: 'bravo', first_published_at: 3.days.ago) + create(:release, id: 3) + create(:module_release, release_id: 3, module_position: 3, name: 'charlie', first_published_at: 2.minutes.ago) + end + describe '#course_completed?' do it 'is false for new users' do expect(course.course_completed?).to be false @@ -93,4 +102,32 @@ end end end + + describe '#new_modules' do + context 'with a new user' do + it 'returns no modules' do + expect(course.new_modules).to be_empty + end + end + + context 'with a user who has visited before' do + before do + create :visit, + id: 1, + visitor_token: '123', + user_id: user.id, + started_at: 1.day.ago + + create :visit, + id: 2, + visitor_token: '456', + user_id: user.id, + started_at: 1.minute.ago + end + + it 'returns modules released since the user\'s last visit' do + expect(course.new_modules.map(&:name)).to eq %w[charlie] + end + end + end end