Skip to content
This repository was archived by the owner on Mar 23, 2025. It is now read-only.

Commit 808074e

Browse files
committed
Add Recently Added to home
1 parent 49193b9 commit 808074e

File tree

3 files changed

+57
-3
lines changed

3 files changed

+57
-3
lines changed

src/library.cr

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ end
1717
class Entry
1818
property zip_path : String, book : Title, title : String,
1919
size : String, pages : Int32, id : String, title_id : String,
20-
encoded_path : String, encoded_title : String, mtime : Time
20+
encoded_path : String, encoded_title : String, mtime : Time,
21+
date_added : Time
2122

2223
def initialize(path, @book, @title_id, storage)
2324
@zip_path = path
@@ -33,6 +34,7 @@ class Entry
3334
file.close
3435
@id = storage.get_id @zip_path, false
3536
@mtime = File.info(@zip_path).modification_time
37+
@date_added = load_date_added
3638
end
3739

3840
def to_json(json : JSON::Builder)
@@ -89,6 +91,20 @@ class Entry
8991
end
9092
end
9193
end
94+
95+
private def load_date_added
96+
date_added = nil
97+
TitleInfo.new @book.dir do |info|
98+
info_da = info.date_added[@title]?
99+
if info_da.nil?
100+
date_added = info.date_added[@title] = ctime @zip_path
101+
info.save
102+
else
103+
date_added = info_da
104+
end
105+
end
106+
date_added.not_nil! # is it ok to set not_nil! here?
107+
end
92108
end
93109

94110
class Title
@@ -384,6 +400,7 @@ class TitleInfo
384400
property cover_url = ""
385401
property entry_cover_url = {} of String => String
386402
property last_read = {} of String => Hash(String, Time)
403+
property date_added = {} of String => Time
387404

388405
@[JSON::Field(ignore: true)]
389406
property dir : String = ""
@@ -486,7 +503,7 @@ class Library
486503
get_continue_reading_entry username, t
487504
}.select Entry
488505

489-
continue_reading = continue_reading_entries.map_with_index { |e, i|
506+
continue_reading = continue_reading_entries.map { |e|
490507
{
491508
entry: e,
492509
percentage: e.book.load_percentage(username, e.title),
@@ -495,12 +512,26 @@ class Library
495512
}
496513

497514
# Sort by by last_read, most recent first (nils at the end)
498-
continue_reading.sort! do |a, b|
515+
continue_reading.sort! { |a, b|
499516
next 0 if a[:last_read].nil? && b[:last_read].nil?
500517
next 1 if a[:last_read].nil?
501518
next -1 if b[:last_read].nil?
502519
b[:last_read].not_nil! <=> a[:last_read].not_nil!
520+
}[0..11]
521+
end
522+
523+
def get_recently_added_entries(username)
524+
entries = [] of Entry
525+
titles.each do |t|
526+
t.entries.each { |e| entries << e }
503527
end
528+
recently_added = entries.map { |e|
529+
{
530+
entry: e,
531+
percentage: e.book.load_percentage(username, e.title)
532+
}
533+
}
534+
recently_added.sort! { |a, b| b[:entry].date_added <=> a[:entry].date_added }[0..11]
504535
end
505536

506537

src/routes/main.cr

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class MainRouter < Router
6767
begin
6868
username = get_username env
6969
continue_reading = @context.library.get_continue_reading_entries username
70+
recently_added = @context.library.get_recently_added_entries username
7071

7172
layout "home"
7273
rescue e

src/views/home.ecr

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,28 @@
2020
</div>
2121
<%- end -%>
2222

23+
<%- unless recently_added.empty? -%>
24+
<h2 class="uk-title home-headings">Recently Added</h2>
25+
<div id="item-container-continue" class="uk-child-width-1-4@m uk-child-width-1-2" uk-grid>
26+
<%- recently_added.each do |ra| -%>
27+
<div class="item" data-mtime="<%= ra[:entry].mtime.to_unix %>" data-progress="<%= ra[:percentage] %>" id="<%= ra[:entry].id %>">
28+
<a class="acard">
29+
<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 %>')">
30+
<div class="uk-card-media-top">
31+
<img data-src="<%= ra[:entry].cover_url %>" alt="" data-width data-height uk-img>
32+
</div>
33+
<div class="uk-card-body">
34+
<div class="uk-card-badge uk-label"><%= (ra[:percentage] * 100).round(1) %>%</div>
35+
<h3 class="uk-card-title break-word" data-title="<%= ra[:entry].display_name.gsub("\"", "&quot;") %>"><%= ra[:entry].display_name %></h3>
36+
<p><%= ra[:entry].pages %> pages</p>
37+
</div>
38+
</div>
39+
</a>
40+
</div>
41+
<%- end -%>
42+
</div>
43+
<%- end -%>
44+
2345
<!-- TODO: DRY this code with calls in other ecr files? eg. title.ecr -->
2446
<div id="modal" class="uk-flex-top" uk-modal>
2547
<div class="uk-modal-dialog uk-margin-auto-vertical">

0 commit comments

Comments
 (0)