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 +4 -4
- data/CHANGELOG.md +5 -0
- data/app/controllers/bible270/admin_controller.rb +11 -3
- data/app/helpers/bible270/plan_helper.rb +4 -2
- data/app/views/bible270/admin/index.html.erb +5 -1
- 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: 7e566c5e5c2097bfcb768ef08108d115814096e552c768636b67f009a6c31532
|
|
4
|
+
data.tar.gz: d11ec18971a487ef039492849da05543062b88841b80f79f3d2fa545ff674cbb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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[
|
|
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