Release Shakeout (#655)

* Cleaned up some code. Fixed an issue on books with good table of contents not allowing line tracking (progress) from being saved. Changed Save to Defaults on light mode to be primary.

* Fixed a bug where deleting reading items would not actually delete them

* Fixed a bug where after ordering reading lists then deleting the order would be undone (develop)

* Code cleanup
This commit is contained in:
Joseph Milazzo 2021-10-11 16:32:56 -07:00 committed by GitHub
parent 49c34e32da
commit b197f6f334
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 31 additions and 53 deletions

View File

@ -163,6 +163,15 @@ namespace API.Tests.Parser
FullFilePath = filepath FullFilePath = filepath
}); });
// Fallback test with bad naming
filepath = @"E:\Comics\Comics\Babe\Babe Vol.1 #1-4\Babe 01.cbr";
expected.Add(filepath, new ParserInfo
{
Series = "Babe", Volumes = "0", Edition = "",
Chapters = "1", Filename = "Babe 01.cbr", Format = MangaFormat.Archive,
FullFilePath = filepath, IsSpecial = false
});
foreach (var file in expected.Keys) foreach (var file in expected.Keys)
{ {
var expectedInfo = expected[file]; var expectedInfo = expected[file];

View File

@ -100,33 +100,6 @@ namespace API.Tests.Parser
Assert.Equal(expected, IsEpub(input)); Assert.Equal(expected, IsEpub(input));
} }
// [Theory]
// [InlineData("Tenjou Tenge Omnibus", "Omnibus")]
// [InlineData("Tenjou Tenge {Full Contact Edition}", "Full Contact Edition")]
// [InlineData("Tenjo Tenge {Full Contact Edition} v01 (2011) (Digital) (ASTC).cbz", "Full Contact Edition")]
// [InlineData("Wotakoi - Love is Hard for Otaku Omnibus v01 (2018) (Digital) (danke-Empire)", "Omnibus")]
// [InlineData("To Love Ru v01 Uncensored (Ch.001-007)", "Uncensored")]
// [InlineData("Chobits Omnibus Edition v01 [Dark Horse]", "Omnibus Edition")]
// [InlineData("[dmntsf.net] One Piece - Digital Colored Comics Vol. 20 Ch. 177 - 30 Million vs 81 Million.cbz", "Digital Colored Comics")]
// [InlineData("AKIRA - c003 (v01) [Full Color] [Darkhorse].cbz", "Full Color")]
// public void ParseEditionTest(string input, string expected)
// {
// Assert.Equal(expected, ParseEdition(input));
// }
// [Theory]
// [InlineData("Beelzebub Special OneShot - Minna no Kochikame x Beelzebub (2016) [Mangastream].cbz", true)]
// [InlineData("Beelzebub_Omake_June_2012_RHS", true)]
// [InlineData("Beelzebub_Side_Story_02_RHS.zip", false)]
// [InlineData("Darker than Black Shikkoku no Hana Special [Simple Scans].zip", true)]
// [InlineData("Darker than Black Shikkoku no Hana Fanbook Extra [Simple Scans].zip", true)]
// [InlineData("Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U Extra Chapter", true)]
// [InlineData("Ani-Hina Art Collection.cbz", true)]
// public void ParseMangaSpecialTest(string input, bool expected)
// {
// Assert.Equal(expected, ParseMangaSpecial(input) != "");
// }
[Theory] [Theory]
[InlineData("12-14", 12)] [InlineData("12-14", 12)]
[InlineData("24", 24)] [InlineData("24", 24)]

View File

