PluginProbe
Code Snippets / trunk
Code Snippets vtrunk
4.0.0-beta.2 3.10.2 3.10.1 3.10.0 3.10.0-beta.2 3.10.0-beta.1 4.0.0-beta.1 3.9.6 trunk 2.10.0 2.10.1 2.12.0 2.12.1 2.13.0 2.13.1 2.13.2 2.13.3 2.14.0 2.14.1 2.14.2 2.14.3 2.14.4 2.14.5 2.14.6 3.0.0 All 65 releases
code-snippets / php / Admin / Menus / Manage / Manage_Menu_Assets.php

Manage_Menu_Assets.php in Code Snippets trunk, at php/Admin/Menus/Manage/Manage_Menu_Assets.php

147 lines 4.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Code_Snippets\Admin\Menus\Manage;
4
5 use Code_Snippets\Integration\Evaluate_Functions;
6 use Code_Snippets\Model\Snippet;
7 use function Code_Snippets\code_snippets;
8 use function Code_Snippets\get_snippet_author;
9 use function Code_Snippets\get_snippets;
10 use function Code_Snippets\Settings\get_setting;
11 use function Code_Snippets\Utils\enqueue_code_preview_editor;
12 use const Code_Snippets\PLUGIN_FILE;
13 use const Code_Snippets\PLUGIN_VERSION;
14
15 /**
16 * Enqueues assets and builds localized data for the manage menu.
17 */
18 class Manage_Menu_Assets {
19
20 /**
21 * Handle for JavaScript asset file.
22 */
23 private const JS_HANDLE = 'code-snippets-manage-menu';
24
25 /**
26 * Handle for CSS asset file.
27 */
28 private const CSS_HANDLE = 'code-snippets-manage';
29
30 /**
31 * Manage menu Screen Options.
32 *
33 * @var Manage_Menu_Screen_Options
34 */
35 private Manage_Menu_Screen_Options $screen_options;
36
37 /**
38 * Class constructor.
39 *
40 * @param Manage_Menu_Screen_Options $screen_options Manage menu Screen Options.
41 */
42 public function __construct( Manage_Menu_Screen_Options $screen_options ) {
43 $this->screen_options = $screen_options;
44 }
45
46 /**
47 * Count non-trashed snippets by type.
48 *
49 * @return array<string, int> Map of type name to snippet count, including 'all'.
50 */
51 private function get_snippet_type_counts(): array {
52 $counts = [ 'all' => 0 ];
53
54 foreach ( get_snippets() as $snippet ) {
55 if ( $snippet->trashed ) {
56 continue;
57 }
58
59 $counts[ $snippet->type ] = ( $counts[ $snippet->type ] ?? 0 ) + 1;
60 ++$counts['all'];
61 }
62
63 return $counts;
64 }
65
66 /**
67 * Enqueue manage assets and localize their runtime data.
68 *
69 * @param string[] $script_dependencies JavaScript dependencies.
70 * @param string[] $style_dependencies CSS dependencies.
71 *
72 * @return void
73 */
74 public function enqueue( array $script_dependencies, array $style_dependencies ): void {
75 wp_enqueue_style(
76 self::CSS_HANDLE,
77 plugins_url( 'dist/manage.css', PLUGIN_FILE ),
78 $style_dependencies,
79 PLUGIN_VERSION
80 );
81
82 wp_enqueue_script(
83 self::JS_HANDLE,
84 plugins_url( 'dist/manage.js', PLUGIN_FILE ),
85 $script_dependencies,
86 PLUGIN_VERSION,
87 [ 'in_footer' => true ]
88 );
89
90 enqueue_code_preview_editor( 'php' );
91 wp_set_script_translations( self::JS_HANDLE, 'code-snippets' );
92 code_snippets()->localize_script( self::JS_HANDLE );
93
94 $snippets_per_page = Manage_Menu::get_snippets_per_page();
95
96 $localized = [
97 'hasNetworkCap' => current_user_can( code_snippets()->get_network_cap_name() ),
98 'hiddenColumns' => $this->screen_options->get_hidden_columns(),
99 'truncateRowValues' => (int) $this->screen_options->should_truncate_rows(),
100 'snippetsPerPage' => $snippets_per_page,
101 'cloudSearchPerPage' => Manage_Menu::get_cloud_search_per_page(),
102 'isSafeModeActive' => Evaluate_Functions::is_safe_mode_active(),
103 'bulkDownloadNonce' => wp_create_nonce( 'code_snippets_bulk_download' ),
104 'runOnceNonce' => wp_create_nonce( Manage_Menu::RUN_ONCE_NONCE ),
105 'supportsZipDownloads' => class_exists( 'ZipArchive' ),
106 'editorTheme' => get_setting( 'editor', 'theme' ),
107 'typeCounts' => $this->get_snippet_type_counts(),
108 'listOrder' => get_setting( 'general', 'list_order' ),
109 ];
110
111 if ( $this->screen_options->is_manage_table_view() ) {
112 // Full code bodies make this payload grow with the size of the snippet library.
113 $snippets = array_map(
114 function ( Snippet $snippet ) {
115 $fields = $snippet->get_fields();
116 $fields['code'] = '';
117 $fields['created_by'] = get_snippet_author( (int) ( $snippet->created_by ?? 0 ) );
118 $fields['updated_by'] = get_snippet_author( (int) ( $snippet->updated_by ?? 0 ) );
119
120 // Match the REST response: a UTC value with no offset is read
121 // as local time by the browser.
122 $fields['modified'] = $snippet->modified_iso;
123 return $fields;
124 },
125 get_snippets()
126 );
127
128 $inline_limit = apply_filters( 'code_snippets/manage/inline_snippets_limit', min( $snippets_per_page, 100 ) );
129 $inline_limit = max( 0, intval( $inline_limit ) );
130
131 if ( $inline_limit > 0 ) {
132 $localized['snippetsList'] = array_slice( $snippets, 0, $inline_limit );
133 }
134 }
135
136 if ( $this->screen_options->is_ai_agent_view() ) {
137 // The AI Agent demo writes the site name into the snippet it builds,
138 // so the walkthrough reads as though it were written for this site.
139 $localized['aiDemo'] = [
140 'siteName' => get_bloginfo( 'name' ),
141 ];
142 }
143
144 wp_localize_script( self::JS_HANDLE, 'CODE_SNIPPETS_MANAGE', $localized );
145 }
146 }
147