Skip to content

Commit 6f7358c

Browse files
wolfibDevtools-frontend LUCI CQ
authored andcommitted
[Patch agent] Handle project removal in SelectWorkspaceDialog
Fixed: 404490222 Change-Id: I776dab5b609c1095fedc3e9f615107ab4d6e938b Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6371432 Reviewed-by: Nikolay Vitkov <[email protected]> Commit-Queue: Wolfgang Beyer <[email protected]> Auto-Submit: Wolfgang Beyer <[email protected]>
1 parent eabb1f3 commit 6f7358c

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

front_end/panels/ai_assistance/SelectWorkspaceDialog.test.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// found in the LICENSE file.
44

55
import * as Persistence from '../../models/persistence/persistence.js';
6-
import type * as Workspace from '../../models/workspace/workspace.js';
6+
import * as Workspace from '../../models/workspace/workspace.js';
77
import {createTestFilesystem} from '../../testing/AiAssistanceHelpers.js';
88
import {dispatchKeyDownEvent} from '../../testing/DOMHelpers.js';
99
import {describeWithEnvironment} from '../../testing/EnvironmentHelpers.js';
@@ -13,6 +13,13 @@ import * as UI from '../../ui/legacy/legacy.js';
1313
import * as AiAssistance from './ai_assistance.js';
1414

1515
describeWithEnvironment('SelectWorkspaceDialog', () => {
16+
afterEach(() => {
17+
const workspace = Workspace.Workspace.WorkspaceImpl.instance();
18+
for (const project of workspace.projects()) {
19+
workspace.removeProject(project);
20+
}
21+
});
22+
1623
function createComponent(): {
1724
view: ViewFunctionStub<typeof AiAssistance.SelectWorkspaceDialog>,
1825
component: AiAssistance.SelectWorkspaceDialog,
@@ -91,4 +98,24 @@ describeWithEnvironment('SelectWorkspaceDialog', () => {
9198
assert.strictEqual(input.projects[2].name, 'test3');
9299
assert.strictEqual(input.selectedIndex, 2);
93100
});
101+
102+
it('handles project removal', async () => {
103+
const addProjectSpy =
104+
sinon.spy(Persistence.IsolatedFileSystemManager.IsolatedFileSystemManager.instance(), 'addFileSystem');
105+
const {view, project} = createComponent();
106+
107+
view.input.onProjectSelected(1);
108+
let input = await view.nextInput;
109+
assert.strictEqual(view.callCount, 2);
110+
assert.lengthOf(input.projects, 2);
111+
assert.strictEqual(input.selectedIndex, 1);
112+
113+
input.onAddFolderButtonClick();
114+
assert.isTrue(addProjectSpy.calledOnce);
115+
116+
Workspace.Workspace.WorkspaceImpl.instance().removeProject(project);
117+
input = await view.nextInput;
118+
assert.lengthOf(input.projects, 1);
119+
assert.strictEqual(input.selectedIndex, 0);
120+
});
94121
});

front_end/panels/ai_assistance/SelectWorkspaceDialog.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,14 @@ export class SelectWorkspaceDialog extends UI.Widget.VBox {
150150
const document = UI.InspectorView.InspectorView.instance().element.ownerDocument;
151151
document.addEventListener('keydown', this.#boundOnKeyDown, true);
152152
this.#workspace.addEventListener(Workspace.Workspace.Events.ProjectAdded, this.#onProjectAdded, this);
153+
this.#workspace.addEventListener(Workspace.Workspace.Events.ProjectRemoved, this.#onProjectRemoved, this);
153154
}
154155

155156
override willHide(): void {
156157
const document = UI.InspectorView.InspectorView.instance().element.ownerDocument;
157158
document.removeEventListener('keydown', this.#boundOnKeyDown, true);
158159
this.#workspace.removeEventListener(Workspace.Workspace.Events.ProjectAdded, this.#onProjectAdded, this);
160+
this.#workspace.removeEventListener(Workspace.Workspace.Events.ProjectRemoved, this.#onProjectRemoved, this);
159161
}
160162

161163
#onKeyDown(event: KeyboardEvent): void {
@@ -217,6 +219,25 @@ export class SelectWorkspaceDialog extends UI.Widget.VBox {
217219
this.requestUpdate();
218220
}
219221

222+
#onProjectRemoved(): void {
223+
const selectedProject = (this.#selectedIndex >= 0 && this.#selectedIndex < this.#projects.length) ?
224+
this.#projects[this.#selectedIndex] :
225+
null;
226+
this.#projects = this.#getProjects();
227+
if (selectedProject) {
228+
const projectIndex = this.#projects.indexOf(selectedProject);
229+
// If the previously selected project still exists, select it again.
230+
// If the previously selected project has been removed, select the project which is now in its
231+
// position. If the previously selected and now removed project was in last position, select
232+
// the project which is now in last position.
233+
this.#selectedIndex =
234+
projectIndex === -1 ? Math.min(this.#projects.length - 1, this.#selectedIndex) : projectIndex;
235+
} else {
236+
this.#selectedIndex = 0;
237+
}
238+
this.requestUpdate();
239+
}
240+
220241
static show(
221242
onProjectSelected: (project: Workspace.Workspace.Project) => void,
222243
currentProject?: Workspace.Workspace.Project): void {

0 commit comments

Comments
 (0)