1
0
mirror of https://github.com/moparisthebest/SickRage synced 2024-12-13 11:32:20 -05:00
SickRage/gui/slick/interfaces/default/home.tmpl
Supremicus 2c510aa210 Improve UI to display fluidly on different screen sizes.
Fixes the issue where top menu items would disappear on smaller screens.
Add Bootstrap v3.2.0 with Normalize v3.0.1 from github.com/twbs/bootstrap.
Add a modified jquery pnotify stylesheet.
Various UI tweaks.
Update CHANGES.md and TODO.txt
2014-10-23 23:23:56 +01:00

598 lines
20 KiB
Cheetah

#import sickbeard
#import datetime
#from sickbeard.common import *
#from sickbeard import db, 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")
#set $myDB = $db.DBConnection()
#set $today = str($datetime.date.today().toordinal())
#set $layout = $sickbeard.HOME_LAYOUT
#set status_quality = '(' + ','.join([str(x) for x in $Quality.SNATCHED + $Quality.SNATCHED_PROPER]) + ')'
#set status_download = '(' + ','.join([str(x) for x in $Quality.DOWNLOADED + [$ARCHIVED]]) + ')'
#set $sql_statement = 'SELECT showid, '
#set $sql_statement += '(SELECT COUNT(*) FROM tv_episodes WHERE showid=tv_eps.showid AND season > 0 AND episode > 0 AND airdate > 1 AND status IN ' + $status_quality + ') AS ep_snatched, '
#set $sql_statement += '(SELECT COUNT(*) FROM tv_episodes WHERE showid=tv_eps.showid AND season > 0 AND episode > 0 AND airdate > 1 AND status IN ' + $status_download + ') AS ep_downloaded, '
#set $sql_statement += '(SELECT COUNT(*) FROM tv_episodes WHERE showid=tv_eps.showid AND season > 0 AND episode > 0 AND airdate > 1 '
#set $sql_statement += ' AND ((airdate <= ' + $today + ' AND (status = ' + str($SKIPPED) + ' OR status = ' + str($WANTED) + ' OR status = ' + str($FAILED) + ')) '
#set $sql_statement += ' OR (status IN ' + status_quality + ') OR (status IN ' + status_download + '))) AS ep_total, '
#set $sql_statement += ' (SELECT airdate FROM tv_episodes WHERE showid=tv_eps.showid AND airdate >= ' + $today + ' AND (status = ' + str($UNAIRED) + ' OR status = ' + str($WANTED) + ') ORDER BY airdate ASC LIMIT 1) AS ep_airs_next '
#set $sql_statement += ' FROM tv_episodes tv_eps GROUP BY showid'
#set $sql_result = $myDB.select($sql_statement)
#set $show_stat = {}
#set $max_download_count = 1000
#for $cur_result in $sql_result:
#set $show_stat[$cur_result['showid']] = $cur_result
#if $cur_result['ep_total'] > $max_download_count:
#set $max_download_count = $cur_result['ep_total']
#end if
#end for
#set $max_download_count = $max_download_count * 100
<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(/^(The|A|An)\s/i,'');
#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(){
\$("img#network").on('error', function(){
\$(this).parent().text(\$(this).attr('alt'));
\$(this).remove();
});
\$("#showListTableShows:has(tbody tr)").tablesorter({
sortList: [[5,1],[1,0]],
textExtraction: {
0: function(node) { return \$(node).find("span").text().toLowerCase(); },
3: function(node) { return \$(node).find("span").text().toLowerCase(); },
4: function(node) { return \$(node).find("span").text(); },
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
});
\$("#showListTableAnime:has(tbody tr)").tablesorter({
sortList: [[5,1],[1,0]],
textExtraction: {
0: function(node) { return \$(node).find("span").text().toLowerCase(); },
3: function(node) { return \$(node).find("span").text().toLowerCase(); },
4: function(node) { return \$(node).find("span").text(); },
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: '.resetanime'
},
sortStable: true
});
\$.tablesorter.filter.bindSearch( "#showListTableShows", \$('.search') );
#if $sickbeard.ANIME_SPLIT_HOME:
\$.tablesorter.filter.bindSearch( "#showListTableAnime", \$('.search') );
#end if
#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
var \$container = [\$('#container'), \$('#container-anime')];
jQuery.each(\$container, function (j) {
this.isotope({
itemSelector: '.show',
sortBy : 'name',
sortAscending: 'true',
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(/^(The|A|An)\s/i,'');
#else:
return (name || '');
#end if
},
network: '[data-network]',
date: function( itemElem ) {
var date = \$( itemElem ).attr('data-date');
if (sortDirection = 'true') {
return date.length && parseInt( date, 10 ) || Number.POSITIVE_INFINITY;
} else {
return date.length && parseInt( date, 10 ) * -1 || Number.POSITIVE_INFINITY;
}
},
progress: function( itemElem ) {
var progress = \$( itemElem ).attr('data-progress');
return progress.length && parseInt( progress, 10 ) * -1 || Number.POSITIVE_INFINITY;
}
}
});
});
\$('#postersort').on( 'change', function() {
var sortValue = this.value;
\$('#container').isotope({ sortBy: sortValue });
\$('#container-anime').isotope({ sortBy: sortValue });
});
\$('#postersortdirection').on( 'change', function() {
var sortDirection = this.value;
sortDirection = sortDirection == 'true';
\$('#container').isotope({ sortAscending: sortDirection });
\$('#container-anime').isotope({ sortAscending: sortDirection });
});
});
//-->
</script>
#if $varExists('header')
<h1 class="header">$header</h1>
#else
<h1 class="title">$title</h1>
#end if
<div id="HomeLayout" class="pull-right" style="margin-top: -40px;">
<span> Layout:
<select name="layout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
<option value="$sbRoot/setHomeLayout/?layout=poster" #if $sickbeard.HOME_LAYOUT == "poster" then "selected=\"selected\"" else ""#>Poster</option>
<option value="$sbRoot/setHomeLayout/?layout=small" #if $sickbeard.HOME_LAYOUT == "small" then "selected=\"selected\"" else ""#>Small Poster</option>
<option value="$sbRoot/setHomeLayout/?layout=banner" #if $sickbeard.HOME_LAYOUT == "banner" then "selected=\"selected\"" else ""#>Banner</option>
<option value="$sbRoot/setHomeLayout/?layout=simple" #if $sickbeard.HOME_LAYOUT == "simple" then "selected=\"selected\"" else ""#>Simple</option>
</select>
</span>
#if $layout == 'poster':
&nbsp;
<span> Sort By:
<select id="postersort" class="form-control form-control-inline input-sm">
<option value="name">Name</option>
<option value="date">Next Episode</option>
<option value="network">Network</option>
<option value="progress">Progress</option>
</select>
</span>
&nbsp;
<span> Sort Order:
<select id="postersortdirection" class="form-control form-control-inline input-sm">
<option value="true">Asc</option>
<option value="false">Desc</option>
</select>
</span>
&nbsp;
#end if
</div>
#if $layout != 'poster':
<div class="pull-right">
<input class="search form-control form-control-inline input-sm input200" type="search" data-column="1" placeholder="Search Show Name"> <button type="button" class="resetshows resetanime btn btn-inline">Reset Search</button>
</div>
#end if
#for $curShowlist in $showlists:
#set $curListType = $curShowlist[0]
#set $myShowList = $list($curShowlist[1])
#if $curListType == "Anime":
<h1 class="header">Anime List</h1>
#end if
#if $layout == 'poster':
<div id=#if $curListType == "Anime" and $layout == 'poster' then "container-anime" else "container"# class="clearfix">
<div class="posterview">
#for $curLoadingShow in $sickbeard.showQueueScheduler.action.loadingShowList:
#if $curLoadingShow.show != None and $curLoadingShow.show in $sickbeard.showList:
#continue
#end if
#if $curLoadingShow.show == None:
<div class="show" data-name="0" data-date="010101" data-network="0" data-progress="101">
<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 = ''
#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
<div class="show" id="show$curShow.indexerid" data-name="$curShow.name" data-date="#if $cur_airs_next then $time.mktime($network_timezones.parse_date_time($cur_airs_next,$curShow.airs,$curShow.network).timetuple()) else ""#" data-network="$curShow.network" data-progress="$progressbar_percent">
<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>
<script type="text/javascript">
<!--
\$(function() {
\$("\#progressbar$curShow.indexerid").progressbar({
value: $progressbar_percent });
classvalue = $progressbar_percent
if (classvalue<20) {
classtoadd = "progress-20"
}
if (classvalue>20 && classvalue<60) {
classtoadd = "progress-40"
}
if (classvalue>40 && classvalue<80) {
classtoadd = "progress-60"
}
if (classvalue>80) {
classtoadd = "progress-80"
}
\$("\#progressbar$curShow.indexerid > .ui-progressbar-value").addClass(classtoadd);
});
//-->
</script>
<div class="show-title">
$curShow.name
</div>
#if $cur_airs_next
#set $ldatetime = $network_timezones.parse_date_time($cur_airs_next,$curShow.airs,$curShow.network)
<div class="show-date"><span class="${fuzzydate}">$sbdatetime.sbdatetime.sbfdate($ldatetime)</span></div>
#else if $curShow.status != "Ended" and int($curShow.paused) == 1:
<div class="show-date">Paused</div>
#else if $curShow.status:
<div class="show-date">$curShow.status</div>
#else
<div class="show-date">?</div>
#end if
<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 $layout != 'simple':
#if $curShow.network:
<img class="show-network-image" src="$sbRoot/images/network/${curShow.network.replace(u"\u00C9",'e').lower()}.png" alt="$curShow.network" title="$curShow.network" />
#else:
<img class="show-network-image" src="$sbRoot/images/network/nonetwork.png" alt="No Network" title="No Network" />
#end if
#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>
#end for
</div>
</div>
#else
<table id="showListTable$curListType" class="tablesorter" cellspacing="1" border="0" cellpadding="0">
<thead>
<tr>
<th class="nowrap">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></td>
<td>
#if $curLoadingShow.show == None:
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>
</tr>
#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 = ''
#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 + "+" + 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
#set $nom = $cur_downloaded
#set $den = $cur_total
#if $den == 0:
#set $den = 1
#end if
#set $progressbar_percent = $nom * 100 / $den
<tr>
#if $cur_airs_next
#set $ldatetime = $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">$time.mktime($ldatetime.timetuple())</span></td>
#else:
<td align="center" class="nowrap"></td>
#end if
#if $layout == 'small':
<td class="tvShow">
<div class="imgsmallposter $layout">
<a href="$sbRoot/showPoster/?show=$curShow.indexerid&amp;which=$layout" 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 $layout == 'banner':
<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 $layout == 'simple':
<td class="tvShow"><a href="$sbRoot/home/displayShow?show=$curShow.indexerid">$curShow.name</a></td>
#end if
#if $layout != 'simple':
<td align="center">
#if $curShow.network:
<img id="network" width="54" height="27" src="$sbRoot/images/network/${curShow.network.replace(u"\u00C9",'e').lower()}.png" alt="$curShow.network" title="$curShow.network" />
#else:
<img id="network" width="54" height="27" src="$sbRoot/images/network/nonetwork.png" alt="No Network" title="No Network" />
#end if
</td>
#else:
<td>
$curShow.network
</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 style="display: none;">$progressbar_percent</span><div id="progressbar$curShow.indexerid" style="position:relative;"></div>
<script type="text/javascript">
<!--
\$(function() {
\$("\#progressbar$curShow.indexerid").progressbar({
value: $progressbar_percent });
\$("\#progressbar$curShow.indexerid").append( "<div class='progressbarText' title='$download_stat_tip'>$download_stat</div>" )
classvalue = $progressbar_percent
if (classvalue<20) {
classtoadd = "progress-20"
}
if (classvalue>20 && classvalue<60) {
classtoadd = "progress-40"
}
if (classvalue>40 && classvalue<80) {
classtoadd = "progress-60"
}
if (classvalue>80) {
classtoadd = "progress-80"
}
\$("\#progressbar$curShow.indexerid > .ui-progressbar-value").addClass(classtoadd);
});
//-->
</script>
</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">
$curShow.status
</td>
</tr>
#end for
</tbody>
</table>
#end if
#end for
#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl")