feat(workspace): implement workspace shell and sources filters panel

- Added WorkspaceShellComponent to manage the main workspace layout and navigation.
- Introduced WorkspaceSourcesFiltersPanelComponent for filtering and sorting playlists.
- Created WorkspaceSourcesComponent to display playlists with search functionality.
- Implemented HTML and SCSS for the new components to ensure proper styling and layout.
- Updated typings to include new database method for fetching global favorites.
This commit is contained in:
4gray committed 2026-02-24 19:11:04 +01:00
1 parent 349fbcea47
commit 27bcc9d059
20 files changed
+3282

No files matched your search

@@ -0,0 +1,55 @@
<div class="context-column">
<header class="context-header">
<div class="context-header__top">
<h2>{{ title() }}</h2>
@if (isXtreamCategories()) {
<button
mat-icon-button
[matTooltip]="'Manage categories'"
aria-label="Manage categories"
(click)="openXtreamCategoryManagement()"
>
<mat-icon>tune</mat-icon>
</button>
}
</div>
@if (subtitle(); as text) {
<span class="context-header__badge">{{ text }}</span>
}
</header>
<div class="context-divider"></div>
@if (isXtreamCategories()) {
<app-category-view
[items]="xtreamCategories()"
[selectedCategoryId]="xtreamSelectedCategoryId()"
[itemCounts]="xtreamCategoryItemCounts()"
[showCounts]="true"
(categoryClicked)="onXtreamCategoryClicked($event)"
/>
} @else if (isStalkerCategories()) {
@if (isStalkerCategoryLoading()) {
<ngx-skeleton-loader
count="18"
[theme]="{
width: '95%',
height: '36px',
borderRadius: '8px',
}"
/>
} @else if (isStalkerCategoryFailed()) {
<app-playlist-error-view
[title]="'Unable to load categories'"
[description]="'Please retry or verify portal settings.'"
[showActionButtons]="false"
/>
} @else {
<app-category-view
[items]="stalkerCategories()"
[selectedCategoryId]="$any(stalkerSelectedCategoryId())"
(categoryClicked)="onStalkerCategoryClicked($any($event))"
/>
}
}
</div>