Skip to content

Commit 69f2c2a

Browse files
committed
Add reset functionality and standardize quick pick dialogs with consistent back button behavior
1 parent fd6d1e0 commit 69f2c2a

2 files changed

Lines changed: 130 additions & 35 deletions

File tree

‎packages/vscode/src/views/settings/backend/message-handlers/handle-upsert-configuration.ts‎

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,15 @@ export const handle_upsert_configuration = async (
116116
}
117117

118118
const updated_config = config_to_edit
119+
const starting_config = { ...updated_config }
119120

120-
// Editing loop
121121
// eslint-disable-next-line no-constant-condition
122122
while (true) {
123+
const has_changes =
124+
JSON.stringify(updated_config) !== JSON.stringify(starting_config)
125+
123126
const items: vscode.QuickPickItem[] = [
124-
{ label: 'Provider', detail: updated_config.provider_name },
127+
{ label: 'Model Provider', detail: updated_config.provider_name },
125128
{ label: 'Model', detail: updated_config.model },
126129
{ label: 'Advanced', detail: advanced_details }
127130
]
@@ -135,11 +138,17 @@ export const handle_upsert_configuration = async (
135138
: 'Create New Configuration'
136139
quick_pick.placeholder =
137140
'Select a property to edit, or press Esc to save'
138-
const closeButton: vscode.QuickInputButton = {
141+
const close_button: vscode.QuickInputButton = {
139142
iconPath: new vscode.ThemeIcon('close'),
140143
tooltip: 'Save and Close'
141144
}
142-
quick_pick.buttons = [closeButton]
145+
const redo_button: vscode.QuickInputButton = {
146+
iconPath: new vscode.ThemeIcon('redo'),
147+
tooltip: 'Reset Changes'
148+
}
149+
quick_pick.buttons = has_changes
150+
? [redo_button, close_button]
151+
: [close_button]
143152
let accepted = false
144153
const disposables: vscode.Disposable[] = []
145154

@@ -150,8 +159,22 @@ export const handle_upsert_configuration = async (
150159
quick_pick.hide()
151160
}),
152161
quick_pick.onDidTriggerButton((button) => {
153-
if (button === closeButton) {
162+
if (button === close_button) {
154163
quick_pick.hide()
164+
} else if (button === redo_button) {
165+
Object.keys(updated_config).forEach(
166+
(key) => delete (updated_config as any)[key]
167+
)
168+
Object.assign(updated_config, starting_config)
169+
quick_pick.items = [
170+
{
171+
label: 'Model Provider',
172+
detail: updated_config.provider_name
173+
},
174+
{ label: 'Model', detail: updated_config.model },
175+
{ label: 'Advanced', detail: advanced_details }
176+
]
177+
quick_pick.buttons = [close_button]
155178
}
156179
}),
157180
quick_pick.onDidHide(() => {
@@ -170,7 +193,7 @@ export const handle_upsert_configuration = async (
170193

171194
const selected_option = selected_item.label
172195

173-
if (selected_option === 'Provider') {
196+
if (selected_option === 'Model Provider') {
174197
const new_provider = await edit_provider_for_config(providers_manager)
175198
if (new_provider) {
176199
updated_config.provider_name = new_provider.provider_name

‎packages/vscode/src/views/settings/utils/config-editing.ts‎

Lines changed: 101 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,36 @@ export const initial_select_provider = async (
2525
}
2626

2727
const provider_items = providers.map((p) => ({ label: p.name, provider: p }))
28-
const selected = await vscode.window.showQuickPick(provider_items, {
29-
title: 'Model Providers'
30-
})
28+
const selected = await new Promise<(typeof provider_items)[0] | undefined>(
29+
(resolve) => {
30+
const quick_pick =
31+
vscode.window.createQuickPick<(typeof provider_items)[0]>()
32+
quick_pick.items = provider_items
33+
quick_pick.title = 'Model Providers'
34+
quick_pick.buttons = [vscode.QuickInputButtons.Back]
35+
let accepted = false
36+
const disposables: vscode.Disposable[] = []
3137

38+
disposables.push(
39+
quick_pick.onDidAccept(() => {
40+
accepted = true
41+
resolve(quick_pick.selectedItems[0])
42+
quick_pick.hide()
43+
}),
44+
quick_pick.onDidTriggerButton((button) => {
45+
if (button === vscode.QuickInputButtons.Back) {
46+
quick_pick.hide()
47+
}
48+
}),
49+
quick_pick.onDidHide(() => {
50+
if (!accepted) resolve(undefined)
51+
disposables.forEach((d) => d.dispose())
52+
quick_pick.dispose()
53+
})
54+
)
55+
quick_pick.show()
56+
}
57+
)
3258
return selected?.provider
3359
}
3460

@@ -125,10 +151,37 @@ export const edit_provider_for_config = async (
125151
detail: p.type,
126152
provider: p
127153
}))
128-
const selected_provider_item = await vscode.window.showQuickPick(
129-
provider_items,
130-
{ title: 'Model Providers' }
131-
)
154+
const selected_provider_item = await new Promise<
155+
(typeof provider_items)[0] | undefined
156+
>((resolve) => {
157+
const quick_pick =
158+
vscode.window.createQuickPick<(typeof provider_items)[0]>()
159+
quick_pick.items = provider_items
160+
quick_pick.title = 'Model Providers'
161+
quick_pick.buttons = [vscode.QuickInputButtons.Back]
162+
let accepted = false
163+
const disposables: vscode.Disposable[] = []
164+
165+
disposables.push(
166+
quick_pick.onDidAccept(() => {
167+
accepted = true
168+
resolve(quick_pick.selectedItems[0])
169+
quick_pick.hide()
170+
}),
171+
quick_pick.onDidTriggerButton((button) => {
172+
if (button === vscode.QuickInputButtons.Back) {
173+
quick_pick.hide()
174+
}
175+
}),
176+
quick_pick.onDidHide(() => {
177+
if (!accepted) resolve(undefined)
178+
disposables.forEach((d) => d.dispose())
179+
quick_pick.dispose()
180+
})
181+
)
182+
quick_pick.show()
183+
})
184+
132185
if (selected_provider_item) {
133186
return {
134187
provider_name: selected_provider_item.provider.name,
@@ -167,9 +220,6 @@ export const edit_model_for_config = async (
167220
return undefined
168221
}
169222

170-
let new_model_value: string | undefined
171-
let model_selected = false
172-
173223
try {
174224
const models = await model_fetcher.get_models({
175225
base_url,
@@ -182,15 +232,43 @@ export const edit_model_for_config = async (
182232
description: model.name ? model.id : undefined,
183233
detail: model.description
184234
}))
185-
const selected_model_item = await vscode.window.showQuickPick(
186-
model_items,
187-
{ title: 'Models', placeHolder: 'Choose a model' }
188-
)
235+
const selected_model_item = await new Promise<
236+
(typeof model_items)[0] | undefined
237+
>((resolve) => {
238+
const quick_pick =
239+
vscode.window.createQuickPick<(typeof model_items)[0]>()
240+
quick_pick.items = model_items
241+
quick_pick.title = 'Models'
242+
quick_pick.placeholder = 'Choose a model'
243+
quick_pick.buttons = [vscode.QuickInputButtons.Back]
244+
let accepted = false
245+
const disposables: vscode.Disposable[] = []
246+
247+
disposables.push(
248+
quick_pick.onDidAccept(() => {
249+
accepted = true
250+
resolve(quick_pick.selectedItems[0])
251+
quick_pick.hide()
252+
}),
253+
quick_pick.onDidTriggerButton((button) => {
254+
if (button === vscode.QuickInputButtons.Back) {
255+
quick_pick.hide()
256+
}
257+
}),
258+
quick_pick.onDidHide(() => {
259+
if (!accepted) resolve(undefined)
260+
disposables.forEach((d) => d.dispose())
261+
quick_pick.dispose()
262+
})
263+
)
264+
quick_pick.show()
265+
})
189266
if (selected_model_item) {
190-
new_model_value =
267+
return (
191268
selected_model_item.description || selected_model_item.label
192-
model_selected = true
269+
).trim()
193270
}
271+
return undefined
194272
} else {
195273
vscode.window.showWarningMessage(
196274
dictionary.warning_message.NO_MODELS_FOUND_MANUAL_ENTRY(
@@ -223,19 +301,13 @@ export const edit_model_for_config = async (
223301
}
224302
}
225303

226-
if (!model_selected) {
227-
const new_model_input = await vscode.window.showInputBox({
228-
title: 'Enter Model Name',
229-
value: config.model,
230-
prompt: `Enter a model name (ID)`
231-
})
232-
if (new_model_input !== undefined) {
233-
new_model_value = new_model_input
234-
}
235-
}
236-
237-
if (new_model_value !== undefined) {
238-
return new_model_value.trim()
304+
const new_model_input = await vscode.window.showInputBox({
305+
title: 'Enter Model Name',
306+
value: config.model,
307+
prompt: `Enter a model name (ID)`
308+
})
309+
if (new_model_input !== undefined) {
310+
return new_model_input.trim()
239311
}
240312
return undefined
241313
}

0 commit comments

Comments
 (0)