bible270 1.7.0 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb5049bbbd494dff154cb3061567f7184f13c3eb55bc625f823e3cf6204addfb
4
- data.tar.gz: 04fe5e22682dc2975b1548ed5a5ee8b5402909ff60000130794fcae8611a0abf
3
+ metadata.gz: 7e566c5e5c2097bfcb768ef08108d115814096e552c768636b67f009a6c31532
4
+ data.tar.gz: d11ec18971a487ef039492849da05543062b88841b80f79f3d2fa545ff674cbb
5
5
  SHA512:
6
- metadata.gz: 0d9b760049053e5d85156bc010ad363da6817f3baee350fad8d1955ba11455fe509fce4fe03747e5ce0f78dd8c2f2737f983646c1a7c437567844365b8c9438f
7
- data.tar.gz: 0dc11557e3316ed5cb4c64ba224892392baf64c0fae3b0958e15b13f3a57f036ad69564f5540c90ea3d6409d0162d9593a526981b43e460cf87e7931e5d2edd3
6
+ metadata.gz: 067e9c103eb5688c04c4e2c352a225768d9d9d98e04a4b046c16a285b736adf313c9687e825a781f615199bac580a94104107b3f273947b2faeb378712a53b87
7
+ data.tar.gz: f9c658c9e118f25c880ece18f7128b931fef51ddd6cc7d83042c3b18ede120f84398a09c1d34b028ec913ab6a19ad683f8824b28ed9174fecc61e9ac6bdc950e
data/CHANGELOG.md CHANGED
@@ -7,6 +7,11 @@ All notable changes to bible270. Format follows [Keep a Changelog](https://keepa
7
7
  ### Added
8
8
 
9
9
  - show Blue Letter Bible Scripture popups when readers hover over references in rendered reflections, replies, and Markdown previews; popups follow each reader's selected translation, handle original-language choices by testament, and rescan content added by Turbo without forcing a page reload
10
+ - let administrators sort the reader list and Reader Stats report by most or least recent reading activity, while keeping readers with no activity at the end
11
+
12
+ ### Changed
13
+
14
+ - link reader email addresses directly to email composition and link recent-activity day labels to their Day pages with passage tooltips in Admin
10
15
 
11
16
  **[Full Changelog](https://github.com/avonderluft/bible270/compare/v1.6.2...main)**
12
17
 
@@ -15,7 +15,9 @@ module Bible270
15
15
  'first_name' => 'First Name',
16
16
  'last_name' => 'Last Name',
17
17
  'most_completed' => 'Most days completed',
18
- 'least_completed' => 'Least days completed'
18
+ 'least_completed' => 'Least days completed',
19
+ 'most_recent_activity' => 'Most recent activity',
20
+ 'least_recent_activity' => 'Least recent activity'
19
21
  }.freeze
20
22
 
21
23
  before_action :require_admin!
@@ -65,9 +67,15 @@ module Bible270
65
67
  @days_completed = Reader.completed_days_by_id
66
68
  @reader_sort_options = READER_SORT_OPTIONS
67
69
  @reader_sort = READER_SORT_OPTIONS.key?(params[:sort]) ? params[:sort] : 'first_name'
68
- @reader_report = ReaderProgressReport.new(completed_days: @days_completed, sort: @reader_sort)
70
+ readers = Reader.all.load
71
+ @recent_reader_activities = Checkoff.recent_activity_by_reader(readers.map(&:id))
72
+ @reader_report = ReaderProgressReport.new(
73
+ readers: readers,
74
+ completed_days: @days_completed,
75
+ recent_activities: @recent_reader_activities,
76
+ sort: @reader_sort
77
+ )
69
78
  @readers = @reader_report.sorted_readers
70
- @recent_reader_activities = Checkoff.recent_activity_by_reader(@readers.map(&:id))
71
79
  @run_start_date = Setting.run_start_date
72
80
  @configured_start_date = Bible270.config.start_date
73
81
  @run_start_date_overridden = Setting.run_start_date_overridden?
@@ -182,12 +182,14 @@ module Bible270
182
182
  end
183
183
 
184
184
  def b270_reader_activity_description(activity)
185
+ day_link = link_to "Day #{activity.day}", day_path(activity.day), title: b270_day_readings(activity.day)
186
+
185
187
  if activity.day_completed?
186
188
  readings = Plan.readings_for(activity.day).values.compact.join(', ')
187
- "completed Day #{activity.day} (#{readings})"
189
+ safe_join(['completed ', day_link, " (#{readings})"])
188
190
  else
189
191
  reference = Plan.parts_for(activity.day, activity.track).fetch(activity.part)
190
- "checked off “#{reference}” for Day #{activity.day}"
192
+ safe_join(["checked off “#{reference}” for ", day_link])
191
193
  end
192
194
  end
193
195
 
@@ -85,7 +85,11 @@
85
85
  <% if Bible270.config.admin?(reader) %> <span class="sub"><strong>[admin]</strong></span> <% end %>
86
86
  </div>
87
87
  <div class="sub">
88
- <%= reader.email.presence || reader.provider %>
88
+ <% if reader.email.present? %>
89
+ <%= mail_to reader.email %>
90
+ <% else %>
91
+ <%= reader.provider %>
92
+ <% end %>
89
93
  · <%= @days_completed[reader.id] %>/<%= Bible270::Plan::DAYS %> days
90
94
  <% if reader.dated? %>· started <%= reader.effective_start_date.strftime('%b %-d, %Y') %><% end %>
91
95
  </div>
@@ -4,13 +4,17 @@ module Bible270
4
4
  # Builds the plain-text reader progress table used by administrative tasks.
5
5
  class ReaderProgressReport
6
6
  HEADERS = ['Name', 'Days Read', 'Status'].freeze
7
- SORTS = %w[first_name last_name most_completed least_completed].freeze
7
+ SORTS = %w[
8
+ first_name last_name most_completed least_completed most_recent_activity least_recent_activity
9
+ ].freeze
8
10
  DEFAULT_SORT = 'most_completed'
9
11
  Row = Struct.new(:name, :days_read, :status, keyword_init: true)
10
12
 
11
- def initialize(readers: Reader.all, completed_days: Reader.completed_days_by_id, sort: DEFAULT_SORT)
13
+ def initialize(readers: Reader.all, completed_days: Reader.completed_days_by_id, recent_activities: {},
14
+ sort: DEFAULT_SORT)
12
15
  @readers = readers
13
16
  @completed_days = completed_days
17
+ @recent_activities = recent_activities
14
18
  @sort = SORTS.include?(sort.to_s) ? sort.to_s : DEFAULT_SORT
15
19
  end
16
20
 
@@ -40,7 +44,7 @@ module Bible270
40
44
 
41
45
  private
42
46
 
43
- attr_reader :readers, :completed_days, :sort
47
+ attr_reader :readers, :completed_days, :recent_activities, :sort
44
48
 
45
49
  def reader_sort_key(reader)
46
50
  case sort
@@ -51,11 +55,21 @@ module Bible270
51
55
  [last_name.to_s.downcase, reader.sort_name, reader.id]
52
56
  when 'least_completed'
53
57
  [completed_days[reader.id].to_i, reader.sort_name, reader.id]
58
+ when 'most_recent_activity'
59
+ activity_sort_key(reader, descending: true)
60
+ when 'least_recent_activity'
61
+ activity_sort_key(reader, descending: false)
54
62
  else
55
63
  [-completed_days[reader.id].to_i, reader.sort_name, reader.id]
56
64
  end
57
65
  end
58
66
 
67
+ def activity_sort_key(reader, descending:)
68
+ activity = recent_activities[reader.id]
69
+ timestamp = activity&.occurred_at&.to_f
70
+ [activity.nil? ? 1 : 0, descending && timestamp ? -timestamp : timestamp.to_f, reader.sort_name, reader.id]
71
+ end
72
+
59
73
  def status(reader, days_read)
60
74
  calendar_day = reader.calendar_day
61
75
  return 'undated' unless calendar_day
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bible270
4
- VERSION = '1.7.0'
4
+ VERSION = '1.7.2'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bible270
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew vonderLuft