Files
iptvnator/apps/web/src/app/stalker/stalker-main-container.component.html
T
4gray d603c46a5a feat: implement stalker live stream layout with EPG support
- Added new component for live stream layout with sidebar and content area.
- Integrated playlist switcher and category view for better navigation.
- Implemented channel list with loading indicators and favorite functionality.
- Added EPG (Electronic Program Guide) support for channels with loading and pagination.
- Enhanced styles for responsive design and improved user experience.
- Updated routing to use the new live stream layout component.
- Modified stalker store to handle EPG fetching and search functionality.
- Introduced new actions in the StalkerPortalActions enum for EPG operations.
2026-02-08 19:19:15 +01:00

67 lines
1.7 KiB
HTML

<div
class="sidebar"
appResizable
[minWidth]="250"
[maxWidth]="600"
[defaultWidth]="400"
storageKey="sidebar-width"
>
<div class="sidebar-header">
<app-playlist-switcher
class="switcher"
[currentTitle]="currentPlaylist()?.title || 'Portal'"
[subtitle]="'Stalker Portal'"
/>
</div>
@if (isCategoryLoading()) {
<ngx-skeleton-loader
count="20"
[theme]="{
width: '95%',
height: '48px',
borderRadius: '40px',
}"
/>
} @else if (isCategoryFailed()) {
<app-playlist-error-view
[title]="'PORTALS.ERROR_VIEW.UNKNOWN_ERROR.TITLE' | translate"
[description]="
'PORTALS.ERROR_VIEW.UNKNOWN_ERROR.DESCRIPTION' | translate
"
/>
} @else {
<app-category-view
[items]="categories()"
[selectedCategoryId]="$any(stalkerStore.selectedCategoryId())"
(categoryClicked)="categoryClicked($event)"
/>
}
</div>
<div class="main-content">
@if (!stalkerStore.selectedItem()) {
<div class="content-header">
<h2>
<button mat-icon-button disabled>
<mat-icon>category</mat-icon>
</button>
{{ getContentLabel() }}
@if (!contentItems() && !isContentLoading()) {
<h2>
{{ 'PORTALS.SELECT_CATEGORY' | translate }}
</h2>
}
</h2>
</div>
}
<div
class="scrollable-content"
[class.no-header]="stalkerStore.selectedItem()"
>
<router-outlet />
</div>
</div>