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 +4 -4
- data/CHANGELOG.md +1 -0
- data/app/controllers/bible270/admin_controller.rb +11 -3
- data/lib/bible270/reader_progress_report.rb +17 -3
- data/lib/bible270/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fcb72fefa9ed7c0dc470ac07e7cdd1a143e8376e2d08be4adcdcc18d9633a286
|
|
4
|
+
data.tar.gz: 651c9fdc0d0332d79e2cdc72f96ccdb0a1a8e22b6fafec398d62bc4f84f8c7b0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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[
|
|
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,
|
|
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
|
data/lib/bible270/version.rb
CHANGED