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