1
0
mirror of https://github.com/janeczku/calibre-web synced 2024-12-26 01:50:31 +00:00

Merge remote-tracking branch 'adv/eslint'

This commit is contained in:
OzzieIsaacs 2017-08-14 20:21:52 +02:00
commit de112b0b05
9 changed files with 323 additions and 189 deletions

9
.editorconfig Normal file
View File

@ -0,0 +1,9 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
indent_style = space
[*.{js,py}]
indent_size = 4

96
.eslintrc Normal file
View File

@ -0,0 +1,96 @@
{
"env": {
"browser": true,
"jquery": true
},
"globals": {
"alert": true
},
"rules": {
"arrow-parens": 2,
"block-scoped-var": 1,
"brace-style": 2,
"camelcase": 1,
"comma-spacing": 2,
"curly": [2, "multi-line", "consistent"],
"eqeqeq": 2,
"indent": [
2,
4,
{
"SwitchCase": 1
}
],
"keyword-spacing": 2,
"linebreak-style": 2,
"new-cap": 2,
"no-dupe-args": 2,
"no-dupe-class-members": 2,
"no-dupe-keys": 2,
"no-duplicate-case": 2,
"no-caller": 2,
"no-class-assign": 2,
"no-cond-assign": 2,
"no-const-assign": 2,
"no-console": 2,
"no-debugger": 2,
"no-delete-var": 2,
"no-empty": 2,
"no-eval": 2,
"no-extend-native": 2,
"no-extra-boolean-cast": 2,
"no-extra-semi": 2,
"no-fallthrough": [
2,
{
"commentPattern": "break[\\s\\w]*omitted"
}
],
"no-implied-eval": 2,
"no-invalid-regexp": 2,
"no-irregular-whitespace": 2,
"no-iterator": 2,
"no-loop-func": 2,
"no-mixed-operators": 2,
"no-mixed-spaces-and-tabs": 2,
"no-multi-str": 2,
"no-new": 2,
"no-obj-calls": 2,
"no-octal": 2,
"no-redeclare": 2,
"no-regex-spaces": 2,
"no-script-url": 2,
"no-sparse-arrays": 2,
"no-undef": 2,
"no-undefined": 2,
"no-unreachable": 2,
"no-unsafe-negation": 2,
"no-unused-vars": 2,
"no-use-before-define": [
2,
{
"classes": false,
"functions": false
}
],
"quotes": [
2,
"double"
],
"require-yield": 2,
"semi": [
2,
"always"
],
"space-before-blocks": 2,
"space-infix-ops": 2,
"space-unary-ops": 2,
"use-isnan": 2,
"valid-typeof": 2,
"wrap-iife": [
2,
"any"
],
"yield-star-spacing": 2
}
}

View File

