PluginProbe
TablePress – Tables in WordPress made easy / 3.4
TablePress – Tables in WordPress made easy v3.4
3.4 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 All 45 releases
← All changes | views/view-edit.php +212 -389 2.1.7 → 3.4 View file →
@@ -7,8 +7,10 @@
7 7 * @author Tobias Bäthge
8 8 * @since 1.0.0
9 9 */
10 10
11 +declare(strict_types=1);
12 +
11 13 // Prohibit direct script loading.
12 14 defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13 15
14 16 /**
@@ -24,23 +26,28 @@
24 26 /**
25 27 * List of WP feature pointers for this view.
26 28 *
27 29 * @since 2.0.0
28 - * @var array
30 + * @var string[]
29 31 */
30 - protected $wp_pointers = array( 'tp20_edit_context_menu', 'tp21_edit_screen_options' );
32 + protected array $wp_pointers = array( 'tp34_edit_toolbar', 'tp33_edit_quick_navigation' );
31 33
32 34 /**
33 - * Set up the view with data and do things that are specific for this view.
35 + * Sets up the view with data and do things that are specific for this view.
34 36 *
35 37 * @since 1.0.0
36 38 *
37 - * @param string $action Action for this view.
38 - * @param array $data Data for this view.
39 + * @param string $action Action for this view.
40 + * @param array<string, mixed> $data Data for this view.
39 41 */
40 - public function setup( $action, array $data ) {
42 + #[\Override]
43 + public function setup( /* string */ $action, array $data ) /* : void */ {
44 + // Don't use type hints in the method declaration to prevent PHP errors, as the method is inherited.
45 +
41 46 parent::setup( $action, $data );
42 47
48 + TablePress::enqueue_script( 'common', array( 'jquery-core', 'postbox' ) );
49 +
43 50 $this->add_text_box( 'no-javascript', array( $this, 'textbox_no_javascript' ), 'header' );
44 51
45 52 if ( isset( $data['table']['is_corrupted'] ) && $data['table']['is_corrupted'] ) {
46 53 $this->add_text_box( 'table-corrupted', array( $this, 'textbox_corrupted_table' ), 'header' );
@@ -53,47 +60,48 @@
53 60 'success_import' => __( 'The table was imported successfully.', 'tablepress' ),
54 61 'error_delete' => __( 'Error: The table could not be deleted.', 'tablepress' ),
55 62 ) );
56 63
64 + // For the Advanced Editor.
57 65 wp_enqueue_style( 'wp-jquery-ui-dialog' );
58 66 wp_enqueue_style( 'editor-buttons' );
59 - wp_enqueue_script( 'wpdialogs' ); // For the Advanced Editor, Table Preview, and Help Boxes.
67 + wp_enqueue_script( 'wpdialogs' );
68 + // For the "Insert Image" dialog.
60 69 add_filter( 'media_view_strings', array( $this, 'change_media_view_strings' ) );
61 70 wp_enqueue_media();
62 - wp_enqueue_script( 'wplink' ); // JS for the "Insert Link" button.
63 - $this->admin_page->enqueue_style( 'jspreadsheet' );
64 - $this->admin_page->enqueue_style( 'jsuites', array( 'tablepress-jspreadsheet' ) );
65 - $this->admin_page->enqueue_style( 'edit', array( 'tablepress-jspreadsheet', 'tablepress-jsuites' ) );
66 - if ( tb_tp_fs()->is_free_plan() ) {
67 - $this->admin_page->enqueue_style( 'edit-features', array( 'tablepress-edit' ) );
71 + // For the "Insert Link" dialog.
72 + wp_enqueue_script( 'wplink' );
73 +
74 + TablePress::enqueue_style( 'jspreadsheet' );
75 + TablePress::enqueue_style( 'jsuites', array( 'tablepress-jspreadsheet' ) );
76 + TablePress::enqueue_style( 'edit', array( 'tablepress-jspreadsheet', 'tablepress-jsuites' ) );
77 + if ( ! TABLEPRESS_IS_PLAYGROUND_PREVIEW && tb_tp_fs()->is_free_plan() ) {
78 + TablePress::enqueue_style( 'edit-features', array( 'tablepress-edit' ) );
68 79 }
69 - $this->admin_page->enqueue_script( 'jspreadsheet' );
70 - $this->admin_page->enqueue_script( 'jsuites', array( 'tablepress-jspreadsheet' ) );
71 - $this->admin_page->enqueue_script( 'edit', array( 'tablepress-jspreadsheet', 'tablepress-jsuites', 'jquery-core' ) );
80 + TablePress::enqueue_script( 'jspreadsheet' );
81 + TablePress::enqueue_script( 'jsuites', array( 'tablepress-jspreadsheet' ) );
82 + TablePress::enqueue_script( 'edit', array( 'tablepress-jspreadsheet', 'tablepress-jsuites', 'jquery-core' ) );
72 83
73 84 $this->add_text_box( 'head', array( $this, 'textbox_head' ), 'normal' );
74 - $this->add_text_box( 'buttons-1', array( $this, 'textbox_buttons' ), 'normal' );
85 + $this->add_text_box( 'header-bar', array( $this, 'textbox_header_bar' ), 'normal' );
75 86 $this->add_meta_box( 'table-information', __( 'Table Information', 'tablepress' ), array( $this, 'postbox_table_information' ), 'normal' );
76 87 $this->add_meta_box( 'table-data', __( 'Table Content', 'tablepress' ), array( $this, 'postbox_table_data' ), 'normal' );
77 - $this->add_meta_box( 'table-manipulation', __( 'Table Manipulation', 'tablepress' ), array( $this, 'postbox_table_manipulation' ), 'normal' );
78 88 $this->add_meta_box( 'table-options', __( 'Table Options', 'tablepress' ), array( $this, 'postbox_table_options' ), 'normal' );
79 89 $this->add_meta_box( 'datatables-features', __( 'Table Features for Site Visitors', 'tablepress' ), array( $this, 'postbox_datatables_features' ), 'normal' );
80 90 $this->add_text_box( 'hidden-containers', array( $this, 'textbox_hidden_containers' ), 'additional' );
81 - $this->add_text_box( 'buttons-2', array( $this, 'textbox_buttons' ), 'additional' );
82 - $this->add_text_box( 'other-actions', array( $this, 'textbox_other_actions' ), 'submit' );
83 91
84 92 add_filter( 'screen_settings', array( $this, 'add_screen_options_output' ), 10, 2 );
85 93 }
86 94
87 95 /**
88 - * Change Media View string "Insert into post" to "Insert into Table".
96 + * Changes the Media View string "Insert into post" to "Insert into Table".
89 97 *
90 98 * @since 1.0.0
91 99 *
92 - * @param array $strings Current set of Media View strings.
93 - * @return array Changed Media View strings.
100 + * @param array<string, string> $strings Current set of Media View strings.
101 + * @return array<string, string> Changed Media View strings.
94 102 */
95 - public function change_media_view_strings( array $strings ) {
103 + public function change_media_view_strings( array $strings ): array {
96 104 $strings['insertIntoPost'] = __( 'Insert into Table', 'tablepress' );
97 105 return $strings;
98 106 }
99 107
@@ -105,9 +113,16 @@
105 113 * @param string $screen_settings Screen settings.
106 114 * @param WP_Screen $screen WP_Screen object.
107 115 * @return string Extended Screen settings.
108 116 */
109 - public function add_screen_options_output( $screen_settings, $screen ) {
117 + public function add_screen_options_output( /* string */ $screen_settings, WP_Screen $screen ): string {
118 + // Don't use a type hint for the `$screen_settings` argument as many WordPress plugins seem to be returning `null` in their filter hook handlers.
119 +
120 + // Protect against other plugins not returning a string for the `$screen_settings` argument.
121 + if ( ! is_string( $screen_settings ) ) { // @phpstan-ignore function.alreadyNarrowedType (The `is_string()` check is needed as the input is coming from a filter hook.)
122 + $screen_settings = '';
123 + }
124 +
110 125 $screen_settings = '<fieldset id="tablepress-screen-options" class="screen-options">';
111 126 $screen_settings .= '<legend>' . __( 'Table editor settings', 'tablepress' ) . '</legend>';
112 127 $screen_settings .= '<p>' . __( 'Adjust the default size of the table cells in the table editor below.', 'tablepress' ) . ' ' . __( 'Cells with many lines of text will expand to their full height when they are edited.', 'tablepress' ) . '</p>';
113 128 $screen_settings .= '<p><em>' . __( 'Please note: These settings only influence the table editor view on this screen, but not the table that the site visitor sees!', 'tablepress' ) . '</em></p>';
@@ -112,14 +127,16 @@
112 127 $screen_settings .= '<p>' . __( 'Adjust the default size of the table cells in the table editor below.', 'tablepress' ) . ' ' . __( 'Cells with many lines of text will expand to their full height when they are edited.', 'tablepress' ) . '</p>';
113 128 $screen_settings .= '<p><em>' . __( 'Please note: These settings only influence the table editor view on this screen, but not the table that the site visitor sees!', 'tablepress' ) . '</em></p>';
114 129 $screen_settings .= '<div>';
115 130 $screen_settings .= '<label for="table_editor_column_width">' . __( 'Default column width:', 'tablepress' ) . '</label> ';
116 - $input = '<input type="number" id="table_editor_column_width" class="small-text" value="' . esc_attr( TablePress::$model_options->get( 'table_editor_column_width' ) ) . '" min="30" max="9999" />';
131 + $input = '<input type="number" id="table_editor_column_width" class="small-text" value="' . esc_attr( TablePress::$model_options->get( 'table_editor_column_width' ) ) . '" min="30" max="9999">';
132 + /* translators: %s: Input field for the number of pixels */
117 133 $screen_settings .= sprintf( __( '%s pixels', 'tablepress' ), $input );
118 134 $screen_settings .= '</div>';
119 135 $screen_settings .= '<div style="margin-top: 6px;">';
120 136 $screen_settings .= '<label for="table_editor_line_clamp">' . __( 'Maximum visible lines of text:', 'tablepress' ) . '</label> ';
121 - $input = '<input type="number" id="table_editor_line_clamp" class="tiny-text" value="' . esc_attr( TablePress::$model_options->get( 'table_editor_line_clamp' ) ) . '" min="0" max="999" />';
137 + $input = '<input type="number" id="table_editor_line_clamp" class="tiny-text" value="' . esc_attr( TablePress::$model_options->get( 'table_editor_line_clamp' ) ) . '" min="0" max="999">';
138 + /* translators: %s: Input field for the number of lines */
122 139 $screen_settings .= sprintf( __( '%s lines', 'tablepress' ), $input );
123 140 $screen_settings .= '</div>';
124 141 $screen_settings .= '</fieldset>';
125 142 return $screen_settings;
@@ -124,9 +141,8 @@
124 141 $screen_settings .= '</fieldset>';
125 142 return $screen_settings;
126 143 }
127 144
128 -
129 145 /**
130 146 * Renders the current view.
131 147 *
132 148 * In comparison to the parent class method, this contains handling for the no-js case and adjusts the HTML code structure.
@@ -132,9 +148,12 @@
132 148 * In comparison to the parent class method, this contains handling for the no-js case and adjusts the HTML code structure.
133 149 *
134 150 * @since 2.0.0
135 151 */
136 - public function render() {
152 + #[\Override]
153 + public function render(): void {
154 + $this->print_javascript_data();
155 +
137 156 ?>
138 157 <div id="tablepress-page" class="wrap">
139 158 <form>
140 159 <?php
@@ -140,9 +159,10 @@
140 159 <?php
141 160 $this->print_nav_tab_menu();
142 161 ?>
143 162 <div id="tablepress-body">
144 - <hr class="wp-header-end" />
163 + <hr class="wp-header-end">
164 + <script>document.querySelectorAll('.notice:has(~#tablepress-page)').forEach(e=>document.querySelector('.wp-header-end').after(e));</script>
145 165 <?php
146 166 // Print all header messages.
147 167 foreach ( $this->header_messages as $message ) {
148 168 echo $message;
@@ -166,9 +186,9 @@
166 186 $this->do_meta_boxes( 'side' );
167 187 ?>
168 188 </div>
169 189 </div>
170 - <br class="clear" />
190 + <br class="clear">
171 191 </div>
172 192 </form>
173 193 </div>
174 194 </div>
@@ -175,67 +195,102 @@
175 195 <?php
176 196 }
177 197
178 198 /**
179 - * Override parent class method, as the nonces for this view are generated in the JS code.
199 + * Overrides parent class method, as the nonces for this view are generated in the JS code.
180 200 *
181 201 * @since 1.0.0
182 202 *
183 - * @param array $data Data for this screen.
184 - * @param array $box Information about the text box.
203 + * @param array<string, mixed> $data Data for this screen.
204 + * @param array<string, mixed> $box Information about the text box.
185 205 */
186 - protected function action_nonce_field( array $data, array $box ) {
187 - // Intentionally left empty. Nonces for this view are generated in postbox_table_data().
206 + #[\Override]
207 + protected function action_nonce_field( array $data, array $box ): void {
208 + // Intentionally left empty. Nonces for this view are generated in `print_javascript_data()`.
188 209 }
189 210
190 211 /**
191 - * Print the content of the "Table Information" post meta box.
212 + * Prints the table data for use in JS code and the main React container.
192 213 *
214 + * @since 3.0.0
215 + */
216 + public function print_javascript_data(): void {
217 + echo "<script>\n";
218 + echo "window.tp = window.tp || {};\n";
219 +
220 + echo "tp.nonces = {\n";
221 + echo "\tedit_table: '" . wp_create_nonce( TablePress::nonce( $this->action, $this->data['table']['id'] ) ) . "',\n";
222 + echo "\tpreview_table: '" . wp_create_nonce( TablePress::nonce( 'preview_table', $this->data['table']['id'] ) ) . "',\n";
223 + echo "\tcopy_table: '" . wp_create_nonce( TablePress::nonce( 'copy_table', $this->data['table']['id'] ) ) . "',\n";
224 + echo "\tdelete_table: '" . wp_create_nonce( TablePress::nonce( 'delete_table', $this->data['table']['id'] ) ) . "',\n";
225 + echo "\tscreen_options: '" . wp_create_nonce( TablePress::nonce( 'screen_options' ) ) . "',\n";
226 + echo "};\n";
227 +
228 + echo "tp.table = {\n";
229 + echo "\tid: '{$this->data['table']['id']}',\n";
230 + echo "\tshortcode: '" . esc_js( TablePress::$shortcode ) . "',\n";
231 +
232 + // Add the table meta data.
233 + $this->data['table']['meta'] = array(
234 + 'id' => $this->data['table']['id'],
235 + 'name' => $this->data['table']['name'],
236 + 'description' => $this->data['table']['description'],
237 + 'lastModified' => TablePress::format_datetime( $this->data['table']['last_modified'] ),
238 + 'lastEditor' => TablePress::get_user_display_name( $this->data['table']['options']['last_editor'] ),
239 + );
240 +
241 + // JSON-encode array items separately to save some PHP memory.
242 + foreach ( array( 'meta', 'data', 'options', 'visibility' ) as $item ) {
243 + $json = $this->convert_to_json_parse_output( $this->data['table'][ $item ] );
244 + echo "\t{$item}: {$json},\n";
245 + }
246 + echo "};\n";
247 +
248 + echo "tp.screenOptions = {\n";
249 + echo "\ttable_editor_column_width: " . absint( TablePress::$model_options->get( 'table_editor_column_width' ) ) . ",\n";
250 + echo "\tshowCustomCommands: " . ( current_user_can( 'unfiltered_html' ) ? 'true' : 'false' ) . ",\n";
251 + echo "\toptionsUrl: '" . TablePress::url( array( 'action' => 'options' ) ) . "',\n";
252 + echo "\tcurrentUserCanEditTableId: " . ( current_user_can( 'tablepress_edit_table_id', $this->data['table']['id'] ) ? 'true' : 'false' ) . ",\n";
253 + echo "\tcurrentUserCanCopyTable: " . ( current_user_can( 'tablepress_copy_table', $this->data['table']['id'] ) ? 'true' : 'false' ) . ",\n";
254 + echo "\tcurrentUserCanDeleteTable: " . ( current_user_can( 'tablepress_delete_table', $this->data['table']['id'] ) ? 'true' : 'false' ) . ",\n";
255 + echo "\tcurrentUserCanExportTable: " . ( current_user_can( 'tablepress_export_table', $this->data['table']['id'] ) ? 'true' : 'false' ) . ",\n";
256 + echo "\tcurrentUserCanPreviewTable: " . ( current_user_can( 'tablepress_preview_table', $this->data['table']['id'] ) ? 'true' : 'false' ) . ",\n";
257 + echo "\tcopyUrl: '" . str_replace( '&amp;', '&', TablePress::url( array( 'action' => 'copy_table', 'item' => $this->data['table']['id'], 'return' => 'edit' ), true, 'admin-post.php' ) ) . "',\n";
258 + echo "\tdeleteUrl: '" . str_replace( '&amp;', '&', TablePress::url( array( 'action' => 'delete_table', 'item' => $this->data['table']['id'], 'return' => 'edit', 'return_item' => $this->data['table']['id'] ), true, 'admin-post.php' ) ) . "',\n";
259 + echo "\texportUrl: '" . str_replace( '&amp;', '&', TablePress::url( array( 'action' => 'export', 'table_id' => $this->data['table']['id'] ) ) ) . "',\n";
260 + echo "\tpreviewUrl: '" . str_replace( '&amp;', '&', TablePress::url( array( 'action' => 'preview_table', 'item' => $this->data['table']['id'], 'return' => 'edit', 'return_item' => $this->data['table']['id'] ), true, 'admin-post.php' ) ) . "',\n";
261 + echo "};\n";
262 +
263 + echo "</script>\n";
264 +
265 + echo '<div id="tablepress-edit-screen"></div>'; // React container.
266 + }
267 +
268 + /**
269 + * Prints the content of the "Table Information" post meta box.
270 + *
193 271 * @since 1.0.0
194 272 *
195 - * @param array $data Data for this screen.
196 - * @param array $box Information about the meta box.
273 + * @param array<string, mixed> $data Data for this screen.
274 + * @param array<string, mixed> $box Information about the meta box.
197 275 */
198 - public function postbox_table_information( array $data, array $box ) {
199 - ?>
200 -<table class="tablepress-postbox-table fixed">
201 - <tr class="bottom-border">
202 - <th class="column-1" scope="row"><label for="table-id"><?php _e( 'Table ID', 'tablepress' ); ?>:</label></th>
203 - <td class="column-2">
204 - <div id="table-id-shortcode-wrapper">
205 - <input type="text" id="table-id" value="<?php echo esc_attr( $data['table']['id'] ); ?>" title="<?php esc_attr_e( 'The Table ID can only consist of letters, numbers, hyphens (-), and underscores (_).', 'tablepress' ); ?>" pattern="[A-Za-z1-9_-]|[A-Za-z0-9_-]{2,}" required <?php echo ( ! current_user_can( 'tablepress_edit_table_id', $data['table']['id'] ) ) ? 'readonly ' : ''; ?>/>
206 - <div><label for="table-information-shortcode"><?php _e( 'Shortcode', 'tablepress' ); ?>:</label> <input type="text" id="table-information-shortcode" value="<?php echo esc_attr( '[' . TablePress::$shortcode . " id={$data['table']['id']} /]" ); ?>" readonly /></div>
207 - </div>
208 - </td>
209 - </tr>
210 - <tr class="top-border">
211 - <th class="column-1" scope="row"><label for="table-name"><?php _e( 'Table Name', 'tablepress' ); ?>:</label></th>
212 - <td class="column-2"><input type="text" id="table-name" class="large-text" value="<?php echo esc_attr( $data['table']['name'] ); ?>" /></td>
213 - </tr>
214 - <tr class="bottom-border">
215 - <th class="column-1 top-align" scope="row"><label for="table-description"><?php _e( 'Description', 'tablepress' ); ?>:</label></th>
216 - <td class="column-2"><textarea id="table-description" class="large-text" rows="4"><?php echo esc_textarea( $data['table']['description'] ); ?></textarea></td>
217 - </tr>
218 - <tr class="top-border">
219 - <th class="column-1" scope="row"><?php _e( 'Last Modified', 'tablepress' ); ?>:</th>
220 - <td class="column-2"><?php printf( __( '%1$s by %2$s', 'tablepress' ), '<span id="last-modified">' . TablePress::format_datetime( $data['table']['last_modified'] ) . '</span>', '<span id="last-editor">' . TablePress::get_user_display_name( $data['table']['options']['last_editor'] ) . '</span>' ); ?></td>
221 - </tr>
222 -</table>
223 - <?php
224 - if ( tb_tp_fs()->is_free_plan() ) :
276 + public function postbox_table_information( array $data, array $box ): void {
277 + echo '<div id="tablepress-table-information-section"></div>';
278 +
279 + if ( ! TABLEPRESS_IS_PLAYGROUND_PREVIEW && tb_tp_fs()->is_free_plan() ) :
225 280 ?>
226 281 <div class="postbox premium-features">
227 282 <div>
228 283 <div>
229 284 <div class="postbox-header">
230 - <h2><span class="dashicons dashicons-heart"></span> <?php _e( 'TablePress has more to offer!', 'tablepress' ); ?></h2>
285 + <h2><span class="dashicons dashicons-lightbulb"></span> <?php _e( 'TablePress has more to offer!', 'tablepress' ); ?></h2>
231 286 </div>
232 287 <div class="inside">
233 288 <?php
234 - TablePress::init_modules();
289 + TablePress::load_modules_data();
235 290 $random_module_slug = array_rand( TablePress::$modules );
236 291 $feature_module = TablePress::$modules[ $random_module_slug ];
237 - $module_url = esc_url( "https://tablepress.org/modules/{$random_module_slug}/" );
292 + $module_url = esc_url( "https://tablepress.org/modules/{$random_module_slug}/?utm_source=plugin&utm_medium=textlink&utm_content=edit-screen" );
238 293
239 294 echo '<strong>' . __( 'Supercharge your tables with exceptional features:', 'tablepress' ) . '</strong>';
240 295 echo '<h3><a href="' . $module_url . '">' . $feature_module['name'] . '</a></h3>';
241 296 echo '<span>' . $feature_module['description'] . ' <a href="' . $module_url . '">' . __( 'Read more!', 'tablepress' ) . '</a></span>';
@@ -242,9 +297,9 @@
242 297 ?>
243 298 </div>
244 299 </div>
245 300 <div class="buttons">
246 - <a href="<?php echo 'https://tablepress.org/premium/'; ?>" class="tablepress-button">
301 + <a href="https://tablepress.org/premium/?utm_source=plugin&utm_medium=textlink&utm_content=edit-screen" class="tablepress-button">
247 302 <span><?php _e( 'Compare the TablePress premium versions', 'tablepress' ); ?></span>
248 303 <span class="dashicons dashicons-arrow-right-alt"></span>
249 304 </a>
250 305 </div>
@@ -254,39 +309,17 @@
254 309 endif;
255 310 }
256 311
257 312 /**
258 - * Print the content of the "Table Content" post meta box.
313 + * Prints the content of the "Table Content" post meta box.
259 314 *
260 315 * @since 1.0.0
261 316 *
262 - * @param array $data Data for this screen.
263 - * @param array $box Information about the meta box.
317 + * @param array<string, mixed> $data Data for this screen.
318 + * @param array<string, mixed> $box Information about the meta box.
264 319 */
265 - public function postbox_table_data( array $data, array $box ) {
266 - echo "<script>\n";
267 - echo "window.tp = window.tp || {};\n";
268 -
269 - echo "tp.nonces = {};\n";
270 - echo "tp.nonces.edit_table = '" . wp_create_nonce( TablePress::nonce( $this->action, $data['table']['id'] ) ) . "';\n";
271 - echo "tp.nonces.preview_table = '" . wp_create_nonce( TablePress::nonce( 'preview_table', $data['table']['id'] ) ) . "';\n";
272 - echo "tp.nonces.screen_options = '" . wp_create_nonce( TablePress::nonce( 'screen_options' ) ) . "';\n";
273 - echo "\n";
274 -
275 - echo "tp.table = {};\n";
276 - echo "tp.table.shortcode = '" . esc_js( TablePress::$shortcode ) . "';\n";
277 - echo "tp.table.id = '{$data['table']['id']}';\n";
278 - echo "tp.table.new_id = '{$data['table']['id']}';\n";
279 - // JSON-encode array items separately to save some PHP memory.
280 - foreach ( array( 'data', 'options', 'visibility' ) as $item ) {
281 - $json = $this->admin_page->convert_to_json_parse_output( $data['table'][ $item ] );
282 - printf( 'tp.table.%1$s = %2$s;' . "\n", $item, $json );
283 - }
284 -
285 - echo "tp.screen_options = {};\n";
286 - echo 'tp.screen_options.table_editor_column_width = ' . absint( TablePress::$model_options->get( 'table_editor_column_width' ) ) . ";\n";
287 - echo "</script>\n";
288 -
320 + public function postbox_table_data( array $data, array $box ): void {
321 + echo '<div id="tablepress-table-editor-toolbar-section"></div>';
289 322 $css_variables = '--table-editor-line-clamp:' . absint( TablePress::$model_options->get( 'table_editor_line_clamp' ) ) . ';';
290 323 $css_variables = esc_attr( $css_variables );
291 324 echo "<div id=\"table-editor\" style=\"{$css_variables}\"></div>";
292 325 }
@@ -291,145 +324,31 @@
291 324 echo "<div id=\"table-editor\" style=\"{$css_variables}\"></div>";
292 325 }
293 326
294 327 /**
295 - * Print the content of the "Table Manipulation" post meta box.
328 + * Prints the container for the sticky "Header Bar".
296 329 *
297 - * @since 1.0.0
330 + * @since 3.3.0
298 331 *
299 - * @param array $data Data for this screen.
300 - * @param array $box Information about the meta box.
332 + * @param array<string, mixed> $data Data for this screen.
333 + * @param array<string, mixed> $box Information about the text box.
301 334 */
302 - public function postbox_table_manipulation( array $data, array $box ) {
303 - ?>
304 -<table id="tablepress-manipulation-controls" class="tablepress-postbox-table fixed">
305 - <tr class="bottom-border">
306 - <td class="column-1">
307 - <?php _e( 'Selected cells', 'tablepress' ); ?>:&nbsp;
308 - <input type="button" class="button" id="button-insert-link" value="<?php esc_attr_e( 'Insert Link', 'tablepress' ); ?>" data-shortcut="<?php echo esc_attr( _x( '%1$sL', 'keyboard shortcut for Insert Link', 'tablepress' ) ); ?>" />
309 - <input type="button" class="button" id="button-insert-image" value="<?php esc_attr_e( 'Insert Image', 'tablepress' ); ?>" data-shortcut="<?php echo esc_attr( _x( '%1$sI', 'keyboard shortcut for Insert Image', 'tablepress' ) ); ?>" />
310 - <input type="button" class="button" id="button-advanced-editor" value="<?php esc_attr_e( 'Advanced Editor', 'tablepress' ); ?>" data-shortcut="<?php echo esc_attr( _x( '%1$sE', 'keyboard shortcut for Advanced Editor', 'tablepress' ) ); ?>" />
311 - </td>
312 - <td class="column-2">
313 - <?php _e( 'Selected cells', 'tablepress' ); ?>:&nbsp;
314 - <input type="button" class="button button-merge-unmerge" data-action="merge" value="<?php esc_attr_e( 'Combine/Merge', 'tablepress' ); ?>" />
315 - <input type="button" class="button button-show-help-box" value="<?php esc_attr_e( '?', 'tablepress' ); ?>" title="<?php esc_attr_e( 'Help on combining cells', 'tablepress' ); ?>" data-help-box="#help-box-combine-cells" />
316 - </td>
317 - </tr>
318 - <tr class="top-border">
319 - <td class="column-1">
320 - <?php _e( 'Selected rows', 'tablepress' ); ?>:&nbsp;
321 - <input type="button" class="button button-insert-duplicate" data-type="rows" data-action="duplicate" value="<?php esc_attr_e( 'Duplicate', 'tablepress' ); ?>" />
322 - <input type="button" class="button button-insert-duplicate" data-type="rows" data-action="insert" value="<?php esc_attr_e( 'Insert', 'tablepress' ); ?>" />
323 - <input type="button" class="button button-remove" data-type="rows" value="<?php esc_attr_e( 'Delete', 'tablepress' ); ?>" />
324 - </td>
325 - <td class="column-2">
326 - <?php _e( 'Selected columns', 'tablepress' ); ?>:&nbsp;
327 - <input type="button" class="button button-insert-duplicate" data-type="columns" data-action="duplicate" value="<?php esc_attr_e( 'Duplicate', 'tablepress' ); ?>" />
328 - <input type="button" class="button button-insert-duplicate" data-type="columns" data-action="insert" value="<?php esc_attr_e( 'Insert', 'tablepress' ); ?>" />
329 - <input type="button" class="button button-remove" data-type="columns" value="<?php esc_attr_e( 'Delete', 'tablepress' ); ?>" />
330 - </td>
331 - </tr>
332 - <tr>
333 - <td class="column-1">
334 - <?php _e( 'Selected rows', 'tablepress' ); ?>:&nbsp;
335 - <input type="button" class="button button-move" data-type="rows" data-direction="up" value="<?php esc_attr_e( 'Move up', 'tablepress' ); ?>" data-shortcut="<?php echo esc_attr( _x( '%1$s⇧↑', 'keyboard shortcut for Move up', 'tablepress' ) ); ?>" />
336 - <input type="button" class="button button-move" data-type="rows" data-direction="down" value="<?php esc_attr_e( 'Move down', 'tablepress' ); ?>" data-shortcut="<?php echo esc_attr( _x( '%1$s⇧↓', 'keyboard shortcut for Move down', 'tablepress' ) ); ?>" />
337 - </td>
338 - <td class="column-2">
339 - <?php _e( 'Selected columns', 'tablepress' ); ?>:&nbsp;
340 - <input type="button" class="button button-move" data-type="columns" data-direction="left" value="<?php esc_attr_e( 'Move left', 'tablepress' ); ?>" data-shortcut="<?php echo esc_attr( _x( '%1$s⇧←', 'keyboard shortcut for Move left', 'tablepress' ) ); ?>" />
341 - <input type="button" class="button button-move" data-type="columns" data-direction="right" value="<?php esc_attr_e( 'Move right', 'tablepress' ); ?>" data-shortcut="<?php echo esc_attr( _x( '%1$s⇧→', 'keyboard shortcut for Move right', 'tablepress' ) ); ?>" />
342 - </td>
343 - </tr>
344 - <tr class="bottom-border">
345 - <td class="column-1">
346 - <?php _e( 'Selected rows', 'tablepress' ); ?>:&nbsp;
347 - <input type="button" class="button button-hide-unhide" data-type="rows" data-action="hide" value="<?php esc_attr_e( 'Hide', 'tablepress' ); ?>" />
348 - <input type="button" class="button button-hide-unhide" data-type="rows" data-action="unhide" value="<?php esc_attr_e( 'Show', 'tablepress' ); ?>" />
349 - </td>
350 - <td class="column-2">
351 - <?php _e( 'Selected columns', 'tablepress' ); ?>:&nbsp;
352 - <input type="button" class="button button-hide-unhide" data-type="columns" data-action="hide" value="<?php esc_attr_e( 'Hide', 'tablepress' ); ?>" />
353 - <input type="button" class="button button-hide-unhide" data-type="columns" data-action="unhide" value="<?php esc_attr_e( 'Show', 'tablepress' ); ?>" />
354 - </td>
355 - </tr>
356 - <tr class="top-border">
357 - <td class="column-1">
358 - <label><?php printf( __( 'Add %s row(s)', 'tablepress' ), '<input type="number" id="rows-append-number" class="small-text" title="' . esc_attr__( 'This field must contain a positive number.', 'tablepress' ) . '" value="1" min="1" max="99999" required />' ); ?></label>&nbsp;
359 - <input type="button" class="button button-append" data-type="rows" value="<?php esc_attr_e( 'Add', 'tablepress' ); ?>" />
360 - </td>
361 - <td class="column-2">
362 - <label><?php printf( __( 'Add %s column(s)', 'tablepress' ), '<input type="number" id="columns-append-number" class="small-text" title="' . esc_attr__( 'This field must contain a positive number.', 'tablepress' ) . '" value="1" min="1" max="99999" required />' ); ?></label>&nbsp;
363 - <input type="button" class="button button-append" data-type="columns" value="<?php esc_attr_e( 'Add', 'tablepress' ); ?>" />
364 - </td>
365 - </tr>
366 -</table>
367 - <?php
335 + public function textbox_header_bar( array $data, array $box ): void {
336 + echo '<div id="tablepress-header-bar-section" class="section-has-react-loading-text">';
337 + echo '</div>';
368 338 }
369 339
370 340 /**
371 - * Print the "Preview" and "Save Changes" button.
341 + * Prints the hidden containers for the Preview.
372 342 *
373 343 * @since 1.0.0
374 344 *
375 - * @param array $data Data for this screen.
376 - * @param array $box Information about the text box.
345 + * @param array<string, mixed> $data Data for this screen.
346 + * @param array<string, mixed> $box Information about the text box.
377 347 */
378 - public function textbox_buttons( array $data, array $box ) {
379 - $preview_url = TablePress::url( array( 'action' => 'preview_table', 'item' => $data['table']['id'], 'return' => 'edit', 'return_item' => $data['table']['id'] ), true, 'admin-post.php' );
380 -
381 - echo '<p id="' . $box['id'] . '-submit" class="submit">';
382 - if ( current_user_can( 'tablepress_preview_table', $data['table']['id'] ) ) {
383 - echo '<a href="' . $preview_url . '" class="button button-large button-show-preview" target="_blank" data-shortcut="' . esc_attr( _x( '%1$sP', 'keyboard shortcut for Preview', 'tablepress' ) ) . '">' . __( 'Preview', 'tablepress' ) . '</a>';
384 - }
348 + public function textbox_hidden_containers( array $data, array $box ): void {
385 349 ?>
386 - <input type="button" class="button button-primary button-large button-save-changes" value="<?php esc_attr_e( 'Save Changes', 'tablepress' ); ?>" data-shortcut="<?php echo esc_attr( _x( '%1$sS', 'keyboard shortcut for Save Changes', 'tablepress' ) ); ?>" />
387 - <?php
388 - echo '</p>';
389 - }
390 -
391 - /**
392 - * Print the "Delete Table" and "Export Table" buttons.
393 - *
394 - * @since 1.0.0
395 - *
396 - * @param array $data Data for this screen.
397 - * @param array $box Information about the text box.
398 - */
399 - public function textbox_other_actions( array $data, array $box ) {
400 - $user_can_copy_table = current_user_can( 'tablepress_copy_table', $data['table']['id'] );
401 - $user_can_export_table = current_user_can( 'tablepress_export_table', $data['table']['id'] );
402 - $user_can_delete_table = current_user_can( 'tablepress_delete_table', $data['table']['id'] );
403 -
404 - if ( ! $user_can_copy_table && ! $user_can_export_table && ! $user_can_delete_table ) {
405 - return;
406 - }
407 -
408 - echo '<p class="submit">';
409 - echo __( 'Other Actions', 'tablepress' ) . ':&nbsp; ';
410 - if ( $user_can_copy_table ) {
411 - echo '<a href="' . TablePress::url( array( 'action' => 'copy_table', 'item' => $data['table']['id'], 'return' => 'edit' ), true, 'admin-post.php' ) . '" class="button">' . __( 'Copy Table', 'tablepress' ) . '</a> ';
412 - }
413 - if ( $user_can_export_table ) {
414 - echo '<a href="' . TablePress::url( array( 'action' => 'export', 'table_id' => $data['table']['id'] ) ) . '" class="button">' . __( 'Export Table', 'tablepress' ) . '</a> ';
415 - }
416 - if ( $user_can_delete_table ) {
417 - echo '<a href="' . TablePress::url( array( 'action' => 'delete_table', 'item' => $data['table']['id'], 'return' => 'edit', 'return_item' => $data['table']['id'] ), true, 'admin-post.php' ) . '" class="button delete-link">' . __( 'Delete Table', 'tablepress' ) . '</a>';
418 - }
419 - echo '</p>';
420 - }
421 -
422 - /**
423 - * Print the hidden containers for the Preview.
424 - *
425 - * @since 1.0.0
426 - *
427 - * @param array $data Data for this screen.
428 - * @param array $box Information about the text box.
429 - */
430 - public function textbox_hidden_containers( array $data, array $box ) {
431 - ?>
350 +<div id="tablepress-table-preview-section"></div>
432 351 <div class="hidden-container">
433 352 <div id="advanced-editor">
434 353 <label id="advanced-editor-label" for="advanced-editor-content" class="screen-reader-text"><?php esc_html_e( 'Advanced Editor', 'tablepress' ); ?></label>
435 354 <?php
@@ -442,191 +361,94 @@
442 361 );
443 362 wp_editor( '', 'advanced-editor-content', $wp_editor_options );
444 363 ?>
445 364 </div>
446 -</div>
447 -<div id="preview-container" class="hidden-container">
448 - <div id="table-preview">
449 - <iframe id="table-preview-iframe" src="about:blank"></iframe>
450 - </div>
451 -</div>
452 -<div class="hidden-container">
453 365 <textarea id="textarea-insert-helper" class="hidden"></textarea>
454 366 </div>
455 -<div id="help-box-combine-cells" class="help-box hidden-container" title="<?php esc_attr_e( 'Help on combining cells', 'tablepress' ); ?>" data-height="380" data-width="420">
456 367 <?php
457 - echo '<p>' . __( 'Table cells can span across more than one column or row.', 'tablepress' ) . '</p>';
458 - echo '<p>' . __( 'Combining consecutive cells within the same row is called &#8220;colspanning&#8221;.', 'tablepress' )
459 - . ' ' . __( 'Combining consecutive cells within the same column is called &#8220;rowspanning&#8221;.', 'tablepress' ) . '</p>';
460 - echo '<p>' . sprintf( __( 'To combine adjacent cells, select the desired cells and click the “%s” button or use the context menu.', 'tablepress' ), __( 'Combine/Merge', 'tablepress' ) )
461 - . ' ' . __( 'The corresponding keywords, <code>#colspan#</code> and <code>#rowspan#</code>, will then be added for you.', 'tablepress' ) . '</p>';
462 - echo '<p><strong>' . __( 'Be aware that the Table Features for Site Visitors, like sorting, filtering, and pagination, will not work on tables which have combined cells.', 'tablepress' ) . '</strong></p>';
463 - ?>
464 -</div>
465 - <?php
466 368 }
467 369
468 370 /**
469 - * Print the content of the "Table Options" post meta box.
371 + * Prints the content of the "Table Options" post meta box.
470 372 *
471 373 * @since 1.0.0
472 374 *
473 - * @param array $data Data for this screen.
474 - * @param array $box Information about the meta box.
375 + * @param array<string, mixed> $data Data for this screen.
376 + * @param array<string, mixed> $box Information about the meta box.
475 377 */
476 - public function postbox_table_options( array $data, array $box ) {
477 - ?>
478 -<table class="tablepress-postbox-table fixed">
479 - <tr>
480 - <th class="column-1" scope="row"><?php _e( 'Table Head Row', 'tablepress' ); ?>:</th>
481 - <td class="column-2"><label for="option-table_head"><input type="checkbox" id="option-table_head" name="table_head" /> <?php _e( 'The first row of the table is the table header.', 'tablepress' ); ?></label></td>
482 - </tr>
483 - <tr class="bottom-border">
484 - <th class="column-1" scope="row"><?php _e( 'Table Foot Row', 'tablepress' ); ?>:</th>
485 - <td class="column-2"><label for="option-table_foot"><input type="checkbox" id="option-table_foot" name="table_foot" /> <?php _e( 'The last row of the table is the table footer.', 'tablepress' ); ?></label></td>
486 - </tr>
487 - <tr class="top-border">
488 - <th class="column-1" scope="row"><?php _e( 'Alternating Row Colors', 'tablepress' ); ?>:</th>
489 - <td class="column-2"><label for="option-alternating_row_colors"><input type="checkbox" id="option-alternating_row_colors" name="alternating_row_colors" /> <?php _e( 'The background colors of consecutive rows shall alternate.', 'tablepress' ); ?></label></td>
490 - </tr>
491 - <tr class="bottom-border">
492 - <th class="column-1" scope="row"><?php _e( 'Row Hover Highlighting', 'tablepress' ); ?>:</th>
493 - <td class="column-2"><label for="option-row_hover"><input type="checkbox" id="option-row_hover" name="row_hover" /> <?php _e( 'Highlight a row while the mouse cursor hovers above it by changing its background color.', 'tablepress' ); ?></label></td>
494 - </tr>
495 - <tr class="top-border">
496 - <th class="column-1" scope="row"><label for="option-print_name"><?php _e( 'Print Table Name', 'tablepress' ); ?></label>:</th>
497 - <?php
498 - $position_select = '<select id="option-print_name_position" name="print_name_position">';
499 - $position_select .= '<option value="above">' . __( 'above', 'tablepress' ) . '</option>';
500 - $position_select .= '<option value="below">' . __( 'below', 'tablepress' ) . '</option>';
501 - $position_select .= '</select>';
502 - ?>
503 - <td class="column-2"><input type="checkbox" id="option-print_name" name="print_name" /> <label><?php printf( _x( 'Show the table name %s the table.', 'position (above or below)', 'tablepress' ), $position_select ); ?></label></td>
504 - </tr>
505 - <tr class="bottom-border">
506 - <th class="column-1" scope="row"><label for="option-print_description"><?php _e( 'Print Table Description', 'tablepress' ); ?></label>:</th>
507 - <?php
508 - $position_select = '<select id="option-print_description_position" name="print_description_position">';
509 - $position_select .= '<option value="above">' . __( 'above', 'tablepress' ) . '</option>';
510 - $position_select .= '<option value="below">' . __( 'below', 'tablepress' ) . '</option>';
511 - $position_select .= '</select>';
512 - ?>
513 - <td class="column-2"><input type="checkbox" id="option-print_description" name="print_description" /> <label><?php printf( _x( 'Show the table description %s the table.', 'position (above or below)', 'tablepress' ), $position_select ); ?></label></td>
514 - </tr>
515 - <tr class="top-border">
516 - <th class="column-1" scope="row"><?php _e( 'Extra CSS Classes', 'tablepress' ); ?>:</th>
517 - <td class="column-2"><label for="option-extra_css_classes"><input type="text" id="option-extra_css_classes" name="extra_css_classes" class="large-text code" title="<?php esc_attr_e( 'This field can only contain letters, numbers, spaces, hyphens (-), underscores (_), and colons (:).', 'tablepress' ); ?>" pattern="[A-Za-z0-9- _:]*" /><p class="description"><?php echo __( 'Additional CSS classes for styling purposes can be entered here.', 'tablepress' ) . ' ' . sprintf( __( 'This is NOT the place to enter <a href="%s">Custom CSS</a> code!', 'tablepress' ), TablePress::url( array( 'action' => 'options' ) ) ); ?></p></label></td>
518 - </tr>
519 -</table>
520 - <?php
378 + public function postbox_table_options( array $data, array $box ): void {
379 + echo '<div id="tablepress-table-options-section"></div>';
521 380 }
522 381
523 382 /**
524 - * Print the content of the "Table Features for Site Visitors" post meta box.
383 + * Prints the content of the "Table Features for Site Visitors" post meta box.
525 384 *
526 385 * @since 1.0.0
527 386 *
528 - * @param array $data Data for this screen.
529 - * @param array $box Information about the meta box.
387 + * @param array<string, mixed> $data Data for this screen.
388 + * @param array<string, mixed> $box Information about the meta box.
530 389 */
531 - public function postbox_datatables_features( array $data, array $box ) {
532 - ?>
533 -<p id="notice-datatables-head-row"><em><?php printf( __( 'These features and options are only available when the &#8220;%1$s&#8221; checkbox in the &#8220;%2$s&#8221; section is checked.', 'tablepress' ), __( 'Table Head Row', 'tablepress' ), __( 'Table Options', 'tablepress' ) ); ?></em></p>
534 -<table class="tablepress-postbox-table fixed">
535 - <tr class="bottom-border">
536 - <th class="column-1" scope="row"><?php _e( 'Enable Visitor Features', 'tablepress' ); ?>:</th>
537 - <td class="column-2"><label for="option-use_datatables"><input type="checkbox" id="option-use_datatables" name="use_datatables" /> <?php _e( 'Offer the following functions for site visitors with this table:', 'tablepress' ); ?></label></td>
538 - </tr>
539 - <tr class="top-border">
540 - <th class="column-1" scope="row"><?php _e( 'Sorting', 'tablepress' ); ?>:</th>
541 - <td class="column-2"><label for="option-datatables_sort"><input type="checkbox" id="option-datatables_sort" name="datatables_sort" /> <?php _e( 'Enable sorting of the table by the visitor.', 'tablepress' ); ?></label></td>
542 - </tr>
543 - <tr>
544 - <th class="column-1" scope="row"><?php _e( 'Search/Filtering', 'tablepress' ); ?>:</th>
545 - <td class="column-2"><label for="option-datatables_filter"><input type="checkbox" id="option-datatables_filter" name="datatables_filter" /> <?php _e( 'Enable the visitor to filter or search the table. Only rows with the search word in them are shown.', 'tablepress' ); ?></label></td>
546 - </tr>
547 - <tr>
548 - <th class="column-1" scope="row" style="vertical-align: top;"><?php _e( 'Pagination', 'tablepress' ); ?>:</th>
549 - <td class="column-2"><label for="option-datatables_paginate"><input type="checkbox" id="option-datatables_paginate" name="datatables_paginate" /> <?php _e( 'Enable pagination of the table (viewing only a certain number of rows at a time) by the visitor.', 'tablepress' ); ?></label><br />
550 - <label for="option-datatables_paginate_entries" class="checkbox-left">&nbsp;<?php printf( __( 'Show %s rows per page.', 'tablepress' ), '<input type="number" id="option-datatables_paginate_entries" class="small-text" name="datatables_paginate_entries" min="1" max="99999" required />' ); ?></label></td>
551 - </tr>
552 - <tr>
553 - <th class="column-1" scope="row"><?php _e( 'Pagination Length Change', 'tablepress' ); ?>:</th>
554 - <td class="column-2"><label for="option-datatables_lengthchange"><input type="checkbox" id="option-datatables_lengthchange" name="datatables_lengthchange" /> <?php _e( 'Allow the visitor to change the number of rows shown when using pagination.', 'tablepress' ); ?></label></td>
555 - </tr>
556 - <tr>
557 - <th class="column-1" scope="row"><?php _e( 'Info', 'tablepress' ); ?>:</th>
558 - <td class="column-2"><label for="option-datatables_info"><input type="checkbox" id="option-datatables_info" name="datatables_info" /> <?php _e( 'Enable the table information display, with information about the currently visible data, like the number of rows.', 'tablepress' ); ?></label></td>
559 - </tr>
560 - <tr<?php echo current_user_can( 'unfiltered_html' ) ? ' class="bottom-border"' : ''; ?>>
561 - <th class="column-1" scope="row"><?php _e( 'Horizontal Scrolling', 'tablepress' ); ?>:</th>
562 - <td class="column-2"><label for="option-datatables_scrollx"><input type="checkbox" id="option-datatables_scrollx" name="datatables_scrollx" /> <?php _e( 'Enable horizontal scrolling, to make viewing tables with many columns easier.', 'tablepress' ); ?></label></td>
563 - </tr>
564 - <?php
565 - // "Custom Commands" must only be available to trusted users.
566 - if ( current_user_can( 'unfiltered_html' ) ) {
567 - ?>
568 - <tr class="top-border">
569 - <th class="column-1" scope="row"><?php _e( 'Custom Commands', 'tablepress' ); ?>:</th>
570 - <td class="column-2"><label for="option-datatables_custom_commands"><textarea id="option-datatables_custom_commands" name="datatables_custom_commands" class="large-text code" rows="1"></textarea><p class="description"><?php echo sprintf( __( 'Additional parameters from the <a href="%s">DataTables documentation</a> to be added to the JS call.', 'tablepress' ), 'https://www.datatables.net/' ) . ' ' . __( 'For advanced use only.', 'tablepress' ); ?></p></label></td>
571 - </tr>
572 - <?php
573 - } // if
574 - ?>
575 -</table>
576 - <?php
390 + public function postbox_datatables_features( array $data, array $box ): void {
391 + echo '<div id="tablepress-datatables-features-section"></div>';
577 392 }
578 393
579 394 /**
580 - * Print a notification about a corrupted table.
395 + * Prints a notification about a corrupted table.
581 396 *
582 397 * @since 1.4.0
583 398 *
584 - * @param array $data Data for this screen.
585 - * @param array $box Information about the text box.
399 + * @param array<string, mixed> $data Data for this screen.
400 + * @param array<string, mixed> $box Information about the text box.
586 401 */
587 - public function textbox_corrupted_table( array $data, array $box ) {
402 + public function textbox_corrupted_table( array $data, array $box ): void {
588 403 ?>
589 - <div class="notice notice-error notice-large">
590 - <h3><em>
591 - <?php _e( 'Attention: Unfortunately, an error occurred.', 'tablepress' ); ?>
592 - </em></h3>
593 - <p>
594 - <?php
595 - printf( __( 'The internal data of table &#8220;%1$s&#8221; (ID %2$s) is corrupted.', 'tablepress' ), esc_html( $data['table']['name'] ), esc_html( $data['table']['id'] ) );
596 - echo ' ';
597 - printf( __( 'The following error was registered: %s.', 'tablepress' ), '<code>' . esc_html( $data['table']['json_error'] ) . '</code>' );
598 - ?>
599 - </p>
600 - <p>
601 - <?php
602 - _e( 'Because of this error, the table can not be edited at this time, to prevent possible further data loss.', 'tablepress' );
603 - echo ' ';
604 - printf( __( 'Please see the <a href="%s">TablePress FAQ page</a> for further instructions.', 'tablepress' ), 'https://tablepress.org/faq/corrupted-tables/' );
605 - ?>
606 - </p>
607 - <p>
608 - <?php echo '<a href="' . TablePress::url( array( 'action' => 'list' ) ) . '" class="button">' . __( 'Back to the List of Tables', 'tablepress' ) . '</a>'; ?>
609 - </p>
404 + <div class="notice components-notice is-error notice-error">
405 + <div class="components-notice__content">
406 + <h3><em>
407 + <?php _e( 'Attention: Unfortunately, an error occurred.', 'tablepress' ); ?>
408 + </em></h3>
409 + <p>
410 + <?php
411 + /* translators: %1$s: Table name, %2$s: Table ID */
412 + printf( __( 'The internal data of table &#8220;%1$s&#8221; (ID %2$s) is corrupted.', 'tablepress' ), esc_html( $data['table']['name'] ), esc_html( $data['table']['id'] ) );
413 + echo ' ';
414 + /* translators: %s: Error message */
415 + printf( __( 'The following error was registered: %s.', 'tablepress' ), '<code>' . esc_html( $data['table']['json_error'] ) . '</code>' );
416 + ?>
417 + </p>
418 + <p>
419 + <?php
420 + _e( 'Because of this error, the table can not be edited at this time, to prevent possible further data loss.', 'tablepress' );
421 + echo ' ';
422 + /* translators: %s: URL to TablePress FAQ page */
423 + printf( __( 'Please see the <a href="%s">TablePress FAQ page</a> for further instructions.', 'tablepress' ), 'https://tablepress.org/faq/corrupted-tables/' );
424 + ?>
425 + </p>
426 + <p>
427 + <?php echo '<a href="' . esc_url( TablePress::url( array( 'action' => 'list' ) ) ) . '" class="components-button is-secondary is-compact">' . __( 'Back to the List of Tables', 'tablepress' ) . '</a>'; ?>
428 + </p>
429 + </div>
610 430 </div>
611 431 <?php
612 432 }
613 433
614 434 /**
615 - * Print the screen head text.
435 + * Prints the screen head text.
616 436 *
617 437 * @since 1.0.0
618 438 *
619 - * @param array $data Data for this screen.
620 - * @param array $box Information about the text box.
439 + * @param array<string, mixed> $data Data for this screen.
440 + * @param array<string, mixed> $box Information about the text box.
621 441 */
622 - public function textbox_head( array $data, array $box ) {
442 + public function textbox_head( array $data, array $box ): void {
623 443 echo '<p>';
624 444 _e( 'To edit the content or modify the structure of this table, use the input fields and buttons below.', 'tablepress' );
625 445 echo ' ';
626 446 // Show the instructions string depending on whether the Block Editor is used on the site or not.
627 - if ( $data['site_uses_block_editor'] ) {
447 + if ( 'block' === $data['site_used_editor'] ) {
628 448 printf( __( 'To insert a table into a post or page, add a “%1$s” block in the block editor and select the desired table.', 'tablepress' ), __( 'TablePress table', 'tablepress' ) );
449 + } elseif ( 'elementor' === $data['site_used_editor'] ) {
450 + printf( __( 'To insert a table into a post or page, add a “%1$s” widget in the Elementor editor and select the desired table.', 'tablepress' ), __( 'TablePress table', 'tablepress' ) );
629 451 } else {
630 452 _e( 'To insert a table into a post or page, paste its Shortcode at the desired place in the editor.', 'tablepress' );
631 453 }
632 454 echo '</p>';
@@ -632,43 +454,44 @@
632 454 echo '</p>';
633 455 }
634 456
635 457 /**
636 - * Sets the content for the WP feature pointer about the drag and drop and sort on the "Edit" screen.
458 + * Sets the content for the WP feature pointer about the Table Editor Toolbar on the "Edit" screen.
637 459 *
638 - * @since 2.0.0
460 + * @since 3.4.0
639 461 */
640 - public function wp_pointer_tp20_edit_context_menu() {
641 - $content = '<h3>' . __( 'TablePress feature: Context menu', 'tablepress' ) . '</h3>';
642 - $content .= '<p>' . __( 'Did you know?', 'tablepress' ) . ' ' . __( 'Right-clicking the table content fields will open a context menu for quick access to common editing tools.', 'tablepress' ) . '</p>';
462 + public function wp_pointer_tp34_edit_toolbar(): void {
463 + $content = '<h3>' . __( 'TablePress feature: Toolbar', 'tablepress' ) . '</h3>';
464 + $content .= '<p style="text-wrap:balance">' . __( 'Adding links or images or modifying the structure of your tables is very easy with the sticky Table Editor Toolbar!', 'tablepress' ) . '</p>';
643 465
644 - $this->admin_page->print_wp_pointer_js(
645 - 'tp20_edit_context_menu',
646 - '#table-editor',
466 + $this->print_wp_pointer_js(
467 + 'tp34_edit_toolbar',
468 + '#tablepress-table-editor-toolbar-section > div > div > div:first-child',
647 469 array(
648 - 'content' => $content,
649 - 'position' => array( 'edge' => 'bottom', 'align' => 'center' ),
650 - )
470 + 'content' => $content,
471 + 'position' => array( 'edge' => is_rtl() ? 'right' : 'left', 'align' => 'center' ),
472 + 'pointerWidth' => 290,
473 + ),
651 474 );
652 475 }
653 476
654 477 /**
655 - * Sets the content for the WP feature pointer about the screen options for changing the cell size.
478 + * Sets the content for the WP feature pointer about the Quick Navigation on the "Edit" screen.
656 479 *
657 - * @since 2.1.0
480 + * @since 3.3.0
658 481 */
659 - public function wp_pointer_tp21_edit_screen_options() {
660 - $content = '<h3>' . __( 'TablePress feature: Column width and row height of the table editor', 'tablepress' ) . '</h3>';
661 - $content .= '<p>' . __( 'Did you know?', 'tablepress' ) . ' ' . sprintf( __( 'You can change the default cell size for the table editor on this “Edit” screen in the “%s”.', 'tablepress' ), __( 'Screen Options', 'default' ) ) . '</p>';
482 + public function wp_pointer_tp33_edit_quick_navigation(): void {
483 + $content = '<h3>' . __( 'TablePress feature: Quick Navigation', 'tablepress' ) . '</h3>';
484 + $content .= '<p style="text-wrap:balance">' . __( 'You can quickly navigate between different sections of the table editor using the Quick Navigation menu.', 'tablepress' ) . ' ' . __( 'Just click the logo or use the <kbd>%metaKey%J</kbd> keyboard shortcut!', 'tablepress' ) . '</p>';
662 485
663 - $this->admin_page->print_wp_pointer_js(
664 - 'tp21_edit_screen_options',
665 - '#screen-options-link-wrap',
486 + $this->print_wp_pointer_js(
487 + 'tp33_edit_quick_navigation',
488 + '#tablepress-header-bar-section',
666 489 array(
667 490 'content' => $content,
668 - 'position' => array( 'edge' => 'top', 'align' => 'right' ),
669 - 'pointerClass' => 'wp-pointer pointer-tp21_edit_screen_options',
670 - )
491 + 'position' => array( 'edge' => 'top', 'align' => is_rtl() ? 'right+16' : 'left-16' ),
492 + 'pointerWidth' => 330,
493 + ),
671 494 );
672 495 }
673 496
674 497 } // class TablePress_Edit_View