<?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;