@ -1,4 +1,6 @@
$( document ).ready(function() {
/* global _ */
$(function() {
$("#have_read_form").ajaxForm();
});
@ -6,34 +8,51 @@ $("#have_read_cb").on("change", function() {
$(this).closest("form").submit();
});
$("#shelf-actions").on("click", "[data-shelf-action]", function (e) {
e.preventDefault();
(function() {
var templates = {
add: _.template(
$("#template-shelf-add").html()
),
remove: _.template(
$("#template-shelf-remove").html()
)
};
$.get(this.href)
.done(() => {
const $this = $(this);
switch ($this.data("shelf-action")) {
case "add":
$("#remove-from-shelves").append(`<a href="${$this.data("remove-href")}"
data-add-href="${this.href}"
class="btn btn-sm btn-default" data-shelf-action="remove"
><span class="glyphicon glyphicon-remove"></span> ${this.textContent}</a>`);
break;
case "remove":
$("#add-to-shelves").append(`<li><a href="${$this.data("add-href")}"
data-remove-href="${this.href}"
data-shelf-action="add"
>${this.textContent}</a></li>`);
break;
}
this.parentNode.removeChild(this);
})
.fail((xhr) => {
const $msg = $("<span/>", { "class": "text-danger"}).text(xhr.responseText);
$("#shelf-action-status").html($msg);
$("#shelf-actions").on("click", "[data-shelf-action]", function (e) {
e.preventDefault();
setTimeout(() => {
$msg.remove();
}, 10000);
});
});
$.get(this.href)
.done(function() {
var $this = $(this);
switch ($this.data("shelf-action")) {
case "add":
$("#remove-from-shelves").append(
templates.remove({
add: this.href,
remove: $this.data("remove-href"),
content: this.textContent
})
);
break;
case "remove":
$("#add-to-shelves").append(
templates.add({
add: $this.data("add-href"),
remove: this.href,
content: this.textContent
})
);
break;
}
this.parentNode.removeChild(this);
}.bind(this))
.fail(function(xhr) {
var $msg = $("<span/>", { "class": "text-danger"}).text(xhr.responseText);
$("#shelf-action-status").html($msg);
setTimeout(function() {
$msg.remove();
}, 10000);
});
});
})();

View File

@ -32,7 +32,7 @@ Takes a prefix, query typeahead callback, Bloodhound typeahead adapter
and returns the completions it gets from the bloodhound engine prefixed.
*/
function prefixedSource(prefix, query, cb, bhAdapter) {
bhAdapter(query, function(retArray){
bhAdapter(query, function(retArray) {
var matches = [];
for (var i = 0; i < retArray.length; i++) {
var obj = {name : prefix + retArray[i].name};
@ -41,7 +41,7 @@ function prefixedSource(prefix, query, cb, bhAdapter) {
cb(matches);
});
}
function getPath(){
function getPath() {
var jsFileLocation = $("script[src*=edit_books]").attr("src"); // the js file path
jsFileLocation = jsFileLocation.replace("/static/js/edit_books.js", ""); // the js folder path
return jsFileLocation;
@ -49,7 +49,7 @@ function getPath(){
var authors = new Bloodhound({
name: "authors",
datumTokenizer(datum) {
datumTokenizer: function datumTokenizer(datum) {
return [datum.name];
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
@ -60,15 +60,15 @@ var authors = new Bloodhound({
var series = new Bloodhound({
name: "series",
datumTokenizer(datum) {
datumTokenizer: function datumTokenizer(datum) {
return [datum.name];
},
queryTokenizer(query) {
queryTokenizer: function queryTokenizer(query) {
return [query];
},
remote: {
url: getPath()+"/get_series_json?q=",
replace(url, query) {
replace: function replace(url, query) {
return url+encodeURIComponent(query);
}
}
@ -77,10 +77,10 @@ var series = new Bloodhound({
var tags = new Bloodhound({
name: "tags",
datumTokenizer(datum) {
datumTokenizer: function datumTokenizer(datum) {
return [datum.name];
},
queryTokenizer(query) {
queryTokenizer: function queryTokenizer(query) {
var tokens = query.split(",");
tokens = [tokens[tokens.length-1].trim()];
return tokens;
@ -92,15 +92,15 @@ var tags = new Bloodhound({
var languages = new Bloodhound({
name: "languages",
datumTokenizer(datum) {
datumTokenizer: function datumTokenizer(datum) {
return [datum.name];
},
queryTokenizer(query) {
queryTokenizer: function queryTokenizer(query) {
return [query];
},
remote: {
url: getPath()+"/get_languages_json?q=",
replace(url, query) {
replace: function replace(url, query) {
return url+encodeURIComponent(query);
}
}
@ -115,9 +115,9 @@ function sourceSplit(query, cb, split, source) {
tokens.splice(tokens.length-1, 1); // remove last element
var prefix = "";
var newSplit;
if (split === "&"){
if (split === "&") {
newSplit = " " + split + " ";
}else{
} else {
newSplit = split + " ";
}
for (var i = 0; i < tokens.length; i++) {
@ -127,76 +127,78 @@ function sourceSplit(query, cb, split, source) {
}
var promiseAuthors = authors.initialize();
promiseAuthors.done(function(){
promiseAuthors.done(function() {
$("#bookAuthor").typeahead(
{
highlight: true, minLength: 1,
hint: true
}, {
name: "authors",
displayKey: "name",
source(query, cb){
return sourceSplit(query, cb, "&", authors); //sourceSplit //("&")
{
highlight: true, minLength: 1,
hint: true
}, {
name: "authors",
displayKey: "name",
source: function source(query, cb) {
return sourceSplit(query, cb, "&", authors); //sourceSplit //("&")
}
});
}
);
});
var promiseSeries = series.initialize();
promiseSeries.done(function(){
promiseSeries.done(function() {
$("#series").typeahead(
{
highlight: true, minLength: 0,
hint: true
}, {
name: "series",
displayKey: "name",
source: series.ttAdapter()
}
{
highlight: true, minLength: 0,
hint: true
}, {
name: "series",
displayKey: "name",
source: series.ttAdapter()
}
);
});
var promiseTags = tags.initialize();
promiseTags.done(function(){
promiseTags.done(function() {
$("#tags").typeahead(
{
highlight: true, minLength: 0,
hint: true
}, {
name: "tags",
displayKey: "name",
source(query, cb){
return sourceSplit(query, cb, ",", tags);
}
});
});
{
highlight: true, minLength: 0,
hint: true
}, {
name: "tags",
displayKey: "name",
source: function source(query, cb) {
return sourceSplit(query, cb, ",", tags);
}
}
);
});
var promiseLanguages = languages.initialize();
promiseLanguages.done(function(){
promiseLanguages.done(function() {
$("#languages").typeahead(
{
highlight: true, minLength: 0,
hint: true
}, {
name: "languages",
displayKey: "name",
source(query, cb){
return sourceSplit(query, cb, ",", languages); //(",")
}
});
});
{
highlight: true, minLength: 0,
hint: true
}, {
name: "languages",
displayKey: "name",
source: function source(query, cb) {
return sourceSplit(query, cb, ",", languages); //(",")
}
}
);
});
$("#search").on("change input.typeahead:selected", function(){
$("#search").on("change input.typeahead:selected", function() {
var form = $("form").serialize();
$.getJSON( getPath()+"/get_matching_tags", form, function( data ) {
$(".tags_click").each(function() {
if ($.inArray(parseInt($(this).children("input").first().val(), 10), data.tags) === -1 ) {
if (!($(this).hasClass("active"))) {
$(this).addClass("disabled");
}
}
else {
$(this).removeClass("disabled");
}
});
$(".tags_click").each(function() {
if ($.inArray(parseInt($(this).children("input").first().val(), 10), data.tags) === -1 ) {
if (!($(this).hasClass("active"))) {
$(this).addClass("disabled");
}
} else {
$(this).removeClass("disabled");
}
});
});
});

View File

@ -8,7 +8,7 @@
var dbResults = [];
var ggResults = [];
$(document).ready(function () {
$(function () {
var msg = i18nMsg;
var douban = "https://api.douban.com";
var dbSearch = "/v2/book/search";
@ -22,9 +22,6 @@ $(document).ready(function () {
var ggDone = false;
var showFlag = 0;
String.prototype.replaceAll = function (s1, s2) {
return this.replace(new RegExp(s1, "gm"), s2);
};
function showResult () {
var book;
@ -32,11 +29,11 @@ $(document).ready(function () {
var bookHtml;
showFlag++;
if (showFlag === 1) {
$("#metaModal #meta-info").html("<ul id=\"book-list\" class=\"media-list\"></ul>");
$("#meta-info").html("<ul id=\"book-list\" class=\"media-list\"></ul>");
}
if (ggDone && dbDone) {
if (!ggResults && !dbResults) {
$("#metaModal #meta-info").html("<p class=\"text-danger\">"+ msg.no_result +"</p>");
$("#meta-info").html("<p class=\"text-danger\">"+ msg.no_result +"</p>");
return;
}
}
@ -62,7 +59,7 @@ $(document).ready(function () {
"<p>"+ msg.source + ":<a href=\"https://books.google.com\" target=\"_blank\">Google Books</a></p>" +
"</div>" +
"</li>";
$("#metaModal #book-list").append(bookHtml);
$("#book-list").append(bookHtml);
}
ggDone = false;
}
@ -82,24 +79,22 @@ $(document).ready(function () {
"<p>" + msg.source + ":<a href=\"https://book.douban.com\" target=\"_blank\">Douban Books</a></p>" +
"</div>" +
"</li>";
$("#metaModal #book-list").append(bookHtml);
$("#book-list").append(bookHtml);
}
dbDone = false;
}
}
function ggSearchBook (title) {
title = title.replaceAll(/\s+/, "+");
var url = google + ggSearch + "?q=" + title;
$.ajax({
url,
url: google + ggSearch + "?q=" + title.replace(/\s+/gm, "+"),
type: "GET",
dataType: "jsonp",
jsonp: "callback",
success (data) {
success: function success(data) {
ggResults = data.items;
},
complete () {
complete: function complete() {
ggDone = true;
showResult();
}
@ -107,19 +102,18 @@ $(document).ready(function () {
}
function dbSearchBook (title) {
var url = douban + dbSearch + "?q=" + title + "&fields=all&count=10";
$.ajax({
url,
url: douban + dbSearch + "?q=" + title + "&fields=all&count=10",
type: "GET",
dataType: "jsonp",
jsonp: "callback",
success (data) {
success: function success(data) {
dbResults = data.books;
},
error () {
$("#metaModal #meta-info").html("<p class=\"text-danger\">"+ msg.search_error+"!</p>");
error: function error() {
$("#meta-info").html("<p class=\"text-danger\">"+ msg.search_error+"!</p>");
},
complete () {
complete: function complete() {
dbDone = true;
showResult();
}
@ -128,7 +122,7 @@ $(document).ready(function () {
function doSearch (keyword) {
showFlag = 0;
$("#metaModal #meta-info").text(msg.loading);
$("#meta-info").text(msg.loading);
// var keyword = $("#keyword").val();
if (keyword) {
dbSearchBook(keyword);
@ -153,6 +147,7 @@ $(document).ready(function () {
});
// eslint-disable-next-line no-unused-vars
function getMeta (source, id) {
var meta;
var tags;
@ -181,6 +176,5 @@ function getMeta (source, id) {
}
$("#tags").val(tags);
$("#rating").val(Math.round(meta.rating.average / 2));
return;
}
}

View File

@ -1,7 +1,3 @@
var displaytext;
var updateTimerID;
var updateText;
// Generic control/related handler to show/hide fields based on a checkbox' value
// e.g.
// <input type="checkbox" data-control="stuff-to-show">
@ -11,16 +7,18 @@ $(document).on("change", "input[type=\"checkbox\"][data-control]", function () {
var name = $this.data("control");
var showOrHide = $this.prop("checked");
$("[data-related=\""+name+"\"]").each(function () {
$("[data-related=\"" + name + "\"]").each(function () {
$(this).toggle(showOrHide);
});
});
$(function() {
var updateTimerID;
var updateText;
// Allow ajax prefilters to be added/removed dynamically
// eslint-disable-next-line new-cap
const preFilters = $.Callbacks();
var preFilters = $.Callbacks();
$.ajaxPrefilter(preFilters.fire);
function restartTimer() {
@ -30,29 +28,29 @@ $(function() {
function updateTimer() {
$.ajax({
dataType: "json",
url: window.location.pathname+"/../../get_updater_status",
success(data) {
// console.log(data.status);
$("#UpdateprogressDialog #Updatecontent").html(updateText[data.status]);
if (data.status >6){
dataType: "json",
url: window.location.pathname + "/../../get_updater_status",
success: function success(data) {
// console.log(data.status);
$("#Updatecontent").html(updateText[data.status]);
if (data.status > 6) {
clearInterval(updateTimerID);
$("#spinner2").hide();
$("#updateFinished").removeClass("hidden");
$("#check_for_update").removeClass("hidden");
$("#perform_update").addClass("hidden");
}
},
error: function error() {
// console.log('Done');
clearInterval(updateTimerID);
$("#spinner2").hide();
$("#UpdateprogressDialog #updateFinished").removeClass("hidden");
$("#Updatecontent").html(updateText[7]);
$("#updateFinished").removeClass("hidden");
$("#check_for_update").removeClass("hidden");
$("#perform_update").addClass("hidden");
}
},
error() {
// console.log('Done');
clearInterval(updateTimerID);
$("#spinner2").hide();
$("#UpdateprogressDialog #Updatecontent").html(updateText[7]);
$("#UpdateprogressDialog #updateFinished").removeClass("hidden");
$("#check_for_update").removeClass("hidden");
$("#perform_update").addClass("hidden");
},
timeout:2000
timeout: 2000
});
}
@ -70,13 +68,13 @@ $(function() {
// selector for the NEXT link (to page 2)
itemSelector : ".load-more .book",
animate : true,
extraScrollPx: 300,
extraScrollPx: 300
// selector for all items you'll retrieve
}, function(data){
}, function(data) {
$(".load-more .row").isotope( "appended", $(data), null );
});
$("#sendbtn").click(function(){
$("#sendbtn").click(function() {
var $this = $(this);
$this.text("Please wait...");
$this.addClass("disabled");
@ -84,36 +82,39 @@ $(function() {
$("#restart").click(function() {
$.ajax({
dataType: "json",
url: window.location.pathname+"/../../shutdown",
url: window.location.pathname + "/../../shutdown",
data: {"parameter":0},
success(data) {
success: function success() {
$("#spinner").show();
displaytext=data.text;
setTimeout(restartTimer, 3000);}
setTimeout(restartTimer, 3000);
}
});
});
$("#shutdown").click(function() {
$.ajax({
dataType: "json",
url: window.location.pathname+"/../../shutdown",
url: window.location.pathname + "/../../shutdown",
data: {"parameter":1},
success(data) {
return alert(data.text);}
success: function success(data) {
return alert(data.text);
}
});
});
$("#check_for_update").click(function() {
var buttonText = $("#check_for_update").html();
$("#check_for_update").html("...");
var $this = $(this);
var buttonText = $this.html();
$this.html("...");
$.ajax({
dataType: "json",
url: window.location.pathname+"/../../get_update_status",
success(data) {
$("#check_for_update").html(buttonText);
url: window.location.pathname + "/../../get_update_status",
success: function success(data) {
$this.html(buttonText);
if (data.status === true) {
$("#check_for_update").addClass("hidden");
$("#perform_update").removeClass("hidden");
$("#update_info").removeClass("hidden");
$("#update_info").find("span").html(data.commit);
$("#update_info")
.removeClass("hidden")
.find("span").html(data.commit);
}
}
});
@ -121,22 +122,23 @@ $(function() {
$("#restart_database").click(function() {
$.ajax({
dataType: "json",
url: window.location.pathname+"/../../shutdown",
url: window.location.pathname + "/../../shutdown",
data: {"parameter":2}
});
});
$("#perform_update").click(function() {
$("#spinner2").show();
$.ajax({
type: "POST",
dataType: "json",
data: { start: "True"},
url: window.location.pathname+"/../../get_updater_status",
success(data) {
updateText=data.text;
$("#UpdateprogressDialog #Updatecontent").html(updateText[data.status]);
// console.log(data.status);
updateTimerID=setInterval(updateTimer, 2000);}
type: "POST",
dataType: "json",
data: { start: "True"},
url: window.location.pathname + "/../../get_updater_status",
success: function success(data) {
updateText = data.text;
$("#Updatecontent").html(updateText[data.status]);
// console.log(data.status);
updateTimerID = setInterval(updateTimer, 2000);
}
});
});
@ -144,10 +146,10 @@ $(function() {
$("#bookDetailsModal")
.on("show.bs.modal", function(e) {
const $modalBody = $(this).find(".modal-body");
var $modalBody = $(this).find(".modal-body");
// Prevent static assets from loading multiple times
const useCache = (options) => {
var useCache = function(options) {
options.async = true;
options.cache = true;
};
@ -162,7 +164,7 @@ $(function() {
$(this).find(".modal-body").html("...");
});
$(window).resize(function(event) {
$(window).resize(function() {
$(".discover .row").isotope("reLayout");
});
});

View File

@ -1,31 +1,31 @@
/* global Sortable,sortTrue */
var sortable = Sortable.create(sortTrue, {
group: "sorting",
sort: true
Sortable.create(sortTrue, {
group: "sorting",
sort: true
});
function sendData(path){
// eslint-disable-next-line no-unused-vars
function sendData(path) {
var elements;
var counter;
var maxElements;
var tmp=[];
var tmp = [];
elements=Sortable.utils.find(sortTrue,"div");
maxElements=elements.length;
elements = Sortable.utils.find(sortTrue, "div");
maxElements = elements.length;
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", path);
for(counter=0;counter<maxElements;counter++){
tmp[counter]=elements[counter].getAttribute("id");
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", elements[counter].getAttribute("id"));
hiddenField.setAttribute("value", counter+1);
form.appendChild(hiddenField);
for (counter = 0;counter < maxElements;counter++) {
tmp[counter] = elements[counter].getAttribute("id");
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", elements[counter].getAttribute("id"));
hiddenField.setAttribute("value", String(counter + 1));
form.appendChild(hiddenField);
}
document.body.appendChild(form);
form.submit();

View File

@ -139,7 +139,7 @@
<div class="modal-header bg-danger text-center">
<span>{{_('Are really you sure?')}}</span>
</div>
<div class="modal-body text-center" id="meta-info">
<div class="modal-body text-center">
<span>{{_('Book will be deleted from Calibre database')}}</span>
<span>{{_('and from hard disk')}}</span>
</div>

View File

@ -259,5 +259,17 @@
{% endblock %}
{% block js %}
<script type="text/template" id="template-shelf-add">
<li>
<a href="<%= add %>" data-remove-href="<%= remove %>" data-shelf-action="add">
<%= content %>
</a>
</li>
</script>
<script type="text/template" id="template-shelf-remove">
<a href="<%= remove %>" data-add-href="<%= add %>" class="btn btn-sm btn-default" data-shelf-action="remove">
<span class="glyphicon glyphicon-remove"></span> <%= content %>
</a>
</script>
<script src="{{ url_for('static', filename='js/details.js') }}"></script>
{% endblock %}