Repository navigation
OpenConceptLab/ocl_online#418 | Unified navigation: shared tray, + menu and Mapping Projects profile tab - #122
Conversation
…nu and Mapping Projects profile tab
|
Updated review after Jon's revised unified-navigation design on OpenConceptLab/ocl_online#418. Correction: I withdraw the earlier app-switcher finding and the suggestion to retain Mapper's local signed-in project list. The revised design intentionally uses one work-oriented tray and redirects the Mapper list to the TermBrowser profile tab. Remaining findings — request changes:
The corrected cross-repo review is on OpenConceptLab/ocl_online#418. |
…counts, selection, configurable URLs, tests
|
Addressed the review in 9cca2ab: the tray now highlights Mapping Projects on project pages, shows the Mapping Projects count (user plus organization projects), and tests cover TermBrowser URL resolution (configured, official host, localhost, custom host). An unconfigured custom host resolving to the production TermBrowser is intended, so that finding is not changed. |
Final review — DO NOT MERGE (
|
…nfigured or on a recognized OCL host
|
Addressed the final review in 538a4f6: an integrated TermBrowser now requires TERMBROWSER_URL, localhost, or a recognized openconceptlab.org Mapper host. Without it the Mapper keeps its own project list, and the TermBrowser-linked tray items, search, create items and logo link are hidden. Existing entity links keep their previous behavior. Tests added. |
Final review — round 2Recommendation: DO NOT MERGE yet. Most of the prior fail-closed issue is fixed at head One blocking path remains in the new Please hide/replace those breadcrumb destinations when GitHub PR checks and Snyk are currently passing. (Final review round 2) |
… a configured TermBrowser
|
Addressed round 2 in db31c5f: without a configured TermBrowser the breadcrumb shows the owner as text and the Mapping Projects crumb links to the local list; regression tests added. |
…nese Bulk Import label Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nity website Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…irst, with Save and leave Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…'s search, for this project's rows or all of OCL Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t from the component Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…; a refused new project keeps its explanation; a standalone Mapper keeps its own pages - Leaving after a save failed warns until a save succeeds, as the removed decisions-based warning did. - The project list no longer redirects to TBv3 while it shows why a new project was refused. - localhost counts as connected to a TermBrowser only when TERMBROWSER_URL is set, and docker-compose no longer defaults it to localhost:4002. - The community-site link constant moves below PRIVACY_POLICY_URL, away from the lines the banner PR (oclmap#121) removes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…editing a review note autosave, like other decisions Without the removed decisions-based leave warning, these edits had nothing protecting them: they scheduled no autosave, so leaving dropped them silently. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… search placeholder string; Stop and leave reuses leaveTo Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed warns, and an in-app leave saves those changes Configure's edits save when it closes. Without the removed decisions-based warning, closing the tab or following a cross-app link with Configure still open dropped them silently. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex review, pass 1 (codex-cli 0.166.0, commit 95852a0)Verdict: findings: F1.1 P1, F1.2 P1, F1.3 P1.
findings.json{
"reviewer": "codex-cli 0.166.0",
"perspective": "defects",
"mode": "full",
"commit": "95852a062fba7867d87d53df4fd97f41bf15f7cc",
"verdict": "findings",
"prior": [],
"findings": [
{
"id": "F1.1",
"severity": "P1",
"tag": null,
"file": "src/components/map-projects/leaveGuard.js",
"line": 14,
"claim": "Failed autosaves no longer leave an unload warning protecting unsaved decisions.",
"scenario": "Change a decision in a saved project and let its autosave fail with a network error or HTTP 500. The scheduler has cleared its pending timer and onSave clears inFlightSaveRef, so this predicate returns false. Closing the tab or following a cross-app link silently discards the change. The removed decisions-based beforeunload handler previously warned in this case.",
"action": "Track unsaved changes until a save succeeds and retain the unload warning after failure. Add a regression test covering a failed autosave followed by navigation.",
"lines_delta": null,
"confidence": "high"
},
{
"id": "F1.2",
"severity": "P1",
"tag": null,
"file": "src/components/map-projects/MapProjectsRedirect.jsx",
"line": 7,
"claim": "The redirect immediately removes the existing blocked-project dialog.",
"scenario": "With a Term Browser configured, a denied new-project attempt redirects to '/' with state.newProjectBlock. MapProjects mounts, copies that reason into component state, and clears the history state. This wrapper then recomputes redirect as true, unmounts the dialog, and sends the user to TBv3 without explaining why creation failed. Reproduced with the actual wrapper and MapProjects lifecycle.",
"action": "Preserve the local fallback while the block message is being displayed, independently of the consumed history state. Test the complete route transition.",
"lines_delta": null,
"confidence": "high"
},
{
"id": "F1.3",
"severity": "P1",
"tag": null,
"file": "src/common/appUrls.js",
"line": 9,
"claim": "Unconfigured standalone installs incorrectly enable Term Browser redirects.",
"scenario": "Run only Mapper at localhost:4004 with TERMBROWSER_URL unset. This resolver reports localhost:4002 as an integrated Term Browser, so signed-in visits to '/' or '/map-projects' redirect to a nonexistent service instead of displaying the local project list. docker-compose.yml also injects that default on custom hosts, contrary to the approved configuration rule.",
"action": "Remove implicit localhost integration and default the Compose setting to empty. Enable cross-app redirects only for an explicitly configured URL or recognized official hostname.",
"lines_delta": null,
"confidence": "high"
}
]
}Codex review, pass 2 (codex-cli 0.166.0, commit 14d0134)Verdict: findings: F2.1 P1.
findings.json{
"reviewer": "codex-cli 0.166.0",
"perspective": "defects",
"mode": "verify",
"commit": "14d0134510d4fc440a5e7acbdb636650b81a5fd9",
"verdict": "findings",
"prior": [
{
"id": "F1.1",
"status": "resolved"
},
{
"id": "F1.2",
"status": "resolved"
},
{
"id": "F1.3",
"status": "resolved"
}
],
"findings": [
{
"id": "F2.1",
"severity": "P1",
"tag": null,
"file": "src/components/map-projects/MapProject.jsx",
"line": 430,
"claim": "Removing the decisions-based unload warning leaves saved-project edits that do not schedule autosave unprotected.",
"scenario": "Open a saved project with an existing mapping decision, wait for saves to finish, edit its Review note, then click the OCL logo or close the tab. The note handler only calls setNotes; it schedules no autosave. Every condition in the new unload guard is therefore false, and the note is silently discarded. The removed decisions-based listener previously warned in this case.",
"action": "Track unsaved persistent edits independently of pending requests, or ensure those edits schedule autosave, and include them in the unload guard. Add a regression test covering a note edit followed by navigation.",
"lines_delta": null,
"confidence": "high"
}
]
}Codex review, pass 3 (codex-cli 0.166.0, commit 42acd47)Verdict: findings: F3.1 P1, F3.2 P1, F3.3 P2.
findings.json{
"reviewer": "codex-cli 0.166.0",
"perspective": "defects",
"mode": "verify",
"commit": "42acd47832ee0e70cb8d81adbe0a9583ecb5299d",
"verdict": "findings",
"prior": [
{
"id": "F1.1",
"status": "resolved"
},
{
"id": "F1.2",
"status": "resolved"
},
{
"id": "F1.3",
"status": "resolved"
},
{
"id": "F2.1",
"status": "unresolved"
}
],
"findings": [
{
"id": "F3.1",
"severity": "P1",
"tag": null,
"file": "src/components/map-projects/MapProject.jsx",
"line": 431,
"claim": "Unsaved configuration edits no longer trigger the unload warning.",
"scenario": "Open Configure on a saved project, change its name or description, then follow the header logo without closing Configure. These setters schedule no autosave until closeConfiguration runs, so every unload-guard condition is false and the edits disappear without warning. The removed decisions-based guard previously protected this navigation.",
"action": "Track outstanding configuration edits independently of the autosave timer and include them in leave protection.",
"lines_delta": null,
"confidence": "high"
},
{
"id": "F3.2",
"severity": "P1",
"tag": null,
"file": "src/components/map-projects/MapProject.jsx",
"line": 6803,
"claim": "The review-note fix schedules a save that can omit the note entirely.",
"scenario": "In a saved project, enter a review note on a row that has never been mapped. onSave builds matches only from mapSelected, which excludes that row, and the CSV export also omits notes. After autosave succeeds, the unload warning clears although the note was never persisted; navigating away loses it. This leaves F2.1 unresolved for unmapped rows.",
"action": "Persist and restore notes for every row, including rows absent from mapSelected, and verify an edit\u2013autosave\u2013reopen round trip.",
"lines_delta": null,
"confidence": "high"
},
{
"id": "F3.3",
"severity": "P2",
"tag": null,
"file": "src/components/map-projects/MapProjectsRedirect.jsx",
"line": 17,
"claim": "Cancelling the automatic redirect leaves an empty project-list page.",
"scenario": "With TBv3 configured, open a saved project from the local list retained after a refused new project, edit it, then press Back within the autosave window. Unmount starts a save, so the automatic location.replace triggers the global unload warning. Choosing Stay leaves this component rendering null permanently, even after the save completes.",
"action": "Wait for outstanding saves before redirecting and retain a usable fallback when navigation is cancelled.",
"lines_delta": null,
"confidence": "high"
}
]
}Simplification review (Claude subagent, commit 14d0134)5 suggestions. Applied in 1b1a1fd: S1 (an unused search placeholder string removed from four locales) and S2 (Stop and leave reuses leaveTo). Declined for today's deploy: S3 (a duplicate leave-guard test; cheap, kept), S4 (getAppTitle alias; touches DocumentTitle), S5 (shared tray sx constants; restyles the main tray render, follow-up together with oclweb3). Codex check of commits 42acd47..ee77521 (codex-cli 0.166.0)Verdict: clean. findings.json{
"reviewer": "codex-cli 0.166.0",
"perspective": "defects",
"mode": "final",
"commit": "ee7752144a5aeb484a21f4bc6e6744802cd9cf4e",
"verdict": "clean",
"prior": [
{
"id": "F3.1",
"status": "resolved"
},
{
"id": "F3.2",
"status": "unresolved"
},
{
"id": "F3.3",
"status": "unresolved"
}
],
"findings": []
} |
paynejd
left a comment
There was a problem hiding this comment.
Approved after the takeover review: Codex 3 passes (all P1s fixed) + clean final check, simplification review applied, CI green. OpenConceptLab/ocl_online#418
Part of OpenConceptLab/ocl_online#418, following the design revision on the ticket.
//and/map-projectsredirect to the oclweb3 profile tab when signed inTERMBROWSER_URLconfig replaces the unusedOCL_ONLINEvariableSibling PRs: OpenConceptLab/oclweb3#89, https://github.com/OpenConceptLab/ocl-community-site/pull/213
🤖 Generated with Claude Code