cedc183987
Unified wording Calibre-Web Replaced one table on admin page, deleted password column Removed spaces on layout page Removed uesless commit calls during db migration Implementation of registering by email
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 you really 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(s) found! Please try aonther 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 %}
|