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 | views/view-edit.php +96 -242 2.23.0 View file →
@@ -26,12 +26,12 @@
26 26 *
27 27 * @since 2.0.0
28 28 * @var string[]
29 29 */
30 - protected $wp_pointers = array( 'tp20_edit_context_menu', 'tp21_edit_screen_options' );
30 + protected array $wp_pointers = array( 'tp20_edit_context_menu', 'tp21_edit_screen_options' );
31 31
32 32 /**
33 - * Set up the view with data and do things that are specific for this view.
33 + * Sets up the view with data and do things that are specific for this view.
34 34 *
35 35 * @since 1.0.0
36 36 *
37 37 * @param string $action Action for this view.
@@ -36,8 +36,9 @@
36 36 *
37 37 * @param string $action Action for this view.
38 38 * @param array<string, mixed> $data Data for this view.
39 39 */
40 + #[\Override]
40 41 public function setup( /* string */ $action, array $data ) /* : void */ {
41 42 // Don't use type hints in the method declaration to prevent PHP errors, as the method is inherited.
42 43
43 44 parent::setup( $action, $data );
@@ -64,9 +65,9 @@
64 65 wp_enqueue_script( 'wplink' ); // JS for the "Insert Link" button.
65 66 $this->admin_page->enqueue_style( 'jspreadsheet' );
66 67 $this->admin_page->enqueue_style( 'jsuites', array( 'tablepress-jspreadsheet' ) );
67 68 $this->admin_page->enqueue_style( 'edit', array( 'tablepress-jspreadsheet', 'tablepress-jsuites' ) );
68 - if ( tb_tp_fs()->is_free_plan() ) {
69 + if ( ! TABLEPRESS_IS_PLAYGROUND_PREVIEW && tb_tp_fs()->is_free_plan() ) {
69 70 $this->admin_page->enqueue_style( 'edit-features', array( 'tablepress-edit' ) );
70 71 }
71 72 $this->admin_page->enqueue_script( 'jspreadsheet' );
72 73 $this->admin_page->enqueue_script( 'jsuites', array( 'tablepress-jspreadsheet' ) );
@@ -86,9 +87,9 @@
86 87 add_filter( 'screen_settings', array( $this, 'add_screen_options_output' ), 10, 2 );
87 88 }
88 89
89 90 /**
90 - * Change Media View string "Insert into post" to "Insert into Table".
91 + * Changes the Media View string "Insert into post" to "Insert into Table".
91 92 *
92 93 * @since 1.0.0
93 94 *
94 95 * @param array<string, string> $strings Current set of Media View strings.
@@ -107,9 +108,16 @@
107 108 * @param string $screen_settings Screen settings.
108 109 * @param WP_Screen $screen WP_Screen object.
109 110 * @return string Extended Screen settings.
110 111 */
111 - public function add_screen_options_output( string $screen_settings, WP_Screen $screen ): string {
112 + public function add_screen_options_output( /* string */ $screen_settings, WP_Screen $screen ): string {
113 + // 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.
114 +
115 + // Protect against other plugins not returning a string for the `$screen_settings` argument.
116 + if ( ! is_string( $screen_settings ) ) { // @phpstan-ignore function.alreadyNarrowedType (The `is_string()` check is needed as the input is coming from a filter hook.)
117 + $screen_settings = '';
118 + }
119 +
112 120 $screen_settings = '<fieldset id="tablepress-screen-options" class="screen-options">';
113 121 $screen_settings .= '<legend>' . __( 'Table editor settings', 'tablepress' ) . '</legend>';
114 122 $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>';
115 123 $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,14 +122,14 @@
114 122 $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>';
115 123 $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>';
116 124 $screen_settings .= '<div>';
117 125 $screen_settings .= '<label for="table_editor_column_width">' . __( 'Default column width:', 'tablepress' ) . '</label> ';
118 - $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" />';
126 + $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">';
119 127 $screen_settings .= sprintf( __( '%s pixels', 'tablepress' ), $input );
120 128 $screen_settings .= '</div>';
121 129 $screen_settings .= '<div style="margin-top: 6px;">';
122 130 $screen_settings .= '<label for="table_editor_line_clamp">' . __( 'Maximum visible lines of text:', 'tablepress' ) . '</label> ';
123 - $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" />';
131 + $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">';
124 132 $screen_settings .= sprintf( __( '%s lines', 'tablepress' ), $input );
125 133 $screen_settings .= '</div>';
126 134 $screen_settings .= '</fieldset>';
127 135 return $screen_settings;
@@ -126,9 +134,8 @@
126 134 $screen_settings .= '</fieldset>';
127 135 return $screen_settings;
128 136 }
129 137
130 -
131 138 /**
132 139 * Renders the current view.
133 140 *
134 141 * In comparison to the parent class method, this contains handling for the no-js case and adjusts the HTML code structure.
@@ -134,9 +141,12 @@
134 141 * In comparison to the parent class method, this contains handling for the no-js case and adjusts the HTML code structure.
135 142 *
136 143 * @since 2.0.0
137 144 */
145 + #[\Override]
138 146 public function render(): void {
147 + $this->print_javascript_data();
148 +
139 149 ?>
140 150 <div id="tablepress-page" class="wrap">
141 151 <form>
142 152 <?php
@@ -142,9 +152,9 @@
142 152 <?php
143 153 $this->print_nav_tab_menu();
144 154 ?>
145 155 <div id="tablepress-body">
146 - <hr class="wp-header-end" />
156 + <hr class="wp-header-end">
147 157 <?php
148 158 // Print all header messages.
149 159 foreach ( $this->header_messages as $message ) {
150 160 echo $message;
@@ -168,9 +178,9 @@
168 178 $this->do_meta_boxes( 'side' );
169 179 ?>
170 180 </div>
171 181 </div>
172 - <br class="clear" />
182 + <br class="clear">
173 183 </div>
174 184 </form>
175 185 </div>
176 186 </div>
@@ -177,9 +187,9 @@
177 187 <?php
178 188 }
179 189
180 190 /**
181 - * Override parent class method, as the nonces for this view are generated in the JS code.
191 + * Overrides parent class method, as the nonces for this view are generated in the JS code.
182 192 *
183 193 * @since 1.0.0
184 194 *
185 195 * @param array<string, mixed> $data Data for this screen.
@@ -184,15 +194,63 @@
184 194 *
185 195 * @param array<string, mixed> $data Data for this screen.
186 196 * @param array<string, mixed> $box Information about the text box.
187 197 */
198 + #[\Override]
188 199 protected function action_nonce_field( array $data, array $box ): void {
189 200 // Intentionally left empty. Nonces for this view are generated in postbox_table_data().
190 201 }
191 202
192 203 /**
193 - * Print the content of the "Table Information" post meta box.
204 + * Prints the table data for use in JS code and the main React container.
194 205 *
206 + * @since 3.0.0
207 + */
208 + public function print_javascript_data(): void {
209 + echo "<script>\n";
210 + echo "window.tp = window.tp || {};\n";
211 +
212 + echo "tp.nonces = {};\n";
213 + echo "tp.nonces.edit_table = '" . wp_create_nonce( TablePress::nonce( $this->action, $this->data['table']['id'] ) ) . "';\n";
214 + echo "tp.nonces.preview_table = '" . wp_create_nonce( TablePress::nonce( 'preview_table', $this->data['table']['id'] ) ) . "';\n";
215 + echo "tp.nonces.copy_table = '" . wp_create_nonce( TablePress::nonce( 'copy_table', $this->data['table']['id'] ) ) . "';\n";
216 + echo "tp.nonces.delete_table = '" . wp_create_nonce( TablePress::nonce( 'delete_table', $this->data['table']['id'] ) ) . "';\n";
217 + echo "tp.nonces.screen_options = '" . wp_create_nonce( TablePress::nonce( 'screen_options' ) ) . "';\n";
218 +
219 + echo "tp.table = {};\n";
220 + echo "tp.table.shortcode = '" . esc_js( TablePress::$shortcode ) . "';\n";
221 + echo "tp.table.id = '{$this->data['table']['id']}';\n";
222 +
223 + // Add the table meta data.
224 + $this->data['table']['meta'] = array(
225 + 'newId' => $this->data['table']['id'],
226 + 'name' => $this->data['table']['name'],
227 + 'description' => $this->data['table']['description'],
228 + 'lastModified' => TablePress::format_datetime( $this->data['table']['last_modified'] ),
229 + 'lastEditor' => TablePress::get_user_display_name( $this->data['table']['options']['last_editor'] ),
230 + );
231 +
232 + // JSON-encode array items separately to save some PHP memory.
233 + foreach ( array( 'meta', 'data', 'options', 'visibility' ) as $item ) {
234 + $json = $this->admin_page->convert_to_json_parse_output( $this->data['table'][ $item ] );
235 + printf( 'tp.table.%1$s = %2$s;' . "\n", $item, $json );
236 + }
237 +
238 + echo "tp.screen_options = {};\n";
239 + echo 'tp.screen_options.table_editor_column_width = ' . absint( TablePress::$model_options->get( 'table_editor_column_width' ) ) . ";\n";
240 + echo 'tp.screen_options.showCustomCommands = ' . ( current_user_can( 'unfiltered_html' ) ? 'true' : 'false' ) . ";\n";
241 + echo "tp.screen_options.optionsUrl = '" . TablePress::url( array( 'action' => 'options' ) ) . "';\n";
242 + echo 'tp.screen_options.currentUserCanEditTableId = ' . ( current_user_can( 'tablepress_edit_table_id', $this->data['table']['id'] ) ? 'true' : 'false' ) . ";\n";
243 + echo 'tp.screen_options.currentUserCanPreviewTable = ' . ( current_user_can( 'tablepress_preview_table', $this->data['table']['id'] ) ? 'true' : 'false' ) . ";\n";
244 + echo "tp.screen_options.previewUrl = '" . 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";
245 + echo "</script>\n";
246 +
247 + echo '<div id="tablepress-edit-screen"></div>'; // React container.
248 + }
249 +
250 + /**
251 + * Prints the content of the "Table Information" post meta box.
252 + *
195 253 * @since 1.0.0
196 254 *
197 255 * @param array<string, mixed> $data Data for this screen.
198 256 * @param array<string, mixed> $box Information about the meta box.
@@ -197,34 +255,11 @@
197 255 * @param array<string, mixed> $data Data for this screen.
198 256 * @param array<string, mixed> $box Information about the meta box.
199 257 */
200 258 public function postbox_table_information( array $data, array $box ): void {
201 - ?>
202 -<table class="tablepress-postbox-table fixed">
203 - <tr class="bottom-border">
204 - <th class="column-1" scope="row"><label for="table-id"><?php _e( 'Table ID', 'tablepress' ); ?>:</label></th>
205 - <td class="column-2">
206 - <div id="table-id-shortcode-wrapper">
207 - <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 ' : ''; ?>/>
208 - <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>
209 - </div>
210 - </td>
211 - </tr>
212 - <tr class="top-border">
213 - <th class="column-1" scope="row"><label for="table-name"><?php _e( 'Table Name', 'tablepress' ); ?>:</label></th>
214 - <td class="column-2"><input type="text" id="table-name" class="large-text" value="<?php echo esc_attr( $data['table']['name'] ); ?>" /></td>
215 - </tr>
216 - <tr class="bottom-border">
217 - <th class="column-1 top-align" scope="row"><label for="table-description"><?php _e( 'Description', 'tablepress' ); ?>:</label></th>
218 - <td class="column-2"><textarea id="table-description" class="large-text" rows="4"><?php echo esc_textarea( $data['table']['description'] ); ?></textarea></td>
219 - </tr>
220 - <tr class="top-border">
221 - <th class="column-1" scope="row"><?php _e( 'Last Modified', 'tablepress' ); ?>:</th>
222 - <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>
223 - </tr>
224 -</table>
225 - <?php
226 - if ( tb_tp_fs()->is_free_plan() ) :
259 + echo '<div id="tablepress-table-information-section"></div>';
260 +
261 + if ( ! TABLEPRESS_IS_PLAYGROUND_PREVIEW && tb_tp_fs()->is_free_plan() ) :
227 262 ?>
228 263 <div class="postbox premium-features">
229 264 <div>
230 265 <div>
@@ -244,9 +279,9 @@
244 279 ?>
245 280 </div>
246 281 </div>
247 282 <div class="buttons">
248 - <a href="<?php echo 'https://tablepress.org/premium/?utm_source=plugin&utm_medium=textlink&utm_content=edit-screen'; ?>" class="tablepress-button">
283 + <a href="https://tablepress.org/premium/?utm_source=plugin&utm_medium=textlink&utm_content=edit-screen" class="tablepress-button">
249 284 <span><?php _e( 'Compare the TablePress premium versions', 'tablepress' ); ?></span>
250 285 <span class="dashicons dashicons-arrow-right-alt"></span>
251 286 </a>
252 287 </div>
@@ -256,9 +291,9 @@
256 291 endif;
257 292 }
258 293
259 294 /**
260 - * Print the content of the "Table Content" post meta box.
295 + * Prints the content of the "Table Content" post meta box.
261 296 *
262 297 * @since 1.0.0
263 298 *
264 299 * @param array<string, mixed> $data Data for this screen.
@@ -264,30 +299,8 @@
264 299 * @param array<string, mixed> $data Data for this screen.
265 300 * @param array<string, mixed> $box Information about the meta box.
266 301 */
267 302 public function postbox_table_data( array $data, array $box ): void {
268 - echo "<script>\n";
269 - echo "window.tp = window.tp || {};\n";
270 -
271 - echo "tp.nonces = {};\n";
272 - echo "tp.nonces.edit_table = '" . wp_create_nonce( TablePress::nonce( $this->action, $data['table']['id'] ) ) . "';\n";
273 - echo "tp.nonces.preview_table = '" . wp_create_nonce( TablePress::nonce( 'preview_table', $data['table']['id'] ) ) . "';\n";
274 - echo "tp.nonces.screen_options = '" . wp_create_nonce( TablePress::nonce( 'screen_options' ) ) . "';\n";
275 -
276 - echo "tp.table = {};\n";
277 - echo "tp.table.shortcode = '" . esc_js( TablePress::$shortcode ) . "';\n";
278 - echo "tp.table.id = '{$data['table']['id']}';\n";
279 - echo "tp.table.new_id = '{$data['table']['id']}';\n";
280 - // JSON-encode array items separately to save some PHP memory.
281 - foreach ( array( 'data', 'options', 'visibility' ) as $item ) {
282 - $json = $this->admin_page->convert_to_json_parse_output( $data['table'][ $item ] );
283 - printf( 'tp.table.%1$s = %2$s;' . "\n", $item, $json );
284 - }
285 -
286 - echo "tp.screen_options = {};\n";
287 - echo 'tp.screen_options.table_editor_column_width = ' . absint( TablePress::$model_options->get( 'table_editor_column_width' ) ) . ";\n";
288 - echo "</script>\n";
289 -
290 303 $css_variables = '--table-editor-line-clamp:' . absint( TablePress::$model_options->get( 'table_editor_line_clamp' ) ) . ';';
291 304 $css_variables = esc_attr( $css_variables );
292 305 echo "<div id=\"table-editor\" style=\"{$css_variables}\"></div>";
293 306 }
@@ -292,9 +305,9 @@
292 305 echo "<div id=\"table-editor\" style=\"{$css_variables}\"></div>";
293 306 }
294 307
295 308 /**
296 - * Print the content of the "Table Manipulation" post meta box.
309 + * Prints the content of the "Table Manipulation" post meta box.
297 310 *
298 311 * @since 1.0.0
299 312 *
300 313 * @param array<string, mixed> $data Data for this screen.
@@ -300,77 +313,13 @@
300 313 * @param array<string, mixed> $data Data for this screen.
301 314 * @param array<string, mixed> $box Information about the meta box.
302 315 */
303 316 public function postbox_table_manipulation( array $data, array $box ): void {
304 - ?>
305 -<table id="tablepress-manipulation-controls" class="tablepress-postbox-table fixed">
306 - <tr class="bottom-border">
307 - <td class="column-1">
308 - <?php _e( 'Selected cells', 'tablepress' ); ?>:&nbsp;
309 - <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' ) ); ?>" />
310 - <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' ) ); ?>" />
311 - <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' ) ); ?>" />
312 - </td>
313 - <td class="column-2">
314 - <?php _e( 'Selected cells', 'tablepress' ); ?>:&nbsp;
315 - <input type="button" class="button button-merge-unmerge" data-action="merge" value="<?php esc_attr_e( 'Combine/Merge', 'tablepress' ); ?>" />
316 - <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" />
317 - </td>
318 - </tr>
319 - <tr class="top-border">
320 - <td class="column-1">
321 - <?php _e( 'Selected rows', 'tablepress' ); ?>:&nbsp;
322 - <input type="button" class="button button-insert-duplicate" data-type="rows" data-action="duplicate" value="<?php esc_attr_e( 'Duplicate', 'tablepress' ); ?>" />
323 - <input type="button" class="button button-insert-duplicate" data-type="rows" data-action="insert" value="<?php esc_attr_e( 'Insert', 'tablepress' ); ?>" />
324 - <input type="button" class="button button-remove" data-type="rows" value="<?php esc_attr_e( 'Delete', 'tablepress' ); ?>" />
325 - </td>
326 - <td class="column-2">
327 - <?php _e( 'Selected columns', 'tablepress' ); ?>:&nbsp;
328 - <input type="button" class="button button-insert-duplicate" data-type="columns" data-action="duplicate" value="<?php esc_attr_e( 'Duplicate', 'tablepress' ); ?>" />
329 - <input type="button" class="button button-insert-duplicate" data-type="columns" data-action="insert" value="<?php esc_attr_e( 'Insert', 'tablepress' ); ?>" />
330 - <input type="button" class="button button-remove" data-type="columns" value="<?php esc_attr_e( 'Delete', 'tablepress' ); ?>" />
331 - </td>
332 - </tr>
333 - <tr>
334 - <td class="column-1">
335 - <?php _e( 'Selected rows', 'tablepress' ); ?>:&nbsp;
336 - <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' ) ); ?>" />
337 - <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' ) ); ?>" />
338 - </td>
339 - <td class="column-2">
340 - <?php _e( 'Selected columns', 'tablepress' ); ?>:&nbsp;
341 - <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' ) ); ?>" />
342 - <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' ) ); ?>" />
343 - </td>
344 - </tr>
345 - <tr class="bottom-border">
346 - <td class="column-1">
347 - <?php _e( 'Selected rows', 'tablepress' ); ?>:&nbsp;
348 - <input type="button" class="button button-hide-unhide" data-type="rows" data-action="hide" value="<?php esc_attr_e( 'Hide', 'tablepress' ); ?>" />
349 - <input type="button" class="button button-hide-unhide" data-type="rows" data-action="unhide" value="<?php esc_attr_e( 'Show', 'tablepress' ); ?>" />
350 - </td>
351 - <td class="column-2">
352 - <?php _e( 'Selected columns', 'tablepress' ); ?>:&nbsp;
353 - <input type="button" class="button button-hide-unhide" data-type="columns" data-action="hide" value="<?php esc_attr_e( 'Hide', 'tablepress' ); ?>" />
354 - <input type="button" class="button button-hide-unhide" data-type="columns" data-action="unhide" value="<?php esc_attr_e( 'Show', 'tablepress' ); ?>" />
355 - </td>
356 - </tr>
357 - <tr class="top-border">
358 - <td class="column-1">
359 - <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;
360 - <input type="button" class="button button-append" data-type="rows" value="<?php esc_attr_e( 'Add', 'tablepress' ); ?>" />
361 - </td>
362 - <td class="column-2">
363 - <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;
364 - <input type="button" class="button button-append" data-type="columns" value="<?php esc_attr_e( 'Add', 'tablepress' ); ?>" />
365 - </td>
366 - </tr>
367 -</table>
368 - <?php
317 + echo '<div id="tablepress-table-manipulation-section"></div>';
369 318 }
370 319
371 320 /**
372 - * Print the "Preview" and "Save Changes" button.
321 + * Prints the container for the "Preview" and "Save Changes" buttons.
373 322 *
374 323 * @since 1.0.0
375 324 *
376 325 * @param array<string, mixed> $data Data for this screen.
@@ -376,22 +325,13 @@
376 325 * @param array<string, mixed> $data Data for this screen.
377 326 * @param array<string, mixed> $box Information about the text box.
378 327 */
379 328 public function textbox_buttons( array $data, array $box ): void {
380 - $preview_url = TablePress::url( array( 'action' => 'preview_table', 'item' => $data['table']['id'], 'return' => 'edit', 'return_item' => $data['table']['id'] ), true, 'admin-post.php' );
381 -
382 - echo '<p id="' . $box['id'] . '-submit" class="submit">';
383 - if ( current_user_can( 'tablepress_preview_table', $data['table']['id'] ) ) {
384 - 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>';
385 - }
386 - ?>
387 - <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' ) ); ?>" />
388 - <?php
389 - echo '</p>';
329 + echo '<div id="tablepress-' . $box['id'] . '-section"></div>';
390 330 }
391 331
392 332 /**
393 - * Print the "Delete Table" and "Export Table" buttons.
333 + * Prints the "Delete Table" and "Export Table" buttons.
394 334 *
395 335 * @since 1.0.0
396 336 *
397 337 * @param array<string, mixed> $data Data for this screen.
@@ -408,21 +348,21 @@
408 348
409 349 echo '<p class="submit">';
410 350 echo __( 'Other Actions', 'tablepress' ) . ':&nbsp; ';
411 351 if ( $user_can_copy_table ) {
412 - 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> ';
352 + echo '<a href="' . esc_url( TablePress::url( array( 'action' => 'copy_table', 'item' => $data['table']['id'], 'return' => 'edit' ), true, 'admin-post.php' ) ) . '" class="components-button is-secondary is-compact button-copy">' . __( 'Copy Table', 'tablepress' ) . '</a> ';
413 353 }
414 354 if ( $user_can_export_table ) {
415 - echo '<a href="' . TablePress::url( array( 'action' => 'export', 'table_id' => $data['table']['id'] ) ) . '" class="button">' . __( 'Export Table', 'tablepress' ) . '</a> ';
355 + echo '<a href="' . esc_url( TablePress::url( array( 'action' => 'export', 'table_id' => $data['table']['id'] ) ) ) . '" class="components-button is-secondary is-compact button-export">' . __( 'Export Table', 'tablepress' ) . '</a> ';
416 356 }
417 357 if ( $user_can_delete_table ) {
418 - 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>';
358 + echo '<a href="' . esc_url( TablePress::url( array( 'action' => 'delete_table', 'item' => $data['table']['id'], 'return' => 'edit', 'return_item' => $data['table']['id'] ), true, 'admin-post.php' ) ) . '" class="components-button is-secondary is-compact button-delete delete-link">' . __( 'Delete Table', 'tablepress' ) . '</a>';
419 359 }
420 360 echo '</p>';
421 361 }
422 362
423 363 /**
424 - * Print the hidden containers for the Preview.
364 + * Prints the hidden containers for the Preview.
425 365 *
426 366 * @since 1.0.0
427 367 *
428 368 * @param array<string, mixed> $data Data for this screen.
@@ -452,9 +392,9 @@
452 392 </div>
453 393 <div class="hidden-container">
454 394 <textarea id="textarea-insert-helper" class="hidden"></textarea>
455 395 </div>
456 -<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">
396 +<div id="help-box-combine-cells" class="help-box hidden-container" title="<?php esc_attr_e( 'Help on combining cells', 'tablepress' ); ?>" data-height="420" data-width="500">
457 397 <?php
458 398 echo '<p>' . __( 'Table cells can span across more than one column or row.', 'tablepress' ) . '</p>';
459 399 echo '<p>' . __( 'Combining consecutive cells within the same row is called &#8220;colspanning&#8221;.', 'tablepress' )
460 400 . ' ' . __( 'Combining consecutive cells within the same column is called &#8220;rowspanning&#8221;.', 'tablepress' ) . '</p>';
@@ -459,9 +399,10 @@
459 399 echo '<p>' . __( 'Combining consecutive cells within the same row is called &#8220;colspanning&#8221;.', 'tablepress' )
460 400 . ' ' . __( 'Combining consecutive cells within the same column is called &#8220;rowspanning&#8221;.', 'tablepress' ) . '</p>';
461 401 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' ) )
462 402 . ' ' . __( 'The corresponding keywords, <code>#colspan#</code> and <code>#rowspan#</code>, will then be added for you.', 'tablepress' ) . '</p>';
463 - 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>';
403 + echo '<p><strong>' . __( 'Be aware that the Table Features for Site Visitors, like sorting, filtering, and pagination, will not work in tables which have combined cells in their body rows.', 'tablepress' ) . '</strong>'
404 + . ' ' . __( 'It is however possible to use these features in tables that have combined cells in the table header or footer rows, to allow for creating complex header and footer layouts.', 'tablepress' ) . '</p>';
464 405 ?>
465 406 </div>
466 407 <?php
467 408 }
@@ -466,9 +407,9 @@
466 407 <?php
467 408 }
468 409
469 410 /**
470 - * Print the content of the "Table Options" post meta box.
411 + * Prints the content of the "Table Options" post meta box.
471 412 *
472 413 * @since 1.0.0
473 414 *
474 415 * @param array<string, mixed> $data Data for this screen.
@@ -474,56 +415,13 @@
474 415 * @param array<string, mixed> $data Data for this screen.
475 416 * @param array<string, mixed> $box Information about the meta box.
476 417 */
477 418 public function postbox_table_options( array $data, array $box ): void {
478 - ?>
479 -<table class="tablepress-postbox-table fixed">
480 - <tr>
481 - <th class="column-1" scope="row"><?php _e( 'Table Head Row', 'tablepress' ); ?>:</th>
482 - <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>
483 - </tr>
484 - <tr class="bottom-border">
485 - <th class="column-1" scope="row"><?php _e( 'Table Foot Row', 'tablepress' ); ?>:</th>
486 - <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>
487 - </tr>
488 - <tr class="top-border">
489 - <th class="column-1" scope="row"><?php _e( 'Alternating Row Colors', 'tablepress' ); ?>:</th>
490 - <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>
491 - </tr>
492 - <tr class="bottom-border">
493 - <th class="column-1" scope="row"><?php _e( 'Row Hover Highlighting', 'tablepress' ); ?>:</th>
494 - <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>
495 - </tr>
496 - <tr class="top-border">
497 - <th class="column-1" scope="row"><label for="option-print_name"><?php _e( 'Print Table Name', 'tablepress' ); ?></label>:</th>
498 - <?php
499 - $position_select = '<select id="option-print_name_position" name="print_name_position">';
500 - $position_select .= '<option value="above">' . __( 'above', 'tablepress' ) . '</option>';
501 - $position_select .= '<option value="below">' . __( 'below', 'tablepress' ) . '</option>';
502 - $position_select .= '</select>';
503 - ?>
504 - <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>
505 - </tr>
506 - <tr class="bottom-border">
507 - <th class="column-1" scope="row"><label for="option-print_description"><?php _e( 'Print Table Description', 'tablepress' ); ?></label>:</th>
508 - <?php
509 - $position_select = '<select id="option-print_description_position" name="print_description_position">';
510 - $position_select .= '<option value="above">' . __( 'above', 'tablepress' ) . '</option>';
511 - $position_select .= '<option value="below">' . __( 'below', 'tablepress' ) . '</option>';
512 - $position_select .= '</select>';
513 - ?>
514 - <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>
515 - </tr>
516 - <tr class="top-border">
517 - <th class="column-1" scope="row"><?php _e( 'Extra CSS Classes', 'tablepress' ); ?>:</th>
518 - <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>
519 - </tr>
520 -</table>
521 - <?php
419 + echo '<div id="tablepress-table-options-section"></div>';
522 420 }
523 421
524 422 /**
525 - * Print the content of the "Table Features for Site Visitors" post meta box.
423 + * Prints the content of the "Table Features for Site Visitors" post meta box.
526 424 *
527 425 * @since 1.0.0
528 426 *
529 427 * @param array<string, mixed> $data Data for this screen.
@@ -529,57 +427,13 @@
529 427 * @param array<string, mixed> $data Data for this screen.
530 428 * @param array<string, mixed> $box Information about the meta box.
531 429 */
532 430 public function postbox_datatables_features( array $data, array $box ): void {
533 - ?>
534 -<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>
535 -<table class="tablepress-postbox-table fixed">
536 - <tr class="bottom-border">
537 - <th class="column-1" scope="row"><?php _e( 'Enable Visitor Features', 'tablepress' ); ?>:</th>
538 - <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>
539 - </tr>
540 - <tr class="top-border">
541 - <th class="column-1" scope="row"><?php _e( 'Sorting', 'tablepress' ); ?>:</th>
542 - <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>
543 - </tr>
544 - <tr>
545 - <th class="column-1" scope="row"><?php _e( 'Search/Filtering', 'tablepress' ); ?>:</th>
546 - <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>
547 - </tr>
548 - <tr>
549 - <th class="column-1" scope="row" style="vertical-align: top;"><?php _e( 'Pagination', 'tablepress' ); ?>:</th>
550 - <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 />
551 - <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>
552 - </tr>
553 - <tr>
554 - <th class="column-1" scope="row"><?php _e( 'Pagination Length Change', 'tablepress' ); ?>:</th>
555 - <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>
556 - </tr>
557 - <tr>
558 - <th class="column-1" scope="row"><?php _e( 'Info', 'tablepress' ); ?>:</th>
559 - <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>
560 - </tr>
561 - <tr<?php echo current_user_can( 'unfiltered_html' ) ? ' class="bottom-border"' : ''; ?>>
562 - <th class="column-1" scope="row"><?php _e( 'Horizontal Scrolling', 'tablepress' ); ?>:</th>
563 - <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>
564 - </tr>
565 - <?php
566 - // "Custom Commands" must only be available to trusted users.
567 - if ( current_user_can( 'unfiltered_html' ) ) {
568 - ?>
569 - <tr class="top-border">
570 - <th class="column-1" scope="row"><?php _e( 'Custom Commands', 'tablepress' ); ?>:</th>
571 - <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>
572 - </tr>
573 - <?php
574 - } // if
575 - ?>
576 -</table>
577 - <?php
431 + echo '<div id="tablepress-datatables-features-section"></div>';
578 432 }
579 433
580 434 /**
581 - * Print a notification about a corrupted table.
435 + * Prints a notification about a corrupted table.
582 436 *
583 437 * @since 1.4.0
584 438 *
585 439 * @param array<string, mixed> $data Data for this screen.
@@ -605,9 +459,9 @@
605 459 printf( __( 'Please see the <a href="%s">TablePress FAQ page</a> for further instructions.', 'tablepress' ), 'https://tablepress.org/faq/corrupted-tables/' );
606 460 ?>
607 461 </p>
608 462 <p>
609 - <?php echo '<a href="' . TablePress::url( array( 'action' => 'list' ) ) . '" class="button">' . __( 'Back to the List of Tables', 'tablepress' ) . '</a>'; ?>
463 + <?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>'; ?>
610 464 </p>
611 465 </div>
612 466 <?php
613 467 }
@@ -612,9 +466,9 @@
612 466 <?php
613 467 }
614 468
615 469 /**
616 - * Print the screen head text.
470 + * Prints the screen head text.
617 471 *
618 472 * @since 1.0.0
619 473 *
620 474 * @param array<string, mixed> $data Data for this screen.
@@ -647,9 +501,9 @@
647 501 '#table-editor',
648 502 array(
649 503 'content' => $content,
650 504 'position' => array( 'edge' => 'bottom', 'align' => 'center' ),
651 - )
505 + ),
652 506 );
653 507 }
654 508
655 509 /**
@@ -667,9 +521,9 @@
667 521 array(
668 522 'content' => $content,
669 523 'position' => array( 'edge' => 'top', 'align' => 'right' ),
670 524 'pointerClass' => 'wp-pointer pointer-tp21_edit_screen_options',
671 - )
525 + ),
672 526 );
673 527 }
674 528
675 529 } // class TablePress_Edit_View