mirror of
https://github.com/lidarr/lidarr.git
synced 2025-08-23 06:45:19 -07:00
Paging for movies :) (#861)
* First steps. * Not really sure what I am doing here. * Pretty hacky, but it works :) * First filter works now. * Fix all filters. * Fix some filters. * PageSize saving now works. * Fixed items being added when a refresh movie is done. * Downloaded sort not working. * Sorting by downloaded status now works. Extremely hacky, but ¯\_(ツ)_/¯ * Fixed issue where users were stuck when filtering. * Sorting via that button works now. * Removed temp thingy.
This commit is contained in:
parent
50fdbd896c
commit
f07f2e77f6
16 changed files with 291 additions and 40 deletions
|
@ -1,4 +1,6 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq.Expressions;
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
|
|
||||||
namespace NzbDrone.Api
|
namespace NzbDrone.Api
|
||||||
|
@ -38,5 +40,14 @@ namespace NzbDrone.Api
|
||||||
|
|
||||||
return pagingSpec;
|
return pagingSpec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*public static Expression<Func<TModel, object>> CreateFilterExpression<TModel>(string filterKey, string filterValue)
|
||||||
|
{
|
||||||
|
Type type = typeof(TModel);
|
||||||
|
ParameterExpression parameterExpression = Expression.Parameter(type, "x");
|
||||||
|
Expression expressionBody = parameterExpression;
|
||||||
|
|
||||||
|
return expressionBody;
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ using NzbDrone.Core.Validation.Paths;
|
||||||
using NzbDrone.Core.DataAugmentation.Scene;
|
using NzbDrone.Core.DataAugmentation.Scene;
|
||||||
using NzbDrone.Core.Validation;
|
using NzbDrone.Core.Validation;
|
||||||
using NzbDrone.SignalR;
|
using NzbDrone.SignalR;
|
||||||
|
using NzbDrone.Core.Datastore;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Movie
|
namespace NzbDrone.Api.Movie
|
||||||
{
|
{
|
||||||
|
@ -52,6 +53,7 @@ namespace NzbDrone.Api.Movie
|
||||||
_coverMapper = coverMapper;
|
_coverMapper = coverMapper;
|
||||||
|
|
||||||
GetResourceAll = AllMovie;
|
GetResourceAll = AllMovie;
|
||||||
|
GetResourcePaged = GetMoviePaged;
|
||||||
GetResourceById = GetMovie;
|
GetResourceById = GetMovie;
|
||||||
CreateResource = AddMovie;
|
CreateResource = AddMovie;
|
||||||
UpdateResource = UpdateMovie;
|
UpdateResource = UpdateMovie;
|
||||||
|
@ -104,6 +106,43 @@ namespace NzbDrone.Api.Movie
|
||||||
return MapToResource(movies);
|
return MapToResource(movies);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private PagingResource<MovieResource> GetMoviePaged(PagingResource<MovieResource> pagingResource)
|
||||||
|
{
|
||||||
|
var pagingSpec = pagingResource.MapToPagingSpec<MovieResource, Core.Tv.Movie>();
|
||||||
|
|
||||||
|
if (pagingResource.FilterKey == "monitored" && pagingResource.FilterValue == "false")
|
||||||
|
{
|
||||||
|
pagingSpec.FilterExpression = v => v.Monitored == false;
|
||||||
|
}
|
||||||
|
else if (pagingResource.FilterKey == "monitored")
|
||||||
|
{
|
||||||
|
pagingSpec.FilterExpression = v => v.Monitored == true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pagingResource.FilterKey == "status")
|
||||||
|
{
|
||||||
|
switch (pagingResource.FilterValue)
|
||||||
|
{
|
||||||
|
case "released":
|
||||||
|
pagingSpec.FilterExpression = v => v.Status == MovieStatusType.Released;
|
||||||
|
break;
|
||||||
|
case "inCinemas":
|
||||||
|
pagingSpec.FilterExpression = v => v.Status == MovieStatusType.InCinemas;
|
||||||
|
break;
|
||||||
|
case "announced":
|
||||||
|
pagingSpec.FilterExpression = v => v.Status == MovieStatusType.Announced;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pagingResource.FilterKey == "downloaded")
|
||||||
|
{
|
||||||
|
pagingSpec.FilterExpression = v => v.MovieFileId != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ApplyToPage(_moviesService.Paged, pagingSpec, MovieResourceMapper.ToResource);
|
||||||
|
}
|
||||||
|
|
||||||
protected MovieResource MapToResource(Core.Tv.Movie movies)
|
protected MovieResource MapToResource(Core.Tv.Movie movies)
|
||||||
{
|
{
|
||||||
if (movies == null) return null;
|
if (movies == null) return null;
|
||||||
|
|
|
@ -43,9 +43,12 @@ namespace NzbDrone.Core.Tv
|
||||||
|
|
||||||
}; //If a movie has more than 10 parts fuck 'em.
|
}; //If a movie has more than 10 parts fuck 'em.
|
||||||
|
|
||||||
|
protected IMainDatabase _database;
|
||||||
|
|
||||||
public MovieRepository(IMainDatabase database, IEventAggregator eventAggregator)
|
public MovieRepository(IMainDatabase database, IEventAggregator eventAggregator)
|
||||||
: base(database, eventAggregator)
|
: base(database, eventAggregator)
|
||||||
{
|
{
|
||||||
|
_database = database;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool MoviePathExists(string path)
|
public bool MoviePathExists(string path)
|
||||||
|
@ -192,6 +195,42 @@ namespace NzbDrone.Core.Tv
|
||||||
return pagingSpec;
|
return pagingSpec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override PagingSpec<Movie> GetPaged(PagingSpec<Movie> pagingSpec)
|
||||||
|
{
|
||||||
|
if (pagingSpec.SortKey == "downloadedQuality")
|
||||||
|
{
|
||||||
|
var mapper = _database.GetDataMapper();
|
||||||
|
var offset = pagingSpec.PagingOffset();
|
||||||
|
var limit = pagingSpec.PageSize;
|
||||||
|
var direction = "ASC";
|
||||||
|
if (pagingSpec.SortDirection == NzbDrone.Core.Datastore.SortDirection.Descending)
|
||||||
|
{
|
||||||
|
direction = "DESC";
|
||||||
|
}
|
||||||
|
var q = mapper.Query<Movie>($"SELECT * from \"Movies\" , \"MovieFiles\", \"QualityDefinitions\" WHERE Movies.MovieFileId=MovieFiles.Id AND instr(MovieFiles.Quality, ('quality\": ' || QualityDefinitions.Quality || \",\")) > 0 ORDER BY QualityDefinitions.Title {direction} LIMIT {offset},{limit};");
|
||||||
|
var q2 = mapper.Query<Movie>("SELECT * from \"Movies\" , \"MovieFiles\", \"QualityDefinitions\" WHERE Movies.MovieFileId=MovieFiles.Id AND instr(MovieFiles.Quality, ('quality\": ' || QualityDefinitions.Quality || \",\")) > 0 ORDER BY QualityDefinitions.Title ASC;");
|
||||||
|
|
||||||
|
//var ok = q.BuildQuery();
|
||||||
|
|
||||||
|
pagingSpec.Records = q.ToList();
|
||||||
|
pagingSpec.TotalRecords = q2.Count();
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pagingSpec = base.GetPaged(pagingSpec);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pagingSpec.Records.Count == 0 && pagingSpec.PageSize != 1)
|
||||||
|
{
|
||||||
|
var lastPossiblePage = pagingSpec.TotalRecords / pagingSpec.PageSize + 1;
|
||||||
|
pagingSpec.Page = lastPossiblePage;
|
||||||
|
return GetPaged(pagingSpec);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pagingSpec;
|
||||||
|
}
|
||||||
|
|
||||||
public SortBuilder<Movie> GetMoviesWithoutFilesQuery(PagingSpec<Movie> pagingSpec)
|
public SortBuilder<Movie> GetMoviesWithoutFilesQuery(PagingSpec<Movie> pagingSpec)
|
||||||
{
|
{
|
||||||
return Query.Where(pagingSpec.FilterExpression)
|
return Query.Where(pagingSpec.FilterExpression)
|
||||||
|
|
|
@ -20,6 +20,7 @@ namespace NzbDrone.Core.Tv
|
||||||
{
|
{
|
||||||
Movie GetMovie(int movieId);
|
Movie GetMovie(int movieId);
|
||||||
List<Movie> GetMovies(IEnumerable<int> movieIds);
|
List<Movie> GetMovies(IEnumerable<int> movieIds);
|
||||||
|
PagingSpec<Movie> Paged(PagingSpec<Movie> pagingSpec);
|
||||||
Movie AddMovie(Movie newMovie);
|
Movie AddMovie(Movie newMovie);
|
||||||
List<Movie> AddMovies(List<Movie> newMovies);
|
List<Movie> AddMovies(List<Movie> newMovies);
|
||||||
Movie FindByImdbId(string imdbid);
|
Movie FindByImdbId(string imdbid);
|
||||||
|
@ -111,6 +112,11 @@ namespace NzbDrone.Core.Tv
|
||||||
return _movieRepository.Get(movieIds).ToList();
|
return _movieRepository.Get(movieIds).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PagingSpec<Movie> Paged(PagingSpec<Movie> pagingSpec)
|
||||||
|
{
|
||||||
|
return _movieRepository.GetPaged(pagingSpec);
|
||||||
|
}
|
||||||
|
|
||||||
public Movie AddMovie(Movie newMovie)
|
public Movie AddMovie(Movie newMovie)
|
||||||
{
|
{
|
||||||
Ensure.That(newMovie, () => newMovie).IsNotNull();
|
Ensure.That(newMovie, () => newMovie).IsNotNull();
|
||||||
|
|
|
@ -110,7 +110,7 @@ namespace NzbDrone.Core.Tv
|
||||||
if (message.MovieId.HasValue)
|
if (message.MovieId.HasValue)
|
||||||
{
|
{
|
||||||
var movie = _movieService.GetMovie(message.MovieId.Value);
|
var movie = _movieService.GetMovie(message.MovieId.Value);
|
||||||
RefreshMovieInfo(movie);
|
RefreshMovieInfo(movie);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -2404,7 +2404,7 @@ var Body = Backgrid.Body = Backbone.View.extend({
|
||||||
See [Backbone.Collection#comparator](http://backbonejs.org/#Collection-comparator)
|
See [Backbone.Collection#comparator](http://backbonejs.org/#Collection-comparator)
|
||||||
*/
|
*/
|
||||||
sort: function (column, direction) {
|
sort: function (column, direction) {
|
||||||
|
//debugger;
|
||||||
if (_.isString(column)) column = this.columns.findWhere({name: column});
|
if (_.isString(column)) column = this.columns.findWhere({name: column});
|
||||||
|
|
||||||
var collection = this.collection;
|
var collection = this.collection;
|
||||||
|
@ -2761,4 +2761,4 @@ var Grid = Backgrid.Grid = Backbone.View.extend({
|
||||||
|
|
||||||
});
|
});
|
||||||
return Backgrid;
|
return Backgrid;
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -815,7 +815,7 @@
|
||||||
sort: function(options) {
|
sort: function(options) {
|
||||||
if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
|
if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
|
||||||
options || (options = {});
|
options || (options = {});
|
||||||
|
//debugger;
|
||||||
// Run sort based on type of `comparator`.
|
// Run sort based on type of `comparator`.
|
||||||
if (_.isString(this.comparator) || this.comparator.length === 1) {
|
if (_.isString(this.comparator) || this.comparator.length === 1) {
|
||||||
this.models = this.sortBy(this.comparator, this);
|
this.models = this.sortBy(this.comparator, this);
|
||||||
|
|
|
@ -324,9 +324,11 @@
|
||||||
if (comparator && options.full) {
|
if (comparator && options.full) {
|
||||||
this.comparator = null;
|
this.comparator = null;
|
||||||
fullCollection.comparator = comparator;
|
fullCollection.comparator = comparator;
|
||||||
|
} else if (options.full){
|
||||||
|
fullCollection.comparator = this.comparator;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.full) fullCollection.sort();
|
//if (options.full) fullCollection.sort();
|
||||||
|
|
||||||
// make sure the models in the current page and full collection have the
|
// make sure the models in the current page and full collection have the
|
||||||
// same references
|
// same references
|
||||||
|
|
|
@ -15,6 +15,7 @@ var MovieStatusCell = require('../../Cells/MovieStatusCell');
|
||||||
var MovieDownloadStatusCell = require('../../Cells/MovieDownloadStatusCell');
|
var MovieDownloadStatusCell = require('../../Cells/MovieDownloadStatusCell');
|
||||||
var DownloadedQualityCell = require('../../Cells/DownloadedQualityCell');
|
var DownloadedQualityCell = require('../../Cells/DownloadedQualityCell');
|
||||||
var FooterView = require('./FooterView');
|
var FooterView = require('./FooterView');
|
||||||
|
var GridPager = require('../../Shared/Grid/Pager');
|
||||||
var FooterModel = require('./FooterModel');
|
var FooterModel = require('./FooterModel');
|
||||||
var ToolbarLayout = require('../../Shared/Toolbar/ToolbarLayout');
|
var ToolbarLayout = require('../../Shared/Toolbar/ToolbarLayout');
|
||||||
require('../../Mixins/backbone.signalr.mixin');
|
require('../../Mixins/backbone.signalr.mixin');
|
||||||
|
@ -26,12 +27,14 @@ module.exports = Marionette.Layout.extend({
|
||||||
seriesRegion : '#x-series',
|
seriesRegion : '#x-series',
|
||||||
toolbar : '#x-toolbar',
|
toolbar : '#x-toolbar',
|
||||||
toolbar2 : '#x-toolbar2',
|
toolbar2 : '#x-toolbar2',
|
||||||
footer : '#x-series-footer'
|
footer : '#x-series-footer',
|
||||||
|
pager : "#x-movie-pager",
|
||||||
|
pagerTop : "#x-movie-pager-top"
|
||||||
},
|
},
|
||||||
|
|
||||||
columns : [
|
columns : [
|
||||||
{
|
{
|
||||||
name : 'statusWeight',
|
name : 'status',
|
||||||
label : '',
|
label : '',
|
||||||
cell : MovieStatusCell
|
cell : MovieStatusCell
|
||||||
},
|
},
|
||||||
|
@ -45,6 +48,7 @@ module.exports = Marionette.Layout.extend({
|
||||||
name : "downloadedQuality",
|
name : "downloadedQuality",
|
||||||
label : "Downloaded",
|
label : "Downloaded",
|
||||||
cell : DownloadedQualityCell,
|
cell : DownloadedQualityCell,
|
||||||
|
sortable : true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name : 'profileId',
|
name : 'profileId',
|
||||||
|
@ -67,6 +71,7 @@ module.exports = Marionette.Layout.extend({
|
||||||
name : "this",
|
name : "this",
|
||||||
label : "Status",
|
label : "Status",
|
||||||
cell : MovieDownloadStatusCell,
|
cell : MovieDownloadStatusCell,
|
||||||
|
sortable : false,
|
||||||
sortValue : function(m, k) {
|
sortValue : function(m, k) {
|
||||||
if (m.get("downloaded")) {
|
if (m.get("downloaded")) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -115,31 +120,40 @@ module.exports = Marionette.Layout.extend({
|
||||||
|
|
||||||
initialize : function() {
|
initialize : function() {
|
||||||
this.seriesCollection = MoviesCollection.clone();
|
this.seriesCollection = MoviesCollection.clone();
|
||||||
this.seriesCollection.shadowCollection.bindSignalR();
|
this.seriesCollection.bindSignalR();
|
||||||
|
|
||||||
this.listenTo(this.seriesCollection.shadowCollection, 'sync', function(model, collection, options) {
|
|
||||||
this.seriesCollection.fullCollection.resetFiltered();
|
|
||||||
|
this.listenTo(this.seriesCollection, 'sync', function(model, collection, options) {
|
||||||
|
//this.seriesCollection.fullCollection.resetFiltered();
|
||||||
this._renderView();
|
this._renderView();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.listenTo(this.seriesCollection.shadowCollection, 'add', function(model, collection, options) {
|
this.listenTo(MoviesCollection, "sync", function(eventName) {
|
||||||
this.seriesCollection.fullCollection.resetFiltered();
|
this.seriesCollection = MoviesCollection.clone();
|
||||||
this._renderView();
|
//this._showTable();
|
||||||
|
this._renderView();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.listenTo(this.seriesCollection.shadowCollection, 'remove', function(model, collection, options) {
|
this.listenTo(this.seriesCollection, 'add', function(model, collection, options) {
|
||||||
this.seriesCollection.fullCollection.resetFiltered();
|
//this.seriesCollection.fullCollection.resetFiltered();
|
||||||
this._renderView();
|
//this._renderView();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.listenTo(this.seriesCollection, 'remove', function(model, collection, options) {
|
||||||
|
//this.seriesCollection.fullCollection.resetFiltered();
|
||||||
|
//this._showTable();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.sortingOptions = {
|
this.sortingOptions = {
|
||||||
type : 'sorting',
|
type : 'sorting',
|
||||||
storeState : false,
|
storeState : false,
|
||||||
viewCollection : this.seriesCollection,
|
viewCollection : this.seriesCollection,
|
||||||
|
callback : this._sort,
|
||||||
items : [
|
items : [
|
||||||
{
|
{
|
||||||
title : 'Title',
|
title : 'Title',
|
||||||
name : 'sortTitle'
|
name : 'title'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Downloaded',
|
title: 'Downloaded',
|
||||||
|
@ -153,10 +167,10 @@ module.exports = Marionette.Layout.extend({
|
||||||
title : 'In Cinemas',
|
title : 'In Cinemas',
|
||||||
name : 'inCinemas'
|
name : 'inCinemas'
|
||||||
},
|
},
|
||||||
{
|
/*{
|
||||||
title : "Status",
|
title : "Status",
|
||||||
name : "status",
|
name : "status",
|
||||||
}
|
}*/
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -254,10 +268,13 @@ module.exports = Marionette.Layout.extend({
|
||||||
className : 'table table-hover'
|
className : 'table table-hover'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this._showPager();
|
||||||
|
|
||||||
this._renderView();
|
this._renderView();
|
||||||
},
|
},
|
||||||
|
|
||||||
_showList : function() {
|
_showList : function() {
|
||||||
|
//this.current = "list";
|
||||||
this.currentView = new ListCollectionView({
|
this.currentView = new ListCollectionView({
|
||||||
collection : this.seriesCollection
|
collection : this.seriesCollection
|
||||||
});
|
});
|
||||||
|
@ -273,6 +290,10 @@ module.exports = Marionette.Layout.extend({
|
||||||
this._renderView();
|
this._renderView();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_sort : function() {
|
||||||
|
console.warn("Sorting");
|
||||||
|
},
|
||||||
|
|
||||||
_renderView : function() {
|
_renderView : function() {
|
||||||
if (MoviesCollection.length === 0) {
|
if (MoviesCollection.length === 0) {
|
||||||
this.seriesRegion.show(new EmptyView());
|
this.seriesRegion.show(new EmptyView());
|
||||||
|
@ -280,8 +301,12 @@ module.exports = Marionette.Layout.extend({
|
||||||
this.toolbar.close();
|
this.toolbar.close();
|
||||||
this.toolbar2.close();
|
this.toolbar2.close();
|
||||||
} else {
|
} else {
|
||||||
this.seriesRegion.show(this.currentView);
|
|
||||||
|
|
||||||
|
this.seriesRegion.show(this.currentView);
|
||||||
|
this.listenTo(this.currentView.collection, "sync", function(eventName){
|
||||||
|
this._showPager();
|
||||||
|
//debugger;
|
||||||
|
});
|
||||||
this._showToolbar();
|
this._showToolbar();
|
||||||
this._showFooter();
|
this._showFooter();
|
||||||
}
|
}
|
||||||
|
@ -293,7 +318,6 @@ module.exports = Marionette.Layout.extend({
|
||||||
|
|
||||||
_setFilter : function(buttonContext) {
|
_setFilter : function(buttonContext) {
|
||||||
var mode = buttonContext.model.get('key');
|
var mode = buttonContext.model.get('key');
|
||||||
|
|
||||||
this.seriesCollection.setFilterMode(mode);
|
this.seriesCollection.setFilterMode(mode);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -321,6 +345,19 @@ module.exports = Marionette.Layout.extend({
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_showPager : function() {
|
||||||
|
var pager = new GridPager({
|
||||||
|
columns : this.columns,
|
||||||
|
collection : this.seriesCollection,
|
||||||
|
});
|
||||||
|
var pagerTop = new GridPager({
|
||||||
|
columns : this.columns,
|
||||||
|
collection : this.seriesCollection,
|
||||||
|
});
|
||||||
|
this.pager.show(pager);
|
||||||
|
this.pagerTop.show(pagerTop);
|
||||||
|
},
|
||||||
|
|
||||||
_showFooter : function() {
|
_showFooter : function() {
|
||||||
var footerModel = new FooterModel();
|
var footerModel = new FooterModel();
|
||||||
var movies = MoviesCollection.models.length;
|
var movies = MoviesCollection.models.length;
|
||||||
|
@ -330,12 +367,12 @@ module.exports = Marionette.Layout.extend({
|
||||||
var released = 0;
|
var released = 0;
|
||||||
|
|
||||||
var monitored = 0;
|
var monitored = 0;
|
||||||
|
|
||||||
var downloaded =0;
|
var downloaded =0;
|
||||||
var missingMonitored=0;
|
var missingMonitored=0;
|
||||||
var missingNotMonitored=0;
|
var missingNotMonitored=0;
|
||||||
var missingNotAvailable=0;
|
var missingNotAvailable=0;
|
||||||
var missingMonitoredAvailable=0;
|
var missingMonitoredAvailable=0;
|
||||||
|
|
||||||
var downloadedNotMonitored=0;
|
var downloadedNotMonitored=0;
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,16 @@
|
||||||
<div id="x-toolbar2"></div>
|
<div id="x-toolbar2"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="x-movie-pager-top">
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div id="x-series" class="table-responsive"></div>
|
<div id="x-series" class="table-responsive"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="x-movie-pager">
|
||||||
|
</div>
|
||||||
|
|
||||||
<div id="x-series-footer"></div>
|
<div id="x-series-footer"></div>
|
||||||
|
|
|
@ -7,22 +7,70 @@ var AsFilteredCollection = require('../Mixins/AsFilteredCollection');
|
||||||
var AsSortedCollection = require('../Mixins/AsSortedCollection');
|
var AsSortedCollection = require('../Mixins/AsSortedCollection');
|
||||||
var AsPersistedStateCollection = require('../Mixins/AsPersistedStateCollection');
|
var AsPersistedStateCollection = require('../Mixins/AsPersistedStateCollection');
|
||||||
var moment = require('moment');
|
var moment = require('moment');
|
||||||
|
var UiSettings = require('../Shared/UiSettingsModel');
|
||||||
require('../Mixins/backbone.signalr.mixin');
|
require('../Mixins/backbone.signalr.mixin');
|
||||||
|
var Config = require('../Config');
|
||||||
|
|
||||||
|
var pageSize = parseInt(Config.getValue("pageSize")) || 1000;
|
||||||
|
|
||||||
|
|
||||||
var Collection = PageableCollection.extend({
|
var Collection = PageableCollection.extend({
|
||||||
url : window.NzbDrone.ApiRoot + '/movie',
|
url : window.NzbDrone.ApiRoot + '/movie',
|
||||||
model : MovieModel,
|
model : MovieModel,
|
||||||
tableName : 'movie',
|
tableName : 'movie',
|
||||||
|
|
||||||
|
origSetSorting : PageableCollection.prototype.setSorting,
|
||||||
|
origAdd : PageableCollection.prototype.add,
|
||||||
|
|
||||||
state : {
|
state : {
|
||||||
sortKey : 'sortTitle',
|
sortKey : 'sortTitle',
|
||||||
order : -1,
|
order : -1,
|
||||||
pageSize : 100000,
|
pageSize : pageSize,
|
||||||
secondarySortKey : 'sortTitle',
|
secondarySortKey : 'sortTitle',
|
||||||
secondarySortOrder : -1
|
secondarySortOrder : -1
|
||||||
},
|
},
|
||||||
|
|
||||||
mode : 'client',
|
queryParams : {
|
||||||
|
totalPages : null,
|
||||||
|
totalRecords : null,
|
||||||
|
pageSize : 'pageSize',
|
||||||
|
sortKey : 'sortKey',
|
||||||
|
order : 'sortDir',
|
||||||
|
directions : {
|
||||||
|
'-1' : 'asc',
|
||||||
|
'1' : 'desc'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
sortMappings : {
|
||||||
|
'movie' : { sortKey : 'series.sortTitle' }
|
||||||
|
},
|
||||||
|
|
||||||
|
parseState : function(resp) {
|
||||||
|
var direction = -1;
|
||||||
|
if (resp.sortDirection == "descending") {
|
||||||
|
direction = 1;
|
||||||
|
}
|
||||||
|
return { totalRecords : resp.totalRecords, order : direction, currentPage : resp.page };
|
||||||
|
},
|
||||||
|
|
||||||
|
parseRecords : function(resp) {
|
||||||
|
if (resp) {
|
||||||
|
return resp.records;
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp;
|
||||||
|
},
|
||||||
|
|
||||||
|
mode : 'server',
|
||||||
|
|
||||||
|
setSorting : function(sortKey, order, options) {
|
||||||
|
return this.origSetSorting.call(this, sortKey, order, options);
|
||||||
|
},
|
||||||
|
|
||||||
|
sort : function(options){
|
||||||
|
//debugger;
|
||||||
|
},
|
||||||
|
|
||||||
save : function() {
|
save : function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
@ -90,18 +138,18 @@ var Collection = PageableCollection.extend({
|
||||||
false
|
false
|
||||||
],
|
],
|
||||||
'released' : [
|
'released' : [
|
||||||
null,
|
"status",
|
||||||
null,
|
"released",
|
||||||
function(model) { return model.getStatus() == "released"; }
|
function(model) { return model.getStatus() == "released"; }
|
||||||
],
|
],
|
||||||
'announced' : [
|
'announced' : [
|
||||||
null,
|
"status",
|
||||||
null,
|
"announced",
|
||||||
function(model) { return model.getStatus() == "announced"; }
|
function(model) { return model.getStatus() == "announced"; }
|
||||||
],
|
],
|
||||||
'cinemas' : [
|
'cinemas' : [
|
||||||
null,
|
"status",
|
||||||
null,
|
"inCinemas",
|
||||||
function(model) { return model.getStatus() == "inCinemas"; }
|
function(model) { return model.getStatus() == "inCinemas"; }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -127,10 +175,10 @@ var Collection = PageableCollection.extend({
|
||||||
downloadedQuality : {
|
downloadedQuality : {
|
||||||
sortValue : function(model, attr) {
|
sortValue : function(model, attr) {
|
||||||
if (model.get("movieFile")) {
|
if (model.get("movieFile")) {
|
||||||
return 1000-model.get("movieFile").quality.quality.id;
|
return model.get("movieFile").quality.quality.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return "";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
nextAiring : {
|
nextAiring : {
|
||||||
|
@ -184,6 +232,24 @@ var Collection = PageableCollection.extend({
|
||||||
return path.toLowerCase();
|
return path.toLowerCase();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
add : function(model, options) {
|
||||||
|
if (this.length >= this.state.pageSize) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.origAdd.call(this, model, options);
|
||||||
|
},
|
||||||
|
|
||||||
|
setFilterMode : function(mode){
|
||||||
|
var arr = this.filterModes[mode];
|
||||||
|
this.state.filterKey = arr[0];
|
||||||
|
this.state.filterValue = arr[1];
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
comparator: function (model) {
|
||||||
|
return model.get('sortTitle');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -191,6 +257,6 @@ Collection = AsFilteredCollection.call(Collection);
|
||||||
Collection = AsSortedCollection.call(Collection);
|
Collection = AsSortedCollection.call(Collection);
|
||||||
Collection = AsPersistedStateCollection.call(Collection);
|
Collection = AsPersistedStateCollection.call(Collection);
|
||||||
|
|
||||||
var data = ApiData.get('movie');
|
var data = ApiData.get('movie?page=1&pageSize='+pageSize+'&sortKey=sortTitle&sortDir=asc');
|
||||||
|
|
||||||
module.exports = new Collection(data, { full : true }).bindSignalR();
|
module.exports = new Collection(data.records, { full : false, state : { totalRecords : data.totalRecords} }).bindSignalR();
|
||||||
|
|
|
@ -8,6 +8,7 @@ var model = DeepModel.extend({
|
||||||
initialize : function() {
|
initialize : function() {
|
||||||
this.listenTo(vent, vent.Commands.SaveSettings, this.saveSettings);
|
this.listenTo(vent, vent.Commands.SaveSettings, this.saveSettings);
|
||||||
this.listenTo(this, 'destroy', this._stopListening);
|
this.listenTo(this, 'destroy', this._stopListening);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
saveSettings : function() {
|
saveSettings : function() {
|
||||||
|
|
|
@ -1,7 +1,21 @@
|
||||||
var SettingsModelBase = require('../SettingsModelBase');
|
var SettingsModelBase = require('../SettingsModelBase');
|
||||||
|
var Config = require('../../Config');
|
||||||
|
|
||||||
module.exports = SettingsModelBase.extend({
|
module.exports = SettingsModelBase.extend({
|
||||||
url : window.NzbDrone.ApiRoot + '/config/ui',
|
url : window.NzbDrone.ApiRoot + '/config/ui',
|
||||||
successMessage : 'UI settings saved',
|
successMessage : 'UI settings saved',
|
||||||
errorMessage : 'Failed to save UI settings'
|
errorMessage : 'Failed to save UI settings',
|
||||||
});
|
|
||||||
|
origSave : SettingsModelBase.prototype.saveSettings,
|
||||||
|
origInit : SettingsModelBase.prototype.initialize,
|
||||||
|
|
||||||
|
initialize : function() {
|
||||||
|
this.set("pageSize", Config.getValue("pageSize"));
|
||||||
|
this.origInit.call(this);
|
||||||
|
},
|
||||||
|
|
||||||
|
saveSettings : function() {
|
||||||
|
Config.setValue("pageSize", this.get("pageSize"));
|
||||||
|
this.origSave.call(this);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
@ -1,4 +1,27 @@
|
||||||
<div class="form-horizontal">
|
<div class="form-horizontal">
|
||||||
|
<fieldset>
|
||||||
|
<legend>Movies</legend>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">Page Size</label>
|
||||||
|
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<select name="pageSize" class="form-control">
|
||||||
|
<option value="25">25</option>
|
||||||
|
<option value="50">50</option>
|
||||||
|
<option value="100">100</option>
|
||||||
|
<option value="250">250</option>
|
||||||
|
<option value="500">500</option>
|
||||||
|
<option value="1000">1000</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<span class="col-sm-1 help-inline">
|
||||||
|
<i class="icon-sonarr-form-info" title="How many movies to show on the main page."/>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Calendar</legend>
|
<legend>Calendar</legend>
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,8 @@ module.exports = Paginator.extend({
|
||||||
var handles = [];
|
var handles = [];
|
||||||
|
|
||||||
var collection = this.collection;
|
var collection = this.collection;
|
||||||
|
|
||||||
|
|
||||||
var state = collection.state;
|
var state = collection.state;
|
||||||
|
|
||||||
// convert all indices to 0-based here
|
// convert all indices to 0-based here
|
||||||
|
|
|
@ -31,8 +31,13 @@ module.exports = Marionette.CompositeView.extend({
|
||||||
}
|
}
|
||||||
|
|
||||||
collection.setSorting(sortModel.get('name'), order);
|
collection.setSorting(sortModel.get('name'), order);
|
||||||
collection.fullCollection.sort();
|
if (collection.mode == "server"){
|
||||||
|
collection.fetch({reset: true});
|
||||||
|
} else {
|
||||||
|
collection.fullCollection.sort();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue