Skip to content

Commit 67cd8f7

Browse files
fix(library): keep revealed selection state consistent
1 parent 5684407 commit 67cd8f7

2 files changed

Lines changed: 48 additions & 4 deletions

File tree

library/lib/apollon-editor.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,11 +1144,13 @@ export class ApollonEditor {
11441144
elementId: string | null,
11451145
options?: { reveal?: boolean }
11461146
): void {
1147-
const { nodes, edges, setNodes, setEdges } = this.diagramStore.getState()
1147+
const { nodes, edges, setNodes, setEdges, setSelectedElementsId } =
1148+
this.diagramStore.getState()
11481149

11491150
if (elementId === null) {
11501151
setNodes((current) => current.map((n) => ({ ...n, selected: false })))
11511152
setEdges((current) => current.map((e) => ({ ...e, selected: false })))
1153+
setSelectedElementsId([])
11521154
this.assessmentSelectionStore.getState().selectMultipleElements([])
11531155
this.popoverStore.getState().setPopOverElementId(null)
11541156
return
@@ -1173,6 +1175,7 @@ export class ApollonEditor {
11731175
setEdges((current) =>
11741176
current.map((edge) => ({ ...edge, selected: edge.id === targetId }))
11751177
)
1178+
setSelectedElementsId([targetId])
11761179
// Selection follows what the caller asked for, not what had to be opened to
11771180
// show it. Asking for a class selects the class and its members, so a host
11781181
// list marks the whole group; asking for one method selects that method
@@ -1182,7 +1185,13 @@ export class ApollonEditor {
11821185
this.assessmentSelectionStore
11831186
.getState()
11841187
.selectMultipleElements(assessedIdsFor(elementId, nodes))
1185-
this.popoverStore.getState().setPopOverElementId(targetId)
1188+
this.popoverStore
1189+
.getState()
1190+
.setPopOverElementId(
1191+
this.metadataStore.getState().mode === Apollon.ApollonMode.Assessment
1192+
? targetId
1193+
: null
1194+
)
11861195

11871196
if (options?.reveal === false || !isTopLevel) return
11881197

library/tests/unit/revealAssessment.test.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,10 @@ describe("ApollonEditor.revealAssessment", () => {
7373

7474
const internals = editor as unknown as {
7575
diagramStore: {
76-
getState: () => { nodes: { id: string; selected?: boolean }[] }
76+
getState: () => {
77+
nodes: { id: string; selected?: boolean }[]
78+
selectedElementIds: string[]
79+
}
7780
}
7881
popoverStore: { getState: () => { popoverElementId: string | null } }
7982
assessmentSelectionStore: {
@@ -86,6 +89,9 @@ describe("ApollonEditor.revealAssessment", () => {
8689
.map((node) => node.id)
8790

8891
expect(selected).toEqual(["node-b"])
92+
expect(internals.diagramStore.getState().selectedElementIds).toEqual([
93+
"node-b",
94+
])
8995
expect(internals.popoverStore.getState().popoverElementId).toBe("node-b")
9096
expect(
9197
internals.assessmentSelectionStore.getState().selectedElementIds
@@ -121,7 +127,12 @@ describe("ApollonEditor.revealAssessment", () => {
121127
editor.revealAssessment(null)
122128

123129
const internals = editor as unknown as {
124-
diagramStore: { getState: () => { nodes: { selected?: boolean }[] } }
130+
diagramStore: {
131+
getState: () => {
132+
nodes: { selected?: boolean }[]
133+
selectedElementIds: string[]
134+
}
135+
}
125136
popoverStore: { getState: () => { popoverElementId: string | null } }
126137
assessmentSelectionStore: {
127138
getState: () => { selectedElementIds: string[] }
@@ -130,6 +141,7 @@ describe("ApollonEditor.revealAssessment", () => {
130141
expect(
131142
internals.diagramStore.getState().nodes.some((node) => node.selected)
132143
).toBe(false)
144+
expect(internals.diagramStore.getState().selectedElementIds).toEqual([])
133145
expect(internals.popoverStore.getState().popoverElementId).toBeNull()
134146
expect(
135147
internals.assessmentSelectionStore.getState().selectedElementIds
@@ -163,4 +175,27 @@ describe("ApollonEditor.revealAssessment", () => {
163175
}
164176
expect(internals.popoverStore.getState().popoverElementId).toBe("ghost-id")
165177
})
178+
179+
it("selects without opening editing UI outside assessment mode", () => {
180+
editor.destroy()
181+
editor = new ApollonEditor(container, {
182+
mode: ApollonMode.Modelling,
183+
model: MODEL,
184+
})
185+
186+
editor.revealAssessment("node-b")
187+
188+
const internals = editor as unknown as {
189+
diagramStore: {
190+
getState: () => {
191+
selectedElementIds: string[]
192+
}
193+
}
194+
popoverStore: { getState: () => { popoverElementId: string | null } }
195+
}
196+
expect(internals.diagramStore.getState().selectedElementIds).toEqual([
197+
"node-b",
198+
])
199+
expect(internals.popoverStore.getState().popoverElementId).toBeNull()
200+
})
166201
})

0 commit comments

Comments
 (0)