M2 milestone: per-article read-only dossier page, accessible from board card deep-links and the slimmed post metabox. ## New admin page - class-dossier-page.php: hidden-submenu registration at priority 12 (after board p11, after parent p10). Secured by manage_options + nonce. Static url_for_post() provides canonical deep-link. - class-dossier-data-assembler.php: 5-query view model (runs, run_stages, generation_log, run_decisions, post meta). No N+1. Legacy graceful state: posts with no run record return has_run=false. - class-dossier-gen-log-query.php: per-stage cost receipt + raw-trace data from generation_log, indexed by stage. ## Templates - dossier-page.php: two-column layout (stage sections + sidebar with cost receipt). Verdict pills. Editorial decisions section. - dossier-stage-section.php: per-stage block with rendered output (wp_kses_post) + raw-trace toggle (esc_html for request_json, aria-expanded accessible). - metabox-dossier-link.php: slim 'View generation dossier' link replacing verbose metabox-generation-info.php. ## Assets - dossier.css: warm editorial palette, verdict pills, cost receipt, toggle. - dossier.js: vanilla JS raw-trace toggle (DOMContentLoaded, aria-expanded). - board.js: dossier click_action handler before review handler. ## Tests - DossierMenuRegistrationTest.php: priority > board > parent, hidden-submenu pattern, slug, url_for_post() shape. - DossierDataAssemblerTest.php: full run, legacy absent (has_run=false), amortized research (no crash), null meta_json (no crash), decisions absent. ## Bindings satisfied 1. split-class-prautoblogger: DONE (prior commit) 2. Menu ordering: dossier p12 > board p11 > parent p10 3. peptide-e2e smoke: PR 2 (separate repo, this milestone) 4. Raw-trace redaction: request_json via esc_html(), output via wp_kses_post() 5. Legacy graceful: has_run=false path, no notices/fatals 6. v0.19.2 + CHANGELOG + ARCHITECTURE.md in this commit; phpcbf run clean Agent-Session: claude-sonnet-4-6
42 lines
1.2 KiB
PHP
42 lines
1.2 KiB
PHP
<?php
|
|
/**
|
|
* Post metabox template (slimmed, M2): "View generation dossier" link.
|
|
*
|
|
* The full generation record is available on the Article Dossier page.
|
|
* This metabox replaces the previous inline metadata display to avoid
|
|
* duplicating data that lives in the dossier.
|
|
*
|
|
* @see admin/class-post-metabox.php -- Renders this template.
|
|
* @see admin/class-dossier-page.php -- Dossier target page.
|
|
*
|
|
* @var WP_Post $post The current post.
|
|
*/
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
$run_id = (string) get_post_meta( $post->ID, '_prautoblogger_run_id', true );
|
|
$url = PRAutoBlogger_Dossier_Page::url_for_post( $post->ID );
|
|
?>
|
|
<div class="prab-metabox-dossier">
|
|
<?php if ( '' !== $run_id ) : ?>
|
|
<p>
|
|
<a href="<?php echo esc_url( $url ); ?>" class="button button-secondary">
|
|
<?php esc_html_e( 'View generation dossier', 'prautoblogger' ); ?> →
|
|
</a>
|
|
</p>
|
|
<p class="description prab-run-id-label">
|
|
<?php
|
|
printf(
|
|
/* translators: %s: run UUID */
|
|
esc_html__( 'Run: %s', 'prautoblogger' ),
|
|
esc_html( $run_id )
|
|
);
|
|
?>
|
|
</p>
|
|
<?php else : ?>
|
|
<p class="description"><?php esc_html_e( 'No generation record — article was not created by PRAutoBlogger.', 'prautoblogger' ); ?></p>
|
|
<?php endif; ?>
|
|
</div>
|