{"version":3,"file":"main.84a758033ae48a97.js","mappings":"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","names":["AdminGuard","constructor","accountService","toastr","this","canActivate","currentUser$","pipe","take","map","user","hasAdminRole","error","t","i0","i1","i2","_angular_core__WEBPACK_IMPORTED_MODULE_3__","Yz7","factory","ɵfac","providedIn","AuthGuard","router","urlKey","toasts","filter","toast","message","length","localStorage","setItem","window","location","pathname","navigateByUrl","i3","LibraryAccessGuard","memberService","next","state","libraryId","parseInt","url","split","isNaN","of","hasLibraryAccess","_angular_core__WEBPACK_IMPORTED_MODULE_2__","LibraryType","Manga","Comic","Book","MangaFormat","IMAGE","ARCHIVE","UNKNOWN","EPUB","PDF","PersonRole","Other","Artist","Writer","Penciller","Inker","Colorist","Letterer","CoverArtist","Editor","Publisher","Character","Translator","SortField","SortName","Created","LastModified","LastChapterAdded","TimeToRead","ReleaseYear","mangaFormatFilters","title","value","selected","PaginatedResult","ThemeProvider","System","User","SearchResultGroup","libraries","series","collections","readingLists","persons","genres","tags","files","chapters","reset","Role","Admin","ChangePassword","Bookmark","Download","ChangeRestriction","AccountService","httpClient","messageHub","themeService","destroyRef","inject","DestroyRef","baseUrl","environment","userKey","lastLoginKey","currentUserSource","ReplaySubject","asObservable","messages$","evt","event","EVENTS","payload","userUpdateEvent","userName","currentUser","username","switchMap","refreshToken","subscribe","roles","includes","hasChangePasswordRole","hasChangeAgeRestrictionRole","hasDownloadRole","hasBookmarkRole","getRoles","get","login","model","post","response","setCurrentUser","createHubConnection","takeUntilDestroyed","getDecodedToken","token","role","Array","isArray","push","JSON","stringify","setTheme","preferences","theme","name","defaultTheme","stopRefreshTokenTimer","undefined","startRefreshTokenTimer","logout","removeItem","stopHubConnection","register","isEmailConfirmed","migrateUser","TextResonse","confirmMigrationEmail","resendConfirmationEmail","userId","inviteUser","confirmEmail","confirmEmailUpdate","getInviteUrl","withBaseUrl","parse","atob","requestResetPasswordEmail","email","encodeURIComponent","confirmResetPasswordEmail","resetPassword","password","oldPassword","update","updateEmail","updateAgeRestriction","ageRating","includeUnknowns","getPreferences","pref","updatePreferences","userPreferences","settings","getUserFromLocalStorage","userString","getItem","resetApiKey","key","apiKey","refreshTokenTimeout","setInterval","clearInterval","i4","_angular_core__WEBPACK_IMPORTED_MODULE_4__","Action","Submenu","MarkAsRead","MarkAsUnread","Scan","Delete","Edit","Info","RefreshMetadata","AnalyzeFiles","IncognitoRead","AddToReadingList","AddToCollection","DownloadBookmark","ViewSeries","Read","AddToWantToReadList","RemoveFromWantToReadList","SendTo","Import","ActionFactoryService","deviceService","libraryActions","seriesActions","volumeActions","chapterActions","collectionTagActions","readingListActions","bookmarkActions","isAdmin","_resetActions","getLibraryActions","callback","applyCallbackToList","getSeriesActions","getVolumeActions","getChapterActions","getCollectionTagActions","getReadingListActions","getBookmarkActions","dummyCallback","action","data","filterSendToAction","actions","chapter","requiresAdmin","children","dynamicList","devices$","devices","d","shareReplay","class","applyCallback","forEach","childAction","list","a","hasAction","i","_r6","ctx_r5","tmp_b_0","listForm","setValue","collectionTag_r7","_r11","$implicit","ctx_r10","addToCollection","BulkAddToCollectionComponent_li_8_i_2_Template","promoted","BulkAddToCollectionComponent","modal","collectionService","cdRef","seriesIds","lists","loading","FormGroup","collectionTitleTrackby","index","item","filterList","listItem","toLowerCase","indexOf","filterQuery","ngOnInit","addControl","FormControl","markForCheck","allTags","ngAfterViewInit","inputElem","nativeElement","select","close","create","tagName","addByMultiple","success","tag","id","core","Xpm","selectors","viewQuery","rf","ctx","BulkAddToCollectionComponent_div_6_Template","BulkAddToCollectionComponent_li_8_Template","BulkAddToCollectionComponent_li_10_Template","BulkAddToCollectionComponent_li_11_Template","readingList_r7","addToList","AddToListModalComponent_li_8_i_2_Template","ADD_FLOW","Series","Volume","Chapter","Multiple","Multiple_Series","AddToListModalComponent","readingListService","getReadingLists","result","createList","readingList","type","updateByMultipleSeries","seriesId","updateBySeries","volumeId","updateByVolume","chapterId","updateByChapter","volumeIds","chapterIds","updateByMultiple","AddToListModalComponent_div_6_Template","AddToListModalComponent_li_8_Template","AddToListModalComponent_li_10_Template","AddToListModalComponent_li_11_Template","EditReadingListModalComponent_ng_template_10_div_6_div_1_Template","EditReadingListModalComponent_ng_template_10_div_6_div_2_Template","tmp_0_0","ctx_r3","reviewGroup","errors","required","tmp_1_0","duplicateName","EditReadingListModalComponent_ng_template_10_ng_container_7_div_1_ng_template_6_Template","_r13","EditReadingListModalComponent_ng_template_10_ng_container_7_div_1_Template","ctx_r4","user_r11","EditReadingListModalComponent_ng_template_10_div_13_div_4_div_1_Template","formControl_r15","min","max","EditReadingListModalComponent_ng_template_10_div_13_div_4_Template","invalid","touched","dirty","EditReadingListModalComponent_ng_template_10_div_14_div_4_div_1_Template","formControl_r19","EditReadingListModalComponent_ng_template_10_div_14_div_4_Template","ctx_r6","EditReadingListModalComponent_ng_template_10_div_18_div_4_div_1_Template","formControl_r23","EditReadingListModalComponent_ng_template_10_div_18_div_4_Template","ctx_r7","EditReadingListModalComponent_ng_template_10_div_19_div_4_div_1_Template","formControl_r27","EditReadingListModalComponent_ng_template_10_div_19_div_4_Template","ctx_r8","EditReadingListModalComponent_ng_template_10_div_6_Template","EditReadingListModalComponent_ng_template_10_ng_container_7_Template","EditReadingListModalComponent_ng_template_10_div_13_Template","EditReadingListModalComponent_ng_template_10_div_14_Template","EditReadingListModalComponent_ng_template_10_div_18_Template","EditReadingListModalComponent_ng_template_10_div_19_Template","ctx_r1","$event","_r32","ctx_r31","imageUrls","ctx_r33","updateSelectedIndex","ctx_r34","updateSelectedImage","ctx_r35","handleReset","ctx_r2","coverImageLocked","TabID","General","CoverImage","EditReadingListModalComponent","Breakpoint","ngModal","utilityService","uploadService","imageService","coverImageIndex","selectedCover","active","nonNullable","validators","Validators","summary","startingMonth","startingYear","endingMonth","endingYear","valueChanges","debounceTime","distinctUntilChanged","nameExists","tap","exists","isExistingName","setErrors","randomize","getReadingListCoverImage","items","rli","getChapterCoverImage","getListItems","dismiss","save","trim","readingListId","apis","updateReadingListCoverImage","forkJoin","results","console","log","detectChanges","i5","i6","i7","inputs","decls","vars","consts","template","EditReadingListModalComponent_ng_template_10_Template","EditReadingListModalComponent_ng_template_14_Template","getActiveBreakpoint","Mobile","_r0","ActionService","libraryService","seriesService","readerService","modalService","confirmService","deviceSerivce","onDestroy","Subject","readingListModalRef","collectionModalRef","ngOnDestroy","complete","scanLibrary","library","_this","_asyncToGenerator","hasOwnProperty","scan","res","info","refreshMetadata","_this2","confirm","editLibrary","modalRef","open","LibrarySettingsModalComponent","size","componentInstance","closed","closeResult","analyzeFiles","_this3","alert","analyze","markSeriesAsRead","markRead","pagesRead","pages","markSeriesAsUnread","markUnread","scanSeries","_this4","analyzeFilesForSeries","refreshMetdata","_this5","markVolumeAsRead","volume","markVolumeRead","c","markVolumeAsUnread","markVolumeUnread","markChapterAsRead","saveProgress","markChapterAsUnread","markMultipleAsRead","volumes","markMultipleRead","v","markMultipleAsUnread","markMultipleUnread","markMultipleSeriesAsRead","markMultipleSeriesRead","s","markMultipleSeriesAsUnread","markMultipleSeriesUnread","addMultipleToReadingList","scrollable","dismissed","addMultipleSeriesToWantToReadList","addSeriesToWantToRead","removeMultipleSeriesFromWantToReadList","removeSeriesToWantToRead","addMultipleSeriesToReadingList","addMultipleSeriesToCollectionTag","windowClass","addSeriesToReadingList","addVolumeToReadingList","addChapterToReadingList","editReadingList","deleteMultipleSeries","_this6","deleteSeries","_this7","delete","sendToDevice","device","sendTo","promptIfForce","extraContent","_this8","config","defaultConfirm","header","buttons","text","msg","i8","CollectionTagService","search","query","coverImage","getCollectionCoverImage","updateTag","updateSeriesForTag","seriesIdsToRemove","tagId","tagTitle","collectionTagId","collectionTagTitle","tagNameExists","DeviceService","devicesSource","createDevice","platform","emailAddress","updateDevice","deleteDevice","getDevices","deviceId","_angular_core__WEBPACK_IMPORTED_MODULE_6__","ImageService","encodedKey","placeholderImage","errorImage","resetCoverImage","errorWebLinkImage","currentTheme$","isDarkTheme","getRecentlyAddedItem","getVolumeCoverImage","getEntityTypeFromUrl","part","equalIndex","substring","replace","getLibraryCoverImage","getSeriesCoverImage","getBookmarkedImage","pageNum","getWebLinkImage","getCoverUploadImage","filename","updateErroredImage","target","src","updateErroredWebLinkImage","r","Math","round","random","LibraryService","libraryNames","libraryTypes","getLibraryNames","l","lib","getLibraryName","libraryNameExists","listDirectories","rootPath","getJumpBar","getLibraries","updateLibrariesForMember","selectedLibraries","force","forceUpdate","getLibraryType","MemberService","getMembers","includePending","getMemberNames","adminExists","deleteMember","hasReadingProgress","librayId","getMember","_angular_core__WEBPACK_IMPORTED_MODULE_1__","UpdateAvailable","ScanSeries","SeriesAdded","SeriesRemoved","ScanLibraryProgress","OnlineUsers","SeriesAddedToCollection","Error","BackupDatabaseProgress","CleanupProgress","DownloadProgress","NotificationProgress","FileScanProgress","SiteThemeProgress","CoverUpdate","CoverUpdateProgress","LibraryModified","UserProgressUpdate","UserUpdate","ConvertBookmarksProgress","WordCountAnalyzerProgress","SendingToDevice","MessageHubService","hubUrl","messagesSource","onlineUsersSource","BehaviorSubject","onlineUsers$","isEventType","eventType","hubConnection","HubConnectionBuilder","withUrl","accessTokenFactory","withAutomaticReconnect","build","start","catch","err","on","usernames","resp","body","stop","sendMessage","methodName","invoke","NavService","document","rendererFactory","localStorageSideNavKey","navbarVisibleSource","navbarVisible$","sideNavCollapseSource","sideNavCollapsed$","sideNavVisibilitySource","sideNavVisibility$","renderer","createRenderer","showNavBar","sideNavState","showSideNav","setStyle","querySelector","hideNavBar","removeStyle","hideSideNav","toggleSideNav","val","newVal","DOCUMENT","CHAPTER_ID_DOESNT_EXIST","CHAPTER_ID_NOT_FETCHED","ReaderService","filterUtilityService","getNavigationArray","format","downloadPdf","bookmark","page","unbookmark","getAllBookmarks","params","HttpParams","addPaginationIfExists","createSeriesFilter","getBookmarks","getBookmarksForVolume","getBookmarksForSeries","clearBookmarks","clearMultipleBookmarks","getBookmarkInfo","getProgress","getPageUrl","getThumbnailUrl","getBookmarkPageUrl","getChapterInfo","includeDimensions","getFileDimensions","bookScrollId","getNextChapter","currentChapterId","getPrevChapter","hasSeriesProgress","getCurrentChapter","getTimeLeft","setOverrideStyles","backgroundColor","bodyNode","originalBodyColor","style","background","setAttribute","resetOverrideStyles","imageUrlToPageNum","imageSrc","URLSearchParams","URL","imageUrlToChapterId","getNextChapterUrl","nextChapterId","incognitoMode","readingListMode","lastSlashIndex","lastIndexOf","newRoute","getQueryParams","getQueryParamsObject","toggleFullscreen","el","screenfull","checkFullscreenMode","fullscreenElement","closeReader","back","_angular_core__WEBPACK_IMPORTED_MODULE_5__","ReadingListService","getReadingList","includePromoted","sortByLastModified","itemsPerPage","observe","createPaginatedResult","getReadingListsForSeries","updatePosition","readingListItemId","fromPosition","toPosition","deleteItem","removeRead","actionListFilter","validateCbl","form","importCbl","getCharacters","ScrollService","scrollContainerSource","scrollContainer$","events","NavigationEnd","scrollPosition","pageYOffset","documentElement","scrollTop","scrollPositionX","pageXOffset","scrollLeft","scrollTo","top","behavior","scroll","scrollToX","left","setScrollContainer","elem","SearchService","term","getSeriesForMangaFile","mangaFileId","getSeriesForChapter","SeriesService","filterUtilitySerivce","paginatedResults","paginatedSeriesForTagsResults","getAllSeries","getSeriesForLibrary","getAllSeriesByIds","getSeries","getVolumes","getChapter","getChapterMetadata","updateRating","userRating","userReview","updateSeries","getRecentlyAdded","getRecentlyUpdatedSeries","getWantToRead","isWantToRead","getOnDeck","getMetadata","collectionTags","updateMetadata","seriesMetadata","getSeriesForTag","getRelatedForSeries","updateRelationships","adaptations","characters","contains","others","prequels","sequels","sideStories","spinOffs","alternativeSettings","alternativeVersions","doujinshis","editions","getSeriesDetail","_angular_core__WEBPACK_IMPORTED_MODULE_7__","ThemeService","domSantizer","defaultBookTheme","currentThemeSource","themesSource","themes$","themeCache","getThemes","notificationEvent","getColorScheme","getComputedStyle","getPropertyValue","getThemeColor","getTileColor","getCssVariable","variable","themes","clearThemes","unsetThemes","setDefault","themeId","setBookTheme","selector","unsetBookThemes","addClass","clearBookTheme","themeName","find","provider","hasThemeInHead","fetchThemeContent","_ref","content","styleElem","createElement","appendChild","createTextNode","head","themeColor","colorScheme","_x","apply","arguments","from","encodedCss","sanitize","SecurityContext","classList","remove","cls","startsWith","UploadService","uploadByUrl","updateSeriesCoverImage","_cleanBase64Url","updateCollectionCoverImage","updateChapterCoverImage","updateLibraryCoverImage","resetChapterCoverLock","responseType","t_r9","route_r11","_r19","index_r12","ctx_r17","navigateTo","DirectoryPickerComponent_ol_14_li_1_ng_container_1_Template","DirectoryPickerComponent_ol_14_li_1_ng_template_2_Template","routeStack","peek","_r14","DirectoryPickerComponent_ol_14_li_1_Template","folder_r21","_r24","ctx_r23","selectNode","_c1","disabled","idx_r22","helpUrl","DirectoryPickerComponent","startingFolder","currentRoot","folders","Stack","path","focus$","click$","searching","searchFailed","text$","debouncedText$","clicksWithClosedPopup$","instance","isPopupOpen","merge","f","fullPath","catchError","folders2","endsWith","folder","join","loadChildren","updateTable","goBack","pop","stackPeek","shareFolder","preventDefault","stopPropagation","folderPath","share","getStem","lastPath","replaced","DirectoryPickerComponent_ng_template_11_Template","DirectoryPickerComponent_ol_14_Template","DirectoryPickerComponent_ng_template_15_Template","DirectoryPickerComponent_tr_30_Template","DirectoryPickerComponent_a_32_Template","_r1","_r4","SettingsService","http","getServerSettings","getBaseUrl","updateServerSettings","resetServerSettings","resetIPAddressesSettings","resetBaseUrl","resetEmailServerSettings","testEmailServerSettings","emailUrl","getTaskFrequencies","getLoggingLevels","getLibraryTypes","getOpdsEnabled","DynamicListPipe","transform","Yjl","pure","dynamicItem_r15","_r18","action_r6","ctx_r16","performDynamicClick","CardActionablesComponent_ng_container_0_ng_template_6_ng_container_0_ng_container_1_ng_container_1_ng_container_1_Template","dList_r13","_r22","ctx_r20","performAction","closeAllSubmenus","CardActionablesComponent_ng_container_0_ng_template_6_ng_container_0_ng_container_1_ng_template_4_button_0_Template","ctx_r12","willRenderAction","CardActionablesComponent_ng_container_0_ng_template_6_ng_container_0_ng_container_1_ng_container_1_Template","CardActionablesComponent_ng_container_0_ng_template_6_ng_container_0_ng_container_1_ng_template_4_Template","_r33","_r28","ctx_r32","preventEvent","openSubmenu","ctx_r37","CardActionablesComponent_ng_container_0_ng_template_6_ng_container_0_ng_template_2_ng_container_0_button_3_Template","CardActionablesComponent_ng_container_0_ng_template_6_ng_container_0_ng_template_2_ng_container_0_ng_container_5_Template","ctx_r27","_r2","_c0","CardActionablesComponent_ng_container_0_ng_template_6_ng_container_0_ng_template_2_ng_container_0_Template","ctx_r9","shouldRenderSubMenu","CardActionablesComponent_ng_container_0_ng_template_6_ng_container_0_ng_container_1_Template","CardActionablesComponent_ng_container_0_ng_template_6_ng_container_0_ng_template_2_Template","_r8","CardActionablesComponent_ng_container_0_ng_template_6_ng_container_0_Template","_r41","ctx_r40","CardActionablesComponent_ng_container_0_ng_container_5_Template","CardActionablesComponent_ng_container_0_ng_template_6_Template","ctx_r0","btnClass","labelBy","iconClass","CardActionablesComponent","actionHandler","EventEmitter","canDownload","submenu","emit","actionTitle","subMenu","Object","keys","k","dynamicItem","_extra","outputs","CardActionablesComponent_ng_container_0_Template","MetadataFilterModule","oAB","cJS","CommonModule","FormsModule","ReactiveFormsModule","NgbTooltipModule","NgbRatingModule","NgbCollapseModule","SharedModule","TypeaheadModule","CardsModule","RouterModule","PipeModule","VirtualScrollerModule","NgbOffcanvasModule","NgbNavModule","NgbPaginationModule","NgbDropdownModule","NgbProgressbarModule","NgxFileDropModule","changeMode","openFileSelector_r4","openFileSelector","_r12","ctx_r11","loadImage","mode","ctx_r13","CoverImageChooserComponent_ng_template_3_div_0_Template","CoverImageChooserComponent_ng_template_3_ng_container_1_Template","_r16","ctx_r15","resetImage","CoverImageChooserComponent_div_6_ng_container_2_Template","showApplyButton","selectedIndex","idx_r20","ctx_r22","applyImage","ctx_r21","appliedIndex","_r27","ctx_r26","selectImage","CoverImageChooserComponent_div_7_ng_container_2_Template","url_r19","CoverImageChooserComponent","fb","applyCover","resetCover","imageUrlsChange","showReset","resetClicked","imageSelected","selectedBase64Url","acceptableExtensions","group","coverImageUrl","getBase64Image","img","canvas","width","height","getContext","alpha","drawImage","toDataURL","imgUrl","Image","crossOrigin","onload","e","handleUrlImageAdd","onerror","setupEnterHandler","setTimeout","focus","dropped","droppedFile","fileEntry","isFile","file","reader","FileReader","handleFileImageAdd","readAsDataURL","fileOver","fileLeave","fromEvent","takeWhile","KEY_CODES","CoverImageChooserComponent_ng_template_3_Template","CoverImageChooserComponent_ng_template_4_Template","CoverImageChooserComponent_div_6_Template","CoverImageChooserComponent_div_7_Template","BytesPipe","bytes","si","dp","thresh","abs","units","u","fixed","toFixed","_angular_core__WEBPACK_IMPORTED_MODULE_0__","FilterPipe","MangaFormatIconPipe","MangaFormatPipe","SafeHtmlPipe","dom","SentenceCasePipe","charAt","toUpperCase","substr","CblImportResult","Fail","Partial","Success","step_r1","currentStep","icon","StepTrackerComponent","steps","StepTrackerComponent_ng_container_2_Template","CblImportReason","ChapterMissing","VolumeMissing","SeriesMissing","NameConflict","AllSeriesMissing","EmptyFile","SeriesCollision","AllChapterMissing","InvalidFile","failIcon","CblConflictReasonPipe","reason","number","readingListName","CblImportResultPipe","uploadForm","summary_r12","fileToProcess_r10","fileName","ImportCblModalComponent_ng_container_9_ngb_panel_6_ng_container_1_ng_template_2_ng_container_0_li_4_Template","ImportCblModalComponent_ng_container_9_ngb_panel_6_ng_container_1_ng_template_2_ng_container_0_Template","ImportCblModalComponent_ng_container_9_ngb_panel_6_ng_container_1_ng_template_2_ng_template_1_Template","ImportCblModalComponent_ng_container_9_ngb_panel_6_ng_container_1_ng_template_1_Template","ImportCblModalComponent_ng_container_9_ngb_panel_6_ng_container_1_ng_template_2_Template","ImportCblModalComponent_ng_container_9_ngb_panel_6_ng_container_1_Template","validateSummary","ImportCblModalComponent_ng_container_9_ngb_panel_6_Template","filesToProcess","summary_r28","fileToProcess_r26","_c2","ImportCblModalComponent_ng_container_10_ngb_panel_6_ng_container_1_ng_template_1_Template","ImportCblModalComponent_ng_container_10_ngb_panel_6_ng_container_1_ng_template_2_Template","ImportCblModalComponent_ng_container_10_ngb_panel_6_ng_container_1_Template","dryRunSummary","ImportCblModalComponent_ng_container_10_ngb_panel_6_Template","summary_r38","fileToProcess_r36","ImportCblModalComponent_ng_container_11_ngb_panel_4_ng_container_1_ng_template_1_Template","ImportCblModalComponent_ng_container_11_ngb_panel_4_ng_container_1_ng_template_2_Template","ImportCblModalComponent_ng_container_11_ngb_panel_4_ng_container_1_Template","finalizeSummary","ImportCblModalComponent_ng_container_11_ngb_panel_4_Template","result_r46","order","ImportCblModalComponent_ng_template_12_li_1_Template","summary_r44","success_r51","ImportCblModalComponent_ng_template_14_ng_container_0_span_2_Template","ImportCblModalComponent_ng_template_14_ng_container_0_span_3_Template","ImportCblModalComponent_ng_template_14_ng_container_0_span_4_Template","summary_r48","ctx_r49","cblName","ImportCblModalComponent_ng_template_14_ng_container_0_Template","ImportCblModalComponent_ng_template_14_span_4_Template","filename_r47","Step","Validate","DryRun","Finalize","ImportCblModalComponent","FileCount","NextButtonLabel","currentStepIndex","fileUploadControl","FileUploadValidators","isLoading","failedFiles","nextStep","isFileSelected","formData","FormData","append","cblImport","sort","b","dryRun","import","prevStep","canMoveToNextStep","canMoveToPrevStep","filenamesAllowedToProcess","p","findIndex","ImportCblModalComponent_div_8_Template","ImportCblModalComponent_ng_container_9_Template","ImportCblModalComponent_ng_container_10_Template","ImportCblModalComponent_ng_container_11_Template","ImportCblModalComponent_ng_template_12_Template","ImportCblModalComponent_ng_template_14_Template","SAVER","InjectionToken","getSaver","saveAs","download","saver","source","previous","isHttpProgressEvent","HttpEventType","progress","total","loaded","isHttpResponse","getFilename","headers","defaultName","ext","DEBOUNCE_TIME","bytesPipe","DownloadService","SIZE_WARNING","downloadsSource","activeDownloads$","downloadSubtitle","downloadEntityType","downloadEntity","entityType","entity","sizeCheckCall","downloadCall","downloadSeriesSize","downloadSeries","downloadVolumeSize","downloadVolume","downloadChapterSize","downloadChapter","downloadBookmarks","downloadLogs","promptForDownloadSize","confirmSize","wantsToDownload","finalize","downloadType","subtitle","reportProgress","throttleTime","asyncScheduler","leading","trailing","blob","decodeURIComponent","updateDownloadState","finalizeDownloadState","entitySubtitle","values","getValue","subTitle","bookmarks","FilterQueryParam","Format","Genres","AgeRating","PublicationStatus","Tags","Languages","CollectionTags","Libraries","Writers","Artists","CoverArtists","ReadStatus","SortBy","Rating","Name","Page","FilterUtilitiesService","updateUrlFromFilter","pagination","currentPage","urlFromFilter","href","history","replaceState","replacePaginationOnUrl","updateUrlFromPagination","snapshot","queryParamMap","totalItems","totalPages","currentUrl","joinFilter","formats","publicationStatus","languages","writers","artists","character","colorist","coverArtist","editor","inker","letterer","penciller","publisher","translators","readStatus","inProgress","notRead","read","sortOptions","sortField","isAscending","rating","seriesNameQuery","filterProp","filterPresetsFromUrl","anyChanged","coverArtists","sortBy","Number","searchNameQuery","releaseYearRange","RIGHT_ARROW","LEFT_ARROW","DOWN_ARROW","UP_ARROW","ESC_KEY","SPACE","ENTER","G","B","F","H","BACKSPACE","DELETE","SHIFT","Tablet","Desktop","UtilityService","mangaFormatKeys","sortVolumes","sortChapters","parseFloat","mangaFormatToText","formatChapterName","libraryType","includeHash","includeSpace","cleanSpecialTitle","cleaned","input","reg","filterMatches","isVolume","isChapter","isSeries","asVolume","asChapter","asSeries","innerWidth","isInViewport","element","additionalTopOffset","rect","getBoundingClientRect","bottom","innerHeight","clientHeight","right","clientWidth","deepEqual","object1","object2","keys1","keys2","val1","val2","areObjects","isObject","object","paginatedVariable","pageHeader","getWindowDimensions","center","fontSize","CircularLoaderComponent_ng_container_0_div_1_Template","showIcon","currentValue","outerStrokeColor","innerStrokeColor","animation","CircularLoaderComponent","CircularLoaderComponent_ng_container_0_Template","ConfirmConfig","_type","disableEscape","_r3","btn_r4","clickButton","ConfirmDialogComponent","_button_sort","x","y","xIsSecondary","yIsSecondary","button","ConfirmDialogComponent_button_3_Template","ConfirmDialogComponent_div_7_Template","ConfirmService","defaultAlert","Promise","resolve","reject","isEmpty","ImageComponent","hubService","changeDetectionRef","maxWidth","maxHeight","borderRadius","objectFit","processEvents","updateEvent","imageUrl","enityType","ngOnChanges","imgElem","NgCircleProgressModule","updateData","updateUrl","UpdateNotificationModalComponent","UpdateNotificationModalComponent_a_12_Template","updateTitle","updateBody","isDocker","LibrarySettingsModalComponent_ng_template_13_div_4_div_1_Template","LibrarySettingsModalComponent_ng_template_13_div_4_div_2_Template","libraryForm","opt_r18","lastScanned","LibrarySettingsModalComponent_ng_template_13_div_16_span_2_Template","LibrarySettingsModalComponent_ng_template_13_div_16_ng_template_3_Template","_r21","LibrarySettingsModalComponent_ng_template_13_div_4_Template","LibrarySettingsModalComponent_ng_template_13_ng_template_10_Template","LibrarySettingsModalComponent_ng_template_13_option_15_Template","LibrarySettingsModalComponent_ng_template_13_div_16_Template","isAddLibrary","folder_r24","removeFolder","LibrarySettingsModalComponent_ng_template_17_li_3_Template","_r29","ctx_r28","openDirectoryPicker","selectedFolders","LibrarySettingsModalComponent_ng_template_21_p_0_Template","applyCoverImage","_r36","isNextDisabled","_r38","isDisabled","Folder","Cover","Advanced","StepID","settingService","folderWatching","includeInDashboard","includeInRecommended","includeInSearch","manageCollections","manageReadingLists","collapseSeriesRelationships","madeChanges","setupStep","types","setValues","valid","returnVal","forceScan","coverUrl","LibrarySettingsModalComponent_ng_container_2_Template","LibrarySettingsModalComponent_ng_template_3_Template","LibrarySettingsModalComponent_ng_template_13_Template","LibrarySettingsModalComponent_ng_template_17_Template","LibrarySettingsModalComponent_ng_template_21_Template","LibrarySettingsModalComponent_ng_template_25_Template","LibrarySettingsModalComponent_ng_container_34_Template","LibrarySettingsModalComponent_ng_template_35_Template","_r9","SidenavModule","BASE_URL","getElementsByTagName","getAttribute","production","apiUrl","routes","all","__webpack_require__","then","bind","m","AdminModule","CollectionsModule","UserSettingsModule","ReadingListModule","RegistrationModule","AnnouncementsModule","BookmarkModule","AllSeriesModule","DashboardModule","WantToReadModule","runGuardsAndResolvers","pathMatch","LibraryDetailModule","SeriesDetailModule","MangaReaderModule","BookReaderModule","PdfReaderModule","redirectTo","AppRoutingModule","scrollPositionRestoration","preloadingStrategy","PreloadAllModules","navService","highlighted","link","SideNavItemComponent_ng_template_1_ng_container_0_Template","SideNavItemComponent_ng_template_1_ng_template_1_Template","external","SideNavItemComponent_ng_template_3_ng_container_3_Template","SideNavItemComponent_ng_template_3_ng_template_4_Template","SideNavItemComponent","comparisonMethod","updateHighlight","ngContentSelectors","SideNavItemComponent_ng_container_0_Template","SideNavItemComponent_ng_template_1_Template","SideNavItemComponent_ng_template_3_Template","library_r8","_r10","getLibraryTypeIcon","getLibraryImage","SideNavComponent_div_1_app_side_nav_item_10_Template","SideNavComponent_div_1_div_11_Template","SideNavComponent_div_1_app_side_nav_item_13_Template","filterLibrary","SideNavComponent","actionFactoryService","actionService","ngbModal","collapsed","handleAction","toggleNavBar","i9","i10","SideNavComponent_div_1_Template","SeriesFormatComponent","SeriesFormatComponent_ng_container_0_Template","activeEvents","activeDownloads_r4","errors_r6","infos_r8","EventsWidgetComponent_ng_container_0_ng_container_1_ng_container_1_ng_container_1_Template","infos$","EventsWidgetComponent_ng_container_0_ng_container_1_ng_container_1_Template","errors$","_r25","ctx_r24","clearAllErrorOrInfos","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_1_ng_container_1_li_1_Template","errors_r20","infos_r22","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_1_ng_container_1_Template","prettyPrintProgress","message_r29","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_4_ng_container_1_li_1_div_3_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_4_ng_container_1_li_1_div_5_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_4_ng_container_1_ng_template_2_div_3_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_4_ng_container_1_li_1_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_4_ng_container_1_ng_template_2_Template","_r31","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_4_ng_container_1_Template","progressUpdates_r27","_r47","singleUpdate_r42","ctx_r45","handleUpdateAvailableClick","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_6_ng_container_1_li_2_div_3_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_6_ng_container_1_li_1_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_6_ng_container_1_li_2_Template","ctx_r41","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_6_ng_container_1_Template","singleUpdates_r40","download_r53","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_8_ng_container_1_div_5_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_8_ng_container_1_Template","activeDownloads_r51","error_r58","_r60","ctx_r59","seeMore","ctx_r61","removeErrorOrInfo","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_10_ng_container_1_Template","errors_r56","info_r64","_r66","ctx_r65","ctx_r67","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_12_ng_container_1_Template","infos_r62","onlineUsers_r68","ctx_r70","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_14_li_1_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_14_li_2_Template","ctx_r18","debugMode","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_16_li_1_Template","ctx_r19","activeDownloads_r72","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_1_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_3_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_4_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_6_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_8_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_10_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_12_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_14_Template","EventsWidgetComponent_ng_container_0_ng_template_3_ng_container_16_Template","progressEvents$","singleUpdates$","downloadService","EventsWidgetComponent_ng_container_0_ng_container_1_Template","EventsWidgetComponent_ng_container_0_ng_template_3_Template","EventsWidgetComponent","isAdmin$","progressEventsSource","singleUpdateSource","errorSource","infoSource","updateNotificationModalRef","processNotificationProgressEvent","mergeOrUpdate","infoCount","errorCount","messageEvent","trunc","EventsWidgetComponent_ng_container_0_Template","_r5","resetField","option_r17","_r20","handleResultlick","seriesTemplate","_c12","index_r18","GroupedTypeaheadComponent_div_7_ng_container_2_li_5_Template","groupedData","option_r22","collectionTemplate","index_r23","GroupedTypeaheadComponent_div_7_ng_container_3_li_5_Template","option_r27","_r30","ctx_r29","readingListTemplate","index_r28","GroupedTypeaheadComponent_div_7_ng_container_4_li_5_Template","option_r32","_r35","libraryTemplate","index_r33","GroupedTypeaheadComponent_div_7_ng_container_5_li_5_Template","option_r37","_r40","ctx_r39","ctx_r36","genreTemplate","index_r38","GroupedTypeaheadComponent_div_7_ng_container_6_li_5_Template","option_r42","_r45","ctx_r44","tagTemplate","index_r43","GroupedTypeaheadComponent_div_7_ng_container_7_li_5_Template","option_r47","_r50","ctx_r46","personTemplate","index_r48","GroupedTypeaheadComponent_div_7_ng_container_8_li_5_Template","option_r52","_r55","ctx_r54","ctx_r51","chapterTemplate","index_r53","GroupedTypeaheadComponent_div_7_ng_container_9_li_5_Template","option_r57","ctx_r56","fileTemplate","index_r58","GroupedTypeaheadComponent_div_7_ng_container_10_li_5_Template","ctx_r14","noResultsTemplate","GroupedTypeaheadComponent_div_7_ng_container_2_Template","GroupedTypeaheadComponent_div_7_ng_container_3_Template","GroupedTypeaheadComponent_div_7_ng_container_4_Template","GroupedTypeaheadComponent_div_7_ng_container_5_Template","GroupedTypeaheadComponent_div_7_ng_container_6_Template","GroupedTypeaheadComponent_div_7_ng_container_7_Template","GroupedTypeaheadComponent_div_7_ng_container_8_Template","GroupedTypeaheadComponent_div_7_ng_container_9_Template","GroupedTypeaheadComponent_div_7_ng_container_10_Template","GroupedTypeaheadComponent_div_7_ng_container_11_Template","hasData","searchTerm","GroupedTypeaheadComponent","typeaheadForm","minQueryLength","initialValue","placeholder","inputChanged","clearField","focusChanged","hasFocus","prevSearchTerm","handleDocumentClick","handleKeyPress","change","onInputFocus","openDropdown","clear","contentQueries","dirIndex","GroupedTypeaheadComponent_div_5_Template","GroupedTypeaheadComponent_button_6_Template","GroupedTypeaheadComponent_div_7_Template","_c13","tmp_5_0","PersonRolePipe","item_r28","clickLibraryResult","item_r31","localizedName","NavHeaderComponent_nav_0_div_11_ng_template_8_ng_container_5_span_1_Template","NavHeaderComponent_nav_0_div_11_ng_template_8_ng_container_5_ng_template_2_Template","st_r33","clickSeriesSearchResult","NavHeaderComponent_nav_0_div_11_ng_template_8_ng_container_5_Template","libraryName","item_r42","clickCollectionSearchResult","NavHeaderComponent_nav_0_div_11_ng_template_10_span_6_Template","item_r46","_r49","ctx_r48","clickReadingListSearchResult","NavHeaderComponent_nav_0_div_11_ng_template_12_span_4_Template","item_r50","_r52","goTo","item_r53","goToPerson","item_r56","_r58","ctx_r57","item_r59","_r63","ctx_r62","clickChapterSearchResult","NavHeaderComponent_nav_0_div_11_ng_template_20_ng_container_2_Template","titleName","item_r64","clickFileSearchResult","filePath","_r69","ctx_r68","onChangeSearch","clearSearch","ctx_r71","focusUpdate","NavHeaderComponent_nav_0_div_11_ng_template_6_Template","NavHeaderComponent_nav_0_div_11_ng_template_8_Template","NavHeaderComponent_nav_0_div_11_ng_template_10_Template","NavHeaderComponent_nav_0_div_11_ng_template_12_Template","NavHeaderComponent_nav_0_div_11_ng_template_14_Template","NavHeaderComponent_nav_0_div_11_ng_template_16_Template","NavHeaderComponent_nav_0_div_11_ng_template_18_Template","NavHeaderComponent_nav_0_div_11_ng_template_20_Template","NavHeaderComponent_nav_0_div_11_ng_template_22_Template","NavHeaderComponent_nav_0_div_11_ng_template_24_Template","searchResults","_r75","ctx_r74","scrollToTop","NavHeaderComponent_nav_0_ng_container_13_ng_container_2_div_5_a_7_Template","NavHeaderComponent_nav_0_ng_container_13_ng_container_2_div_5_a_12_Template","_r83","ctx_r82","user_r79","ctx_r78","NavHeaderComponent_nav_0_ng_container_13_ng_container_2_a_4_Template","NavHeaderComponent_nav_0_ng_container_13_ng_container_2_div_5_Template","user_r76","ctx_r73","NavHeaderComponent_nav_0_ng_container_13_div_1_Template","NavHeaderComponent_nav_0_ng_container_13_ng_container_2_Template","backToTopNeeded","_r85","ctx_r84","moveFocus","NavHeaderComponent_nav_0_a_4_Template","NavHeaderComponent_nav_0_div_11_Template","NavHeaderComponent_nav_0_ng_container_13_Template","searchFocused","NavHeaderComponent","scrollService","searchService","imageStyles","customFilter","normalizedQuery","normalizedSeriesName","normalizedOriginalName","originalName","normalizedLocalizedName","scrollElem","scrollContainer","checkBackToTopNeeded","offset","getElementById","queryParamName","navigate","queryParams","searchViewRef","NavHeaderComponent_nav_0_Template","AppComponent","ratingConfig","resettable","NavigationStart","hasOpenModals","dismissAll","transitionState$","noTransitions","setDocHeight","vh","setProperty","hostBindings","AppComponent_app_side_nav_7_Template","AppComponent_div_11_Template","AppComponent_ng_template_13_Template","_c3","JwtInterceptor","intercept","request","clone","setHeaders","Authorization","handle","ErrorInterceptor","throwError","status","handleValidationError","handleAuthError","handleNotFound","handleServerException","previousToastMessage","modalStateErrors","details","issue","description","flat","statusText","Blob","NavModule","NgbPopoverModule","disableAnimations","AppModule","bootstrap","provide","HTTP_INTERCEPTORS","useClass","multi","Title","useFactory","imports","HttpClientModule","BrowserModule","BrowserAnimationsModule","ToastrModule","positionClass","preventDuplicates","timeOut","countDuplicates","autoDismiss","__NgCli_bootstrap_1","bootstrapModule"],"sourceRoot":"webpack:///","sources":["./src/app/_guards/admin.guard.ts","./src/app/_guards/auth.guard.ts","./src/app/_guards/library-access.guard.ts","./src/app/_models/library.ts","./src/app/_models/manga-format.ts","./src/app/_models/metadata/person.ts","./src/app/_models/metadata/series-filter.ts","./src/app/_models/pagination.ts","./src/app/_models/preferences/site-theme.ts","./src/app/_models/search/search-result-group.ts","./src/app/_services/account.service.ts","./src/app/_services/action-factory.service.ts","./src/app/cards/_modals/bulk-add-to-collection/bulk-add-to-collection.component.html","./src/app/cards/_modals/bulk-add-to-collection/bulk-add-to-collection.component.ts","./src/app/reading-list/_modals/add-to-list-modal/add-to-list-modal.component.html","./src/app/reading-list/_modals/add-to-list-modal/add-to-list-modal.component.ts","./src/app/reading-list/_modals/edit-reading-list-modal/edit-reading-list-modal.component.html","./src/app/reading-list/_modals/edit-reading-list-modal/edit-reading-list-modal.component.ts","./src/app/_services/action.service.ts","./src/app/_services/collection-tag.service.ts","./src/app/_services/device.service.ts","./src/app/_services/image.service.ts","./src/app/_services/library.service.ts","./src/app/_services/member.service.ts","./src/app/_services/message-hub.service.ts","./src/app/_services/nav.service.ts","./src/app/_services/reader.service.ts","./src/app/_services/reading-list.service.ts","./src/app/_services/scroll.service.ts","./src/app/_services/search.service.ts","./src/app/_services/series.service.ts","./src/app/_services/theme.service.ts","./src/app/_services/upload.service.ts","./src/app/_types/text-response.ts","./src/app/admin/_modals/directory-picker/directory-picker.component.html","./src/app/admin/_modals/directory-picker/directory-picker.component.ts","./src/app/admin/settings.service.ts","./src/app/cards/dynamic-list.pipe.ts","./src/app/cards/card-item/card-actionables/card-actionables.component.html","./src/app/cards/card-item/card-actionables/card-actionables.component.ts","./src/app/metadata-filter/metadata-filter.module.ts","./src/app/cards/cards.module.ts","./src/app/cards/cover-image-chooser/cover-image-chooser.component.html","./src/app/cards/cover-image-chooser/cover-image-chooser.component.ts","./src/app/pipe/bytes.pipe.ts","./src/app/pipe/filter.pipe.ts","./src/app/pipe/manga-format-icon.pipe.ts","./src/app/pipe/manga-format.pipe.ts","./src/app/pipe/pipe.module.ts","./src/app/pipe/safe-html.pipe.ts","./src/app/pipe/sentence-case.pipe.ts","./src/app/_models/reading-list/cbl/cbl-import-result.enum.ts","./src/app/reading-list/_components/step-tracker/step-tracker.component.html","./src/app/reading-list/_components/step-tracker/step-tracker.component.ts","./src/app/_models/reading-list/cbl/cbl-import-reason.enum.ts","./src/app/reading-list/_pipes/cbl-conflict-reason.pipe.ts","./src/app/reading-list/_pipes/cbl-import-result.pipe.ts","./src/app/reading-list/_modals/import-cbl-modal/import-cbl-modal.component.html","./src/app/reading-list/_modals/import-cbl-modal/import-cbl-modal.component.ts","./src/app/shared/_providers/saver.provider.ts","./src/app/shared/_models/download.ts","./src/app/shared/_services/download.service.ts","./src/app/shared/_services/filter-utilities.service.ts","./src/app/shared/_services/utility.service.ts","./src/app/shared/circular-loader/circular-loader.component.html","./src/app/shared/circular-loader/circular-loader.component.ts","./src/app/shared/confirm-dialog/_models/confirm-config.ts","./src/app/shared/confirm-dialog/confirm-dialog.component.html","./src/app/shared/confirm-dialog/confirm-dialog.component.ts","./src/app/shared/confirm.service.ts","./src/app/shared/data-structures/stack.ts","./src/app/shared/image/image.component.ts","./src/app/shared/image/image.component.html","./src/app/shared/shared.module.ts","./src/app/shared/update-notification/update-notification-modal.component.html","./src/app/shared/update-notification/update-notification-modal.component.ts","./src/app/sidenav/_modals/library-settings-modal/library-settings-modal.component.html","./src/app/sidenav/_modals/library-settings-modal/library-settings-modal.component.ts","./src/app/sidenav/sidenav.module.ts","./src/app/typeahead/typeahead.module.ts","./src/environments/environment.prod.ts","./src/app/base-url.provider.ts","./src/app/app-routing.module.ts","./src/app/sidenav/_components/side-nav-item/side-nav-item.component.html","./src/app/sidenav/_components/side-nav-item/side-nav-item.component.ts","./src/app/sidenav/_components/side-nav/side-nav.component.html","./src/app/sidenav/_components/side-nav/side-nav.component.ts","./src/app/shared/series-format/series-format.component.html","./src/app/shared/series-format/series-format.component.ts","./src/app/nav/_components/events-widget/events-widget.component.html","./src/app/nav/_components/events-widget/events-widget.component.ts","./src/app/nav/_components/grouped-typeahead/grouped-typeahead.component.html","./src/app/nav/_components/grouped-typeahead/grouped-typeahead.component.ts","./src/app/pipe/person-role.pipe.ts","./src/app/nav/_components/nav-header/nav-header.component.html","./src/app/nav/_components/nav-header/nav-header.component.ts","./src/app/app.component.html","./src/app/app.component.ts","./src/app/_interceptors/jwt.interceptor.ts","./src/app/_interceptors/error.interceptor.ts","./src/app/nav/nav.module.ts","./src/app/app.module.ts","./src/main.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { CanActivate } from '@angular/router';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { Observable } from 'rxjs';\r\nimport { map, take } from 'rxjs/operators';\r\nimport { AccountService } from '../_services/account.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AdminGuard implements CanActivate {\r\n constructor(private accountService: AccountService, private toastr: ToastrService) {}\r\n\r\n canActivate(): Observable {\r\n // this automaticallys subs due to being router guard\r\n return this.accountService.currentUser$.pipe(take(1),\r\n map((user) => {\r\n if (user && this.accountService.hasAdminRole(user)) {\r\n return true;\r\n }\r\n \r\n this.toastr.error('You are not authorized to view this page.');\r\n return false;\r\n })\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { CanActivate, Router } from '@angular/router';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { Observable } from 'rxjs';\r\nimport { map, take } from 'rxjs/operators';\r\nimport { AccountService } from '../_services/account.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthGuard implements CanActivate {\r\n public urlKey: string = 'kavita--auth-intersection-url';\r\n constructor(private accountService: AccountService, private router: Router, private toastr: ToastrService) {}\r\n\r\n canActivate(): Observable {\r\n return this.accountService.currentUser$.pipe(take(1),\r\n map((user) => {\r\n if (user) {\r\n return true;\r\n }\r\n if (this.toastr.toasts.filter(toast => toast.message === 'Unauthorized' || toast.message === 'You are not authorized to view this page.').length === 0) {\r\n this.toastr.error('You are not authorized to view this page.');\r\n }\r\n localStorage.setItem(this.urlKey, window.location.pathname);\r\n this.router.navigateByUrl('/login');\r\n return false;\r\n })\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\r\nimport { Observable, of } from 'rxjs';\r\nimport { MemberService } from '../_services/member.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LibraryAccessGuard implements CanActivate {\r\n\r\n constructor(private memberService: MemberService) {}\r\n\r\n canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {\r\n const libraryId = parseInt(state.url.split('library/')[1], 10);\r\n if (isNaN(libraryId)) return of(false);\r\n return this.memberService.hasLibraryAccess(libraryId);\r\n }\r\n}\r\n","export enum LibraryType {\r\n Manga = 0,\r\n Comic = 1,\r\n Book = 2,\r\n}\r\n\r\nexport interface Library {\r\n id: number;\r\n name: string;\r\n lastScanned: string;\r\n type: LibraryType;\r\n folders: string[];\r\n coverImage?: string;\r\n folderWatching: boolean;\r\n includeInDashboard: boolean;\r\n includeInRecommended: boolean;\r\n includeInSearch: boolean;\r\n manageCollections: boolean;\r\n manageReadingLists: boolean;\r\n collapseSeriesRelationships: boolean;\r\n}","export enum MangaFormat {\r\n IMAGE = 0,\r\n ARCHIVE = 1,\r\n UNKNOWN = 2,\r\n EPUB = 3,\r\n PDF = 4\r\n}","export enum PersonRole {\r\n Other = 1,\r\n Artist = 2,\r\n Writer = 3,\r\n Penciller = 4,\r\n Inker = 5,\r\n Colorist = 6,\r\n Letterer = 7,\r\n CoverArtist = 8,\r\n Editor = 9,\r\n Publisher = 10,\r\n Character = 11,\r\n Translator = 12\r\n}\r\n\r\nexport interface Person {\r\n id: number;\r\n name: string;\r\n role: PersonRole;\r\n}","import { MangaFormat } from \"../manga-format\";\r\n\r\nexport interface FilterItem {\r\n title: string;\r\n value: T;\r\n selected: boolean;\r\n}\r\n\r\nexport interface Range {\r\n min: T;\r\n max: T;\r\n}\r\n\r\nexport interface SeriesFilter {\r\n formats: Array;\r\n libraries: Array,\r\n readStatus: ReadStatus;\r\n genres: Array;\r\n writers: Array;\r\n artists: Array;\r\n penciller: Array;\r\n inker: Array;\r\n colorist: Array;\r\n letterer: Array;\r\n coverArtist: Array;\r\n editor: Array;\r\n publisher: Array;\r\n character: Array;\r\n translators: Array;\r\n collectionTags: Array;\r\n rating: number;\r\n ageRating: Array;\r\n sortOptions: SortOptions | null;\r\n tags: Array;\r\n languages: Array;\r\n publicationStatus: Array;\r\n seriesNameQuery: string;\r\n releaseYearRange: Range | null;\r\n}\r\n\r\nexport interface SortOptions {\r\n sortField: SortField;\r\n isAscending: boolean;\r\n}\r\n\r\nexport enum SortField {\r\n SortName = 1,\r\n Created = 2,\r\n LastModified = 3,\r\n LastChapterAdded = 4,\r\n TimeToRead = 5,\r\n ReleaseYear = 6,\r\n}\r\n\r\nexport interface ReadStatus {\r\n notRead: boolean,\r\n inProgress: boolean,\r\n read: boolean,\r\n}\r\n\r\nexport const mangaFormatFilters = [\r\n {\r\n title: 'Images',\r\n value: MangaFormat.IMAGE,\r\n selected: false\r\n },\r\n {\r\n title: 'EPUB',\r\n value: MangaFormat.EPUB,\r\n selected: false\r\n },\r\n {\r\n title: 'PDF',\r\n value: MangaFormat.PDF,\r\n selected: false\r\n },\r\n {\r\n title: 'ARCHIVE',\r\n value: MangaFormat.ARCHIVE,\r\n selected: false\r\n }\r\n];\r\n\r\nexport interface FilterEvent {\r\n filter: SeriesFilter;\r\n isFirst: boolean;\r\n}\r\n\r\n","export interface Pagination {\r\n currentPage: number;\r\n itemsPerPage: number;\r\n totalItems: number;\r\n totalPages: number;\r\n}\r\n\r\nexport class PaginatedResult {\r\n result!: T;\r\n pagination!: Pagination;\r\n}\r\n","/**\r\n * Where does the theme come from\r\n */\r\n export enum ThemeProvider {\r\n System = 1,\r\n User = 2\r\n }\r\n \r\n /**\r\n * Theme for the whole instance\r\n */\r\n export interface SiteTheme {\r\n id: number;\r\n name: string;\r\n normalizedName: string;\r\n filePath: string;\r\n isDefault: boolean;\r\n provider: ThemeProvider;\r\n /**\r\n * The actual class the root is defined against. It is generated at the backend.\r\n */\r\n selector: string;\r\n }","import { Chapter } from \"../chapter\";\r\nimport { Library } from \"../library\";\r\nimport { MangaFile } from \"../manga-file\";\r\nimport { SearchResult } from \"./search-result\";\r\nimport { Tag } from \"../tag\";\r\n\r\nexport class SearchResultGroup {\r\n libraries: Array = [];\r\n series: Array = [];\r\n collections: Array = [];\r\n readingLists: Array = [];\r\n persons: Array = [];\r\n genres: Array = [];\r\n tags: Array = [];\r\n files: Array = [];\r\n chapters: Array = [];\r\n\r\n reset() {\r\n this.libraries = [];\r\n this.series = [];\r\n this.collections = [];\r\n this.readingLists = [];\r\n this.persons = [];\r\n this.genres = [];\r\n this.tags = [];\r\n this.files = [];\r\n this.chapters = []; \r\n }\r\n}","import { HttpClient } from '@angular/common/http';\r\nimport {DestroyRef, inject, Injectable, OnDestroy} from '@angular/core';\r\nimport { of, ReplaySubject, Subject } from 'rxjs';\r\nimport { filter, map, switchMap, takeUntil } from 'rxjs/operators';\r\nimport { environment } from 'src/environments/environment';\r\nimport { Preferences } from '../_models/preferences/preferences';\r\nimport { User } from '../_models/user';\r\nimport { Router } from '@angular/router';\r\nimport { EVENTS, MessageHubService } from './message-hub.service';\r\nimport { ThemeService } from './theme.service';\r\nimport { InviteUserResponse } from '../_models/auth/invite-user-response';\r\nimport { UserUpdateEvent } from '../_models/events/user-update-event';\r\nimport { UpdateEmailResponse } from '../_models/auth/update-email-response';\r\nimport { AgeRating } from '../_models/metadata/age-rating';\r\nimport { AgeRestriction } from '../_models/metadata/age-restriction';\r\nimport { TextResonse } from '../_types/text-response';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\nexport enum Role {\r\n Admin = 'Admin',\r\n ChangePassword = 'Change Password',\r\n Bookmark = 'Bookmark',\r\n Download = 'Download',\r\n ChangeRestriction = 'Change Restriction'\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AccountService {\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n baseUrl = environment.apiUrl;\r\n userKey = 'kavita-user';\r\n public lastLoginKey = 'kavita-lastlogin';\r\n currentUser: User | undefined;\r\n\r\n // Stores values, when someone subscribes gives (1) of last values seen.\r\n private currentUserSource = new ReplaySubject(1);\r\n currentUser$ = this.currentUserSource.asObservable();\r\n\r\n /**\r\n * SetTimeout handler for keeping track of refresh token call\r\n */\r\n private refreshTokenTimeout: ReturnType | undefined;\r\n\r\n constructor(private httpClient: HttpClient, private router: Router,\r\n private messageHub: MessageHubService, private themeService: ThemeService) {\r\n messageHub.messages$.pipe(filter(evt => evt.event === EVENTS.UserUpdate),\r\n map(evt => evt.payload as UserUpdateEvent),\r\n filter(userUpdateEvent => userUpdateEvent.userName === this.currentUser?.username),\r\n switchMap(() => this.refreshToken()))\r\n .subscribe(() => {});\r\n }\r\n\r\n hasAdminRole(user: User) {\r\n return user && user.roles.includes(Role.Admin);\r\n }\r\n\r\n hasChangePasswordRole(user: User) {\r\n return user && user.roles.includes(Role.ChangePassword);\r\n }\r\n\r\n hasChangeAgeRestrictionRole(user: User) {\r\n return user && user.roles.includes(Role.ChangeRestriction);\r\n }\r\n\r\n hasDownloadRole(user: User) {\r\n return user && user.roles.includes(Role.Download);\r\n }\r\n\r\n hasBookmarkRole(user: User) {\r\n return user && user.roles.includes(Role.Bookmark);\r\n }\r\n\r\n getRoles() {\r\n return this.httpClient.get(this.baseUrl + 'account/roles');\r\n }\r\n\r\n login(model: {username: string, password: string}) {\r\n return this.httpClient.post(this.baseUrl + 'account/login', model).pipe(\r\n map((response: User) => {\r\n const user = response;\r\n if (user) {\r\n this.setCurrentUser(user);\r\n this.messageHub.createHubConnection(user, this.hasAdminRole(user));\r\n }\r\n }),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n }\r\n\r\n setCurrentUser(user?: User) {\r\n if (user) {\r\n user.roles = [];\r\n const roles = this.getDecodedToken(user.token).role;\r\n Array.isArray(roles) ? user.roles = roles : user.roles.push(roles);\r\n\r\n localStorage.setItem(this.userKey, JSON.stringify(user));\r\n localStorage.setItem(this.lastLoginKey, user.username);\r\n if (user.preferences && user.preferences.theme) {\r\n this.themeService.setTheme(user.preferences.theme.name);\r\n } else {\r\n this.themeService.setTheme(this.themeService.defaultTheme);\r\n }\r\n } else {\r\n this.themeService.setTheme(this.themeService.defaultTheme);\r\n }\r\n\r\n this.currentUser = user;\r\n this.currentUserSource.next(user);\r\n\r\n this.stopRefreshTokenTimer();\r\n\r\n if (this.currentUser !== undefined) {\r\n this.startRefreshTokenTimer();\r\n }\r\n }\r\n\r\n logout() {\r\n localStorage.removeItem(this.userKey);\r\n this.currentUserSource.next(undefined);\r\n this.currentUser = undefined;\r\n this.stopRefreshTokenTimer();\r\n // Upon logout, perform redirection\r\n this.router.navigateByUrl('/login');\r\n this.messageHub.stopHubConnection();\r\n }\r\n\r\n\r\n /**\r\n * Registers the first admin on the account. Only used for that. All other registrations must occur through invite\r\n * @param model\r\n * @returns\r\n */\r\n register(model: {username: string, password: string, email: string}) {\r\n return this.httpClient.post(this.baseUrl + 'account/register', model).pipe(\r\n map((user: User) => {\r\n return user;\r\n }),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n }\r\n\r\n isEmailConfirmed() {\r\n return this.httpClient.get(this.baseUrl + 'account/email-confirmed');\r\n }\r\n\r\n migrateUser(model: {email: string, username: string, password: string, sendEmail: boolean}) {\r\n return this.httpClient.post(this.baseUrl + 'account/migrate-email', model, TextResonse);\r\n }\r\n\r\n confirmMigrationEmail(model: {email: string, token: string}) {\r\n return this.httpClient.post(this.baseUrl + 'account/confirm-migration-email', model);\r\n }\r\n\r\n resendConfirmationEmail(userId: number) {\r\n return this.httpClient.post(this.baseUrl + 'account/resend-confirmation-email?userId=' + userId, {}, TextResonse);\r\n }\r\n\r\n inviteUser(model: {email: string, roles: Array, libraries: Array, ageRestriction: AgeRestriction}) {\r\n return this.httpClient.post(this.baseUrl + 'account/invite', model);\r\n }\r\n\r\n confirmEmail(model: {email: string, username: string, password: string, token: string}) {\r\n return this.httpClient.post(this.baseUrl + 'account/confirm-email', model);\r\n }\r\n\r\n confirmEmailUpdate(model: {email: string, token: string}) {\r\n return this.httpClient.post(this.baseUrl + 'account/confirm-email-update', model);\r\n }\r\n\r\n /**\r\n * Given a user id, returns a full url for setting up the user account\r\n * @param userId\r\n * @returns\r\n */\r\n getInviteUrl(userId: number, withBaseUrl: boolean = true) {\r\n return this.httpClient.get(this.baseUrl + 'account/invite-url?userId=' + userId + '&withBaseUrl=' + withBaseUrl, TextResonse);\r\n }\r\n\r\n getDecodedToken(token: string) {\r\n return JSON.parse(atob(token.split('.')[1]));\r\n }\r\n\r\n requestResetPasswordEmail(email: string) {\r\n return this.httpClient.post(this.baseUrl + 'account/forgot-password?email=' + encodeURIComponent(email), {}, TextResonse);\r\n }\r\n\r\n confirmResetPasswordEmail(model: {email: string, token: string, password: string}) {\r\n return this.httpClient.post(this.baseUrl + 'account/confirm-password-reset', model, TextResonse);\r\n }\r\n\r\n resetPassword(username: string, password: string, oldPassword: string) {\r\n return this.httpClient.post(this.baseUrl + 'account/reset-password', {username, password, oldPassword}, TextResonse);\r\n }\r\n\r\n update(model: {email: string, roles: Array, libraries: Array, userId: number, ageRestriction: AgeRestriction}) {\r\n return this.httpClient.post(this.baseUrl + 'account/update', model);\r\n }\r\n\r\n updateEmail(email: string, password: string) {\r\n return this.httpClient.post(this.baseUrl + 'account/update/email', {email, password});\r\n }\r\n\r\n updateAgeRestriction(ageRating: AgeRating, includeUnknowns: boolean) {\r\n return this.httpClient.post(this.baseUrl + 'account/update/age-restriction', {ageRating, includeUnknowns});\r\n }\r\n\r\n /**\r\n * This will get latest preferences for a user and cache them into user store\r\n * @returns\r\n */\r\n getPreferences() {\r\n return this.httpClient.get(this.baseUrl + 'users/get-preferences').pipe(map(pref => {\r\n if (this.currentUser !== undefined || this.currentUser != null) {\r\n this.currentUser.preferences = pref;\r\n this.setCurrentUser(this.currentUser);\r\n }\r\n return pref;\r\n }), takeUntilDestroyed(this.destroyRef));\r\n }\r\n\r\n updatePreferences(userPreferences: Preferences) {\r\n return this.httpClient.post(this.baseUrl + 'users/update-preferences', userPreferences).pipe(map(settings => {\r\n if (this.currentUser !== undefined || this.currentUser != null) {\r\n this.currentUser.preferences = settings;\r\n this.setCurrentUser(this.currentUser);\r\n }\r\n return settings;\r\n }), takeUntilDestroyed(this.destroyRef));\r\n }\r\n\r\n getUserFromLocalStorage(): User | undefined {\r\n\r\n const userString = localStorage.getItem(this.userKey);\r\n\r\n if (userString) {\r\n return JSON.parse(userString)\r\n };\r\n\r\n return undefined;\r\n }\r\n\r\n resetApiKey() {\r\n return this.httpClient.post(this.baseUrl + 'account/reset-api-key', {}, TextResonse).pipe(map(key => {\r\n const user = this.getUserFromLocalStorage();\r\n if (user) {\r\n user.apiKey = key;\r\n\r\n localStorage.setItem(this.userKey, JSON.stringify(user));\r\n\r\n this.currentUserSource.next(user);\r\n this.currentUser = user;\r\n }\r\n return key;\r\n }));\r\n }\r\n\r\n private refreshToken() {\r\n if (this.currentUser === null || this.currentUser === undefined) return of();\r\n return this.httpClient.post<{token: string, refreshToken: string}>(this.baseUrl + 'account/refresh-token',\r\n {token: this.currentUser.token, refreshToken: this.currentUser.refreshToken}).pipe(map(user => {\r\n if (this.currentUser) {\r\n this.currentUser.token = user.token;\r\n this.currentUser.refreshToken = user.refreshToken;\r\n }\r\n\r\n this.setCurrentUser(this.currentUser);\r\n return user;\r\n }));\r\n }\r\n\r\n /**\r\n * Every 10 mins refresh the token\r\n */\r\n private startRefreshTokenTimer() {\r\n if (this.currentUser === null || this.currentUser === undefined) {\r\n this.stopRefreshTokenTimer();\r\n return;\r\n }\r\n\r\n this.stopRefreshTokenTimer();\r\n\r\n this.refreshTokenTimeout = setInterval(() => this.refreshToken().subscribe(() => {}), (60 * 10_000));\r\n }\r\n\r\n private stopRefreshTokenTimer() {\r\n if (this.refreshTokenTimeout !== undefined) {\r\n clearInterval(this.refreshTokenTimeout);\r\n }\r\n }\r\n\r\n\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { map, Observable, shareReplay } from 'rxjs';\r\nimport { Chapter } from '../_models/chapter';\r\nimport { CollectionTag } from '../_models/collection-tag';\r\nimport { Device } from '../_models/device/device';\r\nimport { Library } from '../_models/library';\r\nimport { ReadingList } from '../_models/reading-list';\r\nimport { Series } from '../_models/series';\r\nimport { Volume } from '../_models/volume';\r\nimport { AccountService } from './account.service';\r\nimport { DeviceService } from './device.service';\r\n\r\nexport enum Action {\r\n Submenu = -1,\r\n /**\r\n * Mark entity as read\r\n */\r\n MarkAsRead = 0,\r\n /**\r\n * Mark entity as unread\r\n */\r\n MarkAsUnread = 1,\r\n /**\r\n * Invoke a Scan on Series/Library\r\n */\r\n Scan = 2,\r\n /**\r\n * Delete the entity\r\n */\r\n Delete = 3,\r\n /**\r\n * Open edit modal\r\n */\r\n Edit = 4,\r\n /**\r\n * Open details modal\r\n */\r\n Info = 5,\r\n /**\r\n * Invoke a refresh covers\r\n */\r\n RefreshMetadata = 6,\r\n /**\r\n * Download the entity\r\n */\r\n Download = 7,\r\n /**\r\n * Invoke an Analyze Files which calculates word count\r\n */\r\n AnalyzeFiles = 8,\r\n /**\r\n * Read in incognito mode aka no progress tracking\r\n */\r\n IncognitoRead = 9,\r\n /**\r\n * Add to reading list\r\n */\r\n AddToReadingList = 10,\r\n /**\r\n * Add to collection\r\n */\r\n AddToCollection = 11,\r\n /**\r\n * Essentially a download, but handled differently. Needed so card bubbles it up for handling\r\n */\r\n DownloadBookmark = 12,\r\n /**\r\n * Open Series detail page for said series\r\n */\r\n ViewSeries = 13,\r\n /**\r\n * Open the reader for entity\r\n */\r\n Read = 14,\r\n /**\r\n * Add to user's Want to Read List\r\n */\r\n AddToWantToReadList = 15,\r\n /**\r\n * Remove from user's Want to Read List\r\n */\r\n RemoveFromWantToReadList = 16,\r\n /**\r\n * Send to a device\r\n */\r\n SendTo = 17,\r\n /**\r\n * Import some data into Kavita\r\n */\r\n Import = 18,\r\n}\r\n\r\nexport interface ActionItem {\r\n title: string;\r\n action: Action;\r\n callback: (action: ActionItem, data: T) => void;\r\n requiresAdmin: boolean;\r\n children: Array>;\r\n /**\r\n * An optional class which applies to an item. ie) danger on a delete action\r\n */\r\n class?: string;\r\n /**\r\n * Indicates that there exists a separate list will be loaded from an API.\r\n * Rule: If using this, only one child should exist in children with the Action for dynamicList.\r\n */\r\n dynamicList?: Observable<{title: string, data: any}[]> | undefined;\r\n /**\r\n * Extra data that needs to be sent back from the card item. Used mainly for dynamicList. This will be the item from dyanamicList return\r\n */\r\n _extra?: {title: string, data: any};\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ActionFactoryService {\r\n libraryActions: Array> = [];\r\n\r\n seriesActions: Array> = [];\r\n\r\n volumeActions: Array> = [];\r\n\r\n chapterActions: Array> = [];\r\n\r\n collectionTagActions: Array> = [];\r\n\r\n readingListActions: Array> = [];\r\n\r\n bookmarkActions: Array> = [];\r\n\r\n isAdmin = false;\r\n hasDownloadRole = false;\r\n\r\n constructor(private accountService: AccountService, private deviceService: DeviceService) {\r\n this.accountService.currentUser$.subscribe((user) => {\r\n if (user) {\r\n this.isAdmin = this.accountService.hasAdminRole(user);\r\n this.hasDownloadRole = this.accountService.hasDownloadRole(user);\r\n } else {\r\n this._resetActions();\r\n return; // If user is logged out, we don't need to do anything\r\n }\r\n\r\n this._resetActions();\r\n });\r\n }\r\n\r\n getLibraryActions(callback: (action: ActionItem, library: Library) => void) {\r\n\t\treturn this.applyCallbackToList(this.libraryActions, callback);\r\n }\r\n\r\n getSeriesActions(callback: (action: ActionItem, series: Series) => void) {\r\n\t\treturn this.applyCallbackToList(this.seriesActions, callback);\r\n }\r\n\r\n getVolumeActions(callback: (action: ActionItem, volume: Volume) => void) {\r\n\t\treturn this.applyCallbackToList(this.volumeActions, callback);\r\n }\r\n\r\n getChapterActions(callback: (action: ActionItem, chapter: Chapter) => void) {\r\n return this.applyCallbackToList(this.chapterActions, callback);\r\n }\r\n\r\n getCollectionTagActions(callback: (action: ActionItem, collectionTag: CollectionTag) => void) {\r\n\t\treturn this.applyCallbackToList(this.collectionTagActions, callback);\r\n }\r\n\r\n getReadingListActions(callback: (action: ActionItem, readingList: ReadingList) => void) {\r\n return this.applyCallbackToList(this.readingListActions, callback);\r\n }\r\n\r\n getBookmarkActions(callback: (action: ActionItem, series: Series) => void) {\r\n return this.applyCallbackToList(this.bookmarkActions, callback);\r\n }\r\n\r\n dummyCallback(action: ActionItem, data: any) {}\r\n\r\n filterSendToAction(actions: Array>, chapter: Chapter) {\r\n // if (chapter.files.filter(f => f.format === MangaFormat.EPUB || f.format === MangaFormat.PDF).length !== chapter.files.length) {\r\n // // Remove Send To as it doesn't apply\r\n // return actions.filter(item => item.title !== 'Send To');\r\n // }\r\n return actions;\r\n }\r\n\r\n private _resetActions() {\r\n this.libraryActions = [\r\n {\r\n action: Action.Scan,\r\n title: 'Scan Library',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.Submenu,\r\n title: 'Others',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n children: [\r\n {\r\n action: Action.RefreshMetadata,\r\n title: 'Refresh Covers',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n children: [],\r\n },\r\n {\r\n action: Action.AnalyzeFiles,\r\n title: 'Analyze Files',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n children: [],\r\n },\r\n ],\r\n },\r\n {\r\n action: Action.Edit,\r\n title: 'Settings',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n children: [],\r\n },\r\n ];\r\n\r\n this.collectionTagActions = [\r\n {\r\n action: Action.Edit,\r\n title: 'Edit',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n children: [],\r\n },\r\n ];\r\n\r\n this.seriesActions = [\r\n {\r\n action: Action.MarkAsRead,\r\n title: 'Mark as Read',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.MarkAsUnread,\r\n title: 'Mark as Unread',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.Scan,\r\n title: 'Scan Series',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n children: [],\r\n },\r\n {\r\n action: Action.Submenu,\r\n title: 'Add to',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [\r\n \t{\r\n action: Action.AddToWantToReadList,\r\n title: 'Add to Want to Read',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.RemoveFromWantToReadList,\r\n title: 'Remove from Want to Read',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.AddToReadingList,\r\n title: 'Add to Reading List',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.AddToCollection,\r\n title: 'Add to Collection',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n children: [],\r\n },\r\n ],\r\n },\r\n {\r\n action: Action.Submenu,\r\n title: 'Send To',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [\r\n {\r\n action: Action.SendTo,\r\n title: '',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n dynamicList: this.deviceService.devices$.pipe(map((devices: Array) => devices.map(d => {\r\n return {'title': d.name, 'data': d};\r\n }), shareReplay())),\r\n children: []\r\n }\r\n ],\r\n },\r\n {\r\n action: Action.Submenu,\r\n title: 'Others',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n children: [\r\n {\r\n action: Action.RefreshMetadata,\r\n title: 'Refresh Covers',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n children: [],\r\n },\r\n {\r\n action: Action.AnalyzeFiles,\r\n title: 'Analyze Files',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n children: [],\r\n },\r\n {\r\n action: Action.Delete,\r\n title: 'Delete',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n class: 'danger',\r\n children: [],\r\n },\r\n ],\r\n },\r\n {\r\n action: Action.Download,\r\n title: 'Download',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.Edit,\r\n title: 'Edit',\r\n callback: this.dummyCallback,\r\n requiresAdmin: true,\r\n children: [],\r\n },\r\n ];\r\n\r\n this.volumeActions = [\r\n {\r\n action: Action.IncognitoRead,\r\n title: 'Read Incognito',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.MarkAsRead,\r\n title: 'Mark as Read',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.MarkAsUnread,\r\n title: 'Mark as Unread',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n\t\t\t{\r\n\t\t\t\taction: Action.Submenu,\r\n\t\t\t\ttitle: 'Add to',\r\n\t\t\t\tcallback: this.dummyCallback,\r\n\t\t\t\trequiresAdmin: false,\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\taction: Action.AddToReadingList,\r\n\t\t\t\t\t\ttitle: 'Add to Reading List',\r\n\t\t\t\t\t\tcallback: this.dummyCallback,\r\n\t\t\t\t\t\trequiresAdmin: false,\r\n\t\t\t\t\t\tchildren: [],\r\n\t\t\t\t\t}\r\n\t\t\t\t]\r\n\t\t\t},\r\n {\r\n action: Action.Submenu,\r\n title: 'Send To',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [\r\n {\r\n action: Action.SendTo,\r\n title: '',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n dynamicList: this.deviceService.devices$.pipe(map((devices: Array) => devices.map(d => {\r\n return {'title': d.name, 'data': d};\r\n }), shareReplay())),\r\n children: []\r\n }\r\n ],\r\n },\r\n {\r\n action: Action.Download,\r\n title: 'Download',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.Edit,\r\n title: 'Details',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n ];\r\n\r\n this.chapterActions = [\r\n {\r\n action: Action.IncognitoRead,\r\n title: 'Read Incognito',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.MarkAsRead,\r\n title: 'Mark as Read',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.MarkAsUnread,\r\n title: 'Mark as Unread',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n\t\t\t{\r\n\t\t\t\taction: Action.Submenu,\r\n\t\t\t\ttitle: 'Add to',\r\n\t\t\t\tcallback: this.dummyCallback,\r\n\t\t\t\trequiresAdmin: false,\r\n\t\t\t\tchildren: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\taction: Action.AddToReadingList,\r\n\t\t\t\t\t\ttitle: 'Add to Reading List',\r\n\t\t\t\t\t\tcallback: this.dummyCallback,\r\n\t\t\t\t\t\trequiresAdmin: false,\r\n\t\t\t\t\t\tchildren: [],\r\n\t\t\t\t\t}\r\n\t\t\t\t]\r\n\t\t\t},\r\n {\r\n action: Action.Submenu,\r\n title: 'Send To',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [\r\n {\r\n action: Action.SendTo,\r\n title: '',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n dynamicList: this.deviceService.devices$.pipe(map((devices: Array) => devices.map(d => {\r\n return {'title': d.name, 'data': d};\r\n }), shareReplay())),\r\n children: []\r\n }\r\n ],\r\n },\r\n // RBS will handle rendering this, so non-admins with download are appicable\r\n {\r\n action: Action.Download,\r\n title: 'Download',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.Edit,\r\n title: 'Details',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n ];\r\n\r\n this.readingListActions = [\r\n {\r\n action: Action.Edit,\r\n title: 'Edit',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.Delete,\r\n title: 'Delete',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n class: 'danger',\r\n children: [],\r\n },\r\n ];\r\n\r\n this.bookmarkActions = [\r\n {\r\n action: Action.ViewSeries,\r\n title: 'View Series',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.DownloadBookmark,\r\n title: 'Download',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.Delete,\r\n title: 'Clear',\r\n callback: this.dummyCallback,\r\n class: 'danger',\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n ];\r\n }\r\n\r\n private applyCallback(action: ActionItem, callback: (action: ActionItem, data: any) => void) {\r\n action.callback = callback;\r\n\r\n if (action.children === null || action.children?.length === 0) return;\r\n\r\n action.children?.forEach((childAction) => {\r\n this.applyCallback(childAction, callback);\r\n });\r\n }\r\n\r\n\tpublic applyCallbackToList(list: Array>, callback: (action: ActionItem, data: any) => void): Array> {\r\n\t\tconst actions = list.map((a) => {\r\n\t\t\treturn { ...a };\r\n\t\t});\r\n\t\tactions.forEach((action) => this.applyCallback(action, callback));\r\n\t\treturn actions;\r\n\t}\r\n\r\n // Checks the whole tree for the action and returns true if it exists\r\n public hasAction(actions: Array>, action: Action) {\r\n var actionFound = false;\r\n\r\n if (actions.length === 0) return actionFound;\r\n\r\n for (let i = 0; i < actions.length; i++)\r\n {\r\n if (actions[i].action === action) return true;\r\n if (this.hasAction(actions[i].children, action)) return true;\r\n }\r\n\r\n\r\n return actionFound;\r\n }\r\n\r\n}\r\n","\r\n
\r\n

Add to Collection

\r\n \r\n
\r\n
\r\n
\r\n
= 5\">\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
    \r\n
  • \r\n {{collectionTag.title}} \r\n
  • \r\n
  • No collections created yet
  • \r\n
  • \r\n
    \r\n Loading...\r\n
    \r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n","import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { FormGroup, FormControl } from '@angular/forms';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { CollectionTag } from 'src/app/_models/collection-tag';\r\nimport { ReadingList } from 'src/app/_models/reading-list';\r\nimport { CollectionTagService } from 'src/app/_services/collection-tag.service';\r\n\r\n@Component({\r\n selector: 'app-bulk-add-to-collection',\r\n templateUrl: './bulk-add-to-collection.component.html',\r\n encapsulation: ViewEncapsulation.None, // This is needed as per the bootstrap modal documentation to get styles to work.\r\n styleUrls: ['./bulk-add-to-collection.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class BulkAddToCollectionComponent implements OnInit, AfterViewInit {\r\n\r\n @Input({required: true}) title!: string;\r\n /**\r\n * Series Ids to add to Collection Tag\r\n */\r\n @Input() seriesIds: Array = [];\r\n\r\n /**\r\n * All existing collections sorted by recent use date\r\n */\r\n lists: Array = [];\r\n loading: boolean = false;\r\n listForm: FormGroup = new FormGroup({});\r\n\r\n collectionTitleTrackby = (index: number, item: CollectionTag) => `${item.title}`;\r\n\r\n @ViewChild('title') inputElem!: ElementRef;\r\n\r\n\r\n constructor(private modal: NgbActiveModal, private collectionService: CollectionTagService,\r\n private toastr: ToastrService, private readonly cdRef: ChangeDetectorRef) { }\r\n\r\n ngOnInit(): void {\r\n\r\n this.listForm.addControl('title', new FormControl(this.title, []));\r\n this.listForm.addControl('filterQuery', new FormControl('', []));\r\n\r\n this.loading = true;\r\n this.cdRef.markForCheck();\r\n this.collectionService.allTags().subscribe(tags => {\r\n this.lists = tags;\r\n this.loading = false;\r\n this.cdRef.markForCheck();\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n // Shift focus to input\r\n if (this.inputElem) {\r\n this.inputElem.nativeElement.select();\r\n this.cdRef.markForCheck();\r\n }\r\n }\r\n\r\n close() {\r\n this.modal.close();\r\n }\r\n\r\n create() {\r\n const tagName = this.listForm.value.title;\r\n this.collectionService.addByMultiple(0, this.seriesIds, tagName).subscribe(() => {\r\n this.toastr.success('Series added to ' + tagName + ' collection');\r\n this.modal.close();\r\n });\r\n }\r\n\r\n addToCollection(tag: CollectionTag) {\r\n if (this.seriesIds.length === 0) return;\r\n\r\n this.collectionService.addByMultiple(tag.id, this.seriesIds, '').subscribe(() => {\r\n this.toastr.success('Series added to ' + tag.title + ' collection');\r\n this.modal.close();\r\n });\r\n\r\n }\r\n\r\n filterList = (listItem: ReadingList) => {\r\n return listItem.title.toLowerCase().indexOf((this.listForm.value.filterQuery || '').toLowerCase()) >= 0;\r\n }\r\n\r\n}\r\n","\r\n
\r\n

Add to Reading List

\r\n \r\n
\r\n
\r\n
\r\n
= 5\">\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
    \r\n
  • \r\n {{readingList.title}} \r\n
  • \r\n
  • No lists created yet
  • \r\n
  • \r\n
    \r\n Loading...\r\n
    \r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n","import { AfterViewInit, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { ReadingList } from 'src/app/_models/reading-list';\r\nimport { ReadingListService } from 'src/app/_services/reading-list.service';\r\n\r\nexport enum ADD_FLOW {\r\n Series = 0,\r\n Volume = 1,\r\n Chapter = 2,\r\n Multiple = 3,\r\n Multiple_Series\r\n}\r\n\r\n@Component({\r\n selector: 'app-add-to-list-modal',\r\n templateUrl: './add-to-list-modal.component.html',\r\n styleUrls: ['./add-to-list-modal.component.scss']\r\n})\r\nexport class AddToListModalComponent implements OnInit, AfterViewInit {\r\n\r\n @Input({required: true}) title!: string;\r\n /**\r\n * Only used in Series flow\r\n */\r\n @Input() seriesId?: number;\r\n /**\r\n * Only used in Volume flow\r\n */\r\n @Input() volumeId?: number;\r\n /**\r\n * Only used in Chapter flow\r\n */\r\n @Input() chapterId?: number;\r\n /**\r\n * Only used in Multiple flow\r\n */\r\n @Input() volumeIds?: Array;\r\n /**\r\n * Only used in Multiple flow\r\n */\r\n @Input() chapterIds?: Array;\r\n /**\r\n * Only used in Multiple_Series flow\r\n */\r\n @Input() seriesIds?: Array;\r\n\r\n /**\r\n * Determines which Input is required and which API is used to associate to the Reading List\r\n */\r\n @Input({required: true}) type!: ADD_FLOW;\r\n\r\n /**\r\n * All existing reading lists sorted by recent use date\r\n */\r\n lists: Array = [];\r\n loading: boolean = false;\r\n listForm: FormGroup = new FormGroup({});\r\n\r\n @ViewChild('title') inputElem!: ElementRef;\r\n\r\n filterList = (listItem: ReadingList) => {\r\n return listItem.title.toLowerCase().indexOf((this.listForm.value.filterQuery || '').toLowerCase()) >= 0;\r\n }\r\n\r\n\r\n constructor(private modal: NgbActiveModal, private readingListService: ReadingListService, private toastr: ToastrService) { }\r\n\r\n ngOnInit(): void {\r\n\r\n this.listForm.addControl('title', new FormControl(this.title, []));\r\n this.listForm.addControl('filterQuery', new FormControl('', []));\r\n\r\n this.loading = true;\r\n this.readingListService.getReadingLists(false, true).subscribe(lists => {\r\n this.lists = lists.result;\r\n this.loading = false;\r\n });\r\n\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n // Shift focus to input\r\n if (this.inputElem) {\r\n this.inputElem.nativeElement.select();\r\n }\r\n }\r\n\r\n close() {\r\n this.modal.close();\r\n }\r\n\r\n create() {\r\n this.readingListService.createList(this.listForm.value.title).subscribe(list => {\r\n this.addToList(list);\r\n });\r\n }\r\n\r\n addToList(readingList: ReadingList) {\r\n\r\n if (this.type === ADD_FLOW.Multiple_Series && this.seriesIds !== undefined) {\r\n this.readingListService.updateByMultipleSeries(readingList.id, this.seriesIds).subscribe(() => {\r\n this.toastr.success('Series added to reading list');\r\n this.modal.close();\r\n });\r\n }\r\n\r\n if (this.seriesId === undefined) return;\r\n\r\n if (this.type === ADD_FLOW.Series && this.seriesId !== undefined) {\r\n this.readingListService.updateBySeries(readingList.id, this.seriesId).subscribe(() => {\r\n this.toastr.success('Series added to reading list');\r\n this.modal.close();\r\n });\r\n } else if (this.type === ADD_FLOW.Volume && this.volumeId !== undefined) {\r\n this.readingListService.updateByVolume(readingList.id, this.seriesId, this.volumeId).subscribe(() => {\r\n this.toastr.success('Volumes added to reading list');\r\n this.modal.close();\r\n });\r\n } else if (this.type === ADD_FLOW.Chapter && this.chapterId !== undefined) {\r\n this.readingListService.updateByChapter(readingList.id, this.seriesId, this.chapterId).subscribe(() => {\r\n this.toastr.success('Chapter added to reading list');\r\n this.modal.close();\r\n });\r\n } else if (this.type === ADD_FLOW.Multiple && this.volumeIds !== undefined && this.chapterIds !== undefined) {\r\n this.readingListService.updateByMultiple(readingList.id, this.seriesId, this.volumeIds, this.chapterIds).subscribe(() => {\r\n this.toastr.success('Chapters and Volumes added to reading list');\r\n this.modal.close();\r\n });\r\n }\r\n\r\n }\r\n}\r\n","\r\n
\r\n

Edit Reading List: {{readingList.title}}

\r\n \r\n
\r\n
\r\n
    \r\n
  • \r\n {{TabID.General}}\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n This field is required\r\n
    \r\n
    \r\n Name must be unique\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n Promotion means that the tag can be seen server-wide, not just for admin users. All series that have this tag will still have user-access restrictions placed on them.\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    Starting
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n Must be between 1 and 12 or blank\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n Must be greater than 1000, 0 or blank\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    Ending
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n Must be between 1 and 12 or blank\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n Must be greater than 1000, 0 or blank\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
  • \r\n
  • \r\n {{TabID.CoverImage}}\r\n \r\n \r\n \r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n OnInit\r\n} from '@angular/core';\r\nimport { FormGroup, FormControl, Validators } from '@angular/forms';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { debounceTime, distinctUntilChanged, forkJoin, Subject, switchMap, takeUntil, tap } from 'rxjs';\r\nimport { Breakpoint, UtilityService } from 'src/app/shared/_services/utility.service';\r\nimport { ReadingList } from 'src/app/_models/reading-list';\r\nimport { AccountService } from 'src/app/_services/account.service';\r\nimport { ImageService } from 'src/app/_services/image.service';\r\nimport { ReadingListService } from 'src/app/_services/reading-list.service';\r\nimport { UploadService } from 'src/app/_services/upload.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\nenum TabID {\r\n General = 'General',\r\n CoverImage = 'Cover Image'\r\n}\r\n\r\n@Component({\r\n selector: 'app-edit-reading-list-modal',\r\n templateUrl: './edit-reading-list-modal.component.html',\r\n styleUrls: ['./edit-reading-list-modal.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class EditReadingListModalComponent implements OnInit {\r\n\r\n @Input({required: true}) readingList!: ReadingList;\r\n private readonly destroyRef = inject(DestroyRef);\r\n reviewGroup!: FormGroup;\r\n\r\n coverImageIndex: number = 0;\r\n /**\r\n * Url of the selected cover\r\n */\r\n selectedCover: string = '';\r\n coverImageLocked: boolean = false;\r\n imageUrls: Array = [];\r\n active = TabID.General;\r\n\r\n get Breakpoint() { return Breakpoint; }\r\n get TabID() { return TabID; }\r\n\r\n constructor(private ngModal: NgbActiveModal, private readingListService: ReadingListService,\r\n public utilityService: UtilityService, private uploadService: UploadService, private toastr: ToastrService,\r\n private imageService: ImageService, private readonly cdRef: ChangeDetectorRef, public accountService: AccountService) { }\r\n\r\n ngOnInit(): void {\r\n this.reviewGroup = new FormGroup({\r\n title: new FormControl(this.readingList.title, { nonNullable: true, validators: [Validators.required] }),\r\n summary: new FormControl(this.readingList.summary, { nonNullable: true, validators: [] }),\r\n promoted: new FormControl(this.readingList.promoted, { nonNullable: true, validators: [] }),\r\n startingMonth: new FormControl(this.readingList.startingMonth, { nonNullable: true, validators: [Validators.min(1), Validators.max(12)] }),\r\n startingYear: new FormControl(this.readingList.startingYear, { nonNullable: true, validators: [Validators.min(1000)] }),\r\n endingMonth: new FormControl(this.readingList.endingMonth, { nonNullable: true, validators: [Validators.min(1), Validators.max(12)] }),\r\n endingYear: new FormControl(this.readingList.endingYear, { nonNullable: true, validators: [Validators.min(1000)] }),\r\n });\r\n\r\n this.coverImageLocked = this.readingList.coverImageLocked;\r\n\r\n this.reviewGroup.get('title')?.valueChanges.pipe(\r\n debounceTime(100),\r\n distinctUntilChanged(),\r\n switchMap(name => this.readingListService.nameExists(name)),\r\n tap(exists => {\r\n const isExistingName = this.reviewGroup.get('title')?.value === this.readingList.title;\r\n if (!exists || isExistingName) {\r\n this.reviewGroup.get('title')?.setErrors(null);\r\n } else {\r\n this.reviewGroup.get('title')?.setErrors({duplicateName: true})\r\n }\r\n this.cdRef.markForCheck();\r\n }),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe();\r\n\r\n this.imageUrls.push(this.imageService.randomize(this.imageService.getReadingListCoverImage(this.readingList.id)));\r\n if (!this.readingList.items || this.readingList.items.length === 0) {\r\n this.readingListService.getListItems(this.readingList.id).subscribe(items => {\r\n this.imageUrls.push(...(items).map(rli => this.imageService.getChapterCoverImage(rli.chapterId)));\r\n });\r\n } else {\r\n this.imageUrls.push(...(this.readingList.items).map(rli => this.imageService.getChapterCoverImage(rli.chapterId)));\r\n }\r\n }\r\n\r\n close() {\r\n this.ngModal.dismiss(undefined);\r\n }\r\n\r\n save() {\r\n if (this.reviewGroup.value.title.trim() === '') return;\r\n\r\n const model = {...this.reviewGroup.value, readingListId: this.readingList.id, coverImageLocked: this.coverImageLocked};\r\n model.startingMonth = model.startingMonth || 0;\r\n model.startingYear = model.startingYear || 0;\r\n model.endingMonth = model.endingMonth || 0;\r\n model.endingYear = model.endingYear || 0;\r\n const apis = [this.readingListService.update(model)];\r\n\r\n if (this.selectedCover !== '') {\r\n apis.push(this.uploadService.updateReadingListCoverImage(this.readingList.id, this.selectedCover))\r\n }\r\n\r\n forkJoin(apis).subscribe(results => {\r\n this.readingList.title = model.title;\r\n this.readingList.summary = model.summary;\r\n this.readingList.coverImageLocked = this.coverImageLocked;\r\n this.readingList.promoted = model.promoted;\r\n this.ngModal.close(this.readingList);\r\n this.toastr.success('Reading List updated');\r\n });\r\n }\r\n\r\n updateSelectedIndex(index: number) {\r\n this.coverImageIndex = index;\r\n console.log(this.coverImageIndex)\r\n this.cdRef.detectChanges();\r\n }\r\n\r\n updateSelectedImage(url: string) {\r\n this.selectedCover = url;\r\n }\r\n\r\n handleReset() {\r\n this.coverImageLocked = false;\r\n }\r\n\r\n}\r\n","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { Subject } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\nimport { BulkAddToCollectionComponent } from '../cards/_modals/bulk-add-to-collection/bulk-add-to-collection.component';\r\nimport { AddToListModalComponent, ADD_FLOW } from '../reading-list/_modals/add-to-list-modal/add-to-list-modal.component';\r\nimport { EditReadingListModalComponent } from '../reading-list/_modals/edit-reading-list-modal/edit-reading-list-modal.component';\r\nimport { ConfirmService } from '../shared/confirm.service';\r\nimport { LibrarySettingsModalComponent } from '../sidenav/_modals/library-settings-modal/library-settings-modal.component';\r\nimport { Chapter } from '../_models/chapter';\r\nimport { Device } from '../_models/device/device';\r\nimport { Library } from '../_models/library';\r\nimport { ReadingList } from '../_models/reading-list';\r\nimport { Series } from '../_models/series';\r\nimport { Volume } from '../_models/volume';\r\nimport { DeviceService } from './device.service';\r\nimport { LibraryService } from './library.service';\r\nimport { MemberService } from './member.service';\r\nimport { ReaderService } from './reader.service';\r\nimport { SeriesService } from './series.service';\r\n\r\nexport type LibraryActionCallback = (library: Partial) => void;\r\nexport type SeriesActionCallback = (series: Series) => void;\r\nexport type VolumeActionCallback = (volume: Volume) => void;\r\nexport type ChapterActionCallback = (chapter: Chapter) => void;\r\nexport type ReadingListActionCallback = (readingList: ReadingList) => void;\r\nexport type VoidActionCallback = () => void;\r\nexport type BooleanActionCallback = (result: boolean) => void;\r\n\r\n/**\r\n * Responsible for executing actions\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ActionService implements OnDestroy {\r\n\r\n private readonly onDestroy = new Subject();\r\n private readingListModalRef: NgbModalRef | null = null;\r\n private collectionModalRef: NgbModalRef | null = null;\r\n\r\n constructor(private libraryService: LibraryService, private seriesService: SeriesService, \r\n private readerService: ReaderService, private toastr: ToastrService, private modalService: NgbModal,\r\n private confirmService: ConfirmService, private memberService: MemberService, private deviceSerivce: DeviceService) { }\r\n\r\n ngOnDestroy() {\r\n this.onDestroy.next();\r\n this.onDestroy.complete();\r\n }\r\n\r\n /**\r\n * Request a file scan for a given Library\r\n * @param library Partial Library, must have id and name populated\r\n * @param callback Optional callback to perform actions after API completes\r\n * @returns \r\n */\r\n async scanLibrary(library: Partial, callback?: LibraryActionCallback) {\r\n if (!library.hasOwnProperty('id') || library.id === undefined) {\r\n return;\r\n }\r\n\r\n // Prompt user if we should do a force or not\r\n const force = false; // await this.promptIfForce();\r\n\r\n this.libraryService.scan(library.id, force).pipe(take(1)).subscribe((res: any) => {\r\n this.toastr.info('Scan queued for ' + library.name);\r\n if (callback) {\r\n callback(library);\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Request a refresh of Metadata for a given Library\r\n * @param library Partial Library, must have id and name populated\r\n * @param callback Optional callback to perform actions after API completes\r\n * @returns \r\n */\r\n async refreshMetadata(library: Partial, callback?: LibraryActionCallback) {\r\n if (!library.hasOwnProperty('id') || library.id === undefined) {\r\n return;\r\n }\r\n\r\n if (!await this.confirmService.confirm('Refresh covers will force all cover images to be recalculated. This is a heavy operation. Are you sure you don\\'t want to perform a Scan instead?')) {\r\n if (callback) {\r\n callback(library);\r\n }\r\n return;\r\n }\r\n\r\n const forceUpdate = true; //await this.promptIfForce();\r\n\r\n this.libraryService.refreshMetadata(library?.id, forceUpdate).pipe(take(1)).subscribe((res: any) => {\r\n this.toastr.info('Scan queued for ' + library.name);\r\n if (callback) {\r\n callback(library);\r\n }\r\n });\r\n }\r\n\r\n editLibrary(library: Partial, callback?: LibraryActionCallback) {\r\n const modalRef = this.modalService.open(LibrarySettingsModalComponent, { size: 'xl' });\r\n modalRef.componentInstance.library = library;\r\n modalRef.closed.subscribe((closeResult: {success: boolean, library: Library, coverImageUpdate: boolean}) => {\r\n if (callback) callback(library)\r\n });\r\n }\r\n\r\n /**\r\n * Request an analysis of files for a given Library (currently just word count)\r\n * @param library Partial Library, must have id and name populated\r\n * @param callback Optional callback to perform actions after API completes\r\n * @returns \r\n */\r\n async analyzeFiles(library: Partial, callback?: LibraryActionCallback) {\r\n if (!library.hasOwnProperty('id') || library.id === undefined) {\r\n return;\r\n }\r\n\r\n if (!await this.confirmService.alert('This is a long running process. Please give it the time to complete before invoking again.')) {\r\n if (callback) {\r\n callback(library);\r\n }\r\n return;\r\n }\r\n\r\n this.libraryService.analyze(library?.id).pipe(take(1)).subscribe((res: any) => {\r\n this.toastr.info('Library file analysis queued for ' + library.name);\r\n if (callback) {\r\n callback(library);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark a series as read; updates the series pagesRead\r\n * @param series Series, must have id and name populated\r\n * @param callback Optional callback to perform actions after API completes\r\n */\r\n markSeriesAsRead(series: Series, callback?: SeriesActionCallback) {\r\n this.seriesService.markRead(series.id).pipe(take(1)).subscribe(res => {\r\n series.pagesRead = series.pages;\r\n this.toastr.success(series.name + ' is now read');\r\n if (callback) {\r\n callback(series);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark a series as unread; updates the series pagesRead\r\n * @param series Series, must have id and name populated\r\n * @param callback Optional callback to perform actions after API completes\r\n */\r\n markSeriesAsUnread(series: Series, callback?: SeriesActionCallback) {\r\n this.seriesService.markUnread(series.id).pipe(take(1)).subscribe(res => {\r\n series.pagesRead = 0;\r\n this.toastr.success(series.name + ' is now unread');\r\n if (callback) {\r\n callback(series);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Start a file scan for a Series\r\n * @param series Series, must have libraryId and name populated\r\n * @param callback Optional callback to perform actions after API completes\r\n */\r\n async scanSeries(series: Series, callback?: SeriesActionCallback) {\r\n this.seriesService.scan(series.libraryId, series.id).pipe(take(1)).subscribe((res: any) => {\r\n this.toastr.info('Scan queued for ' + series.name);\r\n if (callback) {\r\n callback(series);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Start a file scan for analyze files for a Series\r\n * @param series Series, must have libraryId and name populated\r\n * @param callback Optional callback to perform actions after API completes\r\n */\r\n analyzeFilesForSeries(series: Series, callback?: SeriesActionCallback) {\r\n this.seriesService.analyzeFiles(series.libraryId, series.id).pipe(take(1)).subscribe((res: any) => {\r\n this.toastr.info('Scan queued for ' + series.name);\r\n if (callback) {\r\n callback(series);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Start a metadata refresh for a Series\r\n * @param series Series, must have libraryId, id and name populated\r\n * @param callback Optional callback to perform actions after API completes\r\n */\r\n async refreshMetdata(series: Series, callback?: SeriesActionCallback) {\r\n if (!await this.confirmService.confirm('Refresh covers will force all cover images and metadata to be recalculated. This is a heavy operation. Are you sure you don\\'t want to perform a Scan instead?')) {\r\n if (callback) {\r\n callback(series);\r\n }\r\n return;\r\n }\r\n\r\n this.seriesService.refreshMetadata(series).pipe(take(1)).subscribe((res: any) => {\r\n this.toastr.info('Refresh covers queued for ' + series.name);\r\n if (callback) {\r\n callback(series);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark all chapters and the volume as Read\r\n * @param seriesId Series Id\r\n * @param volume Volume, should have id, chapters and pagesRead populated\r\n * @param callback Optional callback to perform actions after API completes\r\n */\r\n markVolumeAsRead(seriesId: number, volume: Volume, callback?: VolumeActionCallback) {\r\n this.readerService.markVolumeRead(seriesId, volume.id).pipe(take(1)).subscribe(() => {\r\n volume.pagesRead = volume.pages;\r\n volume.chapters?.forEach(c => c.pagesRead = c.pages);\r\n this.toastr.success('Marked as Read');\r\n\r\n if (callback) {\r\n callback(volume);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark all chapters and the volume as unread\r\n * @param seriesId Series Id\r\n * @param volume Volume, should have id, chapters and pagesRead populated\r\n * @param callback Optional callback to perform actions after API completes\r\n */\r\n markVolumeAsUnread(seriesId: number, volume: Volume, callback?: VolumeActionCallback) {\r\n this.readerService.markVolumeUnread(seriesId, volume.id).subscribe(() => {\r\n volume.pagesRead = 0;\r\n volume.chapters?.forEach(c => c.pagesRead = 0);\r\n this.toastr.success('Marked as Unread');\r\n if (callback) {\r\n callback(volume);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark a chapter as read\r\n * @param seriesId Series Id\r\n * @param chapter Chapter, should have id, pages, volumeId populated\r\n * @param callback Optional callback to perform actions after API completes\r\n */\r\n markChapterAsRead(libraryId: number, seriesId: number, chapter: Chapter, callback?: ChapterActionCallback) {\r\n this.readerService.saveProgress(libraryId, seriesId, chapter.volumeId, chapter.id, chapter.pages).pipe(take(1)).subscribe(results => {\r\n chapter.pagesRead = chapter.pages;\r\n this.toastr.success('Marked as Read');\r\n if (callback) {\r\n callback(chapter);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark a chapter as unread\r\n * @param seriesId Series Id\r\n * @param chapter Chapter, should have id, pages, volumeId populated\r\n * @param callback Optional callback to perform actions after API completes\r\n */\r\n markChapterAsUnread(libraryId: number, seriesId: number, chapter: Chapter, callback?: ChapterActionCallback) {\r\n this.readerService.saveProgress(libraryId, seriesId, chapter.volumeId, chapter.id, 0).pipe(take(1)).subscribe(results => {\r\n chapter.pagesRead = 0;\r\n this.toastr.success('Marked as Unread');\r\n if (callback) {\r\n callback(chapter);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark all chapters and the volumes as Read. All volumes and chapters must belong to a series\r\n * @param seriesId Series Id\r\n * @param volumes Volumes, should have id, chapters and pagesRead populated\r\n * @param chapters? Chapters, should have id\r\n * @param callback Optional callback to perform actions after API completes \r\n */\r\n markMultipleAsRead(seriesId: number, volumes: Array, chapters?: Array, callback?: VoidActionCallback) {\r\n this.readerService.markMultipleRead(seriesId, volumes.map(v => v.id), chapters?.map(c => c.id)).pipe(take(1)).subscribe(() => {\r\n volumes.forEach(volume => {\r\n volume.pagesRead = volume.pages;\r\n volume.chapters?.forEach(c => c.pagesRead = c.pages);\r\n });\r\n chapters?.forEach(c => c.pagesRead = c.pages);\r\n this.toastr.success('Marked as Read');\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark all chapters and the volumes as Unread. All volumes must belong to a series\r\n * @param seriesId Series Id\r\n * @param volumes Volumes, should have id, chapters and pagesRead populated\r\n * @param callback Optional callback to perform actions after API completes \r\n */\r\n markMultipleAsUnread(seriesId: number, volumes: Array, chapters?: Array, callback?: VoidActionCallback) {\r\n this.readerService.markMultipleUnread(seriesId, volumes.map(v => v.id), chapters?.map(c => c.id)).pipe(take(1)).subscribe(() => {\r\n volumes.forEach(volume => {\r\n volume.pagesRead = 0;\r\n volume.chapters?.forEach(c => c.pagesRead = 0);\r\n });\r\n chapters?.forEach(c => c.pagesRead = 0);\r\n this.toastr.success('Marked as Unread');\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark all series as Read.\r\n * @param series Series, should have id, pagesRead populated\r\n * @param callback Optional callback to perform actions after API completes \r\n */\r\n markMultipleSeriesAsRead(series: Array, callback?: VoidActionCallback) {\r\n this.readerService.markMultipleSeriesRead(series.map(v => v.id)).pipe(take(1)).subscribe(() => {\r\n series.forEach(s => {\r\n s.pagesRead = s.pages;\r\n });\r\n this.toastr.success('Marked as Read');\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark all series as Unread. \r\n * @param series Series, should have id, pagesRead populated\r\n * @param callback Optional callback to perform actions after API completes \r\n */\r\n markMultipleSeriesAsUnread(series: Array, callback?: VoidActionCallback) {\r\n this.readerService.markMultipleSeriesUnread(series.map(v => v.id)).pipe(take(1)).subscribe(() => {\r\n series.forEach(s => {\r\n s.pagesRead = s.pages;\r\n });\r\n this.toastr.success('Marked as Unread');\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n addMultipleToReadingList(seriesId: number, volumes: Array, chapters?: Array, callback?: BooleanActionCallback) {\r\n if (this.readingListModalRef != null) { return; }\r\n this.readingListModalRef = this.modalService.open(AddToListModalComponent, { scrollable: true, size: 'md' });\r\n this.readingListModalRef.componentInstance.seriesId = seriesId;\r\n this.readingListModalRef.componentInstance.volumeIds = volumes.map(v => v.id);\r\n this.readingListModalRef.componentInstance.chapterIds = chapters?.map(c => c.id);\r\n this.readingListModalRef.componentInstance.title = 'Multiple Selections';\r\n this.readingListModalRef.componentInstance.type = ADD_FLOW.Multiple;\r\n\r\n\r\n this.readingListModalRef.closed.pipe(take(1)).subscribe(() => {\r\n this.readingListModalRef = null;\r\n if (callback) {\r\n callback(true);\r\n }\r\n });\r\n this.readingListModalRef.dismissed.pipe(take(1)).subscribe(() => {\r\n this.readingListModalRef = null;\r\n if (callback) {\r\n callback(false);\r\n }\r\n });\r\n }\r\n\r\n addMultipleSeriesToWantToReadList(seriesIds: Array, callback?: VoidActionCallback) {\r\n this.memberService.addSeriesToWantToRead(seriesIds).subscribe(() => {\r\n this.toastr.success('Series added to Want to Read list');\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n removeMultipleSeriesFromWantToReadList(seriesIds: Array, callback?: VoidActionCallback) {\r\n this.memberService.removeSeriesToWantToRead(seriesIds).subscribe(() => {\r\n this.toastr.success('Series removed from Want to Read list');\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n addMultipleSeriesToReadingList(series: Array, callback?: BooleanActionCallback) {\r\n if (this.readingListModalRef != null) { return; }\r\n this.readingListModalRef = this.modalService.open(AddToListModalComponent, { scrollable: true, size: 'md' });\r\n this.readingListModalRef.componentInstance.seriesIds = series.map(v => v.id);\r\n this.readingListModalRef.componentInstance.title = 'Multiple Selections';\r\n this.readingListModalRef.componentInstance.type = ADD_FLOW.Multiple_Series;\r\n\r\n\r\n this.readingListModalRef.closed.pipe(take(1)).subscribe(() => {\r\n this.readingListModalRef = null;\r\n if (callback) {\r\n callback(true);\r\n }\r\n });\r\n this.readingListModalRef.dismissed.pipe(take(1)).subscribe(() => {\r\n this.readingListModalRef = null;\r\n if (callback) {\r\n callback(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Adds a set of series to a collection tag\r\n * @param series \r\n * @param callback \r\n * @returns \r\n */\r\n addMultipleSeriesToCollectionTag(series: Array, callback?: BooleanActionCallback) {\r\n if (this.collectionModalRef != null) { return; }\r\n this.collectionModalRef = this.modalService.open(BulkAddToCollectionComponent, { scrollable: true, size: 'md', windowClass: 'collection' });\r\n this.collectionModalRef.componentInstance.seriesIds = series.map(v => v.id);\r\n this.collectionModalRef.componentInstance.title = 'New Collection';\r\n\r\n this.collectionModalRef.closed.pipe(take(1)).subscribe(() => {\r\n this.collectionModalRef = null;\r\n if (callback) {\r\n callback(true);\r\n }\r\n });\r\n this.collectionModalRef.dismissed.pipe(take(1)).subscribe(() => {\r\n this.collectionModalRef = null;\r\n if (callback) {\r\n callback(false);\r\n }\r\n });\r\n }\r\n\r\n addSeriesToReadingList(series: Series, callback?: SeriesActionCallback) {\r\n if (this.readingListModalRef != null) { return; }\r\n this.readingListModalRef = this.modalService.open(AddToListModalComponent, { scrollable: true, size: 'md' });\r\n this.readingListModalRef.componentInstance.seriesId = series.id; \r\n this.readingListModalRef.componentInstance.title = series.name;\r\n this.readingListModalRef.componentInstance.type = ADD_FLOW.Series;\r\n\r\n\r\n this.readingListModalRef.closed.pipe(take(1)).subscribe(() => {\r\n this.readingListModalRef = null;\r\n if (callback) {\r\n callback(series);\r\n }\r\n });\r\n this.readingListModalRef.dismissed.pipe(take(1)).subscribe(() => {\r\n this.readingListModalRef = null;\r\n if (callback) {\r\n callback(series);\r\n }\r\n });\r\n }\r\n\r\n addVolumeToReadingList(volume: Volume, seriesId: number, callback?: VolumeActionCallback) {\r\n if (this.readingListModalRef != null) { return; }\r\n this.readingListModalRef = this.modalService.open(AddToListModalComponent, { scrollable: true, size: 'md' });\r\n this.readingListModalRef.componentInstance.seriesId = seriesId; \r\n this.readingListModalRef.componentInstance.volumeId = volume.id;\r\n this.readingListModalRef.componentInstance.type = ADD_FLOW.Volume;\r\n\r\n\r\n this.readingListModalRef.closed.pipe(take(1)).subscribe(() => {\r\n this.readingListModalRef = null;\r\n if (callback) {\r\n callback(volume);\r\n }\r\n });\r\n this.readingListModalRef.dismissed.pipe(take(1)).subscribe(() => {\r\n this.readingListModalRef = null;\r\n if (callback) {\r\n callback(volume);\r\n }\r\n });\r\n }\r\n\r\n addChapterToReadingList(chapter: Chapter, seriesId: number, callback?: ChapterActionCallback) {\r\n if (this.readingListModalRef != null) { return; }\r\n this.readingListModalRef = this.modalService.open(AddToListModalComponent, { scrollable: true, size: 'md' });\r\n this.readingListModalRef.componentInstance.seriesId = seriesId; \r\n this.readingListModalRef.componentInstance.chapterId = chapter.id;\r\n this.readingListModalRef.componentInstance.type = ADD_FLOW.Chapter;\r\n\r\n\r\n this.readingListModalRef.closed.pipe(take(1)).subscribe(() => {\r\n this.readingListModalRef = null;\r\n if (callback) {\r\n callback(chapter);\r\n }\r\n });\r\n this.readingListModalRef.dismissed.pipe(take(1)).subscribe(() => {\r\n this.readingListModalRef = null;\r\n if (callback) {\r\n callback(chapter);\r\n }\r\n });\r\n }\r\n\r\n editReadingList(readingList: ReadingList, callback?: ReadingListActionCallback) {\r\n const readingListModalRef = this.modalService.open(EditReadingListModalComponent, { scrollable: true, size: 'lg' });\r\n readingListModalRef.componentInstance.readingList = readingList; \r\n readingListModalRef.closed.pipe(take(1)).subscribe((list) => {\r\n if (callback && list !== undefined) {\r\n callback(readingList);\r\n }\r\n });\r\n readingListModalRef.dismissed.pipe(take(1)).subscribe((list) => {\r\n if (callback && list !== undefined) {\r\n callback(readingList);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Mark all chapters and the volumes as Read. All volumes and chapters must belong to a series\r\n * @param seriesId Series Id\r\n * @param volumes Volumes, should have id, chapters and pagesRead populated\r\n * @param chapters? Chapters, should have id\r\n * @param callback Optional callback to perform actions after API completes \r\n */\r\n async deleteMultipleSeries(seriesIds: Array, callback?: BooleanActionCallback) {\r\n if (!await this.confirmService.confirm('Are you sure you want to delete ' + seriesIds.length + ' series? It will not modify files on disk.')) {\r\n if (callback) {\r\n callback(false);\r\n }\r\n return;\r\n }\r\n this.seriesService.deleteMultipleSeries(seriesIds.map(s => s.id)).pipe(take(1)).subscribe(() => {\r\n this.toastr.success('Series deleted');\r\n\r\n if (callback) {\r\n callback(true);\r\n }\r\n });\r\n }\r\n\r\n async deleteSeries(series: Series, callback?: BooleanActionCallback) {\r\n if (!await this.confirmService.confirm('Are you sure you want to delete this series? It will not modify files on disk.')) {\r\n if (callback) {\r\n callback(false);\r\n }\r\n return;\r\n }\r\n\r\n this.seriesService.delete(series.id).subscribe((res: boolean) => {\r\n if (callback) {\r\n this.toastr.success('Series deleted');\r\n callback(res);\r\n }\r\n });\r\n }\r\n\r\n sendToDevice(chapterIds: Array, device: Device, callback?: VoidActionCallback) {\r\n this.deviceSerivce.sendTo(chapterIds, device.id).subscribe(() => {\r\n this.toastr.success('File emailed to ' + device.name);\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n private async promptIfForce(extraContent: string = '') {\r\n // Prompt user if we should do a force or not\r\n const config = this.confirmService.defaultConfirm;\r\n config.header = 'Force Scan';\r\n config.buttons = [\r\n {text: 'Yes', type: 'secondary'},\r\n {text: 'No', type: 'primary'},\r\n ];\r\n const msg = 'Do you want to force this scan? This is will ignore optimizations that reduce processing and I/O. ' + extraContent;\r\n return !await this.confirmService.confirm(msg, config); // Not because primary is the false state\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { map } from 'rxjs/operators';\r\nimport { environment } from 'src/environments/environment';\r\nimport { CollectionTag } from '../_models/collection-tag';\r\nimport { TextResonse } from '../_types/text-response';\r\nimport { ImageService } from './image.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CollectionTagService {\r\n\r\n baseUrl = environment.apiUrl;\r\n\r\n constructor(private httpClient: HttpClient, private imageService: ImageService) { }\r\n\r\n allTags() {\r\n return this.httpClient.get(this.baseUrl + 'collection/');\r\n }\r\n\r\n search(query: string) {\r\n return this.httpClient.get(this.baseUrl + 'collection/search?queryString=' + encodeURIComponent(query)).pipe(map(tags => {\r\n tags.forEach(s => s.coverImage = this.imageService.randomize(this.imageService.getCollectionCoverImage(s.id)));\r\n return tags;\r\n }));\r\n }\r\n\r\n updateTag(tag: CollectionTag) {\r\n return this.httpClient.post(this.baseUrl + 'collection/update', tag, TextResonse);\r\n }\r\n\r\n updateSeriesForTag(tag: CollectionTag, seriesIdsToRemove: Array) {\r\n return this.httpClient.post(this.baseUrl + 'collection/update-series', {tag, seriesIdsToRemove}, TextResonse);\r\n }\r\n\r\n addByMultiple(tagId: number, seriesIds: Array, tagTitle: string = '') {\r\n return this.httpClient.post(this.baseUrl + 'collection/update-for-series', {collectionTagId: tagId, collectionTagTitle: tagTitle, seriesIds}, TextResonse);\r\n }\r\n\r\n tagNameExists(name: string) {\r\n return this.httpClient.get(this.baseUrl + 'collection/name-exists?name=' + name);\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { ReplaySubject, shareReplay, tap } from 'rxjs';\r\nimport { environment } from 'src/environments/environment';\r\nimport { Device } from '../_models/device/device';\r\nimport { DevicePlatform } from '../_models/device/device-platform';\r\nimport { TextResonse } from '../_types/text-response';\r\nimport { AccountService } from './account.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DeviceService {\r\n\r\n baseUrl = environment.apiUrl;\r\n\r\n private devicesSource: ReplaySubject = new ReplaySubject(1);\r\n public devices$ = this.devicesSource.asObservable().pipe(shareReplay());\r\n\r\n\r\n constructor(private httpClient: HttpClient, private accountService: AccountService) {\r\n // Ensure we are authenticated before we make an authenticated api call. \r\n this.accountService.currentUser$.subscribe(user => {\r\n if (!user) {\r\n this.devicesSource.next([]);\r\n return;\r\n }\r\n\r\n this.httpClient.get(this.baseUrl + 'device', {}).subscribe(data => {\r\n this.devicesSource.next(data);\r\n });\r\n });\r\n }\r\n\r\n createDevice(name: string, platform: DevicePlatform, emailAddress: string) {\r\n return this.httpClient.post(this.baseUrl + 'device/create', {name, platform, emailAddress}, TextResonse);\r\n }\r\n\r\n updateDevice(id: number, name: string, platform: DevicePlatform, emailAddress: string) {\r\n return this.httpClient.post(this.baseUrl + 'device/update', {id, name, platform, emailAddress}, TextResonse);\r\n }\r\n\r\n deleteDevice(id: number) {\r\n return this.httpClient.delete(this.baseUrl + 'device?deviceId=' + id);\r\n }\r\n\r\n getDevices() {\r\n return this.httpClient.get(this.baseUrl + 'device', {}).pipe(tap(data => {\r\n this.devicesSource.next(data);\r\n }));\r\n }\r\n\r\n sendTo(chapterIds: Array, deviceId: number) {\r\n return this.httpClient.post(this.baseUrl + 'device/send-to', {deviceId, chapterIds}, TextResonse);\r\n }\r\n\r\n \r\n}\r\n","import {DestroyRef, inject, Injectable, OnDestroy} from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { environment } from 'src/environments/environment';\r\nimport { ThemeService } from './theme.service';\r\nimport { RecentlyAddedItem } from '../_models/recently-added-item';\r\nimport { AccountService } from './account.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ImageService {\r\n private readonly destroyRef = inject(DestroyRef);\r\n baseUrl = environment.apiUrl;\r\n apiKey: string = '';\r\n encodedKey: string = '';\r\n public placeholderImage = 'assets/images/image-placeholder.dark-min.png';\r\n public errorImage = 'assets/images/error-placeholder2.dark-min.png';\r\n public resetCoverImage = 'assets/images/image-reset-cover-min.png';\r\n public errorWebLinkImage = 'assets/images/broken-white-32x32.png';\r\n\r\n constructor(private accountService: AccountService, private themeService: ThemeService) {\r\n this.themeService.currentTheme$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(theme => {\r\n if (this.themeService.isDarkTheme()) {\r\n this.placeholderImage = 'assets/images/image-placeholder.dark-min.png';\r\n this.errorImage = 'assets/images/error-placeholder2.dark-min.png';\r\n this.errorWebLinkImage = 'assets/images/broken-white-32x32.png';\r\n } else {\r\n this.placeholderImage = 'assets/images/image-placeholder-min.png';\r\n this.errorImage = 'assets/images/error-placeholder2-min.png';\r\n this.errorWebLinkImage = 'assets/images/broken-black-32x32.png';\r\n }\r\n });\r\n\r\n this.accountService.currentUser$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(user => {\r\n if (user) {\r\n this.apiKey = user.apiKey;\r\n this.encodedKey = encodeURIComponent(this.apiKey);\r\n }\r\n });\r\n }\r\n\r\n getRecentlyAddedItem(item: RecentlyAddedItem) {\r\n if (item.chapterId === 0) {\r\n return this.getVolumeCoverImage(item.volumeId);\r\n }\r\n return this.getChapterCoverImage(item.chapterId);\r\n }\r\n\r\n /**\r\n * Returns the entity type from a cover image url. Undefied if not applicable\r\n * @param url\r\n * @returns\r\n */\r\n getEntityTypeFromUrl(url: string) {\r\n if (url.indexOf('?') < 0) return undefined;\r\n const part = url.split('?')[1];\r\n const equalIndex = part.indexOf('=');\r\n return part.substring(0, equalIndex).replace('Id', '');\r\n }\r\n\r\n getLibraryCoverImage(libraryId: number) {\r\n return `${this.baseUrl}image/library-cover?libraryId=${libraryId}&apiKey=${this.encodedKey}`;\r\n }\r\n\r\n getVolumeCoverImage(volumeId: number) {\r\n return `${this.baseUrl}image/volume-cover?volumeId=${volumeId}&apiKey=${this.encodedKey}`;\r\n }\r\n\r\n getSeriesCoverImage(seriesId: number) {\r\n return `${this.baseUrl}image/series-cover?seriesId=${seriesId}&apiKey=${this.encodedKey}`;\r\n }\r\n\r\n getCollectionCoverImage(collectionTagId: number) {\r\n return `${this.baseUrl}image/collection-cover?collectionTagId=${collectionTagId}&apiKey=${this.encodedKey}`;\r\n }\r\n\r\n getReadingListCoverImage(readingListId: number) {\r\n return `${this.baseUrl}image/readinglist-cover?readingListId=${readingListId}&apiKey=${this.encodedKey}`;\r\n }\r\n\r\n getChapterCoverImage(chapterId: number) {\r\n return `${this.baseUrl}image/chapter-cover?chapterId=${chapterId}&apiKey=${this.encodedKey}`;\r\n }\r\n\r\n getBookmarkedImage(chapterId: number, pageNum: number) {\r\n return `${this.baseUrl}image/bookmark?chapterId=${chapterId}&apiKey=${this.encodedKey}&pageNum=${pageNum}`;\r\n }\r\n\r\n getWebLinkImage(url: string) {\r\n return `${this.baseUrl}image/web-link?url=${encodeURIComponent(url)}&apiKey=${this.encodedKey}`;\r\n }\r\n\r\n getCoverUploadImage(filename: string) {\r\n return `${this.baseUrl}image/cover-upload?filename=${encodeURIComponent(filename)}&apiKey=${this.encodedKey}`;\r\n }\r\n\r\n updateErroredImage(event: any) {\r\n event.target.src = this.placeholderImage;\r\n }\r\n\r\n updateErroredWebLinkImage(event: any) {\r\n event.target.src = this.errorWebLinkImage;\r\n }\r\n\r\n /**\r\n * Used to refresh an existing loaded image (lazysizes). If random already attached, will append another number onto it.\r\n * @param url Existing request url from ImageService only\r\n * @returns Url with a random parameter attached\r\n */\r\n randomize(url: string) {\r\n const r = Math.round(Math.random() * 100 + 1);\r\n if (url.indexOf('&random') >= 0) {\r\n return url + 1;\r\n }\r\n return url + '&random=' + r;\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { of } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { environment } from 'src/environments/environment';\r\nimport { JumpKey } from '../_models/jumpbar/jump-key';\r\nimport { Library, LibraryType } from '../_models/library';\r\nimport { DirectoryDto } from '../_models/system/directory-dto';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LibraryService {\r\n\r\n baseUrl = environment.apiUrl;\r\n\r\n private libraryNames: {[key:number]: string} | undefined = undefined;\r\n private libraryTypes: {[key: number]: LibraryType} | undefined = undefined;\r\n\r\n constructor(private httpClient: HttpClient) {}\r\n\r\n getLibraryNames() {\r\n if (this.libraryNames != undefined) {\r\n return of(this.libraryNames);\r\n }\r\n return this.httpClient.get(this.baseUrl + 'library').pipe(map(l => {\r\n this.libraryNames = {};\r\n l.forEach(lib => {\r\n if (this.libraryNames !== undefined) {\r\n this.libraryNames[lib.id] = lib.name;\r\n } \r\n });\r\n return this.libraryNames;\r\n }));\r\n }\r\n\r\n getLibraryName(libraryId: number) {\r\n if (this.libraryNames != undefined && this.libraryNames.hasOwnProperty(libraryId)) {\r\n return of(this.libraryNames[libraryId]);\r\n }\r\n return this.httpClient.get(this.baseUrl + 'library').pipe(map(l => {\r\n this.libraryNames = {};\r\n l.forEach(lib => {\r\n if (this.libraryNames !== undefined) {\r\n this.libraryNames[lib.id] = lib.name;\r\n } \r\n });\r\n return this.libraryNames[libraryId];\r\n }));\r\n }\r\n\r\n libraryNameExists(name: string) {\r\n return this.httpClient.get(this.baseUrl + 'library/name-exists?name=' + name);\r\n }\r\n\r\n listDirectories(rootPath: string) {\r\n let query = '';\r\n if (rootPath !== undefined && rootPath.length > 0) {\r\n query = '?path=' + encodeURIComponent(rootPath);\r\n }\r\n\r\n return this.httpClient.get(this.baseUrl + 'library/list' + query);\r\n }\r\n\r\n getJumpBar(libraryId: number) {\r\n return this.httpClient.get(this.baseUrl + 'library/jump-bar?libraryId=' + libraryId);\r\n }\r\n\r\n getLibraries() {\r\n return this.httpClient.get(this.baseUrl + 'library');\r\n }\r\n\r\n updateLibrariesForMember(username: string, selectedLibraries: Library[]) {\r\n return this.httpClient.post(this.baseUrl + 'library/grant-access', {username, selectedLibraries});\r\n }\r\n\r\n scan(libraryId: number, force = false) {\r\n return this.httpClient.post(this.baseUrl + 'library/scan?libraryId=' + libraryId + '&force=' + force, {});\r\n }\r\n\r\n analyze(libraryId: number) {\r\n return this.httpClient.post(this.baseUrl + 'library/analyze?libraryId=' + libraryId, {});\r\n }\r\n\r\n refreshMetadata(libraryId: number, forceUpdate = false) {\r\n return this.httpClient.post(this.baseUrl + 'library/refresh-metadata?libraryId=' + libraryId + '&force=' + forceUpdate, {});\r\n }\r\n\r\n create(model: {name: string, type: number, folders: string[]}) {\r\n return this.httpClient.post(this.baseUrl + 'library/create', model);\r\n }\r\n\r\n delete(libraryId: number) {\r\n return this.httpClient.delete(this.baseUrl + 'library/delete?libraryId=' + libraryId, {});\r\n }\r\n\r\n update(model: {name: string, folders: string[], id: number}) {\r\n return this.httpClient.post(this.baseUrl + 'library/update', model);\r\n }\r\n\r\n getLibraryType(libraryId: number) {\r\n if (this.libraryTypes != undefined && this.libraryTypes.hasOwnProperty(libraryId)) {\r\n return of(this.libraryTypes[libraryId]);\r\n }\r\n return this.httpClient.get(this.baseUrl + 'library/type?libraryId=' + libraryId).pipe(map(l => {\r\n if (this.libraryTypes === undefined) {\r\n this.libraryTypes = {};\r\n }\r\n\r\n this.libraryTypes[libraryId] = l;\r\n return this.libraryTypes[libraryId];\r\n }));\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { environment } from 'src/environments/environment';\r\nimport { Member } from '../_models/auth/member';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MemberService {\r\n\r\n baseUrl = environment.apiUrl;\r\n\r\n constructor(private httpClient: HttpClient) { }\r\n\r\n getMembers(includePending: boolean = false) {\r\n return this.httpClient.get(this.baseUrl + 'users?includePending=' + includePending);\r\n }\r\n\r\n getMemberNames() {\r\n return this.httpClient.get(this.baseUrl + 'users/names');\r\n }\r\n\r\n adminExists() {\r\n return this.httpClient.get(this.baseUrl + 'admin/exists');\r\n }\r\n\r\n deleteMember(username: string) {\r\n return this.httpClient.delete(this.baseUrl + 'users/delete-user?username=' + encodeURIComponent(username));\r\n }\r\n\r\n hasLibraryAccess(libraryId: number) {\r\n return this.httpClient.get(this.baseUrl + 'users/has-library-access?libraryId=' + libraryId);\r\n }\r\n\r\n hasReadingProgress(librayId: number) {\r\n return this.httpClient.get(this.baseUrl + 'users/has-reading-progress?libraryId=' + librayId);\r\n }\r\n\r\n addSeriesToWantToRead(seriesIds: Array) {\r\n return this.httpClient.post>(this.baseUrl + 'want-to-read/add-series', {seriesIds});\r\n }\r\n\r\n removeSeriesToWantToRead(seriesIds: Array) {\r\n return this.httpClient.post>(this.baseUrl + 'want-to-read/remove-series', {seriesIds});\r\n }\r\n\r\n getMember() {\r\n return this.httpClient.get(this.baseUrl + 'users/myself');\r\n }\r\n \r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { HubConnection, HubConnectionBuilder } from '@microsoft/signalr';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { BehaviorSubject, ReplaySubject } from 'rxjs';\r\nimport { environment } from 'src/environments/environment';\r\nimport { LibraryModifiedEvent } from '../_models/events/library-modified-event';\r\nimport { NotificationProgressEvent } from '../_models/events/notification-progress-event';\r\nimport { ThemeProgressEvent } from '../_models/events/theme-progress-event';\r\nimport { UserUpdateEvent } from '../_models/events/user-update-event';\r\nimport { User } from '../_models/user';\r\n\r\nexport enum EVENTS {\r\n UpdateAvailable = 'UpdateAvailable',\r\n ScanSeries = 'ScanSeries',\r\n SeriesAdded = 'SeriesAdded',\r\n SeriesRemoved = 'SeriesRemoved',\r\n ScanLibraryProgress = 'ScanLibraryProgress',\r\n OnlineUsers = 'OnlineUsers',\r\n SeriesAddedToCollection = 'SeriesAddedToCollection',\r\n /**\r\n * A generic error that occurs during operations on the server\r\n */\r\n Error = 'Error',\r\n BackupDatabaseProgress = 'BackupDatabaseProgress',\r\n /**\r\n * A subtype of NotificationProgress that represents maintenance cleanup on server-owned resources\r\n */\r\n CleanupProgress = 'CleanupProgress',\r\n /**\r\n * A subtype of NotificationProgress that represnts a user downloading a file or group of files.\r\n * Note: In v0.5.5, this is being replaced by an inbrowser experience. The message is changed and this will be moved to dashboard view once built\r\n */\r\n DownloadProgress = 'DownloadProgress',\r\n /**\r\n * A generic progress event\r\n */\r\n NotificationProgress = 'NotificationProgress',\r\n /**\r\n * A subtype of NotificationProgress that represents the underlying file being processed during a scan\r\n */\r\n FileScanProgress = 'FileScanProgress',\r\n /**\r\n * A custom user site theme is added or removed during a scan\r\n */\r\n SiteThemeProgress = 'SiteThemeProgress',\r\n /**\r\n * A cover is updated\r\n */\r\n CoverUpdate = 'CoverUpdate',\r\n /**\r\n * A subtype of NotificationProgress that represents a file being processed for cover image extraction\r\n */\r\n CoverUpdateProgress = 'CoverUpdateProgress',\r\n /**\r\n * A library is created or removed from the instance\r\n */\r\n LibraryModified = 'LibraryModified',\r\n /**\r\n * A user updates an entities read progress\r\n */\r\n UserProgressUpdate = 'UserProgressUpdate',\r\n /**\r\n * A user updates account or preferences\r\n */\r\n UserUpdate = 'UserUpdate',\r\n /**\r\n * When bulk bookmarks are being converted\r\n */\r\n ConvertBookmarksProgress = 'ConvertBookmarksProgress',\r\n /**\r\n * When files are being scanned to calculate word count\r\n */\r\n WordCountAnalyzerProgress = 'WordCountAnalyzerProgress',\r\n /**\r\n * When the user needs to be informed, but it's not a big deal\r\n */\r\n Info = 'Info',\r\n /**\r\n * A user is sending files to their device\r\n */\r\n SendingToDevice = 'SendingToDevice',\r\n}\r\n\r\nexport interface Message {\r\n event: EVENTS;\r\n payload: T;\r\n}\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MessageHubService {\r\n hubUrl = environment.hubUrl;\r\n private hubConnection!: HubConnection;\r\n\r\n private messagesSource = new ReplaySubject>(1);\r\n private onlineUsersSource = new BehaviorSubject([]); // UserNames\r\n\r\n /**\r\n * Any events that come from the backend\r\n */\r\n public messages$ = this.messagesSource.asObservable();\r\n /**\r\n * Users that are online\r\n */\r\n public onlineUsers$ = this.onlineUsersSource.asObservable();\r\n\r\n\r\n isAdmin: boolean = false;\r\n\r\n constructor(private toastr: ToastrService, private router: Router) {\r\n\r\n }\r\n\r\n /**\r\n * Tests that an event is of the type passed\r\n * @param event\r\n * @param eventType\r\n * @returns\r\n */\r\n public isEventType(event: Message, eventType: EVENTS) {\r\n if (event.event == EVENTS.NotificationProgress) {\r\n const notification = event.payload as NotificationProgressEvent;\r\n return notification.eventType.toLowerCase() == eventType.toLowerCase();\r\n }\r\n return event.event === eventType;\r\n }\r\n\r\n createHubConnection(user: User, isAdmin: boolean) {\r\n this.isAdmin = isAdmin;\r\n\r\n this.hubConnection = new HubConnectionBuilder()\r\n .withUrl(this.hubUrl + 'messages', {\r\n accessTokenFactory: () => user.token\r\n })\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n this.hubConnection\r\n .start()\r\n .catch(err => console.error(err));\r\n\r\n this.hubConnection.on(EVENTS.OnlineUsers, (usernames: string[]) => {\r\n this.onlineUsersSource.next(usernames);\r\n });\r\n\r\n this.hubConnection.on(EVENTS.ScanSeries, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.ScanSeries,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.ScanLibraryProgress, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.ScanLibraryProgress,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.ConvertBookmarksProgress, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.ConvertBookmarksProgress,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.WordCountAnalyzerProgress, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.WordCountAnalyzerProgress,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.LibraryModified, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.LibraryModified,\r\n payload: resp.body as LibraryModifiedEvent\r\n });\r\n });\r\n\r\n\r\n this.hubConnection.on(EVENTS.NotificationProgress, (resp: NotificationProgressEvent) => {\r\n this.messagesSource.next({\r\n event: EVENTS.NotificationProgress,\r\n payload: resp\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.SiteThemeProgress, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.SiteThemeProgress,\r\n payload: resp.body as ThemeProgressEvent\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.SeriesAddedToCollection, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.SeriesAddedToCollection,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.UserProgressUpdate, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.UserProgressUpdate,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.UserUpdate, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.UserUpdate,\r\n payload: resp.body as UserUpdateEvent\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.Error, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.Error,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.Info, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.Info,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.SeriesAdded, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.SeriesAdded,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.SeriesRemoved, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.SeriesRemoved,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.CoverUpdate, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.CoverUpdate,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.UpdateAvailable, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.UpdateAvailable,\r\n payload: resp.body\r\n });\r\n });\r\n\r\n this.hubConnection.on(EVENTS.SendingToDevice, resp => {\r\n this.messagesSource.next({\r\n event: EVENTS.SendingToDevice,\r\n payload: resp.body\r\n });\r\n });\r\n }\r\n\r\n stopHubConnection() {\r\n if (this.hubConnection) {\r\n this.hubConnection.stop().catch(err => console.error(err));\r\n }\r\n }\r\n\r\n sendMessage(methodName: string, body?: any) {\r\n return this.hubConnection.invoke(methodName, body);\r\n }\r\n\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport { Inject, Injectable, Renderer2, RendererFactory2 } from '@angular/core';\r\nimport { ReplaySubject, take } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NavService {\r\n public localStorageSideNavKey = 'kavita--sidenav--expanded';\r\n\r\n private navbarVisibleSource = new ReplaySubject(1);\r\n /**\r\n * If the top Nav bar is rendered or not\r\n */\r\n navbarVisible$ = this.navbarVisibleSource.asObservable();\r\n\r\n private sideNavCollapseSource = new ReplaySubject(1);\r\n /**\r\n * If the Side Nav is in a collapsed state or not.\r\n */\r\n sideNavCollapsed$ = this.sideNavCollapseSource.asObservable();\r\n\r\n private sideNavVisibilitySource = new ReplaySubject(1);\r\n /**\r\n * If the side nav is rendered or not into the DOM.\r\n */\r\n sideNavVisibility$ = this.sideNavVisibilitySource.asObservable();\r\n\r\n private renderer: Renderer2;\r\n\r\n constructor(@Inject(DOCUMENT) private document: Document, rendererFactory: RendererFactory2) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n this.showNavBar();\r\n const sideNavState = (localStorage.getItem(this.localStorageSideNavKey) === 'true') || false;\r\n this.sideNavCollapseSource.next(sideNavState);\r\n this.showSideNav();\r\n }\r\n \r\n /**\r\n * Shows the top nav bar. This should be visible on all pages except the reader.\r\n */\r\n showNavBar() {\r\n this.renderer.setStyle(this.document.querySelector('body'), 'margin-top', '56px');\r\n this.renderer.setStyle(this.document.querySelector('body'), 'height', 'calc(var(--vh)*100 - 56px)');\r\n this.renderer.setStyle(this.document.querySelector('html'), 'height', 'calc(var(--vh)*100 - 56px)');\r\n this.navbarVisibleSource.next(true);\r\n }\r\n\r\n /**\r\n * Hides the top nav bar. \r\n */\r\n hideNavBar() {\r\n this.renderer.setStyle(this.document.querySelector('body'), 'margin-top', '0px');\r\n this.renderer.removeStyle(this.document.querySelector('body'), 'height');\r\n this.renderer.removeStyle(this.document.querySelector('html'), 'height');\r\n this.navbarVisibleSource.next(false);\r\n }\r\n\r\n /**\r\n * Shows the side nav. When being visible, the side nav will automatically return to previous collapsed state.\r\n */\r\n showSideNav() {\r\n this.sideNavVisibilitySource.next(true);\r\n }\r\n\r\n /**\r\n * Hides the side nav. This is useful for the readers and login page.\r\n */\r\n hideSideNav() {\r\n this.sideNavVisibilitySource.next(false);\r\n }\r\n\r\n toggleSideNav() {\r\n this.sideNavCollapseSource.pipe(take(1)).subscribe(val => {\r\n if (val === undefined) val = false;\r\n const newVal = !(val || false);\r\n this.sideNavCollapseSource.next(newVal);\r\n localStorage.setItem(this.localStorageSideNavKey, newVal + '');\r\n });\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport {DestroyRef, inject, Injectable} from '@angular/core';\r\nimport { Location } from '@angular/common';\r\nimport { Router } from '@angular/router';\r\nimport { environment } from 'src/environments/environment';\r\nimport { ChapterInfo } from '../manga-reader/_models/chapter-info';\r\nimport { Chapter } from '../_models/chapter';\r\nimport { HourEstimateRange } from '../_models/series-detail/hour-estimate-range';\r\nimport { MangaFormat } from '../_models/manga-format';\r\nimport { BookmarkInfo } from '../_models/manga-reader/bookmark-info';\r\nimport { PageBookmark } from '../_models/readers/page-bookmark';\r\nimport { ProgressBookmark } from '../_models/readers/progress-bookmark';\r\nimport { SeriesFilter } from '../_models/metadata/series-filter';\r\nimport { UtilityService } from '../shared/_services/utility.service';\r\nimport { FilterUtilitiesService } from '../shared/_services/filter-utilities.service';\r\nimport { FileDimension } from '../manga-reader/_models/file-dimension';\r\nimport screenfull from 'screenfull';\r\nimport { TextResonse } from '../_types/text-response';\r\nimport { AccountService } from './account.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { OnDestroy } from '@angular/core';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\nexport const CHAPTER_ID_DOESNT_EXIST = -1;\r\nexport const CHAPTER_ID_NOT_FETCHED = -2;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ReaderService {\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n baseUrl = environment.apiUrl;\r\n encodedKey: string = '';\r\n\r\n // Override background color for reader and restore it onDestroy\r\n private originalBodyColor!: string;\r\n\r\n constructor(private httpClient: HttpClient, private router: Router,\r\n private location: Location, private utilityService: UtilityService,\r\n private filterUtilityService: FilterUtilitiesService, private accountService: AccountService) {\r\n this.accountService.currentUser$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(user => {\r\n if (user) {\r\n this.encodedKey = encodeURIComponent(user.apiKey);\r\n }\r\n });\r\n }\r\n\r\n\r\n getNavigationArray(libraryId: number, seriesId: number, chapterId: number, format: MangaFormat) {\r\n if (format === undefined) format = MangaFormat.ARCHIVE;\r\n\r\n if (format === MangaFormat.EPUB) {\r\n return ['library', libraryId, 'series', seriesId, 'book', chapterId];\r\n } else if (format === MangaFormat.PDF) {\r\n return ['library', libraryId, 'series', seriesId, 'pdf', chapterId];\r\n } else {\r\n return ['library', libraryId, 'series', seriesId, 'manga', chapterId];\r\n }\r\n }\r\n\r\n downloadPdf(chapterId: number) {\r\n return `${this.baseUrl}reader/pdf?chapterId=${chapterId}&apiKey=${this.encodedKey}`;\r\n }\r\n\r\n bookmark(seriesId: number, volumeId: number, chapterId: number, page: number) {\r\n return this.httpClient.post(this.baseUrl + 'reader/bookmark', {seriesId, volumeId, chapterId, page});\r\n }\r\n\r\n unbookmark(seriesId: number, volumeId: number, chapterId: number, page: number) {\r\n return this.httpClient.post(this.baseUrl + 'reader/unbookmark', {seriesId, volumeId, chapterId, page});\r\n }\r\n\r\n getAllBookmarks(filter: SeriesFilter | undefined) {\r\n let params = new HttpParams();\r\n params = this.utilityService.addPaginationIfExists(params, undefined, undefined);\r\n const data = this.filterUtilityService.createSeriesFilter(filter);\r\n\r\n return this.httpClient.post(this.baseUrl + 'reader/all-bookmarks', data);\r\n }\r\n\r\n getBookmarks(chapterId: number) {\r\n return this.httpClient.get(this.baseUrl + 'reader/chapter-bookmarks?chapterId=' + chapterId);\r\n }\r\n\r\n getBookmarksForVolume(volumeId: number) {\r\n return this.httpClient.get(this.baseUrl + 'reader/volume-bookmarks?volumeId=' + volumeId);\r\n }\r\n\r\n getBookmarksForSeries(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'reader/series-bookmarks?seriesId=' + seriesId);\r\n }\r\n\r\n clearBookmarks(seriesId: number) {\r\n return this.httpClient.post(this.baseUrl + 'reader/remove-bookmarks', {seriesId}, TextResonse);\r\n }\r\n clearMultipleBookmarks(seriesIds: Array) {\r\n return this.httpClient.post(this.baseUrl + 'reader/bulk-remove-bookmarks', {seriesIds}, TextResonse);\r\n }\r\n\r\n /**\r\n * Used exclusively for reading multiple bookmarks from a series\r\n * @param seriesId\r\n */\r\n getBookmarkInfo(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'reader/bookmark-info?seriesId=' + seriesId);\r\n }\r\n\r\n getProgress(chapterId: number) {\r\n return this.httpClient.get(this.baseUrl + 'reader/get-progress?chapterId=' + chapterId);\r\n }\r\n\r\n getPageUrl(chapterId: number, page: number) {\r\n return `${this.baseUrl}reader/image?chapterId=${chapterId}&apiKey=${this.encodedKey}&page=${page}`;\r\n }\r\n\r\n getThumbnailUrl(chapterId: number, page: number) {\r\n return `${this.baseUrl}reader/thumbnail?chapterId=${chapterId}&apiKey=${this.encodedKey}&page=${page}`;\r\n }\r\n\r\n getBookmarkPageUrl(seriesId: number, apiKey: string, page: number) {\r\n return this.baseUrl + 'reader/bookmark-image?seriesId=' + seriesId + '&page=' + page + '&apiKey=' + encodeURIComponent(apiKey);\r\n }\r\n\r\n getChapterInfo(chapterId: number, includeDimensions = false) {\r\n return this.httpClient.get(this.baseUrl + 'reader/chapter-info?chapterId=' + chapterId + '&includeDimensions=' + includeDimensions);\r\n }\r\n\r\n getFileDimensions(chapterId: number) {\r\n return this.httpClient.get>(this.baseUrl + 'reader/file-dimensions?chapterId=' + chapterId);\r\n }\r\n\r\n saveProgress(libraryId: number, seriesId: number, volumeId: number, chapterId: number, page: number, bookScrollId: string | null = null) {\r\n return this.httpClient.post(this.baseUrl + 'reader/progress', {libraryId, seriesId, volumeId, chapterId, pageNum: page, bookScrollId});\r\n }\r\n\r\n markVolumeRead(seriesId: number, volumeId: number) {\r\n return this.httpClient.post(this.baseUrl + 'reader/mark-volume-read', {seriesId, volumeId});\r\n }\r\n\r\n markMultipleRead(seriesId: number, volumeIds: Array, chapterIds?: Array) {\r\n return this.httpClient.post(this.baseUrl + 'reader/mark-multiple-read', {seriesId, volumeIds, chapterIds});\r\n }\r\n\r\n markMultipleUnread(seriesId: number, volumeIds: Array, chapterIds?: Array) {\r\n return this.httpClient.post(this.baseUrl + 'reader/mark-multiple-unread', {seriesId, volumeIds, chapterIds});\r\n }\r\n\r\n markMultipleSeriesRead(seriesIds: Array) {\r\n return this.httpClient.post(this.baseUrl + 'reader/mark-multiple-series-read', {seriesIds});\r\n }\r\n\r\n markMultipleSeriesUnread(seriesIds: Array) {\r\n return this.httpClient.post(this.baseUrl + 'reader/mark-multiple-series-unread', {seriesIds});\r\n }\r\n\r\n markVolumeUnread(seriesId: number, volumeId: number) {\r\n return this.httpClient.post(this.baseUrl + 'reader/mark-volume-unread', {seriesId, volumeId});\r\n }\r\n\r\n\r\n getNextChapter(seriesId: number, volumeId: number, currentChapterId: number, readingListId: number = -1) {\r\n if (readingListId > 0) {\r\n return this.httpClient.get(this.baseUrl + 'readinglist/next-chapter?seriesId=' + seriesId + '¤tChapterId=' + currentChapterId + '&readingListId=' + readingListId);\r\n }\r\n return this.httpClient.get(this.baseUrl + 'reader/next-chapter?seriesId=' + seriesId + '&volumeId=' + volumeId + '¤tChapterId=' + currentChapterId);\r\n }\r\n\r\n getPrevChapter(seriesId: number, volumeId: number, currentChapterId: number, readingListId: number = -1) {\r\n if (readingListId > 0) {\r\n return this.httpClient.get(this.baseUrl + 'readinglist/prev-chapter?seriesId=' + seriesId + '¤tChapterId=' + currentChapterId + '&readingListId=' + readingListId);\r\n }\r\n return this.httpClient.get(this.baseUrl + 'reader/prev-chapter?seriesId=' + seriesId + '&volumeId=' + volumeId + '¤tChapterId=' + currentChapterId);\r\n }\r\n\r\n hasSeriesProgress(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'reader/has-progress?seriesId=' + seriesId);\r\n }\r\n\r\n getCurrentChapter(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'reader/continue-point?seriesId=' + seriesId);\r\n }\r\n\r\n getTimeLeft(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'reader/time-left?seriesId=' + seriesId);\r\n }\r\n\r\n /**\r\n * Captures current body color and forces background color to be black. Call @see resetOverrideStyles() on destroy of component to revert changes\r\n */\r\n setOverrideStyles(backgroundColor: string = 'black') {\r\n const bodyNode = document.querySelector('body');\r\n if (bodyNode !== undefined && bodyNode !== null) {\r\n this.originalBodyColor = bodyNode.style.background;\r\n bodyNode.setAttribute('style', 'background-color: ' + backgroundColor + ' !important');\r\n }\r\n }\r\n\r\n resetOverrideStyles() {\r\n const bodyNode = document.querySelector('body');\r\n if (bodyNode !== undefined && bodyNode !== null && this.originalBodyColor !== undefined) {\r\n bodyNode.style.background = this.originalBodyColor;\r\n }\r\n }\r\n\r\n /**\r\n * Parses out the page number from a Image src url\r\n * @param imageSrc Src attribute of Image\r\n * @returns\r\n */\r\n imageUrlToPageNum(imageSrc: string) {\r\n if (imageSrc === undefined || imageSrc === '') { return -1; }\r\n const params = new URLSearchParams(new URL(imageSrc).search);\r\n return parseInt(params.get('page') || '-1', 10);\r\n }\r\n\r\n imageUrlToChapterId(imageSrc: string) {\r\n if (imageSrc === undefined || imageSrc === '') { return -1; }\r\n const params = new URLSearchParams(new URL(imageSrc).search);\r\n return parseInt(params.get('chapterId') || '-1', 10);\r\n }\r\n\r\n getNextChapterUrl(url: string, nextChapterId: number, incognitoMode: boolean = false, readingListMode: boolean = false, readingListId: number = -1) {\r\n const lastSlashIndex = url.lastIndexOf('/');\r\n let newRoute = url.substring(0, lastSlashIndex + 1) + nextChapterId + '';\r\n newRoute += this.getQueryParams(incognitoMode, readingListMode, readingListId);\r\n return newRoute;\r\n }\r\n\r\n\r\n getQueryParamsObject(incognitoMode: boolean = false, readingListMode: boolean = false, readingListId: number = -1) {\r\n let params: {[key: string]: any} = {};\r\n if (incognitoMode) {\r\n params['incognitoMode'] = true;\r\n }\r\n if (readingListMode) {\r\n params['readingListId'] = readingListId;\r\n }\r\n return params;\r\n }\r\n\r\n getQueryParams(incognitoMode: boolean = false, readingListMode: boolean = false, readingListId: number = -1) {\r\n let params = '';\r\n if (incognitoMode) {\r\n params += '?incognitoMode=true';\r\n }\r\n if (readingListMode) {\r\n if (params.indexOf('?') > 0) {\r\n params += '&readingListId=' + readingListId;\r\n } else {\r\n params += '?readingListId=' + readingListId;\r\n }\r\n }\r\n return params;\r\n }\r\n\r\n toggleFullscreen(el: Element, callback?: VoidFunction) {\r\n\r\n if (screenfull.isEnabled) {\r\n screenfull.toggle();\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @returns If document is in fullscreen mode\r\n */\r\n checkFullscreenMode() {\r\n return document.fullscreenElement != null;\r\n }\r\n\r\n /**\r\n * Closes the reader and causes a redirection\r\n */\r\n closeReader(readingListMode: boolean = false, readingListId: number = 0) {\r\n if (readingListMode) {\r\n this.router.navigateByUrl('lists/' + readingListId);\r\n } else {\r\n this.location.back();\r\n }\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { map } from 'rxjs/operators';\r\nimport { environment } from 'src/environments/environment';\r\nimport { UtilityService } from '../shared/_services/utility.service';\r\nimport { Person } from '../_models/metadata/person';\r\nimport { PaginatedResult } from '../_models/pagination';\r\nimport { ReadingList, ReadingListItem } from '../_models/reading-list';\r\nimport { CblImportResult } from '../_models/reading-list/cbl/cbl-import-result.enum';\r\nimport { CblImportSummary } from '../_models/reading-list/cbl/cbl-import-summary';\r\nimport { TextResonse } from '../_types/text-response';\r\nimport { ActionItem } from './action-factory.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ReadingListService {\r\n\r\n baseUrl = environment.apiUrl;\r\n\r\n constructor(private httpClient: HttpClient, private utilityService: UtilityService) { }\r\n\r\n getReadingList(readingListId: number) {\r\n return this.httpClient.get(this.baseUrl + 'readinglist?readingListId=' + readingListId);\r\n }\r\n\r\n getReadingLists(includePromoted: boolean = true, sortByLastModified: boolean = false, pageNum?: number, itemsPerPage?: number) {\r\n let params = new HttpParams();\r\n params = this.utilityService.addPaginationIfExists(params, pageNum, itemsPerPage);\r\n\r\n return this.httpClient.post>(this.baseUrl + 'readinglist/lists?includePromoted=' + includePromoted \r\n + '&sortByLastModified=' + sortByLastModified, {}, {observe: 'response', params}).pipe(\r\n map((response: any) => {\r\n return this.utilityService.createPaginatedResult(response, new PaginatedResult());\r\n })\r\n );\r\n }\r\n\r\n getReadingListsForSeries(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'readinglist/lists-for-series?seriesId=' + seriesId);\r\n }\r\n\r\n getListItems(readingListId: number) {\r\n return this.httpClient.get(this.baseUrl + 'readinglist/items?readingListId=' + readingListId);\r\n }\r\n\r\n createList(title: string) {\r\n return this.httpClient.post(this.baseUrl + 'readinglist/create', {title});\r\n }\r\n\r\n update(model: {readingListId: number, title?: string, summary?: string, promoted: boolean}) {\r\n return this.httpClient.post(this.baseUrl + 'readinglist/update', model, TextResonse);\r\n }\r\n\r\n updateByMultiple(readingListId: number, seriesId: number, volumeIds: Array, chapterIds?: Array) {\r\n return this.httpClient.post(this.baseUrl + 'readinglist/update-by-multiple', {readingListId, seriesId, volumeIds, chapterIds}, TextResonse);\r\n }\r\n\r\n updateByMultipleSeries(readingListId: number, seriesIds: Array) {\r\n return this.httpClient.post(this.baseUrl + 'readinglist/update-by-multiple-series', {readingListId, seriesIds}, TextResonse);\r\n }\r\n\r\n updateBySeries(readingListId: number, seriesId: number) {\r\n return this.httpClient.post(this.baseUrl + 'readinglist/update-by-series', {readingListId, seriesId}, TextResonse);\r\n }\r\n\r\n updateByVolume(readingListId: number, seriesId: number, volumeId: number) {\r\n return this.httpClient.post(this.baseUrl + 'readinglist/update-by-volume', {readingListId, seriesId, volumeId}, TextResonse);\r\n }\r\n\r\n updateByChapter(readingListId: number, seriesId: number, chapterId: number) {\r\n return this.httpClient.post(this.baseUrl + 'readinglist/update-by-chapter', {readingListId, seriesId, chapterId}, TextResonse);\r\n }\r\n\r\n delete(readingListId: number) {\r\n return this.httpClient.delete(this.baseUrl + 'readinglist?readingListId=' + readingListId, TextResonse);\r\n }\r\n\r\n updatePosition(readingListId: number, readingListItemId: number, fromPosition: number, toPosition: number) {\r\n return this.httpClient.post(this.baseUrl + 'readinglist/update-position', {readingListId, readingListItemId, fromPosition, toPosition}, TextResonse);\r\n }\r\n\r\n deleteItem(readingListId: number, readingListItemId: number) {\r\n return this.httpClient.post(this.baseUrl + 'readinglist/delete-item', {readingListId, readingListItemId}, TextResonse);\r\n }\r\n\r\n removeRead(readingListId: number) {\r\n return this.httpClient.post(this.baseUrl + 'readinglist/remove-read?readingListId=' + readingListId, {}, TextResonse);\r\n }\r\n\r\n actionListFilter(action: ActionItem, readingList: ReadingList, isAdmin: boolean) {\r\n if (readingList?.promoted && !isAdmin) return false;\r\n return true;\r\n }\r\n \r\n nameExists(name: string) {\r\n return this.httpClient.get(this.baseUrl + 'readinglist/name-exists?name=' + name);\r\n }\r\n\r\n validateCbl(form: FormData) {\r\n return this.httpClient.post(this.baseUrl + 'cbl/validate', form);\r\n }\r\n\r\n importCbl(form: FormData) {\r\n return this.httpClient.post(this.baseUrl + 'cbl/import', form);\r\n }\r\n\r\n getCharacters(readingListId: number) {\r\n return this.httpClient.get>(this.baseUrl + 'readinglist/characters?readingListId=' + readingListId);\r\n }\r\n}\r\n","import { ElementRef, Injectable } from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { filter, ReplaySubject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ScrollService {\r\n\r\n private scrollContainerSource = new ReplaySubject>(1);\r\n /**\r\n * Exposes the current container on the active screen that is our primary overlay area. Defaults to 'body' and changes to 'body' on page loads\r\n */\r\n public scrollContainer$ = this.scrollContainerSource.asObservable();\r\n\r\n constructor(router: Router) {\r\n\r\n router.events\r\n .pipe(filter(event => event instanceof NavigationEnd))\r\n .subscribe(() => {\r\n this.scrollContainerSource.next('body');\r\n });\r\n this.scrollContainerSource.next('body');\r\n }\r\n\r\n get scrollPosition() {\r\n return (window.pageYOffset\r\n || document.documentElement.scrollTop\r\n || document.body.scrollTop || 0);\r\n }\r\n\r\n /*\r\n * When in the scroll vertical position the scroll in the horizontal position is needed\r\n */\r\n get scrollPositionX() {\r\n return (window.pageXOffset\r\n || document.documentElement.scrollLeft\r\n || document.body.scrollLeft || 0);\r\n }\r\n\r\n scrollTo(top: number, el: Element | Window = window, behavior: 'auto' | 'smooth' = 'smooth') {\r\n el.scroll({\r\n top: top,\r\n behavior: behavior\r\n });\r\n }\r\n\r\n scrollToX(left: number, el: Element | Window = window, behavior: 'auto' | 'smooth' = 'auto') {\r\n el.scroll({\r\n left: left,\r\n behavior: behavior\r\n });\r\n }\r\n\r\n setScrollContainer(elem: ElementRef | undefined) {\r\n if (elem !== undefined) {\r\n this.scrollContainerSource.next(elem);\r\n }\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { of } from 'rxjs';\r\nimport { environment } from 'src/environments/environment';\r\nimport { SearchResultGroup } from '../_models/search/search-result-group';\r\nimport { Series } from '../_models/series';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SearchService {\r\n\r\n baseUrl = environment.apiUrl;\r\n\r\n constructor(private httpClient: HttpClient) { }\r\n\r\n search(term: string) {\r\n if (term === '') {\r\n return of(new SearchResultGroup());\r\n }\r\n return this.httpClient.get(this.baseUrl + 'search/search?queryString=' + encodeURIComponent(term));\r\n }\r\n\r\n getSeriesForMangaFile(mangaFileId: number) {\r\n return this.httpClient.get(this.baseUrl + 'search/series-for-mangafile?mangaFileId=' + mangaFileId);\r\n }\r\n\r\n getSeriesForChapter(chapterId: number) {\r\n return this.httpClient.get(this.baseUrl + 'search/series-for-chapter?chapterId=' + chapterId);\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { environment } from 'src/environments/environment';\r\nimport { FilterUtilitiesService } from '../shared/_services/filter-utilities.service';\r\nimport { UtilityService } from '../shared/_services/utility.service';\r\nimport { Chapter } from '../_models/chapter';\r\nimport { ChapterMetadata } from '../_models/metadata/chapter-metadata';\r\nimport { CollectionTag } from '../_models/collection-tag';\r\nimport { PaginatedResult } from '../_models/pagination';\r\nimport { Series } from '../_models/series';\r\nimport { RelatedSeries } from '../_models/series-detail/related-series';\r\nimport { SeriesDetail } from '../_models/series-detail/series-detail';\r\nimport { SeriesFilter } from '../_models/metadata/series-filter';\r\nimport { SeriesGroup } from '../_models/series-group';\r\nimport { SeriesMetadata } from '../_models/metadata/series-metadata';\r\nimport { Volume } from '../_models/volume';\r\nimport { ImageService } from './image.service';\r\nimport { TextResonse } from '../_types/text-response';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SeriesService {\r\n\r\n baseUrl = environment.apiUrl;\r\n paginatedResults: PaginatedResult = new PaginatedResult();\r\n paginatedSeriesForTagsResults: PaginatedResult = new PaginatedResult();\r\n\r\n constructor(private httpClient: HttpClient, private imageService: ImageService,\r\n private utilityService: UtilityService, private filterUtilitySerivce: FilterUtilitiesService) { }\r\n\r\n getAllSeries(pageNum?: number, itemsPerPage?: number, filter?: SeriesFilter) {\r\n let params = new HttpParams();\r\n params = this.utilityService.addPaginationIfExists(params, pageNum, itemsPerPage);\r\n const data = this.filterUtilitySerivce.createSeriesFilter(filter);\r\n\r\n return this.httpClient.post>(this.baseUrl + 'series/all', data, {observe: 'response', params}).pipe(\r\n map((response: any) => {\r\n return this.utilityService.createPaginatedResult(response, this.paginatedResults);\r\n })\r\n );\r\n }\r\n\r\n getSeriesForLibrary(libraryId: number, pageNum?: number, itemsPerPage?: number, filter?: SeriesFilter) {\r\n let params = new HttpParams();\r\n params = this.utilityService.addPaginationIfExists(params, pageNum, itemsPerPage);\r\n const data = this.filterUtilitySerivce.createSeriesFilter(filter);\r\n\r\n return this.httpClient.post>(this.baseUrl + 'series?libraryId=' + libraryId, data, {observe: 'response', params}).pipe(\r\n map((response: any) => {\r\n return this.utilityService.createPaginatedResult(response, this.paginatedResults);\r\n })\r\n );\r\n }\r\n\r\n getAllSeriesByIds(seriesIds: Array) {\r\n return this.httpClient.post(this.baseUrl + 'series/series-by-ids', {seriesIds: seriesIds});\r\n }\r\n\r\n getSeries(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'series/' + seriesId);\r\n }\r\n\r\n getVolumes(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'series/volumes?seriesId=' + seriesId);\r\n }\r\n\r\n getChapter(chapterId: number) {\r\n return this.httpClient.get(this.baseUrl + 'series/chapter?chapterId=' + chapterId);\r\n }\r\n\r\n getChapterMetadata(chapterId: number) {\r\n return this.httpClient.get(this.baseUrl + 'series/chapter-metadata?chapterId=' + chapterId);\r\n }\r\n\r\n delete(seriesId: number) {\r\n return this.httpClient.delete(this.baseUrl + 'series/' + seriesId);\r\n }\r\n\r\n deleteMultipleSeries(seriesIds: Array) {\r\n return this.httpClient.post(this.baseUrl + 'series/delete-multiple', {seriesIds});\r\n }\r\n\r\n updateRating(seriesId: number, userRating: number, userReview: string) {\r\n return this.httpClient.post(this.baseUrl + 'series/update-rating', {seriesId, userRating, userReview});\r\n }\r\n\r\n updateSeries(model: any) {\r\n return this.httpClient.post(this.baseUrl + 'series/update', model);\r\n }\r\n\r\n markRead(seriesId: number) {\r\n return this.httpClient.post(this.baseUrl + 'reader/mark-read', {seriesId});\r\n }\r\n\r\n markUnread(seriesId: number) {\r\n return this.httpClient.post(this.baseUrl + 'reader/mark-unread', {seriesId});\r\n }\r\n\r\n getRecentlyAdded(libraryId: number = 0, pageNum?: number, itemsPerPage?: number, filter?: SeriesFilter) {\r\n const data = this.filterUtilitySerivce.createSeriesFilter(filter);\r\n let params = new HttpParams();\r\n params = this.utilityService.addPaginationIfExists(params, pageNum, itemsPerPage);\r\n\r\n return this.httpClient.post(this.baseUrl + 'series/recently-added?libraryId=' + libraryId, data, {observe: 'response', params}).pipe(\r\n map(response => {\r\n return this.utilityService.createPaginatedResult(response, new PaginatedResult());\r\n })\r\n );\r\n }\r\n\r\n getRecentlyUpdatedSeries() {\r\n return this.httpClient.post(this.baseUrl + 'series/recently-updated-series', {});\r\n }\r\n\r\n getWantToRead(pageNum?: number, itemsPerPage?: number, filter?: SeriesFilter): Observable> {\r\n const data = this.filterUtilitySerivce.createSeriesFilter(filter);\r\n\r\n let params = new HttpParams();\r\n params = this.utilityService.addPaginationIfExists(params, pageNum, itemsPerPage);\r\n\r\n return this.httpClient.post(this.baseUrl + 'want-to-read/', data, {observe: 'response', params}).pipe(\r\n map(response => {\r\n return this.utilityService.createPaginatedResult(response, new PaginatedResult());\r\n }));\r\n }\r\n\r\n isWantToRead(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'want-to-read?seriesId=' + seriesId, TextResonse)\r\n .pipe(map(val => {\r\n return val === 'true';\r\n }));\r\n }\r\n\r\n getOnDeck(libraryId: number = 0, pageNum?: number, itemsPerPage?: number, filter?: SeriesFilter) {\r\n const data = this.filterUtilitySerivce.createSeriesFilter(filter);\r\n\r\n let params = new HttpParams();\r\n params = this.utilityService.addPaginationIfExists(params, pageNum, itemsPerPage);\r\n\r\n return this.httpClient.post(this.baseUrl + 'series/on-deck?libraryId=' + libraryId, data, {observe: 'response', params}).pipe(\r\n map(response => {\r\n return this.utilityService.createPaginatedResult(response, new PaginatedResult());\r\n }));\r\n }\r\n\r\n\r\n refreshMetadata(series: Series) {\r\n return this.httpClient.post(this.baseUrl + 'series/refresh-metadata', {libraryId: series.libraryId, seriesId: series.id});\r\n }\r\n\r\n scan(libraryId: number, seriesId: number, force = false) {\r\n return this.httpClient.post(this.baseUrl + 'series/scan', {libraryId: libraryId, seriesId: seriesId, forceUpdate: force});\r\n }\r\n\r\n analyzeFiles(libraryId: number, seriesId: number) {\r\n return this.httpClient.post(this.baseUrl + 'series/analyze', {libraryId: libraryId, seriesId: seriesId});\r\n }\r\n\r\n getMetadata(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'series/metadata?seriesId=' + seriesId).pipe(map(items => {\r\n items?.collectionTags.forEach(tag => tag.coverImage = this.imageService.getCollectionCoverImage(tag.id));\r\n return items;\r\n }));\r\n }\r\n\r\n updateMetadata(seriesMetadata: SeriesMetadata, collectionTags: CollectionTag[]) {\r\n const data = {\r\n seriesMetadata,\r\n collectionTags,\r\n };\r\n return this.httpClient.post(this.baseUrl + 'series/metadata', data, TextResonse);\r\n }\r\n\r\n getSeriesForTag(collectionTagId: number, pageNum?: number, itemsPerPage?: number) {\r\n let params = new HttpParams();\r\n\r\n params = this.utilityService.addPaginationIfExists(params, pageNum, itemsPerPage);\r\n\r\n return this.httpClient.get>(this.baseUrl + 'series/series-by-collection?collectionId=' + collectionTagId, {observe: 'response', params}).pipe(\r\n map((response: any) => {\r\n return this.utilityService.createPaginatedResult(response, this.paginatedSeriesForTagsResults);\r\n })\r\n );\r\n }\r\n\r\n getRelatedForSeries(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'series/all-related?seriesId=' + seriesId);\r\n }\r\n\r\n updateRelationships(seriesId: number, adaptations: Array, characters: Array,\r\n contains: Array, others: Array, prequels: Array,\r\n sequels: Array, sideStories: Array, spinOffs: Array,\r\n alternativeSettings: Array, alternativeVersions: Array, doujinshis: Array, editions: Array) {\r\n return this.httpClient.post(this.baseUrl + 'series/update-related?seriesId=' + seriesId,\r\n {seriesId, adaptations, characters, sequels, prequels, contains, others, sideStories, spinOffs,\r\n alternativeSettings, alternativeVersions, doujinshis, editions});\r\n }\r\n\r\n getSeriesDetail(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'series/series-detail?seriesId=' + seriesId);\r\n }\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n DestroyRef,\r\n inject,\r\n Inject,\r\n Injectable,\r\n OnDestroy,\r\n Renderer2,\r\n RendererFactory2,\r\n SecurityContext\r\n} from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { map, ReplaySubject, Subject, takeUntil, take } from 'rxjs';\r\nimport { environment } from 'src/environments/environment';\r\nimport { ConfirmService } from '../shared/confirm.service';\r\nimport { NotificationProgressEvent } from '../_models/events/notification-progress-event';\r\nimport { SiteTheme, ThemeProvider } from '../_models/preferences/site-theme';\r\nimport { TextResonse } from '../_types/text-response';\r\nimport { EVENTS, MessageHubService } from './message-hub.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThemeService {\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n public defaultTheme: string = 'dark';\r\n public defaultBookTheme: string = 'Dark';\r\n\r\n private currentThemeSource = new ReplaySubject(1);\r\n public currentTheme$ = this.currentThemeSource.asObservable();\r\n\r\n private themesSource = new ReplaySubject(1);\r\n public themes$ = this.themesSource.asObservable();\r\n\r\n /**\r\n * Maintain a cache of themes. SignalR will inform us if we need to refresh cache\r\n */\r\n private themeCache: Array = [];\r\n\r\n private renderer: Renderer2;\r\n private baseUrl = environment.apiUrl;\r\n\r\n\r\n constructor(rendererFactory: RendererFactory2, @Inject(DOCUMENT) private document: Document, private httpClient: HttpClient,\r\n messageHub: MessageHubService, private domSantizer: DomSanitizer, private confirmService: ConfirmService, private toastr: ToastrService) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n\r\n this.getThemes();\r\n\r\n messageHub.messages$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(message => {\r\n\r\n if (message.event !== EVENTS.NotificationProgress) return;\r\n const notificationEvent = (message.payload as NotificationProgressEvent);\r\n if (notificationEvent.name !== EVENTS.SiteThemeProgress) return;\r\n\r\n if (notificationEvent.eventType === 'ended') {\r\n if (notificationEvent.name === EVENTS.SiteThemeProgress) this.getThemes().subscribe(() => {\r\n\r\n });\r\n }\r\n });\r\n }\r\n\r\n getColorScheme() {\r\n return getComputedStyle(this.document.body).getPropertyValue('--color-scheme').trim();\r\n }\r\n\r\n /**\r\n * --theme-color from theme. Updates the meta tag\r\n * @returns\r\n */\r\n getThemeColor() {\r\n return getComputedStyle(this.document.body).getPropertyValue('--theme-color').trim();\r\n }\r\n\r\n /**\r\n * --msapplication-TileColor from theme. Updates the meta tag\r\n * @returns\r\n */\r\n getTileColor() {\r\n return getComputedStyle(this.document.body).getPropertyValue('--title-color').trim();\r\n }\r\n\r\n getCssVariable(variable: string) {\r\n return getComputedStyle(this.document.body).getPropertyValue(variable).trim();\r\n }\r\n\r\n isDarkTheme() {\r\n return this.getColorScheme().toLowerCase() === 'dark';\r\n }\r\n\r\n getThemes() {\r\n return this.httpClient.get(this.baseUrl + 'theme').pipe(map(themes => {\r\n this.themeCache = themes;\r\n this.themesSource.next(themes);\r\n this.currentTheme$.pipe(take(1)).subscribe(theme => {\r\n if (themes.filter(t => t.id === theme.id).length === 0) {\r\n this.setTheme(this.defaultTheme);\r\n this.toastr.info('The active theme no longer exists. Please refresh the page.');\r\n }\r\n });\r\n return themes;\r\n }));\r\n }\r\n\r\n /**\r\n * Used in book reader to remove all themes so book reader can provide custom theming options\r\n */\r\n clearThemes() {\r\n this.unsetThemes();\r\n }\r\n\r\n setDefault(themeId: number) {\r\n return this.httpClient.post(this.baseUrl + 'theme/update-default', {themeId: themeId}).pipe(map(() => {\r\n // Refresh the cache when a default state is changed\r\n this.getThemes().subscribe(() => {});\r\n }));\r\n }\r\n\r\n scan() {\r\n return this.httpClient.post(this.baseUrl + 'theme/scan', {});\r\n }\r\n\r\n /**\r\n * Sets the book theme on the body tag so css variable overrides can take place\r\n * @param selector brtheme- prefixed string\r\n */\r\n setBookTheme(selector: string) {\r\n this.unsetBookThemes();\r\n this.renderer.addClass(this.document.querySelector('body'), selector);\r\n }\r\n\r\n clearBookTheme() {\r\n this.unsetBookThemes();\r\n }\r\n\r\n\r\n /**\r\n * Sets the theme as active. Will inject a style tag into document to load a custom theme and apply the selector to the body\r\n * @param themeName\r\n */\r\n setTheme(themeName: string) {\r\n const theme = this.themeCache.find(t => t.name.toLowerCase() === themeName.toLowerCase());\r\n if (theme) {\r\n this.unsetThemes();\r\n this.renderer.addClass(this.document.querySelector('body'), theme.selector);\r\n\r\n if (theme.provider === ThemeProvider.User && !this.hasThemeInHead(theme.name)) {\r\n // We need to load the styles into the browser\r\n this.fetchThemeContent(theme.id).subscribe(async (content) => {\r\n if (content === null) {\r\n await this.confirmService.alert('There is invalid or unsafe css in the theme. Please reach out to your admin to have this corrected. Defaulting to dark theme.');\r\n this.setTheme('dark');\r\n return;\r\n }\r\n const styleElem = this.document.createElement('style');\r\n styleElem.id = 'theme-' + theme.name;\r\n styleElem.appendChild(this.document.createTextNode(content));\r\n\r\n this.renderer.appendChild(this.document.head, styleElem);\r\n\r\n // Check if the theme has --theme-color and apply it to meta tag\r\n const themeColor = this.getThemeColor();\r\n if (themeColor) {\r\n this.document.querySelector('meta[name=\"theme-color\"]')?.setAttribute('content', themeColor);\r\n this.document.querySelector('meta[name=\"apple-mobile-web-app-status-bar-style\"]')?.setAttribute('content', themeColor);\r\n }\r\n\r\n const tileColor = this.getTileColor();\r\n if (themeColor) {\r\n this.document.querySelector('meta[name=\"msapplication-TileColor\"]')?.setAttribute('content', themeColor);\r\n }\r\n\r\n const colorScheme = this.getColorScheme();\r\n if (themeColor) {\r\n this.document.querySelector('body')?.setAttribute('theme', colorScheme);\r\n }\r\n\r\n this.currentThemeSource.next(theme);\r\n });\r\n } else {\r\n this.currentThemeSource.next(theme);\r\n }\r\n } else {\r\n // Only time themes isn't already loaded is on first load\r\n this.getThemes().subscribe(themes => {\r\n this.setTheme(themeName);\r\n });\r\n }\r\n }\r\n\r\n private hasThemeInHead(themeName: string) {\r\n const id = 'theme-' + themeName.toLowerCase();\r\n return Array.from(this.document.head.children).filter(el => el.tagName === 'STYLE' && el.id.toLowerCase() === id).length > 0;\r\n }\r\n\r\n private fetchThemeContent(themeId: number) {\r\n return this.httpClient.get(this.baseUrl + 'theme/download-content?themeId=' + themeId, TextResonse).pipe(map(encodedCss => {\r\n return this.domSantizer.sanitize(SecurityContext.STYLE, encodedCss);\r\n }));\r\n }\r\n\r\n private unsetThemes() {\r\n this.themeCache.forEach(theme => this.document.body.classList.remove(theme.selector));\r\n }\r\n\r\n private unsetBookThemes() {\r\n Array.from(this.document.body.classList).filter(cls => cls.startsWith('brtheme-')).forEach(c => this.document.body.classList.remove(c));\r\n }\r\n\r\n\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { environment } from 'src/environments/environment';\r\nimport { TextResonse } from '../_types/text-response';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UploadService {\r\n\r\n private baseUrl = environment.apiUrl;\r\n\r\n constructor(private httpClient: HttpClient) { }\r\n\r\n\r\n uploadByUrl(url: string) {\r\n return this.httpClient.post(this.baseUrl + 'upload/upload-by-url', {url}, TextResonse);\r\n }\r\n\r\n /**\r\n * \r\n * @param seriesId Series to overwrite cover image for\r\n * @param url A base64 encoded url\r\n * @returns \r\n */\r\n updateSeriesCoverImage(seriesId: number, url: string) {\r\n return this.httpClient.post(this.baseUrl + 'upload/series', {id: seriesId, url: this._cleanBase64Url(url)});\r\n }\r\n\r\n updateCollectionCoverImage(tagId: number, url: string) {\r\n return this.httpClient.post(this.baseUrl + 'upload/collection', {id: tagId, url: this._cleanBase64Url(url)});\r\n }\r\n\r\n updateReadingListCoverImage(readingListId: number, url: string) {\r\n return this.httpClient.post(this.baseUrl + 'upload/reading-list', {id: readingListId, url: this._cleanBase64Url(url)});\r\n }\r\n\r\n updateChapterCoverImage(chapterId: number, url: string) {\r\n return this.httpClient.post(this.baseUrl + 'upload/chapter', {id: chapterId, url: this._cleanBase64Url(url)});\r\n }\r\n\r\n updateLibraryCoverImage(libraryId: number, url: string) {\r\n return this.httpClient.post(this.baseUrl + 'upload/library', {id: libraryId, url: this._cleanBase64Url(url)});\r\n }\r\n\r\n resetChapterCoverLock(chapterId: number, ) {\r\n return this.httpClient.post(this.baseUrl + 'upload/reset-chapter-lock', {id: chapterId, url: ''});\r\n }\r\n\r\n _cleanBase64Url(url: string) {\r\n if (url.startsWith('data')) {\r\n url = url.split(',')[1];\r\n }\r\n return url;\r\n }\r\n}\r\n","/**\r\n * Use when httpClient is expected to return just a string/variable and not json\r\n */\r\nexport const TextResonse = {responseType: 'text' as 'json'};","
\r\n

Choose a Directory

\r\n \r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
TypeName
...
\r\n {{folder.name}}\r\n
\r\n
\r\n\r\n","import { Component, Input, OnInit, ViewChild } from '@angular/core';\r\nimport { NgbActiveModal, NgbTypeahead } from '@ng-bootstrap/ng-bootstrap';\r\nimport { catchError, debounceTime, distinctUntilChanged, filter, map, merge, Observable, of, OperatorFunction, Subject, switchMap, tap } from 'rxjs';\r\nimport { Stack } from 'src/app/shared/data-structures/stack';\r\nimport { DirectoryDto } from 'src/app/_models/system/directory-dto';\r\nimport { LibraryService } from '../../../_services/library.service';\r\n\r\n\r\nexport interface DirectoryPickerResult {\r\n success: boolean;\r\n folderPath: string;\r\n}\r\n\r\n\r\n\r\n@Component({\r\n selector: 'app-directory-picker',\r\n templateUrl: './directory-picker.component.html',\r\n styleUrls: ['./directory-picker.component.scss']\r\n})\r\nexport class DirectoryPickerComponent implements OnInit {\r\n\r\n @Input() startingFolder: string = '';\r\n /**\r\n * Url to give more information about selecting directories. Passing nothing will suppress. \r\n */\r\n @Input() helpUrl: string = 'https://wiki.kavitareader.com/en/guides/first-time-setup#adding-a-library-to-kavita';\r\n\r\n currentRoot = '';\r\n folders: DirectoryDto[] = [];\r\n routeStack: Stack = new Stack();\r\n\r\n\r\n path: string = '';\r\n @ViewChild('instance', {static: true}) instance!: NgbTypeahead;\r\n focus$ = new Subject();\r\n click$ = new Subject();\r\n searching: boolean = false;\r\n searchFailed: boolean = false;\r\n\r\n\r\n search: OperatorFunction = (text$: Observable) => {\r\n const debouncedText$ = text$.pipe(debounceTime(200), distinctUntilChanged());\r\n const clicksWithClosedPopup$ = this.click$.pipe(filter(() => !this.instance.isPopupOpen()));\r\n const inputFocus$ = this.focus$;\r\n\r\n return merge(debouncedText$, inputFocus$, clicksWithClosedPopup$, text$).pipe(\r\n debounceTime(300),\r\n distinctUntilChanged(),\r\n tap(() => this.searching = true),\r\n switchMap(term =>\r\n this.libraryService.listDirectories(this.path).pipe(\r\n tap(() => this.searchFailed = false),\r\n tap((folders) => this.folders = folders),\r\n map(folders => folders.map(f => f.fullPath)),\r\n catchError(() => {\r\n this.searchFailed = true;\r\n return of([]);\r\n }))\r\n ),\r\n tap(() => this.searching = false)\r\n )\r\n }\r\n\r\n constructor(public modal: NgbActiveModal, private libraryService: LibraryService) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.startingFolder && this.startingFolder.length > 0) {\r\n let folders = this.startingFolder.split('/');\r\n let folders2 = this.startingFolder.split('\\\\');\r\n if (folders.length === 1 && folders2.length > 1) {\r\n folders = folders2;\r\n }\r\n if (!folders[0].endsWith('/')) {\r\n folders[0] = folders[0] + '/';\r\n }\r\n folders.forEach(folder => this.routeStack.push(folder));\r\n\r\n const fullPath = this.routeStack.items.join('/');\r\n this.loadChildren(fullPath);\r\n } else {\r\n this.loadChildren(this.currentRoot);\r\n }\r\n }\r\n\r\n updateTable() {\r\n this.loadChildren(this.path);\r\n }\r\n\r\n\r\n selectNode(folder: DirectoryDto) {\r\n if (folder.disabled) return;\r\n this.currentRoot = folder.name;\r\n this.routeStack.push(folder.name);\r\n this.path = folder.fullPath;\r\n this.loadChildren(this.path);\r\n }\r\n\r\n goBack() {\r\n this.routeStack.pop();\r\n const stackPeek = this.routeStack.peek();\r\n if (stackPeek !== undefined) {\r\n this.currentRoot = stackPeek;\r\n const fullPath = this.routeStack.items.join('/');\r\n this.loadChildren(fullPath);\r\n } else {\r\n this.currentRoot = '';\r\n this.loadChildren(this.currentRoot);\r\n }\r\n }\r\n\r\n loadChildren(path: string) {\r\n this.libraryService.listDirectories(path).subscribe(folders => {\r\n this.folders = folders;\r\n }, err => {\r\n // If there was an error, pop off last directory added to stack\r\n this.routeStack.pop();\r\n const item = this.folders.find(f => f.fullPath === path);\r\n if (item) {\r\n item.disabled = true;\r\n }\r\n });\r\n }\r\n\r\n shareFolder(fullPath: string, event: any) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.modal.close({success: true, folderPath: fullPath});\r\n }\r\n\r\n share() {\r\n this.modal.close({success: true, folderPath: this.path});\r\n }\r\n\r\n close() {\r\n this.modal.close({success: false, folderPath: undefined});\r\n }\r\n\r\n getStem(path: string): string {\r\n\r\n const lastPath = this.routeStack.peek();\r\n if (lastPath && lastPath != path) {\r\n let replaced = path.replace(lastPath, '');\r\n if (replaced.startsWith('/') || replaced.startsWith('\\\\')) {\r\n replaced = replaced.substring(1, replaced.length);\r\n }\r\n return replaced;\r\n }\r\n\r\n return path;\r\n }\r\n\r\n navigateTo(index: number) {\r\n while(this.routeStack.items.length - 1 > index) {\r\n this.routeStack.pop();\r\n }\r\n \r\n const fullPath = this.routeStack.items.join('/');\r\n this.path = fullPath;\r\n this.loadChildren(fullPath);\r\n }\r\n}\r\n\r\n\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { map } from 'rxjs';\r\nimport { environment } from 'src/environments/environment';\r\nimport { TextResonse } from '../_types/text-response';\r\nimport { ServerSettings } from './_models/server-settings';\r\n\r\n/**\r\n * Used only for the Test Email Service call\r\n */\r\nexport interface EmailTestResult {\r\n successful: boolean;\r\n errorMessage: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SettingsService {\r\n\r\n baseUrl = environment.apiUrl;\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n getServerSettings() {\r\n return this.http.get(this.baseUrl + 'settings');\r\n }\r\n\r\n getBaseUrl() {\r\n return this.http.get(this.baseUrl + 'settings/base-url', TextResonse);\r\n }\r\n\r\n updateServerSettings(model: ServerSettings) {\r\n return this.http.post(this.baseUrl + 'settings', model);\r\n }\r\n\r\n resetServerSettings() {\r\n return this.http.post(this.baseUrl + 'settings/reset', {});\r\n }\r\n\r\n resetIPAddressesSettings() {\r\n return this.http.post(this.baseUrl + 'settings/reset-ip-addresses', {});\r\n }\r\n\r\n resetBaseUrl() {\r\n return this.http.post(this.baseUrl + 'settings/reset-base-url', {});\r\n }\r\n\r\n resetEmailServerSettings() {\r\n return this.http.post(this.baseUrl + 'settings/reset-email-url', {});\r\n }\r\n\r\n testEmailServerSettings(emailUrl: string) {\r\n return this.http.post(this.baseUrl + 'settings/test-email-url', {url: emailUrl});\r\n }\r\n\r\n getTaskFrequencies() {\r\n return this.http.get(this.baseUrl + 'settings/task-frequencies');\r\n }\r\n\r\n getLoggingLevels() {\r\n return this.http.get(this.baseUrl + 'settings/log-levels');\r\n }\r\n\r\n getLibraryTypes() {\r\n return this.http.get(this.baseUrl + 'settings/library-types');\r\n }\r\n\r\n getOpdsEnabled() {\r\n return this.http.get(this.baseUrl + 'settings/opds-enabled', TextResonse).pipe(map(d => d === 'true'));\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'dynamicList',\r\n pure: true\r\n})\r\nexport class DynamicListPipe implements PipeTransform {\r\n\r\n transform(value: any): Array<{title: string, data: any}> {\r\n if (value === undefined || value === null) return [];\r\n return value as {title: string, data: any}[];\r\n }\r\n\r\n}\r\n"," 0\">\r\n
\r\n \r\n
\r\n\t\t\t \r\n
\r\n
\r\n\t\r\n\t\t\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\t\t
\r\n\t
\r\n
","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { NgbDropdown } from '@ng-bootstrap/ng-bootstrap';\r\nimport { take } from 'rxjs';\r\nimport { AccountService } from 'src/app/_services/account.service';\r\nimport { Action, ActionItem } from 'src/app/_services/action-factory.service';\r\n\r\n@Component({\r\n selector: 'app-card-actionables',\r\n templateUrl: './card-actionables.component.html',\r\n styleUrls: ['./card-actionables.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CardActionablesComponent implements OnInit {\r\n\r\n @Input() iconClass = 'fa-ellipsis-v';\r\n @Input() btnClass = '';\r\n @Input() actions: ActionItem[] = [];\r\n @Input() labelBy = 'card';\r\n @Input() disabled: boolean = false;\r\n @Output() actionHandler = new EventEmitter>();\r\n\r\n\r\n isAdmin: boolean = false;\r\n canDownload: boolean = false;\r\n submenu: {[key: string]: NgbDropdown} = {};\r\n\r\n constructor(private readonly cdRef: ChangeDetectorRef, private accountService: AccountService) { }\r\n\r\n ngOnInit(): void {\r\n this.accountService.currentUser$.pipe(take(1)).subscribe((user) => {\r\n if (!user) return;\r\n this.isAdmin = this.accountService.hasAdminRole(user);\r\n this.canDownload = this.accountService.hasDownloadRole(user);\r\n\r\n // We want to avoid an empty menu when user doesn't have access to anything\r\n if (!this.isAdmin && this.actions.filter(a => !a.requiresAdmin).length === 0) {\r\n this.actions = [];\r\n }\r\n this.cdRef.markForCheck();\r\n });\r\n }\r\n\r\n preventEvent(event: any) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n\r\n performAction(event: any, action: ActionItem) {\r\n this.preventEvent(event);\r\n\r\n if (typeof action.callback === 'function') {\r\n this.actionHandler.emit(action);\r\n }\r\n }\r\n\r\n willRenderAction(action: ActionItem) {\r\n return (action.requiresAdmin && this.isAdmin) \r\n || (action.action === Action.Download && (this.canDownload || this.isAdmin))\r\n || (!action.requiresAdmin && action.action !== Action.Download);\r\n }\r\n\r\n shouldRenderSubMenu(action: ActionItem, dynamicList: null | Array) {\r\n return (action.children[0].dynamicList === undefined || action.children[0].dynamicList === null) || (dynamicList !== null && dynamicList.length > 0);\r\n }\r\n\r\n openSubmenu(actionTitle: string, subMenu: NgbDropdown) {\r\n // We keep track when we open and when we get a request to open, if we have other keys, we close them and clear their keys\r\n if (Object.keys(this.submenu).length > 0) {\r\n const keys = Object.keys(this.submenu).filter(k => k !== actionTitle);\r\n keys.forEach(key => {\r\n this.submenu[key].close();\r\n delete this.submenu[key];\r\n });\r\n }\r\n this.submenu[actionTitle] = subMenu;\r\n subMenu.open();\r\n }\r\n\r\n closeAllSubmenus() {\r\n Object.keys(this.submenu).forEach(key => {\r\n this.submenu[key].close();\r\n delete this.submenu[key];\r\n });\r\n }\r\n\r\n performDynamicClick(event: any, action: ActionItem, dynamicItem: any) {\r\n action._extra = dynamicItem;\r\n this.performAction(event, action);\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MetadataFilterComponent } from './metadata-filter.component';\r\nimport { NgbCollapseModule, NgbRatingModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { SharedModule } from '../shared/shared.module';\r\nimport { TypeaheadModule } from '../typeahead/typeahead.module';\r\n\r\n@NgModule({\r\n declarations: [\r\n MetadataFilterComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NgbTooltipModule, \r\n NgbRatingModule,\r\n NgbCollapseModule,\r\n SharedModule,\r\n TypeaheadModule,\r\n ],\r\n exports: [\r\n MetadataFilterComponent\r\n ]\r\n})\r\nexport class MetadataFilterModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SeriesCardComponent } from './series-card/series-card.component';\r\nimport { CoverImageChooserComponent } from './cover-image-chooser/cover-image-chooser.component';\r\nimport { EditSeriesModalComponent } from './_modals/edit-series-modal/edit-series-modal.component';\r\nimport { EditCollectionTagsComponent } from './_modals/edit-collection-tags/edit-collection-tags.component';\r\nimport { NgbTooltipModule, NgbCollapseModule, NgbPaginationModule, NgbDropdownModule, NgbProgressbarModule, NgbNavModule, NgbRatingModule, NgbOffcanvasModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { CardActionablesComponent } from './card-item/card-actionables/card-actionables.component';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { NgxFileDropModule } from 'ngx-file-drop';\r\nimport { CardItemComponent } from './card-item/card-item.component';\r\nimport { SharedModule } from '../shared/shared.module';\r\nimport { RouterModule } from '@angular/router';\r\nimport { TypeaheadModule } from '../typeahead/typeahead.module';\r\nimport { CardDetailLayoutComponent } from './card-detail-layout/card-detail-layout.component';\r\nimport { BulkOperationsComponent } from './bulk-operations/bulk-operations.component';\r\nimport { BulkAddToCollectionComponent } from './_modals/bulk-add-to-collection/bulk-add-to-collection.component';\r\nimport { PipeModule } from '../pipe/pipe.module';\r\nimport { ChapterMetadataDetailComponent } from './chapter-metadata-detail/chapter-metadata-detail.component';\r\nimport { MetadataFilterModule } from '../metadata-filter/metadata-filter.module';\r\nimport { EditSeriesRelationComponent } from './edit-series-relation/edit-series-relation.component';\r\nimport { CardDetailDrawerComponent } from './card-detail-drawer/card-detail-drawer.component';\r\nimport { EntityTitleComponent } from './entity-title/entity-title.component';\r\nimport { EntityInfoCardsComponent } from './entity-info-cards/entity-info-cards.component';\r\nimport { ListItemComponent } from './list-item/list-item.component';\r\nimport { VirtualScrollerModule } from '@iharbeck/ngx-virtual-scroller';\r\nimport { SeriesInfoCardsComponent } from './series-info-cards/series-info-cards.component';\r\nimport { DownloadIndicatorComponent } from './download-indicator/download-indicator.component';\r\nimport { DynamicListPipe } from './dynamic-list.pipe';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n CardItemComponent,\r\n SeriesCardComponent,\r\n CoverImageChooserComponent,\r\n EditSeriesModalComponent,\r\n EditCollectionTagsComponent,\r\n CardActionablesComponent,\r\n CardDetailLayoutComponent,\r\n BulkOperationsComponent,\r\n BulkAddToCollectionComponent,\r\n ChapterMetadataDetailComponent,\r\n EditSeriesRelationComponent,\r\n CardDetailDrawerComponent,\r\n EntityTitleComponent,\r\n EntityInfoCardsComponent,\r\n ListItemComponent,\r\n SeriesInfoCardsComponent,\r\n DownloadIndicatorComponent,\r\n DynamicListPipe,\r\n ],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n ReactiveFormsModule,\r\n FormsModule, // EditCollectionsModal\r\n\r\n PipeModule,\r\n SharedModule,\r\n TypeaheadModule, // edit series modal\r\n\r\n MetadataFilterModule,\r\n\r\n NgbTooltipModule, // Card item\r\n NgbCollapseModule,\r\n NgbRatingModule,\r\n \r\n VirtualScrollerModule,\r\n\r\n NgbOffcanvasModule, // Series Detail, action of cards\r\n NgbNavModule, //Series Detail\r\n NgbPaginationModule, // EditCollectionTagsComponent \r\n NgbDropdownModule,\r\n NgbProgressbarModule,\r\n NgxFileDropModule, // Cover Chooser\r\n PipeModule, // filter for BulkAddToCollectionComponent\r\n\r\n \r\n \r\n\r\n SharedModule, // IconAndTitleComponent\r\n ],\r\n exports: [\r\n CardItemComponent,\r\n SeriesCardComponent,\r\n SeriesCardComponent,\r\n CoverImageChooserComponent,\r\n EditSeriesModalComponent,\r\n EditCollectionTagsComponent,\r\n CardActionablesComponent,\r\n CardDetailLayoutComponent,\r\n BulkOperationsComponent,\r\n ChapterMetadataDetailComponent,\r\n EditSeriesRelationComponent,\r\n\r\n EntityTitleComponent,\r\n EntityInfoCardsComponent,\r\n ListItemComponent,\r\n\r\n NgbOffcanvasModule,\r\n\r\n VirtualScrollerModule,\r\n SeriesInfoCardsComponent\r\n\r\n\r\n ]\r\n})\r\nexport class CardsModule { }\r\n","
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n
\r\n Enter a Url\r\n •\r\n Drag and drop\r\n •\r\n Upload an image\r\n
\r\n
\r\n
\r\n
\r\n \r\n\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n\r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n 0\">\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Inject, Input, OnDestroy, OnInit, Output } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport { NgxFileDropEntry, FileSystemFileEntry } from 'ngx-file-drop';\r\nimport { fromEvent, Subject } from 'rxjs';\r\nimport { takeWhile } from 'rxjs/operators';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { ImageService } from 'src/app/_services/image.service';\r\nimport { KEY_CODES } from 'src/app/shared/_services/utility.service';\r\nimport { UploadService } from 'src/app/_services/upload.service';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\nexport type SelectCoverFunction = (selectedCover: string) => void;\r\n\r\n@Component({\r\n selector: 'app-cover-image-chooser',\r\n templateUrl: './cover-image-chooser.component.html',\r\n styleUrls: ['./cover-image-chooser.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CoverImageChooserComponent implements OnInit, OnDestroy {\r\n\r\n /**\r\n * If buttons show under images to allow immediate selection of cover images.\r\n */\r\n @Input() showApplyButton: boolean = false;\r\n /**\r\n * When a cover image is selected, this will be called with a base url representation of the file.\r\n */\r\n @Output() applyCover: EventEmitter = new EventEmitter();\r\n /**\r\n * When a cover image is reset, this will be called.\r\n */\r\n @Output() resetCover: EventEmitter = new EventEmitter();\r\n\r\n @Input() imageUrls: Array = [];\r\n @Output() imageUrlsChange: EventEmitter> = new EventEmitter>();\r\n\r\n /**\r\n * Should the control give the ability to select an image that emits the reset status for cover image\r\n */\r\n @Input() showReset: boolean = false;\r\n @Output() resetClicked: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Emits the selected index. Used usually to check if something other than the default image was selected.\r\n */\r\n @Output() imageSelected: EventEmitter = new EventEmitter();\r\n /**\r\n * Emits a base64 encoded image\r\n */\r\n @Output() selectedBase64Url: EventEmitter = new EventEmitter();\r\n\r\n\r\n\r\n selectedIndex: number = 0;\r\n /**\r\n * Only applies for showApplyButton. Used to track which image is applied.\r\n */\r\n appliedIndex: number = 0;\r\n form!: FormGroup;\r\n files: NgxFileDropEntry[] = [];\r\n acceptableExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.webp'].join(',');\r\n\r\n mode: 'file' | 'url' | 'all' = 'all';\r\n private readonly onDestroy = new Subject();\r\n\r\n constructor(public imageService: ImageService, private fb: FormBuilder, private toastr: ToastrService, private uploadService: UploadService,\r\n @Inject(DOCUMENT) private document: Document, private readonly cdRef: ChangeDetectorRef) { }\r\n\r\n ngOnInit(): void {\r\n this.form = this.fb.group({\r\n coverImageUrl: new FormControl('', [])\r\n });\r\n\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.onDestroy.next();\r\n this.onDestroy.complete();\r\n }\r\n\r\n /**\r\n * Generates a base64 encoding for an Image. Used in manual file upload flow.\r\n * @param img \r\n * @returns \r\n */\r\n getBase64Image(img: HTMLImageElement) {\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n const ctx = canvas.getContext(\"2d\", {alpha: false});\r\n if (!ctx) {\r\n return '';\r\n }\r\n\r\n ctx.drawImage(img, 0, 0);\r\n const dataURL = canvas.toDataURL(\"image/png\");\r\n return dataURL;\r\n }\r\n\r\n selectImage(index: number) {\r\n if (this.selectedIndex === index) { return; }\r\n\r\n // If we load custom images of series/chapters/covers, then those urls are not properly encoded, so on select we have to clean them up\r\n if (!this.imageUrls[index].startsWith('data:image/')) {\r\n const imgUrl = this.imageUrls[index];\r\n const img = new Image();\r\n img.crossOrigin = 'Anonymous';\r\n img.src = imgUrl;\r\n img.onload = (e) => this.handleUrlImageAdd(img, index);\r\n img.onerror = (e) => {\r\n this.toastr.error('The image could not be fetched due to server refusing request. Please download and upload from file instead.');\r\n this.form.get('coverImageUrl')?.setValue('');\r\n this.cdRef.markForCheck();\r\n };\r\n this.form.get('coverImageUrl')?.setValue('');\r\n this.cdRef.markForCheck();\r\n this.selectedBase64Url.emit(this.imageUrls[this.selectedIndex]);\r\n return;\r\n }\r\n\r\n this.selectedIndex = index;\r\n this.cdRef.markForCheck();\r\n this.imageSelected.emit(this.selectedIndex);\r\n this.selectedBase64Url.emit(this.imageUrls[this.selectedIndex]);\r\n }\r\n\r\n applyImage(index: number) {\r\n if (this.showApplyButton) {\r\n this.applyCover.emit(this.imageUrls[index]);\r\n this.appliedIndex = index;\r\n this.cdRef.markForCheck();\r\n }\r\n }\r\n\r\n resetImage() {\r\n if (this.showApplyButton) {\r\n this.resetCover.emit();\r\n }\r\n }\r\n\r\n loadImage(url?: string) {\r\n url = url || this.form.get('coverImageUrl')?.value.trim();\r\n if (!url || url === '') return;\r\n\r\n this.uploadService.uploadByUrl(url).subscribe(filename => {\r\n const img = new Image();\r\n img.crossOrigin = 'Anonymous';\r\n img.src = this.imageService.getCoverUploadImage(filename);\r\n img.onload = (e) => this.handleUrlImageAdd(img);\r\n img.onerror = (e) => {\r\n this.toastr.error('The image could not be fetched due to server refusing request. Please download and upload from file instead.');\r\n this.form.get('coverImageUrl')?.setValue('');\r\n this.cdRef.markForCheck();\r\n };\r\n this.form.get('coverImageUrl')?.setValue('');\r\n this.cdRef.markForCheck();\r\n });\r\n }\r\n\r\n\r\n\r\n changeMode(mode: 'url') {\r\n this.mode = mode;\r\n this.setupEnterHandler();\r\n this.cdRef.markForCheck();\r\n\r\n setTimeout(() => (this.document.querySelector('#load-image') as HTMLInputElement)?.focus(), 10);\r\n }\r\n\r\n public dropped(files: NgxFileDropEntry[]) {\r\n this.files = files;\r\n for (const droppedFile of files) {\r\n\r\n // Is it a file?\r\n if (droppedFile.fileEntry.isFile) {\r\n const fileEntry = droppedFile.fileEntry as FileSystemFileEntry;\r\n fileEntry.file((file: File) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => this.handleFileImageAdd(e);\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n }\r\n }\r\n\r\n handleFileImageAdd(e: any) {\r\n if (e.target == null) return;\r\n\r\n this.imageUrls.push(e.target.result); // This is base64 already\r\n this.imageUrlsChange.emit(this.imageUrls);\r\n this.selectedIndex = this.imageUrls.length - 1;\r\n this.imageSelected.emit(this.selectedIndex); // Auto select newly uploaded image\r\n this.selectedBase64Url.emit(e.target.result);\r\n setTimeout(() => {\r\n (this.document.querySelector('div.image-card[aria-label=\"Image ' + this.selectedIndex + '\"]') as HTMLElement).focus();\r\n })\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n handleUrlImageAdd(img: HTMLImageElement, index: number = -1) {\r\n const url = this.getBase64Image(img);\r\n if (index >= 0) {\r\n this.imageUrls[index] = url;\r\n } else {\r\n this.imageUrls.push(url);\r\n }\r\n \r\n this.imageUrlsChange.emit(this.imageUrls);\r\n this.cdRef.markForCheck();\r\n\r\n setTimeout(() => {\r\n // Auto select newly uploaded image and tell parent of new base64 url\r\n this.selectImage(index >= 0 ? index : this.imageUrls.length - 1);\r\n });\r\n }\r\n\r\n public fileOver(event: any){\r\n }\r\n\r\n public fileLeave(event: any){\r\n }\r\n\r\n reset() {\r\n this.resetClicked.emit();\r\n this.selectedIndex = -1;\r\n }\r\n\r\n setupEnterHandler() {\r\n setTimeout(() => {\r\n const elem = document.querySelector('input[id=\"load-image\"]');\r\n if (elem == null) return;\r\n fromEvent(elem, 'keydown')\r\n .pipe(takeWhile(() => this.mode === 'url')).subscribe((event) => {\r\n const evt = event;\r\n switch(evt.key) {\r\n case KEY_CODES.ENTER:\r\n {\r\n this.loadImage();\r\n break;\r\n }\r\n\r\n case KEY_CODES.ESC_KEY:\r\n this.mode = 'all';\r\n event.stopPropagation();\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n });\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'bytes'\r\n})\r\nexport class BytesPipe implements PipeTransform {\r\n\r\n /**\r\n * Format bytes as human-readable text.\r\n * \r\n * @param bytes Number of bytes.\r\n * @param si True to use metric (SI) units, aka powers of 1000. False to use \r\n * binary (IEC), aka powers of 1024.\r\n * @param dp Number of decimal places to display.\r\n * \r\n * @return Formatted string.\r\n * \r\n * Credit: https://stackoverflow.com/questions/10420352/converting-file-size-in-bytes-to-human-readable-string\r\n */\r\n transform(bytes: number, si=true, dp=1): string {\r\n const thresh = si ? 1000 : 1024;\r\n\r\n if (Math.abs(bytes) < thresh) {\r\n return bytes + ' B';\r\n }\r\n\r\n const units = si \r\n ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] \r\n : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];\r\n let u = -1;\r\n const r = 10**dp;\r\n\r\n do {\r\n bytes /= thresh;\r\n ++u;\r\n } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);\r\n\r\n const fixed = bytes.toFixed(dp);\r\n if ((fixed + '').endsWith('.0')) {\r\n return bytes.toFixed(0) + ' ' + units[u];\r\n }\r\n\r\n return fixed + ' ' + units[u];\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'filter',\r\n pure: false\r\n})\r\nexport class FilterPipe implements PipeTransform {\r\n\r\n transform(items: any[], callback: (item: any) => boolean): any {\r\n if (!items || !callback) {\r\n return items;\r\n }\r\n return items.filter(item => callback(item));\r\n}\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { MangaFormat } from '../_models/manga-format';\r\n\r\n/**\r\n * Returns the icon class representing the format\r\n */\r\n@Pipe({\r\n name: 'mangaFormatIcon'\r\n})\r\nexport class MangaFormatIconPipe implements PipeTransform {\r\n\r\n transform(format: MangaFormat): string {\r\n switch (format) {\r\n case MangaFormat.EPUB:\r\n return 'fa-book';\r\n case MangaFormat.ARCHIVE:\r\n return 'fa-file-archive';\r\n case MangaFormat.IMAGE:\r\n return 'fa-image';\r\n case MangaFormat.PDF:\r\n return 'fa-file-pdf';\r\n case MangaFormat.UNKNOWN:\r\n return 'fa-question';\r\n }\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { MangaFormat } from '../_models/manga-format';\r\n\r\n/**\r\n * Returns the string name for the format\r\n */\r\n@Pipe({\r\n name: 'mangaFormat'\r\n})\r\nexport class MangaFormatPipe implements PipeTransform {\r\n\r\n transform(format: MangaFormat): string {\r\n switch (format) {\r\n case MangaFormat.EPUB:\r\n return 'EPUB';\r\n case MangaFormat.ARCHIVE:\r\n return 'Archive';\r\n case MangaFormat.IMAGE:\r\n return 'Image';\r\n case MangaFormat.PDF:\r\n return 'PDF';\r\n case MangaFormat.UNKNOWN:\r\n return 'Unknown';\r\n }\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FilterPipe } from './filter.pipe';\r\nimport { PublicationStatusPipe } from './publication-status.pipe';\r\nimport { SentenceCasePipe } from './sentence-case.pipe';\r\nimport { PersonRolePipe } from './person-role.pipe';\r\nimport { SafeHtmlPipe } from './safe-html.pipe';\r\nimport { RelationshipPipe } from './relationship.pipe';\r\nimport { DefaultValuePipe } from './default-value.pipe';\r\nimport { CompactNumberPipe } from './compact-number.pipe';\r\nimport { LanguageNamePipe } from './language-name.pipe';\r\nimport { AgeRatingPipe } from './age-rating.pipe';\r\nimport { MangaFormatPipe } from './manga-format.pipe';\r\nimport { MangaFormatIconPipe } from './manga-format-icon.pipe';\r\nimport { LibraryTypePipe } from './library-type.pipe';\r\nimport { SafeStylePipe } from './safe-style.pipe';\r\nimport { DefaultDatePipe } from './default-date.pipe';\r\nimport { BytesPipe } from './bytes.pipe';\r\nimport { TimeAgoPipe } from './time-ago.pipe';\r\nimport { TimeDurationPipe } from './time-duration.pipe';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n FilterPipe,\r\n PersonRolePipe,\r\n PublicationStatusPipe,\r\n SentenceCasePipe,\r\n SafeHtmlPipe,\r\n RelationshipPipe,\r\n DefaultValuePipe,\r\n CompactNumberPipe,\r\n LanguageNamePipe,\r\n AgeRatingPipe,\r\n MangaFormatPipe,\r\n MangaFormatIconPipe,\r\n LibraryTypePipe,\r\n SafeStylePipe,\r\n DefaultDatePipe,\r\n BytesPipe,\r\n TimeAgoPipe,\r\n TimeDurationPipe,\r\n ],\r\n imports: [\r\n CommonModule,\r\n ],\r\n exports: [\r\n FilterPipe,\r\n PersonRolePipe,\r\n PublicationStatusPipe,\r\n SentenceCasePipe,\r\n SafeHtmlPipe,\r\n RelationshipPipe,\r\n DefaultValuePipe,\r\n CompactNumberPipe,\r\n LanguageNamePipe,\r\n AgeRatingPipe,\r\n MangaFormatPipe,\r\n MangaFormatIconPipe,\r\n LibraryTypePipe,\r\n SafeStylePipe,\r\n DefaultDatePipe,\r\n BytesPipe,\r\n TimeAgoPipe,\r\n TimeDurationPipe\r\n ]\r\n})\r\nexport class PipeModule { }\r\n","import { Pipe, PipeTransform, SecurityContext } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Pipe({\r\n name: 'safeHtml'\r\n})\r\nexport class SafeHtmlPipe implements PipeTransform {\r\n\r\n constructor(private dom: DomSanitizer) {}\r\n\r\n transform(value: string): unknown {\r\n return this.dom.sanitize(SecurityContext.HTML, value);\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'sentenceCase'\r\n})\r\nexport class SentenceCasePipe implements PipeTransform {\r\n\r\n transform(value: string | null): string {\r\n if (value === null || value === undefined) return '';\r\n \r\n return value.charAt(0).toUpperCase() + value.substr(1);\r\n }\r\n\r\n}\r\n","export enum CblImportResult {\r\n Fail = 0,\r\n Partial = 1,\r\n Success = 2\r\n}","\r\n
\r\n
    \r\n \r\n
  • \r\n
    \r\n {{step.title}}\r\n
  • \r\n
    \r\n
\r\n
","import { Component, Input, ChangeDetectionStrategy, OnInit, ChangeDetectorRef } from '@angular/core';\r\nimport { BehaviorSubject, ReplaySubject } from 'rxjs';\r\n\r\n\r\nexport interface TimelineStep {\r\n title: string;\r\n active: boolean;\r\n icon: string;\r\n index: number;\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'app-step-tracker',\r\n templateUrl: './step-tracker.component.html',\r\n styleUrls: ['./step-tracker.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class StepTrackerComponent {\r\n @Input() steps: Array = [];\r\n @Input() currentStep: number = 0;\r\n \r\n\r\n constructor(private readonly cdRef: ChangeDetectorRef) {}\r\n\r\n}\r\n","export enum CblImportReason {\r\n ChapterMissing = 0,\r\n VolumeMissing = 1,\r\n SeriesMissing = 2,\r\n NameConflict = 3,\r\n AllSeriesMissing = 4,\r\n EmptyFile = 5,\r\n SeriesCollision = 6,\r\n AllChapterMissing = 7,\r\n Success = 8,\r\n InvalidFile = 9\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { CblBookResult } from 'src/app/_models/reading-list/cbl/cbl-book-result';\r\nimport { CblImportReason } from 'src/app/_models/reading-list/cbl/cbl-import-reason.enum';\r\n\r\nconst failIcon = '';\r\nconst successIcon = '';\r\n\r\n@Pipe({\r\n name: 'cblConflictReason'\r\n})\r\nexport class CblConflictReasonPipe implements PipeTransform {\r\n\r\n transform(result: CblBookResult): string {\r\n switch (result.reason) {\r\n case CblImportReason.AllSeriesMissing:\r\n return failIcon + 'Your account is missing access to all series in the list or Kavita does not have anything present in the list.';\r\n case CblImportReason.ChapterMissing:\r\n return failIcon + result.series + ': ' + 'Chapter ' + result.number + ' is missing from Kavita. This item will be skipped.';\r\n case CblImportReason.EmptyFile:\r\n return failIcon + 'The cbl file is empty, nothing to be done.';\r\n case CblImportReason.NameConflict:\r\n return failIcon + 'A reading list (' + result.readingListName + ') already exists on your account that matches the cbl file.';\r\n case CblImportReason.SeriesCollision:\r\n return failIcon + 'The series, ' + `${result.series}` + ', collides with another series of the same name in another library.';\r\n case CblImportReason.SeriesMissing:\r\n return failIcon + 'The series, ' + result.series + ', is missing from Kavita or your account does not have permission. All items with this series will be skipped from import.';\r\n case CblImportReason.VolumeMissing:\r\n return failIcon + result.series + ': ' + 'Volume ' + result.volume + ' is missing from Kavita. All items with this volume number will be skipped.';\r\n case CblImportReason.AllChapterMissing:\r\n return failIcon + 'All chapters cannot be matched to Chapters in Kavita.';\r\n case CblImportReason.Success:\r\n return successIcon + result.series + ' volume ' + result.volume + ' number ' + result.number + ' mapped successfully.';\r\n case CblImportReason.InvalidFile:\r\n return failIcon + 'The file is corrupted or not matching the expected tags/spec.';\r\n }\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { CblImportResult } from 'src/app/_models/reading-list/cbl/cbl-import-result.enum';\r\n\r\n@Pipe({\r\n name: 'cblImportResult'\r\n})\r\nexport class CblImportResultPipe implements PipeTransform {\r\n\r\n transform(result: CblImportResult): string {\r\n switch (result) {\r\n case CblImportResult.Success:\r\n return 'Success';\r\n case CblImportResult.Partial:\r\n return 'Partial';\r\n case CblImportResult.Fail:\r\n return 'Failure';\r\n }\r\n }\r\n}\r\n","\r\n
\r\n

CBL Import

\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n\r\n \r\n
\r\n
\r\n

To get started, import a .cbl file. Kavita will perform multiple checks before importing. Some steps will block moving forward due to issues with the file.

\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n

All files have been validated to see if there are any operations to do on the list. Any lists have have failed will not move to the next step. Fix the CBL files and retry.

\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n 0; else noValidateIssues\">\r\n
There are issues with the CBL that will prevent an import. Correct these issues then try again.
\r\n
    \r\n
  1. \r\n
  2. \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n Looks good\r\n
\r\n
\r\n No issues found with CBL, press next.\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n

This is a dry run and shows what will happen if you press Next and perform the import. All Failures will not be imported.

\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n
    \r\n
  • \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n {{success}} \r\n {{success}} \r\n {{success}} \r\n \r\n \r\n {{filename}}: ({{summary.cblName}})\r\n \r\n\r\n\r\n
\r\n
\r\n Help\r\n \r\n \r\n \r\n
\r\n\r\n\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, ViewChild } from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport { FileUploadValidators } from '@iplab/ngx-file-upload';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { forkJoin } from 'rxjs';\r\nimport { Breakpoint, UtilityService } from 'src/app/shared/_services/utility.service';\r\nimport { CblImportResult } from 'src/app/_models/reading-list/cbl/cbl-import-result.enum';\r\nimport { CblImportSummary } from 'src/app/_models/reading-list/cbl/cbl-import-summary';\r\nimport { ReadingListService } from 'src/app/_services/reading-list.service';\r\nimport { TimelineStep } from '../../_components/step-tracker/step-tracker.component';\r\n\r\ninterface FileStep {\r\n fileName: string;\r\n validateSummary: CblImportSummary | undefined;\r\n dryRunSummary: CblImportSummary | undefined;\r\n finalizeSummary: CblImportSummary | undefined;\r\n}\r\n\r\nenum Step {\r\n Import = 0,\r\n Validate = 1,\r\n DryRun = 2,\r\n Finalize = 3\r\n}\r\n\r\n@Component({\r\n selector: 'app-import-cbl-modal',\r\n templateUrl: './import-cbl-modal.component.html',\r\n styleUrls: ['./import-cbl-modal.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ImportCblModalComponent {\r\n\r\n @ViewChild('fileUpload') fileUpload!: ElementRef;\r\n\r\n fileUploadControl = new FormControl>(undefined, [\r\n FileUploadValidators.accept(['.cbl']),\r\n ]);\r\n \r\n uploadForm = new FormGroup({\r\n files: this.fileUploadControl\r\n });\r\n\r\n isLoading: boolean = false;\r\n\r\n steps: Array = [\r\n {title: 'Import CBLs', index: Step.Import, active: true, icon: 'fa-solid fa-file-arrow-up'},\r\n {title: 'Validate CBL', index: Step.Validate, active: false, icon: 'fa-solid fa-spell-check'},\r\n {title: 'Dry Run', index: Step.DryRun, active: false, icon: 'fa-solid fa-gears'},\r\n {title: 'Final Import', index: Step.Finalize, active: false, icon: 'fa-solid fa-floppy-disk'},\r\n ];\r\n currentStepIndex = this.steps[0].index;\r\n\r\n filesToProcess: Array = [];\r\n failedFiles: Array = [];\r\n\r\n get Breakpoint() { return Breakpoint; }\r\n get Step() { return Step; }\r\n get CblImportResult() { return CblImportResult; }\r\n\r\n get FileCount() { \r\n const files = this.uploadForm.get('files')?.value;\r\n if (!files) return 0;\r\n return files.length;\r\n }\r\n\r\n get NextButtonLabel() {\r\n switch(this.currentStepIndex) {\r\n case Step.DryRun:\r\n return 'Import';\r\n case Step.Finalize:\r\n return 'Restart'\r\n default:\r\n return 'Next';\r\n }\r\n }\r\n\r\n constructor(private ngModal: NgbActiveModal, private readingListService: ReadingListService, \r\n public utilityService: UtilityService, private readonly cdRef: ChangeDetectorRef,\r\n private toastr: ToastrService) {}\r\n\r\n close() {\r\n this.ngModal.close();\r\n }\r\n\r\n nextStep() {\r\n if (this.currentStepIndex === Step.Import && !this.isFileSelected()) return;\r\n //if (this.currentStepIndex === Step.Validate && this.validateSummary && this.validateSummary.results.length > 0) return;\r\n\r\n this.isLoading = true;\r\n switch (this.currentStepIndex) {\r\n case Step.Import:\r\n const files = this.uploadForm.get('files')?.value;\r\n if (!files) {\r\n this.toastr.error('You need to select files to move forward');\r\n return;\r\n }\r\n // Load each file into filesToProcess and group their data\r\n let pages = [];\r\n for (let i = 0; i < files.length; i++) {\r\n const formData = new FormData();\r\n formData.append('cbl', files[i]);\r\n formData.append('dryRun', true + '');\r\n pages.push(this.readingListService.validateCbl(formData));\r\n }\r\n forkJoin(pages).subscribe(results => {\r\n this.filesToProcess = [];\r\n results.forEach(cblImport => {\r\n this.filesToProcess.push({\r\n fileName: cblImport.fileName,\r\n validateSummary: cblImport,\r\n dryRunSummary: undefined,\r\n finalizeSummary: undefined\r\n });\r\n });\r\n\r\n this.filesToProcess = this.filesToProcess.sort((a, b) => b.validateSummary!.success - a.validateSummary!.success);\r\n\r\n this.currentStepIndex++;\r\n this.isLoading = false;\r\n this.cdRef.markForCheck();\r\n });\r\n break;\r\n case Step.Validate:\r\n this.failedFiles = this.filesToProcess.filter(item => item.validateSummary?.success === CblImportResult.Fail);\r\n this.filesToProcess = this.filesToProcess.filter(item => item.validateSummary?.success != CblImportResult.Fail);\r\n this.dryRun();\r\n break;\r\n case Step.DryRun:\r\n this.failedFiles.push(...this.filesToProcess.filter(item => item.dryRunSummary?.success === CblImportResult.Fail));\r\n this.filesToProcess = this.filesToProcess.filter(item => item.dryRunSummary?.success != CblImportResult.Fail);\r\n this.import();\r\n break;\r\n case Step.Finalize:\r\n // Clear the models and allow user to do another import\r\n this.uploadForm.get('files')?.setValue(undefined);\r\n this.currentStepIndex = Step.Import;\r\n this.isLoading = false;\r\n this.filesToProcess = [];\r\n this.failedFiles = [];\r\n this.cdRef.markForCheck();\r\n break;\r\n\r\n }\r\n }\r\n\r\n prevStep() {\r\n if (this.currentStepIndex === Step.Import) return;\r\n this.currentStepIndex--;\r\n }\r\n\r\n canMoveToNextStep() {\r\n switch (this.currentStepIndex) {\r\n case Step.Import:\r\n return this.isFileSelected();\r\n case Step.Validate:\r\n return this.filesToProcess.filter(item => item.validateSummary?.success != CblImportResult.Fail).length > 0;\r\n case Step.DryRun:\r\n return this.filesToProcess.filter(item => item.dryRunSummary?.success != CblImportResult.Fail).length > 0; \r\n case Step.Finalize:\r\n return true; \r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n canMoveToPrevStep() {\r\n switch (this.currentStepIndex) {\r\n case Step.Import:\r\n case Step.Finalize:\r\n return false;\r\n default:\r\n return true;\r\n }\r\n }\r\n\r\n\r\n isFileSelected() {\r\n const files = this.uploadForm.get('files')?.value;\r\n if (files) return files.length > 0;\r\n return false;\r\n }\r\n\r\n\r\n dryRun() {\r\n\r\n const filenamesAllowedToProcess = this.filesToProcess.map(p => p.fileName);\r\n const files = (this.uploadForm.get('files')?.value || []).filter(f => filenamesAllowedToProcess.includes(f.name));\r\n\r\n let pages = [];\r\n for (let i = 0; i < files.length; i++) {\r\n const formData = new FormData();\r\n formData.append('cbl', files[i]);\r\n formData.append('dryRun', 'true');\r\n pages.push(this.readingListService.importCbl(formData));\r\n }\r\n forkJoin(pages).subscribe(results => {\r\n results.forEach(cblImport => {\r\n const index = this.filesToProcess.findIndex(p => p.fileName === cblImport.fileName);\r\n this.filesToProcess[index].dryRunSummary = cblImport;\r\n });\r\n this.filesToProcess = this.filesToProcess.sort((a, b) => b.dryRunSummary!.success - a.dryRunSummary!.success);\r\n\r\n this.isLoading = false;\r\n this.currentStepIndex++;\r\n this.cdRef.markForCheck();\r\n });\r\n }\r\n\r\n import() {\r\n const filenamesAllowedToProcess = this.filesToProcess.map(p => p.fileName);\r\n const files = (this.uploadForm.get('files')?.value || []).filter(f => filenamesAllowedToProcess.includes(f.name));\r\n\r\n let pages = [];\r\n for (let i = 0; i < files.length; i++) {\r\n const formData = new FormData();\r\n formData.append('cbl', files[i]);\r\n formData.append('dryRun', 'false');\r\n pages.push(this.readingListService.importCbl(formData));\r\n }\r\n forkJoin(pages).subscribe(results => {\r\n results.forEach(cblImport => {\r\n const index = this.filesToProcess.findIndex(p => p.fileName === cblImport.fileName);\r\n this.filesToProcess[index].finalizeSummary = cblImport;\r\n });\r\n\r\n this.isLoading = false;\r\n this.currentStepIndex++;\r\n this.toastr.success('Reading List imported');\r\n this.cdRef.markForCheck();\r\n });\r\n }\r\n}\r\n","import {InjectionToken} from '@angular/core'\r\nimport { saveAs } from 'file-saver';\r\n\r\nexport type Saver = (blob: Blob, filename?: string) => void\r\n\r\nexport const SAVER = new InjectionToken('saver')\r\n\r\nexport function getSaver(): Saver {\r\n return saveAs;\r\n}","import {\r\n HttpEvent,\r\n HttpEventType,\r\n HttpHeaders,\r\n HttpProgressEvent,\r\n HttpResponse\r\n } from \"@angular/common/http\";\r\n import { Observable } from \"rxjs\";\r\n import { scan } from \"rxjs/operators\";\r\n \r\n function isHttpResponse(event: HttpEvent): event is HttpResponse {\r\n return event.type === HttpEventType.Response;\r\n }\r\n \r\n function isHttpProgressEvent(\r\n event: HttpEvent\r\n ): event is HttpProgressEvent {\r\n return (\r\n event.type === HttpEventType.DownloadProgress ||\r\n event.type === HttpEventType.UploadProgress\r\n );\r\n }\r\n\r\n/**\r\n * Encapsulates an inprogress download of a Blob with progress reporting activated\r\n */ \r\nexport interface Download {\r\n content: Blob | null;\r\n progress: number;\r\n state: \"PENDING\" | \"IN_PROGRESS\" | \"DONE\";\r\n filename?: string;\r\n loaded?: number;\r\n total?: number\r\n}\r\n \r\nexport function download(saver?: (b: Blob, filename: string) => void): (source: Observable>) => Observable {\r\n return (source: Observable>) =>\r\n source.pipe(\r\n scan((previous: Download, event: HttpEvent): Download => {\r\n if (isHttpProgressEvent(event)) {\r\n return {\r\n progress: event.total\r\n ? Math.round((100 * event.loaded) / event.total)\r\n : previous.progress,\r\n state: 'IN_PROGRESS',\r\n content: null,\r\n loaded: event.loaded,\r\n total: event.total\r\n }\r\n }\r\n if (isHttpResponse(event)) {\r\n if (saver && event.body) {\r\n saver(event.body, getFilename(event.headers, ''))\r\n }\r\n return {\r\n progress: 100,\r\n state: 'DONE',\r\n content: event.body,\r\n filename: getFilename(event.headers, ''),\r\n }\r\n }\r\n return previous;\r\n },\r\n {state: 'PENDING', progress: 0, content: null}\r\n )\r\n )\r\n }\r\n\r\n\r\nfunction getFilename(headers: HttpHeaders, defaultName: string) {\r\n const tokens = (headers.get('content-disposition') || '').split(';');\r\n let filename = tokens[1].replace('filename=', '').replace(/\"/ig, '').trim(); \r\n if (filename.startsWith('download_') || filename.startsWith('kavita_download_')) {\r\n const ext = filename.substring(filename.lastIndexOf('.'), filename.length);\r\n if (defaultName !== '') {\r\n return defaultName + ext;\r\n }\r\n return filename.replace('kavita_', '').replace('download_', '');\r\n //return defaultName + ext;\r\n }\r\n return filename;\r\n }","import { HttpClient } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { Series } from 'src/app/_models/series';\r\nimport { environment } from 'src/environments/environment';\r\nimport { ConfirmService } from '../confirm.service';\r\nimport { Chapter } from 'src/app/_models/chapter';\r\nimport { Volume } from 'src/app/_models/volume';\r\nimport { asyncScheduler, BehaviorSubject, Observable, tap, finalize, of, filter } from 'rxjs';\r\nimport { SAVER, Saver } from '../_providers/saver.provider';\r\nimport { download, Download } from '../_models/download';\r\nimport { PageBookmark } from 'src/app/_models/readers/page-bookmark';\r\nimport { switchMap, takeWhile, throttleTime } from 'rxjs/operators';\r\nimport { AccountService } from 'src/app/_services/account.service';\r\nimport { BytesPipe } from 'src/app/pipe/bytes.pipe';\r\n\r\nexport const DEBOUNCE_TIME = 100;\r\n\r\nconst bytesPipe = new BytesPipe();\r\n\r\nexport interface DownloadEvent {\r\n /**\r\n * Type of entity being downloaded\r\n */\r\n entityType: DownloadEntityType;\r\n /**\r\n * What to show user. For example, for Series, we might show series name.\r\n */\r\n subTitle: string;\r\n /**\r\n * Progress of the download itself\r\n */\r\n progress: number;\r\n}\r\n\r\n/**\r\n * Valid entity types for downloading\r\n */\r\nexport type DownloadEntityType = 'volume' | 'chapter' | 'series' | 'bookmark' | 'logs';\r\n/**\r\n * Valid entities for downloading. Undefined exclusively for logs.\r\n */\r\nexport type DownloadEntity = Series | Volume | Chapter | PageBookmark[] | undefined;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DownloadService {\r\n\r\n private baseUrl = environment.apiUrl;\r\n /**\r\n * Size in bytes in which to inform the user for confirmation before download starts. Defaults to 100 MB.\r\n */\r\n public SIZE_WARNING = 104_857_600;\r\n\r\n private downloadsSource: BehaviorSubject = new BehaviorSubject([]);\r\n public activeDownloads$ = this.downloadsSource.asObservable();\r\n\r\n\r\n constructor(private httpClient: HttpClient, private confirmService: ConfirmService,\r\n @Inject(SAVER) private save: Saver, private accountService: AccountService) { }\r\n\r\n /**\r\n * Returns the entity subtitle (for the event widget) for a given entity\r\n * @param downloadEntityType\r\n * @param downloadEntity\r\n * @returns\r\n */\r\n downloadSubtitle(downloadEntityType: DownloadEntityType, downloadEntity: DownloadEntity | undefined) {\r\n switch (downloadEntityType) {\r\n case 'series':\r\n return (downloadEntity as Series).name;\r\n case 'volume':\r\n return (downloadEntity as Volume).number + '';\r\n case 'chapter':\r\n return (downloadEntity as Chapter).number;\r\n case 'bookmark':\r\n return '';\r\n case 'logs':\r\n return '';\r\n }\r\n }\r\n\r\n /**\r\n * Downloads the entity to the user's system. This handles everything around downloads. This will prompt the user based on size checks and UserPreferences.PromptForDownload.\r\n * This will perform the download at a global level, if you need a handle to the download in question, use downloadService.activeDownloads$ and perform a filter on it.\r\n * @param entityType\r\n * @param entity\r\n * @param callback Optional callback. Returns the download or undefined (if the download is complete).\r\n */\r\n download(entityType: DownloadEntityType, entity: DownloadEntity, callback?: (d: Download | undefined) => void) {\r\n let sizeCheckCall: Observable;\r\n let downloadCall: Observable;\r\n switch (entityType) {\r\n case 'series':\r\n sizeCheckCall = this.downloadSeriesSize((entity as Series).id);\r\n downloadCall = this.downloadSeries(entity as Series);\r\n break;\r\n case 'volume':\r\n sizeCheckCall = this.downloadVolumeSize((entity as Volume).id);\r\n downloadCall = this.downloadVolume(entity as Volume);\r\n break;\r\n case 'chapter':\r\n sizeCheckCall = this.downloadChapterSize((entity as Chapter).id);\r\n downloadCall = this.downloadChapter(entity as Chapter);\r\n break;\r\n case 'bookmark':\r\n sizeCheckCall = of(0);\r\n downloadCall = this.downloadBookmarks(entity as PageBookmark[]);\r\n break;\r\n case 'logs':\r\n sizeCheckCall = of(0);\r\n downloadCall = this.downloadLogs();\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n\r\n this.accountService.currentUser$.pipe(switchMap(user => {\r\n if (user && user.preferences.promptForDownloadSize) {\r\n return sizeCheckCall;\r\n }\r\n return of(0);\r\n }), switchMap(async (size) => {\r\n return await this.confirmSize(size, entityType);\r\n })\r\n ).pipe(filter(wantsToDownload => {\r\n return wantsToDownload;\r\n }), switchMap(() => {\r\n return downloadCall.pipe(\r\n tap((d) => {\r\n if (callback) callback(d);\r\n }),\r\n takeWhile((val: Download) => {\r\n return val.state != 'DONE';\r\n }),\r\n finalize(() => {\r\n if (callback) callback(undefined);\r\n }))\r\n })).subscribe(() => {});\r\n }\r\n\r\n private downloadSeriesSize(seriesId: number) {\r\n return this.httpClient.get(this.baseUrl + 'download/series-size?seriesId=' + seriesId);\r\n }\r\n\r\n private downloadVolumeSize(volumeId: number) {\r\n return this.httpClient.get(this.baseUrl + 'download/volume-size?volumeId=' + volumeId);\r\n }\r\n\r\n private downloadChapterSize(chapterId: number) {\r\n return this.httpClient.get(this.baseUrl + 'download/chapter-size?chapterId=' + chapterId);\r\n }\r\n\r\n private downloadLogs() {\r\n const downloadType = 'logs';\r\n const subtitle = this.downloadSubtitle(downloadType, undefined);\r\n return this.httpClient.get(this.baseUrl + 'server/logs',\r\n {observe: 'events', responseType: 'blob', reportProgress: true}\r\n ).pipe(\r\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\r\n download((blob, filename) => {\r\n this.save(blob, decodeURIComponent(filename));\r\n }),\r\n tap((d) => this.updateDownloadState(d, downloadType, subtitle)),\r\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\r\n );\r\n }\r\n\r\n private downloadSeries(series: Series) {\r\n const downloadType = 'series';\r\n const subtitle = this.downloadSubtitle(downloadType, series);\r\n return this.httpClient.get(this.baseUrl + 'download/series?seriesId=' + series.id,\r\n {observe: 'events', responseType: 'blob', reportProgress: true}\r\n ).pipe(\r\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\r\n download((blob, filename) => {\r\n this.save(blob, decodeURIComponent(filename));\r\n }),\r\n tap((d) => this.updateDownloadState(d, downloadType, subtitle)),\r\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\r\n );\r\n }\r\n\r\n private finalizeDownloadState(entityType: DownloadEntityType, entitySubtitle: string) {\r\n let values = this.downloadsSource.getValue();\r\n values = values.filter(v => !(v.entityType === entityType && v.subTitle === entitySubtitle));\r\n this.downloadsSource.next(values);\r\n }\r\n\r\n private updateDownloadState(d: Download, entityType: DownloadEntityType, entitySubtitle: string) {\r\n let values = this.downloadsSource.getValue();\r\n if (d.state === 'PENDING') {\r\n const index = values.findIndex(v => v.entityType === entityType && v.subTitle === entitySubtitle);\r\n if (index >= 0) return; // Don't let us duplicate add\r\n values.push({entityType: entityType, subTitle: entitySubtitle, progress: 0});\r\n } else if (d.state === 'IN_PROGRESS') {\r\n const index = values.findIndex(v => v.entityType === entityType && v.subTitle === entitySubtitle);\r\n if (index >= 0) {\r\n values[index].progress = d.progress;\r\n }\r\n } else if (d.state === 'DONE') {\r\n values = values.filter(v => !(v.entityType === entityType && v.subTitle === entitySubtitle));\r\n }\r\n this.downloadsSource.next(values);\r\n\r\n }\r\n\r\n private downloadChapter(chapter: Chapter) {\r\n const downloadType = 'chapter';\r\n const subtitle = this.downloadSubtitle(downloadType, chapter);\r\n return this.httpClient.get(this.baseUrl + 'download/chapter?chapterId=' + chapter.id,\r\n {observe: 'events', responseType: 'blob', reportProgress: true}\r\n ).pipe(\r\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\r\n download((blob, filename) => {\r\n console.log('saving: ', filename)\r\n this.save(blob, decodeURIComponent(filename));\r\n }),\r\n tap((d) => this.updateDownloadState(d, downloadType, subtitle)),\r\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\r\n );\r\n }\r\n\r\n private downloadVolume(volume: Volume): Observable {\r\n const downloadType = 'volume';\r\n const subtitle = this.downloadSubtitle(downloadType, volume);\r\n return this.httpClient.get(this.baseUrl + 'download/volume?volumeId=' + volume.id,\r\n {observe: 'events', responseType: 'blob', reportProgress: true}\r\n ).pipe(\r\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\r\n download((blob, filename) => {\r\n this.save(blob, decodeURIComponent(filename));\r\n }),\r\n tap((d) => this.updateDownloadState(d, downloadType, subtitle)),\r\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\r\n );\r\n }\r\n\r\n private async confirmSize(size: number, entityType: DownloadEntityType) {\r\n return (size < this.SIZE_WARNING || await this.confirmService.confirm('The ' + entityType + ' is ' + bytesPipe.transform(size) + '. Are you sure you want to continue?'));\r\n }\r\n\r\n private downloadBookmarks(bookmarks: PageBookmark[]) {\r\n const downloadType = 'bookmark';\r\n const subtitle = this.downloadSubtitle(downloadType, bookmarks);\r\n\r\n return this.httpClient.post(this.baseUrl + 'download/bookmarks', {bookmarks},\r\n {observe: 'events', responseType: 'blob', reportProgress: true}\r\n ).pipe(\r\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\r\n download((blob, filename) => {\r\n this.save(blob, decodeURIComponent(filename));\r\n }),\r\n tap((d) => this.updateDownloadState(d, downloadType, subtitle)),\r\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router';\r\nimport { Pagination } from 'src/app/_models/pagination';\r\nimport { SeriesFilter, SortField } from 'src/app/_models/metadata/series-filter';\r\nimport { SeriesService } from 'src/app/_services/series.service';\r\n\r\n/**\r\n * Used to pass state between the filter and the url\r\n */\r\nexport enum FilterQueryParam {\r\n Format = 'format',\r\n Genres = 'genres',\r\n AgeRating = 'ageRating',\r\n PublicationStatus = 'publicationStatus',\r\n Tags = 'tags',\r\n Languages = 'languages',\r\n CollectionTags = 'collectionTags',\r\n Libraries = 'libraries',\r\n Writers = 'writers',\r\n Artists = 'artists',\r\n Character = 'character',\r\n Colorist = 'colorist',\r\n CoverArtists = 'coverArtists',\r\n Editor = 'editor',\r\n Inker = 'inker',\r\n Letterer = 'letterer',\r\n Penciller = 'penciller',\r\n Publisher = 'publisher',\r\n Translator = 'translators',\r\n ReadStatus = 'readStatus',\r\n SortBy = 'sortBy',\r\n Rating = 'rating',\r\n Name = 'name',\r\n /**\r\n * This is a pagination control\r\n */\r\n Page = 'page'\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FilterUtilitiesService {\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Updates the window location with a custom url based on filter and pagination objects\r\n * @param pagination \r\n * @param filter \r\n */\r\n updateUrlFromFilter(pagination: Pagination, filter: SeriesFilter | undefined) {\r\n const params = '?page=' + pagination.currentPage;\r\n \r\n const url = this.urlFromFilter(window.location.href.split('?')[0] + params, filter);\r\n window.history.replaceState(window.location.href, '', this.replacePaginationOnUrl(url, pagination));\r\n }\r\n\r\n /**\r\n * Patches the page query param in the window location. \r\n * @param pagination \r\n */\r\n updateUrlFromPagination(pagination: Pagination) {\r\n window.history.replaceState(window.location.href, '', this.replacePaginationOnUrl(window.location.href, pagination));\r\n }\r\n\r\n private replacePaginationOnUrl(url: string, pagination: Pagination) {\r\n return url.replace(/page=\\d+/i, 'page=' + pagination.currentPage);\r\n }\r\n\r\n /**\r\n * Will fetch current page from route if present\r\n * @param ActivatedRouteSnapshot to fetch page from. Must be from component else may get stale data\r\n * @param itemsPerPage If you want pagination, pass non-zero number\r\n * @returns A default pagination object\r\n */\r\n pagination(snapshot: ActivatedRouteSnapshot, itemsPerPage: number = 0): Pagination {\r\n return {currentPage: parseInt(snapshot.queryParamMap.get('page') || '1', 10), itemsPerPage, totalItems: 0, totalPages: 1};\r\n }\r\n\r\n\r\n /**\r\n * Returns the current url with query params for the filter\r\n * @param currentUrl Full url, with ?page=1 as a minimum\r\n * @param filter Filter to build url off\r\n * @returns current url with query params added\r\n */\r\n urlFromFilter(currentUrl: string, filter: SeriesFilter | undefined) {\r\n if (filter === undefined) return currentUrl;\r\n let params = '';\r\n\r\n params += this.joinFilter(filter.formats, FilterQueryParam.Format);\r\n params += this.joinFilter(filter.genres, FilterQueryParam.Genres);\r\n params += this.joinFilter(filter.ageRating, FilterQueryParam.AgeRating);\r\n params += this.joinFilter(filter.publicationStatus, FilterQueryParam.PublicationStatus);\r\n params += this.joinFilter(filter.tags, FilterQueryParam.Tags);\r\n params += this.joinFilter(filter.languages, FilterQueryParam.Languages);\r\n params += this.joinFilter(filter.collectionTags, FilterQueryParam.CollectionTags);\r\n params += this.joinFilter(filter.libraries, FilterQueryParam.Libraries);\r\n\r\n params += this.joinFilter(filter.writers, FilterQueryParam.Writers);\r\n params += this.joinFilter(filter.artists, FilterQueryParam.Artists);\r\n params += this.joinFilter(filter.character, FilterQueryParam.Character);\r\n params += this.joinFilter(filter.colorist, FilterQueryParam.Colorist);\r\n params += this.joinFilter(filter.coverArtist, FilterQueryParam.CoverArtists);\r\n params += this.joinFilter(filter.editor, FilterQueryParam.Editor);\r\n params += this.joinFilter(filter.inker, FilterQueryParam.Inker);\r\n params += this.joinFilter(filter.letterer, FilterQueryParam.Letterer);\r\n params += this.joinFilter(filter.penciller, FilterQueryParam.Penciller);\r\n params += this.joinFilter(filter.publisher, FilterQueryParam.Publisher);\r\n params += this.joinFilter(filter.translators, FilterQueryParam.Translator);\r\n\r\n // readStatus (we need to do an additonal check as there is a default case)\r\n if (filter.readStatus && filter.readStatus.inProgress !== true && filter.readStatus.notRead !== true && filter.readStatus.read !== true) {\r\n params += `&${FilterQueryParam.ReadStatus}=${filter.readStatus.inProgress},${filter.readStatus.notRead},${filter.readStatus.read}`;\r\n }\r\n\r\n // sortBy (additional check to not save to url if default case)\r\n if (filter.sortOptions && !(filter.sortOptions.sortField === SortField.SortName && filter.sortOptions.isAscending === true)) {\r\n params += `&${FilterQueryParam.SortBy}=${filter.sortOptions.sortField},${filter.sortOptions.isAscending}`;\r\n }\r\n\r\n if (filter.rating > 0) {\r\n params += `&${FilterQueryParam.Rating}=${filter.rating}`;\r\n }\r\n\r\n if (filter.seriesNameQuery !== '') {\r\n params += `&${FilterQueryParam.Name}=${encodeURIComponent(filter.seriesNameQuery)}`;\r\n }\r\n \r\n return currentUrl + params;\r\n }\r\n\r\n private joinFilter(filterProp: Array, key: string) {\r\n let params = '';\r\n if (filterProp.length > 0) {\r\n params += `&${key}=${filterProp.join(',')}`;\r\n }\r\n return params;\r\n }\r\n\r\n /**\r\n * Returns a new instance of a filterSettings that is populated with filter presets from URL\r\n * @param ActivatedRouteSnapshot to fetch page from. Must be from component else may get stale data\r\n * @returns The Preset filter and if something was set within\r\n */\r\n filterPresetsFromUrl(snapshot: ActivatedRouteSnapshot): [SeriesFilter, boolean] {\r\n const filter = this.createSeriesFilter();\r\n let anyChanged = false;\r\n\r\n const format = snapshot.queryParamMap.get(FilterQueryParam.Format);\r\n if (format !== undefined && format !== null) {\r\n filter.formats = [...filter.formats, ...format.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const genres = snapshot.queryParamMap.get(FilterQueryParam.Genres);\r\n if (genres !== undefined && genres !== null) {\r\n filter.genres = [...filter.genres, ...genres.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const ageRating = snapshot.queryParamMap.get(FilterQueryParam.AgeRating);\r\n if (ageRating !== undefined && ageRating !== null) {\r\n filter.ageRating = [...filter.ageRating, ...ageRating.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const publicationStatus = snapshot.queryParamMap.get(FilterQueryParam.PublicationStatus);\r\n if (publicationStatus !== undefined && publicationStatus !== null) {\r\n filter.publicationStatus = [...filter.publicationStatus, ...publicationStatus.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const tags = snapshot.queryParamMap.get(FilterQueryParam.Tags);\r\n if (tags !== undefined && tags !== null) {\r\n filter.tags = [...filter.tags, ...tags.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const languages = snapshot.queryParamMap.get(FilterQueryParam.Languages);\r\n if (languages !== undefined && languages !== null) {\r\n filter.languages = [...filter.languages, ...languages.split(',')];\r\n anyChanged = true;\r\n }\r\n\r\n const writers = snapshot.queryParamMap.get(FilterQueryParam.Writers);\r\n if (writers !== undefined && writers !== null) {\r\n filter.writers = [...filter.writers, ...writers.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const artists = snapshot.queryParamMap.get(FilterQueryParam.Artists);\r\n if (artists !== undefined && artists !== null) {\r\n filter.artists = [...filter.artists, ...artists.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const character = snapshot.queryParamMap.get(FilterQueryParam.Character);\r\n if (character !== undefined && character !== null) {\r\n filter.character = [...filter.character, ...character.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const colorist = snapshot.queryParamMap.get(FilterQueryParam.Colorist);\r\n if (colorist !== undefined && colorist !== null) {\r\n filter.colorist = [...filter.colorist, ...colorist.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const coverArtists = snapshot.queryParamMap.get(FilterQueryParam.CoverArtists);\r\n if (coverArtists !== undefined && coverArtists !== null) {\r\n filter.coverArtist = [...filter.coverArtist, ...coverArtists.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const editor = snapshot.queryParamMap.get(FilterQueryParam.Editor);\r\n if (editor !== undefined && editor !== null) {\r\n filter.editor = [...filter.editor, ...editor.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const inker = snapshot.queryParamMap.get(FilterQueryParam.Inker);\r\n if (inker !== undefined && inker !== null) {\r\n filter.inker = [...filter.inker, ...inker.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const letterer = snapshot.queryParamMap.get(FilterQueryParam.Letterer);\r\n if (letterer !== undefined && letterer !== null) {\r\n filter.letterer = [...filter.letterer, ...letterer.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const penciller = snapshot.queryParamMap.get(FilterQueryParam.Penciller);\r\n if (penciller !== undefined && penciller !== null) {\r\n filter.penciller = [...filter.penciller, ...penciller.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const publisher = snapshot.queryParamMap.get(FilterQueryParam.Publisher);\r\n if (publisher !== undefined && publisher !== null) {\r\n filter.publisher = [...filter.publisher, ...publisher.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const translators = snapshot.queryParamMap.get(FilterQueryParam.Translator);\r\n if (translators !== undefined && translators !== null) {\r\n filter.translators = [...filter.translators, ...translators.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const libraries = snapshot.queryParamMap.get(FilterQueryParam.Libraries);\r\n if (libraries !== undefined && libraries !== null) {\r\n filter.libraries = [...filter.libraries, ...libraries.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n const collectionTags = snapshot.queryParamMap.get(FilterQueryParam.CollectionTags);\r\n if (collectionTags !== undefined && collectionTags !== null) {\r\n filter.collectionTags = [...filter.collectionTags, ...collectionTags.split(',').map(item => parseInt(item, 10))];\r\n anyChanged = true;\r\n }\r\n\r\n // Rating, seriesName, \r\n const rating = snapshot.queryParamMap.get(FilterQueryParam.Rating);\r\n if (rating !== undefined && rating !== null && parseInt(rating, 10) > 0) {\r\n filter.rating = parseInt(rating, 10);\r\n anyChanged = true;\r\n }\r\n\r\n /// Read status is encoded as true,true,true\r\n const readStatus = snapshot.queryParamMap.get(FilterQueryParam.ReadStatus);\r\n if (readStatus !== undefined && readStatus !== null) {\r\n const values = readStatus.split(',').map(i => i === 'true');\r\n if (values.length === 3) {\r\n filter.readStatus.inProgress = values[0];\r\n filter.readStatus.notRead = values[1];\r\n filter.readStatus.read = values[2];\r\n anyChanged = true;\r\n }\r\n }\r\n\r\n const sortBy = snapshot.queryParamMap.get(FilterQueryParam.SortBy);\r\n if (sortBy !== undefined && sortBy !== null) {\r\n const values = sortBy.split(',');\r\n if (values.length === 1) {\r\n values.push('true');\r\n }\r\n if (values.length === 2) {\r\n filter.sortOptions = {\r\n isAscending: values[1] === 'true',\r\n sortField: Number(values[0])\r\n }\r\n anyChanged = true;\r\n }\r\n }\r\n\r\n const searchNameQuery = snapshot.queryParamMap.get(FilterQueryParam.Name);\r\n if (searchNameQuery !== undefined && searchNameQuery !== null && searchNameQuery !== '') {\r\n filter.seriesNameQuery = decodeURIComponent(searchNameQuery);\r\n anyChanged = true;\r\n }\r\n \r\n\r\n return [filter, false]; // anyChanged. Testing out if having a filter active but keep drawer closed by default works better\r\n }\r\n\r\n createSeriesFilter(filter?: SeriesFilter) {\r\n if (filter !== undefined) return filter;\r\n const data: SeriesFilter = {\r\n formats: [],\r\n libraries: [],\r\n genres: [],\r\n writers: [],\r\n artists: [],\r\n penciller: [],\r\n inker: [],\r\n colorist: [],\r\n letterer: [],\r\n coverArtist: [],\r\n editor: [],\r\n publisher: [],\r\n character: [],\r\n translators: [],\r\n collectionTags: [],\r\n rating: 0,\r\n readStatus: {\r\n read: true,\r\n inProgress: true,\r\n notRead: true\r\n },\r\n sortOptions: null,\r\n ageRating: [],\r\n tags: [],\r\n languages: [],\r\n publicationStatus: [],\r\n seriesNameQuery: '',\r\n releaseYearRange: null\r\n };\r\n\r\n return data;\r\n }\r\n}\r\n","import { HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Chapter } from 'src/app/_models/chapter';\r\nimport { LibraryType } from 'src/app/_models/library';\r\nimport { MangaFormat } from 'src/app/_models/manga-format';\r\nimport { PaginatedResult } from 'src/app/_models/pagination';\r\nimport { Series } from 'src/app/_models/series';\r\nimport { Volume } from 'src/app/_models/volume';\r\n\r\nexport enum KEY_CODES {\r\n RIGHT_ARROW = 'ArrowRight',\r\n LEFT_ARROW = 'ArrowLeft',\r\n DOWN_ARROW = 'ArrowDown',\r\n UP_ARROW = 'ArrowUp',\r\n ESC_KEY = 'Escape',\r\n SPACE = ' ',\r\n ENTER = 'Enter',\r\n G = 'g',\r\n B = 'b',\r\n F = 'f',\r\n H = 'h',\r\n BACKSPACE = 'Backspace',\r\n DELETE = 'Delete',\r\n SHIFT = 'Shift'\r\n}\r\n\r\nexport enum Breakpoint {\r\n Mobile = 768,\r\n Tablet = 1280,\r\n Desktop = 1440\r\n}\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UtilityService {\r\n\r\n mangaFormatKeys: string[] = [];\r\n\r\n constructor() { }\r\n\r\n sortVolumes = (a: Volume, b: Volume) => {\r\n if (a === b) { return 0; }\r\n else if (a.number === 0) { return 1; }\r\n else if (b.number === 0) { return -1; }\r\n else {\r\n return a.number < b.number ? -1 : 1;\r\n }\r\n }\r\n\r\n sortChapters = (a: Chapter, b: Chapter) => {\r\n return parseFloat(a.number) - parseFloat(b.number);\r\n }\r\n\r\n mangaFormatToText(format: MangaFormat): string {\r\n if (this.mangaFormatKeys === undefined || this.mangaFormatKeys.length === 0) {\r\n this.mangaFormatKeys = Object.keys(MangaFormat);\r\n }\r\n\r\n return this.mangaFormatKeys.filter(item => MangaFormat[format] === item)[0];\r\n }\r\n\r\n /**\r\n * Formats a Chapter name based on the library it's in\r\n * @param libraryType \r\n * @param includeHash For comics only, includes a # which is used for numbering on cards\r\n * @param includeSpace Add a space at the end of the string. if includeHash and includeSpace are true, only hash will be at the end.\r\n * @returns \r\n */\r\n formatChapterName(libraryType: LibraryType, includeHash: boolean = false, includeSpace: boolean = false) {\r\n switch(libraryType) {\r\n case LibraryType.Book:\r\n return 'Book' + (includeSpace ? ' ' : '');\r\n case LibraryType.Comic:\r\n if (includeHash) {\r\n return 'Issue #';\r\n }\r\n return 'Issue' + (includeSpace ? ' ' : '');\r\n case LibraryType.Manga:\r\n return 'Chapter' + (includeSpace ? ' ' : '');\r\n }\r\n }\r\n\r\n cleanSpecialTitle(title: string) {\r\n let cleaned = title.replace(/_/g, ' ').replace(/SP\\d+/g, '').trim();\r\n cleaned = cleaned.substring(0, cleaned.lastIndexOf('.'));\r\n if (cleaned.trim() === '') {\r\n return title;\r\n }\r\n return cleaned;\r\n }\r\n\r\n filter(input: string, filter: string): boolean {\r\n if (input === null || filter === null || input === undefined || filter === undefined) return false;\r\n const reg = /[_\\.\\-]/gi;\r\n return input.toUpperCase().replace(reg, '').includes(filter.toUpperCase().replace(reg, ''));\r\n }\r\n\r\n filterMatches(input: string, filter: string): boolean {\r\n if (input === null || filter === null || input === undefined || filter === undefined) return false;\r\n const reg = /[_\\.\\-]/gi;\r\n return input.toUpperCase().replace(reg, '') === filter.toUpperCase().replace(reg, '');\r\n }\r\n\r\n isVolume(d: any) {\r\n return d != null && d.hasOwnProperty('chapters');\r\n }\r\n\r\n isChapter(d: any) {\r\n return d != null && d.hasOwnProperty('volumeId');\r\n }\r\n\r\n isSeries(d: any) {\r\n return d != null && d.hasOwnProperty('originalName');\r\n }\r\n\r\n asVolume(d: any) {\r\n return d;\r\n }\r\n\r\n asChapter(d: any) {\r\n return d;\r\n }\r\n\r\n asSeries(d: any) {\r\n return d;\r\n }\r\n\r\n getActiveBreakpoint(): Breakpoint {\r\n if (window.innerWidth <= Breakpoint.Mobile) return Breakpoint.Mobile;\r\n else if (window.innerWidth > Breakpoint.Mobile && window.innerWidth <= Breakpoint.Tablet) return Breakpoint.Tablet;\r\n else if (window.innerWidth > Breakpoint.Tablet) return Breakpoint.Desktop\r\n \r\n return Breakpoint.Desktop;\r\n }\r\n\r\n isInViewport(element: Element, additionalTopOffset: number = 0) {\r\n const rect = element.getBoundingClientRect();\r\n return (\r\n rect.top >= additionalTopOffset &&\r\n rect.left >= 0 &&\r\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n }\r\n\r\n deepEqual(object1: any, object2: any) {\r\n if ((object1 === null || object1 === undefined) && (object2 !== null || object2 !== undefined)) return false;\r\n if ((object2 === null || object2 === undefined) && (object1 !== null || object1 !== undefined)) return false;\r\n if (object1 === null && object2 === null) return true;\r\n if (object1 === undefined && object2 === undefined) return true;\r\n \r\n\r\n const keys1 = Object.keys(object1);\r\n const keys2 = Object.keys(object2);\r\n if (keys1.length !== keys2.length) {\r\n return false;\r\n }\r\n for (const key of keys1) {\r\n const val1 = object1[key];\r\n const val2 = object2[key];\r\n const areObjects = this.isObject(val1) && this.isObject(val2);\r\n if (\r\n areObjects && !this.deepEqual(val1, val2) ||\r\n !areObjects && val1 !== val2\r\n ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n private isObject(object: any) {\r\n return object != null && typeof object === 'object';\r\n }\r\n\r\n addPaginationIfExists(params: HttpParams, pageNum?: number, itemsPerPage?: number) {\r\n if (pageNum !== null && pageNum !== undefined && itemsPerPage !== null && itemsPerPage !== undefined) {\r\n params = params.append('pageNumber', pageNum + '');\r\n params = params.append('pageSize', itemsPerPage + '');\r\n }\r\n return params;\r\n }\r\n\r\n createPaginatedResult(response: any, paginatedVariable: PaginatedResult | undefined = undefined) {\r\n if (paginatedVariable === undefined) {\r\n paginatedVariable = new PaginatedResult();\r\n }\r\n if (response.body === null) {\r\n paginatedVariable.result = [];\r\n } else {\r\n paginatedVariable.result = response.body;\r\n }\r\n\r\n const pageHeader = response.headers?.get('Pagination');\r\n if (pageHeader !== null) {\r\n paginatedVariable.pagination = JSON.parse(pageHeader);\r\n }\r\n\r\n return paginatedVariable;\r\n }\r\n\r\n getWindowDimensions() {\r\n const windowWidth = window.innerWidth\r\n || document.documentElement.clientWidth\r\n || document.body.clientWidth;\r\n const windowHeight = window.innerHeight\r\n || document.documentElement.clientHeight\r\n || document.body.clientHeight;\r\n return [windowWidth, windowHeight];\r\n }\r\n}\r\n"," 0\">\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-circular-loader',\r\n templateUrl: './circular-loader.component.html',\r\n styleUrls: ['./circular-loader.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CircularLoaderComponent {\r\n\r\n @Input() currentValue: number = 0;\r\n /**\r\n * If an animation should be used\r\n */\r\n @Input() animation: boolean = true;\r\n /**\r\n * Color of an inner bar\r\n */\r\n @Input() innerStrokeColor: string = 'transparent';\r\n /**\r\n * Color of the Downloader bar\r\n */\r\n @Input() outerStrokeColor: string = '#4ac694';\r\n @Input() backgroundColor: string = '#000';\r\n @Input() fontSize: string = '36px';\r\n /**\r\n * Show the icon inside the downloader\r\n */\r\n @Input() showIcon: boolean = true;\r\n /**\r\n * The width in pixels of the loader\r\n */\r\n @Input() width: string = '100px';\r\n /**\r\n * The height in pixels of the loader\r\n */\r\n @Input() height: string = '100px';\r\n /**\r\n * Centers the icon in the middle of the loader. Best for card use. \r\n */\r\n @Input() center: boolean = true;\r\n}\r\n","import { ConfirmButton } from './confirm-button';\r\n\r\nexport class ConfirmConfig {\r\n _type: string = 'confirm'; // internal only: confirm or alert (todo: use enum)\r\n header: string = 'Confirm';\r\n content: string = '';\r\n buttons: Array = [];\r\n /**\r\n * If the close button shouldn't be rendered\r\n */\r\n disableEscape: boolean = false;\r\n}\r\n","\r\n\r\n
\r\n

{{config.header}}

\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ConfirmButton } from './_models/confirm-button';\r\nimport { ConfirmConfig } from './_models/confirm-config';\r\n\r\n@Component({\r\n selector: 'app-confirm-dialog',\r\n templateUrl: './confirm-dialog.component.html',\r\n styleUrls: ['./confirm-dialog.component.scss']\r\n})\r\nexport class ConfirmDialogComponent implements OnInit {\r\n\r\n config!: ConfirmConfig;\r\n\r\n constructor(public modal: NgbActiveModal) {}\r\n\r\n ngOnInit(): void {\r\n if (this.config) {\r\n this.config.buttons.sort(this._button_sort);\r\n }\r\n }\r\n\r\n private _button_sort(x: ConfirmButton, y: ConfirmButton) {\r\n const xIsSecondary = x.type === 'secondary';\r\n const yIsSecondary = y.type === 'secondary';\r\n if (xIsSecondary && !yIsSecondary) {\r\n return -1;\r\n } else if (!xIsSecondary && yIsSecondary) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n\r\n clickButton(button: ConfirmButton) {\r\n this.modal.close(button.type === 'primary');\r\n }\r\n\r\n close() {\r\n this.modal.close(false);\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { take } from 'rxjs/operators';\r\nimport { ConfirmDialogComponent } from './confirm-dialog/confirm-dialog.component';\r\nimport { ConfirmConfig } from './confirm-dialog/_models/confirm-config';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConfirmService {\r\n\r\n defaultConfirm = new ConfirmConfig();\r\n defaultAlert = new ConfirmConfig();\r\n\r\n constructor(private modalService: NgbModal) {\r\n this.defaultConfirm.buttons.push({text: 'Cancel', type: 'secondary'});\r\n this.defaultConfirm.buttons.push({text: 'Confirm', type: 'primary'});\r\n\r\n this.defaultAlert._type = 'alert';\r\n this.defaultAlert.header = 'Alert';\r\n this.defaultAlert.buttons.push({text: 'Ok', type: 'primary'});\r\n\r\n }\r\n\r\n public async confirm(content?: string, config?: ConfirmConfig): Promise {\r\n\r\n return new Promise((resolve, reject) => {\r\n if (content === undefined && config === undefined) {\r\n console.error('Confirm must have either text or a config object passed');\r\n return reject(false);\r\n }\r\n\r\n if (content !== undefined && config === undefined) {\r\n config = this.defaultConfirm;\r\n config.content = content;\r\n }\r\n if (content !== undefined && content !== '' && config!.content === '') {\r\n config!.content = content;\r\n }\r\n\r\n const modalRef = this.modalService.open(ConfirmDialogComponent);\r\n modalRef.componentInstance.config = config;\r\n modalRef.closed.pipe(take(1)).subscribe(result => {\r\n return resolve(result);\r\n });\r\n modalRef.dismissed.pipe(take(1)).subscribe(() => {\r\n return resolve(false);\r\n });\r\n });\r\n\r\n }\r\n\r\n public async alert(content?: string, config?: ConfirmConfig): Promise {\r\n return new Promise((resolve, reject) => {\r\n if (content === undefined && config === undefined) {\r\n console.error('Alert must have either text or a config object passed');\r\n return reject(false);\r\n }\r\n\r\n if (content !== undefined && config === undefined) {\r\n config = this.defaultConfirm;\r\n config.content = content;\r\n }\r\n\r\n const modalRef = this.modalService.open(ConfirmDialogComponent);\r\n modalRef.componentInstance.config = config;\r\n modalRef.closed.pipe(take(1)).subscribe(result => {\r\n return resolve(result);\r\n });\r\n modalRef.dismissed.pipe(take(1)).subscribe(() => {\r\n return resolve(false);\r\n });\r\n })\r\n }\r\n}\r\n","export class Stack {\r\n items: T[];\r\n \r\n constructor() {\r\n this.items = [];\r\n }\r\n \r\n isEmpty() {\r\n return this.items.length === 0;\r\n }\r\n \r\n peek() {\r\n if (!this.isEmpty()) {\r\n return this.items[this.items.length - 1];\r\n }\r\n return undefined;\r\n }\r\n \r\n pop() {\r\n if (this.isEmpty()) {\r\n return undefined;\r\n }\r\n return this.items.pop();\r\n }\r\n \r\n push(item: T) {\r\n this.items.push(item);\r\n }\r\n }","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component, DestroyRef,\r\n ElementRef,\r\n inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Renderer2,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { CoverUpdateEvent } from 'src/app/_models/events/cover-update-event';\r\nimport { ImageService } from 'src/app/_services/image.service';\r\nimport { EVENTS, MessageHubService } from 'src/app/_services/message-hub.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n/**\r\n * This is used for images with placeholder fallback.\r\n */\r\n@Component({\r\n selector: 'app-image',\r\n templateUrl: './image.component.html',\r\n styleUrls: ['./image.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ImageComponent implements OnChanges {\r\n\r\n /**\r\n * Source url to load image\r\n */\r\n @Input({required: true}) imageUrl!: string;\r\n /**\r\n * Width of the image. If not defined, will not be applied\r\n */\r\n @Input() width: string = '';\r\n /**\r\n * Height of the image. If not defined, will not be applied\r\n */\r\n @Input() height: string = '';\r\n /**\r\n * Max Width of the image. If not defined, will not be applied\r\n */\r\n @Input() maxWidth: string = '';\r\n /**\r\n * Max Height of the image. If not defined, will not be applied\r\n */\r\n @Input() maxHeight: string = '';\r\n /**\r\n * Border Radius of the image. If not defined, will not be applied\r\n */\r\n @Input() borderRadius: string = '';\r\n /**\r\n * Object fit of the image. If not defined, will not be applied\r\n */\r\n @Input() objectFit: string = '';\r\n /**\r\n * Background of the image. If not defined, will not be applied\r\n */\r\n @Input() background: string = '';\r\n /**\r\n * If the image component should respond to cover updates\r\n */\r\n @Input() processEvents: boolean = true;\r\n\r\n @ViewChild('img', {static: true}) imgElem!: ElementRef;\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n constructor(public imageService: ImageService, private renderer: Renderer2, private hubService: MessageHubService, private changeDetectionRef: ChangeDetectorRef) {\r\n this.hubService.messages$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(res => {\r\n if (!this.processEvents) return;\r\n if (res.event === EVENTS.CoverUpdate) {\r\n const updateEvent = res.payload as CoverUpdateEvent;\r\n if (this.imageUrl === undefined || this.imageUrl === null || this.imageUrl === '') return;\r\n const enityType = this.imageService.getEntityTypeFromUrl(this.imageUrl);\r\n if (enityType === updateEvent.entityType) {\r\n const tokens = this.imageUrl.split('?')[1].split('&');\r\n\r\n //...seriesId=123&random=\r\n let id = tokens[0].replace(enityType + 'Id=', '');\r\n if (id.includes('&')) {\r\n id = id.split('&')[0];\r\n }\r\n if (id === (updateEvent.id + '')) {\r\n this.imageUrl = this.imageService.randomize(this.imageUrl);\r\n this.changeDetectionRef.markForCheck();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (this.width != '') {\r\n this.renderer.setStyle(this.imgElem.nativeElement, 'width', this.width);\r\n }\r\n\r\n if (this.height != '') {\r\n this.renderer.setStyle(this.imgElem.nativeElement, 'height', this.height);\r\n }\r\n\r\n if (this.maxWidth != '') {\r\n this.renderer.setStyle(this.imgElem.nativeElement, 'max-width', this.maxWidth);\r\n }\r\n\r\n if (this.maxHeight != '') {\r\n this.renderer.setStyle(this.imgElem.nativeElement, 'max-height', this.maxHeight);\r\n }\r\n\r\n if (this.borderRadius != '') {\r\n this.renderer.setStyle(this.imgElem.nativeElement, 'border-radius', this.borderRadius);\r\n }\r\n\r\n if (this.objectFit != '') {\r\n this.renderer.setStyle(this.imgElem.nativeElement, 'object-fit', this.objectFit);\r\n }\r\n\r\n if (this.background != '') {\r\n this.renderer.setStyle(this.imgElem.nativeElement, 'background', this.background);\r\n }\r\n }\r\n\r\n}\r\n","","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { NgbCollapseModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ConfirmDialogComponent } from './confirm-dialog/confirm-dialog.component';\r\nimport { ReadMoreComponent } from './read-more/read-more.component';\r\nimport { RouterModule } from '@angular/router';\r\nimport { DrawerComponent } from './drawer/drawer.component';\r\nimport { TagBadgeComponent } from './tag-badge/tag-badge.component';\r\nimport { A11yClickDirective } from './a11y-click.directive';\r\nimport { SeriesFormatComponent } from './series-format/series-format.component';\r\nimport { UpdateNotificationModalComponent } from './update-notification/update-notification-modal.component';\r\nimport { CircularLoaderComponent } from './circular-loader/circular-loader.component';\r\nimport { NgCircleProgressModule } from 'ng-circle-progress';\r\nimport { PersonBadgeComponent } from './person-badge/person-badge.component';\r\nimport { BadgeExpanderComponent } from './badge-expander/badge-expander.component';\r\nimport { ImageComponent } from './image/image.component';\r\nimport { PipeModule } from '../pipe/pipe.module';\r\nimport { IconAndTitleComponent } from './icon-and-title/icon-and-title.component';\r\nimport { LoadingComponent } from './loading/loading.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n ConfirmDialogComponent,\r\n ReadMoreComponent,\r\n DrawerComponent,\r\n TagBadgeComponent,\r\n A11yClickDirective,\r\n SeriesFormatComponent,\r\n UpdateNotificationModalComponent,\r\n CircularLoaderComponent,\r\n PersonBadgeComponent,\r\n BadgeExpanderComponent,\r\n ImageComponent,\r\n IconAndTitleComponent,\r\n LoadingComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n ReactiveFormsModule,\r\n NgbCollapseModule,\r\n NgbTooltipModule, // TODO: Validate if we still need this\r\n PipeModule,\r\n NgCircleProgressModule.forRoot(),\r\n ],\r\n exports: [\r\n ReadMoreComponent, // Used globably\r\n DrawerComponent, // Can be replaced with boostrap offscreen canvas (v5) (also used in book reader and series metadata filter)\r\n A11yClickDirective, // Used globally\r\n SeriesFormatComponent, // Used globally\r\n TagBadgeComponent, // Used globally\r\n CircularLoaderComponent, // Used in Cards and Series Detail\r\n ImageComponent, // Used globally\r\n\r\n PersonBadgeComponent, // Used Series Detail\r\n BadgeExpanderComponent, // Used Series Detail/Metadata\r\n IconAndTitleComponent, // Used in Series Detail/Metadata\r\n \r\n LoadingComponent\r\n ],\r\n})\r\nexport class SharedModule { }\r\n","
\r\n

New Update Available!

\r\n \r\n
\r\n
\r\n
{{updateData.updateTitle}}
\r\n
\r\n
\r\n\r\n
\r\n \r\n Download\r\n
","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { UpdateVersionEvent } from 'src/app/_models/events/update-version-event';\r\n\r\n\r\n\r\n@Component({\r\n selector: 'app-update-notification-modal',\r\n templateUrl: './update-notification-modal.component.html',\r\n styleUrls: ['./update-notification-modal.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class UpdateNotificationModalComponent {\r\n\r\n @Input({required: true}) updateData!: UpdateVersionEvent;\r\n\r\n constructor(public modal: NgbActiveModal) { }\r\n\r\n close() {\r\n this.modal.close({success: false, series: undefined});\r\n }\r\n}\r\n","
\r\n

\r\n \r\n Edit {{library.name | sentenceCase}}\r\n \r\n \r\n Add Library\r\n \r\n

\r\n \r\n
\r\n
\r\n
\r\n
    \r\n \r\n
  • \r\n {{TabID.General}}\r\n \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n This field is required\r\n
    \r\n
    \r\n Library name must be unique\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n  \r\n Library type determines how filenames are parsed and if the UI shows Chapters (Manga) vs Issues (Comics). Book work the same way as Manga but have different naming in the UI.\r\n Library type determines how filenames are parsed and if the UI shows Chapters (Manga) vs Issues (Comics). Book work the same way as Manga but have different naming in the UI.\r\n \r\n
    \r\n
    \r\n Last Scanned: \r\n Never\r\n \r\n {{library.lastScanned | date: 'short'}}\r\n \r\n
    \r\n
    \r\n
  • \r\n\r\n\r\n
  • \r\n {{TabID.Folder}}\r\n \r\n

    Add folders to your library

    \r\n
      \r\n
    • \r\n {{folder}}\r\n \r\n
    • \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    Help us out by following our guide to naming and organizing your media.

    \r\n
    \r\n
    \r\n

    Kavita has folder requirements. Check this link to ensure you are following, else files my not show up in scan.

    \r\n
    \r\n
    \r\n
  • \r\n\r\n
  • \r\n {{TabID.Cover}}\r\n \r\n

    Custom library image icons are optional

    \r\n

    Library image should not be large. Aim for a small file, 32x32 pixels in size. Kavita does not perform validation on size.

    \r\n \r\n \r\n
    \r\n
  • \r\n\r\n
  • \r\n {{TabID.Advanced}}\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n

    \r\n Should Kavita create Collections from SeriesGroup tags found within ComicInfo.xml files\r\n

    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n

    \r\n Should Kavita create Reading Lists from StoryArc/StoryArcNumber and AlternativeSeries/AlternativeCount tags found within ComicInfo.xml files\r\n

    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n

    \r\n Override Server folder watching for this library. If off, folder watching won't run on the folders this library contains. If libraries share folders, then folders may still be ran against.\r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n

    \r\n Should series from the library be included on the Dashboard. This affects all streams, like On Deck, Recently Updated, Recently Added, or any custom additions.\r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n

    \r\n Should series from the library be included on the Recommended page.\r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n

    \r\n Should series and any derived information (genres, people, files) from the library be included in search results.\r\n

    \r\n
    \r\n
    \r\n
    \r\n
  • \r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n OnInit\r\n} from '@angular/core';\r\nimport { FormGroup, FormControl, Validators } from '@angular/forms';\r\nimport { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { debounceTime, distinctUntilChanged, Subject, switchMap, takeUntil, tap } from 'rxjs';\r\nimport { SettingsService } from 'src/app/admin/settings.service';\r\nimport { DirectoryPickerComponent, DirectoryPickerResult } from 'src/app/admin/_modals/directory-picker/directory-picker.component';\r\nimport { ConfirmService } from 'src/app/shared/confirm.service';\r\nimport { Breakpoint, UtilityService } from 'src/app/shared/_services/utility.service';\r\nimport { Library, LibraryType } from 'src/app/_models/library';\r\nimport { ImageService } from 'src/app/_services/image.service';\r\nimport { LibraryService } from 'src/app/_services/library.service';\r\nimport { UploadService } from 'src/app/_services/upload.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\nenum TabID {\r\n General = 'General',\r\n Folder = 'Folder',\r\n Cover = 'Cover',\r\n Advanced = 'Advanced'\r\n}\r\n\r\nenum StepID {\r\n General = 0,\r\n Folder = 1,\r\n Cover = 2,\r\n Advanced = 3\r\n}\r\n\r\n@Component({\r\n selector: 'app-library-settings-modal',\r\n templateUrl: './library-settings-modal.component.html',\r\n styleUrls: ['./library-settings-modal.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class LibrarySettingsModalComponent implements OnInit {\r\n\r\n @Input({required: true}) library!: Library;\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n active = TabID.General;\r\n imageUrls: Array = [];\r\n\r\n libraryForm: FormGroup = new FormGroup({\r\n name: new FormControl('', { nonNullable: true, validators: [Validators.required] }),\r\n type: new FormControl(LibraryType.Manga, { nonNullable: true, validators: [Validators.required] }),\r\n folderWatching: new FormControl(true, { nonNullable: true, validators: [Validators.required] }),\r\n includeInDashboard: new FormControl(true, { nonNullable: true, validators: [Validators.required] }),\r\n includeInRecommended: new FormControl(true, { nonNullable: true, validators: [Validators.required] }),\r\n includeInSearch: new FormControl(true, { nonNullable: true, validators: [Validators.required] }),\r\n manageCollections: new FormControl(true, { nonNullable: true, validators: [Validators.required] }),\r\n manageReadingLists: new FormControl(true, { nonNullable: true, validators: [Validators.required] }),\r\n collapseSeriesRelationships: new FormControl(false, { nonNullable: true, validators: [Validators.required] }),\r\n });\r\n\r\n selectedFolders: string[] = [];\r\n madeChanges = false;\r\n libraryTypes: string[] = []\r\n\r\n isAddLibrary = false;\r\n setupStep = StepID.General;\r\n\r\n get Breakpoint() { return Breakpoint; }\r\n get TabID() { return TabID; }\r\n get StepID() { return StepID; }\r\n\r\n constructor(public utilityService: UtilityService, private uploadService: UploadService, private modalService: NgbModal,\r\n private settingService: SettingsService, public modal: NgbActiveModal, private confirmService: ConfirmService,\r\n private libraryService: LibraryService, private toastr: ToastrService, private readonly cdRef: ChangeDetectorRef,\r\n private imageService: ImageService) { }\r\n\r\n ngOnInit(): void {\r\n\r\n this.settingService.getLibraryTypes().subscribe((types) => {\r\n this.libraryTypes = types;\r\n this.cdRef.markForCheck();\r\n });\r\n\r\n\r\n if (this.library === undefined) {\r\n this.isAddLibrary = true;\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n if (this.library?.coverImage != null && this.library?.coverImage !== '') {\r\n this.imageUrls.push(this.imageService.getLibraryCoverImage(this.library.id));\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n this.libraryForm.get('name')?.valueChanges.pipe(\r\n debounceTime(100),\r\n distinctUntilChanged(),\r\n switchMap(name => this.libraryService.libraryNameExists(name)),\r\n tap(exists => {\r\n const isExistingName = this.libraryForm.get('name')?.value === this.library?.name;\r\n if (!exists || isExistingName) {\r\n this.libraryForm.get('name')?.setErrors(null);\r\n } else {\r\n this.libraryForm.get('name')?.setErrors({duplicateName: true})\r\n }\r\n this.cdRef.markForCheck();\r\n }),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe();\r\n\r\n\r\n this.setValues();\r\n }\r\n\r\n setValues() {\r\n if (this.library !== undefined) {\r\n this.libraryForm.get('name')?.setValue(this.library.name);\r\n this.libraryForm.get('type')?.setValue(this.library.type);\r\n this.libraryForm.get('folderWatching')?.setValue(this.library.folderWatching);\r\n this.libraryForm.get('includeInDashboard')?.setValue(this.library.includeInDashboard);\r\n this.libraryForm.get('includeInRecommended')?.setValue(this.library.includeInRecommended);\r\n this.libraryForm.get('includeInSearch')?.setValue(this.library.includeInSearch);\r\n this.libraryForm.get('manageCollections')?.setValue(this.library.manageCollections);\r\n this.libraryForm.get('manageReadingLists')?.setValue(this.library.manageReadingLists);\r\n this.libraryForm.get('collapseSeriesRelationships')?.setValue(this.library.collapseSeriesRelationships);\r\n this.selectedFolders = this.library.folders;\r\n this.madeChanges = false;\r\n this.cdRef.markForCheck();\r\n }\r\n }\r\n\r\n isDisabled() {\r\n return !(this.libraryForm.valid && this.selectedFolders.length > 0);\r\n }\r\n\r\n reset() {\r\n this.setValues();\r\n }\r\n\r\n close(returnVal= false) {\r\n this.modal.close(returnVal);\r\n }\r\n\r\n forceScan() {\r\n this.libraryService.scan(this.library.id, true).subscribe(() => this.toastr.info('A forced scan has been started for ' + this.library.name));\r\n }\r\n\r\n async save() {\r\n const model = this.libraryForm.value;\r\n model.folders = this.selectedFolders;\r\n\r\n if (this.libraryForm.errors) {\r\n return;\r\n }\r\n\r\n if (this.library !== undefined) {\r\n model.id = this.library.id;\r\n model.folders = model.folders.map((item: string) => item.startsWith('\\\\') ? item.substr(1, item.length) : item);\r\n model.type = parseInt(model.type, 10);\r\n\r\n if (model.type !== this.library.type) {\r\n if (!await this.confirmService.confirm(`Changing library type will trigger a new scan with different parsing rules and may lead to\r\n series being re-created and hence you may loose progress and bookmarks. You should backup before you do this. Are you sure you want to continue?`)) return;\r\n }\r\n\r\n this.libraryService.update(model).subscribe(() => {\r\n this.close(true);\r\n });\r\n } else {\r\n model.folders = model.folders.map((item: string) => item.startsWith('\\\\') ? item.substr(1, item.length) : item);\r\n model.type = parseInt(model.type, 10);\r\n this.libraryService.create(model).subscribe(() => {\r\n this.toastr.success('Library created successfully. A scan has been started.');\r\n this.close(true);\r\n });\r\n }\r\n }\r\n\r\n nextStep() {\r\n this.setupStep++;\r\n switch(this.setupStep) {\r\n case StepID.Folder:\r\n this.active = TabID.Folder;\r\n break;\r\n case StepID.Cover:\r\n this.active = TabID.Cover;\r\n break;\r\n case StepID.Advanced:\r\n this.active = TabID.Advanced;\r\n break;\r\n }\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n applyCoverImage(coverUrl: string) {\r\n this.uploadService.updateLibraryCoverImage(this.library.id, coverUrl).subscribe(() => {});\r\n }\r\n\r\n resetCoverImage() {\r\n this.uploadService.updateLibraryCoverImage(this.library.id, '').subscribe(() => {});\r\n }\r\n\r\n openDirectoryPicker() {\r\n const modalRef = this.modalService.open(DirectoryPickerComponent, { scrollable: true, size: 'lg' });\r\n modalRef.closed.subscribe((closeResult: DirectoryPickerResult) => {\r\n if (closeResult.success) {\r\n if (!this.selectedFolders.includes(closeResult.folderPath)) {\r\n this.selectedFolders.push(closeResult.folderPath);\r\n this.madeChanges = true;\r\n this.cdRef.markForCheck();\r\n }\r\n }\r\n });\r\n }\r\n\r\n removeFolder(folder: string) {\r\n this.selectedFolders = this.selectedFolders.filter(item => item !== folder);\r\n this.madeChanges = true;\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n isNextDisabled() {\r\n switch (this.setupStep) {\r\n case StepID.General:\r\n return this.libraryForm.get('name')?.invalid || this.libraryForm.get('type')?.invalid;\r\n case StepID.Folder:\r\n return this.selectedFolders.length === 0;\r\n case StepID.Cover:\r\n return false; // Covers are optional\r\n case StepID.Advanced:\r\n return false; // Advanced are optional\r\n }\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SideNavComponent } from './_components/side-nav/side-nav.component';\r\nimport { PipeModule } from '../pipe/pipe.module';\r\nimport { CardsModule } from '../cards/cards.module';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { NgbNavModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { RouterModule } from '@angular/router';\r\nimport { LibrarySettingsModalComponent } from './_modals/library-settings-modal/library-settings-modal.component';\r\nimport { SideNavCompanionBarComponent } from './_components/side-nav-companion-bar/side-nav-companion-bar.component';\r\nimport { SideNavItemComponent } from './_components/side-nav-item/side-nav-item.component';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n SideNavCompanionBarComponent,\r\n SideNavItemComponent,\r\n SideNavComponent,\r\n LibrarySettingsModalComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n PipeModule,\r\n CardsModule,\r\n FormsModule,\r\n NgbTooltipModule,\r\n NgbNavModule,\r\n ReactiveFormsModule\r\n ],\r\n exports: [\r\n SideNavCompanionBarComponent,\r\n SideNavItemComponent,\r\n SideNavComponent\r\n ]\r\n})\r\nexport class SidenavModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TypeaheadComponent } from './_components/typeahead.component';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { SharedModule } from '../shared/shared.module';\r\nimport { PipeModule } from '../pipe/pipe.module';\r\n\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n TypeaheadComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n SharedModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n PipeModule\r\n ],\r\n exports: [\r\n TypeaheadComponent\r\n ]\r\n})\r\nexport class TypeaheadModule { }\r\n","import { getBaseUrl } from \"src/app/base-url.provider\";\r\nconst BASE_URL = getBaseUrl();\r\n\r\nexport const environment = {\r\n production: true,\r\n apiUrl: `${BASE_URL}api/`,\r\n hubUrl:`${BASE_URL}hubs/`\r\n};\r\n","export function getBaseUrl() : string {\r\n return document.getElementsByTagName('base')[0]?.getAttribute('href') || '/';\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule, PreloadAllModules } from '@angular/router';\r\nimport { AuthGuard } from './_guards/auth.guard';\r\nimport { LibraryAccessGuard } from './_guards/library-access.guard';\r\nimport { AdminGuard } from './_guards/admin.guard';\r\n\r\nconst routes: Routes = [\r\n {\r\n path: 'admin',\r\n canActivate: [AdminGuard],\r\n loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule)\r\n },\r\n {\r\n path: 'collections',\r\n canActivate: [AuthGuard],\r\n loadChildren: () => import('./collections/collections.module').then(m => m.CollectionsModule)\r\n },\r\n {\r\n path: 'preferences',\r\n canActivate: [AuthGuard],\r\n loadChildren: () => import('./user-settings/user-settings.module').then(m => m.UserSettingsModule)\r\n },\r\n {\r\n path: 'lists',\r\n canActivate: [AuthGuard],\r\n loadChildren: () => import('./reading-list/reading-list.module').then(m => m.ReadingListModule)\r\n },\r\n {\r\n path: 'registration',\r\n loadChildren: () => import('../app/registration/registration.module').then(m => m.RegistrationModule)\r\n },\r\n {\r\n path: 'announcements',\r\n loadChildren: () => import('../app/announcements/announcements.module').then(m => m.AnnouncementsModule)\r\n },\r\n {\r\n path: 'bookmarks',\r\n loadChildren: () => import('../app/bookmark/bookmark.module').then(m => m.BookmarkModule)\r\n },\r\n {\r\n path: 'all-series',\r\n loadChildren: () => import('../app/all-series/all-series.module').then(m => m.AllSeriesModule)\r\n },\r\n {\r\n path: 'libraries',\r\n loadChildren: () => import('../app/dashboard/dashboard.module').then(m => m.DashboardModule)\r\n },\r\n {\r\n path: 'want-to-read',\r\n loadChildren: () => import('../app/want-to-read/want-to-read.module').then(m => m.WantToReadModule)\r\n },\r\n {\r\n path: 'library',\r\n runGuardsAndResolvers: 'always',\r\n canActivate: [AuthGuard, LibraryAccessGuard],\r\n children: [\r\n {\r\n path: ':libraryId', \r\n pathMatch: 'full',\r\n loadChildren: () => import('../app/library-detail/library-detail.module').then(m => m.LibraryDetailModule)\r\n },\r\n {\r\n path: ':libraryId/series/:seriesId', \r\n pathMatch: 'full',\r\n loadChildren: () => import('../app/series-detail/series-detail.module').then(m => m.SeriesDetailModule)\r\n },\r\n {\r\n path: ':libraryId/series/:seriesId/manga',\r\n loadChildren: () => import('../app/manga-reader/manga-reader.module').then(m => m.MangaReaderModule)\r\n },\r\n {\r\n path: ':libraryId/series/:seriesId/book',\r\n loadChildren: () => import('../app/book-reader/book-reader.module').then(m => m.BookReaderModule)\r\n },\r\n {\r\n path: ':libraryId/series/:seriesId/pdf',\r\n loadChildren: () => import('../app/pdf-reader/pdf-reader.module').then(m => m.PdfReaderModule)\r\n },\r\n ]\r\n },\r\n {path: 'login', loadChildren: () => import('../app/registration/registration.module').then(m => m.RegistrationModule)},\r\n {path: '**', pathMatch: 'full', redirectTo: 'libraries'},\r\n {path: '**', pathMatch: 'prefix', redirectTo: 'libraries'},\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forRoot(routes, {scrollPositionRestoration: 'enabled', preloadingStrategy: PreloadAllModules})],\r\n exports: [RouterModule]\r\n})\r\nexport class AppRoutingModule { }\r\n","\r\n
\r\n \r\n
\r\n
\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n
\r\n \r\n
\r\n \r\n \"icon\"\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n {{title}}\r\n
\r\n
\r\n \r\n \r\n \r\n
","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n OnInit\r\n} from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { filter, map, Subject, takeUntil } from 'rxjs';\r\nimport { NavService } from 'src/app/_services/nav.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n\r\n@Component({\r\n selector: 'app-side-nav-item',\r\n templateUrl: './side-nav-item.component.html',\r\n styleUrls: ['./side-nav-item.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SideNavItemComponent implements OnInit {\r\n /**\r\n * Icon to display next to item. ie) 'fa-home'\r\n */\r\n @Input() icon: string = '';\r\n @Input() imageUrl: string | null = '';\r\n /**\r\n * Text for the item\r\n */\r\n @Input() title: string = '';\r\n\r\n /**\r\n * If a link should be generated when clicked. By default (undefined), no link will be generated\r\n */\r\n @Input() link: string | undefined;\r\n /**\r\n * If external, link will be used as full href and rel will be applied\r\n */\r\n @Input() external: boolean = false;\r\n\r\n @Input() comparisonMethod: 'startsWith' | 'equals' = 'equals';\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n\r\n highlighted = false;\r\n\r\n constructor(public navService: NavService, private router: Router, private readonly cdRef: ChangeDetectorRef) {\r\n router.events\r\n .pipe(filter(event => event instanceof NavigationEnd),\r\n takeUntilDestroyed(this.destroyRef),\r\n map(evt => evt as NavigationEnd))\r\n .subscribe((evt: NavigationEnd) => {\r\n this.updateHighlight(evt.url.split('?')[0]);\r\n\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n setTimeout(() => {\r\n this.updateHighlight(this.router.url.split('?')[0]);\r\n }, 100);\r\n\r\n }\r\n\r\n updateHighlight(page: string) {\r\n if (this.link === undefined) {\r\n this.highlighted = false;\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n\r\n if (!page.endsWith('/')) {\r\n page = page + '/';\r\n }\r\n\r\n if (this.comparisonMethod === 'equals' && page === this.link) {\r\n this.highlighted = true;\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n if (this.comparisonMethod === 'startsWith' && page.startsWith(this.link)) {\r\n this.highlighted = true;\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n\r\n this.highlighted = false;\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n}\r\n","\r\n
\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 0\">\r\n
10 && (navService?.sideNavCollapsed$ | async) === false\">\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n inject,\r\n OnDestroy,\r\n OnInit\r\n} from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { Subject } from 'rxjs';\r\nimport { filter, map, shareReplay, take, takeUntil } from 'rxjs/operators';\r\nimport { ImportCblModalComponent } from 'src/app/reading-list/_modals/import-cbl-modal/import-cbl-modal.component';\r\nimport { ReadingList } from 'src/app/_models/reading-list';\r\nimport { ImageService } from 'src/app/_services/image.service';\r\nimport { EVENTS, MessageHubService } from 'src/app/_services/message-hub.service';\r\nimport { Breakpoint, UtilityService } from '../../../shared/_services/utility.service';\r\nimport { Library, LibraryType } from '../../../_models/library';\r\nimport { AccountService } from '../../../_services/account.service';\r\nimport { Action, ActionFactoryService, ActionItem } from '../../../_services/action-factory.service';\r\nimport { ActionService } from '../../../_services/action.service';\r\nimport { LibraryService } from '../../../_services/library.service';\r\nimport { NavService } from '../../../_services/nav.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n@Component({\r\n selector: 'app-side-nav',\r\n templateUrl: './side-nav.component.html',\r\n styleUrls: ['./side-nav.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SideNavComponent implements OnInit {\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n libraries: Library[] = [];\r\n actions: ActionItem[] = [];\r\n readingListActions = [{action: Action.Import, title: 'Import CBL', children: [], requiresAdmin: true, callback: this.importCbl.bind(this)}];\r\n\r\n filterQuery: string = '';\r\n filterLibrary = (library: Library) => {\r\n return library.name.toLowerCase().indexOf((this.filterQuery || '').toLowerCase()) >= 0;\r\n }\r\n\r\n\r\n constructor(public accountService: AccountService, private libraryService: LibraryService,\r\n public utilityService: UtilityService, private messageHub: MessageHubService,\r\n private actionFactoryService: ActionFactoryService, private actionService: ActionService,\r\n public navService: NavService, private router: Router, private readonly cdRef: ChangeDetectorRef,\r\n private ngbModal: NgbModal, private imageService: ImageService) {\r\n\r\n this.router.events.pipe(\r\n filter(event => event instanceof NavigationEnd),\r\n takeUntilDestroyed(this.destroyRef),\r\n map(evt => evt as NavigationEnd),\r\n filter(() => this.utilityService.getActiveBreakpoint() < Breakpoint.Tablet))\r\n .subscribe((evt: NavigationEnd) => {\r\n // Collapse side nav on mobile\r\n this.navService.sideNavCollapsed$.pipe(take(1)).subscribe(collapsed => {\r\n if (!collapsed) {\r\n this.navService.toggleSideNav();\r\n this.cdRef.markForCheck();\r\n }\r\n });\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.accountService.currentUser$.pipe(take(1)).subscribe(user => {\r\n if (!user) return;\r\n this.libraryService.getLibraries().pipe(take(1), shareReplay()).subscribe((libraries: Library[]) => {\r\n this.libraries = libraries;\r\n this.cdRef.markForCheck();\r\n });\r\n this.actions = this.actionFactoryService.getLibraryActions(this.handleAction.bind(this));\r\n this.cdRef.markForCheck();\r\n });\r\n\r\n this.messageHub.messages$.pipe(takeUntilDestroyed(this.destroyRef), filter(event => event.event === EVENTS.LibraryModified)).subscribe(event => {\r\n this.libraryService.getLibraries().pipe(take(1), shareReplay()).subscribe((libraries: Library[]) => {\r\n this.libraries = [...libraries];\r\n this.cdRef.markForCheck();\r\n });\r\n });\r\n }\r\n\r\n handleAction(action: ActionItem, library: Library) {\r\n switch (action.action) {\r\n case(Action.Scan):\r\n this.actionService.scanLibrary(library);\r\n break;\r\n case(Action.RefreshMetadata):\r\n this.actionService.refreshMetadata(library);\r\n break;\r\n case (Action.AnalyzeFiles):\r\n this.actionService.analyzeFiles(library);\r\n break;\r\n case (Action.Edit):\r\n this.actionService.editLibrary(library, () => window.scrollTo(0, 0));\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n importCbl() {\r\n const ref = this.ngbModal.open(ImportCblModalComponent, {size: 'xl'});\r\n }\r\n\r\n performAction(action: ActionItem, library: Library) {\r\n if (typeof action.callback === 'function') {\r\n action.callback(action, library);\r\n }\r\n }\r\n\r\n getLibraryTypeIcon(format: LibraryType) {\r\n switch (format) {\r\n case LibraryType.Book:\r\n return 'fa-book';\r\n case LibraryType.Comic:\r\n case LibraryType.Manga:\r\n return 'fa-book-open';\r\n }\r\n }\r\n\r\n getLibraryImage(library: Library) {\r\n if (library.coverImage) return this.imageService.getLibraryCoverImage(library.id);\r\n return null;\r\n }\r\n\r\n toggleNavBar() {\r\n this.navService.toggleSideNav();\r\n }\r\n\r\n}\r\n","\r\n  \r\n \r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { MangaFormat } from 'src/app/_models/manga-format';\r\n\r\n@Component({\r\n selector: 'app-series-format',\r\n templateUrl: './series-format.component.html',\r\n styleUrls: ['./series-format.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SeriesFormatComponent {\r\n\r\n @Input() format: MangaFormat = MangaFormat.UNKNOWN;\r\n\r\n get MangaFormat(): typeof MangaFormat {\r\n return MangaFormat;\r\n }\r\n}\r\n","\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n
    \r\n \r\n \r\n
  • 0 || infos.length > 0\" (click)=\"clearAllErrorOrInfos()\">\r\n Dismiss All\r\n
  • \r\n
    \r\n
    \r\n \r\n
  • \r\n
    Title goes here
    \r\n
    Subtitle goes here
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
  • \r\n
  • \r\n
    Title goes here
    \r\n
    Subtitle goes here
    \r\n
  • \r\n
  • \r\n
    \r\n
    Scanning Books
    \r\n
    E:\\\\Books\\\\Demon King Daimaou\\\\Demon King Daimaou - Volume 11.epub
    \r\n
    \r\n
    {{prettyPrintProgress(0.1)}}%
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
  • \r\n
  • \r\n
    \r\n
    There was some library scan error
    \r\n
    Click for more information
    \r\n
    \r\n \r\n
  • \r\n
  • \r\n
    \r\n
    Scan didn't run becasuse nothing to do
    \r\n
    Click for more information
    \r\n
    \r\n \r\n
  • \r\n
  • \r\n
    \r\n \r\n \r\n \r\n 10% downloaded\r\n \r\n \r\n Downloading {{'series' | sentenceCase}}\r\n
    \r\n
    PDFs
    \r\n
  • \r\n
    \r\n\r\n \r\n \r\n \r\n
  • \r\n
    {{message.title}}
    \r\n
    {{message.subTitle}}
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
  • \r\n \r\n
  • \r\n
    {{message.title}}
    \r\n
    {{message.subTitle}}
    \r\n
    \r\n
    {{prettyPrintProgress(message.body.progress) + '%'}}
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
  • \r\n
    \r\n
    \r\n
    \r\n\r\n \r\n \r\n \r\n
  • \r\n  Update available\r\n
  • \r\n
  • \r\n
    {{singleUpdate.title}}
    \r\n
    {{singleUpdate.subTitle}}
    \r\n
  • \r\n
    \r\n
    \r\n\r\n \r\n \r\n \r\n
  • \r\n
    Downloading {{download.entityType | sentenceCase}}
    \r\n
    {{download.subTitle}}
    \r\n
    \r\n
    {{download.progress}}%
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
  • \r\n
    \r\n
    \r\n \r\n\r\n \r\n \r\n \r\n
  • \r\n
    \r\n
    {{error.title}}
    \r\n
    Click for more information
    \r\n
    \r\n \r\n
  • \r\n
    \r\n
    \r\n\r\n \r\n \r\n \r\n
  • \r\n
    \r\n
    {{info.title}}
    \r\n
    Click for more information
    \r\n
    \r\n \r\n
  • \r\n
    \r\n
    \r\n\r\n \r\n \r\n
  • 1\">\r\n
    {{onlineUsers.length}} Users online
    \r\n
  • \r\n
  • Active Events: {{activeEvents}}
  • \r\n
    \r\n\r\n \r\n
  • Not much going on here
  • \r\n
    \r\n \r\n
\r\n
\r\n
","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n OnInit\r\n} from '@angular/core';\r\nimport { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\r\nimport { BehaviorSubject, Observable, of, Subject } from 'rxjs';\r\nimport { map, shareReplay, takeUntil } from 'rxjs/operators';\r\nimport { ConfirmConfig } from 'src/app/shared/confirm-dialog/_models/confirm-config';\r\nimport { ConfirmService } from 'src/app/shared/confirm.service';\r\nimport { UpdateNotificationModalComponent } from 'src/app/shared/update-notification/update-notification-modal.component';\r\nimport { DownloadService } from 'src/app/shared/_services/download.service';\r\nimport { ErrorEvent } from 'src/app/_models/events/error-event';\r\nimport { InfoEvent } from 'src/app/_models/events/info-event';\r\nimport { NotificationProgressEvent } from 'src/app/_models/events/notification-progress-event';\r\nimport { UpdateVersionEvent } from 'src/app/_models/events/update-version-event';\r\nimport { User } from 'src/app/_models/user';\r\nimport { AccountService } from 'src/app/_services/account.service';\r\nimport { EVENTS, Message, MessageHubService } from 'src/app/_services/message-hub.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n@Component({\r\n selector: 'app-nav-events-toggle',\r\n templateUrl: './events-widget.component.html',\r\n styleUrls: ['./events-widget.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class EventsWidgetComponent implements OnInit, OnDestroy {\r\n @Input({required: true}) user!: User;\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n isAdmin$: Observable = of(false);\r\n\r\n /**\r\n * Progress events (Event Type: 'started', 'ended', 'updated' that have progress property)\r\n */\r\n progressEventsSource = new BehaviorSubject([]);\r\n progressEvents$ = this.progressEventsSource.asObservable();\r\n\r\n singleUpdateSource = new BehaviorSubject([]);\r\n singleUpdates$ = this.singleUpdateSource.asObservable();\r\n\r\n errorSource = new BehaviorSubject([]);\r\n errors$ = this.errorSource.asObservable();\r\n\r\n infoSource = new BehaviorSubject([]);\r\n infos$ = this.infoSource.asObservable();\r\n\r\n private updateNotificationModalRef: NgbModalRef | null = null;\r\n\r\n activeEvents: number = 0;\r\n\r\n debugMode: boolean = false;\r\n\r\n\r\n get EVENTS() {\r\n return EVENTS;\r\n }\r\n\r\n constructor(public messageHub: MessageHubService, private modalService: NgbModal,\r\n private accountService: AccountService, private confirmService: ConfirmService,\r\n private readonly cdRef: ChangeDetectorRef, public downloadService: DownloadService) {\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.progressEventsSource.complete();\r\n this.singleUpdateSource.complete();\r\n this.errorSource.complete();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.messageHub.messages$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(event => {\r\n if (event.event === EVENTS.NotificationProgress) {\r\n this.processNotificationProgressEvent(event);\r\n } else if (event.event === EVENTS.Error) {\r\n const values = this.errorSource.getValue();\r\n values.push(event.payload as ErrorEvent);\r\n this.errorSource.next(values);\r\n this.activeEvents += 1;\r\n this.cdRef.markForCheck();\r\n } else if (event.event === EVENTS.Info) {\r\n const values = this.infoSource.getValue();\r\n values.push(event.payload as InfoEvent);\r\n this.infoSource.next(values);\r\n this.activeEvents += 1;\r\n this.cdRef.markForCheck();\r\n }\r\n });\r\n\r\n this.isAdmin$ = this.accountService.currentUser$.pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map(user => (user && this.accountService.hasAdminRole(user)) || false),\r\n shareReplay()\r\n );\r\n }\r\n\r\n processNotificationProgressEvent(event: Message) {\r\n const message = event.payload as NotificationProgressEvent;\r\n let data;\r\n switch (event.payload.eventType) {\r\n case 'single':\r\n const values = this.singleUpdateSource.getValue();\r\n values.push(message);\r\n this.singleUpdateSource.next(values);\r\n this.activeEvents += 1;\r\n this.cdRef.markForCheck();\r\n break;\r\n case 'started':\r\n // Sometimes we can receive 2 started on long running scans, so better to just treat as a merge then.\r\n data = this.mergeOrUpdate(this.progressEventsSource.getValue(), message);\r\n this.progressEventsSource.next(data);\r\n break;\r\n case 'updated':\r\n data = this.mergeOrUpdate(this.progressEventsSource.getValue(), message);\r\n this.progressEventsSource.next(data);\r\n break;\r\n case 'ended':\r\n data = this.progressEventsSource.getValue();\r\n data = data.filter(m => m.name !== message.name);\r\n this.progressEventsSource.next(data);\r\n this.activeEvents = Math.max(this.activeEvents - 1, 0);\r\n this.cdRef.markForCheck();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n private mergeOrUpdate(data: NotificationProgressEvent[], message: NotificationProgressEvent) {\r\n const index = data.findIndex(m => m.name === message.name);\r\n // Sometimes we can receive 2 started on long running scans, so better to just treat as a merge then.\r\n if (index < 0) {\r\n data.push(message);\r\n this.activeEvents += 1;\r\n this.cdRef.markForCheck();\r\n } else {\r\n data[index] = message;\r\n }\r\n return data;\r\n }\r\n\r\n\r\n handleUpdateAvailableClick(message: NotificationProgressEvent) {\r\n if (this.updateNotificationModalRef != null) { return; }\r\n this.updateNotificationModalRef = this.modalService.open(UpdateNotificationModalComponent, { scrollable: true, size: 'lg' });\r\n this.updateNotificationModalRef.componentInstance.updateData = message.body as UpdateVersionEvent;\r\n this.updateNotificationModalRef.closed.subscribe(() => {\r\n this.updateNotificationModalRef = null;\r\n });\r\n this.updateNotificationModalRef.dismissed.subscribe(() => {\r\n this.updateNotificationModalRef = null;\r\n });\r\n }\r\n\r\n async seeMore(event: ErrorEvent | InfoEvent) {\r\n const config = new ConfirmConfig();\r\n if (event.name === EVENTS.Error) {\r\n config.buttons = [\r\n {text: 'Ok', type: 'secondary'},\r\n {text: 'Dismiss', type: 'primary'}\r\n ];\r\n } else {\r\n config.buttons = [\r\n {text: 'Ok', type: 'primary'},\r\n ];\r\n }\r\n config.header = event.title;\r\n config.content = event.subTitle;\r\n var result = await this.confirmService.alert(event.subTitle || event.title, config);\r\n if (result) {\r\n this.removeErrorOrInfo(event);\r\n }\r\n }\r\n\r\n clearAllErrorOrInfos() {\r\n const infoCount = this.infoSource.getValue().length;\r\n const errorCount = this.errorSource.getValue().length;\r\n this.infoSource.next([]);\r\n this.errorSource.next([]);\r\n this.activeEvents -= Math.max(infoCount + errorCount, 0);\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n removeErrorOrInfo(messageEvent: ErrorEvent | InfoEvent, event?: MouseEvent) {\r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n let data = [];\r\n if (messageEvent.name === EVENTS.Info) {\r\n data = this.infoSource.getValue();\r\n data = data.filter(m => m !== messageEvent);\r\n this.infoSource.next(data);\r\n } else {\r\n data = this.errorSource.getValue();\r\n data = data.filter(m => m !== messageEvent);\r\n this.errorSource.next(data);\r\n }\r\n this.activeEvents = Math.max(this.activeEvents - 1, 0);\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n prettyPrintProgress(progress: number) {\r\n return Math.trunc(progress * 100);\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n \r\n
\r\n Loading...\r\n
\r\n \r\n
\r\n
\r\n
\r\n
    \r\n 0\">\r\n
  • Series
  • \r\n
      \r\n
    • \r\n \r\n
    • \r\n
    \r\n
    \r\n\r\n 0\">\r\n
  • Collections
  • \r\n
      \r\n
    • \r\n \r\n
    • \r\n
    \r\n
    \r\n\r\n 0\">\r\n
  • Reading Lists
  • \r\n
      \r\n
    • \r\n \r\n
    • \r\n
    \r\n
    \r\n\r\n 0\">\r\n
  • Libraries
  • \r\n
      \r\n
    • \r\n \r\n
    • \r\n
    \r\n
    \r\n\r\n 0\">\r\n
  • Genres
  • \r\n
      \r\n
    • \r\n \r\n
    • \r\n
    \r\n
    \r\n\r\n 0\">\r\n
  • Tags
  • \r\n
      \r\n
    • \r\n \r\n
    • \r\n
    \r\n
    \r\n\r\n 0\">\r\n
  • People
  • \r\n
      \r\n
    • \r\n \r\n
    • \r\n
    \r\n
    \r\n\r\n 0\">\r\n
  • Chapters
  • \r\n
      \r\n
    • \r\n \r\n
    • \r\n
    \r\n
    \r\n\r\n 0\">\r\n
  • Files
  • \r\n
      \r\n
    • \r\n \r\n
    • \r\n
    \r\n
    \r\n\r\n 0\">\r\n
      \r\n
    • \r\n \r\n
    • \r\n
    \r\n\r\n
    \r\n
\r\n
\r\n\r\n
\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild, DestroyRef,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n TemplateRef,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime, takeUntil } from 'rxjs/operators';\r\nimport { KEY_CODES } from 'src/app/shared/_services/utility.service';\r\nimport { SearchResultGroup } from 'src/app/_models/search/search-result-group';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n@Component({\r\n selector: 'app-grouped-typeahead',\r\n templateUrl: './grouped-typeahead.component.html',\r\n styleUrls: ['./grouped-typeahead.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class GroupedTypeaheadComponent implements OnInit {\r\n /**\r\n * Unique id to tie with a label element\r\n */\r\n @Input() id: string = 'grouped-typeahead';\r\n /**\r\n * Minimum number of characters in input to trigger a search\r\n */\r\n @Input() minQueryLength: number = 0;\r\n /**\r\n * Initial value of the search model\r\n */\r\n @Input() initialValue: string = '';\r\n @Input() groupedData: SearchResultGroup = new SearchResultGroup();\r\n /**\r\n * Placeholder for the input\r\n */\r\n @Input() placeholder: string = '';\r\n /**\r\n * Number of milliseconds after typing before triggering inputChanged for data fetching\r\n */\r\n @Input() debounceTime: number = 200;\r\n /**\r\n * Emits when the input changes from user interaction\r\n */\r\n @Output() inputChanged: EventEmitter = new EventEmitter();\r\n /**\r\n * Emits when something is clicked/selected\r\n */\r\n @Output() selected: EventEmitter = new EventEmitter();\r\n /**\r\n * Emits an event when the field is cleared\r\n */\r\n @Output() clearField: EventEmitter = new EventEmitter();\r\n /**\r\n * Emits when a change in the search field looses/gains focus\r\n */\r\n @Output() focusChanged: EventEmitter = new EventEmitter();\r\n\r\n @ViewChild('input') inputElem!: ElementRef;\r\n @ContentChild('itemTemplate') itemTemplate!: TemplateRef;\r\n @ContentChild('seriesTemplate') seriesTemplate: TemplateRef | undefined;\r\n @ContentChild('collectionTemplate') collectionTemplate: TemplateRef | undefined;\r\n @ContentChild('tagTemplate') tagTemplate: TemplateRef | undefined;\r\n @ContentChild('personTemplate') personTemplate: TemplateRef | undefined;\r\n @ContentChild('genreTemplate') genreTemplate!: TemplateRef;\r\n @ContentChild('noResultsTemplate') noResultsTemplate!: TemplateRef;\r\n @ContentChild('libraryTemplate') libraryTemplate!: TemplateRef;\r\n @ContentChild('readingListTemplate') readingListTemplate!: TemplateRef;\r\n @ContentChild('fileTemplate') fileTemplate!: TemplateRef;\r\n @ContentChild('chapterTemplate') chapterTemplate!: TemplateRef;\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n\r\n hasFocus: boolean = false;\r\n isLoading: boolean = false;\r\n typeaheadForm: FormGroup = new FormGroup({});\r\n\r\n prevSearchTerm: string = '';\r\n\r\n get searchTerm() {\r\n return this.typeaheadForm.get('typeahead')?.value || '';\r\n }\r\n\r\n get hasData() {\r\n return !(this.noResultsTemplate != undefined && !this.groupedData.persons.length && !this.groupedData.collections.length\r\n && !this.groupedData.series.length && !this.groupedData.persons.length && !this.groupedData.tags.length && !this.groupedData.genres.length && !this.groupedData.libraries.length\r\n && !this.groupedData.files.length && !this.groupedData.chapters.length);\r\n }\r\n\r\n\r\n constructor(private readonly cdRef: ChangeDetectorRef) { }\r\n\r\n @HostListener('window:click', ['$event'])\r\n handleDocumentClick(event: any) {\r\n this.close();\r\n\r\n }\r\n\r\n @HostListener('window:keydown', ['$event'])\r\n handleKeyPress(event: KeyboardEvent) {\r\n if (!this.hasFocus) { return; }\r\n\r\n switch(event.key) {\r\n case KEY_CODES.ESC_KEY:\r\n this.close();\r\n event.stopPropagation();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.typeaheadForm.addControl('typeahead', new FormControl(this.initialValue, []));\r\n this.cdRef.markForCheck();\r\n\r\n this.typeaheadForm.valueChanges.pipe(debounceTime(this.debounceTime), takeUntilDestroyed(this.destroyRef)).subscribe(change => {\r\n const value = this.typeaheadForm.get('typeahead')?.value;\r\n\r\n if (value != undefined && value != '' && !this.hasFocus) {\r\n this.hasFocus = true;\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n if (value != undefined && value.length >= this.minQueryLength) {\r\n\r\n if (this.prevSearchTerm === value) return;\r\n this.inputChanged.emit(value);\r\n this.prevSearchTerm = value;\r\n this.cdRef.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n onInputFocus(event: any) {\r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n\r\n this.openDropdown();\r\n return this.hasFocus;\r\n }\r\n\r\n openDropdown() {\r\n setTimeout(() => {\r\n const model = this.typeaheadForm.get('typeahead');\r\n if (model) {\r\n model.setValue(model.value);\r\n }\r\n });\r\n }\r\n\r\n handleResultlick(item: any) {\r\n this.selected.emit(item);\r\n }\r\n\r\n resetField() {\r\n this.prevSearchTerm = '';\r\n this.typeaheadForm.get('typeahead')?.setValue(this.initialValue);\r\n this.clearField.emit();\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n\r\n close(event?: FocusEvent) {\r\n if (event) {\r\n // If the user is tabbing out of the input field, check if there are results first before closing\r\n if (this.hasData) {\r\n return;\r\n }\r\n }\r\n if (this.searchTerm === '') {\r\n this.resetField();\r\n }\r\n this.hasFocus = false;\r\n this.cdRef.markForCheck();\r\n this.focusChanged.emit(this.hasFocus);\r\n }\r\n\r\n open(event?: FocusEvent) {\r\n this.hasFocus = true;\r\n this.focusChanged.emit(this.hasFocus);\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n public clear() {\r\n this.prevSearchTerm = '';\r\n this.typeaheadForm.get('typeahead')?.setValue(this.initialValue);\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { PersonRole } from '../_models/metadata/person';\r\n\r\n@Pipe({\r\n name: 'personRole'\r\n})\r\nexport class PersonRolePipe implements PipeTransform {\r\n\r\n transform(value: PersonRole): string {\r\n switch (value) {\r\n case PersonRole.Artist: return 'Artist';\r\n case PersonRole.Character: return 'Character';\r\n case PersonRole.Colorist: return 'Colorist';\r\n case PersonRole.CoverArtist: return 'Cover Artist';\r\n case PersonRole.Editor: return 'Editor';\r\n case PersonRole.Inker: return 'Inker';\r\n case PersonRole.Letterer: return 'Letterer';\r\n case PersonRole.Penciller: return 'Penciller';\r\n case PersonRole.Publisher: return 'Publisher';\r\n case PersonRole.Writer: return 'Writer';\r\n case PersonRole.Other: return '';\r\n default: return '';\r\n }\r\n }\r\n\r\n}\r\n","\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component, DestroyRef,\r\n ElementRef,\r\n inject,\r\n Inject,\r\n OnDestroy,\r\n OnInit,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { fromEvent, Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, filter, takeUntil, tap } from 'rxjs/operators';\r\nimport { FilterQueryParam } from 'src/app/shared/_services/filter-utilities.service';\r\nimport { Chapter } from 'src/app/_models/chapter';\r\nimport { CollectionTag } from 'src/app/_models/collection-tag';\r\nimport { Library } from 'src/app/_models/library';\r\nimport { MangaFile } from 'src/app/_models/manga-file';\r\nimport { PersonRole } from 'src/app/_models/metadata/person';\r\nimport { ReadingList } from 'src/app/_models/reading-list';\r\nimport { SearchResult } from 'src/app/_models/search/search-result';\r\nimport { SearchResultGroup } from 'src/app/_models/search/search-result-group';\r\nimport { AccountService } from 'src/app/_services/account.service';\r\nimport { ImageService } from 'src/app/_services/image.service';\r\nimport { NavService } from 'src/app/_services/nav.service';\r\nimport { ScrollService } from 'src/app/_services/scroll.service';\r\nimport { SearchService } from 'src/app/_services/search.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n@Component({\r\n selector: 'app-nav-header',\r\n templateUrl: './nav-header.component.html',\r\n styleUrls: ['./nav-header.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class NavHeaderComponent implements OnInit {\r\n\r\n @ViewChild('search') searchViewRef!: any;\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n isLoading = false;\r\n debounceTime = 300;\r\n imageStyles = {width: '24px', 'margin-top': '5px'};\r\n searchResults: SearchResultGroup = new SearchResultGroup();\r\n searchTerm = '';\r\n customFilter: (items: SearchResult[], query: string) => SearchResult[] = (items: SearchResult[], query: string) => {\r\n const normalizedQuery = query.trim().toLowerCase();\r\n const matches = items.filter(item => {\r\n const normalizedSeriesName = item.name.toLowerCase().trim();\r\n const normalizedOriginalName = item.originalName.toLowerCase().trim();\r\n const normalizedLocalizedName = item.localizedName.toLowerCase().trim();\r\n return normalizedSeriesName.indexOf(normalizedQuery) >= 0 || normalizedOriginalName.indexOf(normalizedQuery) >= 0 || normalizedLocalizedName.indexOf(normalizedQuery) >= 0;\r\n });\r\n return matches;\r\n };\r\n\r\n\r\n backToTopNeeded = false;\r\n searchFocused: boolean = false;\r\n scrollElem: HTMLElement;\r\n\r\n constructor(public accountService: AccountService, private router: Router, public navService: NavService,\r\n public imageService: ImageService, @Inject(DOCUMENT) private document: Document,\r\n private scrollService: ScrollService, private searchService: SearchService, private readonly cdRef: ChangeDetectorRef) {\r\n this.scrollElem = this.document.body;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.scrollService.scrollContainer$.pipe(distinctUntilChanged(), takeUntilDestroyed(this.destroyRef), tap((scrollContainer) => {\r\n if (scrollContainer === 'body' || scrollContainer === undefined) {\r\n this.scrollElem = this.document.body;\r\n fromEvent(this.document.body, 'scroll').pipe(debounceTime(20)).subscribe(() => this.checkBackToTopNeeded(this.document.body));\r\n } else {\r\n const elem = scrollContainer as ElementRef;\r\n this.scrollElem = elem.nativeElement;\r\n fromEvent(elem.nativeElement, 'scroll').pipe(debounceTime(20)).subscribe(() => this.checkBackToTopNeeded(elem.nativeElement));\r\n }\r\n })).subscribe();\r\n\r\n // Sometimes the top event emitter can be slow, so let's also check when a navigation occurs and recalculate\r\n this.router.events\r\n .pipe(filter(event => event instanceof NavigationEnd))\r\n .subscribe(() => {\r\n this.checkBackToTopNeeded(this.scrollElem);\r\n });\r\n }\r\n\r\n checkBackToTopNeeded(elem: HTMLElement) {\r\n const offset = elem.scrollTop || 0;\r\n if (offset > 100) {\r\n this.backToTopNeeded = true;\r\n } else if (offset < 40) {\r\n this.backToTopNeeded = false;\r\n }\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n logout() {\r\n this.accountService.logout();\r\n this.navService.hideNavBar();\r\n this.navService.hideSideNav();\r\n this.router.navigateByUrl('/login');\r\n }\r\n\r\n moveFocus() {\r\n this.document.getElementById('content')?.focus();\r\n }\r\n\r\n\r\n\r\n onChangeSearch(val: string) {\r\n this.isLoading = true;\r\n this.searchTerm = val.trim();\r\n this.cdRef.markForCheck();\r\n\r\n this.searchService.search(val.trim()).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(results => {\r\n this.searchResults = results;\r\n this.isLoading = false;\r\n this.cdRef.markForCheck();\r\n }, err => {\r\n this.searchResults.reset();\r\n this.isLoading = false;\r\n this.searchTerm = '';\r\n this.cdRef.markForCheck();\r\n });\r\n }\r\n\r\n goTo(queryParamName: string, filter: any) {\r\n let params: any = {};\r\n params[queryParamName] = filter;\r\n params[FilterQueryParam.Page] = 1;\r\n this.clearSearch();\r\n this.router.navigate(['all-series'], {queryParams: params});\r\n }\r\n\r\n goToPerson(role: PersonRole, filter: any) {\r\n this.clearSearch();\r\n switch(role) {\r\n case PersonRole.Writer:\r\n this.goTo(FilterQueryParam.Writers, filter);\r\n break;\r\n case PersonRole.Artist:\r\n this.goTo(FilterQueryParam.Artists, filter);\r\n break;\r\n case PersonRole.Character:\r\n this.goTo(FilterQueryParam.Character, filter);\r\n break;\r\n case PersonRole.Colorist:\r\n this.goTo(FilterQueryParam.Colorist, filter);\r\n break;\r\n case PersonRole.Editor:\r\n this.goTo(FilterQueryParam.Editor, filter);\r\n break;\r\n case PersonRole.Inker:\r\n this.goTo(FilterQueryParam.Inker, filter);\r\n break;\r\n case PersonRole.CoverArtist:\r\n this.goTo(FilterQueryParam.CoverArtists, filter);\r\n break;\r\n case PersonRole.Letterer:\r\n this.goTo(FilterQueryParam.Letterer, filter);\r\n break;\r\n case PersonRole.Penciller:\r\n this.goTo(FilterQueryParam.Penciller, filter);\r\n break;\r\n case PersonRole.Publisher:\r\n this.goTo(FilterQueryParam.Publisher, filter);\r\n break;\r\n case PersonRole.Translator:\r\n this.goTo(FilterQueryParam.Translator, filter);\r\n break;\r\n }\r\n }\r\n\r\n clearSearch() {\r\n this.searchViewRef.clear();\r\n this.searchTerm = '';\r\n this.searchResults = new SearchResultGroup();\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n clickSeriesSearchResult(item: SearchResult) {\r\n this.clearSearch();\r\n const libraryId = item.libraryId;\r\n const seriesId = item.seriesId;\r\n this.router.navigate(['library', libraryId, 'series', seriesId]);\r\n }\r\n\r\n clickFileSearchResult(item: MangaFile) {\r\n this.clearSearch();\r\n this.searchService.getSeriesForMangaFile(item.id).subscribe(series => {\r\n if (series !== undefined && series !== null) {\r\n this.router.navigate(['library', series.libraryId, 'series', series.id]);\r\n }\r\n });\r\n }\r\n\r\n clickChapterSearchResult(item: Chapter) {\r\n this.clearSearch();\r\n this.searchService.getSeriesForChapter(item.id).subscribe(series => {\r\n if (series !== undefined && series !== null) {\r\n this.router.navigate(['library', series.libraryId, 'series', series.id]);\r\n }\r\n });\r\n }\r\n\r\n clickLibraryResult(item: Library) {\r\n this.clearSearch();\r\n this.router.navigate(['library', item.id]);\r\n }\r\n\r\n clickCollectionSearchResult(item: CollectionTag) {\r\n this.clearSearch();\r\n this.router.navigate(['collections', item.id]);\r\n }\r\n\r\n clickReadingListSearchResult(item: ReadingList) {\r\n this.clearSearch();\r\n this.router.navigate(['lists', item.id]);\r\n }\r\n\r\n\r\n scrollToTop() {\r\n this.scrollService.scrollTo(0, this.scrollElem);\r\n }\r\n\r\n focusUpdate(searchFocused: boolean) {\r\n this.searchFocused = searchFocused;\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n hideSideNav() {\r\n this.navService.toggleSideNav();\r\n }\r\n}\r\n","
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n","import { Component, HostListener, Inject, OnInit } from '@angular/core';\r\nimport { NavigationStart, Router } from '@angular/router';\r\nimport { map, take } from 'rxjs/operators';\r\nimport { AccountService } from './_services/account.service';\r\nimport { LibraryService } from './_services/library.service';\r\nimport { MessageHubService } from './_services/message-hub.service';\r\nimport { NavService } from './_services/nav.service';\r\nimport { filter } from 'rxjs/operators';\r\nimport { NgbModal, NgbRatingConfig } from '@ng-bootstrap/ng-bootstrap';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.scss']\r\n})\r\nexport class AppComponent implements OnInit {\r\n\r\n transitionState$!: Observable;\r\n\r\n constructor(private accountService: AccountService, public navService: NavService, \r\n private messageHub: MessageHubService, private libraryService: LibraryService, \r\n router: Router, private ngbModal: NgbModal, ratingConfig: NgbRatingConfig, \r\n @Inject(DOCUMENT) private document: Document) {\r\n\r\n // Setup default rating config\r\n ratingConfig.max = 5;\r\n ratingConfig.resettable = true;\r\n \r\n // Close any open modals when a route change occurs\r\n router.events\r\n .pipe(filter(event => event instanceof NavigationStart))\r\n .subscribe((event) => {\r\n if (this.ngbModal.hasOpenModals()) {\r\n this.ngbModal.dismissAll();\r\n }\r\n });\r\n\r\n this.transitionState$ = this.accountService.currentUser$.pipe(map((user) => {\r\n if (!user) return false;\r\n return user.preferences.noTransitions;\r\n }));\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n @HostListener('window:orientationchange', ['$event'])\r\n setDocHeight() {\r\n // Sets a CSS variable for the actual device viewport height. Needed for mobile dev.\r\n const vh = window.innerHeight * 0.01;\r\n this.document.documentElement.style.setProperty('--vh', `${vh}px`);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setCurrentUser();\r\n this.setDocHeight();\r\n }\r\n\r\n setCurrentUser() {\r\n const user = this.accountService.getUserFromLocalStorage();\r\n this.accountService.setCurrentUser(user);\r\n\r\n if (user) {\r\n this.messageHub.createHubConnection(user, this.accountService.hasAdminRole(user));\r\n this.libraryService.getLibraryNames().pipe(take(1)).subscribe(() => {/* No Operation */});\r\n } \r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n HttpRequest,\r\n HttpHandler,\r\n HttpEvent,\r\n HttpInterceptor\r\n} from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { AccountService } from '../_services/account.service';\r\nimport { take } from 'rxjs/operators';\r\n\r\n@Injectable()\r\nexport class JwtInterceptor implements HttpInterceptor {\r\n\r\n constructor(private accountService: AccountService) {}\r\n\r\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n\r\n // Take 1 means we don't have to unsubscribe because we take 1 then complete\r\n this.accountService.currentUser$.pipe(take(1)).subscribe(user => {\r\n if (user) {\r\n request = request.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${user.token}`\r\n }\r\n });\r\n }\r\n });\r\n\r\n return next.handle(request);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n HttpRequest,\r\n HttpHandler,\r\n HttpEvent,\r\n HttpInterceptor\r\n} from '@angular/common/http';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { Router } from '@angular/router';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { catchError } from 'rxjs/operators';\r\nimport { AccountService } from '../_services/account.service';\r\n\r\n@Injectable()\r\nexport class ErrorInterceptor implements HttpInterceptor {\r\n\r\n constructor(private router: Router, private toastr: ToastrService, private accountService: AccountService) {}\r\n\r\n\r\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n return next.handle(request).pipe(\r\n catchError(error => {\r\n if (error === undefined || error === null) {\r\n return throwError(error);\r\n }\r\n\r\n switch (error.status) {\r\n case 400:\r\n this.handleValidationError(error);\r\n break;\r\n case 401:\r\n this.handleAuthError(error);\r\n break;\r\n case 404:\r\n this.handleNotFound(error);\r\n break;\r\n case 500:\r\n this.handleServerException(error);\r\n break;\r\n default:\r\n // Don't throw multiple Something undexpected went wrong\r\n if (this.toastr.previousToastMessage !== 'Something unexpected went wrong.') {\r\n this.toastr.error('Something unexpected went wrong.');\r\n }\r\n break;\r\n }\r\n return throwError(error);\r\n })\r\n );\r\n }\r\n\r\n private handleValidationError(error: any) {\r\n // This 400 can also be a bad request \r\n if (Array.isArray(error.error)) {\r\n const modalStateErrors: any[] = [];\r\n if (error.error.length > 0 && error.error[0].hasOwnProperty('message')) {\r\n if (error.error[0].details === null) {\r\n error.error.forEach((issue: {status: string, details: string, message: string}) => {\r\n modalStateErrors.push(issue.message);\r\n });\r\n } else {\r\n error.error.forEach((issue: {status: string, details: string, message: string}) => {\r\n modalStateErrors.push(issue.details);\r\n });\r\n }\r\n } else {\r\n error.error.forEach((issue: {code: string, description: string}) => {\r\n modalStateErrors.push(issue.description);\r\n });\r\n }\r\n throw modalStateErrors.flat();\r\n } else if (error.error.errors) {\r\n // Validation error\r\n const modalStateErrors = [];\r\n for (const key in error.error.errors) {\r\n if (error.error.errors[key]) {\r\n modalStateErrors.push(error.error.errors[key]);\r\n }\r\n }\r\n throw modalStateErrors.flat();\r\n } else {\r\n console.error('error:', error);\r\n if (error.statusText === 'Bad Request') {\r\n if (error.error instanceof Blob) {\r\n this.toastr.error('There was an issue downloading this file or you do not have permissions', error.status); \r\n return; \r\n }\r\n this.toastr.error(error.error, error.status + ' Error');\r\n } else {\r\n this.toastr.error(error.statusText === 'OK' ? error.error : error.statusText, error.status + ' Error');\r\n }\r\n }\r\n }\r\n\r\n private handleNotFound(error: any) {\r\n this.toastr.error('That url does not exist.'); \r\n }\r\n\r\n private handleServerException(error: any) {\r\n const err = error.error;\r\n if (err.hasOwnProperty('message') && err.message.trim() !== '') {\r\n if (err.message != 'User is not authenticated') {\r\n console.error('500 error: ', error);\r\n }\r\n this.toastr.error(err.message);\r\n } else if (error.hasOwnProperty('message') && error.message.trim() !== '') {\r\n if (error.message != 'User is not authenticated') {\r\n console.error('500 error: ', error);\r\n }\r\n this.toastr.error(error.message);\r\n }\r\n else {\r\n this.toastr.error('There was an unknown critical error.');\r\n console.error('500 error:', error);\r\n }\r\n }\r\n\r\n private handleAuthError(error: any) {\r\n\r\n // Special hack for register url, to not care about auth\r\n if (location.href.includes('/registration/confirm-email?token=')) {\r\n return;\r\n }\r\n // NOTE: Signin has error.error or error.statusText available. \r\n // if statement is due to http/2 spec issue: https://github.com/angular/angular/issues/23334\r\n this.accountService.logout();\r\n this.router.navigateByUrl('/login');\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EventsWidgetComponent } from './_components/events-widget/events-widget.component';\r\nimport { NgbDropdownModule, NgbPopoverModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { SharedModule } from '../shared/shared.module';\r\nimport { PipeModule } from '../pipe/pipe.module';\r\nimport { TypeaheadModule } from '../typeahead/typeahead.module';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { RouterModule } from '@angular/router';\r\nimport { GroupedTypeaheadComponent } from './_components/grouped-typeahead/grouped-typeahead.component';\r\nimport { NavHeaderComponent } from './_components/nav-header/nav-header.component';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n NavHeaderComponent,\r\n EventsWidgetComponent,\r\n GroupedTypeaheadComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n RouterModule,\r\n\r\n NgbDropdownModule,\r\n NgbPopoverModule,\r\n NgbNavModule,\r\n\r\n SharedModule, // app image, series-format\r\n PipeModule,\r\n TypeaheadModule,\r\n ],\r\n exports: [\r\n NavHeaderComponent,\r\n SharedModule\r\n ]\r\n})\r\nexport class NavModule { }\r\n","import { BrowserModule, Title } from '@angular/platform-browser';\r\nimport { NgModule } from '@angular/core';\r\n\r\nimport { AppRoutingModule } from './app-routing.module';\r\nimport { AppComponent } from './app.component';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { JwtInterceptor } from './_interceptors/jwt.interceptor';\r\nimport { ToastrModule } from 'ngx-toastr';\r\nimport { ErrorInterceptor } from './_interceptors/error.interceptor';\r\n\r\nimport { SAVER, getSaver } from './shared/_providers/saver.provider';\r\nimport { SidenavModule } from './sidenav/sidenav.module';\r\nimport { NavModule } from './nav/nav.module';\r\n\r\n\r\n\r\n// Disable Web Animations if the user's browser (such as iOS 12.5.5) does not support this.\r\nconst disableAnimations = !('animate' in document.documentElement);\r\nif (disableAnimations) console.error(\"Web Animations have been disabled as your current browser does not support this.\");\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n ],\r\n imports: [\r\n HttpClientModule,\r\n BrowserModule,\r\n AppRoutingModule,\r\n BrowserAnimationsModule.withConfig({ disableAnimations }),\r\n SidenavModule,\r\n NavModule,\r\n ToastrModule.forRoot({\r\n positionClass: 'toast-bottom-right',\r\n preventDuplicates: true,\r\n timeOut: 6000,\r\n countDuplicates: true,\r\n autoDismiss: true\r\n }),\r\n ],\r\n providers: [\r\n { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },\r\n { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },\r\n Title,\r\n { provide: SAVER, useFactory: getSaver },\r\n ],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule { }\r\n","/// \r\n\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\nimport { AppModule } from './app/app.module';\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule)\r\n .catch(err => console.error(err));"],"x_google_ignoreList":[]}