diff --git a/src/domain/navigation/index.js b/src/domain/navigation/index.js index d21bcad4..ffc5ee9b 100644 --- a/src/domain/navigation/index.js +++ b/src/domain/navigation/index.js @@ -132,11 +132,16 @@ export function parseUrlPath(urlPath, currentNavPath, defaultSessionId) { segments.push(roomsSegmentWithRoom(rooms, roomId, currentNavPath)); } segments.push(new Segment("room", roomId)); - // Add right-panel segments from previous path - const previousSegments = currentNavPath.segments; - const i = previousSegments.findIndex(s => s.type === "right-panel"); - if (i !== -1) { - segments.push(...previousSegments.slice(i)); + const openRoomPartIndex = parts.findIndex(part => part === "open-room"); + const hasOnlyRoomIdAfterPart = openRoomPartIndex >= parts.length - 2; + if (hasOnlyRoomIdAfterPart) { + // Copy right-panel segments from previous path only if there are no other parts after open-room + // fixes memberlist -> member details closing/opening grid view + const previousSegments = currentNavPath.segments; + const i = previousSegments.findIndex(s => s.type === "right-panel"); + if (i !== -1) { + segments.push(...previousSegments.slice(i)); + } } } else if (type === "last-session") { let sessionSegment = currentNavPath.get("session"); @@ -333,6 +338,28 @@ export function tests() { assert.equal(segments[4].type, "details"); assert.equal(segments[4].value, true); }, + "open-room action should only copy over previous segments if there are no parts after open-room": assert => { + const nav = new Navigation(allowsChild); + const path = nav.pathFrom([ + new Segment("session", 1), + new Segment("rooms", ["a", "b", "c"]), + new Segment("room", "b"), + new Segment("right-panel", true), + new Segment("members", true) + ]); + const segments = parseUrlPath("/session/1/open-room/a/member/foo", path); + assert.equal(segments.length, 5); + assert.equal(segments[0].type, "session"); + assert.equal(segments[0].value, "1"); + assert.equal(segments[1].type, "rooms"); + assert.deepEqual(segments[1].value, ["a", "b", "c"]); + assert.equal(segments[2].type, "room"); + assert.equal(segments[2].value, "a"); + assert.equal(segments[3].type, "right-panel"); + assert.equal(segments[3].value, true); + assert.equal(segments[4].type, "member"); + assert.equal(segments[4].value, "foo"); + }, "parse open-room action setting a room in an empty tile": assert => { const nav = new Navigation(allowsChild); const path = nav.pathFrom([ diff --git a/src/domain/session/rightpanel/MemberTileViewModel.js b/src/domain/session/rightpanel/MemberTileViewModel.js index 91a07f0c..eac6a6d4 100644 --- a/src/domain/session/rightpanel/MemberTileViewModel.js +++ b/src/domain/session/rightpanel/MemberTileViewModel.js @@ -47,7 +47,8 @@ export class MemberTileViewModel extends ViewModel { } get detailsUrl() { - return `${this.urlCreator.urlUntilSegment("room")}/member/${this._member.userId}`; + const roomId = this.navigation.path.get("room").value; + return `${this.urlCreator.openRoomActionUrl(roomId)}/member/${this._member.userId}`; } _updatePreviousName(newName) {