Group Recently Added by neighbouring Title

This commit is contained in:
Jared Turner 2020-06-07 18:39:05 +01:00
parent 5ed2a8affa
commit aaf0a3c6af
2 changed files with 59 additions and 14 deletions

View File

@ -525,15 +525,44 @@ class Library
titles.each do |t| titles.each do |t|
t.entries.each { |e| entries << e } t.entries.each { |e| entries << e }
end end
recently_added = entries.map { |e| entries.sort! { |a, b| b.date_added <=> a.date_added }
{ # Only grab entries form the last 3 months
entry: e, # otherwise we will be grouping neighbours by Title for the entire
percentage: e.book.load_percentage(username, e.title) # library every time. Is this premature optimisation or reasonable optimisation?
entries.select! { |e| e.date_added > 3.months.ago }
i = 0
recently_added = [] of NamedTuple(entry: Entry, percentage: Float64, grouped_count: Int32)
while i <= entries.size - 1
grouped_count = neighbouring_title_count(entries, i)
if grouped_count > 1
# delete grouped entries (except for first)
entries.delete_at(i+1..i+grouped_count-1)
end
recently_added << {
entry: entries[i],
percentage: entries[i].book.load_percentage(username, entries[i].title),
grouped_count: grouped_count
} }
} i += 1
recently_added.sort! { |a, b| b[:entry].date_added <=> a[:entry].date_added }[0..11] end
recently_added[0..11]
end end
private def neighbouring_title_count(entries, index : Int32)
count = 1
book_title = entries[index].book.title
while index < entries.size - 1
if book_title == entries[index+1].book.title # is it ok to compare via book.title?
count += 1
else
break
end
index += 1
end
count
end
private def get_continue_reading_entry(username, title) private def get_continue_reading_entry(username, title)
in_progress_entries = title.entries.select do |e| in_progress_entries = title.entries.select do |e|

View File

