From d13131362e67ad4872c623511cafbb2fb92ed514 Mon Sep 17 00:00:00 2001 From: Cindy Cicalese Date: Wed, 25 Feb 2026 08:55:36 -0500 Subject: [PATCH 1/3] Correctly handles redirects Fixes #90 Fixes #58 --- resources/js/ApiConnectionsBuilder.js | 2 +- resources/js/ApiPageConnectionRepo.js | 24 +++++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/resources/js/ApiConnectionsBuilder.js b/resources/js/ApiConnectionsBuilder.js index d009f25..67df52a 100644 --- a/resources/js/ApiConnectionsBuilder.js +++ b/resources/js/ApiConnectionsBuilder.js @@ -50,7 +50,7 @@ module.ApiConnectionsBuilder = ( function () { pages[centralPage.title] = { title: centralPage.title, external: false, isRedirect: false }; centralPage.outgoingLinks.forEach( - page => { pages[page.title] = { title: page.title, external: false } } + page => { pages[page.title] = { title: page.title, external: false, isRedirect: false } } ); centralPage.incomingLinks.forEach( diff --git a/resources/js/ApiPageConnectionRepo.js b/resources/js/ApiPageConnectionRepo.js index 2afa1d6..6bf798d 100644 --- a/resources/js/ApiPageConnectionRepo.js +++ b/resources/js/ApiPageConnectionRepo.js @@ -48,10 +48,7 @@ module.ApiPageConnectionRepo = ( function ( mw, ApiConnectionsBuilder ) { let missingPages = this._getMissingPages(pages) - // @Attention!! this won't include the redirects - // (the redirects are at pageInfoResponse.query.redirects !) - // so connections.pages and pageInfoResponse.query.pages - // may differ + let redirectMap = this._buildRedirectMap(pageInfoResponse) let displayTitles = this._getDisplayTitles(pages) this._getTitleIcons(pages) @@ -64,10 +61,13 @@ module.ApiPageConnectionRepo = ( function ( mw, ApiConnectionsBuilder ) { if (page.isExternal) { page.displayTitle = page.title; - } else if ( !page.isRedirect ) { - page.displayTitle = displayTitles[page.title]; } else { - page.displayTitle = page.title; + let resolvedTitle = redirectMap[page.title] || page.title; + page.displayTitle = displayTitles[resolvedTitle] || page.title; + } + + if (redirectMap[page.title]) { + page.isRedirect = true; } if (titleIcons.images[page.title]) { @@ -152,6 +152,16 @@ module.ApiPageConnectionRepo = ( function ( mw, ApiConnectionsBuilder ) { return displayTitles } + ApiPageConnectionRepo.prototype._buildRedirectMap = function(pageInfoResponse) { + let redirectMap = {}; + if (pageInfoResponse.query.redirects) { + pageInfoResponse.query.redirects.forEach(function(redirect) { + redirectMap[redirect.from] = redirect.to; + }); + } + return redirectMap; + } + ApiPageConnectionRepo.prototype._getTitleIcons = function(pages) { return new Promise( function(resolve) { From 9cd9198142462c64db138cefcc94cc2987753874 Mon Sep 17 00:00:00 2001 From: Cindy Cicalese Date: Wed, 25 Feb 2026 19:29:27 -0500 Subject: [PATCH 2/3] Use resolved redirect target as display title fallback When a page has no custom display title, fall back to the resolved redirect target title instead of the original redirect source title. --- resources/js/ApiPageConnectionRepo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/js/ApiPageConnectionRepo.js b/resources/js/ApiPageConnectionRepo.js index 6bf798d..f0d4ba7 100644 --- a/resources/js/ApiPageConnectionRepo.js +++ b/resources/js/ApiPageConnectionRepo.js @@ -63,7 +63,7 @@ module.ApiPageConnectionRepo = ( function ( mw, ApiConnectionsBuilder ) { page.displayTitle = page.title; } else { let resolvedTitle = redirectMap[page.title] || page.title; - page.displayTitle = displayTitles[resolvedTitle] || page.title; + page.displayTitle = displayTitles[resolvedTitle] || resolvedTitle; } if (redirectMap[page.title]) { From 1e982d971eda86b2648eab95895f9b30c84812e3 Mon Sep 17 00:00:00 2001 From: Cindy Cicalese Date: Wed, 25 Feb 2026 14:15:38 -0500 Subject: [PATCH 3/3] Fix page dedup cache, redirect title icon lookup, and missing isRedirect Fix issues found by CodeRabbit in #92 - Assign concat result back to _addedPages so the dedup cache actually grows across addConnections calls - Build a redirect map from the API response and use it to resolve title icon lookups for redirected pages - Add isRedirect: false to outgoing and external link page entries for consistency with central page and incoming link entries --- resources/js/ApiConnectionsBuilder.js | 6 +++--- resources/js/ApiPageConnectionRepo.js | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/resources/js/ApiConnectionsBuilder.js b/resources/js/ApiConnectionsBuilder.js index 67df52a..631030b 100644 --- a/resources/js/ApiConnectionsBuilder.js +++ b/resources/js/ApiConnectionsBuilder.js @@ -67,12 +67,12 @@ module.ApiConnectionsBuilder = ( function () { if (title !== null) { let titleStr = title.getPrefixedText(); page['*'] = titleStr; - pages[titleStr] = { title: titleStr, external: false } + pages[titleStr] = { title: titleStr, external: false, isRedirect: false } } else { - pages[page['*']] = { title: page['*'], external: true } + pages[page['*']] = { title: page['*'], external: true, isRedirect: false } } } else { - pages[page['*']] = { title: page['*'], external: true } + pages[page['*']] = { title: page['*'], external: true, isRedirect: false } } } ); diff --git a/resources/js/ApiPageConnectionRepo.js b/resources/js/ApiPageConnectionRepo.js index f0d4ba7..2be180c 100644 --- a/resources/js/ApiPageConnectionRepo.js +++ b/resources/js/ApiPageConnectionRepo.js @@ -25,7 +25,7 @@ module.ApiPageConnectionRepo = ( function ( mw, ApiConnectionsBuilder ) { if (pagesToAdd.length === 0) { resolve({pages: [], links: []}); } else { - this._addedPages.concat(pagesToAdd); + this._addedPages = this._addedPages.concat(pagesToAdd); this._queryLinks(pagesToAdd).done( function(apiResponse) { @@ -70,10 +70,11 @@ module.ApiPageConnectionRepo = ( function ( mw, ApiConnectionsBuilder ) { page.isRedirect = true; } - if (titleIcons.images[page.title]) { - page.image = titleIcons.images[page.title]; - } else if (titleIcons.text[page.title]) { - page.text = titleIcons.text[page.title]; + let iconKey = redirectMap[page.title] || page.title; + if (titleIcons.images[iconKey]) { + page.image = titleIcons.images[iconKey]; + } else if (titleIcons.text[iconKey]) { + page.text = titleIcons.text[iconKey]; } });