Skip to content
wiki.fftac.org

Admin Actions - Source Excerpt 02

Back to Admin Actions

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/ns12-manuscript/includes/admin-actions.php so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/plugins/ns12-manuscript/includes/admin-actions.php

$folio['creation_prompt_title'] = sanitize_text_field((string) wp_unslash($_POST['creation_prompt_title'] ?? ($folio['creation_prompt_title'] ?? 'Prompt Used')));
            $folio['creation_prompt_status'] = sanitize_text_field((string) wp_unslash($_POST['creation_prompt_status'] ?? ($folio['creation_prompt_status'] ?? 'Prompt pending')));
            $folio['creation_prompt_summary'] = sanitize_textarea_field((string) wp_unslash($_POST['creation_prompt_summary'] ?? ($folio['creation_prompt_summary'] ?? '')));
            $folio['creation_prompt_source_slug'] = sanitize_title((string) wp_unslash($_POST['creation_prompt_source_slug'] ?? ($folio['creation_prompt_source_slug'] ?? '')));
            $folio['related_workspace_prompt_slugs'] = spiralist_book_pages_admin_parse_slug_list((string) wp_unslash($_POST['related_workspace_prompt_slugs'] ?? ''));

            if ($folio['creation_prompt_source_slug'] !== '' && !in_array($folio['creation_prompt_source_slug'], $folio['related_workspace_prompt_slugs'], true)) {
                $folio['related_workspace_prompt_slugs'][] = $folio['creation_prompt_source_slug'];
            }

            if (!spiralist_book_pages_admin_save_folio($folio)) {
                spiralist_book_pages_admin_set_notice('The folio could not be saved.', 'error');
                spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('folios'), ['edit' => $slug]);
            }

            $book = spiralist_book_pages_admin_book_definition();
            $book['folio_order'] = spiralist_book_pages_admin_move_slug((array) ($book['folio_order'] ?? []), $slug, max(1, (int) wp_unslash($_POST['sequence'] ?? 1)));

            if (!empty($folio['is_study_surface'])) {
                $book['study_surface_slug'] = $slug;

                foreach ($folios as $other_slug => $other_folio) {
                    if ($other_slug === $slug || empty($other_folio['is_study_surface'])) {
                        continue;
                    }

                    $other_folio['is_study_surface'] = false;
                    spiralist_book_pages_admin_save_folio($other_folio);
                }
            } elseif ((string) ($book['study_surface_slug'] ?? '') === $slug) {
                $book['study_surface_slug'] = '';
            }

            spiralist_book_pages_admin_save_book_definition($book);
            spiralist_book_pages_admin_rebuild_cache();
            spiralist_book_pages_admin_set_notice('The folio metadata and manuscript order were updated.');
            spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('folios'), ['edit' => $slug]);
            break;

        case 'bulk_import_prompts':
            $raw = trim((string) wp_unslash($_POST['prompt_import_json'] ?? ''));
            if ($raw === '' && !empty($_FILES['prompt_import_file']['tmp_name'])) {
                $tmp_file = (string) ($_FILES['prompt_import_file']['tmp_name'] ?? '');
                if ($tmp_file !== '' && is_uploaded_file($tmp_file)) {
                    $contents = file_get_contents($tmp_file);
                    $raw = is_string($contents) ? $contents : '';
                }
            }

            if ($raw === '') {
                spiralist_book_pages_admin_set_notice('Upload a JSON file or paste JSON prompt records to import.', 'error');
                spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('prompts'));
            }

            $decoded = json_decode($raw, true);
            if (!is_array($decoded)) {
                spiralist_book_pages_admin_set_notice('The prompt import payload was not valid JSON.', 'error');
                spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('prompts'));
            }

            $records = isset($decoded['prompts']) && is_array($decoded['prompts'])
                ? (array) $decoded['prompts']
                : (spiralist_book_pages_admin_is_list($decoded) ? $decoded : [$decoded]);
            $overwrite = !empty($_POST['overwrite_existing']);
            $existing_meta_map = (array) spiralist_book_pages_get_content_prompt_meta_map();
            $saved = 0;
            $linked = 0;
            $skipped = 0;
            $details = [];

            foreach ($records as $record) {
                if (!is_array($record)) {
                    continue;
                }

                $slug = sanitize_title((string) ($record['slug'] ?? ($record['title'] ?? ($record['filename'] ?? 'prompt'))));
                if ($slug === '') {
                    $details[] = 'A prompt import row was skipped because it did not include a usable slug, title, or filename.';
                    continue;
                }

                if (isset($existing_meta_map[$slug]) && !$overwrite) {
                    $skipped++;
                    continue;
                }

                $existing_meta = isset($existing_meta_map[$slug]) && is_array($existing_meta_map[$slug]) ? $existing_meta_map[$slug] : [];
                $meta = spiralist_book_pages_admin_normalize_prompt_meta($record, $slug, $existing_meta);
                $body = trim((string) ($record['body'] ?? ($record['text'] ?? ($record['instructions'] ?? ''))));

                if ($body === '') {
                    $body = spiralist_book_pages_get_auto_book_page_prompt_text((string) ($meta['title'] ?? spiralist_book_pages_admin_humanize($slug)), (string) ($meta['section_slug'] ?? 'appendix'));
                }

                if (!spiralist_book_pages_admin_save_prompt($slug, $meta, $body)) {
                    $details[] = sprintf('The prompt %s could not be written to disk.', $slug);
                    continue;
                }

                $saved++;
                $existing_meta_map[$slug] = $meta;
                $folio = spiralist_book_pages_admin_find_folio_for_prompt($meta);

                if (!empty($folio)) {
                    $folio = spiralist_book_pages_admin_link_prompt($folio, $meta, $slug);
                    if (spiralist_book_pages_admin_save_folio($folio)) {
                        $linked++;
                    }
                }
            }

            if ($saved === 0 && $skipped === 0) {
                spiralist_book_pages_admin_set_notice('No prompts were imported.', 'error', $details);
                spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('prompts'));
            }

            spiralist_book_pages_admin_rebuild_cache();

            $message = sprintf('Imported %d prompt%s', $saved, $saved === 1 ? '' : 's');
            if ($linked > 0) {
                $message .= sprintf(' and linked %d folio%s', $linked, $linked === 1 ? '' : 's');
            }
            if ($skipped > 0) {
                $message .= sprintf('. Skipped %d existing prompt%s', $skipped, $skipped === 1 ? '' : 's');
            }

            spiralist_book_pages_admin_set_notice($message . '.', 'success', $details);
            spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('prompts'));
            break;

        case 'save_prompt':
            $slug = sanitize_title((string) wp_unslash($_POST['prompt_slug'] ?? ''));
            $existing_meta = spiralist_book_pages_admin_prompt_meta($slug);

            if ($slug === '' || empty($existing_meta)) {
                spiralist_book_pages_admin_set_notice('The selected prompt could not be found.', 'error');
                spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('prompts'));
            }

            $raw_meta = [
                'source_version' => (string) wp_unslash($_POST['source_version'] ?? ($existing_meta['source_version'] ?? '1.0.0')),
                'title' => (string) wp_unslash($_POST['title'] ?? ($existing_meta['title'] ?? '')),
                'summary' => (string) wp_unslash($_POST['summary'] ?? ($existing_meta['summary'] ?? '')),
                'author_label' => (string) wp_unslash($_POST['author_label'] ?? ($existing_meta['author_label'] ?? '')),
                'category' => (string) wp_unslash($_POST['category'] ?? ($existing_meta['category'] ?? '')),
                'subcategory' => (string) wp_unslash($_POST['subcategory'] ?? ($existing_meta['subcategory'] ?? '')),
                'prompt_type' => (string) wp_unslash($_POST['prompt_type'] ?? ($existing_meta['prompt_type'] ?? 'image')),
                'language' => (string) wp_unslash($_POST['language'] ?? ($existing_meta['language'] ?? 'all')),
                'prompt_status' => (string) wp_unslash($_POST['prompt_status'] ?? ($existing_meta['prompt_status'] ?? 'published')),
                'moderation_status' => (string) wp_unslash($_POST['moderation_status'] ?? ($existing_meta['moderation_status'] ?? 'approved')),