@ -4,13 +4,13 @@
<%- continue_reading.each do |cr| -%> <%- continue_reading.each do |cr| -%>
<div class="item" data-mtime="<%= cr[:entry].mtime.to_unix %>" data-progress="<%= cr[:percentage] %>" id="<%= cr[:entry].id %>"> <div class="item" data-mtime="<%= cr[:entry].mtime.to_unix %>" data-progress="<%= cr[:percentage] %>" id="<%= cr[:entry].id %>">
<a class="acard"> <a class="acard">
<div class="uk-card uk-card-default" onclick="showModal(&quot;<%= cr[:entry].encoded_path %>&quot;, '<%= cr[:entry].pages %>', <%= (cr[:percentage] * 100).round(1) %>, &quot;<%= cr[:entry].book.encoded_display_name %>&quot;, &quot;<%= cr[:entry].encoded_display_name %>&quot;, '<%= cr[:entry].title_id %>', '<%= cr[:entry].id %>')"> <div class="uk-card uk-card-default" onclick="showModal(&quot;<%= cr[:entry].encoded_path %>&quot;, '<%= cr[:entry].pages %>', <%= (cr[:percentage] * 100).round(1) %>, &quot;<%= cr[:entry].book.encoded_display_name %>&quot;, &quot;<%= cr[:entry].encoded_display_name %>&quot;, '<%= cr[:entry].title_id %>', '<%= cr[:entry].id %>')">
<div class="uk-card-media-top"> <div class="uk-card-media-top">
<img data-src="<%= cr[:entry].cover_url %>" alt="" data-width data-height uk-img> <img data-src="<%= cr[:entry].cover_url %>" alt="" data-width data-height uk-img>
</div> </div>
<div class="uk-card-body"> <div class="uk-card-body">
<div class="uk-card-badge uk-label"><%= (cr[:percentage] * 100).round(1) %>%</div> <div class="uk-card-badge uk-label"><%= (cr[:percentage] * 100).round(1) %>%</div>
<h3 class="uk-card-title break-word" data-title="<%= cr[:entry].display_name.gsub("\"", "&quot;") %>"><%= cr[:entry].display_name %></h3> <h3 class="uk-card-title break-word" data-title="<%= cr[:entry].display_name.gsub("\"", "&quot;") %>"><%= cr[:entry].display_name %></h3>
<p><%= cr[:entry].pages %> pages</p> <p><%= cr[:entry].pages %> pages</p>
</div> </div>
</div> </div>
@ -24,20 +24,36 @@
<h2 class="uk-title home-headings">Recently Added</h2> <h2 class="uk-title home-headings">Recently Added</h2>
<div id="item-container-continue" class="uk-child-width-1-4@m uk-child-width-1-2" uk-grid> <div id="item-container-continue" class="uk-child-width-1-4@m uk-child-width-1-2" uk-grid>
<%- recently_added.each do |ra| -%> <%- recently_added.each do |ra| -%>
<div class="item" data-mtime="<%= ra[:entry].mtime.to_unix %>" data-progress="<%= ra[:percentage] %>" id="<%= ra[:entry].id %>"> <%- if ra[:grouped_count] == 1 -%>
<div class="item" data-progress="<%= ra[:percentage] %>" id="<%= ra[:entry].id %>">
<a class="acard"> <a class="acard">
<div class="uk-card uk-card-default" onclick="showModal(&quot;<%= ra[:entry].encoded_path %>&quot;, '<%= ra[:entry].pages %>', <%= (ra[:percentage] * 100).round(1) %>, &quot;<%= ra[:entry].book.encoded_display_name %>&quot;, &quot;<%= ra[:entry].encoded_display_name %>&quot;, '<%= ra[:entry].title_id %>', '<%= ra[:entry].id %>')"> <div class="uk-card uk-card-default" onclick="showModal(&quot;<%= ra[:entry].encoded_path %>&quot;, '<%= ra[:entry].pages %>', <%= (ra[:percentage] * 100).round(1) %>, &quot;<%= ra[:entry].book.encoded_display_name %>&quot;, &quot;<%= ra[:entry].encoded_display_name %>&quot;, '<%= ra[:entry].title_id %>', '<%= ra[:entry].id %>')">
<div class="uk-card-media-top"> <div class="uk-card-media-top">
<img data-src="<%= ra[:entry].cover_url %>" alt="" data-width data-height uk-img> <img data-src="<%= ra[:entry].cover_url %>" alt="" data-width data-height uk-img>
</div> </div>
<div class="uk-card-body"> <div class="uk-card-body">
<div class="uk-card-badge uk-label"><%= (ra[:percentage] * 100).round(1) %>%</div> <div class="uk-card-badge uk-label"><%= (ra[:percentage] * 100).round(1) %>%</div>
<h3 class="uk-card-title break-word" data-title="<%= ra[:entry].display_name.gsub("\"", "&quot;") %>"><%= ra[:entry].display_name %></h3> <h3 class="uk-card-title break-word" data-title="<%= ra[:entry].display_name.gsub("\"", "&quot;") %>"><%= ra[:entry].display_name %></h3>
<p><%= ra[:entry].pages %> pages</p> <p><%= ra[:entry].pages %> pages</p>
</div> </div>
</div> </div>
</a> </a>
</div> </div>
<%- else -%>
<div class="item">
<a class="acard" href="/book/<%= ra[:entry].book.id %>">
<div class="uk-card uk-card-default">
<div class="uk-card-media-top">
<img data-src="<%= ra[:entry].cover_url %>" data-width data-height alt="" uk-img>
</div>
<div class="uk-card-body">
<h3 class="uk-card-title break-word" data-title="<%= ra[:entry].book.display_name.gsub("\"", "&quot;") %>"><%= ra[:entry].book.display_name %></h3>
<p><%= ra[:grouped_count] %> new entries</p>
</div>
</div>
</a>
</div>
<%- end -%>
<%- end -%> <%- end -%>
</div> </div>
<%- end -%> <%- end -%>
@ -49,7 +65,7 @@
<div class="uk-modal-header"> <div class="uk-modal-header">
<div> <div>
<h4 class="uk-margin-remove-bottom"><a id="modal-title-link"></a></h4> <h4 class="uk-margin-remove-bottom"><a id="modal-title-link"></a></h4>
<h3 class="uk-modal-title break-word uk-margin-remove-top" id="modal-entry-title"><span></span></h3> <h3 class="uk-modal-title break-word uk-margin-remove-top" id="modal-entry-title"><span></span></h3>
</div> </div>
<p class="uk-text-meta uk-margin-remove-bottom break-word" id="path-text"></p> <p class="uk-text-meta uk-margin-remove-bottom break-word" id="path-text"></p>
<p class="uk-text-meta uk-margin-remove-top" id="pages-text"></p> <p class="uk-text-meta uk-margin-remove-top" id="pages-text"></p>