PluginProbe
TablePress – Tables in WordPress made easy / 3.0
TablePress – Tables in WordPress made easy v3.0
3.3.4 3.3.3 3.3.2 3.3.1 trunk 1.12 1.14 1.9.2 2.0.4 2.1.7 2.1.8 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.3 2.3.1 2.3.2 2.4 2.4.1 2.4.2 2.4.3 2.4.4 All 44 releases
← All changes | classes/class-view.php +101 -82 2.1.73.0 View file →
@@ -24,51 +24,48 @@
24 24 /**
25 25 * Data for the view.
26 26 *
27 27 * @since 1.0.0
28 - * @var array
28 + * @var array<string, mixed>
29 29 */
30 - protected $data = array();
30 + protected array $data = array();
31 31
32 32 /**
33 33 * Number of screen columns for post boxes.
34 34 *
35 35 * @since 1.0.0
36 - * @var int
37 36 */
38 - protected $screen_columns = 0;
37 + protected int $screen_columns = 0;
39 38
40 39 /**
41 40 * User action for this screen.
42 41 *
43 42 * @since 1.0.0
44 - * @var string
45 43 */
46 - protected $action = '';
44 + protected string $action = '';
47 45
48 46 /**
49 47 * Instance of the Admin Page Helper Class, with necessary functions.
50 48 *
51 49 * @since 1.0.0
52 - * @var TablePress_Admin_Page
53 50 */
54 - protected $admin_page;
51 + protected \TablePress_Admin_Page $admin_page;
55 52
56 53 /**
57 54 * List of text boxes (similar to post boxes, but just with text and without extra functionality).
58 55 *
59 56 * @since 1.0.0
60 - * @var array
57 + * @var array<string, array<string, array<string, mixed>>>
61 58 */
62 - protected $textboxes = array();
59 + protected array $textboxes = array();
63 60
64 61 /**
65 62 * List of messages that are to be displayed as boxes below the page title.
66 63 *
67 64 * @since 1.0.0
68 - * @var array
65 + * @var string[]
69 66 */
70 - protected $header_messages = array();
67 + protected array $header_messages = array();
71 68
72 69 /**
73 70 * Whether there are post boxes registered for this screen,
74 71 * is automatically set to true, when a meta box is added.
@@ -73,19 +70,18 @@
73 70 * Whether there are post boxes registered for this screen,
74 71 * is automatically set to true, when a meta box is added.
75 72 *
76 73 * @since 1.0.0
77 - * @var bool
78 74 */
79 - protected $has_meta_boxes = false;
75 + protected bool $has_meta_boxes = false;
80 76
81 77 /**
82 78 * List of WP feature pointers for this view.
83 79 *
84 80 * @since 1.0.0
85 - * @var array
81 + * @var string[]
86 82 */
87 - protected $wp_pointers = array();
83 + protected array $wp_pointers = array();
88 84
89 85 /**
90 86 * Initialize the View class, by setting the correct screen columns and adding help texts.
91 87 *
@@ -93,29 +89,32 @@
93 89 */
94 90 public function __construct() {
95 91 $screen = get_current_screen();
96 92 if ( 0 !== $this->screen_columns ) {
97 - $screen->add_option( 'layout_columns', array( 'max' => $this->screen_columns ) );
93 + $screen->add_option( 'layout_columns', array( 'max' => $this->screen_columns ) ); // @phpstan-ignore method.nonObject
98 94 }
99 95 // Enable two column layout.
100 - add_filter( "get_user_option_screen_layout_{$screen->id}", array( $this, 'set_current_screen_layout_columns' ) );
96 + add_filter( "get_user_option_screen_layout_{$screen->id}", array( $this, 'set_current_screen_layout_columns' ) ); // @phpstan-ignore property.nonObject
101 97
102 98 $common_content = '<p>' . sprintf( __( 'More information about TablePress can be found on the <a href="%1$s">plugin website</a> or on its page in the <a href="%2$s">WordPress Plugin Directory</a>.', 'tablepress' ), 'https://tablepress.org/', 'https://wordpress.org/plugins/tablepress/' ) . '</p>';
103 99 $common_content .= '<p>' . sprintf( __( 'For technical information, please see the <a href="%s">Documentation</a>.', 'tablepress' ), 'https://tablepress.org/documentation/' ) . ' ' . sprintf( __( 'Common questions are answered in the <a href="%s">FAQ</a>.', 'tablepress' ), 'https://tablepress.org/faq/' ) . '</p>';
104 100
105 101 if ( tb_tp_fs()->is_free_plan() ) {
106 - $common_content .= '<p>' . sprintf( __( '<a href="%1$s">Support</a> is provided through the <a href="%2$s">WordPress Support Forums</a>.', 'tablepress' ), 'https://tablepress.org/support/', 'https://wordpress.org/tags/tablepress' ) . ' '
107 - . sprintf( __( 'Before asking for support, please carefully read the <a href="%s">Frequently Asked Questions</a>, where you will find answers to the most common questions, and search through the forums.', 'tablepress' ), 'https://tablepress.org/faq/' ) . '</p>';
108 - $common_content .= '<p><strong>' . sprintf( __( 'More great features for you and your site’s visitors and priority email support are available with a Premium license plan of TablePress. <a href="%s">Go check them out!</a>', 'tablepress' ), 'https://tablepress.org/premium/' ) . '</strong></p>';
102 + $common_content .= '<p>'
103 + . sprintf( __( '<a href="%1$s">Support</a> is provided through the <a href="%2$s">WordPress Support Forums</a>.', 'tablepress' ), 'https://tablepress.org/support/', 'https://wordpress.org/tags/tablepress' )
104 + . ' '
105 + . sprintf( __( 'Before asking for support, please carefully read the <a href="%s">Frequently Asked Questions</a>, where you will find answers to the most common questions, and search through the forums.', 'tablepress' ), 'https://tablepress.org/faq/' )
106 + . '</p>';
107 + $common_content .= '<p><strong>' . sprintf( __( 'More great features for you and your site’s visitors and priority email support are available with a Premium license plan of TablePress. <a href="%s">Go check them out!</a>', 'tablepress' ), 'https://tablepress.org/premium/?utm_source=plugin&utm_medium=textlink&utm_content=help-tab' ) . '</strong></p>';
109 108 }
110 109
111 - $screen->add_help_tab( array(
110 + $screen->add_help_tab( array( // @phpstan-ignore method.nonObject
112 111 'id' => 'tablepress-help', // This should be unique for the screen.
113 112 'title' => __( 'TablePress Help', 'tablepress' ),
114 113 'content' => '<p>' . $this->help_tab_content() . '</p>' . $common_content,
115 114 ) );
116 115 // "Sidebar" in the help tab.
117 - $screen->set_help_sidebar(
116 + $screen->set_help_sidebar( // @phpstan-ignore method.nonObject
118 117 '<p><strong>' . __( 'For more information:', 'tablepress' ) . '</strong></p>'
119 118 . '<p><a href="https://tablepress.org/">TablePress Website</a></p>'
120 119 . '<p><a href="https://tablepress.org/faq/">TablePress FAQ</a></p>'
121 120 . '<p><a href="https://tablepress.org/documentation/">TablePress Documentation</a></p>'
@@ -130,9 +129,9 @@
130 129 *
131 130 * @param int|false $result Current value of the user option.
132 131 * @return int New value for the user option.
133 132 */
134 - public function set_current_screen_layout_columns( $result ) {
133 + public function set_current_screen_layout_columns( /* int|false */ $result ): int {
135 134 if ( false === $result ) {
136 135 // The user option does not yet exist.
137 136 $result = $this->screen_columns;
138 137 } elseif ( $result > $this->screen_columns ) {
@@ -146,21 +145,23 @@
146 145 * Set up the view with data and do things that are necessary for all views.
147 146 *
148 147 * @since 1.0.0
149 148 *
150 - * @param string $action Action for this view.
151 - * @param array $data Data for this view.
149 + * @param string $action Action for this view.
150 + * @param array<string, mixed> $data Data for this view.
152 151 */
153 - public function setup( $action, array $data ) {
152 + public function setup( /* string */ $action, array $data ) /* : void */ {
153 + // Don't use type hints (except array $data) in method declaration, as the method is extended in some TablePress Extensions which are no longer updated.
154 +
154 155 $this->action = $action;
155 156 $this->data = $data;
156 157
157 158 // Set page title.
158 - $GLOBALS['title'] = sprintf( __( '%1$s &lsaquo; %2$s', 'tablepress' ), $this->data['view_actions'][ $this->action ]['page_title'], 'TablePress' );
159 + $GLOBALS['title'] = sprintf( __( '%1$s &lsaquo; %2$s', 'tablepress' ), $this->data['view_actions'][ $this->action ]['page_title'], 'TablePress' ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
159 160
160 161 // Admin page helpers, like script/style loading, could be moved to view.
161 162 $this->admin_page = TablePress::load_class( 'TablePress_Admin_Page', 'class-admin-page-helper.php', 'classes' );
162 - $this->admin_page->enqueue_style( 'common' );
163 + $this->admin_page->enqueue_style( 'common', array( 'wp-components' ) );
163 164 // RTL styles for the admin interface.
164 165 if ( is_rtl() ) {
165 166 $this->admin_page->enqueue_style( 'common-rtl', array( 'tablepress-common' ) );
166 167 }
@@ -185,10 +186,10 @@
185 186 * @param string $text Text for the header message.
186 187 * @param string $css_class Optional. Additional CSS class for the header message.
187 188 * @param string $title Optional. Text for the header title.
188 189 */
189 - protected function add_header_message( $text, $css_class = 'notice-success', $title = '' ) {
190 - if ( ! strpos( $css_class, 'not-dismissible' ) ) {
190 + protected function add_header_message( string $text, string $css_class = 'notice-success', string $title = '' ): void {
191 + if ( ! str_contains( $css_class, 'not-dismissible' ) ) {
191 192 $css_class .= ' is-dismissible';
192 193 }
193 194 if ( '' !== $title ) {
194 195 $title = "<h3>{$title}</h3>";
@@ -193,9 +194,9 @@
193 194 if ( '' !== $title ) {
194 195 $title = "<h3>{$title}</h3>";
195 196 }
196 197 // Wrap the message text in HTML <p> tags if it does not already start with one (potentially with attributes), indicating custom message HTML.
197 - if ( '' !== $text && 0 !== strpos( $text, '<p' ) ) {
198 + if ( '' !== $text && ! str_starts_with( $text, '<p' ) ) {
198 199 $text = "<p>{$text}</p>";
199 200 }
200 201 $this->header_messages[] = "<div class=\"notice {$css_class}\">{$title}{$text}</div>\n";
201 202 }
@@ -204,13 +205,13 @@
204 205 * Process header action messages, i.e. check if a message should be added to the page.
205 206 *
206 207 * @since 1.0.0
207 208 *
208 - * @param array $action_messages Action messages for the screen.
209 + * @param array<string, string> $action_messages Action messages for the screen.
209 210 */
210 - protected function process_action_messages( array $action_messages ) {
211 + protected function process_action_messages( array $action_messages ): void {
211 212 if ( $this->data['message'] && isset( $action_messages[ $this->data['message'] ] ) ) {
212 - $class = ( 0 === strpos( $this->data['message'], 'error' ) ) ? 'notice-error' : 'notice-success';
213 + $class = ( str_starts_with( $this->data['message'], 'error' ) ) ? 'notice-error' : 'notice-success';
213 214
214 215 if ( '' !== $this->data['error_details'] ) {
215 216 $this->data['error_details'] = '</p><p>' . sprintf( __( 'Error code: %s', 'tablepress' ), '<code>' . esc_html( $this->data['error_details'] ) . '</code>' );
216 217 }
@@ -224,13 +225,13 @@
224 225 *
225 226 * @since 1.0.0
226 227 *
227 228 * @param string $id Unique HTML ID for the text box container (only visible with $wrap = true).
228 - * @param callback $callback Callback that prints the contents of the text box.
229 + * @param callable $callback Callback that prints the contents of the text box.
229 230 * @param string $context Optional. Context/position of the text box (normal, side, additional, header, submit).
230 231 * @param bool $wrap Whether the content of the text box shall be wrapped in a <div> container.
231 232 */
232 - protected function add_text_box( $id, $callback, $context = 'normal', $wrap = false ) {
233 + protected function add_text_box( string $id, callable $callback, string $context = 'normal', bool $wrap = false ): void {
233 234 if ( ! isset( $this->textboxes[ $context ] ) ) {
234 235 $this->textboxes[ $context ] = array();
235 236 }
236 237
@@ -247,16 +248,16 @@
247 248 * Register a post meta box for the view, that is drag/droppable with WordPress functionality.
248 249 *
249 250 * @since 1.0.0
250 251 *
251 - * @param string $id Unique ID for the meta box.
252 - * @param string $title Title for the meta box.
253 - * @param callback $callback Callback that prints the contents of the post meta box.
254 - * @param string $context Optional. Context/position of the post meta box (normal, side, additional).
255 - * @param string $priority Optional. Order of the post meta box for the $context position (high, default, low).
256 - * @param array $callback_args Optional. Additional data for the callback function (e.g. useful when in different class).
252 + * @param string $id Unique ID for the meta box.
253 + * @param string $title Title for the meta box.
254 + * @param callable $callback Callback that prints the contents of the post meta box.
255 + * @param 'normal'|'side'|'additional' $context Optional. Context/position of the post meta box (normal, side, additional).
256 + * @param 'core'|'default'|'high'|'low' $priority Optional. Order of the post meta box for the $context position (high, default, low).
257 + * @param mixed[]|null $callback_args Optional. Additional data for the callback function (e.g. useful when in different class).
257 258 */
258 - protected function add_meta_box( $id, $title, $callback, $context = 'normal', $priority = 'default', $callback_args = null ) {
259 + protected function add_meta_box( string $id, string $title, callable $callback, string $context = 'normal', string $priority = 'default', ?array $callback_args = null ): void {
259 260 $this->has_meta_boxes = true;
260 261 add_meta_box( "tablepress_{$this->action}-{$id}", $title, $callback, null, $context, $priority, $callback_args );
261 262 }
262 263
@@ -266,9 +267,9 @@
266 267 * @since 1.0.0
267 268 *
268 269 * @param string $context Context (normal, side, additional, header, submit) for which registered text boxes shall be rendered.
269 270 */
270 - protected function do_text_boxes( $context ) {
271 + protected function do_text_boxes( string $context ): void {
271 272 if ( empty( $this->textboxes[ $context ] ) ) {
272 273 return;
273 274 }
274 275
@@ -289,13 +290,12 @@
289 290 * @since 1.0.0
290 291 *
291 292 * @param string $context Context (normal, side, additional) for which registered post meta boxes shall be rendered.
292 293 */
293 - protected function do_meta_boxes( $context ) {
294 - if ( ! $this->has_meta_boxes ) {
295 - return;
294 + protected function do_meta_boxes( string $context ): void {
295 + if ( $this->has_meta_boxes ) {
296 + do_meta_boxes( get_current_screen(), $context, $this->data ); // @phpstan-ignore argument.type
296 297 }
297 - do_meta_boxes( null, $context, $this->data );
298 298 }
299 299
300 300 /**
301 301 * Print hidden fields with nonces for post meta box AJAX handling, if there are post meta boxes on the screen.
@@ -303,12 +303,12 @@
303 303 * The check is possible as this function is executed after post meta boxes have to be registered.
304 304 *
305 305 * @since 1.0.0
306 306 *
307 - * @param array $data Data for this screen.
308 - * @param array $box Information about the text box.
307 + * @param array<string, mixed> $data Data for this screen.
308 + * @param array<string, mixed> $box Information about the text box.
309 309 */
310 - protected function default_nonce_fields( array $data, array $box ) {
310 + protected function default_nonce_fields( array $data, array $box ): void {
311 311 if ( ! $this->has_meta_boxes ) {
312 312 return;
313 313 }
314 314 wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
@@ -321,12 +321,12 @@
321 321 * Print hidden field with a nonce for the screen's action, to be transmitted in HTTP requests.
322 322 *
323 323 * @since 1.0.0
324 324 *
325 - * @param array $data Data for this screen.
326 - * @param array $box Information about the text box.
325 + * @param array<string, mixed> $data Data for this screen.
326 + * @param array<string, mixed> $box Information about the text box.
327 327 */
328 - protected function action_nonce_field( array $data, array $box ) {
328 + protected function action_nonce_field( array $data, array $box ): void {
329 329 wp_nonce_field( TablePress::nonce( $this->action ) );
330 330 echo "\n";
331 331 }
332 332
@@ -334,13 +334,13 @@
334 334 * Print hidden field with the screen action.
335 335 *
336 336 * @since 1.0.0
337 337 *
338 - * @param array $data Data for this screen.
339 - * @param array $box Information about the text box.
338 + * @param array<string, mixed> $data Data for this screen.
339 + * @param array<string, mixed> $box Information about the text box.
340 340 */
341 - protected function action_field( array $data, array $box ) {
342 - echo "<input type=\"hidden\" name=\"action\" value=\"tablepress_{$this->action}\" />\n";
341 + protected function action_field( array $data, array $box ): void {
342 + echo "<input type=\"hidden\" name=\"action\" value=\"tablepress_{$this->action}\">\n";
343 343 }
344 344
345 345 /**
346 346 * Render the current view.
@@ -346,9 +346,9 @@
346 346 * Render the current view.
347 347 *
348 348 * @since 1.0.0
349 349 */
350 - public function render() {
350 + public function render(): void {
351 351 ?>
352 352 <div id="tablepress-page" class="wrap">
353 353 <?php
354 354 $this->print_nav_tab_menu();
@@ -353,9 +353,9 @@
353 353 <?php
354 354 $this->print_nav_tab_menu();
355 355 ?>
356 356 <div id="tablepress-body">
357 - <hr class="wp-header-end" />
357 + <hr class="wp-header-end">
358 358 <?php
359 359 // Print all header messages.
360 360 foreach ( $this->header_messages as $message ) {
361 361 echo $message;
@@ -362,13 +362,14 @@
362 362 }
363 363 // "Import" screen has file upload.
364 364 $enctype = ( 'import' === $this->action ) ? ' enctype="multipart/form-data"' : '';
365 365 ?>
366 - <form action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post"<?php echo $enctype; ?>>
366 + <form action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post"<?php echo $enctype; ?> id="tablepress-page-form">
367 367 <?php
368 368 $this->do_text_boxes( 'header' );
369 + $hide_if_no_js = ( in_array( $this->action, array( 'export', 'import' ), true ) ) ? ' class="hide-if-no-js"' : '';
369 370 ?>
370 - <div id="poststuff">
371 + <div id="poststuff"<?php echo $hide_if_no_js; ?>>
371 372 <div id="post-body" class="metabox-holder columns-<?php echo ( isset( $GLOBALS['screen_layout_columns'] ) && ( 2 === $GLOBALS['screen_layout_columns'] ) ) ? '2' : '1'; ?>">
372 373 <div id="postbox-container-2" class="postbox-container">
373 374 <?php
374 375 $this->do_text_boxes( 'normal' );
@@ -388,9 +389,9 @@
388 389 $this->do_meta_boxes( 'side' );
389 390 ?>
390 391 </div>
391 392 </div>
392 - <br class="clear" />
393 + <br class="clear">
393 394 </div>
394 395 </form>
395 396 </div>
396 397 </div>
@@ -401,18 +402,33 @@
401 402 * Render the navigation menu with links to the possible actions, highlighting the current one.
402 403 *
403 404 * @since 1.0.0
404 405 */
405 - protected function print_nav_tab_menu() {
406 + protected function print_nav_tab_menu(): void {
407 + $name = __( 'TablePress', 'tablepress' );
408 + $filename = 'admin/img/tablepress.svg';
406 409 ?>
407 410 <div id="tablepress-header" class="header">
408 - <h1 class="name"><img src="<?php echo plugins_url( 'admin/img/tablepress-icon.png', TABLEPRESS__FILE__ ); ?>" class="tablepress-icon" alt="<?php esc_attr_e( 'TablePress plugin logo', 'tablepress' ); ?>" /><?php _e( 'TablePress', 'tablepress' ); ?><?php echo tb_tp_fs()->is_plan_or_trial( 'pro', true ) ? ' Pro' : ( tb_tp_fs()->is_plan_or_trial( 'max', true ) ? ' Max' : '' ); ?></h1>
409 - <?php if ( tb_tp_fs()->is_free_plan() ) : ?>
411 + <h1 class="name">
412 + <img src="<?php echo plugins_url( $filename, TABLEPRESS__FILE__ ); ?>" alt="<?php esc_attr_e( 'TablePress plugin logo', 'tablepress' ); ?>">
413 + <span class="screen-reader-text"><?php echo $name; ?></span>
414 + </h1>
415 + <?php if ( ! TABLEPRESS_IS_PLAYGROUND_PREVIEW && tb_tp_fs()->is_free_plan() ) : ?>
410 416 <div class="buttons">
411 - <a href="<?php echo 'https://tablepress.org/premium/'; ?>" class="tablepress-button">
417 + <?php
418 + $timestamp_today = strtotime( 'today' );
419 + if ( strtotime( '2024-11-24' ) < $timestamp_today && $timestamp_today < strtotime( '2024-12-03' ) ) :
420 + ?>
421 + <a href="https://tablepress.org/premium/?utm_campaign=black-week-2024&utm_source=plugin&utm_medium=button&utm_content=upgrade-button" class="tablepress-button" style="background:linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);border-color:#ffffff;font-weight:bold;font-size:20px;border-radius:6px;">
422 + <span>Premium: 20% off during Black Week 2024!</span>
423 + <span class="dashicons dashicons-arrow-right-alt" />
424 + </a>
425 + <?php else : ?>
426 + <a href="<?php echo esc_url( tb_tp_fs()->pricing_url( WP_FS__PERIOD_ANNUALLY, false ) ); ?>" class="tablepress-button">
412 427 <span><?php _e( 'Upgrade to Premium', 'tablepress' ); ?></span>
413 428 <span class="dashicons dashicons-arrow-right-alt"></span>
414 429 </a>
430 + <?php endif; ?>
415 431 </div>
416 432 <?php endif; ?>
417 433 </div>
418 434 <nav id="tablepress-nav">
@@ -441,12 +457,12 @@
441 457 * Prints a notification about JavaScript not being activated in the browser.
442 458 *
443 459 * @since 2.0.0
444 460 *
445 - * @param array $data Data for this screen.
446 - * @param array $box Information about the text box.
461 + * @param array<string, mixed> $data Data for this screen.
462 + * @param array<string, mixed> $box Information about the text box.
447 463 */
448 - public function textbox_no_javascript( array $data, array $box ) {
464 + public function textbox_no_javascript( array $data, array $box ): void {
449 465 ?>
450 466 <div class="notice notice-error notice-alt notice-large hide-if-js">
451 467 <h3><em>
452 468 <?php _e( 'Attention: Unfortunately, there is a problem!', 'tablepress' ); ?>
@@ -451,13 +467,13 @@
451 467 <h3><em>
452 468 <?php _e( 'Attention: Unfortunately, there is a problem!', 'tablepress' ); ?>
453 469 </em></h3>
454 470 <p style="font-size:14px">
455 - <strong><?php _e( 'This screen requires JavaScript. Please enable JavaScript in your browser settings.', 'tablepress' ); ?></strong><br />
471 + <strong><?php _e( 'This screen requires JavaScript. Please enable JavaScript in your browser settings.', 'tablepress' ); ?></strong><br>
456 472 <?php _e( 'For help, please follow <a href="https://www.enable-javascript.com/">the instructions on how to enable JavaScript in your browser</a>.', 'tablepress' ); ?>
457 473 </p>
458 474 <p>
459 - <?php echo '<a href="' . TablePress::url( array( 'action' => 'list' ) ) . '">' . __( 'Back to the List of Tables', 'tablepress' ) . '</a>'; ?>
475 + <?php echo '<a href="' . esc_url( TablePress::url( array( 'action' => 'list' ) ) ) . '">' . __( 'Back to the List of Tables', 'tablepress' ) . '</a>'; ?>
460 476 </p>
461 477 </div>
462 478 <?php
463 479 }
@@ -462,19 +478,20 @@
462 478 <?php
463 479 }
464 480
465 481 /**
466 - * Print a submit button (only done when function is used as a callback for a text box).
482 + * Prints a submit button (only done when function is used as a callback for a text box).
467 483 *
484 + * This method is soft-deprecated. It's no longer used in TablePress, but e.g. in the "TablePress Debug Extension".
485 + *
468 486 * @since 1.0.0
469 487 *
470 - * @param array $data Data for this screen.
471 - * @param array $box Information about the text box.
488 + * @param array<string, mixed> $data Data for this screen.
489 + * @param array<string, mixed> $box Information about the text box.
472 490 */
473 - protected function textbox_submit_button( array $data, array $box ) {
474 - $caption = isset( $data['submit_button_caption'] ) ? $data['submit_button_caption'] : __( 'Save Changes', 'tablepress' );
491 + protected function textbox_submit_button( array $data, array $box ): void {
475 492 ?>
476 - <p class="submit"><input type="submit" value="<?php echo esc_attr( $caption ); ?>" class="button button-primary button-large" /></p>
493 + <p class="submit"><input type="submit" class="components-button is-primary button-save-changes" value="<?php esc_attr_e( 'Save Changes', 'tablepress' ); ?>"></p>
477 494 <?php
478 495 }
479 496
480 497 /**
@@ -482,10 +499,12 @@
482 499 *
483 500 * Has to be implemented for every view that is visible in the WP Dashboard!
484 501 *
485 502 * @since 1.0.0
503 + *
504 + * @return string Help tab content for the view.
486 505 */
487 - protected function help_tab_content() {
506 + protected function help_tab_content(): string {
488 507 // Has to be implemented for every view that is visible in the WP Dashboard!
489 508 return '';
490 509 }
491 510
@@ -493,9 +512,9 @@
493 512 * Initialize the WP feature pointers for TablePress.
494 513 *
495 514 * @since 1.0.0
496 515 */
497 - protected function _init_wp_pointers() {
516 + protected function _init_wp_pointers(): void {
498 517 // Check if there are WP pointers for this view.
499 518 if ( empty( $this->wp_pointers ) ) {
500 519 return;
501 520 }
@@ -505,9 +524,9 @@
505 524
506 525 $pointers_on_page = false;
507 526 foreach ( array_diff( $this->wp_pointers, $dismissed ) as $pointer ) {
508 527 // Bind pointer print function.
509 - add_action( "admin_footer-{$GLOBALS['hook_suffix']}", array( $this, 'wp_pointer_' . $pointer ) );
528 + add_action( "admin_footer-{$GLOBALS['hook_suffix']}", array( $this, 'wp_pointer_' . $pointer ) ); // @phpstan-ignore argument.type
510 529 $pointers_on_page = true;
511 530 }
512 531
513 532 if ( $pointers_on_page ) {