diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml new file mode 100644 index 000000000..499cd272d --- /dev/null +++ b/.github/workflows/cypress.yml @@ -0,0 +1,57 @@ +name: Automation Tests + +on: + push: + branches: [ develop, feature/** ] + pull_request: + branches: [ develop ] + schedule: + - cron: '0 0 * * *' + +jobs: + automation-tests: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 5.0.x + - uses: actions/setup-node@v2 + with: + node-version: '14' + + - uses: actions/cache@v2 + with: + path: | + '**/node_modules' + '/home/runner/.cache/Cypress' + key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} + + - name: Install Frontend Deps + run: yarn --cwd ./src/Ombi/ClientApp install + + - name: Install Automation Deps + run: yarn --cwd ./tests install + + - name: Start Backend + run: | + nohup dotnet run -p ./src/Ombi -- --host http://*:3577 & + - name: Start Frontend + run: | + nohup yarn --cwd ./src/Ombi/ClientApp start & + - name: Cypress Tests + uses: cypress-io/github-action@v2.8.2 + with: + record: true + browser: chrome + headless: true + working-directory: tests + wait-on: http://localhost:3577/ + # 7 minutes + wait-on-timeout: 420 + env: + CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/README.md b/README.md index d81c9a67d..6dda62be0 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ ____ [![Github All Releases](https://img.shields.io/github/downloads/tidusjar/Ombi/total.svg)](https://github.com/ombi-app/Ombi) [![firsttimersonly](http://img.shields.io/badge/first--timers--only-friendly-blue.svg)](http://www.firsttimersonly.com/) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/ombi/localized.svg)](https://crowdin.com/project/ombi) +[![Automation Tests](https://github.com/Ombi-app/Ombi/actions/workflows/cypress.yml/badge.svg)](https://github.com/Ombi-app/Ombi/actions/workflows/cypress.yml) [![Patreon](https://img.shields.io/badge/patreon-donate-yellow.svg)](https://patreon.com/tidusjar/Ombi) [![Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://paypal.me/PlexRequestsNet) diff --git a/src/Ombi.Core/Engine/V2/IssuesEngine.cs b/src/Ombi.Core/Engine/V2/IssuesEngine.cs new file mode 100644 index 000000000..830dd4295 --- /dev/null +++ b/src/Ombi.Core/Engine/V2/IssuesEngine.cs @@ -0,0 +1,81 @@ +using Microsoft.EntityFrameworkCore; +using Ombi.Store.Entities.Requests; +using Ombi.Store.Repository; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace Ombi.Core.Engine.V2 +{ + + public interface IIssuesEngine + { + Task> GetIssues(int position, int take, IssueStatus status, CancellationToken token); + Task GetIssuesByProviderId(string providerId, CancellationToken token); + } + + public class IssuesEngine : IIssuesEngine + { + private readonly IRepository _categories; + private readonly IRepository _issues; + private readonly IRepository _comments; + + public IssuesEngine(IRepository categories, + IRepository issues, + IRepository comments) + { + _categories = categories; + _issues = issues; + _comments = comments; + } + + public async Task> GetIssues(int position, int take, IssueStatus status, CancellationToken token) + { + var issues = await _issues.GetAll().Where(x => x.Status == status && x.ProviderId != null).Skip(position).Take(take).OrderBy(x => x.Title).ToListAsync(token); + var grouped = issues.GroupBy(x => x.Title, (key, g) => new { Title = key, Issues = g }); + + var model = new List(); + + foreach(var group in grouped) + { + model.Add(new IssuesSummaryModel + { + Count = group.Issues.Count(), + Title = group.Title, + ProviderId = group.Issues.FirstOrDefault()?.ProviderId + }); + } + + return model; + } + + public async Task GetIssuesByProviderId(string providerId, CancellationToken token) + { + var issues = await _issues.GetAll().Include(x => x.Comments).ThenInclude(x => x.User).Include(x => x.UserReported).Include(x => x.IssueCategory).Where(x => x.ProviderId == providerId).ToListAsync(token); + var grouped = issues.GroupBy(x => x.Title, (key, g) => new { Title = key, Issues = g }).FirstOrDefault(); + + if (grouped == null) + { + return null; + } + + return new IssuesSummaryModel + { + Count = grouped.Issues.Count(), + Title = grouped.Title, + ProviderId = grouped.Issues.FirstOrDefault()?.ProviderId, + Issues = grouped.Issues + }; + } + + } + + public class IssuesSummaryModel + { + public string Title { get; set; } + public int Count { get; set; } + public string ProviderId { get; set; } + public IEnumerable Issues { get; set; } + } +} diff --git a/src/Ombi.Core/Engine/V2/MultiSearchEngine.cs b/src/Ombi.Core/Engine/V2/MultiSearchEngine.cs index 60cd6377d..b24f5a42c 100644 --- a/src/Ombi.Core/Engine/V2/MultiSearchEngine.cs +++ b/src/Ombi.Core/Engine/V2/MultiSearchEngine.cs @@ -63,7 +63,8 @@ namespace Ombi.Core.Engine.V2 var result = new MultiSearchResult { MediaType = multiSearch.media_type, - Poster = multiSearch.poster_path + Poster = multiSearch.poster_path, + Overview = multiSearch.overview }; if (multiSearch.media_type.Equals("movie", StringComparison.InvariantCultureIgnoreCase) && filter.Movies) diff --git a/src/Ombi.Core/Models/Search/V2/MultiSearchResult.cs b/src/Ombi.Core/Models/Search/V2/MultiSearchResult.cs index 8346608b5..64870a97c 100644 --- a/src/Ombi.Core/Models/Search/V2/MultiSearchResult.cs +++ b/src/Ombi.Core/Models/Search/V2/MultiSearchResult.cs @@ -6,5 +6,6 @@ public string MediaType { get; set; } public string Title { get; set; } public string Poster { get; set; } + public string Overview { get; set; } } } \ No newline at end of file diff --git a/src/Ombi.Core/Rule/Rules/SonarrCacheRule.cs b/src/Ombi.Core/Rule/Rules/SonarrCacheRule.cs index ddd8cd983..0e4313ac7 100644 --- a/src/Ombi.Core/Rule/Rules/SonarrCacheRule.cs +++ b/src/Ombi.Core/Rule/Rules/SonarrCacheRule.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Ombi.Core.Models.Search; +using Ombi.Helpers; using Ombi.Store.Context; using Ombi.Store.Entities; using Ombi.Store.Entities.Requests; @@ -53,8 +54,13 @@ namespace Ombi.Core.Rule.Rules if (obj.Type == RequestType.TvShow) { var vm = (SearchTvShowViewModel) obj; - // Check if it's in Radarr - var result = await _ctx.SonarrCache.FirstOrDefaultAsync(x => x.TvDbId.ToString() == vm.TheTvDbId); + // Check if it's in Sonarr + if (!vm.TheTvDbId.HasValue()) + { + return new RuleResult { Success = true }; + } + var tvdbidint = int.Parse(vm.TheTvDbId); + var result = await _ctx.SonarrCache.FirstOrDefaultAsync(x => x.TvDbId == tvdbidint); if (result != null) { vm.Approved = true; @@ -69,7 +75,7 @@ namespace Ombi.Core.Rule.Rules // Check if we have it var monitoredInSonarr = await sonarrEpisodes.FirstOrDefaultAsync(x => x.EpisodeNumber == ep.EpisodeNumber && x.SeasonNumber == season.SeasonNumber - && x.TvDbId.ToString() == vm.TheTvDbId); + && x.TvDbId == tvdbidint); if (monitoredInSonarr != null) { ep.Approved = true; diff --git a/src/Ombi.DependencyInjection/IocExtensions.cs b/src/Ombi.DependencyInjection/IocExtensions.cs index d5e577d84..ef9c9230c 100644 --- a/src/Ombi.DependencyInjection/IocExtensions.cs +++ b/src/Ombi.DependencyInjection/IocExtensions.cs @@ -114,6 +114,7 @@ namespace Ombi.DependencyInjection services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); } public static void RegisterHttp(this IServiceCollection services) diff --git a/src/Ombi.Notifications/Agents/MobileNotification.cs b/src/Ombi.Notifications/Agents/MobileNotification.cs index 61526802c..6080acdf0 100644 --- a/src/Ombi.Notifications/Agents/MobileNotification.cs +++ b/src/Ombi.Notifications/Agents/MobileNotification.cs @@ -131,7 +131,7 @@ namespace Ombi.Notifications.Agents }; // Send to user - var playerIds = GetUsers(model, NotificationType.IssueResolved); + var playerIds = await GetUsers(model, NotificationType.IssueResolved); await Send(playerIds, notification, settings, model); } @@ -172,7 +172,7 @@ namespace Ombi.Notifications.Agents }; // Send to user - var playerIds = GetUsers(model, NotificationType.RequestDeclined); + var playerIds = await GetUsers(model, NotificationType.RequestDeclined); await AddSubscribedUsers(playerIds); await Send(playerIds, notification, settings, model); } @@ -192,7 +192,7 @@ namespace Ombi.Notifications.Agents }; // Send to user - var playerIds = GetUsers(model, NotificationType.RequestApproved); + var playerIds = await GetUsers(model, NotificationType.RequestApproved); await AddSubscribedUsers(playerIds); await Send(playerIds, notification, settings, model); @@ -215,7 +215,7 @@ namespace Ombi.Notifications.Agents Data = data }; // Send to user - var playerIds = GetUsers(model, NotificationType.RequestAvailable); + var playerIds = await GetUsers(model, NotificationType.RequestAvailable); await AddSubscribedUsers(playerIds); await Send(playerIds, notification, settings, model); @@ -285,19 +285,23 @@ namespace Ombi.Notifications.Agents return playerIds; } - private List GetUsers(NotificationOptions model, NotificationType type) + private async Task> GetUsers(NotificationOptions model, NotificationType type) { - var notificationIds = new List(); + var notificationIds = new List(); if (MovieRequest != null || TvRequest != null) { - notificationIds = model.RequestType == RequestType.Movie - ? MovieRequest?.RequestedUser?.NotificationUserIds - : TvRequest?.RequestedUser?.NotificationUserIds; + var userId = model.RequestType == RequestType.Movie + ? MovieRequest?.RequestedUser?.Id + : TvRequest?.RequestedUser?.Id; + + var userNotificationIds = await _notifications.GetAll().Where(x => x.UserId == userId).ToListAsync(); + notificationIds.AddRange(userNotificationIds); } if (model.UserId.HasValue() && (!notificationIds?.Any() ?? true)) { - var user = _userManager.Users.Include(x => x.NotificationUserIds).FirstOrDefault(x => x.Id == model.UserId); - notificationIds = user.NotificationUserIds; + var user = _userManager.Users.FirstOrDefault(x => x.Id == model.UserId); + var userNotificationIds = await _notifications.GetAll().Where(x => x.UserId == model.UserId).ToListAsync(); + notificationIds.AddRange(userNotificationIds); } if (!notificationIds?.Any() ?? true) @@ -306,21 +310,21 @@ namespace Ombi.Notifications.Agents $"there are no users to send a notification for {type}, for agent {NotificationAgent.Mobile}"); return null; } - var playerIds = notificationIds.Select(x => x.PlayerId).ToList(); + var playerIds = notificationIds.Select(x => x.Token).ToList(); return playerIds; } private async Task> GetUsersForIssue(NotificationOptions model, int issueId, NotificationType type) { - var notificationIds = new List(); + var notificationIds = new List(); var issue = await _issueRepository.GetAll() .FirstOrDefaultAsync(x => x.Id == issueId); // Get the user that raised the issue to send the notification to - var userRaised = await _userManager.Users.Include(x => x.NotificationUserIds).FirstOrDefaultAsync(x => x.Id == issue.UserReportedId); + var userRaised = await _userManager.Users.FirstOrDefaultAsync(x => x.Id == issue.UserReportedId); - notificationIds = userRaised.NotificationUserIds; + notificationIds = await _notifications.GetAll().Where(x => x.UserId == userRaised.Id).ToListAsync(); if (!notificationIds?.Any() ?? true) { @@ -328,7 +332,7 @@ namespace Ombi.Notifications.Agents $"there are no users to send a notification for {type}, for agent {NotificationAgent.Mobile}"); return null; } - var playerIds = notificationIds.Select(x => x.PlayerId).ToList(); + var playerIds = notificationIds.Select(x => x.Token).ToList(); return playerIds; } @@ -338,10 +342,11 @@ namespace Ombi.Notifications.Agents { foreach (var user in SubsribedUsers) { - var notificationId = user.NotificationUserIds; - if (notificationId.Any()) + var notificationIds = await _notifications.GetAll().Where(x => x.UserId == user.Id).ToListAsync(); + + if (notificationIds.Any()) { - playerIds.AddRange(notificationId.Select(x => x.PlayerId)); + playerIds.AddRange(notificationIds.Select(x => x.Token)); } } } diff --git a/src/Ombi.Notifications/BaseNotification.cs b/src/Ombi.Notifications/BaseNotification.cs index 465ccd22c..c9404eb2c 100644 --- a/src/Ombi.Notifications/BaseNotification.cs +++ b/src/Ombi.Notifications/BaseNotification.cs @@ -191,7 +191,7 @@ namespace Ombi.Notifications protected IQueryable GetSubscriptions(int requestId, RequestType type) { - var subs = RequestSubscription.GetAll().Include(x => x.User).ThenInclude(x => x.NotificationUserIds).Where(x => x.RequestId == requestId && type == x.RequestType); + var subs = RequestSubscription.GetAll().Include(x => x.User).Where(x => x.RequestId == requestId && type == x.RequestType); return subs.Select(x => x.User); } diff --git a/src/Ombi.Notifications/NotificationMessageCurlys.cs b/src/Ombi.Notifications/NotificationMessageCurlys.cs index 9edf9a820..54e85080b 100644 --- a/src/Ombi.Notifications/NotificationMessageCurlys.cs +++ b/src/Ombi.Notifications/NotificationMessageCurlys.cs @@ -38,7 +38,12 @@ namespace Ombi.Notifications UserName = req?.RequestedUser?.UserName; } - Alias = (req?.RequestedUser?.Alias.HasValue() ?? false) ? req?.RequestedUser?.Alias : req?.RequestedUser?.UserName; + if (Alias.IsNullOrEmpty()) + { + // Can be set if it's an issue + Alias = (req?.RequestedUser?.Alias.HasValue() ?? false) ? req?.RequestedUser?.Alias : req?.RequestedUser?.UserName; + } + if (pref != null) { UserPreference = pref.Value.HasValue() ? pref.Value : Alias; @@ -95,7 +100,10 @@ namespace Ombi.Notifications AvailableDate = req?.MarkedAsAvailable?.ToString("D") ?? string.Empty; DenyReason = req?.DeniedReason; - Alias = (req?.RequestedUser?.Alias.HasValue() ?? false) ? req?.RequestedUser?.Alias : req?.RequestedUser?.UserName; + if (Alias.IsNullOrEmpty()) + { + Alias = (req?.RequestedUser?.Alias.HasValue() ?? false) ? req?.RequestedUser?.Alias : req?.RequestedUser?.UserName; + } if (pref != null) { UserPreference = pref.Value.HasValue() ? pref.Value : Alias; @@ -143,7 +151,10 @@ namespace Ombi.Notifications UserName = req?.RequestedUser?.UserName; } AvailableDate = req?.MarkedAsAvailable?.ToString("D") ?? string.Empty; - Alias = (req?.RequestedUser?.Alias.HasValue() ?? false) ? req?.RequestedUser?.Alias : req?.RequestedUser?.UserName; + if (Alias.IsNullOrEmpty()) + { + Alias = (req?.RequestedUser?.Alias.HasValue() ?? false) ? req?.RequestedUser?.Alias : req?.RequestedUser?.UserName; + } if (pref != null) { UserPreference = pref.Value.HasValue() ? pref.Value : Alias; @@ -223,6 +234,7 @@ namespace Ombi.Notifications IssueSubject = opts.Substitutes.TryGetValue("IssueSubject", out val) ? val : string.Empty; NewIssueComment = opts.Substitutes.TryGetValue("NewIssueComment", out val) ? val : string.Empty; UserName = opts.Substitutes.TryGetValue("IssueUser", out val) ? val : string.Empty; + Alias = opts.Substitutes.TryGetValue("IssueUserAlias", out val) ? val : string.Empty; Type = opts.Substitutes.TryGetValue("RequestType", out val) ? val.Humanize() : string.Empty; } diff --git a/src/Ombi.Schedule/Jobs/Ombi/ResendFailedRequests.cs b/src/Ombi.Schedule/Jobs/Ombi/ResendFailedRequests.cs index 0072ec010..3a9a75835 100644 --- a/src/Ombi.Schedule/Jobs/Ombi/ResendFailedRequests.cs +++ b/src/Ombi.Schedule/Jobs/Ombi/ResendFailedRequests.cs @@ -43,6 +43,12 @@ namespace Ombi.Schedule.Jobs.Ombi if (request.Type == RequestType.Movie) { var movieRequest = await _movieRequestRepository.GetAll().FirstOrDefaultAsync(x => x.Id == request.RequestId); + if (movieRequest == null) + { + await _requestQueue.Delete(request); + await _requestQueue.SaveChangesAsync(); + continue; + } var result = await _movieSender.Send(movieRequest); if (result.Success) { @@ -53,6 +59,12 @@ namespace Ombi.Schedule.Jobs.Ombi if (request.Type == RequestType.TvShow) { var tvRequest = await _tvRequestRepository.GetChild().FirstOrDefaultAsync(x => x.Id == request.RequestId); + if (tvRequest == null) + { + await _requestQueue.Delete(request); + await _requestQueue.SaveChangesAsync(); + continue; + } var result = await _tvSender.Send(tvRequest); if (result.Success) { @@ -63,6 +75,12 @@ namespace Ombi.Schedule.Jobs.Ombi if (request.Type == RequestType.Album) { var musicRequest = await _musicRequestRepository.GetAll().FirstOrDefaultAsync(x => x.Id == request.RequestId); + if (musicRequest == null) + { + await _requestQueue.Delete(request); + await _requestQueue.SaveChangesAsync(); + continue; + } var result = await _musicSender.Send(musicRequest); if (result.Success) { diff --git a/src/Ombi/ClientApp/src/app/app.module.ts b/src/Ombi/ClientApp/src/app/app.module.ts index cfaf783cf..4de2c9f9f 100644 --- a/src/Ombi/ClientApp/src/app/app.module.ts +++ b/src/Ombi/ClientApp/src/app/app.module.ts @@ -145,6 +145,7 @@ export function JwtTokenGetter() { MatCheckboxModule, MatProgressSpinnerModule, MDBBootstrapModule.forRoot(), + // NbThemeModule.forRoot({ name: 'dark'}), JwtModule.forRoot({ config: { tokenGetter: JwtTokenGetter, diff --git a/src/Ombi/ClientApp/src/app/auth/auth.service.ts b/src/Ombi/ClientApp/src/app/auth/auth.service.ts index 3eace43a4..afc0a2491 100644 --- a/src/Ombi/ClientApp/src/app/auth/auth.service.ts +++ b/src/Ombi/ClientApp/src/app/auth/auth.service.ts @@ -74,6 +74,10 @@ export class AuthService extends ServiceHelpers { return false; } + public isAdmin() { + return this.hasRole("Admin") || this.hasRole("PowerUser"); + } + public logout() { this.store.remove("id_token"); } diff --git a/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.html b/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.html index 35eae0e21..61ffb0d3a 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.html +++ b/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.html @@ -1,12 +1,12 @@ - + -
+
-
+
{{RequestType[result.type] | humanize}}
-
- {{getAvailbilityStatus()}} +
+ {{getAvailbilityStatus()}}
-
{{result.title}}
-
{{result.overview}}
+
{{result.title}}
+
{{result.overview}}
-
+
- diff --git a/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.ts b/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.ts index e94789dcb..b22ad1e69 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.ts +++ b/src/Ombi/ClientApp/src/app/discover/components/card/discover-card.component.ts @@ -46,7 +46,7 @@ export class DiscoverCardComponent implements OnInit { public async getExtraTvInfo() { // if (this.result.tvMovieDb) { - // this.tvSearchResult = await this.searchService.getTvInfoWithMovieDbId(+this.result.id); + this.tvSearchResult = await this.searchService.getTvInfoWithMovieDbId(+this.result.id); // } else { // this.tvSearchResult = await this.searchService.getTvInfo(+this.result.id); // } @@ -173,8 +173,8 @@ export class DiscoverCardComponent implements OnInit { private updateTvItem(updated: ISearchTvResultV2) { this.result.title = updated.title; this.result.id = updated.id; - this.result.available = updated.fullyAvailable || updated.partlyAvailable; - this.result.posterPath = updated.banner; + // this.result.available = updated.fullyAvailable || updated.partlyAvailable; + // this.result.posterPath = updated.banner; this.result.requested = updated.requested; this.result.url = updated.imdbId; this.result.overview = updated.overview; diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html index 4b7767721..71fa3ea63 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html +++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html @@ -1,8 +1,8 @@
- {{'Discovery.Combined' | translate}} - {{'Discovery.Movies' | translate}} - {{'Discovery.Tv' | translate}} + {{'Discovery.Combined' | translate}} + {{'Discovery.Movies' | translate}} + {{'Discovery.Tv' | translate}}
diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts index eeb4821c3..6f35518fe 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts +++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts @@ -20,6 +20,7 @@ export enum DiscoverType { export class CarouselListComponent implements OnInit { @Input() public discoverType: DiscoverType; + @Input() public id: string; @ViewChild('carousel', {static: false}) carousel: Carousel; public DiscoverOption = DiscoverOption; diff --git a/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html b/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html index ee52f371c..77083a436 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html +++ b/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html @@ -4,7 +4,7 @@

Popular

- +
@@ -12,7 +12,7 @@

Trending

- +
@@ -20,7 +20,7 @@

Upcoming

- +
diff --git a/src/Ombi/ClientApp/src/app/discover/components/search-results/search-results.component.html b/src/Ombi/ClientApp/src/app/discover/components/search-results/search-results.component.html index 5a8ad4b42..fb836a105 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/search-results/search-results.component.html +++ b/src/Ombi/ClientApp/src/app/discover/components/search-results/search-results.component.html @@ -2,14 +2,14 @@
-
-
+
+
-
-

{{'Discovery.NoSearch' | translate}}

+
+

{{'Discovery.NoSearch' | translate}}

\ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/discover/components/search-results/search-results.component.ts b/src/Ombi/ClientApp/src/app/discover/components/search-results/search-results.component.ts index 0b2aa2030..6637b9e07 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/search-results/search-results.component.ts +++ b/src/Ombi/ClientApp/src/app/discover/components/search-results/search-results.component.ts @@ -87,7 +87,7 @@ export class DiscoverSearchResultsComponent implements OnInit { id: m.id, url: "", rating: 0, - overview: "", + overview: m.overview, approved: false, imdbid: "", denied: false, diff --git a/src/Ombi/ClientApp/src/app/interfaces/ICommon.ts b/src/Ombi/ClientApp/src/app/interfaces/ICommon.ts index 13a91af6c..76ce43a4b 100644 --- a/src/Ombi/ClientApp/src/app/interfaces/ICommon.ts +++ b/src/Ombi/ClientApp/src/app/interfaces/ICommon.ts @@ -28,6 +28,7 @@ export interface IUsersModel { } export interface INavBar { + id: string; icon: string; faIcon: string; name: string; diff --git a/src/Ombi/ClientApp/src/app/interfaces/IIssues.ts b/src/Ombi/ClientApp/src/app/interfaces/IIssues.ts index dce9882ec..10de2a596 100644 --- a/src/Ombi/ClientApp/src/app/interfaces/IIssues.ts +++ b/src/Ombi/ClientApp/src/app/interfaces/IIssues.ts @@ -62,3 +62,10 @@ export interface IUpdateStatus { issueId: number; status: IssueStatus; } + +export interface IIssuesSummary { + title: string; + count: number; + providerId: string; + issues: IIssues[]; +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/interfaces/IRequestModel.ts b/src/Ombi/ClientApp/src/app/interfaces/IRequestModel.ts index 9e61a66b5..495563c36 100644 --- a/src/Ombi/ClientApp/src/app/interfaces/IRequestModel.ts +++ b/src/Ombi/ClientApp/src/app/interfaces/IRequestModel.ts @@ -164,6 +164,7 @@ export interface IEpisodesRequests { available: boolean; requested: boolean; approved: boolean; + requestStatus: string; selected: boolean; // This is for the UI only } diff --git a/src/Ombi/ClientApp/src/app/interfaces/ISearchMovieResult.ts b/src/Ombi/ClientApp/src/app/interfaces/ISearchMovieResult.ts index 70216896c..ecdbcb80e 100644 --- a/src/Ombi/ClientApp/src/app/interfaces/ISearchMovieResult.ts +++ b/src/Ombi/ClientApp/src/app/interfaces/ISearchMovieResult.ts @@ -40,6 +40,7 @@ export interface IMultiSearchResult { mediaType: string; title: string; poster: string; + overview: string; } export interface ILanguageRefine { diff --git a/src/Ombi/ClientApp/src/app/issues/components/details-group/details-group.component.html b/src/Ombi/ClientApp/src/app/issues/components/details-group/details-group.component.html new file mode 100644 index 000000000..c4906baac --- /dev/null +++ b/src/Ombi/ClientApp/src/app/issues/components/details-group/details-group.component.html @@ -0,0 +1,27 @@ + + + {{issue.subject}} + {{issue.userReported?.userName}} on {{issue.createdDate | date:short}} + + +

+ {{issue.description}} +

+
+ + +
here is ignored
+ + + + + + + +
+
+ diff --git a/src/Ombi/ClientApp/src/app/issues/components/details-group/details-group.component.scss b/src/Ombi/ClientApp/src/app/issues/components/details-group/details-group.component.scss new file mode 100644 index 000000000..c244fdd09 --- /dev/null +++ b/src/Ombi/ClientApp/src/app/issues/components/details-group/details-group.component.scss @@ -0,0 +1,9 @@ +@import "~styles/variables.scss"; + +::ng-deep .issue-card { + border: 3px solid $ombi-background-primary-accent; +} + +.top-spacing { + margin-top:2%; +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/issues/components/details-group/details-group.component.ts b/src/Ombi/ClientApp/src/app/issues/components/details-group/details-group.component.ts new file mode 100644 index 000000000..4f7ddc612 --- /dev/null +++ b/src/Ombi/ClientApp/src/app/issues/components/details-group/details-group.component.ts @@ -0,0 +1,55 @@ +import { Component, Input } from "@angular/core"; +import { MatDialog } from '@angular/material/dialog'; +import { TranslateService } from "@ngx-translate/core"; +import { IIssues, IIssueSettings, IssueStatus } from "../../../interfaces"; +import { IssuesService, NotificationService } from "../../../services"; +import { IssueChatComponent } from "../issue-chat/issue-chat.component"; + +@Component({ + selector: "issues-details-group", + templateUrl: "details-group.component.html", + styleUrls: ["details-group.component.scss"], +}) +export class DetailsGroupComponent { + + @Input() public issue: IIssues; + @Input() public isAdmin: boolean; + @Input() public settings: IIssueSettings; + + public deleted: boolean; + public IssueStatus = IssueStatus; + public get hasRequest(): boolean { + if (this.issue.requestId) { + return true; + } + return false; + } + + constructor( + private translateService: TranslateService, private issuesService: IssuesService, + private notificationService: NotificationService, private dialog: MatDialog) { } + + public async delete(issue: IIssues) { + await this.issuesService.deleteIssue(issue.id); + this.notificationService.success(this.translateService.instant("Issues.DeletedIssue")); + this.deleted = true; + } + + public openChat(issue: IIssues) { + this.dialog.open(IssueChatComponent, { width: "100vh", data: { issueId: issue.id }, panelClass: 'modal-panel' }) + } + + public resolve(issue: IIssues) { + this.issuesService.updateStatus({issueId: issue.id, status: IssueStatus.Resolved}).subscribe(() => { + this.notificationService.success(this.translateService.instant("Issues.MarkedAsResolved")); + issue.status = IssueStatus.Resolved; + }); + } + + public inProgress(issue: IIssues) { + this.issuesService.updateStatus({issueId: issue.id, status: IssueStatus.InProgress}).subscribe(() => { + this.notificationService.success(this.translateService.instant("Issues.MarkedAsInProgress")); + issue.status = IssueStatus.InProgress; + }); + } +} diff --git a/src/Ombi/ClientApp/src/app/issues/components/details/details.component.html b/src/Ombi/ClientApp/src/app/issues/components/details/details.component.html new file mode 100644 index 000000000..bc0e8a794 --- /dev/null +++ b/src/Ombi/ClientApp/src/app/issues/components/details/details.component.html @@ -0,0 +1,20 @@ +
+ +

Issues for {{details.title}}

+
+ {{'Issues.Requested' | translate}} + + + +
+ +
+
+
+ +
+
+
+
+
+
diff --git a/src/Ombi/ClientApp/src/app/issues/components/details/details.component.scss b/src/Ombi/ClientApp/src/app/issues/components/details/details.component.scss new file mode 100644 index 000000000..d6dcd67de --- /dev/null +++ b/src/Ombi/ClientApp/src/app/issues/components/details/details.component.scss @@ -0,0 +1,9 @@ +@import "~styles/variables.scss"; + +::ng-deep .mat-card { + background: $ombi-background-primary-accent; +} + +.top-spacing { + margin-top:2%; +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/issues/components/details/details.component.ts b/src/Ombi/ClientApp/src/app/issues/components/details/details.component.ts new file mode 100644 index 000000000..4003acd40 --- /dev/null +++ b/src/Ombi/ClientApp/src/app/issues/components/details/details.component.ts @@ -0,0 +1,93 @@ +import { Component, Inject, OnInit, ViewEncapsulation } from "@angular/core"; +import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { ActivatedRoute, ActivatedRouteSnapshot, Router } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { AuthService } from "../../../auth/auth.service"; +import { IIssues, IIssueSettings, IIssuesSummary, IssueStatus, RequestType } from "../../../interfaces"; +import { IssuesService, NotificationService, SettingsService } from "../../../services"; +import { IssuesV2Service } from "../../../services/issuesv2.service"; +import { IssueChatComponent } from "../issue-chat/issue-chat.component"; + + +export interface IssuesDetailsGroupData { + issues: IIssues[]; + title: string; +} + +@Component({ + selector: "issues-details", + templateUrl: "details.component.html", + styleUrls: ["details.component.scss"], + encapsulation: ViewEncapsulation.None +}) +export class IssuesDetailsComponent implements OnInit { + + public details: IIssuesSummary; + public isAdmin: boolean; + public IssueStatus = IssueStatus; + public settings: IIssueSettings; + public get hasRequest(): boolean { + return this.details.issues.some(x => x.requestId); + } + + private providerId: string; + + constructor(private authService: AuthService, private settingsService: SettingsService, + private issueServiceV2: IssuesV2Service, private route: ActivatedRoute, private router: Router, + private issuesService: IssuesService, private translateService: TranslateService, private notificationService: NotificationService, + private dialog: MatDialog) { + this.route.params.subscribe(async (params: any) => { + if (typeof params.providerId === 'string' || params.providerId instanceof String) { + this.providerId = params.providerId; + } + }); + } + + public ngOnInit() { + this.isAdmin = this.authService.hasRole("Admin") || this.authService.hasRole("PowerUser"); + this.settingsService.getIssueSettings().subscribe(x => this.settings = x); + this.issueServiceV2.getIssuesByProviderId(this.providerId).subscribe(x => this.details = x); + } + + public resolve(issue: IIssues) { + this.issuesService.updateStatus({issueId: issue.id, status: IssueStatus.Resolved}).subscribe(x => { + this.notificationService.success(this.translateService.instant("Issues.MarkedAsResolved")); + issue.status = IssueStatus.Resolved; + }); + } + + public inProgress(issue: IIssues) { + this.issuesService.updateStatus({issueId: issue.id, status: IssueStatus.InProgress}).subscribe(x => { + this.notificationService.success(this.translateService.instant("Issues.MarkedAsInProgress")); + issue.status = IssueStatus.InProgress; + }); + } + + public async delete(issue: IIssues) { + await this.issuesService.deleteIssue(issue.id); + this.notificationService.success(this.translateService.instant("Issues.DeletedIssue")); + this.details.issues = this.details.issues.filter((el) => { return el.id !== issue.id; }); + } + + public openChat(issue: IIssues) { + this.dialog.open(IssueChatComponent, { width: "100vh", data: { issueId: issue.id }, panelClass: 'modal-panel' }) + } + + public navToMedia() { + const firstIssue = this.details.issues[0]; + switch(firstIssue.requestType) { + case RequestType.movie: + this.router.navigate(['/details/movie/', firstIssue.providerId]); + return; + + case RequestType.album: + this.router.navigate(['/details/artist/', firstIssue.providerId]); + return; + + case RequestType.tvShow: + this.router.navigate(['/details/tv/', firstIssue.providerId]); + return; + } + } + +} diff --git a/src/Ombi/ClientApp/src/app/issues/components/index.ts b/src/Ombi/ClientApp/src/app/issues/components/index.ts index 93bb4907d..52e4ed03c 100644 --- a/src/Ombi/ClientApp/src/app/issues/components/index.ts +++ b/src/Ombi/ClientApp/src/app/issues/components/index.ts @@ -1,20 +1,19 @@ -import { AuthGuard } from "../../auth/auth.guard"; -import { IssuesListComponent } from "./issues-list/issues-list.component"; -import { Routes } from "@angular/router"; +import { IssuesV2Service } from "../../services/issuesv2.service"; +import { IdentityService, SearchService } from "../../services"; +import { IssuesDetailsComponent } from "./details/details.component"; +import { IssueChatComponent } from "./issue-chat/issue-chat.component"; +import { ChatBoxComponent } from "../../shared/chat-box/chat-box.component"; export const components: any[] = [ - IssuesListComponent, -]; - - -export const entryComponents: any[] = [ + IssuesDetailsComponent, + IssueChatComponent, + ChatBoxComponent, ]; export const providers: any[] = [ -]; - -export const routes: Routes = [ - { path: "", component: IssuesListComponent, canActivate: [AuthGuard] }, + IssuesV2Service, + IdentityService, + SearchService, ]; \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/issues/components/issue-chat/issue-chat.component.html b/src/Ombi/ClientApp/src/app/issues/components/issue-chat/issue-chat.component.html new file mode 100644 index 000000000..fe6c13ce7 --- /dev/null +++ b/src/Ombi/ClientApp/src/app/issues/components/issue-chat/issue-chat.component.html @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/issues/components/issue-chat/issue-chat.component.scss b/src/Ombi/ClientApp/src/app/issues/components/issue-chat/issue-chat.component.scss new file mode 100644 index 000000000..d6dcd67de --- /dev/null +++ b/src/Ombi/ClientApp/src/app/issues/components/issue-chat/issue-chat.component.scss @@ -0,0 +1,9 @@ +@import "~styles/variables.scss"; + +::ng-deep .mat-card { + background: $ombi-background-primary-accent; +} + +.top-spacing { + margin-top:2%; +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/issues/components/issue-chat/issue-chat.component.ts b/src/Ombi/ClientApp/src/app/issues/components/issue-chat/issue-chat.component.ts new file mode 100644 index 000000000..023fdbf12 --- /dev/null +++ b/src/Ombi/ClientApp/src/app/issues/components/issue-chat/issue-chat.component.ts @@ -0,0 +1,87 @@ +import { Component, Inject, OnInit } from "@angular/core"; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { AuthService } from "../../../auth/auth.service"; +import { ILocalUser } from "../../../auth/IUserLogin"; +import { IIssuesChat, IIssueSettings, IssueStatus } from "../../../interfaces"; +import { IssuesService, SettingsService } from "../../../services"; +import { ChatMessages, ChatType } from "../../../shared/chat-box/chat-box.component"; + + +export interface ChatData { + issueId: number; + title: string; + } + +@Component({ + selector: "issue-chat", + templateUrl: "issue-chat.component.html", + styleUrls: ["issue-chat.component.scss"], +}) +export class IssueChatComponent implements OnInit { + + public isAdmin: boolean; + public comments: IIssuesChat[] = []; + public IssueStatus = IssueStatus; + public settings: IIssueSettings; + public messages: ChatMessages[] = []; + + public loaded: boolean; + + private user: ILocalUser; + + + constructor(public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: ChatData, + private authService: AuthService, private settingsService: SettingsService, + private issueService: IssuesService) { } + + public ngOnInit() { + this.isAdmin = this.authService.isAdmin(); + this.user = this.authService.claims(); + this.settingsService.getIssueSettings().subscribe(x => this.settings = x); + this.issueService.getComments(this.data.issueId).subscribe(x => { + this.comments = x; + this.mapMessages(); + this.loaded = true; + }); + } + + + public deleteComment(commentId: number) { + + } + + public addComment(comment: string) { + this.issueService.addComment({ + comment: comment, + issueId: this.data.issueId + }).subscribe(comment => { + this.messages.push({ + chatType: ChatType.Sender, + date: comment.date, + id: -1, + message: comment.comment, + username: comment.user.userName + }); + }); + + } + + public close() { + this.dialogRef.close(); + } + + private mapMessages() { + this.comments.forEach((m: IIssuesChat) => { + this.messages.push({ + chatType: m.username === this.user.name ? ChatType.Sender : ChatType.Reciever, + date: m.date, + id: m.id, + message: m.comment, + username: m.username + }); + }); + } + + +} diff --git a/src/Ombi/ClientApp/src/app/issues/components/issues-list/issues-list.component.html b/src/Ombi/ClientApp/src/app/issues/components/issues-list/issues-list.component.html deleted file mode 100644 index 61f154193..000000000 --- a/src/Ombi/ClientApp/src/app/issues/components/issues-list/issues-list.component.html +++ /dev/null @@ -1,21 +0,0 @@ - \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/issues/components/issues-list/issues-list.component.ts b/src/Ombi/ClientApp/src/app/issues/components/issues-list/issues-list.component.ts deleted file mode 100644 index 82883a4f2..000000000 --- a/src/Ombi/ClientApp/src/app/issues/components/issues-list/issues-list.component.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Component, OnInit } from "@angular/core"; - -import { IssuesService } from "../../../services"; - -import { IIssueCount, IIssues, IPagenator, IssueStatus } from "../../../interfaces"; -import { COLUMNS } from "./issues-list.constants"; - -@Component({ - selector: "issues-list", - templateUrl: "issues-list.component.html", -}) -export class IssuesListComponent implements OnInit { - - public columnsToDisplay = COLUMNS - - public pendingIssues: IIssues[]; - public inProgressIssues: IIssues[]; - public resolvedIssues: IIssues[]; - - public count: IIssueCount; - - private takeAmount = 10; - private pendingSkip = 0; - private inProgressSkip = 0; - private resolvedSkip = 0; - - constructor(private issueService: IssuesService) { } - - public ngOnInit() { - this.getPending(); - this.getInProg(); - this.getResolved(); - this.issueService.getIssuesCount().subscribe(x => this.count = x); - } - - public changePagePending(event: IPagenator) { - this.pendingSkip = event.first; - this.getPending(); - } - - public changePageInProg(event: IPagenator) { - this.inProgressSkip = event.first; - this.getInProg(); - } - - public changePageResolved(event: IPagenator) { - this.resolvedSkip = event.first; - this.getResolved(); - } - - private getPending() { - this.issueService.getIssuesPage(this.takeAmount, this.pendingSkip, IssueStatus.Pending).subscribe(x => { - this.pendingIssues = x; - }); - } - - private getInProg() { - this.issueService.getIssuesPage(this.takeAmount, this.inProgressSkip, IssueStatus.InProgress).subscribe(x => { - this.inProgressIssues = x; - }); - } - - private getResolved() { - this.issueService.getIssuesPage(this.takeAmount, this.resolvedSkip, IssueStatus.Resolved).subscribe(x => { - this.resolvedIssues = x; - }); - } -} diff --git a/src/Ombi/ClientApp/src/app/issues/components/issues-list/issues-list.constants.ts b/src/Ombi/ClientApp/src/app/issues/components/issues-list/issues-list.constants.ts deleted file mode 100644 index f4a00e24b..000000000 --- a/src/Ombi/ClientApp/src/app/issues/components/issues-list/issues-list.constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const COLUMNS = [ - "title" -] \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/issues/issueDetails.component.html b/src/Ombi/ClientApp/src/app/issues/issueDetails.component.html index c2de76c2b..b5fc59304 100644 --- a/src/Ombi/ClientApp/src/app/issues/issueDetails.component.html +++ b/src/Ombi/ClientApp/src/app/issues/issueDetails.component.html @@ -84,7 +84,7 @@
- +
diff --git a/src/Ombi/ClientApp/src/app/issues/issues.component.html b/src/Ombi/ClientApp/src/app/issues/issues.component.html index ff8440569..72734ed85 100644 --- a/src/Ombi/ClientApp/src/app/issues/issues.component.html +++ b/src/Ombi/ClientApp/src/app/issues/issues.component.html @@ -1,25 +1,28 @@
- - - -
- -
-
-
- - -
- -
-
-
- - -
- -
-
-
-
+
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+
+
\ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/issues/issues.component.ts b/src/Ombi/ClientApp/src/app/issues/issues.component.ts index b8482f1ff..5dc02845e 100644 --- a/src/Ombi/ClientApp/src/app/issues/issues.component.ts +++ b/src/Ombi/ClientApp/src/app/issues/issues.component.ts @@ -2,9 +2,10 @@ import { Component, OnInit } from "@angular/core"; import { IssuesService } from "../services"; -import { IIssueCount, IIssues, IPagenator, IssueStatus } from "../interfaces"; +import { IIssueCount, IIssues, IIssuesSummary, IPagenator, IssueStatus } from "../interfaces"; import { PageEvent } from '@angular/material/paginator'; +import { IssuesV2Service } from "../services/issuesv2.service"; @Component({ templateUrl: "issues.component.html", @@ -12,9 +13,9 @@ import { PageEvent } from '@angular/material/paginator'; }) export class IssuesComponent implements OnInit { - public pendingIssues: IIssues[]; - public inProgressIssues: IIssues[]; - public resolvedIssues: IIssues[]; + public pendingIssues: IIssuesSummary[]; + public inProgressIssues: IIssuesSummary[]; + public resolvedIssues: IIssuesSummary[]; public count: IIssueCount; @@ -23,7 +24,7 @@ export class IssuesComponent implements OnInit { private inProgressSkip = 0; private resolvedSkip = 0; - constructor(private issueService: IssuesService) { } + constructor(private issuev2Service: IssuesV2Service, private issueService: IssuesService) { } public ngOnInit() { this.getPending(); @@ -48,19 +49,19 @@ export class IssuesComponent implements OnInit { } private getPending() { - this.issueService.getIssuesPage(this.takeAmount, this.pendingSkip, IssueStatus.Pending).subscribe(x => { + this.issuev2Service.getIssues(this.pendingSkip, this.takeAmount, IssueStatus.Pending).subscribe(x => { this.pendingIssues = x; }); } private getInProg() { - this.issueService.getIssuesPage(this.takeAmount, this.inProgressSkip, IssueStatus.InProgress).subscribe(x => { + this.issuev2Service.getIssues(this.inProgressSkip, this.takeAmount, IssueStatus.InProgress).subscribe(x => { this.inProgressIssues = x; }); } private getResolved() { - this.issueService.getIssuesPage(this.takeAmount, this.resolvedSkip, IssueStatus.Resolved).subscribe(x => { + this.issuev2Service.getIssues(this.resolvedSkip, this.takeAmount, IssueStatus.Resolved).subscribe(x => { this.resolvedIssues = x; }); } diff --git a/src/Ombi/ClientApp/src/app/issues/issues.module.ts b/src/Ombi/ClientApp/src/app/issues/issues.module.ts index 2607d336a..4bf232f25 100644 --- a/src/Ombi/ClientApp/src/app/issues/issues.module.ts +++ b/src/Ombi/ClientApp/src/app/issues/issues.module.ts @@ -1,17 +1,17 @@ import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; +// import { NbChatModule, NbThemeModule } from '@nebular/theme'; import { OrderModule } from "ngx-order-pipe"; -import { IdentityService, SearchService } from "../services"; - import { AuthGuard } from "../auth/auth.guard"; -import { SharedModule as OmbiShared } from "../shared/shared.module"; +import { SharedModule } from "../shared/shared.module"; import { IssueDetailsComponent } from "./issueDetails.component"; import { IssuesComponent } from "./issues.component"; import { IssuesTableComponent } from "./issuestable.component"; +import { IssuesDetailsComponent } from "./components/details/details.component"; import { PipeModule } from "../pipes/pipe.module"; @@ -19,7 +19,7 @@ import * as fromComponents from "./components"; const routes: Routes = [ { path: "", component: IssuesComponent, canActivate: [AuthGuard] }, - { path: ":id", component: IssueDetailsComponent, canActivate: [AuthGuard] }, + { path: ":providerId", component: IssuesDetailsComponent, canActivate: [AuthGuard] }, ]; @NgModule({ @@ -27,7 +27,8 @@ const routes: Routes = [ RouterModule.forChild(routes), OrderModule, PipeModule, - OmbiShared, + SharedModule, + // NbChatModule, ], declarations: [ IssuesComponent, @@ -39,8 +40,7 @@ const routes: Routes = [ RouterModule, ], providers: [ - IdentityService, - SearchService, + ...fromComponents.providers ], }) diff --git a/src/Ombi/ClientApp/src/app/issues/issuestable.component.html b/src/Ombi/ClientApp/src/app/issues/issuestable.component.html index e266a718a..8e22d3e51 100644 --- a/src/Ombi/ClientApp/src/app/issues/issuestable.component.html +++ b/src/Ombi/ClientApp/src/app/issues/issuestable.component.html @@ -6,32 +6,15 @@ {{element.title}} - - {{ 'Issues.Category' | translate}} - {{element.issueCategory.value}} - - - - {{ 'Issues.Subject' | translate}} - {{element.subject}} - - - - {{ 'Issues.Status' | translate}} - {{IssueStatus[element.status] | humanize}} - - - - {{ 'Issues.ReportedBy' | translate}} - {{element.userReported.userAlias}} + + {{ 'Issues.Count' | translate}} + {{element.count}} - - - + diff --git a/src/Ombi/ClientApp/src/app/issues/issuestable.component.ts b/src/Ombi/ClientApp/src/app/issues/issuestable.component.ts index ff584a35e..0fd81a534 100644 --- a/src/Ombi/ClientApp/src/app/issues/issuestable.component.ts +++ b/src/Ombi/ClientApp/src/app/issues/issuestable.component.ts @@ -1,6 +1,7 @@ import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { MatDialog } from "@angular/material/dialog"; -import { IIssues, IPagenator, IssueStatus } from "../interfaces"; +import { IIssuesSummary, IPagenator, IssueStatus } from "../interfaces"; @Component({ selector: "issues-table", @@ -8,12 +9,14 @@ import { IIssues, IPagenator, IssueStatus } from "../interfaces"; }) export class IssuesTableComponent { - @Input() public issues: IIssues[]; + constructor(public dialog: MatDialog) { } + + @Input() public issues: IIssuesSummary[]; @Input() public totalRecords: number; @Output() public changePage = new EventEmitter(); - public displayedColumns = ["title", "category", "subject", "status", "reportedBy", "actions"] + public displayedColumns = ["title", "count", "actions"] public IssueStatus = IssueStatus; public resultsLength: number; public gridCount: string = "15"; @@ -48,5 +51,4 @@ export class IssuesTableComponent { public paginate(event: IPagenator) { this.changePage.emit(event); } - } diff --git a/src/Ombi/ClientApp/src/app/landingpage/landingpage.component.html b/src/Ombi/ClientApp/src/app/landingpage/landingpage.component.html index 7f5d13c3c..90e1cb599 100644 --- a/src/Ombi/ClientApp/src/app/landingpage/landingpage.component.html +++ b/src/Ombi/ClientApp/src/app/landingpage/landingpage.component.html @@ -42,7 +42,7 @@
- +
diff --git a/src/Ombi/ClientApp/src/app/login/login.component.html b/src/Ombi/ClientApp/src/app/login/login.component.html index 0769a185f..62dcc7d30 100644 --- a/src/Ombi/ClientApp/src/app/login/login.component.html +++ b/src/Ombi/ClientApp/src/app/login/login.component.html @@ -7,7 +7,7 @@