SickGear/gui/slick/interfaces/default/home_browseShows.tmpl
JackDandy 9e7ad9f5b2 Add persistent hide/unhide cards to Add show/Trakt and Add show/IMDb Cards.
Change simplify dropdowns at all Add show/Cards.
2017-05-20 10:47:03 +01:00

418 lines
17 KiB
Cheetah

#import sickbeard
#import datetime
#import re
#import urllib
#from sickbeard import WEB_ROOT, THEME_NAME
#from sickbeard.common import *
#from sickbeard import sbdatetime
#from sickbeard.helpers import anon_url
<% def sg_var(varname, default=False): return getattr(sickbeard, varname, default) %>#slurp#
<% def sg_str(varname, default=''): return getattr(sickbeard, varname, default) %>#slurp#
##
#set global $title='Browse %s Shows' % $browse_type
#set global $header='Browse Shows'
#set global $sbPath='..'
#set global $topmenu='home'
#set global $page_body_attr = 'browse-list'
#set sg_root = $getVar('sbRoot', WEB_ROOT)
##
#import os.path
#include $os.path.join($sg_str('PROG_DIR'), 'gui/slick/interfaces/default/inc_top.tmpl')
<script type="text/javascript" src="$sg_root/js/plotTooltip.js?v=$sbPID"></script>
<script type="text/javascript" charset="utf-8">
<!--
#raw
var addQTip = (function(){
$(this).css('cursor', 'help');
$(this).qtip({
show: {solo:true},
position: {viewport:$(window), my:'left center', adjust:{y: -10,x: 2 }},
style: {tip: {corner:true, method:'polygon'}, classes:'qtip-rounded qtip-bootstrap qtip-shadow ui-tooltip-sb'}
});
}),
llUpdate = (function(){
$.ll.handleScroll();
});
$(document).ready(function(){
// initialise combos for dirty page refreshes
$('#showsort').val('*');
$('#container').isotope({
itemSelector: '.show-card',
sortBy: 'original-order',
layoutMode: 'masonry',
masonry: {
columnWidth: 188,
isFitWidth: !0,
gutter: 12
},
getSortData: {
premiered: '[data-premiered] parseInt',
name: function( itemElem ) {
var name = $( itemElem ).attr('data-name') || '';
#end raw
#if not $sg_var('SORT_ARTICLE')
name = name.replace(/^(?:(?:A(?!\s+to)n?)|The)\s(\w)/i, '$1');
#end if
#raw
return name.toLowerCase();
},
rating: '[data-rating] parseInt',
votes: '[data-votes] parseInt',
}
});
$('#showsort').on('change', function(){
var sortCriteria, el$ = $('#container'), shuffle = !1;
switch (this.value.replace('by_', '')) {
case 'asc':
case 'desc':
sortCriteria = 'order';
break;
case 'original':
sortCriteria = 'original-order'
break;
case 'rating':
sortCriteria = 'rating';
shuffle = !0;
break;
case 'rating_votes':
sortCriteria = ['rating', 'votes'];
shuffle = !0;
break;
case 'votes':
sortCriteria = 'votes';
break;
case 'premiered':
sortCriteria = 'premiered';
break;
default:
sortCriteria = 'name'
break;
}
var showSort = $('#showsort option');
if('order' === sortCriteria){
showSort.filter($('option[value="asc"], option[value="desc"]')).removeClass('selected');
showSort.filter($('option[value="' + this.value + '"]')).addClass('selected');
el$.one('layoutComplete', llUpdate);
el$.isotope({sortAscending: 'asc' == this.value});
} else if(0 == this.value.indexOf('by_')){
showSort.filter($('option[value^="by_"][class*="selected"]')).removeClass('selected');
showSort.filter($('option[value="' + this.value + '"]')).addClass('selected');
if (!shuffle){
el$.one('layoutComplete', llUpdate);
el$.isotope({sortBy: sortCriteria});
} else {
// shuffle rating_votes where it can already be sorted by ratings which leaves it nothing to do.
function t(sortCriteria, lastPhase){
return function(){
var el$ = $('#container');
if (!lastPhase){
lastPhase = !0;
el$.isotope({sortBy: sortCriteria});
} else {
el$.off('layoutComplete');
el$.isotope('layout');
llUpdate();
}
}
}
el$.on('layoutComplete', t(sortCriteria, !1));
el$.isotope({sortBy: 'random'});
}
} else {
showSort.filter($('option[value^="*"], #showsort option[value^="."]')).removeClass('selected');
showSort.filter($('option[value="' + this.value + '"]')).addClass('selected');
var showCards = $('.show-card'), filter = this.value;
if('.hide' === this.value){
showCards.filter($('.hide')).removeClass('hide').addClass('to-hide');
filter = '.to-hide';
} else {
showCards.filter($('.to-hide')).removeClass('to-hide').addClass('hide');
}
var el$ = $('#container');
el$.one('layoutComplete', llUpdate);
el$.isotope({ filter: filter });
}
});
$('#container').on('click', '.show-toggle-hide', function(event){
var that = $(this);
event.preventDefault();
$.getJSON(this.href, function(data){
if(data.success){
var showCards = $('.show-card'), thisCard = $(that).parents('div[class*="show-card "]'),
numShows = showCards.length, numHidden, showSort = $('#showsort option'), filter = 'to-hide';
if(thisCard.hasClass(filter)){
title = 'Hide';
thisCard.removeClass(filter);
} else {
filter = 'hide';
title = 'Unhide';
thisCard.addClass(filter);
}
numHidden = showCards.filter($('.' + filter)).length;
that.attr('title', title);
showSort.filter($('option[value=".hide"]')).text('Hidden (' + numHidden + ')');
showSort.filter($('option[value="*"]')).text('All (' + (0 == numHidden ? '' : (numShows - numHidden) + '/') + numShows + ')');
var el$ = $('#container')
el$.on('layoutComplete', llUpdate);
el$.isotope();
}
});
});
$('#showfilter').on('change', function(){
var filterValue = this.value;
if (-1 == filterValue.indexOf('trakt') && -1 == filterValue.indexOf('imdb') && -1 == filterValue.indexOf('default')) {
var el$ = $('#container')
el$.on('layoutComplete', llUpdate);
el$.isotope({ filter: filterValue });
} else {
#end raw
location = '$sg_root/home/addShows/' + filterValue;
#raw
}
});
$('.service, .browse-image').each(addQTip);
});
#end raw
//-->
</script>
<style>
#set theme_suffix = ('', '-dark')['dark' == $getVar('sbThemeName', THEME_NAME)]
.bfr{position:absolute;left:-999px;top:-999px}.bfr img{width:16px;height:16px}.spinner{display:inline-block;width:16px;height:16px;background:url(${sg_root}/images/loading16${theme_suffix}.gif) no-repeat 0 0}
</style>
<div class="bfr"><img src="$sg_root/images/loading16${theme_suffix}.gif" /></div>
#if $varExists('header')
#set $heading = ('header', $header)
#else
#set $heading = ('title', $title)
#end if
<h1 style="margin-bottom:0" class="grey-text #echo '%s">%s' % $heading#</h1>
#set $mode = $kwargs and $kwargs.get('mode', '')
#if $all_shows or ($kwargs and $kwargs.get('show_header'))
<div class="pull-right" style="margin-top:-35px">
<select id="showsort" class="form-control form-control-inline input-sm">
#set $num_all = len($all_shows)
#set $selected = ' class="selected"'
<optgroup label="View">
<option value="*"#echo selected# selected="selected">All (#echo ('', '%s/' % ($num_all - $num_hidden))[0 < $num_hidden]#$num_all)</option>
<option value=".notinlibrary">Not In Library (#echo $num_all - $num_inlibrary#)</option>
<option value=".inlibrary">In Library ($num_inlibrary)</option>
#if 'Ani' not in $browse_type
<option value=".hide">Hidden ($num_hidden)</option>
#end if
</optgroup>
<optgroup label="Sort order">
<option value="asc"#echo selected#>Asc</option>
<option value="desc">Desc</option>
</optgroup>
<optgroup label="Sort by">
<option value="by_name">Name</option>
<option value="by_original" #echo selected#>Original</option>
<option value="by_premiered">First aired</option>
<option value="by_votes">Votes</option>
<option value="by_rating">% Rating</option>
<option value="by_rating_votes">% Rating > Votes</option>
</optgroup>
</select>
#if 'Ani' not in $browse_type
<select id="showfilter" class="form-control form-control-inline input-sm">
#set $selected = ' class="selected" selected="selected"'
#if 'Trakt' == $browse_type
<optgroup label="Trakt">
<option value="trakt_anticipated"#echo ('', selected)['anticipated' == $mode]#>Anticipating</option>
<option value="trakt_newseasons"#echo ('', selected)['newseasons' == $mode]#>New Seasons</option>
<option value="trakt_newshows"#echo ('', selected)['newshows' == $mode]#>New Shows</option>
<option value="trakt_popular"#echo ('', selected)['popular' == $mode]#>Popular</option>
<option value="trakt_trending"#echo ('', selected)['trending' == $mode]#>Trending</option>
</optgroup>
<optgroup label="Trakt last month">
<option value="trakt_watched"#echo ('', selected)['watched' == $mode]#>Most Watched</option>
<option value="trakt_played"#echo ('', selected)['played' == $mode]#>Most Played</option>
<option value="trakt_collected"#echo ('', selected)['collected' == $mode]#>Most Collected</option>
</optgroup>
<optgroup label="Trakt last 12 months">
<option value="trakt_watched?period=year"#echo ('', selected)['watched-year' == $mode]#>Most Watched</option>
<option value="trakt_played?period=year"#echo ('', selected)['played-year' == $mode]#>Most Played</option>
<option value="trakt_collected?period=year"#echo ('', selected)['collected-year' == $mode]#>Most Collected</option>
</optgroup>
#if any($sg_var('TRAKT_ACCOUNTS', []))
<optgroup label="Trakt recommended">
#for $account in $sg_var('TRAKT_ACCOUNTS')
#if $sg_var('TRAKT_ACCOUNTS').get($account).active and $sg_var('TRAKT_ACCOUNTS').get($account).name
<option value="trakt_recommended?account=$account"#echo ('', selected)[('recommended-%s' % $account) == $mode]#>for $sg_var('TRAKT_ACCOUNTS').get($account).name</option>
#end if
#end for
#else
<optgroup label="To get recommended">
<option value="trakt_recommended?action=add">Enable Trakt here</option>
#end if
</optgroup>
#if any($sg_var('TRAKT_ACCOUNTS', []))
<optgroup label="Trakt watchlisted">
#for $account in $sg_var('TRAKT_ACCOUNTS')
#if $sg_var('TRAKT_ACCOUNTS').get($account).active and $sg_var('TRAKT_ACCOUNTS').get($account).name
<option value="trakt_watchlist?account=$account"#echo ('', selected)[('watchlist-%s' % $account) == $mode]#>for $sg_var('TRAKT_ACCOUNTS').get($account).name</option>
#end if
#end for
#else
<optgroup label="To get watchlisted">
<option value="trakt_watchlist?action=add">Enable Trakt here</option>
#end if
</optgroup>
#elif 'IMDb' == $browse_type
#set $periods = $kwargs and $kwargs.get('periods')
#if $periods
<optgroup label="IMDb Popular">
#for $i, $p in enumerate($periods)
#set $period='%s,%s' % ($p[0], $p[1])
<option value="popular_imdb?period=$period"#echo ('', selected)[('popular-%s' % $period) == $mode]#>#echo '%s - %s' % (($p[1], 'Current')[not $i], $p[0])#</option>
#end for
</optgroup>
#end if
#if not hasattr($sickbeard, 'IMDB_ACCOUNTS')#<optgroup label="Restart SickGear to reveal"><option>new options after restart</option></optgroup>#else#
<optgroup label="IMDb Watchlists">
#if any($sg_var('IMDB_ACCOUNTS', []))
#for $i, $v in $enumerate($sg_var('IMDB_ACCOUNTS'))
#if not $i % 2
#set $id = $v
#elif not $v.startswith('(Off) ')
<option value="watchlist_imdb?account=$id"#echo ('', selected)[('watchlist-%s' % $id) == $mode]#>#echo '%s%s' % ($v, ('\'s', '')['your' == $v.replace('(Off) ', '').lower()])# list</option>
#end if
#end for
#end if
<option value="watchlist_imdb?action=add"><< Add lists >></option>
</optgroup>
#end if
#end if
</select>
#end if
</div>
<h4 style="float:left;margin:0 0 0 2px">$browse_title</h4>
#if $kwargs and $kwargs.get('oldest')
<div class="grey-text" style="clear:both;margin-left:2px;font-size:0.85em">
First aired from $kwargs['oldest'] until $kwargs['newest']
</div>
#end if
#end if
<div id="container">
#if $all_shows
#set $poster_id = 0
#for $this_show in $all_shows
#set $poster_id += 1
#set $title_html = $this_show['title'].replace('"', '&quot;').replace("'", '&#39;')
#if 'newseasons' == $mode
#set $overview = '%s: %s' % (
('Season %s' % $this_show['episode_season'], 'Brand-new')[1 == $this_show['episode_season']],
($this_show['overview'], $this_show['episode_overview'])[any($this_show['episode_overview']) and 1 != $this_show['episode_season']])
#else
#set $overview = $this_show['overview']
#end if
#set $known = 'not'
#set $show_id = $this_show['show_id']
#if ':' in $show_id
#set $known = ''
#set $show_id = $show_id[2:]
#end if
#set $hide = ('', 'hide ')[$show_id in $sickbeard.BROWSELIST_HIDDEN]
<div class="show-card ${hide}${known}inlibrary" data-name="#echo re.sub(r'([\'\"])', r'', $this_show['title'])#" data_id="$show_id" data-rating="$this_show['rating']" data-votes="$this_show['votes']" data-premiered="$this_show['premiered']">
<div class="show-card-inner">
<div class="browse-image">
<a class="browse-image" href="<%= anon_url(this_show['url_src_db']) %>" target="_blank"
title="<span style='color: rgb(66, 139, 202)'>$re.sub(r'(?m)\s+\((?:19|20)\d\d\)\s*$', '', $title_html)</span>#if $this_show['genres']#<br /><div style='font-weight:bold'>(<em>$this_show['genres']</em>)</div>#end if#
<p style='margin:0 0 2px'>#echo re.sub(r'([,\.!][^,\.!]*?)$', '...', re.sub(r'([!\?\.])(?=\w)', r'\1 ', $overview))#</p>
<p><span style='font-weight:bold;font-size:0.9em;color:#888'><em>#if $kwargs and 'newseasons' == $mode#Air#else#First air#end if##echo ('s', 'ed')[$this_show['when_past']]#: $this_show['premiered_str']</em></span>
#if $this_show.get('ended_str')# - <span style='font-weight:bold;font-size:0.9em;color:#888'><em>Ended: $this_show['ended_str']</em></span>#end if#</p>
<span style='float:right'>Click for more at <span class='boldest'>$browse_type</span></span>">
#if 'poster' in $this_show['images']
#set $image = $this_show['images']['poster']['thumb']
<img id="poster-$poster_id" alt="" class="browse-image" data-original="#if $image and 'http' != $image[:4]#$sg_root/#end if#$image" />
<span id="loading-poster-$poster_id" class="lazy-loading-image"><i class="spinner"></i></span>
#else
<span>&nbsp;</span>
#end if
</a>
</div>
<div class="show-title">
#echo ((re.sub('^((?:A(?!\s+to)n?)|The)\s(\w)', r'<span class="article">\1</span> \2', $this_show['title']), $this_show['title'])[$sg_var('SORT_ARTICLE')], '<span>&nbsp;</span>')['' == $this_show['title']]#
</div>
#if 'Ani' not in $browse_type
<a class="show-toggle-hide" href="$sg_root/home/addShows/show_toggle_hide?ids=$show_id#echo ('', ':%s' % $this_show['ids'].get('imdb', '-'))['Trakt' == $browse_type]#" title="#echo ('H', 'Unh')[any($hide)]#ide"><i class="sgicon-delete"></i></a>
#end if
<div class="clearfix">
<p>$this_show['rating']%<i class="heart icon-glyph"></i><i>$this_show['votes'] votes</i></p>
#if 'url_tvdb' in $this_show and $this_show['url_tvdb']
<a class="service" href="<%= anon_url(this_show['url_tvdb']) %>" onclick="window.open(this.href, '_blank'); return false;"
title="View <span class='boldest'>tvdb</span> detail for <span style='color: rgb(66, 139, 202)'>$title_html</span>">
<i><img style="margin-top:5px" alt="tvdb" height="16" width="16" src="$sg_root/images/$sickbeard.indexerApi($sickbeard.indexers.indexer_config.INDEXER_TVDB).config['icon']" /></i></a>
#end if
<div class="browse-add-show-holder">
#if ':' in $this_show['show_id']
<p style="line-height:1.5;padding:2px 5px 3px" title="#echo '%s added' % $sickbeard.indexerApi(this_show['show_id'][:1]).config.get('name')#">In library</p>
#else
<a href="$sg_root/home/addShows/add${browse_type}Show?indexer_id=${this_show['show_id']}&amp;showName=${urllib.quote($this_show['title'].encode("utf-8"))}" class="btn btn-xs">Add Show</a>
#end if
</div>
</div>
</div>
<div class="ui-progressbar ui-widget ui-widget-content ui-corner-all">
#set $state = 'progress-%s0" title="%s"' % (('2', 'Upcoming'), ('8', 'Started'))[$this_show['when_past']]
<div style="width:102%" class="ui-progressbar-value ui-widget-header ui-corner-left ui-corner-right $state></div>
</div>
</div>
#end for
</div>
#if $kwargs and $kwargs.get('footnote')
<div style="clear:both">
$kwargs['footnote']
</div>
#end if
#else
<div class="show-card" style="width:100%; margin-top:20px; padding:20px">
<p class="red-text">
#if $kwargs and $kwargs.get('error_msg')
$kwargs['error_msg']
#else
$browse_type API did not return results, this can happen from time to time.
<br /><br />This view should auto refresh every 10 mins.
#end if
</p>
</div>
</div>
#end if
<script type="text/javascript" charset="utf-8">
<!--
window.setInterval('location.reload(true)', 600000); // Refresh every 10 minutes
//-->
</script>
<script type="text/javascript" src="$sg_root/js/lazyload/lazyload.min.js?v=$sbPID"></script>
<script type="text/javascript" src="$sg_root/js/inc_bottom.js?v=$sbPID"></script>
#include $os.path.join($sg_str('PROG_DIR'), 'gui/slick/interfaces/default/inc_bottom.tmpl')