Overhaul of info pages

* Updated style to match Plex/Web
* Full page background art
* Larger posters
* Navigation bar
This commit is contained in:
Jonathan Wong 2015-08-26 17:01:17 -07:00
parent ff0ed1abe4
commit 1e57e952db
2 changed files with 405 additions and 511 deletions

View file

@ -1,7 +1,8 @@
body { body {
font-family: 'Open Sans', sans-serif; font-family: 'Open Sans', sans-serif;
color: #fff; color: #fff;
padding-top: 50px; margin-top: 50px;
overflow: hidden;
} }
a { a {
color: #eee; color: #eee;
@ -39,6 +40,9 @@ img {
} }
.navbar { .navbar {
background: #000; background: #000;
-webkit-box-shadow: 0 0 0 3px rgba(0,0,0,.2);
-moz-box-shadow: 0 0 0 3px rgba(0,0,0,.2);
box-shadow: 0 0 0 3px rgba(0,0,0,.2);
} }
.navbar-brand { .navbar-brand {
padding: 5px 5px; padding: 5px 5px;
@ -488,24 +492,12 @@ a .users-poster-face:hover {
-moz-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1); -moz-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1); box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
} }
.users-poster-face img { a .poster-face:hover,
bottom: 0; a .cover-face:hover,
overflow: hidden; a .users-poster-face:hover {
float: left; webkit-box-shadow: inset 0 0 0 2px #e9a049;
background-color: #323232; -moz-box-shadow: inset 0 0 0 2px #e9a049;
background-position: center; box-shadow: inset 0 0 0 2px #e9a049;
background-size: cover;
-webkit-border-radius: 1000px;
-moz-border-radius: 1000px;
border-radius: 1000px;
-webkit-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
width: 40px;
height: 40px;
}
.users-poster-face img:hover{
-webkit-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 2px #F9AA03;
box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 2px #F9AA03;
} }
.users-name { .users-name {
position: relative; position: relative;
@ -537,13 +529,6 @@ a .users-poster-face:hover {
margin-bottom: 11px; margin-bottom: 11px;
text-align: center; text-align: center;
} }
.dashboard-activity-poster-face img {
bottom: 0;
overflow: hidden;
height: 140px;
min-width: 140px;
max-width: 250px;
}
.dashboard-activity-poster-music-bg { .dashboard-activity-poster-music-bg {
background-position: center; background-position: center;
position:absolute; position:absolute;
@ -683,8 +668,8 @@ a .users-poster-face:hover {
float: left; float: left;
min-height: 340px; min-height: 340px;
} }
.dashboard-recent-media-metacontainer{ .dashboard-recent-media-metacontainer {
width: 153px; width: 150px;
font-size: 13px; font-size: 13px;
margin-bottom: 20px; margin-bottom: 20px;
clear: both; clear: both;
@ -699,7 +684,7 @@ a .users-poster-face:hover {
margin: 0; margin: 0;
line-height: 15px; line-height: 15px;
font-weight: normal; font-weight: normal;
width: 153px; width: 150px;
white-space: nowrap; white-space: nowrap;
text-align: left; text-align: left;
clear: both; clear: both;
@ -714,244 +699,208 @@ a .users-poster-face:hover {
} }
.art-face { .art-face {
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 50% 0%; background-position: center center;
background-size: 100%; background-attachment: scroll;
height: 540px; background-size: cover;
overflow: hidden; opacity: 0;
min-width: 280px; position: absolute;
position: relative; top: 0;
-webkit-border-radius: 2px; bottom: 0;
-moz-border-radius: 2px; width: 100%;
border-radius: 2px;
-webkit-box-shadow: 0 0 0px rgba(0,0,0,0.75);
-moz-box-shadow: 0 0 0px rgba(0,0,0,0.75);
box-shadow: 0 0 0px rgba(0,0,0,0.75);
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
-o-transform-style: preserve-3d;
transform-style: preserve-3d;
-webkit-perspective: 1000;
-moz-perspective: 1000;
-ms-perspective: 1000;
-o-perspective: 1000;
perspective: 1000;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-o-backface-visibility: hidden;
backface-visibility: hidden;
clear: both;
}
.art-face img {
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
border-color: #1d1d1d;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
-webkit-box-shadow: 0 0 10px rgba(0,0,0,0.75);
-moz-box-shadow: 0 0 10px rgba(0,0,0,0.75);
box-shadow: 0 0 10px rgba(0,0,0,0.75);
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
-o-transform-style: preserve-3d;
transform-style: preserve-3d;
-webkit-perspective: 1000;
-moz-perspective: 1000;
-ms-perspective: 1000;
-o-perspective: 1000;
perspective: 1000;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-o-backface-visibility: hidden;
backface-visibility: hidden;
} }
.art-music-face { .art-music-face {
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 50% 50%; background-position: center;
background-size: 100%; background-size: cover;
width: 250px; width: 250px;
height: 141px;
overflow: hidden;
position: relative; position: relative;
-webkit-border-radius: 2px; top: 0;
-moz-border-radius: 2px; bottom: 0;
border-radius: 2px;
-webkit-box-shadow: 0 0 0px rgba(0,0,0,0.75);
-moz-box-shadow: 0 0 0px rgba(0,0,0,0.75);
box-shadow: 0 0 0px rgba(0,0,0,0.75);
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
-o-transform-style: preserve-3d;
transform-style: preserve-3d;
-webkit-perspective: 1000;
-moz-perspective: 1000;
-ms-perspective: 1000;
-o-perspective: 1000;
perspective: 1000;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-o-backface-visibility: hidden;
backface-visibility: hidden;
clear: both;
} }
.summary-wrapper { .summary-container {
height: auto;
width: 100%;
position: absolute; position: absolute;
top: 0;
right: 0;
bottom: 0; bottom: 0;
left: 0;
overflow-x: hidden;
overflow-y: auto;
} }
.summary-overlay { .summary-container .table-card-header,
background-color: rgba(0,0,0,0.85); .summary-container .table-card-back {
color: #fff; opacity: 0.90;
font-size: 14px;
height: auto;
position: relative;
top: 0px;
border-color: #1d1d1d;
border: 2px solid #191919;
} }
.summary-content-wrapper { .summary-navbar {
margin-left: auto; background-color: rgba(255,255,255,.03);
margin-right: auto; height: 100px;
width: 960px; line-height: 50px;
padding-top: 50px;
} }
.summary-content-poster { .summary-navbar-list {
position: relative; padding: 0 25px;
top: -10px;
float: left;
margin-left: 25px;
width: 150px;
height: 225px;
}
.summary-content-poster img {
bottom: 0;
overflow: hidden;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
-webkit-box-shadow: 0 0 10px rgba(0,0,0,0.75);
-moz-box-shadow: 0 0 10px rgba(0,0,0,0.75);
box-shadow: 0 0 10px rgba(0,0,0,0.75);
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
-o-transform-style: preserve-3d;
transform-style: preserve-3d;
-webkit-perspective: 1000;
-moz-perspective: 1000;
-ms-perspective: 1000;
-o-perspective: 1000;
perspective: 1000;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-o-backface-visibility: hidden;
backface-visibility: hidden;
}
.summary-content {
position: relative;
top: 0px;
left: 20px;
color: #999; color: #999;
height: auto;
overflow: hidden;
margin-right: 20px;
margin-bottom: 20px;
} }
.summary-content-title h1{ .summary-navbar-list span {
margin-top: 15px;
margin-bottom: 15px;
color: #F9AA03;
font-size: 24px;
line-height: 32px;
float: left; float: left;
margin-right: 20px;
} }
.summary-content-title h1 a{ .summary-navbar-list span a {
color: #999;
}
.summary-navbar-list span a:hover {
color: #F9AA03; color: #F9AA03;
} }
.summary-content-title h1 a:hover{ .summary-content-title-wrapper {
height: 150px;
padding-top: 50px;
}
.summary-content-title {
overflow: hidden;
position: relative;
max-height: 100px;
}
.summary-content-title h1 {
margin-top: 0;
margin-bottom: 10px;
color: #F9AA03;
font-size: 28px;
line-height: 40px;
float: left;
clear: left;
}
.summary-content-title h1 a {
color: #F9AA03;
}
.summary-content-title h1 a:hover {
color: #F9AA03; color: #F9AA03;
text-decoration: underline; text-decoration: underline;
} }
.summary-content-title h2 {
margin-top: 0;
margin-bottom: 10px;
color: #fff;
font-size: 28px;
line-height: 40px;
float: left;
clear: left;
}
.summary-content-title h3 {
margin-top: 0;
margin-bottom: 10px;
color: #999;
font-size: 28px;
line-height: 40px;
float: right;
}
.summary-content-title h3 a:hover {
text-decoration: underline;
}
.summary-content-title h3 a {
color: #999;
}
.summary-content-wrapper {
background-image: linear-gradient(rgba(0,0,0,.4),rgba(19,19,19,.4) 50%,rgba(26,26,26,.4));
background-clip: content-box;
min-height: 100%;
}
.summary-content-poster {
float: left;
width: 250px;
margin: 0 40px 0 25px;
height: 100px;
overflow: visible;
}
.summary-poster-face {
background-position: center;
background-size: cover;
height: 375px;
width: 250px;
position: relative;
webkit-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
-moz-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
overflow: hidden;
}
.summary-poster-face-episode {
background-position: center;
background-size: cover;
height: 140px;
width: 250px;
position: relative;
webkit-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
-moz-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
overflow: hidden;
}
a .summary-poster-face:hover,
a .summary-poster-face-episode:hover {
webkit-box-shadow: inset 0 0 0 2px #e9a049;
-moz-box-shadow: inset 0 0 0 2px #e9a049;
box-shadow: inset 0 0 0 2px #e9a049;
}
.summary-content-padding {
float: left;
width: 250px;
height: 1px;
margin: 0 40px 20px 25px;
}
.summary-content {
position: relative;
color: #999;
overflow: hidden;
padding-right: 10px;
margin-bottom: 20px;
}
.summary-content-details-wrapper { .summary-content-details-wrapper {
width: 100%; width: 100%;
padding-bottom: 15px; padding: 10px 0 15px 0;
margin-top: -10px;
clear: both;
position: relative; position: relative;
top: -15px; float: left;
} }
.summary-content-director { .summary-content-director {
float: left; float: left;
margin-right: 10px;
line-height: 24px; line-height: 24px;
} }
.summary-content-director strong { .summary-content-director strong {
color: #fff; color: #fff;
margin-left: 2px; margin-left: 2px;
margin-right: 10px;
} }
.summary-content-studio { .summary-content-studio {
float: left; float: left;
margin-right: 10px;
line-height: 24px; line-height: 24px;
} }
.summary-content-studio strong { .summary-content-studio strong {
color: #fff; color: #fff;
margin-left: 2px; margin-left: 2px;
margin-right: 10px;
} }
.summary-content-airdate { .summary-content-airdate {
float: left; float: left;
margin-right: 10px;
line-height: 24px; line-height: 24px;
} }
.summary-content-airdate strong { .summary-content-airdate strong {
color: #fff; color: #fff;
margin-left: 2px; margin-left: 2px;
margin-right: 10px;
} }
.summary-content-duration { .summary-content-duration {
float: left; float: left;
margin-right: 10px;
line-height: 24px; line-height: 24px;
} }
.summary-content-duration strong { .summary-content-duration strong {
color: #fff; color: #fff;
margin-left: 2px; margin-left: 2px;
margin-right: 10px;
} }
.summary-content-content-rating { .summary-content-content-rating {
float: left; float: left;
line-height: 24px; line-height: 24px;
margin-right: 10px;
} }
.summary-content-content-rating strong { .summary-content-content-rating strong {
color: #fff; color: #fff;
margin-left: 2px; margin-left: 2px;
margin-right: 10px;
} }
.summary-content-summary { .summary-content-summary {
overflow: hidden; overflow: hidden;
@ -959,14 +908,12 @@ a .users-poster-face:hover {
float: left; float: left;
position: relative; position: relative;
clear: both; clear: both;
padding-right: 10px;
height: auto; height: auto;
max-height: 160px; max-height: 160px;
padding-bottom: 0px; padding-bottom: 0px;
} }
.summary-content-people-wrapper { .summary-content-people-wrapper {
margin-top: 25px; margin-right: 20px;
margin-right: 25px;
float: left; float: left;
} }
.summary-content-people-wrapper hidden-phone hidden-tablet { .summary-content-people-wrapper hidden-phone hidden-tablet {
@ -975,9 +922,7 @@ a .users-poster-face:hover {
min-height: 0px; min-height: 0px;
} }
.summary-content-actors { .summary-content-actors {
margin-top: 0px; margin-top: 13px;
margin-left: 0px;
margin-right: 15px;
font-size: 12px; font-size: 12px;
line-height: 18px; line-height: 18px;
color: #999; color: #999;
@ -985,6 +930,7 @@ a .users-poster-face:hover {
} }
.summary-content-actors ul { .summary-content-actors ul {
padding-left:20px; padding-left:20px;
margin-bottom: 0;
} }
.summary-content-actors li { .summary-content-actors li {
list-style: none; list-style: none;
@ -995,9 +941,7 @@ a .users-poster-face:hover {
color: #fff; color: #fff;
} }
.summary-content-genres { .summary-content-genres {
margin-top: 0px; margin-top: 13px;
margin-left: 0px;
margin-right: 15px;
font-size: 12px; font-size: 12px;
line-height: 18px; line-height: 18px;
color: #999; color: #999;
@ -1005,6 +949,7 @@ a .users-poster-face:hover {
} }
.summary-content-genres ul { .summary-content-genres ul {
padding-left:20px; padding-left:20px;
margin-bottom: 0;
} }
.summary-content-genres li { .summary-content-genres li {
list-style: none; list-style: none;
@ -1015,9 +960,7 @@ a .users-poster-face:hover {
color: #fff; color: #fff;
} }
.summary-content-writers { .summary-content-writers {
margin-top: 0px; margin-top: 13px;
margin-left: 0px;
margin-right: 15px;
font-size: 12px; font-size: 12px;
line-height: 18px; line-height: 18px;
color: #999; color: #999;
@ -1025,6 +968,7 @@ a .users-poster-face:hover {
} }
.summary-content-writers ul { .summary-content-writers ul {
padding-left: 20px; padding-left: 20px;
margin-bottom: 0;
} }
.summary-content-writers li { .summary-content-writers li {
list-style: none; list-style: none;
@ -1037,7 +981,6 @@ a .users-poster-face:hover {
.rateit { .rateit {
display: -moz-inline-box; display: -moz-inline-box;
display: inline-block; display: inline-block;
position: relative;
-webkit-user-select: none; -webkit-user-select: none;
-khtml-user-select: none; -khtml-user-select: none;
-moz-user-select: none; -moz-user-select: none;
@ -1045,18 +988,21 @@ a .users-poster-face:hover {
-ms-user-select: none; -ms-user-select: none;
user-select: none; user-select: none;
-webkit-touch-callout: none; -webkit-touch-callout: none;
float: right;
margin-top: 23px;
margin-right: 20px;
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
float: right;
margin-top: 3px;
height: 21px;
} }
.rateit .rateit-range { .rateit .rateit-range {
background: url(../images/star-gray-16.png); background: url(../images/star-gray-32.png);
background-size: contain;
height: 16px; height: 16px;
} }
.rateit .rateit-selected { .rateit .rateit-selected {
background: url(../images/star-16.png); background: url(../images/star-32.png);
background-size: contain;
height: 16px;
} }
.season-episodes-wrapper { .season-episodes-wrapper {
} }
@ -1090,17 +1036,6 @@ a .season-episodes-card-overlay:hover {
-moz-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1); -moz-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1); box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
} }
.season-episodes-poster-face img {
bottom: 0;
overflow: hidden;
width: 250px;
height: 140px;
}
.season-episodes-poster-face img:hover {
webkit-box-shadow: 0 0 0 2px #F9AA03;
-moz-box-shadow: 0 0 0 2px #F9AA03;
box-shadow: 0 0 0 2px #F9AA03;
}
.season-episodes-card-overlay { .season-episodes-card-overlay {
position: absolute; position: absolute;
left: 0; left: 0;
@ -1184,20 +1119,6 @@ a .season-episodes-card-overlay:hover {
-moz-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1); -moz-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1); box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
} }
.user-info-poster-face img {
bottom: 0;
margin-right: 15px;
overflow: hidden;
float: left;
background-color: #323232;
background-position: center;
background-size: cover;
-webkit-border-radius: 1000px;
-moz-border-radius: 1000px;
border-radius: 1000px;
-webkit-box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
box-shadow: 0 0 4px rgba(0,0,0,.3),inset 0 0 0 1px rgba(255,255,255,.1);
}
.user-info-username { .user-info-username {
font-size: 24px; font-size: 24px;
color: #fff; color: #fff;
@ -1824,7 +1745,6 @@ a .home-platforms-instance-box:hover {
position: relative; position: relative;
margin-right: 3px; margin-right: 3px;
} }
#updatebar a:hover { #updatebar a:hover {
color: #F9AA03; color: #F9AA03;
} }

View file

@ -47,211 +47,205 @@ DOCUMENTATION :: END
% if data: % if data:
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div> <div class="art-face" style="background-image:url(pms_image_proxy?img=${data['art']}&width=1920&height=1080)"></div>
<div class="art-face" style="background-image:url(pms_image_proxy?img=${data['art']}&width=1920&height=1080)"> <div class="summary-container">
<div class="summary-wrapper"> <div class="summary-navbar">
<div class="summary-overlay"> <div class="col-md-12">
<div class="row"> <div class="summary-navbar-list">
<div class="col-md-9"> % if data['type'] == 'movie':
<div class="summary-content-poster hidden-xs hidden-sm"> <span>Movie</span>
% if data['type'] == 'episode': <span><i class="fa fa-chevron-right"></i></span>
<a href="info?item_id=${data['parent_rating_key']}"> <span><a href="#">${data['title']}</a></span>
% if data['parent_thumb']: % elif data['type'] == 'show':
<div class="poster-face" style="background-image: url(pms_image_proxy?img=${data['parent_thumb']}&width=300&height=450&fallback=poster);"></div> <span>TV Shows</span>
% else: <span><i class="fa fa-chevron-right"></i></span>
<div class="poster-face" style="background-image: url(pms_image_proxy?img=${data['grandparent_thumb']}&width=300&height=450&fallback=poster);"></div> <span><a href="#">${data['title']}</a></span>
%endif % elif data['type'] == 'season':
</a> <span>TV Shows</span>
% elif data['type'] == 'season': <span><i class="fa fa-chevron-right"></i></span>
<a href="info?item_id=${data['parent_rating_key']}"> <span><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></span>
<div class="poster-face" style="background-image: url(pms_image_proxy?img=${data['thumb']}&width=300&height=450&fallback=poster);"></div> <span><i class="fa fa-chevron-right"></i></span>
</a> <span><a href="#">Season ${data['index']}</a></span>
% else: % elif data['type'] == 'episode':
<div class="poster-face" style="background-image: url(pms_image_proxy?img=${data['thumb']}&width=300&height=450&fallback=poster);"></div> <span>TV Shows</span>
% endif <span><i class="fa fa-chevron-right"></i></span>
</div> <span><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a></span>
<div class="summary-content"> <span><i class="fa fa-chevron-right"></i></span>
<div class="summary-content-title"> <span><a href="info?item_id=${data['parent_rating_key']}">Season ${data['parent_index']}</a></span>
% if data['type'] == 'movie': <span><i class="fa fa-chevron-right"></i></span>
<h1>${data['title']}</h1> <span><a href="#">${data['title']}</a></span>
% elif data['type'] == 'season': % endif
<h1><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a> (${data['title']})</h1>
% elif data['type'] == 'episode':
<h1><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a> - ${data['title']}
(<a href="info?item_id=${data['parent_rating_key']}">Season ${data['parent_index']}</a>, Episode ${data['index']})</h1>
% else:
<h1>${data['title']}</h1>
% endif
</div>
% if (data['type'] == 'movie' or data['type'] == 'show' or data['type'] == 'episode') and data['rating']:
<div id="stars" class="rateit hidden-xs hidden-sm" data-rateit-value=""
data-rateit-ispreset="true" data-rateit-readonly="true"></div>
% endif
<div class="summary-content-details-wrapper">
<div class="summary-content-director">
% if (data['type'] == 'episode' or data['type'] == 'movie') and data['directors']:
Directed by <strong> ${data['directors'][0]}</strong>
% endif
</div>
<div class="summary-content-studio">
% if (data['type'] == 'show' or data['type'] == 'movie') and data['studio']:
Studio <strong> ${data['studio']}</strong>
% endif
</div>
<div class="summary-content-airdate">
% if data['type'] == 'movie':
Year <strong> ${data['year']}</strong>
% elif data['type'] == 'show':
Aired <strong> ${data['year']}</strong>
% elif data['type'] == 'episode':
Aired <strong> <span id="airdate">${data['originally_available_at']}</span></strong>
% endif
</div>
<div class="summary-content-duration">
Runtime <strong> <span id="runtime">${data['duration']}</span> mins</strong>
</div>
<div class="summary-content-content-rating">
% if (data['type'] == 'episode' or data['type'] == 'movie' or data['type'] == 'show') and data['content_rating']:
Rated <strong> ${data['content_rating']} </strong>
% endif
</div>
</div>
<div class="summary-content-summary">
<p> ${data['summary']} </p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="summary-content-people-wrapper hidden-xs hidden-sm">
% if (data['type'] == 'episode' or data['type'] == 'movie') and data['writers']:
<div class="summary-content-writers">
<strong>Written by</strong>
<ul>
% for writer in data['writers']:
% if loop.index < 5:
<li>
${writer}
</li>
% endif
% endfor
</ul>
</div>
% endif
% if (data['type'] == 'movie' or data['type'] == 'show') and data['actors']:
<div class="summary-content-actors">
<strong>Starring</strong>
<ul>
% for actor in data['actors']:
% if loop.index < 5:
<li>
${actor}
</li>
% endif
% endfor
</ul>
</div>
% endif
</div>
<div class="summary-content-people-wrapper hidden-xs hidden-sm">
% if (data['type'] == 'movie' or data['type'] == 'show') and data['genres']:
<div class="summary-content-genres">
<strong>Genres</strong>
<ul>
% for genre in data['genres']:
% if loop.index < 5:
<li>
${genre}
</li>
% endif
% endfor
</ul>
</div>
% endif
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> <div class="summary-content-title-wrapper">
</div> <div class="col-md-9">
</div> <div class="summary-content-poster hidden-xs hidden-sm">
% if data['type'] == 'movie' or data['type'] == 'episode' or data['type'] == 'show': % if data['type'] == 'episode':
<div class='container-fluid'> <div class="summary-poster-face-episode" style="background-image: url(pms_image_proxy?img=${data['thumb']}&width=500&height=280&fallback=poster);"></div>
<div class='row'> % elif data['type'] == 'season':
<div class='col-md-12'> <div class="summary-poster-face" style="background-image: url(pms_image_proxy?img=${data['thumb']}&width=300&height=450&fallback=poster);"></div>
<div class='table-card-header'> % else:
<div class="header-bar"> <div class="summary-poster-face" style="background-image: url(pms_image_proxy?img=${data['thumb']}&width=300&height=450&fallback=poster);"></div>
<span>Watch History for <strong>${data['title']}</strong></span> % endif
</div> </div>
<div class="button-bar"> <div class="summary-content-title">
<span data-toggle="popover" data-placement="left" data-content="Select rows to delete. Data is deleted upon exiting delete mode." id="delete-message"> % if data['type'] == 'movie' or data['type'] == 'show':
<button class="btn btn-danger" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode"> <h1>&nbsp;</h1><h1>${data['title']}</h1>
<i class="fa fa-trash-o"></i> Delete mode % elif data['type'] == 'season':
</button>&nbsp <h1>&nbsp;</h1><h1><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a></h1>
</span> <h3 class="hidden-xs">S${data['index']}</h3>
<div class="colvis-button-bar hidden-xs"></div> % elif data['type'] == 'episode':
</div> <h1><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a></h1>
</div> <h2>${data['title']}</h2>
<div class="table-card-back"> <h3 class="hidden-xs">S${data['parent_index']} &middot; E${data['index']}</h3>
<table class="display" id="history_table" width="100%"> % endif
<thead>
<tr>
<th align='left' id="delete">Delete</th>
<th align='left' id="time">Time</th>
<th align='left' id="friendly_name">User</th>
<th align='left' id="ip_address">IP Address</th>
<th align='left' id="platform">Platform</th>
<th align='left' id="title">Title</th>
<th align='left' id="started">Started</th>
<th align='left' id="paused_counter">Paused</th>
<th align='left' id="stopped">Stopped</th>
<th align='left' id="duration">Duration</th>
<th align='left' id="percent_complete"></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<div id="info-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="info-modal">
</div>
<div class="modal fade" id="ip-info-modal" tabindex="-1" role="dialog" aria-labelledby="ip-info-modal">
</div>
<div class="modal fade" id="confirm-modal" tabindex="-1" role="dialog" aria-labelledby="confirm-modal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
<h4 class="modal-title" id="myModalLabel">Confirm Delete</h4>
</div>
<div class="modal-body" style="text-align: center;">
<p>Are you REALLY sure you want to delete <strong><span id="deleteCount"></span></strong> history item(s)?</p>
<p>This is permanent and cannot be undone!</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-dark" data-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-danger btn-ok" data-dismiss="modal" id="confirm-delete">Delete</button>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> <div class="summary-content-wrapper">
</div> <div class="col-md-9">
</div> % if data['type'] == 'movie' or data['type'] == 'show' or data['type'] == 'season':
% elif data['type'] == 'season': <div class="summary-content-padding hidden-xs hidden-sm" style="height: 275px;"></div>
<div class='container-fluid'> % else:
<div class='row'> <div class="summary-content-padding hidden-xs hidden-sm"></div>
<div class='col-md-12'> % endif
<div class='table-card-header'> <div class="summary-content">
<div class="header-bar"> <div class="summary-content-details-wrapper">
<span>Episode List for <strong>${data['title']}</strong></span> % if (data['type'] == 'movie' or data['type'] == 'show' or data['type'] == 'episode') and data['rating']:
<div id="stars" class="rateit hidden-xs hidden-sm" data-rateit-value=""
data-rateit-ispreset="true" data-rateit-readonly="true"></div>
% endif
<div class="summary-content-director">
% if (data['type'] == 'episode' or data['type'] == 'movie') and data['directors']:
Directed by <strong> ${data['directors'][0]}</strong>
% endif
</div>
<div class="summary-content-studio">
% if (data['type'] == 'show' or data['type'] == 'movie') and data['studio']:
Studio <strong> ${data['studio']}</strong>
% endif
</div>
<div class="summary-content-airdate">
% if data['type'] == 'movie':
Year <strong> ${data['year']}</strong>
% elif data['type'] == 'show':
Aired <strong> ${data['year']}</strong>
% elif data['type'] == 'episode':
Aired <strong> <span id="airdate">${data['originally_available_at']}</span></strong>
% endif
</div>
<div class="summary-content-duration">
Runtime <strong> <span id="runtime">${data['duration']}</span> mins</strong>
</div>
<div class="summary-content-content-rating">
% if (data['type'] == 'episode' or data['type'] == 'movie' or data['type'] == 'show') and data['content_rating']:
Rated <strong> ${data['content_rating']} </strong>
% endif
</div>
</div>
<div class="summary-content-summary">
<p> ${data['summary']} </p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="summary-content-people-wrapper hidden-xs hidden-sm">
% if (data['type'] == 'episode' or data['type'] == 'movie') and data['writers']:
<div class="summary-content-writers">
<strong>Written by</strong>
<ul>
% for writer in data['writers']:
% if loop.index < 5:
<li>
${writer}
</li>
% endif
% endfor
</ul>
</div>
% endif
% if (data['type'] == 'movie' or data['type'] == 'show') and data['actors']:
<div class="summary-content-actors">
<strong>Starring</strong>
<ul>
% for actor in data['actors']:
% if loop.index < 5:
<li>
${actor}
</li>
% endif
% endfor
</ul>
</div>
% endif
</div>
<div class="summary-content-people-wrapper hidden-xs hidden-sm">
% if (data['type'] == 'movie' or data['type'] == 'show') and data['genres']:
<div class="summary-content-genres">
<strong>Genres</strong>
<ul>
% for genre in data['genres']:
% if loop.index < 5:
<li>
${genre}
</li>
% endif
% endfor
</ul>
</div>
% endif
</div>
</div>
% if data['type'] == 'movie' or data['type'] == 'episode' or data['type'] == 'show':
<div class='col-md-12'>
<div class='table-card-header'>
<div class="header-bar">
<span>Watch History for <strong>${data['title']}</strong></span>
</div>
<div class="button-bar">
<button class="btn btn-danger" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode"><i class="fa fa-trash-o"></i> Delete mode</button>&nbsp
<div class="colvis-button-bar hidden-xs"></div>
</div>
</div>
<div class="table-card-back">
<table class="display" id="history_table" width="100%">
<thead>
<tr>
<th align='left' id="delete">Delete</th>
<th align='left' id="time">Time</th>
<th align='left' id="friendly_name">User</th>
<th align='left' id="ip_address">IP Address</th>
<th align='left' id="platform">Platform</th>
<th align='left' id="title">Title</th>
<th align='left' id="started">Started</th>
<th align='left' id="paused_counter">Paused</th>
<th align='left' id="stopped">Stopped</th>
<th align='left' id="duration">Duration</th>
<th align='left' id="percent_complete"></th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div id="info-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="info-modal">
</div>
<div class="modal fade" id="ip-info-modal" tabindex="-1" role="dialog" aria-labelledby="ip-info-modal">
</div>
</div>
% elif data['type'] == 'season':
<div class='col-md-12'>
<div class='table-card-header'>
<div class="header-bar">
<span>Episode List for <strong>${data['title']}</strong></span>
</div>
</div>
<div class='table-card-back'>
<div id="episode-list"></div>
</div>
% endif
</div> </div>
</div> </div>
<div class='table-card-back'>
<div id="episode-list"></div>
</div>
% endif
</div> </div>
</div> </div>
</div> </div>
@ -259,8 +253,10 @@ DOCUMENTATION :: END
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col-md-10"> <div class="col-md-10">
<h3>Error retrieving item data. This media may not be available in the Plex Media Server database <h3>
anymore.</h3> Error retrieving item data. This media may not be available in the Plex Media Server database
anymore.
</h3>
</div> </div>
</div> </div>
</div> </div>
@ -292,52 +288,28 @@ DOCUMENTATION :: END
type: 'post', type: 'post',
data: function ( d ) { data: function ( d ) {
return { 'json_data': JSON.stringify( d ), return { 'json_data': JSON.stringify( d ),
'rating_key': ${data['rating_key']} 'rating_key': ${data['rating_key']}
}; };
} }
} }
history_table = $('#history_table').DataTable(history_table_options); history_table = $('#history_table').DataTable(history_table_options);
var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark', exclude: [0, 10] }); var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark', exclude: [0, 10] });
$(colvis.button()).appendTo('div.colvis-button-bar'); $(colvis.button()).appendTo('div.colvis-button-bar');
clearSearchButton('history_table', history_table);
$('#row-edit-mode').on('click', function() { clearSearchButton('history_table', history_table);
$('#delete-message').popover();
if ($(this).hasClass('active')) { $('#row-edit-mode').click(function() {
if (history_to_delete.length > 0) { if ($(this).hasClass('active')) {
$('#deleteCount').text(history_to_delete.length); $('.delete-control').each(function() {
$('#confirm-modal').modal(); $(this).addClass('hidden');
$('#confirm-modal').one('click', '#confirm-delete', function () { });
for (var i = 0; i < history_to_delete.length; i++) { } else {
$.ajax({ $('.delete-control').each(function() {
url: 'delete_history_rows', $(this).removeClass('hidden');
data: { row_id: history_to_delete[i] }, });
async: true, }
success: function (data) { });
var msg = "User history purged";
showMsg(msg, false, true, 2000);
}
});
}
history_table.draw();
});
}
$('.delete-control').each(function () {
$(this).find('button.btn-danger').toggleClass('btn-warning').toggleClass('btn-danger');
$(this).addClass('hidden');
});
} else {
history_to_delete = [];
$('.delete-control').each(function() {
$(this).removeClass('hidden');
});
}
});
}); });
</script> </script>
% elif data['type'] == 'show': % elif data['type'] == 'show':
@ -349,31 +321,30 @@ DOCUMENTATION :: END
type: 'post', type: 'post',
data: function ( d ) { data: function ( d ) {
return { 'json_data': JSON.stringify( d ), return { 'json_data': JSON.stringify( d ),
'grandparent_rating_key': ${data['rating_key']} 'grandparent_rating_key': ${data['rating_key']}
}; };
} }
} }
history_table = $('#history_table').DataTable(history_table_options); history_table = $('#history_table').DataTable(history_table_options);
var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark', exclude: [0, 10] }); var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark', exclude: [0, 10] });
$(colvis.button()).appendTo('div.colvis-button-bar'); $(colvis.button()).appendTo('div.colvis-button-bar');
clearSearchButton('history_table', history_table); clearSearchButton('history_table', history_table);
$('#row-edit-mode').click(function() { $('#row-edit-mode').click(function() {
if ($(this).hasClass('active')) { if ($(this).hasClass('active')) {
$('.delete-control').each(function() { $('.delete-control').each(function() {
$(this).addClass('hidden'); $(this).addClass('hidden');
}); });
} else { } else {
$('.delete-control').each(function() { $('.delete-control').each(function() {
$(this).removeClass('hidden'); $(this).removeClass('hidden');
}); });
} }
}); });
}); });
</script> </script>
% endif % endif
% if data['type'] == 'season': % if data['type'] == 'season':
<script> <script>
$.ajax({ $.ajax({
@ -381,9 +352,9 @@ DOCUMENTATION :: END
type: "GET", type: "GET",
async: true, async: true,
data: { rating_key : ${data['rating_key']} }, data: { rating_key : ${data['rating_key']} },
complete: function(xhr, status) { complete: function(xhr, status) {
$("#episode-list").html(xhr.responseText); $("#episode-list").html(xhr.responseText);
} }
}); });
</script> </script>
% endif % endif
@ -392,4 +363,7 @@ DOCUMENTATION :: END
$("#runtime").html(millisecondsToMinutes($("#runtime").text(), true)); $("#runtime").html(millisecondsToMinutes($("#runtime").text(), true));
</script> </script>
% endif % endif
<script>
$('div.art-face').animate({ opacity: 0.2 }, { duration: 1000 });
</script>
</%def> </%def>