From 6d9a5d8f65cc13c6cc9669f4f92a295f20a667c9 Mon Sep 17 00:00:00 2001 From: Joe Milazzo Date: Sun, 14 Apr 2024 17:37:22 -0500 Subject: [PATCH] More Bugfixes (#2874) --- API/Controllers/SeriesController.cs | 1 + API/DTOs/ChapterDto.cs | 39 +++++ API/Helpers/AutoMapperProfiles.cs | 43 +++++- API/Services/CacheService.cs | 9 +- UI/Web/src/app/_models/chapter.ts | 28 ++++ .../app/_models/metadata/chapter-metadata.ts | 42 ------ UI/Web/src/app/_services/series.service.ts | 6 - .../card-detail-drawer.component.html | 2 +- .../card-detail-drawer.component.ts | 9 +- .../card-detail-layout.component.ts | 6 +- .../chapter-metadata-detail.component.ts | 4 +- .../entity-info-cards.component.html | 6 +- .../entity-info-cards.component.ts | 12 -- .../cards/list-item/list-item.component.html | 2 +- .../infinite-scroller.component.html | 1 + .../infinite-scroller.component.ts | 15 +- .../manga-reader/manga-reader.component.html | 15 +- .../reading-list-item.component.html | 20 +-- .../reading-list-item.component.ts | 17 +-- openapi.json | 134 +++++++++++++++++- 20 files changed, 303 insertions(+), 108 deletions(-) delete mode 100644 UI/Web/src/app/_models/metadata/chapter-metadata.ts diff --git a/API/Controllers/SeriesController.cs b/API/Controllers/SeriesController.cs index f65ac0b38..0a2627e9b 100644 --- a/API/Controllers/SeriesController.cs +++ b/API/Controllers/SeriesController.cs @@ -176,6 +176,7 @@ public class SeriesController : BaseApiController return Ok(await _unitOfWork.ChapterRepository.AddChapterModifiers(User.GetUserId(), chapter)); } + [Obsolete("All chapter entities will load this data by default. Will not be maintained as of v0.8.1")] [HttpGet("chapter-metadata")] public async Task> GetChapterMetadata(int chapterId) { diff --git a/API/DTOs/ChapterDto.cs b/API/DTOs/ChapterDto.cs index afd7db40d..aad00565c 100644 --- a/API/DTOs/ChapterDto.cs +++ b/API/DTOs/ChapterDto.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using API.DTOs.Metadata; using API.Entities.Enums; using API.Entities.Interfaces; @@ -120,4 +121,42 @@ public class ChapterDto : IHasReadTimeEstimate /// /// This is guaranteed to be Valid public string ISBN { get; set; } + + #region Metadata + + public ICollection Writers { get; set; } = new List(); + public ICollection CoverArtists { get; set; } = new List(); + public ICollection Publishers { get; set; } = new List(); + public ICollection Characters { get; set; } = new List(); + public ICollection Pencillers { get; set; } = new List(); + public ICollection Inkers { get; set; } = new List(); + public ICollection Imprints { get; set; } = new List(); + public ICollection Colorists { get; set; } = new List(); + public ICollection Letterers { get; set; } = new List(); + public ICollection Editors { get; set; } = new List(); + public ICollection Translators { get; set; } = new List(); + public ICollection Teams { get; set; } = new List(); + public ICollection Locations { get; set; } = new List(); + + public ICollection Genres { get; set; } = new List(); + + /// + /// Collection of all Tags from underlying chapters for a Series + /// + public ICollection Tags { get; set; } = new List(); + public PublicationStatus PublicationStatus { get; set; } + /// + /// Language for the Chapter/Issue + /// + public string? Language { get; set; } + /// + /// Number in the TotalCount of issues + /// + public int Count { get; set; } + /// + /// Total number of issues for the series + /// + public int TotalCount { get; set; } + + #endregion } diff --git a/API/Helpers/AutoMapperProfiles.cs b/API/Helpers/AutoMapperProfiles.cs index 99edd0f17..4862682b7 100644 --- a/API/Helpers/AutoMapperProfiles.cs +++ b/API/Helpers/AutoMapperProfiles.cs @@ -51,7 +51,6 @@ public class AutoMapperProfiles : Profile CreateMap() .ForMember(dest => dest.Number, opt => opt.MapFrom(src => (int) src.MinNumber)); CreateMap(); - CreateMap(); CreateMap(); CreateMap(); CreateMap() @@ -191,6 +190,48 @@ public class AutoMapperProfiles : Profile opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Location).OrderBy(p => p.NormalizedName))) ; + CreateMap() + .ForMember(dest => dest.Writers, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Writer).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.CoverArtists, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.CoverArtist).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.Colorists, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Colorist).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.Inkers, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Inker).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.Imprints, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Imprint).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.Letterers, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Letterer).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.Pencillers, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Penciller).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.Publishers, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Publisher).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.Translators, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Translator).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.Characters, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Character).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.Editors, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Editor).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.Teams, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Team).OrderBy(p => p.NormalizedName))) + .ForMember(dest => dest.Locations, + opt => + opt.MapFrom(src => src.People.Where(p => p.Role == PersonRole.Location).OrderBy(p => p.NormalizedName))) + ; + CreateMap() .ForMember(dest => dest.AgeRestriction, opt => diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index c19797b22..27641abd5 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -191,7 +191,14 @@ public class CacheService : ICacheService if (files.Count > 0 && files[0].Format == MangaFormat.Image) { - _readingItemService.Extract(files[0].FilePath, extractPath, MangaFormat.Image, files.Count); + foreach (var file in files) + { + if (fileCount > 1) + { + extraPath = file.Id + string.Empty; + } + _readingItemService.Extract(file.FilePath, Path.Join(extractPath, extraPath), MangaFormat.Image, files.Count); + } _directoryService.Flatten(extractDi.FullName); } diff --git a/UI/Web/src/app/_models/chapter.ts b/UI/Web/src/app/_models/chapter.ts index 4c1b37a6b..f4e86d4d3 100644 --- a/UI/Web/src/app/_models/chapter.ts +++ b/UI/Web/src/app/_models/chapter.ts @@ -1,5 +1,9 @@ import { MangaFile } from './manga-file'; import { AgeRating } from './metadata/age-rating'; +import {PublicationStatus} from "./metadata/publication-status"; +import {Genre} from "./metadata/genre"; +import {Tag} from "./tag"; +import {Person} from "./metadata/person"; export const LooseLeafOrDefaultNumber = -100000; export const SpecialVolumeNumber = 100000; @@ -51,4 +55,28 @@ export interface Chapter { isbn: string; lastReadingProgress: string; sortOrder: number; + + // originally in ChapterMetadata but now inlined with Chapter data + + year: string; + language: string; + publicationStatus: PublicationStatus; + count: number; + totalCount: number; + + genres: Array; + tags: Array; + writers: Array; + coverArtists: Array; + publishers: Array; + characters: Array; + pencillers: Array; + inkers: Array; + imprints: Array; + colorists: Array; + letterers: Array; + editors: Array; + translators: Array; + teams: Array; + locations: Array; } diff --git a/UI/Web/src/app/_models/metadata/chapter-metadata.ts b/UI/Web/src/app/_models/metadata/chapter-metadata.ts deleted file mode 100644 index d0e48d117..000000000 --- a/UI/Web/src/app/_models/metadata/chapter-metadata.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Genre } from "./genre"; -import { AgeRating } from "./age-rating"; -import { PublicationStatus } from "./publication-status"; -import { Person } from "./person"; -import { Tag } from "../tag"; - -export interface ChapterMetadata { - id: number; - chapterId: number; - title: string; - year: string; - - ageRating: AgeRating; - releaseDate: string; - language: string; - publicationStatus: PublicationStatus; - summary: string; - count: number; - totalCount: number; - wordCount: number; - - - - genres: Array; - tags: Array; - writers: Array; - coverArtists: Array; - publishers: Array; - characters: Array; - pencillers: Array; - inkers: Array; - imprints: Array; - colorists: Array; - letterers: Array; - editors: Array; - translators: Array; - teams: Array; - locations: Array; - - - -} diff --git a/UI/Web/src/app/_services/series.service.ts b/UI/Web/src/app/_services/series.service.ts index 927305134..4320305d2 100644 --- a/UI/Web/src/app/_services/series.service.ts +++ b/UI/Web/src/app/_services/series.service.ts @@ -5,8 +5,6 @@ import { map } from 'rxjs/operators'; import { environment } from 'src/environments/environment'; import { UtilityService } from '../shared/_services/utility.service'; import { Chapter } from '../_models/chapter'; -import { ChapterMetadata } from '../_models/metadata/chapter-metadata'; -import { UserCollection } from '../_models/collection-tag'; import { PaginatedResult } from '../_models/pagination'; import { Series } from '../_models/series'; import { RelatedSeries } from '../_models/series-detail/related-series'; @@ -75,10 +73,6 @@ export class SeriesService { return this.httpClient.get(this.baseUrl + 'series/chapter?chapterId=' + chapterId); } - getChapterMetadata(chapterId: number) { - return this.httpClient.get(this.baseUrl + 'series/chapter-metadata?chapterId=' + chapterId); - } - delete(seriesId: number) { return this.httpClient.delete(this.baseUrl + 'series/' + seriesId, TextResonse).pipe(map(s => s === "true")); } diff --git a/UI/Web/src/app/cards/card-detail-drawer/card-detail-drawer.component.html b/UI/Web/src/app/cards/card-detail-drawer/card-detail-drawer.component.html index 9c4846c1c..0d033b208 100644 --- a/UI/Web/src/app/cards/card-detail-drawer/card-detail-drawer.component.html +++ b/UI/Web/src/app/cards/card-detail-drawer/card-detail-drawer.component.html @@ -39,7 +39,7 @@
  • {{t(tabs[TabID.Metadata].title)}} - +
  • diff --git a/UI/Web/src/app/cards/card-detail-drawer/card-detail-drawer.component.ts b/UI/Web/src/app/cards/card-detail-drawer/card-detail-drawer.component.ts index 63351976e..909ec67b8 100644 --- a/UI/Web/src/app/cards/card-detail-drawer/card-detail-drawer.component.ts +++ b/UI/Web/src/app/cards/card-detail-drawer/card-detail-drawer.component.ts @@ -21,7 +21,6 @@ import { Observable, of, map, shareReplay } from 'rxjs'; import { DownloadService } from 'src/app/shared/_services/download.service'; import { Breakpoint, UtilityService } from 'src/app/shared/_services/utility.service'; import {Chapter, LooseLeafOrDefaultNumber} from 'src/app/_models/chapter'; -import { ChapterMetadata } from 'src/app/_models/metadata/chapter-metadata'; import { Device } from 'src/app/_models/device/device'; import { LibraryType } from 'src/app/_models/library/library'; import { MangaFile } from 'src/app/_models/manga-file'; @@ -48,7 +47,7 @@ import {BytesPipe} from "../../_pipes/bytes.pipe"; import {BadgeExpanderComponent} from "../../shared/badge-expander/badge-expander.component"; import {TagBadgeComponent} from "../../shared/tag-badge/tag-badge.component"; import {PersonBadgeComponent} from "../../shared/person-badge/person-badge.component"; -import {translate, TranslocoDirective, TranslocoService} from "@ngneat/transloco"; +import {translate, TranslocoDirective} from "@ngneat/transloco"; import {CardActionablesComponent} from "../../_single-module/card-actionables/card-actionables.component"; import {EditChapterProgressComponent} from "../edit-chapter-progress/edit-chapter-progress.component"; @@ -113,9 +112,7 @@ export class CardDetailDrawerComponent implements OnInit { ]; active = this.tabs[0]; - chapterMetadata: ChapterMetadata | undefined; summary: string = ''; - downloadInProgress: boolean = false; @@ -139,10 +136,6 @@ export class CardDetailDrawerComponent implements OnInit { this.isChapter = this.utilityService.isChapter(this.data); this.chapter = this.utilityService.isChapter(this.data) ? (this.data as Chapter) : (this.data as Volume).chapters[0]; - this.seriesService.getChapterMetadata(this.chapter.id).subscribe(metadata => { - this.chapterMetadata = metadata; - this.cdRef.markForCheck(); - }); if (this.isChapter) { this.coverImageUrl = this.imageService.getChapterCoverImage(this.data.id); diff --git a/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts b/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts index a079335a4..51b68cccc 100644 --- a/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts +++ b/UI/Web/src/app/cards/card-detail-layout/card-detail-layout.component.ts @@ -171,8 +171,10 @@ export class CardDetailLayoutComponent implements OnInit, OnChanges { hasCustomSort() { if (this.filteringDisabled) return false; - return this.filter?.sortOptions?.sortField != SortField.SortName || !this.filter?.sortOptions.isAscending - || this.filterSettings?.presetsV2?.sortOptions?.sortField != SortField.SortName || !this.filterSettings?.presetsV2?.sortOptions?.isAscending; + const hasCustomSort = this.filter?.sortOptions?.sortField != SortField.SortName || !this.filter?.sortOptions.isAscending; + const hasNonDefaultSortField = this.filterSettings?.presetsV2?.sortOptions?.sortField != SortField.SortName; + + return hasCustomSort; } performAction(action: ActionItem) { diff --git a/UI/Web/src/app/cards/chapter-metadata-detail/chapter-metadata-detail.component.ts b/UI/Web/src/app/cards/chapter-metadata-detail/chapter-metadata-detail.component.ts index 29a7a1027..1221460f0 100644 --- a/UI/Web/src/app/cards/chapter-metadata-detail/chapter-metadata-detail.component.ts +++ b/UI/Web/src/app/cards/chapter-metadata-detail/chapter-metadata-detail.component.ts @@ -1,9 +1,9 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { ChapterMetadata } from 'src/app/_models/metadata/chapter-metadata'; import {CommonModule} from "@angular/common"; import {BadgeExpanderComponent} from "../../shared/badge-expander/badge-expander.component"; import {PersonBadgeComponent} from "../../shared/person-badge/person-badge.component"; import {TranslocoDirective} from "@ngneat/transloco"; +import {Chapter} from "../../_models/chapter"; @Component({ selector: 'app-chapter-metadata-detail', @@ -14,5 +14,5 @@ import {TranslocoDirective} from "@ngneat/transloco"; changeDetection: ChangeDetectionStrategy.OnPush }) export class ChapterMetadataDetailComponent { - @Input() chapter: ChapterMetadata | undefined; + @Input() chapter: Chapter | undefined; } diff --git a/UI/Web/src/app/cards/entity-info-cards/entity-info-cards.component.html b/UI/Web/src/app/cards/entity-info-cards/entity-info-cards.component.html index 606e53b1f..c95d165c6 100644 --- a/UI/Web/src/app/cards/entity-info-cards/entity-info-cards.component.html +++ b/UI/Web/src/app/cards/entity-info-cards/entity-info-cards.component.html @@ -1,13 +1,13 @@
    -
    +
    - + {{item.title}} - + {{item.name}}
    diff --git a/UI/Web/src/app/cards/entity-info-cards/entity-info-cards.component.ts b/UI/Web/src/app/cards/entity-info-cards/entity-info-cards.component.ts index 5e32e8cda..ce0448fc9 100644 --- a/UI/Web/src/app/cards/entity-info-cards/entity-info-cards.component.ts +++ b/UI/Web/src/app/cards/entity-info-cards/entity-info-cards.component.ts @@ -8,7 +8,6 @@ import { } from '@angular/core'; import { UtilityService } from 'src/app/shared/_services/utility.service'; import { Chapter } from 'src/app/_models/chapter'; -import { ChapterMetadata } from 'src/app/_models/metadata/chapter-metadata'; import { HourEstimateRange } from 'src/app/_models/series-detail/hour-estimate-range'; import { MangaFormat } from 'src/app/_models/manga-format'; import { AgeRating } from 'src/app/_models/metadata/age-rating'; @@ -51,10 +50,6 @@ export class EntityInfoCardsComponent implements OnInit { @Input({required: true}) entity!: Volume | Chapter; @Input({required: true}) libraryId!: number; - /** - * This will pull extra information - */ - @Input() includeMetadata: boolean = false; /** * Hide more system based fields, like id or Date Added @@ -64,7 +59,6 @@ export class EntityInfoCardsComponent implements OnInit { isChapter = false; chapter!: Chapter; - chapterMetadata!: ChapterMetadata; ageRating!: string; totalPages: number = 0; totalWordCount: number = 0; @@ -94,12 +88,6 @@ export class EntityInfoCardsComponent implements OnInit { }, 0); } - if (this.includeMetadata) { - this.seriesService.getChapterMetadata(this.chapter.id).subscribe(metadata => { - this.chapterMetadata = metadata; - this.cdRef.markForCheck(); - }); - } this.totalPages = this.chapter.pages; if (!this.isChapter) { diff --git a/UI/Web/src/app/cards/list-item/list-item.component.html b/UI/Web/src/app/cards/list-item/list-item.component.html index 3c2db4e3d..2c9439051 100644 --- a/UI/Web/src/app/cards/list-item/list-item.component.html +++ b/UI/Web/src/app/cards/list-item/list-item.component.html @@ -31,7 +31,7 @@
    - +
    diff --git a/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.html b/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.html index f80179327..1be1d0f7e 100644 --- a/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.html +++ b/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.html @@ -30,6 +30,7 @@
    image diff --git a/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.ts b/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.ts index 4cd1c705e..0ae69300a 100644 --- a/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.ts +++ b/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.ts @@ -16,7 +16,7 @@ import { Renderer2, SimpleChanges, ViewChild } from '@angular/core'; -import { BehaviorSubject, fromEvent, ReplaySubject } from 'rxjs'; +import {BehaviorSubject, filter, fromEvent, map, Observable, of, ReplaySubject} from 'rxjs'; import { debounceTime } from 'rxjs/operators'; import { ScrollService } from 'src/app/_services/scroll.service'; import { ReaderService } from '../../../_services/reader.service'; @@ -27,6 +27,8 @@ import {takeUntilDestroyed} from "@angular/core/rxjs-interop"; import {TranslocoDirective} from "@ngneat/transloco"; import {MangaReaderComponent} from "../manga-reader/manga-reader.component"; import {InfiniteScrollModule} from "ngx-infinite-scroll"; +import {ReaderSetting} from "../../_models/reader-setting"; +import {SafeStylePipe} from "../../../_pipes/safe-style.pipe"; /** * How much additional space should pass, past the original bottom of the document height before we trigger the next chapter load @@ -61,7 +63,7 @@ const enum DEBUG_MODES { styleUrls: ['./infinite-scroller.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [NgIf, NgFor, AsyncPipe, TranslocoDirective, InfiniteScrollModule] + imports: [NgIf, NgFor, AsyncPipe, TranslocoDirective, InfiniteScrollModule, SafeStylePipe] }) export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit { @@ -70,6 +72,7 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy, private readonly renderer = inject(Renderer2); private readonly scrollService = inject(ScrollService); private readonly cdRef = inject(ChangeDetectorRef); + private readonly destroyRef = inject(DestroyRef); /** * Current page number aka what's recorded on screen @@ -87,6 +90,7 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy, * Method to generate the src for Image loading */ @Input({required: true}) urlProvider!: (page: number) => string; + @Input({required: true}) readerSettings$!: Observable; @Output() pageNumberChange: EventEmitter = new EventEmitter(); @Output() loadNextChapter: EventEmitter = new EventEmitter(); @Output() loadPrevChapter: EventEmitter = new EventEmitter(); @@ -99,7 +103,7 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy, bottomSpacerIntersectionObserver: IntersectionObserver = new IntersectionObserver((entries) => this.handleBottomIntersection(entries), { threshold: 1.0 }); - private readonly destroyRef = inject(DestroyRef); + darkness$: Observable = of('brightness(100%)'); readerElemRef!: ElementRef; @@ -223,6 +227,11 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy, this.recalculateImageWidth(); + this.darkness$ = this.readerSettings$.pipe( + map(values => 'brightness(' + values.darkness + '%)'), + takeUntilDestroyed(this.destroyRef) + ); + if (this.goToPage) { this.goToPage.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(page => { const isSamePage = this.pageNum === page; diff --git a/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.html b/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.html index 85d20f1cf..b9e3c2078 100644 --- a/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.html +++ b/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.html @@ -28,11 +28,13 @@ {{t('shortcuts-menu-alt')}} - + @if (!bookmarkMode && hasBookmarkRights) { + + }
    @@ -118,7 +120,8 @@ (loadNextChapter)="loadNextChapter()" (loadPrevChapter)="loadPrevChapter()" [bookmarkPage]="showBookmarkEffectEvent" - [fullscreenToggled]="fullscreenEvent"> + [fullscreenToggled]="fullscreenEvent" + [readerSettings$]="readerSettings$"> diff --git a/UI/Web/src/app/reading-list/_components/reading-list-item/reading-list-item.component.html b/UI/Web/src/app/reading-list/_components/reading-list-item/reading-list-item.component.html index ebeee9e18..80b6b567d 100644 --- a/UI/Web/src/app/reading-list/_components/reading-list-item/reading-list-item.component.html +++ b/UI/Web/src/app/reading-list/_components/reading-list-item/reading-list-item.component.html @@ -2,12 +2,14 @@
    - + @if (item.pagesRead === 0 && item.pagesTotal > 0) {
    -
    -
    -

    -
    + } + @if (item.pagesRead < item.pagesTotal && item.pagesTotal > 0 && item.pagesRead !== item.pagesTotal) { +
    +

    +
    + }
    @@ -37,9 +39,11 @@ -
    - Released: {{item.releaseDate | date:'longDate'}} -
    + @if (item.releaseDate !== '0001-01-01T00:00:00') { +
    + Released: {{item.releaseDate | date:'longDate'}} +
    + }
    diff --git a/UI/Web/src/app/reading-list/_components/reading-list-item/reading-list-item.component.ts b/UI/Web/src/app/reading-list/_components/reading-list-item/reading-list-item.component.ts index b6005f526..3405b5c13 100644 --- a/UI/Web/src/app/reading-list/_components/reading-list-item/reading-list-item.component.ts +++ b/UI/Web/src/app/reading-list/_components/reading-list-item/reading-list-item.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; +import {ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output} from '@angular/core'; import { LibraryType } from 'src/app/_models/library/library'; import { MangaFormat } from 'src/app/_models/manga-format'; import { ReadingListItem } from 'src/app/_models/reading-list'; @@ -6,7 +6,7 @@ import { ImageService } from 'src/app/_services/image.service'; import { MangaFormatIconPipe } from '../../../_pipes/manga-format-icon.pipe'; import { MangaFormatPipe } from '../../../_pipes/manga-format.pipe'; import { NgbProgressbar } from '@ng-bootstrap/ng-bootstrap'; -import { NgIf, DatePipe } from '@angular/common'; +import { DatePipe } from '@angular/common'; import { ImageComponent } from '../../../shared/image/image.component'; import {TranslocoDirective} from "@ngneat/transloco"; import {SeriesFormatComponent} from "../../../shared/series-format/series-format.component"; @@ -17,10 +17,13 @@ import {SeriesFormatComponent} from "../../../shared/series-format/series-format styleUrls: ['./reading-list-item.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [ImageComponent, NgIf, NgbProgressbar, DatePipe, MangaFormatPipe, MangaFormatIconPipe, TranslocoDirective, SeriesFormatComponent] + imports: [ImageComponent, NgbProgressbar, DatePipe, MangaFormatPipe, MangaFormatIconPipe, TranslocoDirective, SeriesFormatComponent] }) export class ReadingListItemComponent { + protected readonly imageService = inject(ImageService); + protected readonly MangaFormat = MangaFormat; + @Input({required: true}) item!: ReadingListItem; @Input() position: number = 0; @Input() libraryTypes: {[key: number]: LibraryType} = {}; @@ -32,15 +35,7 @@ export class ReadingListItemComponent { @Output() read: EventEmitter = new EventEmitter(); @Output() remove: EventEmitter = new EventEmitter(); - get MangaFormat(): typeof MangaFormat { - return MangaFormat; - } - - constructor(public imageService: ImageService) { } - readChapter(item: ReadingListItem) { this.read.emit(item); } - - } diff --git a/openapi.json b/openapi.json index 1b9f4311b..90edcd8bc 100644 --- a/openapi.json +++ b/openapi.json @@ -7,7 +7,7 @@ "name": "GPL-3.0", "url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE" }, - "version": "0.8.0.3" + "version": "0.8.0.4" }, "servers": [ { @@ -14716,6 +14716,138 @@ "type": "string", "description": "ISBN-13 (usually) of the Chapter", "nullable": true + }, + "writers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "coverArtists": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "publishers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "characters": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "pencillers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "inkers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "imprints": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "colorists": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "letterers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "editors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "translators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "teams": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "locations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonDto" + }, + "nullable": true + }, + "genres": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GenreTagDto" + }, + "nullable": true + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TagDto" + }, + "description": "Collection of all Tags from underlying chapters for a Series", + "nullable": true + }, + "publicationStatus": { + "enum": [ + 0, + 1, + 2, + 3, + 4 + ], + "type": "integer", + "format": "int32" + }, + "language": { + "type": "string", + "description": "Language for the Chapter/Issue", + "nullable": true + }, + "count": { + "type": "integer", + "description": "Number in the TotalCount of issues", + "format": "int32" + }, + "totalCount": { + "type": "integer", + "description": "Total number of issues for the series", + "format": "int32" } }, "additionalProperties": false,