mirror of
https://github.com/hkalexling/Mango.git
synced 2025-08-03 11:25:29 -04:00
Sorting in library and title page
This commit is contained in:
parent
5ec35f3af6
commit
67d3d2bd55
35
public/js/sort-items.js
Normal file
35
public/js/sort-items.js
Normal file
@ -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);
|
||||
});
|
||||
});
|
@ -14,7 +14,7 @@ end
|
||||
|
||||
class Entry
|
||||
JSON.mapping zip_path: String, book_title: String, title: String, \
|
||||
size: String, pages: Int32, cover_url: String
|
||||
size: String, pages: Int32, cover_url: String, mtime: Time
|
||||
|
||||
def initialize(path, @book_title)
|
||||
@zip_path = path
|
||||
@ -27,6 +27,7 @@ class Entry
|
||||
}
|
||||
.size
|
||||
@cover_url = "/api/page/#{@book_title}/#{title}/1"
|
||||
@mtime = File.info(@zip_path).modification_time
|
||||
end
|
||||
def read_page(page_num)
|
||||
Zip::File.open @zip_path do |file|
|
||||
@ -51,7 +52,7 @@ class Entry
|
||||
end
|
||||
|
||||
class Title
|
||||
JSON.mapping dir: String, entries: Array(Entry), title: String
|
||||
JSON.mapping dir: String, entries: Array(Entry), title: String, mtime: Time
|
||||
|
||||
def initialize(dir : String)
|
||||
@dir = dir
|
||||
@ -61,6 +62,9 @@ class Title
|
||||
.map { |path| Entry.new File.join(dir, path), @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
|
||||
def get_entry(name)
|
||||
@entries.find { |e| e.title == name }
|
||||
|
@ -1,14 +1,28 @@
|
||||
<h2 class=uk-title>Library</h2>
|
||||
<p class="uk-text-meta"><%= titles.size %> titles found</p>
|
||||
<div class="uk-margin">
|
||||
<div class="uk-grid-small" uk-grid>
|
||||
<div class="uk-margin-bottom uk-width-3-4@s">
|
||||
<form class="uk-search uk-search-default">
|
||||
<span uk-search-icon></span>
|
||||
<input class="uk-search-input" type="search" placeholder="Search">
|
||||
</form>
|
||||
</div>
|
||||
<div class="uk-margin-bottom uk-width-1-4@s">
|
||||
<div class="uk-form-horizontal">
|
||||
<select class="uk-select" id="sort-select">
|
||||
<option id="name-up">▲ Name</option>
|
||||
<option id="name-down">▼ Name</option>
|
||||
<option id="date-up">▲ Date Modified</option>
|
||||
<option id="date-down">▼ Date Modified</option>
|
||||
<option id="progress-up">▲ Progress</option>
|
||||
<option id="progress-down">▼ Progress</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="uk-child-width-1-4@m uk-child-width-1-2" uk-grid>
|
||||
<div id="item-container" class="uk-child-width-1-4@m uk-child-width-1-2" uk-grid>
|
||||
<%- titles.each_with_index do |t, i| -%>
|
||||
<div class="item">
|
||||
<div class="item" data-mtime="<%= t.mtime.to_unix %>" data-progress="<%= percentage[i] %>">
|
||||
<a class="acard" href="/book/<%= t.title %>">
|
||||
<div class="uk-card uk-card-default">
|
||||
<div class="uk-card-media-top">
|
||||
@ -27,4 +41,5 @@
|
||||
|
||||
<% content_for "script" do %>
|
||||
<script src="/js/search.js"></script>
|
||||
<script src="/js/sort-items.js"></script>
|
||||
<% end %>
|
||||
|
@ -1,15 +1,29 @@
|
||||
<div id="alert"></div>
|
||||
<h2 class=uk-title><%= title.title %></h2>
|
||||
<p class="uk-text-meta"><%= title.entries.size %> entries found</p>
|
||||
<div class="uk-margin">
|
||||
<div class="uk-grid-small" uk-grid>
|
||||
<div class="uk-margin-bottom uk-width-3-4@s">
|
||||
<form class="uk-search uk-search-default">
|
||||
<span uk-search-icon></span>
|
||||
<input class="uk-search-input" type="search" placeholder="Search">
|
||||
</form>
|
||||
</div>
|
||||
<div class="uk-margin-bottom uk-width-1-4@s">
|
||||
<div class="uk-form-horizontal">
|
||||
<select class="uk-select" id="sort-select">
|
||||
<option id="name-up">▲ Name</option>
|
||||
<option id="name-down">▼ Name</option>
|
||||
<option id="date-up">▲ Date Modified</option>
|
||||
<option id="date-down">▼ Date Modified</option>
|
||||
<option id="progress-up">▲ Progress</option>
|
||||
<option id="progress-down">▼ Progress</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="uk-child-width-1-4@m uk-child-width-1-2" uk-grid>
|
||||
<div id="item-container" class="uk-child-width-1-4@m uk-child-width-1-2" uk-grid>
|
||||
<%- title.entries.each_with_index do |e, i| -%>
|
||||
<div class="item">
|
||||
<div class="item" data-mtime="<%= e.mtime.to_unix %>" data-progress="<%= percentage[i] %>">
|
||||
<a class="acard">
|
||||
<div class="uk-card uk-card-default" onclick="showModal('<%= e.title %>', '<%= e.zip_path %>', '<%= e.pages %>', <%= (percentage[i] * 100).round(1) %>, '<%= title.title %>', '<%= e.title %>')">
|
||||
<div class="uk-card-media-top">
|
||||
@ -51,4 +65,5 @@
|
||||
<% content_for "script" do %>
|
||||
<script src="/js/title.js"></script>
|
||||
<script src="/js/search.js"></script>
|
||||
<script src="/js/sort-items.js"></script>
|
||||
<% end %>
|
||||
|
Loading…
x
Reference in New Issue
Block a user