- option to resume/start from beginning at the title view

- option to toggle read/unread status at the title view
- move all embeded JS to public/
This commit is contained in:
Alex Ling 2020-02-16 03:19:29 +00:00
parent 08a1052ca4
commit 93e6d7cae6
9 changed files with 176 additions and 78 deletions

25
public/js/admin.js Normal file
View File

@ -0,0 +1,25 @@
var scanning = false;
function scan() {
scanning = true;
$('#scan-status > div').removeAttr('hidden');
$('#scan-status > span').attr('hidden', '');
var color = $('#scan').css('color');
$('#scan').css('color', 'gray');
$.post('/api/admin/scan', function (data) {
var ms = data.milliseconds;
var titles = data.titles;
$('#scan-status > span').text('Scanned ' + titles + ' titles in ' + ms + 'ms');
$('#scan-status > span').removeAttr('hidden');
$('#scan').css('color', color);
$('#scan-status > div').attr('hidden', '');
scanning = false;
});
}
$(function() {
$('li').click(function() {
url = $(this).attr('data-url');
if (url) {
$(location).attr('href', url);
}
});
});

49
public/js/title.js Normal file
View File

@ -0,0 +1,49 @@
function showModal(title, zipPath, pages, percentage, title, entry) {
$('#modal button, #modal a').each(function(){
$(this).removeAttr('hidden');
});
if (percentage === 0) {
$('#continue-btn').attr('hidden', '');
$('#unread-btn').attr('hidden', '');
}
else {
$('#continue-btn').text('Continue from ' + percentage + '%');
}
if (percentage === 100) {
$('#read-btn').attr('hidden', '');
}
$('#modal-title').text(title);
$('#path-text').text(zipPath);
$('#pages-text').text(pages + ' pages');
$('#beginning-btn').attr('href', '/reader/' + title + '/' + entry + '/1');
$('#continue-btn').attr('href', '/reader/' + title + '/' + entry);
$('#read-btn').click(function(){
updateProgress(title, entry, pages);
});
$('#unread-btn').click(function(){
updateProgress(title, entry, 0);
});
UIkit.modal($('#modal')).show();
}
function updateProgress(title, entry, page) {
$.post('/api/progress/' + title + '/' + entry + '/' + page, function(data) {
if (data.success) {
location.reload();
}
else {
error = data.error;
alert('danger', error);
}
});
}
function alert(level, text) {
hideAlert();
var html = '<div class="uk-alert-' + level + '" uk-alert><a class="uk-alert-close" uk-close></a><p>' + text + '</p></div>';
$('#alert').append(html);
}
function hideAlert() {
$('#alert').empty();
}

16
public/js/user-edit.js Normal file
View File

@ -0,0 +1,16 @@
$(function(){
var target = '/admin/user/edit';
if (username) target += username;
$('form').attr('action', target);
function alert(level, text) {
hideAlert();
var html = '<div class="uk-alert-' + level + '" uk-alert><a class="uk-alert-close" uk-close></a><p>' + text + '</p></div>';
$('#alert').append(html);
}
function hideAlert() {
$('#alert').empty();
}
if (error) alert('danger', error);
});

19
public/js/user.js Normal file
View File

@ -0,0 +1,19 @@
function alert(level, text) {
hideAlert();
var html = '<div class="uk-alert-' + level + '" uk-alert><a class="uk-alert-close" uk-close></a><p>' + text + '</p></div>';
$('#alert').append(html);
}
function hideAlert() {
$('#alert').empty();
}
function remove(username) {
$.post('/api/admin/user/delete/' + username, function(data) {
if (data.success) {
location.reload();
}
else {
error = data.error;
alert('danger', error);
}
});
}

View File

@ -287,6 +287,25 @@ class Server
end
end
post "/api/progress/:title/:entry/:page" do |env|
begin
username = get_username env
title = (@library.get_title env.params.url["title"]).not_nil!
entry = (title.get_entry env.params.url["entry"]).not_nil!
page = env.params.url["page"].to_i
raise "incorrect page value" if page < 0 || page > entry.pages
title.save_progress username, entry.title, page
rescue e
send_json env, {
"success" => false,
"error" => e.message
}.to_json
else
send_json env, {"success" => true}.to_json
end
end
add_handler AuthHandler.new @storage
{% if flag?(:release) %}
# when building for relase, embed the static files in binary

View File

