* When downloading bookmarks, prepend the images with chapterId to ensure there are no conflicts. * Fixed a case where email service wasn't using the custom email service. * Changed how we render some text in search results * Update the recently when we receive scan events
127 lines
No EOL
6 KiB
HTML
127 lines
No EOL
6 KiB
HTML
<nav class="navbar navbar-expand-md navbar-dark fixed-top" *ngIf="navService?.navbarVisible$ | async">
|
|
<div class="container-fluid">
|
|
<a class="sr-only sr-only-focusable focus-visible" href="javascript:void(0);" (click)="moveFocus()">Skip to main content</a>
|
|
<a class="navbar-brand dark-exempt" routerLink="/library" routerLinkActive="active"><img class="logo" src="../../assets/images/logo.png" alt="kavita icon" aria-hidden="true"/><span class="phone-hidden"> Kavita</span></a>
|
|
<ul class="navbar-nav col mr-auto">
|
|
|
|
<div class="nav-item" *ngIf="(accountService.currentUser$ | async) as user">
|
|
<div>
|
|
<fieldset class="form-inline">
|
|
<div class="form-group" style="margin-bottom: 0px;">
|
|
<label for="nav-search" class="sr-only">Search series</label>
|
|
<div class="ng-autocomplete">
|
|
<app-grouped-typeahead
|
|
#search
|
|
id="nav-search"
|
|
[minQueryLength]="2"
|
|
initialValue=""
|
|
placeholder="Search…"
|
|
[grouppedData]="searchResults"
|
|
(inputChanged)="onChangeSearch($event)"
|
|
(clearField)="clearSearch()"
|
|
(focusChanged)="focusUpdate($event)"
|
|
>
|
|
|
|
<ng-template #seriesTemplate let-item>
|
|
<div style="display: flex;padding: 5px;" (click)="clickSeriesSearchResult(item)">
|
|
<div style="width: 24px" class="mr-1">
|
|
<app-image class="mr-3 search-result" width="24px" [imageUrl]="imageService.getSeriesCoverImage(item.seriesId)"></app-image>
|
|
</div>
|
|
<div class="ml-1">
|
|
<app-series-format [format]="item.format"></app-series-format>
|
|
<span *ngIf="item.name.toLowerCase().trim().indexOf(searchTerm) >= 0; else localizedName">{{item.name}}</span>
|
|
<ng-template #localizedName>
|
|
<span [innerHTML]="item.localizedName"></span>
|
|
</ng-template>
|
|
<span class="form-text" style="font-size: 0.8rem;">in {{item.libraryName}}</span>
|
|
</div>
|
|
</div>
|
|
</ng-template>
|
|
|
|
<ng-template #collectionTemplate let-item>
|
|
<div style="display: flex;padding: 5px;" (click)="clickCollectionSearchResult(item)">
|
|
<div style="width: 24px" class="mr-1">
|
|
<app-image class="mr-3 search-result" width="24px" [imageUrl]="imageService.getCollectionCoverImage(item.id)"></app-image>
|
|
</div>
|
|
<div class="ml-1">
|
|
<span *ngIf="item.title.toLowerCase().trim().indexOf(searchTerm) >= 0">{{item.title}}</span>
|
|
<span *ngIf="item.promoted">
|
|
<i class="fa fa-angle-double-up" aria-hidden="true" title="Promoted"></i>
|
|
<span class="sr-only">(promoted)</span>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</ng-template>
|
|
|
|
<ng-template #tagTemplate let-item>
|
|
<div style="display: flex;padding: 5px;" (click)="goTo('tags', item.id)">
|
|
<div class="ml-1">
|
|
<span *ngIf="item.title.toLowerCase().trim().indexOf(searchTerm) >= 0">{{item.title}}</span>
|
|
</div>
|
|
</div>
|
|
</ng-template>
|
|
|
|
<ng-template #personTemplate let-item>
|
|
<div style="display: flex;padding: 5px;" class="clickable" (click)="goToPerson(item.role, item.id)">
|
|
<div class="ml-1">
|
|
|
|
<div [innerHTML]="item.name"></div>
|
|
<div>{{item.role | personRole}}</div>
|
|
</div>
|
|
</div>
|
|
</ng-template>
|
|
|
|
<ng-template #genreTemplate let-item>
|
|
<div style="display: flex;padding: 5px;" class="clickable" (click)="goTo('genres', item.id)">
|
|
<div class="ml-1">
|
|
<div [innerHTML]="item.title"></div>
|
|
</div>
|
|
</div>
|
|
</ng-template>
|
|
|
|
<ng-template #noResultsTemplate let-notFound>
|
|
No results found
|
|
</ng-template>
|
|
|
|
</app-grouped-typeahead>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</div>
|
|
</div>
|
|
</ul>
|
|
|
|
<ng-container *ngIf="!searchFocused">
|
|
<div class="back-to-top">
|
|
<button class="btn btn-icon scroll-to-top" (click)="scrollToTop()" *ngIf="backToTopNeeded">
|
|
<i class="fa fa-angle-double-up" style="color: white" aria-hidden="true"></i>
|
|
<span class="sr-only">Scroll to Top</span>
|
|
</button>
|
|
</div>
|
|
|
|
<ng-container *ngIf="(accountService.currentUser$ | async) as user">
|
|
<div class="nav-item">
|
|
<app-nav-events-toggle [user]="user"></app-nav-events-toggle>
|
|
</div>
|
|
<div class="nav-item pr-2">
|
|
<a routerLink="/admin/dashboard" *ngIf="user.roles.includes('Admin')" class="dark-exempt btn btn-icon">
|
|
<i class="fa fa-cogs" aria-hidden="true" style="color: white"></i>
|
|
<span class="sr-only">Server Settings</span>
|
|
</a>
|
|
</div>
|
|
|
|
|
|
<div ngbDropdown class="nav-item dropdown" display="dynamic" placement="bottom-right" *ngIf="(accountService.currentUser$ | async) as user" dropdown>
|
|
<button class="btn btn-outline-secondary primary-text" ngbDropdownToggle>
|
|
{{user.username | sentenceCase}}
|
|
</button>
|
|
<div ngbDropdownMenu>
|
|
<a ngbDropdownItem routerLink="/preferences/">Settings</a>
|
|
<a ngbDropdownItem (click)="logout()">Logout</a>
|
|
</div>
|
|
</div>
|
|
</ng-container>
|
|
</ng-container>
|
|
</div>
|
|
</nav>
|
|
|