diff --git a/src/core/server/ui_settings/saved_objects/permission_controlled_ui_settings_wrapper.ts b/src/core/server/ui_settings/saved_objects/permission_controlled_ui_settings_wrapper.ts index bb406f506f9e..c7a6d38be722 100644 --- a/src/core/server/ui_settings/saved_objects/permission_controlled_ui_settings_wrapper.ts +++ b/src/core/server/ui_settings/saved_objects/permission_controlled_ui_settings_wrapper.ts @@ -53,12 +53,12 @@ export class PermissionControlledUiSettingsWrapper { ): Promise> => { if (type === 'config' && id === DASHBOARD_ADMIN_SETTINGS_ID) { try { - return ((await wrapperOptions.client.update>( + return await wrapperOptions.client.update( type, DASHBOARD_ADMIN_SETTINGS_ID, attributes, options - )) as unknown) as SavedObjectsUpdateResponse; + ); } catch (error) { if (SavedObjectsErrorHelpers.isNotFoundError(error)) { return this.createPermissionUiSetting(attributes, options, wrapperOptions); diff --git a/src/core/server/ui_settings/ui_settings_client.ts b/src/core/server/ui_settings/ui_settings_client.ts index 44d6e2dcca96..9f1214d28823 100644 --- a/src/core/server/ui_settings/ui_settings_client.ts +++ b/src/core/server/ui_settings/ui_settings_client.ts @@ -348,10 +348,10 @@ export class UiSettingsClient implements IUiSettingsClient { this.log.warn( `Deprecation warning: The setting "${key}" has multiple scopes. Please specify a scope when updating it.` ); - } else if (this.userLevelSettingsKeys.includes(key)) { - groupedChanges[UiSettingScope.USER][key] = val; } else if (this.adminUiSettingsKeys.includes(key)) { groupedChanges[UiSettingScope.DASHBOARD_ADMIN][key] = val; + } else if (this.userLevelSettingsKeys.includes(key)) { + groupedChanges[UiSettingScope.USER][key] = val; } else if (this.workspaceLevelSettingsKeys.includes(key)) { groupedChanges[UiSettingScope.WORKSPACE][key] = val; } else { diff --git a/src/core/server/ui_settings/ui_settings_service.ts b/src/core/server/ui_settings/ui_settings_service.ts index 67846d51d00c..97036332bacd 100644 --- a/src/core/server/ui_settings/ui_settings_service.ts +++ b/src/core/server/ui_settings/ui_settings_service.ts @@ -101,6 +101,8 @@ export class UiSettingsService // Use uiSettings.defaults from the config file this.validateAndUpdateConfiguredDefaults(config.uiSettingsConfig.defaults); + this.register(getAIFeaturesSetting()); + const permissionControlledUiSettingsWrapper = new PermissionControlledUiSettingsWrapper( config.savedObjectsConfig.permission.enabled ); @@ -111,8 +113,6 @@ export class UiSettingsService permissionControlledUiSettingsWrapper.wrapperFactory ); - this.register(getAIFeaturesSetting()); - return { register: this.register.bind(this), }; diff --git a/src/plugins/advanced_settings/public/management_app/advanced_settings.tsx b/src/plugins/advanced_settings/public/management_app/advanced_settings.tsx index 075297366398..fcb8f3a5562d 100644 --- a/src/plugins/advanced_settings/public/management_app/advanced_settings.tsx +++ b/src/plugins/advanced_settings/public/management_app/advanced_settings.tsx @@ -201,8 +201,16 @@ export class AdvancedSettingsComponent extends Component< value: setting[1].userValue, isCustom: config.isCustom(setting[0]), isOverridden: config.isOverridden(setting[0]), + // Setting is permission controlled if: + // 1. It has DASHBOARD_ADMIN scope (string or array) AND + // 2. Current user is NOT a dashboard admin + // This prevents non-admin users from modifying admin-only settings isPermissionControlled: - all[setting[0]].scope === UiSettingScope.DASHBOARD_ADMIN && !isDashboardAdmin, + ((typeof all[setting[0]].scope === 'string' && + all[setting[0]].scope === UiSettingScope.DASHBOARD_ADMIN) || + (Array.isArray(all[setting[0]].scope) && + (all[setting[0]].scope || []).includes(UiSettingScope.DASHBOARD_ADMIN))) && + !isDashboardAdmin, userSettingsEnabled, }); }) diff --git a/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx b/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx index 3dbb9c0af37e..d8f7c41ddfad 100644 --- a/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx +++ b/src/plugins/query_enhancements/public/query_assist/utils/create_extension.tsx @@ -6,7 +6,7 @@ import { i18n } from '@osd/i18n'; import { ENABLE_AI_FEATURES, HttpSetup } from 'opensearch-dashboards/public'; import React, { useCallback, useEffect, useState } from 'react'; -import { BehaviorSubject, of } from 'rxjs'; +import { BehaviorSubject, of, combineLatest } from 'rxjs'; import { useObservable } from 'react-use'; import { distinctUntilChanged, map, startWith, switchMap } from 'rxjs/operators'; import { DATA_STRUCTURE_META_TYPES, DEFAULT_DATA } from '../../../../data/common'; @@ -133,8 +133,8 @@ export const createQueryAssistExtension = ( } }, isEnabled$: () => - getAvailableLanguages$(http, data).pipe( - map((languages) => languages.length > 0 && assistantEnabled$.value) + combineLatest([getAvailableLanguages$(http, data), assistantEnabled$]).pipe( + map(([languages, assistantEnabled]) => languages.length > 0 && assistantEnabled) ), getComponent: (dependencies) => { // only show the component if user is on a supported language.