@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using API.Comparators; using API.Comparators;
@ -99,16 +100,20 @@ namespace API.Controllers
[HttpPost("delete-item")] [HttpPost("delete-item")]
public async Task<ActionResult> DeleteListItem(UpdateReadingListPosition dto) public async Task<ActionResult> DeleteListItem(UpdateReadingListPosition dto)
{ {
var items = (await _unitOfWork.ReadingListRepository.GetReadingListItemsByIdAsync(dto.ReadingListId)).ToList(); var readingList = await _unitOfWork.ReadingListRepository.GetReadingListByIdAsync(dto.ReadingListId);
var item = items.Find(r => r.Id == dto.ReadingListItemId); readingList.Items = readingList.Items.Where(r => r.Id != dto.ReadingListItemId).ToList();
items.Remove(item);
for (var i = 0; i < items.Count; i++)
var index = 0;
foreach (var readingListItem in readingList.Items)
{ {
items[i].Order = i; readingListItem.Order = index;
index++;
} }
if (_unitOfWork.HasChanges() && await _unitOfWork.CommitAsync()) if (!_unitOfWork.HasChanges()) return Ok();
if (await _unitOfWork.CommitAsync())
{ {
return Ok("Updated"); return Ok("Updated");
} }
@ -138,15 +143,10 @@ namespace API.Controllers
itemIdsToRemove.Contains(r.Id)); itemIdsToRemove.Contains(r.Id));
_unitOfWork.ReadingListRepository.BulkRemove(listItems); _unitOfWork.ReadingListRepository.BulkRemove(listItems);
if (_unitOfWork.HasChanges()) if (!_unitOfWork.HasChanges()) return Ok("Nothing to remove");
{
await _unitOfWork.CommitAsync(); await _unitOfWork.CommitAsync();
return Ok("Updated"); return Ok("Updated");
}
else
{
return Ok("Nothing to remove");
}
} }
catch catch
{ {

View File

@ -53,7 +53,7 @@ namespace API.Data.Repositories
{ {
return await _context.ReadingList return await _context.ReadingList
.Where(r => r.Id == readingListId) .Where(r => r.Id == readingListId)
.Include(r => r.Items) .Include(r => r.Items.OrderBy(item => item.Order))
.SingleOrDefaultAsync(); .SingleOrDefaultAsync();
} }

View File

@ -42,8 +42,6 @@ namespace API.Interfaces.Repositories
/// <param name="series"></param> /// <param name="series"></param>
/// <returns></returns> /// <returns></returns>
Task AddSeriesModifiers(int userId, List<SeriesDto> series); Task AddSeriesModifiers(int userId, List<SeriesDto> series);
Task<string> GetSeriesCoverImageAsync(int seriesId); Task<string> GetSeriesCoverImageAsync(int seriesId);
Task<IEnumerable<SeriesDto>> GetInProgress(int userId, int libraryId, UserParams userParams, FilterDto filter); Task<IEnumerable<SeriesDto>> GetInProgress(int userId, int libraryId, UserParams userParams, FilterDto filter);
Task<PagedList<SeriesDto>> GetRecentlyAdded(int libraryId, int userId, UserParams userParams, FilterDto filter); // NOTE: Probably put this in LibraryRepo Task<PagedList<SeriesDto>> GetRecentlyAdded(int libraryId, int userId, UserParams userParams, FilterDto filter); // NOTE: Probably put this in LibraryRepo

View File

@ -58,7 +58,7 @@
<button (click)="toggleClickToPaginate()" class="btn btn-icon" aria-labelledby="tap-pagination"><i class="fa fa-arrows-alt-h {{clickToPaginate ? 'icon-primary-color' : ''}}" aria-hidden="true"></i><span *ngIf="darkMode">&nbsp;{{clickToPaginate ? 'On' : 'Off'}}</span></button> <button (click)="toggleClickToPaginate()" class="btn btn-icon" aria-labelledby="tap-pagination"><i class="fa fa-arrows-alt-h {{clickToPaginate ? 'icon-primary-color' : ''}}" aria-hidden="true"></i><span *ngIf="darkMode">&nbsp;{{clickToPaginate ? 'On' : 'Off'}}</span></button>
</div> </div>
<div class="row no-gutters justify-content-between"> <div class="row no-gutters justify-content-between">
<button (click)="resetSettings()" class="btn btn-secondary col">Reset to Defaults</button> <button (click)="resetSettings()" class="btn btn-primary col">Reset to Defaults</button>
</div> </div>
</div> </div>
<div class="row no-gutters"> <div class="row no-gutters">

View File

@ -208,6 +208,7 @@ $primary-color: #0062cc;
.btn { .btn {
&.btn-secondary { &.btn-secondary {
color: #6c757d;
border-color: transparent; border-color: transparent;
background-color: unset; background-color: unset;

View File

@ -285,6 +285,8 @@ export class BookReaderComponent implements OnInit, AfterViewInit, OnDestroy {
fromEvent(window, 'scroll') fromEvent(window, 'scroll')
.pipe(debounceTime(200), takeUntil(this.onDestroy)).subscribe((event) => { .pipe(debounceTime(200), takeUntil(this.onDestroy)).subscribe((event) => {
if (this.isLoading) return; if (this.isLoading) return;
// Highlight the current chapter we are on
if (Object.keys(this.pageAnchors).length !== 0) { if (Object.keys(this.pageAnchors).length !== 0) {
// get the height of the document so we can capture markers that are halfway on the document viewport // get the height of the document so we can capture markers that are halfway on the document viewport
const verticalOffset = this.scrollService.scrollPosition + (document.body.offsetHeight / 2); const verticalOffset = this.scrollService.scrollPosition + (document.body.offsetHeight / 2);
@ -292,11 +294,6 @@ export class BookReaderComponent implements OnInit, AfterViewInit, OnDestroy {
const alreadyReached = Object.values(this.pageAnchors).filter((i: number) => i <= verticalOffset); const alreadyReached = Object.values(this.pageAnchors).filter((i: number) => i <= verticalOffset);
if (alreadyReached.length > 0) { if (alreadyReached.length > 0) {
this.currentPageAnchor = Object.keys(this.pageAnchors)[alreadyReached.length - 1]; this.currentPageAnchor = Object.keys(this.pageAnchors)[alreadyReached.length - 1];
if (!this.incognitoMode) {
this.readerService.saveProgress(this.seriesId, this.volumeId, this.chapterId, this.pageNum, this.lastSeenScrollPartPath).pipe(take(1)).subscribe(() => {/* No operation */});
}
return;
} else { } else {
this.currentPageAnchor = ''; this.currentPageAnchor = '';
} }