-
+
+ -
+
-

{{ 'Play List' | translate }}

- ({{ folders?.length || 0 }}) +
+

{{ 'Play List' | translate }}

+ ({{ folders?.length || 0 }}) +
+
+ +
diff --git a/src/app/elements/replay/parts/parts.component.scss b/src/app/elements/replay/parts/parts.component.scss index bc7ae3080..c37c1cd15 100644 --- a/src/app/elements/replay/parts/parts.component.scss +++ b/src/app/elements/replay/parts/parts.component.scss @@ -76,17 +76,55 @@ max-height: 100%; overflow: hidden; } + + .show-playlist-btn { + position: absolute; + top: 12px; + right: 12px; + z-index: 10; + background: var(--el-org-bg-color); + border: 1px solid var(--el-border-color-x); + color: var(--el-text-color-light); + padding: 8px 12px; + border-radius: 4px; + cursor: pointer; + font-size: 12px; + display: none; + + &:hover { + background: var(--el-dropdown-hover-bg-color); + } + + i { + margin-right: 4px; + } + } + + &.playlist-hidden .show-playlist-btn { + display: block; + } } .playlist-area { width: var(--playlist-width); min-width: var(--playlist-min-width); - max-width: var(--playlist-width); + max-width: 400px; background: var(--el-asset-tree-bg-color); border-left: 1px solid var(--el-border-color-x); display: flex; flex-direction: column; flex-shrink: 0; + resize: horizontal; + overflow: hidden; + transition: width 0.3s ease, min-width 0.3s ease; + + &.collapsed { + width: 0; + min-width: 0; + max-width: 0; + resize: none; + border-left: none; + } .playlist-header { display: flex; @@ -96,16 +134,45 @@ background: var(--el-org-bg-color); border-bottom: 1px solid var(--el-border-color-x); - h3 { - margin: 0; - font-size: 14px; - font-weight: 500; - color: #ffffff; + .playlist-title { + display: flex; + align-items: center; + gap: 8px; + + h3 { + margin: 0; + font-size: 14px; + font-weight: 500; + color: #ffffff; + } + + .count { + font-size: 12px; + color: rgba(255, 255, 255, 0.6); + } } - .count { - font-size: 12px; - color: rgba(255, 255, 255, 0.6); + .playlist-actions { + display: flex; + align-items: center; + gap: 8px; + + .toggle-btn { + background: transparent; + border: none; + color: var(--el-text-color-light); + cursor: pointer; + padding: 4px; + border-radius: 3px; + + &:hover { + background: var(--el-dropdown-hover-bg-color); + } + + i { + font-size: 12px; + } + } } } @@ -232,6 +299,19 @@ @media (min-width: 1200px) { --playlist-width: 350px; --playlist-min-width: 350px; + + .main-content .playlist-area { + max-width: 500px; + } + } + + @media (min-width: 1600px) { + --playlist-width: 400px; + --playlist-min-width: 400px; + + .main-content .playlist-area { + max-width: 600px; + } } @media (max-width: 480px) { diff --git a/src/app/elements/replay/parts/parts.component.ts b/src/app/elements/replay/parts/parts.component.ts index 53ee2ad23..01aa4a448 100644 --- a/src/app/elements/replay/parts/parts.component.ts +++ b/src/app/elements/replay/parts/parts.component.ts @@ -38,6 +38,7 @@ export class ElementsPartsComponent implements OnInit { alertShown = true; videoLoading = false; + playlistCollapsed = false; @HostListener('window:resize', ['$event']) onResize(event) { @@ -268,10 +269,14 @@ export class ElementsPartsComponent implements OnInit { let lang = this.getUserLang(); if (lang === 'zh-hans') { - lang = 'zh-CN' + lang = 'zh-CN'; } const date_s = d.toLocaleString(lang, { hour12: false }); return date_s.split('/').join('-'); } + + togglePlaylist() { + this.playlistCollapsed = !this.playlistCollapsed; + } } diff --git a/src/app/router.module.ts b/src/app/router.module.ts index 2436574da..d0b6aea7d 100644 --- a/src/app/router.module.ts +++ b/src/app/router.module.ts @@ -4,6 +4,7 @@ import { RouterModule, Routes } from '@angular/router'; import { PageMainComponent } from './pages/main/main.component'; import { PagesBlankComponent } from './pages/blank/blank.component'; import { PagesShareComponent } from './pages/share/share.component'; +import { PagesReplayComponent } from './pages/replay/replay.component'; const appRoutes: Routes = [ { path: '', component: PageMainComponent }, @@ -20,7 +21,7 @@ const appRoutes: Routes = [ { path: 'share/:id', component: PagesShareComponent }, { path: 'replay/:sid', - loadComponent: () => import('./pages/replay/replay.component').then(m => m.PagesReplayComponent) + component: PagesReplayComponent }, { path: 'admin-connect',