diff --git a/public/js/sort-items.js b/public/js/sort-items.js new file mode 100644 index 0000000..c2a5f81 --- /dev/null +++ b/public/js/sort-items.js @@ -0,0 +1,35 @@ +$(() => { + $('option#name-up').attr('selected', ''); + $('#sort-select').change(() => { + const sort = $('#sort-select').find(':selected').attr('id'); + const ary = sort.split('-'); + const by = ary[0]; + const dir = ary[1]; + + const items = $('.item'); + items.remove(); + + items.sort((a, b) => { + var res; + if (by === 'name') + res = $(a).find('.uk-card-title').text() > $(b).find('.uk-card-title').text(); + else if (by === 'date') + res = $(a).attr('data-mtime') > $(b).attr('data-mtime'); + else { + const ap = $(a).attr('data-progress'); + const bp = $(b).attr('data-progress'); + if (ap === bp) + // if progress is the same, we compare by name + res = $(a).find('.uk-card-title').text() > $(b).find('.uk-card-title').text(); + else + res = ap > bp; + } + if (dir === 'up') + return res; + else + return !res; + }); + var html = ''; + $('#item-container').append(items); + }); +}); diff --git a/src/library.cr b/src/library.cr index 6a50185..23d1bda 100644 --- a/src/library.cr +++ b/src/library.cr @@ -16,7 +16,8 @@ end class Entry JSON.mapping zip_path: String, book_title: String, title: String, \ size: String, pages: Int32, cover_url: String, id: String, \ - title_id: String, encoded_path: String, encoded_title: String + title_id: String, encoded_path: String, encoded_title: String, + mtime: Time def initialize(path, @book_title, @title_id, storage) @zip_path = path @@ -32,6 +33,7 @@ class Entry .size @id = storage.get_id @zip_path, false @cover_url = "/api/page/#{@title_id}/#{@id}/1" + @mtime = File.info(@zip_path).modification_time end def read_page(page_num) Zip::File.open @zip_path do |file| @@ -57,7 +59,7 @@ end class Title JSON.mapping dir: String, entries: Array(Entry), title: String, - id: String, encoded_title: String + id: String, encoded_title: String, mtime: Time def initialize(dir : String, storage) @dir = dir @@ -73,6 +75,9 @@ class Title } .select { |e| e.pages > 0 } .sort { |a, b| a.title <=> b.title } + mtimes = [File.info(dir).modification_time] + mtimes += @entries.map{|e| e.mtime} + @mtime = mtimes.max end # When downloading from MangaDex, the zip/cbz file would not be valid # before the download is completed. If we scan the zip file, diff --git a/src/views/index.ecr b/src/views/index.ecr index 05a7de7..1aee880 100644 --- a/src/views/index.ecr +++ b/src/views/index.ecr @@ -1,14 +1,28 @@