SickGear/gui/slick/interfaces/default/home.tmpl
JackDandy e64cd430b8 Fix issue changing a custom show list group name that is in use.
The bug resulted in the db containing stale group names but worse, orphaned shows disappeared from the Show List page entirely.
PEP8 and code cleanup to SG conventions.
Changed texts to describe this feature more clearly from tag to group names.
Repositioned this feature on the add show, edit show, and config pages.
Change the drop down select to dynamically hide/show the list of group names and change the respectively selected help texts.
Change insert space between items in the list of group names for readability.
Notify user if an attempt to remove an in use group name is prevented.
Change Show List progress bar code, smaller page load, efficient use of js render engine.
Removed fixed column widths, this means multiple groups have different column widths, but the original approach is preferred because fixed widths look bad with long show titles.
2015-05-05 23:52:59 +01:00

576 lines
No EOL
20 KiB
Cheetah

#import sickbeard
#import datetime
#from sickbeard.common import *
#from sickbeard import sbdatetime, network_timezones
##
#set global $title = 'Home'
#set global $header = 'Show List'
#set global $sbPath = '..'
#set global $topmenu = 'home'
##
#import os.path
#include $os.path.join($sickbeard.PROG_DIR, 'gui/slick/interfaces/default/inc_top.tmpl')
<script type="text/javascript" charset="utf-8">
<!--
\$.tablesorter.addParser({
id: 'loadingNames',
is: function(s) {
return false;
},
format: function(s) {
if (s.indexOf('Loading...') == 0)
return s.replace('Loading...', '000');
else
#if not $sickbeard.SORT_ARTICLE
return (s || '').replace(/^(?:(?:A(?!\s+to)n?)|The)\s(\w)/i, '$1');
#else
return (s || '');
#end if
},
type: 'text'
});
\$.tablesorter.addParser({
id: 'quality',
is: function(s) {
return false;
},
format: function(s) {
return s.replace('hd1080p',5).replace('hd720p',4).replace('hd',3).replace('sd',2).replace('any',1).replace('custom',7);
},
type: 'numeric'
});
\$(document).ready(function(){
#slurp
#for $curShowlist in $showlists
#set $curListID = $curShowlist[0]
#if 'poster' != $layout
\$('#$curListID:has(tbody tr)').tablesorter({
sortList: [[5,1],[1,0]],
textExtraction: {
0: function(node) { return \$(node).find('span').text().toLowerCase(); },
2: function(node) { return \$(node).find('span').text().toLowerCase(); },
3: function(node) { return \$(node).find('span').text().toLowerCase(); },
4: function(node) { return \$(node).find('span').attr('data-progress'); },
5: function(node) { return \$(node).find('img').attr('alt'); }
},
widgets: ['saveSort', 'zebra', 'stickyHeaders', 'filter'],
headers: {
0: { sorter: 'isoDate' },
1: { sorter: 'loadingNames' },
3: { sorter: 'quality' },
4: { sorter: 'eps' }
},
widgetOptions : {
filter_columnFilters: false,
filter_reset: '.resetshows'
},
sortStable: true
});
\$.tablesorter.filter.bindSearch( '#$curListID', \$('.search') );
#else
var \$container = [\$('#$curListID')]
jQuery.each(\$container, function (j) {
this.isotope({
itemSelector: '.show',
sortBy : '$sickbeard.POSTER_SORTBY',
sortAscending: $sickbeard.POSTER_SORTDIR,
layoutMode: 'masonry',
masonry: {
columnWidth: 12,
isFitWidth: true
},
getSortData: {
name: function( itemElem ) {
var name = \$( itemElem ).attr('data-name');
#if not $sickbeard.SORT_ARTICLE
return (name || '').replace(/^(?:(?:A(?!\s+to)n?)|The)\s(\w)/i, '$1');
#else
return (name || '');
#end if
},
date: function( itemElem ) {
var date = \$( itemElem ).attr('data-date');
return date.length && parseInt( date, 10 ) || Number.POSITIVE_INFINITY;
},
network: '[data-network]',
progress: function( itemElem ) {
var progress = \$( itemElem ).children('.item-data').attr('data-progress');
return progress.length && parseInt( progress, 10 ) || Number.NEGATIVE_INFINITY;
}
}
});
});
\$('#postersort').on( 'change', function() {
var sortValue = this.value;
\$('#$curListID').isotope({ sortBy: sortValue });
\$.get(this.options[this.selectedIndex].getAttribute('data-sort'));
});
\$('#postersortdirection').on( 'change', function() {
var sortDirection = this.value;
sortDirection = sortDirection == 'true';
\$('#$curListID').isotope({ sortAscending: sortDirection });
\$.get(this.options[this.selectedIndex].getAttribute('data-sort'));
});
#end if
#end for
#raw
$('img#network').on('error', function(){
$(this).parent().text($(this).attr('alt'));
$(this).remove();
});
#end raw
#set $fuzzydate = 'airdate'
#if $sickbeard.FUZZY_DATING
fuzzyMoment({
dtInline : #if $layout == 'poster' then 'true' else 'false'#,
containerClass : '.${fuzzydate}',
dateHasTime : false,
dateFormat : '${sickbeard.DATE_PRESET}',
timeFormat : '${sickbeard.TIME_PRESET}',
trimZero : #if $sickbeard.TRIM_ZERO then 'true' else 'false'#
});
#end if
#if $sickbeard.HOME_SEARCH_FOCUS
\$('#search_show_name').focus();
#end if
});
//-->
</script>
#if $varExists('header')
<h1 class="header" style="margin-bottom:0">$showlists[0][1]</h1>
#else
<h1 class="title" style="margin-bottom:0">$title</h1>
#end if
#set $tab = 1
#if 'poster' != $layout
<div id="HomeLayout" class="pull-right not-poster">
<div class="not-poster">
<input id="search_show_name" class="search form-control form-control-inline input-sm input200" type="search" data-column="1" placeholder="Search Show Name" tabindex="$tab#set $tab += 1#">
&nbsp;<button type="button" class="resetshows resetanime btn btn-inline" tabindex="$tab#set $tab += 1#">Reset Search</button>
</div>
<span class="pull-right not-poster">Layout:
#else
<div id="HomeLayout" class="pull-right poster">
<span class="pull-right poster">Layout:
#end if
#set $selected = ' selected="selected"'
<select name="layout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;" tabindex="$tab#set $tab += 1#">
<option value="$sbRoot/setHomeLayout/?layout=poster"#echo $selected if 'poster' == sickbeard.HOME_LAYOUT else ''#>Poster</option>
<option value="$sbRoot/setHomeLayout/?layout=small"#echo $selected if 'small' == sickbeard.HOME_LAYOUT else ''#>Small Poster</option>
<option value="$sbRoot/setHomeLayout/?layout=banner"#echo $selected if 'banner' == sickbeard.HOME_LAYOUT else ''#>Banner</option>
<option value="$sbRoot/setHomeLayout/?layout=simple"#echo $selected if 'simple' == sickbeard.HOME_LAYOUT else ''#>Simple</option>
</select>
</span>
#if 'poster' == $layout
<span>Sort By:
<select id="postersort" class="form-control form-control-inline input-sm" tabindex="$tab#set $tab += 1#">
<option value="name" data-sort="$sbRoot/setPosterSortBy/?sort=name"#echo $selected if 'name' == sickbeard.POSTER_SORTBY else ''#>Name</option>
<option value="date" data-sort="$sbRoot/setPosterSortBy/?sort=date"#echo $selected if 'date' == sickbeard.POSTER_SORTBY else ''#>Next Episode</option>
<option value="network" data-sort="$sbRoot/setPosterSortBy/?sort=network"#echo $selected if 'network' == sickbeard.POSTER_SORTBY else ''#>Network</option>
<option value="progress" data-sort="$sbRoot/setPosterSortBy/?sort=progress"#echo $selected if 'progress' == sickbeard.POSTER_SORTBY else ''#>Progress</option>
</select>
</span>
<span style="margin:0 0 0 5px">Sort Order:
<select id="postersortdirection" class="form-control form-control-inline input-sm" tabindex="$tab#set $tab += 1#">
<option value="true" data-sort="$sbRoot/setPosterSortDir/?direction=1"#echo $selected if 1 == sickbeard.POSTER_SORTDIR else ''#>Asc</option>
<option value="false" data-sort="$sbRoot/setPosterSortDir/?direction=0"#echo $selected if 0 == sickbeard.POSTER_SORTDIR else ''#>Desc</option>
</select>
</span>
&nbsp;
#end if
</div><!-- /HomeLayout -->
#for $curShowlist in $showlists
#set $curListID = $curShowlist[0]
#set $curListName = $curShowlist[1]
#set $myShowList = $list($curShowlist[2])
#if $curShowlist != $showlists[0]
<h1 class="header">$curListName</h1>
#end if
#if 'poster' == $layout
<div id="$curListID" class="clearfix container">
<div class="posterview">
#for $curLoadingShow in $sickbeard.showQueueScheduler.action.loadingShowList
#if $curLoadingShow.show != None and $curLoadingShow.show in $sickbeard.showList
#continue
#end if
#if None is $curLoadingShow.show
<div class="show" data-name="0" data-date="010101" data-network="0">
<span class="item-data" data-progress="101" style="display:none"></span>
<img alt="" title="$curLoadingShow.show_name" class="show-image" style="border-bottom:1px solid #111" src="$sbRoot/images/poster.png" />
<div class="show-details">
<div class="show-add">Loading... ($curLoadingShow.show_name)</div>
</div>
</div>
#end if
#end for
$myShowList.sort(lambda x, y: cmp(x.name, y.name))
#for $curShow in $myShowList
#set $cur_airs_next = ''
#set $cur_snatched = 0
#set $cur_downloaded = 0
#set $cur_total = 0
#set $download_stat_tip = ''
#set $display_status = $curShow.status
#if None is not $display_status
#if re.search(r'(?i)(?:new|returning)\s*series', $curShow.status)
#set $display_status = 'Continuing'
#else if re.search(r'(?i)(?:nded)', $curShow.status)
#set $display_status = 'Ended'
#end if
#end if
#if $curShow.indexerid in $show_stat
#set $cur_airs_next = $show_stat[$curShow.indexerid]['ep_airs_next']
#set $cur_snatched = $show_stat[$curShow.indexerid]['ep_snatched']
#if not $cur_snatched
#set $cur_snatched = 0
#end if
#set $cur_downloaded = $show_stat[$curShow.indexerid]['ep_downloaded']
#if not $cur_downloaded
#set $cur_downloaded = 0
#end if
#set $cur_total = $show_stat[$curShow.indexerid]['ep_total']
#if not $cur_total
#set $cur_total = 0
#end if
#end if
#if $cur_total != 0
#set $download_stat = str($cur_downloaded)
#set $download_stat_tip = 'Downloaded: ' + str($cur_downloaded)
#if $cur_snatched > 0
#set $download_stat = download_stat
#set $download_stat_tip = download_stat_tip + '&#013;' + 'Snatched: ' + str($cur_snatched)
#end if
#set $download_stat = download_stat + ' / ' + str($cur_total)
#set $download_stat_tip = download_stat_tip + '&#013;' + 'Total: ' + str($cur_total)
#else
#set $download_stat = '?'
#set $download_stat_tip = 'no data'
#end if
#set $nom = $cur_downloaded
#set $den = $cur_total
#if $den == 0
#set $den = 1
#end if
#set $progressbar_percent = $nom * 100 / $den
#set $data_date = '600000000000'
#if $cur_airs_next
#set $data_date = $sbdatetime.sbdatetime.convert_to_setting($network_timezones.parse_date_time($cur_airs_next, $curShow.airs, $curShow.network)).strftime('%Y%m%d%H%M')
#else if None is not $display_status
#if 'nded' not in $display_status and 1 == int($curShow.paused)
#set $data_date = '500000000500'
#else if 'ontinu' in $display_status
#set $data_date = '500000000000'
#else if 'nded' in $display_status
#set $data_date = '500000000100'
#end if
#end if
<div id="show$curShow.indexerid" class="show" data-name="$curShow.name" data-date="$data_date" data-network="$curShow.network">
<span class="item-data" data-progress="$progressbar_percent" style="display:none"></span>
<div class="show-image">
<a href="$sbRoot/home/displayShow?show=$curShow.indexerid"><img alt="" class="show-image" src="$sbRoot/showPoster/?show=$curShow.indexerid&amp;which=poster_thumb" /></a>
</div>
<div id="progressbar$curShow.indexerid"></div>
<div class="show-title">
$curShow.name
</div>
<div class="show-date">
#if $cur_airs_next
#set $ldatetime = $sbdatetime.sbdatetime.convert_to_setting($network_timezones.parse_date_time($cur_airs_next,$curShow.airs,$curShow.network))
<span class="${fuzzydate}">$sbdatetime.sbdatetime.sbfdate($ldatetime)</span>
#else
#set $output_html = '?'
#if None is not $display_status
#if 'nded' not in $display_status and 1 == int($curShow.paused)
#set $output_html = 'Paused'
#else if $display_status
#set $output_html = $display_status
#end if
#end if
$output_html
#end if
</div><!-- /show-date -->
<table width="100%" cellspacing="1" border="0" cellpadding="0">
<tr>
<td class="show-table">
<span class="show-dlstats" title="$download_stat_tip">$download_stat</span>
</td>
<td class="show-table">
#if 'simple' != $layout
#set $img_text = ($curShow.network, 'No Network')[None is $curShow.network]
<img class="show-network-image" src="$sbRoot/images/network/$network_images[$curShow.indexerid]" alt="#echo '%s" title="%s' % ($img_text, $img_text)#" />
#else
$curShow.network
#end if
</td>
<td class="show-table">
#if $curShow.quality in $qualityPresets
<span class="show-quality">$qualityPresetStrings[$curShow.quality]</span>
#else
<span class="show-quality">Custom</span>
#end if
</td>
</tr>
</table>
</div><!-- /show$curShow.indexerid -->
#end for
</div>
</div><!-- /$curListID -->
########################
## end of poster layout
########################
#else
<table id="$curListID" class="tablesorter" cellspacing="1" border="0" cellpadding="0">
<thead>
<tr>
<th>Next Ep</th>
<th>Show</th>
<th>Network</th>
<th>Quality</th>
<th>Downloads</th>
<th>Active</th>
<th>Status</th>
</tr>
</thead>
<tfoot>
<tr>
<th rowspan="1" colspan="1" align="center"><a href="$sbRoot/home/addShows/">Add Show</a></th>
<th rowspan="1" colspan="6"></th>
</tr>
</tfoot>
<tbody>
#for $curLoadingShow in $sickbeard.showQueueScheduler.action.loadingShowList
#if $curLoadingShow.show != None and $curLoadingShow.show in $sickbeard.showList
#continue
#end if
<tr>
<td align="center">(loading)</td>
<td>
#if None is $curLoadingShow.show
Loading... ($curLoadingShow.show_name)
#else
<a href="displayShow?show=$curLoadingShow.show.indexerid">$curLoadingShow.show.name</a>
#end if
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
#end for
$myShowList.sort(lambda x, y: cmp(x.name, y.name))
#for $curShow in $myShowList
#slurp
#set $cur_airs_next = ''
#set $cur_snatched = 0
#set $cur_downloaded = 0
#set $cur_total = 0
#set $download_stat_tip = ''
#slurp
#if $curShow.indexerid in $show_stat
#set $cur_airs_next = $show_stat[$curShow.indexerid]['ep_airs_next']
#slurp
#set $cur_snatched = $show_stat[$curShow.indexerid]['ep_snatched']
#if not $cur_snatched
#set $cur_snatched = 0
#end if
#slurp
#set $cur_downloaded = $show_stat[$curShow.indexerid]['ep_downloaded']
#if not $cur_downloaded
#set $cur_downloaded = 0
#end if
#slurp
#set $cur_total = $show_stat[$curShow.indexerid]['ep_total']
#if not $cur_total
#set $cur_total = 0
#end if
#end if
#slurp
#if $cur_total != 0
#set $download_stat = str($cur_downloaded)
#set $download_stat_tip = 'Downloaded: ' + str($cur_downloaded)
#if $cur_snatched > 0
#set $download_stat = download_stat + '+' + str($cur_snatched)
#set $download_stat_tip = download_stat_tip + '&#013;' + 'Snatched: ' + str($cur_snatched)
#end if
#set $download_stat = download_stat + ' / ' + str($cur_total)
#set $download_stat_tip = download_stat_tip + '&#013;' + 'Total: ' + str($cur_total)
#else
#set $download_stat = '?'
#set $download_stat_tip = 'no data'
#end if
#slurp
#set $nom = $cur_downloaded
#set $den = $cur_total
#if $den == 0
#set $den = 1
#end if
#slurp
#set $progressbar_percent = $nom * 100 / $den
<tr>
#if $cur_airs_next
#set $ldatetime = $sbdatetime.sbdatetime.convert_to_setting($network_timezones.parse_date_time($cur_airs_next,$curShow.airs,$curShow.network))
<td align="center" class="nowrap"><div class="${fuzzydate}">$sbdatetime.sbdatetime.sbfdate($ldatetime)</div><span class="sort_data">$ldatetime.strftime('%Y%m%d%H%M')</span></td>
#else
<td align="center" class="nowrap"></td>
#end if
#if 'small' == $layout
<td class="tvShow">
<div class="imgsmallposter $layout">
<a href="$sbRoot/showPoster/?show=$curShow.indexerid&amp;which=poster" rel="dialog" title="$curShow.name">
<img src="$sbRoot/showPoster/?show=$curShow.indexerid&amp;which=poster_thumb" class="$layout" alt="$curShow.indexerid"/>
</a>
<a href="$sbRoot/home/displayShow?show=$curShow.indexerid" style="vertical-align:middle">$curShow.name</a>
</div>
</td>
#else if 'banner' == $layout
<td>
<span style="display:none">$curShow.name</span>
<div class="imgbanner $layout">
<a href="$sbRoot/home/displayShow?show=$curShow.indexerid">
<img src="$sbRoot/showPoster/?show=$curShow.indexerid&amp;which=banner" class="$layout" alt="$curShow.indexerid" title="$curShow.name"/>
</div>
</td>
#else if 'simple' == $layout
<td class="tvShow"><a href="$sbRoot/home/displayShow?show=$curShow.indexerid">$curShow.name</a></td>
#end if
#if 'simple' != $layout
#set $img_text = ($curShow.network, 'No Network')[None is $curShow.network]
<td align="center">
<span style="display:none">$curShow.network</span>
<img width="54" height="27" src="$sbRoot/images/network/$network_images[$curShow.indexerid]" alt="#echo '%s" title="%s' % ($img_text, $img_text)#" />
</td>
#else
<td>
<span>$curShow.network</span>
</td>
#end if
#if $curShow.quality in $qualityPresets
<td align="center"><span class="quality $qualityPresetStrings[$curShow.quality]">$qualityPresetStrings[$curShow.quality]</span></td>
#else
<td align="center"><span class="quality Custom">Custom</span></td>
#end if
<td align="center">
<span class="item-data" data-progress="$progressbar_percent" style="display:none"></span>
<div id="progressbar$curShow.indexerid" style="position:relative">
<div class="progressbarText" title="$download_stat_tip">$download_stat</div>
</div>
</td>
<td align="center">
<img src="$sbRoot/images/#if int($curShow.paused) == 0 and $curShow.status != 'Ended' then 'yes16.png" alt="Y"' else 'no16.png" alt="N"'# width="16" height="16" />
</td>
<td align="center">
#set $display_status = $curShow.status
#if None is not $display_status
#if re.search(r'(?i)(?:new|returning)\s*series', $curShow.status)
#set $display_status = 'Continuing'
#else if re.search(r'(?i)(?:nded)', $curShow.status)
#set $display_status = 'Ended'
#end if
#end if
$display_status
</td>
</tr>
#end for
</tbody>
</table>
#end if
#end for
<script type="text/javascript">
<!--
#raw
$(document).ready(function(){
$('div[id^="progressbar"]').each(function(k, v){
var progress = parseInt($(this).siblings('span[class="item-data"]').attr('data-progress'), 10) , elId = '#' + $(this).attr('id'), v = 80;
$(elId).progressbar({value:progress});
if (progress < 80) {
v = progress >= 40 ? 60 : (progress >= 20 ? 40 : 20);
}
$(elId + ' > .ui-progressbar-value').addClass('progress-' + v);
});
});
#end raw
//-->
</script>
#include $os.path.join($sickbeard.PROG_DIR, 'gui/slick/interfaces/default/inc_bottom.tmpl')