mirror of
https://github.com/janeczku/calibre-web
synced 2024-12-18 22:20:30 +00:00
cdb1b52652
Metadata.db download works again removed DEVELOPMENT constant removed db logging in debug mode (too, noisy, to less information) code refactoring url_for_other_page feed languge set to en-EN update status shos local time instead of UTC Error handling (back to index page) in case of gdrive authenticate aborted Mistyping page register fixed Mistyping bokk fixed Added uploaded books to tasklist (#442) Error handling for failed file update added Code refactoring worker thread Tasks now never show any decimal values Converter function unified removed shell from subprocess call preparation for limiting domain for registering emails Book series can now increased in 0.1 steps (#562) Accordion panels in config are now usable on touch devices like iPad (#545) Gdrive authenticate button only visible after logged in (#525) Fixed misstyping in german translation
264 lines
13 KiB
HTML
264 lines
13 KiB
HTML
{% extends "layout.html" %}
|
||
{% block body %}
|
||
{% if book %}
|
||
<form role="form" action="{{ url_for('edit_book', book_id=book.id) }}" method="post" enctype="multipart/form-data">
|
||
|
||
<div class="col-sm-3 col-lg-3 col-xs-12">
|
||
<div class="cover">
|
||
{% if book.has_cover %}
|
||
<img src="{{ url_for('get_cover', cover_path=book.path.replace('\\','/')) }}" />
|
||
{% else %}
|
||
<img src="{{ url_for('static', filename='generic_cover.jpg') }}" />
|
||
{% endif %}
|
||
</div>
|
||
{% if g.user.role_delete_books() %}
|
||
<div class="text-center">
|
||
<button type="button" class="btn btn-danger" id="delete" data-toggle="modal" data-target="#deleteModal">{{_("Delete Book")}}</button>
|
||
</div>
|
||
{% if book.data|length > 1 %}
|
||
<div class="text-center more-stuff"><h4> {{_('Delete formats:')}} </h4>
|
||
{% for file in book.data %}
|
||
<div class="form-group">
|
||
<a href="{{ url_for('delete_book', book_id=book.id, book_format=file.format) }}" class="btn btn-danger" type="button">{{_('Delete')}} - {{file.format}}</a>
|
||
</div>
|
||
{% endfor %}
|
||
</div>
|
||
{% endif %}
|
||
{% endif %}
|
||
</div>
|
||
<div class="col-sm-9 col-xs-12">
|
||
<div class="form-group">
|
||
<label for="book_title">{{_('Book Title')}}</label>
|
||
<input type="text" class="form-control" name="book_title" id="book_title" value="{{book.title}}">
|
||
</div>
|
||
<div class="form-group">
|
||
<label for="bookAuthor">{{_('Author')}}</label>
|
||
<input type="text" class="form-control typeahead" name="author_name" id="bookAuthor" value="{{' & '.join(authors)}}" autocomplete="off">
|
||
</div>
|
||
<div class="form-group">
|
||
<label for="description">{{_('Description')}}</label>
|
||
<textarea class="form-control" name="description" id="description" rows="7">{% if book.comments %}{{book.comments[0].text}}{%endif%}</textarea>
|
||
</div>
|
||
<div class="form-group">
|
||
<label for="tags">{{_('Tags')}}</label>
|
||
<input type="text" class="form-control typeahead" name="tags" id="tags" value="{% for tag in book.tags %}{{tag.name.strip()}}, {% endfor %}">
|
||
</div>
|
||
|
||
<div class="form-group">
|
||
<label for="series">{{_('Series')}}</label>
|
||
<input type="text" class="form-control typeahead" name="series" id="series" value="{% if book.series %}{{book.series[0].name}}{% endif %}">
|
||
</div>
|
||
<div class="form-group">
|
||
<label for="series_index">{{_('Series id')}}</label>
|
||
<input type="number" step="0.1" min="0" class="form-control" name="series_index" id="series_index" value="{{book.series_index}}">
|
||
</div>
|
||
<div class="form-group">
|
||
<label for="rating">{{_('Rating')}}</label>
|
||
<input type="number" name="rating" id="rating" class="rating input-lg" data-clearable="" value="{% if book.ratings %}{{(book.ratings[0].rating / 2)|int}}{% endif %}">
|
||
</div>
|
||
<div class="form-group">
|
||
<label for="cover_url">{{_('Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)')}}</label>
|
||
<input type="text" class="form-control" name="cover_url" id="cover_url" value="">
|
||
</div>
|
||
|
||
<div class="form-group">
|
||
<label for="pubdate">{{_('Publishing date')}}</label>
|
||
<div style="position: relative">
|
||
<input type="date" class="form-control" name="pubdate" id="pubdate" value="{% if book.pubdate %}{{book.pubdate|formatdateinput}}{% endif %}">
|
||
<input type="text" class="form-control fake-input hidden" id="fake_pubdate" value="{% if book.pubdate %}{{book.pubdate|formatdate}}{% endif %}">
|
||
</div>
|
||
</div>
|
||
<div class="form-group">
|
||
<label for="languages">{{_('Language')}}</label>
|
||
<input type="text" class="form-control typeahead" name="languages" id="languages" value="{% for language in book.languages %}{{language.language_name.strip()}}, {% endfor %}">
|
||
</div>
|
||
|
||
{% if cc|length > 0 %}
|
||
{% for c in cc %}
|
||
<div class="form-group">
|
||
<label for="{{ 'custom_column_' ~ c.id }}">{{ c.name }}</label>
|
||
{% if c.datatype == 'bool' %}
|
||
<select name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}" class="form-control">
|
||
<option value="None" {% if book['custom_column_' ~ c.id]|length == 0 %} selected {% endif %}></option>
|
||
<option value="True" {% if book['custom_column_' ~ c.id]|length > 0 %}{% if book['custom_column_' ~ c.id][0].value ==true %}selected{% endif %}{% endif %} >{{_('Yes')}}</option>
|
||
<option value="False" {% if book['custom_column_' ~ c.id]|length > 0 %}{% if book['custom_column_' ~ c.id][0].value ==false %}selected{% endif %}{% endif %}>{{_('No')}}</option>
|
||
</select>
|
||
{% endif %}
|
||
|
||
{% if c.datatype == 'int' %}
|
||
<input type="number" step="1" class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}" value="{% if book['custom_column_' ~ c.id]|length > 0 %}{{ book['custom_column_' ~ c.id][0].value }}{% endif %}">
|
||
{% endif %}
|
||
|
||
{% if c.datatype in ['text', 'series'] and not c.is_multiple %}
|
||
<input type="text" class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}"
|
||
{% if book['custom_column_' ~ c.id]|length > 0 %}
|
||
value="{{ book['custom_column_' ~ c.id][0].value }}"
|
||
{% endif %}>
|
||
{% endif %}
|
||
|
||
{% if c.datatype in ['text', 'series'] and c.is_multiple %}
|
||
<input type="text" class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}"
|
||
{% if book['custom_column_' ~ c.id]|length > 0 %}
|
||
value="{% for column in book['custom_column_' ~ c.id] %}{{ column.value.strip() }}{% if not loop.last %}, {% endif %}{% endfor %}"{% endif %}>
|
||
{% endif %}
|
||
|
||
{% if c.datatype == 'enumeration' %}
|
||
<select class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}">
|
||
<option></option>
|
||
{% for opt in c.get_display_dict().enum_values %}
|
||
<option
|
||
{% if book['custom_column_' ~ c.id]|length > 0 %}
|
||
{% if book['custom_column_' ~ c.id][0].value == opt %}selected="selected"{% endif %}
|
||
{% endif %}
|
||
>{{ opt }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
{% endif %}
|
||
|
||
{% if c.datatype == 'rating' %}
|
||
<input type="number" min="1" max="5" step="1" class="form-control" name="{{ 'custom_column_' ~ c.id }}" id="{{ 'custom_column_' ~ c.id }}"
|
||
{% if book['custom_column_' ~ c.id]|length > 0 %}
|
||
value="{{ '%d' % (book['custom_column_' ~ c.id][0].value / 2) }}"
|
||
{% endif %}>
|
||
{% endif %}
|
||
</div>
|
||
{% endfor %}
|
||
{% endif %}
|
||
{% if g.user.role_upload() or g.user.role_admin()%}
|
||
{% if g.allow_upload %}
|
||
<div role="group" aria-label="Upload new book format">
|
||
<label class="btn btn-default btn-file" for="btn-upload-format">{{ _('Upload format') }}</label>
|
||
<div class="upload-format-input-text" id="upload-format"></div>
|
||
<input id="btn-upload-format" name="btn-upload-format" type="file">
|
||
</div>
|
||
{% endif %}
|
||
{% endif %}
|
||
|
||
<div class="checkbox">
|
||
<label>
|
||
<input name="detail_view" type="checkbox" checked> {{_('view book after edit')}}
|
||
</label>
|
||
</div>
|
||
<a href="#" id="get_meta" class="btn btn-default" data-toggle="modal" data-target="#metaModal">{{_('Get metadata')}}</a>
|
||
<button type="submit" class="btn btn-default">{{_('Submit')}}</button>
|
||
<a href="{{ url_for('show_book', book_id=book.id) }}" class="btn btn-default">{{_('Back')}}</a>
|
||
</div>
|
||
</form>
|
||
|
||
{% endif %}
|
||
{% endblock %}
|
||
|
||
{% block modal %}
|
||
{% if g.user.role_delete_books() %}
|
||
<div class="modal fade" id="deleteModal" role="dialog" aria-labelledby="metaDeleteLabel">
|
||
<div class="modal-dialog">
|
||
<div class="modal-content">
|
||
<div class="modal-header bg-danger text-center">
|
||
<span>{{_('Are really you sure?')}}</span>
|
||
</div>
|
||
<div class="modal-body text-center">
|
||
<span>{{_('Book will be deleted from Calibre database')}}</span>
|
||
<span>{{_('and from hard disk')}}</span>
|
||
</div>
|
||
|
||
<div class="modal-footer">
|
||
<a href="{{ url_for('delete_book', book_id=book.id) }}" class="btn btn-danger">{{_('Delete')}}</a>
|
||
<button type="button" class="btn btn-default" data-dismiss="modal">{{_('Back')}}</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% endif %}
|
||
|
||
<div class="modal fade" id="metaModal" tabindex="-1" role="dialog" aria-labelledby="metaModalLabel">
|
||
<div class="modal-dialog modal-lg" role="document">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||
<h4 class="modal-title" id="metaModalLabel">{{_('Get metadata')}}</h4>
|
||
<form class="padded-bottom" id="meta-search">
|
||
<div class="input-group">
|
||
<label class="sr-only" for="keyword">{{_('Keyword')}}</label>
|
||
<input type="text" class="form-control" id="keyword" name="keyword" placeholder="{{_(" Search keyword ")}}">
|
||
<span class="input-group-btn">
|
||
<button type="submit" class="btn btn-primary" id="do-search">{{_("Go!")}}</button>
|
||
</span>
|
||
</div>
|
||
</form>
|
||
<div>{{_('Click the cover to load metadata to the form')}}</div>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="text-center padded-bottom">
|
||
<input type="checkbox" id="show-douban" class="pill" data-control="douban" checked>
|
||
<label for="show-douban">Douban <span class="glyphicon glyphicon-ok"></span></label>
|
||
|
||
<input type="checkbox" id="show-google" class="pill" data-control="google" checked>
|
||
<label for="show-google">Google <span class="glyphicon glyphicon-ok"></span></label>
|
||
</div>
|
||
|
||
<div id="meta-info">
|
||
{{_("Loading...")}}
|
||
</div>
|
||
<ul id="book-list" class="media-list"></ul>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button type="button" class="btn btn-default" data-dismiss="modal">{{_('Close')}}</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% endblock %}
|
||
|
||
{% block js %}
|
||
<script type="text/template" id="template-book-result">
|
||
<li class="media" data-related="<%= source.id %>">
|
||
<img class="pull-left img-responsive"
|
||
data-toggle="modal"
|
||
data-target="#metaModal"
|
||
src="<%= cover %>"
|
||
alt="Cover"
|
||
>
|
||
<div class="media-body">
|
||
<h4 class="media-heading">
|
||
<a href="<%= url %>" target="_blank" rel="noopener"><%= title %></a>
|
||
</h4>
|
||
<p>{{_('Author')}}:<%= authors.join(" & ") %></p>
|
||
<% if (publisher) { %>
|
||
<p>{{_('Publisher')}}:<%= publisher %></p>
|
||
<% } %>
|
||
<% if (description) { %>
|
||
<p>{{_('Description')}}: <%= description %></p>
|
||
<% } %>
|
||
<p>{{_('Source')}}:
|
||
<a href="<%= source.url %>" target="_blank" rel="noopener"><%= source.description %></a>
|
||
</p>
|
||
</div>
|
||
</li>
|
||
</script>
|
||
<script>
|
||
var i18nMsg = {
|
||
'loading': {{_('Loading...')|safe|tojson}},
|
||
'search_error': {{_('Search error!')|safe|tojson}},
|
||
'no_result': {{_('No Result! Please try anonther keyword.')|safe|tojson}},
|
||
'author': {{_('Author')|safe|tojson}},
|
||
'publisher': {{_('Publisher')|safe|tojson}},
|
||
'description': {{_('Description')|safe|tojson}},
|
||
'source': {{_('Source')|safe|tojson}},
|
||
};
|
||
var language = '{{ g.user.locale }}';
|
||
</script>
|
||
<script src="{{ url_for('static', filename='js/libs/typeahead.bundle.js') }}"></script>
|
||
<script src="{{ url_for('static', filename='js/libs/bootstrap-rating-input.min.js') }}"></script>
|
||
<script src="{{ url_for('static', filename='js/get_meta.js') }}"></script>
|
||
<script src="{{ url_for('static', filename='js/libs/tinymce/tinymce.min.js') }}"></script>
|
||
<script src="{{ url_for('static', filename='js/libs/bootstrap-datepicker/bootstrap-datepicker.min.js') }}"></script>
|
||
{% if not g.user.locale == 'en' %}
|
||
<script src="{{ url_for('static', filename='js/libs/bootstrap-datepicker/locales/bootstrap-datepicker.' + g.user.locale + '.min.js') }}" charset="UTF-8"></script>
|
||
{% endif %}
|
||
<script src="{{ url_for('static', filename='js/edit_books.js') }}"></script>
|
||
{% endblock %}
|
||
{% block header %}
|
||
<link href="{{ url_for('static', filename='css/libs/typeahead.css') }}" rel="stylesheet" media="screen">
|
||
<link href="{{ url_for('static', filename='css/libs/bootstrap-datepicker3.min.css') }}" rel="stylesheet" media="screen">
|
||
{% endblock %}
|