{"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';\r\nimport { map, Observable, shareReplay } from 'rxjs';\r\nimport { Chapter } from '../_models/chapter';\r\nimport {UserCollection} from '../_models/collection-tag';\r\nimport { Device } from '../_models/device/device';\r\nimport { Library } from '../_models/library/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\nimport {SideNavStream} from \"../_models/sidenav/sidenav-stream\";\r\nimport {User} from \"../_models/user\";\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 * Removes the Series from On Deck inclusion\r\n */\r\n RemoveFromOnDeck = 19,\r\n AddRuleGroup = 20,\r\n RemoveRuleGroup = 21,\r\n MarkAsVisible = 22,\r\n MarkAsInvisible = 23,\r\n /**\r\n * Promotes the underlying item (Reading List, Collection)\r\n */\r\n Promote = 24,\r\n UnPromote = 25\r\n}\r\n\r\n/**\r\n * Callback for an action\r\n */\r\nexport type ActionCallback = (action: ActionItem, data: T) => void;\r\nexport type ActionAllowedCallback = (action: ActionItem) => boolean;\r\n\r\nexport interface ActionItem {\r\n title: string;\r\n action: Action;\r\n callback: ActionCallback;\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 sideNavStreamActions: Array> = [];\r\n\r\n isAdmin = 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 } 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: ActionCallback) {\r\n\t\treturn this.applyCallbackToList(this.libraryActions, callback);\r\n }\r\n\r\n getSeriesActions(callback: ActionCallback) {\r\n\t\treturn this.applyCallbackToList(this.seriesActions, callback);\r\n }\r\n\r\n getSideNavStreamActions(callback: ActionCallback) {\r\n return this.applyCallbackToList(this.sideNavStreamActions, callback);\r\n }\r\n\r\n getVolumeActions(callback: ActionCallback) {\r\n\t\treturn this.applyCallbackToList(this.volumeActions, callback);\r\n }\r\n\r\n getChapterActions(callback: ActionCallback) {\r\n return this.applyCallbackToList(this.chapterActions, callback);\r\n }\r\n\r\n getCollectionTagActions(callback: ActionCallback) {\r\n\t\treturn this.applyCallbackToList(this.collectionTagActions, callback);\r\n }\r\n\r\n getReadingListActions(callback: ActionCallback) {\r\n return this.applyCallbackToList(this.readingListActions, callback);\r\n }\r\n\r\n getBookmarkActions(callback: ActionCallback) {\r\n return this.applyCallbackToList(this.bookmarkActions, callback);\r\n }\r\n\r\n getMetadataFilterActions(callback: ActionCallback) {\r\n const actions = [\r\n {title: 'add-rule-group-and', action: Action.AddRuleGroup, requiresAdmin: false, children: [], callback: this.dummyCallback},\r\n {title: 'add-rule-group-or', action: Action.AddRuleGroup, requiresAdmin: false, children: [], callback: this.dummyCallback},\r\n {title: 'remove-rule-group', action: Action.RemoveRuleGroup, requiresAdmin: false, children: [], callback: this.dummyCallback},\r\n ];\r\n return this.applyCallbackToList(actions, 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: true,\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 action: Action.Delete,\r\n title: 'delete',\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: 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 action: Action.Promote,\r\n title: 'promote',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.UnPromote,\r\n title: 'unpromote',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\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: false,\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 this.sideNavStreamActions = [\r\n {\r\n action: Action.MarkAsVisible,\r\n title: 'mark-visible',\r\n callback: this.dummyCallback,\r\n requiresAdmin: false,\r\n children: [],\r\n },\r\n {\r\n action: Action.MarkAsInvisible,\r\n title: 'mark-invisible',\r\n callback: this.dummyCallback,\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 if (actions.length === 0) return false;\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 return false;\r\n }\r\n\r\n}\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport {CommonModule} from \"@angular/common\";\r\n\r\n/**\r\n * What type of cursor to apply to the tag badge\r\n */\r\nexport enum TagBadgeCursor {\r\n /**\r\n * Allows the user to select text\r\n * cursor: default\r\n */\r\n Selectable,\r\n /**\r\n * Informs the user they can click and interact with badge\r\n * cursor: pointer\r\n */\r\n Clickable,\r\n /**\r\n * Informs the user they cannot click or interact with badge\r\n * cursor: not-allowed\r\n */\r\n NotAllowed,\r\n}\r\n\r\n@Component({\r\n selector: 'app-tag-badge',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './tag-badge.component.html',\r\n styleUrls: ['./tag-badge.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class TagBadgeComponent {\r\n\r\n @Input() selectionMode: TagBadgeCursor = TagBadgeCursor.Selectable;\r\n @Input() fillStyle: 'filled' | 'outline' = 'outline';\r\n\r\n get TagBadgeCursor() {\r\n return TagBadgeCursor;\r\n }\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}\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 { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'bytes',\r\n standalone: true\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 { HttpClient } from '@angular/common/http';\r\nimport {DestroyRef, inject, 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 {\r\n asyncScheduler,\r\n BehaviorSubject,\r\n Observable,\r\n tap,\r\n finalize,\r\n of,\r\n filter,\r\n} from 'rxjs';\r\nimport { download, Download } from '../_models/download';\r\nimport { PageBookmark } from 'src/app/_models/readers/page-bookmark';\r\nimport {switchMap, take, takeWhile, throttleTime} from 'rxjs/operators';\r\nimport { AccountService } from 'src/app/_services/account.service';\r\nimport { BytesPipe } from 'src/app/_pipes/bytes.pipe';\r\nimport {translate} from \"@ngneat/transloco\";\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {SAVER, Saver} from \"../../_providers/saver.provider\";\r\nimport {UtilityService} from \"./utility.service\";\r\nimport {UserCollection} from \"../../_models/collection-tag\";\r\nimport {RecentlyAddedItem} from \"../../_models/recently-added-item\";\r\nimport {NextExpectedChapter} from \"../../_models/series-detail/next-expected-chapter\";\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 * Entity id. For entities without id like logs or bookmarks, uses 0 instead\r\n */\r\n id: 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\nexport type QueueableDownloadType = Chapter | Volume;\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 * Sie in bytes in which to inform the user that anything above may fail on iOS due to device limits. (200MB)\r\n */\r\n private IOS_SIZE_WARNING = 209_715_200;\r\n\r\n private downloadsSource: BehaviorSubject = new BehaviorSubject([]);\r\n /**\r\n * Active Downloads\r\n */\r\n public activeDownloads$ = this.downloadsSource.asObservable();\r\n\r\n private downloadQueue: BehaviorSubject = new BehaviorSubject([]);\r\n /**\r\n * Queued Downloads\r\n */\r\n public queuedDownloads$ = this.downloadQueue.asObservable();\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly confirmService = inject(ConfirmService);\r\n private readonly accountService = inject(AccountService);\r\n private readonly httpClient = inject(HttpClient);\r\n private readonly utilityService = inject(UtilityService);\r\n\r\n constructor(@Inject(SAVER) private save: Saver) {\r\n this.downloadQueue.subscribe((queue) => {\r\n if (queue.length > 0) {\r\n const entity = queue.shift();\r\n console.log('Download Queue shifting entity: ', entity);\r\n if (entity === undefined) return;\r\n this.processDownload(entity);\r\n }\r\n });\r\n }\r\n\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 | undefined, 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).minNumber + '';\r\n case 'chapter':\r\n return (downloadEntity as Chapter).minNumber + '';\r\n case 'bookmark':\r\n return '';\r\n case 'logs':\r\n return '';\r\n }\r\n return '';\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 //this.enqueueDownload(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 //this.enqueueDownload(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(take(1), 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 }),\r\n filter(_ => downloadCall !== undefined),\r\n switchMap(() => {\r\n return (downloadCall || of(undefined)).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 }), takeUntilDestroyed(this.destroyRef)\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, 0)),\r\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\r\n );\r\n }\r\n\r\n private getIdKey(entity: Chapter | Volume) {\r\n if (this.utilityService.isVolume(entity)) return 'volumeId';\r\n if (this.utilityService.isChapter(entity)) return 'chapterId';\r\n if (this.utilityService.isSeries(entity)) return 'seriesId';\r\n return 'id';\r\n }\r\n\r\n private getDownloadEntityType(entity: Chapter | Volume): DownloadEntityType {\r\n if (this.utilityService.isVolume(entity)) return 'volume';\r\n if (this.utilityService.isChapter(entity)) return 'chapter';\r\n if (this.utilityService.isSeries(entity)) return 'series';\r\n return 'logs'; // This is a hack but it will never occur\r\n }\r\n\r\n private downloadEntity(entity: Chapter | Volume): Observable {\r\n const downloadEntityType = this.getDownloadEntityType(entity);\r\n const subtitle = this.downloadSubtitle(downloadEntityType, entity);\r\n const idKey = this.getIdKey(entity);\r\n const url = `${this.baseUrl}download/${downloadEntityType}?${idKey}=${entity.id}`;\r\n\r\n return this.httpClient.get(url, { observe: 'events', responseType: 'blob', reportProgress: true }).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, downloadEntityType, subtitle, entity.id)),\r\n finalize(() => this.finalizeDownloadState(downloadEntityType, subtitle))\r\n );\r\n }\r\n\r\n private downloadSeries(series: Series) {\r\n\r\n // TODO: Call backend for all the volumes and loose leaf chapters then enqueque them all\r\n\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, series.id)),\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, id: number) {\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, id});\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 return this.downloadEntity(chapter);\r\n }\r\n\r\n private downloadVolume(volume: Volume) {\r\n return this.downloadEntity(volume);\r\n }\r\n\r\n private async confirmSize(size: number, entityType: DownloadEntityType) {\r\n const showIosWarning = size > this.IOS_SIZE_WARNING && /iPad|iPhone|iPod/.test(navigator.userAgent);\r\n return (size < this.SIZE_WARNING ||\r\n await this.confirmService.confirm(translate('toasts.confirm-download-size',\r\n {entityType: translate('entity-type.' + entityType), size: bytesPipe.transform(size)})\r\n + (!showIosWarning ? '' : '

' + translate('toasts.confirm-download-size-ios'))));\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, 0)),\r\n finalize(() => this.finalizeDownloadState(downloadType, subtitle))\r\n );\r\n }\r\n\r\n\r\n\r\n private processDownload(entity: QueueableDownloadType): void {\r\n const downloadObservable = this.downloadEntity(entity);\r\n console.log('Process Download called for entity: ', entity);\r\n\r\n // When we consume one, we need to take it off the queue\r\n\r\n downloadObservable.subscribe((downloadEvent) => {\r\n // Download completed, process the next item in the queue\r\n if (downloadEvent.state === 'DONE') {\r\n this.processNextDownload();\r\n }\r\n });\r\n }\r\n\r\n private processNextDownload(): void {\r\n const currentQueue = this.downloadQueue.value;\r\n if (currentQueue.length > 0) {\r\n const nextEntity = currentQueue[0];\r\n this.processDownload(nextEntity);\r\n }\r\n }\r\n\r\n private enqueueDownload(entity: QueueableDownloadType): void {\r\n const currentQueue = this.downloadQueue.value;\r\n const newQueue = [...currentQueue, entity];\r\n this.downloadQueue.next(newQueue);\r\n\r\n // If the queue was empty, start processing the download\r\n if (currentQueue.length === 0) {\r\n this.processNextDownload();\r\n }\r\n }\r\n\r\n mapToEntityType(events: DownloadEvent[], entity: Series | Volume | Chapter | UserCollection | PageBookmark | RecentlyAddedItem | NextExpectedChapter) {\r\n if(this.utilityService.isSeries(entity)) {\r\n return events.find(e => e.entityType === 'series' && e.id == entity.id\r\n && e.subTitle === this.downloadSubtitle('series', (entity as Series))) || null;\r\n }\r\n if(this.utilityService.isVolume(entity)) {\r\n return events.find(e => e.entityType === 'volume' && e.id == entity.id\r\n && e.subTitle === this.downloadSubtitle('volume', (entity as Volume))) || null;\r\n }\r\n if(this.utilityService.isChapter(entity)) {\r\n return events.find(e => e.entityType === 'chapter' && e.id == entity.id\r\n && e.subTitle === this.downloadSubtitle('chapter', (entity as Chapter))) || null;\r\n }\r\n // Is PageBookmark[]\r\n if(entity.hasOwnProperty('length')) {\r\n return events.find(e => e.entityType === 'bookmark'\r\n && e.subTitle === this.downloadSubtitle('bookmark', [(entity as PageBookmark)])) || null;\r\n }\r\n return null;\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 {UserCollection} from '../_models/collection-tag';\r\nimport {TextResonse} from '../_types/text-response';\r\nimport {MalStack} from \"../_models/collection/mal-stack\";\r\nimport {Action, ActionItem} from \"./action-factory.service\";\r\nimport {User} from \"../_models/user\";\r\nimport {AccountService} from \"./account.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 accountService: AccountService) { }\r\n\r\n allCollections(ownedOnly = false) {\r\n return this.httpClient.get(this.baseUrl + 'collection?ownedOnly=' + ownedOnly);\r\n }\r\n\r\n allCollectionsForSeries(seriesId: number, ownedOnly = false) {\r\n return this.httpClient.get(this.baseUrl + 'collection/all-series?ownedOnly=' + ownedOnly + '&seriesId=' + seriesId);\r\n }\r\n\r\n updateTag(tag: UserCollection) {\r\n return this.httpClient.post(this.baseUrl + 'collection/update', tag, TextResonse);\r\n }\r\n\r\n promoteMultipleCollections(tags: Array, promoted: boolean) {\r\n return this.httpClient.post(this.baseUrl + 'collection/promote-multiple', {collectionIds: tags, promoted}, TextResonse);\r\n }\r\n\r\n updateSeriesForTag(tag: UserCollection, 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 deleteTag(tagId: number) {\r\n return this.httpClient.delete(this.baseUrl + 'collection?tagId=' + tagId, TextResonse);\r\n }\r\n\r\n deleteMultipleCollections(tags: Array) {\r\n return this.httpClient.post(this.baseUrl + 'collection/delete-multiple', {collectionIds: tags}, TextResonse);\r\n }\r\n\r\n getMalStacks() {\r\n return this.httpClient.get>(this.baseUrl + 'collection/mal-stacks');\r\n }\r\n\r\n actionListFilter(action: ActionItem, user: User) {\r\n const canPromote = this.accountService.hasAdminRole(user) || this.accountService.hasPromoteRole(user);\r\n const isPromotionAction = action.action == Action.Promote || action.action == Action.UnPromote;\r\n\r\n if (isPromotionAction) return canPromote;\r\n return true;\r\n }\r\n}\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 Imprint = 13,\r\n Team = 14,\r\n Location = 15\r\n}\r\n\r\nexport interface Person {\r\n id: number;\r\n name: string;\r\n role: PersonRole;\r\n}\r\n","import { trigger, state, style, transition, animate } from '@angular/animations';\r\nimport {CommonModule, DOCUMENT} from '@angular/common';\r\nimport {\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 Inject,\r\n Input,\r\n OnInit,\r\n Output,\r\n Renderer2,\r\n RendererStyleFlags2,\r\n TemplateRef,\r\n ViewChild\r\n} from '@angular/core';\r\nimport {FormControl, FormGroup, ReactiveFormsModule} from '@angular/forms';\r\nimport { Observable, ReplaySubject } from 'rxjs';\r\nimport { auditTime, filter, map, shareReplay, switchMap, take, tap } from 'rxjs/operators';\r\nimport { KEY_CODES } from 'src/app/shared/_services/utility.service';\r\nimport { SelectionCompareFn, TypeaheadSettings } from '../_models/typeahead-settings';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {TagBadgeComponent} from \"../../shared/tag-badge/tag-badge.component\";\r\nimport {TranslocoDirective} from \"@ngneat/transloco\";\r\n\r\n\r\n/**\r\n * SelectionModel is used for keeping track of multiple selections. Simple interface with ability to toggle.\r\n * @param selectedState Optional state to set selectedOptions to. If not passed, defaults to false.\r\n * @param selectedOptions Optional data elements to inform the SelectionModel of. If not passed, as toggle() occur, items are tracked.\r\n * @param propAccessor Optional string that points to a unique field within the T type. Used for quickly looking up.\r\n */\r\nexport class SelectionModel {\r\n _data!: Array<{value: T, selected: boolean}>;\r\n _propAccessor: string = '';\r\n\r\n constructor(selectedState: boolean = false, selectedOptions: Array = [], propAccessor: string = '') {\r\n this._data = [];\r\n\r\n if (propAccessor != undefined || propAccessor !== '') {\r\n this._propAccessor = propAccessor;\r\n }\r\n\r\n selectedOptions.forEach(d => {\r\n this._data.push({value: d, selected: selectedState});\r\n });\r\n }\r\n\r\n /**\r\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.\r\n * @param data Item to toggle\r\n * @param selectedState Force the state\r\n * @param compareFn An optional function to use for the lookup, else will use shallowEqual implementation\r\n */\r\n toggle(data: T, selectedState?: boolean, compareFn?: SelectionCompareFn) {\r\n let lookupMethod = this.shallowEqual;\r\n if (compareFn != undefined || compareFn != null) {\r\n lookupMethod = compareFn;\r\n }\r\n\r\n const dataItem = this._data.filter(d => lookupMethod(d.value, data));\r\n if (dataItem.length > 0) {\r\n if (selectedState != undefined) {\r\n dataItem[0].selected = selectedState;\r\n } else {\r\n dataItem[0].selected = !dataItem[0].selected;\r\n }\r\n } else {\r\n this._data.push({value: data, selected: (selectedState === undefined ? true : selectedState)});\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Is the passed item selected\r\n * @param data item to check against\r\n * @param compareFn optional method to use to perform comparisons\r\n * @returns boolean\r\n */\r\n isSelected(data: T, compareFn?: SelectionCompareFn): boolean {\r\n let lookupMethod = this.shallowEqual;\r\n if (compareFn != undefined || compareFn != null) {\r\n lookupMethod = compareFn;\r\n }\r\n\r\n const dataItem = this._data.filter(d => lookupMethod(d.value, data));\r\n\r\n if (dataItem.length > 0) {\r\n return dataItem[0].selected;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n *\r\n * @returns If some of the items are selected, but not all\r\n */\r\n hasSomeSelected(): boolean {\r\n const selectedCount = this._data.filter(d => d.selected).length;\r\n return (selectedCount !== this._data.length && selectedCount !== 0)\r\n }\r\n\r\n /**\r\n *\r\n * @returns All Selected items\r\n */\r\n selected(): Array {\r\n return this._data.filter(d => d.selected).map(d => d.value);\r\n }\r\n\r\n /**\r\n *\r\n * @returns All Non-Selected items\r\n */\r\n unselected(): Array {\r\n return this._data.filter(d => !d.selected).map(d => d.value);\r\n }\r\n\r\n /**\r\n *\r\n * @returns Last element added/tracked or undefined if nothing is tracked\r\n */\r\n peek(): T | undefined {\r\n if (this._data.length > 0) {\r\n return this._data[this._data.length - 1].value;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n shallowEqual(a: T, b: T) {\r\n\r\n for (let key in a) {\r\n if (!(key in b) || a[key] !== b[key]) {\r\n return false;\r\n }\r\n }\r\n for (let key in b) {\r\n if (!(key in a)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n\r\nconst ANIMATION_SPEED = 200;\r\n\r\n@Component({\r\n selector: 'app-typeahead',\r\n standalone: true,\r\n imports: [CommonModule, TagBadgeComponent, ReactiveFormsModule, TranslocoDirective],\r\n templateUrl: './typeahead.component.html',\r\n styleUrls: ['./typeahead.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [\r\n trigger('slideFromTop', [\r\n state('in', style({ height: '0px'})),\r\n transition('void => *', [\r\n style({ height: '100%', overflow: 'auto' }),\r\n animate(ANIMATION_SPEED)\r\n ]),\r\n transition('* => void', [\r\n animate(ANIMATION_SPEED, style({ height: '0px' })),\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class TypeaheadComponent implements OnInit {\r\n /**\r\n * Settings for the typeahead\r\n */\r\n @Input({required: true}) settings!: TypeaheadSettings;\r\n /**\r\n * When true, will reset field to no selections. When false, will reset to saved data\r\n */\r\n @Input() reset: ReplaySubject = new ReplaySubject(1);\r\n /**\r\n * When a field is locked, we render custom css to indicate to the user. Does not affect functionality.\r\n */\r\n @Input() locked: boolean = false;\r\n /**\r\n * If disabled, a user will not be able to interact with the typeahead\r\n */\r\n @Input() disabled: boolean = false;\r\n /**\r\n * When triggered, will focus the input if the passed string matches the id\r\n */\r\n @Input() focus: EventEmitter | undefined;\r\n @Output() selectedData = new EventEmitter();\r\n @Output() newItemAdded = new EventEmitter();\r\n @Output() onUnlock = new EventEmitter();\r\n @Output() lockedChange = new EventEmitter();\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n\r\n @ViewChild('input') inputElem!: ElementRef;\r\n @ContentChild('optionItem') optionTemplate!: TemplateRef;\r\n @ContentChild('badgeItem') badgeTemplate!: TemplateRef;\r\n\r\n optionSelection!: SelectionModel;\r\n\r\n hasFocus = false; // Whether input has active focus\r\n focusedIndex: number = 0;\r\n showAddItem: boolean = false;\r\n filteredOptions!: Observable;\r\n isLoadingOptions: boolean = false;\r\n typeaheadControl!: FormControl;\r\n typeaheadForm!: FormGroup;\r\n\r\n constructor(private renderer2: Renderer2, @Inject(DOCUMENT) private document: Document, private readonly cdRef: ChangeDetectorRef) { }\r\n\r\n ngOnInit() {\r\n this.reset.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((resetToEmpty: boolean) => {\r\n this.clearSelections(resetToEmpty);\r\n this.init();\r\n });\r\n\r\n if (this.focus) {\r\n this.focus.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((id: string) => {\r\n if (this.settings.id !== id) return;\r\n this.onInputFocus();\r\n });\r\n }\r\n\r\n this.init();\r\n }\r\n\r\n init() {\r\n if (this.settings.compareFn === undefined && this.settings.multiple) {\r\n console.error('A compare function must be defined');\r\n return;\r\n }\r\n\r\n if (this.settings.trackByIdentityFn === undefined) {\r\n this.settings.trackByIdentityFn = (index, value) => value;\r\n }\r\n\r\n if (this.settings.hasOwnProperty('formControl') && this.settings.formControl) {\r\n this.typeaheadControl = this.settings.formControl;\r\n } else {\r\n this.typeaheadControl = new FormControl('');\r\n }\r\n this.typeaheadForm = new FormGroup({\r\n 'typeahead': this.typeaheadControl\r\n });\r\n\r\n this.filteredOptions = this.typeaheadForm.get('typeahead')!.valueChanges\r\n .pipe(\r\n // Adjust input box to grow\r\n tap((val: string) => {\r\n if (this.inputElem != null && this.inputElem.nativeElement != null) {\r\n this.renderer2.setStyle(this.inputElem.nativeElement, 'width', 15 * (val.trim().length + 1) + 'px');\r\n this.focusedIndex = 0;\r\n }\r\n }),\r\n map((val: string) => val.trim()),\r\n auditTime(this.settings.debounce),\r\n //distinctUntilChanged(), // ?!: BUG Doesn't trigger the search to run when filtered array changes\r\n filter((val: string) => {\r\n // If minimum filter characters not met, do not filter\r\n if (this.settings.minCharacters === 0) return true;\r\n\r\n if (!val || val.length < this.settings.minCharacters) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }),\r\n\r\n switchMap((val: string) => {\r\n this.isLoadingOptions = true;\r\n return this.settings.fetchFn(val.trim()).pipe(takeUntilDestroyed(this.destroyRef), map((items: any[]) => items.filter(item => this.filterSelected(item))));\r\n }),\r\n tap((filteredOptions: any[]) => {\r\n this.isLoadingOptions = false;\r\n this.focusedIndex = 0;\r\n this.cdRef.markForCheck();\r\n setTimeout(() => {\r\n this.updateShowAddItem(filteredOptions);\r\n this.updateHighlight();\r\n }, 10);\r\n setTimeout(() => this.updateHighlight(), 20);\r\n\r\n }),\r\n shareReplay(),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n\r\n\r\n if (this.settings.savedData) {\r\n if (this.settings.multiple) {\r\n this.optionSelection = new SelectionModel(true, this.settings.savedData);\r\n }\r\n else {\r\n const isArray = this.settings.savedData.hasOwnProperty('length');\r\n if (isArray) {\r\n this.optionSelection = new SelectionModel(true, this.settings.savedData);\r\n } else {\r\n this.optionSelection = new SelectionModel(true, [this.settings.savedData]);\r\n }\r\n }\r\n } else {\r\n this.optionSelection = new SelectionModel();\r\n }\r\n }\r\n\r\n\r\n @HostListener('body:click', ['$event'])\r\n handleDocumentClick(event: any) {\r\n // Don't close the typeahead when we select an item from it\r\n if (event.target && (event.target as HTMLElement).classList.contains('list-group-item')) {\r\n return;\r\n }\r\n this.hasFocus = false;\r\n }\r\n\r\n @HostListener('window:keydown', ['$event'])\r\n handleKeyPress(event: KeyboardEvent) {\r\n if (!this.hasFocus) { return; }\r\n if (this.disabled) return;\r\n\r\n switch(event.key) {\r\n case KEY_CODES.DOWN_ARROW:\r\n case KEY_CODES.RIGHT_ARROW:\r\n {\r\n this.focusedIndex = Math.min(this.focusedIndex + 1, this.document.querySelectorAll('.list-group-item').length - 1);\r\n this.updateHighlight();\r\n break;\r\n }\r\n case KEY_CODES.UP_ARROW:\r\n case KEY_CODES.LEFT_ARROW:\r\n {\r\n this.focusedIndex = Math.max(this.focusedIndex - 1, 0);\r\n this.updateHighlight();\r\n break;\r\n }\r\n case KEY_CODES.ENTER:\r\n {\r\n this.document.querySelectorAll('.list-group-item').forEach((item, index) => {\r\n if (item.classList.contains('active')) {\r\n this.filteredOptions.pipe(take(1)).subscribe((opts: any[]) => {\r\n // This isn't giving back the filtered array, but everything\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n (item as HTMLElement).click();\r\n this.focusedIndex = 0;\r\n });\r\n }\r\n });\r\n break;\r\n }\r\n case KEY_CODES.BACKSPACE:\r\n case KEY_CODES.DELETE:\r\n {\r\n if (this.typeaheadControl.value !== null && this.typeaheadControl.value !== undefined && this.typeaheadControl.value.trim() !== '') {\r\n break;\r\n }\r\n const selected = this.optionSelection.selected();\r\n if (selected.length > 0) {\r\n this.removeSelectedOption(selected.pop());\r\n }\r\n break;\r\n }\r\n case KEY_CODES.ESC_KEY:\r\n this.hasFocus = false;\r\n event.stopPropagation();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n toggleSelection(opt: any): void {\r\n this.optionSelection.toggle(opt, undefined, this.settings.selectionCompareFn);\r\n this.selectedData.emit(this.optionSelection.selected());\r\n }\r\n\r\n removeSelectedOption(opt: any) {\r\n this.optionSelection.toggle(opt, undefined, this.settings.selectionCompareFn);\r\n this.selectedData.emit(this.optionSelection.selected());\r\n this.resetField();\r\n }\r\n\r\n clearSelections(untoggleAll: boolean = false) {\r\n if (this.optionSelection) {\r\n if (!untoggleAll && this.settings.savedData) {\r\n const isArray = this.settings.savedData.hasOwnProperty('length');\r\n if (isArray) {\r\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\r\n } else {\r\n this.optionSelection = new SelectionModel(true, [this.settings.savedData]);\r\n }\r\n this.cdRef.markForCheck();\r\n } else {\r\n this.optionSelection.selected().forEach(item => this.optionSelection.toggle(item, false));\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n this.selectedData.emit(this.optionSelection.selected());\r\n this.resetField();\r\n }\r\n }\r\n\r\n handleOptionClick(opt: any) {\r\n if (this.disabled) return;\r\n if (!this.settings.multiple && this.optionSelection.selected().length > 0) {\r\n return;\r\n }\r\n\r\n this.toggleSelection(opt);\r\n\r\n this.resetField();\r\n this.onInputFocus();\r\n }\r\n\r\n addNewItem(title: string) {\r\n if (this.settings.addTransformFn == undefined || !this.settings.addIfNonExisting) {\r\n return;\r\n }\r\n const newItem = this.settings.addTransformFn(title);\r\n this.newItemAdded.emit(newItem);\r\n this.toggleSelection(newItem);\r\n\r\n this.resetField();\r\n this.onInputFocus();\r\n }\r\n\r\n /**\r\n *\r\n * @param item\r\n * @returns True if the item is NOT selected already\r\n */\r\n filterSelected(item: any) {\r\n if (this.settings.unique && this.settings.multiple) {\r\n return !this.optionSelection.isSelected(item, this.settings.selectionCompareFn);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n openDropdown() {\r\n setTimeout(() => {\r\n this.typeaheadControl.setValue(this.typeaheadControl.value);\r\n this.hasFocus = true;\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 if (this.disabled) return;\r\n\r\n if (!this.settings.multiple && this.optionSelection.selected().length > 0) {\r\n return;\r\n }\r\n\r\n if (this.inputElem) {\r\n // hack: To prevent multiple typeaheads from being open at once, click document then trigger the focus\r\n this.document.body.click();\r\n\r\n this.inputElem.nativeElement.focus();\r\n this.hasFocus = true;\r\n }\r\n\r\n\r\n this.openDropdown();\r\n }\r\n\r\n\r\n resetField() {\r\n if (this.inputElem && this.inputElem.nativeElement) {\r\n this.renderer2.setStyle(this.inputElem.nativeElement, 'width', 4, RendererStyleFlags2.Important);\r\n }\r\n this.typeaheadControl.setValue('');\r\n this.focusedIndex = 0;\r\n }\r\n\r\n // Updates the highlight to focus on the selected item\r\n updateHighlight() {\r\n this.document.querySelectorAll('.list-group-item').forEach((item, index) => {\r\n if (index === this.focusedIndex && !item.classList.contains('no-hover')) {\r\n // apply active class\r\n this.renderer2.addClass(item, 'active');\r\n } else {\r\n // remove active class\r\n this.renderer2.removeClass(item, 'active');\r\n }\r\n });\r\n }\r\n\r\n updateShowAddItem(options: any[]) {\r\n // ?! BUG This will still technicially allow you to add the same thing as a previously added item. (Code will just toggle it though)\r\n this.showAddItem = false;\r\n this.cdRef.markForCheck();\r\n if (!this.settings.addIfNonExisting) return;\r\n\r\n const inputText = this.typeaheadControl.value.trim();\r\n if (inputText.length < Math.max(this.settings.minCharacters, 1)) return;\r\n if (!this.typeaheadControl.dirty) return; // Do we need this?\r\n\r\n // Check if this new option will interfere with any existing ones not shown\r\n\r\n if (typeof this.settings.compareFnForAdd == 'function') {\r\n const willDuplicateExist = this.settings.compareFnForAdd(this.optionSelection.selected(), inputText);\r\n if (willDuplicateExist.length > 0) {\r\n return;\r\n }\r\n }\r\n\r\n if (typeof this.settings.compareFn == 'function') {\r\n // The problem here is that compareFn can report that duplicate will exist as it does contains not match\r\n const matches = this.settings.compareFn(options, inputText);\r\n if (matches.length > 0 && matches.includes(this.settings.addTransformFn(inputText))) {\r\n return;\r\n }\r\n }\r\n\r\n this.showAddItem = true;\r\n\r\n if (this.showAddItem) {\r\n this.hasFocus = true;\r\n }\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n toggleLock(event: any) {\r\n if (this.disabled) return;\r\n this.locked = !this.locked;\r\n this.lockedChange.emit(this.locked);\r\n\r\n if (!this.locked) {\r\n this.onUnlock.emit();\r\n }\r\n }\r\n\r\n}\r\n","\r\n
\r\n
\r\n \r\n \r\n {{t('locked-field')}}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n {{t('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 {{t('add-item', {item: typeaheadControl.value})}}\r\n
  • \r\n
  • \r\n \r\n
  • \r\n
  • \r\n {{t('no-data')}}{{this.settings.addIfNonExisting ? t('add-custom-item') : ''}}\r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n","import {Injectable} from '@angular/core';\r\nimport {ActivatedRouteSnapshot, Params, Router} from '@angular/router';\r\nimport {SortField, SortOptions} from 'src/app/_models/metadata/series-filter';\r\nimport {MetadataService} from \"../../_services/metadata.service\";\r\nimport {SeriesFilterV2} from \"../../_models/metadata/v2/series-filter-v2\";\r\nimport {FilterStatement} from \"../../_models/metadata/v2/filter-statement\";\r\nimport {FilterCombination} from \"../../_models/metadata/v2/filter-combination\";\r\nimport {FilterField} from \"../../_models/metadata/v2/filter-field\";\r\nimport {FilterComparison} from \"../../_models/metadata/v2/filter-comparison\";\r\nimport {HttpClient} from \"@angular/common/http\";\r\nimport {TextResonse} from \"../../_types/text-response\";\r\nimport {environment} from \"../../../environments/environment\";\r\nimport {map, tap} from \"rxjs/operators\";\r\nimport {of, switchMap} from \"rxjs\";\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FilterUtilitiesService {\r\n\r\n private apiUrl = environment.apiUrl;\r\n\r\n constructor(private metadataService: MetadataService, private router: Router, private http: HttpClient) {}\r\n\r\n encodeFilter(filter: SeriesFilterV2 | undefined) {\r\n return this.http.post(this.apiUrl + 'filter/encode', filter, TextResonse);\r\n }\r\n\r\n decodeFilter(encodedFilter: string) {\r\n return this.http.post(this.apiUrl + 'filter/decode', {encodedFilter}).pipe(map(filter => {\r\n if (filter == null) {\r\n filter = this.metadataService.createDefaultFilterDto();\r\n filter.statements.push(this.createSeriesV2DefaultStatement());\r\n }\r\n\r\n return filter;\r\n }))\r\n }\r\n\r\n updateUrlFromFilter(filter: SeriesFilterV2 | undefined) {\r\n return this.encodeFilter(filter).pipe(tap(encodedFilter => {\r\n window.history.replaceState(window.location.href, '', window.location.href.split('?')[0]+ '?' + encodedFilter);\r\n }));\r\n }\r\n\r\n filterPresetsFromUrl(snapshot: ActivatedRouteSnapshot) {\r\n const filter = this.metadataService.createDefaultFilterDto();\r\n filter.statements.push(this.createSeriesV2DefaultStatement());\r\n if (!window.location.href.includes('?')) return of(filter);\r\n\r\n return this.decodeFilter(window.location.href.split('?')[1]);\r\n }\r\n\r\n /**\r\n * Applies and redirects to the passed page with the filter encoded\r\n * @param page\r\n * @param filter\r\n * @param comparison\r\n * @param value\r\n */\r\n applyFilter(page: Array, filter: FilterField, comparison: FilterComparison, value: string) {\r\n const dto = this.createSeriesV2Filter();\r\n dto.statements.push(this.metadataService.createDefaultFilterStatement(filter, comparison, value + ''));\r\n\r\n return this.encodeFilter(dto).pipe(switchMap(encodedFilter => {\r\n return this.router.navigateByUrl(page.join('/') + '?' + encodedFilter);\r\n }));\r\n }\r\n\r\n applyFilterWithParams(page: Array, filter: SeriesFilterV2, extraParams: Params) {\r\n return this.encodeFilter(filter).pipe(switchMap(encodedFilter => {\r\n let url = page.join('/') + '?' + encodedFilter;\r\n url += Object.keys(extraParams).map(k => `&${k}=${extraParams[k]}`).join('');\r\n\r\n return this.router.navigateByUrl(url, extraParams);\r\n }));\r\n }\r\n\r\n createSeriesV2Filter(): SeriesFilterV2 {\r\n return {\r\n combination: FilterCombination.And,\r\n statements: [],\r\n limitTo: 0,\r\n sortOptions: {\r\n isAscending: true,\r\n sortField: SortField.SortName\r\n },\r\n };\r\n }\r\n\r\n createSeriesV2DefaultStatement(): FilterStatement {\r\n return {\r\n comparison: FilterComparison.Equal,\r\n value: '',\r\n field: FilterField.SeriesName\r\n }\r\n }\r\n}\r\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]}