bible270 1.7.0 → 1.7.1

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: fcb72fefa9ed7c0dc470ac07e7cdd1a143e8376e2d08be4adcdcc18d9633a286
4
+ data.tar.gz: 651c9fdc0d0332d79e2cdc72f96ccdb0a1a8e22b6fafec398d62bc4f84f8c7b0
5
5
  SHA512:
6
- metadata.gz: 0d9b760049053e5d85156bc010ad363da6817f3baee350fad8d1955ba11455fe509fce4fe03747e5ce0f78dd8c2f2737f983646c1a7c437567844365b8c9438f
7
- data.tar.gz: 0dc11557e3316ed5cb4c64ba224892392baf64c0fae3b0958e15b13f3a57f036ad69564f5540c90ea3d6409d0162d9593a526981b43e460cf87e7931e5d2edd3
6
+ metadata.gz: 326a54581672c51728662557d7fc7178ed1b4ce44c03e480ae09829790c8f457274504121d30ae1d816fb41cd7f00acbdaadf649d75e3e7a6283626556cec57a
7
+ data.tar.gz: 24335e6617785300b54733aff19f217bc1c85365282ff4798a6a5c5d04636f910e2d2d56f2e8895d2961c30c6e94873a64008de6ae7d7e27a80778312af62a60
data/CHANGELOG.md CHANGED
@@ -7,6 +7,7 @@ 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
10
11
 
11
12
  **[Full Changelog](https://github.com/avonderluft/bible270/compare/v1.6.2...main)**
12
13
 
@@ -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?
@@ -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.1'
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.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew vonderLuft