Files
iptvnator/apps/web/src/app/xtream-electron/recently-viewed/recently-viewed.component.html
T
4gray fd2f5972b0 feat: refactor xtream-electron related views
- Updated the HTML structure for better organization and readability.
- Enhanced the filtering and searching capabilities for recently viewed items.
- Introduced a new VodDetails component for displaying detailed information about VOD items.
- Implemented workspace layout handling in the main container and navigation components.
- Improved styling for various states in the season container.
- Added support for inline search input in the search results component.
- Refactored the Xtream shell component to conditionally render navigation based on layout.
- Updated styles to use CSS variables for consistency across components.
2026-02-24 19:13:25 +01:00

140 lines
5.9 KiB
HTML

@if (isGlobal) {
<div class="recent-container">
<div class="header">
<h2>Recently Viewed</h2>
<div class="header-actions">
@if (recentItems()?.length) {
<button mat-button color="warn" (click)="clearHistory()">
<mat-icon>delete</mat-icon>
Clear History
</button>
}
<button mat-icon-button (click)="dialogRef.close()">
<mat-icon>close</mat-icon>
</button>
</div>
</div>
@if (recentItems()?.length) {
<div class="recent-search">
<mat-icon>search</mat-icon>
<input
#recentSearchInput
type="search"
spellcheck="false"
autocomplete="off"
[value]="recentSearchTerm()"
placeholder="Search only in recently watched items"
(input)="updateRecentSearchTerm(recentSearchInput.value)"
/>
</div>
<div class="global-recent-subheader">
<div class="global-recent-subheader-left">
<div class="global-recent-note">
<mat-icon>info_outline</mat-icon>
<span>Includes Xtream and Stalker items</span>
</div>
<div class="global-recent-filters">
<mat-checkbox
[ngModel]="typeFilters().live"
(ngModelChange)="toggleTypeFilter('live', $event)"
>
Live
</mat-checkbox>
<mat-checkbox
[ngModel]="typeFilters().movie"
(ngModelChange)="toggleTypeFilter('movie', $event)"
>
Movies
</mat-checkbox>
<mat-checkbox
[ngModel]="typeFilters().series"
(ngModelChange)="toggleTypeFilter('series', $event)"
>
Series
</mat-checkbox>
</div>
</div>
<mat-checkbox
[ngModel]="groupByPlaylist()"
(ngModelChange)="toggleGroupByPlaylist($event)"
>
Group by playlist
</mat-checkbox>
</div>
@if (groupByPlaylist()) {
<div class="playlist-section">
<h2 class="section-title">
Found {{ visibleRecentItems().length }} items across
{{ (getGroupedItems() | keyvalue).length }} playlists
</h2>
@for (group of getGroupedItems() | keyvalue; track group.key) {
<div class="playlist-group">
<h3 class="playlist-title">
<mat-icon>playlist_play</mat-icon>
{{ group.key }}
<span class="item-count"
>({{ $any(group).value.length }} items)</span
>
</h3>
<div class="items-grid">
@for (item of $any(group).value; track item.id) {
<app-content-card
[posterUrl]="item.poster_url"
[title]="item.title"
[type]="item.type"
[date]="item.viewed_at"
[showRemoveButton]="true"
[removeTooltip]="'Remove from history'"
(cardClick)="openItem(item)"
(remove)="onRemoveItem(item)"
/>
}
</div>
</div>
}
</div>
} @else {
<div class="items-grid">
@for (item of visibleRecentItems(); track item.id) {
<app-content-card
[posterUrl]="item.poster_url"
[title]="item.title"
[type]="item.type"
[date]="item.viewed_at"
[showRemoveButton]="true"
[removeTooltip]="'Remove from history'"
(cardClick)="openItem(item)"
(remove)="onRemoveItem(item)"
/>
}
</div>
}
} @else {
<div class="no-items">
<mat-icon>history</mat-icon>
<p>No recently viewed items</p>
</div>
}
</div>
} @else {
<app-favorites-layout
[categories]="categories()"
[favorites]="nonGlobalItemsToShow()"
[playlistSubtitle]="'Xtream Code'"
[playlistTitle]="currentPlaylist()?.name || currentPlaylist()?.title || 'Playlist'"
[selectedCategoryId]="selectedCategoryId()"
[titleTranslationString]="'PORTALS.SIDEBAR.RECENT'"
[removeTooltip]="'Remove from history'"
[emptyIcon]="'history'"
[showHeaderAction]="!isWorkspaceLayout"
[headerActionIcon]="'delete_sweep'"
[headerActionTooltip]="'Clear history'"
(categoryClicked)="setCategoryId($event.category_id)"
(removeFavorite)="onRemoveItem($event)"
(headerActionClicked)="clearHistory()"
(openItem)="openItem($event)"
/>
}