{"version":3,"sources":["node_modules/file-saver/dist/FileSaver.min.js","src/app/_services/action-factory.service.ts","src/app/shared/tag-badge/tag-badge.component.ts","src/app/shared/tag-badge/tag-badge.component.html","src/app/_providers/saver.provider.ts","src/app/shared/_models/download.ts","src/app/_pipes/bytes.pipe.ts","src/app/shared/_services/download.service.ts","src/app/_services/collection-tag.service.ts","src/app/_models/metadata/person.ts","src/app/typeahead/_components/typeahead.component.ts","src/app/typeahead/_components/typeahead.component.html","src/app/shared/_services/filter-utilities.service.ts"],"sourcesContent":["(function (a, b) {\n if (\"function\" == typeof define && define.amd) define([], b);else if (\"undefined\" != typeof exports) b();else {\n b(), a.FileSaver = {\n exports: {}\n }.exports;\n }\n})(this, function () {\n \"use strict\";\n\n function b(a, b) {\n return \"undefined\" == typeof b ? b = {\n autoBom: !1\n } : \"object\" != typeof b && (console.warn(\"Deprecated: Expected third argument to be a object\"), b = {\n autoBom: !b\n }), b.autoBom && /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type) ? new Blob([\"\\uFEFF\", a], {\n type: a.type\n }) : a;\n }\n function c(a, b, c) {\n var d = new XMLHttpRequest();\n d.open(\"GET\", a), d.responseType = \"blob\", d.onload = function () {\n g(d.response, b, c);\n }, d.onerror = function () {\n console.error(\"could not download file\");\n }, d.send();\n }\n function d(a) {\n var b = new XMLHttpRequest();\n b.open(\"HEAD\", a, !1);\n try {\n b.send();\n } catch (a) {}\n return 200 <= b.status && 299 >= b.status;\n }\n function e(a) {\n try {\n a.dispatchEvent(new MouseEvent(\"click\"));\n } catch (c) {\n var b = document.createEvent(\"MouseEvents\");\n b.initMouseEvent(\"click\", !0, !0, window, 0, 0, 0, 80, 20, !1, !1, !1, !1, 0, null), a.dispatchEvent(b);\n }\n }\n var f = \"object\" == typeof window && window.window === window ? window : \"object\" == typeof self && self.self === self ? self : \"object\" == typeof global && global.global === global ? global : void 0,\n a = f.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent),\n g = f.saveAs || (\"object\" != typeof window || window !== f ? function () {} : \"download\" in HTMLAnchorElement.prototype && !a ? function (b, g, h) {\n var i = f.URL || f.webkitURL,\n j = document.createElement(\"a\");\n g = g || b.name || \"download\", j.download = g, j.rel = \"noopener\", \"string\" == typeof b ? (j.href = b, j.origin === location.origin ? e(j) : d(j.href) ? c(b, g, h) : e(j, j.target = \"_blank\")) : (j.href = i.createObjectURL(b), setTimeout(function () {\n i.revokeObjectURL(j.href);\n }, 4E4), setTimeout(function () {\n e(j);\n }, 0));\n } : \"msSaveOrOpenBlob\" in navigator ? function (f, g, h) {\n if (g = g || f.name || \"download\", \"string\" != typeof f) navigator.msSaveOrOpenBlob(b(f, h), g);else if (d(f)) c(f, g, h);else {\n var i = document.createElement(\"a\");\n i.href = f, i.target = \"_blank\", setTimeout(function () {\n e(i);\n });\n }\n } : function (b, d, e, g) {\n if (g = g || open(\"\", \"_blank\"), g && (g.document.title = g.document.body.innerText = \"downloading...\"), \"string\" == typeof b) return c(b, d, e);\n var h = \"application/octet-stream\" === b.type,\n i = /constructor/i.test(f.HTMLElement) || f.safari,\n j = /CriOS\\/[\\d]+/.test(navigator.userAgent);\n if ((j || h && i || a) && \"undefined\" != typeof FileReader) {\n var k = new FileReader();\n k.onloadend = function () {\n var a = k.result;\n a = j ? a : a.replace(/^data:[^;]*;/, \"data:attachment/file;\"), g ? g.location.href = a : location = a, g = null;\n }, k.readAsDataURL(b);\n } else {\n var l = f.URL || f.webkitURL,\n m = l.createObjectURL(b);\n g ? g.location = m : location.href = m, g = null, setTimeout(function () {\n l.revokeObjectURL(m);\n }, 4E4);\n }\n });\n f.saveAs = g.saveAs = g, \"undefined\" != typeof module && (module.exports = g);\n});\n\n","import { Injectable } from '@angular/core';\nimport { map, Observable, shareReplay } from 'rxjs';\nimport { Chapter } from '../_models/chapter';\nimport {UserCollection} from '../_models/collection-tag';\nimport { Device } from '../_models/device/device';\nimport { Library } from '../_models/library/library';\nimport { ReadingList } from '../_models/reading-list';\nimport { Series } from '../_models/series';\nimport { Volume } from '../_models/volume';\nimport { AccountService } from './account.service';\nimport { DeviceService } from './device.service';\nimport {SideNavStream} from \"../_models/sidenav/sidenav-stream\";\nimport {User} from \"../_models/user\";\n\nexport enum Action {\n Submenu = -1,\n /**\n * Mark entity as read\n */\n MarkAsRead = 0,\n /**\n * Mark entity as unread\n */\n MarkAsUnread = 1,\n /**\n * Invoke a Scan on Series/Library\n */\n Scan = 2,\n /**\n * Delete the entity\n */\n Delete = 3,\n /**\n * Open edit modal\n */\n Edit = 4,\n /**\n * Open details modal\n */\n Info = 5,\n /**\n * Invoke a refresh covers\n */\n RefreshMetadata = 6,\n /**\n * Download the entity\n */\n Download = 7,\n /**\n * Invoke an Analyze Files which calculates word count\n */\n AnalyzeFiles = 8,\n /**\n * Read in incognito mode aka no progress tracking\n */\n IncognitoRead = 9,\n /**\n * Add to reading list\n */\n AddToReadingList = 10,\n /**\n * Add to collection\n */\n AddToCollection = 11,\n /**\n * Essentially a download, but handled differently. Needed so card bubbles it up for handling\n */\n DownloadBookmark = 12,\n /**\n * Open Series detail page for said series\n */\n ViewSeries = 13,\n /**\n * Open the reader for entity\n */\n Read = 14,\n /**\n * Add to user's Want to Read List\n */\n AddToWantToReadList = 15,\n /**\n * Remove from user's Want to Read List\n */\n RemoveFromWantToReadList = 16,\n /**\n * Send to a device\n */\n SendTo = 17,\n /**\n * Import some data into Kavita\n */\n Import = 18,\n /**\n * Removes the Series from On Deck inclusion\n */\n RemoveFromOnDeck = 19,\n AddRuleGroup = 20,\n RemoveRuleGroup = 21,\n MarkAsVisible = 22,\n MarkAsInvisible = 23,\n /**\n * Promotes the underlying item (Reading List, Collection)\n */\n Promote = 24,\n UnPromote = 25\n}\n\n/**\n * Callback for an action\n */\nexport type ActionCallback = (action: ActionItem, data: T) => void;\nexport type ActionAllowedCallback = (action: ActionItem) => boolean;\n\nexport interface ActionItem {\n title: string;\n action: Action;\n callback: ActionCallback;\n requiresAdmin: boolean;\n children: Array>;\n /**\n * An optional class which applies to an item. ie) danger on a delete action\n */\n class?: string;\n /**\n * Indicates that there exists a separate list will be loaded from an API.\n * Rule: If using this, only one child should exist in children with the Action for dynamicList.\n */\n dynamicList?: Observable<{title: string, data: any}[]> | undefined;\n /**\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\n */\n _extra?: {title: string, data: any};\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ActionFactoryService {\n libraryActions: Array> = [];\n\n seriesActions: Array> = [];\n\n volumeActions: Array> = [];\n\n chapterActions: Array> = [];\n\n collectionTagActions: Array> = [];\n\n readingListActions: Array> = [];\n\n bookmarkActions: Array> = [];\n\n sideNavStreamActions: Array> = [];\n\n isAdmin = false;\n\n constructor(private accountService: AccountService, private deviceService: DeviceService) {\n this.accountService.currentUser$.subscribe((user) => {\n if (user) {\n this.isAdmin = this.accountService.hasAdminRole(user);\n } else {\n this._resetActions();\n return; // If user is logged out, we don't need to do anything\n }\n\n this._resetActions();\n });\n }\n\n getLibraryActions(callback: ActionCallback) {\n\t\treturn this.applyCallbackToList(this.libraryActions, callback);\n }\n\n getSeriesActions(callback: ActionCallback) {\n\t\treturn this.applyCallbackToList(this.seriesActions, callback);\n }\n\n getSideNavStreamActions(callback: ActionCallback) {\n return this.applyCallbackToList(this.sideNavStreamActions, callback);\n }\n\n getVolumeActions(callback: ActionCallback) {\n\t\treturn this.applyCallbackToList(this.volumeActions, callback);\n }\n\n getChapterActions(callback: ActionCallback) {\n return this.applyCallbackToList(this.chapterActions, callback);\n }\n\n getCollectionTagActions(callback: ActionCallback) {\n\t\treturn this.applyCallbackToList(this.collectionTagActions, callback);\n }\n\n getReadingListActions(callback: ActionCallback) {\n return this.applyCallbackToList(this.readingListActions, callback);\n }\n\n getBookmarkActions(callback: ActionCallback) {\n return this.applyCallbackToList(this.bookmarkActions, callback);\n }\n\n getMetadataFilterActions(callback: ActionCallback) {\n const actions = [\n {title: 'add-rule-group-and', action: Action.AddRuleGroup, requiresAdmin: false, children: [], callback: this.dummyCallback},\n {title: 'add-rule-group-or', action: Action.AddRuleGroup, requiresAdmin: false, children: [], callback: this.dummyCallback},\n {title: 'remove-rule-group', action: Action.RemoveRuleGroup, requiresAdmin: false, children: [], callback: this.dummyCallback},\n ];\n return this.applyCallbackToList(actions, callback);\n }\n\n dummyCallback(action: ActionItem, data: any) {}\n\n filterSendToAction(actions: Array>, chapter: Chapter) {\n // if (chapter.files.filter(f => f.format === MangaFormat.EPUB || f.format === MangaFormat.PDF).length !== chapter.files.length) {\n // // Remove Send To as it doesn't apply\n // return actions.filter(item => item.title !== 'Send To');\n // }\n return actions;\n }\n\n private _resetActions() {\n this.libraryActions = [\n {\n action: Action.Scan,\n title: 'scan-library',\n callback: this.dummyCallback,\n requiresAdmin: true,\n children: [],\n },\n {\n action: Action.Submenu,\n title: 'others',\n callback: this.dummyCallback,\n requiresAdmin: true,\n children: [\n {\n action: Action.RefreshMetadata,\n title: 'refresh-covers',\n callback: this.dummyCallback,\n requiresAdmin: true,\n children: [],\n },\n {\n action: Action.AnalyzeFiles,\n title: 'analyze-files',\n callback: this.dummyCallback,\n requiresAdmin: true,\n children: [],\n },\n {\n action: Action.Delete,\n title: 'delete',\n callback: this.dummyCallback,\n requiresAdmin: true,\n children: [],\n },\n ],\n },\n {\n action: Action.Edit,\n title: 'settings',\n callback: this.dummyCallback,\n requiresAdmin: true,\n children: [],\n },\n ];\n\n this.collectionTagActions = [\n {\n action: Action.Edit,\n title: 'edit',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.Delete,\n title: 'delete',\n callback: this.dummyCallback,\n requiresAdmin: false,\n class: 'danger',\n children: [],\n },\n {\n action: Action.Promote,\n title: 'promote',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.UnPromote,\n title: 'unpromote',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n ];\n\n this.seriesActions = [\n {\n action: Action.MarkAsRead,\n title: 'mark-as-read',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.MarkAsUnread,\n title: 'mark-as-unread',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.Scan,\n title: 'scan-series',\n callback: this.dummyCallback,\n requiresAdmin: true,\n children: [],\n },\n {\n action: Action.Submenu,\n title: 'add-to',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [\n \t{\n action: Action.AddToWantToReadList,\n title: 'add-to-want-to-read',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.RemoveFromWantToReadList,\n title: 'remove-from-want-to-read',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.AddToReadingList,\n title: 'add-to-reading-list',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.AddToCollection,\n title: 'add-to-collection',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n ],\n },\n {\n action: Action.Submenu,\n title: 'send-to',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [\n {\n action: Action.SendTo,\n title: '',\n callback: this.dummyCallback,\n requiresAdmin: false,\n dynamicList: this.deviceService.devices$.pipe(map((devices: Array) => devices.map(d => {\n return {'title': d.name, 'data': d};\n }), shareReplay())),\n children: []\n }\n ],\n },\n {\n action: Action.Submenu,\n title: 'others',\n callback: this.dummyCallback,\n requiresAdmin: true,\n children: [\n {\n action: Action.RefreshMetadata,\n title: 'refresh-covers',\n callback: this.dummyCallback,\n requiresAdmin: true,\n children: [],\n },\n {\n action: Action.AnalyzeFiles,\n title: 'analyze-files',\n callback: this.dummyCallback,\n requiresAdmin: true,\n children: [],\n },\n {\n action: Action.Delete,\n title: 'delete',\n callback: this.dummyCallback,\n requiresAdmin: true,\n class: 'danger',\n children: [],\n },\n ],\n },\n {\n action: Action.Download,\n title: 'download',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.Edit,\n title: 'edit',\n callback: this.dummyCallback,\n requiresAdmin: true,\n children: [],\n },\n ];\n\n this.volumeActions = [\n {\n action: Action.IncognitoRead,\n title: 'read-incognito',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.MarkAsRead,\n title: 'mark-as-read',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.MarkAsUnread,\n title: 'mark-as-unread',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n\t\t\t{\n\t\t\t\taction: Action.Submenu,\n\t\t\t\ttitle: 'add-to',\n\t\t\t\tcallback: this.dummyCallback,\n\t\t\t\trequiresAdmin: false,\n\t\t\t\tchildren: [\n\t\t\t\t\t{\n\t\t\t\t\t\taction: Action.AddToReadingList,\n\t\t\t\t\t\ttitle: 'add-to-reading-list',\n\t\t\t\t\t\tcallback: this.dummyCallback,\n\t\t\t\t\t\trequiresAdmin: false,\n\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n {\n action: Action.Submenu,\n title: 'send-to',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [\n {\n action: Action.SendTo,\n title: '',\n callback: this.dummyCallback,\n requiresAdmin: false,\n dynamicList: this.deviceService.devices$.pipe(map((devices: Array) => devices.map(d => {\n return {'title': d.name, 'data': d};\n }), shareReplay())),\n children: []\n }\n ],\n },\n {\n action: Action.Download,\n title: 'download',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.Edit,\n title: 'details',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n ];\n\n this.chapterActions = [\n {\n action: Action.IncognitoRead,\n title: 'read-incognito',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.MarkAsRead,\n title: 'mark-as-read',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.MarkAsUnread,\n title: 'mark-as-unread',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n\t\t\t{\n\t\t\t\taction: Action.Submenu,\n\t\t\t\ttitle: 'add-to',\n\t\t\t\tcallback: this.dummyCallback,\n\t\t\t\trequiresAdmin: false,\n\t\t\t\tchildren: [\n\t\t\t\t\t{\n\t\t\t\t\t\taction: Action.AddToReadingList,\n\t\t\t\t\t\ttitle: 'add-to-reading-list',\n\t\t\t\t\t\tcallback: this.dummyCallback,\n\t\t\t\t\t\trequiresAdmin: false,\n\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n {\n action: Action.Submenu,\n title: 'send-to',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [\n {\n action: Action.SendTo,\n title: '',\n callback: this.dummyCallback,\n requiresAdmin: false,\n dynamicList: this.deviceService.devices$.pipe(map((devices: Array) => devices.map(d => {\n return {'title': d.name, 'data': d};\n }), shareReplay())),\n children: []\n }\n ],\n },\n // RBS will handle rendering this, so non-admins with download are appicable\n {\n action: Action.Download,\n title: 'download',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.Edit,\n title: 'details',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n ];\n\n this.readingListActions = [\n {\n action: Action.Edit,\n title: 'edit',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.Delete,\n title: 'delete',\n callback: this.dummyCallback,\n requiresAdmin: false,\n class: 'danger',\n children: [],\n },\n ];\n\n this.bookmarkActions = [\n {\n action: Action.ViewSeries,\n title: 'view-series',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.DownloadBookmark,\n title: 'download',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.Delete,\n title: 'clear',\n callback: this.dummyCallback,\n class: 'danger',\n requiresAdmin: false,\n children: [],\n },\n ];\n\n this.sideNavStreamActions = [\n {\n action: Action.MarkAsVisible,\n title: 'mark-visible',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n {\n action: Action.MarkAsInvisible,\n title: 'mark-invisible',\n callback: this.dummyCallback,\n requiresAdmin: false,\n children: [],\n },\n ];\n }\n\n private applyCallback(action: ActionItem, callback: (action: ActionItem, data: any) => void) {\n action.callback = callback;\n\n if (action.children === null || action.children?.length === 0) return;\n\n action.children?.forEach((childAction) => {\n this.applyCallback(childAction, callback);\n });\n }\n\n\tpublic applyCallbackToList(list: Array>, callback: (action: ActionItem, data: any) => void): Array> {\n\t\tconst actions = list.map((a) => {\n\t\t\treturn { ...a };\n\t\t});\n\t\tactions.forEach((action) => this.applyCallback(action, callback));\n\t\treturn actions;\n\t}\n\n // Checks the whole tree for the action and returns true if it exists\n public hasAction(actions: Array>, action: Action) {\n if (actions.length === 0) return false;\n\n for (let i = 0; i < actions.length; i++)\n {\n if (actions[i].action === action) return true;\n if (this.hasAction(actions[i].children, action)) return true;\n }\n\n return false;\n }\n\n}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport {CommonModule} from \"@angular/common\";\n\n/**\n * What type of cursor to apply to the tag badge\n */\nexport enum TagBadgeCursor {\n /**\n * Allows the user to select text\n * cursor: default\n */\n Selectable,\n /**\n * Informs the user they can click and interact with badge\n * cursor: pointer\n */\n Clickable,\n /**\n * Informs the user they cannot click or interact with badge\n * cursor: not-allowed\n */\n NotAllowed,\n}\n\n@Component({\n selector: 'app-tag-badge',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './tag-badge.component.html',\n styleUrls: ['./tag-badge.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TagBadgeComponent {\n\n @Input() selectionMode: TagBadgeCursor = TagBadgeCursor.Selectable;\n @Input() fillStyle: 'filled' | 'outline' = 'outline';\n\n get TagBadgeCursor() {\n return TagBadgeCursor;\n }\n}\n","
\n \n
","import {InjectionToken} from '@angular/core'\nimport { saveAs } from 'file-saver';\n\nexport type Saver = (blob: Blob, filename?: string) => void\n\nexport const SAVER = new InjectionToken('saver')\n\nexport function getSaver(): Saver {\n return saveAs;\n}\n","import {\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n HttpProgressEvent,\n HttpResponse\n } from \"@angular/common/http\";\n import { Observable } from \"rxjs\";\n import { scan } from \"rxjs/operators\";\n \n function isHttpResponse(event: HttpEvent): event is HttpResponse {\n return event.type === HttpEventType.Response;\n }\n \n function isHttpProgressEvent(\n event: HttpEvent\n ): event is HttpProgressEvent {\n return (\n event.type === HttpEventType.DownloadProgress ||\n event.type === HttpEventType.UploadProgress\n );\n }\n\n/**\n * Encapsulates an inprogress download of a Blob with progress reporting activated\n */ \nexport interface Download {\n content: Blob | null;\n progress: number;\n state: \"PENDING\" | \"IN_PROGRESS\" | \"DONE\";\n filename?: string;\n loaded?: number;\n total?: number\n}\n \nexport function download(saver?: (b: Blob, filename: string) => void): (source: Observable>) => Observable {\n return (source: Observable>) =>\n source.pipe(\n scan((previous: Download, event: HttpEvent): Download => {\n if (isHttpProgressEvent(event)) {\n return {\n progress: event.total\n ? Math.round((100 * event.loaded) / event.total)\n : previous.progress,\n state: 'IN_PROGRESS',\n content: null,\n loaded: event.loaded,\n total: event.total\n }\n }\n if (isHttpResponse(event)) {\n if (saver && event.body) {\n saver(event.body, getFilename(event.headers, ''))\n }\n return {\n progress: 100,\n state: 'DONE',\n content: event.body,\n filename: getFilename(event.headers, ''),\n }\n }\n return previous;\n },\n {state: 'PENDING', progress: 0, content: null}\n )\n )\n }\n\n\nfunction getFilename(headers: HttpHeaders, defaultName: string) {\n const tokens = (headers.get('content-disposition') || '').split(';');\n let filename = tokens[1].replace('filename=', '').replace(/\"/ig, '').trim(); \n if (filename.startsWith('download_') || filename.startsWith('kavita_download_')) {\n const ext = filename.substring(filename.lastIndexOf('.'), filename.length);\n if (defaultName !== '') {\n return defaultName + ext;\n }\n return filename.replace('kavita_', '').replace('download_', '');\n //return defaultName + ext;\n }\n return filename;\n }","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'bytes',\n standalone: true\n})\nexport class BytesPipe implements PipeTransform {\n\n /**\n * Format bytes as human-readable text.\n *\n * @param bytes Number of bytes.\n * @param si True to use metric (SI) units, aka powers of 1000. False to use\n * binary (IEC), aka powers of 1024.\n * @param dp Number of decimal places to display.\n *\n * @return Formatted string.\n *\n * Credit: https://stackoverflow.com/questions/10420352/converting-file-size-in-bytes-to-human-readable-string\n */\n transform(bytes: number, si=true, dp=1): string {\n const thresh = si ? 1000 : 1024;\n\n if (Math.abs(bytes) < thresh) {\n return bytes + ' B';\n }\n\n const units = si\n ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];\n let u = -1;\n const r = 10**dp;\n\n do {\n bytes /= thresh;\n ++u;\n } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);\n\n const fixed = bytes.toFixed(dp);\n if ((fixed + '').endsWith('.0')) {\n return bytes.toFixed(0) + ' ' + units[u];\n }\n\n return fixed + ' ' + units[u];\n }\n\n}\n","import { HttpClient } from '@angular/common/http';\nimport {DestroyRef, inject, Inject, Injectable} from '@angular/core';\nimport { Series } from 'src/app/_models/series';\nimport { environment } from 'src/environments/environment';\nimport { ConfirmService } from '../confirm.service';\nimport { Chapter } from 'src/app/_models/chapter';\nimport { Volume } from 'src/app/_models/volume';\nimport {\n asyncScheduler,\n BehaviorSubject,\n Observable,\n tap,\n finalize,\n of,\n filter,\n} from 'rxjs';\nimport { download, Download } from '../_models/download';\nimport { PageBookmark } from 'src/app/_models/readers/page-bookmark';\nimport {switchMap, take, takeWhile, throttleTime} from 'rxjs/operators';\nimport { AccountService } from 'src/app/_services/account.service';\nimport { BytesPipe } from 'src/app/_pipes/bytes.pipe';\nimport {translate} from \"@ngneat/transloco\";\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\nimport {SAVER, Saver} from \"../../_providers/saver.provider\";\nimport {UtilityService} from \"./utility.service\";\nimport {UserCollection} from \"../../_models/collection-tag\";\nimport {RecentlyAddedItem} from \"../../_models/recently-added-item\";\nimport {NextExpectedChapter} from \"../../_models/series-detail/next-expected-chapter\";\n\nexport const DEBOUNCE_TIME = 100;\n\nconst bytesPipe = new BytesPipe();\n\nexport interface DownloadEvent {\n /**\n * Type of entity being downloaded\n */\n entityType: DownloadEntityType;\n /**\n * What to show user. For example, for Series, we might show series name.\n */\n subTitle: string;\n /**\n * Progress of the download itself\n */\n progress: number;\n /**\n * Entity id. For entities without id like logs or bookmarks, uses 0 instead\n */\n id: number;\n}\n\n/**\n * Valid entity types for downloading\n */\nexport type DownloadEntityType = 'volume' | 'chapter' | 'series' | 'bookmark' | 'logs';\n/**\n * Valid entities for downloading. Undefined exclusively for logs.\n */\nexport type DownloadEntity = Series | Volume | Chapter | PageBookmark[] | undefined;\n\nexport type QueueableDownloadType = Chapter | Volume;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DownloadService {\n\n private baseUrl = environment.apiUrl;\n /**\n * Size in bytes in which to inform the user for confirmation before download starts. Defaults to 100 MB.\n */\n public SIZE_WARNING = 104_857_600;\n /**\n * Sie in bytes in which to inform the user that anything above may fail on iOS due to device limits. (200MB)\n */\n private IOS_SIZE_WARNING = 209_715_200;\n\n private downloadsSource: BehaviorSubject = new BehaviorSubject([]);\n /**\n * Active Downloads\n */\n public activeDownloads$ = this.downloadsSource.asObservable();\n\n private downloadQueue: BehaviorSubject = new BehaviorSubject([]);\n /**\n * Queued Downloads\n */\n public queuedDownloads$ = this.downloadQueue.asObservable();\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly confirmService = inject(ConfirmService);\n private readonly accountService = inject(AccountService);\n private readonly httpClient = inject(HttpClient);\n private readonly utilityService = inject(UtilityService);\n\n constructor(@Inject(SAVER) private save: Saver) {\n this.downloadQueue.subscribe((queue) => {\n if (queue.length > 0) {\n const entity = queue.shift();\n console.log('Download Queue shifting entity: ', entity);\n if (entity === undefined) return;\n this.processDownload(entity);\n }\n });\n }\n\n\n /**\n * Returns the entity subtitle (for the event widget) for a given entity\n * @param downloadEntityType\n * @param downloadEntity\n * @returns\n */\n downloadSubtitle(downloadEntityType: DownloadEntityType | undefined, downloadEntity: DownloadEntity | undefined) {\n switch (downloadEntityType) {\n case 'series':\n return (downloadEntity as Series).name;\n case 'volume':\n return (downloadEntity as Volume).minNumber + '';\n case 'chapter':\n return (downloadEntity as Chapter).minNumber + '';\n case 'bookmark':\n return '';\n case 'logs':\n return '';\n }\n return '';\n }\n\n /**\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.\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.\n * @param entityType\n * @param entity\n * @param callback Optional callback. Returns the download or undefined (if the download is complete).\n */\n download(entityType: DownloadEntityType, entity: DownloadEntity, callback?: (d: Download | undefined) => void) {\n let sizeCheckCall: Observable;\n let downloadCall: Observable;\n switch (entityType) {\n case 'series':\n sizeCheckCall = this.downloadSeriesSize((entity as Series).id);\n downloadCall = this.downloadSeries(entity as Series);\n break;\n case 'volume':\n sizeCheckCall = this.downloadVolumeSize((entity as Volume).id);\n downloadCall = this.downloadVolume(entity as Volume);\n //this.enqueueDownload(entity as Volume);\n break;\n case 'chapter':\n sizeCheckCall = this.downloadChapterSize((entity as Chapter).id);\n downloadCall = this.downloadChapter(entity as Chapter);\n //this.enqueueDownload(entity as Chapter);\n break;\n case 'bookmark':\n sizeCheckCall = of(0);\n downloadCall = this.downloadBookmarks(entity as PageBookmark[]);\n break;\n case 'logs':\n sizeCheckCall = of(0);\n downloadCall = this.downloadLogs();\n break;\n default:\n return;\n }\n\n\n this.accountService.currentUser$.pipe(take(1), switchMap(user => {\n if (user && user.preferences.promptForDownloadSize) {\n return sizeCheckCall;\n }\n return of(0);\n }), switchMap(async (size) => {\n return await this.confirmSize(size, entityType);\n })\n ).pipe(filter(wantsToDownload => {\n return wantsToDownload;\n }),\n filter(_ => downloadCall !== undefined),\n switchMap(() => {\n return (downloadCall || of(undefined)).pipe(\n tap((d) => {\n if (callback) callback(d);\n }),\n takeWhile((val: Download) => {\n return val.state != 'DONE';\n }),\n finalize(() => {\n if (callback) callback(undefined);\n }))\n }), takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => {});\n }\n\n private downloadSeriesSize(seriesId: number) {\n return this.httpClient.get(this.baseUrl + 'download/series-size?seriesId=' + seriesId);\n }\n\n private downloadVolumeSize(volumeId: number) {\n return this.httpClient.get(this.baseUrl + 'download/volume-size?volumeId=' + volumeId);\n }\n\n private downloadChapterSize(chapterId: number) {\n return this.httpClient.get(this.baseUrl + 'download/chapter-size?chapterId=' + chapterId);\n }\n\n private downloadLogs() {\n const downloadType = 'logs';\n const subtitle = this.downloadSubtitle(downloadType, undefined);\n return this.httpClient.get(this.baseUrl + 'server/logs',\n {observe: 'events', responseType: 'blob', reportProgress: true}\n ).pipe(\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\n download((blob, filename) => {\n this.save(blob, decodeURIComponent(filename));\n }),\n tap((d) => this.updateDownloadState(d, downloadType, subtitle, 0)),\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\n );\n }\n\n private getIdKey(entity: Chapter | Volume) {\n if (this.utilityService.isVolume(entity)) return 'volumeId';\n if (this.utilityService.isChapter(entity)) return 'chapterId';\n if (this.utilityService.isSeries(entity)) return 'seriesId';\n return 'id';\n }\n\n private getDownloadEntityType(entity: Chapter | Volume): DownloadEntityType {\n if (this.utilityService.isVolume(entity)) return 'volume';\n if (this.utilityService.isChapter(entity)) return 'chapter';\n if (this.utilityService.isSeries(entity)) return 'series';\n return 'logs'; // This is a hack but it will never occur\n }\n\n private downloadEntity(entity: Chapter | Volume): Observable {\n const downloadEntityType = this.getDownloadEntityType(entity);\n const subtitle = this.downloadSubtitle(downloadEntityType, entity);\n const idKey = this.getIdKey(entity);\n const url = `${this.baseUrl}download/${downloadEntityType}?${idKey}=${entity.id}`;\n\n return this.httpClient.get(url, { observe: 'events', responseType: 'blob', reportProgress: true }).pipe(\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\n download((blob, filename) => {\n this.save(blob, decodeURIComponent(filename));\n }),\n tap((d) => this.updateDownloadState(d, downloadEntityType, subtitle, entity.id)),\n finalize(() => this.finalizeDownloadState(downloadEntityType, subtitle))\n );\n }\n\n private downloadSeries(series: Series) {\n\n // TODO: Call backend for all the volumes and loose leaf chapters then enqueque them all\n\n const downloadType = 'series';\n const subtitle = this.downloadSubtitle(downloadType, series);\n return this.httpClient.get(this.baseUrl + 'download/series?seriesId=' + series.id,\n {observe: 'events', responseType: 'blob', reportProgress: true}\n ).pipe(\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\n download((blob, filename) => {\n this.save(blob, decodeURIComponent(filename));\n }),\n tap((d) => this.updateDownloadState(d, downloadType, subtitle, series.id)),\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\n );\n }\n\n private finalizeDownloadState(entityType: DownloadEntityType, entitySubtitle: string) {\n let values = this.downloadsSource.getValue();\n values = values.filter(v => !(v.entityType === entityType && v.subTitle === entitySubtitle));\n this.downloadsSource.next(values);\n }\n\n private updateDownloadState(d: Download, entityType: DownloadEntityType, entitySubtitle: string, id: number) {\n let values = this.downloadsSource.getValue();\n if (d.state === 'PENDING') {\n const index = values.findIndex(v => v.entityType === entityType && v.subTitle === entitySubtitle);\n if (index >= 0) return; // Don't let us duplicate add\n values.push({entityType: entityType, subTitle: entitySubtitle, progress: 0, id});\n } else if (d.state === 'IN_PROGRESS') {\n const index = values.findIndex(v => v.entityType === entityType && v.subTitle === entitySubtitle);\n if (index >= 0) {\n values[index].progress = d.progress;\n }\n } else if (d.state === 'DONE') {\n values = values.filter(v => !(v.entityType === entityType && v.subTitle === entitySubtitle));\n }\n this.downloadsSource.next(values);\n\n }\n\n private downloadChapter(chapter: Chapter) {\n return this.downloadEntity(chapter);\n }\n\n private downloadVolume(volume: Volume) {\n return this.downloadEntity(volume);\n }\n\n private async confirmSize(size: number, entityType: DownloadEntityType) {\n const showIosWarning = size > this.IOS_SIZE_WARNING && /iPad|iPhone|iPod/.test(navigator.userAgent);\n return (size < this.SIZE_WARNING ||\n await this.confirmService.confirm(translate('toasts.confirm-download-size',\n {entityType: translate('entity-type.' + entityType), size: bytesPipe.transform(size)})\n + (!showIosWarning ? '' : '

' + translate('toasts.confirm-download-size-ios'))));\n }\n\n private downloadBookmarks(bookmarks: PageBookmark[]) {\n const downloadType = 'bookmark';\n const subtitle = this.downloadSubtitle(downloadType, bookmarks);\n\n return this.httpClient.post(this.baseUrl + 'download/bookmarks', {bookmarks},\n {observe: 'events', responseType: 'blob', reportProgress: true}\n ).pipe(\n throttleTime(DEBOUNCE_TIME, asyncScheduler, { leading: true, trailing: true }),\n download((blob, filename) => {\n this.save(blob, decodeURIComponent(filename));\n }),\n tap((d) => this.updateDownloadState(d, downloadType, subtitle, 0)),\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\n );\n }\n\n\n\n private processDownload(entity: QueueableDownloadType): void {\n const downloadObservable = this.downloadEntity(entity);\n console.log('Process Download called for entity: ', entity);\n\n // When we consume one, we need to take it off the queue\n\n downloadObservable.subscribe((downloadEvent) => {\n // Download completed, process the next item in the queue\n if (downloadEvent.state === 'DONE') {\n this.processNextDownload();\n }\n });\n }\n\n private processNextDownload(): void {\n const currentQueue = this.downloadQueue.value;\n if (currentQueue.length > 0) {\n const nextEntity = currentQueue[0];\n this.processDownload(nextEntity);\n }\n }\n\n private enqueueDownload(entity: QueueableDownloadType): void {\n const currentQueue = this.downloadQueue.value;\n const newQueue = [...currentQueue, entity];\n this.downloadQueue.next(newQueue);\n\n // If the queue was empty, start processing the download\n if (currentQueue.length === 0) {\n this.processNextDownload();\n }\n }\n\n mapToEntityType(events: DownloadEvent[], entity: Series | Volume | Chapter | UserCollection | PageBookmark | RecentlyAddedItem | NextExpectedChapter) {\n if(this.utilityService.isSeries(entity)) {\n return events.find(e => e.entityType === 'series' && e.id == entity.id\n && e.subTitle === this.downloadSubtitle('series', (entity as Series))) || null;\n }\n if(this.utilityService.isVolume(entity)) {\n return events.find(e => e.entityType === 'volume' && e.id == entity.id\n && e.subTitle === this.downloadSubtitle('volume', (entity as Volume))) || null;\n }\n if(this.utilityService.isChapter(entity)) {\n return events.find(e => e.entityType === 'chapter' && e.id == entity.id\n && e.subTitle === this.downloadSubtitle('chapter', (entity as Chapter))) || null;\n }\n // Is PageBookmark[]\n if(entity.hasOwnProperty('length')) {\n return events.find(e => e.entityType === 'bookmark'\n && e.subTitle === this.downloadSubtitle('bookmark', [(entity as PageBookmark)])) || null;\n }\n return null;\n }\n}\n","import {HttpClient} from '@angular/common/http';\nimport {Injectable} from '@angular/core';\nimport {environment} from 'src/environments/environment';\nimport {UserCollection} from '../_models/collection-tag';\nimport {TextResonse} from '../_types/text-response';\nimport {MalStack} from \"../_models/collection/mal-stack\";\nimport {Action, ActionItem} from \"./action-factory.service\";\nimport {User} from \"../_models/user\";\nimport {AccountService} from \"./account.service\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CollectionTagService {\n\n baseUrl = environment.apiUrl;\n\n constructor(private httpClient: HttpClient, private accountService: AccountService) { }\n\n allCollections(ownedOnly = false) {\n return this.httpClient.get(this.baseUrl + 'collection?ownedOnly=' + ownedOnly);\n }\n\n allCollectionsForSeries(seriesId: number, ownedOnly = false) {\n return this.httpClient.get(this.baseUrl + 'collection/all-series?ownedOnly=' + ownedOnly + '&seriesId=' + seriesId);\n }\n\n updateTag(tag: UserCollection) {\n return this.httpClient.post(this.baseUrl + 'collection/update', tag, TextResonse);\n }\n\n promoteMultipleCollections(tags: Array, promoted: boolean) {\n return this.httpClient.post(this.baseUrl + 'collection/promote-multiple', {collectionIds: tags, promoted}, TextResonse);\n }\n\n updateSeriesForTag(tag: UserCollection, seriesIdsToRemove: Array) {\n return this.httpClient.post(this.baseUrl + 'collection/update-series', {tag, seriesIdsToRemove}, TextResonse);\n }\n\n addByMultiple(tagId: number, seriesIds: Array, tagTitle: string = '') {\n return this.httpClient.post(this.baseUrl + 'collection/update-for-series', {collectionTagId: tagId, collectionTagTitle: tagTitle, seriesIds}, TextResonse);\n }\n\n tagNameExists(name: string) {\n return this.httpClient.get(this.baseUrl + 'collection/name-exists?name=' + name);\n }\n\n deleteTag(tagId: number) {\n return this.httpClient.delete(this.baseUrl + 'collection?tagId=' + tagId, TextResonse);\n }\n\n deleteMultipleCollections(tags: Array) {\n return this.httpClient.post(this.baseUrl + 'collection/delete-multiple', {collectionIds: tags}, TextResonse);\n }\n\n getMalStacks() {\n return this.httpClient.get>(this.baseUrl + 'collection/mal-stacks');\n }\n\n actionListFilter(action: ActionItem, user: User) {\n const canPromote = this.accountService.hasAdminRole(user) || this.accountService.hasPromoteRole(user);\n const isPromotionAction = action.action == Action.Promote || action.action == Action.UnPromote;\n\n if (isPromotionAction) return canPromote;\n return true;\n }\n}\n","export enum PersonRole {\n Other = 1,\n Artist = 2,\n Writer = 3,\n Penciller = 4,\n Inker = 5,\n Colorist = 6,\n Letterer = 7,\n CoverArtist = 8,\n Editor = 9,\n Publisher = 10,\n Character = 11,\n Translator = 12,\n Imprint = 13,\n Team = 14,\n Location = 15\n}\n\nexport interface Person {\n id: number;\n name: string;\n role: PersonRole;\n}\n","import { trigger, state, style, transition, animate } from '@angular/animations';\nimport {CommonModule, DOCUMENT} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild, DestroyRef,\n ElementRef,\n EventEmitter,\n HostListener,\n inject,\n Inject,\n Input,\n OnInit,\n Output,\n Renderer2,\n RendererStyleFlags2,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport {FormControl, FormGroup, ReactiveFormsModule} from '@angular/forms';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { auditTime, filter, map, shareReplay, switchMap, take, tap } from 'rxjs/operators';\nimport { KEY_CODES } from 'src/app/shared/_services/utility.service';\nimport { SelectionCompareFn, TypeaheadSettings } from '../_models/typeahead-settings';\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\nimport {TagBadgeComponent} from \"../../shared/tag-badge/tag-badge.component\";\nimport {TranslocoDirective} from \"@ngneat/transloco\";\n\n\n/**\n * SelectionModel is used for keeping track of multiple selections. Simple interface with ability to toggle.\n * @param selectedState Optional state to set selectedOptions to. If not passed, defaults to false.\n * @param selectedOptions Optional data elements to inform the SelectionModel of. If not passed, as toggle() occur, items are tracked.\n * @param propAccessor Optional string that points to a unique field within the T type. Used for quickly looking up.\n */\nexport class SelectionModel {\n _data!: Array<{value: T, selected: boolean}>;\n _propAccessor: string = '';\n\n constructor(selectedState: boolean = false, selectedOptions: Array = [], propAccessor: string = '') {\n this._data = [];\n\n if (propAccessor != undefined || propAccessor !== '') {\n this._propAccessor = propAccessor;\n }\n\n selectedOptions.forEach(d => {\n this._data.push({value: d, selected: selectedState});\n });\n }\n\n /**\n * Will toggle if the data item is selected or not. If data option is not tracked, will add it and set state to true.\n * @param data Item to toggle\n * @param selectedState Force the state\n * @param compareFn An optional function to use for the lookup, else will use shallowEqual implementation\n */\n toggle(data: T, selectedState?: boolean, compareFn?: SelectionCompareFn) {\n let lookupMethod = this.shallowEqual;\n if (compareFn != undefined || compareFn != null) {\n lookupMethod = compareFn;\n }\n\n const dataItem = this._data.filter(d => lookupMethod(d.value, data));\n if (dataItem.length > 0) {\n if (selectedState != undefined) {\n dataItem[0].selected = selectedState;\n } else {\n dataItem[0].selected = !dataItem[0].selected;\n }\n } else {\n this._data.push({value: data, selected: (selectedState === undefined ? true : selectedState)});\n }\n }\n\n\n /**\n * Is the passed item selected\n * @param data item to check against\n * @param compareFn optional method to use to perform comparisons\n * @returns boolean\n */\n isSelected(data: T, compareFn?: SelectionCompareFn): boolean {\n let lookupMethod = this.shallowEqual;\n if (compareFn != undefined || compareFn != null) {\n lookupMethod = compareFn;\n }\n\n const dataItem = this._data.filter(d => lookupMethod(d.value, data));\n\n if (dataItem.length > 0) {\n return dataItem[0].selected;\n }\n return false;\n }\n\n /**\n *\n * @returns If some of the items are selected, but not all\n */\n hasSomeSelected(): boolean {\n const selectedCount = this._data.filter(d => d.selected).length;\n return (selectedCount !== this._data.length && selectedCount !== 0)\n }\n\n /**\n *\n * @returns All Selected items\n */\n selected(): Array {\n return this._data.filter(d => d.selected).map(d => d.value);\n }\n\n /**\n *\n * @returns All Non-Selected items\n */\n unselected(): Array {\n return this._data.filter(d => !d.selected).map(d => d.value);\n }\n\n /**\n *\n * @returns Last element added/tracked or undefined if nothing is tracked\n */\n peek(): T | undefined {\n if (this._data.length > 0) {\n return this._data[this._data.length - 1].value;\n }\n\n return undefined;\n }\n\n shallowEqual(a: T, b: T) {\n\n for (let key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (let key in b) {\n if (!(key in a)) {\n return false;\n }\n }\n return true;\n }\n}\n\nconst ANIMATION_SPEED = 200;\n\n@Component({\n selector: 'app-typeahead',\n standalone: true,\n imports: [CommonModule, TagBadgeComponent, ReactiveFormsModule, TranslocoDirective],\n templateUrl: './typeahead.component.html',\n styleUrls: ['./typeahead.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('slideFromTop', [\n state('in', style({ height: '0px'})),\n transition('void => *', [\n style({ height: '100%', overflow: 'auto' }),\n animate(ANIMATION_SPEED)\n ]),\n transition('* => void', [\n animate(ANIMATION_SPEED, style({ height: '0px' })),\n ])\n ])\n ]\n})\nexport class TypeaheadComponent implements OnInit {\n /**\n * Settings for the typeahead\n */\n @Input({required: true}) settings!: TypeaheadSettings;\n /**\n * When true, will reset field to no selections. When false, will reset to saved data\n */\n @Input() reset: ReplaySubject = new ReplaySubject(1);\n /**\n * When a field is locked, we render custom css to indicate to the user. Does not affect functionality.\n */\n @Input() locked: boolean = false;\n /**\n * If disabled, a user will not be able to interact with the typeahead\n */\n @Input() disabled: boolean = false;\n /**\n * When triggered, will focus the input if the passed string matches the id\n */\n @Input() focus: EventEmitter | undefined;\n @Output() selectedData = new EventEmitter();\n @Output() newItemAdded = new EventEmitter();\n @Output() onUnlock = new EventEmitter();\n @Output() lockedChange = new EventEmitter();\n private readonly destroyRef = inject(DestroyRef);\n\n\n @ViewChild('input') inputElem!: ElementRef;\n @ContentChild('optionItem') optionTemplate!: TemplateRef;\n @ContentChild('badgeItem') badgeTemplate!: TemplateRef;\n\n optionSelection!: SelectionModel;\n\n hasFocus = false; // Whether input has active focus\n focusedIndex: number = 0;\n showAddItem: boolean = false;\n filteredOptions!: Observable;\n isLoadingOptions: boolean = false;\n typeaheadControl!: FormControl;\n typeaheadForm!: FormGroup;\n\n constructor(private renderer2: Renderer2, @Inject(DOCUMENT) private document: Document, private readonly cdRef: ChangeDetectorRef) { }\n\n ngOnInit() {\n this.reset.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((resetToEmpty: boolean) => {\n this.clearSelections(resetToEmpty);\n this.init();\n });\n\n if (this.focus) {\n this.focus.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((id: string) => {\n if (this.settings.id !== id) return;\n this.onInputFocus();\n });\n }\n\n this.init();\n }\n\n init() {\n if (this.settings.compareFn === undefined && this.settings.multiple) {\n console.error('A compare function must be defined');\n return;\n }\n\n if (this.settings.trackByIdentityFn === undefined) {\n this.settings.trackByIdentityFn = (index, value) => value;\n }\n\n if (this.settings.hasOwnProperty('formControl') && this.settings.formControl) {\n this.typeaheadControl = this.settings.formControl;\n } else {\n this.typeaheadControl = new FormControl('');\n }\n this.typeaheadForm = new FormGroup({\n 'typeahead': this.typeaheadControl\n });\n\n this.filteredOptions = this.typeaheadForm.get('typeahead')!.valueChanges\n .pipe(\n // Adjust input box to grow\n tap((val: string) => {\n if (this.inputElem != null && this.inputElem.nativeElement != null) {\n this.renderer2.setStyle(this.inputElem.nativeElement, 'width', 15 * (val.trim().length + 1) + 'px');\n this.focusedIndex = 0;\n }\n }),\n map((val: string) => val.trim()),\n auditTime(this.settings.debounce),\n //distinctUntilChanged(), // ?!: BUG Doesn't trigger the search to run when filtered array changes\n filter((val: string) => {\n // If minimum filter characters not met, do not filter\n if (this.settings.minCharacters === 0) return true;\n\n if (!val || val.length < this.settings.minCharacters) {\n return false;\n }\n\n return true;\n }),\n\n switchMap((val: string) => {\n this.isLoadingOptions = true;\n return this.settings.fetchFn(val.trim()).pipe(takeUntilDestroyed(this.destroyRef), map((items: any[]) => items.filter(item => this.filterSelected(item))));\n }),\n tap((filteredOptions: any[]) => {\n this.isLoadingOptions = false;\n this.focusedIndex = 0;\n this.cdRef.markForCheck();\n setTimeout(() => {\n this.updateShowAddItem(filteredOptions);\n this.updateHighlight();\n }, 10);\n setTimeout(() => this.updateHighlight(), 20);\n\n }),\n shareReplay(),\n takeUntilDestroyed(this.destroyRef)\n );\n\n\n if (this.settings.savedData) {\n if (this.settings.multiple) {\n this.optionSelection = new SelectionModel(true, this.settings.savedData);\n }\n else {\n const isArray = this.settings.savedData.hasOwnProperty('length');\n if (isArray) {\n this.optionSelection = new SelectionModel(true, this.settings.savedData);\n } else {\n this.optionSelection = new SelectionModel(true, [this.settings.savedData]);\n }\n }\n } else {\n this.optionSelection = new SelectionModel();\n }\n }\n\n\n @HostListener('body:click', ['$event'])\n handleDocumentClick(event: any) {\n // Don't close the typeahead when we select an item from it\n if (event.target && (event.target as HTMLElement).classList.contains('list-group-item')) {\n return;\n }\n this.hasFocus = false;\n }\n\n @HostListener('window:keydown', ['$event'])\n handleKeyPress(event: KeyboardEvent) {\n if (!this.hasFocus) { return; }\n if (this.disabled) return;\n\n switch(event.key) {\n case KEY_CODES.DOWN_ARROW:\n case KEY_CODES.RIGHT_ARROW:\n {\n this.focusedIndex = Math.min(this.focusedIndex + 1, this.document.querySelectorAll('.list-group-item').length - 1);\n this.updateHighlight();\n break;\n }\n case KEY_CODES.UP_ARROW:\n case KEY_CODES.LEFT_ARROW:\n {\n this.focusedIndex = Math.max(this.focusedIndex - 1, 0);\n this.updateHighlight();\n break;\n }\n case KEY_CODES.ENTER:\n {\n this.document.querySelectorAll('.list-group-item').forEach((item, index) => {\n if (item.classList.contains('active')) {\n this.filteredOptions.pipe(take(1)).subscribe((opts: any[]) => {\n // This isn't giving back the filtered array, but everything\n event.preventDefault();\n event.stopPropagation();\n\n (item as HTMLElement).click();\n this.focusedIndex = 0;\n });\n }\n });\n break;\n }\n case KEY_CODES.BACKSPACE:\n case KEY_CODES.DELETE:\n {\n if (this.typeaheadControl.value !== null && this.typeaheadControl.value !== undefined && this.typeaheadControl.value.trim() !== '') {\n break;\n }\n const selected = this.optionSelection.selected();\n if (selected.length > 0) {\n this.removeSelectedOption(selected.pop());\n }\n break;\n }\n case KEY_CODES.ESC_KEY:\n this.hasFocus = false;\n event.stopPropagation();\n break;\n default:\n break;\n }\n }\n\n toggleSelection(opt: any): void {\n this.optionSelection.toggle(opt, undefined, this.settings.selectionCompareFn);\n this.selectedData.emit(this.optionSelection.selected());\n }\n\n removeSelectedOption(opt: any) {\n this.optionSelection.toggle(opt, undefined, this.settings.selectionCompareFn);\n this.selectedData.emit(this.optionSelection.selected());\n this.resetField();\n }\n\n clearSelections(untoggleAll: boolean = false) {\n if (this.optionSelection) {\n if (!untoggleAll && this.settings.savedData) {\n const isArray = this.settings.savedData.hasOwnProperty('length');\n if (isArray) {\n this.optionSelection = new SelectionModel(true, this.settings.savedData); // NOTE: Library-detail will break the 'x' button due to how savedData is being set to avoid state reset\n } else {\n this.optionSelection = new SelectionModel(true, [this.settings.savedData]);\n }\n this.cdRef.markForCheck();\n } else {\n this.optionSelection.selected().forEach(item => this.optionSelection.toggle(item, false));\n this.cdRef.markForCheck();\n }\n\n this.selectedData.emit(this.optionSelection.selected());\n this.resetField();\n }\n }\n\n handleOptionClick(opt: any) {\n if (this.disabled) return;\n if (!this.settings.multiple && this.optionSelection.selected().length > 0) {\n return;\n }\n\n this.toggleSelection(opt);\n\n this.resetField();\n this.onInputFocus();\n }\n\n addNewItem(title: string) {\n if (this.settings.addTransformFn == undefined || !this.settings.addIfNonExisting) {\n return;\n }\n const newItem = this.settings.addTransformFn(title);\n this.newItemAdded.emit(newItem);\n this.toggleSelection(newItem);\n\n this.resetField();\n this.onInputFocus();\n }\n\n /**\n *\n * @param item\n * @returns True if the item is NOT selected already\n */\n filterSelected(item: any) {\n if (this.settings.unique && this.settings.multiple) {\n return !this.optionSelection.isSelected(item, this.settings.selectionCompareFn);\n }\n\n return true;\n }\n\n openDropdown() {\n setTimeout(() => {\n this.typeaheadControl.setValue(this.typeaheadControl.value);\n this.hasFocus = true;\n });\n }\n\n onInputFocus(event?: any) {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n if (this.disabled) return;\n\n if (!this.settings.multiple && this.optionSelection.selected().length > 0) {\n return;\n }\n\n if (this.inputElem) {\n // hack: To prevent multiple typeaheads from being open at once, click document then trigger the focus\n this.document.body.click();\n\n this.inputElem.nativeElement.focus();\n this.hasFocus = true;\n }\n\n\n this.openDropdown();\n }\n\n\n resetField() {\n if (this.inputElem && this.inputElem.nativeElement) {\n this.renderer2.setStyle(this.inputElem.nativeElement, 'width', 4, RendererStyleFlags2.Important);\n }\n this.typeaheadControl.setValue('');\n this.focusedIndex = 0;\n }\n\n // Updates the highlight to focus on the selected item\n updateHighlight() {\n this.document.querySelectorAll('.list-group-item').forEach((item, index) => {\n if (index === this.focusedIndex && !item.classList.contains('no-hover')) {\n // apply active class\n this.renderer2.addClass(item, 'active');\n } else {\n // remove active class\n this.renderer2.removeClass(item, 'active');\n }\n });\n }\n\n updateShowAddItem(options: any[]) {\n // ?! BUG This will still technicially allow you to add the same thing as a previously added item. (Code will just toggle it though)\n this.showAddItem = false;\n this.cdRef.markForCheck();\n if (!this.settings.addIfNonExisting) return;\n\n const inputText = this.typeaheadControl.value.trim();\n if (inputText.length < Math.max(this.settings.minCharacters, 1)) return;\n if (!this.typeaheadControl.dirty) return; // Do we need this?\n\n // Check if this new option will interfere with any existing ones not shown\n\n if (typeof this.settings.compareFnForAdd == 'function') {\n const willDuplicateExist = this.settings.compareFnForAdd(this.optionSelection.selected(), inputText);\n if (willDuplicateExist.length > 0) {\n return;\n }\n }\n\n if (typeof this.settings.compareFn == 'function') {\n // The problem here is that compareFn can report that duplicate will exist as it does contains not match\n const matches = this.settings.compareFn(options, inputText);\n if (matches.length > 0 && matches.includes(this.settings.addTransformFn(inputText))) {\n return;\n }\n }\n\n this.showAddItem = true;\n\n if (this.showAddItem) {\n this.hasFocus = true;\n }\n this.cdRef.markForCheck();\n }\n\n toggleLock(event: any) {\n if (this.disabled) return;\n this.locked = !this.locked;\n this.lockedChange.emit(this.locked);\n\n if (!this.locked) {\n this.onUnlock.emit();\n }\n }\n\n}\n","\n
\n
\n \n \n {{t('locked-field')}}\n \n \n
\n \n \n \n \n \n
\n {{t('loading')}}\n
\n \n \n \n
\n
\n\n \n
\n
    \n
  • \n {{t('add-item', {item: typeaheadControl.value})}}\n
  • \n
  • \n \n
  • \n
  • \n {{t('no-data')}}{{this.settings.addIfNonExisting ? t('add-custom-item') : ''}}\n
  • \n
\n
\n
\n
\n\n
\n","import {Injectable} from '@angular/core';\nimport {ActivatedRouteSnapshot, Params, Router} from '@angular/router';\nimport {SortField, SortOptions} from 'src/app/_models/metadata/series-filter';\nimport {MetadataService} from \"../../_services/metadata.service\";\nimport {SeriesFilterV2} from \"../../_models/metadata/v2/series-filter-v2\";\nimport {FilterStatement} from \"../../_models/metadata/v2/filter-statement\";\nimport {FilterCombination} from \"../../_models/metadata/v2/filter-combination\";\nimport {FilterField} from \"../../_models/metadata/v2/filter-field\";\nimport {FilterComparison} from \"../../_models/metadata/v2/filter-comparison\";\nimport {HttpClient} from \"@angular/common/http\";\nimport {TextResonse} from \"../../_types/text-response\";\nimport {environment} from \"../../../environments/environment\";\nimport {map, tap} from \"rxjs/operators\";\nimport {of, switchMap} from \"rxjs\";\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FilterUtilitiesService {\n\n private apiUrl = environment.apiUrl;\n\n constructor(private metadataService: MetadataService, private router: Router, private http: HttpClient) {}\n\n encodeFilter(filter: SeriesFilterV2 | undefined) {\n return this.http.post(this.apiUrl + 'filter/encode', filter, TextResonse);\n }\n\n decodeFilter(encodedFilter: string) {\n return this.http.post(this.apiUrl + 'filter/decode', {encodedFilter}).pipe(map(filter => {\n if (filter == null) {\n filter = this.metadataService.createDefaultFilterDto();\n filter.statements.push(this.createSeriesV2DefaultStatement());\n }\n\n return filter;\n }))\n }\n\n updateUrlFromFilter(filter: SeriesFilterV2 | undefined) {\n return this.encodeFilter(filter).pipe(tap(encodedFilter => {\n window.history.replaceState(window.location.href, '', window.location.href.split('?')[0]+ '?' + encodedFilter);\n }));\n }\n\n filterPresetsFromUrl(snapshot: ActivatedRouteSnapshot) {\n const filter = this.metadataService.createDefaultFilterDto();\n filter.statements.push(this.createSeriesV2DefaultStatement());\n if (!window.location.href.includes('?')) return of(filter);\n\n return this.decodeFilter(window.location.href.split('?')[1]);\n }\n\n /**\n * Applies and redirects to the passed page with the filter encoded\n * @param page\n * @param filter\n * @param comparison\n * @param value\n */\n applyFilter(page: Array, filter: FilterField, comparison: FilterComparison, value: string) {\n const dto = this.createSeriesV2Filter();\n dto.statements.push(this.metadataService.createDefaultFilterStatement(filter, comparison, value + ''));\n\n return this.encodeFilter(dto).pipe(switchMap(encodedFilter => {\n return this.router.navigateByUrl(page.join('/') + '?' + encodedFilter);\n }));\n }\n\n applyFilterWithParams(page: Array, filter: SeriesFilterV2, extraParams: Params) {\n return this.encodeFilter(filter).pipe(switchMap(encodedFilter => {\n let url = page.join('/') + '?' + encodedFilter;\n url += Object.keys(extraParams).map(k => `&${k}=${extraParams[k]}`).join('');\n\n return this.router.navigateByUrl(url, extraParams);\n }));\n }\n\n createSeriesV2Filter(): SeriesFilterV2 {\n return {\n combination: FilterCombination.And,\n statements: [],\n limitTo: 0,\n sortOptions: {\n isAscending: true,\n sortField: SortField.SortName\n },\n };\n }\n\n createSeriesV2DefaultStatement(): FilterStatement {\n return {\n comparison: FilterComparison.Equal,\n value: '',\n field: FilterField.SeriesName\n }\n }\n}\n"],"mappings":"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","names":["require_FileSaver_min","__commonJSMin","exports","module","a","b","c","g","d","f","h","i","j","e","k","l","m","Action","ActionFactoryService","constructor","accountService","deviceService","libraryActions","seriesActions","volumeActions","chapterActions","collectionTagActions","readingListActions","bookmarkActions","sideNavStreamActions","isAdmin","currentUser$","subscribe","user","hasAdminRole","_resetActions","getLibraryActions","callback","applyCallbackToList","getSeriesActions","getSideNavStreamActions","getVolumeActions","getChapterActions","getCollectionTagActions","getReadingListActions","getBookmarkActions","getMetadataFilterActions","actions","title","action","AddRuleGroup","requiresAdmin","children","dummyCallback","RemoveRuleGroup","data","filterSendToAction","chapter","Scan","Submenu","RefreshMetadata","AnalyzeFiles","Delete","Edit","class","Promote","UnPromote","MarkAsRead","MarkAsUnread","AddToWantToReadList","RemoveFromWantToReadList","AddToReadingList","AddToCollection","SendTo","dynamicList","devices$","pipe","map","devices","d","name","shareReplay","Download","IncognitoRead","ViewSeries","DownloadBookmark","MarkAsVisible","MarkAsInvisible","applyCallback","length","forEach","childAction","list","a","__spreadValues","hasAction","i","ɵɵinject","AccountService","DeviceService","factory","ɵfac","providedIn","_ActionFactoryService","TagBadgeCursor","TagBadgeComponent","constructor","selectionMode","Selectable","fillStyle","selectors","inputs","standalone","features","ɵɵStandaloneFeature","ngContentSelectors","_c0","decls","vars","consts","template","rf","ctx","ɵɵelementStart","ɵɵprojection","ɵɵelementEnd","ɵɵclassMapInterpolate1","ɵɵproperty","ɵɵpureFunction3","_c1","NotAllowed","Clickable","CommonModule","NgClass","styles","changeDetection","_TagBadgeComponent","import_file_saver","SAVER","InjectionToken","getSaver","saveAs","isHttpResponse","event","type","HttpEventType","Response","isHttpProgressEvent","DownloadProgress","UploadProgress","download","saver","source","pipe","scan","previous","progress","total","Math","round","loaded","state","content","body","getFilename","headers","filename","defaultName","get","split","replace","trim","startsWith","ext","substring","lastIndexOf","length","BytesPipe","transform","bytes","si","dp","thresh","Math","abs","units","u","r","round","length","fixed","toFixed","endsWith","pure","standalone","_BytesPipe","DEBOUNCE_TIME","bytesPipe","BytesPipe","DownloadService","constructor","save","baseUrl","environment","apiUrl","SIZE_WARNING","IOS_SIZE_WARNING","downloadsSource","BehaviorSubject","activeDownloads$","asObservable","downloadQueue","queuedDownloads$","destroyRef","inject","DestroyRef","confirmService","ConfirmService","accountService","AccountService","httpClient","HttpClient","utilityService","UtilityService","subscribe","queue","length","entity","shift","console","log","undefined","processDownload","downloadSubtitle","downloadEntityType","downloadEntity","name","minNumber","download","entityType","callback","sizeCheckCall","downloadCall","downloadSeriesSize","id","downloadSeries","downloadVolumeSize","downloadVolume","downloadChapterSize","downloadChapter","of","downloadBookmarks","downloadLogs","currentUser$","pipe","take","switchMap","user","preferences","promptForDownloadSize","size","__async","confirmSize","filter","wantsToDownload","_","tap","d","takeWhile","val","state","finalize","takeUntilDestroyed","seriesId","get","volumeId","chapterId","downloadType","subtitle","observe","responseType","reportProgress","throttleTime","asyncScheduler","leading","trailing","blob","filename","decodeURIComponent","updateDownloadState","finalizeDownloadState","getIdKey","isVolume","isChapter","isSeries","getDownloadEntityType","idKey","url","series","entitySubtitle","values","getValue","v","subTitle","next","findIndex","push","progress","index","chapter","volume","showIosWarning","test","navigator","userAgent","confirm","translate","transform","bookmarks","post","downloadObservable","downloadEvent","processNextDownload","currentQueue","value","nextEntity","enqueueDownload","newQueue","mapToEntityType","events","find","e","hasOwnProperty","ɵɵinject","SAVER","factory","ɵfac","providedIn","_DownloadService","CollectionTagService","constructor","httpClient","accountService","baseUrl","environment","apiUrl","allCollections","ownedOnly","get","allCollectionsForSeries","seriesId","updateTag","tag","post","TextResonse","promoteMultipleCollections","tags","promoted","collectionIds","updateSeriesForTag","seriesIdsToRemove","addByMultiple","tagId","seriesIds","tagTitle","collectionTagId","collectionTagTitle","tagNameExists","name","deleteTag","delete","deleteMultipleCollections","getMalStacks","actionListFilter","action","user","canPromote","hasAdminRole","hasPromoteRole","Action","Promote","UnPromote","ɵɵinject","HttpClient","AccountService","factory","ɵfac","providedIn","_CollectionTagService","PersonRole","ɵɵelementContainerStart","ɵɵelementStart","ɵɵlistener","$event","ɵɵrestoreView","_r2","ctx_r2","ɵɵnextContext","ɵɵresetView","toggleLock","ɵɵelement","ɵɵtext","ɵɵelementEnd","ɵɵadvance","ɵɵtextInterpolate","t_r4","_r5","option_r6","$implicit","toggleSelection","ɵɵelementContainer","ɵɵtemplate","TypeaheadComponent_ng_container_0_app_tag_badge_5_i_2_Template","ɵɵproperty","badgeTemplate","ɵɵpureFunction2","_c4","i_r7","disabled","settings","id","ɵɵclassMapInterpolate1","multiple","i0","_r8","clearSelections","stopPropagation","TypeaheadComponent_ng_container_0_ng_container_8_button_1_Template","selected_r9","length","_r10","focusedIndex","updateHighlight","addNewItem","typeaheadControl","value","ɵɵtextInterpolate1","ɵɵpureFunction1","_c5","option_r12","_r11","handleOptionClick","index_r13","index","showAddItem","optionTemplate","ɵɵtextInterpolate2","addIfNonExisting","TypeaheadComponent_ng_container_0_ng_container_10_div_1_li_3_Template","TypeaheadComponent_ng_container_0_ng_container_10_div_1_li_4_Template","TypeaheadComponent_ng_container_0_ng_container_10_div_1_li_5_Template","hasFocus","options_r14","trackByIdentityFn","TypeaheadComponent_ng_container_0_ng_container_10_div_1_Template","TypeaheadComponent_ng_container_0_ng_container_3_Template","_r1","onInputFocus","TypeaheadComponent_ng_container_0_app_tag_badge_5_Template","TypeaheadComponent_ng_container_0_input_6_Template","TypeaheadComponent_ng_container_0_div_7_Template","TypeaheadComponent_ng_container_0_ng_container_8_Template","TypeaheadComponent_ng_container_0_ng_container_10_Template","typeaheadForm","ɵɵclassMapInterpolate2","locked","showLocked","_c3","optionSelection","selected","isLoadingOptions","ɵɵpipeBind1","selectedData","filteredOptions","SelectionModel","constructor","selectedState","selectedOptions","propAccessor","_propAccessor","_data","undefined","forEach","d","push","toggle","data","compareFn","lookupMethod","shallowEqual","dataItem","filter","isSelected","hasSomeSelected","selectedCount","map","unselected","peek","a","b","key","ANIMATION_SPEED","TypeaheadComponent","renderer2","document","cdRef","reset","ReplaySubject","EventEmitter","newItemAdded","onUnlock","lockedChange","destroyRef","inject","DestroyRef","ngOnInit","pipe","takeUntilDestroyed","subscribe","resetToEmpty","init","focus","console","error","hasOwnProperty","formControl","FormControl","FormGroup","get","valueChanges","tap","val","inputElem","nativeElement","setStyle","trim","auditTime","debounce","minCharacters","switchMap","fetchFn","items","item","filterSelected","markForCheck","setTimeout","updateShowAddItem","shareReplay","savedData","handleDocumentClick","event","target","classList","contains","handleKeyPress","KEY_CODES","DOWN_ARROW","RIGHT_ARROW","Math","min","querySelectorAll","UP_ARROW","LEFT_ARROW","max","ENTER","take","opts","preventDefault","click","BACKSPACE","DELETE","removeSelectedOption","pop","ESC_KEY","opt","selectionCompareFn","emit","resetField","untoggleAll","title","addTransformFn","newItem","unique","openDropdown","setValue","body","RendererStyleFlags2","Important","addClass","removeClass","options","inputText","dirty","compareFnForAdd","matches","includes","ɵɵdirectiveInject","Renderer2","DOCUMENT","ChangeDetectorRef","selectors","contentQueries","rf","ctx","dirIndex","ɵɵresolveBody","ɵɵresolveWindow","TypeaheadComponent_ng_container_0_Template","CommonModule","NgClass","NgForOf","NgIf","NgTemplateOutlet","AsyncPipe","TagBadgeComponent","ReactiveFormsModule","ɵNgNoValidate","DefaultValueAccessor","NgControlStatus","NgControlStatusGroup","FormGroupDirective","FormControlName","TranslocoDirective","styles","animation","trigger","state","style","height","transition","overflow","animate","changeDetection","_TypeaheadComponent","FilterUtilitiesService","constructor","metadataService","router","http","apiUrl","environment","encodeFilter","filter","post","TextResonse","decodeFilter","encodedFilter","pipe","map","createDefaultFilterDto","statements","push","createSeriesV2DefaultStatement","updateUrlFromFilter","tap","window","history","replaceState","location","href","split","filterPresetsFromUrl","snapshot","includes","of","applyFilter","page","comparison","value","dto","createSeriesV2Filter","createDefaultFilterStatement","switchMap","navigateByUrl","join","applyFilterWithParams","extraParams","url","Object","keys","k","combination","FilterCombination","And","limitTo","sortOptions","isAscending","sortField","SortField","SortName","FilterComparison","Equal","field","FilterField","SeriesName","ɵɵinject","MetadataService","Router","HttpClient","factory","ɵfac","providedIn","_FilterUtilitiesService"],"x_google_ignoreList":[0]}