episodes for series are now fetched using a single call and broken into seasons.

This commit is contained in:
kay.one 2013-06-01 12:31:39 -07:00
parent f7c78da4ed
commit 0c63e5ad81
12 changed files with 120 additions and 48 deletions

View File

@ -19,19 +19,13 @@ namespace NzbDrone.Api.Episodes
private List<EpisodeResource> GetEpisodes() private List<EpisodeResource> GetEpisodes()
{ {
var seriesId = (int?)Request.Query.SeriesId; var seriesId = (int?)Request.Query.SeriesId;
var seasonNumber = (int?)Request.Query.SeasonNumber;
if (seriesId == null) if (seriesId == null)
{ {
throw new BadRequestException("seriesId is missing"); throw new BadRequestException("seriesId is missing");
} }
if (seasonNumber == null) return ToListResource(() => _episodeService.GetEpisodeBySeries(seriesId.Value));
{
return ToListResource(() => _episodeService.GetEpisodeBySeries(seriesId.Value));
}
return ToListResource(() => _episodeService.GetEpisodesBySeason(seriesId.Value, seasonNumber.Value));
} }
} }
} }

View File

@ -1,4 +1,6 @@
.progress { @import "bootstrap/bootstrap";
.progress {
width: 125px; width: 125px;
position: relative; position: relative;
margin-bottom: 2px; margin-bottom: 2px;
@ -20,20 +22,24 @@
overflow: hidden; overflow: hidden;
} }
} }
html { html {
overflow: -moz-scrollbars-vertical; overflow: -moz-scrollbars-vertical;
overflow-y: scroll; overflow-y: scroll;
} }
.input-append { .input-append {
.add-on { .add-on {
margin-left: 0; margin-left: 0;
} }
} }
.line &>[class^="icon-"], .line &>[class*=" icon-"] { .line &>[class^="icon-"], .line &>[class*=" icon-"] {
margin-top: 1em; margin-top: 1em;
height: 1em; height: 1em;
line-height: 1em; line-height: 1em;
} }
#localSeriesLookup { #localSeriesLookup {
width: 220px; width: 220px;
border: 0px; border: 0px;
@ -42,6 +48,7 @@ html {
padding: 4px; padding: 4px;
font-size: 13px; font-size: 13px;
} }
#footer-region { #footer-region {
font-size: 16px; font-size: 16px;
text-decoration: none; text-decoration: none;
@ -51,11 +58,13 @@ html {
text-decoration: underline; text-decoration: underline;
} }
} }
#in-sub-nav { #in-sub-nav {
ul { ul {
margin: 0 0 80px 0; margin: 0 0 80px 0;
} }
} }
#notification-region { #notification-region {
pre { pre {
font-size: 12px; font-size: 12px;
@ -67,14 +76,21 @@ html {
padding-right: 10px; padding-right: 10px;
} }
} }
.nz-spinner {
font-size: 56px; .nz-loading {
text-align: center; .text-center;
font-size: 40px;
font-weight: 300;
padding: 30px; padding: 30px;
} }
.nz-spinner {
.text-center;
font-size: 56px;
padding: 30px;
}
.page-toolbar{ .page-toolbar {
margin-top: 10px; margin-top: 10px;
margin-bottom: 30px; margin-bottom: 30px;
} }
@ -89,4 +105,4 @@ button::-moz-focus-inner, a::-moz-focus-inner {
a:focus { a:focus {
outline: none; outline: none;
} }

View File

@ -7,7 +7,7 @@ define(['app',
'Shared/NotificationView', 'Shared/NotificationView',
'Shared/NotFoundView', 'Shared/NotFoundView',
'MainMenuView', 'MainMenuView',
'Series/Details/SeriesDetailsView', 'Series/Details/SeriesDetailsLayout',
'Series/EpisodeCollection', 'Series/EpisodeCollection',
'Settings/SettingsLayout', 'Settings/SettingsLayout',
'Missing/MissingLayout', 'Missing/MissingLayout',
@ -27,7 +27,7 @@ define(['app',
series.fetch({ series.fetch({
success: function (seriesModel) { success: function (seriesModel) {
self._setTitle(seriesModel.get('title')); self._setTitle(seriesModel.get('title'));
NzbDrone.mainRegion.show(new NzbDrone.Series.Details.SeriesDetailsView({ model: seriesModel })); NzbDrone.mainRegion.show(new NzbDrone.Series.Details.SeriesDetailsLayout({ model: seriesModel }));
} }
}); });
}, },

View File

@ -0,0 +1,24 @@
"use strict";
define(['app', 'Series/Details/SeasonLayout', 'Series/SeasonCollection', 'Series/EpisodeCollection'], function () {
NzbDrone.Series.Details.SeasonCollectionView = Backbone.Marionette.CollectionView.extend({
itemView : NzbDrone.Series.Details.SeasonLayout,
initialize: function (options) {
if (!options.episodeCollection) {
throw 'episodeCollection is needed';
}
this.episodeCollection = options.episodeCollection;
},
itemViewOptions: function () {
return {
episodeCollection: this.episodeCollection
};
}
});
});

View File

@ -36,23 +36,22 @@ define(['app', 'Series/Details/EpisodeStatusCell', 'Series/Details/EpisodeTitleC
} }
], ],
initialize: function () { initialize: function (options) {
this.episodeCollection = new NzbDrone.Series.EpisodeCollection();
this.episodeCollection.fetch({data: { if (!options.episodeCollection) {
seriesId : this.model.get('seriesId'), throw 'episodeCollection is needed';
seasonNumber: this.model.get('seasonNumber') }
}});
this.episodeCollection = options.episodeCollection.bySeason(this.model.get('seasonNumber'));
}, },
onShow: function () { onShow: function () {
this.episodeGrid.show(new Backgrid.Grid( this.episodeGrid.show(new Backgrid.Grid(
{ {
columns : this.columns, columns : this.columns,
collection: this.episodeCollection, collection: this.episodeCollection,
className : 'table table-hover' className : 'table table-hover'
})); }));
} }
}); });
}); });

