diff --git a/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-layout/meeting-layout.component.ts b/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-layout/meeting-layout.component.ts index 2a45258f..0e107ef4 100644 --- a/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-layout/meeting-layout.component.ts +++ b/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-layout/meeting-layout.component.ts @@ -40,6 +40,11 @@ export class MeetingLayoutComponent { return this.meetingContextService.canModerateRoom() && remoteParticipants.length === 0; }); + /** + * Whether the layout selector feature is enabled + */ + protected readonly showLayoutSelector = this.meetingContextService.showLayoutSelector; + /** * Tracks the order of active speakers (most recent last) */ @@ -48,9 +53,16 @@ export class MeetingLayoutComponent { /** * Computed signal that provides the filtered list of participants to display. * Automatically reacts to changes in layout service configuration. + * When showLayoutSelector is false, returns all remote participants (default behavior). */ readonly filteredRemoteParticipants = computed(() => { const remoteParticipants = this.meetingContextService.remoteParticipants(); + + // If layout selector is disabled, use default behavior (show all participants) + if (!this.showLayoutSelector()) { + return remoteParticipants; + } + const isLastSpeakersMode = this.layoutService.isSmartMosaicEnabled(); if (!isLastSpeakersMode) { @@ -91,13 +103,16 @@ export class MeetingLayoutComponent { constructor() { effect(() => { - if (this.meetingContextService.lkRoom()) { + // Only setup active speakers if layout selector is enabled + if (this.showLayoutSelector() && this.meetingContextService.lkRoom()) { this.setupActiveSpeakersListener(); } }); // Effect to handle active speakers cleanup when participants leave effect(() => { + // Skip if layout selector is disabled + if (!this.showLayoutSelector()) return; if (!this.layoutService.isSmartMosaicEnabled()) return; const remoteParticipants = this.meetingContextService.remoteParticipants(); diff --git a/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-settings-panel/meeting-settings-panel.component.html b/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-settings-panel/meeting-settings-panel.component.html index 8b7ff54c..7fc3610f 100644 --- a/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-settings-panel/meeting-settings-panel.component.html +++ b/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-settings-panel/meeting-settings-panel.component.html @@ -1,9 +1,10 @@ -
-
- browse -

Layout settings

-
+@if (showLayoutSelector()) { +
+
+ browse +

Layout settings

+
@@ -55,4 +56,5 @@
} -
+ +} diff --git a/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-settings-panel/meeting-settings-panel.component.ts b/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-settings-panel/meeting-settings-panel.component.ts index 1b6f299e..795251ec 100644 --- a/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-settings-panel/meeting-settings-panel.component.ts +++ b/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-settings-panel/meeting-settings-panel.component.ts @@ -9,6 +9,7 @@ import { MatSelectModule } from '@angular/material/select'; import { FormsModule } from '@angular/forms'; import { MeetLayoutMode } from '../../../models/layout.model'; import { MeetLayoutService } from '../../../services/layout.service'; +import { MeetingContextService } from '../../../services/meeting/meeting-context.service'; /** * Component for additional settings in the Settings Panel. @@ -30,12 +31,18 @@ import { MeetLayoutService } from '../../../services/layout.service'; }) export class MeetingSettingsPanelComponent { private readonly layoutService = inject(MeetLayoutService); + protected readonly meetingContextService = inject(MeetingContextService); /** * Expose LayoutMode enum to template */ readonly LayoutMode = MeetLayoutMode; + /** + * Whether the layout selector feature is enabled + */ + protected readonly showLayoutSelector = this.meetingContextService.showLayoutSelector; + /** * Current layout mode */ diff --git a/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-toolbar-more-options-buttons/meeting-toolbar-more-options-buttons.component.html b/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-toolbar-more-options-buttons/meeting-toolbar-more-options-buttons.component.html index a19984a7..9362d6c8 100644 --- a/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-toolbar-more-options-buttons/meeting-toolbar-more-options-buttons.component.html +++ b/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-toolbar-more-options-buttons/meeting-toolbar-more-options-buttons.component.html @@ -1,10 +1,12 @@ - +@if (showLayoutSelector()) { + +} diff --git a/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-toolbar-more-options-buttons/meeting-toolbar-more-options-buttons.component.ts b/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-toolbar-more-options-buttons/meeting-toolbar-more-options-buttons.component.ts index 5542bfc8..ce162548 100644 --- a/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-toolbar-more-options-buttons/meeting-toolbar-more-options-buttons.component.ts +++ b/meet-ce/frontend/projects/shared-meet-components/src/lib/customization/components/meeting-toolbar-more-options-buttons/meeting-toolbar-more-options-buttons.component.ts @@ -5,6 +5,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatMenuModule } from '@angular/material/menu'; import { MatTooltipModule } from '@angular/material/tooltip'; import { PanelService, ViewportService, PanelType } from 'openvidu-components-angular'; +import { MeetingContextService } from '../../../services/meeting/meeting-context.service'; /** * Component for additional menu items in the toolbar's "More Options" menu. @@ -36,6 +37,11 @@ export class MeetingToolbarMoreOptionsButtonsComponent { */ private panelService = inject(PanelService); + /** + * Meeting context service for feature flags + */ + private meetingContextService = inject(MeetingContextService); + /** * Computed properties for responsive button behavior * These follow the same pattern as toolbar-media-buttons component @@ -44,6 +50,11 @@ export class MeetingToolbarMoreOptionsButtonsComponent { readonly isTabletView = computed(() => this.viewportService.isTablet()); readonly isDesktopView = computed(() => this.viewportService.isDesktop()); + /** + * Whether the layout selector feature is enabled + */ + readonly showLayoutSelector = computed(() => this.meetingContextService.showLayoutSelector()); + /** * Opens the settings panel to allow users to change grid layout */ diff --git a/meet-ce/frontend/projects/shared-meet-components/src/lib/services/feature-configuration.service.ts b/meet-ce/frontend/projects/shared-meet-components/src/lib/services/feature-configuration.service.ts index 9f2cad9f..791155bf 100644 --- a/meet-ce/frontend/projects/shared-meet-components/src/lib/services/feature-configuration.service.ts +++ b/meet-ce/frontend/projects/shared-meet-components/src/lib/services/feature-configuration.service.ts @@ -28,6 +28,7 @@ export interface ApplicationFeatures { showSettings: boolean; showFullscreen: boolean; showThemeSelector: boolean; + showLayoutSelector: boolean; // Permissions canModerateRoom: boolean; @@ -56,6 +57,7 @@ const DEFAULT_FEATURES: ApplicationFeatures = { showSettings: true, showFullscreen: true, showThemeSelector: true, + showLayoutSelector: false, canModerateRoom: false, canRecordRoom: false, diff --git a/meet-ce/frontend/projects/shared-meet-components/src/lib/services/meeting/meeting-context.service.ts b/meet-ce/frontend/projects/shared-meet-components/src/lib/services/meeting/meeting-context.service.ts index 52237baf..ed63f1e3 100644 --- a/meet-ce/frontend/projects/shared-meet-components/src/lib/services/meeting/meeting-context.service.ts +++ b/meet-ce/frontend/projects/shared-meet-components/src/lib/services/meeting/meeting-context.service.ts @@ -98,13 +98,16 @@ export class MeetingContextService { /** * Computed signal for whether the current user can moderate the room - * Derived from FeatureConfigurationService */ readonly canModerateRoom = computed(() => this.featureConfigService.features().canModerateRoom); + /** + * Computed signal for whether the layout selector feature is enabled + */ + readonly showLayoutSelector = computed(() => this.featureConfigService.features().showLayoutSelector); + /** * Computed signal for whether the device is mobile - * Derived from ViewportService for responsive UI */ readonly isMobile = computed(() => this.viewportService.isMobile());