Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ function createAssignmentService(enabled: boolean): IWorkbenchAssignmentService
_serviceBrand: undefined,
onDidRefetchAssignments: Event.None,
getCurrentExperiments: async () => [],
getTreatmentWithAssignment: async () => ({ value: undefined, hasAssignment: Promise.resolve(false) }),
addTelemetryAssignmentFilter(_filter: IAssignmentFilter): void { },
getTreatment: async <T extends string | number | boolean>() => enabled as T,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ function createMockAssignmentService(
_serviceBrand: undefined,
onDidRefetchAssignments: Event.None,
getCurrentExperiments: async () => [],
getTreatmentWithAssignment: async () => ({ value: undefined, hasAssignment: Promise.resolve(false) }),
addTelemetryAssignmentFilter(_filter: IAssignmentFilter): void { },
getTreatment<T extends string | number | boolean>(name: string): Promise<T | undefined> {
getTreatmentCalls.push(name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ suite('ChatExpNotification', () => {
_serviceBrand: undefined,
onDidRefetchAssignments: onDidRefetchAssignments.event,
getCurrentExperiments: async () => [],
getTreatmentWithAssignment: async () => ({ value: undefined, hasAssignment: Promise.resolve(false) }),
addTelemetryAssignmentFilter(_filter: IAssignmentFilter): void { },
getTreatment: async <T extends string | number | boolean>() => (treatments.length > 1 ? treatments.shift() : treatments[0]) as T,
} satisfies IWorkbenchAssignmentService,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ suite('ChatModelFeedbackSurveyService', () => {
_serviceBrand: undefined,
onDidRefetchAssignments: options.onDidRefetchAssignments ?? Event.None,
getCurrentExperiments: async () => [],
getTreatmentWithAssignment: async () => ({ value: undefined, hasAssignment: Promise.resolve(false) }),
addTelemetryAssignmentFilter(_filter: IAssignmentFilter): void { },
getTreatment: async <T extends string | number | boolean>() => (options.getTreatment
? options.getTreatment()
Expand Down
40 changes: 28 additions & 12 deletions src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import { URI } from '../../../../base/common/uri.js';
import { ILanguageService } from '../../../../editor/common/languages/language.js';
import { ITextResourceConfigurationService } from '../../../../editor/common/services/textResourceConfiguration.js';
import { localize } from '../../../../nls.js';
import { IExperimentalSettingsService } from '../../../services/configuration/common/experimentalSettings.js';
import { ICommandService } from '../../../../platform/commands/common/commands.js';
import { ConfigurationTarget, IConfigurationUpdateOverrides } from '../../../../platform/configuration/common/configuration.js';
import { ConfigurationScope, Extensions, IConfigurationRegistry } from '../../../../platform/configuration/common/configurationRegistry.js';
Expand Down Expand Up @@ -61,7 +62,7 @@ import { nullRange, Settings2EditorModel } from '../../../services/preferences/c
import { IUserDataProfileService } from '../../../services/userDataProfile/common/userDataProfile.js';
import { IUserDataSyncWorkbenchService } from '../../../services/userDataSync/common/userDataSync.js';
import { SuggestEnabledInputWithHistory } from '../../codeEditor/browser/suggestEnabledInput/suggestEnabledInput.js';
import { ADVANCED_SETTING_TAG, AGENTS_WINDOW_SETTING_TAG, CONTEXT_AI_SETTING_RESULTS_AVAILABLE, CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_FIRST_ROW_FOCUS, CONTEXT_SETTINGS_ROW_FOCUS, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, EMBEDDINGS_SEARCH_PROVIDER_NAME, ENABLE_LANGUAGE_FILTER, EXTENSION_FETCH_TIMEOUT_MS, EXTENSION_SETTING_TAG, FEATURE_SETTING_TAG, FILTER_MODEL_SEARCH_PROVIDER_NAME, getExperimentalExtensionToggleData, ID_SETTING_TAG, IPreferencesSearchService, ISearchProvider, LANGUAGE_SETTING_TAG, LLM_RANKED_SEARCH_PROVIDER_NAME, MODIFIED_SETTING_TAG, POLICY_SETTING_TAG, REQUIRE_TRUSTED_WORKSPACE_SETTING_TAG, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_SHOW_AI_RESULTS, SETTINGS_EDITOR_COMMAND_SUGGEST_FILTERS, SETTINGS_EDITOR_COMMAND_TOGGLE_AI_SEARCH, STRING_MATCH_SEARCH_PROVIDER_NAME, TF_IDF_SEARCH_PROVIDER_NAME, WorkbenchSettingsEditorSettings, WORKSPACE_TRUST_SETTING_TAG } from '../common/preferences.js';
import { ADVANCED_SETTING_TAG, AGENTS_WINDOW_SETTING_TAG, CONTEXT_AI_SETTING_RESULTS_AVAILABLE, CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_FIRST_ROW_FOCUS, CONTEXT_SETTINGS_ROW_FOCUS, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, EMBEDDINGS_SEARCH_PROVIDER_NAME, ENABLE_LANGUAGE_FILTER, EXP_ASSIGNMENT_SETTING_TAG, EXTENSION_FETCH_TIMEOUT_MS, EXTENSION_SETTING_TAG, FEATURE_SETTING_TAG, FILTER_MODEL_SEARCH_PROVIDER_NAME, getExperimentalExtensionToggleData, ID_SETTING_TAG, IPreferencesSearchService, ISearchProvider, LANGUAGE_SETTING_TAG, LLM_RANKED_SEARCH_PROVIDER_NAME, MODIFIED_SETTING_TAG, POLICY_SETTING_TAG, REQUIRE_TRUSTED_WORKSPACE_SETTING_TAG, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_SHOW_AI_RESULTS, SETTINGS_EDITOR_COMMAND_SUGGEST_FILTERS, SETTINGS_EDITOR_COMMAND_TOGGLE_AI_SEARCH, STRING_MATCH_SEARCH_PROVIDER_NAME, TF_IDF_SEARCH_PROVIDER_NAME, WorkbenchSettingsEditorSettings, WORKSPACE_TRUST_SETTING_TAG } from '../common/preferences.js';
import { settingsHeaderBorder, settingsSashBorder, settingsTextInputBorder } from '../common/settingsEditorColorRegistry.js';
import { IWorkbenchEnvironmentService } from '../../../services/environment/common/environmentService.js';
import './media/settingsEditor2.css';
Expand Down Expand Up @@ -141,6 +142,7 @@ export class SettingsEditor2 extends EditorPane {
'@tag:accessibility',
'@tag:preview',
'@tag:experimental',
`@tag:${EXP_ASSIGNMENT_SETTING_TAG}`,
'@tag:agentMerge',
`@tag:${ADVANCED_SETTING_TAG}`,
`@${ID_SETTING_TAG}`,
Expand Down Expand Up @@ -237,6 +239,7 @@ export class SettingsEditor2 extends EditorPane {
private aiResultsAvailable: IContextKey<boolean>;

private scheduledRefreshes: Map<string, DisposableStore>;
private pendingAssignmentRefresh = false;
private _currentFocusContext: SettingsFocusContext = SettingsFocusContext.Search;

/** Don't spam warnings */
Expand Down Expand Up @@ -289,6 +292,7 @@ export class SettingsEditor2 extends EditorPane {
@IKeybindingService private readonly keybindingService: IKeybindingService,
@IChatEntitlementService private readonly chatEntitlementService: IChatEntitlementService,
@IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService,
@IExperimentalSettingsService experimentalSettingsService: IExperimentalSettingsService,
) {
super(SettingsEditor2.ID, group, telemetryService, themeService, storageService);
this.searchDelayer = this._register(new Delayer(200));
Expand Down Expand Up @@ -350,6 +354,15 @@ export class SettingsEditor2 extends EditorPane {
this.updateElementsByKey(new Set(e.default));
}
}));
this._register(experimentalSettingsService.onDidChangeAssignments(keys => {
if (this.searchResultModel && this.viewState.tagFilters?.has(EXP_ASSIGNMENT_SETTING_TAG)) {
keys.forEach(key => this.settingsTreeModel.value?.updateElementsByName(key));
this.pendingAssignmentRefresh = true;
this.renderTree();
} else if (this.currentSettingsModel) {
this.updateElementsByKey(keys);
}
}));

this._register(extensionManagementService.onDidInstallExtensions(() => {
this.refreshInstalledExtensionsList();
Expand Down Expand Up @@ -382,17 +395,10 @@ export class SettingsEditor2 extends EditorPane {
if (this.configurationService.getValue<boolean>(ALWAYS_SHOW_ADVANCED_SETTINGS_SETTING) ?? false) {
return true;
}
return this.viewState.tagFilters?.has(ADVANCED_SETTING_TAG) ?? false;
return !!(this.viewState.tagFilters?.has(ADVANCED_SETTING_TAG) || this.viewState.tagFilters?.has(EXP_ASSIGNMENT_SETTING_TAG));
}

/**
* Determines whether a setting should be shown even when advanced settings are filtered out.
* Returns true if:
* - The setting is not tagged as advanced, OR
* - The setting matches an ID filter (@id:settingKey), OR
* - The setting key appears in the search query, OR
* - The @hasPolicy filter is active (policy settings should always be shown when filtering by policy)
*/
/** Allows explicitly targeted settings to bypass the default advanced-settings filter. */
private shouldShowSetting(setting: ISetting): boolean {
if (!setting.tags?.includes(ADVANCED_SETTING_TAG)) {
return true;
Expand Down Expand Up @@ -461,6 +467,7 @@ export class SettingsEditor2 extends EditorPane {

private set searchResultModel(value: SearchResultModel | null) {
this._searchResultModel.value = value ?? undefined;
this.pendingAssignmentRefresh = false;

this.rootElement.classList.toggle('search-mode', !!this._searchResultModel.value);
}
Expand Down Expand Up @@ -1720,6 +1727,9 @@ export class SettingsEditor2 extends EditorPane {
}

private renderTree(key?: string, force = false): void {
if (this.pendingAssignmentRefresh) {
key = undefined;
}
if (!force && key && this.scheduledRefreshes.has(key)) {
this.updateModifiedLabelForKey(key);
return;
Expand Down Expand Up @@ -1756,6 +1766,12 @@ export class SettingsEditor2 extends EditorPane {
}
}

if (this.pendingAssignmentRefresh) {
this.pendingAssignmentRefresh = false;
this.searchResultModel?.updateChildren();
this.refreshTOCTree();
}

this.renderResultCountMessages(false);

if (key) {
Expand Down Expand Up @@ -1880,7 +1896,7 @@ export class SettingsEditor2 extends EditorPane {

private async triggerSearch(query: string, expandResults: boolean): Promise<void> {
const progressRunner = this.editorProgressService.show(true, 800);
const showAdvanced = this.viewState.tagFilters?.has(ADVANCED_SETTING_TAG);
const showAdvanced = this.canShowAdvancedSettings();
this.viewState.tagFilters = new Set<string>();
this.viewState.extensionFilters = new Set<string>();
this.viewState.featureFilters = new Set<string>();
Expand All @@ -1896,7 +1912,7 @@ export class SettingsEditor2 extends EditorPane {
this.viewState.languageFilter = parsedQuery.languageFilter;
}

if (showAdvanced !== this.viewState.tagFilters?.has(ADVANCED_SETTING_TAG)) {
if (showAdvanced !== this.canShowAdvancedSettings()) {
await this.onConfigUpdate();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { SuggestController } from '../../../../editor/contrib/suggest/browser/su
import { localize } from '../../../../nls.js';
import { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js';
import { SuggestEnabledInput } from '../../codeEditor/browser/suggestEnabledInput/suggestEnabledInput.js';
import { ADVANCED_SETTING_TAG, EXTENSION_SETTING_TAG, FEATURE_SETTING_TAG, GENERAL_TAG_SETTING_TAG, ID_SETTING_TAG, LANGUAGE_SETTING_TAG, MODIFIED_SETTING_TAG, POLICY_SETTING_TAG } from '../common/preferences.js';
import { ADVANCED_SETTING_TAG, EXP_ASSIGNMENT_SETTING_TAG, EXTENSION_SETTING_TAG, FEATURE_SETTING_TAG, GENERAL_TAG_SETTING_TAG, ID_SETTING_TAG, LANGUAGE_SETTING_TAG, MODIFIED_SETTING_TAG, POLICY_SETTING_TAG } from '../common/preferences.js';

export class SettingsSearchFilterDropdownMenuActionViewItem extends DropdownMenuActionViewItem {
private readonly suggestController: SuggestController | null;
Expand Down Expand Up @@ -207,6 +207,12 @@ export class SettingsSearchFilterDropdownMenuActionViewItem extends DropdownMenu
localize('advancedSettingsSearchTooltip', "Show advanced settings"),
`@tag:${ADVANCED_SETTING_TAG}`,
),
this.createToggleAction(
'expAssignmentSettingsSearch',
localize('expAssignmentSettingsSearch', "ExP Assigned"),
localize('expAssignmentSettingsSearchTooltip', "Show settings with an ExP treatment assignment"),
`@tag:${EXP_ASSIGNMENT_SETTING_TAG}`
),
];
}
}
23 changes: 18 additions & 5 deletions src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@ import { APPLICATION_SCOPES, FOLDER_SCOPES, IWorkbenchConfigurationService, LOCA
import { IWorkbenchEnvironmentService } from '../../../services/environment/common/environmentService.js';
import { IExtensionSetting, ISearchResult, ISetting, ISettingMatch, SettingMatchType, SettingValueType } from '../../../services/preferences/common/preferences.js';
import { IUserDataProfileService } from '../../../services/userDataProfile/common/userDataProfile.js';
import { AGENTS_WINDOW_SETTING_TAG, ENABLE_EXTENSION_TOGGLE_SETTINGS, ENABLE_LANGUAGE_FILTER, MODIFIED_SETTING_TAG, POLICY_SETTING_TAG, REQUIRE_TRUSTED_WORKSPACE_SETTING_TAG, compareTwoNullableNumbers, wordifyKey } from '../common/preferences.js';
import { AGENTS_WINDOW_SETTING_TAG, ENABLE_EXTENSION_TOGGLE_SETTINGS, ENABLE_LANGUAGE_FILTER, EXP_ASSIGNMENT_SETTING_TAG, MODIFIED_SETTING_TAG, POLICY_SETTING_TAG, REQUIRE_TRUSTED_WORKSPACE_SETTING_TAG, compareTwoNullableNumbers, wordifyKey } from '../common/preferences.js';
import { SettingsTarget } from './preferencesWidgets.js';
import { ITOCEntry, tocData } from './settingsLayout.js';
import { IExperimentalSettingsService } from '../../../services/configuration/common/experimentalSettings.js';

export const ONLINE_SERVICES_SETTING_TAG = 'usesOnlineServices';

Expand Down Expand Up @@ -182,6 +183,7 @@ export class SettingsTreeSettingElement extends SettingsTreeElement {
private readonly userDataProfileService: IUserDataProfileService,
private readonly configurationService: IWorkbenchConfigurationService,
private readonly isSessionsWindow: boolean,
private readonly experimentalSettingsService: IExperimentalSettingsService,
) {
super(sanitizeId(parent.id + '_' + setting.key));
this.setting = setting;
Expand All @@ -192,6 +194,10 @@ export class SettingsTreeSettingElement extends SettingsTreeElement {
this.initSettingValueType();
}

get hasExPAssignment(): boolean {
return this.experimentalSettingsService.hasAssignment(this.setting.key);
}

get displayCategory(): string {
if (!this._displayCategory) {
this.initLabels();
Expand Down Expand Up @@ -386,14 +392,18 @@ export class SettingsTreeSettingElement extends SettingsTreeElement {

this.value = displayValue;
this.isConfigured = isConfigured;
if (isConfigured || this.setting.tags || this.tags || this.setting.restricted || this.hasPolicyValue || hasAgentsWindowOverride) {
if (isConfigured || this.setting.tags || this.tags || this.setting.restricted || this.hasPolicyValue || hasAgentsWindowOverride || this.hasExPAssignment) {
// Don't create an empty Set for all 1000 settings, only if needed
this.tags = new Set<string>();
if (isConfigured) {
this.tags.add(MODIFIED_SETTING_TAG);
}

this.setting.tags?.forEach(tag => this.tags!.add(tag));
this.tags.delete(EXP_ASSIGNMENT_SETTING_TAG);
if (this.hasExPAssignment) {
this.tags.add(EXP_ASSIGNMENT_SETTING_TAG);
}

if (this.setting.restricted) {
this.tags.add(REQUIRE_TRUSTED_WORKSPACE_SETTING_TAG);
Expand Down Expand Up @@ -592,6 +602,7 @@ export class SettingsTreeModel implements IDisposable {
@IUserDataProfileService private readonly _userDataProfileService: IUserDataProfileService,
@IProductService private readonly _productService: IProductService,
@IWorkbenchEnvironmentService private readonly _environmentService: IWorkbenchEnvironmentService,
@IExperimentalSettingsService private readonly _experimentalSettingsService: IExperimentalSettingsService,
) {
}

Expand Down Expand Up @@ -708,7 +719,8 @@ export class SettingsTreeModel implements IDisposable {
this._productService,
this._userDataProfileService,
this._configurationService,
this._environmentService.isSessionsWindow);
this._environmentService.isSessionsWindow,
this._experimentalSettingsService);

const nameElements = this._treeElementsBySettingName.get(setting.key) ?? [];
nameElements.push(element);
Expand Down Expand Up @@ -1006,9 +1018,10 @@ export class SearchResultModel extends SettingsTreeModel {
@IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService,
@ILanguageService languageService: ILanguageService,
@IUserDataProfileService userDataProfileService: IUserDataProfileService,
@IProductService productService: IProductService
@IProductService productService: IProductService,
@IExperimentalSettingsService experimentalSettingsService: IExperimentalSettingsService
) {
super(viewState, isWorkspaceTrusted, configurationService, languageService, userDataProfileService, productService, environmentService);
super(viewState, isWorkspaceTrusted, configurationService, languageService, userDataProfileService, productService, environmentService, experimentalSettingsService);
this.settingsOrderByTocIndex = settingsOrderByTocIndex;
this.cachedUniqueSearchResults = new Map();
this.update({ id: 'searchResultModel', label: '' });
Expand Down
1 change: 1 addition & 0 deletions src/vs/workbench/contrib/preferences/common/preferences.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ export const AGENTS_WINDOW_SETTING_TAG = 'override:agentsWindow';
export const WORKSPACE_TRUST_SETTING_TAG = 'workspaceTrust';
export const REQUIRE_TRUSTED_WORKSPACE_SETTING_TAG = 'requireTrustedWorkspace';
export const ADVANCED_SETTING_TAG = 'advanced';
export const EXP_ASSIGNMENT_SETTING_TAG = 'expassigned';
export const KEYBOARD_LAYOUT_OPEN_PICKER = 'workbench.action.openKeyboardLayoutPicker';

export const ENABLE_LANGUAGE_FILTER = true;
Expand Down
Loading