Hooked up the ability to get average rating on Comic series.
This commit is contained in:
parent
579cd847af
commit
585df0b5d3
15 changed files with 47 additions and 71 deletions
|
|
@ -65,7 +65,7 @@ public class ExternalMetadataService : IExternalMetadataService
|
||||||
private readonly ICoverDbService _coverDbService;
|
private readonly ICoverDbService _coverDbService;
|
||||||
private readonly TimeSpan _externalSeriesMetadataCache = TimeSpan.FromDays(30);
|
private readonly TimeSpan _externalSeriesMetadataCache = TimeSpan.FromDays(30);
|
||||||
public static readonly HashSet<LibraryType> NonEligibleLibraryTypes =
|
public static readonly HashSet<LibraryType> NonEligibleLibraryTypes =
|
||||||
[LibraryType.Comic, LibraryType.Book, LibraryType.Image, LibraryType.ComicVine];
|
[LibraryType.Comic, LibraryType.Book, LibraryType.Image];
|
||||||
private readonly SeriesDetailPlusDto _defaultReturn = new()
|
private readonly SeriesDetailPlusDto _defaultReturn = new()
|
||||||
{
|
{
|
||||||
Series = null,
|
Series = null,
|
||||||
|
|
@ -487,6 +487,7 @@ public class ExternalMetadataService : IExternalMetadataService
|
||||||
|
|
||||||
if (result.MalId.HasValue) externalSeriesMetadata.MalId = result.MalId.Value;
|
if (result.MalId.HasValue) externalSeriesMetadata.MalId = result.MalId.Value;
|
||||||
if (result.AniListId.HasValue) externalSeriesMetadata.AniListId = result.AniListId.Value;
|
if (result.AniListId.HasValue) externalSeriesMetadata.AniListId = result.AniListId.Value;
|
||||||
|
//TODO: if (result.CbrId.HasValue) externalSeriesMetadata.CbrId = result.CbrId.Value;
|
||||||
|
|
||||||
// If there is metadata and the user has metadata download turned on
|
// If there is metadata and the user has metadata download turned on
|
||||||
var madeMetadataModification = false;
|
var madeMetadataModification = false;
|
||||||
|
|
@ -609,7 +610,7 @@ public class ExternalMetadataService : IExternalMetadataService
|
||||||
madeModification = await UpdateRelationships(series, settings, externalMetadata.Relations, defaultAdmin) || madeModification;
|
madeModification = await UpdateRelationships(series, settings, externalMetadata.Relations, defaultAdmin) || madeModification;
|
||||||
madeModification = await UpdateCoverImage(series, settings, externalMetadata) || madeModification;
|
madeModification = await UpdateCoverImage(series, settings, externalMetadata) || madeModification;
|
||||||
|
|
||||||
// TODO: Hook in individual issue metadata
|
madeModification = await UpdateChapters(series, settings, externalMetadata) || madeModification;
|
||||||
|
|
||||||
return madeModification;
|
return madeModification;
|
||||||
}
|
}
|
||||||
|
|
@ -1031,6 +1032,16 @@ public class ExternalMetadataService : IExternalMetadataService
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private async Task<bool> UpdateChapters(Series series, MetadataSettingsDto settings,
|
||||||
|
ExternalSeriesDetailDto externalMetadata)
|
||||||
|
{
|
||||||
|
if (externalMetadata.PlusMediaFormat != PlusMediaFormat.Comic) return false;
|
||||||
|
|
||||||
|
var chapters = await _unitOfWork.ChapterRepository.GetChaptersAsync(1);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private async Task<bool> UpdateCoverImage(Series series, MetadataSettingsDto settings, ExternalSeriesDetailDto externalMetadata)
|
private async Task<bool> UpdateCoverImage(Series series, MetadataSettingsDto settings, ExternalSeriesDetailDto externalMetadata)
|
||||||
{
|
{
|
||||||
if (!settings.EnableCoverImage) return false;
|
if (!settings.EnableCoverImage) return false;
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,9 @@ public enum ScrobbleProvider
|
||||||
Kavita = 0,
|
Kavita = 0,
|
||||||
AniList = 1,
|
AniList = 1,
|
||||||
Mal = 2,
|
Mal = 2,
|
||||||
Cbr = 3
|
[Obsolete]
|
||||||
|
GoogleBooks = 3,
|
||||||
|
Cbr = 4
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IScrobblingService
|
public interface IScrobblingService
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,8 @@ export class ProviderImagePipe implements PipeTransform {
|
||||||
return `assets/images/ExternalServices/GoogleBooks${large ? '-lg' : ''}.png`;
|
return `assets/images/ExternalServices/GoogleBooks${large ? '-lg' : ''}.png`;
|
||||||
case ScrobbleProvider.Kavita:
|
case ScrobbleProvider.Kavita:
|
||||||
return `assets/images/logo-${large ? '64' : '32'}.png`;
|
return `assets/images/logo-${large ? '64' : '32'}.png`;
|
||||||
|
case ScrobbleProvider.Cbr:
|
||||||
|
return `assets/images/ExternalServices/ComicBookRoundup.png`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
import { Pipe, PipeTransform } from '@angular/core';
|
|
||||||
import {ScrobbleProvider} from "../_services/scrobbling.service";
|
|
||||||
|
|
||||||
@Pipe({
|
|
||||||
name: 'providerName',
|
|
||||||
standalone: true
|
|
||||||
})
|
|
||||||
export class ProviderNamePipe implements PipeTransform {
|
|
||||||
|
|
||||||
transform(value: ScrobbleProvider): string {
|
|
||||||
switch (value) {
|
|
||||||
case ScrobbleProvider.AniList:
|
|
||||||
return 'AniList';
|
|
||||||
case ScrobbleProvider.Mal:
|
|
||||||
return 'MAL';
|
|
||||||
case ScrobbleProvider.Kavita:
|
|
||||||
return 'Kavita';
|
|
||||||
case ScrobbleProvider.GoogleBooks:
|
|
||||||
return 'Google Books';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -12,6 +12,7 @@ export class ScrobbleProviderNamePipe implements PipeTransform {
|
||||||
case ScrobbleProvider.AniList: return 'AniList';
|
case ScrobbleProvider.AniList: return 'AniList';
|
||||||
case ScrobbleProvider.Mal: return 'MAL';
|
case ScrobbleProvider.Mal: return 'MAL';
|
||||||
case ScrobbleProvider.Kavita: return 'Kavita';
|
case ScrobbleProvider.Kavita: return 'Kavita';
|
||||||
|
case ScrobbleProvider.Cbr: return 'Comicbook Roundup';
|
||||||
case ScrobbleProvider.GoogleBooks: return 'Google Books';
|
case ScrobbleProvider.GoogleBooks: return 'Google Books';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,10 @@ import {UtilityService} from "../shared/_services/utility.service";
|
||||||
|
|
||||||
export enum ScrobbleProvider {
|
export enum ScrobbleProvider {
|
||||||
Kavita = 0,
|
Kavita = 0,
|
||||||
AniList= 1,
|
AniList = 1,
|
||||||
Mal = 2,
|
Mal = 2,
|
||||||
GoogleBooks = 3
|
GoogleBooks = 3,
|
||||||
|
Cbr = 4
|
||||||
}
|
}
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,12 @@ import {
|
||||||
Component,
|
Component,
|
||||||
DestroyRef,
|
DestroyRef,
|
||||||
EventEmitter,
|
EventEmitter,
|
||||||
HostListener,
|
|
||||||
inject,
|
inject,
|
||||||
OnInit
|
OnInit
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import {Title} from '@angular/platform-browser';
|
import {Title} from '@angular/platform-browser';
|
||||||
import {Router} from '@angular/router';
|
import {Router} from '@angular/router';
|
||||||
import {NgbModal} from '@ng-bootstrap/ng-bootstrap';
|
import {NgbModal} from '@ng-bootstrap/ng-bootstrap';
|
||||||
import {map, of} from 'rxjs';
|
|
||||||
import {Observable} from 'rxjs/internal/Observable';
|
|
||||||
import {EditCollectionTagsComponent} from 'src/app/cards/_modals/edit-collection-tags/edit-collection-tags.component';
|
import {EditCollectionTagsComponent} from 'src/app/cards/_modals/edit-collection-tags/edit-collection-tags.component';
|
||||||
import {UserCollection} from 'src/app/_models/collection-tag';
|
import {UserCollection} from 'src/app/_models/collection-tag';
|
||||||
import {JumpKey} from 'src/app/_models/jumpbar/jump-key';
|
import {JumpKey} from 'src/app/_models/jumpbar/jump-key';
|
||||||
|
|
@ -32,15 +29,11 @@ import {
|
||||||
import {translate, TranslocoDirective, TranslocoService} from "@jsverse/transloco";
|
import {translate, TranslocoDirective, TranslocoService} from "@jsverse/transloco";
|
||||||
import {ToastrService} from "ngx-toastr";
|
import {ToastrService} from "ngx-toastr";
|
||||||
import {ScrobbleProvider} from "../../../_services/scrobbling.service";
|
import {ScrobbleProvider} from "../../../_services/scrobbling.service";
|
||||||
import {ProviderImagePipe} from "../../../_pipes/provider-image.pipe";
|
|
||||||
import {ProviderNamePipe} from "../../../_pipes/provider-name.pipe";
|
|
||||||
import {CollectionOwnerComponent} from "../collection-owner/collection-owner.component";
|
import {CollectionOwnerComponent} from "../collection-owner/collection-owner.component";
|
||||||
import {User} from "../../../_models/user";
|
import {User} from "../../../_models/user";
|
||||||
import {BulkOperationsComponent} from "../../../cards/bulk-operations/bulk-operations.component";
|
import {BulkOperationsComponent} from "../../../cards/bulk-operations/bulk-operations.component";
|
||||||
import {BulkSelectionService} from "../../../cards/bulk-selection.service";
|
import {BulkSelectionService} from "../../../cards/bulk-selection.service";
|
||||||
import {SeriesCardComponent} from "../../../cards/series-card/series-card.component";
|
|
||||||
import {ActionService} from "../../../_services/action.service";
|
import {ActionService} from "../../../_services/action.service";
|
||||||
import {KEY_CODES} from "../../../shared/_services/utility.service";
|
|
||||||
import {WikiLink} from "../../../_models/wiki";
|
import {WikiLink} from "../../../_models/wiki";
|
||||||
import {DefaultModalOptions} from "../../../_models/default-modal-options";
|
import {DefaultModalOptions} from "../../../_models/default-modal-options";
|
||||||
|
|
||||||
|
|
@ -51,7 +44,8 @@ import {DefaultModalOptions} from "../../../_models/default-modal-options";
|
||||||
styleUrls: ['./all-collections.component.scss'],
|
styleUrls: ['./all-collections.component.scss'],
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [SideNavCompanionBarComponent, CardDetailLayoutComponent, CardItemComponent, AsyncPipe, DecimalPipe, TranslocoDirective, ProviderImagePipe, ProviderNamePipe, CollectionOwnerComponent, BulkOperationsComponent, SeriesCardComponent]
|
imports: [SideNavCompanionBarComponent, CardDetailLayoutComponent, CardItemComponent, AsyncPipe, DecimalPipe,
|
||||||
|
TranslocoDirective, CollectionOwnerComponent, BulkOperationsComponent]
|
||||||
})
|
})
|
||||||
export class AllCollectionsComponent implements OnInit {
|
export class AllCollectionsComponent implements OnInit {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
<div class="under-image">
|
<div class="under-image">
|
||||||
<app-image [imageUrl]="collectionTag.source | providerImage"
|
<app-image [imageUrl]="collectionTag.source | providerImage"
|
||||||
width="16px" height="16px"
|
width="16px" height="16px"
|
||||||
[ngbTooltip]="collectionTag.source | providerName" tabindex="0"></app-image>
|
[ngbTooltip]="collectionTag.source | scrobbleProviderName" tabindex="0"></app-image>
|
||||||
<span class="ms-2 me-2">{{t('sync-progress', {title: series.length + ' / ' + collectionTag.totalSourceCount})}}</span>
|
<span class="ms-2 me-2">{{t('sync-progress', {title: series.length + ' / ' + collectionTag.totalSourceCount})}}</span>
|
||||||
<i class="fa-solid fa-question-circle" aria-hidden="true" [ngbTooltip]="t('last-sync', {date: collectionTag.lastSyncUtc | date: 'short' | defaultDate })"></i>
|
<i class="fa-solid fa-question-circle" aria-hidden="true" [ngbTooltip]="t('last-sync', {date: collectionTag.lastSyncUtc | date: 'short' | defaultDate })"></i>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import {AsyncPipe, DatePipe, DOCUMENT, NgStyle} from '@angular/common';
|
import {AsyncPipe, DatePipe, DOCUMENT} from '@angular/common';
|
||||||
import {
|
import {
|
||||||
AfterContentChecked,
|
AfterContentChecked,
|
||||||
ChangeDetectionStrategy,
|
ChangeDetectionStrategy,
|
||||||
|
|
@ -7,7 +7,6 @@ import {
|
||||||
DestroyRef,
|
DestroyRef,
|
||||||
ElementRef,
|
ElementRef,
|
||||||
EventEmitter,
|
EventEmitter,
|
||||||
HostListener,
|
|
||||||
inject,
|
inject,
|
||||||
Inject,
|
Inject,
|
||||||
OnInit,
|
OnInit,
|
||||||
|
|
@ -22,7 +21,7 @@ import {BulkSelectionService} from 'src/app/cards/bulk-selection.service';
|
||||||
import {EditCollectionTagsComponent} from 'src/app/cards/_modals/edit-collection-tags/edit-collection-tags.component';
|
import {EditCollectionTagsComponent} from 'src/app/cards/_modals/edit-collection-tags/edit-collection-tags.component';
|
||||||
import {FilterSettings} from 'src/app/metadata-filter/filter-settings';
|
import {FilterSettings} from 'src/app/metadata-filter/filter-settings';
|
||||||
import {FilterUtilitiesService} from 'src/app/shared/_services/filter-utilities.service';
|
import {FilterUtilitiesService} from 'src/app/shared/_services/filter-utilities.service';
|
||||||
import {Breakpoint, KEY_CODES, UtilityService} from 'src/app/shared/_services/utility.service';
|
import {Breakpoint, UtilityService} from 'src/app/shared/_services/utility.service';
|
||||||
import {UserCollection} from 'src/app/_models/collection-tag';
|
import {UserCollection} from 'src/app/_models/collection-tag';
|
||||||
import {SeriesAddedToCollectionEvent} from 'src/app/_models/events/series-added-to-collection-event';
|
import {SeriesAddedToCollectionEvent} from 'src/app/_models/events/series-added-to-collection-event';
|
||||||
import {JumpKey} from 'src/app/_models/jumpbar/jump-key';
|
import {JumpKey} from 'src/app/_models/jumpbar/jump-key';
|
||||||
|
|
@ -55,16 +54,13 @@ import {SeriesFilterV2} from "../../../_models/metadata/v2/series-filter-v2";
|
||||||
import {AccountService} from "../../../_services/account.service";
|
import {AccountService} from "../../../_services/account.service";
|
||||||
import {User} from "../../../_models/user";
|
import {User} from "../../../_models/user";
|
||||||
import {ScrobbleProvider} from "../../../_services/scrobbling.service";
|
import {ScrobbleProvider} from "../../../_services/scrobbling.service";
|
||||||
import {SafeHtmlPipe} from "../../../_pipes/safe-html.pipe";
|
|
||||||
import {TranslocoDatePipe} from "@jsverse/transloco-locale";
|
|
||||||
import {DefaultDatePipe} from "../../../_pipes/default-date.pipe";
|
import {DefaultDatePipe} from "../../../_pipes/default-date.pipe";
|
||||||
import {ProviderImagePipe} from "../../../_pipes/provider-image.pipe";
|
import {ProviderImagePipe} from "../../../_pipes/provider-image.pipe";
|
||||||
import {ProviderNamePipe} from "../../../_pipes/provider-name.pipe";
|
|
||||||
import {PromotedIconComponent} from "../../../shared/_components/promoted-icon/promoted-icon.component";
|
|
||||||
import {
|
import {
|
||||||
SmartCollectionDrawerComponent
|
SmartCollectionDrawerComponent
|
||||||
} from "../../../_single-module/smart-collection-drawer/smart-collection-drawer.component";
|
} from "../../../_single-module/smart-collection-drawer/smart-collection-drawer.component";
|
||||||
import {DefaultModalOptions} from "../../../_models/default-modal-options";
|
import {DefaultModalOptions} from "../../../_models/default-modal-options";
|
||||||
|
import {ScrobbleProviderNamePipe} from "../../../_pipes/scrobble-provider-name.pipe";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-collection-detail',
|
selector: 'app-collection-detail',
|
||||||
|
|
@ -72,10 +68,9 @@ import {DefaultModalOptions} from "../../../_models/default-modal-options";
|
||||||
styleUrls: ['./collection-detail.component.scss'],
|
styleUrls: ['./collection-detail.component.scss'],
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [SideNavCompanionBarComponent, CardActionablesComponent, NgStyle, ImageComponent, ReadMoreComponent,
|
imports: [SideNavCompanionBarComponent, CardActionablesComponent, ImageComponent, ReadMoreComponent,
|
||||||
BulkOperationsComponent, CardDetailLayoutComponent, SeriesCardComponent, TranslocoDirective, NgbTooltip,
|
BulkOperationsComponent, CardDetailLayoutComponent, SeriesCardComponent, TranslocoDirective, NgbTooltip,
|
||||||
SafeHtmlPipe, TranslocoDatePipe, DatePipe, DefaultDatePipe, ProviderImagePipe, ProviderNamePipe, AsyncPipe,
|
DatePipe, DefaultDatePipe, ProviderImagePipe, AsyncPipe, ScrobbleProviderNamePipe]
|
||||||
PromotedIconComponent]
|
|
||||||
})
|
})
|
||||||
export class CollectionDetailComponent implements OnInit, AfterContentChecked {
|
export class CollectionDetailComponent implements OnInit, AfterContentChecked {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
{{t('collection-via-label')}}
|
{{t('collection-via-label')}}
|
||||||
<app-image [imageUrl]="collection.source | providerImage"
|
<app-image [imageUrl]="collection.source | providerImage"
|
||||||
width="16px" height="16px"
|
width="16px" height="16px"
|
||||||
[ngbTooltip]="collection.source | providerName"
|
[ngbTooltip]="collection.source | scrobbleProviderName"
|
||||||
[attr.aria-label]="collection.source | providerName"></app-image>
|
[attr.aria-label]="collection.source | scrobbleProviderName"></app-image>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,24 @@
|
||||||
import {ChangeDetectionStrategy, Component, inject, Input} from '@angular/core';
|
import {ChangeDetectionStrategy, Component, inject, Input} from '@angular/core';
|
||||||
import {ScrobbleProvider} from "../../../_services/scrobbling.service";
|
import {ScrobbleProvider} from "../../../_services/scrobbling.service";
|
||||||
import {ProviderImagePipe} from "../../../_pipes/provider-image.pipe";
|
import {ProviderImagePipe} from "../../../_pipes/provider-image.pipe";
|
||||||
import {ProviderNamePipe} from "../../../_pipes/provider-name.pipe";
|
|
||||||
import {UserCollection} from "../../../_models/collection-tag";
|
import {UserCollection} from "../../../_models/collection-tag";
|
||||||
import {TranslocoDirective} from "@jsverse/transloco";
|
import {TranslocoDirective} from "@jsverse/transloco";
|
||||||
import {AsyncPipe, JsonPipe} from "@angular/common";
|
import {AsyncPipe} from "@angular/common";
|
||||||
import {AccountService} from "../../../_services/account.service";
|
import {AccountService} from "../../../_services/account.service";
|
||||||
import {ImageComponent} from "../../../shared/image/image.component";
|
import {ImageComponent} from "../../../shared/image/image.component";
|
||||||
import {NgbTooltip} from "@ng-bootstrap/ng-bootstrap";
|
import {NgbTooltip} from "@ng-bootstrap/ng-bootstrap";
|
||||||
|
import {ScrobbleProviderNamePipe} from "../../../_pipes/scrobble-provider-name.pipe";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-collection-owner',
|
selector: 'app-collection-owner',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [
|
imports: [
|
||||||
ProviderImagePipe,
|
ProviderImagePipe,
|
||||||
ProviderNamePipe,
|
|
||||||
TranslocoDirective,
|
TranslocoDirective,
|
||||||
AsyncPipe,
|
AsyncPipe,
|
||||||
JsonPipe,
|
|
||||||
ImageComponent,
|
ImageComponent,
|
||||||
NgbTooltip
|
NgbTooltip,
|
||||||
|
ScrobbleProviderNamePipe
|
||||||
],
|
],
|
||||||
templateUrl: './collection-owner.component.html',
|
templateUrl: './collection-owner.component.html',
|
||||||
styleUrl: './collection-owner.component.scss',
|
styleUrl: './collection-owner.component.scss',
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import {AsyncPipe, DOCUMENT, NgOptimizedImage, NgTemplateOutlet} from '@angular/common';
|
import {AsyncPipe, DOCUMENT} from '@angular/common';
|
||||||
import {
|
import {
|
||||||
ChangeDetectionStrategy,
|
ChangeDetectionStrategy,
|
||||||
ChangeDetectorRef,
|
ChangeDetectorRef,
|
||||||
|
|
@ -17,7 +17,7 @@ import {Chapter} from 'src/app/_models/chapter';
|
||||||
import {UserCollection} from 'src/app/_models/collection-tag';
|
import {UserCollection} from 'src/app/_models/collection-tag';
|
||||||
import {Library} from 'src/app/_models/library/library';
|
import {Library} from 'src/app/_models/library/library';
|
||||||
import {MangaFile} from 'src/app/_models/manga-file';
|
import {MangaFile} from 'src/app/_models/manga-file';
|
||||||
import {Person, PersonRole} from 'src/app/_models/metadata/person';
|
import {Person} from 'src/app/_models/metadata/person';
|
||||||
import {ReadingList} from 'src/app/_models/reading-list';
|
import {ReadingList} from 'src/app/_models/reading-list';
|
||||||
import {SearchResult} from 'src/app/_models/search/search-result';
|
import {SearchResult} from 'src/app/_models/search/search-result';
|
||||||
import {SearchResultGroup} from 'src/app/_models/search/search-result-group';
|
import {SearchResultGroup} from 'src/app/_models/search/search-result-group';
|
||||||
|
|
@ -28,40 +28,34 @@ import {ScrollService} from 'src/app/_services/scroll.service';
|
||||||
import {SearchService} from 'src/app/_services/search.service';
|
import {SearchService} from 'src/app/_services/search.service';
|
||||||
import {takeUntilDestroyed} from "@angular/core/rxjs-interop";
|
import {takeUntilDestroyed} from "@angular/core/rxjs-interop";
|
||||||
import {SentenceCasePipe} from '../../../_pipes/sentence-case.pipe';
|
import {SentenceCasePipe} from '../../../_pipes/sentence-case.pipe';
|
||||||
import {PersonRolePipe} from '../../../_pipes/person-role.pipe';
|
|
||||||
import {NgbDropdown, NgbDropdownItem, NgbDropdownMenu, NgbDropdownToggle, NgbModal} from '@ng-bootstrap/ng-bootstrap';
|
import {NgbDropdown, NgbDropdownItem, NgbDropdownMenu, NgbDropdownToggle, NgbModal} from '@ng-bootstrap/ng-bootstrap';
|
||||||
import {EventsWidgetComponent} from '../events-widget/events-widget.component';
|
import {EventsWidgetComponent} from '../events-widget/events-widget.component';
|
||||||
import {SeriesFormatComponent} from '../../../shared/series-format/series-format.component';
|
import {SeriesFormatComponent} from '../../../shared/series-format/series-format.component';
|
||||||
import {ImageComponent} from '../../../shared/image/image.component';
|
import {ImageComponent} from '../../../shared/image/image.component';
|
||||||
import {GroupedTypeaheadComponent, SearchEvent} from '../grouped-typeahead/grouped-typeahead.component';
|
import {GroupedTypeaheadComponent, SearchEvent} from '../grouped-typeahead/grouped-typeahead.component';
|
||||||
import {translate, TranslocoDirective} from "@jsverse/transloco";
|
import {TranslocoDirective} from "@jsverse/transloco";
|
||||||
import {FilterUtilitiesService} from "../../../shared/_services/filter-utilities.service";
|
import {FilterUtilitiesService} from "../../../shared/_services/filter-utilities.service";
|
||||||
import {FilterStatement} from "../../../_models/metadata/v2/filter-statement";
|
import {FilterStatement} from "../../../_models/metadata/v2/filter-statement";
|
||||||
import {FilterField} from "../../../_models/metadata/v2/filter-field";
|
import {FilterField} from "../../../_models/metadata/v2/filter-field";
|
||||||
import {FilterComparison} from "../../../_models/metadata/v2/filter-comparison";
|
import {FilterComparison} from "../../../_models/metadata/v2/filter-comparison";
|
||||||
import {BookmarkSearchResult} from "../../../_models/search/bookmark-search-result";
|
import {BookmarkSearchResult} from "../../../_models/search/bookmark-search-result";
|
||||||
import {ScrobbleProvider} from "../../../_services/scrobbling.service";
|
import {ScrobbleProvider} from "../../../_services/scrobbling.service";
|
||||||
import {ProviderImagePipe} from "../../../_pipes/provider-image.pipe";
|
|
||||||
import {ProviderNamePipe} from "../../../_pipes/provider-name.pipe";
|
|
||||||
import {CollectionOwnerComponent} from "../../../collections/_components/collection-owner/collection-owner.component";
|
import {CollectionOwnerComponent} from "../../../collections/_components/collection-owner/collection-owner.component";
|
||||||
import {PromotedIconComponent} from "../../../shared/_components/promoted-icon/promoted-icon.component";
|
import {PromotedIconComponent} from "../../../shared/_components/promoted-icon/promoted-icon.component";
|
||||||
import {SettingsTabId} from "../../../sidenav/preference-nav/preference-nav.component";
|
import {SettingsTabId} from "../../../sidenav/preference-nav/preference-nav.component";
|
||||||
import {Breakpoint, UtilityService} from "../../../shared/_services/utility.service";
|
import {Breakpoint, UtilityService} from "../../../shared/_services/utility.service";
|
||||||
import {WikiLink} from "../../../_models/wiki";
|
import {WikiLink} from "../../../_models/wiki";
|
||||||
import {
|
|
||||||
GenericListModalComponent
|
|
||||||
} from "../../../statistics/_components/_modals/generic-list-modal/generic-list-modal.component";
|
|
||||||
import {NavLinkModalComponent} from "../nav-link-modal/nav-link-modal.component";
|
import {NavLinkModalComponent} from "../nav-link-modal/nav-link-modal.component";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-nav-header',
|
selector: 'app-nav-header',
|
||||||
templateUrl: './nav-header.component.html',
|
templateUrl: './nav-header.component.html',
|
||||||
styleUrls: ['./nav-header.component.scss'],
|
styleUrls: ['./nav-header.component.scss'],
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [RouterLink, RouterLinkActive, NgOptimizedImage, GroupedTypeaheadComponent, ImageComponent,
|
imports: [RouterLink, RouterLinkActive, GroupedTypeaheadComponent, ImageComponent,
|
||||||
SeriesFormatComponent, EventsWidgetComponent, NgbDropdown, NgbDropdownToggle, NgbDropdownMenu, NgbDropdownItem,
|
SeriesFormatComponent, EventsWidgetComponent, NgbDropdown, NgbDropdownToggle, NgbDropdownMenu, NgbDropdownItem,
|
||||||
AsyncPipe, PersonRolePipe, SentenceCasePipe, TranslocoDirective, ProviderImagePipe, ProviderNamePipe, CollectionOwnerComponent, PromotedIconComponent, NgTemplateOutlet]
|
AsyncPipe, SentenceCasePipe, TranslocoDirective, CollectionOwnerComponent, PromotedIconComponent],
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
})
|
})
|
||||||
export class NavHeaderComponent implements OnInit {
|
export class NavHeaderComponent implements OnInit {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
@for (rating of ratings; track rating.provider + rating.averageScore) {
|
@for (rating of ratings; track rating.provider + rating.averageScore) {
|
||||||
<div class="col-auto custom-col clickable" [ngbPopover]="externalPopContent" [popoverContext]="{rating: rating}"
|
<div class="col-auto custom-col clickable" [ngbPopover]="externalPopContent" [popoverContext]="{rating: rating}"
|
||||||
[popoverTitle]="rating.provider | providerName" popoverClass="sm-popover">
|
[popoverTitle]="rating.provider | scrobbleProviderName" popoverClass="sm-popover">
|
||||||
<span class="badge rounded-pill me-1">
|
<span class="badge rounded-pill me-1">
|
||||||
<img class="me-1" [ngSrc]="rating.provider | providerImage:true" width="24" height="24" alt="" aria-hidden="true">
|
<img class="me-1" [ngSrc]="rating.provider | providerImage:true" width="24" height="24" alt="" aria-hidden="true">
|
||||||
{{rating.averageScore}}%
|
{{rating.averageScore}}%
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@ import {ProviderImagePipe} from "../../../_pipes/provider-image.pipe";
|
||||||
import {NgbModal, NgbPopover} from "@ng-bootstrap/ng-bootstrap";
|
import {NgbModal, NgbPopover} from "@ng-bootstrap/ng-bootstrap";
|
||||||
import {LoadingComponent} from "../../../shared/loading/loading.component";
|
import {LoadingComponent} from "../../../shared/loading/loading.component";
|
||||||
import {LibraryType} from "../../../_models/library/library";
|
import {LibraryType} from "../../../_models/library/library";
|
||||||
import {ProviderNamePipe} from "../../../_pipes/provider-name.pipe";
|
|
||||||
import {NgxStarsModule} from "ngx-stars";
|
import {NgxStarsModule} from "ngx-stars";
|
||||||
import {ThemeService} from "../../../_services/theme.service";
|
import {ThemeService} from "../../../_services/theme.service";
|
||||||
import {Breakpoint, UtilityService} from "../../../shared/_services/utility.service";
|
import {Breakpoint, UtilityService} from "../../../shared/_services/utility.service";
|
||||||
|
|
@ -23,12 +22,13 @@ import {SafeHtmlPipe} from "../../../_pipes/safe-html.pipe";
|
||||||
import {ImageService} from "../../../_services/image.service";
|
import {ImageService} from "../../../_services/image.service";
|
||||||
import {AsyncPipe, NgOptimizedImage, NgTemplateOutlet} from "@angular/common";
|
import {AsyncPipe, NgOptimizedImage, NgTemplateOutlet} from "@angular/common";
|
||||||
import {RatingModalComponent} from "../rating-modal/rating-modal.component";
|
import {RatingModalComponent} from "../rating-modal/rating-modal.component";
|
||||||
|
import {ScrobbleProviderNamePipe} from "../../../_pipes/scrobble-provider-name.pipe";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-external-rating',
|
selector: 'app-external-rating',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [ProviderImagePipe, NgbPopover, LoadingComponent, ProviderNamePipe, NgxStarsModule, ImageComponent,
|
imports: [ScrobbleProviderNamePipe, NgbPopover, LoadingComponent, NgxStarsModule, ImageComponent,
|
||||||
TranslocoDirective, SafeHtmlPipe, NgOptimizedImage, AsyncPipe, NgTemplateOutlet],
|
TranslocoDirective, SafeHtmlPipe, NgOptimizedImage, AsyncPipe, NgTemplateOutlet, ProviderImagePipe],
|
||||||
templateUrl: './external-rating.component.html',
|
templateUrl: './external-rating.component.html',
|
||||||
styleUrls: ['./external-rating.component.scss'],
|
styleUrls: ['./external-rating.component.scss'],
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
|
|
|
||||||
BIN
UI/Web/src/assets/images/ExternalServices/ComicBookRoundup.png
Normal file
BIN
UI/Web/src/assets/images/ExternalServices/ComicBookRoundup.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.6 KiB |
Loading…
Add table
Add a link
Reference in a new issue