Passed
Pull Request — master (#847)
by Kiran
05:48
created
includes/admin/class-wpinv-subscriptions-list-table.php 1 patch
Indentation   +475 added lines, -475 removed lines patch added patch discarded remove patch
@@ -8,7 +8,7 @@  discard block
 block discarded – undo
8 8
 }
9 9
 
10 10
 if ( ! class_exists( 'WP_List_Table' ) ) {
11
-	include_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
11
+    include_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
12 12
 }
13 13
 
14 14
 /**
@@ -16,479 +16,479 @@  discard block
 block discarded – undo
16 16
  */
17 17
 class WPInv_Subscriptions_List_Table extends WP_List_Table {
18 18
 
19
-	/**
20
-	 * URL of this page
21
-	 *
22
-	 * @var   string
23
-	 * @since 1.0.19
24
-	 */
25
-	public $base_url;
26
-
27
-	/**
28
-	 * Query
29
-	 *
30
-	 * @var   GetPaid_Subscriptions_Query
31
-	 * @since 1.0.19
32
-	 */
33
-	public $query;
34
-
35
-	/**
36
-	 * Total subscriptions
37
-	 *
38
-	 * @var   string
39
-	 * @since 1.0.0
40
-	 */
41
-	public $total_count;
42
-
43
-	/**
44
-	 * Current status subscriptions
45
-	 *
46
-	 * @var   string
47
-	 * @since 1.0.0
48
-	 */
49
-	public $current_total_count;
50
-
51
-	/**
52
-	 * Status counts
53
-	 *
54
-	 * @var   array
55
-	 * @since 1.0.19
56
-	 */
57
-	public $status_counts;
58
-
59
-	/**
60
-	 * Number of results to show per page
61
-	 *
62
-	 * @var   int
63
-	 * @since 1.0.0
64
-	 */
65
-	public $per_page = 10;
66
-
67
-	/**
68
-	 *  Constructor function.
69
-	 */
70
-	public function __construct() {
71
-
72
-		parent::__construct(
73
-			array(
74
-				'singular' => 'subscription',
75
-				'plural'   => 'subscriptions',
76
-			)
77
-		);
78
-
79
-		$this->process_bulk_action();
80
-
81
-		$this->prepare_query();
82
-
83
-		$this->base_url = remove_query_arg( 'status' );
84
-
85
-	}
86
-
87
-	/**
88
-	 *  Prepares the display query
89
-	 */
90
-	public function prepare_query() {
91
-
92
-		// Prepare query args.
93
-		$query = array(
94
-			'number'      => $this->per_page,
95
-			'paged'       => $this->get_paged(),
96
-			'status'      => ( isset( $_GET['status'] ) && array_key_exists( $_GET['status'], getpaid_get_subscription_statuses() ) ) ? sanitize_text_field( $_GET['status'] ) : 'all',
97
-			'orderby'     => ( isset( $_GET['orderby'] ) ) ? sanitize_text_field( $_GET['orderby'] ) : 'id',
98
-			'order'       => ( isset( $_GET['order'] ) ) ? sanitize_text_field( $_GET['order'] ) : 'DESC',
99
-			'customer_in' => $this->get_user_in(),
100
-		);
101
-
102
-		if ( is_array( $query['customer_in'] ) && empty( $query['customer_in'] ) ) {
103
-			$this->total_count         = 0;
104
-			$this->current_total_count = 0;
105
-			$this->items               = array();
106
-			$this->status_counts       = array();
107
-			return;
108
-		}
109
-
110
-		// Prepare class properties.
111
-		$this->query               = new GetPaid_Subscriptions_Query( $query );
112
-		$this->total_count         = $this->query->get_total();
113
-		$this->current_total_count = $this->query->get_total();
114
-		$this->items               = $this->query->get_results();
115
-		$this->status_counts       = getpaid_get_subscription_status_counts( $query );
116
-
117
-		if ( 'all' != $query['status'] ) {
118
-			unset( $query['status'] );
119
-			$this->total_count   = getpaid_get_subscriptions( $query, 'count' );
120
-		}
121
-
122
-	}
123
-
124
-	/**
125
-	 * Get user in.
126
-	 *
127
-	 */
128
-	public function get_user_in() {
129
-
130
-		// Abort if no user.
131
-		if ( empty( $_GET['s'] ) ) {
132
-			return null;
133
-		}
134
-
135
-		// Or invalid user.
136
-		$user = wp_unslash( sanitize_text_field( $_REQUEST['s'] ) );
137
-
138
-		if ( empty( $user ) ) {
139
-			return null;
140
-		}
141
-
142
-		// Search matching users.
143
-		$user  = '*' . $user . '*';
144
-		$users = new WP_User_Query(
145
-			array(
146
-				'fields'      => 'ID',
147
-				'search'      => $user,
148
-				'count_total' => false,
149
-			)
150
-		);
151
-
152
-		return $users->get_results();
153
-	}
154
-
155
-	/**
156
-	 * Gets the list of views available on this table.
157
-	 *
158
-	 * The format is an associative array:
159
-	 * - `'id' => 'link'`
160
-	 *
161
-	 * @since 1.0.0
162
-	 *
163
-	 * @return array
164
-	 */
165
-	public function get_views() {
166
-
167
-		$current  = isset( $_GET['status'] ) ? sanitize_text_field( $_GET['status'] ) : 'all';
168
-		$views    = array(
169
-
170
-			'all' => sprintf(
171
-				'<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
172
-				esc_url( add_query_arg( 'status', false, $this->base_url ) ),
173
-				$current === 'all' ? ' class="current"' : '',
174
-				__( 'All', 'invoicing' ),
175
-				$this->total_count
176
-			),
177
-
178
-		);
179
-
180
-		foreach ( array_filter( $this->status_counts ) as $status => $count ) {
181
-
182
-			$views[ $status ] = sprintf(
183
-				'<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
184
-				esc_url( add_query_arg( 'status', urlencode( $status ), $this->base_url ) ),
185
-				$current === $status ? ' class="current"' : '',
186
-				esc_html( getpaid_get_subscription_status_label( $status ) ),
187
-				$count
188
-			);
189
-
190
-		}
191
-
192
-		return $views;
193
-
194
-	}
195
-
196
-	/**
197
-	 * Render most columns
198
-	 *
199
-	 * @access      private
200
-	 * @since       1.0.0
201
-	 * @return      string
202
-	 */
203
-	public function column_default( $item, $column_name ) {
204
-		return apply_filters( "getpaid_subscriptions_table_column_$column_name", $item->$column_name );
205
-	}
206
-
207
-	/**
208
-	 * This is how checkbox column renders.
209
-	 *
210
-	 * @param WPInv_Subscription $item
211
-	 * @return string
212
-	 */
213
-	public function column_cb( $item ) {
214
-		return sprintf( '<input type="checkbox" name="id[]" value="%s" />', esc_html( $item->get_id() ) );
215
-	}
216
-
217
-	/**
218
-	 * Status column
219
-	 *
220
-	 * @param WPInv_Subscription $item
221
-	 * @since       1.0.0
222
-	 * @return      string
223
-	 */
224
-	public function column_status( $item ) {
225
-		$extra = $item->has_status( 'expired' ) ? '<small class="text-muted d-block">' . wp_sprintf( _x( 'On: %s', 'Expired On:', 'invoicing' ), getpaid_format_date_value( $item->get_expiration() ) ) . '</small>' : '';
226
-
227
-		return $item->get_status_label_html() . $extra;
228
-	}
229
-
230
-	/**
231
-	 * Subscription column
232
-	 *
233
-	 * @param WPInv_Subscription $item
234
-	 * @since       1.0.0
235
-	 * @return      string
236
-	 */
237
-	public function column_subscription( $item ) {
238
-
239
-		$username = __( '(Missing User)', 'invoicing' );
240
-
241
-		$user = get_userdata( $item->get_customer_id() );
242
-		$capabilities = wpinv_current_user_can_manage_invoicing();
243
-
244
-		if ( $user ) {
245
-			$username = sprintf(
246
-				'<a href="user-edit.php?user_id=%s">%s</a>',
247
-				absint( $user->ID ),
248
-				! empty( $user->display_name ) ? esc_html( $user->display_name ) : sanitize_email( $user->user_email )
249
-			);
250
-		}
251
-
252
-		// translators: $1: is opening link, $2: is subscription id number, $3: is closing link tag, $4: is user's name
253
-		$column_content = sprintf(
254
-			_x( '%1$s#%2$s%3$s for %4$s', 'Subscription title on admin table. (e.g.: #211 for John Doe)', 'invoicing' ),
255
-			'<a href="' . esc_url( admin_url( 'admin.php?page=wpinv-subscriptions&id=' . absint( $item->get_id() ) ) ) . '">',
256
-			'<strong>' . esc_attr( $item->get_id() ) . '</strong>',
257
-			'</a>',
258
-			$username
259
-		);
260
-
261
-		$row_actions = array();
262
-
263
-		// View subscription.
264
-		$view_url    = esc_url( add_query_arg( 'id', $item->get_id(), admin_url( 'admin.php?page=wpinv-subscriptions' ) ) );
265
-		$row_actions['view'] = '<a href="' . $view_url . '">' . __( 'View Subscription', 'invoicing' ) . '</a>';
266
-
267
-		// View invoice.
268
-		$invoice = get_post( $item->get_parent_invoice_id() );
269
-
270
-		if ( ! empty( $invoice ) ) {
271
-			$invoice_url            = get_edit_post_link( $invoice );
272
-			$row_actions['invoice'] = '<a href="' . $invoice_url . '">' . __( 'View Invoice', 'invoicing' ) . '</a>';
273
-		}
274
-
275
-		$delete_url            = esc_url(
276
-			wp_nonce_url(
277
-				add_query_arg(
278
-					array(
279
-						'getpaid-admin-action' => 'subscription_manual_delete',
280
-						'id'                   => $item->get_id(),
281
-					)
282
-				),
283
-				'getpaid-nonce',
284
-				'getpaid-nonce'
285
-			)
286
-		);
287
-		$row_actions['delete'] = '<a class="text-danger" href="' . $delete_url . '">' . __( 'Delete Subscription', 'invoicing' ) . '</a>';
288
-
289
-		if ( ! $capabilities ) {
290
-			$row_actions = array();
291
-		}
292
-
293
-		$row_actions = $this->row_actions( apply_filters( 'getpaid_subscription_table_row_actions', $row_actions, $item ) );
294
-
295
-		return "<strong>$column_content</strong>" . $this->column_amount( $item ) . $row_actions;
296
-	}
297
-
298
-	/**
299
-	 * Renewal date column
300
-	 *
301
-	 * @param WPInv_Subscription $item
302
-	 * @since       1.0.0
303
-	 * @return      string
304
-	 */
305
-	public function column_renewal_date( $item ) {
306
-		if ( $item->has_status( 'active trialling' ) ) {
307
-			$value = getpaid_format_date_value( $item->get_expiration() );
308
-		} else {
309
-			$value = '-';
310
-		}
311
-
312
-		return $value;
313
-	}
314
-
315
-	/**
316
-	 * Start date column
317
-	 *
318
-	 * @param WPInv_Subscription $item
319
-	 * @since       1.0.0
320
-	 * @return      string
321
-	 */
322
-	public function column_start_date( $item ) {
323
-
324
-		$gateway = $item->get_parent_invoice()->get_gateway_title();
325
-
326
-		if ( empty( $gateway ) ) {
327
-			return getpaid_format_date_value( $item->get_date_created() );
328
-		}
329
-
330
-		$url = apply_filters( 'getpaid_remote_subscription_profile_url', '', $item );
331
-		if ( ! empty( $url ) ) {
332
-
333
-			return getpaid_format_date_value( $item->get_date_created() ) . '<br>' . sprintf(
334
-				__( 'Via %s', 'invoicing' ),
335
-				'<strong><a href="' . esc_url( $url ) . '" target="_blank">' . esc_html( $item->get_parent_invoice()->get_gateway_title() ) . '</a></strong>'
336
-			);
337
-
338
-		}
339
-
340
-		return getpaid_format_date_value( $item->get_date_created() ) . '<br>' . sprintf(
341
-			__( 'Via %s', 'invoicing' ),
342
-			'<strong>' . esc_html( $item->get_parent_invoice()->get_gateway_title() ) . '</strong>'
343
-		);
344
-
345
-	}
346
-
347
-	/**
348
-	 * Amount column
349
-	 *
350
-	 * @param WPInv_Subscription $item
351
-	 * @since       1.0.19
352
-	 * @return      string
353
-	 */
354
-	public static function column_amount( $item ) {
355
-		$amount = getpaid_get_formatted_subscription_amount( $item );
356
-		return "<span class='text-muted form-text mt-2 mb-2 ms-1 ml-1'>$amount</span>";
357
-	}
358
-
359
-	/**
360
-	 * Billing Times column
361
-	 *
362
-	 * @param WPInv_Subscription $item
363
-	 * @since       1.0.0
364
-	 * @return      string
365
-	 */
366
-	public function column_renewals( $item ) {
367
-		$max_bills = $item->get_bill_times();
368
-		return $item->get_times_billed() . ' / ' . ( empty( $max_bills ) ? '&infin;' : $max_bills );
369
-	}
370
-
371
-	/**
372
-	 * Product ID column
373
-	 *
374
-	 * @param WPInv_Subscription $item
375
-	 * @since       1.0.0
376
-	 * @return      string
377
-	 */
378
-	public function column_item( $item ) {
379
-		$subscription_group = getpaid_get_invoice_subscription_group( $item->get_parent_invoice_id(), $item->get_id() );
380
-
381
-		if ( empty( $subscription_group ) ) {
382
-			return $this->generate_item_markup( $item->get_product_id() );
383
-		}
384
-
385
-		$markup = array_map( array( $this, 'generate_item_markup' ), array_keys( $subscription_group['items'] ) );
386
-		return implode( ' | ', $markup );
387
-
388
-	}
389
-
390
-	/**
391
-	 * Generates the items markup.
392
-	 *
393
-	 * @param int $item_id
394
-	 * @since       1.0.0
395
-	 * @return      string
396
-	 */
397
-	public static function generate_item_markup( $item_id ) {
398
-		$item = get_post( $item_id );
399
-
400
-		if ( ! empty( $item ) ) {
401
-			$link = get_edit_post_link( $item );
402
-			$name = esc_html( get_the_title( $item ) );
403
-			return wpinv_current_user_can_manage_invoicing() ? "<a href='" . ( $link ? esc_url( $link ) : '#' ) . "'>$name</a>" : $name;
404
-		} else {
405
-			return sprintf( __( 'Item #%s', 'invoicing' ), $item_id );
406
-		}
407
-
408
-	}
409
-
410
-	/**
411
-	 * Retrieve the current page number
412
-	 *
413
-	 * @return      int
414
-	 */
415
-	public function get_paged() {
416
-		return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
417
-	}
418
-
419
-	/**
420
-	 * Setup the final data for the table
421
-	 *
422
-	 */
423
-	public function prepare_items() {
424
-
425
-		$columns  = $this->get_columns();
426
-		$hidden   = array();
427
-		$sortable = $this->get_sortable_columns();
428
-
429
-		$this->_column_headers = array( $columns, $hidden, $sortable );
430
-
431
-		$this->set_pagination_args(
432
-			array(
433
-				'total_items' => $this->current_total_count,
434
-				'per_page'    => $this->per_page,
435
-				'total_pages' => ceil( $this->current_total_count / $this->per_page ),
436
-			)
437
-		);
438
-	}
439
-
440
-	/**
441
-	 * Table columns
442
-	 *
443
-	 * @return array
444
-	 */
445
-	public function get_columns() {
446
-		$columns = array(
447
-			'cb'           => '<input type="checkbox" />',
448
-			'subscription' => __( 'Subscription', 'invoicing' ),
449
-			'start_date'   => __( 'Start Date', 'invoicing' ),
450
-			'renewal_date' => __( 'Next Payment', 'invoicing' ),
451
-			'renewals'     => __( 'Payments', 'invoicing' ),
452
-			'item'         => __( 'Items', 'invoicing' ),
453
-			'status'       => __( 'Status', 'invoicing' ),
454
-		);
455
-
456
-		return apply_filters( 'manage_getpaid_subscriptions_table_columns', $columns );
457
-	}
458
-
459
-	/**
460
-	 * Sortable table columns.
461
-	 *
462
-	 * @return array
463
-	 */
464
-	public function get_sortable_columns() {
465
-		$sortable = array(
466
-			'subscription' => array( 'id', true ),
467
-			'start_date'   => array( 'created', true ),
468
-			'renewal_date' => array( 'expiration', true ),
469
-			'renewals'     => array( 'bill_times', true ),
470
-			'item'         => array( 'product_id', true ),
471
-			'status'       => array( 'status', true ),
472
-		);
473
-
474
-		return apply_filters( 'manage_getpaid_subscriptions_sortable_table_columns', $sortable );
475
-	}
476
-
477
-	/**
478
-	 * Whether the table has items to display or not
479
-	 *
480
-	 * @return bool
481
-	 */
482
-	public function has_items() {
483
-		return ! empty( $this->current_total_count );
484
-	}
485
-
486
-	/**
487
-	 * Processes bulk actions.
488
-	 *
489
-	 */
490
-	public function process_bulk_action() {
491
-
492
-	}
19
+    /**
20
+     * URL of this page
21
+     *
22
+     * @var   string
23
+     * @since 1.0.19
24
+     */
25
+    public $base_url;
26
+
27
+    /**
28
+     * Query
29
+     *
30
+     * @var   GetPaid_Subscriptions_Query
31
+     * @since 1.0.19
32
+     */
33
+    public $query;
34
+
35
+    /**
36
+     * Total subscriptions
37
+     *
38
+     * @var   string
39
+     * @since 1.0.0
40
+     */
41
+    public $total_count;
42
+
43
+    /**
44
+     * Current status subscriptions
45
+     *
46
+     * @var   string
47
+     * @since 1.0.0
48
+     */
49
+    public $current_total_count;
50
+
51
+    /**
52
+     * Status counts
53
+     *
54
+     * @var   array
55
+     * @since 1.0.19
56
+     */
57
+    public $status_counts;
58
+
59
+    /**
60
+     * Number of results to show per page
61
+     *
62
+     * @var   int
63
+     * @since 1.0.0
64
+     */
65
+    public $per_page = 10;
66
+
67
+    /**
68
+     *  Constructor function.
69
+     */
70
+    public function __construct() {
71
+
72
+        parent::__construct(
73
+            array(
74
+                'singular' => 'subscription',
75
+                'plural'   => 'subscriptions',
76
+            )
77
+        );
78
+
79
+        $this->process_bulk_action();
80
+
81
+        $this->prepare_query();
82
+
83
+        $this->base_url = remove_query_arg( 'status' );
84
+
85
+    }
86
+
87
+    /**
88
+     *  Prepares the display query
89
+     */
90
+    public function prepare_query() {
91
+
92
+        // Prepare query args.
93
+        $query = array(
94
+            'number'      => $this->per_page,
95
+            'paged'       => $this->get_paged(),
96
+            'status'      => ( isset( $_GET['status'] ) && array_key_exists( $_GET['status'], getpaid_get_subscription_statuses() ) ) ? sanitize_text_field( $_GET['status'] ) : 'all',
97
+            'orderby'     => ( isset( $_GET['orderby'] ) ) ? sanitize_text_field( $_GET['orderby'] ) : 'id',
98
+            'order'       => ( isset( $_GET['order'] ) ) ? sanitize_text_field( $_GET['order'] ) : 'DESC',
99
+            'customer_in' => $this->get_user_in(),
100
+        );
101
+
102
+        if ( is_array( $query['customer_in'] ) && empty( $query['customer_in'] ) ) {
103
+            $this->total_count         = 0;
104
+            $this->current_total_count = 0;
105
+            $this->items               = array();
106
+            $this->status_counts       = array();
107
+            return;
108
+        }
109
+
110
+        // Prepare class properties.
111
+        $this->query               = new GetPaid_Subscriptions_Query( $query );
112
+        $this->total_count         = $this->query->get_total();
113
+        $this->current_total_count = $this->query->get_total();
114
+        $this->items               = $this->query->get_results();
115
+        $this->status_counts       = getpaid_get_subscription_status_counts( $query );
116
+
117
+        if ( 'all' != $query['status'] ) {
118
+            unset( $query['status'] );
119
+            $this->total_count   = getpaid_get_subscriptions( $query, 'count' );
120
+        }
121
+
122
+    }
123
+
124
+    /**
125
+     * Get user in.
126
+     *
127
+     */
128
+    public function get_user_in() {
129
+
130
+        // Abort if no user.
131
+        if ( empty( $_GET['s'] ) ) {
132
+            return null;
133
+        }
134
+
135
+        // Or invalid user.
136
+        $user = wp_unslash( sanitize_text_field( $_REQUEST['s'] ) );
137
+
138
+        if ( empty( $user ) ) {
139
+            return null;
140
+        }
141
+
142
+        // Search matching users.
143
+        $user  = '*' . $user . '*';
144
+        $users = new WP_User_Query(
145
+            array(
146
+                'fields'      => 'ID',
147
+                'search'      => $user,
148
+                'count_total' => false,
149
+            )
150
+        );
151
+
152
+        return $users->get_results();
153
+    }
154
+
155
+    /**
156
+     * Gets the list of views available on this table.
157
+     *
158
+     * The format is an associative array:
159
+     * - `'id' => 'link'`
160
+     *
161
+     * @since 1.0.0
162
+     *
163
+     * @return array
164
+     */
165
+    public function get_views() {
166
+
167
+        $current  = isset( $_GET['status'] ) ? sanitize_text_field( $_GET['status'] ) : 'all';
168
+        $views    = array(
169
+
170
+            'all' => sprintf(
171
+                '<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
172
+                esc_url( add_query_arg( 'status', false, $this->base_url ) ),
173
+                $current === 'all' ? ' class="current"' : '',
174
+                __( 'All', 'invoicing' ),
175
+                $this->total_count
176
+            ),
177
+
178
+        );
179
+
180
+        foreach ( array_filter( $this->status_counts ) as $status => $count ) {
181
+
182
+            $views[ $status ] = sprintf(
183
+                '<a href="%s" %s>%s&nbsp;<span class="count">(%d)</span></a>',
184
+                esc_url( add_query_arg( 'status', urlencode( $status ), $this->base_url ) ),
185
+                $current === $status ? ' class="current"' : '',
186
+                esc_html( getpaid_get_subscription_status_label( $status ) ),
187
+                $count
188
+            );
189
+
190
+        }
191
+
192
+        return $views;
193
+
194
+    }
195
+
196
+    /**
197
+     * Render most columns
198
+     *
199
+     * @access      private
200
+     * @since       1.0.0
201
+     * @return      string
202
+     */
203
+    public function column_default( $item, $column_name ) {
204
+        return apply_filters( "getpaid_subscriptions_table_column_$column_name", $item->$column_name );
205
+    }
206
+
207
+    /**
208
+     * This is how checkbox column renders.
209
+     *
210
+     * @param WPInv_Subscription $item
211
+     * @return string
212
+     */
213
+    public function column_cb( $item ) {
214
+        return sprintf( '<input type="checkbox" name="id[]" value="%s" />', esc_html( $item->get_id() ) );
215
+    }
216
+
217
+    /**
218
+     * Status column
219
+     *
220
+     * @param WPInv_Subscription $item
221
+     * @since       1.0.0
222
+     * @return      string
223
+     */
224
+    public function column_status( $item ) {
225
+        $extra = $item->has_status( 'expired' ) ? '<small class="text-muted d-block">' . wp_sprintf( _x( 'On: %s', 'Expired On:', 'invoicing' ), getpaid_format_date_value( $item->get_expiration() ) ) . '</small>' : '';
226
+
227
+        return $item->get_status_label_html() . $extra;
228
+    }
229
+
230
+    /**
231
+     * Subscription column
232
+     *
233
+     * @param WPInv_Subscription $item
234
+     * @since       1.0.0
235
+     * @return      string
236
+     */
237
+    public function column_subscription( $item ) {
238
+
239
+        $username = __( '(Missing User)', 'invoicing' );
240
+
241
+        $user = get_userdata( $item->get_customer_id() );
242
+        $capabilities = wpinv_current_user_can_manage_invoicing();
243
+
244
+        if ( $user ) {
245
+            $username = sprintf(
246
+                '<a href="user-edit.php?user_id=%s">%s</a>',
247
+                absint( $user->ID ),
248
+                ! empty( $user->display_name ) ? esc_html( $user->display_name ) : sanitize_email( $user->user_email )
249
+            );
250
+        }
251
+
252
+        // translators: $1: is opening link, $2: is subscription id number, $3: is closing link tag, $4: is user's name
253
+        $column_content = sprintf(
254
+            _x( '%1$s#%2$s%3$s for %4$s', 'Subscription title on admin table. (e.g.: #211 for John Doe)', 'invoicing' ),
255
+            '<a href="' . esc_url( admin_url( 'admin.php?page=wpinv-subscriptions&id=' . absint( $item->get_id() ) ) ) . '">',
256
+            '<strong>' . esc_attr( $item->get_id() ) . '</strong>',
257
+            '</a>',
258
+            $username
259
+        );
260
+
261
+        $row_actions = array();
262
+
263
+        // View subscription.
264
+        $view_url    = esc_url( add_query_arg( 'id', $item->get_id(), admin_url( 'admin.php?page=wpinv-subscriptions' ) ) );
265
+        $row_actions['view'] = '<a href="' . $view_url . '">' . __( 'View Subscription', 'invoicing' ) . '</a>';
266
+
267
+        // View invoice.
268
+        $invoice = get_post( $item->get_parent_invoice_id() );
269
+
270
+        if ( ! empty( $invoice ) ) {
271
+            $invoice_url            = get_edit_post_link( $invoice );
272
+            $row_actions['invoice'] = '<a href="' . $invoice_url . '">' . __( 'View Invoice', 'invoicing' ) . '</a>';
273
+        }
274
+
275
+        $delete_url            = esc_url(
276
+            wp_nonce_url(
277
+                add_query_arg(
278
+                    array(
279
+                        'getpaid-admin-action' => 'subscription_manual_delete',
280
+                        'id'                   => $item->get_id(),
281
+                    )
282
+                ),
283
+                'getpaid-nonce',
284
+                'getpaid-nonce'
285
+            )
286
+        );
287
+        $row_actions['delete'] = '<a class="text-danger" href="' . $delete_url . '">' . __( 'Delete Subscription', 'invoicing' ) . '</a>';
288
+
289
+        if ( ! $capabilities ) {
290
+            $row_actions = array();
291
+        }
292
+
293
+        $row_actions = $this->row_actions( apply_filters( 'getpaid_subscription_table_row_actions', $row_actions, $item ) );
294
+
295
+        return "<strong>$column_content</strong>" . $this->column_amount( $item ) . $row_actions;
296
+    }
297
+
298
+    /**
299
+     * Renewal date column
300
+     *
301
+     * @param WPInv_Subscription $item
302
+     * @since       1.0.0
303
+     * @return      string
304
+     */
305
+    public function column_renewal_date( $item ) {
306
+        if ( $item->has_status( 'active trialling' ) ) {
307
+            $value = getpaid_format_date_value( $item->get_expiration() );
308
+        } else {
309
+            $value = '-';
310
+        }
311
+
312
+        return $value;
313
+    }
314
+
315
+    /**
316
+     * Start date column
317
+     *
318
+     * @param WPInv_Subscription $item
319
+     * @since       1.0.0
320
+     * @return      string
321
+     */
322
+    public function column_start_date( $item ) {
323
+
324
+        $gateway = $item->get_parent_invoice()->get_gateway_title();
325
+
326
+        if ( empty( $gateway ) ) {
327
+            return getpaid_format_date_value( $item->get_date_created() );
328
+        }
329
+
330
+        $url = apply_filters( 'getpaid_remote_subscription_profile_url', '', $item );
331
+        if ( ! empty( $url ) ) {
332
+
333
+            return getpaid_format_date_value( $item->get_date_created() ) . '<br>' . sprintf(
334
+                __( 'Via %s', 'invoicing' ),
335
+                '<strong><a href="' . esc_url( $url ) . '" target="_blank">' . esc_html( $item->get_parent_invoice()->get_gateway_title() ) . '</a></strong>'
336
+            );
337
+
338
+        }
339
+
340
+        return getpaid_format_date_value( $item->get_date_created() ) . '<br>' . sprintf(
341
+            __( 'Via %s', 'invoicing' ),
342
+            '<strong>' . esc_html( $item->get_parent_invoice()->get_gateway_title() ) . '</strong>'
343
+        );
344
+
345
+    }
346
+
347
+    /**
348
+     * Amount column
349
+     *
350
+     * @param WPInv_Subscription $item
351
+     * @since       1.0.19
352
+     * @return      string
353
+     */
354
+    public static function column_amount( $item ) {
355
+        $amount = getpaid_get_formatted_subscription_amount( $item );
356
+        return "<span class='text-muted form-text mt-2 mb-2 ms-1 ml-1'>$amount</span>";
357
+    }
358
+
359
+    /**
360
+     * Billing Times column
361
+     *
362
+     * @param WPInv_Subscription $item
363
+     * @since       1.0.0
364
+     * @return      string
365
+     */
366
+    public function column_renewals( $item ) {
367
+        $max_bills = $item->get_bill_times();
368
+        return $item->get_times_billed() . ' / ' . ( empty( $max_bills ) ? '&infin;' : $max_bills );
369
+    }
370
+
371
+    /**
372
+     * Product ID column
373
+     *
374
+     * @param WPInv_Subscription $item
375
+     * @since       1.0.0
376
+     * @return      string
377
+     */
378
+    public function column_item( $item ) {
379
+        $subscription_group = getpaid_get_invoice_subscription_group( $item->get_parent_invoice_id(), $item->get_id() );
380
+
381
+        if ( empty( $subscription_group ) ) {
382
+            return $this->generate_item_markup( $item->get_product_id() );
383
+        }
384
+
385
+        $markup = array_map( array( $this, 'generate_item_markup' ), array_keys( $subscription_group['items'] ) );
386
+        return implode( ' | ', $markup );
387
+
388
+    }
389
+
390
+    /**
391
+     * Generates the items markup.
392
+     *
393
+     * @param int $item_id
394
+     * @since       1.0.0
395
+     * @return      string
396
+     */
397
+    public static function generate_item_markup( $item_id ) {
398
+        $item = get_post( $item_id );
399
+
400
+        if ( ! empty( $item ) ) {
401
+            $link = get_edit_post_link( $item );
402
+            $name = esc_html( get_the_title( $item ) );
403
+            return wpinv_current_user_can_manage_invoicing() ? "<a href='" . ( $link ? esc_url( $link ) : '#' ) . "'>$name</a>" : $name;
404
+        } else {
405
+            return sprintf( __( 'Item #%s', 'invoicing' ), $item_id );
406
+        }
407
+
408
+    }
409
+
410
+    /**
411
+     * Retrieve the current page number
412
+     *
413
+     * @return      int
414
+     */
415
+    public function get_paged() {
416
+        return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
417
+    }
418
+
419
+    /**
420
+     * Setup the final data for the table
421
+     *
422
+     */
423
+    public function prepare_items() {
424
+
425
+        $columns  = $this->get_columns();
426
+        $hidden   = array();
427
+        $sortable = $this->get_sortable_columns();
428
+
429
+        $this->_column_headers = array( $columns, $hidden, $sortable );
430
+
431
+        $this->set_pagination_args(
432
+            array(
433
+                'total_items' => $this->current_total_count,
434
+                'per_page'    => $this->per_page,
435
+                'total_pages' => ceil( $this->current_total_count / $this->per_page ),
436
+            )
437
+        );
438
+    }
439
+
440
+    /**
441
+     * Table columns
442
+     *
443
+     * @return array
444
+     */
445
+    public function get_columns() {
446
+        $columns = array(
447
+            'cb'           => '<input type="checkbox" />',
448
+            'subscription' => __( 'Subscription', 'invoicing' ),
449
+            'start_date'   => __( 'Start Date', 'invoicing' ),
450
+            'renewal_date' => __( 'Next Payment', 'invoicing' ),
451
+            'renewals'     => __( 'Payments', 'invoicing' ),
452
+            'item'         => __( 'Items', 'invoicing' ),
453
+            'status'       => __( 'Status', 'invoicing' ),
454
+        );
455
+
456
+        return apply_filters( 'manage_getpaid_subscriptions_table_columns', $columns );
457
+    }
458
+
459
+    /**
460
+     * Sortable table columns.
461
+     *
462
+     * @return array
463
+     */
464
+    public function get_sortable_columns() {
465
+        $sortable = array(
466
+            'subscription' => array( 'id', true ),
467
+            'start_date'   => array( 'created', true ),
468
+            'renewal_date' => array( 'expiration', true ),
469
+            'renewals'     => array( 'bill_times', true ),
470
+            'item'         => array( 'product_id', true ),
471
+            'status'       => array( 'status', true ),
472
+        );
473
+
474
+        return apply_filters( 'manage_getpaid_subscriptions_sortable_table_columns', $sortable );
475
+    }
476
+
477
+    /**
478
+     * Whether the table has items to display or not
479
+     *
480
+     * @return bool
481
+     */
482
+    public function has_items() {
483
+        return ! empty( $this->current_total_count );
484
+    }
485
+
486
+    /**
487
+     * Processes bulk actions.
488
+     *
489
+     */
490
+    public function process_bulk_action() {
491
+
492
+    }
493 493
 
494 494
 }
Please login to merge, or discard this patch.