Initial Commit
This commit is contained in:
521
inc/list-tables/class-broadcast-list-table.php
Normal file
521
inc/list-tables/class-broadcast-list-table.php
Normal file
@ -0,0 +1,521 @@
|
||||
<?php
|
||||
/**
|
||||
* Broadcast List Table class.
|
||||
*
|
||||
* @package WP_Ultimo
|
||||
* @subpackage List_Table
|
||||
* @since 2.0.0
|
||||
*/
|
||||
|
||||
namespace WP_Ultimo\List_Tables;
|
||||
|
||||
// Exit if accessed directly
|
||||
defined('ABSPATH') || exit;
|
||||
|
||||
/**
|
||||
* Broadcast List Table class.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*/
|
||||
class Broadcast_List_Table extends Base_List_Table {
|
||||
|
||||
/**
|
||||
* Holds the query class for the object being listed.
|
||||
*
|
||||
* @since 2.0.0
|
||||
* @var string
|
||||
*/
|
||||
protected $query_class = '\\WP_Ultimo\\Database\\Broadcasts\\Broadcast_Query';
|
||||
|
||||
/**
|
||||
* Initializes the table.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*/
|
||||
public function __construct() {
|
||||
|
||||
parent::__construct(array(
|
||||
'singular' => __('Broadcast', 'wp-ultimo'), // singular name of the listed records
|
||||
'plural' => __('Broadcasts', 'wp-ultimo'), // plural name of the listed records
|
||||
'ajax' => true, // does this table support ajax?
|
||||
'add_new' => array(
|
||||
'url' => wu_get_form_url('add_new_broadcast_message'),
|
||||
'classes' => 'wubox',
|
||||
),
|
||||
));
|
||||
|
||||
} // end __construct;
|
||||
|
||||
/**
|
||||
* Overrides the checkbox column to disable the checkboxes on the email types.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*
|
||||
* @param \WP_Ultimo\Models\Broadcast $item The broadcast object.
|
||||
* @return string
|
||||
*/
|
||||
public function column_cb($item) {
|
||||
|
||||
if ($item->get_type() === 'broadcast_email') {
|
||||
|
||||
return '<input type="checkbox" disabled>';
|
||||
|
||||
} // end if;
|
||||
|
||||
return parent::column_cb($item);
|
||||
|
||||
} // end column_cb;
|
||||
|
||||
/**
|
||||
* Returns the markup for the type column.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*
|
||||
* @param \WP_Ultimo\Models\Broadcast $item The broadcast object.
|
||||
* @return string
|
||||
*/
|
||||
public function column_type($item) {
|
||||
|
||||
$type = $item->get_type();
|
||||
|
||||
$class = 'wu-bg-gray-200';
|
||||
|
||||
if ($type === 'broadcast_email') {
|
||||
|
||||
$label = __('Email', 'wp-ultimo');
|
||||
|
||||
} // end if;
|
||||
|
||||
if ($type === 'broadcast_notice') {
|
||||
|
||||
$status = $item->get_notice_type();
|
||||
|
||||
$label = __('Notice', 'wp-ultimo');
|
||||
|
||||
if ($status === 'info') {
|
||||
|
||||
$class = 'wu-bg-blue-200';
|
||||
|
||||
} elseif ($status === 'success') {
|
||||
|
||||
$class = 'wu-bg-green-200';
|
||||
|
||||
} elseif ($status === 'warning') {
|
||||
|
||||
$class = 'wu-bg-orange-200';
|
||||
|
||||
} elseif ($status === 'error') {
|
||||
|
||||
$class = 'wu-bg-red-200';
|
||||
|
||||
} // end if;
|
||||
|
||||
} // end if;
|
||||
|
||||
return "<span class='wu-py-1 wu-px-2 $class wu-rounded-sm wu-text-gray-700 wu-text-xs wu-font-mono'>{$label}</span>";
|
||||
|
||||
} // end column_type;
|
||||
/**
|
||||
* Displays the name of the broadcast.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*
|
||||
* @param \WP_Ultimo\Models\Broadcast $item The broadcast object.
|
||||
*/
|
||||
public function column_the_content($item): string {
|
||||
|
||||
$title = sprintf('<strong class="wu-block wu-text-gray-700">%s</strong>', $item->get_title()); // phpcs:ignore
|
||||
|
||||
$content = wp_trim_words(wp_strip_all_tags($item->get_content()), 7);
|
||||
|
||||
$url_atts = array(
|
||||
'id' => $item->get_id(),
|
||||
'slug' => $item->get_slug(),
|
||||
'model' => 'broadcast'
|
||||
);
|
||||
|
||||
$actions = array(
|
||||
'edit' => sprintf('<a href="%s">%s</a>', wu_network_admin_url('wp-ultimo-edit-broadcast', $url_atts), __('Edit', 'wp-ultimo')),
|
||||
'delete' => sprintf('<a title="%s" class="wubox" href="%s">%s</a>', __('Delete', 'wp-ultimo'), wu_get_form_url('delete_modal', $url_atts), __('Delete', 'wp-ultimo')),
|
||||
);
|
||||
|
||||
return $title . $content . $this->row_actions($actions);
|
||||
|
||||
} // end column_the_content;
|
||||
|
||||
/**
|
||||
* Displays the target customers of the broadcast.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*
|
||||
* @param \WP_Ultimo\Models\Broadcast $item The broadcast object.
|
||||
* @return string
|
||||
*/
|
||||
public function column_target_customers($item) {
|
||||
|
||||
$targets = wu_get_broadcast_targets($item->get_id(), 'customers');
|
||||
|
||||
$targets = array_filter(array_map('wu_get_customer', $targets));
|
||||
|
||||
$targets_count = count($targets);
|
||||
|
||||
$html = '<div class="wu-p-2 wu-mr-1 wu-flex wu-rounded wu-items-center wu-border wu-border-solid wu-border-gray-300 wu-bg-gray-100 wu-relative wu-overflow-hidden">';
|
||||
|
||||
switch ($targets_count) {
|
||||
case 0:
|
||||
$not_found = __('No customer found', 'wp-ultimo');
|
||||
|
||||
return "<div class='wu-p-2 wu-mr-1 wu-flex wu-rounded wu-items-center wu-border wu-border-solid wu-border-gray-300 wu-bg-gray-100 wu-relative wu-overflow-hidden'>
|
||||
<span class='dashicons dashicons-wu-block wu-text-gray-600 wu-px-1 wu-pr-3'> </span>
|
||||
<div class=''>
|
||||
<span class='wu-block wu-py-3 wu-text-gray-600 wu-text-2xs wu-font-bold wu-uppercase'>{$not_found}</span>
|
||||
</div>
|
||||
</div>";
|
||||
|
||||
break;
|
||||
case 1:
|
||||
$customer = array_pop($targets);
|
||||
|
||||
$url_atts = array(
|
||||
'id' => $customer->get_id(),
|
||||
);
|
||||
|
||||
$customer_link = wu_network_admin_url('wp-ultimo-edit-customer', $url_atts);
|
||||
|
||||
$avatar = get_avatar($customer->get_user_id(), 32, 'identicon', '', array(
|
||||
'force_display' => true,
|
||||
'class' => 'wu-rounded-full wu-border-solid wu-border-1 wu-border-white hover:wu-border-gray-400',
|
||||
));
|
||||
|
||||
$display_name = $customer->get_display_name();
|
||||
|
||||
$id = $customer->get_id();
|
||||
|
||||
$email = $customer->get_email_address();
|
||||
|
||||
$html = "<a href='{$customer_link}' class='wu-p-2 wu-flex wu-flex-grow wu-bg-gray-100 wu-rounded wu-items-center wu-border wu-border-solid wu-border-gray-300'>
|
||||
{$avatar}
|
||||
<div class='wu-pl-2'>
|
||||
<strong class='wu-block'>{$display_name} <small class='wu-font-normal'>(#{$id})</small></strong>
|
||||
<small>{$email}</small>
|
||||
</div>
|
||||
</a>";
|
||||
|
||||
return $html;
|
||||
break;
|
||||
default:
|
||||
foreach ($targets as $key => $target) {
|
||||
|
||||
$customer = $target;
|
||||
|
||||
$tooltip_name = $customer->get_display_name();
|
||||
|
||||
$email = $customer->get_email_address();
|
||||
|
||||
$avatar = get_avatar($email, 32, 'identicon', '', array(
|
||||
'class' => 'wu-rounded-full wu-border-solid wu-border-1 wu-border-white hover:wu-border-gray-400',
|
||||
));
|
||||
|
||||
$url_atts = array(
|
||||
'id' => $customer->get_id(),
|
||||
);
|
||||
|
||||
$customer_link = wu_network_admin_url('wp-ultimo-edit-customer', $url_atts);
|
||||
|
||||
$html .= "<div class='wu-flex wu--mr-4'><a role='tooltip' aria-label='{$tooltip_name}' href='{$customer_link}'>{$avatar}</a></div>";
|
||||
|
||||
} // end foreach;
|
||||
|
||||
if ($targets_count < 7) {
|
||||
|
||||
$modal_atts = array(
|
||||
'action' => 'wu_modal_targets_display',
|
||||
'object_id' => $item->get_id(),
|
||||
'width' => '400',
|
||||
'height' => '360',
|
||||
'target_type' => 'customers',
|
||||
);
|
||||
|
||||
$html .= sprintf('<div class="wu-inline-block wu-mr-2">
|
||||
<a href="%s" title="%s" class="wubox"><span class="wu-ml-6 wu-uppercase wu-text-xs wu-font-bold"> %s %s</span></a>
|
||||
</div>', wu_get_form_url('view_broadcast_targets', $modal_atts), __('Targets', 'wp-ultimo'), $targets_count, __('Targets', 'wp-ultimo'));
|
||||
|
||||
$html .= '</div>';
|
||||
|
||||
return $html;
|
||||
|
||||
} // end if;
|
||||
|
||||
$modal_atts = array(
|
||||
'action' => 'wu_modal_targets_display',
|
||||
'object_id' => $item->get_id(),
|
||||
'width' => '400',
|
||||
'height' => '360',
|
||||
'target_type' => 'customers',
|
||||
);
|
||||
|
||||
$html .= sprintf('<div class="wu-inline-block wu-ml-4">
|
||||
<a href="%s" title="%s" class="wubox"><span class="wu-pl-2 wu-uppercase wu-text-xs wu-font-bold"> %s %s</span></a>
|
||||
</div>', wu_get_form_url('view_broadcast_targets', $modal_atts), __('Targets', 'wp-ultimo'), $targets_count, __('Targets', 'wp-ultimo'));
|
||||
|
||||
$html .= '</div>';
|
||||
|
||||
return $html;
|
||||
|
||||
break;
|
||||
|
||||
} // end switch;
|
||||
|
||||
} // end column_target_customers;
|
||||
|
||||
/**
|
||||
* Displays the target products of the broadcast.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*
|
||||
* @param \WP_Ultimo\Models\Broadcast $item The broadcast object.
|
||||
* @return string
|
||||
*/
|
||||
public function column_target_products($item) {
|
||||
|
||||
$targets = wu_get_broadcast_targets($item->get_id(), 'products');
|
||||
|
||||
$html = '';
|
||||
|
||||
$products = array_filter(array_map('wu_get_product', $targets));
|
||||
|
||||
$product_count = count($products);
|
||||
|
||||
switch ($product_count) {
|
||||
case 0:
|
||||
$not_found = __('No product found', 'wp-ultimo');
|
||||
|
||||
$html = "<div class='wu-p-2 wu-mr-1 wu-flex wu-rounded wu-items-center wu-border wu-border-solid wu-border-gray-300 wu-bg-gray-100 wu-relative wu-overflow-hidden'>
|
||||
<span class='dashicons dashicons-wu-block wu-text-gray-600 wu-px-1 wu-pr-3'> </span>
|
||||
<div class=''>
|
||||
<span class='wu-block wu-py-3 wu-text-gray-600 wu-text-2xs wu-font-bold wu-uppercase'>{$not_found}</span>
|
||||
</div>
|
||||
</div>";
|
||||
break;
|
||||
case 1:
|
||||
$product = array_pop($products);
|
||||
|
||||
$image = $product->get_featured_image('thumbnail');
|
||||
|
||||
if ($image) {
|
||||
|
||||
$image = sprintf('<img class="wu-w-7 wu-h-7 wu-bg-gray-200 wu-rounded-full wu-text-gray-600 wu-flex wu-items-center wu-justify-center wu-border-solid wu-border-1 wu-border-white hover:wu-border-gray-400" src="%s">', esc_attr($image));
|
||||
|
||||
} else {
|
||||
|
||||
$image = '<div class="wu-w-7 wu-h-7 wu-bg-gray-200 wu-rounded-full wu-text-gray-600 wu-flex wu-items-center wu-justify-center wu-border-solid wu-border-1 wu-border-white">
|
||||
<span class="dashicons-wu-image"></span>
|
||||
</div>';
|
||||
|
||||
} // end if;
|
||||
|
||||
$name = $product->get_name();
|
||||
|
||||
$id = $product->get_id();
|
||||
|
||||
$plan_customers = wu_get_membership_customers($product->get_id());
|
||||
|
||||
$customer_count = (int) 0;
|
||||
|
||||
if ($plan_customers) {
|
||||
|
||||
$customer_count = count($plan_customers);
|
||||
|
||||
} // end if;
|
||||
|
||||
$description = sprintf(__('%s customer(s) targeted.', 'wp-ultimo'), $customer_count);
|
||||
|
||||
$url_atts = array(
|
||||
'id' => $product->get_id(),
|
||||
);
|
||||
|
||||
$product_link = wu_network_admin_url('wp-ultimo-edit-product', $url_atts);
|
||||
|
||||
$html = "<a href='{$product_link}' class='wu-p-2 wu-flex wu-flex-grow wu-bg-gray-100 wu-rounded wu-items-center wu-border wu-border-solid wu-border-gray-300'>
|
||||
{$image}
|
||||
<div class='wu-pl-2'>
|
||||
<strong class='wu-block'>{$name} <small class='wu-font-normal'>(#{$id})</small></strong>
|
||||
<small>{$description}</small>
|
||||
</div>
|
||||
</a>";
|
||||
break;
|
||||
|
||||
} // end switch;
|
||||
|
||||
if ($html) {
|
||||
|
||||
return $html;
|
||||
|
||||
} // end if;
|
||||
|
||||
$html = '<div class="wu-p-2 wu-mr-1 wu-flex wu-rounded wu-items-center wu-border wu-border-solid wu-border-gray-300 wu-bg-gray-100 wu-relative wu-overflow-hidden">';
|
||||
|
||||
foreach ($products as $product) {
|
||||
|
||||
$url_atts = array(
|
||||
'id' => $product->get_id(),
|
||||
);
|
||||
|
||||
$product_link = wu_network_admin_url('wp-ultimo-edit-product', $url_atts);
|
||||
|
||||
$product_name = $product->get_name();
|
||||
|
||||
$image = $product->get_featured_image('thumbnail');
|
||||
|
||||
if ($image) {
|
||||
|
||||
$image = sprintf('<img class="wu-w-7 wu-h-7 wu-bg-gray-200 wu-rounded-full wu-text-gray-600 wu-flex wu-items-center wu-justify-center wu-border-solid wu-border-1 wu-border-white hover:wu-border-gray-400" src="%s">', esc_attr($image));
|
||||
|
||||
} else {
|
||||
|
||||
$image = '<div class="wu-w-7 wu-h-7 wu-bg-gray-200 wu-rounded-full wu-text-gray-600 wu-flex wu-items-center wu-justify-center wu-border-solid wu-border-1 wu-border-white hover:wu-border-gray-400">
|
||||
<span class="dashicons-wu-image wu-p-1 wu-rounded-full"></span>
|
||||
</div>';
|
||||
|
||||
} // end if;
|
||||
|
||||
$html .= "<div class='wu-flex wu--mr-4'><a role='tooltip' aria-label='{$product_name}' href='{$product_link}'>{$image}</a></div>";
|
||||
|
||||
} // end foreach;
|
||||
|
||||
if ($product_count > 1 && $product_count < 5) {
|
||||
|
||||
$modal_atts = array(
|
||||
'action' => 'wu_modal_targets_display',
|
||||
'object_id' => $item->get_id(),
|
||||
'width' => '400',
|
||||
'height' => '360',
|
||||
'target_type' => 'products',
|
||||
);
|
||||
|
||||
$html .= sprintf('<div class="wu-inline-block wu-ml-4">
|
||||
<a href="%s" title="%s" class="wubox"><span class="wu-pl-2 wu-uppercase wu-text-xs wu-font-bold"> %s %s</span></a></div>', wu_get_form_url('view_broadcast_targets', $modal_atts), __('Targets', 'wp-ultimo'), $product_count, __('Targets', 'wp-ultimo'));
|
||||
|
||||
$html .= '</div>';
|
||||
|
||||
return $html;
|
||||
|
||||
} // end if;
|
||||
|
||||
$modal_atts = array(
|
||||
'action' => 'wu_modal_targets_display',
|
||||
'object_id' => $item->get_id(),
|
||||
'width' => '400',
|
||||
'height' => '360',
|
||||
'target_type' => 'products',
|
||||
);
|
||||
|
||||
$html .= sprintf('<div class="wu-inline-block wu-ml-4"><a href="%s" title="%s" class="wubox"><span class="wu-pl-2 wu-uppercase wu-text-xs wu-font-bold"> %s %s</span></a></div>', wu_get_form_url('view_broadcast_targets', $modal_atts), __('Targets', 'wp-ultimo'), $product_count, __('Targets', 'wp-ultimo'));
|
||||
|
||||
$html .= '</div>';
|
||||
|
||||
return $html;
|
||||
|
||||
} // end column_target_products;
|
||||
|
||||
/**
|
||||
* Returns the list of columns for this particular List Table.
|
||||
*
|
||||
* @since 2.0.0
|
||||
* @return array
|
||||
*/
|
||||
public function get_columns() {
|
||||
|
||||
$columns = array(
|
||||
'cb' => '<input type="checkbox" />',
|
||||
'type' => __('Type', 'wp-ultimo'),
|
||||
'the_content' => __('Content', 'wp-ultimo'),
|
||||
'target_customers' => __('Target Customers', 'wp-ultimo'),
|
||||
'target_products' => __('Target Products', 'wp-ultimo'),
|
||||
'date_created' => __('Date', 'wp-ultimo'),
|
||||
'id' => __('ID', 'wp-ultimo'),
|
||||
);
|
||||
|
||||
return $columns;
|
||||
|
||||
} // end get_columns;
|
||||
/**
|
||||
* Returns the filters for this page.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*/
|
||||
public function get_filters(): array {
|
||||
|
||||
return array(
|
||||
'filters' => array(
|
||||
'type' => array(
|
||||
'label' => __('Broadcast Type', 'wp-ultimo'),
|
||||
'options' => array(
|
||||
'broadcast_notice' => __('Email', 'wp-ultimo'),
|
||||
'broadcast_email' => __('Notices', 'wp-ultimo'),
|
||||
),
|
||||
),
|
||||
'status' => array(
|
||||
'label' => __('Notice Type', 'wp-ultimo'),
|
||||
'options' => array(
|
||||
'info' => __('Info - Blue', 'wp-ultimo'),
|
||||
'success' => __('Success - Green', 'wp-ultimo'),
|
||||
'warning' => __('Warning - Yellow', 'wp-ultimo'),
|
||||
'error' => __('Error - Red', 'wp-ultimo'),
|
||||
),
|
||||
),
|
||||
),
|
||||
'date_filters' => array(
|
||||
'date_created' => array(
|
||||
'label' => __('Date', 'wp-ultimo'),
|
||||
'options' => $this->get_default_date_filter_options(),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
} // end get_filters;
|
||||
|
||||
/**
|
||||
* Registers the necessary scripts and styles for this admin page.
|
||||
*
|
||||
* @since 2.0.0
|
||||
* @return void
|
||||
*/
|
||||
public function register_scripts() {
|
||||
|
||||
parent::register_scripts();
|
||||
|
||||
} // end register_scripts;
|
||||
|
||||
/**
|
||||
* Returns the pre-selected filters on the filter bar.
|
||||
*
|
||||
* @since 2.0.0
|
||||
* @return array
|
||||
*/
|
||||
public function get_views() {
|
||||
|
||||
return array(
|
||||
'all' => array(
|
||||
'field' => 'status',
|
||||
'url' => add_query_arg('type', 'all'),
|
||||
'label' => __('All Broadcasts', 'wp-ultimo'),
|
||||
'count' => 0,
|
||||
),
|
||||
'broadcast_email' => array(
|
||||
'field' => 'type',
|
||||
'url' => add_query_arg('type', 'broadcast_email'),
|
||||
'label' => __('Emails', 'wp-ultimo'),
|
||||
'count' => 0,
|
||||
),
|
||||
'broadcast_notice' => array(
|
||||
'field' => 'type',
|
||||
'url' => add_query_arg('type', 'broadcast_notice'),
|
||||
'label' => __('Notices', 'wp-ultimo'),
|
||||
'count' => 0,
|
||||
),
|
||||
);
|
||||
|
||||
} // end get_views;
|
||||
|
||||
} // end class Broadcast_List_Table;
|
Reference in New Issue
Block a user