Migration to bootstrap5 of caliblur Theme

This commit is contained in:
Ozzie Isaacs
2026-10-03 09:20:20 +02:00
parent 1107f1fbfd
commit dc113e672d
21 changed files with 596 additions and 446 deletions
+229 -112
View File
@@ -1,4 +1,4 @@
.form-control, .home-btn, .home-btn > a, body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a {
.form-control, .home-btn, .home-btn > a, body > nav.navbar > div > div.navbar-header > a {
font-variant-caps: normal;
font-variant-numeric: normal;
font-weight: 400;
@@ -15,7 +15,7 @@
text-overflow: ellipsis
}
.shelforder > .container-fluid > .row-fluid > .col-sm-10 > div.col-sm-6.col-lg-6.col-xs-6 > h2:before, body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a {
.shelforder > .container-fluid > .row-fluid > .col-sm-10 > div.col-sm-6.col-lg-6.col-xs-6 > h2:before, body > nav.navbar > div > div.navbar-header > a {
line-height: 60px;
-webkit-tap-highlight-color: transparent;
-webkit-text-size-adjust: 100%;
@@ -160,7 +160,7 @@
}
@media only screen and (max-width: 991px) and (min-width: 768px) {
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a > span:before {
body > nav.navbar > div > div.navbar-collapse.collapse > ul > li > a > span:before {
font-size: 18px
}
@@ -189,14 +189,14 @@
}
@media only screen and (max-height: 600px) {
body.login > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a,
body.register > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a {
body.login > nav.navbar > div > div.navbar-header > a,
body.register > nav.navbar > div > div.navbar-header > a {
padding: 0 !important;
height: 60px !important
}
body.login > div.container-fluid > div.row-fluid > div.col-sm-10,
body.register > div.container-fluid > div.row-fluid > div.col-sm-10 {
body.login > div.container-fluid > div.row > div.col-sm-10,
body.register > div.container-fluid > div.row > div.col-sm-10 {
top: 60px !important
}
@@ -206,7 +206,7 @@
}
}
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a[href*=advanced_search] {
body > nav.navbar > div > div.navbar-collapse.collapse > ul > li > a[href*=advanced_search] {
display: none
}
@@ -248,7 +248,7 @@ body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.c
background-color: transparent
}
.navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover {
nav.navbar .navbar-nav .open .dropdown-menu > .active > a:hover {
color: #fff;
background-color: hsla(0, 0%, 100%, .08)
}
@@ -349,7 +349,7 @@ body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.c
text-transform: uppercase
}
.home-btn > a, body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a {
.home-btn > a, body > nav.navbar > div > div.navbar-header > a {
text-transform: none;
-moz-user-select: none;
-webkit-font-smoothing: antialiased
@@ -651,7 +651,7 @@ a:hover {
cursor: pointer
}
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a {
body > nav.navbar > div > div.navbar-header > a {
margin: 60px auto auto !important;
width: 240px;
height: 60px;
@@ -744,7 +744,7 @@ body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a
content: "\EA30"
}
body > div.navbar.navbar-default.navbar-static-top > div > div.home-btn > a:hover:before {
body > nav.navbar > div > div.home-btn > a:hover:before {
color: #fff
}
@@ -757,13 +757,56 @@ body > div.navbar.navbar-default.navbar-static-top > div > div.home-btn > a:hove
content: ''
}
.navbar-default {
nav.navbar {
background-color: rgba(0, 0, 0, .6) !important;
border: none;
position: fixed;
width: 100%;
height: 60px;
z-index: -9
z-index: 10;
padding: 0;
display: block;
min-height: 60px;
}
nav.navbar > .container-fluid {
display: block;
padding: 0;
height: 60px;
}
nav.navbar .navbar-header {
float: left;
}
nav.navbar .navbar-brand {
line-height: 60px;
}
nav.navbar > .container-fluid > .navbar-form {
float: left;
}
nav.navbar .navbar-collapse {
flex-grow: 0;
}
nav.navbar .navbar-nav {
display: block;
margin: 0;
float: left;
}
nav.navbar .navbar-nav > li > a {
display: block;
}
nav.navbar .navbar-toggler {
display: none;
}
body:not(.read-frame):not(.login):not(.register):not(.remotelogin) {
font-size: 14px;
}
body:not(.read-frame) {
@@ -787,18 +830,18 @@ body:not(.read-frame) {
scrollbar-width: thin;
}
body > div.navbar.navbar-default.navbar-static-top > div > form > div {
body > nav.navbar > div > form > div {
position: relative;
width: 360px
}
body > div.navbar.navbar-default.navbar-static-top > div > form > div > span.input-group-btn {
body > nav.navbar > div > form > div > span.input-group-btn {
opacity: 0;
pointer-events: none;
z-index: 999999;
}
body > div.navbar.navbar-default.navbar-static-top > div > form.search-focus > div > span.input-group-btn {
body > nav.navbar > div > form.search-focus > div > span.input-group-btn {
opacity: 1;
pointer-events: auto
}
@@ -849,7 +892,7 @@ body > div.navbar.navbar-default.navbar-static-top > div > form.search-focus > d
display: none
}
.profileDropli > li > a > span.hidden-sm {
.profileDropli > li > a > span.caliblur-nav-label {
display: inline !important
}
@@ -914,8 +957,8 @@ body > div.navbar.navbar-default.navbar-static-top > div > form.search-focus > d
}
#form-upload .form-group .btn:before {
content: "\e043";
font-family: 'Glyphicons Halflings', serif;
content: "\f193";
font-family: bootstrap-icons;
font-style: normal;
font-weight: 400;
line-height: 1;
@@ -933,7 +976,7 @@ body > div.navbar.navbar-default.navbar-static-top > div > form.search-focus > d
z-index: -9
}
#top_admin > span.hidden-sm, #top_tasks > span.hidden-sm {
#top_admin > span.caliblur-nav-label, #top_tasks > span.caliblur-nav-label {
display: none
}
@@ -1021,7 +1064,7 @@ body > div.navbar.navbar-default.navbar-static-top > div > form.search-focus > d
background: hsla(0, 0%, 100%, .25) !important
}
body > div.navbar.navbar-default.navbar-static-top > div > form > div > span > button {
body > nav.navbar > div > form > div > span > button {
background-color: #555;
color: #eee;
border: none;
@@ -1035,7 +1078,7 @@ button[name='search'] {
min-height: 40px;
}
body > div.navbar.navbar-default.navbar-static-top > div > form > div > .query-search-icon {
body > nav.navbar > div > form > div > .query-search-icon {
position: absolute;
left: 16px;
top: 50%;
@@ -1045,7 +1088,7 @@ body > div.navbar.navbar-default.navbar-static-top > div > form > div > .query-s
transform: translateY(-50%)
}
body > div.navbar.navbar-default.navbar-static-top > div > form.search-focus > div > .query-search-icon {
body > nav.navbar > div > form.search-focus > div > .query-search-icon {
color: #555;
z-index: 999;
}
@@ -1061,7 +1104,7 @@ body > div.navbar.navbar-default.navbar-static-top > div > form.search-focus > d
color: #555 !important
}
body > div.navbar.navbar-default.navbar-static-top > div > form > div > span.input-group-btn {
body > nav.navbar > div > form > div > span.input-group-btn {
position: absolute;
right: 5px;
left: auto;
@@ -1075,7 +1118,7 @@ body > div.navbar.navbar-default.navbar-static-top > div > form > div > span.inp
transform: translateY(-50%)
}
body > div.navbar.navbar-default.navbar-static-top > div > form > div > span.input-group-btn > button {
body > nav.navbar > div > form > div > span.input-group-btn > button {
position: relative;
display: flex;
align-items: center;
@@ -1085,37 +1128,37 @@ body > div.navbar.navbar-default.navbar-static-top > div > form > div > span.inp
padding: 0
}
body > div.navbar.navbar-default.navbar-static-top > div > form > div > span.input-group-btn > button > .glyphicon {
body > nav.navbar > div > form > div > span.input-group-btn > button > .glyphicon {
top: 0
}
body > div.navbar.navbar-default.navbar-static-top > div > form {
body > nav.navbar > div > form {
margin-left: -140px;
padding: 0;
margin-top: 10px;
margin-bottom: 10px
}
body > div.navbar.navbar-default.navbar-static-top > div > form > .form-group > input::-webkit-input-placeholder {
body > nav.navbar > div > form > .form-group > input::-webkit-input-placeholder {
color: hsla(0, 0%, 100%, .65);
opacity: 1
}
body > div.navbar.navbar-default.navbar-static-top > div > form > .form-group > input:-moz-placeholder {
body > nav.navbar > div > form > .form-group > input:-moz-placeholder {
color: hsla(0, 0%, 100%, .65);
opacity: 1
}
body > div.navbar.navbar-default.navbar-static-top > div > form > .form-group > input::-moz-placeholder {
body > nav.navbar > div > form > .form-group > input::-moz-placeholder {
color: hsla(0, 0%, 100%, .65);
opacity: 1
}
body > div.navbar.navbar-default.navbar-static-top > div > form > .form-group > input:-ms-input-placeholder {
body > nav.navbar > div > form > .form-group > input:-ms-input-placeholder {
color: hsla(0, 0%, 100%, .65)
}
body > div.navbar.navbar-default.navbar-static-top > div > form > .form-group > input {
body > nav.navbar > div > form > .form-group > input {
border-radius: 4px;
height: 40px;
width: 360px;
@@ -1123,30 +1166,31 @@ body > div.navbar.navbar-default.navbar-static-top > div > form > .form-group >
}
#main-nav {
margin-right: 15px
margin-right: 15px;
float: right;
}
#main-nav > li {
float: right
}
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul, body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li {
body > nav.navbar > div > div.navbar-collapse.collapse > ul, body > nav.navbar > div > div.navbar-collapse.collapse > ul > li {
height: 60px
}
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a {
body > nav.navbar > div > div.navbar-collapse.collapse > ul > li > a {
height: 60px;
padding: 20px 10px;
color: hsla(0, 0%, 100%, .7)
}
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > #top_admin > .glyphicon-dashboard::before {
body > nav.navbar > div > div.navbar-collapse.collapse > ul > li > #top_admin > .glyphicon-dashboard::before {
content: "\EA31";
font-family: plex-icons-new, serif;
font-size: 20px
}
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > #top_admin > span:last-of-type {
body > nav.navbar > div > div.navbar-collapse.collapse > ul > li > #top_admin > span:last-of-type {
vertical-align: top
}
@@ -1665,7 +1709,7 @@ body > .container-fluid {
left: 0
}
body > div.container-fluid > div.row-fluid > div.col-sm-2 {
body > div.container-fluid > div.row > div.col-sm-2 {
position: absolute;
width: 240px;
height: calc(100% - 60px);
@@ -1676,7 +1720,7 @@ body > div.container-fluid > div.row-fluid > div.col-sm-2 {
overflow-y: auto
}
body > div.container-fluid > div.row-fluid > div.col-sm-10 {
body > div.container-fluid > div.row > div.col-sm-10 {
width: calc(100vw - 237px);
height: calc(100% - 60px);
padding: 0;
@@ -1905,7 +1949,7 @@ body > div.container-fluid > div > div.col-sm-10 > div.pagination .page-previous
color: hsla(0, 0%, 100%, .7)
}
.navbar-default .navbar-nav > li > a:focus, .navbar-default .navbar-nav > li > a:hover {
nav.navbar .navbar-nav > li > a:focus, nav.navbar .navbar-nav > li > a:hover {
color: #fff !important
}
@@ -3622,7 +3666,7 @@ body.shelf > div.container-fluid > div > div.col-sm-10 > div.discover > .shelf-b
background: rgba(0, 0, 0, .3)
}
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a:hover {
body > nav.navbar > div > div.navbar-header > a:hover {
color: #fff !important;
-webkit-transition: color .2s;
-o-transition: color .2s;
@@ -3777,6 +3821,20 @@ body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a
background-color: hsla(0, 0%, 100%, .25)
}
.login .toggle-password {
background-color: var(--color-secondary);
border-color: var(--color-secondary);
color: #fff;
}
.login .toggle-password:hover,
.login .toggle-password:focus,
.login .toggle-password:active {
background-color: var(--color-secondary-hover);
border-color: var(--color-secondary-hover);
color: #fff;
}
.login ::-webkit-input-placeholder {
color: transparent
}
@@ -3793,9 +3851,9 @@ body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a
color: transparent
}
body.login > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a,
body.register > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a,
body.remotelogin > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a {
body.login > nav.navbar > div > div.navbar-header > a,
body.register > nav.navbar > div > div.navbar-header > a,
body.remotelogin > nav.navbar > div > div.navbar-header > a {
width: 100vw;
height: 120px;
margin: 0 !important;
@@ -3806,34 +3864,86 @@ body.remotelogin > div.navbar.navbar-default.navbar-static-top > div > div.navba
font-size: 20px
}
body.login > .container-fluid,
body.register > .container-fluid,
body.remotelogin > .container-fluid {
width: 100vw;
height: 100%;
position: relative
body.login > nav.navbar,
body.register > nav.navbar,
body.remotelogin > nav.navbar {
min-height: 120px;
background: transparent !important;
border: 0;
}
body.login > div.container-fluid > div.row-fluid > div.col-sm-10,
body.register > div.container-fluid > div.row-fluid > div.col-sm-10,
body.remotelogin > div.container-fluid > div.row-fluid > div.col-sm-10 {
body.login > nav.navbar > .container-fluid,
body.register > nav.navbar > .container-fluid,
body.remotelogin > nav.navbar > .container-fluid {
justify-content: center;
}
body.login > nav.navbar > .container-fluid > .navbar-header,
body.register > nav.navbar > .container-fluid > .navbar-header,
body.remotelogin > nav.navbar > .container-fluid > .navbar-header {
width: 100%;
justify-content: center;
}
body.login > nav.navbar .navbar-toggler,
body.register > nav.navbar .navbar-toggler,
body.remotelogin > nav.navbar .navbar-toggler {
display: none;
}
body.login > nav.navbar .home-btn,
body.login > nav.navbar .plexBack,
body.login > nav.navbar .navbar-form,
body.register > nav.navbar .home-btn,
body.register > nav.navbar .plexBack,
body.register > nav.navbar .navbar-form,
body.remotelogin > nav.navbar .home-btn,
body.remotelogin > nav.navbar .plexBack,
body.remotelogin > nav.navbar .navbar-form {
display: none !important;
}
body.login > nav.navbar .navbar-brand,
body.register > nav.navbar .navbar-brand,
body.remotelogin > nav.navbar .navbar-brand {
width: 100%;
height: 120px;
margin: 0 !important;
float: none;
padding: 60px 0 0;
color: #ccc !important;
font-family: "Open Sans Bold", "Open Sans", sans-serif;
font-size: 20px;
line-height: 60px;
text-align: center;
}
body.login > div.container-fluid > div.row > div.col-sm-10,
body.register > div.container-fluid > div.row > div.col-sm-10,
body.remotelogin > div.container-fluid > div.row > div.col-sm-10 {
width: 100%;
height: 100%;
overflow-y: visible !important
}
body.login > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse,
body.register > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse,
body.remotelogin > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse {
body.login > nav.navbar > div > div.navbar-collapse.collapse,
body.register > nav.navbar > div > div.navbar-collapse.collapse,
body.remotelogin > nav.navbar > div > div.navbar-collapse.collapse {
display: none !important
}
.login .navbar-default,
.register .navbar-default,
.remotelogin .navbar-default {
.login nav.navbar,
.register nav.navbar,
.remotelogin nav.navbar {
background: 0 0 !important
}
.login > nav.navbar,
.register > nav.navbar,
.remotelogin > nav.navbar {
background: transparent !important;
}
body.login:not(.read-frame), body.shelfcreate, body.shelfedit {
background-image: url(images/caliblur/blur-noise.png), url(images/caliblur/blur-dark.png) !important
}
@@ -3844,10 +3954,10 @@ body.author .undefined-img, body.shelfcreate, body.shelfedit {
background-position: center center, center center !important
}
body.login > div.container-fluid > div.row-fluid > div.col-sm-10::before, body.login > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a::before,
body.remotelogin > div.container-fluid > div.row-fluid > div.col-sm-10::before, body.register > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a::before,
body.remotelogin > div.container-fluid > div.row-fluid > div.col-sm-2::after,
body.register > div.container-fluid > div.row-fluid > div.col-sm-10::before, body.register > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a::before {
body.login > div.container-fluid > div.row > div.col-sm-10::before, body.login > nav.navbar > div > div.navbar-header > a::before,
body.remotelogin > div.container-fluid > div.row > div.col-sm-10::before, body.register > nav.navbar > div > div.navbar-header > a::before,
body.remotelogin > div.container-fluid > div.row > div.col-sm-2::after,
body.register > div.container-fluid > div.row > div.col-sm-10::before {
display: none
}
@@ -3855,14 +3965,14 @@ body.remotelogin > div.container-fluid > div.row-fluid > div.col-sm-2 {
background: none;
}
body.register > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a,
body.remotelogin > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a {
body.register > nav.navbar > div > div.navbar-header > a,
body.remotelogin > nav.navbar > div > div.navbar-header > a {
pointer-events: none;
cursor: default
}
body.register > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a:hover,
body.remotelogin > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a:hover {
body.register > nav.navbar > div > div.navbar-header > a:hover,
body.remotelogin > nav.navbar > div > div.navbar-header > a:hover {
background: 0 0 !important;
color: #ccc !important
}
@@ -3968,7 +4078,7 @@ body.remotelogin .well > .caliblur-remote-login-form {
border-left: 4px solid transparent
}
.navigation > ul > li > a > span.hidden-sm {
.navigation > ul > li > a > span.caliblur-nav-label {
display: inline-block !important
}
@@ -4394,7 +4504,7 @@ body.advanced_search > div.container-fluid > div.row-fluid > div.col-sm-10 > div
}
.login .home-btn, .login .plexBack, .register .plexBack, body.login > div.container-fluid > div.row-fluid > div.col-sm-2, body.register > div.container-fluid > div.row-fluid > div.col-sm-2, body.login > div.navbar.navbar-default.navbar-static-top > div > form, body.register > div.navbar.navbar-default.navbar-static-top > div > form, body.remotelogin > div.navbar.navbar-default.navbar-static-top > div > form {
.login .home-btn, .login .plexBack, .register .plexBack, body.login > div.container-fluid > div.row-fluid > div.col-sm-2, body.register > div.container-fluid > div.row-fluid > div.col-sm-2, body.login > nav.navbar > div > form, body.register > nav.navbar > div > form, body.remotelogin > nav.navbar > div > form {
display: none
}
@@ -4408,11 +4518,11 @@ body.remotelogin .plexBack > a {
background: rgba(0, 0, 0, .15)
}
body:not(.blur) > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a#logout {
body:not(.blur) > nav.navbar > div > div.navbar-collapse.collapse > ul > li > a#logout {
display: none
}
body:not(.blur) > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a#top_user {
body:not(.blur) > nav.navbar > div > div.navbar-collapse.collapse > ul > li > a#top_user {
height: 60px;
padding: 0 !important;
background: 0 0 !important;
@@ -4423,11 +4533,11 @@ body.remotelogin .plexBack > a {
right: 15px
}
body:not(.blur) > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a#top_user > span.hidden-sm {
body:not(.blur) > nav.navbar > div > div.navbar-collapse.collapse > ul > li > a#top_user > span.caliblur-nav-label {
display: none
}
body:not(.blur) > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a#top_user > span.glyphicon-user {
body:not(.blur) > nav.navbar > div > div.navbar-collapse.collapse > ul > li > a#top_user > span.glyphicon-user {
width: 30px;
height: 30px;
margin: 15px;
@@ -4435,7 +4545,7 @@ body.remotelogin .plexBack > a {
color: hsla(0, 0%, 100%, .7)
}
body:not(.blur) > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a#top_user > span.glyphicon-user:before {
body:not(.blur) > nav.navbar > div > div.navbar-collapse.collapse > ul > li > a#top_user > span.glyphicon-user:before {
content: '';
display: inline-block;
overflow: hidden;
@@ -4447,7 +4557,7 @@ body.remotelogin .plexBack > a {
height: 30px
}
body:not(.blur) > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a#top_user > span.glyphicon-user:after {
body:not(.blur) > nav.navbar > div > div.navbar-collapse.collapse > ul > li > a#top_user > span.glyphicon-user:after {
content: '';
display: inline-block;
width: 0;
@@ -4459,7 +4569,7 @@ body.remotelogin .plexBack > a {
border-left: 4px solid transparent
}
body:not(.blur) #nav_createshelf, body:not(.blur) #scnd-nav > #nav_about, body:not(.blur) > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li:not(.form-upload) > #form-upload, body:not(.blur) > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li:not(.top_admin) > #top_admin, body:not(.blur) > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li:not(.top_tasks) > #top_tasks {
body:not(.blur) #nav_createshelf, body:not(.blur) #scnd-nav > #nav_about, body:not(.blur) > nav.navbar > div > div.navbar-collapse.collapse > ul > li:not(.form-upload) > #form-upload, body:not(.blur) > nav.navbar > div > div.navbar-collapse.collapse > ul > li:not(.top_admin) > #top_admin, body:not(.blur) > nav.navbar > div > div.navbar-collapse.collapse > ul > li:not(.top_tasks) > #top_tasks {
display: none
}
@@ -5236,7 +5346,7 @@ body.tasks > div.container-fluid > div > div.col-sm-10 > div.discover > div.boot
margin: 0
}
body.login > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a:hover {
body.login > nav.navbar > div > div.navbar-header > a:hover {
color: #ccc !important;
background-color: transparent !important
}
@@ -5303,7 +5413,7 @@ body:not(.search) #shelf-actions, body:not(.search) #shelf-actions > .btn-group,
margin: 0 0 28px
}
#login, .profileDrop + span.hidden-sm {
#login, .profileDrop + span.caliblur-nav-label {
display: none
}
@@ -5488,7 +5598,7 @@ body.editbook > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm
display: block
}
#main-nav + #scnd-nav li a[href*=advanced_search] span.hidden-sm {
#main-nav + #scnd-nav li a[href*=advanced_search] span.caliblur-nav-label {
display: inline-block !important
}
@@ -6004,6 +6114,10 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
}
@media only screen and (max-width: 767px) {
body:not(.read-frame):not(.login):not(.register):not(.remotelogin) {
font-size: 13px;
}
#form-upload .form-group .btn:before, #top_admin > .glyphicon, #top_tasks > .glyphicon-tasks {
-moz-osx-font-smoothing: grayscale;
font-weight: 400;
@@ -6024,7 +6138,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
background-image: none !important
}
.navbar-default {
nav.navbar {
height: 48px;
min-height: 48px
}
@@ -6037,21 +6151,23 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
margin: 0
}
.navbar > .container-fluid > .navbar-header > button.navbar-toggle {
.navbar > .container-fluid > .navbar-header > button.navbar-toggler {
border: 0;
float: left;
padding: 0;
width: 48px;
height: 48px;
margin: 0;
top: 0
top: 0;
display: block;
position: relative;
}
.navbar > .container-fluid > .navbar-header > button.navbar-toggle:active, .navbar > .container-fluid > .navbar-header > button.navbar-toggle:focus, .navbar > .container-fluid > .navbar-header > button.navbar-toggle:hover {
.navbar > .container-fluid > .navbar-header > button.navbar-toggler:active, .navbar > .container-fluid > .navbar-header > button.navbar-toggler:focus, .navbar > .container-fluid > .navbar-header > button.navbar-toggler:hover {
background: 0 0
}
.navbar > .container-fluid > .navbar-header > button.navbar-toggle:before {
.navbar > .container-fluid > .navbar-header > button.navbar-toggler:before {
content: '';
display: inline-block;
overflow: hidden;
@@ -6065,12 +6181,12 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
left: 9px
}
.navbar > .container-fluid > .navbar-header > button.navbar-toggle > span {
.navbar > .container-fluid > .navbar-header > button.navbar-toggler > span {
opacity: 0;
position: absolute
}
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a {
body > nav.navbar > div > div.navbar-header > a {
margin: 0 !important;
height: 48px;
line-height: 48px;
@@ -6078,7 +6194,8 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
background: 0 0 !important;
color: hsla(0, 0%, 100%, .7) !important;
font-family: Open Sans Semibold, Helvetica Neue, Helvetica, Arial, sans-serif;
pointer-events: none
pointer-events: none;
float: left;
}
.home-btn {
@@ -6105,7 +6222,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
line-height: 48px
}
body > div.navbar.navbar-default.navbar-static-top > div > form {
body > nav.navbar > div > form {
margin: 0;
padding: 0;
border: 0;
@@ -6117,7 +6234,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
height: 48px
}
body > div.navbar.navbar-default.navbar-static-top > div > form > div {
body > nav.navbar > div > form > div {
width: 40px;
height: 48px
}
@@ -6134,7 +6251,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
transition: all 0s
}
body > div.navbar.navbar-default.navbar-static-top > div > form.search-focus {
body > nav.navbar > div > form.search-focus {
position: absolute;
top: 0;
left: 0;
@@ -6142,11 +6259,11 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
width: 100vw
}
body > div.navbar.navbar-default.navbar-static-top > div > form.search-focus > div.form-group {
body > nav.navbar > div > form.search-focus > div.form-group {
width: 100vw
}
body > div.navbar.navbar-default.navbar-static-top > div > form.search-focus > div > #query {
body > nav.navbar > div > form.search-focus > div > #query {
width: calc(100vw - 100px) !important;
margin: 0 !important
}
@@ -6161,7 +6278,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
padding-left: 15px
}
body > div.navbar.navbar-default.navbar-static-top > div > form.search-focus > div > .query-search-icon {
body > nav.navbar > div > form.search-focus > div > .query-search-icon {
left: 0;
width: 50px;
height: 48px;
@@ -6172,11 +6289,11 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
cursor: pointer
}
.mobile-navbar-brand, .profileDrop > .profileDropIcon:after, body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul:first-of-type:not(.navbar-right) {
.mobile-navbar-brand, .profileDrop > .profileDropIcon:after, body > nav.navbar > div > div.navbar-collapse.collapse > ul:first-of-type:not(.navbar-right) {
display: none
}
#form-upload > .form-group:before, .profileDrop + span.hidden-sm {
#form-upload > .form-group:before, .profileDrop + span.caliblur-nav-label {
font-family: Open Sans Regular, Helvetica Neue, Helvetica, Arial, sans-serif
}
@@ -6213,12 +6330,12 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
z-index: 99
}
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a.profileDrop {
body > nav.navbar > div > div.navbar-collapse.collapse > ul > li > a.profileDrop {
height: 120px;
width: 100%
}
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a.profileDrop:before {
body > nav.navbar > div > div.navbar-collapse.collapse > ul > li > a.profileDrop:before {
right: auto;
position: absolute;
left: 211px;
@@ -6241,7 +6358,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
top: 0
}
.profileDrop + span.hidden-sm {
.profileDrop + span.caliblur-nav-label {
display: block;
position: absolute;
top: 70px;
@@ -6287,8 +6404,8 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
}
#form-upload .form-group .btn:before {
content: "\e043";
font-family: 'Glyphicons Halflings', serif;
content: "\f193";
font-family: bootstrap-icons;
line-height: 1;
-webkit-font-smoothing: antialiased;
color: #fff;
@@ -6385,7 +6502,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
margin-right: 10px
}
#top_tasks > .glyphicon-tasks::before, body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > #top_admin > .glyphicon-dashboard::before {
#top_tasks > .glyphicon-tasks::before, body > nav.navbar > div > div.navbar-collapse.collapse > ul > li > #top_admin > .glyphicon-dashboard::before {
text-transform: none;
font-family: plex-icons-new, serif;
-webkit-font-smoothing: antialiased;
@@ -6402,13 +6519,13 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
font-size: 16px
}
body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > #top_admin > .glyphicon-dashboard::before {
body > nav.navbar > div > div.navbar-collapse.collapse > ul > li > #top_admin > .glyphicon-dashboard::before {
content: "\EA56";
line-height: 22px;
font-size: 14px
}
#top_admin > span.hidden-sm, #top_tasks > span.hidden-sm {
#top_admin > span.caliblur-nav-label, #top_tasks > span.caliblur-nav-label {
display: inline-block;
line-height: 22px
}
@@ -6468,11 +6585,11 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
margin-left: 12px
}
.navbar-default .navbar-nav .open .dropdown-menu > li > a {
nav.navbar .navbar-nav .open .dropdown-menu > li > a {
color: hsla(0, 0%, 100%, .7)
}
.navbar-default .navbar-nav .open .dropdown-menu > li > a:focus, .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover {
nav.navbar .navbar-nav .open .dropdown-menu > li > a:focus, nav.navbar .navbar-nav .open .dropdown-menu > li > a:hover {
color: #fff;
background-color: hsla(0, 0%, 100%, .08)
}
@@ -6500,11 +6617,11 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
display: none !important
}
.shelforder > .container-fluid > .row-fluid > .col-sm-10 > div.col-sm-6.col-lg-6.col-xs-6 > h2:before, body.advsearch > div.container-fluid > div > div.col-sm-10:before, body.authorlist > div.container-fluid > div > div.col-sm-10 > div.container1:before, body.catlist > div.container-fluid > div > div.col-sm-10 > div.container1:before, body.langlist > div.container-fluid > div > div.col-sm-10 > div.container1:before, body.downloadlist > div.container-fluid > div > div.col-sm-10 > div.container1:before, body.login .navbar > .container-fluid > .navbar-header > button.navbar-toggle, body.serieslist > div.container-fluid > div > div.col-sm-10 > div.container1:before {
.shelforder > .container-fluid > .row-fluid > .col-sm-10 > div.col-sm-6.col-lg-6.col-xs-6 > h2:before, body.advsearch > div.container-fluid > div > div.col-sm-10:before, body.authorlist > div.container-fluid > div > div.col-sm-10 > div.container1:before, body.catlist > div.container-fluid > div > div.col-sm-10 > div.container1:before, body.langlist > div.container-fluid > div > div.col-sm-10 > div.container1:before, body.downloadlist > div.container-fluid > div > div.col-sm-10 > div.container1:before, body.login .navbar > .container-fluid > .navbar-header > button.navbar-toggler, body.serieslist > div.container-fluid > div > div.col-sm-10 > div.container1:before {
display: none
}
body > div.container-fluid > div.row-fluid > div.col-sm-10 {
body > div.container-fluid > div.row > div.col-sm-10 {
width: 100%;
top: 42px;
height: calc(100% - 42px)
@@ -6812,7 +6929,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
margin: 0 10px 10px 0
}
.navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover {
nav.navbar .navbar-nav .open .dropdown-menu > .active > a, nav.navbar .navbar-nav .open .dropdown-menu > .active > a:focus, nav.navbar .navbar-nav .open .dropdown-menu > .active > a:hover {
color: var(--color-primary);
background-color: transparent
}
@@ -7436,7 +7553,7 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
transition: all 0s
}
.navbar-collapse.collapse.in {
.navbar-collapse.collapse.show {
visibility: visible;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
@@ -7464,11 +7581,11 @@ body.edituser.admin > div.container-fluid > div.row-fluid > div.col-sm-10 > div.
opacity: 1
}
.navbar-collapse:not(.in) > * {
.navbar-collapse:not(.show) > * {
margin: 0 !important
}
.navbar-collapse.collapse.in + .sidebar-backdrop {
.navbar-collapse.collapse.show + .sidebar-backdrop {
width: calc(100vw);
height: 100%;
position: fixed;
+68 -13
View File
@@ -27,9 +27,11 @@ input.datepicker {color: transparent}
input.datepicker:focus {color: transparent}
input.datepicker:focus + input {color: #555}
.col-sm-3.col-lg-2.col-xs-6.book.session {
.col-sm-3.col-lg-2.col-6.book.session {
margin-left: 0;
margin-right: 0;
padding-left: 15px;
padding-right: 15px;
}
.caliblur-filterheader {
@@ -37,10 +39,63 @@ input.datepicker:focus + input {color: #555}
padding: 0 10px 0 40px;
}
.caliblur-filterheader .btn {
font-size: 14px;
color: #fff;
}
.caliblur-index .cover,
.caliblur-index .cover img {
border-radius: 0 !important;
}
nav.navbar .profileDrop.dropdown-toggle::after {
display: none;
}
body > .container-fluid > .row {
--bs-gutter-x: 30px;
}
@media only screen and (min-width: 768px) {
nav.navbar #mainNavbar {
display: block !important;
position: absolute;
top: 0;
right: 0;
}
nav.navbar #main-nav {
display: block;
}
#top_admin > span.caliblur-nav-label,
#top_tasks > span.caliblur-nav-label,
.profileDrop + span.caliblur-nav-label {
display: none !important;
}
}
@media only screen and (max-width: 767px) {
.row-fluid > .col-sm-2 {
nav.navbar #main-nav {
float: none;
}
#top_admin > .bi,
#top_tasks > .bi {
margin-right: 10px;
}
}
@media only screen and (max-width: 767px) {
.row > .col-sm-2 {
visibility: hidden;
}
.col-sm-3.col-lg-2.col-6.book.session {
padding-left: 5px;
padding-right: 5px;
}
}
.caliblur-login-panel .btn {
@@ -60,24 +115,24 @@ body.blur #deleteModal .modal-footer .btn {
height: 40px;
}
body.advanced_search > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-md-10.col-lg-6 .twitter-typeahead .tt-hint {
body.advanced_search > div.container-fluid > div.row > div.col-sm-10 > div.col-md-10.col-lg-6 .twitter-typeahead .tt-hint {
background-color: hsla(0, 0%, 100%, .08) !important;
}
body.advanced_search > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-md-10.col-lg-6 .form-group > .row {
body.advanced_search > div.container-fluid > div.row > div.col-sm-10 > div.col-md-10.col-lg-6 .form-group > .row {
margin-left: 0;
margin-right: 0;
}
body.advanced_search > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-md-10.col-lg-6 .form-group > .row > .form-group.col-sm-6:first-child {
body.advanced_search > div.container-fluid > div.row > div.col-sm-10 > div.col-md-10.col-lg-6 .form-group > .row > .form-group.col-sm-6:first-child {
padding-left: 0;
}
body.advanced_search > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-md-10.col-lg-6 .form-group > .row > .form-group.col-sm-6:last-child {
body.advanced_search > div.container-fluid > div.row > div.col-sm-10 > div.col-md-10.col-lg-6 .form-group > .row > .form-group.col-sm-6:last-child {
padding-right: 0;
}
body.blur .input-group-btn > .datepicker_delete.btn.btn-default {
body.blur .datepicker_delete.btn {
display: flex;
align-items: center;
justify-content: center;
@@ -87,7 +142,7 @@ body.blur .input-group-btn > .datepicker_delete.btn.btn-default {
padding: 0 12px;
}
body.blur .rating-clear .glyphicon-remove {
body.blur .rating-clear .bi-x {
color: #fff;
}
@@ -126,15 +181,15 @@ body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover .editabl
color: #fff;
}
body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover .editable-buttons .btn-default {
body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover .editable-buttons .btn-outline-secondary {
background-color: hsla(0, 0%, 100%, .25);
border-color: hsla(0, 0%, 100%, .25);
color: #fff;
}
body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover .editable-buttons .btn-default:hover,
body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover .editable-buttons .btn-default:focus,
body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover .editable-buttons .btn-default:active {
body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover .editable-buttons .btn-outline-secondary:hover,
body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover .editable-buttons .btn-outline-secondary:focus,
body.mailset > div.container-fluid > div > div.col-sm-10 > div.discover .editable-buttons .btn-outline-secondary:active {
background-color: hsla(0, 0%, 100%, .3);
border-color: hsla(0, 0%, 100%, .3);
color: #fff;
@@ -167,7 +222,7 @@ body.dbconfig.admin > div.container-fluid > div > div.col-sm-10 > div.discover {
padding: 0 30px !important;
}
body.dbconfig.admin .caliblur-dbconfig-form .input-group-btn > .btn {
body.dbconfig.admin .caliblur-dbconfig-form .input-group > .btn {
display: flex;
align-items: center;
justify-content: center;
+15 -8
View File
@@ -111,7 +111,7 @@ if ($("body.book").length > 0) {
// Hide dropdown and collapse menus on click-off
$(document).mouseup(function (e) {
var container = new Array();
container.push($(".navbar-collapse.collapse.in"));
container.push($(".navbar-collapse.collapse.show"));
$.each(container, function (key, value) {
if (!$(value).is(e.target) // if the target of the click isn't the container...
@@ -121,7 +121,9 @@ $(document).mouseup(function (e) {
$(value).hide();
} else {
if ($(value).hasClass("collapse")) {
$(value).collapse("toggle");
$(value).each(function () {
bootstrap.Collapse.getOrCreateInstance(this, {toggle: false}).hide();
});
}
}
}
@@ -135,7 +137,7 @@ modalWanted = ["admin", "editbook", "config", "uiconfig", "me", "edituser"];
if ($.inArray(bodyClass[0], modalWanted) != -1) {
} else {
$(" a:not(.dropdown-toggle) ")
.removeAttr("data-toggle", "data-target", "data-remote");
.removeAttr("data-toggle data-target data-remote data-bs-toggle data-bs-target");
}
@@ -221,17 +223,22 @@ $("#add-to-shelves, #remove-from-shelves").on("click", "[data-shelf-action]", fu
// Rest of Tooltips
if ($("body.epub").length === 0) {
$(document).ready(function () {
$("[data-toggle='tooltip']").tooltip({container: "body", trigger: "hover"});
$("[data-toggle-two='tooltip']").tooltip({container: "body", trigger: "hover"});
document.querySelectorAll("[data-bs-toggle='tooltip'], [data-toggle-two='tooltip']").forEach(function (element) {
bootstrap.Tooltip.getOrCreateInstance(element, {container: "body", trigger: "hover"});
});
});
$('[data-toggle-two="tooltip"]').click(function () {
$('[data-toggle-two="tooltip"]').tooltip("hide");
$('[data-toggle-two="tooltip"]').each(function () {
bootstrap.Tooltip.getOrCreateInstance(this).hide();
});
});
$('[data-toggle="tooltip"]').click(function () {
$('[data-toggle="tooltip"]').tooltip("hide");
$('[data-bs-toggle="tooltip"]').click(function () {
$('[data-bs-toggle="tooltip"]').each(function () {
bootstrap.Tooltip.getOrCreateInstance(this).hide();
});
});
}
+2 -3
View File
@@ -57,14 +57,14 @@ $(".datepicker").datepicker({
pubDate = new Date(results[1], parseInt(results[2], 10) - 1, results[3]) || new Date(this.value);
$(this).next('input')
.val(pubDate.toLocaleDateString(language.replaceAll("_","-")))
.removeClass("hidden");
.removeClass("d-none");
}
}).trigger("change");
$(".datepicker_delete").click(function() {
var inputs = $(this).parent().siblings('input');
$(inputs[0]).data('datepicker').clearDates();
$(inputs[1]).addClass('hidden');
$(inputs[1]).addClass('d-none');
});
@@ -293,4 +293,3 @@ $("#xchange").click(function () {
$("#title").val($("#authors").val());
$("#authors").val(title);
});
+37 -43
View File
@@ -1,21 +1,21 @@
{% extends theme("layout.html") %}
{% block body %}
{% if book %}
<div class="col-sm-3 col-lg-3 col-xs-12">
<div class="col-sm-3 col-lg-3 col-12">
<div class="cover">
<!-- Always use full-sized image for the book edit page -->
<img id="detailcover" title="{{book.title}}" src="{{url_for('web.get_cover', book_id=book.id, resolution='og', c=book|last_modified)}}" />
</div>
{% if current_user.role_delete_books() %}
<div class="text-center">
<button type="button" class="btn btn-danger delete-book-btn-tooltip" id="delete" data-toggle="modal" data-delete-id="{{ book.id }}" data-target="#deleteModal" data-toggle-two="tooltip" data-placement="bottom" data-viewport=".btn-toolbar" title="{{_('Delete Book')}}">{{_("Delete Book")}}</button>
<button type="button" class="btn btn-danger delete-book-btn-tooltip" id="delete" data-bs-toggle="modal" data-delete-id="{{ book.id }}" data-bs-target="#deleteModal" data-toggle-two="tooltip" data-bs-placement="bottom" data-viewport=".btn-toolbar" title="{{_('Delete Book')}}">{{_("Delete Book")}}</button>
</div>
{% if book.data|length > 1 %}
<div class="text-center more-stuff">
<button id="deleteButton" type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="glyphicon glyphicon-remove"></span>{{_('Delete Format')}}<span class="caret"></span></button>
<button id="deleteButton" type="button" class="btn btn-danger dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false"><i class="bi bi-x"></i>{{_('Delete Format')}}</button>
<ul class="dropdown-menu delete-dropdown">
{% for file in book.data %}
<li><button type="button" class="btn btn-danger" id="delete_format" data-toggle="modal" data-delete-id="{{ book.id }}" data-delete-format="{{ file.format }}" data-target="#deleteModal">{{_('Delete')}} - {{file.format}}</button></li>
<li><button type="button" class="btn btn-danger" id="delete_format" data-bs-toggle="modal" data-delete-id="{{ book.id }}" data-delete-format="{{ file.format }}" data-bs-target="#deleteModal">{{_('Delete')}} - {{file.format}}</button></li>
{% endfor %}
</ul>
</div>
@@ -44,7 +44,7 @@
</select>
</div>
</div>
<button type="submit" class="btn btn-primary" id="btn-book-convert" name="btn-book-convert"><span class="glyphicon glyphicon-duplicate"></span> {{_('Convert book')}}</button>
<button type="submit" class="btn btn-primary" id="btn-book-convert" name="btn-book-convert"><i class="bi bi-copy"></i> {{_('Convert book')}}</button>
</form>
</div>
{% endif %}
@@ -67,14 +67,14 @@
</div>
<form role="form" action="{{ url_for('edit-book.edit_book', book_id=book.id) }}" method="post" enctype="multipart/form-data" id="book_edit_frm">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<div class="col-sm-9 col-xs-12">
<div class="col-sm-9 col-12">
<h2>{{_('Edit Metadata')}}</h2>
<div class="form-group">
<label for="title">{{_('Book Title')}}</label>
<input type="text" class="form-control" name="title" id="title" value="{{book.title}}">
</div>
<div class="text-center">
<button type="button" class="btn btn-default" id="xchange" ><span class="glyphicon glyphicon-arrow-up"></span><span class="glyphicon glyphicon-arrow-down"></span></button>
<button type="button" class="btn btn-outline-secondary" id="xchange" ><i class="bi bi-arrow-up"></i><i class="bi bi-arrow-down"></i></button>
</div>
<div id="author_div" class="form-group">
<label for="bookAuthor">{{_('Author')}}</label>
@@ -95,10 +95,8 @@
<label for="pubdate">{{_('Published Date')}}</label>
<div class="form-group input-group">
<input type="text" class="datepicker 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 %}">
<span class="input-group-btn">
<button type="button" id="pubdate_delete" class="datepicker_delete btn btn-default"><span class="glyphicon glyphicon-remove-circle"></span></button>
</span>
<input type="text" class="form-control fake-input d-none" id="fake_pubdate" value="{% if book.pubdate %}{{book.pubdate|formatdate}}{% endif %}">
<button type="button" id="pubdate_delete" class="datepicker_delete btn btn-outline-secondary"><i class="bi bi-x-circle"></i></button>
</div>
<div class="form-group">
<label for="publisher">{{_('Publisher')}}</label>
@@ -123,12 +121,12 @@
<tr>
<td><input type="text" class="form-control" name="identifier-type-{{identifier.type}}" value="{{identifier.type}}" required="required" placeholder="{{_('Identifier Type')}}"></td>
<td><input type="text" class="form-control" name="identifier-val-{{identifier.type}}" value="{{identifier.val}}" required="required" placeholder="{{_('Identifier Value')}}"></td>
<td><a class="btn btn-default" onclick="removeIdentifierLine(this)">{{_('Remove')}}</a></td>
<td><a class="btn btn-outline-secondary" onclick="removeIdentifierLine(this)">{{_('Remove')}}</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<a id="add-identifier-line" class="btn btn-default">{{_('Add Identifier')}}</a>
<a id="add-identifier-line" class="btn btn-outline-secondary">{{_('Add Identifier')}}</a>
</div>
{% if current_user.role_upload() and g.allow_upload %}
<div class="form-group">
@@ -176,13 +174,11 @@
{% if book['custom_column_' ~ c.id]|length > 0 %}
value="{% if book['custom_column_' ~ c.id][0].value %}{{ book['custom_column_' ~ c.id][0].value|formatdateinput}}{% endif %}"
{% endif %}>
<input type="text" class="fake_custom_column_{{ c.id }} form-control fake-input hidden" id="fake_pubdate_{{ c.id }}"
<input type="text" class="fake_custom_column_{{ c.id }} form-control fake-input d-none" id="fake_pubdate_{{ c.id }}"
{% if book['custom_column_' ~ c.id]|length > 0 %}
value="{% if book['custom_column_' ~ c.id][0].value %}{{book['custom_column_' ~ c.id][0].value|formatdate}}{% endif %}"
{% endif %}>
<span class="input-group-btn">
<button type="button" id="{{ 'custom_column_' ~ c.id }}_delete" class="datepicker_delete btn btn-default"><span class="glyphicon glyphicon-remove-circle"></span></button>
</span>
<button type="button" id="{{ 'custom_column_' ~ c.id }}_delete" class="datepicker_delete btn btn-outline-secondary"><i class="bi bi-x-circle"></i></button>
</div>
{% endif %}
@@ -217,9 +213,9 @@
<input name="detail_view" type="checkbox" checked> {{_('View Book on Save')}}
</label>
</div>
<a href="#" id="get_meta" class="btn btn-default" data-toggle="modal" data-target="#metaModal">{{_('Fetch Metadata')}}</a>
<button type="submit" id="submit" class="btn btn-default">{{_('Save')}}</button>
<a href="{{ url_for('web.show_book', book_id=book.id) }}" id="edit_cancel" class="btn btn-default">{{_('Cancel')}}</a>
<a href="#" id="get_meta" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#metaModal">{{_('Fetch Metadata')}}</a>
<button type="submit" id="submit" class="btn btn-primary">{{_('Save')}}</button>
<a href="{{ url_for('web.show_book', book_id=book.id) }}" id="edit_cancel" class="btn btn-outline-secondary">{{_('Cancel')}}</a>
</div>
</form>
@@ -234,20 +230,18 @@
<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">&times;</span></button>
<h4 class="modal-title text-center" id="metaModalLabel">{{_('Fetch 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">{{_("Search")}}</button>
</span>
</div>
</form>
<div class="text-center"><strong>{{_('Click the cover to load metadata to the form')}}</strong></div>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{_('Close')}}"></button>
</div>
<div class="modal-body">
<form class="padded-bottom" id="meta-search">
<div class="input-group">
<label class="sr-only visually-hidden" for="keyword">{{_('Keyword')}}</label>
<input type="text" class="form-control" id="keyword" name="keyword" placeholder="{{_("Search keyword")}}">
<button type="submit" class="btn btn-primary" id="do-search">{{_("Search")}}</button>
</div>
</form>
<div class="text-center padded-bottom"><strong>{{_('Click the cover to load metadata to the form')}}</strong></div>
<div class="text-center padded-bottom" id="metadata_provider">
</div>
@@ -256,7 +250,7 @@
</div>
</div>
<div class="modal-footer">
<button id="meta_close" type="button" class="btn btn-default" data-dismiss="modal">{{_('Close')}}</button>
<button id="meta_close" type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">{{_('Close')}}</button>
</div>
</div>
</div>
@@ -265,25 +259,25 @@
{% 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"
<li class="media d-flex mb-3" data-related="<%- source.id %>">
<img class="pull-left img-responsive img-fluid flex-shrink-0"
data-bs-toggle="modal"
data-bs-target="#metaModal"
src="<%- cover || '{{ url_for('static', filename='img/academicpaper.svg') }}' %>"
alt="Cover"
>
<div class="media-body">
<h4 class="media-heading">
<div class="media-body flex-grow-1 ms-3">
<h4 class="media-heading mb-1">
<a class="meta_title" href="<%- url %>" target="_blank" rel="noopener"><%- title %></a>
</h4>
<p class="meta_author">{{_('Author')}}:<%- authors.join(" & ") %></p>
<p class="meta_author mb-1">{{_('Author')}}:<%- authors.join(" & ") %></p>
<% if (publisher) { %>
<p class="meta_publisher">{{_('Publisher')}}:<%- publisher %></p>
<p class="meta_publisher mb-1">{{_('Publisher')}}:<%- publisher %></p>
<% } %>
<% if (description) { %>
<p class="meta_description">{{_('Description')}}: <%- description %></p>
<p class="meta_description mb-1">{{_('Description')}}: <%- description %></p>
<% } %>
<p>{{_('Source')}}:
<p class="mb-0">{{_('Source')}}:
<a class="meta_source" href="<%- source.link %>" target="_blank" rel="noopener"><%- source.description %></a>
</p>
</div>
@@ -307,7 +301,7 @@
var line = '<tr>';
line += '<td><input type="text" class="form-control" name="identifier-type-'+ rand_id +'" required="required" placeholder={{_('Identifier Type')|safe|tojson}}></td>';
line += '<td><input type="text" class="form-control" name="identifier-val-'+ rand_id +'" required="required" placeholder={{_('Identifier Value')|safe|tojson}}></td>';
line += '<td><a class="btn btn-default" onclick="removeIdentifierLine(this)">{{_('Remove')}}</a></td>';
line += '<td><a class="btn btn-outline-secondary" onclick="removeIdentifierLine(this)">{{_('Remove')}}</a></td>';
line += '</tr>';
$("#identifier-table").append(line);
});
+6 -10
View File
@@ -1,6 +1,6 @@
{% extends theme("layout.html") %}
{% block flash %}
<div id="spinning_success" class="row-fluid text-center" style="display:none;">
<div id="spinning_success" class="row text-center" style="display:none;">
<div class="alert alert-info"><img id="img-spinner" src="{{ url_for('static', filename='css/libs/images/loading-icon.gif') }}" alt="" aria-hidden="true"></div>
</div>
{% endblock %}
@@ -13,9 +13,7 @@
<label for="config_calibre_dir">{{ _('Location of Calibre Database') }}</label>
<div class="form-group required input-group">
<input type="text" class="form-control" id="config_calibre_dir" name="config_calibre_dir" value="{% if config.config_calibre_dir != None %}{{ config.config_calibre_dir }}{% endif %}" autocomplete="off">
<span class="input-group-btn">
<button type="button" data-toggle="modal" id="calibre_modal_path" data-link="config_calibre_dir" data-filefilter="metadata.db" data-target="#fileModal" class="btn btn-default"><span class="glyphicon glyphicon-folder-open"></span></button>
</span>
<button type="button" data-bs-toggle="modal" id="calibre_modal_path" data-link="config_calibre_dir" data-filefilter="metadata.db" data-bs-target="#fileModal" class="btn btn-outline-secondary"><i class="bi bi-folder2-open"></i></button>
</div>
<div class="form-group required">
<input type="checkbox" id="config_calibre_split" name="config_calibre_split" data-control="split_settings" data-t ="{{ config.config_calibre_split_dir }}" {% if config.config_calibre_split %}checked{% endif %}>
@@ -24,9 +22,7 @@
<div data-related="split_settings">
<div class="form-group required input-group">
<input type="text" class="form-control" id="config_calibre_split_dir" name="config_calibre_split_dir" value="{% if config.config_calibre_split_dir != None %}{{ config.config_calibre_split_dir }}{% endif %}" autocomplete="off">
<span class="input-group-btn">
<button type="button" data-toggle="modal" id="calibre_modal_split_path" data-link="config_calibre_split_dir" data-filefilter="" data-target="#fileModal" class="btn btn-default"><span class="glyphicon glyphicon-folder-open"></span></button>
</span>
<button type="button" data-bs-toggle="modal" id="calibre_modal_split_path" data-link="config_calibre_split_dir" data-filefilter="" data-bs-target="#fileModal" class="btn btn-outline-secondary"><i class="bi bi-folder2-open"></i></button>
</div>
</div>
{% if feature_support['gdrive'] %}
@@ -53,7 +49,7 @@
<label for="config_google_drive_watch_changes_response">{{ _('Metadata Watch Channel ID') }}</label>
<div class="form-group input-group required">
<input type="text" class="form-control" name="config_google_drive_watch_changes_response" id="config_google_drive_watch_changes_response" value="{{ config.config_google_drive_watch_changes_response['id'] }} expires on {{ config.config_google_drive_watch_changes_response['expiration'] | strftime }}" autocomplete="off" disabled="">
<span class="input-group-btn"><a href="{{ url_for('gdrive.revoke_watch_gdrive') }}" id="watch_revoke" class="btn btn-primary">{{ _('Revoke') }}</a></span>
<a href="{{ url_for('gdrive.revoke_watch_gdrive') }}" id="watch_revoke" class="btn btn-primary">{{ _('Revoke') }}</a>
</div>
{% else %}
<a href="{{ url_for('gdrive.watch_gdrive') }}" id="enable_gdrive_watch" class="btn btn-primary">Enable watch of metadata.db</a>
@@ -66,7 +62,7 @@
<div class="col-sm-12 clearfix caliblur-dbconfig-actions">
<div class="pull-right">
<a href="{{ url_for('admin.admin') }}" id="config_back" class="btn btn-primary">{{ _('Cancel') }}</a>
<button id="db_submit" type="submit" form="db_config_form" class="btn btn-default">{{ _('Save') }}</button>
<button id="db_submit" type="submit" form="db_config_form" class="btn btn-outline-secondary">{{ _('Save') }}</button>
</div>
</div>
</form>
@@ -83,7 +79,7 @@
<div class="modal-body text-center">
<p>{{ _('New db location is invalid, please enter valid path') }}</p>
<p></p>
<button type="button" class="btn btn-default" id="invalid_confirm" data-dismiss="modal">{{ _('OK') }}</button>
<button type="button" class="btn btn-outline-secondary" id="invalid_confirm" data-bs-dismiss="modal">{{ _('OK') }}</button>
</div>
</div>
</div>
+37 -47
View File
@@ -10,7 +10,7 @@
{% block body %}
<div class="single">
<div class="row">
<div class="col-sm-3 col-lg-3 col-xs-5">
<div class="col-sm-3 col-lg-3 col-5">
<div class="cover">
<!-- Always use full-sized image for the detail page -->
<img id="detailcover" title="{{ entry.title }}"
@@ -26,11 +26,10 @@
<div class="btn-group" role="group" aria-label="Add to shelves">
<button id="add-to-shelf" type="button"
class="btn btn-primary btn-sm dropdown-toggle addtoshelf-btn-tooltip"
data-toggle-two="tooltip" title="{{ _('Add to shelf') }}" data-placement="bottom" data-viewport=".btn-toolbar"
data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-list"></span> {{ _('Add to shelf') }}
<span class="caret"></span>
data-toggle-two="tooltip" title="{{ _('Add to shelf') }}" data-bs-placement="bottom" data-viewport=".btn-toolbar"
data-bs-toggle="dropdown"
aria-expanded="false">
<i class="bi bi-list"></i> {{ _('Add to shelf') }}
</button>
<ul id="add-to-shelves" class="dropdown-menu" aria-labelledby="add-to-shelf">
{% for shelf in g.shelves_access %}
@@ -55,11 +54,11 @@
{% if shelf.id in books_shelfs %}
<a data-href="{{ url_for('shelf.remove_from_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
data-add-href="{{ url_for('shelf.add_to_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
class="btn btn-sm btn-default" role="button"
class="btn btn-sm btn-outline-secondary" role="button"
data-shelf-action="remove"
>
<span {% if not shelf.is_public or current_user.role_edit_shelfs() %}
class="glyphicon glyphicon-remove"
class="bi bi-x"
{% endif %}></span> {{ shelf.name }}{% if shelf.is_public == 1 %} {{ _('(Public)') }}{% endif %}
</a>
{% endif %}
@@ -75,11 +74,11 @@
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<label class="block-label">
<input id="have_read_cb" class="readunread-btn-tooltip" type="checkbox"
data-toggle="tooltip" data-placement="bottom" data-viewport=".btn-toolbar"
data-bs-toggle="tooltip" data-bs-placement="bottom" data-viewport=".btn-toolbar"
title="{% if entry.read_status %}{{ _('Mark As Unread') }}{% else %}{{ _('Mark As Read') }}{% endif %}"
{% if entry.read_status %}checked{% endif %}>
<label class="block-label readLbl" for="have_read_cb"></label>
<span data-toggle="tooltip" title="{{_('Mark Book as Read or Unread')}}">{{ _('Read') }}</span>
<span data-bs-toggle="tooltip" title="{{_('Mark Book as Read or Unread')}}">{{ _('Read') }}</span>
</label>
</form>
</div>
@@ -88,9 +87,9 @@
<div class="btn-group" role="group" aria-label="Edit book">
<a href="{{ url_for('edit-book.show_edit_book', book_id=entry.id) }}"
class="btn btn-primary edit-btn-tooltip" id="edit_book" role="button"
data-toggle="tooltip" title="{{ _('Edit Metadata') }}" data-placement="bottom" data-viewport=".btn-toolbar">
<span class="edit-book-icon" data-toggle="tooltip" title="{{ _('Edit Metadata') }}"
data-placement="bottom" data-viewport=".btn-toolbar"></span> {{ _('Edit Metadata') }}
data-bs-toggle="tooltip" title="{{ _('Edit Metadata') }}" data-bs-placement="bottom" data-viewport=".btn-toolbar">
<span class="edit-book-icon" data-bs-toggle="tooltip" title="{{ _('Edit Metadata') }}"
data-bs-placement="bottom" data-viewport=".btn-toolbar"></span> {{ _('Edit Metadata') }}
</a>
</div>
{% endif %}
@@ -100,8 +99,8 @@
{% if entry.data|length > 0 %}
<button id="btnGroupDrop1" type="button" class="btn btn-primary"
aria-haspopup="true" aria-expanded="false"
data-toggle-two="tooltip" title="" data-placement="bottom" data-viewport=".btn-toolbar"
data-original-title="Download :"><span class="glyphicon glyphicon-download"></span>Download :<span class="caret"></span></button>
data-toggle-two="tooltip" title="" data-bs-placement="bottom" data-viewport=".btn-toolbar"
data-original-title="Download :"><i class="bi bi-download"></i>Download :</button>
<ul class="dropdown-menu" aria-labelledby="btnGroupDrop1">
{% for format in entry.data %}
<li>
@@ -117,16 +116,15 @@
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
{% if entry.email_share_list.__len__() == 1 %}
<div class="btn-group sendBtn" role="group">
<button id="sendbtn" class="btn btn-primary sendbtn-form send-btn-tooltip" data-href="{{url_for('web.send_to_ereader', book_id=entry.id, book_format=entry.email_share_list[0]['format'], convert=entry.email_share_list[0]['convert'])}}" data-toggle="tooltip" data-placement="bottom" data-viewport=".btn-toolbar" title="{{ entry.email_share_list[0]['text'] }}">
<span class="glyphicon glyphicon-send"></span> {{entry.email_share_list[0]['text']}}
<button id="sendbtn" class="btn btn-primary sendbtn-form send-btn-tooltip" data-href="{{url_for('web.send_to_ereader', book_id=entry.id, book_format=entry.email_share_list[0]['format'], convert=entry.email_share_list[0]['convert'])}}" data-bs-toggle="tooltip" data-bs-placement="bottom" data-viewport=".btn-toolbar" title="{{ entry.email_share_list[0]['text'] }}">
<i class="bi bi-send"></i> {{entry.email_share_list[0]['text']}}
</button>
</div>
{% else %}
<div class="btn-group sendBtn" role="group">
<button id="sendbtn2" type="button" class="btn btn-primary dropdown-toggle send-btn-tooltip"
data-toggle="dropdown" data-toggle-two="tooltip" data-placement="bottom" data-viewport=".btn-toolbar" title="{{ _('Send to eReader') }}" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-send"></span>{{ _('Send to eReader') }}
<span class="caret"></span>
data-bs-toggle="dropdown" data-toggle-two="tooltip" data-bs-placement="bottom" data-viewport=".btn-toolbar" title="{{ _('Send to eReader') }}" aria-expanded="false">
<i class="bi bi-send"></i>{{ _('Send to eReader') }}
</button>
<ul class="dropdown-menu" aria-labelledby="send-to-ereader">
{% for format in entry.email_share_list %}
@@ -143,9 +141,8 @@
<div class="btn-group readBtn" role="group">
{% if entry.reader_list|length > 1 %}
<button id="read-in-browser" type="button" class="btn btn-primary dropdown-toggle send-btn-tooltip"
data-toggle="dropdown" data-toggle-two="tooltip" data-placement="bottom" data-viewport=".btn-toolbar" title="{{ _('Read in Browser') }}" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-book"></span> {{ _('Read in Browser') }}
<span class="caret"></span>
data-bs-toggle="dropdown" data-toggle-two="tooltip" data-bs-placement="bottom" data-viewport=".btn-toolbar" title="{{ _('Read in Browser') }}" aria-expanded="false">
<i class="bi bi-book"></i> {{ _('Read in Browser') }}
</button>
<ul class="dropdown-menu" aria-labelledby="read-in-browser">
{% for format in entry.reader_list %}
@@ -158,9 +155,8 @@
<a target="_blank"
href="{{ url_for('web.read_book', book_id=entry.id, book_format=entry.reader_list[0]) }}"
id="readbtn" class="btn btn-primary" role="button"
data-toggle-two="tooltip" data-placement="bottom" data-viewport=".btn-toolbar"
title="{{ _('Read in Browser') }}"><span
class="glyphicon glyphicon-book"></span> {{ _('Read in Browser') }}
data-toggle-two="tooltip" data-bs-placement="bottom" data-viewport=".btn-toolbar"
title="{{ _('Read in Browser') }}"><i class="bi bi-book"></i> {{ _('Read in Browser') }}
- {{ entry.reader_list[0] }}</a>
{% endif %}
</div>
@@ -168,9 +164,8 @@
{% if entry.audio_entries|length > 0 and current_user.role_viewer() %}
<div class="btn-group listenBtn" role="group">
{% if entry.audio_entries|length > 1 %}
<button id="listen-in-browser" type="button" class="btn btn-primary dropdown-toggle send-btn-tooltip" data-toggle="dropdown" data-toggle-two="tooltip" data-placement="bottom" data-viewport=".btn-toolbar" title="{{ _('Listen in Browser') }}" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-music"></span> {{ _('Listen in Browser') }}
<span class="caret"></span>
<button id="listen-in-browser" type="button" class="btn btn-primary dropdown-toggle send-btn-tooltip" data-bs-toggle="dropdown" data-toggle-two="tooltip" data-bs-placement="bottom" data-viewport=".btn-toolbar" title="{{ _('Listen in Browser') }}" aria-expanded="false">
<i class="bi bi-music-note"></i> {{ _('Listen in Browser') }}
</button>
<ul class="dropdown-menu" aria-labelledby="listen-in-browser">
{% for format in entry.reader_list %}
@@ -179,17 +174,12 @@
{% endfor %}
</ul>
<ul class="dropdown-menu" aria-labelledby="listen-in-browser">
{% for format in entry.data %}
{% if format.format|lower in entry.audio_entries %}
<li><a
href="{{ url_for('web.read_book', book_id=entry.id, book_format=format.format|lower) }}">{{ format.format|lower }}</a>
</li>
{% endif %}
{% for format in entry.audio_entries %}
<li><a href="{{ url_for('web.read_book', book_id=entry.id, book_format=format) }}">{{ format }}</a></li>
{% endfor %}
</ul>
{% else %}
<a target="_blank" href="{{ url_for('web.read_book', book_id=entry.id, book_format=entry.audio_entries[0]) }}" id="listenbtn" class="btn btn-primary" role="button"><span class="glyphicon glyphicon-music"></span> {{ _('Listen in Browser') }} - {{ entry.audio_entries[0] }}</a>
<a target="_blank" href="{{ url_for('web.read_book', book_id=entry.id, book_format=entry.audio_entries[0]) }}" id="listenbtn" class="btn btn-primary" role="button"><i class="bi bi-music-note"></i> {{ _('Listen in Browser') }} - {{ entry.audio_entries[0] }}</a>
{% endif %}
</div>
{% endif %}
@@ -209,10 +199,10 @@
<div class="rating">
<p>
{% for number in range((entry.ratings[0].rating/2)|int(2)) %}
<span class="glyphicon glyphicon-star good"></span>
<i class="bi bi-star-fill good"></i>
{% if loop.last and loop.index < 5 %}
{% for numer in range(5 - loop.index) %}
<span class="glyphicon glyphicon-star-empty"></span>
<i class="bi bi-star"></i>
{% endfor %}
{% endif %}
{% endfor %}
@@ -227,7 +217,7 @@
{% if entry.languages|length > 0 %}
<div class="languages">
<p>
<span class="label label-default">{{_('Language')}}: {% for language in entry.languages %}{{language.language_name}}{% if not loop.last %}, {% endif %}{% endfor %}</span>
<span class="badge text-bg-secondary">{{_('Language')}}: {% for language in entry.languages %}{{language.language_name}}{% if not loop.last %}, {% endif %}{% endfor %}</span>
</p>
</div>
{% endif %}
@@ -235,7 +225,7 @@
{% if entry.identifiers|length > 0 %}
<div class="identifiers">
<p>
<span class="glyphicon glyphicon-link"></span>
<i class="bi bi-link-45deg"></i>
{% for identifier in entry.identifiers %}
{% set identifier_link = identifier.__repr__() %}
{% if identifier_link != identifier.val %}
@@ -253,7 +243,7 @@
<div class="tags">
<p>
<span class="glyphicon glyphicon-tags"></span>
<i class="bi bi-tags"></i>
{% for tag in entry.tags %}
<a href="{{ url_for('web.books_list', data='category', sort_param='stored', book_id=tag.id) }}"
@@ -292,9 +282,9 @@
{% else %}
{% if c.datatype == 'bool' %}
{% if column.value == true %}
<span class="glyphicon glyphicon-ok"></span>
<i class="bi bi-check"></i>
{% else %}
<span class="glyphicon glyphicon-remove"></span>
<i class="bi bi-x"></i>
{% endif %}
{% else %}
{% if c.datatype == 'float' %}
@@ -343,7 +333,7 @@
{% if current_user.role_edit() %}
<div class="col-sm-12">
<div class="btn btn-default" data-back="{{ url_for('web.index') }}" id="back">{{_('Cancel')}}</div>
<div class="btn btn-outline-secondary" data-back="{{ url_for('web.index') }}" id="back">{{_('Cancel')}}</div>
</div>
{% endif %}
</div>
@@ -361,9 +351,9 @@
</li>
</script>
<script type="text/template" id="template-shelf-remove">
<a data-href="<%= remove %>" data-add-href="<%= add %>" class="btn btn-sm btn-default"
<a data-href="<%= remove %>" data-add-href="<%= add %>" class="btn btn-sm btn-outline-secondary"
data-shelf-action="remove">
<span class="glyphicon glyphicon-remove"></span> <%= content %>
<i class="bi bi-x"></i> <%= content %>
</a>
</script>
<script src="{{ url_for('static', filename='js/details.js') }}"></script>
@@ -21,7 +21,7 @@
<div data-related="email-settings-1">
<div class="form-group">
{% if content.mail_gmail_token == {} %}
<button type="submit" id="gmail_server" name="gmail" value="submit" class="btn btn-default">{{_('Setup Gmail Account')}}</button>
<button type="submit" id="gmail_server" name="gmail" value="submit" class="btn btn-outline-secondary">{{_('Setup Gmail Account')}}</button>
{% else %}
<button type="submit" id="invalidate_server" name="invalidate" value="submit" class="btn btn-danger">{{_('Revoke Gmail Access')}}</button>
{% endif %}
@@ -60,9 +60,7 @@
<label for="mail_size">{{_('Attachment Size Limit')}}</label>
<div class="form-group input-group">
<input type="number" min="1" max="600" step="1" class="form-control" name="mail_size" id="mail_size" value="{% if content.mail_size != None %}{{ (content.mail_size / 1024 / 1024)|int }}{% endif %}" style="height: 40px;" required>
<span class="input-group-btn">
<button type="button" id="attachement_size" class="btn btn-default" style="height: 40px; margin-bottom: 0;" disabled>MB</button>
</span>
<button type="button" id="attachement_size" class="btn btn-outline-secondary" style="height: 40px; margin-bottom: 0;" disabled>MB</button>
</div>
{% if feature_support['gmail'] %}
</div>
@@ -70,8 +68,8 @@
<div class="clearfix">
<div class="pull-right">
<a href="{{ url_for('admin.admin') }}" id="config_back" class="btn btn-primary" style="margin-bottom: 10px;">{{_('Cancel')}}</a>
<button type="submit" name="submit" value="submit" class="btn btn-default">{{_('Save')}}</button>
<button type="submit" name="test" value="test" class="btn btn-default">{{_('Save and Send Test Email')}}</button>
<button type="submit" name="submit" value="submit" class="btn btn-outline-secondary">{{_('Save')}}</button>
<button type="submit" name="test" value="test" class="btn btn-outline-secondary">{{_('Save and Send Test Email')}}</button>
</div>
</div>
</form>
@@ -84,7 +82,7 @@
<label for="domainname_allow">{{_('Add Domain')}}</label>
<input type="text" class="form-control" name="domainname" id="domainname_allow" >
</div>
<button id="domain_allow_submit" class="btn btn-default">{{_('Add')}}</button>
<button id="domain_allow_submit" class="btn btn-outline-secondary">{{_('Add')}}</button>
</form>
<table class="table table-no-bordered" id="domain-allow-table" data-url="{{url_for('admin.list_domain', allow=1)}}" data-id-field="id" data-show-header="false" data-editable-mode="inline" data-locale="{{ current_user.locale }}">
<thead>
@@ -111,7 +109,7 @@
<label for="domainname_deny">{{_('Add Domain')}}</label>
<input type="text" class="form-control" name="domainname" id="domainname_deny" >
</div>
<button id="domain_deny_submit" class="btn btn-default">{{_('Add')}}</button>
<button id="domain_deny_submit" class="btn btn-outline-secondary">{{_('Add')}}</button>
</form>
</div>
{% endif %}
@@ -17,7 +17,7 @@
<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/bootstrap.min.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/libs/bootstrap5.min.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/caliBlur.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/caliBlur_override.css') }}" rel="stylesheet" media="screen">
+26 -26
View File
@@ -6,17 +6,17 @@
<h2 class="random-books">{{_('Discover (Random Books)')}}</h2>
<div class="row display-flex">
{% for entry in random %}
<div class="col-sm-3 col-lg-2 col-xs-6 book session" id="books_rand">
<div class="col-sm-3 col-lg-2 col-6 book session" id="books_rand">
<div class="cover">
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-toggle="modal" data-target="#bookDetailsModal" data-remote="false"{% endif %}>
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-bs-toggle="modal" data-bs-target="#bookDetailsModal"{% endif %}>
<span class="img" title="{{ entry.Books.title }}">
{{ image.book_cover(entry.Books) }}
{% if entry[2] == True %}<span class="badge read glyphicon glyphicon-ok"></span>{% endif %}
{% if entry[2] == True %}<span class="badge read bi bi-check"></span>{% endif %}
</span>
</a>
</div>
<div class="meta">
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-toggle="modal" data-target="#bookDetailsModal" data-remote="false"{% endif %}>
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-bs-toggle="modal" data-bs-target="#bookDetailsModal"{% endif %}>
<p title="{{entry.Books.title}}" class="title">{{entry.Books.title|shortentitle}}</p>
</a>
<p class="author">
@@ -48,10 +48,10 @@
{% if entry.Books.ratings.__len__() > 0 %}
<div class="rating">
{% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %}
<span class="glyphicon glyphicon-star good"></span>
<i class="bi bi-star-fill good"></i>
{% if loop.last and loop.index < 5 %}
{% for numer in range(5 - loop.index) %}
<span class="glyphicon glyphicon-star-empty"></span>
<i class="bi bi-star"></i>
{% endfor %}
{% endif %}
{% endfor %}
@@ -66,22 +66,22 @@
<div class="discover load-more caliblur-index">
<h2 class="{{title}}">{{title}}</h2>
{% if page != 'discover' %}
<div class="filterheader caliblur-filterheader hidden-xs">
<div class="filterheader caliblur-filterheader d-none d-md-block">
{% if page == 'hot' %}
<a data-toggle="tooltip" title="{{_('Sort ascending according to download count')}}" id="hot_asc" class="btn btn-primary{% if order == "hotasc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='hotasc')}}"><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a data-toggle="tooltip" title="{{_('Sort descending according to download count')}}" id="hot_desc" class="btn btn-primary{% if order == "hotdesc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='hotdesc')}}"><span class="glyphicon glyphicon-sort-by-order-alt"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort ascending according to download count')}}" id="hot_asc" class="btn btn-primary{% if order == "hotasc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='hotasc')}}"><span class="bi bi-sort-numeric-down"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort descending according to download count')}}" id="hot_desc" class="btn btn-primary{% if order == "hotdesc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='hotdesc')}}"><span class="bi bi-sort-numeric-down-alt"></span></a>
{% else %}
<a data-toggle="tooltip" title="{{_('Sort according to book date, newest first')}}" id="new" class="btn btn-primary{% if order == "new" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='new')}}"><span class="glyphicon glyphicon-book"></span> <span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a data-toggle="tooltip" title="{{_('Sort according to book date, oldest first')}}" id="old" class="btn btn-primary{% if order == "old" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='old')}}"><span class="glyphicon glyphicon-book"></span> <span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order-alt"></span></a>
<a data-toggle="tooltip" title="{{_('Sort title in alphabetical order')}}" id="asc" class="btn btn-primary{% if order == "abc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='abc')}}"><span class="glyphicon glyphicon-font"></span><span class="glyphicon glyphicon-sort-by-alphabet"></span></a>
<a data-toggle="tooltip" title="{{_('Sort title in reverse alphabetical order')}}" id="desc" class="btn btn-primary{% if order == "zyx" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='zyx')}}"><span class="glyphicon glyphicon-font"></span><span class="glyphicon glyphicon-sort-by-alphabet-alt"></span></a>
<a data-toggle="tooltip" title="{{_('Sort authors in alphabetical order')}}" id="auth_az" class="btn btn-primary{% if order == "authaz" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='authaz')}}"><span class="glyphicon glyphicon-user"></span><span class="glyphicon glyphicon-sort-by-alphabet"></span></a>
<a data-toggle="tooltip" title="{{_('Sort authors in reverse alphabetical order')}}" id="auth_za" class="btn btn-primary{% if order == "authza" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='authza')}}"><span class="glyphicon glyphicon-user"></span><span class="glyphicon glyphicon-sort-by-alphabet-alt"></span></a>
<a data-toggle="tooltip" title="{{_('Sort according to publishing date, newest first')}}" id="pub_new" class="btn btn-primary{% if order == "pubnew" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='pubnew')}}"><span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a data-toggle="tooltip" title="{{_('Sort according to publishing date, oldest first')}}" id="pub_old" class="btn btn-primary{% if order == "pubold" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='pubold')}}"><span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order-alt"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort according to book date, newest first')}}" id="new" class="btn btn-primary{% if order == "new" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='new')}}"><span class="bi bi-book-fill"></span> <span class="bi bi-calendar3"></span><span class="bi bi-sort-numeric-down"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort according to book date, oldest first')}}" id="old" class="btn btn-primary{% if order == "old" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='old')}}"><span class="bi bi-book-fill"></span> <span class="bi bi-calendar3"></span><span class="bi bi-sort-numeric-down-alt"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort title in alphabetical order')}}" id="asc" class="btn btn-primary{% if order == "abc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='abc')}}"><span class="bi bi-type"></span><span class="bi bi-sort-alpha-down"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort title in reverse alphabetical order')}}" id="desc" class="btn btn-primary{% if order == "zyx" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='zyx')}}"><span class="bi bi-type"></span><span class="bi bi-sort-alpha-down-alt"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort authors in alphabetical order')}}" id="auth_az" class="btn btn-primary{% if order == "authaz" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='authaz')}}"><span class="bi bi-person-fill"></span><span class="bi bi-sort-alpha-down"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort authors in reverse alphabetical order')}}" id="auth_za" class="btn btn-primary{% if order == "authza" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='authza')}}"><span class="bi bi-person-fill"></span><span class="bi bi-sort-alpha-down-alt"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort according to publishing date, newest first')}}" id="pub_new" class="btn btn-primary{% if order == "pubnew" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='pubnew')}}"><span class="bi bi-calendar3"></span><span class="bi bi-sort-numeric-down"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort according to publishing date, oldest first')}}" id="pub_old" class="btn btn-primary{% if order == "pubold" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='pubold')}}"><span class="bi bi-calendar3"></span><span class="bi bi-sort-numeric-down-alt"></span></a>
{% if page == 'series' %}
<a data-toggle="tooltip" title="{{_('Sort ascending according to series index')}}" id="series_asc" class="btn btn-primary{% if order == "seriesasc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='seriesasc')}}"><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a data-toggle="tooltip" title="{{_('Sort descending according to series index')}}" id="series_desc" class="btn btn-primary{% if order == "seriesdesc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='seriesdesc')}}"><span class="glyphicon glyphicon-sort-by-order-alt"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort ascending according to series index')}}" id="series_asc" class="btn btn-primary{% if order == "seriesasc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='seriesasc')}}"><span class="bi bi-sort-numeric-down"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort descending according to series index')}}" id="series_desc" class="btn btn-primary{% if order == "seriesdesc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, book_id=id, sort_param='seriesdesc')}}"><span class="bi bi-sort-numeric-down-alt"></span></a>
{% endif %}
{% endif %}
</div>
@@ -89,17 +89,17 @@
<div class="row display-flex">
{% if entries[0] %}
{% for entry in entries %}
<div class="col-sm-3 col-lg-2 col-xs-6 book session" id="books">
<div class="col-sm-3 col-lg-2 col-6 book session" id="books">
<div class="cover">
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-toggle="modal" data-target="#bookDetailsModal" data-remote="false"{% endif %}>
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-bs-toggle="modal" data-bs-target="#bookDetailsModal"{% endif %}>
<span class="img" title="{{ entry.Books.title }}">
{{ image.book_cover(entry.Books) }}
{% if entry[2] == True %}<span class="badge read glyphicon glyphicon-ok"></span>{% endif %}
{% if entry[2] == True %}<span class="badge read bi bi-check"></span>{% endif %}
</span>
</a>
</div>
<div class="meta">
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-toggle="modal" data-target="#bookDetailsModal" data-remote="false"{% endif %}>
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-bs-toggle="modal" data-bs-target="#bookDetailsModal"{% endif %}>
<p title="{{ entry.Books.title }}" class="title">{{entry.Books.title|shortentitle}}</p>
</a>
<p class="author">
@@ -120,7 +120,7 @@
{% endif %}
{% endfor %}
{% if entry.Books.data|music %}
<span class="glyphicon glyphicon-music"></span>
<i class="bi bi-music-note"></i>
{% endif %}
</p>
{% if entry.Books.series.__len__() > 0 %}
@@ -138,10 +138,10 @@
{% if entry.Books.ratings.__len__() > 0 %}
<div class="rating">
{% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %}
<span class="glyphicon glyphicon-star good"></span>
<i class="bi bi-star-fill good"></i>
{% if loop.last and loop.index < 5 %}
{% for numer in range(5 - loop.index) %}
<span class="glyphicon glyphicon-star-empty"></span>
<i class="bi bi-star"></i>
{% endfor %}
{% endif %}
{% endfor %}
+41 -42
View File
@@ -19,60 +19,59 @@
<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/bootstrap.min.css') }}" rel="stylesheet" media="screen">
<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/bootstrap-icons.min.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/caliBlur.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/caliBlur_override.css') }}" rel="stylesheet" media="screen">
</head>
<body class="{{ page }} {{ bodyClass }} blur{% if page == 'stat' %} stats{% endif %}{% if page in ['config', 'uiconfig', 'newuser', 'edituser', 'mailset', 'usertable', 'dbconfig'] %} admin{% endif %}{% if page == 'advsearch' %} advanced_search{% endif %}" data-readmore-more="{{_('Read more')}}" data-readmore-less="{{_('Read less')}}">
<!-- Static navbar -->
<div class="navbar navbar-default navbar-static-top" role="navigation">
<nav class="navbar navbar-expand-md navbar-static-top" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">{{_('Toggle Navigation')}}</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<div class="navbar-header d-flex align-items-center">
<button type="button" class="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>
<a class="navbar-brand" href="{{url_for('web.index')}}">{{instance}}</a>
</div>
<div class="home-btn"><a class="home-btn-tooltip" href="{{url_for('web.index', page=1)}}" data-toggle="tooltip" title="{{_('Home')}}" data-placement="bottom"></a></div>
<div class="plexBack"><a class="back-btn-tooltip" href="{{url_for('web.index')}}" data-toggle="tooltip" title="{{_('Back')}}" data-placement="bottom"></a></div>
<div class="home-btn"><a class="home-btn-tooltip" href="{{url_for('web.index', page=1)}}" data-bs-toggle="tooltip" title="{{_('Home')}}" data-bs-placement="bottom"></a></div>
<div class="plexBack"><a class="back-btn-tooltip" href="{{url_for('web.index')}}" data-bs-toggle="tooltip" title="{{_('Back')}}" data-bs-placement="bottom"></a></div>
{% if current_user.is_authenticated or g.allow_anonymous %}
<form class="navbar-form navbar-left" role="search" action="{{url_for('search.simple_search')}}" method="GET">
<div class="form-group input-group input-group-sm">
<label for="query" class="sr-only">{{_('Search')}}</label>
<span class="query-search-icon glyphicon glyphicon-search" aria-hidden="true"></span>
<div class="form-group">
<label for="query" class="visually-hidden">{{_('Search')}}</label>
<input type="text" class="form-control" id="query" name="query" placeholder="{{_('Search Library')}}" value="{{searchterm}}">
<span class="bi bi-search query-search-icon" aria-hidden="true"></span>
<span class="input-group-btn">
<button type="submit" id="query_submit" class="btn btn-default"><span class="glyphicon glyphicon-arrow-right" aria-hidden="true"></span></button>
<button type="submit" id="query_submit" class="btn btn-outline-secondary" aria-label="{{_('Search')}}"><i class="bi bi-arrow-right" aria-hidden="true"></i></button>
</span>
</div>
</form>
{% endif %}
<div class="navbar-collapse collapse">
<div class="navbar-collapse collapse" id="mainNavbar">
{% if current_user.is_authenticated or g.allow_anonymous %}
<ul class="nav navbar-nav ">
{% if simple==true %} <li><a href="{{url_for('basic.index')}}" id="basic"><span class="glyphicon glyphicon-phone"></span><span>{{_('Simple Theme')}}</span></a><li>{% endif %}
<ul class="nav navbar-nav">
{% if simple==true %} <li><a href="{{url_for('basic.index')}}" id="basic"><i class="bi bi-phone"></i><span>{{_('Simple Theme')}}</span></a><li>{% endif %}
</ul>
{% endif %}
<ul class="nav navbar-nav navbar-right" id="main-nav">
<ul class="nav navbar-nav" id="main-nav">
{% if current_user.is_authenticated or g.allow_anonymous %}
<li class="dropdown"><a href="#" class="dropdown-toggle profileDrop send-btn-tooltip dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" data-toggle-two="tooltip" title="{{_('Account')}}" data-placement="bottom" data-viewport="#main-nav"><span class="profileDropIcon" aria-hidden="true"><img src="{{ url_for('static', filename='css/img/user-icon.svg') }}" alt=""></span></a><span class="hidden-sm">{{current_user.name}}</span>
<li class="dropdown"><a href="#" class="dropdown-toggle profileDrop send-btn-tooltip dropdown" data-bs-toggle="dropdown" role="button" aria-expanded="false" data-toggle-two="tooltip" title="{{_('Account')}}" data-bs-placement="bottom" data-viewport="#main-nav"><span class="profileDropIcon" aria-hidden="true"><img src="{{ url_for('static', filename='css/img/user-icon.svg') }}" alt=""></span></a><span class="caliblur-nav-label">{{current_user.name}}</span>
<ul class="dropdown-menu profileDropli">
<li><a id="top_user" href="{{url_for('web.profile')}}" ><span class="glyphicon glyphicon-user"></span> <span class="hidden-sm">{{current_user.name}}</span></a></li>
<li><a id="top_user" href="{{url_for('web.profile')}}" ><i class="bi bi-person"></i> <span class="caliblur-nav-label">{{current_user.name}}</span></a></li>
{% if not current_user.is_anonymous %}
<li class="dropdown"><a id="nav_about" href="{{url_for('about.stats')}}"><span class="glyphicon glyphicon-info-sign"></span> {{_('About')}}</a></li>
<li class="dropdown"><a id="nav_about" href="{{url_for('about.stats')}}"><i class="bi bi-info-circle"></i> {{_('About')}}</a></li>
{% endif %}
{% if g.allow_registration and not current_user.is_authenticated %}
<li><a id="login" href="{{url_for('web.login')}}"><span class="glyphicon glyphicon-log-in"></span> {{_('Login')}}</a></li>
<li><a id="register" href="{{url_for('web.register')}}"><span class="glyphicon glyphicon-user"></span> {{_('Register')}}</a></li>
<li><a id="login" href="{{url_for('web.login')}}"><i class="bi bi-box-arrow-in-right"></i> {{_('Login')}}</a></li>
<li><a id="register" href="{{url_for('web.register')}}"><i class="bi bi-person"></i> {{_('Register')}}</a></li>
{% endif %}
{% if not current_user.is_anonymous %}
<li><a id="logout" href="{{url_for('web.logout', next=(request.path + '?' + request.query_string.decode('utf-8')).rstrip('?'))}}"><span class="glyphicon glyphicon-log-out"></span> <span class="hidden-sm">{{_('Logout')}}</span></a></li>
<li><a id="logout" href="{{url_for('web.logout', next=(request.path + '?' + request.query_string.decode('utf-8')).rstrip('?'))}}"><i class="bi bi-box-arrow-right"></i> <span class="caliblur-nav-label">{{_('Logout')}}</span></a></li>
{% endif %}
</ul>
</li>
@@ -82,44 +81,44 @@
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<div class="form-group">
<span class="form-upload-label">{{_('Upload Book')}}</span>
<span class="btn btn-default btn-file">{{_('Upload')}}<input id="btn-upload" class="upload-btn-tooltip" name="btn-upload"
data-toggle="tooltip" data-placement="bottom" data-viewport="#main-nav" title="{{_('Upload')}}"
<span class="btn btn-outline-secondary btn-file">{{_('Upload')}}<input id="btn-upload" class="upload-btn-tooltip" name="btn-upload"
data-bs-toggle="tooltip" data-bs-placement="bottom" data-viewport="#main-nav" title="{{_('Upload')}}"
type="file" accept="{% for format in accept %}.{% if format != ''%}{{format}}{% else %}*{% endif %}{{ ',' if not loop.last }}{% endfor %}" multiple></span>
<input class="hide" id="btn-upload2" name="btn-upload2" type="file" accept="{% for format in accept %}.{% if format != ''%}{{format}}{% else %}*{% endif %}{{ ',' if not loop.last }}{% endfor %}">
<input class="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="top_tasks"><span class="top-tasks-label">{{_('Manage')}}</span><a id="top_tasks" class="tasks-btn-tooltip" href="{{url_for('tasks.get_tasks_status')}}" data-toggle="tooltip" title="{{_('Tasks')}}" data-placement="bottom" data-viewport="#main-nav"><span class="glyphicon glyphicon-tasks"></span> <span class="hidden-sm">{{_('Tasks')}}</span></a></li>
<li class="top_tasks"><span class="top-tasks-label">{{_('Manage')}}</span><a id="top_tasks" class="tasks-btn-tooltip" href="{{url_for('tasks.get_tasks_status')}}" data-bs-toggle="tooltip" title="{{_('Tasks')}}" data-bs-placement="bottom" data-viewport="#main-nav"><i class="bi bi-list-task"></i> <span class="caliblur-nav-label">{{_('Tasks')}}</span></a></li>
{% endif %}
{% if current_user.role_admin() %}
<li class="top_admin"><a id="top_admin" class="admin-btn-tooltip" href="{{url_for('admin.admin')}}" data-toggle="tooltip" title="{{_('Settings')}}" data-placement="bottom" data-viewport="#main-nav"><span class="glyphicon glyphicon-dashboard"></span> <span class="hidden-sm">{{_('Admin')}}</span></a></li>
<li class="top_admin"><a id="top_admin" class="admin-btn-tooltip" href="{{url_for('admin.admin')}}" data-bs-toggle="tooltip" title="{{_('Settings')}}" data-bs-placement="bottom" data-viewport="#main-nav"><i class="bi bi-speedometer2"></i> <span class="caliblur-nav-label">{{_('Admin')}}</span></a></li>
{% endif %}
{% endif %}
</ul>
</div><!--/.nav-collapse -->
<div class="sidebar-backdrop"></div>
</div>
</div>
</nav>
{% for message in get_flashed_messages(with_categories=True) %}
{%if message[0] == "error" %}
<div class="row-fluid text-center" >
<div class="row text-center" >
<div id="flash_danger" class="alert alert-danger">{{ message[1] }}</div>
</div>
{%endif%}
{%if message[0] == "info" %}
<div class="row-fluid text-center">
<div class="row text-center">
<div id="flash_info" class="alert alert-info">{{ message[1] }}</div>
</div>
{%endif%}
{%if message[0] == "warning" %}
<div class="row-fluid text-center">
<div class="row text-center">
<div id="flash_warning" class="alert alert-warning">{{ message[1] }}</div>
</div>
{%endif%}
{%if message[0] == "success" %}
<div class="row-fluid text-center">
<div class="row text-center">
<div id="flash_success" class="alert alert-success">{{ message[1] }}</div>
</div>
{%endif%}
@@ -130,22 +129,22 @@
<span>{{_("Please do not refresh the page")}}</span>.
</div>
<div class="container-fluid">
<div class="row-fluid">
<div class="row">
{% if current_user.is_authenticated or g.allow_anonymous %}
<div class="col-sm-2">
<nav class="navigation">
<ul class="list-unstyled" id="scnd-nav" intent in-standard-append="nav.navigation" in-tablet-after="#main-nav" in-tablet-class="nav navbar-nav" in-mobile-after="#main-nav" in-mobile-class="nav navbar-nav">
<li class="nav-head hidden-xs">{{_('Browse')}}</li>
<li><a href="{{url_for('search.advanced_search')}}" id="advanced_search"><span class="glyphicon glyphicon-search"></span><span class="hidden-sm"> {{_('Advanced Search')}}</span></a></li>
<li class="nav-head d-none d-sm-block">{{_('Browse')}}</li>
<li><a href="{{url_for('search.advanced_search')}}" id="advanced_search"><i class="bi bi-search"></i><span class="caliblur-nav-label"> {{_('Advanced Search')}}</span></a></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']}}" aria-hidden="true"></i> <span class="nav-text">{{_(element['text'])|trim}}</span></a></li>
{% endif %}
{% endfor %}
{% if current_user.is_authenticated or g.allow_anonymous %}
<li class="nav-head hidden-xs public-shelves">{{_('Shelves')}}</li>
<li class="nav-head d-none d-sm-block public-shelves">{{_('Shelves')}}</li>
{% for shelf in g.shelves_access %}
<li><a href="{{url_for('shelf.show_shelf', shelf_id=shelf.id)}}"><span class="glyphicon glyphicon-list shelf"></span> {{shelf.name|shortentitle(40)}}{% if shelf.is_public == 1 %} {{_('(Public)')}}{% endif %} <span class="badge badge-sm">{{shelf.books.all()|length}}</span></a></li>
<li><a href="{{url_for('shelf.show_shelf', shelf_id=shelf.id)}}"><i class="bi bi-list shelf"></i> {{shelf.name|shortentitle(40)}}{% if shelf.is_public == 1 %} {{_('(Public)')}}{% endif %} <span class="badge text-bg-secondary">{{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>
@@ -186,12 +185,12 @@
<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">&times;</span></button>
<h4 class="modal-title" id="bookDetailsModalLabel">{{_('Book Details')}}</h4>
<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-default" data-dismiss="modal">{{_('Close')}}</button>
<button type="button" id="details_close" class="btn btn-outline-secondary" data-bs-dismiss="modal">{{_('Close')}}</button>
</div>
</div>
</div>
@@ -200,7 +199,7 @@
<!-- 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/bootstrap.min.js') }}"></script>
<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/intention.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/libs/context.min.js') }}"></script>
+19 -19
View File
@@ -2,42 +2,42 @@
{% block body %}
<div class="discover">
{% if page == 'authorlist' %}
<span class="authorlist-icon glyphicon glyphicon-user" aria-hidden="true"></span>
<i class="authorlist-icon bi bi-person" aria-hidden="true"></i>
{% endif %}
{% if page == 'catlist' %}
<span class="catlist-icon glyphicon glyphicon-tags" aria-hidden="true"></span>
<i class="catlist-icon bi bi-tags" aria-hidden="true"></i>
{% endif %}
{% if page == 'downloadlist' %}
<span class="downloadlist-icon glyphicon glyphicon-download" aria-hidden="true"></span>
<i class="downloadlist-icon bi bi-download" aria-hidden="true"></i>
{% endif %}
{% if page == 'langlist' %}
<span class="langlist-icon glyphicon glyphicon-flag" aria-hidden="true"></span>
<i class="langlist-icon bi bi-flag" aria-hidden="true"></i>
{% endif %}
{% if page == 'publisherlist' %}
<span class="publisherlist-icon glyphicon glyphicon-text-size" aria-hidden="true"></span>
<i class="publisherlist-icon bi bi-type" aria-hidden="true"></i>
{% endif %}
{% if page == 'ratingslist' %}
<span class="ratingslist-icon glyphicon glyphicon-star-empty" aria-hidden="true"></span>
<i class="ratingslist-icon bi bi-star" aria-hidden="true"></i>
{% endif %}
{% if page == 'formatslist' %}
<span class="formatslist-icon glyphicon glyphicon-file" aria-hidden="true"></span>
<i class="formatslist-icon bi bi-file-earmark" aria-hidden="true"></i>
{% endif %}
{% if page == 'serieslist' %}
<span class="serieslist-icon glyphicon glyphicon-bookmark" aria-hidden="true"></span>
<i class="serieslist-icon bi bi-bookmark" aria-hidden="true"></i>
{% endif %}
<h2 class="{{ page }}">{{ _(title)|replace(':', ' —')|replace("'", "") }}</h2>
<div class="filterheader caliblur-filterheader hidden-xs">
<div class="filterheader caliblur-filterheader d-none d-sm-block">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
{% if entries.__len__() and data == 'author' %}
<div id="sort_name" class="btn btn-primary"><b>B,A <-> A B</b></div>
{% endif %}
<div id="asc" data-order="{{ order }}" data-id="{{ data }}" class="btn btn-primary{% if order == 1 %} active{% endif %}"><span class="glyphicon glyphicon-sort-by-alphabet"></span></div>
<div id="desc" data-id="{{ data }}" class="btn btn-primary{% if order == 0 %} active{% endif %}"><span class="glyphicon glyphicon-sort-by-alphabet-alt"></span></div>
<div id="asc" data-order="{{ order }}" data-id="{{ data }}" class="btn btn-primary{% if order == 1 %} active{% endif %}"><i class="bi bi-sort-alpha-down"></i></div>
<div id="desc" data-id="{{ data }}" class="btn btn-primary{% if order == 0 %} active{% endif %}"><i class="bi bi-sort-alpha-up"></i></div>
{% if charlist|length %}
<div id="all" class="active btn btn-primary {% if charlist|length > 9 %}hidden-sm{% endif %}">{{ _('All') }}</div>
<div id="all" class="active btn btn-primary {% if charlist|length > 9 %}d-none d-sm-inline-block{% endif %}">{{ _('All') }}</div>
{% endif %}
<div class="btn-group character {% if charlist|length > 9 %}hidden-sm{% endif %}" role="group">
<div class="btn-group character {% if charlist|length > 9 %}d-none d-sm-inline-flex{% endif %}" role="group">
{% for char in charlist %}
<div class="btn btn-primary char">{{ char[0] }}</div>
{% endfor %}
@@ -49,22 +49,22 @@
</div>
<div class="container1">
<div id="list" class="col-xs-12 col-sm-6">
<div id="list" class="col-12 col-sm-6">
{% for entry in entries %}
{% if loop.index0 == (loop.length / 2 + loop.length % 2)|int and loop.length > 20 %}
</div>
<div id="second" class="col-xs-12 col-sm-6">
<div id="second" class="col-12 col-sm-6">
{% endif %}
<div class="row" {% if entry[0].sort %}data-name="{{ entry[0].name }}"{% endif %} data-id="{% if entry[0].sort %}{{ entry[0].sort }}{% else %}{% if entry[0].format %}{{ entry[0].format }}{% else %}{% if entry[0].rating %}{{ entry[0].rating }}{% else %}{{ entry[0].name }}{% endif %}{% endif %}{% endif %}">
<div class="col-xs-2 col-sm-2 col-md-1" align="left"><span class="badge">{{ entry[1] }}</span></div>
<div class="col-xs-10 col-sm-10 col-md-11"><a id="list_{{ loop.index0 }}" href="{% if entry.format %}{{ url_for('web.books_list', data=data, sort_param='stored', book_id=entry.format) }}{% else %}{{ url_for('web.books_list', data=data, sort_param='stored', book_id=entry[0].id) }}{% endif %}">
<div class="col-2 col-sm-2 col-md-1 text-start"><span class="badge">{{ entry[1] }}</span></div>
<div class="col-10 col-sm-10 col-md-11"><a id="list_{{ loop.index0 }}" href="{% if entry.format %}{{ url_for('web.books_list', data=data, sort_param='stored', book_id=entry.format) }}{% else %}{{ url_for('web.books_list', data=data, sort_param='stored', book_id=entry[0].id) }}{% endif %}">
{% if entry.name %}
<div class="rating">
{% for number in range(entry.name|int) %}
<span class="glyphicon glyphicon-star good"></span>
<i class="bi bi-star-fill good"></i>
{% if loop.last and loop.index < 5 %}
{% for numer in range(5 - loop.index) %}
<span class="glyphicon glyphicon-star-empty"></span>
<i class="bi bi-star"></i>
{% endfor %}
{% endif %}
{% endfor %}
+17 -16
View File
@@ -13,12 +13,14 @@
{% endif %}
<script src="{{ url_for('static', filename='js/libs/jquery.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/libs/bootstrap5.bundle.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/libs/soundmanager2.js') }}"></script>
<script src="{{ url_for('static', filename='js/libs/bar-ui.js') }}"></script>
<link rel="apple-touch-icon" href="{{ url_for('static', filename='touch-icon.png') }}">
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
<link href="{{ url_for('static', filename='css/libs/bootstrap.min.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/libs/bootstrap5.min.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/bootstrap-icons.min.css') }}" rel="stylesheet" media="screen">
<link rel="stylesheet" href="{{ url_for('static', filename='css/libs/bar-ui.css') }}" />
<script>
@@ -30,7 +32,7 @@
<body>
<div class="row" style="display: inline-block; width: 100%;">
<div class="col-sm-3 col-lg-3 col-xs-5">
<div class="col-sm-3 col-lg-3 col-5">
</div>
<div class="col-sm-6 col-lg-6 book-meta" style="margin-bottom: 2%;">
@@ -48,10 +50,10 @@
<div class="rating">
<p>
{% for number in range((entry.ratings[0].rating/2)|int(2)) %}
<span class="glyphicon glyphicon-star good"></span>
<i class="bi bi-star-fill good"></i>
{% if loop.last and loop.index < 5 %}
{% for numer in range(5 - loop.index) %}
<span class="glyphicon glyphicon-star-empty"></span>
<i class="bi bi-star"></i>
{% endfor %}
{% endif %}
{% endfor %}
@@ -66,7 +68,7 @@
{% if entry.languages.__len__() > 0 %}
<div class="languages">
<p>
<span class="label label-default">{{_('Language')}}: {% for language in entry.languages %}{{language.language_name}}{% if not loop.last %}, {% endif %}{% endfor %}</span>
<span class="badge text-bg-secondary">{{_('Language')}}: {% for language in entry.languages %}{{language.language_name}}{% if not loop.last %}, {% endif %}{% endfor %}</span>
</p>
</div>
{% endif %}
@@ -74,7 +76,7 @@
{% if entry.identifiers|length > 0 %}
<div class="identifiers">
<p>
<span class="glyphicon glyphicon-link"></span>
<i class="bi bi-link-45deg"></i>
{% for identifier in entry.identifiers %}
<a href="{{identifier}}" target="_blank" class="btn btn-xs btn-success" role="button">{{identifier.format_type()}}</a>
{%endfor%}
@@ -86,7 +88,7 @@
<div class="tags">
<p>
<span class="glyphicon glyphicon-tags"></span>
<i class="bi bi-tags"></i>
{% for tag in entry.tags %}
<a href="{{ url_for('web.books_list', data='category', sort_param='stored', book_id=tag.id) }}" class="btn btn-xs btn-info" role="button">{{tag.name}}</a>
@@ -124,9 +126,9 @@
{% else %}
{% if c.datatype == 'bool' %}
{% if column.value == true %}
<span class="glyphicon glyphicon-ok"></span>
<i class="bi bi-check"></i>
{% else %}
<span class="glyphicon glyphicon-remove"></span>
<i class="bi bi-x"></i>
{% endif %}
{% else %}
{% if c.datatype == 'float' %}
@@ -155,7 +157,7 @@
<p>
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<label class="block-label">
<input id="have_read_cb" class="readunread-btn-tooltip" type="checkbox" {% if entry.read_status %}checked{% endif %} disabled data-toggle="tooltip" data-placement="bottom" data-viewport=".btn-toolbar" title="{% if entry.read_status %}{{_('Mark As Unread')}}{% else %}{{_('Mark As Read')}}{% endif %}">
<input id="have_read_cb" class="readunread-btn-tooltip" type="checkbox" {% if entry.read_status %}checked{% endif %} disabled data-bs-toggle="tooltip" data-bs-placement="bottom" data-viewport=".btn-toolbar" title="{% if entry.read_status %}{{_('Mark As Unread')}}{% else %}{{_('Mark As Read')}}{% endif %}">
<span>{{_('Read')}}</span>
</label>
</p>
@@ -163,7 +165,7 @@
<p>
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<label class="block-label">
<input id="archived_cb" class="readunread-btn-tooltip" type="checkbox" {% if entry.is_archived %}checked{% endif %} disabled data-toggle="tooltip" data-placement="bottom" data-viewport=".btn-toolbar" title="{% if entry.is_archived %}{{_('Restore from archive')}}{% else %}{{_('Add to archive')}}{% endif %}">
<input id="archived_cb" class="readunread-btn-tooltip" type="checkbox" {% if entry.is_archived %}checked{% endif %} disabled data-bs-toggle="tooltip" data-bs-placement="bottom" data-viewport=".btn-toolbar" title="{% if entry.is_archived %}{{_('Restore from archive')}}{% else %}{{_('Add to archive')}}{% endif %}">
<span>{{_('Archived')}}</span>
</label>
</p>
@@ -186,9 +188,8 @@
{% if current_user.shelf.all() or g.shelves_access %}
<div id="shelf-actions" class="btn-toolbar" role="toolbar">
<div class="btn-group" role="group" aria-label="Add to shelves">
<button id="add-to-shelf" type="button" class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-list"></span> {{_('Add to shelf')}}
<span class="caret"></span>
<button id="add-to-shelf" type="button" class="btn btn-primary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-list"></i> {{_('Add to shelf')}}
</button>
<ul id="add-to-shelves" class="dropdown-menu" aria-labelledby="add-to-shelf">
{% for shelf in g.shelves_access %}
@@ -211,10 +212,10 @@
{% if shelf.id in books_shelfs %}
<a data-href="{{ url_for('shelf.remove_from_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
data-add-href="{{ url_for('shelf.add_to_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
class="btn btn-sm btn-default" role="button" data-shelf-action="remove"
class="btn btn-sm btn-outline-secondary" role="button" data-shelf-action="remove"
>
<span {% if not shelf.is_public or current_user.role_edit_shelfs() %}
class="glyphicon glyphicon-remove"
class="bi bi-x"
{% endif %}></span> {{shelf.name}}{% if shelf.is_public == 1 %} {{_('(Public)')}}{% endif %}
</a>
{% endif %}
+8 -10
View File
@@ -13,11 +13,9 @@
<label for="password">{{_('Password')}}</label>
<div class="input-group">
<input type="password" class="form-control" id="password" name="password" placeholder="{{_('Password')}}" value="{{ password }}">
<span class="input-group-btn">
<button type="button" class="btn btn-default toggle-password" data-target="#password" data-password-show="{{_('Show password')}}" data-password-hide="{{_('Hide password')}}" aria-label="{{_('Show password')}}" title="{{_('Show password')}}">
<span class="glyphicon glyphicon-eye-close" aria-hidden="true"></span>
</button>
</span>
<button type="button" class="btn btn-outline-secondary toggle-password" data-target="#password" data-password-show="{{_('Show password')}}" data-password-hide="{{_('Hide password')}}" aria-label="{{_('Show password')}}" title="{{_('Show password')}}">
<i class="bi bi-eye-slash" aria-hidden="true"></i>
</button>
</div>
</div>
<div class="checkbox">
@@ -25,18 +23,18 @@
<input type="checkbox" name="remember_me" checked> {{_('Remember Me')}}
</label>
</div>
<button type="submit" name="submit" class="btn btn-default">{{_('Login')}}</button>
<button type="submit" name="submit" class="btn btn-outline-secondary">{{_('Login')}}</button>
{% if config.config_login_type == 0 and mail%}
<button type="submit" name="forgot" value="forgot" class="btn btn-default">{{_('Forgot Password?')}}</button>
<button type="submit" name="forgot" value="forgot" class="btn btn-outline-secondary">{{_('Forgot Password?')}}</button>
{% endif %}
{% if g.allow_registration %}
<a class="btn btn-default" id="register" href="{{url_for('web.register')}}"><span class="glyphicon glyphicon-user"></span> {{_('Register')}}</a>
<a class="btn btn-outline-secondary" id="register" href="{{url_for('web.register')}}"><i class="bi bi-person"></i> {{_('Register')}}</a>
{% endif %}
{% if config.config_remote_login %}
<a class="btn btn-default" id="remote_login" href="{{url_for('remotelogin.remote_login')}}">{{_('Log in with Magic Link')}}</a>
<a class="btn btn-outline-secondary" id="remote_login" href="{{url_for('remotelogin.remote_login')}}">{{_('Log in with Magic Link')}}</a>
{% endif %}
{% if g.allow_anonymous %}
<a class="btn btn-default" href="{{url_for('web.index')}}">{{ _('Anonymous Browsing') }}</a>
<a class="btn btn-outline-secondary" href="{{url_for('web.index')}}">{{ _('Anonymous Browsing') }}</a>
{% endif %}
{% if config.config_login_type == 2 %}
{% if 1 in oauth_check %}
@@ -25,13 +25,13 @@
<input type="text" class="form-control" name="add_element" id="add_element">
</div>
<div class="form-group required">
<input type="button" class="btn btn-default" value="{{_('Allow')}}" name="submit_allow" id="submit_allow" data-dismiss="static">
<input type="button" class="btn btn-default" value="{{_('Deny')}}" name="submit_deny" id="submit_restrict" data-dismiss="static">
<input type="button" class="btn btn-outline-secondary" value="{{_('Allow')}}" name="submit_allow" id="submit_allow">
<input type="button" class="btn btn-outline-secondary" value="{{_('Deny')}}" name="submit_deny" id="submit_restrict">
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" id="restrict_close" class="btn btn-default" data-dismiss="modal">{{_('Close')}}</button>
<button type="button" id="restrict_close" class="btn btn-outline-secondary" data-bs-dismiss="modal">{{_('Close')}}</button>
</div>
</div>
</div>
@@ -47,8 +47,8 @@
</div>
<div class="modal-body text-center">
<p>
<span class="hidden" id="book_format">{{_('This book format will be permanently erased from database')}}</span>
<span class="hidden" id="book_complete">{{_('This book will be permanently erased from database and hard disk')}}</span>
<span class="d-none" id="book_format">{{_('This book format will be permanently erased from database')}}</span>
<span class="d-none" id="book_complete">{{_('This book will be permanently erased from database and hard disk')}}</span>
</p>
{% if config.config_kobo_sync %}
<p>
@@ -59,8 +59,8 @@
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">{{_('Cancel')}}</button>
<input type="button" class="btn btn-danger" value="{{_('Delete')}}" name="delete_confirm" id="delete_confirm" data-dismiss="modal">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">{{_('Cancel')}}</button>
<input type="button" class="btn btn-danger" value="{{_('Delete')}}" name="delete_confirm" id="delete_confirm" data-bs-dismiss="modal">
</div>
</div>
</div>
@@ -86,7 +86,7 @@
</thead>
<tbody id="tbody">
<tr class="tr-clickable hidden" id="parent" data-type="dir" data-path="..">
<td><span class="glyphicon glyphicon-folder-close"></span></td>
<td><i class="bi bi-folder"></i></td>
<td title="{{_('Parent Directory')}}"><span class="parentdir">..</span></td>
<td></td>
</tr>
@@ -96,8 +96,8 @@
</div>
<div class="modal-footer">
<div class="text-left" id="element_selected"></div>
<button type="button" id="file_abort" class="btn btn-default" data-dismiss="modal">{{_('Cancel')}}</button>
<input type="button" class="btn btn-primary" data-path="" data-link="" data-folderonly="" data-filefilter="" data-newfile="" value="{{_('Select')}}" name="file_confirm" id="file_confirm" data-dismiss="modal">
<button type="button" id="file_abort" class="btn btn-outline-secondary" data-bs-dismiss="modal">{{_('Cancel')}}</button>
<input type="button" class="btn btn-primary" data-path="" data-link="" data-folderonly="" data-filefilter="" data-newfile="" value="{{_('Select')}}" name="file_confirm" id="file_confirm" data-bs-dismiss="modal">
</div>
</div>
</div>
@@ -133,7 +133,7 @@
<span id="text-GeneralChangeModal"></span>
<p></p>
<button id="btnConfirmNo-GeneralChangeModal" type="button" class="btn btn-primary">{{_('Cancel')}}</button>
<button id="btnConfirmYes-GeneralChangeModal" type="button" class="btn btn btn-default">{{_('Ok')}}</button>
<button id="btnConfirmYes-GeneralChangeModal" type="button" class="btn btn-outline-secondary">{{_('Ok')}}</button>
</div>
</div>
</div>
+20 -22
View File
@@ -15,9 +15,8 @@
<div id="shelf-actions" class="btn-toolbar" role="toolbar">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<div class="btn-group" role="group" aria-label="Add to shelves">
<button id="add-to-shelf" type="button" class="btn btn-primary btn-sm dropdown-toggle addtoshelf-btn-tooltip{% if page == 'advsearch' %} advsearch-addtoshelf{% endif %}" data-toggle-two="tooltip" title="{{_('Add to shelf')}}" data-placement="bottom" data-viewport=".btn-toolbar" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-list"></span> {{_('Add to shelf')}}
<span class="caret"></span>
<button id="add-to-shelf" type="button" class="btn btn-primary btn-sm dropdown-toggle addtoshelf-btn-tooltip{% if page == 'advsearch' %} advsearch-addtoshelf{% endif %}" data-toggle-two="tooltip" title="{{_('Add to shelf')}}" data-bs-placement="bottom" data-viewport=".btn-toolbar" data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-list"></i> {{_('Add to shelf')}}
</button>
<ul id="add-to-shelves" class="dropdown-menu" aria-labelledby="add-to-shelf">
{% for shelf in g.shelves_access %}
@@ -28,9 +27,8 @@
</ul>
</div>
<div class="btn-group" role="group" aria-label="Remove from shelves" style="margin-right: 5px;">
<button id="remove-from-shelf" type="button" class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-list"></span> {{_('Remove from shelf')}}
<span class="caret"></span>
<button id="remove-from-shelf" type="button" class="btn btn-primary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-list"></i> {{_('Remove from shelf')}}
</button>
<ul id="remove-from-shelves" class="dropdown-menu" aria-labelledby="add-to-shelf">
{% for shelf in g.shelves_access %}
@@ -44,33 +42,33 @@
</div>
{% endif %}
{% endif %}
<div class="filterheader hidden-xs"><!-- ToDo: Implement filter for search results -->
<a id="new" data-toggle="tooltip" title="{{_('Sort according to book date, newest first')}}" class="btn btn-primary{% if order == "new" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='new', query=query)}}"><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a id="old" data-toggle="tooltip" title="{{_('Sort according to book date, oldest first')}}" class="btn btn-primary{% if order == "old" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='old', query=query)}}"><span class="glyphicon glyphicon-sort-by-order-alt"></span></a>
<a id="asc" data-toggle="tooltip" title="{{_('Sort title in alphabetical order')}}" class="btn btn-primary{% if order == "abc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='abc', query=query)}}"><span class="glyphicon glyphicon-font"></span><span class="glyphicon glyphicon-sort-by-alphabet"></span></a>
<a id="desc" data-toggle="tooltip" title="{{_('Sort title in reverse alphabetical order')}}" class="btn btn-primary{% if order == "zyx" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='zyx', query=query)}}"><span class="glyphicon glyphicon-font"></span><span class="glyphicon glyphicon-sort-by-alphabet-alt"></span></a>
<a id="auth_az" data-toggle="tooltip" title="{{_('Sort authors in alphabetical order')}}" class="btn btn-primary{% if order == "authaz" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='authaz', query=query)}}"><span class="glyphicon glyphicon-user"></span><span class="glyphicon glyphicon-sort-by-alphabet"></span></a>
<a id="auth_za" data-toggle="tooltip" title="{{_('Sort authors in reverse alphabetical order')}}" class="btn btn-primary{% if order == "authza" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='authza', query=query)}}"><span class="glyphicon glyphicon-user"></span><span class="glyphicon glyphicon-sort-by-alphabet-alt"></span></a>
<a id="pub_new" data-toggle="tooltip" title="{{_('Sort according to publishing date, newest first')}}" class="btn btn-primary{% if order == "pubnew" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='pubnew', query=query)}}"><span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a id="pub_old" data-toggle="tooltip" title="{{_('Sort according to publishing date, oldest first')}}" class="btn btn-primary{% if order == "pubold" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='pubold', query=query)}}"><span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order-alt"></span></a>
<div class="filterheader d-none d-sm-block"><!-- ToDo: Implement filter for search results -->
<a id="new" data-bs-toggle="tooltip" title="{{_('Sort according to book date, newest first')}}" class="btn btn-primary{% if order == "new" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='new', query=query)}}"><i class="bi bi-sort-down"></i></a>
<a id="old" data-bs-toggle="tooltip" title="{{_('Sort according to book date, oldest first')}}" class="btn btn-primary{% if order == "old" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='old', query=query)}}"><i class="bi bi-sort-up"></i></a>
<a id="asc" data-bs-toggle="tooltip" title="{{_('Sort title in alphabetical order')}}" class="btn btn-primary{% if order == "abc" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='abc', query=query)}}"><i class="bi bi-sort-alpha-down"></i></a>
<a id="desc" data-bs-toggle="tooltip" title="{{_('Sort title in reverse alphabetical order')}}" class="btn btn-primary{% if order == "zyx" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='zyx', query=query)}}"><i class="bi bi-sort-alpha-up"></i></a>
<a id="auth_az" data-bs-toggle="tooltip" title="{{_('Sort authors in alphabetical order')}}" class="btn btn-primary{% if order == "authaz" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='authaz', query=query)}}"><i class="bi bi-person"></i><i class="bi bi-sort-alpha-down"></i></a>
<a id="auth_za" data-bs-toggle="tooltip" title="{{_('Sort authors in reverse alphabetical order')}}" class="btn btn-primary{% if order == "authza" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='authza', query=query)}}"><i class="bi bi-person"></i><i class="bi bi-sort-alpha-up"></i></a>
<a id="pub_new" data-bs-toggle="tooltip" title="{{_('Sort according to publishing date, newest first')}}" class="btn btn-primary{% if order == "pubnew" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='pubnew', query=query)}}"><i class="bi bi-calendar3"></i><i class="bi bi-sort-down"></i></a>
<a id="pub_old" data-bs-toggle="tooltip" title="{{_('Sort according to publishing date, oldest first')}}" class="btn btn-primary{% if order == "pubold" %} active{% endif%}" href="{{url_for('web.books_list', data=page, sort_param='pubold', query=query)}}"><i class="bi bi-calendar3"></i><i class="bi bi-sort-up"></i></a>
</div>
{% endif %}
<div class="row display-flex">
{% for entry in entries %}
<div class="col-sm-3 col-lg-2 col-xs-6 book session">
<div class="col-sm-3 col-lg-2 col-6 book session">
<div class="cover">
{% if entry.Books.has_cover is defined %}
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-toggle="modal" data-target="#bookDetailsModal" data-remote="false"{% endif %}>
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-bs-toggle="modal" data-bs-target="#bookDetailsModal"{% endif %}>
<span class="img" title="{{entry.Books.title}}" >
{{ image.book_cover(entry.Books) }}
{% if entry[2] == True %}<span class="badge read glyphicon glyphicon-ok"></span>{% endif %}
{% if entry[2] == True %}<span class="badge read bi bi-check"></span>{% endif %}
</span>
</a>
{% endif %}
</div>
<div class="meta">
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-toggle="modal" data-target="#bookDetailsModal" data-remote="false"{% endif %}>
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-bs-toggle="modal" data-bs-target="#bookDetailsModal"{% endif %}>
<p title="{{entry.Books.title}}" class="title">{{entry.Books.title|shortentitle}}</p>
</a>
<p class="author">
@@ -91,7 +89,7 @@
{% endif %}
{% endfor %}
{% if entry.Books.data|music %}
<span class="glyphicon glyphicon-music"></span>
<i class="bi bi-music-note"></i>
{% endif %}
</p>
{% if entry.Books.series.__len__() > 0 %}
@@ -106,10 +104,10 @@
{% if entry.Books.ratings.__len__() > 0 %}
<div class="rating">
{% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %}
<span class="glyphicon glyphicon-star good"></span>
<i class="bi bi-star-fill good"></i>
{% if loop.last and loop.index < 5 %}
{% for numer in range(5 - loop.index) %}
<span class="glyphicon glyphicon-star-empty"></span>
<i class="bi bi-star"></i>
{% endfor %}
{% endif %}
{% endfor %}
+20 -20
View File
@@ -11,12 +11,12 @@
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<div class="shelf-btn-group">
{% if current_user.role_download() %}
<a id="shelf_down" href="{{ url_for('shelf.show_simpleshelf', shelf_id=shelf.id) }}" class="btn btn-default">{{ _('Download') }} </a>
<a id="shelf_down" href="{{ url_for('shelf.show_simpleshelf', shelf_id=shelf.id) }}" class="btn btn-outline-secondary">{{ _('Download') }} </a>
{% endif %}
<div class="btn btn-danger delete-shelf-btn delete-btn-tooltip" data-action="{{url_for('shelf.delete_shelf', shelf_id=shelf.id)}}" id="delete_shelf" data-value="{{ shelf.id }}" data-toggle-two="tooltip" title="{{ _('Delete this Shelf') }}" data-placement="bottom">{{ _('Delete this Shelf') }}</div>
<a id="edit_shelf" href="{{ url_for('shelf.edit_shelf', shelf_id=shelf.id) }}" class="btn btn-default edit-shelf-btn edit-btn-tooltip" data-toggle-two="tooltip" title="{{ _('Edit Shelf Properties') }}" data-placement="bottom">{{ _('Edit Shelf Properties') }} </a>
<a id="edit_shelf" href="{{ url_for('shelf.edit_shelf', shelf_id=shelf.id) }}" class="btn btn-outline-secondary edit-shelf-btn edit-btn-tooltip" data-toggle-two="tooltip" title="{{ _('Edit Shelf Properties') }}" data-bs-placement="bottom">{{ _('Edit Shelf Properties') }} </a>
{% if entries.__len__() %}
<a id="order_shelf" href="{{ url_for('shelf.order_shelf', shelf_id=shelf.id) }}" class="btn btn-default order-shelf-btn order-btn-tooltip" data-toggle-two="tooltip" title="{{ _('Arrange books manually') }}" data-placement="bottom">{{ _('Arrange books manually') }} </a>
<a id="order_shelf" href="{{ url_for('shelf.order_shelf', shelf_id=shelf.id) }}" class="btn btn-outline-secondary order-shelf-btn order-btn-tooltip" data-toggle-two="tooltip" title="{{ _('Arrange books manually') }}" data-bs-placement="bottom">{{ _('Arrange books manually') }} </a>
{% endif %}
</div>
{% endif %}
@@ -26,17 +26,17 @@
{% if entries.__len__() %}
<div class="shelf-toolbar-row">
<button id="toggle_order_shelf" data-alt-text="{% if status == "on" %}{{_('Disable Change order')}}{% else %}{{_('Enable Change order')}}{% endif %}" data-view="shelf" class="btn btn-primary{% if status == 'on' %} dummy">{{ _('Enable Change order') }}{% else%}">{{ _('Disable Change order') }}{% endif %}</button>
<div class="filterheader hidden-xs">
<a data-toggle="tooltip" title="{{_('Sort according to book date, newest first')}}" id="new" class="btn btn-primary {% if order == "new" %} active{% endif %}{% if status == "on" %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='new')}}"><span class="glyphicon glyphicon-book"></span> <span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a data-toggle="tooltip" title="{{_('Sort according to book date, oldest first')}}" id="old" class="btn btn-primary {% if order == 'old' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='old')}}"><span class="glyphicon glyphicon-book"></span> <span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order-alt"></span></a>
<a data-toggle="tooltip" title="{{_('Sort title in alphabetical order')}}" id="asc" class="btn btn-primary {% if order == 'abc' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='abc')}}"><span class="glyphicon glyphicon-font"></span><span class="glyphicon glyphicon-sort-by-alphabet"></span></a>
<a data-toggle="tooltip" title="{{_('Sort title in reverse alphabetical order')}}" id="desc" class="btn btn-primary {% if order == 'zyx' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='zyx')}}"><span class="glyphicon glyphicon-font"></span><span class="glyphicon glyphicon-sort-by-alphabet-alt"></span></a>
<a data-toggle="tooltip" title="{{_('Sort authors in alphabetical order')}}" id="auth_az" class="btn btn-primary {% if order == 'authaz' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='authaz')}}"><span class="glyphicon glyphicon-user"></span><span class="glyphicon glyphicon-sort-by-alphabet"></span></a>
<a data-toggle="tooltip" title="{{_('Sort authors in reverse alphabetical order')}}" id="auth_za" class="btn btn-primary {% if order == 'authza' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='authza')}}"><span class="glyphicon glyphicon-user"></span><span class="glyphicon glyphicon-sort-by-alphabet-alt"></span></a>
<a data-toggle="tooltip" title="{{_('Sort according to publishing date, newest first')}}" id="pub_new" class="btn btn-primary {% if order == 'pubnew' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='pubnew')}}"><span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a data-toggle="tooltip" title="{{_('Sort according to publishing date, oldest first')}}" id="pub_old" class="btn btn-primary {% if order == 'pubold' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='pubold')}}"><span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order-alt"></span></a>
<a data-toggle="tooltip" title="{{_('Sort according to book added to shelf, newest first')}}" id="shelf_new" class="btn btn-primary {% if order == 'shelfnew' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='shelfnew')}}"><span class="glyphicon glyphicon-list"></span><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a data-toggle="tooltip" title="{{_('Sort according to book added to shelf, oldest first')}}" id="shelf_old" class="btn btn-primary {% if order == 'shelfold' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='shelfold')}}"><span class="glyphicon glyphicon-list"></span><span class="glyphicon glyphicon-sort-by-order-alt"></span></a
<div class="filterheader d-none d-sm-block">
<a data-bs-toggle="tooltip" title="{{_('Sort according to book date, newest first')}}" id="new" class="btn btn-primary {% if order == "new" %} active{% endif %}{% if status == "on" %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='new')}}"><span class="glyphicon glyphicon-book"></span> <span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort according to book date, oldest first')}}" id="old" class="btn btn-primary {% if order == 'old' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='old')}}"><span class="glyphicon glyphicon-book"></span> <span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order-alt"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort title in alphabetical order')}}" id="asc" class="btn btn-primary {% if order == 'abc' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='abc')}}"><span class="glyphicon glyphicon-font"></span><span class="glyphicon glyphicon-sort-by-alphabet"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort title in reverse alphabetical order')}}" id="desc" class="btn btn-primary {% if order == 'zyx' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='zyx')}}"><span class="glyphicon glyphicon-font"></span><span class="glyphicon glyphicon-sort-by-alphabet-alt"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort authors in alphabetical order')}}" id="auth_az" class="btn btn-primary {% if order == 'authaz' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='authaz')}}"><span class="glyphicon glyphicon-user"></span><span class="glyphicon glyphicon-sort-by-alphabet"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort authors in reverse alphabetical order')}}" id="auth_za" class="btn btn-primary {% if order == 'authza' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='authza')}}"><span class="glyphicon glyphicon-user"></span><span class="glyphicon glyphicon-sort-by-alphabet-alt"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort according to publishing date, newest first')}}" id="pub_new" class="btn btn-primary {% if order == 'pubnew' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='pubnew')}}"><span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort according to publishing date, oldest first')}}" id="pub_old" class="btn btn-primary {% if order == 'pubold' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='pubold')}}"><span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-sort-by-order-alt"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort according to book added to shelf, newest first')}}" id="shelf_new" class="btn btn-primary {% if order == 'shelfnew' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='shelfnew')}}"><span class="glyphicon glyphicon-list"></span><span class="glyphicon glyphicon-sort-by-order"></span></a>
<a data-bs-toggle="tooltip" title="{{_('Sort according to book added to shelf, oldest first')}}" id="shelf_old" class="btn btn-primary {% if order == 'shelfold' %} active{% endif %}{% if status == 'on' %} disabled{% endif %}" href="{{url_for('shelf.show_shelf', shelf_id=shelf.id, sort_param='shelfold')}}"><span class="glyphicon glyphicon-list"></span><span class="glyphicon glyphicon-sort-by-order-alt"></span></a
>
</div>
</div>
@@ -45,17 +45,17 @@
</div>
<div class="row display-flex">
{% for entry in entries %}
<div class="col-sm-3 col-lg-2 col-xs-6 book session">
<div class="col-sm-3 col-lg-2 col-6 book session">
<div class="cover">
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-toggle="modal" data-target="#bookDetailsModal" data-remote="false"{% endif %}>
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-bs-toggle="modal" data-bs-target="#bookDetailsModal"{% endif %}>
<span class="img" title="{{entry.Books.title}}" >
{{ image.book_cover(entry.Books) }}
{% if entry[2] == True %}<span class="badge read glyphicon glyphicon-ok"></span>{% endif %}
{% if entry[2] == True %}<span class="badge read bi bi-check"></span>{% endif %}
</span>
</a>
</div>
<div class="meta">
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-toggle="modal" data-target="#bookDetailsModal" data-remote="false"{% endif %}>
<a href="{{ url_for('web.show_book', book_id=entry.Books.id) }}" {% if simple==false %}data-bs-toggle="modal" data-bs-target="#bookDetailsModal"{% endif %}>
<p title="{{entry.Books.title}}" class="title">{{entry.Books.title|shortentitle}}</p>
</a>
<p class="author">
@@ -87,10 +87,10 @@
{% if entry.Books.ratings.__len__() > 0 %}
<div class="rating">
{% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %}
<span class="glyphicon glyphicon-star good"></span>
<i class="bi bi-star-fill good"></i>
{% if loop.last and loop.index < 5 %}
{% for numer in range(5 - loop.index) %}
<span class="glyphicon glyphicon-star-empty"></span>
<i class="bi bi-star"></i>
{% endfor %}
{% endif %}
{% endfor %}
@@ -1,7 +1,7 @@
{% extends theme("layout.html") %}
{% block body %}
<div class="discover">
<span class="shelforder-icon glyphicon glyphicon-sort-by-attributes" aria-hidden="true"></span>
<i class="shelforder-icon bi bi-sort-down" aria-hidden="true"></i>
<h2>{{ title|replace(':', ' —')|replace("'", "") }}</h2>
<div style="margin-left:20%; width:calc(80% - 30px);">
<div>{{_('Drag to Rearrange Order')}}</div>
@@ -10,14 +10,14 @@
{% for entry in entries %}
<div id="{{entry['Books']['id']}}" class="list-group-item">
<div class="row">
<div class="col-lg-2 col-sm-4 hidden-xs">
<div class="col-lg-2 col-sm-4 d-none d-sm-block">
{% if entry['visible'] %}
<img title="{{entry['Books']['title']}}" class="cover-height" src="{{ url_for('web.get_cover', book_id=entry['Books']['id']) }}">
{% else %}
<img title="{{entry['Books']['title']}}" class="cover-height" src="{{ url_for('static', filename='generic_cover.jpg') }}">
{% endif %}
</div>
<div class="col-lg-10 col-sm-8 col-xs-12">
<div class="col-lg-10 col-sm-8 col-12">
{% if entry['visible'] %}
{{entry['Books']['title']}}
{% if entry['Books']['series']|length > 0 %}
@@ -42,7 +42,7 @@
</div>
<div class="pull-right" style="display:flex; gap:10px; margin-top:30px; margin-bottom:60px;">
<a href="{{ url_for('shelf.show_shelf', shelf_id=shelf.id) }}" id="shelf_back" class="btn btn-primary">{{_('Back')}}</a>
<button onclick="sendData('{{ url_for('shelf.order_shelf', shelf_id=shelf.id) }}')" class="btn btn-default" id="ChangeOrder">{{_('Save')}}</button>
<button onclick="sendData('{{ url_for('shelf.order_shelf', shelf_id=shelf.id) }}')" class="btn btn-outline-secondary" id="ChangeOrder">{{_('Save')}}</button>
</div>
</div>
</div>
+2 -2
View File
@@ -18,7 +18,7 @@
<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/bootstrap.min.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/libs/bootstrap5.min.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/caliBlur.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/caliBlur_override.css') }}" rel="stylesheet" media="screen">
@@ -71,7 +71,7 @@
</div>
</div>
<script src="{{ url_for('static', filename='js/libs/jquery.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/libs/bootstrap.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/libs/bootstrap5.bundle.min.js') }}"></script>
{% endblock %}
</body>
</html>
+9 -9
View File
@@ -18,7 +18,7 @@
</div>
{% if ( current_user and current_user.role_passwd() or current_user.role_admin() ) and not content.role_anonymous() %}
{% if current_user and current_user.role_admin() and not new_user and not profile and ( mail_configured and content.email if content.email != None ) %}
<a class="btn btn-default postAction" id="resend_password" role="button" data-action="{{url_for('admin.reset_user_password', user_id = content.id) }}">{{_('Reset user Password')}}</a>
<a class="btn btn-outline-secondary postAction" id="resend_password" role="button" data-action="{{url_for('admin.reset_user_password', user_id = content.id) }}">{{_('Reset user Password')}}</a>
{% endif %}
<div class="form-group">
<label for="password">{{_('Password')}}</label>
@@ -64,11 +64,11 @@
{% if kobo_support and not new_user %}
<label>{{ _('Kobo Sync Token')}}</label>
<div class="form-group col">
<a class="btn btn-default" id="config_create_kobo_token" style="margin-bottom: 10px;" data-toggle="modal" data-target="#modal_kobo_token" data-remote="false" href="{{ url_for('kobo_auth.generate_auth_token', user_id=content.id) }}">{{_('Create/View')}}</a>
<a class="btn btn-outline-secondary" id="config_create_kobo_token" style="margin-bottom: 10px;" data-bs-toggle="modal" data-bs-target="#modal_kobo_token" href="{{ url_for('kobo_auth.generate_auth_token', user_id=content.id) }}">{{_('Create/View')}}</a>
<div class="btn btn-danger" id="config_delete_kobo_token" style="margin-bottom: 10px;{% if not content.remote_auth_token.first() %} display: none;{% endif %}" data-value="{{ content.id }}" data-remote="false">{{_('Delete')}}</div>
</div>
<div class="form-group col">
<div class="btn btn-default" id="kobo_full_sync" data-value="{% if current_user.role_admin() %}{{ content.id }}{% else %}0{% endif %}" {% if not content.remote_auth_token.first() %} style="display: none;" {% endif %}>{{_('Force full kobo sync')}}</div>
<div class="btn btn-outline-secondary" id="kobo_full_sync" data-value="{% if current_user.role_admin() %}{{ content.id }}{% else %}0{% endif %}" {% if not content.remote_auth_token.first() %} style="display: none;" {% endif %}>{{_('Force full kobo sync')}}</div>
</div>
{% endif %}
<div class="col-sm-6">
@@ -139,8 +139,8 @@
{% if ( current_user and current_user.role_admin() and not new_user ) and not simple %}
<div class="col-sm-12">
<div class="form-group clearfix">
<a href="#" id="get_user_tags" class="btn btn-default" data-id="{{content.id}}" data-toggle="modal" data-target="#restrictModal">{{_('Add Allowed/Denied Tags')}}</a>
<a href="#" id="get_user_column_values" data-id="{{content.id}}" class="btn btn-default" data-toggle="modal" data-target="#restrictModal">{{_('Add allowed/Denied Custom Column Values')}}</a>
<a href="#" id="get_user_tags" class="btn btn-outline-secondary" data-id="{{content.id}}" data-bs-toggle="modal" data-bs-target="#restrictModal">{{_('Add Allowed/Denied Tags')}}</a>
<a href="#" id="get_user_column_values" data-id="{{content.id}}" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#restrictModal">{{_('Add allowed/Denied Custom Column Values')}}</a>
</div>
</div>
{% endif %}
@@ -151,9 +151,9 @@
{% endif %}
<div class="pull-right">
{% if not profile %}
<div class="btn btn-default" data-back="{{ url_for('admin.admin') }}" id="back">{{_('Cancel')}}</div>
<div class="btn btn-outline-secondary" data-back="{{ url_for('admin.admin') }}" id="back">{{_('Cancel')}}</div>
{% endif %}
<div id="user_submit" class="btn btn-default">{{_('Save')}}</div>
<div id="user_submit" class="btn btn-outline-secondary">{{_('Save')}}</div>
</div>
</div>
</form>
@@ -163,12 +163,12 @@
<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">&times;</span></button>
<h4 class="modal-title" id="kobo_tokenModalLabel">{{_('Generate Kobo Auth URL')}}</h4>
<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="kobo_close" class="btn btn-primary" data-dismiss="modal">{{_('Close')}}</button>
<button type="button" id="kobo_close" class="btn btn-primary" data-bs-dismiss="modal">{{_('Close')}}</button>
</div>
</div>
</div>
+18 -20
View File
@@ -232,20 +232,18 @@
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title text-center" id="metaModalLabel">{{_('Fetch 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">{{_("Search")}}</button>
</span>
</div>
</form>
<div class="text-center"><strong>{{_('Click the cover to load metadata to the form')}}</strong></div>
<h4 class="modal-title" id="metaModalLabel">{{_('Fetch Metadata')}}</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{_('Close')}}"></button>
</div>
<div class="modal-body">
<form class="padded-bottom" id="meta-search">
<div class="input-group">
<label class="visually-hidden" for="keyword">{{_('Keyword')}}</label>
<input type="text" class="form-control" id="keyword" name="keyword" placeholder="{{_("Search keyword")}}">
<button type="submit" class="btn btn-primary" id="do-search">{{_("Search")}}</button>
</div>
</form>
<div class="text-center padded-bottom"><strong>{{_('Click the cover to load metadata to the form')}}</strong></div>
<div class="text-center padded-bottom" id="metadata_provider">
</div>
@@ -263,25 +261,25 @@
{% block js %}
<script type="text/template" id="template-book-result">
<li class="media" data-related="<%- source.id %>">
<img class="pull-left img-responsive"
<li class="d-flex mb-3" data-related="<%- source.id %>">
<img class="flex-shrink-0 img-fluid"
data-bs-toggle="modal"
data-bs-target="#metaModal"
src="<%- cover || '{{ url_for('static', filename='img/academicpaper.svg') }}' %>"
alt="Cover"
>
<div class="media-body">
<h4 class="media-heading">
<div class="flex-grow-1 ms-3">
<h4 class="mb-1">
<a class="meta_title" href="<%- url %>" target="_blank" rel="noopener"><%- title %></a>
</h4>
<p class="meta_author">{{_('Author')}}:<%- authors.join(" & ") %></p>
<p class="meta_author mb-1">{{_('Author')}}:<%- authors.join(" & ") %></p>
<% if (publisher) { %>
<p class="meta_publisher">{{_('Publisher')}}:<%- publisher %></p>
<p class="meta_publisher mb-1">{{_('Publisher')}}:<%- publisher %></p>
<% } %>
<% if (description) { %>
<p class="meta_description">{{_('Description')}}: <%- description %></p>
<p class="meta_description mb-1">{{_('Description')}}: <%- description %></p>
<% } %>
<p>{{_('Source')}}:
<p class="mb-0">{{_('Source')}}:
<a class="meta_source" href="<%- source.link %>" target="_blank" rel="noopener"><%- source.description %></a>
</p>
</div>