Request Grid test

pull/1425/head
Jamie.Rees 8 years ago
parent e0018f63fa
commit d5ec429893

@ -0,0 +1,131 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Moq;
using Ombi.Core.Engine;
using Ombi.Core.Models.Requests;
using Ombi.Core.Models.Requests.Movie;
using Ombi.Core.Requests.Models;
using Xunit;
namespace Ombi.Core.Tests.Engine
{
public class MovieRequestEngineTests
{
public MovieRequestEngineTests()
{
RequestService = new Mock<IRequestService<MovieRequestModel>>();
var requestService = new RequestService(null, RequestService.Object);
Engine = new MovieRequestEngine(null, requestService, null, null, null);
}
private MovieRequestEngine Engine { get; }
private Mock<IRequestService<MovieRequestModel>> RequestService { get; }
[Fact]
public async Task GetNewRequests_Should_ReturnEmpty_WhenThereAreNoNewRequests()
{
var requests = new List<MovieRequestModel>
{
new MovieRequestModel { Available = true },
new MovieRequestModel { Approved = true },
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetNewRequests();
Assert.False(result.Any());
}
[Fact]
public async Task GetNewRequests_Should_ReturnOnlyNewRequests_WhenThereAreMultipleRequests()
{
var requests = new List<MovieRequestModel>
{
new MovieRequestModel { Available = true },
new MovieRequestModel { Approved = true },
new MovieRequestModel(),
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetNewRequests();
Assert.Equal(result.Count(), 1);
Assert.All(result, x =>
{
Assert.Equal(x.Available, false);
Assert.Equal(x.Approved, false);
});
}
[Fact]
public async Task GetApprovedRequests_Should_ReturnEmpty_WhenThereAreNoApprovedRequests()
{
var requests = new List<MovieRequestModel>
{
new MovieRequestModel { Available = true },
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetApprovedRequests();
Assert.False(result.Any());
}
[Fact]
public async Task GetApprovedRequests_Should_ReturnOnlyApprovedRequests_WhenThereAreMultipleRequests()
{
var requests = new List<MovieRequestModel>
{
new MovieRequestModel { Available = true },
new MovieRequestModel { Approved = true },
new MovieRequestModel(),
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetApprovedRequests();
Assert.Equal(result.Count(), 1);
Assert.All(result, x =>
{
Assert.Equal(x.Available, false);
Assert.Equal(x.Approved, true);
});
}
[Fact]
public async Task GetAvailableRequests_Should_ReturnEmpty_WhenThereAreNoAvailableRequests()
{
var requests = new List<MovieRequestModel>
{
new MovieRequestModel { Approved = true },
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetAvailableRequests();
Assert.False(result.Any());
}
[Fact]
public async Task GetAvailableRequests_Should_ReturnOnlyAvailableRequests_WhenThereAreMultipleRequests()
{
var requests = new List<MovieRequestModel>
{
new MovieRequestModel { Available = true },
new MovieRequestModel { Approved = true },
new MovieRequestModel(),
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetAvailableRequests();
Assert.Equal(result.Count(), 1);
Assert.All(result, x =>
{
Assert.Equal(x.Available, true);
Assert.Equal(x.Approved, false);
});
}
}
}

@ -0,0 +1,130 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Moq;
using Ombi.Core.Engine;
using Ombi.Core.Models.Requests;
using Ombi.Core.Requests.Models;
using Xunit;
namespace Ombi.Core.Tests.Engine
{
public class TvRequestEngineTests
{
public TvRequestEngineTests()
{
RequestService = new Mock<IRequestService<TvRequestModel>>();
var requestService = new RequestService(RequestService.Object, null);
Engine = new TvRequestEngine(null, requestService, null, null, null, null);
}
private TvRequestEngine Engine { get; }
private Mock<IRequestService<TvRequestModel>> RequestService { get; }
[Fact]
public async Task GetNewRequests_Should_ReturnEmpty_WhenThereAreNoNewRequests()
{
var requests = new List<TvRequestModel>
{
new TvRequestModel { Available = true },
new TvRequestModel { Approved = true },
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetNewRequests();
Assert.False(result.Any());
}
[Fact]
public async Task GetNewRequests_Should_ReturnOnlyNewRequests_WhenThereAreMultipleRequests()
{
var requests = new List<TvRequestModel>
{
new TvRequestModel { Available = true },
new TvRequestModel { Approved = true },
new TvRequestModel(),
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetNewRequests();
Assert.Equal(result.Count(), 1);
Assert.All(result, x =>
{
Assert.Equal(x.Available, false);
Assert.Equal(x.Approved, false);
});
}
[Fact]
public async Task GetApprovedRequests_Should_ReturnEmpty_WhenThereAreNoApprovedRequests()
{
var requests = new List<TvRequestModel>
{
new TvRequestModel { Available = true },
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetApprovedRequests();
Assert.False(result.Any());
}
[Fact]
public async Task GetApprovedRequests_Should_ReturnOnlyApprovedRequests_WhenThereAreMultipleRequests()
{
var requests = new List<TvRequestModel>
{
new TvRequestModel { Available = true },
new TvRequestModel { Approved = true },
new TvRequestModel(),
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetApprovedRequests();
Assert.Equal(result.Count(), 1);
Assert.All(result, x =>
{
Assert.Equal(x.Available, false);
Assert.Equal(x.Approved, true);
});
}
[Fact]
public async Task GetAvailableRequests_Should_ReturnEmpty_WhenThereAreNoAvailableRequests()
{
var requests = new List<TvRequestModel>
{
new TvRequestModel { Approved = true },
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetAvailableRequests();
Assert.False(result.Any());
}
[Fact]
public async Task GetAvailableRequests_Should_ReturnOnlyAvailableRequests_WhenThereAreMultipleRequests()
{
var requests = new List<TvRequestModel>
{
new TvRequestModel { Available = true },
new TvRequestModel { Approved = true },
new TvRequestModel(),
};
RequestService.Setup(x => x.GetAllAsync()).ReturnsAsync(requests);
var result = await Engine.GetAvailableRequests();
Assert.Equal(result.Count(), 1);
Assert.All(result, x =>
{
Assert.Equal(x.Available, true);
Assert.Equal(x.Approved, false);
});
}
}
}

@ -1,11 +1,11 @@
using Ombi.Core.Rule.Rules;
using Xunit;
using System.Security.Principal;
using Moq;
using Ombi.Core.Models.Requests;
using Ombi.Core.Claims;
using Ombi.Core.Models.Requests;
using Ombi.Core.Rule.Rules;
using Xunit;
namespace Ombi.Core.Tests
namespace Ombi.Core.Tests.Rule
{
public class AutoApproveRuleTests
{

@ -1,11 +1,11 @@
using Ombi.Core.Rule.Rules;
using Xunit;
using System.Security.Principal;
using Moq;
using Ombi.Core.Models.Requests;
using Ombi.Core.Claims;
using Ombi.Core.Models.Requests;
using Ombi.Core.Rule.Rules;
using Xunit;
namespace Ombi.Core.Tests
namespace Ombi.Core.Tests.Rule
{
public class CanRequestRuleTests
{

@ -1,26 +1,23 @@
using Ombi.Core.Models.Requests;
using System.Collections.Generic;
using System.Threading.Tasks;
using Ombi.Core.Models.Requests;
using Ombi.Core.Models.Requests.Movie;
using Ombi.Core.Models.Search;
using Ombi.Store.Entities;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Ombi.Core.Engine
namespace Ombi.Core.Engine.Interfaces
{
public interface IMovieRequestEngine
public interface IMovieRequestEngine : IRequestEngine<MovieRequestModel>
{
Task<RequestEngineResult> RequestMovie(SearchMovieViewModel model);
bool ShouldAutoApprove(RequestType requestType);
Task<IEnumerable<MovieRequestModel>> GetMovieRequests(int count, int position);
Task<IEnumerable<MovieRequestModel>> SearchMovieRequest(string search);
Task RemoveMovieRequest(int requestId);
Task<MovieRequestModel> UpdateMovieRequest(MovieRequestModel request);
RequestCountModel RequestCount();
}
}

@ -0,0 +1,17 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Ombi.Core.Models.Requests;
namespace Ombi.Core.Engine.Interfaces
{
public interface IRequestEngine<T>
{
Task<IEnumerable<T>> GetApprovedRequests();
Task<IEnumerable<T>> GetNewRequests();
Task<IEnumerable<T>> GetAvailableRequests();
RequestCountModel RequestCount();
Task<IEnumerable<T>> GetRequests(int count, int position);
Task<IEnumerable<T>> GetRequests();
}
}

@ -1,13 +1,12 @@
using Ombi.Core.Models.Requests;
using Ombi.Core.Models.Search;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Threading.Tasks;
using Ombi.Core.Models.Requests;
using Ombi.Core.Models.Search;
namespace Ombi.Core.Engine
namespace Ombi.Core.Engine.Interfaces
{
public interface ITvRequestEngine
public interface ITvRequestEngine : IRequestEngine<TvRequestModel>
{
Task<IEnumerable<TvRequestModel>> GetTvRequests(int count, int position);
Task RemoveTvRequest(int requestId);
@ -16,7 +15,5 @@ namespace Ombi.Core.Engine
Task<IEnumerable<TvRequestModel>> SearchTvRequest(string search);
Task<TvRequestModel> UpdateTvRequest(TvRequestModel request);
RequestCountModel RequestCount();
}
}

@ -14,6 +14,7 @@ using System.Globalization;
using System.Linq;
using System.Security.Principal;
using System.Threading.Tasks;
using Ombi.Core.Engine.Interfaces;
namespace Ombi.Core.Engine
{
@ -160,12 +161,18 @@ namespace Ombi.Core.Engine
return null;
}
public async Task<IEnumerable<MovieRequestModel>> GetMovieRequests(int count, int position)
public async Task<IEnumerable<MovieRequestModel>> GetRequests(int count, int position)
{
var allRequests = await MovieRequestService.GetAllAsync(count, position);
return allRequests;
}
public async Task<IEnumerable<MovieRequestModel>> GetRequests()
{
var allRequests = await MovieRequestService.GetAllAsync();
return allRequests;
}
public async Task<IEnumerable<MovieRequestModel>> SearchMovieRequest(string search)
{
var allRequests = await MovieRequestService.GetAllAsync();
@ -256,5 +263,23 @@ namespace Ombi.Core.Engine
return new RequestEngineResult {RequestAdded = true};
}
public async Task<IEnumerable<MovieRequestModel>> GetApprovedRequests()
{
var allRequests = await MovieRequestService.GetAllAsync();
return allRequests.Where(x => x.Approved && !x.Available);
}
public async Task<IEnumerable<MovieRequestModel>> GetNewRequests()
{
var allRequests = await MovieRequestService.GetAllAsync();
return allRequests.Where(x => !x.Approved && !x.Available);
}
public async Task<IEnumerable<MovieRequestModel>> GetAvailableRequests()
{
var allRequests = await MovieRequestService.GetAllAsync();
return allRequests.Where(x => !x.Approved && x.Available);
}
}
}

@ -14,6 +14,7 @@ using System.Globalization;
using System.Linq;
using System.Security.Principal;
using System.Threading.Tasks;
using Ombi.Core.Engine.Interfaces;
namespace Ombi.Core.Engine
{
@ -51,7 +52,7 @@ namespace Ombi.Core.Engine
Status = showInfo.status,
RequestedDate = DateTime.UtcNow,
Approved = false,
RequestedUsers = new List<string> {Username},
RequestedUsers = new List<string> { Username },
Issues = IssueState.None,
ProviderId = tv.Id,
RequestAll = tv.RequestAll,
@ -124,12 +125,18 @@ namespace Ombi.Core.Engine
return await AddRequest(model);
}
public async Task<IEnumerable<TvRequestModel>> GetTvRequests(int count, int position)
public async Task<IEnumerable<TvRequestModel>> GetRequests(int count, int position)
{
var allRequests = await TvRequestService.GetAllAsync(count, position);
return allRequests;
}
public async Task<IEnumerable<TvRequestModel>> GetRequests()
{
var allRequests = await TvRequestService.GetAllAsync();
return allRequests;
}
public async Task<IEnumerable<TvRequestModel>> SearchTvRequest(string search)
{
var allRequests = await TvRequestService.GetAllAsync();
@ -234,7 +241,25 @@ namespace Ombi.Core.Engine
// await RequestLimitRepo.UpdateAsync(usersLimit);
//}
return new RequestEngineResult {RequestAdded = true};
return new RequestEngineResult { RequestAdded = true };
}
public async Task<IEnumerable<TvRequestModel>> GetApprovedRequests()
{
var allRequests = await TvRequestService.GetAllAsync();
return allRequests.Where(x => x.Approved && !x.Available);
}
public async Task<IEnumerable<TvRequestModel>> GetNewRequests()
{
var allRequests = await TvRequestService.GetAllAsync();
return allRequests.Where(x => !x.Approved && !x.Available);
}
public async Task<IEnumerable<TvRequestModel>> GetAvailableRequests()
{
var allRequests = await TvRequestService.GetAllAsync();
return allRequests.Where(x => x.Available);
}
}
}

@ -1,12 +1,14 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Ombi.Core.Engine;
using Ombi.Core.Engine.Interfaces;
using Ombi.Core.Models.Requests;
using Ombi.Core.Models.Requests.Movie;
using Ombi.Core.Models.Search;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Ombi.Models;
namespace Ombi.Controllers
{
@ -22,15 +24,20 @@ namespace Ombi.Controllers
private IMovieRequestEngine MovieRequestEngine { get; }
private ITvRequestEngine TvRequestEngine { get; }
[HttpGet("movie/{count:int}/{position:int}")]
public async Task<IEnumerable<MovieRequestModel>> GetRequests(int count, int position)
{
return await MovieRequestEngine.GetMovieRequests(count, position);
return await MovieRequestEngine.GetRequests(count, position);
}
[HttpGet("movie")]
public async Task<IEnumerable<MovieRequestModel>> GetRequests()
{
return await MovieRequestEngine.GetRequests();
}
[HttpPost("movie")]
public async Task<RequestEngineResult> RequestMovie([FromBody]SearchMovieViewModel movie)
public async Task<RequestEngineResult> RequestMovie([FromBody] SearchMovieViewModel movie)
{
return await MovieRequestEngine.RequestMovie(movie);
}
@ -38,7 +45,6 @@ namespace Ombi.Controllers
[HttpGet("movie/search/{searchTerm}")]
public async Task<IEnumerable<MovieRequestModel>> Search(string searchTerm)
{
return await MovieRequestEngine.SearchMovieRequest(searchTerm);
}
@ -49,7 +55,7 @@ namespace Ombi.Controllers
}
[HttpPut("movie")]
public async Task<MovieRequestModel> UpdateRequest([FromBody]MovieRequestModel model)
public async Task<MovieRequestModel> UpdateRequest([FromBody] MovieRequestModel model)
{
return await MovieRequestEngine.UpdateMovieRequest(model);
}
@ -57,28 +63,24 @@ namespace Ombi.Controllers
[HttpGet("tv/{count:int}/{position:int}")]
public async Task<IEnumerable<TvRequestModel>> GetTvRequests(int count, int position)
{
try
{
return await TvRequestEngine.GetTvRequests(count, position);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
return await TvRequestEngine.GetRequests(count, position);
}
[HttpGet("tv")]
public async Task<IEnumerable<TvRequestModel>> GetTvRequests()
{
return await TvRequestEngine.GetRequests();
}
[HttpPost("tv")]
public async Task<RequestEngineResult> RequestTv([FromBody]SearchTvShowViewModel tv)
public async Task<RequestEngineResult> RequestTv([FromBody] SearchTvShowViewModel tv)
{
return await TvRequestEngine.RequestTvShow(tv);
}
[HttpGet("tv/search/{searchTerm}")]
public async Task<IEnumerable<TvRequestModel>> SearchTv(string searchTerm)
{
return await TvRequestEngine.SearchTvRequest(searchTerm);
}
@ -89,7 +91,7 @@ namespace Ombi.Controllers
}
[HttpPut("tv")]
public async Task<TvRequestModel> UpdateRequest([FromBody]TvRequestModel model)
public async Task<TvRequestModel> UpdateRequest([FromBody] TvRequestModel model)
{
return await TvRequestEngine.UpdateTvRequest(model);
}
@ -101,5 +103,30 @@ namespace Ombi.Controllers
// Doesn't matter if we use the TvEngine or MovieEngine, this method is in the base class
return TvRequestEngine.RequestCount();
}
[HttpGet("tv/grid")]
public async Task<RequestGridModel<TvRequestModel>> GetTvRequestsGrid()
{
return await GetGrid(TvRequestEngine);
}
[HttpGet("movie/grid")]
public async Task<RequestGridModel<MovieRequestModel>> GetMovieRequestsGrid()
{
return await GetGrid(MovieRequestEngine);
}
private async Task<RequestGridModel<T>> GetGrid<T>(IRequestEngine<T> engine) where T : BaseRequestModel
{
var allRequests = await engine.GetRequests();
var r = allRequests.ToList();
var model = new RequestGridModel<T>
{
Available = r.Where(x => x.Available && !x.Approved),
Approved = r.Where(x => x.Approved && !x.Available),
New = r.Where(x => !x.Available && !x.Approved)
};
return model;
}
}
}
}

@ -0,0 +1,12 @@
using System.Collections.Generic;
using Ombi.Core.Models.Requests;
namespace Ombi.Models
{
public class RequestGridModel<T> where T : BaseRequestModel
{
public IEnumerable<T> Available { get; set; }
public IEnumerable<T> New { get; set; }
public IEnumerable<T> Approved { get; set; }
}
}

@ -64,6 +64,36 @@
<Content Update="wwwroot\app\interfaces\ISonarr - Copy.ts">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="wwwroot\app\requests\request - Copy.component.js">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="wwwroot\app\requests\request - Copy.component.js.map">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="wwwroot\app\requests\request - Copy.component.ts">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="wwwroot\app\requests\request-grid - Copy.component.html">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="wwwroot\app\requests\request-card.component.js">
<DependentUpon>request-card.component.ts</DependentUpon>
</Content>
<Content Update="wwwroot\app\requests\request-grid - Copy.component.js">
<DependentUpon>request-grid - Copy.component.ts</DependentUpon>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="wwwroot\app\requests\request-card.component.js.map">
<DependentUpon>request-card.component.js</DependentUpon>
</Content>
<Content Update="wwwroot\app\requests\request-grid - Copy.component.js.map">
<DependentUpon>request-grid - Copy.component.js</DependentUpon>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="wwwroot\app\requests\request-grid - Copy.component.ts">
<DependentUpon>request-grid - Copy.component.html</DependentUpon>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="wwwroot\app\services\applications\sonarr - Copy.service.js">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>

@ -1,6 +1,7 @@
@import "./bootstrap.css";
//@import "./lib/tether.css";
@import "../node_modules/primeng/resources/themes/omega/theme.scss";
@import "../node_modules/@angular/material/prebuilt-themes/deeppurple-amber";
@import "./lib/primeng.css";
$fa-font-path: "../fonts/lib";

@ -57,7 +57,8 @@ var paths = {
'./bower_components/PACE/pace.js',
'./node_modules/bootstrap/dist/js/bootstrap.js',
'./node_modules/tether/dist/js/tether.js',
'./node_modules/angular2-jwt/angular2-jwt.js'
'./node_modules/angular2-jwt/angular2-jwt.js',
],
dest: './lib/'
},
@ -74,6 +75,7 @@ var paths = {
'./node_modules/primeng/resources/primeng.css',
'./node_modules/tether/dist/css/tether.css',
'./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css',
'./node_modules/dragula/dist/dragula.css'
],
dest: './css/lib/'
},
@ -125,6 +127,11 @@ var paths = {
name: 'primeng',
src: './node_modules/primeng/**/*.js',
dest: './lib/primeng/'
},
{
name: 'ng2-dragula',
src: './node_modules/ng2-dragula/**/*.js',
dest: './lib/ng2-dragula/'
}
],
sass: // Simple sass->css compilation

@ -37,6 +37,7 @@
"jquery": "2.2.1",
"merge-stream": "^1.0.1",
"nanoscroller": "^0.8.7",
"ng2-dragula": "^1.3.1",
"ngx-infinite-scroll": "^0.4.1",
"primeng": "^2.0.5",
"run-sequence": "^1.2.2",

@ -2,17 +2,20 @@ import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FormsModule } from '@angular/forms';
import { MdButtonModule } from '@angular/material';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { AppComponent } from './app.component';
import { MdButtonModule, MdCardModule } from '@angular/material';
import { RouterModule, Routes } from '@angular/router';
import { HttpModule } from '@angular/http';
import { InfiniteScrollModule } from 'ngx-infinite-scroll'
// Third Party
import { ButtonModule, DialogModule } from 'primeng/primeng';
import { GrowlModule } from 'primeng/components/growl/growl';
import { DataTableModule, SharedModule } from 'primeng/primeng';
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
import { DragulaModule, DragulaService } from 'ng2-dragula/ng2-dragula';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
// Components
import { AppComponent } from './app.component';
// Search
import { SearchComponent } from './search/search.component';
import { MovieSearchComponent } from './search/moviesearch.component';
@ -23,6 +26,8 @@ import { SeriesInformationComponent } from './search/seriesinformation.component
import { RequestComponent } from './requests/request.component';
import { MovieRequestsComponent } from './requests/movierequests.component';
import { TvRequestsComponent } from './requests/tvrequests.component';
import { RequestGridComponent } from './requests/request-grid.component';
import { RequestCardComponent } from './requests/request-card.component';
import { LoginComponent } from './login/login.component';
import { LandingPageComponent } from './landingpage/landingpage.component';
@ -45,16 +50,13 @@ import { StatusService } from './services/status.service';
import { SettingsModule } from './settings/settings.module';
import { WizardModule } from './wizard/wizard.module';
import { ButtonModule, DialogModule } from 'primeng/primeng';
import { GrowlModule } from 'primeng/components/growl/growl';
import { DataTableModule, SharedModule } from 'primeng/primeng';
const routes: Routes = [
{ path: '*', component: PageNotFoundComponent },
{ path: '', redirectTo: '/search', pathMatch: 'full' },
{ path: 'search', component: SearchComponent, canActivate: [AuthGuard] },
{ path: 'search/show/:id', component: SeriesInformationComponent, canActivate: [AuthGuard] },
{ path: 'requests', component: RequestComponent, canActivate: [AuthGuard] },
{ path: 'requests-grid', component: RequestGridComponent },
{ path: 'login', component: LoginComponent },
{ path: 'landingpage', component: LandingPageComponent },
{ path: 'usermanagement', component: UserManagementComponent, canActivate: [AuthGuard] },
@ -78,6 +80,8 @@ const routes: Routes = [
DialogModule,
MdButtonModule,
NgbModule.forRoot(),
DragulaModule,
MdCardModule
],
declarations: [
AppComponent,
@ -92,6 +96,8 @@ const routes: Routes = [
MovieRequestsComponent,
TvRequestsComponent,
SeriesInformationComponent,
RequestGridComponent,
RequestCardComponent,
],
providers: [
SearchService,
@ -101,7 +107,8 @@ const routes: Routes = [
AuthGuard,
SettingsService,
IdentityService,
StatusService
StatusService,
DragulaService
],
bootstrap: [AppComponent]
})

@ -68,4 +68,10 @@ export enum RequestType {
export interface IRequestsPageScroll {
count: number,
position: number
}
export interface IRequestGrid<T> {
available: T[],
new: T[],
approved:T[]
}

@ -0,0 +1,3 @@
<div *ngIf="request">
{{request.title}}
</div>

@ -0,0 +1,12 @@
import { Component, Input } from '@angular/core';
import { IMediaBase } from '../interfaces/IRequestModel';
@Component({
selector: 'request-card',
moduleId: module.id,
templateUrl: './request-card.component.html'
})
export class RequestCardComponent {
@Input() request: IMediaBase;
}

@ -0,0 +1,39 @@

<div *ngIf="tvRequests">
<div class="col-md-4">
<md-card>
<md-card-title>Title</md-card-title>
<div [dragula]='"requests"' [dragulaModel]="tvRequests.new">
<br />
<br />
<request-card *ngFor="let item of tvRequests.new" [request]="item" [attr.data.id]="item.id"></request-card>
</div>
</md-card>
</div>
<div class="col-md-4">
<md-card>
<md-card-title>Title</md-card-title>
<div [dragula]='"requests"' [dragulaModel]="tvRequests.approved">
<br />
<br />
<request-card *ngFor="let item of tvRequests.approved" [request]="item" [attr.data.id]="item.id"></request-card>
</div>
</md-card>
</div>
<div class="col-md-4">
<md-card>
<md-card-title>Title</md-card-title>
<div style="border: dashed">
<div [dragula]='"requests"' [dragulaModel]="tvRequests.available">
<br />
<br />
<request-card *ngFor="let item of tvRequests.available" [request]="item" [attr.data.id]="item.id"></request-card>
</div>
</div>
</md-card>
</div>
</div>

@ -0,0 +1,37 @@
import { Component, OnInit } from '@angular/core';
import { DragulaService } from 'ng2-dragula/ng2-dragula';
import { RequestService } from '../services/request.service';
import { ITvRequestModel, IMovieRequestModel, IRequestGrid } from '../interfaces/IRequestModel';
@Component({
moduleId: module.id,
templateUrl: './request-grid.component.html'
})
export class RequestGridComponent implements OnInit {
constructor(private dragulaService: DragulaService, private requestService: RequestService) {
this.dragulaService.setOptions('requests', {
removeOnSpill: false,
});
this.dragulaService.drop.subscribe((value: any) => {
});
}
ngOnInit(): void {
this.requestService.getMovieGrid().subscribe(x => {
this.movieRequests = x;
});
this.requestService.getTvGrid().subscribe(x => {
this.tvRequests = x;
});
}
movieRequests: IRequestGrid<IMovieRequestModel>;
tvRequests: IRequestGrid<ITvRequestModel>;
}

@ -7,7 +7,7 @@ import { ServiceAuthHelpers } from './service.helpers';
import { IRequestEngineResult } from '../interfaces/IRequestEngineResult';
import { ISearchMovieResult } from '../interfaces/ISearchMovieResult';
import { ISearchTvResult } from '../interfaces/ISearchTvResult';
import { IMovieRequestModel, ITvRequestModel, IRequestCountModel } from '../interfaces/IRequestModel';
import { IMovieRequestModel, ITvRequestModel, IRequestCountModel, IRequestGrid } from '../interfaces/IRequestModel';
@Injectable()
export class RequestService extends ServiceAuthHelpers {
@ -58,4 +58,12 @@ export class RequestService extends ServiceAuthHelpers {
getRequestsCount(): Observable<IRequestCountModel> {
return this.basicHttp.get(`${this.url}count`).map(this.extractData);
}
getMovieGrid(): Observable<IRequestGrid<IMovieRequestModel>> {
return this.http.get(`${this.url}movie/grid`).map(this.extractData);
}
getTvGrid(): Observable<IRequestGrid<ITvRequestModel>> {
return this.http.get(`${this.url}tv/grid`).map(this.extractData);
}
}

@ -51,7 +51,7 @@
</div>
<div class="form-group">
<div>
<button type="submit" (click)="getProfiles()" class="btn btn-primary-outline">Get Quality Profiles <div *ngIf="profilesRunning" class="fa fa-spinner fa-spin" /></button>
<button type="submit" (click)="getProfiles()" class="btn btn-primary-outline">Get Quality Profiles <span *ngIf="profilesRunning" class="fa fa-spinner fa-spin"> </span></button>
</div>
</div>
<div class="form-group">
@ -65,7 +65,7 @@
<div class="form-group">
<div>
<button type="submit" (click)="getRootFolders()" class="btn btn-primary-outline">Get Root Folders <div *ngIf="rootFoldersRunning" class="fa fa-spinner fa-spin" /></button>
<button type="submit" (click)="getRootFolders()" class="btn btn-primary-outline">Get Root Folders <span *ngIf="rootFoldersRunning" class="fa fa-spinner fa-spin" ></span></button>
</div>
@ -89,7 +89,7 @@
</div>
<div class="form-group">
<div>
<button (click)="test()" type="submit" class="btn btn-primary-outline">Test Connectivity <div id="spinner" /></button>
<button (click)="test()" type="submit" class="btn btn-primary-outline">Test Connectivity <span id="spinner" ></span></button>
</div>
</div>

@ -51,7 +51,7 @@
</div>
<div class="form-group">
<div>
<button type="submit" (click)="getProfiles()" class="btn btn-primary-outline">Get Quality Profiles <div *ngIf="profilesRunning" class="fa fa-spinner fa-spin" /></button>
<button type="submit" (click)="getProfiles()" class="btn btn-primary-outline">Get Quality Profiles <span *ngIf="profilesRunning" class="fa fa-spinner fa-spin"></span></button>
</div>
</div>
<div class="form-group">
@ -65,7 +65,7 @@
<div class="form-group">
<div>
<button type="submit" (click)="getRootFolders()" class="btn btn-primary-outline">Get Root Folders <div *ngIf="rootFoldersRunning" class="fa fa-spinner fa-spin" /></button>
<button type="submit" (click)="getRootFolders()" class="btn btn-primary-outline">Get Root Folders <span *ngIf="rootFoldersRunning" class="fa fa-spinner fa-spin" ></span></button>
</div>
@ -89,7 +89,7 @@
</div>
<div class="form-group">
<div>
<button (click)="test()" type="submit" class="btn btn-primary-outline">Test Connectivity <div id="spinner" /></button>
<button (click)="test()" type="submit" class="btn btn-primary-outline">Test Connectivity <span id="spinner"> </span></button>
</div>
</div>

Loading…
Cancel
Save