diff --git a/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.html b/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.html index f616873..6787eaf 100644 --- a/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.html +++ b/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.html @@ -1,10 +1,18 @@ - -@if (loading) { -
- - Loading recordings... +@if (!loading && recordings.length === 0 && !showEmptyFilterMessage) { + +
+
+

No recordings yet

+

Recordings from your meetings will appear here. Start a recording in any room to see them listed.

+
+ +
+
-} @else if (recordings.length > 0) { +} @else { @@ -52,14 +60,26 @@
+ @if (hasActiveFilters()) { + + } + @if (showFilters) { @@ -84,222 +104,220 @@
-
- - - @if (showSelection) { - - - - - } - - - @if (showRoomInfo) { - - - - - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - @if (canSelectRecording(recording)) { - - - } - Room -
- {{ recording.roomName }} - {{ recording.roomId }} - -
-
Status -
- - {{ getStatusIcon(recording.status) }} - - {{ getStatusLabel(recording.status) }} -
-
Start Date - @if (recording.startDate) { -
- {{ recording.startDate | date: 'mediumDate' }} - {{ recording.startDate | date: 'shortTime' }} -
- } @else { - - - } -
Duration - {{ formatDuration(recording.duration) }} - Size - {{ formatFileSize(recording.size) }} - Actions -
- - @if (canPlayRecording(recording)) { - - } - - - @if (canDownloadRecording(recording)) { - - } - - @if (isRecordingFailed(recording)) { - - } @else { - - - - - - - @if (canDeleteRecording(recording)) { - - - } - - } -
-
-
- - - @if (showLoadMore) { -
- + + @if (loading) { +
+ + Loading recordings...
- } -} @else { - -
-
-

No recordings yet

-

Recordings from your meetings will appear here. Start a recording in any room to see them listed.

-
- -
- +
+
+

No recordings match your search criteria and/or filters

Try adjusting or clearing your filters to see more recordings.

-
- } --> +
-
+ } @else { + +
+ + + @if (showSelection) { + + + + + } + + + @if (showRoomInfo) { + + + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + @if (canSelectRecording(recording)) { + + + } + Room +
+ {{ recording.roomName }} + {{ recording.roomId }} + +
+
Status +
+ + {{ getStatusIcon(recording.status) }} + + {{ getStatusLabel(recording.status) }} +
+
Start Date + @if (recording.startDate) { +
+ {{ recording.startDate | date: 'mediumDate' }} + {{ recording.startDate | date: 'shortTime' }} +
+ } @else { + - + } +
Duration + {{ formatDuration(recording.duration) }} + Size + {{ formatFileSize(recording.size) }} + Actions +
+ + @if (canPlayRecording(recording)) { + + } + + + @if (canDownloadRecording(recording)) { + + } + + @if (isRecordingFailed(recording)) { + + } @else { + + + + + + + @if (canDeleteRecording(recording)) { + + + } + + } +
+
+
+ + + @if (showLoadMore) { +
+ +
+ } + } } diff --git a/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.scss b/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.scss index 6203752..192db1a 100644 --- a/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.scss +++ b/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.scss @@ -10,6 +10,10 @@ ::ng-deep .refresh-btn { padding: var(--ov-meet-spacing-sm); } + + ::ng-deep .clear-btn { + padding: var(--ov-meet-spacing-sm); + } } } @@ -152,6 +156,10 @@ .refresh-recordings-btn { @extend .refresh-btn; } + + .clear-filters-btn { + @extend .refresh-btn; + } } } diff --git a/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.ts b/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.ts index 32d4fb3..e5bf62d 100644 --- a/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.ts +++ b/frontend/projects/shared-meet-components/src/lib/components/recording-lists/recording-lists.component.ts @@ -90,6 +90,7 @@ export class RecordingListsComponent implements OnInit, OnChanges { @Input() showRoomInfo = true; @Input() showLoadMore = false; @Input() loading = false; + @Input() initialFilters: { nameFilter: string; statusFilter: string } = { nameFilter: '', statusFilter: '' }; // Host binding for styling when recordings are selected @HostBinding('class.has-selections') @@ -107,6 +108,8 @@ export class RecordingListsComponent implements OnInit, OnChanges { nameFilterControl = new FormControl(''); statusFilterControl = new FormControl(''); + showEmptyFilterMessage = false; // Show message when no recordings match filters + // Selection state selectedRecordings = signal>(new Set()); allSelected = signal(false); @@ -156,16 +159,28 @@ export class RecordingListsComponent implements OnInit, OnChanges { ngOnChanges(changes: SimpleChanges) { if (changes['recordings']) { + // Update selected recordings based on current recordings const validIds = new Set(this.recordings.map((r) => r.recordingId)); const filteredSelection = new Set([...this.selectedRecordings()].filter((id) => validIds.has(id))); this.selectedRecordings.set(filteredSelection); this.updateSelectionState(); + + // Show message when no recordings match filters + if (this.recordings.length === 0 && this.hasActiveFilters()) { + this.showEmptyFilterMessage = true; + } else { + this.showEmptyFilterMessage = false; + } } } // ===== INITIALIZATION METHODS ===== private setupFilters() { + // Set up initial filter values + this.nameFilterControl.setValue(this.initialFilters.nameFilter); + this.statusFilterControl.setValue(this.initialFilters.statusFilter); + // Set up name filter with debounce this.nameFilterControl.valueChanges.pipe(debounceTime(300), distinctUntilChanged()).subscribe((value) => { this.filterChange.emit({ diff --git a/frontend/projects/shared-meet-components/src/lib/pages/console/recordings/recordings.component.html b/frontend/projects/shared-meet-components/src/lib/pages/console/recordings/recordings.component.html index e534437..efc8be0 100644 --- a/frontend/projects/shared-meet-components/src/lib/pages/console/recordings/recordings.component.html +++ b/frontend/projects/shared-meet-components/src/lib/pages/console/recordings/recordings.component.html @@ -38,6 +38,7 @@ [showFilters]="false" [showSelection]="true" [showLoadMore]="hasMoreRecordings" + [initialFilters]="initialFilters" (recordingAction)="onRecordingAction($event)" (loadMore)="loadMoreRecordings($event)" (refresh)="refreshRecordings($event)" diff --git a/frontend/projects/shared-meet-components/src/lib/pages/console/recordings/recordings.component.ts b/frontend/projects/shared-meet-components/src/lib/pages/console/recordings/recordings.component.ts index 6b24434..a3286d3 100644 --- a/frontend/projects/shared-meet-components/src/lib/pages/console/recordings/recordings.component.ts +++ b/frontend/projects/shared-meet-components/src/lib/pages/console/recordings/recordings.component.ts @@ -22,6 +22,11 @@ export class RecordingsComponent implements OnInit { showInitialLoader = false; isLoading = false; + initialFilters = { + nameFilter: '', + statusFilter: '' + }; + // Pagination hasMoreRecordings = false; private nextPageToken?: string; @@ -45,7 +50,8 @@ export class RecordingsComponent implements OnInit { if (roomId) { // If a specific room ID is provided, filter recordings by that room - await this.loadRecordings({ nameFilter: roomId, statusFilter: '' }); + this.initialFilters.nameFilter = roomId; + await this.loadRecordings(this.initialFilters); } else { // Load all recordings if no room ID is specified await this.loadRecordings();