mirror of
https://github.com/janeczku/calibre-web
synced 2026-10-23 08:12:26 +00:00
192 lines
13 KiB
HTML
192 lines
13 KiB
HTML
<!DOCTYPE html>
|
|
{% from theme('modal_dialogs.html') import restrict_modal, delete_book, filechooser_modal, delete_confirm_modal, change_confirm_modal %}
|
|
{% import 'image.html' as image %}
|
|
<html lang="{{ current_user.locale }}">
|
|
<head>
|
|
<title>{{instance}} | {{title}}</title>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
|
<meta name="mobile-web-app-capable" content="yes">
|
|
{% if g.google_site_verification|length > 0 %}
|
|
<meta name="google-site-verification" content="{{g.google_site_verification}}">
|
|
{% endif %}
|
|
<!-- Bootstrap -->
|
|
<link rel="apple-touch-icon" href="{{ url_for('static', filename='touch-icon.png') }}">
|
|
<link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon-32.png') }}">
|
|
<link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicon-16.png') }}">
|
|
<link rel="icon" type="image/png" sizes="96x96" href="{{ url_for('static', filename='favicon-96.png') }}"/>
|
|
<link rel="icon" type="image/svg+xml" href="{{ url_for('static', filename='favicon.svg') }}"/>
|
|
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}"/>
|
|
<link href="{{ url_for('static', filename='css/libs/bootstrap5.min.css') }}" rel="stylesheet" media="screen">
|
|
{% block header %}{% endblock %}
|
|
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet" media="screen">
|
|
<link href="{{ url_for('static', filename='css/upload.css') }}" rel="stylesheet" media="screen">
|
|
<link href="{{ url_for('static', filename='css/bootstrap-icons.min.css') }}" rel="stylesheet" media="screen">
|
|
<link href="{{ url_for('static', filename='css/standard.css') }}" rel="stylesheet" media="screen">
|
|
</head>
|
|
<body class="{{ page }} {{ bodyClass }}">
|
|
<!-- Static navbar -->
|
|
<nav class="navbar navbar-default navbar-static-top navbar-expand-md navbar-light bg-body-tertiary border-bottom" role="navigation">
|
|
<div class="container-fluid">
|
|
<div class="navbar-header d-flex align-items-center">
|
|
<a class="navbar-brand" href="{{url_for('web.index')}}">{{instance}}</a>
|
|
<button type="button" class="navbar-toggle collapsed navbar-toggler" data-bs-toggle="collapse" data-bs-target="#mainNavbar" aria-controls="mainNavbar" aria-expanded="false" aria-label="{{_('Toggle Navigation')}}">
|
|
<span class="visually-hidden">{{_('Toggle Navigation')}}</span>
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
</div>
|
|
{% if current_user.is_authenticated or g.allow_anonymous %}
|
|
<form class="navbar-form navbar-left d-flex me-auto" role="search" action="{{url_for('search.simple_search')}}" method="GET">
|
|
<div class="form-group input-group input-group-sm flex-nowrap">
|
|
<label for="query" class="visually-hidden">{{_('Search')}}</label>
|
|
<input type="text" class="form-control" id="query" name="query" placeholder="{{_('Search Library')}}" value="{{searchterm}}">
|
|
<button type="submit" id="query_submit" class="btn btn-outline-secondary">{{_('Search')}}</button>
|
|
</div>
|
|
</form>
|
|
{% endif %}
|
|
<div class="navbar-collapse collapse" id="mainNavbar">
|
|
{% if current_user.is_authenticated or g.allow_anonymous %}
|
|
<ul class="nav navbar-nav me-auto">
|
|
<li class="nav-item"><a class="nav-link" href="{{url_for('search.advanced_search')}}" id="advanced_search"><i class="bi bi-search layout-icon" aria-hidden="true"></i><span class="d-none d-lg-inline"> {{_('Advanced Search')}}</span></a></li>
|
|
{% if simple==true %} <li class="nav-item"><a class="nav-link" href="{{url_for('basic.index')}}" id="basic"><i class="bi bi-phone layout-icon" aria-hidden="true"></i><span>{{_('Simple Theme')}}</span></a></li>{% endif %}
|
|
</ul>
|
|
{% endif %}
|
|
<ul class="nav navbar-nav navbar-right ms-auto align-items-lg-center" id="main-nav">
|
|
{% if current_user.is_authenticated or g.allow_anonymous %}
|
|
{% if current_user.role_upload() and g.allow_upload %}
|
|
<li class="nav-item">
|
|
<form id="form-upload" class="navbar-form" action="{{ url_for('edit-book.upload') }}" data-title="{{_('Uploading...')}}" data-footer="{{_('Close')}}" data-failed="{{_('Error')}}" data-message="{{_('Upload done, processing, please wait...')}}" method="post" enctype="multipart/form-data">
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
|
<div class="form-group">
|
|
<span class="btn btn-outline-secondary btn-file">{{_('Upload')}}<input id="btn-upload" name="btn-upload"
|
|
type="file" accept="{% for format in accept %}.{% if format != ''%}{{format}}{% else %}*{% endif %}{{ ',' if not loop.last }}{% endfor %}" multiple></span>
|
|
<input class="hide d-none" id="btn-upload2" name="btn-upload2" type="file" accept="{% for format in accept %}.{% if format != ''%}{{format}}{% else %}*{% endif %}{{ ',' if not loop.last }}{% endfor %}">
|
|
</div>
|
|
</form>
|
|
</li>
|
|
{% endif %}
|
|
{% if not current_user.is_anonymous and not simple%}
|
|
<li class="nav-item top_tasks"><a class="nav-link" id="top_tasks" href="{{url_for('tasks.get_tasks_status')}}"><i class="bi bi-list-task layout-icon" aria-hidden="true"></i> <span class="d-none d-lg-inline">{{_('Tasks')}}</span></a></li>
|
|
{% endif %}
|
|
{% if current_user.role_admin() %}
|
|
<li class="nav-item"><a class="nav-link" id="top_admin" href="{{url_for('admin.admin')}}"><i class="bi bi-speedometer2 layout-icon" aria-hidden="true"></i> <span class="d-none d-lg-inline">{{_('Admin')}}</span></a></li>
|
|
{% endif %}
|
|
<li class="nav-item"><a class="nav-link" id="top_user" href="{% if not current_user.is_anonymous %}{{url_for('web.profile')}}{% else %}{{url_for('web.login', next=(request.path + "?" + request.query_string.decode("utf-8")).rstrip("?"))}}{% endif %}"><i class="bi bi-person layout-icon" aria-hidden="true"></i> <span class="d-none d-lg-inline">{{current_user.name}}</span></a></li>
|
|
{% if not current_user.is_anonymous %}
|
|
<li class="nav-item"><a class="nav-link" id="logout" href="{{url_for('web.logout', next=(request.path + "?" + request.query_string.decode("utf-8")).rstrip("?"))}}"><i class="bi bi-box-arrow-right layout-icon" aria-hidden="true"></i> <span class="d-none d-lg-inline">{{_('Logout')}}</span></a></li>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% if g.allow_registration and not current_user.is_authenticated %}
|
|
<li class="nav-item"><a class="nav-link d-flex align-items-center gap-2" id="login" href="{{url_for('web.login')}}"><i class="bi bi-box-arrow-in-right layout-icon" aria-hidden="true"></i> {{_('Login')}}</a></li>
|
|
<li class="nav-item"><a class="nav-link d-flex align-items-center gap-2" id="register" href="{{url_for('web.register')}}"><i class="bi bi-person layout-icon" aria-hidden="true"></i> {{_('Register')}}</a></li>
|
|
{% endif %}
|
|
</ul>
|
|
</div><!--/.nav-collapse -->
|
|
</div>
|
|
</nav>
|
|
{% for message in get_flashed_messages(with_categories=True) %}
|
|
{%if message[0] == "error" %}
|
|
<div class="row row-fluid text-center" >
|
|
<div id="flash_danger" class="alert alert-danger">{{ message[1] }}</div>
|
|
</div>
|
|
{%endif%}
|
|
{%if message[0] == "info" %}
|
|
<div class="row row-fluid text-center">
|
|
<div id="flash_info" class="alert alert-info">{{ message[1] }}</div>
|
|
</div>
|
|
{%endif%}
|
|
{%if message[0] == "warning" %}
|
|
<div class="row row-fluid text-center">
|
|
<div id="flash_warning" class="alert alert-warning">{{ message[1] }}</div>
|
|
</div>
|
|
{%endif%}
|
|
{%if message[0] == "success" %}
|
|
<div class="row row-fluid text-center">
|
|
<div id="flash_success" class="alert alert-success">{{ message[1] }}</div>
|
|
</div>
|
|
{%endif%}
|
|
{% endfor %}
|
|
{% block flash %}{% endblock %}
|
|
<div class="container-fluid">
|
|
<div class="row row-fluid">
|
|
{% if current_user.is_authenticated or g.allow_anonymous %}
|
|
<div class="col-md-2 sidebar-column d-none d-md-block">
|
|
<nav class="navigation">
|
|
<ul class="list-unstyled" id="scnd-nav">
|
|
<li class="nav-head d-none d-md-block">{{_('Browse')}}</li>
|
|
{% for element in sidebar %}
|
|
{% if current_user.check_visibility(element['visibility']) and element['public'] %}
|
|
<li id="nav_{{element['id']}}" {% if page == element['page'] %}class="active"{% endif %}><a href="{% if element['no_param'] %}{{url_for(element['link'], data=element['page'])}}{%else%}{{url_for(element['link'], data=element['page'], sort_param='stored')}}{% endif %}"><i class="bi {{ element['glyph'] }} layout-icon" aria-hidden="true"></i> {{_(element['text'])}}</a></li>
|
|
{% endif %}
|
|
{% endfor %}
|
|
{% if current_user.is_authenticated or g.allow_anonymous %}
|
|
<li class="nav-head d-none d-md-block public-shelves">{{_('Shelves')}}</li>
|
|
{% for shelf in g.shelves_access %}
|
|
<li><a href="{{url_for('shelf.show_shelf', shelf_id=shelf.id)}}"><i class="bi bi-list-ul layout-icon shelf" aria-hidden="true"></i> {{shelf.name|shortentitle(40)}}{% if shelf.is_public == 1 %} {{_('(Public)')}}{% endif %} <span class="badge badge-sm bg-secondary rounded-pill">{{shelf.books.all()|length}}</span></a></li>
|
|
{% endfor %}
|
|
{% if not current_user.is_anonymous %}
|
|
<li id="nav_createshelf" class="create-shelf"><a href="{{url_for('shelf.create_shelf')}}">{{_('Create a Shelf')}}</a></li>
|
|
<li id="nav_about" {% if page == 'stat' %}class="active"{% endif %}><a href="{{url_for('about.stats')}}"><i class="bi bi-info-circle layout-icon" aria-hidden="true"></i> {{_('About')}}</a></li>
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
{% endif %}
|
|
<div class="col-12 col-md-10 page-content">
|
|
{% block body %}{% endblock %}
|
|
{% if pagination and (pagination.has_next or pagination.has_prev) %}
|
|
<div class="pagination">
|
|
{% if pagination.has_prev %}
|
|
<li class="page-item page-previous"><a class="page-link" aria-label="next page" href="{{ (pagination.page - 1)|url_for_other_page }}">« {{_('Previous')}}</a></li>
|
|
{% endif %}
|
|
{% for page in pagination.iter_pages() %}
|
|
{% if page %}
|
|
{% if page != pagination.page %}
|
|
<li class="page-item"><a class="page-link" aria-label="to page {{ page }}" href="{{ (page)|url_for_other_page }}">{{ page }}</a></li>
|
|
{% else %}
|
|
<li class="page-item active"><a class="page-link" aria-label="to page {{ page }}" href="{{ (page)|url_for_other_page }}">{{ page }}</a></li>
|
|
{% endif %}
|
|
{% else %}
|
|
<li class="page-item page-last-separator disabled"><a class="page-link" aria-label="">…</a></li>
|
|
{% endif %}
|
|
{% endfor %}
|
|
{% if pagination.has_next %}
|
|
<li class="page-item page-next"><a class="page-link next" aria-label="next page" href="{{ (pagination.page + 1)|url_for_other_page }}">{{_('Next')}} »</a></li>
|
|
{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="modal fade" id="bookDetailsModal" tabindex="-1" role="dialog" aria-labelledby="bookDetailsModalLabel">
|
|
<div class="modal-dialog modal-lg" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="bookDetailsModalLabel">{{_('Book Details')}}</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{_('Close')}}"></button>
|
|
</div>
|
|
<div class="modal-body">...</div>
|
|
<div class="modal-footer">
|
|
<button type="button" id="details_close" class="btn btn-outline-secondary" data-bs-dismiss="modal">{{_('Close')}}</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% block modal %}{% endblock %}
|
|
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
|
|
<script src="{{ url_for('static', filename='js/libs/jquery.min.js') }}"></script>
|
|
<!-- Include all compiled plugins (below), or include individual files as needed -->
|
|
<script src="{{ url_for('static', filename='js/libs/bootstrap5.bundle.min.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/libs/underscore-umd-min.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/libs/plugins.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/libs/jquery.form.min.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/uploadprogress.js') }}"> </script>
|
|
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/standard.js') }}"></script>
|
|
{% block js %}{% endblock %}
|
|
</body>
|
|
</html>
|