@ -14,31 +14,5 @@
<a class="uk-button uk-button-danger" href="/logout">Log Out</a>
<% content_for "script" do %>
<script>
var scanning = false
function scan() {
scanning = true
$('#scan-status > div').removeAttr('hidden');
$('#scan-status > span').attr('hidden', '');
var color = $('#scan').css('color');
$('#scan').css('color', 'gray');
$.post('/api/admin/scan', function (data) {
var ms = data.milliseconds;
var titles = data.titles;
$('#scan-status > span').text('Scanned ' + titles + ' titles in ' + ms + 'ms');
$('#scan-status > span').removeAttr('hidden');
$('#scan').css('color', color);
$('#scan-status > div').attr('hidden', '');
scanning = false;
});
}
$(function() {
$('li').click(function() {
url = $(this).attr('data-url');
if (url) {
$(location).attr('href', url)
}
});
});
</script>
<script src="/js/admin.js"></script>
<% end %>

View File

@ -1,19 +1,47 @@
<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-child-width-1-4@m uk-child-width-1-2" uk-grid>
<%- title.entries.each_with_index do |e, i| -%>
<div>
<a class="acard" href="/reader/<%= title.title %>/<%= e.title %>">
<div class="uk-card uk-card-default">
<div class="uk-card-media-top">
<img src="<%= e.cover_url %>" alt="">
</div>
<div class="uk-card-body">
<div class="uk-card-badge uk-label"><%= (percentage[i] * 100).round(1) %>%</div>
<h3 class="uk-card-title"><%= e.title %></h3>
</div>
</div>
<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">
<img src="<%= e.cover_url %>" alt="">
</div>
<div class="uk-card-body">
<div class="uk-card-badge uk-label"><%= (percentage[i] * 100).round(1) %>%</div>
<h3 class="uk-card-title"><%= e.title %></h3>
</div>
</div>
</a>
</div>
<%- end -%>
</div>
<div id="modal" class="uk-flex-top" uk-modal>
<div class="uk-modal-dialog uk-margin-auto-vertical">
<button class="uk-modal-close-default" type="button" uk-close></button>
<div class="uk-modal-header">
<h3 class="uk-modal-title" id="modal-title"></h3>
<p class="uk-text-meta" id="path-text" style="margin-bottom:0"></p>
<p class="uk-text-meta" id="pages-text" style="margin-top:0"></p>
</div>
<div class="uk-modal-body">
<p>Read</p>
<p uk-margin>
<a id="beginning-btn" class="uk-button uk-button-default">From beginning</a>
<a id="continue-btn" class="uk-button uk-button-primary"></a>
</p>
<p>Progress</p>
<p uk-margin>
<button id="read-btn" class="uk-button uk-button-default">Mark as read (100%)</button>
<button id="unread-btn" class="uk-button uk-button-default">Mark as unread (0%)</button>
</p>
</div>
</div>
</div>
<% content_for "script" do %>
<script src="/js/title.js"></script>
<% end %>

View File

@ -40,28 +40,16 @@
<input type="submit" value="Save" class="uk-button uk-button-primary">
</form>
<% content_for "script" do %>
<script>
$(function(){
var target = '/admin/user/edit';
<%- if !new_user -%>
target += '/<%= username %>';
<%- end -%>
$('form').attr('action', target);
function alert(level, text) {
hideAlert();
var html = '<div class="uk-alert-' + level + '" uk-alert><a class="uk-alert-close" uk-close></a><p>' + text + '</p></div>';
$('#alert').append(html);
}
function hideAlert() {
$('#alert').empty();
}
var username;
var error;
<%- if !new_user -%>
username = '/<%= username %>';
<%- end -%>
<%- if error -%>
alert('danger', '<%= error %>');
<%- end -%>
});
error = '<%= error %>';
<%- end -%>
</script>
<script src="/js/user-edit.js"></script>
<% end %>

View File

@ -27,25 +27,5 @@
<% content_for "script" do %>
<script>
function alert(level, text) {
hideAlert();
var html = '<div class="uk-alert-' + level + '" uk-alert><a class="uk-alert-close" uk-close></a><p>' + text + '</p></div>';
$('#alert').append(html);
}
function hideAlert() {
$('#alert').empty();
}
function remove(username) {
$.post('/api/admin/user/delete/' + username, function(data) {
if (data.success) {
location.reload();
}
else {
error = data.error;
alert('danger', error);
}
});
}
</script>
<script src="/js/user.js"></script>
<% end %>