{ "version": 3, "sources": ["src/app/sidenav/_components/side-nav-item/side-nav-item.component.ts", "src/app/sidenav/_components/side-nav-item/side-nav-item.component.html", "src/app/_pipes/setting-fragment.pipe.ts", "src/app/sidenav/preference-nav/preference-nav.component.ts", "src/app/sidenav/preference-nav/preference-nav.component.html"], "sourcesContent": ["import {ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, inject, Input, OnInit} from '@angular/core';\r\nimport {NavigationEnd, Router, RouterLink} from '@angular/router';\r\nimport {filter, map, tap} from 'rxjs';\r\nimport {NavService} from 'src/app/_services/nav.service';\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {AsyncPipe, NgClass, NgOptimizedImage, NgTemplateOutlet} from \"@angular/common\";\r\nimport {ImageComponent} from \"../../../shared/image/image.component\";\r\nimport {Breakpoint, UtilityService} from \"../../../shared/_services/utility.service\";\r\n\r\n\r\n@Component({\r\n selector: 'app-side-nav-item',\r\n standalone: true,\r\n imports: [RouterLink, NgOptimizedImage, ImageComponent, NgTemplateOutlet, NgClass, AsyncPipe],\r\n templateUrl: './side-nav-item.component.html',\r\n styleUrls: ['./side-nav-item.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SideNavItemComponent implements OnInit {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly router = inject(Router);\r\n private readonly cdRef = inject(ChangeDetectorRef);\r\n protected readonly navService = inject(NavService);\r\n protected readonly utilityService = inject(UtilityService);\r\n\r\n /**\r\n * Id for automatic scrolling to.\r\n */\r\n @Input() id: string | null = null;\r\n\r\n /**\r\n * Icon to display next to item. ie) 'fa-home'\r\n */\r\n @Input() icon: string = '';\r\n @Input() imageUrl: string | null = '';\r\n /**\r\n * Removes all the space around the icon area\r\n */\r\n @Input() noIcon: boolean = false;\r\n /**\r\n * Text for the item\r\n */\r\n @Input() title: string = '';\r\n\r\n /**\r\n * If a link should be generated when clicked. By default (undefined), no link will be generated\r\n */\r\n @Input() link: string | undefined;\r\n /**\r\n * If external, link will be used as full href and rel will be applied\r\n */\r\n @Input() external: boolean = false;\r\n /**\r\n * If using a link, then you can pass optional queryParameters\r\n */\r\n @Input() queryParams: any | undefined = undefined;\r\n /**\r\n * If using a lin, then you can pass optional fragment to append to the end\r\n */\r\n @Input() fragment: string | undefined = undefined;\r\n /**\r\n * Optional count to pass in that will show as a red badge on the side, indicating some action needs to be taken\r\n */\r\n @Input() badgeCount: number | null = -1;\r\n\r\n\r\n @Input() comparisonMethod: 'startsWith' | 'equals' = 'equals';\r\n\r\n\r\n\r\n highlighted = false;\r\n\r\n constructor() {\r\n this.router.events\r\n .pipe(\r\n filter(event => event instanceof NavigationEnd),\r\n takeUntilDestroyed(this.destroyRef),\r\n map(evt => evt as NavigationEnd),\r\n tap((evt: NavigationEnd) => this.triggerHighlightCheck(evt.url)),\r\n tap(_ => this.collapseNavIfApplicable())\r\n ).subscribe();\r\n }\r\n\r\n ngOnInit(): void {\r\n setTimeout(() => {\r\n this.triggerHighlightCheck(this.router.url);\r\n }, 100);\r\n }\r\n\r\n triggerHighlightCheck(routeUrl: string) {\r\n const [url, queryParams] = routeUrl.split('?');\r\n const [page, fragment = ''] = url.split('#');\r\n\r\n this.updateHighlight(page, queryParams, url.includes('#') ? fragment : undefined);\r\n }\r\n\r\n\r\n updateHighlight(page: string, queryParams?: string, fragment?: string) {\r\n if (this.link === undefined) {\r\n this.highlighted = false;\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n\r\n if (!page.endsWith('/') && !queryParams && this.fragment === undefined && queryParams === undefined) {\r\n page = page + '/';\r\n }\r\n\r\n let fragmentEqual = false;\r\n if (fragment === this.fragment) {\r\n fragmentEqual = true;\r\n }\r\n if (this.fragment === '' && fragment === undefined) { // This is the case where we load a fragment of nothing and browser removes the #\r\n fragmentEqual = true;\r\n }\r\n\r\n const queryParamsEqual = this.queryParams === queryParams;\r\n\r\n if (this.comparisonMethod === 'equals' && page === this.link && fragmentEqual && queryParamsEqual) {\r\n this.highlighted = true;\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n\r\n if (this.comparisonMethod === 'startsWith' && page.startsWith(this.link)) {\r\n if (queryParams && queryParams === this.queryParams && fragmentEqual) {\r\n this.highlighted = true;\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n\r\n this.highlighted = true;\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n\r\n this.highlighted = false;\r\n this.cdRef.markForCheck();\r\n }\r\n\r\n openLink() {\r\n this.collapseNavIfApplicable();\r\n\r\n if (Object.keys(this.queryParams).length !== 0) {\r\n this.router.navigateByUrl(this.link + '?' + this.queryParams);\r\n return;\r\n } else if (this.fragment) {\r\n this.router.navigateByUrl(this.link + '#' + this.fragment);\r\n return;\r\n }\r\n\r\n this.router.navigateByUrl(this.link!);\r\n }\r\n\r\n // If on mobile, automatically collapse the side nav after making a selection\r\n collapseNavIfApplicable() {\r\n if (this.utilityService.getActiveBreakpoint() < Breakpoint.Tablet) {\r\n this.navService.collapseSideNav(true);\r\n }\r\n }\r\n\r\n}\r\n", "@if (link === undefined || link.length === 0) {\r\n
\r\n \r\n
\r\n} @else {\r\n @if (external) {\r\n \r\n \r\n \r\n } @else {\r\n @if (queryParams && queryParams !== {}) {\r\n \r\n \r\n \r\n } @else if (fragment) {\r\n \r\n \r\n \r\n } @else {\r\n \r\n \r\n \r\n }\r\n }\r\n}\r\n\r\n\r\n
\r\n @if (!noIcon) {\r\n \r\n
\r\n @if (imageUrl !== null && imageUrl !== '') {\r\n \r\n } @else {\r\n \r\n }\r\n
\r\n
\r\n }\r\n\r\n \r\n
\r\n {{title}}\r\n @if (badgeCount && badgeCount > 0) {\r\n {{badgeCount}}\r\n }\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n", "import { Pipe, PipeTransform } from '@angular/core';\r\nimport {SettingsTabId} from \"../sidenav/preference-nav/preference-nav.component\";\r\nimport {translate} from \"@jsverse/transloco\";\r\n\r\n/**\r\n * Translates the fragment for Settings to a User title\r\n */\r\n@Pipe({\r\n name: 'settingFragment',\r\n standalone: true\r\n})\r\nexport class SettingFragmentPipe implements PipeTransform {\r\n\r\n transform(tabID: SettingsTabId | string): string {\r\n return translate('settings.' + tabID);\r\n }\r\n}\r\n", "import {AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, inject} from '@angular/core';\r\nimport {TranslocoDirective} from \"@jsverse/transloco\";\r\nimport {AsyncPipe, DOCUMENT, NgClass} from \"@angular/common\";\r\nimport {NavService} from \"../../_services/nav.service\";\r\nimport {AccountService, Role} from \"../../_services/account.service\";\r\nimport {SideNavItemComponent} from \"../_components/side-nav-item/side-nav-item.component\";\r\nimport {ActivatedRoute, NavigationEnd, Router} from \"@angular/router\";\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {SettingFragmentPipe} from \"../../_pipes/setting-fragment.pipe\";\r\nimport {map, Observable, of, shareReplay, switchMap, take, tap} from \"rxjs\";\r\nimport {ServerService} from \"../../_services/server.service\";\r\nimport {ScrobblingService} from \"../../_services/scrobbling.service\";\r\nimport {User} from \"../../_models/user\";\r\nimport {filter} from \"rxjs/operators\";\r\nimport {Breakpoint, UtilityService} from \"../../shared/_services/utility.service\";\r\nimport {LicenseService} from \"../../_services/license.service\";\r\nimport {ManageService} from \"../../_services/manage.service\";\r\nimport {MatchStateOption} from \"../../_models/kavitaplus/match-state-option\";\r\n\r\nexport enum SettingsTabId {\r\n\r\n // Admin\r\n General = 'admin-general',\r\n Email = 'admin-email',\r\n Media = 'admin-media',\r\n Users = 'admin-users',\r\n Libraries = 'admin-libraries',\r\n System = 'admin-system',\r\n Tasks = 'admin-tasks',\r\n Statistics = 'admin-statistics',\r\n MediaIssues = 'admin-media-issues',\r\n EmailHistory = 'admin-email-history',\r\n\r\n // Kavita+\r\n KavitaPlusLicense = 'admin-kavitaplus',\r\n MALStackImport = 'mal-stack-import',\r\n MatchedMetadata = 'admin-matched-metadata',\r\n ManageUserTokens = 'admin-manage-tokens',\r\n Metadata = 'admin-metadata',\r\n\r\n // Non-Admin\r\n Account = 'account',\r\n Preferences = 'preferences',\r\n Clients = 'clients',\r\n Theme = 'theme',\r\n Devices = 'devices',\r\n UserStats = 'user-stats',\r\n Scrobbling = 'scrobbling',\r\n ScrobblingHolds = 'scrobble-holds',\r\n Customize = 'customize',\r\n CBLImport = 'cbl-import'\r\n}\r\n\r\ninterface PrefSection {\r\n title: string;\r\n children: SideNavItem[];\r\n}\r\n\r\nclass SideNavItem {\r\n fragment: SettingsTabId;\r\n roles: Array = [];\r\n /**\r\n * If you have any of these, the item will be restricted\r\n */\r\n restrictRoles: Array = [];\r\n badgeCount$?: Observable | undefined;\r\n\r\n constructor(fragment: SettingsTabId, roles: Array = [], badgeCount$: Observable | undefined = undefined, restrictRoles: Array = []) {\r\n this.fragment = fragment;\r\n this.roles = roles;\r\n this.restrictRoles = restrictRoles;\r\n this.badgeCount$ = badgeCount$;\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'app-preference-nav',\r\n standalone: true,\r\n imports: [\r\n TranslocoDirective,\r\n NgClass,\r\n AsyncPipe,\r\n SideNavItemComponent,\r\n SettingFragmentPipe\r\n ],\r\n templateUrl: './preference-nav.component.html',\r\n styleUrl: './preference-nav.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PreferenceNavComponent implements AfterViewInit {\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n protected readonly navService = inject(NavService);\r\n protected readonly accountService = inject(AccountService);\r\n protected readonly licenseService = inject(LicenseService);\r\n protected readonly cdRef = inject(ChangeDetectorRef);\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly serverService = inject(ServerService);\r\n private readonly scrobbleService = inject(ScrobblingService);\r\n private readonly router = inject(Router);\r\n protected readonly utilityService = inject(UtilityService);\r\n private readonly manageService = inject(ManageService);\r\n private readonly document = inject(DOCUMENT);\r\n\r\n hasActiveLicense = false;\r\n /**\r\n * This links to settings.component.html which has triggers on what underlying component to render out.\r\n */\r\n sections: Array = [\r\n {\r\n title: 'account-section-title',\r\n children: [\r\n new SideNavItem(SettingsTabId.Account, []),\r\n new SideNavItem(SettingsTabId.Preferences),\r\n new SideNavItem(SettingsTabId.Customize, [], undefined, [Role.ReadOnly]),\r\n new SideNavItem(SettingsTabId.Clients),\r\n new SideNavItem(SettingsTabId.Theme),\r\n new SideNavItem(SettingsTabId.Devices),\r\n new SideNavItem(SettingsTabId.UserStats),\r\n ]\r\n },\r\n {\r\n title: 'server-section-title',\r\n children: [\r\n new SideNavItem(SettingsTabId.General, [Role.Admin]),\r\n new SideNavItem(SettingsTabId.Media, [Role.Admin]),\r\n new SideNavItem(SettingsTabId.Email, [Role.Admin]),\r\n new SideNavItem(SettingsTabId.Users, [Role.Admin]),\r\n new SideNavItem(SettingsTabId.Libraries, [Role.Admin]),\r\n new SideNavItem(SettingsTabId.Tasks, [Role.Admin]),\r\n ]\r\n },\r\n {\r\n title: 'import-section-title',\r\n children: [\r\n new SideNavItem(SettingsTabId.CBLImport, [], undefined, [Role.ReadOnly]),\r\n ]\r\n },\r\n {\r\n title: 'info-section-title',\r\n children: [\r\n new SideNavItem(SettingsTabId.System, [Role.Admin]),\r\n new SideNavItem(SettingsTabId.Statistics, [Role.Admin]),\r\n new SideNavItem(SettingsTabId.MediaIssues, [Role.Admin],\r\n this.accountService.currentUser$.pipe(\r\n take(1),\r\n switchMap(user => {\r\n if (!user || !this.accountService.hasAdminRole(user)) {\r\n // If no user or user does not have the admin role, return an observable of -1\r\n return of(-1);\r\n } else {\r\n return this.serverService.getMediaErrors().pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map(d => d.length),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n }\r\n })\r\n )),\r\n new SideNavItem(SettingsTabId.EmailHistory, [Role.Admin]),\r\n ]\r\n },\r\n {\r\n title: 'kavitaplus-section-title',\r\n children: [\r\n new SideNavItem(SettingsTabId.KavitaPlusLicense, [Role.Admin])\r\n // All other sections added dynamically\r\n ]\r\n }\r\n ];\r\n collapseSideNavOnMobileNav$ = this.router.events.pipe(\r\n filter(event => event instanceof NavigationEnd),\r\n takeUntilDestroyed(this.destroyRef),\r\n map(evt => evt as NavigationEnd),\r\n switchMap(_ => this.utilityService.activeBreakpoint$),\r\n filter((b) => b < Breakpoint.Tablet),\r\n switchMap(() => this.navService.sideNavCollapsed$),\r\n take(1),\r\n filter(collapsed => !collapsed),\r\n tap(c => {\r\n this.navService.collapseSideNav(true);\r\n }),\r\n );\r\n\r\n private readonly matchedMetadataBadgeCount$ = this.accountService.currentUser$.pipe(\r\n take(1),\r\n switchMap(user => {\r\n if (!user || !this.accountService.hasAdminRole(user)) {\r\n // If no user or user does not have the admin role, return an observable of -1\r\n return of(-1);\r\n } else {\r\n return this.manageService.getAllKavitaPlusSeries({\r\n matchStateOption: MatchStateOption.Error,\r\n searchTerm: ''\r\n }).pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map(d => d.length),\r\n shareReplay({bufferSize: 1, refCount: true})\r\n );\r\n }\r\n })\r\n );\r\n\r\n private readonly scrobblingErrorBadgeCount$ = this.accountService.currentUser$.pipe(\r\n take(1),\r\n switchMap(user => {\r\n if (!user || !this.accountService.hasAdminRole(user)) {\r\n // If no user or user does not have the admin role, return an observable of -1\r\n return of(-1);\r\n } else {\r\n return this.scrobbleService.getScrobbleErrors().pipe(\r\n takeUntilDestroyed(this.destroyRef),\r\n map(d => d.length),\r\n shareReplay({bufferSize: 1, refCount: true})\r\n );\r\n }\r\n })\r\n );\r\n\r\n constructor() {\r\n this.collapseSideNavOnMobileNav$.subscribe();\r\n\r\n // Ensure that on mobile, we are collapsed by default\r\n if (this.utilityService.getActiveBreakpoint() < Breakpoint.Tablet) {\r\n this.navService.collapseSideNav(true);\r\n }\r\n\r\n this.licenseService.hasValidLicense$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(res => {\r\n this.hasActiveLicense = res;\r\n if (res) {\r\n const kavitaPlusSection = this.sections[4];\r\n if (kavitaPlusSection.children.length === 1) {\r\n kavitaPlusSection.children.push(new SideNavItem(SettingsTabId.ManageUserTokens, [Role.Admin]));\r\n kavitaPlusSection.children.push(new SideNavItem(SettingsTabId.Metadata, [Role.Admin]));\r\n\r\n // Keep all setting type of screens above this line\r\n kavitaPlusSection.children.push(new SideNavItem(SettingsTabId.MatchedMetadata, [Role.Admin],\r\n this.matchedMetadataBadgeCount$\r\n ));\r\n\r\n // Scrobbling History needs to be per-user and allow admin to view all\r\n kavitaPlusSection.children.push(new SideNavItem(SettingsTabId.ScrobblingHolds, []));\r\n kavitaPlusSection.children.push(new SideNavItem(SettingsTabId.Scrobbling, [], this.scrobblingErrorBadgeCount$)\r\n );\r\n }\r\n\r\n if (this.sections[2].children.length === 1) {\r\n this.sections[2].children.push(new SideNavItem(SettingsTabId.MALStackImport, []));\r\n }\r\n\r\n this.scrollToActiveItem();\r\n this.cdRef.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.scrollToActiveItem();\r\n }\r\n\r\n scrollToActiveItem() {\r\n const activeFragment = this.route.snapshot.fragment;\r\n if (activeFragment) {\r\n const element = this.document.getElementById('nav-item-' + activeFragment);\r\n if (element) {\r\n element.scrollIntoView({behavior: 'smooth', block: 'center'});\r\n }\r\n }\r\n }\r\n\r\n hasAnyChildren(user: User, section: PrefSection) {\r\n // Filter out items where the user has a restricted role\r\n const visibleItems = section.children.filter(item =>\r\n item.restrictRoles.length === 0 || !this.accountService.hasAnyRole(user, item.restrictRoles)\r\n );\r\n\r\n // Check if the user has any allowed roles in the remaining items\r\n return visibleItems.some(item =>\r\n this.accountService.hasAnyRole(user, item.roles)\r\n );\r\n }\r\n\r\n collapse() {\r\n this.navService.toggleSideNav();\r\n }\r\n\r\n protected readonly Breakpoint = Breakpoint;\r\n}\r\n", "\r\n @if (accountService.currentUser$ | async; as user) {\r\n\r\n @if((navService.sideNavCollapsed$ | async) === false) {\r\n
\r\n
\r\n\r\n @for(section of sections; track section.title + section.children.length; let idx = $index;) {\r\n @if (hasAnyChildren(user, section)) {\r\n
0}\">{{t(section.title)}}
\r\n @for(item of section.children; track item.fragment) {\r\n @if (accountService.hasAnyRole(user, item.roles, item.restrictRoles)) {\r\n \r\n }\r\n }\r\n }\r\n }\r\n\r\n
\r\n
\r\n @if (utilityService.activeBreakpoint$ | async; as breakpoint) {\r\n @if (breakpoint < Breakpoint.Desktop) {\r\n
\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n
\r\n"], "mappings": "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", "names": ["\u0275\u0275elementStart", "\u0275\u0275elementContainer", "\u0275\u0275elementEnd", "\u0275\u0275property", "\u0275\u0275pureFunction2", "_c2", "\u0275\u0275pipeBind1", "ctx_r0", "navService", "sideNavCollapsed$", "highlighted", "\u0275\u0275advance", "inner_r2", "id", "link", "\u0275\u0275sanitizeUrl", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "openLink", "fragment", "queryParams", "\u0275\u0275template", "SideNavItemComponent_Conditional_1_Conditional_1_Conditional_0_Template", "SideNavItemComponent_Conditional_1_Conditional_1_Conditional_1_Template", "SideNavItemComponent_Conditional_1_Conditional_1_Conditional_2_Template", "\u0275\u0275conditional", "\u0275\u0275pureFunction0", "_c3", "SideNavItemComponent_Conditional_1_Conditional_0_Template", "SideNavItemComponent_Conditional_1_Conditional_1_Template", "external", "\u0275\u0275element", "imageUrl", "\u0275\u0275classMapInterpolate1", "icon", "SideNavItemComponent_ng_template_2_Conditional_1_Conditional_2_Template", "SideNavItemComponent_ng_template_2_Conditional_1_Conditional_3_Template", "\u0275\u0275propertyInterpolate", "title", "\u0275\u0275text", "\u0275\u0275textInterpolate", "badgeCount", "SideNavItemComponent_ng_template_2_Conditional_1_Template", "SideNavItemComponent_ng_template_2_Conditional_5_Template", "\u0275\u0275projection", "noIcon", "\u0275\u0275textInterpolate1", "SideNavItemComponent", "constructor", "destroyRef", "inject", "DestroyRef", "router", "Router", "cdRef", "ChangeDetectorRef", "NavService", "utilityService", "UtilityService", "undefined", "comparisonMethod", "events", "pipe", "filter", "event", "NavigationEnd", "takeUntilDestroyed", "map", "evt", "tap", "triggerHighlightCheck", "url", "_", "collapseNavIfApplicable", "subscribe", "ngOnInit", "setTimeout", "routeUrl", "split", "page", "updateHighlight", "includes", "markForCheck", "endsWith", "fragmentEqual", "queryParamsEqual", "startsWith", "Object", "keys", "length", "navigateByUrl", "getActiveBreakpoint", "Breakpoint", "Tablet", "collapseSideNav", "selectors", "inputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "ngContentSelectors", "_c1", "decls", "vars", "consts", "template", "rf", "ctx", "SideNavItemComponent_Conditional_0_Template", "SideNavItemComponent_Conditional_1_Template", "SideNavItemComponent_ng_template_2_Template", "\u0275\u0275templateRefExtractor", "RouterLink", "ImageComponent", "NgTemplateOutlet", "NgClass", "AsyncPipe", "styles", "changeDetection", "SettingFragmentPipe", "transform", "tabID", "translate", "pure", "standalone", "\u0275\u0275element", "\u0275\u0275property", "item_r1", "fragment", "\u0275\u0275pipeBind1", "badgeCount$", "\u0275\u0275template", "PreferenceNavComponent_ng_container_0_Conditional_1_Conditional_0_For_6_Conditional_0_For_3_Conditional_0_Template", "\u0275\u0275conditional", "ctx_r2", "accountService", "hasAnyRole", "user_r2", "roles", "restrictRoles", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275repeaterCreate", "PreferenceNavComponent_ng_container_0_Conditional_1_Conditional_0_For_6_Conditional_0_For_3_Template", "_forTrack1", "\u0275\u0275pureFunction1", "_c1", "\u0275$index_16_r6", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "t_r7", "section_r5", "title", "\u0275\u0275repeater", "children", "PreferenceNavComponent_ng_container_0_Conditional_1_Conditional_0_For_6_Conditional_0_Template", "hasAnyChildren", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r8", "\u0275\u0275nextContext", "\u0275\u0275resetView", "collapse", "_c2", "navService", "sideNavCollapsed$", "PreferenceNavComponent_ng_container_0_Conditional_1_Conditional_0_Conditional_7_Conditional_0_Template", "ctx", "Breakpoint", "Desktop", "PreferenceNavComponent_ng_container_0_Conditional_1_Conditional_0_For_6_Template", "_forTrack0", "PreferenceNavComponent_ng_container_0_Conditional_1_Conditional_0_Conditional_7_Template", "\u0275\u0275pureFunction3", "_c0", "sideNavVisibility$", "licenseService", "hasValidLicense$", "sections", "tmp_7_0", "utilityService", "activeBreakpoint$", "PreferenceNavComponent_ng_container_0_Conditional_1_Conditional_0_Template", "\u0275\u0275elementContainerStart", "PreferenceNavComponent_ng_container_0_Conditional_1_Template", "tmp_2_0", "currentUser$", "SettingsTabId", "SideNavItem", "constructor", "undefined", "PreferenceNavComponent", "destroyRef", "inject", "DestroyRef", "NavService", "AccountService", "LicenseService", "cdRef", "ChangeDetectorRef", "route", "ActivatedRoute", "serverService", "ServerService", "scrobbleService", "ScrobblingService", "router", "Router", "UtilityService", "manageService", "ManageService", "document", "DOCUMENT", "hasActiveLicense", "Account", "Preferences", "Customize", "Role", "ReadOnly", "Clients", "Theme", "Devices", "UserStats", "General", "Admin", "Media", "Email", "Users", "Libraries", "Tasks", "CBLImport", "System", "Statistics", "MediaIssues", "pipe", "take", "switchMap", "user", "hasAdminRole", "of", "getMediaErrors", "takeUntilDestroyed", "map", "d", "length", "shareReplay", "bufferSize", "refCount", "EmailHistory", "KavitaPlusLicense", "collapseSideNavOnMobileNav$", "events", "filter", "event", "NavigationEnd", "evt", "_", "b", "Tablet", "collapsed", "tap", "c", "collapseSideNav", "matchedMetadataBadgeCount$", "getAllKavitaPlusSeries", "matchStateOption", "MatchStateOption", "Error", "searchTerm", "scrobblingErrorBadgeCount$", "getScrobbleErrors", "subscribe", "getActiveBreakpoint", "res", "kavitaPlusSection", "push", "ManageUserTokens", "Metadata", "MatchedMetadata", "ScrobblingHolds", "Scrobbling", "MALStackImport", "scrollToActiveItem", "markForCheck", "ngAfterViewInit", "activeFragment", "snapshot", "element", "getElementById", "scrollIntoView", "behavior", "block", "section", "item", "some", "toggleSideNav", "selectors", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "PreferenceNavComponent_ng_container_0_Template", "TranslocoDirective", "NgClass", "AsyncPipe", "SideNavItemComponent", "SettingFragmentPipe", "styles", "changeDetection"] }