View File

@ -0,0 +1,36 @@
"use strict";
define(['app', 'Series/Details/SeasonCollectionView','Shared/LoadingView'], function () {
NzbDrone.Series.Details.SeriesDetailsLayout = Backbone.Marionette.Layout.extend({
itemViewContainer: '.x-series-seasons',
template : 'Series/Details/SeriesDetailsTemplate',
regions: {
seasons: '#seasons'
},
onShow: function () {
var self = this;
this.seasons.show(new NzbDrone.Shared.LoadingView());
this.seasonCollection = new NzbDrone.Series.SeasonCollection();
this.episodeCollection = new NzbDrone.Series.EpisodeCollection();
$.when(this.episodeCollection.fetch({data: { seriesId: this.model.id }}), this.seasonCollection.fetch({data: { seriesId: this.model.id }}))
.done(function () {
self.seasons.show(new NzbDrone.Series.Details.SeasonCollectionView({
collection : self.seasonCollection,
episodeCollection: self.episodeCollection
}));
}
);
},
onClose: function () {
$('.backstretch').remove();
}
});
}
);

View File

@ -1,4 +1,4 @@
<div class="row series-page-header"> <div class="row series-page-header series-detail-summary">
<div class="span2"> <div class="span2">
<a href="{{traktUrl}}" target="_blank"> <a href="{{traktUrl}}" target="_blank">
<img class="series-poster img-polaroid" src="{{poster}}"> <img class="series-poster img-polaroid" src="{{poster}}">
@ -18,5 +18,4 @@
</div> </div>
</div> </div>
</div> </div>
<div id="seasons"></div>
<div class="x-series-seasons"></div>

View File

@ -1,20 +0,0 @@
"use strict";
define(['app', 'Quality/QualityProfileCollection', 'Series/Details/SeasonLayout', 'Series/SeasonCollection'], function () {
NzbDrone.Series.Details.SeriesDetailsView = Backbone.Marionette.CompositeView.extend({
itemView : NzbDrone.Series.Details.SeasonLayout,
itemViewContainer: '.x-series-seasons',
template : 'Series/Details/SeriesDetailsTemplate',
initialize: function () {
this.collection = new NzbDrone.Series.SeasonCollection();
this.collection.fetch({data: { seriesId: this.model.get('id') }});
//$.backstretch(this.model.get('fanArt'));
},
onClose: function(){
$('.backstretch').remove();
}
});
});

View File

@ -2,6 +2,14 @@
define(['app', 'Series/EpisodeModel'], function () { define(['app', 'Series/EpisodeModel'], function () {
NzbDrone.Series.EpisodeCollection = Backbone.Collection.extend({ NzbDrone.Series.EpisodeCollection = Backbone.Collection.extend({
url : NzbDrone.Constants.ApiRoot + '/episodes', url : NzbDrone.Constants.ApiRoot + '/episodes',
model: NzbDrone.Series.EpisodeModel model: NzbDrone.Series.EpisodeModel,
bySeason: function (season) {
var filtered = this.filter(function (episode) {
return episode.get("seasonNumber") === season;
});
return new NzbDrone.Series.EpisodeCollection(filtered);
}
}); });
}); });

View File

@ -111,4 +111,9 @@
display: none; display: none;
} }
} }
}
}
.series-detail-summary {
margin-bottom: 50px;
}

View File

@ -0,0 +1 @@
loading ...

10
UI/Shared/LoadingView.js Normal file
View File

@ -0,0 +1,10 @@
"use strict";
define(['app'], function () {
NzbDrone.Shared.LoadingView = Backbone.Marionette.ItemView.extend({
template : 'Shared/LoadingTemplate',
className: 'nz-loading row'
});
});