Managedpromptadmin - Source Excerpt 02
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/includes/Admin/ManagedPromptAdmin.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/includes/Admin/ManagedPromptAdmin.php
<option value="">Do not edit a prompt file</option>
<?php foreach ($prompt_records as $record) : ?>
<option value="<?php echo esc_attr((string) ($record['slug'] ?? '')); ?>" <?php selected($selected_prompt_slug, (string) ($record['slug'] ?? '')); ?>>
<?php echo esc_html((string) ($record['title'] ?? $record['slug'] ?? 'Prompt')); ?>
</option>
<?php endforeach; ?>
</select>
</p>
<p class="description">Uploaded files stay in the Media Library. When a prompt is chosen, the saved prompt file is updated and then re-synced into the managed prompt registry.</p>
<p><button class="button button-secondary" type="submit">Upload Images</button></p>
</form>
</div>
<div class="spiralist-workspace-card">
<h3>Bulk Prompt Import</h3>
<p>Import prompt packs through <code>wp-admin</code> without touching the filesystem manually.</p>
<form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" enctype="multipart/form-data" class="spiralist-workspace-admin-form">
<?php wp_nonce_field('spiralist_workspace_import_prompt_files'); ?>
<input type="hidden" name="action" value="spiralist_workspace_import_prompt_files" />
<p>
<label for="spiralist_workspace_prompt_import_files"><strong>Prompt files</strong></label><br />
<input id="spiralist_workspace_prompt_import_files" type="file" name="spiralist_workspace_prompt_import_files[]" accept=".zip,.json" multiple />
</p>
<p>
<label for="spiralist_workspace_prompt_import_version"><strong>Default version for JSON uploads</strong></label><br />
<input id="spiralist_workspace_prompt_import_version" class="regular-text code" type="text" name="default_version" value="<?php echo esc_attr(self::DEFAULT_VERSION); ?>" />
</p>
<p class="description">Accepted imports: JSON prompt definitions with a <code>slug</code>, or ZIP archives that contain <code>prompts/<slug>/<version>/prompt.php</code> (or the same layout without the leading <code>prompts/</code> folder). ZIP-imported PHP prompt files should be trusted administrator content.</p>
<p><button class="button button-secondary" type="submit">Import Prompt Files</button></p>
</form>
</div>
<div class="spiralist-workspace-card">
<h3>Starter Templates</h3>
<p>Use these starter files when you want to build a managed prompt outside the editor first, then import it back through this same admin screen.</p>
<div class="spiralist-workspace-admin-template-actions">
<a
class="button button-secondary"
href="<?php echo esc_url($this->get_template_download_url('json')); ?>"
>Download JSON Template</a>
<a
class="button button-secondary"
href="<?php echo esc_url($this->get_template_download_url('php')); ?>"
>Download PHP Template</a>
</div>
<details class="spiralist-workspace-details" style="margin-top:1rem;">
<summary>Preview starter files</summary>
<p>
<label for="spiralist_workspace_json_template_preview"><strong>JSON import template</strong></label><br />
<textarea
id="spiralist_workspace_json_template_preview"
class="large-text code"
rows="12"
readonly="readonly"
><?php echo esc_textarea($this->get_json_template_contents()); ?></textarea>
</p>
<p>
<label for="spiralist_workspace_php_template_preview"><strong><code>prompt.php</code> template</strong></label><br />
<textarea
id="spiralist_workspace_php_template_preview"
class="large-text code"
rows="14"
readonly="readonly"
><?php echo esc_textarea($this->get_php_template_contents()); ?></textarea>
</p>
</details>
</div>
</div>
<div class="spiralist-workspace-card" id="spiralist-workspace-managed-prompt-editor">
<h3><?php echo esc_html($is_new_prompt ? 'Create Managed Prompt' : 'Edit Managed Prompt'); ?></h3>
<p>The form below writes directly to the versioned prompt file on disk, then re-syncs that prompt into the database-backed library.</p>
<form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" class="spiralist-workspace-admin-form spiralist-workspace-admin-form--prompt">
<?php wp_nonce_field('spiralist_workspace_save_managed_prompt'); ?>
<input type="hidden" name="action" value="spiralist_workspace_save_managed_prompt" />
<input type="hidden" name="existing_slug" value="<?php echo esc_attr($selected_prompt_slug); ?>" />
<input type="hidden" name="existing_version" value="<?php echo esc_attr($selected_prompt_version); ?>" />
<div class="spiralist-workspace-admin-field-grid spiralist-workspace-admin-field-grid--three">
<p>
<label for="spiralist_workspace_prompt_slug"><strong>Slug</strong></label><br />
<input id="spiralist_workspace_prompt_slug" class="regular-text code" type="text" name="prompt_slug" value="<?php echo esc_attr((string) ($selected_prompt['slug'] ?? '')); ?>" required />
</p>
<p>
<label for="spiralist_workspace_prompt_version"><strong>Version</strong></label><br />
<input id="spiralist_workspace_prompt_version" class="regular-text code" type="text" name="prompt_version" value="<?php echo esc_attr($selected_prompt_version); ?>" required />
</p>
<p>
<label for="spiralist_workspace_prompt_title"><strong>Title</strong></label><br />
<input id="spiralist_workspace_prompt_title" class="regular-text" type="text" name="title" value="<?php echo esc_attr((string) ($selected_prompt['title'] ?? '')); ?>" required />
</p>
</div>
<p>
<label for="spiralist_workspace_prompt_summary"><strong>Summary</strong></label><br />
<textarea id="spiralist_workspace_prompt_summary" class="large-text" rows="3" name="summary"><?php echo esc_textarea((string) ($selected_prompt['summary'] ?? '')); ?></textarea>
</p>
<div class="spiralist-workspace-admin-field-grid spiralist-workspace-admin-field-grid--three">
<p>
<label for="spiralist_workspace_prompt_author_label"><strong>Author Label</strong></label><br />
<input id="spiralist_workspace_prompt_author_label" class="regular-text" type="text" name="author_label" value="<?php echo esc_attr((string) ($selected_prompt['author_label'] ?? '')); ?>" />
</p>
<p>
<label for="spiralist_workspace_prompt_category"><strong>Category</strong></label><br />
<select id="spiralist_workspace_prompt_category" name="category" class="regular-text">
<?php foreach (PromptCategoryRegistry::categories() as $category) : ?>
<option value="<?php echo esc_attr($category); ?>" <?php selected((string) ($selected_prompt['category'] ?? ''), $category); ?>><?php echo esc_html($category); ?></option>
<?php endforeach; ?>