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-list.php +234 -49 2.1.8 → 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,11 +26,10 @@
24 26 /**
25 27 * Object for the All Tables List Table.
26 28 *
27 29 * @since 1.0.0
28 - * @var TablePress_All_Tables_List_Table
29 30 */
30 - protected $wp_list_table;
31 + protected \TablePress_All_Tables_List_Table $wp_list_table;
31 32
32 33 /**
33 34 * Set up the view with data and do things that are specific for this view.
34 35 *
@@ -33,26 +34,188 @@
33 34 * Set up the view with data and do things that are specific for this view.
34 35 *
35 36 * @since 1.0.0
36 37 *
37 - * @param string $action Action for this view.
38 - * @param array $data Data for this view.
38 + * @param string $action Action for this view.
39 + * @param array<string, mixed> $data Data for this view.
39 40 */
40 - public function setup( $action, array $data ) {
41 + #[\Override]
42 + public function setup( /* string */ $action, array $data ) /* : void */ {
43 + // Don't use type hints in the method declaration to prevent PHP errors, as the method is inherited.
44 +
41 45 parent::setup( $action, $data );
42 46
43 - add_thickbox(); // For the table preview.
44 - $this->admin_page->enqueue_script( 'list' );
47 + TablePress::enqueue_script( 'list' );
45 48
46 - if ( $data['messages']['first_visit'] ) {
47 - $message = '<p><strong style="font-size:14px;">' . __( 'Thank you for choosing TablePress, the most popular table plugin for WordPress!', 'tablepress' ) . '</strong></p>';
49 + $milestone_period_ended = ( strtotime( '2026-10-10' ) < strtotime( 'today' ) );
50 +
51 + if ( $data['messages']['superseded_extensions'] ) {
52 + $superseded_extensions = array(
53 + 'tablepress-advanced-access-rights/tablepress-advanced-access-rights.php' => array(
54 + 'name' => 'TablePress Extension: Advanced Access Rights',
55 + 'compatible' => true,
56 + ),
57 + 'tablepress-auto-export-tables/tablepress-auto-export-tables.php' => array(
58 + 'name' => 'TablePress Extension: Automatic Table Export',
59 + 'compatible' => true,
60 + ),
61 + 'tablepress-cell-highlighting/tablepress-cell-highlighting.php' => array(
62 + 'name' => 'TablePress Extension: Cell Highlighting',
63 + 'compatible' => true,
64 + ),
65 + 'tablepress-datatables-alphabetsearch/tablepress-datatables-alphabetsearch.php' => array(
66 + 'name' => 'TablePress Extension: DataTables AlphabetSearch',
67 + 'compatible' => false,
68 + ),
69 + 'tablepress-datatables-buttons/tablepress-datatables-buttons.php' => array(
70 + 'name' => 'TablePress Extension: DataTables Buttons',
71 + 'compatible' => true,
72 + ),
73 + 'tablepress-datatables-column-filter-widgets/tablepress-datatables-column-filter-widgets.php' => array(
74 + 'name' => 'TablePress Extension: DataTables ColumnFilterWidgets',
75 + 'compatible' => false,
76 + ),
77 + 'tablepress-datatables-columnfilter/tablepress-datatables-columnfilter.php' => array(
78 + 'name' => 'TablePress Extension: DataTables Column Filter',
79 + 'compatible' => false,
80 + ),
81 + 'tablepress-datatables-counter-column/tablepress-datatables-counter-column.php' => array(
82 + 'name' => 'TablePress Extension: DataTables Counter Column',
83 + 'compatible' => true,
84 + ),
85 + 'tablepress-datatables-fixedcolumns/tablepress-datatables-fixedcolumns.php' => array(
86 + 'name' => 'TablePress Extension: DataTables FixedColumns',
87 + 'compatible' => false,
88 + ),
89 + 'tablepress-datatables-fixedheader/tablepress-datatables-fixedheader.php' => array(
90 + 'name' => 'TablePress Extension: DataTables FixedHeader',
91 + 'compatible' => true,
92 + ),
93 + 'tablepress-datatables-inverted-filter/tablepress-datatables-inverted-filter.php' => array(
94 + 'name' => 'TablePress Extension: DataTables Inverted Filter',
95 + 'compatible' => false,
96 + ),
97 + 'tablepress-datatables-row-details/tablepress-datatables-row-details.php' => array(
98 + 'name' => 'TablePress Extension: DataTables Row Details',
99 + 'compatible' => false,
100 + ),
101 + 'tablepress-datatables-rowgroup/tablepress-datatables-rowgroup.php' => array(
102 + 'name' => 'TablePress Extension: DataTables RowGroup',
103 + 'compatible' => false,
104 + ),
105 + 'tablepress-responsive-tables/tablepress-responsive-tables.php' => array(
106 + 'name' => 'TablePress Extension: Responsive Tables',
107 + 'compatible' => false,
108 + ),
109 + 'tablepress-row-filter/tablepress-row-filter.php' => array(
110 + 'name' => 'TablePress Extension: Row Filtering',
111 + 'compatible' => true,
112 + ),
113 + 'tablepress-row-highlighting/tablepress-row-highlighting.php' => array(
114 + 'name' => 'TablePress Extension: Row Highlighting',
115 + 'compatible' => true,
116 + ),
117 + 'tablepress-table-auto-update/tablepress-table-auto-update.php' => array(
118 + 'name' => 'TablePress Extension: Table Auto Update',
119 + 'compatible' => true,
120 + ),
121 + 'tablepress-table-column-order/tablepress-table-column-order.php' => array(
122 + 'name' => 'TablePress Extension: Table Column Order',
123 + 'compatible' => true,
124 + ),
125 + );
126 +
127 + $active_compatible_superseded_extensions = array();
128 + $active_incompatible_superseded_extensions = array();
129 + foreach ( $superseded_extensions as $plugin => $extension ) {
130 + if ( is_plugin_active( $plugin ) ) {
131 + if ( $extension['compatible'] ) {
132 + $active_compatible_superseded_extensions[] = $extension['name'];
133 + } else {
134 + $active_incompatible_superseded_extensions[] = $extension['name'];
135 + }
136 + }
137 + }
138 +
139 + /*
140 + * If no superseded extensions are used, hide the message, to prevent running the checks on every load of the view.
141 + * This leaves a small risk of an Extension being activated later, but that's acceptable as they are no longer publicly available.
142 + */
143 + if ( empty( $active_incompatible_superseded_extensions ) && ( empty( $active_compatible_superseded_extensions ) || ! tb_tp_fs()->is_free_plan() ) ) {
144 + TablePress::$model_options->update( 'message_superseded_extensions', false );
145 + }
146 +
147 + $message = '';
148 +
149 + $notice_css_classes = 'not-dismissible';
150 +
151 + if ( ! empty( $active_incompatible_superseded_extensions ) ) {
152 + $notice_css_classes .= ' is-error notice-error';
153 +
154 + $message .= '<p style="font-size:16px;">' . __( 'You are using <strong>TablePress Extension plugins</strong> on this website that have been retired many years ago.', 'tablepress' ) . '<br>' . __( 'For technical reasons, some or all features of these outdated plugins <strong>do no longer work</strong>:', 'tablepress' ) . '</p>';
155 + $message .= '<ul style="list-style:disc;margin:0.5em 1em;font-size:16px;">';
156 + foreach ( $active_incompatible_superseded_extensions as $extension ) {
157 + $message .= '<li>' . esc_html( $extension ) . '</li>';
158 + }
159 + $message .= '</ul>';
160 + $message .= '<p style="font-size:16px;"><strong>' . __( 'Keeping them activated can lead to errors on your website.', 'tablepress' ) . '</strong></p>';
161 +
162 + if ( tb_tp_fs()->is_free_plan() ) {
163 + $message .= '<p style="font-size:16px;"><strong>' . sprintf( __( 'To continue using these features, <a href="%s">upgrade to a TablePress Premium license plan</a>!', 'tablepress' ), 'https://tablepress.org/upgrade-extensions/?utm_source=plugin&utm_medium=textlink&utm_content=superseded-extensions-message' ) . '</strong><br>'
164 + . __( 'TablePress Pro and TablePress Max come with updated and heavily improved versions of these features and include direct priority email support.', 'tablepress' ) . '</p>';
165 + }
166 +
167 + if ( ! empty( $active_compatible_superseded_extensions ) && tb_tp_fs()->is_free_plan() ) {
168 + $message .= '<p style="margin-top:1em;font-size:14px;">' . __( 'In addition, these TablePress Extension plugins have been retired and might become incompatible in the future as well:', 'tablepress' ) . '</strong></p>';
169 + $message .= '<ul style="list-style:disc;margin:0.5em 1em;font-size:14px;">';
170 + foreach ( $active_compatible_superseded_extensions as $extension ) {
171 + $message .= '<li>' . esc_html( $extension ) . '</li>';
172 + }
173 + $message .= '</ul>';
174 + }
175 + } elseif ( ! empty( $active_compatible_superseded_extensions ) && tb_tp_fs()->is_free_plan() ) {
176 + $notice_css_classes .= ' is-warning notice-warning';
177 +
178 + $message .= '<p style="font-size:14px;"><strong>' . __( 'You are using TablePress Extension plugins on this website that have been retired and will no longer receive updates or support:', 'tablepress' ) . '</strong></p>';
179 + $message .= '<ul style="list-style:disc;margin:0.5em 1em;">';
180 + foreach ( $active_compatible_superseded_extensions as $extension ) {
181 + $message .= '<li>' . esc_html( $extension ) . '</li>';
182 + }
183 + $message .= '</ul>';
184 + $message .= '<p style="font-size:14px;"><strong>' . __( 'It is possible that these become incompatible with TablePress or WordPress in the future!', 'tablepress' ) . '</strong></p>';
185 + $message .= '<p style="margin-top:1em;font-size:14px;">' . sprintf( __( 'However, their features were heavily improved and are now part of the up-to-date <a href="%s">TablePress Premium versions</a>!', 'tablepress' ), 'https://tablepress.org/upgrade-extensions/?utm_source=plugin&utm_medium=textlink&utm_content=superseded-extensions-message' ) . '</p>';
186 + }
187 +
188 + if ( '' !== $message ) {
189 + if ( tb_tp_fs()->is_free_plan() ) {
190 + $message .= '<p style="font-size:16px;margin-top:1.5em;"><strong>' . __( 'Upgrade to a TablePress Premium license plan now and get:', 'tablepress' ) . '</strong></p>';
191 + $message .= '<ul style="list-style:disc;margin:0.5em 1em;font-size:16px;">';
192 + $message .= '<li>' . __( 'Updated and heavily improved versions of these features!', 'tablepress' ) . '</li>';
193 + $message .= '<li>' . __( 'Direct integration into the user interface!', 'tablepress' ) . '</li>';
194 + $message .= '<li>' . __( 'Regular updates that ensure compatibility with WordPress!', 'tablepress' ) . '</li>';
195 + $message .= '<li>' . __( 'Priority email support!', 'tablepress' ) . '</li>';
196 + $message .= '</ul>';
197 + $message .= '<p style="font-size:16px;"><strong>' . sprintf( __( 'And the best: %s', 'tablepress' ), sprintf( __( 'Use the promo code %1$s during the checkout process for a special offer!', 'tablepress' ), '<code>UPGRADE</code>' ) ) . '</strong></p>';
198 + $message .= '<p style="margin-top:2em;">' . sprintf( '<a href="%s" class="components-button is-primary" style="font-size:14px;margin-right:3em;background:linear-gradient(135deg,#00d184 0%%,#0791e3 100%%);border:none;font-weight:bold;">%s<span class="dashicons dashicons-arrow-right-alt" style="vertical-align:middle;margin:0 0 4px 4px"></span></a>', 'https://tablepress.org/upgrade-extensions/?utm_source=plugin&utm_medium=button&utm_content=superseded-extensions-message', __( 'Upgrade to a TablePress Premium version now!', 'tablepress' ) );
199 + }
200 + $message .= $this->ajax_link( array( 'action' => 'hide_message', 'item' => 'superseded_extensions', 'return' => 'list' ), __( 'Hide this message', 'tablepress' ) ) . '</p>';
201 +
202 + $title = '<em>' . __( 'Important Notice!', 'tablepress' ) . '</em>';
203 +
204 + $this->add_header_message( $message, $notice_css_classes, $title );
205 + }
206 + }
207 +
208 + if ( $data['messages']['first_visit'] && ( ! $data['messages']['plugin_update'] || $milestone_period_ended ) ) {
209 + $message = '<p style="font-size:14px;"><strong>' . __( 'Thank you for choosing TablePress, the most popular table plugin for WordPress!', 'tablepress' ) . '</strong></p>';
210 + /* translators: %1$s: URL to FAQ, %2$s: URL to Documentation, %3$s: URL to Support, %4$s: URL to plugin website */
48 211 $message .= '<p>' . sprintf( __( 'If you encounter any questions or problems, please visit the <a href="%1$s">FAQ</a>, the <a href="%2$s">Documentation</a>, and the <a href="%3$s">Support</a> section on the <a href="%4$s">plugin website</a>.', 'tablepress' ), 'https://tablepress.org/faq/', 'https://tablepress.org/documentation/', 'https://tablepress.org/support/', 'https://tablepress.org/' ) . '</p>';
49 212
50 213 if ( tb_tp_fs()->is_free_plan() ) {
51 - $message .= '<p style="font-size:14px;"><strong>' . sprintf( __( 'More great features for you and your site’s visitors and priority email support are available with a Premium license plan of TablePress. <a href="%s">Go check them out!</a>', 'tablepress' ), 'https://tablepress.org/premium/' ) . '</strong></p>';
214 + $message .= '<p style="font-size:14px;"><strong>' . sprintf( __( 'More great features for you and your site’s visitors and priority email support are available with a Premium license plan of TablePress. <a href="%s">Go check them out!</a>', 'tablepress' ), 'https://tablepress.org/premium/?utm_source=plugin&utm_medium=textlink&utm_content=first-visit-message' ) . '</strong></p>';
52 215 }
53 216
54 - $message .= '<p style="margin-top:14px;">' . $this->ajax_link( array( 'action' => 'hide_message', 'item' => 'first_visit', 'return' => 'list' ), __( 'Hide this message', 'tablepress' ) ) . '</p>';
217 + $message .= '<p style="margin-top:1em;">' . $this->ajax_link( array( 'action' => 'hide_message', 'item' => 'first_visit', 'return' => 'list' ), __( 'Hide this message', 'tablepress' ) ) . '</p>';
55 218
56 219 $title = '<em>' . __( 'Welcome!', 'tablepress' ) . '</em>';
57 220
58 221 $this->add_header_message( $message, 'notice-info not-dismissible', $title );
@@ -57,22 +220,24 @@
57 220
58 221 $this->add_header_message( $message, 'notice-info not-dismissible', $title );
59 222 }
60 223
61 - if ( $data['messages']['donation_message'] ) {
62 - $message = '<p><img alt="' . esc_attr__( 'Tobias Bäthge, developer of TablePress', 'tablepress' ) . '" src="https://secure.gravatar.com/avatar/50f1cff2e27a1f522b18ce229c057bc5?s=125" height="125" width="125" style="float:left;margin:2px 10px 30px 0;" />'
224 + if ( $data['messages']['donation_nag'] && ( ! $data['messages']['plugin_update'] || $milestone_period_ended ) ) {
225 + $message = '<p style="font-size:14px;"><img alt="' . esc_attr__( 'Tobias Bäthge, developer of TablePress', 'tablepress' ) . '" src="https://secure.gravatar.com/avatar/50f1cff2e27a1f522b18ce229c057bc5?s=250" height="125" width="125" style="float:left;margin:2px 15px 30px 0;border-radius:5px;">'
63 226 . __( 'Hi, my name is Tobias, I&#8217;m the developer of the TablePress plugin.', 'tablepress' ) . '</p>';
64 - $message .= '<p>' . __( 'Thank you for using it!', 'tablepress' ) . ' ';
227 + $message .= '<p style="font-size:14px;">' . __( 'Thank you for using it!', 'tablepress' ) . ' ';
65 228 if ( $data['table_count'] > 0 ) {
229 + /* translators: %s: Number of tables */
66 230 $message .= sprintf( _n( 'I hope that everything works and that you are satisfied with the results of managing your %s table.', 'I hope that everything works and that you are satisfied with the results of managing your %s tables.', $data['table_count'], 'tablepress' ), $data['table_count'] );
67 231 } else {
232 + /* translators: %s: URL to TablePress website */
68 233 $message .= sprintf( __( 'It looks like you haven’t added a table yet. If you need help to get started, please find more information in the FAQ and Documentation on the <a href="%s">TablePress website</a>.', 'tablepress' ), 'https://tablepress.org/' );
69 234 }
70 235 $message .= '</p>';
71 - $message .= '<p><strong>' . sprintf( __( 'I would like to invite you to check out the <a href="%s">Premium versions of TablePress</a>.', 'tablepress' ), 'https://tablepress.org/premium/' ) . ' '
236 + $message .= '<p style="font-size:14px;"><strong>' . sprintf( __( 'I would like to invite you to check out the <a href="%s">Premium versions of TablePress</a>.', 'tablepress' ), 'https://tablepress.org/premium/?utm_source=plugin&utm_medium=textlink&utm_content=upgrade-message' ) . '<br>'
72 237 . __( 'The available Pro and Max plans offer user support and many exciting and helpful features for your tables.', 'tablepress' ) . '</strong></p>';
73 - $message .= '<p>' . __( 'Sincerely, Tobias', 'tablepress' ) . '</p>';
74 - $message .= '<p>' . sprintf( '<a href="%s" class="button button-primary" style="font-size:14px;margin-right:1em"><strong>%s</strong><span class="dashicons dashicons-arrow-right-alt" style="vertical-align:middle;margin:0 0 4px 4px"></span></a>', 'https://tablepress.org/premium/', __( 'Tell me more about the Premium features', 'tablepress' ) )
238 + $message .= '<p style="font-size:14px;">' . __( 'Sincerely, Tobias', 'tablepress' ) . '</p>';
239 + $message .= '<p style="margin-top:1em;">' . sprintf( '<a href="%s" class="components-button is-primary" style="font-size:14px;margin-right:3em;color:#ffffff;">%s<span class="dashicons dashicons-arrow-right-alt" style="margin-inline:8px 0"></span></a>', 'https://tablepress.org/premium/?utm_source=plugin&utm_medium=button&utm_content=upgrade-message', __( 'Tell me more about the Premium features', 'tablepress' ) )
75 240 . $this->ajax_link( array( 'action' => 'hide_message', 'item' => 'donation_nag', 'return' => 'list' ), __( 'Hide this message', 'tablepress' ) ) . '</p>';
76 241
77 242 $title = '<em>' . __( 'TablePress has more to offer!', 'tablepress' ) . '</em>';
78 243
@@ -78,29 +243,38 @@
78 243
79 244 $this->add_header_message( $message, 'notice-success not-dismissible', $title );
80 245 }
81 246
82 - if ( $data['messages']['plugin_update_message'] ) {
83 - $message = '<p>' . sprintf( __( 'To find out more about what’s new, please read the <a href="%s"><strong>release announcement</strong></a>.', 'tablepress' ), 'https://tablepress.org/news/' ) . '</p>';
247 + if ( $data['messages']['plugin_update'] ) {
248 + if ( $milestone_period_ended ) {
249 + $message = '<p>' . sprintf( __( 'To find out more about what’s new, please read the <a href="%s"><strong>release announcement</strong></a>.', 'tablepress' ), 'https://tablepress.org/news/?utm_source=plugin&utm_medium=textlink&utm_content=plugin-update-message' ) . '</p>';
84 250
85 - if ( PHP_VERSION_ID < 70200 ) {
86 - $message .= '<p style="font-size:14px;color:#d63638;"><strong>' . sprintf( __( 'In the next release, TablePress will require PHP 7.2 or newer, which your server is not yet using. <a href="%s">Please update PHP!</a>', 'tablepress' ), 'https://wordpress.org/support/update-php/' ) . '</strong></p>';
87 - }
251 + if ( tb_tp_fs()->is_free_plan() ) {
252 + $message .= '<p><strong>' . sprintf( __( 'More great features and priority email support are available with a Premium license plan. <a href="%s">Check them out!</a>', 'tablepress' ), 'https://tablepress.org/premium/?utm_source=plugin&utm_medium=textlink&utm_content=plugin-update-message' ) . '</strong></p>';
253 + }
88 254
89 - require ABSPATH . WPINC . '/version.php'; // Include an unmodified $wp_version.
90 - if ( version_compare( str_replace( '-src', '', $wp_version ), '6.0', '<' ) ) {
91 - $message .= '<p style="font-size:14px;color:#d63638;"><strong>' . sprintf( __( 'In the next release, TablePress will require WordPress 6.0 or newer, which your site is not yet using. <a href="%s">Please update WordPress!</a>', 'tablepress' ), esc_url( admin_url( 'update-core.php' ) ) ) . '</strong></p>';
92 - }
255 + $title = '<em>' . sprintf( __( 'Thank you for updating to TablePress %s!', 'tablepress' ), TablePress::version ) . '</em>';
256 + $class = 'notice-info not-dismissible';
257 + } else {
258 + $texts_german = in_array( get_user_locale(), array( 'de_DE', 'de_AT', 'de_CH' ), true );
259 + if ( $texts_german ) {
260 + $message = '<p style="font-size:16px;">Wir feiern <strong>25 Millionen Downloads</strong> von TablePress aus dem WordPress-Pluginverzeichnis!<br>Mach mit und <strong>spare 25&#8239;%</strong> beim Upgrade auf TablePress Pro oder TablePress Max!</p>';
261 + } else {
262 + $message = '<p style="font-size:16px;">We’re celebrating <strong>25 million downloads</strong> of TablePress from the WordPress Plugin Directory!<br>Join us and <strong>get 25% off</strong> your TablePress Pro or TablePress Max upgrade!</p>';
263 + }
264 + $url = 'https://tablepress.org/premium/?utm_source=plugin&utm_medium=notice&utm_campaign=upgrade-message340&utm_content=button';
265 + $message .= '<p style="margin-top:1em;margin-bottom:24px;">' . sprintf( '<a href="%s" class="components-button is-primary" target="_blank"><span>%s</span><span class="dashicons dashicons-arrow-right-alt" style="margin-inline:8px 0"></span></a>', $url, $texts_german ? 'Spare jetzt 25&#8239;%' : 'Get 25% off now' ) . '</p>';
93 266
94 - if ( tb_tp_fs()->is_free_plan() ) {
95 - $message .= '<p style="font-size:14px;"><strong>' . sprintf( __( 'More great features for you and your site’s visitors and priority email support are available with a Premium license plan of TablePress. <a href="%s">Go check them out!</a>', 'tablepress' ), 'https://tablepress.org/premium/' ) . '</strong></p>';
267 + $filename = $texts_german ? 'admin/img/dl-25-period.svg' : 'admin/img/dl-25-comma.svg';
268 + $message .= sprintf( '<img src="%1$s" alt="%2$s">', plugins_url( $filename, TABLEPRESS__FILE__ ), $texts_german ? 'Grafik mit einer Tabelle mit „Downloads“ in der Kopfzeile und der Zahl 25.000.000 im Tabellenkörper' : 'Graphic with a table with “Downloads” in the header and the number 25,000,000 in the body' );
269 +
270 + $title = '';
271 + $class = 'notice-milestone not-dismissible';
96 272 }
97 273
98 - $message .= '<p style="margin-top:14px;">' . $this->ajax_link( array( 'action' => 'hide_message', 'item' => 'plugin_update', 'return' => 'list' ), __( 'Hide this message', 'tablepress' ) ) . '</p>';
274 + $message .= '<p style="margin-top:1em;">' . $this->ajax_link( array( 'action' => 'hide_message', 'item' => 'plugin_update', 'return' => 'list' ), __( 'Hide this message', 'tablepress' ) ) . '</p>';
99 275
100 - $title = '<em>' . sprintf( __( 'Thank you for updating to TablePress %s!', 'tablepress' ), TablePress::version ) . '</em>';
101 -
102 - $this->add_header_message( $message, 'notice-info not-dismissible', $title );
276 + $this->add_header_message( $message, $class, $title );
103 277 }
104 278
105 279 $this->process_action_messages( array(
106 280 'success_delete' => _n( 'The table was deleted successfully.', 'The tables were deleted successfully.', 1, 'tablepress' ),
@@ -105,9 +279,15 @@
105 279 $this->process_action_messages( array(
106 280 'success_delete' => _n( 'The table was deleted successfully.', 'The tables were deleted successfully.', 1, 'tablepress' ),
107 281 'success_delete_plural' => _n( 'The table was deleted successfully.', 'The tables were deleted successfully.', 2, 'tablepress' ),
108 282 'error_delete' => __( 'Error: The table could not be deleted.', 'tablepress' ),
109 - 'success_copy' => _n( 'The table was copied successfully.', 'The tables were copied successfully.', 1, 'tablepress' ) . ( ( false !== $data['table_id'] ) ? ' ' . sprintf( __( 'The copied table has the table ID &#8220;%s&#8221;.', 'tablepress' ), esc_html( $data['table_id'] ) ) : '' ),
283 + 'success_copy' => _n( 'The table was copied successfully.', 'The tables were copied successfully.', 1, 'tablepress' )
284 + . ( ( false !== $data['table_id'] )
285 + ? ' ' . ( current_user_can( 'tablepress_edit_table', $data['table_id'] )
286 + ? sprintf( __( 'You can now <a href="%1$s">edit the copied table</a>, which has the table ID “%2$s”.', 'tablepress' ), esc_url( TablePress::url( array( 'action' => 'edit', 'table_id' => $data['table_id'] ) ) ), esc_html( $data['table_id'] ) )
287 + : sprintf( __( 'The copied table has the table ID &#8220;%s&#8221;.', 'tablepress' ), esc_html( $data['table_id'] ) ) )
288 + : ''
289 + ),
110 290 'success_copy_plural' => _n( 'The table was copied successfully.', 'The tables were copied successfully.', 2, 'tablepress' ),
111 291 'error_copy' => __( 'Error: The table could not be copied.', 'tablepress' ),
112 292 'error_no_table' => __( 'Error: You did not specify a valid table ID.', 'tablepress' ),
113 293 'error_load_table' => __( 'Error: This table could not be loaded!', 'tablepress' ),
@@ -134,9 +314,10 @@
134 314 * Render the current view (in this view: without form tag).
135 315 *
136 316 * @since 1.0.0
137 317 */
138 - public function render() {
318 + #[\Override]
319 + public function render(): void {
139 320 ?>
140 321 <div id="tablepress-page" class="wrap">
141 322 <?php
142 323 $this->print_nav_tab_menu();
@@ -141,9 +322,10 @@
141 322 <?php
142 323 $this->print_nav_tab_menu();
143 324 ?>
144 325 <div id="tablepress-body">
145 - <hr class="wp-header-end" />
326 + <hr class="wp-header-end">
327 + <script>document.querySelectorAll('.notice:has(~#tablepress-page)').forEach(e=>document.querySelector('.wp-header-end').after(e));</script>
146 328 <?php
147 329 // Print all header messages.
148 330 foreach ( $this->header_messages as $message ) {
149 331 echo $message;
@@ -173,9 +355,9 @@
173 355 $this->do_meta_boxes( 'side' );
174 356 ?>
175 357 </div>
176 358 </div>
177 - <br class="clear" />
359 + <br class="clear">
178 360 </div>
179 361 </div>
180 362 </div>
181 363 <?php
@@ -185,18 +367,20 @@
185 367 * Print the screen head text.
186 368 *
187 369 * @since 1.0.0
188 370 *
189 - * @param array $data Data for this screen.
190 - * @param array $box Information about the text box.
371 + * @param array<string, mixed> $data Data for this screen.
372 + * @param array<string, mixed> $box Information about the text box.
191 373 */
192 - public function textbox_head( array $data, array $box ) {
374 + public function textbox_head( array $data, array $box ): void {
193 375 echo '<p>';
194 376 _e( 'This is a list of your tables.', 'tablepress' );
195 377 echo ' ';
196 378 // Show the instructions string depending on whether the Block Editor is used on the site or not.
197 - if ( $data['site_uses_block_editor'] ) {
379 + if ( 'block' === $data['site_used_editor'] ) {
198 380 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' ) );
381 + } elseif ( 'elementor' === $data['site_used_editor'] ) {
382 + 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' ) );
199 383 } else {
200 384 _e( 'To insert a table into a post or page, paste its Shortcode at the desired place in the editor.', 'tablepress' );
201 385 echo ' ';
202 386 _e( 'Each table has a unique ID that needs to be adjusted in that Shortcode.', 'tablepress' );
@@ -208,20 +392,20 @@
208 392 * Print the content of the "All Tables" text box.
209 393 *
210 394 * @since 1.0.0
211 395 *
212 - * @param array $data Data for this screen.
213 - * @param array $box Information about the text box.
396 + * @param array<string, mixed> $data Data for this screen.
397 + * @param array<string, mixed> $box Information about the text box.
214 398 */
215 - public function textbox_tables_list( array $data, array $box ) {
399 + public function textbox_tables_list( array $data, array $box ): void {
216 400 if ( ! empty( $_GET['s'] ) ) {
217 401 printf( '<span class="subtitle">' . __( 'Search results for &#8220;%s&#8221;', 'tablepress' ) . '</span>', esc_html( wp_unslash( $_GET['s'] ) ) );
218 402 }
219 403 ?>
220 -<form method="get" action="">
404 +<form method="get">
221 405 <?php
222 406 if ( isset( $_GET['page'] ) ) {
223 - echo '<input type="hidden" name="page" value="' . esc_attr( $_GET['page'] ) . '" />' . "\n";
407 + echo '<input type="hidden" name="page" value="' . esc_attr( $_GET['page'] ) . '">' . "\n";
224 408 }
225 409 $this->wp_list_table->search_box( __( 'Search Tables', 'tablepress' ), 'tables_search' );
226 410 ?>
227 411 </form>
@@ -231,8 +415,9 @@
231 415 $this->do_text_boxes( 'header' );
232 416 $this->wp_list_table->display();
233 417 ?>
234 418 </form>
419 +<div id="tablepress-list-screen"></div>
235 420 <?php
236 421 }
237 422
238 423 /**
@@ -239,13 +424,13 @@
239 424 * Create HTML code for an AJAXified link.
240 425 *
241 426 * @since 1.0.0
242 427 *
243 - * @param array $params Parameters for the URL.
244 - * @param string $text Text for the link.
428 + * @param array<string, mixed> $params Parameters for the URL.
429 + * @param string $text Text for the link.
245 430 * @return string HTML code for the link.
246 431 */
247 - protected function ajax_link( array $params, $text ) {
432 + protected function ajax_link( array $params, string $text ): string {
248 433 $class = 'ajax-link';
249 434 if ( ! empty( $params['class'] ) ) {
250 435 $class .= ' ' . esc_attr( $params['class'] );
251 436 }
@@ -251,9 +436,9 @@
251 436 }
252 437 $url = TablePress::url( $params, true, 'admin-post.php' );
253 438 $action = esc_attr( $params['action'] );
254 439 $item = esc_attr( $params['item'] );
255 - $target = isset( $params['target'] ) ? esc_attr( $params['target'] ) : '';
440 + $target = esc_attr( $params['target'] ?? '' );
256 441 return "<a class=\"{$class}\" href=\"{$url}\" data-action=\"{$action}\" data-item=\"{$item}\" data-target=\"{$target}\">{$text}</a>";
257 442 }
258 443
259 444 } // class TablePress_List_View