Change:
In web when I trigger File Save Workspace As, I am seeing an empty picker, but I would expect an experience which is more like this: !
The current behavior is to have not placeholder for the filename+extension. Having no filename is consistent with what Windows does: ! is your screen shot what you see on Mac when doing Save Workspace As in desktop?
yeah it is macOS and I think the challenge here is that the custom file dialog does not provide any dropdown for the file extension to pick. I think I would prefer if the custom file dialog would then do what macOS does.
Sounds good, I will update to add a placeholder filename+extension for save workspace as, which is not web specific.
the code for that use is here: To clarify: you would not implement a one-off solution for the "Save Workspace As..." but pick on the existing property to do so? I guess one question is how that would conflict with the property if that points to a file and not folder.
I think I would change the last line of the method here: Instead of just using the , which is what you are seeing happen, I would give it an untitled filename and the appropriate extension.
yeah works for me

Discussion:
* The default path for a new workspace based on previously used workspaces. * @param schemeFilter The scheme of the workspace path. If no filter given, the scheme of the current window is used. */ <del> defaultWorkspacePath(schemeFilter?: string): URI | undefined; </del> <ins> defaultWorkspacePath(schemeFilter?: string, filename?: string): URI | undefined; </ins> /** * Shows a file-folder selection dialog and opens the selected entry.

return candidate && resources.dirname(candidate) || undefined; } <del> defaultWorkspacePath(schemeFilter = this.getSchemeFilterForWindow()): URI | undefined { </del> <ins> defaultWorkspacePath(schemeFilter = this.getSchemeFilterForWindow(), filename?: string): URI | undefined { let defaultWorkspacePath: URI | undefined; </ins> // Check for current workspace config file first... if (this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE) { const configuration = this.contextService.getWorkspace().configuration; if (configuration && configuration.scheme === schemeFilter && !isUntitledWorkspace(configuration, this.environmentService)) { <del> return resources.dirname(configuration) || undefined; </del> <ins> defaultWorkspacePath = resources.dirname(configuration) || undefined; </ins> } } // ...then fallback to default file path <del> return this.defaultFilePath(schemeFilter); </del> <ins> if (!defaultWorkspacePath) { defaultWorkspacePath = this.defaultFilePath(schemeFilter); } if (defaultWorkspacePath && filename) { defaultWorkspacePath = resources.joinPath(defaultWorkspacePath, filename); } return defaultWorkspacePath; </ins> } async showSaveConfirm(fileNamesOrResources: (string | URI)[]): Promise<ConfirmResult> {

import { SaveReason } from 'vs/workbench/common/editor'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; <ins> const UNTITLED_WORKSPACE_FILENAME = `workspace.${WORKSPACE_EXTENSION}`; </ins> export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditingService { declare readonly _serviceBrand: undefined;

saveLabel: mnemonicButtonLabel(nls.localize('save', "Save")), title: nls.localize('saveWorkspace', "Save Workspace"), filters: WORKSPACE_FILTER, <del> defaultUri: this.fileDialogService.defaultWorkspacePath(), </del> <ins> defaultUri: this.fileDialogService.defaultWorkspacePath(undefined, UNTITLED_WORKSPACE_FILENAME), </ins> availableFileSystems: this.environmentService.remoteAuthority ? [Schemas.vscodeRemote] : undefined });