feat(trips): owner publish/unpublish toggle on /trips listing
Add an owner-only publish switch to each /trips card. It POSTs to a new
entry-actions route that mutates trip.md `published` and invalidates the
page-tree cache so the listing, nav and home reflect the change on the
next load. Owner sees drafts (Draft badge); anon/non-owner unchanged.
- U1 EntryScopeGuard::resolveTripChild — resolve a slug to a direct child
of /trips (drafts included, for republish)
- U2 POST /api/v1/trip/{slug}/publish (setTripPublished) — owner-gated
write, strict is_bool body, header-mutation save, audit log
- U3 trip-publish-toggle partial + CSS (role=switch, Draft badge, visible
failure toast, ≥44px target)
- U4 owner-aware /trips listing + card restructure (toggle overlays cover
as a non-anchor sibling; works for coverless drafts)
- U5 home active-trip branch falls back when the active trip is unpublished
- U6 trip-publish.js (confirm/pending/optimistic/revert) + esbuild wiring
Cache note: an in-place frontmatter edit keeps the folder-check cache id,
and driver:auto uses APCu in web memory, so deleteAll()+invalidateCache()
is insufficient — the endpoint also calls apcu_clear_cache().
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mpdu3Dt1iVoozHwAMyjrbn
This commit is contained in:
@@ -11,6 +11,7 @@ use RocketTheme\Toolbox\Event\Event;
|
||||
* Routes:
|
||||
* - DELETE /api/v1/entry/{slug} — delete a journal entry folder
|
||||
* - POST /api/v1/entry/{slug}/photos/order — reorder an entry's photos
|
||||
* - POST /api/v1/trip/{slug}/publish — publish/unpublish a trip
|
||||
*
|
||||
* The stock DELETE /api/v1/pages<route> only checks write-permission (no trip
|
||||
* scope, and any admin passes), which violates R6; and no stock endpoint can
|
||||
@@ -65,5 +66,10 @@ class EntryActionsPlugin extends Plugin
|
||||
// Nested-static-after-param, same shape as the DELETE above — it only
|
||||
// registers once the API route-map cache is rebuilt (deploy must clear cache).
|
||||
$routes->post('/entry/{slug}/photos/order', [EntryActions\EntryActionsApiController::class, 'reorderPhotos']);
|
||||
// Publish/unpublish a trip from the /trips listing → mutate trip.md
|
||||
// `published` and invalidate the page-tree index. Owner-only, any trip
|
||||
// (not active-scoped). Same registration caveat as above: it only takes
|
||||
// effect once the API route-map cache is rebuilt (deploy must clear cache).
|
||||
$routes->post('/trip/{slug}/publish', [EntryActions\EntryActionsApiController::class, 'setTripPublished']);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user