From c0522313572b6483c3db664ab2bb547ac77312f5 Mon Sep 17 00:00:00 2001 From: Helmi Akermi <70575401+hakermi@users.noreply.github.com> Date: Thu, 12 Feb 2026 11:27:26 +0100 Subject: [PATCH 1/2] fix: Breadcrumb displayed title not updated when restore a version - MEED-10215 - Meeds-io/meeds#4029 (#1620) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prior to this change, when restoring a version, the breadcrumb displayed the original note title instead of the selected version’s title. This happened because the `getBreadcrumb` endpoint did not take the lang query parameter into account. Instead, it relied on the request’s locale language. As a result, when the requested locale did not match the targeted version language, the endpoint fell back to the original note title. This PR updates the title resolution logic to use the provided target language query parameter, ensuring that the correct version title is displayed in the breadcrumb. --- .../exoplatform/wiki/service/impl/NoteServiceImpl.java | 2 +- .../exoplatform/wiki/service/rest/NotesRestService.java | 2 +- .../org/exoplatform/wiki/storage/EntityConverter.java | 1 + .../webapp/vue-app/notes/components/NotesOverview.vue | 8 +++++++- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java b/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java index b97f3e58b..c8cd8b977 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java @@ -2077,7 +2077,7 @@ private List getBreadCrumb(List list, private String getNoteTitleWithTraduction(Page note, Identity userIdentity, String source, String lang) throws WikiException, IllegalAccessException { - if (userIdentity == null || StringUtils.isEmpty(lang)) { + if (userIdentity == null) { return note.getTitle(); } Page page = getNoteByIdAndLang(Long.valueOf(note.getId()), userIdentity, source, lang); diff --git a/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java b/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java index a4908bad2..a5bfbb121 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java @@ -319,7 +319,7 @@ public Response getNoteById(@Parameter(description = "Note id", required = true) note.setBreadcrumb(noteService.getBreadCrumb(note.getWikiType(), note.getWikiOwner(), note.getName(), - request.getLocale().getLanguage(), + lang, identity, false)); return Response.ok(note).build(); diff --git a/notes-service/src/main/java/org/exoplatform/wiki/storage/EntityConverter.java b/notes-service/src/main/java/org/exoplatform/wiki/storage/EntityConverter.java index c5919c1d2..f302a77d1 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/storage/EntityConverter.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/storage/EntityConverter.java @@ -325,6 +325,7 @@ public static PageHistory convertPageVersionEntityToPageHistory(PageVersionEntit pageHistory.setUpdatedDate(pageVersionEntity.getUpdatedDate()); pageHistory.setLang(pageVersionEntity.getLang()); pageHistory.setTitle(pageVersionEntity.getTitle()); + pageHistory.setName(pageVersionEntity.getName()); buildNotePageMetadata(pageHistory, false, String.valueOf(pageVersionEntity.getPage().getId())); if (StringUtils.isNotBlank(pageHistory.getAuthor())) { Identity identity = ExoContainerContext.getService(IdentityManager.class) diff --git a/notes-webapp/src/main/webapp/vue-app/notes/components/NotesOverview.vue b/notes-webapp/src/main/webapp/vue-app/notes/components/NotesOverview.vue index 3711b5aa5..76b6542a6 100644 --- a/notes-webapp/src/main/webapp/vue-app/notes/components/NotesOverview.vue +++ b/notes-webapp/src/main/webapp/vue-app/notes/components/NotesOverview.vue @@ -616,8 +616,13 @@ export default { canScheduleNotePublication() { return this.note?.canManage || this.canSchedule; }, + hasTranslations() { + return !!this.translations?.length; + }, targetLang() { - return this.selectedTranslation?.value || this.lang; + return this.hasTranslations + ? (this.selectedTranslation?.value || this.lang) + : null; }, parentPageId() { return this.note?.parentPageId; @@ -1057,6 +1062,7 @@ export default { restoreVersion(version) { const note = { id: this.note.id, + name: version.name, title: version.title, content: version.content, updatedDate: version.updatedDate, From 8e27583d9429dbf459a4f6af68ec4857ad938b17 Mon Sep 17 00:00:00 2001 From: Helmi Akermi <70575401+hakermi@users.noreply.github.com> Date: Thu, 12 Feb 2026 17:57:10 +0100 Subject: [PATCH 2/2] fix: Toc displayed title not updated when restore a version - MEED-10246 - Meeds-io/meeds#4029 (#1622) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prior to this change, when restoring a version, the table of content displays the original note title instead of the selected version’s title. This happened because the Resolving titles of Toc json tree doesn't take into consideration the non exiting or target default request lang version This PR updates the title resolution to check the existence of the target version lang otherwise returns last published version title, ensuring that the correct version title is --- .../org/exoplatform/wiki/service/impl/NoteServiceImpl.java | 5 +++-- .../exoplatform/wiki/service/rest/NotesRestService.java | 2 +- .../java/org/exoplatform/wiki/tree/utils/TreeUtils.java | 7 ++++++- .../main/webapp/vue-app/notes/components/NotesOverview.vue | 7 +------ 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java b/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java index c8cd8b977..b64a67060 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java @@ -2081,10 +2081,11 @@ private String getNoteTitleWithTraduction(Page note, Identity userIdentity, Stri return note.getTitle(); } Page page = getNoteByIdAndLang(Long.valueOf(note.getId()), userIdentity, source, lang); - if (page != null) { + if (page != null && page.getLang() != null) { return page.getTitle(); } - return note.getTitle(); + Page publishedVersion = getPublishedVersionByPageIdAndLang(Long.valueOf(note.getId()), null); + return Objects.requireNonNullElse(publishedVersion, note).getTitle(); } private String getDraftNameSuffix(long clientTime) { diff --git a/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java b/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java index a5bfbb121..a4908bad2 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java @@ -319,7 +319,7 @@ public Response getNoteById(@Parameter(description = "Note id", required = true) note.setBreadcrumb(noteService.getBreadCrumb(note.getWikiType(), note.getWikiOwner(), note.getName(), - lang, + request.getLocale().getLanguage(), identity, false)); return Response.ok(note).build(); diff --git a/notes-service/src/main/java/org/exoplatform/wiki/tree/utils/TreeUtils.java b/notes-service/src/main/java/org/exoplatform/wiki/tree/utils/TreeUtils.java index 2ef068ff1..839f44b0e 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/tree/utils/TreeUtils.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/tree/utils/TreeUtils.java @@ -294,8 +294,13 @@ private static void encodeWikiTreeNode(JsonNodeData nodeData, Locale locale, Ide } else { if (!nodeData.isDraftPage()) { Page page = noteService.getNoteByIdAndLang(Long.valueOf(nodeData.getNoteId()), identity, "", locale.getLanguage()); - if (page != null) { + if (page != null && page.getLang() != null) { nodeData.setName(page.getTitle()); + return; + } + Page publishedVersion = noteService.getPublishedVersionByPageIdAndLang(Long.valueOf(nodeData.getNoteId()), null); + if (publishedVersion != null) { + nodeData.setName(publishedVersion.getTitle()); } } } diff --git a/notes-webapp/src/main/webapp/vue-app/notes/components/NotesOverview.vue b/notes-webapp/src/main/webapp/vue-app/notes/components/NotesOverview.vue index 76b6542a6..63a797149 100644 --- a/notes-webapp/src/main/webapp/vue-app/notes/components/NotesOverview.vue +++ b/notes-webapp/src/main/webapp/vue-app/notes/components/NotesOverview.vue @@ -616,13 +616,8 @@ export default { canScheduleNotePublication() { return this.note?.canManage || this.canSchedule; }, - hasTranslations() { - return !!this.translations?.length; - }, targetLang() { - return this.hasTranslations - ? (this.selectedTranslation?.value || this.lang) - : null; + return this.selectedTranslation?.value || this.lang; }, parentPageId() { return this.note?.parentPageId;