mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-12 16:22:55 -07:00
Fixed the sorting and filtering on the Movie Requests page, it all functions correctly now
This commit is contained in:
parent
5dc5122841
commit
7dd5805f3f
13 changed files with 257 additions and 202 deletions
|
@ -17,7 +17,6 @@ namespace Ombi.Core.Engine.Interfaces
|
||||||
Task<RequestEngineResult> ApproveMovie(MovieRequests request);
|
Task<RequestEngineResult> ApproveMovie(MovieRequests request);
|
||||||
Task<RequestEngineResult> ApproveMovieById(int requestId);
|
Task<RequestEngineResult> ApproveMovieById(int requestId);
|
||||||
Task<RequestEngineResult> DenyMovieById(int modelId);
|
Task<RequestEngineResult> DenyMovieById(int modelId);
|
||||||
Task<FilterResult<MovieRequests>> Filter(FilterViewModel vm);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Ombi.Core.Models.Requests;
|
using Ombi.Core.Models.Requests;
|
||||||
|
using Ombi.Core.Models.UI;
|
||||||
using Ombi.Store.Entities;
|
using Ombi.Store.Entities;
|
||||||
|
|
||||||
namespace Ombi.Core.Engine.Interfaces
|
namespace Ombi.Core.Engine.Interfaces
|
||||||
|
@ -12,7 +13,7 @@ namespace Ombi.Core.Engine.Interfaces
|
||||||
//Task<IEnumerable<T>> GetNewRequests();
|
//Task<IEnumerable<T>> GetNewRequests();
|
||||||
//Task<IEnumerable<T>> GetAvailableRequests();
|
//Task<IEnumerable<T>> GetAvailableRequests();
|
||||||
RequestCountModel RequestCount();
|
RequestCountModel RequestCount();
|
||||||
Task<IEnumerable<T>> GetRequests(int count, int position);
|
Task<RequestsViewModel<T>> GetRequests(int count, int position, OrderFilterModel model);
|
||||||
Task<IEnumerable<T>> GetRequests();
|
Task<IEnumerable<T>> GetRequests();
|
||||||
Task<bool> UserHasRequest(string userId);
|
Task<bool> UserHasRequest(string userId);
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ using Microsoft.Extensions.Logging;
|
||||||
using Ombi.Api.TheMovieDb.Models;
|
using Ombi.Api.TheMovieDb.Models;
|
||||||
using Ombi.Core.Authentication;
|
using Ombi.Core.Authentication;
|
||||||
using Ombi.Core.Engine.Interfaces;
|
using Ombi.Core.Engine.Interfaces;
|
||||||
|
using Ombi.Core.Models.UI;
|
||||||
using Ombi.Core.Rule.Interfaces;
|
using Ombi.Core.Rule.Interfaces;
|
||||||
using Ombi.Core.Settings;
|
using Ombi.Core.Settings;
|
||||||
using Ombi.Settings.Settings.Models;
|
using Ombi.Settings.Settings.Models;
|
||||||
|
@ -25,7 +26,8 @@ namespace Ombi.Core.Engine
|
||||||
{
|
{
|
||||||
public MovieRequestEngine(IMovieDbApi movieApi, IRequestServiceMain requestService, IPrincipal user,
|
public MovieRequestEngine(IMovieDbApi movieApi, IRequestServiceMain requestService, IPrincipal user,
|
||||||
INotificationHelper helper, IRuleEvaluator r, IMovieSender sender, ILogger<MovieRequestEngine> log,
|
INotificationHelper helper, IRuleEvaluator r, IMovieSender sender, ILogger<MovieRequestEngine> log,
|
||||||
OmbiUserManager manager, IRepository<RequestLog> rl, ICacheService cache, ISettingsService<OmbiSettings> ombiSettings, IRepository<RequestSubscription> sub)
|
OmbiUserManager manager, IRepository<RequestLog> rl, ICacheService cache,
|
||||||
|
ISettingsService<OmbiSettings> ombiSettings, IRepository<RequestSubscription> sub)
|
||||||
: base(user, requestService, r, manager, cache, ombiSettings, sub)
|
: base(user, requestService, r, manager, cache, ombiSettings, sub)
|
||||||
{
|
{
|
||||||
MovieApi = movieApi;
|
MovieApi = movieApi;
|
||||||
|
@ -58,6 +60,7 @@ namespace Ombi.Core.Engine
|
||||||
ErrorMessage = $"Please try again later"
|
ErrorMessage = $"Please try again later"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
var fullMovieName =
|
var fullMovieName =
|
||||||
$"{movieInfo.Title}{(!string.IsNullOrEmpty(movieInfo.ReleaseDate) ? $" ({DateTime.Parse(movieInfo.ReleaseDate).Year})" : string.Empty)}";
|
$"{movieInfo.Title}{(!string.IsNullOrEmpty(movieInfo.ReleaseDate) ? $" ({DateTime.Parse(movieInfo.ReleaseDate).Year})" : string.Empty)}";
|
||||||
|
|
||||||
|
@ -82,7 +85,8 @@ namespace Ombi.Core.Engine
|
||||||
};
|
};
|
||||||
|
|
||||||
var usDates = movieInfo.ReleaseDates?.Results?.FirstOrDefault(x => x.IsoCode == "US");
|
var usDates = movieInfo.ReleaseDates?.Results?.FirstOrDefault(x => x.IsoCode == "US");
|
||||||
requestModel.DigitalReleaseDate = usDates?.ReleaseDate?.FirstOrDefault(x => x.Type == ReleaseDateType.Digital)?.ReleaseDate;
|
requestModel.DigitalReleaseDate = usDates?.ReleaseDate
|
||||||
|
?.FirstOrDefault(x => x.Type == ReleaseDateType.Digital)?.ReleaseDate;
|
||||||
|
|
||||||
var ruleResults = (await RunRequestRules(requestModel)).ToList();
|
var ruleResults = (await RunRequestRules(requestModel)).ToList();
|
||||||
if (ruleResults.Any(x => !x.Success))
|
if (ruleResults.Any(x => !x.Success))
|
||||||
|
@ -125,25 +129,93 @@ namespace Ombi.Core.Engine
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="count">The count.</param>
|
/// <param name="count">The count.</param>
|
||||||
/// <param name="position">The position.</param>
|
/// <param name="position">The position.</param>
|
||||||
|
/// <param name="orderFilter">The order/filter type.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<IEnumerable<MovieRequests>> GetRequests(int count, int position)
|
public async Task<RequestsViewModel<MovieRequests>> GetRequests(int count, int position,
|
||||||
|
OrderFilterModel orderFilter)
|
||||||
{
|
{
|
||||||
var shouldHide = await HideFromOtherUsers();
|
var shouldHide = await HideFromOtherUsers();
|
||||||
List<MovieRequests> allRequests;
|
IQueryable<MovieRequests> allRequests;
|
||||||
if (shouldHide.Hide)
|
if (shouldHide.Hide)
|
||||||
{
|
{
|
||||||
allRequests = await MovieRepository.GetWithUser(shouldHide.UserId).Skip(position).Take(count).OrderByDescending(x => x.ReleaseDate).ToListAsync();
|
allRequests =
|
||||||
|
MovieRepository.GetWithUser(shouldHide
|
||||||
|
.UserId); //.Skip(position).Take(count).OrderByDescending(x => x.ReleaseDate).ToListAsync();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
allRequests = await MovieRepository.GetWithUser().Skip(position).Take(count).OrderByDescending(x => x.ReleaseDate).ToListAsync();
|
allRequests =
|
||||||
|
MovieRepository
|
||||||
|
.GetWithUser(); //.Skip(position).Take(count).OrderByDescending(x => x.ReleaseDate).ToListAsync();
|
||||||
}
|
}
|
||||||
allRequests.ForEach(async x =>
|
|
||||||
|
switch (orderFilter.AvailabilityFilter)
|
||||||
|
{
|
||||||
|
case FilterType.None:
|
||||||
|
break;
|
||||||
|
case FilterType.Available:
|
||||||
|
allRequests = allRequests.Where(x => x.Available);
|
||||||
|
break;
|
||||||
|
case FilterType.NotAvailable:
|
||||||
|
allRequests = allRequests.Where(x => !x.Available);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (orderFilter.StatusFilter)
|
||||||
|
{
|
||||||
|
case FilterType.None:
|
||||||
|
break;
|
||||||
|
case FilterType.Approved:
|
||||||
|
allRequests = allRequests.Where(x => x.Approved);
|
||||||
|
break;
|
||||||
|
case FilterType.Processing:
|
||||||
|
allRequests = allRequests.Where(x => x.Approved && !x.Available);
|
||||||
|
break;
|
||||||
|
case FilterType.PendingApproval:
|
||||||
|
allRequests = allRequests.Where(x => !x.Approved && !x.Available && !(x.Denied ?? false));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
}
|
||||||
|
|
||||||
|
var total = allRequests.Count();
|
||||||
|
|
||||||
|
var requests = await (OrderMovies(allRequests, orderFilter.OrderType)).Skip(position).Take(count)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
requests.ForEach(async x =>
|
||||||
{
|
{
|
||||||
x.PosterPath = PosterPathHelper.FixPosterPath(x.PosterPath);
|
x.PosterPath = PosterPathHelper.FixPosterPath(x.PosterPath);
|
||||||
await CheckForSubscription(shouldHide, x);
|
await CheckForSubscription(shouldHide, x);
|
||||||
});
|
});
|
||||||
return allRequests;
|
return new RequestsViewModel<MovieRequests>
|
||||||
|
{
|
||||||
|
Collection = requests,
|
||||||
|
Total = total
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private IQueryable<MovieRequests> OrderMovies(IQueryable<MovieRequests> allRequests, OrderType type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case OrderType.RequestedDateAsc:
|
||||||
|
return allRequests.OrderBy(x => x.RequestedDate);
|
||||||
|
case OrderType.RequestedDateDesc:
|
||||||
|
return allRequests.OrderByDescending(x => x.RequestedDate);
|
||||||
|
case OrderType.TitleAsc:
|
||||||
|
return allRequests.OrderBy(x => x.Title);
|
||||||
|
case OrderType.TitleDesc:
|
||||||
|
return allRequests.OrderByDescending(x => x.Title);
|
||||||
|
case OrderType.StatusAsc:
|
||||||
|
return allRequests.OrderBy(x => x.Status);
|
||||||
|
case OrderType.StatusDesc:
|
||||||
|
return allRequests.OrderByDescending(x => x.Status);
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException(nameof(type), type, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> GetTotal()
|
public async Task<int> GetTotal()
|
||||||
|
@ -216,6 +288,7 @@ namespace Ombi.Core.Engine
|
||||||
{
|
{
|
||||||
allRequests = await MovieRepository.GetWithUser().ToListAsync();
|
allRequests = await MovieRepository.GetWithUser().ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
var results = allRequests.Where(x => x.Title.Contains(search, CompareOptions.IgnoreCase)).ToList();
|
var results = allRequests.Where(x => x.Title.Contains(search, CompareOptions.IgnoreCase)).ToList();
|
||||||
results.ForEach(async x =>
|
results.ForEach(async x =>
|
||||||
{
|
{
|
||||||
|
@ -241,6 +314,7 @@ namespace Ombi.Core.Engine
|
||||||
ErrorMessage = "Request does not exist"
|
ErrorMessage = "Request does not exist"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
request.Denied = true;
|
request.Denied = true;
|
||||||
// We are denying a request
|
// We are denying a request
|
||||||
NotificationHelper.Notify(request, NotificationType.RequestDeclined);
|
NotificationHelper.Notify(request, NotificationType.RequestDeclined);
|
||||||
|
@ -261,6 +335,7 @@ namespace Ombi.Core.Engine
|
||||||
ErrorMessage = "Request does not exist"
|
ErrorMessage = "Request does not exist"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
request.Approved = true;
|
request.Approved = true;
|
||||||
request.Denied = false;
|
request.Denied = false;
|
||||||
await MovieRepository.Update(request);
|
await MovieRepository.Update(request);
|
||||||
|
@ -281,6 +356,7 @@ namespace Ombi.Core.Engine
|
||||||
Result = true
|
Result = true
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!result.Success)
|
if (!result.Success)
|
||||||
{
|
{
|
||||||
Logger.LogWarning("Tried auto sending movie but failed. Message: {0}", result.Message);
|
Logger.LogWarning("Tried auto sending movie but failed. Message: {0}", result.Message);
|
||||||
|
@ -291,6 +367,7 @@ namespace Ombi.Core.Engine
|
||||||
Result = false
|
Result = false
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there are no providers then it's successful but movie has not been sent
|
// If there are no providers then it's successful but movie has not been sent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,6 +429,7 @@ namespace Ombi.Core.Engine
|
||||||
ErrorMessage = "Request does not exist"
|
ErrorMessage = "Request does not exist"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
request.Available = false;
|
request.Available = false;
|
||||||
await MovieRepository.Update(request);
|
await MovieRepository.Update(request);
|
||||||
|
|
||||||
|
@ -372,6 +450,7 @@ namespace Ombi.Core.Engine
|
||||||
ErrorMessage = "Request does not exist"
|
ErrorMessage = "Request does not exist"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
request.Available = true;
|
request.Available = true;
|
||||||
NotificationHelper.Notify(request, NotificationType.RequestAvailable);
|
NotificationHelper.Notify(request, NotificationType.RequestAvailable);
|
||||||
await MovieRepository.Update(request);
|
await MovieRepository.Update(request);
|
||||||
|
@ -401,55 +480,7 @@ namespace Ombi.Core.Engine
|
||||||
RequestType = RequestType.Movie,
|
RequestType = RequestType.Movie,
|
||||||
});
|
});
|
||||||
|
|
||||||
return new RequestEngineResult { Result = true, Message = $"{movieName} has been successfully added!" };
|
return new RequestEngineResult {Result = true, Message = $"{movieName} has been successfully added!"};
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<FilterResult<MovieRequests>> Filter(FilterViewModel vm)
|
|
||||||
{
|
|
||||||
var shouldHide = await HideFromOtherUsers();
|
|
||||||
var requests = shouldHide.Hide
|
|
||||||
? MovieRepository.GetWithUser(shouldHide.UserId)
|
|
||||||
: MovieRepository.GetWithUser();
|
|
||||||
|
|
||||||
switch (vm.AvailabilityFilter)
|
|
||||||
{
|
|
||||||
case FilterType.None:
|
|
||||||
break;
|
|
||||||
case FilterType.Available:
|
|
||||||
requests = requests.Where(x => x.Available);
|
|
||||||
break;
|
|
||||||
case FilterType.NotAvailable:
|
|
||||||
requests = requests.Where(x => !x.Available);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new ArgumentOutOfRangeException();
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (vm.StatusFilter)
|
|
||||||
{
|
|
||||||
case FilterType.None:
|
|
||||||
break;
|
|
||||||
case FilterType.Approved:
|
|
||||||
requests = requests.Where(x => x.Approved);
|
|
||||||
break;
|
|
||||||
case FilterType.Processing:
|
|
||||||
requests = requests.Where(x => x.Approved && !x.Available);
|
|
||||||
break;
|
|
||||||
case FilterType.PendingApproval:
|
|
||||||
requests = requests.Where(x => !x.Approved && !x.Available && !(x.Denied ?? false));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new ArgumentOutOfRangeException();
|
|
||||||
}
|
|
||||||
|
|
||||||
var count = await requests.CountAsync();
|
|
||||||
requests = requests.Skip(vm.Position).Take(vm.Count);
|
|
||||||
var retVal = new FilterResult<MovieRequests>
|
|
||||||
{
|
|
||||||
Total = count,
|
|
||||||
Collection = requests
|
|
||||||
};
|
|
||||||
return retVal;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -15,6 +15,7 @@ using Microsoft.EntityFrameworkCore;
|
||||||
using Ombi.Core.Authentication;
|
using Ombi.Core.Authentication;
|
||||||
using Ombi.Core.Engine.Interfaces;
|
using Ombi.Core.Engine.Interfaces;
|
||||||
using Ombi.Core.Helpers;
|
using Ombi.Core.Helpers;
|
||||||
|
using Ombi.Core.Models.UI;
|
||||||
using Ombi.Core.Rule;
|
using Ombi.Core.Rule;
|
||||||
using Ombi.Core.Rule.Interfaces;
|
using Ombi.Core.Rule.Interfaces;
|
||||||
using Ombi.Core.Senders;
|
using Ombi.Core.Senders;
|
||||||
|
@ -132,7 +133,7 @@ namespace Ombi.Core.Engine
|
||||||
return await AddRequest(newRequest.NewRequest);
|
return await AddRequest(newRequest.NewRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<TvRequests>> GetRequests(int count, int position)
|
public async Task<RequestsViewModel<TvRequests>> GetRequests(int count, int position, OrderFilterModel type)
|
||||||
{
|
{
|
||||||
var shouldHide = await HideFromOtherUsers();
|
var shouldHide = await HideFromOtherUsers();
|
||||||
List<TvRequests> allRequests;
|
List<TvRequests> allRequests;
|
||||||
|
@ -161,7 +162,10 @@ namespace Ombi.Core.Engine
|
||||||
|
|
||||||
allRequests.ForEach(async r => { await CheckForSubscription(shouldHide, r); });
|
allRequests.ForEach(async r => { await CheckForSubscription(shouldHide, r); });
|
||||||
|
|
||||||
return allRequests;
|
return new RequestsViewModel<TvRequests>
|
||||||
|
{
|
||||||
|
Collection = allRequests
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<TreeNode<TvRequests, List<ChildRequests>>>> GetRequestsTreeNode(int count, int position)
|
public async Task<IEnumerable<TreeNode<TvRequests, List<ChildRequests>>>> GetRequestsTreeNode(int count, int position)
|
||||||
|
|
11
src/Ombi.Core/Models/UI/OrderFilterModel.cs
Normal file
11
src/Ombi.Core/Models/UI/OrderFilterModel.cs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
using Ombi.Core.Models.Requests;
|
||||||
|
|
||||||
|
namespace Ombi.Core.Models.UI
|
||||||
|
{
|
||||||
|
public class OrderFilterModel
|
||||||
|
{
|
||||||
|
public FilterType AvailabilityFilter { get; set; }
|
||||||
|
public FilterType StatusFilter { get; set; }
|
||||||
|
public OrderType OrderType { get; set; }
|
||||||
|
}
|
||||||
|
}
|
12
src/Ombi.Core/Models/UI/OrderType.cs
Normal file
12
src/Ombi.Core/Models/UI/OrderType.cs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
namespace Ombi.Core.Models.UI
|
||||||
|
{
|
||||||
|
public enum OrderType
|
||||||
|
{
|
||||||
|
RequestedDateAsc =1,
|
||||||
|
RequestedDateDesc =2,
|
||||||
|
TitleAsc =3,
|
||||||
|
TitleDesc=4,
|
||||||
|
StatusAsc=5,
|
||||||
|
StatusDesc=6
|
||||||
|
}
|
||||||
|
}
|
10
src/Ombi.Core/Models/UI/RequestsViewModel.cs
Normal file
10
src/Ombi.Core/Models/UI/RequestsViewModel.cs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Ombi.Core.Models.UI
|
||||||
|
{
|
||||||
|
public class RequestsViewModel<T>
|
||||||
|
{
|
||||||
|
public IEnumerable<T> Collection { get; set; }
|
||||||
|
public int Total { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,7 +20,7 @@ export interface IMovieRequests extends IFullBaseRequest {
|
||||||
qualityOverrideTitle: string;
|
qualityOverrideTitle: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IFilterResult<T> {
|
export interface IRequestsViewModel<T> {
|
||||||
total: number;
|
total: number;
|
||||||
collection: T[];
|
collection: T[];
|
||||||
}
|
}
|
||||||
|
@ -87,6 +87,15 @@ export interface ITvUpdateModel {
|
||||||
id: number;
|
id: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum OrderType {
|
||||||
|
RequestedDateAsc = 1,
|
||||||
|
RequestedDateDesc = 2,
|
||||||
|
TitleAsc = 3,
|
||||||
|
TitleDesc = 4,
|
||||||
|
StatusAsc = 5,
|
||||||
|
StatusDesc = 6,
|
||||||
|
}
|
||||||
|
|
||||||
export interface INewSeasonRequests {
|
export interface INewSeasonRequests {
|
||||||
id: number;
|
id: number;
|
||||||
seasonNumber: number;
|
seasonNumber: number;
|
||||||
|
@ -112,8 +121,6 @@ export interface IMovieRequestModel {
|
||||||
export interface IFilter {
|
export interface IFilter {
|
||||||
availabilityFilter: FilterType;
|
availabilityFilter: FilterType;
|
||||||
statusFilter: FilterType;
|
statusFilter: FilterType;
|
||||||
position: number;
|
|
||||||
count: number;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum FilterType {
|
export enum FilterType {
|
||||||
|
|
|
@ -1,57 +1,45 @@
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" id="search" class="form-control form-control-custom searchwidth" placeholder="Search" (keyup)="search($event)">
|
<input type="text" id="search" class="form-control form-control-custom searchwidth" placeholder="Search" (keyup)="search($event)">
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
<button id="filterBtn" class="btn btn-sm btn-info-outline" (click)="filterDisplay = !filterDisplay" >
|
<button id="filterBtn" class="btn btn-sm btn-info-outline" (click)="filterDisplay = !filterDisplay">
|
||||||
<i class="fa fa-filter"></i> {{ 'Requests.Filter' | translate }}
|
<i class="fa fa-filter"></i> {{ 'Requests.Filter' | translate }}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
|
||||||
<button class="btn btn-sm btn-primary-outline dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
|
<button class="btn btn-sm btn-primary-outline dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true"
|
||||||
<i class="fa fa-sort"></i> {{ 'Requests.Sort' | translate }}
|
aria-expanded="true">
|
||||||
<span class="caret"></span>
|
<i class="fa fa-sort"></i> {{ 'Requests.Sort' | translate }}
|
||||||
</button>
|
<span class="caret"></span>
|
||||||
<ul class="dropdown-menu" aria-labelledby="dropdownMenu2">
|
</button>
|
||||||
<li>
|
<ul class="dropdown-menu" aria-labelledby="dropdownMenu2">
|
||||||
<a class="active" (click)="setOrder('requestedDate', $event)">{{ 'Requests.SortRequestDate' | translate }}
|
<li>
|
||||||
<span *ngIf="order === 'requestedDate'">
|
<a (click)="setOrder(OrderType.RequestedDateAsc, $event)">{{ 'Requests.SortRequestDateAsc' | translate }}
|
||||||
<span [hidden]="reverse"><small><i class="fa fa-arrow-down" aria-hidden="true"></i></small></span>
|
|
||||||
<span [hidden]="!reverse"><small><i class="fa fa-arrow-up" aria-hidden="true"></i></small></span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
<a (click)="setOrder('title', $event)">{{ 'Requests.SortTitle' | translate}}
|
|
||||||
<span *ngIf="order === 'title'">
|
|
||||||
<span [hidden]="reverse"><small><i class="fa fa-arrow-down" aria-hidden="true"></i></small></span>
|
|
||||||
<span [hidden]="!reverse"><small><i class="fa fa-arrow-up" aria-hidden="true"></i></small></span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
<a (click)="setOrder('releaseDate', $event)">{{ 'Requests.TheatricalReleaseSort' | translate }}
|
|
||||||
<span *ngIf="order === 'releaseDate'">
|
|
||||||
<span [hidden]="reverse"><small><i class="fa fa-arrow-down" aria-hidden="true"></i></small></span>
|
|
||||||
<span [hidden]="!reverse"><small><i class="fa fa-arrow-up" aria-hidden="true"></i></small></span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
<a (click)="setOrder('requestedUser.userAlias', $event)">{{ 'Requests.SortRequestedBy' | translate }}
|
|
||||||
<span *ngIf="order === 'requestedUser.userAlias'">
|
|
||||||
<span [hidden]="reverse"><small><i class="fa fa-arrow-down" aria-hidden="true"></i></small></span>
|
|
||||||
<span [hidden]="!reverse"><small><i class="fa fa-arrow-up" aria-hidden="true"></i></small></span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a (click)="setOrder('status', $event)">{{ 'Requests.SortStatus' | translate }}
|
|
||||||
<span *ngIf="order === 'status'">
|
|
||||||
<span [hidden]="reverse"><small><i class="fa fa-arrow-down" aria-hidden="true"></i></small></span>
|
|
||||||
<span [hidden]="!reverse"><small><i class="fa fa-arrow-up" aria-hidden="true"></i></small></span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<a class="active" (click)="setOrder(OrderType.RequestedDateDesc, $event)">{{ 'Requests.SortRequestDateDesc' | translate }}
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<a (click)="setOrder(OrderType.TitleAsc, $event)">{{ 'Requests.SortTitleAsc' | translate}}
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<a (click)="setOrder(OrderType.TitleDesc, $event)">{{ 'Requests.SortTitleDesc' | translate}}
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<a (click)="setOrder(OrderType.StatusAsc, $event)">{{ 'Requests.SortStatusAsc' | translate}}
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<a (click)="setOrder(OrderType.StatusDesc, $event)">{{ 'Requests.SortStatusDesc' | translate}}
|
||||||
|
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
|
@ -59,9 +47,7 @@
|
||||||
<div>
|
<div>
|
||||||
|
|
||||||
|
|
||||||
<div *ngFor="let request of movieRequests | orderBy: order : reverse : 'case-insensitive'">
|
<div *ngFor="let request of movieRequests">
|
||||||
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="myBg backdrop" [style.background-image]="request.backgroundPath"></div>
|
<div class="myBg backdrop" [style.background-image]="request.backgroundPath"></div>
|
||||||
<div class="tint" style="background-image: linear-gradient(to bottom, rgba(0,0,0,0.6) 0%,rgba(0,0,0,0.6) 100%);"></div>
|
<div class="tint" style="background-image: linear-gradient(to bottom, rgba(0,0,0,0.6) 0%,rgba(0,0,0,0.6) 100%);"></div>
|
||||||
|
@ -99,7 +85,7 @@
|
||||||
<i class="fa fa-info-circle"></i>
|
<i class="fa fa-info-circle"></i>
|
||||||
</span>
|
</span>
|
||||||
<span *ngIf="!request.approved && !request.availble && !request.denied" id="pendingApprovalLabel" class="label label-warning"
|
<span *ngIf="!request.approved && !request.availble && !request.denied" id="pendingApprovalLabel" class="label label-warning"
|
||||||
[translate]="'Common.PendingApproval'"></span>
|
[translate]="'Common.PendingApproval'"></span>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="request.denied" id="requestDenied">
|
<div *ngIf="request.denied" id="requestDenied">
|
||||||
|
@ -125,11 +111,15 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3 col-sm-push-3 small-padding">
|
<div class="col-sm-3 col-sm-push-3 small-padding">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-2 col-md-push-6">
|
<div class="col-md-2 col-md-push-6">
|
||||||
|
|
||||||
<a *ngIf="request.showSubscribe && !request.subscribed" style="color:white" (click)="subscribe(request)" pTooltip="Subscribe for notifications"> <i class="fa fa-rss"></i></a>
|
<a *ngIf="request.showSubscribe && !request.subscribed" style="color:white" (click)="subscribe(request)" pTooltip="Subscribe for notifications">
|
||||||
<a *ngIf="request.showSubscribe && request.subscribed" style="color:red" (click)="unSubscribe(request)" pTooltip="Unsubscribe notification"> <i class="fa fa-rss"></i></a>
|
<i class="fa fa-rss"></i>
|
||||||
|
</a>
|
||||||
|
<a *ngIf="request.showSubscribe && request.subscribed" style="color:red" (click)="unSubscribe(request)" pTooltip="Unsubscribe notification">
|
||||||
|
<i class="fa fa-rss"></i>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="isAdmin">
|
<div *ngIf="isAdmin">
|
||||||
|
@ -171,7 +161,7 @@
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="!request.denied" id="denyBtn">
|
<div *ngIf="!request.denied" id="denyBtn">
|
||||||
<button type="button" (click)="deny(request)" class="btn btn-sm btn-danger-outline deny">
|
<button type="button" (click)="deny(request)" class="btn btn-sm btn-danger-outline deny">
|
||||||
<i class="fa fa-times"></i> {{ 'Requests.Deny' | translate }}
|
<i class="fa fa-times"></i> {{ 'Requests.Deny' | translate }}
|
||||||
|
@ -185,10 +175,12 @@
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<form id="markBtnGroup">
|
<form id="markBtnGroup">
|
||||||
<button id="unavailableBtn" *ngIf="request.available" (click)="changeAvailability(request, false)" style="text-align: right" value="false" class="btn btn-sm btn-info-outline change">
|
<button id="unavailableBtn" *ngIf="request.available" (click)="changeAvailability(request, false)" style="text-align: right"
|
||||||
|
value="false" class="btn btn-sm btn-info-outline change">
|
||||||
<i class="fa fa-minus"></i> {{ 'Requests.MarkUnavailable' | translate }}
|
<i class="fa fa-minus"></i> {{ 'Requests.MarkUnavailable' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button id="availableBtn" *ngIf="!request.available" (click)="changeAvailability(request, true)" style="text-align: right" value="true" class="btn btn-sm btn-success-outline change">
|
<button id="availableBtn" *ngIf="!request.available" (click)="changeAvailability(request, true)" style="text-align: right"
|
||||||
|
value="true" class="btn btn-sm btn-success-outline change">
|
||||||
<i class="fa fa-plus"></i> {{ 'Requests.MarkAvailable' | translate }}
|
<i class="fa fa-plus"></i> {{ 'Requests.MarkAvailable' | translate }}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
@ -198,7 +190,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="dropdown" *ngIf="issueCategories && issuesEnabled" id="issuesBtn">
|
<div class="dropdown" *ngIf="issueCategories && issuesEnabled" id="issuesBtn">
|
||||||
<button class="btn btn-sm btn-primary-outline dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true"
|
<button class="btn btn-sm btn-primary-outline dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true"
|
||||||
aria-expanded="true">
|
aria-expanded="true">
|
||||||
<i class="fa fa-plus"></i> {{ 'Requests.ReportIssue' | translate }}
|
<i class="fa fa-plus"></i> {{ 'Requests.ReportIssue' | translate }}
|
||||||
<span class="caret"></span>
|
<span class="caret"></span>
|
||||||
</button>
|
</button>
|
||||||
|
@ -218,7 +210,7 @@
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p-paginator [rows]="10" [totalRecords]="totalMovies" (onPageChange)="paginate($event)"></p-paginator>
|
<p-paginator [rows]="10" [totalRecords]="totalMovies" (onPageChange)="paginate($event)"></p-paginator>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ import { Subject } from "rxjs/Subject";
|
||||||
import { AuthService } from "../auth/auth.service";
|
import { AuthService } from "../auth/auth.service";
|
||||||
import { NotificationService, RadarrService, RequestService } from "../services";
|
import { NotificationService, RadarrService, RequestService } from "../services";
|
||||||
|
|
||||||
import { FilterType, IFilter, IIssueCategory, IMovieRequests, IPagenator, IRadarrProfile, IRadarrRootFolder } from "../interfaces";
|
import { FilterType, IFilter, IIssueCategory, IMovieRequests, IPagenator, IRadarrProfile, IRadarrRootFolder, OrderType } from "../interfaces";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: "movie-requests",
|
selector: "movie-requests",
|
||||||
|
@ -38,9 +38,9 @@ export class MovieRequestsComponent implements OnInit {
|
||||||
public filter: IFilter;
|
public filter: IFilter;
|
||||||
public filterType = FilterType;
|
public filterType = FilterType;
|
||||||
|
|
||||||
public order: string = "requestedDate";
|
public orderType: OrderType = OrderType.RequestedDateDesc;
|
||||||
public reverse = true;
|
public OrderType = OrderType;
|
||||||
|
|
||||||
public totalMovies: number = 100;
|
public totalMovies: number = 100;
|
||||||
private currentlyLoaded: number;
|
private currentlyLoaded: number;
|
||||||
private amountToLoad: number;
|
private amountToLoad: number;
|
||||||
|
@ -75,20 +75,17 @@ export class MovieRequestsComponent implements OnInit {
|
||||||
|
|
||||||
public ngOnInit() {
|
public ngOnInit() {
|
||||||
this.amountToLoad = 10;
|
this.amountToLoad = 10;
|
||||||
this.currentlyLoaded = 10;
|
this.currentlyLoaded = 10;
|
||||||
this.loadInit();
|
|
||||||
this.isAdmin = this.auth.hasRole("admin") || this.auth.hasRole("poweruser");
|
|
||||||
this.filter = {
|
this.filter = {
|
||||||
availabilityFilter: FilterType.None,
|
availabilityFilter: FilterType.None,
|
||||||
statusFilter: FilterType.None,
|
statusFilter: FilterType.None,
|
||||||
count: this.amountToLoad,
|
|
||||||
position: 0,
|
|
||||||
};
|
};
|
||||||
|
this.loadInit();
|
||||||
|
this.isAdmin = this.auth.hasRole("admin") || this.auth.hasRole("poweruser");
|
||||||
}
|
}
|
||||||
|
|
||||||
public paginate(event: IPagenator) {
|
public paginate(event: IPagenator) {
|
||||||
const skipAmount = event.first;
|
const skipAmount = event.first;
|
||||||
|
|
||||||
this.loadRequests(this.amountToLoad, skipAmount);
|
this.loadRequests(this.amountToLoad, skipAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -189,27 +186,21 @@ export class MovieRequestsComponent implements OnInit {
|
||||||
public filterStatus(filter: FilterType, el: any) {
|
public filterStatus(filter: FilterType, el: any) {
|
||||||
this.filterActiveStyle(el);
|
this.filterActiveStyle(el);
|
||||||
this.filter.statusFilter = filter;
|
this.filter.statusFilter = filter;
|
||||||
this.requestService.filterMovies(this.filter)
|
this.loadInit();
|
||||||
.subscribe(x => {
|
|
||||||
this.totalMovies = x.total;
|
|
||||||
this.setOverrides(x.collection);
|
|
||||||
this.movieRequests = x.collection;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public setOrder(value: string, el: any) {
|
public setOrder(value: OrderType, el: any) {
|
||||||
el = el.toElement || el.relatedTarget || el.target || el.srcElement;
|
el = el.toElement || el.relatedTarget || el.target || el.srcElement;
|
||||||
|
|
||||||
const parent = el.parentElement;
|
const parent = el.parentElement;
|
||||||
const previousFilter = parent.querySelector(".active");
|
const previousFilter = parent.querySelector(".active");
|
||||||
|
|
||||||
if (this.order === value) {
|
previousFilter.className = "";
|
||||||
this.reverse = !this.reverse;
|
el.className = "active";
|
||||||
} else {
|
|
||||||
previousFilter.className = "";
|
this.orderType = value;
|
||||||
el.className = "active";
|
|
||||||
}
|
this.loadInit();
|
||||||
this.order = value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public subscribe(request: IMovieRequests) {
|
public subscribe(request: IMovieRequests) {
|
||||||
|
@ -247,26 +238,16 @@ export class MovieRequestsComponent implements OnInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
private loadRequests(amountToLoad: number, currentlyLoaded: number) {
|
private loadRequests(amountToLoad: number, currentlyLoaded: number) {
|
||||||
if(this.filter.availabilityFilter === FilterType.None && this.filter.statusFilter === FilterType.None) {
|
this.requestService.getMovieRequests(amountToLoad, currentlyLoaded, this.orderType, this.filter)
|
||||||
this.requestService.getMovieRequests(amountToLoad, currentlyLoaded + 1)
|
|
||||||
.subscribe(x => {
|
.subscribe(x => {
|
||||||
this.setOverrides(x);
|
this.setOverrides(x.collection);
|
||||||
if(!this.movieRequests) {
|
if(!this.movieRequests) {
|
||||||
this.movieRequests = [];
|
this.movieRequests = [];
|
||||||
}
|
}
|
||||||
this.movieRequests = x;
|
this.movieRequests = x.collection;
|
||||||
|
this.totalMovies = x.total;
|
||||||
this.currentlyLoaded = currentlyLoaded + amountToLoad;
|
this.currentlyLoaded = currentlyLoaded + amountToLoad;
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
this.filter.position = currentlyLoaded;
|
|
||||||
this.requestService.filterMovies(this.filter)
|
|
||||||
.subscribe(x => {
|
|
||||||
this.setOverrides(x.collection);
|
|
||||||
this.totalMovies = x.total;
|
|
||||||
this.movieRequests = x.collection;
|
|
||||||
this.currentlyLoaded = currentlyLoaded + amountToLoad;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private updateRequest(request: IMovieRequests) {
|
private updateRequest(request: IMovieRequests) {
|
||||||
|
@ -305,23 +286,25 @@ export class MovieRequestsComponent implements OnInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
private loadInit() {
|
private loadInit() {
|
||||||
this.requestService.getTotalMovies().subscribe(x => this.totalMovies = x);
|
this.requestService.getMovieRequests(this.amountToLoad, 0, this.orderType, this.filter)
|
||||||
this.requestService.getMovieRequests(this.amountToLoad, 0)
|
|
||||||
.subscribe(x => {
|
.subscribe(x => {
|
||||||
this.movieRequests = x;
|
this.movieRequests = x.collection;
|
||||||
|
this.totalMovies = x.total;
|
||||||
|
|
||||||
this.movieRequests.forEach((req) => {
|
this.movieRequests.forEach((req) => {
|
||||||
this.setBackground(req);
|
this.setBackground(req);
|
||||||
this.setPoster(req);
|
this.setPoster(req);
|
||||||
});
|
|
||||||
this.radarrService.getQualityProfilesFromSettings().subscribe(c => {
|
|
||||||
this.radarrProfiles = c;
|
|
||||||
this.movieRequests.forEach((req) => this.setQualityOverrides(req));
|
|
||||||
});
|
|
||||||
this.radarrService.getRootFoldersFromSettings().subscribe(c => {
|
|
||||||
this.radarrRootFolders = c;
|
|
||||||
this.movieRequests.forEach((req) => this.setRootFolderOverrides(req));
|
|
||||||
});
|
});
|
||||||
|
if (this.isAdmin) {
|
||||||
|
this.radarrService.getQualityProfilesFromSettings().subscribe(c => {
|
||||||
|
this.radarrProfiles = c;
|
||||||
|
this.movieRequests.forEach((req) => this.setQualityOverrides(req));
|
||||||
|
});
|
||||||
|
this.radarrService.getRootFoldersFromSettings().subscribe(c => {
|
||||||
|
this.radarrRootFolders = c;
|
||||||
|
this.movieRequests.forEach((req) => this.setRootFolderOverrides(req));
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ import { Observable } from "rxjs/Rx";
|
||||||
|
|
||||||
import { TreeNode } from "primeng/primeng";
|
import { TreeNode } from "primeng/primeng";
|
||||||
import { IRequestEngineResult } from "../interfaces";
|
import { IRequestEngineResult } from "../interfaces";
|
||||||
import { IChildRequests, IFilter, IFilterResult, IMovieRequestModel, IMovieRequests, IMovieUpdateModel, ITvRequests,ITvUpdateModel } from "../interfaces";
|
import { IChildRequests, IFilter, IMovieRequestModel, IMovieRequests, IMovieUpdateModel, IRequestsViewModel, ITvRequests,ITvUpdateModel, OrderType } from "../interfaces";
|
||||||
import { ITvRequestViewModel } from "../interfaces";
|
import { ITvRequestViewModel } from "../interfaces";
|
||||||
import { ServiceHelpers } from "./service.helpers";
|
import { ServiceHelpers } from "./service.helpers";
|
||||||
|
|
||||||
|
@ -48,8 +48,8 @@ export class RequestService extends ServiceHelpers {
|
||||||
return this.http.post<IRequestEngineResult>(`${this.url}Movie/unavailable`, JSON.stringify(movie), {headers: this.headers});
|
return this.http.post<IRequestEngineResult>(`${this.url}Movie/unavailable`, JSON.stringify(movie), {headers: this.headers});
|
||||||
}
|
}
|
||||||
|
|
||||||
public getMovieRequests(count: number, position: number): Observable<IMovieRequests[]> {
|
public getMovieRequests(count: number, position: number, order: OrderType, filter: IFilter): Observable<IRequestsViewModel<IMovieRequests>> {
|
||||||
return this.http.get<IMovieRequests[]>(`${this.url}movie/${count}/${position}`, {headers: this.headers});
|
return this.http.get<IRequestsViewModel<IMovieRequests>>(`${this.url}movie/${count}/${position}/${order}/${filter.statusFilter}/${filter.availabilityFilter}`, {headers: this.headers});
|
||||||
}
|
}
|
||||||
|
|
||||||
public searchMovieRequests(search: string): Observable<IMovieRequests[]> {
|
public searchMovieRequests(search: string): Observable<IMovieRequests[]> {
|
||||||
|
@ -114,10 +114,7 @@ export class RequestService extends ServiceHelpers {
|
||||||
public deleteChild(child: IChildRequests): Observable<boolean> {
|
public deleteChild(child: IChildRequests): Observable<boolean> {
|
||||||
return this.http.delete<boolean>(`${this.url}tv/child/${child.id}`, {headers: this.headers});
|
return this.http.delete<boolean>(`${this.url}tv/child/${child.id}`, {headers: this.headers});
|
||||||
}
|
}
|
||||||
public filterMovies(filter: IFilter): Observable<IFilterResult<IMovieRequests>> {
|
|
||||||
return this.http.post<IFilterResult<IMovieRequests>>(`${this.url}movie/filter`, JSON.stringify(filter), {headers: this.headers});
|
|
||||||
}
|
|
||||||
|
|
||||||
public subscribeToMovie(requestId: number): Observable<boolean> {
|
public subscribeToMovie(requestId: number): Observable<boolean> {
|
||||||
return this.http.post<boolean>(`${this.url}movie/subscribe/${requestId}`, {headers: this.headers});
|
return this.http.post<boolean>(`${this.url}movie/subscribe/${requestId}`, {headers: this.headers});
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Ombi.Store.Entities.Requests;
|
using Ombi.Store.Entities.Requests;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using Ombi.Core.Models.UI;
|
||||||
using Ombi.Models;
|
using Ombi.Models;
|
||||||
using Ombi.Store.Entities;
|
using Ombi.Store.Entities;
|
||||||
|
|
||||||
|
@ -32,10 +33,18 @@ namespace Ombi.Controllers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="count">The count of items you want to return.</param>
|
/// <param name="count">The count of items you want to return.</param>
|
||||||
/// <param name="position">The position.</param>
|
/// <param name="position">The position.</param>
|
||||||
[HttpGet("movie/{count:int}/{position:int}")]
|
/// <param name="orderType"> The way we want to order.</param>
|
||||||
public async Task<IEnumerable<MovieRequests>> GetRequests(int count, int position)
|
/// <param name="statusType"></param>
|
||||||
|
/// <param name="availabilityType"></param>
|
||||||
|
[HttpGet("movie/{count:int}/{position:int}/{orderType:int}/{statusType:int}/{availabilityType:int}")]
|
||||||
|
public async Task<RequestsViewModel<MovieRequests>> GetRequests(int count, int position, int orderType, int statusType, int availabilityType)
|
||||||
{
|
{
|
||||||
return await MovieRequestEngine.GetRequests(count, position);
|
return await MovieRequestEngine.GetRequests(count, position, new OrderFilterModel
|
||||||
|
{
|
||||||
|
OrderType = (OrderType)orderType,
|
||||||
|
AvailabilityFilter = (FilterType)availabilityType,
|
||||||
|
StatusFilter = (FilterType)statusType,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -170,11 +179,19 @@ namespace Ombi.Controllers
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="count">The count of items you want to return.</param>
|
/// <param name="count">The count of items you want to return.</param>
|
||||||
/// <param name="position">The position.</param>
|
/// <param name="position">The position.</param>
|
||||||
|
/// <param name="orderType"></param>
|
||||||
|
/// <param name="statusType"></param>
|
||||||
|
/// <param name="availabilityType"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("tv/{count:int}/{position:int}")]
|
[HttpGet("tv/{count:int}/{position:int}/{orderType:int}/{statusFilterType:int}/{availabilityFilterType:int}")]
|
||||||
public async Task<IEnumerable<TvRequests>> GetTvRequests(int count, int position)
|
public async Task<RequestsViewModel<TvRequests>> GetTvRequests(int count, int position, int orderType, int statusType, int availabilityType)
|
||||||
{
|
{
|
||||||
return await TvRequestEngine.GetRequests(count, position);
|
return await TvRequestEngine.GetRequests(count, position, new OrderFilterModel
|
||||||
|
{
|
||||||
|
OrderType = (OrderType)orderType,
|
||||||
|
AvailabilityFilter = (FilterType) availabilityType,
|
||||||
|
StatusFilter = (FilterType) statusType,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -347,17 +364,6 @@ namespace Ombi.Controllers
|
||||||
return movies || tv;
|
return movies || tv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a filtered list
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="vm"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost("movie/filter")]
|
|
||||||
public async Task<FilterResult<MovieRequests>> Filter([FromBody] FilterViewModel vm)
|
|
||||||
{
|
|
||||||
return await MovieRequestEngine.Filter(vm);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Subscribes for notifications to a movie request
|
/// Subscribes for notifications to a movie request
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -138,10 +138,12 @@
|
||||||
"Filter":"Filter",
|
"Filter":"Filter",
|
||||||
"Sort":"Sort",
|
"Sort":"Sort",
|
||||||
"SeasonNumberHeading":"Season: {seasonNumber}",
|
"SeasonNumberHeading":"Season: {seasonNumber}",
|
||||||
"SortTitle":"Title",
|
"SortTitleAsc":"Title ▲",
|
||||||
"SortRequestDate": "Request Date",
|
"SortTitleDesc":"Title ▼",
|
||||||
"SortRequestedBy":"Requested By",
|
"SortRequestDateAsc": "Request Date ▲",
|
||||||
"SortStatus":"Status"
|
"SortRequestDateDesc": "Request Date ▼",
|
||||||
|
"SortStatusAsc":"Status ▲",
|
||||||
|
"SortStatusDesc":"Status ▼"
|
||||||
},
|
},
|
||||||
"Issues":{
|
"Issues":{
|
||||||
"Title":"Issues",
|
"Title":"Issues",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue