Completed
Branch CASC/base (ab9d3e)
by
unknown
09:28 queued 49s
created
admin_pages/events/templates/event_preview_deletion.template.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@
 block discarded – undo
1 1
 <h2><?php esc_html_e('Please Confirm You Want to Permanently Delete the Following Data', 'event_espresso'); ?></h2>
2 2
 A bunch of events
3
-<form action="<?php echo $form_url;?>" method="POST">
3
+<form action="<?php echo $form_url; ?>" method="POST">
4 4
     <input type="submit" value="<?php echo esc_attr(esc_html__('Confirm', 'event_espresso')); ?>">
5 5
 </form>
Please login to merge, or discard this patch.
admin_pages/events/Events_Admin_Page.core.php 3 patches
Doc Comments   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -2090,7 +2090,6 @@  discard block
 block discarded – undo
2090 2090
      * _delete_event
2091 2091
      *
2092 2092
      * @access protected
2093
-     * @param bool $redirect_after
2094 2093
      */
2095 2094
     protected function _delete_event()
2096 2095
     {
@@ -2176,7 +2175,7 @@  discard block
 block discarded – undo
2176 2175
      * message template groups.
2177 2176
      * @since $VID:$
2178 2177
      * @param $event_ids
2179
-     * @return int
2178
+     * @return boolean
2180 2179
      * @throws EE_Error
2181 2180
      * @throws InvalidArgumentException
2182 2181
      * @throws ReflectionException
Please login to merge, or discard this patch.
Spacing   +67 added lines, -67 removed lines patch added patch discarded remove patch
@@ -577,11 +577,11 @@  discard block
 block discarded – undo
577 577
     {
578 578
         wp_register_style(
579 579
             'events-admin-css',
580
-            EVENTS_ASSETS_URL . 'events-admin-page.css',
580
+            EVENTS_ASSETS_URL.'events-admin-page.css',
581 581
             array(),
582 582
             EVENT_ESPRESSO_VERSION
583 583
         );
584
-        wp_register_style('ee-cat-admin', EVENTS_ASSETS_URL . 'ee-cat-admin.css', array(), EVENT_ESPRESSO_VERSION);
584
+        wp_register_style('ee-cat-admin', EVENTS_ASSETS_URL.'ee-cat-admin.css', array(), EVENT_ESPRESSO_VERSION);
585 585
         wp_enqueue_style('events-admin-css');
586 586
         wp_enqueue_style('ee-cat-admin');
587 587
         // todo note: we also need to load_scripts_styles per view (i.e. default/view_report/event_details
@@ -589,7 +589,7 @@  discard block
 block discarded – undo
589 589
         // scripts
590 590
         wp_register_script(
591 591
             'event_editor_js',
592
-            EVENTS_ASSETS_URL . 'event_editor.js',
592
+            EVENTS_ASSETS_URL.'event_editor.js',
593 593
             array('ee_admin_js', 'jquery-ui-slider', 'jquery-ui-timepicker-addon'),
594 594
             EVENT_ESPRESSO_VERSION,
595 595
             true
@@ -615,7 +615,7 @@  discard block
 block discarded – undo
615 615
         wp_enqueue_style('espresso-ui-theme');
616 616
         wp_register_style(
617 617
             'event-editor-css',
618
-            EVENTS_ASSETS_URL . 'event-editor.css',
618
+            EVENTS_ASSETS_URL.'event-editor.css',
619 619
             array('ee-admin-css'),
620 620
             EVENT_ESPRESSO_VERSION
621 621
         );
@@ -623,7 +623,7 @@  discard block
 block discarded – undo
623 623
         // scripts
624 624
         wp_register_script(
625 625
             'event-datetime-metabox',
626
-            EVENTS_ASSETS_URL . 'event-datetime-metabox.js',
626
+            EVENTS_ASSETS_URL.'event-datetime-metabox.js',
627 627
             array('event_editor_js', 'ee-datepicker'),
628 628
             EVENT_ESPRESSO_VERSION
629 629
         );
@@ -692,7 +692,7 @@  discard block
 block discarded – undo
692 692
     public function verify_event_edit($event = null, $req_type = '')
693 693
     {
694 694
         // don't need to do this when processing
695
-        if (! empty($req_type)) {
695
+        if ( ! empty($req_type)) {
696 696
             return;
697 697
         }
698 698
         // no event?
@@ -701,7 +701,7 @@  discard block
 block discarded – undo
701 701
             $event = $this->_cpt_model_obj;
702 702
         }
703 703
         // STILL no event?
704
-        if (! $event instanceof EE_Event) {
704
+        if ( ! $event instanceof EE_Event) {
705 705
             return;
706 706
         }
707 707
         $orig_status = $event->status();
@@ -739,7 +739,7 @@  discard block
 block discarded – undo
739 739
             );
740 740
         }
741 741
         // now we need to determine if the event has any tickets on sale.  If not then we dont' show the error
742
-        if (! $event->tickets_on_sale()) {
742
+        if ( ! $event->tickets_on_sale()) {
743 743
             return;
744 744
         }
745 745
         // made it here so show warning
@@ -784,7 +784,7 @@  discard block
 block discarded – undo
784 784
     {
785 785
         $has_timezone_string = get_option('timezone_string');
786 786
         // only nag them about setting their timezone if it's their first event, and they haven't already done it
787
-        if (! $has_timezone_string && ! EEM_Event::instance()->exists(array())) {
787
+        if ( ! $has_timezone_string && ! EEM_Event::instance()->exists(array())) {
788 788
             EE_Error::add_attention(
789 789
                 sprintf(
790 790
                     __(
@@ -868,31 +868,31 @@  discard block
 block discarded – undo
868 868
         $items = apply_filters('FHEE__Events_Admin_Page___event_legend_items__items', $items);
869 869
         $statuses = array(
870 870
             'sold_out_status'  => array(
871
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::sold_out,
871
+                'class' => 'ee-status-legend ee-status-legend-'.EE_Datetime::sold_out,
872 872
                 'desc'  => EEH_Template::pretty_status(EE_Datetime::sold_out, false, 'sentence'),
873 873
             ),
874 874
             'active_status'    => array(
875
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::active,
875
+                'class' => 'ee-status-legend ee-status-legend-'.EE_Datetime::active,
876 876
                 'desc'  => EEH_Template::pretty_status(EE_Datetime::active, false, 'sentence'),
877 877
             ),
878 878
             'upcoming_status'  => array(
879
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::upcoming,
879
+                'class' => 'ee-status-legend ee-status-legend-'.EE_Datetime::upcoming,
880 880
                 'desc'  => EEH_Template::pretty_status(EE_Datetime::upcoming, false, 'sentence'),
881 881
             ),
882 882
             'postponed_status' => array(
883
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::postponed,
883
+                'class' => 'ee-status-legend ee-status-legend-'.EE_Datetime::postponed,
884 884
                 'desc'  => EEH_Template::pretty_status(EE_Datetime::postponed, false, 'sentence'),
885 885
             ),
886 886
             'cancelled_status' => array(
887
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::cancelled,
887
+                'class' => 'ee-status-legend ee-status-legend-'.EE_Datetime::cancelled,
888 888
                 'desc'  => EEH_Template::pretty_status(EE_Datetime::cancelled, false, 'sentence'),
889 889
             ),
890 890
             'expired_status'   => array(
891
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::expired,
891
+                'class' => 'ee-status-legend ee-status-legend-'.EE_Datetime::expired,
892 892
                 'desc'  => EEH_Template::pretty_status(EE_Datetime::expired, false, 'sentence'),
893 893
             ),
894 894
             'inactive_status'  => array(
895
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::inactive,
895
+                'class' => 'ee-status-legend ee-status-legend-'.EE_Datetime::inactive,
896 896
                 'desc'  => EEH_Template::pretty_status(EE_Datetime::inactive, false, 'sentence'),
897 897
             ),
898 898
         );
@@ -906,7 +906,7 @@  discard block
 block discarded – undo
906 906
      */
907 907
     private function _event_model()
908 908
     {
909
-        if (! $this->_event_model instanceof EEM_Event) {
909
+        if ( ! $this->_event_model instanceof EEM_Event) {
910 910
             $this->_event_model = EE_Registry::instance()->load_model('Event');
911 911
         }
912 912
         return $this->_event_model;
@@ -926,7 +926,7 @@  discard block
 block discarded – undo
926 926
     public function extra_permalink_field_buttons($return, $id, $new_title, $new_slug)
927 927
     {
928 928
         // make sure this is only when editing
929
-        if (! empty($id)) {
929
+        if ( ! empty($id)) {
930 930
             $post = get_post($id);
931 931
             $return .= '<a class="button button-small" onclick="prompt(\'Shortcode:\', jQuery(\'#shortcode\').val()); return false;" href="#"  tabindex="-1">'
932 932
                        . esc_html__('Shortcode', 'event_espresso')
@@ -960,7 +960,7 @@  discard block
 block discarded – undo
960 960
                     'button'
961 961
                 );
962 962
         $this->_template_args['after_list_table']['legend'] = $this->_display_legend($this->_event_legend_items());
963
-        $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
963
+        $this->_admin_page_title .= ' '.$this->get_action_link_or_button(
964 964
             'create_new',
965 965
             'add',
966 966
             array(),
@@ -1100,7 +1100,7 @@  discard block
 block discarded – undo
1100 1100
      */
1101 1101
     protected function _default_venue_update(\EE_Event $evtobj, $data)
1102 1102
     {
1103
-        require_once(EE_MODELS . 'EEM_Venue.model.php');
1103
+        require_once(EE_MODELS.'EEM_Venue.model.php');
1104 1104
         $venue_model = EE_Registry::instance()->load_model('Venue');
1105 1105
         $rows_affected = null;
1106 1106
         $venue_id = ! empty($data['venue_id']) ? $data['venue_id'] : null;
@@ -1131,7 +1131,7 @@  discard block
 block discarded – undo
1131 1131
             'status'              => 'publish',
1132 1132
         );
1133 1133
         // if we've got the venue_id then we're just updating the existing venue so let's do that and then get out.
1134
-        if (! empty($venue_id)) {
1134
+        if ( ! empty($venue_id)) {
1135 1135
             $update_where = array($venue_model->primary_key_name() => $venue_id);
1136 1136
             $rows_affected = $venue_model->update($venue_array, array($update_where));
1137 1137
             // we've gotta make sure that the venue is always attached to a revision.. add_relation_to should take care of making sure that the relation is already present.
@@ -1173,7 +1173,7 @@  discard block
 block discarded – undo
1173 1173
                 'DTT_order'     => $row,
1174 1174
             );
1175 1175
             // if we have an id then let's get existing object first and then set the new values.  Otherwise we instantiate a new object for save.
1176
-            if (! empty($dtt['DTT_ID'])) {
1176
+            if ( ! empty($dtt['DTT_ID'])) {
1177 1177
                 $DTM = EE_Registry::instance()
1178 1178
                                   ->load_model('Datetime', array($evtobj->get_timezone()))
1179 1179
                                   ->get_one_by_ID($dtt['DTT_ID']);
@@ -1183,7 +1183,7 @@  discard block
 block discarded – undo
1183 1183
                     $DTM->set($field, $value);
1184 1184
                 }
1185 1185
                 // make sure the $dtt_id here is saved just in case after the add_relation_to() the autosave replaces it.  We need to do this so we dont' TRASH the parent DTT.
1186
-                $saved_dtts[ $DTM->ID() ] = $DTM;
1186
+                $saved_dtts[$DTM->ID()] = $DTM;
1187 1187
             } else {
1188 1188
                 $DTM = EE_Registry::instance()->load_class(
1189 1189
                     'Datetime',
@@ -1216,14 +1216,14 @@  discard block
 block discarded – undo
1216 1216
         foreach ($data['edit_tickets'] as $row => $tkt) {
1217 1217
             $incoming_date_formats = array('Y-m-d', 'h:i a');
1218 1218
             $update_prices = false;
1219
-            $ticket_price = isset($data['edit_prices'][ $row ][1]['PRC_amount'])
1220
-                ? $data['edit_prices'][ $row ][1]['PRC_amount'] : 0;
1219
+            $ticket_price = isset($data['edit_prices'][$row][1]['PRC_amount'])
1220
+                ? $data['edit_prices'][$row][1]['PRC_amount'] : 0;
1221 1221
             // trim inputs to ensure any excess whitespace is removed.
1222 1222
             $tkt = array_map('trim', $tkt);
1223 1223
             if (empty($tkt['TKT_start_date'])) {
1224 1224
                 // let's use now in the set timezone.
1225 1225
                 $now = new DateTime('now', new DateTimeZone($evtobj->get_timezone()));
1226
-                $tkt['TKT_start_date'] = $now->format($incoming_date_formats[0] . ' ' . $incoming_date_formats[1]);
1226
+                $tkt['TKT_start_date'] = $now->format($incoming_date_formats[0].' '.$incoming_date_formats[1]);
1227 1227
             }
1228 1228
             if (empty($tkt['TKT_end_date'])) {
1229 1229
                 // use the start date of the first datetime
@@ -1258,7 +1258,7 @@  discard block
 block discarded – undo
1258 1258
             // if we have a TKT_ID then we need to get that existing TKT_obj and update it
1259 1259
             // we actually do our saves a head of doing any add_relations to because its entirely possible that this ticket didn't removed or added to any datetime in the session but DID have it's items modified.
1260 1260
             // keep in mind that if the TKT has been sold (and we have changed pricing information), then we won't be updating the tkt but instead a new tkt will be created and the old one archived.
1261
-            if (! empty($tkt['TKT_ID'])) {
1261
+            if ( ! empty($tkt['TKT_ID'])) {
1262 1262
                 $TKT = EE_Registry::instance()
1263 1263
                                   ->load_model('Ticket', array($evtobj->get_timezone()))
1264 1264
                                   ->get_one_by_ID($tkt['TKT_ID']);
@@ -1293,7 +1293,7 @@  discard block
 block discarded – undo
1293 1293
                         $TKT->set('TKT_deleted', 1);
1294 1294
                         $TKT->save();
1295 1295
                         // make sure this ticket is still recorded in our saved_tkts so we don't run it through the regular trash routine.
1296
-                        $saved_tickets[ $TKT->ID() ] = $TKT;
1296
+                        $saved_tickets[$TKT->ID()] = $TKT;
1297 1297
                         // create new ticket that's a copy of the existing except a new id of course (and not archived) AND has the new TKT_price associated with it.
1298 1298
                         $TKT = clone $TKT;
1299 1299
                         $TKT->set('TKT_ID', 0);
@@ -1338,9 +1338,9 @@  discard block
 block discarded – undo
1338 1338
             }
1339 1339
             // initially let's add the ticket to the dtt
1340 1340
             $saved_dtt->_add_relation_to($TKT, 'Ticket');
1341
-            $saved_tickets[ $TKT->ID() ] = $TKT;
1341
+            $saved_tickets[$TKT->ID()] = $TKT;
1342 1342
             // add prices to ticket
1343
-            $this->_add_prices_to_ticket($data['edit_prices'][ $row ], $TKT, $update_prices);
1343
+            $this->_add_prices_to_ticket($data['edit_prices'][$row], $TKT, $update_prices);
1344 1344
         }
1345 1345
         // however now we need to handle permanently deleting tickets via the ui.  Keep in mind that the ui does not allow deleting/archiving tickets that have ticket sold.  However, it does allow for deleting tickets that have no tickets sold, in which case we want to get rid of permanently because there is no need to save in db.
1346 1346
         $old_tickets = isset($old_tickets[0]) && $old_tickets[0] == '' ? array() : $old_tickets;
@@ -1497,7 +1497,7 @@  discard block
 block discarded – undo
1497 1497
         $publish_box_extra_args['event_editor_overview_add'] = ob_get_clean();
1498 1498
         // load template
1499 1499
         EEH_Template::display_template(
1500
-            EVENTS_TEMPLATE_PATH . 'event_publish_box_extras.template.php',
1500
+            EVENTS_TEMPLATE_PATH.'event_publish_box_extras.template.php',
1501 1501
             $publish_box_extra_args
1502 1502
         );
1503 1503
     }
@@ -1589,7 +1589,7 @@  discard block
 block discarded – undo
1589 1589
                     'default_where_conditions' => 'none',
1590 1590
                 )
1591 1591
             );
1592
-            if (! empty($related_tickets)) {
1592
+            if ( ! empty($related_tickets)) {
1593 1593
                 $template_args['total_ticket_rows'] = count($related_tickets);
1594 1594
                 $row = 0;
1595 1595
                 foreach ($related_tickets as $ticket) {
@@ -1623,7 +1623,7 @@  discard block
 block discarded – undo
1623 1623
         );
1624 1624
         $template = apply_filters(
1625 1625
             'FHEE__Events_Admin_Page__ticket_metabox__template',
1626
-            EVENTS_TEMPLATE_PATH . 'event_tickets_metabox_main.template.php'
1626
+            EVENTS_TEMPLATE_PATH.'event_tickets_metabox_main.template.php'
1627 1627
         );
1628 1628
         EEH_Template::display_template($template, $template_args);
1629 1629
     }
@@ -1641,7 +1641,7 @@  discard block
 block discarded – undo
1641 1641
     private function _get_ticket_row($ticket, $skeleton = false, $row = 0)
1642 1642
     {
1643 1643
         $template_args = array(
1644
-            'tkt_status_class'    => ' tkt-status-' . $ticket->ticket_status(),
1644
+            'tkt_status_class'    => ' tkt-status-'.$ticket->ticket_status(),
1645 1645
             'tkt_archive_class'   => $ticket->ticket_status() === EE_Ticket::archived && ! $skeleton ? ' tkt-archived'
1646 1646
                 : '',
1647 1647
             'ticketrow'           => $skeleton ? 'TICKETNUM' : $row,
@@ -1653,10 +1653,10 @@  discard block
 block discarded – undo
1653 1653
             'TKT_qty'             => $ticket->get_pretty('TKT_qty', 'input'),
1654 1654
             'edit_ticketrow_name' => $skeleton ? 'TICKETNAMEATTR' : 'edit_tickets',
1655 1655
             'TKT_sold'            => $skeleton ? 0 : $ticket->get('TKT_sold'),
1656
-            'trash_icon'          => ($skeleton || (! empty($ticket) && ! $ticket->get('TKT_deleted')))
1657
-                                     && (! empty($ticket) && $ticket->get('TKT_sold') === 0)
1656
+            'trash_icon'          => ($skeleton || ( ! empty($ticket) && ! $ticket->get('TKT_deleted')))
1657
+                                     && ( ! empty($ticket) && $ticket->get('TKT_sold') === 0)
1658 1658
                 ? 'trash-icon dashicons dashicons-post-trash clickable' : 'ee-lock-icon',
1659
-            'disabled'            => $skeleton || (! empty($ticket) && ! $ticket->get('TKT_deleted')) ? ''
1659
+            'disabled'            => $skeleton || ( ! empty($ticket) && ! $ticket->get('TKT_deleted')) ? ''
1660 1660
                 : ' disabled=disabled',
1661 1661
         );
1662 1662
         $price = $ticket->ID() !== 0
@@ -1683,7 +1683,7 @@  discard block
 block discarded – undo
1683 1683
                     array('order_by' => array('DTT_EVT_start' => 'ASC'))
1684 1684
                 )
1685 1685
                 : null;
1686
-            if (! empty($earliest_dtt)) {
1686
+            if ( ! empty($earliest_dtt)) {
1687 1687
                 $template_args['TKT_end_date'] = $earliest_dtt->get_datetime('DTT_EVT_start', 'Y-m-d', 'h:i a');
1688 1688
             } else {
1689 1689
                 $template_args['TKT_end_date'] = date(
@@ -1695,7 +1695,7 @@  discard block
 block discarded – undo
1695 1695
         $template_args = array_merge($template_args, $price_args);
1696 1696
         $template = apply_filters(
1697 1697
             'FHEE__Events_Admin_Page__get_ticket_row__template',
1698
-            EVENTS_TEMPLATE_PATH . 'event_tickets_metabox_ticket_row.template.php',
1698
+            EVENTS_TEMPLATE_PATH.'event_tickets_metabox_ticket_row.template.php',
1699 1699
             $ticket
1700 1700
         );
1701 1701
         return EEH_Template::display_template($template, $template_args, true);
@@ -1749,7 +1749,7 @@  discard block
 block discarded – undo
1749 1749
             $default_reg_status_values
1750 1750
         );
1751 1751
         EEH_Template::display_template(
1752
-            EVENTS_TEMPLATE_PATH . 'event_registration_options.template.php',
1752
+            EVENTS_TEMPLATE_PATH.'event_registration_options.template.php',
1753 1753
             $template_args
1754 1754
         );
1755 1755
     }
@@ -1771,7 +1771,7 @@  discard block
 block discarded – undo
1771 1771
     {
1772 1772
         $EEME = $this->_event_model();
1773 1773
         $offset = ($current_page - 1) * $per_page;
1774
-        $limit = $count ? null : $offset . ',' . $per_page;
1774
+        $limit = $count ? null : $offset.','.$per_page;
1775 1775
         $orderby = isset($this->_req_data['orderby']) ? $this->_req_data['orderby'] : 'EVT_ID';
1776 1776
         $order = isset($this->_req_data['order']) ? $this->_req_data['order'] : "DESC";
1777 1777
         if (isset($this->_req_data['month_range'])) {
@@ -1800,7 +1800,7 @@  discard block
 block discarded – undo
1800 1800
         // categories?
1801 1801
         $category = isset($this->_req_data['EVT_CAT']) && $this->_req_data['EVT_CAT'] > 0
1802 1802
             ? $this->_req_data['EVT_CAT'] : null;
1803
-        if (! empty($category)) {
1803
+        if ( ! empty($category)) {
1804 1804
             $where['Term_Taxonomy.taxonomy'] = EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY;
1805 1805
             $where['Term_Taxonomy.term_id'] = $category;
1806 1806
         }
@@ -1808,7 +1808,7 @@  discard block
 block discarded – undo
1808 1808
         $start_formats = EEM_Datetime::instance()->get_formats_for('DTT_EVT_start');
1809 1809
         if (isset($this->_req_data['month_range']) && $this->_req_data['month_range'] != '') {
1810 1810
             $DateTime = new DateTime(
1811
-                $year_r . '-' . $month_r . '-01 00:00:00',
1811
+                $year_r.'-'.$month_r.'-01 00:00:00',
1812 1812
                 new DateTimeZone(EEM_Datetime::instance()->get_timezone())
1813 1813
             );
1814 1814
             $start = $DateTime->format(implode(' ', $start_formats));
@@ -1834,11 +1834,11 @@  discard block
 block discarded – undo
1834 1834
                             ->format(implode(' ', $start_formats));
1835 1835
             $where['Datetime.DTT_EVT_start'] = array('BETWEEN', array($start, $end));
1836 1836
         }
1837
-        if (! EE_Registry::instance()->CAP->current_user_can('ee_read_others_events', 'get_events')) {
1837
+        if ( ! EE_Registry::instance()->CAP->current_user_can('ee_read_others_events', 'get_events')) {
1838 1838
             $where['EVT_wp_user'] = get_current_user_id();
1839 1839
         } else {
1840
-            if (! isset($where['status'])) {
1841
-                if (! EE_Registry::instance()->CAP->current_user_can('ee_read_private_events', 'get_events')) {
1840
+            if ( ! isset($where['status'])) {
1841
+                if ( ! EE_Registry::instance()->CAP->current_user_can('ee_read_private_events', 'get_events')) {
1842 1842
                     $where['OR'] = array(
1843 1843
                         'status*restrict_private' => array('!=', 'private'),
1844 1844
                         'AND'                     => array(
@@ -1858,7 +1858,7 @@  discard block
 block discarded – undo
1858 1858
         }
1859 1859
         // search query handling
1860 1860
         if (isset($this->_req_data['s'])) {
1861
-            $search_string = '%' . $this->_req_data['s'] . '%';
1861
+            $search_string = '%'.$this->_req_data['s'].'%';
1862 1862
             $where['OR'] = array(
1863 1863
                 'EVT_name'       => array('LIKE', $search_string),
1864 1864
                 'EVT_desc'       => array('LIKE', $search_string),
@@ -1953,7 +1953,7 @@  discard block
 block discarded – undo
1953 1953
             // clean status
1954 1954
             $event_status = sanitize_key($event_status);
1955 1955
             // grab status
1956
-            if (! empty($event_status)) {
1956
+            if ( ! empty($event_status)) {
1957 1957
                 $success = $this->_change_event_status($EVT_ID, $event_status);
1958 1958
             } else {
1959 1959
                 $success = false;
@@ -1990,7 +1990,7 @@  discard block
 block discarded – undo
1990 1990
         // clean status
1991 1991
         $event_status = sanitize_key($event_status);
1992 1992
         // grab status
1993
-        if (! empty($event_status)) {
1993
+        if ( ! empty($event_status)) {
1994 1994
             $success = true;
1995 1995
             // determine the event id and set to array.
1996 1996
             $EVT_IDs = isset($this->_req_data['EVT_IDs']) ? (array) $this->_req_data['EVT_IDs'] : array();
@@ -2037,7 +2037,7 @@  discard block
 block discarded – undo
2037 2037
     private function _change_event_status($EVT_ID = 0, $event_status = '')
2038 2038
     {
2039 2039
         // grab event id
2040
-        if (! $EVT_ID) {
2040
+        if ( ! $EVT_ID) {
2041 2041
             $msg = esc_html__(
2042 2042
                 'An error occurred. No Event ID or an invalid Event ID was received.',
2043 2043
                 'event_espresso'
@@ -2145,7 +2145,7 @@  discard block
 block discarded – undo
2145 2145
             $confirm_deletion_args['EVT_IDs[]'] = (int) $EVT_ID;
2146 2146
         }
2147 2147
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
2148
-            EVENTS_TEMPLATE_PATH . 'event_preview_deletion.template.php',
2148
+            EVENTS_TEMPLATE_PATH.'event_preview_deletion.template.php',
2149 2149
             [
2150 2150
                 'form_url' => EE_Admin_Page::add_query_args_and_nonce(
2151 2151
                     $confirm_deletion_args,
@@ -2254,10 +2254,10 @@  discard block
 block discarded – undo
2254 2254
                 ];
2255 2255
                 foreach ($ids as $index_primary_key_string) {
2256 2256
                     $keys_n_values = $model->parse_index_primary_key_string($index_primary_key_string);
2257
-                    $where_conditions['OR'][ 'AND*' . $index_primary_key_string ] = $keys_n_values;
2257
+                    $where_conditions['OR']['AND*'.$index_primary_key_string] = $keys_n_values;
2258 2258
                 }
2259 2259
             }
2260
-            if (!$model->delete_permanently(
2260
+            if ( ! $model->delete_permanently(
2261 2261
                 [
2262 2262
                     $where_conditions
2263 2263
                 ],
@@ -2266,8 +2266,8 @@  discard block
 block discarded – undo
2266 2266
                 $success = false;
2267 2267
             }
2268 2268
         }
2269
-        if (isset($espresso_no_ticket_prices[ $event_id ])) {
2270
-            unset($espresso_no_ticket_prices[ $event_id ]);
2269
+        if (isset($espresso_no_ticket_prices[$event_id])) {
2270
+            unset($espresso_no_ticket_prices[$event_id]);
2271 2271
         }
2272 2272
         // Fire a legacy action.
2273 2273
         foreach ($event_ids as $event_id) {
@@ -2287,7 +2287,7 @@  discard block
 block discarded – undo
2287 2287
     private function _permanently_delete_event($EVT_ID = 0)
2288 2288
     {
2289 2289
         // grab event id
2290
-        if (! $EVT_ID) {
2290
+        if ( ! $EVT_ID) {
2291 2291
             $msg = esc_html__(
2292 2292
                 'An error occurred. No Event ID or an invalid Event ID was received.',
2293 2293
                 'event_espresso'
@@ -2295,12 +2295,12 @@  discard block
 block discarded – undo
2295 2295
             EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2296 2296
             return false;
2297 2297
         }
2298
-        if (! $this->_cpt_model_obj instanceof EE_Event
2298
+        if ( ! $this->_cpt_model_obj instanceof EE_Event
2299 2299
             || $this->_cpt_model_obj->ID() !== $EVT_ID
2300 2300
         ) {
2301 2301
             $this->_cpt_model_obj = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2302 2302
         }
2303
-        if (! $this->_cpt_model_obj instanceof EE_Event) {
2303
+        if ( ! $this->_cpt_model_obj instanceof EE_Event) {
2304 2304
             return false;
2305 2305
         }
2306 2306
         // need to delete related tickets and prices first.
@@ -2322,7 +2322,7 @@  discard block
 block discarded – undo
2322 2322
         }
2323 2323
         // any attached question groups?
2324 2324
         $question_groups = $this->_cpt_model_obj->get_many_related('Question_Group');
2325
-        if (! empty($question_groups)) {
2325
+        if ( ! empty($question_groups)) {
2326 2326
             foreach ($question_groups as $question_group) {
2327 2327
                 $this->_cpt_model_obj->_remove_relation_to($question_group, 'Question_Group');
2328 2328
             }
@@ -2533,7 +2533,7 @@  discard block
 block discarded – undo
2533 2533
                                                 . esc_html__(
2534 2534
                                                     'Template Settings is a feature that is only available in the premium version of Event Espresso 4 which is available with a support license purchase on EventEspresso.com. Template Settings allow you to configure some of the appearance options for both the Event List and Event Details pages.',
2535 2535
                                                     'event_espresso'
2536
-                                                ) . '</strong>';
2536
+                                                ).'</strong>';
2537 2537
         $this->display_admin_caf_preview_page('template_settings_tab');
2538 2538
     }
2539 2539
 
@@ -2553,12 +2553,12 @@  discard block
 block discarded – undo
2553 2553
         // set default category object
2554 2554
         $this->_set_empty_category_object();
2555 2555
         // only set if we've got an id
2556
-        if (! isset($this->_req_data['EVT_CAT_ID'])) {
2556
+        if ( ! isset($this->_req_data['EVT_CAT_ID'])) {
2557 2557
             return;
2558 2558
         }
2559 2559
         $category_id = absint($this->_req_data['EVT_CAT_ID']);
2560 2560
         $term = get_term($category_id, EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY);
2561
-        if (! empty($term)) {
2561
+        if ( ! empty($term)) {
2562 2562
             $this->_category->category_name = $term->name;
2563 2563
             $this->_category->category_identifier = $term->slug;
2564 2564
             $this->_category->category_desc = $term->description;
@@ -2586,7 +2586,7 @@  discard block
 block discarded – undo
2586 2586
     {
2587 2587
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2588 2588
         $this->_search_btn_label = esc_html__('Categories', 'event_espresso');
2589
-        $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
2589
+        $this->_admin_page_title .= ' '.$this->get_action_link_or_button(
2590 2590
             'add_category',
2591 2591
             'add_category',
2592 2592
             array(),
@@ -2660,7 +2660,7 @@  discard block
 block discarded – undo
2660 2660
             'disable'                  => '',
2661 2661
             'disabled_message'         => false,
2662 2662
         );
2663
-        $template = EVENTS_TEMPLATE_PATH . 'event_category_details.template.php';
2663
+        $template = EVENTS_TEMPLATE_PATH.'event_category_details.template.php';
2664 2664
         return EEH_Template::display_template($template, $template_args, true);
2665 2665
     }
2666 2666
 
@@ -2745,7 +2745,7 @@  discard block
 block discarded – undo
2745 2745
         $insert_ids = $update
2746 2746
             ? wp_update_term($cat_id, EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY, $term_args)
2747 2747
             : wp_insert_term($category_name, EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY, $term_args);
2748
-        if (! is_array($insert_ids)) {
2748
+        if ( ! is_array($insert_ids)) {
2749 2749
             $msg = esc_html__(
2750 2750
                 'An error occurred and the category has not been saved to the database.',
2751 2751
                 'event_espresso'
@@ -2776,7 +2776,7 @@  discard block
 block discarded – undo
2776 2776
         $limit = ($current_page - 1) * $per_page;
2777 2777
         $where = array('taxonomy' => EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY);
2778 2778
         if (isset($this->_req_data['s'])) {
2779
-            $sstr = '%' . $this->_req_data['s'] . '%';
2779
+            $sstr = '%'.$this->_req_data['s'].'%';
2780 2780
             $where['OR'] = array(
2781 2781
                 'Term.name'   => array('LIKE', $sstr),
2782 2782
                 'description' => array('LIKE', $sstr),
@@ -2785,7 +2785,7 @@  discard block
 block discarded – undo
2785 2785
         $query_params = array(
2786 2786
             $where,
2787 2787
             'order_by'   => array($orderby => $order),
2788
-            'limit'      => $limit . ',' . $per_page,
2788
+            'limit'      => $limit.','.$per_page,
2789 2789
             'force_join' => array('Term'),
2790 2790
         );
2791 2791
         $categories = $count
Please login to merge, or discard this patch.
Indentation   +2802 added lines, -2802 removed lines patch added patch discarded remove patch
@@ -16,2807 +16,2807 @@
 block discarded – undo
16 16
 class Events_Admin_Page extends EE_Admin_Page_CPT
17 17
 {
18 18
 
19
-    /**
20
-     * This will hold the event object for event_details screen.
21
-     *
22
-     * @access protected
23
-     * @var EE_Event $_event
24
-     */
25
-    protected $_event;
26
-
27
-
28
-    /**
29
-     * This will hold the category object for category_details screen.
30
-     *
31
-     * @var stdClass $_category
32
-     */
33
-    protected $_category;
34
-
35
-
36
-    /**
37
-     * This will hold the event model instance
38
-     *
39
-     * @var EEM_Event $_event_model
40
-     */
41
-    protected $_event_model;
42
-
43
-
44
-    /**
45
-     * @var EE_Event
46
-     */
47
-    protected $_cpt_model_obj = false;
48
-
49
-
50
-    /**
51
-     * Initialize page props for this admin page group.
52
-     */
53
-    protected function _init_page_props()
54
-    {
55
-        $this->page_slug = EVENTS_PG_SLUG;
56
-        $this->page_label = EVENTS_LABEL;
57
-        $this->_admin_base_url = EVENTS_ADMIN_URL;
58
-        $this->_admin_base_path = EVENTS_ADMIN;
59
-        $this->_cpt_model_names = array(
60
-            'create_new' => 'EEM_Event',
61
-            'edit'       => 'EEM_Event',
62
-        );
63
-        $this->_cpt_edit_routes = array(
64
-            'espresso_events' => 'edit',
65
-        );
66
-        add_action(
67
-            'AHEE__EE_Admin_Page_CPT__set_model_object__after_set_object',
68
-            array($this, 'verify_event_edit'),
69
-            10,
70
-            2
71
-        );
72
-    }
73
-
74
-
75
-    /**
76
-     * Sets the ajax hooks used for this admin page group.
77
-     */
78
-    protected function _ajax_hooks()
79
-    {
80
-        add_action('wp_ajax_ee_save_timezone_setting', array($this, 'save_timezonestring_setting'));
81
-    }
82
-
83
-
84
-    /**
85
-     * Sets the page properties for this admin page group.
86
-     */
87
-    protected function _define_page_props()
88
-    {
89
-        $this->_admin_page_title = EVENTS_LABEL;
90
-        $this->_labels = array(
91
-            'buttons'      => array(
92
-                'add'             => esc_html__('Add New Event', 'event_espresso'),
93
-                'edit'            => esc_html__('Edit Event', 'event_espresso'),
94
-                'delete'          => esc_html__('Delete Event', 'event_espresso'),
95
-                'add_category'    => esc_html__('Add New Category', 'event_espresso'),
96
-                'edit_category'   => esc_html__('Edit Category', 'event_espresso'),
97
-                'delete_category' => esc_html__('Delete Category', 'event_espresso'),
98
-            ),
99
-            'editor_title' => array(
100
-                'espresso_events' => esc_html__('Enter event title here', 'event_espresso'),
101
-            ),
102
-            'publishbox'   => array(
103
-                'create_new'        => esc_html__('Save New Event', 'event_espresso'),
104
-                'edit'              => esc_html__('Update Event', 'event_espresso'),
105
-                'add_category'      => esc_html__('Save New Category', 'event_espresso'),
106
-                'edit_category'     => esc_html__('Update Category', 'event_espresso'),
107
-                'template_settings' => esc_html__('Update Settings', 'event_espresso'),
108
-            ),
109
-        );
110
-    }
111
-
112
-
113
-    /**
114
-     * Sets the page routes property for this admin page group.
115
-     */
116
-    protected function _set_page_routes()
117
-    {
118
-        // load formatter helper
119
-        // load field generator helper
120
-        // is there a evt_id in the request?
121
-        $evt_id = ! empty($this->_req_data['EVT_ID']) && ! is_array($this->_req_data['EVT_ID'])
122
-            ? $this->_req_data['EVT_ID']
123
-            : 0;
124
-        $evt_id = ! empty($this->_req_data['post']) ? $this->_req_data['post'] : $evt_id;
125
-        $this->_page_routes = array(
126
-            'default'                       => array(
127
-                'func'       => '_events_overview_list_table',
128
-                'capability' => 'ee_read_events',
129
-            ),
130
-            'create_new'                    => array(
131
-                'func'       => '_create_new_cpt_item',
132
-                'capability' => 'ee_edit_events',
133
-            ),
134
-            'edit'                          => array(
135
-                'func'       => '_edit_cpt_item',
136
-                'capability' => 'ee_edit_event',
137
-                'obj_id'     => $evt_id,
138
-            ),
139
-            'copy_event'                    => array(
140
-                'func'       => '_copy_events',
141
-                'capability' => 'ee_edit_event',
142
-                'obj_id'     => $evt_id,
143
-                'noheader'   => true,
144
-            ),
145
-            'trash_event'                   => array(
146
-                'func'       => '_trash_or_restore_event',
147
-                'args'       => array('event_status' => 'trash'),
148
-                'capability' => 'ee_delete_event',
149
-                'obj_id'     => $evt_id,
150
-                'noheader'   => true,
151
-            ),
152
-            'trash_events'                  => array(
153
-                'func'       => '_trash_or_restore_events',
154
-                'args'       => array('event_status' => 'trash'),
155
-                'capability' => 'ee_delete_events',
156
-                'noheader'   => true,
157
-            ),
158
-            'restore_event'                 => array(
159
-                'func'       => '_trash_or_restore_event',
160
-                'args'       => array('event_status' => 'draft'),
161
-                'capability' => 'ee_delete_event',
162
-                'obj_id'     => $evt_id,
163
-                'noheader'   => true,
164
-            ),
165
-            'restore_events'                => array(
166
-                'func'       => '_trash_or_restore_events',
167
-                'args'       => array('event_status' => 'draft'),
168
-                'capability' => 'ee_delete_events',
169
-                'noheader'   => true,
170
-            ),
171
-            'delete_event'                  => array(
172
-                'func'       => '_delete_event',
173
-                'capability' => 'ee_delete_event',
174
-                'obj_id'     => $evt_id,
175
-                'noheader'   => true,
176
-            ),
177
-            'delete_events'                 => array(
178
-                'func'       => '_delete_events',
179
-                'capability' => 'ee_delete_events',
180
-                'noheader'   => true,
181
-            ),
182
-            'view_report'                   => array(
183
-                'func'      => '_view_report',
184
-                'capablity' => 'ee_edit_events',
185
-            ),
186
-            'default_event_settings'        => array(
187
-                'func'       => '_default_event_settings',
188
-                'capability' => 'manage_options',
189
-            ),
190
-            'update_default_event_settings' => array(
191
-                'func'       => '_update_default_event_settings',
192
-                'capability' => 'manage_options',
193
-                'noheader'   => true,
194
-            ),
195
-            'template_settings'             => array(
196
-                'func'       => '_template_settings',
197
-                'capability' => 'manage_options',
198
-            ),
199
-            // event category tab related
200
-            'add_category'                  => array(
201
-                'func'       => '_category_details',
202
-                'capability' => 'ee_edit_event_category',
203
-                'args'       => array('add'),
204
-            ),
205
-            'edit_category'                 => array(
206
-                'func'       => '_category_details',
207
-                'capability' => 'ee_edit_event_category',
208
-                'args'       => array('edit'),
209
-            ),
210
-            'delete_categories'             => array(
211
-                'func'       => '_delete_categories',
212
-                'capability' => 'ee_delete_event_category',
213
-                'noheader'   => true,
214
-            ),
215
-            'delete_category'               => array(
216
-                'func'       => '_delete_categories',
217
-                'capability' => 'ee_delete_event_category',
218
-                'noheader'   => true,
219
-            ),
220
-            'insert_category'               => array(
221
-                'func'       => '_insert_or_update_category',
222
-                'args'       => array('new_category' => true),
223
-                'capability' => 'ee_edit_event_category',
224
-                'noheader'   => true,
225
-            ),
226
-            'update_category'               => array(
227
-                'func'       => '_insert_or_update_category',
228
-                'args'       => array('new_category' => false),
229
-                'capability' => 'ee_edit_event_category',
230
-                'noheader'   => true,
231
-            ),
232
-            'category_list'                 => array(
233
-                'func'       => '_category_list_table',
234
-                'capability' => 'ee_manage_event_categories',
235
-            ),
236
-            'preview_deletion' => [
237
-                'func' => 'previewDeletion',
238
-                'capability' => 'ee_delete_events'
239
-            ],
240
-            'confirm_deletion' => [
241
-                'func' => 'confirmDeletion',
242
-                'capability' => 'ee_delete_events',
243
-                'noheader' => true
244
-            ]
245
-        );
246
-    }
247
-
248
-
249
-    /**
250
-     * Set the _page_config property for this admin page group.
251
-     */
252
-    protected function _set_page_config()
253
-    {
254
-        $this->_page_config = array(
255
-            'default'                => array(
256
-                'nav'           => array(
257
-                    'label' => esc_html__('Overview', 'event_espresso'),
258
-                    'order' => 10,
259
-                ),
260
-                'list_table'    => 'Events_Admin_List_Table',
261
-                'help_tabs'     => array(
262
-                    'events_overview_help_tab'                       => array(
263
-                        'title'    => esc_html__('Events Overview', 'event_espresso'),
264
-                        'filename' => 'events_overview',
265
-                    ),
266
-                    'events_overview_table_column_headings_help_tab' => array(
267
-                        'title'    => esc_html__('Events Overview Table Column Headings', 'event_espresso'),
268
-                        'filename' => 'events_overview_table_column_headings',
269
-                    ),
270
-                    'events_overview_filters_help_tab'               => array(
271
-                        'title'    => esc_html__('Events Overview Filters', 'event_espresso'),
272
-                        'filename' => 'events_overview_filters',
273
-                    ),
274
-                    'events_overview_view_help_tab'                  => array(
275
-                        'title'    => esc_html__('Events Overview Views', 'event_espresso'),
276
-                        'filename' => 'events_overview_views',
277
-                    ),
278
-                    'events_overview_other_help_tab'                 => array(
279
-                        'title'    => esc_html__('Events Overview Other', 'event_espresso'),
280
-                        'filename' => 'events_overview_other',
281
-                    ),
282
-                ),
283
-                'help_tour'     => array(
284
-                    'Event_Overview_Help_Tour',
285
-                    // 'New_Features_Test_Help_Tour' for testing multiple help tour
286
-                ),
287
-                'qtips'         => array(
288
-                    'EE_Event_List_Table_Tips',
289
-                ),
290
-                'require_nonce' => false,
291
-            ),
292
-            'create_new'             => array(
293
-                'nav'           => array(
294
-                    'label'      => esc_html__('Add Event', 'event_espresso'),
295
-                    'order'      => 5,
296
-                    'persistent' => false,
297
-                ),
298
-                'metaboxes'     => array('_register_event_editor_meta_boxes'),
299
-                'help_tabs'     => array(
300
-                    'event_editor_help_tab'                            => array(
301
-                        'title'    => esc_html__('Event Editor', 'event_espresso'),
302
-                        'filename' => 'event_editor',
303
-                    ),
304
-                    'event_editor_title_richtexteditor_help_tab'       => array(
305
-                        'title'    => esc_html__('Event Title & Rich Text Editor', 'event_espresso'),
306
-                        'filename' => 'event_editor_title_richtexteditor',
307
-                    ),
308
-                    'event_editor_venue_details_help_tab'              => array(
309
-                        'title'    => esc_html__('Event Venue Details', 'event_espresso'),
310
-                        'filename' => 'event_editor_venue_details',
311
-                    ),
312
-                    'event_editor_event_datetimes_help_tab'            => array(
313
-                        'title'    => esc_html__('Event Datetimes', 'event_espresso'),
314
-                        'filename' => 'event_editor_event_datetimes',
315
-                    ),
316
-                    'event_editor_event_tickets_help_tab'              => array(
317
-                        'title'    => esc_html__('Event Tickets', 'event_espresso'),
318
-                        'filename' => 'event_editor_event_tickets',
319
-                    ),
320
-                    'event_editor_event_registration_options_help_tab' => array(
321
-                        'title'    => esc_html__('Event Registration Options', 'event_espresso'),
322
-                        'filename' => 'event_editor_event_registration_options',
323
-                    ),
324
-                    'event_editor_tags_categories_help_tab'            => array(
325
-                        'title'    => esc_html__('Event Tags & Categories', 'event_espresso'),
326
-                        'filename' => 'event_editor_tags_categories',
327
-                    ),
328
-                    'event_editor_questions_registrants_help_tab'      => array(
329
-                        'title'    => esc_html__('Questions for Registrants', 'event_espresso'),
330
-                        'filename' => 'event_editor_questions_registrants',
331
-                    ),
332
-                    'event_editor_save_new_event_help_tab'             => array(
333
-                        'title'    => esc_html__('Save New Event', 'event_espresso'),
334
-                        'filename' => 'event_editor_save_new_event',
335
-                    ),
336
-                    'event_editor_other_help_tab'                      => array(
337
-                        'title'    => esc_html__('Event Other', 'event_espresso'),
338
-                        'filename' => 'event_editor_other',
339
-                    ),
340
-                ),
341
-                'help_tour'     => array(
342
-                    'Event_Editor_Help_Tour',
343
-                ),
344
-                'qtips'         => array('EE_Event_Editor_Decaf_Tips'),
345
-                'require_nonce' => false,
346
-            ),
347
-            'edit'                   => array(
348
-                'nav'           => array(
349
-                    'label'      => esc_html__('Edit Event', 'event_espresso'),
350
-                    'order'      => 5,
351
-                    'persistent' => false,
352
-                    'url'        => isset($this->_req_data['post'])
353
-                        ? EE_Admin_Page::add_query_args_and_nonce(
354
-                            array('post' => $this->_req_data['post'], 'action' => 'edit'),
355
-                            $this->_current_page_view_url
356
-                        )
357
-                        : $this->_admin_base_url,
358
-                ),
359
-                'metaboxes'     => array('_register_event_editor_meta_boxes'),
360
-                'help_tabs'     => array(
361
-                    'event_editor_help_tab'                            => array(
362
-                        'title'    => esc_html__('Event Editor', 'event_espresso'),
363
-                        'filename' => 'event_editor',
364
-                    ),
365
-                    'event_editor_title_richtexteditor_help_tab'       => array(
366
-                        'title'    => esc_html__('Event Title & Rich Text Editor', 'event_espresso'),
367
-                        'filename' => 'event_editor_title_richtexteditor',
368
-                    ),
369
-                    'event_editor_venue_details_help_tab'              => array(
370
-                        'title'    => esc_html__('Event Venue Details', 'event_espresso'),
371
-                        'filename' => 'event_editor_venue_details',
372
-                    ),
373
-                    'event_editor_event_datetimes_help_tab'            => array(
374
-                        'title'    => esc_html__('Event Datetimes', 'event_espresso'),
375
-                        'filename' => 'event_editor_event_datetimes',
376
-                    ),
377
-                    'event_editor_event_tickets_help_tab'              => array(
378
-                        'title'    => esc_html__('Event Tickets', 'event_espresso'),
379
-                        'filename' => 'event_editor_event_tickets',
380
-                    ),
381
-                    'event_editor_event_registration_options_help_tab' => array(
382
-                        'title'    => esc_html__('Event Registration Options', 'event_espresso'),
383
-                        'filename' => 'event_editor_event_registration_options',
384
-                    ),
385
-                    'event_editor_tags_categories_help_tab'            => array(
386
-                        'title'    => esc_html__('Event Tags & Categories', 'event_espresso'),
387
-                        'filename' => 'event_editor_tags_categories',
388
-                    ),
389
-                    'event_editor_questions_registrants_help_tab'      => array(
390
-                        'title'    => esc_html__('Questions for Registrants', 'event_espresso'),
391
-                        'filename' => 'event_editor_questions_registrants',
392
-                    ),
393
-                    'event_editor_save_new_event_help_tab'             => array(
394
-                        'title'    => esc_html__('Save New Event', 'event_espresso'),
395
-                        'filename' => 'event_editor_save_new_event',
396
-                    ),
397
-                    'event_editor_other_help_tab'                      => array(
398
-                        'title'    => esc_html__('Event Other', 'event_espresso'),
399
-                        'filename' => 'event_editor_other',
400
-                    ),
401
-                ),
402
-                'qtips'         => array('EE_Event_Editor_Decaf_Tips'),
403
-                'require_nonce' => false,
404
-            ),
405
-            'default_event_settings' => array(
406
-                'nav'           => array(
407
-                    'label' => esc_html__('Default Settings', 'event_espresso'),
408
-                    'order' => 40,
409
-                ),
410
-                'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
411
-                'labels'        => array(
412
-                    'publishbox' => esc_html__('Update Settings', 'event_espresso'),
413
-                ),
414
-                'help_tabs'     => array(
415
-                    'default_settings_help_tab'        => array(
416
-                        'title'    => esc_html__('Default Event Settings', 'event_espresso'),
417
-                        'filename' => 'events_default_settings',
418
-                    ),
419
-                    'default_settings_status_help_tab' => array(
420
-                        'title'    => esc_html__('Default Registration Status', 'event_espresso'),
421
-                        'filename' => 'events_default_settings_status',
422
-                    ),
423
-                    'default_maximum_tickets_help_tab' => array(
424
-                        'title'    => esc_html__('Default Maximum Tickets Per Order', 'event_espresso'),
425
-                        'filename' => 'events_default_settings_max_tickets',
426
-                    ),
427
-                ),
428
-                'help_tour'     => array('Event_Default_Settings_Help_Tour'),
429
-                'require_nonce' => false,
430
-            ),
431
-            // template settings
432
-            'template_settings'      => array(
433
-                'nav'           => array(
434
-                    'label' => esc_html__('Templates', 'event_espresso'),
435
-                    'order' => 30,
436
-                ),
437
-                'metaboxes'     => $this->_default_espresso_metaboxes,
438
-                'help_tabs'     => array(
439
-                    'general_settings_templates_help_tab' => array(
440
-                        'title'    => esc_html__('Templates', 'event_espresso'),
441
-                        'filename' => 'general_settings_templates',
442
-                    ),
443
-                ),
444
-                'help_tour'     => array('Templates_Help_Tour'),
445
-                'require_nonce' => false,
446
-            ),
447
-            // event category stuff
448
-            'add_category'           => array(
449
-                'nav'           => array(
450
-                    'label'      => esc_html__('Add Category', 'event_espresso'),
451
-                    'order'      => 15,
452
-                    'persistent' => false,
453
-                ),
454
-                'help_tabs'     => array(
455
-                    'add_category_help_tab' => array(
456
-                        'title'    => esc_html__('Add New Event Category', 'event_espresso'),
457
-                        'filename' => 'events_add_category',
458
-                    ),
459
-                ),
460
-                'help_tour'     => array('Event_Add_Category_Help_Tour'),
461
-                'metaboxes'     => array('_publish_post_box'),
462
-                'require_nonce' => false,
463
-            ),
464
-            'edit_category'          => array(
465
-                'nav'           => array(
466
-                    'label'      => esc_html__('Edit Category', 'event_espresso'),
467
-                    'order'      => 15,
468
-                    'persistent' => false,
469
-                    'url'        => isset($this->_req_data['EVT_CAT_ID'])
470
-                        ? add_query_arg(
471
-                            array('EVT_CAT_ID' => $this->_req_data['EVT_CAT_ID']),
472
-                            $this->_current_page_view_url
473
-                        )
474
-                        : $this->_admin_base_url,
475
-                ),
476
-                'help_tabs'     => array(
477
-                    'edit_category_help_tab' => array(
478
-                        'title'    => esc_html__('Edit Event Category', 'event_espresso'),
479
-                        'filename' => 'events_edit_category',
480
-                    ),
481
-                ),
482
-                /*'help_tour' => array('Event_Edit_Category_Help_Tour'),*/
483
-                'metaboxes'     => array('_publish_post_box'),
484
-                'require_nonce' => false,
485
-            ),
486
-            'category_list'          => array(
487
-                'nav'           => array(
488
-                    'label' => esc_html__('Categories', 'event_espresso'),
489
-                    'order' => 20,
490
-                ),
491
-                'list_table'    => 'Event_Categories_Admin_List_Table',
492
-                'help_tabs'     => array(
493
-                    'events_categories_help_tab'                       => array(
494
-                        'title'    => esc_html__('Event Categories', 'event_espresso'),
495
-                        'filename' => 'events_categories',
496
-                    ),
497
-                    'events_categories_table_column_headings_help_tab' => array(
498
-                        'title'    => esc_html__('Event Categories Table Column Headings', 'event_espresso'),
499
-                        'filename' => 'events_categories_table_column_headings',
500
-                    ),
501
-                    'events_categories_view_help_tab'                  => array(
502
-                        'title'    => esc_html__('Event Categories Views', 'event_espresso'),
503
-                        'filename' => 'events_categories_views',
504
-                    ),
505
-                    'events_categories_other_help_tab'                 => array(
506
-                        'title'    => esc_html__('Event Categories Other', 'event_espresso'),
507
-                        'filename' => 'events_categories_other',
508
-                    ),
509
-                ),
510
-                'help_tour'     => array(
511
-                    'Event_Categories_Help_Tour',
512
-                ),
513
-                'metaboxes'     => $this->_default_espresso_metaboxes,
514
-                'require_nonce' => false,
515
-            ),
516
-            'preview_deletion'           => array(
517
-                'nav'           => array(
518
-                    'label'      => esc_html__('Preview Deletion', 'event_espresso'),
519
-                    'order'      => 15,
520
-                    'persistent' => false,
521
-                ),
522
-            )
523
-        );
524
-    }
525
-
526
-
527
-    /**
528
-     * Used to register any global screen options if necessary for every route in this admin page group.
529
-     */
530
-    protected function _add_screen_options()
531
-    {
532
-    }
533
-
534
-
535
-    /**
536
-     * Implementing the screen options for the 'default' route.
537
-     */
538
-    protected function _add_screen_options_default()
539
-    {
540
-        $this->_per_page_screen_option();
541
-    }
542
-
543
-
544
-    /**
545
-     * Implementing screen options for the category list route.
546
-     */
547
-    protected function _add_screen_options_category_list()
548
-    {
549
-        $page_title = $this->_admin_page_title;
550
-        $this->_admin_page_title = esc_html__('Categories', 'event_espresso');
551
-        $this->_per_page_screen_option();
552
-        $this->_admin_page_title = $page_title;
553
-    }
554
-
555
-
556
-    /**
557
-     * Used to register any global feature pointers for the admin page group.
558
-     */
559
-    protected function _add_feature_pointers()
560
-    {
561
-    }
562
-
563
-
564
-    /**
565
-     * Registers and enqueues any global scripts and styles for the entire admin page group.
566
-     */
567
-    public function load_scripts_styles()
568
-    {
569
-        wp_register_style(
570
-            'events-admin-css',
571
-            EVENTS_ASSETS_URL . 'events-admin-page.css',
572
-            array(),
573
-            EVENT_ESPRESSO_VERSION
574
-        );
575
-        wp_register_style('ee-cat-admin', EVENTS_ASSETS_URL . 'ee-cat-admin.css', array(), EVENT_ESPRESSO_VERSION);
576
-        wp_enqueue_style('events-admin-css');
577
-        wp_enqueue_style('ee-cat-admin');
578
-        // todo note: we also need to load_scripts_styles per view (i.e. default/view_report/event_details
579
-        // registers for all views
580
-        // scripts
581
-        wp_register_script(
582
-            'event_editor_js',
583
-            EVENTS_ASSETS_URL . 'event_editor.js',
584
-            array('ee_admin_js', 'jquery-ui-slider', 'jquery-ui-timepicker-addon'),
585
-            EVENT_ESPRESSO_VERSION,
586
-            true
587
-        );
588
-    }
589
-
590
-
591
-    /**
592
-     * Enqueuing scripts and styles specific to this view
593
-     */
594
-    public function load_scripts_styles_create_new()
595
-    {
596
-        $this->load_scripts_styles_edit();
597
-    }
598
-
599
-
600
-    /**
601
-     * Enqueuing scripts and styles specific to this view
602
-     */
603
-    public function load_scripts_styles_edit()
604
-    {
605
-        // styles
606
-        wp_enqueue_style('espresso-ui-theme');
607
-        wp_register_style(
608
-            'event-editor-css',
609
-            EVENTS_ASSETS_URL . 'event-editor.css',
610
-            array('ee-admin-css'),
611
-            EVENT_ESPRESSO_VERSION
612
-        );
613
-        wp_enqueue_style('event-editor-css');
614
-        // scripts
615
-        wp_register_script(
616
-            'event-datetime-metabox',
617
-            EVENTS_ASSETS_URL . 'event-datetime-metabox.js',
618
-            array('event_editor_js', 'ee-datepicker'),
619
-            EVENT_ESPRESSO_VERSION
620
-        );
621
-        wp_enqueue_script('event-datetime-metabox');
622
-    }
623
-
624
-
625
-    /**
626
-     * Populating the _views property for the category list table view.
627
-     */
628
-    protected function _set_list_table_views_category_list()
629
-    {
630
-        $this->_views = array(
631
-            'all' => array(
632
-                'slug'        => 'all',
633
-                'label'       => esc_html__('All', 'event_espresso'),
634
-                'count'       => 0,
635
-                'bulk_action' => array(
636
-                    'delete_categories' => esc_html__('Delete Permanently', 'event_espresso'),
637
-                ),
638
-            ),
639
-        );
640
-    }
641
-
642
-
643
-    /**
644
-     * For adding anything that fires on the admin_init hook for any route within this admin page group.
645
-     */
646
-    public function admin_init()
647
-    {
648
-        EE_Registry::$i18n_js_strings['image_confirm'] = esc_html__(
649
-            'Do you really want to delete this image? Please remember to update your event to complete the removal.',
650
-            'event_espresso'
651
-        );
652
-    }
653
-
654
-
655
-    /**
656
-     * For adding anything that should be triggered on the admin_notices hook for any route within this admin page
657
-     * group.
658
-     */
659
-    public function admin_notices()
660
-    {
661
-    }
662
-
663
-
664
-    /**
665
-     * For adding anything that should be triggered on the `admin_print_footer_scripts` hook for any route within
666
-     * this admin page group.
667
-     */
668
-    public function admin_footer_scripts()
669
-    {
670
-    }
671
-
672
-
673
-    /**
674
-     * Call this function to verify if an event is public and has tickets for sale.  If it does, then we need to show a
675
-     * warning (via EE_Error::add_error());
676
-     *
677
-     * @param  EE_Event $event Event object
678
-     * @param string    $req_type
679
-     * @return void
680
-     * @throws EE_Error
681
-     * @access public
682
-     */
683
-    public function verify_event_edit($event = null, $req_type = '')
684
-    {
685
-        // don't need to do this when processing
686
-        if (! empty($req_type)) {
687
-            return;
688
-        }
689
-        // no event?
690
-        if (empty($event)) {
691
-            // set event
692
-            $event = $this->_cpt_model_obj;
693
-        }
694
-        // STILL no event?
695
-        if (! $event instanceof EE_Event) {
696
-            return;
697
-        }
698
-        $orig_status = $event->status();
699
-        // first check if event is active.
700
-        if ($orig_status === EEM_Event::cancelled
701
-            || $orig_status === EEM_Event::postponed
702
-            || $event->is_expired()
703
-            || $event->is_inactive()
704
-        ) {
705
-            return;
706
-        }
707
-        // made it here so it IS active... next check that any of the tickets are sold.
708
-        if ($event->is_sold_out(true)) {
709
-            if ($orig_status !== EEM_Event::sold_out && $event->status() !== $orig_status) {
710
-                EE_Error::add_attention(
711
-                    sprintf(
712
-                        esc_html__(
713
-                            'Please note that the Event Status has automatically been changed to %s because there are no more spaces available for this event.  However, this change is not permanent until you update the event.  You can change the status back to something else before updating if you wish.',
714
-                            'event_espresso'
715
-                        ),
716
-                        EEH_Template::pretty_status(EEM_Event::sold_out, false, 'sentence')
717
-                    )
718
-                );
719
-            }
720
-            return;
721
-        } elseif ($orig_status === EEM_Event::sold_out) {
722
-            EE_Error::add_attention(
723
-                sprintf(
724
-                    esc_html__(
725
-                        'Please note that the Event Status has automatically been changed to %s because more spaces have become available for this event, most likely due to abandoned transactions freeing up reserved tickets.  However, this change is not permanent until you update the event. If you wish, you can change the status back to something else before updating.',
726
-                        'event_espresso'
727
-                    ),
728
-                    EEH_Template::pretty_status($event->status(), false, 'sentence')
729
-                )
730
-            );
731
-        }
732
-        // now we need to determine if the event has any tickets on sale.  If not then we dont' show the error
733
-        if (! $event->tickets_on_sale()) {
734
-            return;
735
-        }
736
-        // made it here so show warning
737
-        $this->_edit_event_warning();
738
-    }
739
-
740
-
741
-    /**
742
-     * This is the text used for when an event is being edited that is public and has tickets for sale.
743
-     * When needed, hook this into a EE_Error::add_error() notice.
744
-     *
745
-     * @access protected
746
-     * @return void
747
-     */
748
-    protected function _edit_event_warning()
749
-    {
750
-        // we don't want to add warnings during these requests
751
-        if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'editpost') {
752
-            return;
753
-        }
754
-        EE_Error::add_attention(
755
-            sprintf(
756
-                esc_html__(
757
-                    'Your event is open for registration. Making changes may disrupt any transactions in progress. %sLearn more%s',
758
-                    'event_espresso'
759
-                ),
760
-                '<a class="espresso-help-tab-lnk">',
761
-                '</a>'
762
-            )
763
-        );
764
-    }
765
-
766
-
767
-    /**
768
-     * When a user is creating a new event, notify them if they haven't set their timezone.
769
-     * Otherwise, do the normal logic
770
-     *
771
-     * @return string
772
-     * @throws \EE_Error
773
-     */
774
-    protected function _create_new_cpt_item()
775
-    {
776
-        $has_timezone_string = get_option('timezone_string');
777
-        // only nag them about setting their timezone if it's their first event, and they haven't already done it
778
-        if (! $has_timezone_string && ! EEM_Event::instance()->exists(array())) {
779
-            EE_Error::add_attention(
780
-                sprintf(
781
-                    __(
782
-                        'Your website\'s timezone is currently set to a UTC offset. We recommend updating your timezone to a city or region near you before you create an event. Change your timezone now:%1$s%2$s%3$sChange Timezone%4$s',
783
-                        'event_espresso'
784
-                    ),
785
-                    '<br>',
786
-                    '<select id="timezone_string" name="timezone_string" aria-describedby="timezone-description">'
787
-                    . EEH_DTT_Helper::wp_timezone_choice('', EEH_DTT_Helper::get_user_locale())
788
-                    . '</select>',
789
-                    '<button class="button button-secondary timezone-submit">',
790
-                    '</button><span class="spinner"></span>'
791
-                ),
792
-                __FILE__,
793
-                __FUNCTION__,
794
-                __LINE__
795
-            );
796
-        }
797
-        return parent::_create_new_cpt_item();
798
-    }
799
-
800
-
801
-    /**
802
-     * Sets the _views property for the default route in this admin page group.
803
-     */
804
-    protected function _set_list_table_views_default()
805
-    {
806
-        $this->_views = array(
807
-            'all'   => array(
808
-                'slug'        => 'all',
809
-                'label'       => esc_html__('View All Events', 'event_espresso'),
810
-                'count'       => 0,
811
-                'bulk_action' => array(
812
-                    'trash_events' => esc_html__('Move to Trash', 'event_espresso'),
813
-                ),
814
-            ),
815
-            'draft' => array(
816
-                'slug'        => 'draft',
817
-                'label'       => esc_html__('Draft', 'event_espresso'),
818
-                'count'       => 0,
819
-                'bulk_action' => array(
820
-                    'trash_events' => esc_html__('Move to Trash', 'event_espresso'),
821
-                ),
822
-            ),
823
-        );
824
-        if (EE_Registry::instance()->CAP->current_user_can('ee_delete_events', 'espresso_events_trash_events')) {
825
-            $this->_views['trash'] = array(
826
-                'slug'        => 'trash',
827
-                'label'       => esc_html__('Trash', 'event_espresso'),
828
-                'count'       => 0,
829
-                'bulk_action' => array(
830
-                    'restore_events' => esc_html__('Restore From Trash', 'event_espresso'),
831
-                    'delete_events'  => esc_html__('Delete Permanently', 'event_espresso'),
832
-                ),
833
-            );
834
-        }
835
-    }
836
-
837
-
838
-    /**
839
-     * Provides the legend item array for the default list table view.
840
-     *
841
-     * @return array
842
-     */
843
-    protected function _event_legend_items()
844
-    {
845
-        $items = array(
846
-            'view_details'   => array(
847
-                'class' => 'dashicons dashicons-search',
848
-                'desc'  => esc_html__('View Event', 'event_espresso'),
849
-            ),
850
-            'edit_event'     => array(
851
-                'class' => 'ee-icon ee-icon-calendar-edit',
852
-                'desc'  => esc_html__('Edit Event Details', 'event_espresso'),
853
-            ),
854
-            'view_attendees' => array(
855
-                'class' => 'dashicons dashicons-groups',
856
-                'desc'  => esc_html__('View Registrations for Event', 'event_espresso'),
857
-            ),
858
-        );
859
-        $items = apply_filters('FHEE__Events_Admin_Page___event_legend_items__items', $items);
860
-        $statuses = array(
861
-            'sold_out_status'  => array(
862
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::sold_out,
863
-                'desc'  => EEH_Template::pretty_status(EE_Datetime::sold_out, false, 'sentence'),
864
-            ),
865
-            'active_status'    => array(
866
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::active,
867
-                'desc'  => EEH_Template::pretty_status(EE_Datetime::active, false, 'sentence'),
868
-            ),
869
-            'upcoming_status'  => array(
870
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::upcoming,
871
-                'desc'  => EEH_Template::pretty_status(EE_Datetime::upcoming, false, 'sentence'),
872
-            ),
873
-            'postponed_status' => array(
874
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::postponed,
875
-                'desc'  => EEH_Template::pretty_status(EE_Datetime::postponed, false, 'sentence'),
876
-            ),
877
-            'cancelled_status' => array(
878
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::cancelled,
879
-                'desc'  => EEH_Template::pretty_status(EE_Datetime::cancelled, false, 'sentence'),
880
-            ),
881
-            'expired_status'   => array(
882
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::expired,
883
-                'desc'  => EEH_Template::pretty_status(EE_Datetime::expired, false, 'sentence'),
884
-            ),
885
-            'inactive_status'  => array(
886
-                'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::inactive,
887
-                'desc'  => EEH_Template::pretty_status(EE_Datetime::inactive, false, 'sentence'),
888
-            ),
889
-        );
890
-        $statuses = apply_filters('FHEE__Events_Admin_Page__event_legend_items__statuses', $statuses);
891
-        return array_merge($items, $statuses);
892
-    }
893
-
894
-
895
-    /**
896
-     * @return EEM_Event
897
-     */
898
-    private function _event_model()
899
-    {
900
-        if (! $this->_event_model instanceof EEM_Event) {
901
-            $this->_event_model = EE_Registry::instance()->load_model('Event');
902
-        }
903
-        return $this->_event_model;
904
-    }
905
-
906
-
907
-    /**
908
-     * Adds extra buttons to the WP CPT permalink field row.
909
-     * Method is called from parent and is hooked into the wp 'get_sample_permalink_html' filter.
910
-     *
911
-     * @param  string $return    the current html
912
-     * @param  int    $id        the post id for the page
913
-     * @param  string $new_title What the title is
914
-     * @param  string $new_slug  what the slug is
915
-     * @return string            The new html string for the permalink area
916
-     */
917
-    public function extra_permalink_field_buttons($return, $id, $new_title, $new_slug)
918
-    {
919
-        // make sure this is only when editing
920
-        if (! empty($id)) {
921
-            $post = get_post($id);
922
-            $return .= '<a class="button button-small" onclick="prompt(\'Shortcode:\', jQuery(\'#shortcode\').val()); return false;" href="#"  tabindex="-1">'
923
-                       . esc_html__('Shortcode', 'event_espresso')
924
-                       . '</a> ';
925
-            $return .= '<input id="shortcode" type="hidden" value="[ESPRESSO_TICKET_SELECTOR event_id='
926
-                       . $post->ID
927
-                       . ']">';
928
-        }
929
-        return $return;
930
-    }
931
-
932
-
933
-    /**
934
-     * _events_overview_list_table
935
-     * This contains the logic for showing the events_overview list
936
-     *
937
-     * @access protected
938
-     * @return void
939
-     * @throws \EE_Error
940
-     */
941
-    protected function _events_overview_list_table()
942
-    {
943
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
944
-        $this->_template_args['after_list_table'] = ! empty($this->_template_args['after_list_table'])
945
-            ? (array) $this->_template_args['after_list_table']
946
-            : array();
947
-        $this->_template_args['after_list_table']['view_event_list_button'] = EEH_HTML::br()
948
-                . EEH_Template::get_button_or_link(
949
-                    get_post_type_archive_link('espresso_events'),
950
-                    esc_html__("View Event Archive Page", "event_espresso"),
951
-                    'button'
952
-                );
953
-        $this->_template_args['after_list_table']['legend'] = $this->_display_legend($this->_event_legend_items());
954
-        $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
955
-            'create_new',
956
-            'add',
957
-            array(),
958
-            'add-new-h2'
959
-        );
960
-        $this->display_admin_list_table_page_with_no_sidebar();
961
-    }
962
-
963
-
964
-    /**
965
-     * this allows for extra misc actions in the default WP publish box
966
-     *
967
-     * @return void
968
-     */
969
-    public function extra_misc_actions_publish_box()
970
-    {
971
-        $this->_generate_publish_box_extra_content();
972
-    }
973
-
974
-
975
-    /**
976
-     * This is hooked into the WordPress do_action('save_post') hook and runs after the custom post type has been
977
-     * saved.
978
-     * Typically you would use this to save any additional data.
979
-     * Keep in mind also that "save_post" runs on EVERY post update to the database.
980
-     * ALSO very important.  When a post transitions from scheduled to published,
981
-     * the save_post action is fired but you will NOT have any _POST data containing any extra info you may have from
982
-     * other meta saves. So MAKE sure that you handle this accordingly.
983
-     *
984
-     * @access protected
985
-     * @abstract
986
-     * @param  string $post_id The ID of the cpt that was saved (so you can link relationally)
987
-     * @param  object $post    The post object of the cpt that was saved.
988
-     * @return void
989
-     * @throws \EE_Error
990
-     */
991
-    protected function _insert_update_cpt_item($post_id, $post)
992
-    {
993
-        if ($post instanceof WP_Post && $post->post_type !== 'espresso_events') {
994
-            // get out we're not processing an event save.
995
-            return;
996
-        }
997
-        $event_values = array(
998
-            'EVT_display_desc'                => ! empty($this->_req_data['display_desc']) ? 1 : 0,
999
-            'EVT_display_ticket_selector'     => ! empty($this->_req_data['display_ticket_selector']) ? 1 : 0,
1000
-            'EVT_additional_limit'            => min(
1001
-                apply_filters('FHEE__EE_Events_Admin__insert_update_cpt_item__EVT_additional_limit_max', 255),
1002
-                ! empty($this->_req_data['additional_limit']) ? $this->_req_data['additional_limit'] : null
1003
-            ),
1004
-            'EVT_default_registration_status' => ! empty($this->_req_data['EVT_default_registration_status'])
1005
-                ? $this->_req_data['EVT_default_registration_status']
1006
-                : EE_Registry::instance()->CFG->registration->default_STS_ID,
1007
-            'EVT_member_only'                 => ! empty($this->_req_data['member_only']) ? 1 : 0,
1008
-            'EVT_allow_overflow'              => ! empty($this->_req_data['EVT_allow_overflow']) ? 1 : 0,
1009
-            'EVT_timezone_string'             => ! empty($this->_req_data['timezone_string'])
1010
-                ? $this->_req_data['timezone_string'] : null,
1011
-            'EVT_external_URL'                => ! empty($this->_req_data['externalURL'])
1012
-                ? $this->_req_data['externalURL'] : null,
1013
-            'EVT_phone'                       => ! empty($this->_req_data['event_phone'])
1014
-                ? $this->_req_data['event_phone'] : null,
1015
-        );
1016
-        // update event
1017
-        $success = $this->_event_model()->update_by_ID($event_values, $post_id);
1018
-        // get event_object for other metaboxes... though it would seem to make sense to just use $this->_event_model()->get_one_by_ID( $post_id ).. i have to setup where conditions to override the filters in the model that filter out autodraft and inherit statuses so we GET the inherit id!
1019
-        $get_one_where = array(
1020
-            $this->_event_model()->primary_key_name() => $post_id,
1021
-            'OR'                                      => array(
1022
-                'status'   => $post->post_status,
1023
-                // if trying to "Publish" a sold out event, it's status will get switched back to "sold_out" in the db,
1024
-                // but the returned object here has a status of "publish", so use the original post status as well
1025
-                'status*1' => $this->_req_data['original_post_status'],
1026
-            ),
1027
-        );
1028
-        $event = $this->_event_model()->get_one(array($get_one_where));
1029
-        // the following are default callbacks for event attachment updates that can be overridden by caffeinated functionality and/or addons.
1030
-        $event_update_callbacks = apply_filters(
1031
-            'FHEE__Events_Admin_Page___insert_update_cpt_item__event_update_callbacks',
1032
-            array(
1033
-                array($this, '_default_venue_update'),
1034
-                array($this, '_default_tickets_update'),
1035
-            )
1036
-        );
1037
-        $att_success = true;
1038
-        foreach ($event_update_callbacks as $e_callback) {
1039
-            $_success = is_callable($e_callback)
1040
-                ? call_user_func($e_callback, $event, $this->_req_data)
1041
-                : false;
1042
-            // if ANY of these updates fail then we want the appropriate global error message
1043
-            $att_success = ! $att_success ? $att_success : $_success;
1044
-        }
1045
-        // any errors?
1046
-        if ($success && false === $att_success) {
1047
-            EE_Error::add_error(
1048
-                esc_html__(
1049
-                    'Event Details saved successfully but something went wrong with saving attachments.',
1050
-                    'event_espresso'
1051
-                ),
1052
-                __FILE__,
1053
-                __FUNCTION__,
1054
-                __LINE__
1055
-            );
1056
-        } elseif ($success === false) {
1057
-            EE_Error::add_error(
1058
-                esc_html__('Event Details did not save successfully.', 'event_espresso'),
1059
-                __FILE__,
1060
-                __FUNCTION__,
1061
-                __LINE__
1062
-            );
1063
-        }
1064
-    }
1065
-
1066
-
1067
-    /**
1068
-     * @see parent::restore_item()
1069
-     * @param int $post_id
1070
-     * @param int $revision_id
1071
-     */
1072
-    protected function _restore_cpt_item($post_id, $revision_id)
1073
-    {
1074
-        // copy existing event meta to new post
1075
-        $post_evt = $this->_event_model()->get_one_by_ID($post_id);
1076
-        if ($post_evt instanceof EE_Event) {
1077
-            // meta revision restore
1078
-            $post_evt->restore_revision($revision_id);
1079
-            // related objs restore
1080
-            $post_evt->restore_revision($revision_id, array('Venue', 'Datetime', 'Price'));
1081
-        }
1082
-    }
1083
-
1084
-
1085
-    /**
1086
-     * Attach the venue to the Event
1087
-     *
1088
-     * @param  \EE_Event $evtobj Event Object to add the venue to
1089
-     * @param  array     $data   The request data from the form
1090
-     * @return bool           Success or fail.
1091
-     */
1092
-    protected function _default_venue_update(\EE_Event $evtobj, $data)
1093
-    {
1094
-        require_once(EE_MODELS . 'EEM_Venue.model.php');
1095
-        $venue_model = EE_Registry::instance()->load_model('Venue');
1096
-        $rows_affected = null;
1097
-        $venue_id = ! empty($data['venue_id']) ? $data['venue_id'] : null;
1098
-        // very important.  If we don't have a venue name...
1099
-        // then we'll get out because not necessary to create empty venue
1100
-        if (empty($data['venue_title'])) {
1101
-            return false;
1102
-        }
1103
-        $venue_array = array(
1104
-            'VNU_wp_user'         => $evtobj->get('EVT_wp_user'),
1105
-            'VNU_name'            => ! empty($data['venue_title']) ? $data['venue_title'] : null,
1106
-            'VNU_desc'            => ! empty($data['venue_description']) ? $data['venue_description'] : null,
1107
-            'VNU_identifier'      => ! empty($data['venue_identifier']) ? $data['venue_identifier'] : null,
1108
-            'VNU_short_desc'      => ! empty($data['venue_short_description']) ? $data['venue_short_description']
1109
-                : null,
1110
-            'VNU_address'         => ! empty($data['address']) ? $data['address'] : null,
1111
-            'VNU_address2'        => ! empty($data['address2']) ? $data['address2'] : null,
1112
-            'VNU_city'            => ! empty($data['city']) ? $data['city'] : null,
1113
-            'STA_ID'              => ! empty($data['state']) ? $data['state'] : null,
1114
-            'CNT_ISO'             => ! empty($data['countries']) ? $data['countries'] : null,
1115
-            'VNU_zip'             => ! empty($data['zip']) ? $data['zip'] : null,
1116
-            'VNU_phone'           => ! empty($data['venue_phone']) ? $data['venue_phone'] : null,
1117
-            'VNU_capacity'        => ! empty($data['venue_capacity']) ? $data['venue_capacity'] : null,
1118
-            'VNU_url'             => ! empty($data['venue_url']) ? $data['venue_url'] : null,
1119
-            'VNU_virtual_phone'   => ! empty($data['virtual_phone']) ? $data['virtual_phone'] : null,
1120
-            'VNU_virtual_url'     => ! empty($data['virtual_url']) ? $data['virtual_url'] : null,
1121
-            'VNU_enable_for_gmap' => isset($data['enable_for_gmap']) ? 1 : 0,
1122
-            'status'              => 'publish',
1123
-        );
1124
-        // if we've got the venue_id then we're just updating the existing venue so let's do that and then get out.
1125
-        if (! empty($venue_id)) {
1126
-            $update_where = array($venue_model->primary_key_name() => $venue_id);
1127
-            $rows_affected = $venue_model->update($venue_array, array($update_where));
1128
-            // we've gotta make sure that the venue is always attached to a revision.. add_relation_to should take care of making sure that the relation is already present.
1129
-            $evtobj->_add_relation_to($venue_id, 'Venue');
1130
-            return $rows_affected > 0 ? true : false;
1131
-        } else {
1132
-            // we insert the venue
1133
-            $venue_id = $venue_model->insert($venue_array);
1134
-            $evtobj->_add_relation_to($venue_id, 'Venue');
1135
-            return ! empty($venue_id) ? true : false;
1136
-        }
1137
-        // when we have the ancestor come in it's already been handled by the revision save.
1138
-    }
1139
-
1140
-
1141
-    /**
1142
-     * Handles saving everything related to Tickets (datetimes, tickets, prices)
1143
-     *
1144
-     * @param  EE_Event $evtobj The Event object we're attaching data to
1145
-     * @param  array    $data   The request data from the form
1146
-     * @return array
1147
-     */
1148
-    protected function _default_tickets_update(EE_Event $evtobj, $data)
1149
-    {
1150
-        $success = true;
1151
-        $saved_dtt = null;
1152
-        $saved_tickets = array();
1153
-        $incoming_date_formats = array('Y-m-d', 'h:i a');
1154
-        foreach ($data['edit_event_datetimes'] as $row => $dtt) {
1155
-            // trim all values to ensure any excess whitespace is removed.
1156
-            $dtt = array_map('trim', $dtt);
1157
-            $dtt['DTT_EVT_end'] = isset($dtt['DTT_EVT_end']) && ! empty($dtt['DTT_EVT_end']) ? $dtt['DTT_EVT_end']
1158
-                : $dtt['DTT_EVT_start'];
1159
-            $datetime_values = array(
1160
-                'DTT_ID'        => ! empty($dtt['DTT_ID']) ? $dtt['DTT_ID'] : null,
1161
-                'DTT_EVT_start' => $dtt['DTT_EVT_start'],
1162
-                'DTT_EVT_end'   => $dtt['DTT_EVT_end'],
1163
-                'DTT_reg_limit' => empty($dtt['DTT_reg_limit']) ? EE_INF : $dtt['DTT_reg_limit'],
1164
-                'DTT_order'     => $row,
1165
-            );
1166
-            // if we have an id then let's get existing object first and then set the new values.  Otherwise we instantiate a new object for save.
1167
-            if (! empty($dtt['DTT_ID'])) {
1168
-                $DTM = EE_Registry::instance()
1169
-                                  ->load_model('Datetime', array($evtobj->get_timezone()))
1170
-                                  ->get_one_by_ID($dtt['DTT_ID']);
1171
-                $DTM->set_date_format($incoming_date_formats[0]);
1172
-                $DTM->set_time_format($incoming_date_formats[1]);
1173
-                foreach ($datetime_values as $field => $value) {
1174
-                    $DTM->set($field, $value);
1175
-                }
1176
-                // make sure the $dtt_id here is saved just in case after the add_relation_to() the autosave replaces it.  We need to do this so we dont' TRASH the parent DTT.
1177
-                $saved_dtts[ $DTM->ID() ] = $DTM;
1178
-            } else {
1179
-                $DTM = EE_Registry::instance()->load_class(
1180
-                    'Datetime',
1181
-                    array($datetime_values, $evtobj->get_timezone(), $incoming_date_formats),
1182
-                    false,
1183
-                    false
1184
-                );
1185
-                foreach ($datetime_values as $field => $value) {
1186
-                    $DTM->set($field, $value);
1187
-                }
1188
-            }
1189
-            $DTM->save();
1190
-            $DTT = $evtobj->_add_relation_to($DTM, 'Datetime');
1191
-            // load DTT helper
1192
-            // before going any further make sure our dates are setup correctly so that the end date is always equal or greater than the start date.
1193
-            if ($DTT->get_raw('DTT_EVT_start') > $DTT->get_raw('DTT_EVT_end')) {
1194
-                $DTT->set('DTT_EVT_end', $DTT->get('DTT_EVT_start'));
1195
-                $DTT = EEH_DTT_Helper::date_time_add($DTT, 'DTT_EVT_end', 'days');
1196
-                $DTT->save();
1197
-            }
1198
-            // now we got to make sure we add the new DTT_ID to the $saved_dtts array  because it is possible there was a new one created for the autosave.
1199
-            $saved_dtt = $DTT;
1200
-            $success = ! $success ? $success : $DTT;
1201
-            // if ANY of these updates fail then we want the appropriate global error message.
1202
-            // //todo this is actually sucky we need a better error message but this is what it is for now.
1203
-        }
1204
-        // no dtts get deleted so we don't do any of that logic here.
1205
-        // update tickets next
1206
-        $old_tickets = isset($data['ticket_IDs']) ? explode(',', $data['ticket_IDs']) : array();
1207
-        foreach ($data['edit_tickets'] as $row => $tkt) {
1208
-            $incoming_date_formats = array('Y-m-d', 'h:i a');
1209
-            $update_prices = false;
1210
-            $ticket_price = isset($data['edit_prices'][ $row ][1]['PRC_amount'])
1211
-                ? $data['edit_prices'][ $row ][1]['PRC_amount'] : 0;
1212
-            // trim inputs to ensure any excess whitespace is removed.
1213
-            $tkt = array_map('trim', $tkt);
1214
-            if (empty($tkt['TKT_start_date'])) {
1215
-                // let's use now in the set timezone.
1216
-                $now = new DateTime('now', new DateTimeZone($evtobj->get_timezone()));
1217
-                $tkt['TKT_start_date'] = $now->format($incoming_date_formats[0] . ' ' . $incoming_date_formats[1]);
1218
-            }
1219
-            if (empty($tkt['TKT_end_date'])) {
1220
-                // use the start date of the first datetime
1221
-                $dtt = $evtobj->first_datetime();
1222
-                $tkt['TKT_end_date'] = $dtt->start_date_and_time(
1223
-                    $incoming_date_formats[0],
1224
-                    $incoming_date_formats[1]
1225
-                );
1226
-            }
1227
-            $TKT_values = array(
1228
-                'TKT_ID'          => ! empty($tkt['TKT_ID']) ? $tkt['TKT_ID'] : null,
1229
-                'TTM_ID'          => ! empty($tkt['TTM_ID']) ? $tkt['TTM_ID'] : 0,
1230
-                'TKT_name'        => ! empty($tkt['TKT_name']) ? $tkt['TKT_name'] : '',
1231
-                'TKT_description' => ! empty($tkt['TKT_description']) ? $tkt['TKT_description'] : '',
1232
-                'TKT_start_date'  => $tkt['TKT_start_date'],
1233
-                'TKT_end_date'    => $tkt['TKT_end_date'],
1234
-                'TKT_qty'         => ! isset($tkt['TKT_qty']) || $tkt['TKT_qty'] === '' ? EE_INF : $tkt['TKT_qty'],
1235
-                'TKT_uses'        => ! isset($tkt['TKT_uses']) || $tkt['TKT_uses'] === '' ? EE_INF : $tkt['TKT_uses'],
1236
-                'TKT_min'         => empty($tkt['TKT_min']) ? 0 : $tkt['TKT_min'],
1237
-                'TKT_max'         => empty($tkt['TKT_max']) ? EE_INF : $tkt['TKT_max'],
1238
-                'TKT_row'         => $row,
1239
-                'TKT_order'       => isset($tkt['TKT_order']) ? $tkt['TKT_order'] : $row,
1240
-                'TKT_price'       => $ticket_price,
1241
-            );
1242
-            // if this is a default TKT, then we need to set the TKT_ID to 0 and update accordingly, which means in turn that the prices will become new prices as well.
1243
-            if (isset($tkt['TKT_is_default']) && $tkt['TKT_is_default']) {
1244
-                $TKT_values['TKT_ID'] = 0;
1245
-                $TKT_values['TKT_is_default'] = 0;
1246
-                $TKT_values['TKT_price'] = $ticket_price;
1247
-                $update_prices = true;
1248
-            }
1249
-            // if we have a TKT_ID then we need to get that existing TKT_obj and update it
1250
-            // we actually do our saves a head of doing any add_relations to because its entirely possible that this ticket didn't removed or added to any datetime in the session but DID have it's items modified.
1251
-            // keep in mind that if the TKT has been sold (and we have changed pricing information), then we won't be updating the tkt but instead a new tkt will be created and the old one archived.
1252
-            if (! empty($tkt['TKT_ID'])) {
1253
-                $TKT = EE_Registry::instance()
1254
-                                  ->load_model('Ticket', array($evtobj->get_timezone()))
1255
-                                  ->get_one_by_ID($tkt['TKT_ID']);
1256
-                if ($TKT instanceof EE_Ticket) {
1257
-                    $ticket_sold = $TKT->count_related(
1258
-                        'Registration',
1259
-                        array(
1260
-                            array(
1261
-                                'STS_ID' => array(
1262
-                                    'NOT IN',
1263
-                                    array(EEM_Registration::status_id_incomplete),
1264
-                                ),
1265
-                            ),
1266
-                        )
1267
-                    ) > 0 ? true : false;
1268
-                    // let's just check the total price for the existing ticket and determine if it matches the new total price.  if they are different then we create a new ticket (if tkts sold) if they aren't different then we go ahead and modify existing ticket.
1269
-                    $create_new_TKT = $ticket_sold && $ticket_price != $TKT->get('TKT_price')
1270
-                                      && ! $TKT->get('TKT_deleted');
1271
-                    $TKT->set_date_format($incoming_date_formats[0]);
1272
-                    $TKT->set_time_format($incoming_date_formats[1]);
1273
-                    // set new values
1274
-                    foreach ($TKT_values as $field => $value) {
1275
-                        if ($field == 'TKT_qty') {
1276
-                            $TKT->set_qty($value);
1277
-                        } else {
1278
-                            $TKT->set($field, $value);
1279
-                        }
1280
-                    }
1281
-                    // if $create_new_TKT is false then we can safely update the existing ticket.  Otherwise we have to create a new ticket.
1282
-                    if ($create_new_TKT) {
1283
-                        // archive the old ticket first
1284
-                        $TKT->set('TKT_deleted', 1);
1285
-                        $TKT->save();
1286
-                        // make sure this ticket is still recorded in our saved_tkts so we don't run it through the regular trash routine.
1287
-                        $saved_tickets[ $TKT->ID() ] = $TKT;
1288
-                        // create new ticket that's a copy of the existing except a new id of course (and not archived) AND has the new TKT_price associated with it.
1289
-                        $TKT = clone $TKT;
1290
-                        $TKT->set('TKT_ID', 0);
1291
-                        $TKT->set('TKT_deleted', 0);
1292
-                        $TKT->set('TKT_price', $ticket_price);
1293
-                        $TKT->set('TKT_sold', 0);
1294
-                        // now we need to make sure that $new prices are created as well and attached to new ticket.
1295
-                        $update_prices = true;
1296
-                    }
1297
-                    // make sure price is set if it hasn't been already
1298
-                    $TKT->set('TKT_price', $ticket_price);
1299
-                }
1300
-            } else {
1301
-                // no TKT_id so a new TKT
1302
-                $TKT_values['TKT_price'] = $ticket_price;
1303
-                $TKT = EE_Registry::instance()->load_class('Ticket', array($TKT_values), false, false);
1304
-                if ($TKT instanceof EE_Ticket) {
1305
-                    // need to reset values to properly account for the date formats
1306
-                    $TKT->set_date_format($incoming_date_formats[0]);
1307
-                    $TKT->set_time_format($incoming_date_formats[1]);
1308
-                    $TKT->set_timezone($evtobj->get_timezone());
1309
-                    // set new values
1310
-                    foreach ($TKT_values as $field => $value) {
1311
-                        if ($field == 'TKT_qty') {
1312
-                            $TKT->set_qty($value);
1313
-                        } else {
1314
-                            $TKT->set($field, $value);
1315
-                        }
1316
-                    }
1317
-                    $update_prices = true;
1318
-                }
1319
-            }
1320
-            // cap ticket qty by datetime reg limits
1321
-            $TKT->set_qty(min($TKT->qty(), $TKT->qty('reg_limit')));
1322
-            // update ticket.
1323
-            $TKT->save();
1324
-            // before going any further make sure our dates are setup correctly so that the end date is always equal or greater than the start date.
1325
-            if ($TKT->get_raw('TKT_start_date') > $TKT->get_raw('TKT_end_date')) {
1326
-                $TKT->set('TKT_end_date', $TKT->get('TKT_start_date'));
1327
-                $TKT = EEH_DTT_Helper::date_time_add($TKT, 'TKT_end_date', 'days');
1328
-                $TKT->save();
1329
-            }
1330
-            // initially let's add the ticket to the dtt
1331
-            $saved_dtt->_add_relation_to($TKT, 'Ticket');
1332
-            $saved_tickets[ $TKT->ID() ] = $TKT;
1333
-            // add prices to ticket
1334
-            $this->_add_prices_to_ticket($data['edit_prices'][ $row ], $TKT, $update_prices);
1335
-        }
1336
-        // however now we need to handle permanently deleting tickets via the ui.  Keep in mind that the ui does not allow deleting/archiving tickets that have ticket sold.  However, it does allow for deleting tickets that have no tickets sold, in which case we want to get rid of permanently because there is no need to save in db.
1337
-        $old_tickets = isset($old_tickets[0]) && $old_tickets[0] == '' ? array() : $old_tickets;
1338
-        $tickets_removed = array_diff($old_tickets, array_keys($saved_tickets));
1339
-        foreach ($tickets_removed as $id) {
1340
-            $id = absint($id);
1341
-            // get the ticket for this id
1342
-            $tkt_to_remove = EE_Registry::instance()->load_model('Ticket')->get_one_by_ID($id);
1343
-            // need to get all the related datetimes on this ticket and remove from every single one of them (remember this process can ONLY kick off if there are NO tkts_sold)
1344
-            $dtts = $tkt_to_remove->get_many_related('Datetime');
1345
-            foreach ($dtts as $dtt) {
1346
-                $tkt_to_remove->_remove_relation_to($dtt, 'Datetime');
1347
-            }
1348
-            // need to do the same for prices (except these prices can also be deleted because again, tickets can only be trashed if they don't have any TKTs sold (otherwise they are just archived))
1349
-            $tkt_to_remove->delete_related_permanently('Price');
1350
-            // finally let's delete this ticket (which should not be blocked at this point b/c we've removed all our relationships)
1351
-            $tkt_to_remove->delete_permanently();
1352
-        }
1353
-        return array($saved_dtt, $saved_tickets);
1354
-    }
1355
-
1356
-
1357
-    /**
1358
-     * This attaches a list of given prices to a ticket.
1359
-     * Note we dont' have to worry about ever removing relationships (or archiving prices) because if there is a change
1360
-     * in price information on a ticket, a new ticket is created anyways so the archived ticket will retain the old
1361
-     * price info and prices are automatically "archived" via the ticket.
1362
-     *
1363
-     * @access  private
1364
-     * @param array     $prices     Array of prices from the form.
1365
-     * @param EE_Ticket $ticket     EE_Ticket object that prices are being attached to.
1366
-     * @param bool      $new_prices Whether attach existing incoming prices or create new ones.
1367
-     * @return  void
1368
-     */
1369
-    private function _add_prices_to_ticket($prices, EE_Ticket $ticket, $new_prices = false)
1370
-    {
1371
-        foreach ($prices as $row => $prc) {
1372
-            $PRC_values = array(
1373
-                'PRC_ID'         => ! empty($prc['PRC_ID']) ? $prc['PRC_ID'] : null,
1374
-                'PRT_ID'         => ! empty($prc['PRT_ID']) ? $prc['PRT_ID'] : null,
1375
-                'PRC_amount'     => ! empty($prc['PRC_amount']) ? $prc['PRC_amount'] : 0,
1376
-                'PRC_name'       => ! empty($prc['PRC_name']) ? $prc['PRC_name'] : '',
1377
-                'PRC_desc'       => ! empty($prc['PRC_desc']) ? $prc['PRC_desc'] : '',
1378
-                'PRC_is_default' => 0, // make sure prices are NOT set as default from this context
1379
-                'PRC_order'      => $row,
1380
-            );
1381
-            if ($new_prices || empty($PRC_values['PRC_ID'])) {
1382
-                $PRC_values['PRC_ID'] = 0;
1383
-                $PRC = EE_Registry::instance()->load_class('Price', array($PRC_values), false, false);
1384
-            } else {
1385
-                $PRC = EE_Registry::instance()->load_model('Price')->get_one_by_ID($prc['PRC_ID']);
1386
-                // update this price with new values
1387
-                foreach ($PRC_values as $field => $newprc) {
1388
-                    $PRC->set($field, $newprc);
1389
-                }
1390
-                $PRC->save();
1391
-            }
1392
-            $ticket->_add_relation_to($PRC, 'Price');
1393
-        }
1394
-    }
1395
-
1396
-
1397
-    /**
1398
-     * Add in our autosave ajax handlers
1399
-     *
1400
-     */
1401
-    protected function _ee_autosave_create_new()
1402
-    {
1403
-    }
1404
-
1405
-
1406
-    /**
1407
-     * More autosave handlers.
1408
-     */
1409
-    protected function _ee_autosave_edit()
1410
-    {
1411
-        return; // TEMPORARILY EXITING CAUSE THIS IS A TODO
1412
-    }
1413
-
1414
-
1415
-    /**
1416
-     *    _generate_publish_box_extra_content
1417
-     */
1418
-    private function _generate_publish_box_extra_content()
1419
-    {
1420
-        // load formatter helper
1421
-        // args for getting related registrations
1422
-        $approved_query_args = array(
1423
-            array(
1424
-                'REG_deleted' => 0,
1425
-                'STS_ID'      => EEM_Registration::status_id_approved,
1426
-            ),
1427
-        );
1428
-        $not_approved_query_args = array(
1429
-            array(
1430
-                'REG_deleted' => 0,
1431
-                'STS_ID'      => EEM_Registration::status_id_not_approved,
1432
-            ),
1433
-        );
1434
-        $pending_payment_query_args = array(
1435
-            array(
1436
-                'REG_deleted' => 0,
1437
-                'STS_ID'      => EEM_Registration::status_id_pending_payment,
1438
-            ),
1439
-        );
1440
-        // publish box
1441
-        $publish_box_extra_args = array(
1442
-            'view_approved_reg_url'        => add_query_arg(
1443
-                array(
1444
-                    'action'      => 'default',
1445
-                    'event_id'    => $this->_cpt_model_obj->ID(),
1446
-                    '_reg_status' => EEM_Registration::status_id_approved,
1447
-                ),
1448
-                REG_ADMIN_URL
1449
-            ),
1450
-            'view_not_approved_reg_url'    => add_query_arg(
1451
-                array(
1452
-                    'action'      => 'default',
1453
-                    'event_id'    => $this->_cpt_model_obj->ID(),
1454
-                    '_reg_status' => EEM_Registration::status_id_not_approved,
1455
-                ),
1456
-                REG_ADMIN_URL
1457
-            ),
1458
-            'view_pending_payment_reg_url' => add_query_arg(
1459
-                array(
1460
-                    'action'      => 'default',
1461
-                    'event_id'    => $this->_cpt_model_obj->ID(),
1462
-                    '_reg_status' => EEM_Registration::status_id_pending_payment,
1463
-                ),
1464
-                REG_ADMIN_URL
1465
-            ),
1466
-            'approved_regs'                => $this->_cpt_model_obj->count_related(
1467
-                'Registration',
1468
-                $approved_query_args
1469
-            ),
1470
-            'not_approved_regs'            => $this->_cpt_model_obj->count_related(
1471
-                'Registration',
1472
-                $not_approved_query_args
1473
-            ),
1474
-            'pending_payment_regs'         => $this->_cpt_model_obj->count_related(
1475
-                'Registration',
1476
-                $pending_payment_query_args
1477
-            ),
1478
-            'misc_pub_section_class'       => apply_filters(
1479
-                'FHEE_Events_Admin_Page___generate_publish_box_extra_content__misc_pub_section_class',
1480
-                'misc-pub-section'
1481
-            ),
1482
-        );
1483
-        ob_start();
1484
-        do_action(
1485
-            'AHEE__Events_Admin_Page___generate_publish_box_extra_content__event_editor_overview_add',
1486
-            $this->_cpt_model_obj
1487
-        );
1488
-        $publish_box_extra_args['event_editor_overview_add'] = ob_get_clean();
1489
-        // load template
1490
-        EEH_Template::display_template(
1491
-            EVENTS_TEMPLATE_PATH . 'event_publish_box_extras.template.php',
1492
-            $publish_box_extra_args
1493
-        );
1494
-    }
1495
-
1496
-
1497
-    /**
1498
-     * @return EE_Event
1499
-     */
1500
-    public function get_event_object()
1501
-    {
1502
-        return $this->_cpt_model_obj;
1503
-    }
1504
-
1505
-
1506
-
1507
-
1508
-    /** METABOXES * */
1509
-    /**
1510
-     * _register_event_editor_meta_boxes
1511
-     * add all metaboxes related to the event_editor
1512
-     *
1513
-     * @return void
1514
-     */
1515
-    protected function _register_event_editor_meta_boxes()
1516
-    {
1517
-        $this->verify_cpt_object();
1518
-        add_meta_box(
1519
-            'espresso_event_editor_tickets',
1520
-            esc_html__('Event Datetime & Ticket', 'event_espresso'),
1521
-            array($this, 'ticket_metabox'),
1522
-            $this->page_slug,
1523
-            'normal',
1524
-            'high'
1525
-        );
1526
-        add_meta_box(
1527
-            'espresso_event_editor_event_options',
1528
-            esc_html__('Event Registration Options', 'event_espresso'),
1529
-            array($this, 'registration_options_meta_box'),
1530
-            $this->page_slug,
1531
-            'side',
1532
-            'default'
1533
-        );
1534
-        // NOTE: if you're looking for other metaboxes in here,
1535
-        // where a metabox has a related management page in the admin
1536
-        // you will find it setup in the related management page's "_Hooks" file.
1537
-        // i.e. messages metabox is found in "espresso_events_Messages_Hooks.class.php".
1538
-    }
1539
-
1540
-
1541
-    /**
1542
-     * @throws DomainException
1543
-     * @throws EE_Error
1544
-     */
1545
-    public function ticket_metabox()
1546
-    {
1547
-        $existing_datetime_ids = $existing_ticket_ids = array();
1548
-        // defaults for template args
1549
-        $template_args = array(
1550
-            'existing_datetime_ids'    => '',
1551
-            'event_datetime_help_link' => '',
1552
-            'ticket_options_help_link' => '',
1553
-            'time'                     => null,
1554
-            'ticket_rows'              => '',
1555
-            'existing_ticket_ids'      => '',
1556
-            'total_ticket_rows'        => 1,
1557
-            'ticket_js_structure'      => '',
1558
-            'trash_icon'               => 'ee-lock-icon',
1559
-            'disabled'                 => '',
1560
-        );
1561
-        $event_id = is_object($this->_cpt_model_obj) ? $this->_cpt_model_obj->ID() : null;
1562
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1563
-        /**
1564
-         * 1. Start with retrieving Datetimes
1565
-         * 2. Fore each datetime get related tickets
1566
-         * 3. For each ticket get related prices
1567
-         */
1568
-        $times = EE_Registry::instance()->load_model('Datetime')->get_all_event_dates($event_id);
1569
-        /** @type EE_Datetime $first_datetime */
1570
-        $first_datetime = reset($times);
1571
-        // do we get related tickets?
1572
-        if ($first_datetime instanceof EE_Datetime
1573
-            && $first_datetime->ID() !== 0
1574
-        ) {
1575
-            $existing_datetime_ids[] = $first_datetime->get('DTT_ID');
1576
-            $template_args['time'] = $first_datetime;
1577
-            $related_tickets = $first_datetime->tickets(
1578
-                array(
1579
-                    array('OR' => array('TKT_deleted' => 1, 'TKT_deleted*' => 0)),
1580
-                    'default_where_conditions' => 'none',
1581
-                )
1582
-            );
1583
-            if (! empty($related_tickets)) {
1584
-                $template_args['total_ticket_rows'] = count($related_tickets);
1585
-                $row = 0;
1586
-                foreach ($related_tickets as $ticket) {
1587
-                    $existing_ticket_ids[] = $ticket->get('TKT_ID');
1588
-                    $template_args['ticket_rows'] .= $this->_get_ticket_row($ticket, false, $row);
1589
-                    $row++;
1590
-                }
1591
-            } else {
1592
-                $template_args['total_ticket_rows'] = 1;
1593
-                /** @type EE_Ticket $ticket */
1594
-                $ticket = EE_Registry::instance()->load_model('Ticket')->create_default_object();
1595
-                $template_args['ticket_rows'] .= $this->_get_ticket_row($ticket);
1596
-            }
1597
-        } else {
1598
-            $template_args['time'] = $times[0];
1599
-            /** @type EE_Ticket $ticket */
1600
-            $ticket = EE_Registry::instance()->load_model('Ticket')->get_all_default_tickets();
1601
-            $template_args['ticket_rows'] .= $this->_get_ticket_row($ticket[1]);
1602
-            // NOTE: we're just sending the first default row
1603
-            // (decaf can't manage default tickets so this should be sufficient);
1604
-        }
1605
-        $template_args['event_datetime_help_link'] = $this->_get_help_tab_link(
1606
-            'event_editor_event_datetimes_help_tab'
1607
-        );
1608
-        $template_args['ticket_options_help_link'] = $this->_get_help_tab_link('ticket_options_info');
1609
-        $template_args['existing_datetime_ids'] = implode(',', $existing_datetime_ids);
1610
-        $template_args['existing_ticket_ids'] = implode(',', $existing_ticket_ids);
1611
-        $template_args['ticket_js_structure'] = $this->_get_ticket_row(
1612
-            EE_Registry::instance()->load_model('Ticket')->create_default_object(),
1613
-            true
1614
-        );
1615
-        $template = apply_filters(
1616
-            'FHEE__Events_Admin_Page__ticket_metabox__template',
1617
-            EVENTS_TEMPLATE_PATH . 'event_tickets_metabox_main.template.php'
1618
-        );
1619
-        EEH_Template::display_template($template, $template_args);
1620
-    }
1621
-
1622
-
1623
-    /**
1624
-     * Setup an individual ticket form for the decaf event editor page
1625
-     *
1626
-     * @access private
1627
-     * @param  EE_Ticket $ticket   the ticket object
1628
-     * @param  boolean   $skeleton whether we're generating a skeleton for js manipulation
1629
-     * @param int        $row
1630
-     * @return string generated html for the ticket row.
1631
-     */
1632
-    private function _get_ticket_row($ticket, $skeleton = false, $row = 0)
1633
-    {
1634
-        $template_args = array(
1635
-            'tkt_status_class'    => ' tkt-status-' . $ticket->ticket_status(),
1636
-            'tkt_archive_class'   => $ticket->ticket_status() === EE_Ticket::archived && ! $skeleton ? ' tkt-archived'
1637
-                : '',
1638
-            'ticketrow'           => $skeleton ? 'TICKETNUM' : $row,
1639
-            'TKT_ID'              => $ticket->get('TKT_ID'),
1640
-            'TKT_name'            => $ticket->get('TKT_name'),
1641
-            'TKT_start_date'      => $skeleton ? '' : $ticket->get_date('TKT_start_date', 'Y-m-d h:i a'),
1642
-            'TKT_end_date'        => $skeleton ? '' : $ticket->get_date('TKT_end_date', 'Y-m-d h:i a'),
1643
-            'TKT_is_default'      => $ticket->get('TKT_is_default'),
1644
-            'TKT_qty'             => $ticket->get_pretty('TKT_qty', 'input'),
1645
-            'edit_ticketrow_name' => $skeleton ? 'TICKETNAMEATTR' : 'edit_tickets',
1646
-            'TKT_sold'            => $skeleton ? 0 : $ticket->get('TKT_sold'),
1647
-            'trash_icon'          => ($skeleton || (! empty($ticket) && ! $ticket->get('TKT_deleted')))
1648
-                                     && (! empty($ticket) && $ticket->get('TKT_sold') === 0)
1649
-                ? 'trash-icon dashicons dashicons-post-trash clickable' : 'ee-lock-icon',
1650
-            'disabled'            => $skeleton || (! empty($ticket) && ! $ticket->get('TKT_deleted')) ? ''
1651
-                : ' disabled=disabled',
1652
-        );
1653
-        $price = $ticket->ID() !== 0
1654
-            ? $ticket->get_first_related('Price', array('default_where_conditions' => 'none'))
1655
-            : EE_Registry::instance()->load_model('Price')->create_default_object();
1656
-        $price_args = array(
1657
-            'price_currency_symbol' => EE_Registry::instance()->CFG->currency->sign,
1658
-            'PRC_amount'            => $price->get('PRC_amount'),
1659
-            'PRT_ID'                => $price->get('PRT_ID'),
1660
-            'PRC_ID'                => $price->get('PRC_ID'),
1661
-            'PRC_is_default'        => $price->get('PRC_is_default'),
1662
-        );
1663
-        // make sure we have default start and end dates if skeleton
1664
-        // handle rows that should NOT be empty
1665
-        if (empty($template_args['TKT_start_date'])) {
1666
-            // if empty then the start date will be now.
1667
-            $template_args['TKT_start_date'] = date('Y-m-d h:i a', current_time('timestamp'));
1668
-        }
1669
-        if (empty($template_args['TKT_end_date'])) {
1670
-            // get the earliest datetime (if present);
1671
-            $earliest_dtt = $this->_cpt_model_obj->ID() > 0
1672
-                ? $this->_cpt_model_obj->get_first_related(
1673
-                    'Datetime',
1674
-                    array('order_by' => array('DTT_EVT_start' => 'ASC'))
1675
-                )
1676
-                : null;
1677
-            if (! empty($earliest_dtt)) {
1678
-                $template_args['TKT_end_date'] = $earliest_dtt->get_datetime('DTT_EVT_start', 'Y-m-d', 'h:i a');
1679
-            } else {
1680
-                $template_args['TKT_end_date'] = date(
1681
-                    'Y-m-d h:i a',
1682
-                    mktime(0, 0, 0, date("m"), date("d") + 7, date("Y"))
1683
-                );
1684
-            }
1685
-        }
1686
-        $template_args = array_merge($template_args, $price_args);
1687
-        $template = apply_filters(
1688
-            'FHEE__Events_Admin_Page__get_ticket_row__template',
1689
-            EVENTS_TEMPLATE_PATH . 'event_tickets_metabox_ticket_row.template.php',
1690
-            $ticket
1691
-        );
1692
-        return EEH_Template::display_template($template, $template_args, true);
1693
-    }
1694
-
1695
-
1696
-    /**
1697
-     * @throws DomainException
1698
-     */
1699
-    public function registration_options_meta_box()
1700
-    {
1701
-        $yes_no_values = array(
1702
-            array('id' => true, 'text' => esc_html__('Yes', 'event_espresso')),
1703
-            array('id' => false, 'text' => esc_html__('No', 'event_espresso')),
1704
-        );
1705
-        $default_reg_status_values = EEM_Registration::reg_status_array(
1706
-            array(
1707
-                EEM_Registration::status_id_cancelled,
1708
-                EEM_Registration::status_id_declined,
1709
-                EEM_Registration::status_id_incomplete,
1710
-            ),
1711
-            true
1712
-        );
1713
-        // $template_args['is_active_select'] = EEH_Form_Fields::select_input('is_active', $yes_no_values, $this->_cpt_model_obj->is_active());
1714
-        $template_args['_event'] = $this->_cpt_model_obj;
1715
-        $template_args['active_status'] = $this->_cpt_model_obj->pretty_active_status(false);
1716
-        $template_args['additional_limit'] = $this->_cpt_model_obj->additional_limit();
1717
-        $template_args['default_registration_status'] = EEH_Form_Fields::select_input(
1718
-            'default_reg_status',
1719
-            $default_reg_status_values,
1720
-            $this->_cpt_model_obj->default_registration_status()
1721
-        );
1722
-        $template_args['display_description'] = EEH_Form_Fields::select_input(
1723
-            'display_desc',
1724
-            $yes_no_values,
1725
-            $this->_cpt_model_obj->display_description()
1726
-        );
1727
-        $template_args['display_ticket_selector'] = EEH_Form_Fields::select_input(
1728
-            'display_ticket_selector',
1729
-            $yes_no_values,
1730
-            $this->_cpt_model_obj->display_ticket_selector(),
1731
-            '',
1732
-            '',
1733
-            false
1734
-        );
1735
-        $template_args['additional_registration_options'] = apply_filters(
1736
-            'FHEE__Events_Admin_Page__registration_options_meta_box__additional_registration_options',
1737
-            '',
1738
-            $template_args,
1739
-            $yes_no_values,
1740
-            $default_reg_status_values
1741
-        );
1742
-        EEH_Template::display_template(
1743
-            EVENTS_TEMPLATE_PATH . 'event_registration_options.template.php',
1744
-            $template_args
1745
-        );
1746
-    }
1747
-
1748
-
1749
-    /**
1750
-     * _get_events()
1751
-     * This method simply returns all the events (for the given _view and paging)
1752
-     *
1753
-     * @access public
1754
-     * @param int  $per_page     count of items per page (20 default);
1755
-     * @param int  $current_page what is the current page being viewed.
1756
-     * @param bool $count        if TRUE then we just return a count of ALL events matching the given _view.
1757
-     *                           If FALSE then we return an array of event objects
1758
-     *                           that match the given _view and paging parameters.
1759
-     * @return array an array of event objects.
1760
-     */
1761
-    public function get_events($per_page = 10, $current_page = 1, $count = false)
1762
-    {
1763
-        $EEME = $this->_event_model();
1764
-        $offset = ($current_page - 1) * $per_page;
1765
-        $limit = $count ? null : $offset . ',' . $per_page;
1766
-        $orderby = isset($this->_req_data['orderby']) ? $this->_req_data['orderby'] : 'EVT_ID';
1767
-        $order = isset($this->_req_data['order']) ? $this->_req_data['order'] : "DESC";
1768
-        if (isset($this->_req_data['month_range'])) {
1769
-            $pieces = explode(' ', $this->_req_data['month_range'], 3);
1770
-            // simulate the FIRST day of the month, that fixes issues for months like February
1771
-            // where PHP doesn't know what to assume for date.
1772
-            // @see https://events.codebasehq.com/projects/event-espresso/tickets/10437
1773
-            $month_r = ! empty($pieces[0]) ? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0])) : '';
1774
-            $year_r = ! empty($pieces[1]) ? $pieces[1] : '';
1775
-        }
1776
-        $where = array();
1777
-        $status = isset($this->_req_data['status']) ? $this->_req_data['status'] : null;
1778
-        // determine what post_status our condition will have for the query.
1779
-        switch ($status) {
1780
-            case 'month':
1781
-            case 'today':
1782
-            case null:
1783
-            case 'all':
1784
-                break;
1785
-            case 'draft':
1786
-                $where['status'] = array('IN', array('draft', 'auto-draft'));
1787
-                break;
1788
-            default:
1789
-                $where['status'] = $status;
1790
-        }
1791
-        // categories?
1792
-        $category = isset($this->_req_data['EVT_CAT']) && $this->_req_data['EVT_CAT'] > 0
1793
-            ? $this->_req_data['EVT_CAT'] : null;
1794
-        if (! empty($category)) {
1795
-            $where['Term_Taxonomy.taxonomy'] = EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY;
1796
-            $where['Term_Taxonomy.term_id'] = $category;
1797
-        }
1798
-        // date where conditions
1799
-        $start_formats = EEM_Datetime::instance()->get_formats_for('DTT_EVT_start');
1800
-        if (isset($this->_req_data['month_range']) && $this->_req_data['month_range'] != '') {
1801
-            $DateTime = new DateTime(
1802
-                $year_r . '-' . $month_r . '-01 00:00:00',
1803
-                new DateTimeZone(EEM_Datetime::instance()->get_timezone())
1804
-            );
1805
-            $start = $DateTime->format(implode(' ', $start_formats));
1806
-            $end = $DateTime->setDate(
1807
-                $year_r,
1808
-                $month_r,
1809
-                $DateTime
1810
-                    ->format('t')
1811
-            )->setTime(23, 59, 59)
1812
-                            ->format(implode(' ', $start_formats));
1813
-            $where['Datetime.DTT_EVT_start'] = array('BETWEEN', array($start, $end));
1814
-        } elseif (isset($this->_req_data['status']) && $this->_req_data['status'] == 'today') {
1815
-            $DateTime = new DateTime('now', new DateTimeZone(EEM_Event::instance()->get_timezone()));
1816
-            $start = $DateTime->setTime(0, 0, 0)->format(implode(' ', $start_formats));
1817
-            $end = $DateTime->setTime(23, 59, 59)->format(implode(' ', $start_formats));
1818
-            $where['Datetime.DTT_EVT_start'] = array('BETWEEN', array($start, $end));
1819
-        } elseif (isset($this->_req_data['status']) && $this->_req_data['status'] == 'month') {
1820
-            $now = date('Y-m-01');
1821
-            $DateTime = new DateTime($now, new DateTimeZone(EEM_Event::instance()->get_timezone()));
1822
-            $start = $DateTime->setTime(0, 0, 0)->format(implode(' ', $start_formats));
1823
-            $end = $DateTime->setDate(date('Y'), date('m'), $DateTime->format('t'))
1824
-                            ->setTime(23, 59, 59)
1825
-                            ->format(implode(' ', $start_formats));
1826
-            $where['Datetime.DTT_EVT_start'] = array('BETWEEN', array($start, $end));
1827
-        }
1828
-        if (! EE_Registry::instance()->CAP->current_user_can('ee_read_others_events', 'get_events')) {
1829
-            $where['EVT_wp_user'] = get_current_user_id();
1830
-        } else {
1831
-            if (! isset($where['status'])) {
1832
-                if (! EE_Registry::instance()->CAP->current_user_can('ee_read_private_events', 'get_events')) {
1833
-                    $where['OR'] = array(
1834
-                        'status*restrict_private' => array('!=', 'private'),
1835
-                        'AND'                     => array(
1836
-                            'status*inclusive' => array('=', 'private'),
1837
-                            'EVT_wp_user'      => get_current_user_id(),
1838
-                        ),
1839
-                    );
1840
-                }
1841
-            }
1842
-        }
1843
-        if (isset($this->_req_data['EVT_wp_user'])) {
1844
-            if ($this->_req_data['EVT_wp_user'] != get_current_user_id()
1845
-                && EE_Registry::instance()->CAP->current_user_can('ee_read_others_events', 'get_events')
1846
-            ) {
1847
-                $where['EVT_wp_user'] = $this->_req_data['EVT_wp_user'];
1848
-            }
1849
-        }
1850
-        // search query handling
1851
-        if (isset($this->_req_data['s'])) {
1852
-            $search_string = '%' . $this->_req_data['s'] . '%';
1853
-            $where['OR'] = array(
1854
-                'EVT_name'       => array('LIKE', $search_string),
1855
-                'EVT_desc'       => array('LIKE', $search_string),
1856
-                'EVT_short_desc' => array('LIKE', $search_string),
1857
-            );
1858
-        }
1859
-        // filter events by venue.
1860
-        if (isset($this->_req_data['venue']) && ! empty($this->_req_data['venue'])) {
1861
-            $where['Venue.VNU_ID'] = absint($this->_req_data['venue']);
1862
-        }
1863
-        $where = apply_filters('FHEE__Events_Admin_Page__get_events__where', $where, $this->_req_data);
1864
-        $query_params = apply_filters(
1865
-            'FHEE__Events_Admin_Page__get_events__query_params',
1866
-            array(
1867
-                $where,
1868
-                'limit'    => $limit,
1869
-                'order_by' => $orderby,
1870
-                'order'    => $order,
1871
-                'group_by' => 'EVT_ID',
1872
-            ),
1873
-            $this->_req_data
1874
-        );
1875
-        // let's first check if we have special requests coming in.
1876
-        if (isset($this->_req_data['active_status'])) {
1877
-            switch ($this->_req_data['active_status']) {
1878
-                case 'upcoming':
1879
-                    return $EEME->get_upcoming_events($query_params, $count);
1880
-                    break;
1881
-                case 'expired':
1882
-                    return $EEME->get_expired_events($query_params, $count);
1883
-                    break;
1884
-                case 'active':
1885
-                    return $EEME->get_active_events($query_params, $count);
1886
-                    break;
1887
-                case 'inactive':
1888
-                    return $EEME->get_inactive_events($query_params, $count);
1889
-                    break;
1890
-            }
1891
-        }
1892
-
1893
-        $events = $count ? $EEME->count(array($where), 'EVT_ID', true) : $EEME->get_all($query_params);
1894
-        return $events;
1895
-    }
1896
-
1897
-
1898
-    /**
1899
-     * handling for WordPress CPT actions (trash, restore, delete)
1900
-     *
1901
-     * @param string $post_id
1902
-     */
1903
-    public function trash_cpt_item($post_id)
1904
-    {
1905
-        $this->_req_data['EVT_ID'] = $post_id;
1906
-        $this->_trash_or_restore_event('trash', false);
1907
-    }
1908
-
1909
-
1910
-    /**
1911
-     * @param string $post_id
1912
-     */
1913
-    public function restore_cpt_item($post_id)
1914
-    {
1915
-        $this->_req_data['EVT_ID'] = $post_id;
1916
-        $this->_trash_or_restore_event('draft', false);
1917
-    }
1918
-
1919
-
1920
-    /**
1921
-     * @param string $post_id
1922
-     */
1923
-    public function delete_cpt_item($post_id)
1924
-    {
1925
-        throw new EE_Error(esc_html__('Please contact Event Espresso support with the details of the steps taken to produce this error.', 'event_espresso'));
1926
-        $this->_req_data['EVT_ID'] = $post_id;
1927
-        $this->_delete_event();
1928
-    }
1929
-
1930
-
1931
-    /**
1932
-     * _trash_or_restore_event
1933
-     *
1934
-     * @access protected
1935
-     * @param  string $event_status
1936
-     * @param bool    $redirect_after
1937
-     */
1938
-    protected function _trash_or_restore_event($event_status = 'trash', $redirect_after = true)
1939
-    {
1940
-        // determine the event id and set to array.
1941
-        $EVT_ID = isset($this->_req_data['EVT_ID']) ? absint($this->_req_data['EVT_ID']) : false;
1942
-        // loop thru events
1943
-        if ($EVT_ID) {
1944
-            // clean status
1945
-            $event_status = sanitize_key($event_status);
1946
-            // grab status
1947
-            if (! empty($event_status)) {
1948
-                $success = $this->_change_event_status($EVT_ID, $event_status);
1949
-            } else {
1950
-                $success = false;
1951
-                $msg = esc_html__(
1952
-                    'An error occurred. The event could not be moved to the trash because a valid event status was not not supplied.',
1953
-                    'event_espresso'
1954
-                );
1955
-                EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
1956
-            }
1957
-        } else {
1958
-            $success = false;
1959
-            $msg = esc_html__(
1960
-                'An error occurred. The event could not be moved to the trash because a valid event ID was not not supplied.',
1961
-                'event_espresso'
1962
-            );
1963
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
1964
-        }
1965
-        $action = $event_status == 'trash' ? 'moved to the trash' : 'restored from the trash';
1966
-        if ($redirect_after) {
1967
-            $this->_redirect_after_action($success, 'Event', $action, array('action' => 'default'));
1968
-        }
1969
-    }
1970
-
1971
-
1972
-    /**
1973
-     * _trash_or_restore_events
1974
-     *
1975
-     * @access protected
1976
-     * @param  string $event_status
1977
-     * @return void
1978
-     */
1979
-    protected function _trash_or_restore_events($event_status = 'trash')
1980
-    {
1981
-        // clean status
1982
-        $event_status = sanitize_key($event_status);
1983
-        // grab status
1984
-        if (! empty($event_status)) {
1985
-            $success = true;
1986
-            // determine the event id and set to array.
1987
-            $EVT_IDs = isset($this->_req_data['EVT_IDs']) ? (array) $this->_req_data['EVT_IDs'] : array();
1988
-            // loop thru events
1989
-            foreach ($EVT_IDs as $EVT_ID) {
1990
-                if ($EVT_ID = absint($EVT_ID)) {
1991
-                    $results = $this->_change_event_status($EVT_ID, $event_status);
1992
-                    $success = $results !== false ? $success : false;
1993
-                } else {
1994
-                    $msg = sprintf(
1995
-                        esc_html__(
1996
-                            'An error occurred. Event #%d could not be moved to the trash because a valid event ID was not not supplied.',
1997
-                            'event_espresso'
1998
-                        ),
1999
-                        $EVT_ID
2000
-                    );
2001
-                    EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2002
-                    $success = false;
2003
-                }
2004
-            }
2005
-        } else {
2006
-            $success = false;
2007
-            $msg = esc_html__(
2008
-                'An error occurred. The event could not be moved to the trash because a valid event status was not not supplied.',
2009
-                'event_espresso'
2010
-            );
2011
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2012
-        }
2013
-        // in order to force a pluralized result message we need to send back a success status greater than 1
2014
-        $success = $success ? 2 : false;
2015
-        $action = $event_status == 'trash' ? 'moved to the trash' : 'restored from the trash';
2016
-        $this->_redirect_after_action($success, 'Events', $action, array('action' => 'default'));
2017
-    }
2018
-
2019
-
2020
-    /**
2021
-     * _trash_or_restore_events
2022
-     *
2023
-     * @access  private
2024
-     * @param  int    $EVT_ID
2025
-     * @param  string $event_status
2026
-     * @return bool
2027
-     */
2028
-    private function _change_event_status($EVT_ID = 0, $event_status = '')
2029
-    {
2030
-        // grab event id
2031
-        if (! $EVT_ID) {
2032
-            $msg = esc_html__(
2033
-                'An error occurred. No Event ID or an invalid Event ID was received.',
2034
-                'event_espresso'
2035
-            );
2036
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2037
-            return false;
2038
-        }
2039
-        $this->_cpt_model_obj = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2040
-        // clean status
2041
-        $event_status = sanitize_key($event_status);
2042
-        // grab status
2043
-        if (empty($event_status)) {
2044
-            $msg = esc_html__(
2045
-                'An error occurred. No Event Status or an invalid Event Status was received.',
2046
-                'event_espresso'
2047
-            );
2048
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2049
-            return false;
2050
-        }
2051
-        // was event trashed or restored ?
2052
-        switch ($event_status) {
2053
-            case 'draft':
2054
-                $action = 'restored from the trash';
2055
-                $hook = 'AHEE_event_restored_from_trash';
2056
-                break;
2057
-            case 'trash':
2058
-                $action = 'moved to the trash';
2059
-                $hook = 'AHEE_event_moved_to_trash';
2060
-                break;
2061
-            default:
2062
-                $action = 'updated';
2063
-                $hook = false;
2064
-        }
2065
-        // use class to change status
2066
-        $this->_cpt_model_obj->set_status($event_status);
2067
-        $success = $this->_cpt_model_obj->save();
2068
-        if ($success === false) {
2069
-            $msg = sprintf(esc_html__('An error occurred. The event could not be %s.', 'event_espresso'), $action);
2070
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2071
-            return false;
2072
-        }
2073
-        if ($hook) {
2074
-            do_action($hook);
2075
-        }
2076
-        return true;
2077
-    }
2078
-
2079
-
2080
-    /**
2081
-     * _delete_event
2082
-     *
2083
-     * @access protected
2084
-     * @param bool $redirect_after
2085
-     */
2086
-    protected function _delete_event()
2087
-    {
2088
-        // determine the event id and set to array.
2089
-        $EVT_ID = isset($this->_req_data['EVT_ID']) ? absint($this->_req_data['EVT_ID']) : null;
2090
-        // @todo: prepare the contents of the deletion preview page via a batch job, then redirect to the preview page.
2091
-        wp_safe_redirect(
2092
-            EE_Admin_Page::add_query_args_and_nonce(
2093
-                [
2094
-                    'action' => 'preview_deletion',
2095
-                    'EVT_IDs[]' => $EVT_ID
2096
-                ],
2097
-                $this->_admin_base_url
2098
-            )
2099
-        );
2100
-    }
2101
-
2102
-
2103
-    /**
2104
-     * _delete_events
2105
-     *
2106
-     * @access protected
2107
-     * @return void
2108
-     */
2109
-    protected function _delete_events()
2110
-    {
2111
-        $EVT_IDs = isset($this->_req_data['EVT_IDs']) ? (array) $this->_req_data['EVT_IDs'] : array();
2112
-        $args = [
2113
-            'action' => 'preview_deletion',
2114
-        ];
2115
-        foreach ($EVT_IDs as $EVT_ID) {
2116
-            $args['EVT_IDs[]'] = (int) $EVT_ID;
2117
-        }
2118
-        // @todo: prepare the contents of the deletion preview page via a batch job, then redirect to the preview page.
2119
-        wp_safe_redirect(
2120
-            EE_Admin_Page::add_query_args_and_nonce(
2121
-                $args,
2122
-                $this->_admin_base_url
2123
-            )
2124
-        );
2125
-    }
2126
-
2127
-    /**
2128
-     * A page for users to preview what exactly will be deleted, and confirm they want to delete it.
2129
-     * @since $VID:$
2130
-     */
2131
-    protected function previewDeletion()
2132
-    {
2133
-        $EVT_IDs = isset($this->_req_data['EVT_IDs']) ? (array) $this->_req_data['EVT_IDs'] : array();
2134
-        $confirm_deletion_args = [
2135
-            'action' => 'confirm_deletion',
2136
-        ];
2137
-        foreach ($EVT_IDs as $EVT_ID) {
2138
-            $confirm_deletion_args['EVT_IDs[]'] = (int) $EVT_ID;
2139
-        }
2140
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
2141
-            EVENTS_TEMPLATE_PATH . 'event_preview_deletion.template.php',
2142
-            [
2143
-                'form_url' => EE_Admin_Page::add_query_args_and_nonce(
2144
-                    $confirm_deletion_args,
2145
-                    $this->admin_base_url()
2146
-                )
2147
-            ],
2148
-            true
2149
-        );
2150
-        $this->display_admin_page_with_no_sidebar();
2151
-    }
2152
-
2153
-    protected function confirmDeletion()
2154
-    {
2155
-        $event_ids = isset($this->_req_data['EVT_IDs']) ? $this->_req_data['EVT_IDs'] : array();
2156
-        $success = $this->deleteEventsAndDependentData($event_ids);
2157
-        $this->redirect_after_action(
2158
-            $success,
2159
-            esc_html__('Events', 'event_espresso'),
2160
-            esc_html__('deleted', 'event_espresso'),
2161
-            [
2162
-                'action' => 'default'
2163
-            ]
2164
-        );
2165
-    }
2166
-
2167
-    /**
2168
-     * Deletes the events and all dependent data, plus those events' non-global/non-default tickets, prices, and
2169
-     * message template groups.
2170
-     * @since $VID:$
2171
-     * @param $event_ids
2172
-     * @return int
2173
-     * @throws EE_Error
2174
-     * @throws InvalidArgumentException
2175
-     * @throws ReflectionException
2176
-     * @throws InvalidDataTypeException
2177
-     * @throws InvalidInterfaceException
2178
-     */
2179
-    protected function deleteEventsAndDependentData($event_ids)
2180
-    {
2181
-        // Call me an optimist.
2182
-        $success = true;
2183
-        $espresso_no_ticket_prices = get_option('ee_no_ticket_prices', array());
2184
-
2185
-        // Find all the root nodes to delete (this isn't just events, because there's other data, like related tickets,
2186
-        // prices, message templates, etc, whose model definition doesn't make them dependent on events. But,
2187
-        // we have no UI to access them independent of events, so they may as well get deleted too.)
2188
-        $model_objects_to_delete = [];
2189
-        foreach ($event_ids as $event_id) {
2190
-            $event = EEM_Event::instance()->get_one_by_ID($event_id);
19
+	/**
20
+	 * This will hold the event object for event_details screen.
21
+	 *
22
+	 * @access protected
23
+	 * @var EE_Event $_event
24
+	 */
25
+	protected $_event;
26
+
27
+
28
+	/**
29
+	 * This will hold the category object for category_details screen.
30
+	 *
31
+	 * @var stdClass $_category
32
+	 */
33
+	protected $_category;
34
+
35
+
36
+	/**
37
+	 * This will hold the event model instance
38
+	 *
39
+	 * @var EEM_Event $_event_model
40
+	 */
41
+	protected $_event_model;
42
+
43
+
44
+	/**
45
+	 * @var EE_Event
46
+	 */
47
+	protected $_cpt_model_obj = false;
48
+
49
+
50
+	/**
51
+	 * Initialize page props for this admin page group.
52
+	 */
53
+	protected function _init_page_props()
54
+	{
55
+		$this->page_slug = EVENTS_PG_SLUG;
56
+		$this->page_label = EVENTS_LABEL;
57
+		$this->_admin_base_url = EVENTS_ADMIN_URL;
58
+		$this->_admin_base_path = EVENTS_ADMIN;
59
+		$this->_cpt_model_names = array(
60
+			'create_new' => 'EEM_Event',
61
+			'edit'       => 'EEM_Event',
62
+		);
63
+		$this->_cpt_edit_routes = array(
64
+			'espresso_events' => 'edit',
65
+		);
66
+		add_action(
67
+			'AHEE__EE_Admin_Page_CPT__set_model_object__after_set_object',
68
+			array($this, 'verify_event_edit'),
69
+			10,
70
+			2
71
+		);
72
+	}
73
+
74
+
75
+	/**
76
+	 * Sets the ajax hooks used for this admin page group.
77
+	 */
78
+	protected function _ajax_hooks()
79
+	{
80
+		add_action('wp_ajax_ee_save_timezone_setting', array($this, 'save_timezonestring_setting'));
81
+	}
82
+
83
+
84
+	/**
85
+	 * Sets the page properties for this admin page group.
86
+	 */
87
+	protected function _define_page_props()
88
+	{
89
+		$this->_admin_page_title = EVENTS_LABEL;
90
+		$this->_labels = array(
91
+			'buttons'      => array(
92
+				'add'             => esc_html__('Add New Event', 'event_espresso'),
93
+				'edit'            => esc_html__('Edit Event', 'event_espresso'),
94
+				'delete'          => esc_html__('Delete Event', 'event_espresso'),
95
+				'add_category'    => esc_html__('Add New Category', 'event_espresso'),
96
+				'edit_category'   => esc_html__('Edit Category', 'event_espresso'),
97
+				'delete_category' => esc_html__('Delete Category', 'event_espresso'),
98
+			),
99
+			'editor_title' => array(
100
+				'espresso_events' => esc_html__('Enter event title here', 'event_espresso'),
101
+			),
102
+			'publishbox'   => array(
103
+				'create_new'        => esc_html__('Save New Event', 'event_espresso'),
104
+				'edit'              => esc_html__('Update Event', 'event_espresso'),
105
+				'add_category'      => esc_html__('Save New Category', 'event_espresso'),
106
+				'edit_category'     => esc_html__('Update Category', 'event_espresso'),
107
+				'template_settings' => esc_html__('Update Settings', 'event_espresso'),
108
+			),
109
+		);
110
+	}
111
+
112
+
113
+	/**
114
+	 * Sets the page routes property for this admin page group.
115
+	 */
116
+	protected function _set_page_routes()
117
+	{
118
+		// load formatter helper
119
+		// load field generator helper
120
+		// is there a evt_id in the request?
121
+		$evt_id = ! empty($this->_req_data['EVT_ID']) && ! is_array($this->_req_data['EVT_ID'])
122
+			? $this->_req_data['EVT_ID']
123
+			: 0;
124
+		$evt_id = ! empty($this->_req_data['post']) ? $this->_req_data['post'] : $evt_id;
125
+		$this->_page_routes = array(
126
+			'default'                       => array(
127
+				'func'       => '_events_overview_list_table',
128
+				'capability' => 'ee_read_events',
129
+			),
130
+			'create_new'                    => array(
131
+				'func'       => '_create_new_cpt_item',
132
+				'capability' => 'ee_edit_events',
133
+			),
134
+			'edit'                          => array(
135
+				'func'       => '_edit_cpt_item',
136
+				'capability' => 'ee_edit_event',
137
+				'obj_id'     => $evt_id,
138
+			),
139
+			'copy_event'                    => array(
140
+				'func'       => '_copy_events',
141
+				'capability' => 'ee_edit_event',
142
+				'obj_id'     => $evt_id,
143
+				'noheader'   => true,
144
+			),
145
+			'trash_event'                   => array(
146
+				'func'       => '_trash_or_restore_event',
147
+				'args'       => array('event_status' => 'trash'),
148
+				'capability' => 'ee_delete_event',
149
+				'obj_id'     => $evt_id,
150
+				'noheader'   => true,
151
+			),
152
+			'trash_events'                  => array(
153
+				'func'       => '_trash_or_restore_events',
154
+				'args'       => array('event_status' => 'trash'),
155
+				'capability' => 'ee_delete_events',
156
+				'noheader'   => true,
157
+			),
158
+			'restore_event'                 => array(
159
+				'func'       => '_trash_or_restore_event',
160
+				'args'       => array('event_status' => 'draft'),
161
+				'capability' => 'ee_delete_event',
162
+				'obj_id'     => $evt_id,
163
+				'noheader'   => true,
164
+			),
165
+			'restore_events'                => array(
166
+				'func'       => '_trash_or_restore_events',
167
+				'args'       => array('event_status' => 'draft'),
168
+				'capability' => 'ee_delete_events',
169
+				'noheader'   => true,
170
+			),
171
+			'delete_event'                  => array(
172
+				'func'       => '_delete_event',
173
+				'capability' => 'ee_delete_event',
174
+				'obj_id'     => $evt_id,
175
+				'noheader'   => true,
176
+			),
177
+			'delete_events'                 => array(
178
+				'func'       => '_delete_events',
179
+				'capability' => 'ee_delete_events',
180
+				'noheader'   => true,
181
+			),
182
+			'view_report'                   => array(
183
+				'func'      => '_view_report',
184
+				'capablity' => 'ee_edit_events',
185
+			),
186
+			'default_event_settings'        => array(
187
+				'func'       => '_default_event_settings',
188
+				'capability' => 'manage_options',
189
+			),
190
+			'update_default_event_settings' => array(
191
+				'func'       => '_update_default_event_settings',
192
+				'capability' => 'manage_options',
193
+				'noheader'   => true,
194
+			),
195
+			'template_settings'             => array(
196
+				'func'       => '_template_settings',
197
+				'capability' => 'manage_options',
198
+			),
199
+			// event category tab related
200
+			'add_category'                  => array(
201
+				'func'       => '_category_details',
202
+				'capability' => 'ee_edit_event_category',
203
+				'args'       => array('add'),
204
+			),
205
+			'edit_category'                 => array(
206
+				'func'       => '_category_details',
207
+				'capability' => 'ee_edit_event_category',
208
+				'args'       => array('edit'),
209
+			),
210
+			'delete_categories'             => array(
211
+				'func'       => '_delete_categories',
212
+				'capability' => 'ee_delete_event_category',
213
+				'noheader'   => true,
214
+			),
215
+			'delete_category'               => array(
216
+				'func'       => '_delete_categories',
217
+				'capability' => 'ee_delete_event_category',
218
+				'noheader'   => true,
219
+			),
220
+			'insert_category'               => array(
221
+				'func'       => '_insert_or_update_category',
222
+				'args'       => array('new_category' => true),
223
+				'capability' => 'ee_edit_event_category',
224
+				'noheader'   => true,
225
+			),
226
+			'update_category'               => array(
227
+				'func'       => '_insert_or_update_category',
228
+				'args'       => array('new_category' => false),
229
+				'capability' => 'ee_edit_event_category',
230
+				'noheader'   => true,
231
+			),
232
+			'category_list'                 => array(
233
+				'func'       => '_category_list_table',
234
+				'capability' => 'ee_manage_event_categories',
235
+			),
236
+			'preview_deletion' => [
237
+				'func' => 'previewDeletion',
238
+				'capability' => 'ee_delete_events'
239
+			],
240
+			'confirm_deletion' => [
241
+				'func' => 'confirmDeletion',
242
+				'capability' => 'ee_delete_events',
243
+				'noheader' => true
244
+			]
245
+		);
246
+	}
247
+
248
+
249
+	/**
250
+	 * Set the _page_config property for this admin page group.
251
+	 */
252
+	protected function _set_page_config()
253
+	{
254
+		$this->_page_config = array(
255
+			'default'                => array(
256
+				'nav'           => array(
257
+					'label' => esc_html__('Overview', 'event_espresso'),
258
+					'order' => 10,
259
+				),
260
+				'list_table'    => 'Events_Admin_List_Table',
261
+				'help_tabs'     => array(
262
+					'events_overview_help_tab'                       => array(
263
+						'title'    => esc_html__('Events Overview', 'event_espresso'),
264
+						'filename' => 'events_overview',
265
+					),
266
+					'events_overview_table_column_headings_help_tab' => array(
267
+						'title'    => esc_html__('Events Overview Table Column Headings', 'event_espresso'),
268
+						'filename' => 'events_overview_table_column_headings',
269
+					),
270
+					'events_overview_filters_help_tab'               => array(
271
+						'title'    => esc_html__('Events Overview Filters', 'event_espresso'),
272
+						'filename' => 'events_overview_filters',
273
+					),
274
+					'events_overview_view_help_tab'                  => array(
275
+						'title'    => esc_html__('Events Overview Views', 'event_espresso'),
276
+						'filename' => 'events_overview_views',
277
+					),
278
+					'events_overview_other_help_tab'                 => array(
279
+						'title'    => esc_html__('Events Overview Other', 'event_espresso'),
280
+						'filename' => 'events_overview_other',
281
+					),
282
+				),
283
+				'help_tour'     => array(
284
+					'Event_Overview_Help_Tour',
285
+					// 'New_Features_Test_Help_Tour' for testing multiple help tour
286
+				),
287
+				'qtips'         => array(
288
+					'EE_Event_List_Table_Tips',
289
+				),
290
+				'require_nonce' => false,
291
+			),
292
+			'create_new'             => array(
293
+				'nav'           => array(
294
+					'label'      => esc_html__('Add Event', 'event_espresso'),
295
+					'order'      => 5,
296
+					'persistent' => false,
297
+				),
298
+				'metaboxes'     => array('_register_event_editor_meta_boxes'),
299
+				'help_tabs'     => array(
300
+					'event_editor_help_tab'                            => array(
301
+						'title'    => esc_html__('Event Editor', 'event_espresso'),
302
+						'filename' => 'event_editor',
303
+					),
304
+					'event_editor_title_richtexteditor_help_tab'       => array(
305
+						'title'    => esc_html__('Event Title & Rich Text Editor', 'event_espresso'),
306
+						'filename' => 'event_editor_title_richtexteditor',
307
+					),
308
+					'event_editor_venue_details_help_tab'              => array(
309
+						'title'    => esc_html__('Event Venue Details', 'event_espresso'),
310
+						'filename' => 'event_editor_venue_details',
311
+					),
312
+					'event_editor_event_datetimes_help_tab'            => array(
313
+						'title'    => esc_html__('Event Datetimes', 'event_espresso'),
314
+						'filename' => 'event_editor_event_datetimes',
315
+					),
316
+					'event_editor_event_tickets_help_tab'              => array(
317
+						'title'    => esc_html__('Event Tickets', 'event_espresso'),
318
+						'filename' => 'event_editor_event_tickets',
319
+					),
320
+					'event_editor_event_registration_options_help_tab' => array(
321
+						'title'    => esc_html__('Event Registration Options', 'event_espresso'),
322
+						'filename' => 'event_editor_event_registration_options',
323
+					),
324
+					'event_editor_tags_categories_help_tab'            => array(
325
+						'title'    => esc_html__('Event Tags & Categories', 'event_espresso'),
326
+						'filename' => 'event_editor_tags_categories',
327
+					),
328
+					'event_editor_questions_registrants_help_tab'      => array(
329
+						'title'    => esc_html__('Questions for Registrants', 'event_espresso'),
330
+						'filename' => 'event_editor_questions_registrants',
331
+					),
332
+					'event_editor_save_new_event_help_tab'             => array(
333
+						'title'    => esc_html__('Save New Event', 'event_espresso'),
334
+						'filename' => 'event_editor_save_new_event',
335
+					),
336
+					'event_editor_other_help_tab'                      => array(
337
+						'title'    => esc_html__('Event Other', 'event_espresso'),
338
+						'filename' => 'event_editor_other',
339
+					),
340
+				),
341
+				'help_tour'     => array(
342
+					'Event_Editor_Help_Tour',
343
+				),
344
+				'qtips'         => array('EE_Event_Editor_Decaf_Tips'),
345
+				'require_nonce' => false,
346
+			),
347
+			'edit'                   => array(
348
+				'nav'           => array(
349
+					'label'      => esc_html__('Edit Event', 'event_espresso'),
350
+					'order'      => 5,
351
+					'persistent' => false,
352
+					'url'        => isset($this->_req_data['post'])
353
+						? EE_Admin_Page::add_query_args_and_nonce(
354
+							array('post' => $this->_req_data['post'], 'action' => 'edit'),
355
+							$this->_current_page_view_url
356
+						)
357
+						: $this->_admin_base_url,
358
+				),
359
+				'metaboxes'     => array('_register_event_editor_meta_boxes'),
360
+				'help_tabs'     => array(
361
+					'event_editor_help_tab'                            => array(
362
+						'title'    => esc_html__('Event Editor', 'event_espresso'),
363
+						'filename' => 'event_editor',
364
+					),
365
+					'event_editor_title_richtexteditor_help_tab'       => array(
366
+						'title'    => esc_html__('Event Title & Rich Text Editor', 'event_espresso'),
367
+						'filename' => 'event_editor_title_richtexteditor',
368
+					),
369
+					'event_editor_venue_details_help_tab'              => array(
370
+						'title'    => esc_html__('Event Venue Details', 'event_espresso'),
371
+						'filename' => 'event_editor_venue_details',
372
+					),
373
+					'event_editor_event_datetimes_help_tab'            => array(
374
+						'title'    => esc_html__('Event Datetimes', 'event_espresso'),
375
+						'filename' => 'event_editor_event_datetimes',
376
+					),
377
+					'event_editor_event_tickets_help_tab'              => array(
378
+						'title'    => esc_html__('Event Tickets', 'event_espresso'),
379
+						'filename' => 'event_editor_event_tickets',
380
+					),
381
+					'event_editor_event_registration_options_help_tab' => array(
382
+						'title'    => esc_html__('Event Registration Options', 'event_espresso'),
383
+						'filename' => 'event_editor_event_registration_options',
384
+					),
385
+					'event_editor_tags_categories_help_tab'            => array(
386
+						'title'    => esc_html__('Event Tags & Categories', 'event_espresso'),
387
+						'filename' => 'event_editor_tags_categories',
388
+					),
389
+					'event_editor_questions_registrants_help_tab'      => array(
390
+						'title'    => esc_html__('Questions for Registrants', 'event_espresso'),
391
+						'filename' => 'event_editor_questions_registrants',
392
+					),
393
+					'event_editor_save_new_event_help_tab'             => array(
394
+						'title'    => esc_html__('Save New Event', 'event_espresso'),
395
+						'filename' => 'event_editor_save_new_event',
396
+					),
397
+					'event_editor_other_help_tab'                      => array(
398
+						'title'    => esc_html__('Event Other', 'event_espresso'),
399
+						'filename' => 'event_editor_other',
400
+					),
401
+				),
402
+				'qtips'         => array('EE_Event_Editor_Decaf_Tips'),
403
+				'require_nonce' => false,
404
+			),
405
+			'default_event_settings' => array(
406
+				'nav'           => array(
407
+					'label' => esc_html__('Default Settings', 'event_espresso'),
408
+					'order' => 40,
409
+				),
410
+				'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
411
+				'labels'        => array(
412
+					'publishbox' => esc_html__('Update Settings', 'event_espresso'),
413
+				),
414
+				'help_tabs'     => array(
415
+					'default_settings_help_tab'        => array(
416
+						'title'    => esc_html__('Default Event Settings', 'event_espresso'),
417
+						'filename' => 'events_default_settings',
418
+					),
419
+					'default_settings_status_help_tab' => array(
420
+						'title'    => esc_html__('Default Registration Status', 'event_espresso'),
421
+						'filename' => 'events_default_settings_status',
422
+					),
423
+					'default_maximum_tickets_help_tab' => array(
424
+						'title'    => esc_html__('Default Maximum Tickets Per Order', 'event_espresso'),
425
+						'filename' => 'events_default_settings_max_tickets',
426
+					),
427
+				),
428
+				'help_tour'     => array('Event_Default_Settings_Help_Tour'),
429
+				'require_nonce' => false,
430
+			),
431
+			// template settings
432
+			'template_settings'      => array(
433
+				'nav'           => array(
434
+					'label' => esc_html__('Templates', 'event_espresso'),
435
+					'order' => 30,
436
+				),
437
+				'metaboxes'     => $this->_default_espresso_metaboxes,
438
+				'help_tabs'     => array(
439
+					'general_settings_templates_help_tab' => array(
440
+						'title'    => esc_html__('Templates', 'event_espresso'),
441
+						'filename' => 'general_settings_templates',
442
+					),
443
+				),
444
+				'help_tour'     => array('Templates_Help_Tour'),
445
+				'require_nonce' => false,
446
+			),
447
+			// event category stuff
448
+			'add_category'           => array(
449
+				'nav'           => array(
450
+					'label'      => esc_html__('Add Category', 'event_espresso'),
451
+					'order'      => 15,
452
+					'persistent' => false,
453
+				),
454
+				'help_tabs'     => array(
455
+					'add_category_help_tab' => array(
456
+						'title'    => esc_html__('Add New Event Category', 'event_espresso'),
457
+						'filename' => 'events_add_category',
458
+					),
459
+				),
460
+				'help_tour'     => array('Event_Add_Category_Help_Tour'),
461
+				'metaboxes'     => array('_publish_post_box'),
462
+				'require_nonce' => false,
463
+			),
464
+			'edit_category'          => array(
465
+				'nav'           => array(
466
+					'label'      => esc_html__('Edit Category', 'event_espresso'),
467
+					'order'      => 15,
468
+					'persistent' => false,
469
+					'url'        => isset($this->_req_data['EVT_CAT_ID'])
470
+						? add_query_arg(
471
+							array('EVT_CAT_ID' => $this->_req_data['EVT_CAT_ID']),
472
+							$this->_current_page_view_url
473
+						)
474
+						: $this->_admin_base_url,
475
+				),
476
+				'help_tabs'     => array(
477
+					'edit_category_help_tab' => array(
478
+						'title'    => esc_html__('Edit Event Category', 'event_espresso'),
479
+						'filename' => 'events_edit_category',
480
+					),
481
+				),
482
+				/*'help_tour' => array('Event_Edit_Category_Help_Tour'),*/
483
+				'metaboxes'     => array('_publish_post_box'),
484
+				'require_nonce' => false,
485
+			),
486
+			'category_list'          => array(
487
+				'nav'           => array(
488
+					'label' => esc_html__('Categories', 'event_espresso'),
489
+					'order' => 20,
490
+				),
491
+				'list_table'    => 'Event_Categories_Admin_List_Table',
492
+				'help_tabs'     => array(
493
+					'events_categories_help_tab'                       => array(
494
+						'title'    => esc_html__('Event Categories', 'event_espresso'),
495
+						'filename' => 'events_categories',
496
+					),
497
+					'events_categories_table_column_headings_help_tab' => array(
498
+						'title'    => esc_html__('Event Categories Table Column Headings', 'event_espresso'),
499
+						'filename' => 'events_categories_table_column_headings',
500
+					),
501
+					'events_categories_view_help_tab'                  => array(
502
+						'title'    => esc_html__('Event Categories Views', 'event_espresso'),
503
+						'filename' => 'events_categories_views',
504
+					),
505
+					'events_categories_other_help_tab'                 => array(
506
+						'title'    => esc_html__('Event Categories Other', 'event_espresso'),
507
+						'filename' => 'events_categories_other',
508
+					),
509
+				),
510
+				'help_tour'     => array(
511
+					'Event_Categories_Help_Tour',
512
+				),
513
+				'metaboxes'     => $this->_default_espresso_metaboxes,
514
+				'require_nonce' => false,
515
+			),
516
+			'preview_deletion'           => array(
517
+				'nav'           => array(
518
+					'label'      => esc_html__('Preview Deletion', 'event_espresso'),
519
+					'order'      => 15,
520
+					'persistent' => false,
521
+				),
522
+			)
523
+		);
524
+	}
525
+
526
+
527
+	/**
528
+	 * Used to register any global screen options if necessary for every route in this admin page group.
529
+	 */
530
+	protected function _add_screen_options()
531
+	{
532
+	}
533
+
534
+
535
+	/**
536
+	 * Implementing the screen options for the 'default' route.
537
+	 */
538
+	protected function _add_screen_options_default()
539
+	{
540
+		$this->_per_page_screen_option();
541
+	}
542
+
543
+
544
+	/**
545
+	 * Implementing screen options for the category list route.
546
+	 */
547
+	protected function _add_screen_options_category_list()
548
+	{
549
+		$page_title = $this->_admin_page_title;
550
+		$this->_admin_page_title = esc_html__('Categories', 'event_espresso');
551
+		$this->_per_page_screen_option();
552
+		$this->_admin_page_title = $page_title;
553
+	}
554
+
555
+
556
+	/**
557
+	 * Used to register any global feature pointers for the admin page group.
558
+	 */
559
+	protected function _add_feature_pointers()
560
+	{
561
+	}
562
+
563
+
564
+	/**
565
+	 * Registers and enqueues any global scripts and styles for the entire admin page group.
566
+	 */
567
+	public function load_scripts_styles()
568
+	{
569
+		wp_register_style(
570
+			'events-admin-css',
571
+			EVENTS_ASSETS_URL . 'events-admin-page.css',
572
+			array(),
573
+			EVENT_ESPRESSO_VERSION
574
+		);
575
+		wp_register_style('ee-cat-admin', EVENTS_ASSETS_URL . 'ee-cat-admin.css', array(), EVENT_ESPRESSO_VERSION);
576
+		wp_enqueue_style('events-admin-css');
577
+		wp_enqueue_style('ee-cat-admin');
578
+		// todo note: we also need to load_scripts_styles per view (i.e. default/view_report/event_details
579
+		// registers for all views
580
+		// scripts
581
+		wp_register_script(
582
+			'event_editor_js',
583
+			EVENTS_ASSETS_URL . 'event_editor.js',
584
+			array('ee_admin_js', 'jquery-ui-slider', 'jquery-ui-timepicker-addon'),
585
+			EVENT_ESPRESSO_VERSION,
586
+			true
587
+		);
588
+	}
589
+
590
+
591
+	/**
592
+	 * Enqueuing scripts and styles specific to this view
593
+	 */
594
+	public function load_scripts_styles_create_new()
595
+	{
596
+		$this->load_scripts_styles_edit();
597
+	}
598
+
599
+
600
+	/**
601
+	 * Enqueuing scripts and styles specific to this view
602
+	 */
603
+	public function load_scripts_styles_edit()
604
+	{
605
+		// styles
606
+		wp_enqueue_style('espresso-ui-theme');
607
+		wp_register_style(
608
+			'event-editor-css',
609
+			EVENTS_ASSETS_URL . 'event-editor.css',
610
+			array('ee-admin-css'),
611
+			EVENT_ESPRESSO_VERSION
612
+		);
613
+		wp_enqueue_style('event-editor-css');
614
+		// scripts
615
+		wp_register_script(
616
+			'event-datetime-metabox',
617
+			EVENTS_ASSETS_URL . 'event-datetime-metabox.js',
618
+			array('event_editor_js', 'ee-datepicker'),
619
+			EVENT_ESPRESSO_VERSION
620
+		);
621
+		wp_enqueue_script('event-datetime-metabox');
622
+	}
623
+
624
+
625
+	/**
626
+	 * Populating the _views property for the category list table view.
627
+	 */
628
+	protected function _set_list_table_views_category_list()
629
+	{
630
+		$this->_views = array(
631
+			'all' => array(
632
+				'slug'        => 'all',
633
+				'label'       => esc_html__('All', 'event_espresso'),
634
+				'count'       => 0,
635
+				'bulk_action' => array(
636
+					'delete_categories' => esc_html__('Delete Permanently', 'event_espresso'),
637
+				),
638
+			),
639
+		);
640
+	}
641
+
642
+
643
+	/**
644
+	 * For adding anything that fires on the admin_init hook for any route within this admin page group.
645
+	 */
646
+	public function admin_init()
647
+	{
648
+		EE_Registry::$i18n_js_strings['image_confirm'] = esc_html__(
649
+			'Do you really want to delete this image? Please remember to update your event to complete the removal.',
650
+			'event_espresso'
651
+		);
652
+	}
653
+
654
+
655
+	/**
656
+	 * For adding anything that should be triggered on the admin_notices hook for any route within this admin page
657
+	 * group.
658
+	 */
659
+	public function admin_notices()
660
+	{
661
+	}
662
+
663
+
664
+	/**
665
+	 * For adding anything that should be triggered on the `admin_print_footer_scripts` hook for any route within
666
+	 * this admin page group.
667
+	 */
668
+	public function admin_footer_scripts()
669
+	{
670
+	}
671
+
672
+
673
+	/**
674
+	 * Call this function to verify if an event is public and has tickets for sale.  If it does, then we need to show a
675
+	 * warning (via EE_Error::add_error());
676
+	 *
677
+	 * @param  EE_Event $event Event object
678
+	 * @param string    $req_type
679
+	 * @return void
680
+	 * @throws EE_Error
681
+	 * @access public
682
+	 */
683
+	public function verify_event_edit($event = null, $req_type = '')
684
+	{
685
+		// don't need to do this when processing
686
+		if (! empty($req_type)) {
687
+			return;
688
+		}
689
+		// no event?
690
+		if (empty($event)) {
691
+			// set event
692
+			$event = $this->_cpt_model_obj;
693
+		}
694
+		// STILL no event?
695
+		if (! $event instanceof EE_Event) {
696
+			return;
697
+		}
698
+		$orig_status = $event->status();
699
+		// first check if event is active.
700
+		if ($orig_status === EEM_Event::cancelled
701
+			|| $orig_status === EEM_Event::postponed
702
+			|| $event->is_expired()
703
+			|| $event->is_inactive()
704
+		) {
705
+			return;
706
+		}
707
+		// made it here so it IS active... next check that any of the tickets are sold.
708
+		if ($event->is_sold_out(true)) {
709
+			if ($orig_status !== EEM_Event::sold_out && $event->status() !== $orig_status) {
710
+				EE_Error::add_attention(
711
+					sprintf(
712
+						esc_html__(
713
+							'Please note that the Event Status has automatically been changed to %s because there are no more spaces available for this event.  However, this change is not permanent until you update the event.  You can change the status back to something else before updating if you wish.',
714
+							'event_espresso'
715
+						),
716
+						EEH_Template::pretty_status(EEM_Event::sold_out, false, 'sentence')
717
+					)
718
+				);
719
+			}
720
+			return;
721
+		} elseif ($orig_status === EEM_Event::sold_out) {
722
+			EE_Error::add_attention(
723
+				sprintf(
724
+					esc_html__(
725
+						'Please note that the Event Status has automatically been changed to %s because more spaces have become available for this event, most likely due to abandoned transactions freeing up reserved tickets.  However, this change is not permanent until you update the event. If you wish, you can change the status back to something else before updating.',
726
+						'event_espresso'
727
+					),
728
+					EEH_Template::pretty_status($event->status(), false, 'sentence')
729
+				)
730
+			);
731
+		}
732
+		// now we need to determine if the event has any tickets on sale.  If not then we dont' show the error
733
+		if (! $event->tickets_on_sale()) {
734
+			return;
735
+		}
736
+		// made it here so show warning
737
+		$this->_edit_event_warning();
738
+	}
739
+
740
+
741
+	/**
742
+	 * This is the text used for when an event is being edited that is public and has tickets for sale.
743
+	 * When needed, hook this into a EE_Error::add_error() notice.
744
+	 *
745
+	 * @access protected
746
+	 * @return void
747
+	 */
748
+	protected function _edit_event_warning()
749
+	{
750
+		// we don't want to add warnings during these requests
751
+		if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'editpost') {
752
+			return;
753
+		}
754
+		EE_Error::add_attention(
755
+			sprintf(
756
+				esc_html__(
757
+					'Your event is open for registration. Making changes may disrupt any transactions in progress. %sLearn more%s',
758
+					'event_espresso'
759
+				),
760
+				'<a class="espresso-help-tab-lnk">',
761
+				'</a>'
762
+			)
763
+		);
764
+	}
765
+
766
+
767
+	/**
768
+	 * When a user is creating a new event, notify them if they haven't set their timezone.
769
+	 * Otherwise, do the normal logic
770
+	 *
771
+	 * @return string
772
+	 * @throws \EE_Error
773
+	 */
774
+	protected function _create_new_cpt_item()
775
+	{
776
+		$has_timezone_string = get_option('timezone_string');
777
+		// only nag them about setting their timezone if it's their first event, and they haven't already done it
778
+		if (! $has_timezone_string && ! EEM_Event::instance()->exists(array())) {
779
+			EE_Error::add_attention(
780
+				sprintf(
781
+					__(
782
+						'Your website\'s timezone is currently set to a UTC offset. We recommend updating your timezone to a city or region near you before you create an event. Change your timezone now:%1$s%2$s%3$sChange Timezone%4$s',
783
+						'event_espresso'
784
+					),
785
+					'<br>',
786
+					'<select id="timezone_string" name="timezone_string" aria-describedby="timezone-description">'
787
+					. EEH_DTT_Helper::wp_timezone_choice('', EEH_DTT_Helper::get_user_locale())
788
+					. '</select>',
789
+					'<button class="button button-secondary timezone-submit">',
790
+					'</button><span class="spinner"></span>'
791
+				),
792
+				__FILE__,
793
+				__FUNCTION__,
794
+				__LINE__
795
+			);
796
+		}
797
+		return parent::_create_new_cpt_item();
798
+	}
799
+
800
+
801
+	/**
802
+	 * Sets the _views property for the default route in this admin page group.
803
+	 */
804
+	protected function _set_list_table_views_default()
805
+	{
806
+		$this->_views = array(
807
+			'all'   => array(
808
+				'slug'        => 'all',
809
+				'label'       => esc_html__('View All Events', 'event_espresso'),
810
+				'count'       => 0,
811
+				'bulk_action' => array(
812
+					'trash_events' => esc_html__('Move to Trash', 'event_espresso'),
813
+				),
814
+			),
815
+			'draft' => array(
816
+				'slug'        => 'draft',
817
+				'label'       => esc_html__('Draft', 'event_espresso'),
818
+				'count'       => 0,
819
+				'bulk_action' => array(
820
+					'trash_events' => esc_html__('Move to Trash', 'event_espresso'),
821
+				),
822
+			),
823
+		);
824
+		if (EE_Registry::instance()->CAP->current_user_can('ee_delete_events', 'espresso_events_trash_events')) {
825
+			$this->_views['trash'] = array(
826
+				'slug'        => 'trash',
827
+				'label'       => esc_html__('Trash', 'event_espresso'),
828
+				'count'       => 0,
829
+				'bulk_action' => array(
830
+					'restore_events' => esc_html__('Restore From Trash', 'event_espresso'),
831
+					'delete_events'  => esc_html__('Delete Permanently', 'event_espresso'),
832
+				),
833
+			);
834
+		}
835
+	}
836
+
837
+
838
+	/**
839
+	 * Provides the legend item array for the default list table view.
840
+	 *
841
+	 * @return array
842
+	 */
843
+	protected function _event_legend_items()
844
+	{
845
+		$items = array(
846
+			'view_details'   => array(
847
+				'class' => 'dashicons dashicons-search',
848
+				'desc'  => esc_html__('View Event', 'event_espresso'),
849
+			),
850
+			'edit_event'     => array(
851
+				'class' => 'ee-icon ee-icon-calendar-edit',
852
+				'desc'  => esc_html__('Edit Event Details', 'event_espresso'),
853
+			),
854
+			'view_attendees' => array(
855
+				'class' => 'dashicons dashicons-groups',
856
+				'desc'  => esc_html__('View Registrations for Event', 'event_espresso'),
857
+			),
858
+		);
859
+		$items = apply_filters('FHEE__Events_Admin_Page___event_legend_items__items', $items);
860
+		$statuses = array(
861
+			'sold_out_status'  => array(
862
+				'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::sold_out,
863
+				'desc'  => EEH_Template::pretty_status(EE_Datetime::sold_out, false, 'sentence'),
864
+			),
865
+			'active_status'    => array(
866
+				'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::active,
867
+				'desc'  => EEH_Template::pretty_status(EE_Datetime::active, false, 'sentence'),
868
+			),
869
+			'upcoming_status'  => array(
870
+				'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::upcoming,
871
+				'desc'  => EEH_Template::pretty_status(EE_Datetime::upcoming, false, 'sentence'),
872
+			),
873
+			'postponed_status' => array(
874
+				'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::postponed,
875
+				'desc'  => EEH_Template::pretty_status(EE_Datetime::postponed, false, 'sentence'),
876
+			),
877
+			'cancelled_status' => array(
878
+				'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::cancelled,
879
+				'desc'  => EEH_Template::pretty_status(EE_Datetime::cancelled, false, 'sentence'),
880
+			),
881
+			'expired_status'   => array(
882
+				'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::expired,
883
+				'desc'  => EEH_Template::pretty_status(EE_Datetime::expired, false, 'sentence'),
884
+			),
885
+			'inactive_status'  => array(
886
+				'class' => 'ee-status-legend ee-status-legend-' . EE_Datetime::inactive,
887
+				'desc'  => EEH_Template::pretty_status(EE_Datetime::inactive, false, 'sentence'),
888
+			),
889
+		);
890
+		$statuses = apply_filters('FHEE__Events_Admin_Page__event_legend_items__statuses', $statuses);
891
+		return array_merge($items, $statuses);
892
+	}
893
+
894
+
895
+	/**
896
+	 * @return EEM_Event
897
+	 */
898
+	private function _event_model()
899
+	{
900
+		if (! $this->_event_model instanceof EEM_Event) {
901
+			$this->_event_model = EE_Registry::instance()->load_model('Event');
902
+		}
903
+		return $this->_event_model;
904
+	}
905
+
906
+
907
+	/**
908
+	 * Adds extra buttons to the WP CPT permalink field row.
909
+	 * Method is called from parent and is hooked into the wp 'get_sample_permalink_html' filter.
910
+	 *
911
+	 * @param  string $return    the current html
912
+	 * @param  int    $id        the post id for the page
913
+	 * @param  string $new_title What the title is
914
+	 * @param  string $new_slug  what the slug is
915
+	 * @return string            The new html string for the permalink area
916
+	 */
917
+	public function extra_permalink_field_buttons($return, $id, $new_title, $new_slug)
918
+	{
919
+		// make sure this is only when editing
920
+		if (! empty($id)) {
921
+			$post = get_post($id);
922
+			$return .= '<a class="button button-small" onclick="prompt(\'Shortcode:\', jQuery(\'#shortcode\').val()); return false;" href="#"  tabindex="-1">'
923
+					   . esc_html__('Shortcode', 'event_espresso')
924
+					   . '</a> ';
925
+			$return .= '<input id="shortcode" type="hidden" value="[ESPRESSO_TICKET_SELECTOR event_id='
926
+					   . $post->ID
927
+					   . ']">';
928
+		}
929
+		return $return;
930
+	}
931
+
932
+
933
+	/**
934
+	 * _events_overview_list_table
935
+	 * This contains the logic for showing the events_overview list
936
+	 *
937
+	 * @access protected
938
+	 * @return void
939
+	 * @throws \EE_Error
940
+	 */
941
+	protected function _events_overview_list_table()
942
+	{
943
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
944
+		$this->_template_args['after_list_table'] = ! empty($this->_template_args['after_list_table'])
945
+			? (array) $this->_template_args['after_list_table']
946
+			: array();
947
+		$this->_template_args['after_list_table']['view_event_list_button'] = EEH_HTML::br()
948
+				. EEH_Template::get_button_or_link(
949
+					get_post_type_archive_link('espresso_events'),
950
+					esc_html__("View Event Archive Page", "event_espresso"),
951
+					'button'
952
+				);
953
+		$this->_template_args['after_list_table']['legend'] = $this->_display_legend($this->_event_legend_items());
954
+		$this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
955
+			'create_new',
956
+			'add',
957
+			array(),
958
+			'add-new-h2'
959
+		);
960
+		$this->display_admin_list_table_page_with_no_sidebar();
961
+	}
962
+
963
+
964
+	/**
965
+	 * this allows for extra misc actions in the default WP publish box
966
+	 *
967
+	 * @return void
968
+	 */
969
+	public function extra_misc_actions_publish_box()
970
+	{
971
+		$this->_generate_publish_box_extra_content();
972
+	}
973
+
974
+
975
+	/**
976
+	 * This is hooked into the WordPress do_action('save_post') hook and runs after the custom post type has been
977
+	 * saved.
978
+	 * Typically you would use this to save any additional data.
979
+	 * Keep in mind also that "save_post" runs on EVERY post update to the database.
980
+	 * ALSO very important.  When a post transitions from scheduled to published,
981
+	 * the save_post action is fired but you will NOT have any _POST data containing any extra info you may have from
982
+	 * other meta saves. So MAKE sure that you handle this accordingly.
983
+	 *
984
+	 * @access protected
985
+	 * @abstract
986
+	 * @param  string $post_id The ID of the cpt that was saved (so you can link relationally)
987
+	 * @param  object $post    The post object of the cpt that was saved.
988
+	 * @return void
989
+	 * @throws \EE_Error
990
+	 */
991
+	protected function _insert_update_cpt_item($post_id, $post)
992
+	{
993
+		if ($post instanceof WP_Post && $post->post_type !== 'espresso_events') {
994
+			// get out we're not processing an event save.
995
+			return;
996
+		}
997
+		$event_values = array(
998
+			'EVT_display_desc'                => ! empty($this->_req_data['display_desc']) ? 1 : 0,
999
+			'EVT_display_ticket_selector'     => ! empty($this->_req_data['display_ticket_selector']) ? 1 : 0,
1000
+			'EVT_additional_limit'            => min(
1001
+				apply_filters('FHEE__EE_Events_Admin__insert_update_cpt_item__EVT_additional_limit_max', 255),
1002
+				! empty($this->_req_data['additional_limit']) ? $this->_req_data['additional_limit'] : null
1003
+			),
1004
+			'EVT_default_registration_status' => ! empty($this->_req_data['EVT_default_registration_status'])
1005
+				? $this->_req_data['EVT_default_registration_status']
1006
+				: EE_Registry::instance()->CFG->registration->default_STS_ID,
1007
+			'EVT_member_only'                 => ! empty($this->_req_data['member_only']) ? 1 : 0,
1008
+			'EVT_allow_overflow'              => ! empty($this->_req_data['EVT_allow_overflow']) ? 1 : 0,
1009
+			'EVT_timezone_string'             => ! empty($this->_req_data['timezone_string'])
1010
+				? $this->_req_data['timezone_string'] : null,
1011
+			'EVT_external_URL'                => ! empty($this->_req_data['externalURL'])
1012
+				? $this->_req_data['externalURL'] : null,
1013
+			'EVT_phone'                       => ! empty($this->_req_data['event_phone'])
1014
+				? $this->_req_data['event_phone'] : null,
1015
+		);
1016
+		// update event
1017
+		$success = $this->_event_model()->update_by_ID($event_values, $post_id);
1018
+		// get event_object for other metaboxes... though it would seem to make sense to just use $this->_event_model()->get_one_by_ID( $post_id ).. i have to setup where conditions to override the filters in the model that filter out autodraft and inherit statuses so we GET the inherit id!
1019
+		$get_one_where = array(
1020
+			$this->_event_model()->primary_key_name() => $post_id,
1021
+			'OR'                                      => array(
1022
+				'status'   => $post->post_status,
1023
+				// if trying to "Publish" a sold out event, it's status will get switched back to "sold_out" in the db,
1024
+				// but the returned object here has a status of "publish", so use the original post status as well
1025
+				'status*1' => $this->_req_data['original_post_status'],
1026
+			),
1027
+		);
1028
+		$event = $this->_event_model()->get_one(array($get_one_where));
1029
+		// the following are default callbacks for event attachment updates that can be overridden by caffeinated functionality and/or addons.
1030
+		$event_update_callbacks = apply_filters(
1031
+			'FHEE__Events_Admin_Page___insert_update_cpt_item__event_update_callbacks',
1032
+			array(
1033
+				array($this, '_default_venue_update'),
1034
+				array($this, '_default_tickets_update'),
1035
+			)
1036
+		);
1037
+		$att_success = true;
1038
+		foreach ($event_update_callbacks as $e_callback) {
1039
+			$_success = is_callable($e_callback)
1040
+				? call_user_func($e_callback, $event, $this->_req_data)
1041
+				: false;
1042
+			// if ANY of these updates fail then we want the appropriate global error message
1043
+			$att_success = ! $att_success ? $att_success : $_success;
1044
+		}
1045
+		// any errors?
1046
+		if ($success && false === $att_success) {
1047
+			EE_Error::add_error(
1048
+				esc_html__(
1049
+					'Event Details saved successfully but something went wrong with saving attachments.',
1050
+					'event_espresso'
1051
+				),
1052
+				__FILE__,
1053
+				__FUNCTION__,
1054
+				__LINE__
1055
+			);
1056
+		} elseif ($success === false) {
1057
+			EE_Error::add_error(
1058
+				esc_html__('Event Details did not save successfully.', 'event_espresso'),
1059
+				__FILE__,
1060
+				__FUNCTION__,
1061
+				__LINE__
1062
+			);
1063
+		}
1064
+	}
1065
+
1066
+
1067
+	/**
1068
+	 * @see parent::restore_item()
1069
+	 * @param int $post_id
1070
+	 * @param int $revision_id
1071
+	 */
1072
+	protected function _restore_cpt_item($post_id, $revision_id)
1073
+	{
1074
+		// copy existing event meta to new post
1075
+		$post_evt = $this->_event_model()->get_one_by_ID($post_id);
1076
+		if ($post_evt instanceof EE_Event) {
1077
+			// meta revision restore
1078
+			$post_evt->restore_revision($revision_id);
1079
+			// related objs restore
1080
+			$post_evt->restore_revision($revision_id, array('Venue', 'Datetime', 'Price'));
1081
+		}
1082
+	}
1083
+
1084
+
1085
+	/**
1086
+	 * Attach the venue to the Event
1087
+	 *
1088
+	 * @param  \EE_Event $evtobj Event Object to add the venue to
1089
+	 * @param  array     $data   The request data from the form
1090
+	 * @return bool           Success or fail.
1091
+	 */
1092
+	protected function _default_venue_update(\EE_Event $evtobj, $data)
1093
+	{
1094
+		require_once(EE_MODELS . 'EEM_Venue.model.php');
1095
+		$venue_model = EE_Registry::instance()->load_model('Venue');
1096
+		$rows_affected = null;
1097
+		$venue_id = ! empty($data['venue_id']) ? $data['venue_id'] : null;
1098
+		// very important.  If we don't have a venue name...
1099
+		// then we'll get out because not necessary to create empty venue
1100
+		if (empty($data['venue_title'])) {
1101
+			return false;
1102
+		}
1103
+		$venue_array = array(
1104
+			'VNU_wp_user'         => $evtobj->get('EVT_wp_user'),
1105
+			'VNU_name'            => ! empty($data['venue_title']) ? $data['venue_title'] : null,
1106
+			'VNU_desc'            => ! empty($data['venue_description']) ? $data['venue_description'] : null,
1107
+			'VNU_identifier'      => ! empty($data['venue_identifier']) ? $data['venue_identifier'] : null,
1108
+			'VNU_short_desc'      => ! empty($data['venue_short_description']) ? $data['venue_short_description']
1109
+				: null,
1110
+			'VNU_address'         => ! empty($data['address']) ? $data['address'] : null,
1111
+			'VNU_address2'        => ! empty($data['address2']) ? $data['address2'] : null,
1112
+			'VNU_city'            => ! empty($data['city']) ? $data['city'] : null,
1113
+			'STA_ID'              => ! empty($data['state']) ? $data['state'] : null,
1114
+			'CNT_ISO'             => ! empty($data['countries']) ? $data['countries'] : null,
1115
+			'VNU_zip'             => ! empty($data['zip']) ? $data['zip'] : null,
1116
+			'VNU_phone'           => ! empty($data['venue_phone']) ? $data['venue_phone'] : null,
1117
+			'VNU_capacity'        => ! empty($data['venue_capacity']) ? $data['venue_capacity'] : null,
1118
+			'VNU_url'             => ! empty($data['venue_url']) ? $data['venue_url'] : null,
1119
+			'VNU_virtual_phone'   => ! empty($data['virtual_phone']) ? $data['virtual_phone'] : null,
1120
+			'VNU_virtual_url'     => ! empty($data['virtual_url']) ? $data['virtual_url'] : null,
1121
+			'VNU_enable_for_gmap' => isset($data['enable_for_gmap']) ? 1 : 0,
1122
+			'status'              => 'publish',
1123
+		);
1124
+		// if we've got the venue_id then we're just updating the existing venue so let's do that and then get out.
1125
+		if (! empty($venue_id)) {
1126
+			$update_where = array($venue_model->primary_key_name() => $venue_id);
1127
+			$rows_affected = $venue_model->update($venue_array, array($update_where));
1128
+			// we've gotta make sure that the venue is always attached to a revision.. add_relation_to should take care of making sure that the relation is already present.
1129
+			$evtobj->_add_relation_to($venue_id, 'Venue');
1130
+			return $rows_affected > 0 ? true : false;
1131
+		} else {
1132
+			// we insert the venue
1133
+			$venue_id = $venue_model->insert($venue_array);
1134
+			$evtobj->_add_relation_to($venue_id, 'Venue');
1135
+			return ! empty($venue_id) ? true : false;
1136
+		}
1137
+		// when we have the ancestor come in it's already been handled by the revision save.
1138
+	}
1139
+
1140
+
1141
+	/**
1142
+	 * Handles saving everything related to Tickets (datetimes, tickets, prices)
1143
+	 *
1144
+	 * @param  EE_Event $evtobj The Event object we're attaching data to
1145
+	 * @param  array    $data   The request data from the form
1146
+	 * @return array
1147
+	 */
1148
+	protected function _default_tickets_update(EE_Event $evtobj, $data)
1149
+	{
1150
+		$success = true;
1151
+		$saved_dtt = null;
1152
+		$saved_tickets = array();
1153
+		$incoming_date_formats = array('Y-m-d', 'h:i a');
1154
+		foreach ($data['edit_event_datetimes'] as $row => $dtt) {
1155
+			// trim all values to ensure any excess whitespace is removed.
1156
+			$dtt = array_map('trim', $dtt);
1157
+			$dtt['DTT_EVT_end'] = isset($dtt['DTT_EVT_end']) && ! empty($dtt['DTT_EVT_end']) ? $dtt['DTT_EVT_end']
1158
+				: $dtt['DTT_EVT_start'];
1159
+			$datetime_values = array(
1160
+				'DTT_ID'        => ! empty($dtt['DTT_ID']) ? $dtt['DTT_ID'] : null,
1161
+				'DTT_EVT_start' => $dtt['DTT_EVT_start'],
1162
+				'DTT_EVT_end'   => $dtt['DTT_EVT_end'],
1163
+				'DTT_reg_limit' => empty($dtt['DTT_reg_limit']) ? EE_INF : $dtt['DTT_reg_limit'],
1164
+				'DTT_order'     => $row,
1165
+			);
1166
+			// if we have an id then let's get existing object first and then set the new values.  Otherwise we instantiate a new object for save.
1167
+			if (! empty($dtt['DTT_ID'])) {
1168
+				$DTM = EE_Registry::instance()
1169
+								  ->load_model('Datetime', array($evtobj->get_timezone()))
1170
+								  ->get_one_by_ID($dtt['DTT_ID']);
1171
+				$DTM->set_date_format($incoming_date_formats[0]);
1172
+				$DTM->set_time_format($incoming_date_formats[1]);
1173
+				foreach ($datetime_values as $field => $value) {
1174
+					$DTM->set($field, $value);
1175
+				}
1176
+				// make sure the $dtt_id here is saved just in case after the add_relation_to() the autosave replaces it.  We need to do this so we dont' TRASH the parent DTT.
1177
+				$saved_dtts[ $DTM->ID() ] = $DTM;
1178
+			} else {
1179
+				$DTM = EE_Registry::instance()->load_class(
1180
+					'Datetime',
1181
+					array($datetime_values, $evtobj->get_timezone(), $incoming_date_formats),
1182
+					false,
1183
+					false
1184
+				);
1185
+				foreach ($datetime_values as $field => $value) {
1186
+					$DTM->set($field, $value);
1187
+				}
1188
+			}
1189
+			$DTM->save();
1190
+			$DTT = $evtobj->_add_relation_to($DTM, 'Datetime');
1191
+			// load DTT helper
1192
+			// before going any further make sure our dates are setup correctly so that the end date is always equal or greater than the start date.
1193
+			if ($DTT->get_raw('DTT_EVT_start') > $DTT->get_raw('DTT_EVT_end')) {
1194
+				$DTT->set('DTT_EVT_end', $DTT->get('DTT_EVT_start'));
1195
+				$DTT = EEH_DTT_Helper::date_time_add($DTT, 'DTT_EVT_end', 'days');
1196
+				$DTT->save();
1197
+			}
1198
+			// now we got to make sure we add the new DTT_ID to the $saved_dtts array  because it is possible there was a new one created for the autosave.
1199
+			$saved_dtt = $DTT;
1200
+			$success = ! $success ? $success : $DTT;
1201
+			// if ANY of these updates fail then we want the appropriate global error message.
1202
+			// //todo this is actually sucky we need a better error message but this is what it is for now.
1203
+		}
1204
+		// no dtts get deleted so we don't do any of that logic here.
1205
+		// update tickets next
1206
+		$old_tickets = isset($data['ticket_IDs']) ? explode(',', $data['ticket_IDs']) : array();
1207
+		foreach ($data['edit_tickets'] as $row => $tkt) {
1208
+			$incoming_date_formats = array('Y-m-d', 'h:i a');
1209
+			$update_prices = false;
1210
+			$ticket_price = isset($data['edit_prices'][ $row ][1]['PRC_amount'])
1211
+				? $data['edit_prices'][ $row ][1]['PRC_amount'] : 0;
1212
+			// trim inputs to ensure any excess whitespace is removed.
1213
+			$tkt = array_map('trim', $tkt);
1214
+			if (empty($tkt['TKT_start_date'])) {
1215
+				// let's use now in the set timezone.
1216
+				$now = new DateTime('now', new DateTimeZone($evtobj->get_timezone()));
1217
+				$tkt['TKT_start_date'] = $now->format($incoming_date_formats[0] . ' ' . $incoming_date_formats[1]);
1218
+			}
1219
+			if (empty($tkt['TKT_end_date'])) {
1220
+				// use the start date of the first datetime
1221
+				$dtt = $evtobj->first_datetime();
1222
+				$tkt['TKT_end_date'] = $dtt->start_date_and_time(
1223
+					$incoming_date_formats[0],
1224
+					$incoming_date_formats[1]
1225
+				);
1226
+			}
1227
+			$TKT_values = array(
1228
+				'TKT_ID'          => ! empty($tkt['TKT_ID']) ? $tkt['TKT_ID'] : null,
1229
+				'TTM_ID'          => ! empty($tkt['TTM_ID']) ? $tkt['TTM_ID'] : 0,
1230
+				'TKT_name'        => ! empty($tkt['TKT_name']) ? $tkt['TKT_name'] : '',
1231
+				'TKT_description' => ! empty($tkt['TKT_description']) ? $tkt['TKT_description'] : '',
1232
+				'TKT_start_date'  => $tkt['TKT_start_date'],
1233
+				'TKT_end_date'    => $tkt['TKT_end_date'],
1234
+				'TKT_qty'         => ! isset($tkt['TKT_qty']) || $tkt['TKT_qty'] === '' ? EE_INF : $tkt['TKT_qty'],
1235
+				'TKT_uses'        => ! isset($tkt['TKT_uses']) || $tkt['TKT_uses'] === '' ? EE_INF : $tkt['TKT_uses'],
1236
+				'TKT_min'         => empty($tkt['TKT_min']) ? 0 : $tkt['TKT_min'],
1237
+				'TKT_max'         => empty($tkt['TKT_max']) ? EE_INF : $tkt['TKT_max'],
1238
+				'TKT_row'         => $row,
1239
+				'TKT_order'       => isset($tkt['TKT_order']) ? $tkt['TKT_order'] : $row,
1240
+				'TKT_price'       => $ticket_price,
1241
+			);
1242
+			// if this is a default TKT, then we need to set the TKT_ID to 0 and update accordingly, which means in turn that the prices will become new prices as well.
1243
+			if (isset($tkt['TKT_is_default']) && $tkt['TKT_is_default']) {
1244
+				$TKT_values['TKT_ID'] = 0;
1245
+				$TKT_values['TKT_is_default'] = 0;
1246
+				$TKT_values['TKT_price'] = $ticket_price;
1247
+				$update_prices = true;
1248
+			}
1249
+			// if we have a TKT_ID then we need to get that existing TKT_obj and update it
1250
+			// we actually do our saves a head of doing any add_relations to because its entirely possible that this ticket didn't removed or added to any datetime in the session but DID have it's items modified.
1251
+			// keep in mind that if the TKT has been sold (and we have changed pricing information), then we won't be updating the tkt but instead a new tkt will be created and the old one archived.
1252
+			if (! empty($tkt['TKT_ID'])) {
1253
+				$TKT = EE_Registry::instance()
1254
+								  ->load_model('Ticket', array($evtobj->get_timezone()))
1255
+								  ->get_one_by_ID($tkt['TKT_ID']);
1256
+				if ($TKT instanceof EE_Ticket) {
1257
+					$ticket_sold = $TKT->count_related(
1258
+						'Registration',
1259
+						array(
1260
+							array(
1261
+								'STS_ID' => array(
1262
+									'NOT IN',
1263
+									array(EEM_Registration::status_id_incomplete),
1264
+								),
1265
+							),
1266
+						)
1267
+					) > 0 ? true : false;
1268
+					// let's just check the total price for the existing ticket and determine if it matches the new total price.  if they are different then we create a new ticket (if tkts sold) if they aren't different then we go ahead and modify existing ticket.
1269
+					$create_new_TKT = $ticket_sold && $ticket_price != $TKT->get('TKT_price')
1270
+									  && ! $TKT->get('TKT_deleted');
1271
+					$TKT->set_date_format($incoming_date_formats[0]);
1272
+					$TKT->set_time_format($incoming_date_formats[1]);
1273
+					// set new values
1274
+					foreach ($TKT_values as $field => $value) {
1275
+						if ($field == 'TKT_qty') {
1276
+							$TKT->set_qty($value);
1277
+						} else {
1278
+							$TKT->set($field, $value);
1279
+						}
1280
+					}
1281
+					// if $create_new_TKT is false then we can safely update the existing ticket.  Otherwise we have to create a new ticket.
1282
+					if ($create_new_TKT) {
1283
+						// archive the old ticket first
1284
+						$TKT->set('TKT_deleted', 1);
1285
+						$TKT->save();
1286
+						// make sure this ticket is still recorded in our saved_tkts so we don't run it through the regular trash routine.
1287
+						$saved_tickets[ $TKT->ID() ] = $TKT;
1288
+						// create new ticket that's a copy of the existing except a new id of course (and not archived) AND has the new TKT_price associated with it.
1289
+						$TKT = clone $TKT;
1290
+						$TKT->set('TKT_ID', 0);
1291
+						$TKT->set('TKT_deleted', 0);
1292
+						$TKT->set('TKT_price', $ticket_price);
1293
+						$TKT->set('TKT_sold', 0);
1294
+						// now we need to make sure that $new prices are created as well and attached to new ticket.
1295
+						$update_prices = true;
1296
+					}
1297
+					// make sure price is set if it hasn't been already
1298
+					$TKT->set('TKT_price', $ticket_price);
1299
+				}
1300
+			} else {
1301
+				// no TKT_id so a new TKT
1302
+				$TKT_values['TKT_price'] = $ticket_price;
1303
+				$TKT = EE_Registry::instance()->load_class('Ticket', array($TKT_values), false, false);
1304
+				if ($TKT instanceof EE_Ticket) {
1305
+					// need to reset values to properly account for the date formats
1306
+					$TKT->set_date_format($incoming_date_formats[0]);
1307
+					$TKT->set_time_format($incoming_date_formats[1]);
1308
+					$TKT->set_timezone($evtobj->get_timezone());
1309
+					// set new values
1310
+					foreach ($TKT_values as $field => $value) {
1311
+						if ($field == 'TKT_qty') {
1312
+							$TKT->set_qty($value);
1313
+						} else {
1314
+							$TKT->set($field, $value);
1315
+						}
1316
+					}
1317
+					$update_prices = true;
1318
+				}
1319
+			}
1320
+			// cap ticket qty by datetime reg limits
1321
+			$TKT->set_qty(min($TKT->qty(), $TKT->qty('reg_limit')));
1322
+			// update ticket.
1323
+			$TKT->save();
1324
+			// before going any further make sure our dates are setup correctly so that the end date is always equal or greater than the start date.
1325
+			if ($TKT->get_raw('TKT_start_date') > $TKT->get_raw('TKT_end_date')) {
1326
+				$TKT->set('TKT_end_date', $TKT->get('TKT_start_date'));
1327
+				$TKT = EEH_DTT_Helper::date_time_add($TKT, 'TKT_end_date', 'days');
1328
+				$TKT->save();
1329
+			}
1330
+			// initially let's add the ticket to the dtt
1331
+			$saved_dtt->_add_relation_to($TKT, 'Ticket');
1332
+			$saved_tickets[ $TKT->ID() ] = $TKT;
1333
+			// add prices to ticket
1334
+			$this->_add_prices_to_ticket($data['edit_prices'][ $row ], $TKT, $update_prices);
1335
+		}
1336
+		// however now we need to handle permanently deleting tickets via the ui.  Keep in mind that the ui does not allow deleting/archiving tickets that have ticket sold.  However, it does allow for deleting tickets that have no tickets sold, in which case we want to get rid of permanently because there is no need to save in db.
1337
+		$old_tickets = isset($old_tickets[0]) && $old_tickets[0] == '' ? array() : $old_tickets;
1338
+		$tickets_removed = array_diff($old_tickets, array_keys($saved_tickets));
1339
+		foreach ($tickets_removed as $id) {
1340
+			$id = absint($id);
1341
+			// get the ticket for this id
1342
+			$tkt_to_remove = EE_Registry::instance()->load_model('Ticket')->get_one_by_ID($id);
1343
+			// need to get all the related datetimes on this ticket and remove from every single one of them (remember this process can ONLY kick off if there are NO tkts_sold)
1344
+			$dtts = $tkt_to_remove->get_many_related('Datetime');
1345
+			foreach ($dtts as $dtt) {
1346
+				$tkt_to_remove->_remove_relation_to($dtt, 'Datetime');
1347
+			}
1348
+			// need to do the same for prices (except these prices can also be deleted because again, tickets can only be trashed if they don't have any TKTs sold (otherwise they are just archived))
1349
+			$tkt_to_remove->delete_related_permanently('Price');
1350
+			// finally let's delete this ticket (which should not be blocked at this point b/c we've removed all our relationships)
1351
+			$tkt_to_remove->delete_permanently();
1352
+		}
1353
+		return array($saved_dtt, $saved_tickets);
1354
+	}
1355
+
1356
+
1357
+	/**
1358
+	 * This attaches a list of given prices to a ticket.
1359
+	 * Note we dont' have to worry about ever removing relationships (or archiving prices) because if there is a change
1360
+	 * in price information on a ticket, a new ticket is created anyways so the archived ticket will retain the old
1361
+	 * price info and prices are automatically "archived" via the ticket.
1362
+	 *
1363
+	 * @access  private
1364
+	 * @param array     $prices     Array of prices from the form.
1365
+	 * @param EE_Ticket $ticket     EE_Ticket object that prices are being attached to.
1366
+	 * @param bool      $new_prices Whether attach existing incoming prices or create new ones.
1367
+	 * @return  void
1368
+	 */
1369
+	private function _add_prices_to_ticket($prices, EE_Ticket $ticket, $new_prices = false)
1370
+	{
1371
+		foreach ($prices as $row => $prc) {
1372
+			$PRC_values = array(
1373
+				'PRC_ID'         => ! empty($prc['PRC_ID']) ? $prc['PRC_ID'] : null,
1374
+				'PRT_ID'         => ! empty($prc['PRT_ID']) ? $prc['PRT_ID'] : null,
1375
+				'PRC_amount'     => ! empty($prc['PRC_amount']) ? $prc['PRC_amount'] : 0,
1376
+				'PRC_name'       => ! empty($prc['PRC_name']) ? $prc['PRC_name'] : '',
1377
+				'PRC_desc'       => ! empty($prc['PRC_desc']) ? $prc['PRC_desc'] : '',
1378
+				'PRC_is_default' => 0, // make sure prices are NOT set as default from this context
1379
+				'PRC_order'      => $row,
1380
+			);
1381
+			if ($new_prices || empty($PRC_values['PRC_ID'])) {
1382
+				$PRC_values['PRC_ID'] = 0;
1383
+				$PRC = EE_Registry::instance()->load_class('Price', array($PRC_values), false, false);
1384
+			} else {
1385
+				$PRC = EE_Registry::instance()->load_model('Price')->get_one_by_ID($prc['PRC_ID']);
1386
+				// update this price with new values
1387
+				foreach ($PRC_values as $field => $newprc) {
1388
+					$PRC->set($field, $newprc);
1389
+				}
1390
+				$PRC->save();
1391
+			}
1392
+			$ticket->_add_relation_to($PRC, 'Price');
1393
+		}
1394
+	}
1395
+
1396
+
1397
+	/**
1398
+	 * Add in our autosave ajax handlers
1399
+	 *
1400
+	 */
1401
+	protected function _ee_autosave_create_new()
1402
+	{
1403
+	}
1404
+
1405
+
1406
+	/**
1407
+	 * More autosave handlers.
1408
+	 */
1409
+	protected function _ee_autosave_edit()
1410
+	{
1411
+		return; // TEMPORARILY EXITING CAUSE THIS IS A TODO
1412
+	}
1413
+
1414
+
1415
+	/**
1416
+	 *    _generate_publish_box_extra_content
1417
+	 */
1418
+	private function _generate_publish_box_extra_content()
1419
+	{
1420
+		// load formatter helper
1421
+		// args for getting related registrations
1422
+		$approved_query_args = array(
1423
+			array(
1424
+				'REG_deleted' => 0,
1425
+				'STS_ID'      => EEM_Registration::status_id_approved,
1426
+			),
1427
+		);
1428
+		$not_approved_query_args = array(
1429
+			array(
1430
+				'REG_deleted' => 0,
1431
+				'STS_ID'      => EEM_Registration::status_id_not_approved,
1432
+			),
1433
+		);
1434
+		$pending_payment_query_args = array(
1435
+			array(
1436
+				'REG_deleted' => 0,
1437
+				'STS_ID'      => EEM_Registration::status_id_pending_payment,
1438
+			),
1439
+		);
1440
+		// publish box
1441
+		$publish_box_extra_args = array(
1442
+			'view_approved_reg_url'        => add_query_arg(
1443
+				array(
1444
+					'action'      => 'default',
1445
+					'event_id'    => $this->_cpt_model_obj->ID(),
1446
+					'_reg_status' => EEM_Registration::status_id_approved,
1447
+				),
1448
+				REG_ADMIN_URL
1449
+			),
1450
+			'view_not_approved_reg_url'    => add_query_arg(
1451
+				array(
1452
+					'action'      => 'default',
1453
+					'event_id'    => $this->_cpt_model_obj->ID(),
1454
+					'_reg_status' => EEM_Registration::status_id_not_approved,
1455
+				),
1456
+				REG_ADMIN_URL
1457
+			),
1458
+			'view_pending_payment_reg_url' => add_query_arg(
1459
+				array(
1460
+					'action'      => 'default',
1461
+					'event_id'    => $this->_cpt_model_obj->ID(),
1462
+					'_reg_status' => EEM_Registration::status_id_pending_payment,
1463
+				),
1464
+				REG_ADMIN_URL
1465
+			),
1466
+			'approved_regs'                => $this->_cpt_model_obj->count_related(
1467
+				'Registration',
1468
+				$approved_query_args
1469
+			),
1470
+			'not_approved_regs'            => $this->_cpt_model_obj->count_related(
1471
+				'Registration',
1472
+				$not_approved_query_args
1473
+			),
1474
+			'pending_payment_regs'         => $this->_cpt_model_obj->count_related(
1475
+				'Registration',
1476
+				$pending_payment_query_args
1477
+			),
1478
+			'misc_pub_section_class'       => apply_filters(
1479
+				'FHEE_Events_Admin_Page___generate_publish_box_extra_content__misc_pub_section_class',
1480
+				'misc-pub-section'
1481
+			),
1482
+		);
1483
+		ob_start();
1484
+		do_action(
1485
+			'AHEE__Events_Admin_Page___generate_publish_box_extra_content__event_editor_overview_add',
1486
+			$this->_cpt_model_obj
1487
+		);
1488
+		$publish_box_extra_args['event_editor_overview_add'] = ob_get_clean();
1489
+		// load template
1490
+		EEH_Template::display_template(
1491
+			EVENTS_TEMPLATE_PATH . 'event_publish_box_extras.template.php',
1492
+			$publish_box_extra_args
1493
+		);
1494
+	}
1495
+
1496
+
1497
+	/**
1498
+	 * @return EE_Event
1499
+	 */
1500
+	public function get_event_object()
1501
+	{
1502
+		return $this->_cpt_model_obj;
1503
+	}
1504
+
1505
+
1506
+
1507
+
1508
+	/** METABOXES * */
1509
+	/**
1510
+	 * _register_event_editor_meta_boxes
1511
+	 * add all metaboxes related to the event_editor
1512
+	 *
1513
+	 * @return void
1514
+	 */
1515
+	protected function _register_event_editor_meta_boxes()
1516
+	{
1517
+		$this->verify_cpt_object();
1518
+		add_meta_box(
1519
+			'espresso_event_editor_tickets',
1520
+			esc_html__('Event Datetime & Ticket', 'event_espresso'),
1521
+			array($this, 'ticket_metabox'),
1522
+			$this->page_slug,
1523
+			'normal',
1524
+			'high'
1525
+		);
1526
+		add_meta_box(
1527
+			'espresso_event_editor_event_options',
1528
+			esc_html__('Event Registration Options', 'event_espresso'),
1529
+			array($this, 'registration_options_meta_box'),
1530
+			$this->page_slug,
1531
+			'side',
1532
+			'default'
1533
+		);
1534
+		// NOTE: if you're looking for other metaboxes in here,
1535
+		// where a metabox has a related management page in the admin
1536
+		// you will find it setup in the related management page's "_Hooks" file.
1537
+		// i.e. messages metabox is found in "espresso_events_Messages_Hooks.class.php".
1538
+	}
1539
+
1540
+
1541
+	/**
1542
+	 * @throws DomainException
1543
+	 * @throws EE_Error
1544
+	 */
1545
+	public function ticket_metabox()
1546
+	{
1547
+		$existing_datetime_ids = $existing_ticket_ids = array();
1548
+		// defaults for template args
1549
+		$template_args = array(
1550
+			'existing_datetime_ids'    => '',
1551
+			'event_datetime_help_link' => '',
1552
+			'ticket_options_help_link' => '',
1553
+			'time'                     => null,
1554
+			'ticket_rows'              => '',
1555
+			'existing_ticket_ids'      => '',
1556
+			'total_ticket_rows'        => 1,
1557
+			'ticket_js_structure'      => '',
1558
+			'trash_icon'               => 'ee-lock-icon',
1559
+			'disabled'                 => '',
1560
+		);
1561
+		$event_id = is_object($this->_cpt_model_obj) ? $this->_cpt_model_obj->ID() : null;
1562
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1563
+		/**
1564
+		 * 1. Start with retrieving Datetimes
1565
+		 * 2. Fore each datetime get related tickets
1566
+		 * 3. For each ticket get related prices
1567
+		 */
1568
+		$times = EE_Registry::instance()->load_model('Datetime')->get_all_event_dates($event_id);
1569
+		/** @type EE_Datetime $first_datetime */
1570
+		$first_datetime = reset($times);
1571
+		// do we get related tickets?
1572
+		if ($first_datetime instanceof EE_Datetime
1573
+			&& $first_datetime->ID() !== 0
1574
+		) {
1575
+			$existing_datetime_ids[] = $first_datetime->get('DTT_ID');
1576
+			$template_args['time'] = $first_datetime;
1577
+			$related_tickets = $first_datetime->tickets(
1578
+				array(
1579
+					array('OR' => array('TKT_deleted' => 1, 'TKT_deleted*' => 0)),
1580
+					'default_where_conditions' => 'none',
1581
+				)
1582
+			);
1583
+			if (! empty($related_tickets)) {
1584
+				$template_args['total_ticket_rows'] = count($related_tickets);
1585
+				$row = 0;
1586
+				foreach ($related_tickets as $ticket) {
1587
+					$existing_ticket_ids[] = $ticket->get('TKT_ID');
1588
+					$template_args['ticket_rows'] .= $this->_get_ticket_row($ticket, false, $row);
1589
+					$row++;
1590
+				}
1591
+			} else {
1592
+				$template_args['total_ticket_rows'] = 1;
1593
+				/** @type EE_Ticket $ticket */
1594
+				$ticket = EE_Registry::instance()->load_model('Ticket')->create_default_object();
1595
+				$template_args['ticket_rows'] .= $this->_get_ticket_row($ticket);
1596
+			}
1597
+		} else {
1598
+			$template_args['time'] = $times[0];
1599
+			/** @type EE_Ticket $ticket */
1600
+			$ticket = EE_Registry::instance()->load_model('Ticket')->get_all_default_tickets();
1601
+			$template_args['ticket_rows'] .= $this->_get_ticket_row($ticket[1]);
1602
+			// NOTE: we're just sending the first default row
1603
+			// (decaf can't manage default tickets so this should be sufficient);
1604
+		}
1605
+		$template_args['event_datetime_help_link'] = $this->_get_help_tab_link(
1606
+			'event_editor_event_datetimes_help_tab'
1607
+		);
1608
+		$template_args['ticket_options_help_link'] = $this->_get_help_tab_link('ticket_options_info');
1609
+		$template_args['existing_datetime_ids'] = implode(',', $existing_datetime_ids);
1610
+		$template_args['existing_ticket_ids'] = implode(',', $existing_ticket_ids);
1611
+		$template_args['ticket_js_structure'] = $this->_get_ticket_row(
1612
+			EE_Registry::instance()->load_model('Ticket')->create_default_object(),
1613
+			true
1614
+		);
1615
+		$template = apply_filters(
1616
+			'FHEE__Events_Admin_Page__ticket_metabox__template',
1617
+			EVENTS_TEMPLATE_PATH . 'event_tickets_metabox_main.template.php'
1618
+		);
1619
+		EEH_Template::display_template($template, $template_args);
1620
+	}
1621
+
1622
+
1623
+	/**
1624
+	 * Setup an individual ticket form for the decaf event editor page
1625
+	 *
1626
+	 * @access private
1627
+	 * @param  EE_Ticket $ticket   the ticket object
1628
+	 * @param  boolean   $skeleton whether we're generating a skeleton for js manipulation
1629
+	 * @param int        $row
1630
+	 * @return string generated html for the ticket row.
1631
+	 */
1632
+	private function _get_ticket_row($ticket, $skeleton = false, $row = 0)
1633
+	{
1634
+		$template_args = array(
1635
+			'tkt_status_class'    => ' tkt-status-' . $ticket->ticket_status(),
1636
+			'tkt_archive_class'   => $ticket->ticket_status() === EE_Ticket::archived && ! $skeleton ? ' tkt-archived'
1637
+				: '',
1638
+			'ticketrow'           => $skeleton ? 'TICKETNUM' : $row,
1639
+			'TKT_ID'              => $ticket->get('TKT_ID'),
1640
+			'TKT_name'            => $ticket->get('TKT_name'),
1641
+			'TKT_start_date'      => $skeleton ? '' : $ticket->get_date('TKT_start_date', 'Y-m-d h:i a'),
1642
+			'TKT_end_date'        => $skeleton ? '' : $ticket->get_date('TKT_end_date', 'Y-m-d h:i a'),
1643
+			'TKT_is_default'      => $ticket->get('TKT_is_default'),
1644
+			'TKT_qty'             => $ticket->get_pretty('TKT_qty', 'input'),
1645
+			'edit_ticketrow_name' => $skeleton ? 'TICKETNAMEATTR' : 'edit_tickets',
1646
+			'TKT_sold'            => $skeleton ? 0 : $ticket->get('TKT_sold'),
1647
+			'trash_icon'          => ($skeleton || (! empty($ticket) && ! $ticket->get('TKT_deleted')))
1648
+									 && (! empty($ticket) && $ticket->get('TKT_sold') === 0)
1649
+				? 'trash-icon dashicons dashicons-post-trash clickable' : 'ee-lock-icon',
1650
+			'disabled'            => $skeleton || (! empty($ticket) && ! $ticket->get('TKT_deleted')) ? ''
1651
+				: ' disabled=disabled',
1652
+		);
1653
+		$price = $ticket->ID() !== 0
1654
+			? $ticket->get_first_related('Price', array('default_where_conditions' => 'none'))
1655
+			: EE_Registry::instance()->load_model('Price')->create_default_object();
1656
+		$price_args = array(
1657
+			'price_currency_symbol' => EE_Registry::instance()->CFG->currency->sign,
1658
+			'PRC_amount'            => $price->get('PRC_amount'),
1659
+			'PRT_ID'                => $price->get('PRT_ID'),
1660
+			'PRC_ID'                => $price->get('PRC_ID'),
1661
+			'PRC_is_default'        => $price->get('PRC_is_default'),
1662
+		);
1663
+		// make sure we have default start and end dates if skeleton
1664
+		// handle rows that should NOT be empty
1665
+		if (empty($template_args['TKT_start_date'])) {
1666
+			// if empty then the start date will be now.
1667
+			$template_args['TKT_start_date'] = date('Y-m-d h:i a', current_time('timestamp'));
1668
+		}
1669
+		if (empty($template_args['TKT_end_date'])) {
1670
+			// get the earliest datetime (if present);
1671
+			$earliest_dtt = $this->_cpt_model_obj->ID() > 0
1672
+				? $this->_cpt_model_obj->get_first_related(
1673
+					'Datetime',
1674
+					array('order_by' => array('DTT_EVT_start' => 'ASC'))
1675
+				)
1676
+				: null;
1677
+			if (! empty($earliest_dtt)) {
1678
+				$template_args['TKT_end_date'] = $earliest_dtt->get_datetime('DTT_EVT_start', 'Y-m-d', 'h:i a');
1679
+			} else {
1680
+				$template_args['TKT_end_date'] = date(
1681
+					'Y-m-d h:i a',
1682
+					mktime(0, 0, 0, date("m"), date("d") + 7, date("Y"))
1683
+				);
1684
+			}
1685
+		}
1686
+		$template_args = array_merge($template_args, $price_args);
1687
+		$template = apply_filters(
1688
+			'FHEE__Events_Admin_Page__get_ticket_row__template',
1689
+			EVENTS_TEMPLATE_PATH . 'event_tickets_metabox_ticket_row.template.php',
1690
+			$ticket
1691
+		);
1692
+		return EEH_Template::display_template($template, $template_args, true);
1693
+	}
1694
+
1695
+
1696
+	/**
1697
+	 * @throws DomainException
1698
+	 */
1699
+	public function registration_options_meta_box()
1700
+	{
1701
+		$yes_no_values = array(
1702
+			array('id' => true, 'text' => esc_html__('Yes', 'event_espresso')),
1703
+			array('id' => false, 'text' => esc_html__('No', 'event_espresso')),
1704
+		);
1705
+		$default_reg_status_values = EEM_Registration::reg_status_array(
1706
+			array(
1707
+				EEM_Registration::status_id_cancelled,
1708
+				EEM_Registration::status_id_declined,
1709
+				EEM_Registration::status_id_incomplete,
1710
+			),
1711
+			true
1712
+		);
1713
+		// $template_args['is_active_select'] = EEH_Form_Fields::select_input('is_active', $yes_no_values, $this->_cpt_model_obj->is_active());
1714
+		$template_args['_event'] = $this->_cpt_model_obj;
1715
+		$template_args['active_status'] = $this->_cpt_model_obj->pretty_active_status(false);
1716
+		$template_args['additional_limit'] = $this->_cpt_model_obj->additional_limit();
1717
+		$template_args['default_registration_status'] = EEH_Form_Fields::select_input(
1718
+			'default_reg_status',
1719
+			$default_reg_status_values,
1720
+			$this->_cpt_model_obj->default_registration_status()
1721
+		);
1722
+		$template_args['display_description'] = EEH_Form_Fields::select_input(
1723
+			'display_desc',
1724
+			$yes_no_values,
1725
+			$this->_cpt_model_obj->display_description()
1726
+		);
1727
+		$template_args['display_ticket_selector'] = EEH_Form_Fields::select_input(
1728
+			'display_ticket_selector',
1729
+			$yes_no_values,
1730
+			$this->_cpt_model_obj->display_ticket_selector(),
1731
+			'',
1732
+			'',
1733
+			false
1734
+		);
1735
+		$template_args['additional_registration_options'] = apply_filters(
1736
+			'FHEE__Events_Admin_Page__registration_options_meta_box__additional_registration_options',
1737
+			'',
1738
+			$template_args,
1739
+			$yes_no_values,
1740
+			$default_reg_status_values
1741
+		);
1742
+		EEH_Template::display_template(
1743
+			EVENTS_TEMPLATE_PATH . 'event_registration_options.template.php',
1744
+			$template_args
1745
+		);
1746
+	}
1747
+
1748
+
1749
+	/**
1750
+	 * _get_events()
1751
+	 * This method simply returns all the events (for the given _view and paging)
1752
+	 *
1753
+	 * @access public
1754
+	 * @param int  $per_page     count of items per page (20 default);
1755
+	 * @param int  $current_page what is the current page being viewed.
1756
+	 * @param bool $count        if TRUE then we just return a count of ALL events matching the given _view.
1757
+	 *                           If FALSE then we return an array of event objects
1758
+	 *                           that match the given _view and paging parameters.
1759
+	 * @return array an array of event objects.
1760
+	 */
1761
+	public function get_events($per_page = 10, $current_page = 1, $count = false)
1762
+	{
1763
+		$EEME = $this->_event_model();
1764
+		$offset = ($current_page - 1) * $per_page;
1765
+		$limit = $count ? null : $offset . ',' . $per_page;
1766
+		$orderby = isset($this->_req_data['orderby']) ? $this->_req_data['orderby'] : 'EVT_ID';
1767
+		$order = isset($this->_req_data['order']) ? $this->_req_data['order'] : "DESC";
1768
+		if (isset($this->_req_data['month_range'])) {
1769
+			$pieces = explode(' ', $this->_req_data['month_range'], 3);
1770
+			// simulate the FIRST day of the month, that fixes issues for months like February
1771
+			// where PHP doesn't know what to assume for date.
1772
+			// @see https://events.codebasehq.com/projects/event-espresso/tickets/10437
1773
+			$month_r = ! empty($pieces[0]) ? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0])) : '';
1774
+			$year_r = ! empty($pieces[1]) ? $pieces[1] : '';
1775
+		}
1776
+		$where = array();
1777
+		$status = isset($this->_req_data['status']) ? $this->_req_data['status'] : null;
1778
+		// determine what post_status our condition will have for the query.
1779
+		switch ($status) {
1780
+			case 'month':
1781
+			case 'today':
1782
+			case null:
1783
+			case 'all':
1784
+				break;
1785
+			case 'draft':
1786
+				$where['status'] = array('IN', array('draft', 'auto-draft'));
1787
+				break;
1788
+			default:
1789
+				$where['status'] = $status;
1790
+		}
1791
+		// categories?
1792
+		$category = isset($this->_req_data['EVT_CAT']) && $this->_req_data['EVT_CAT'] > 0
1793
+			? $this->_req_data['EVT_CAT'] : null;
1794
+		if (! empty($category)) {
1795
+			$where['Term_Taxonomy.taxonomy'] = EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY;
1796
+			$where['Term_Taxonomy.term_id'] = $category;
1797
+		}
1798
+		// date where conditions
1799
+		$start_formats = EEM_Datetime::instance()->get_formats_for('DTT_EVT_start');
1800
+		if (isset($this->_req_data['month_range']) && $this->_req_data['month_range'] != '') {
1801
+			$DateTime = new DateTime(
1802
+				$year_r . '-' . $month_r . '-01 00:00:00',
1803
+				new DateTimeZone(EEM_Datetime::instance()->get_timezone())
1804
+			);
1805
+			$start = $DateTime->format(implode(' ', $start_formats));
1806
+			$end = $DateTime->setDate(
1807
+				$year_r,
1808
+				$month_r,
1809
+				$DateTime
1810
+					->format('t')
1811
+			)->setTime(23, 59, 59)
1812
+							->format(implode(' ', $start_formats));
1813
+			$where['Datetime.DTT_EVT_start'] = array('BETWEEN', array($start, $end));
1814
+		} elseif (isset($this->_req_data['status']) && $this->_req_data['status'] == 'today') {
1815
+			$DateTime = new DateTime('now', new DateTimeZone(EEM_Event::instance()->get_timezone()));
1816
+			$start = $DateTime->setTime(0, 0, 0)->format(implode(' ', $start_formats));
1817
+			$end = $DateTime->setTime(23, 59, 59)->format(implode(' ', $start_formats));
1818
+			$where['Datetime.DTT_EVT_start'] = array('BETWEEN', array($start, $end));
1819
+		} elseif (isset($this->_req_data['status']) && $this->_req_data['status'] == 'month') {
1820
+			$now = date('Y-m-01');
1821
+			$DateTime = new DateTime($now, new DateTimeZone(EEM_Event::instance()->get_timezone()));
1822
+			$start = $DateTime->setTime(0, 0, 0)->format(implode(' ', $start_formats));
1823
+			$end = $DateTime->setDate(date('Y'), date('m'), $DateTime->format('t'))
1824
+							->setTime(23, 59, 59)
1825
+							->format(implode(' ', $start_formats));
1826
+			$where['Datetime.DTT_EVT_start'] = array('BETWEEN', array($start, $end));
1827
+		}
1828
+		if (! EE_Registry::instance()->CAP->current_user_can('ee_read_others_events', 'get_events')) {
1829
+			$where['EVT_wp_user'] = get_current_user_id();
1830
+		} else {
1831
+			if (! isset($where['status'])) {
1832
+				if (! EE_Registry::instance()->CAP->current_user_can('ee_read_private_events', 'get_events')) {
1833
+					$where['OR'] = array(
1834
+						'status*restrict_private' => array('!=', 'private'),
1835
+						'AND'                     => array(
1836
+							'status*inclusive' => array('=', 'private'),
1837
+							'EVT_wp_user'      => get_current_user_id(),
1838
+						),
1839
+					);
1840
+				}
1841
+			}
1842
+		}
1843
+		if (isset($this->_req_data['EVT_wp_user'])) {
1844
+			if ($this->_req_data['EVT_wp_user'] != get_current_user_id()
1845
+				&& EE_Registry::instance()->CAP->current_user_can('ee_read_others_events', 'get_events')
1846
+			) {
1847
+				$where['EVT_wp_user'] = $this->_req_data['EVT_wp_user'];
1848
+			}
1849
+		}
1850
+		// search query handling
1851
+		if (isset($this->_req_data['s'])) {
1852
+			$search_string = '%' . $this->_req_data['s'] . '%';
1853
+			$where['OR'] = array(
1854
+				'EVT_name'       => array('LIKE', $search_string),
1855
+				'EVT_desc'       => array('LIKE', $search_string),
1856
+				'EVT_short_desc' => array('LIKE', $search_string),
1857
+			);
1858
+		}
1859
+		// filter events by venue.
1860
+		if (isset($this->_req_data['venue']) && ! empty($this->_req_data['venue'])) {
1861
+			$where['Venue.VNU_ID'] = absint($this->_req_data['venue']);
1862
+		}
1863
+		$where = apply_filters('FHEE__Events_Admin_Page__get_events__where', $where, $this->_req_data);
1864
+		$query_params = apply_filters(
1865
+			'FHEE__Events_Admin_Page__get_events__query_params',
1866
+			array(
1867
+				$where,
1868
+				'limit'    => $limit,
1869
+				'order_by' => $orderby,
1870
+				'order'    => $order,
1871
+				'group_by' => 'EVT_ID',
1872
+			),
1873
+			$this->_req_data
1874
+		);
1875
+		// let's first check if we have special requests coming in.
1876
+		if (isset($this->_req_data['active_status'])) {
1877
+			switch ($this->_req_data['active_status']) {
1878
+				case 'upcoming':
1879
+					return $EEME->get_upcoming_events($query_params, $count);
1880
+					break;
1881
+				case 'expired':
1882
+					return $EEME->get_expired_events($query_params, $count);
1883
+					break;
1884
+				case 'active':
1885
+					return $EEME->get_active_events($query_params, $count);
1886
+					break;
1887
+				case 'inactive':
1888
+					return $EEME->get_inactive_events($query_params, $count);
1889
+					break;
1890
+			}
1891
+		}
1892
+
1893
+		$events = $count ? $EEME->count(array($where), 'EVT_ID', true) : $EEME->get_all($query_params);
1894
+		return $events;
1895
+	}
1896
+
1897
+
1898
+	/**
1899
+	 * handling for WordPress CPT actions (trash, restore, delete)
1900
+	 *
1901
+	 * @param string $post_id
1902
+	 */
1903
+	public function trash_cpt_item($post_id)
1904
+	{
1905
+		$this->_req_data['EVT_ID'] = $post_id;
1906
+		$this->_trash_or_restore_event('trash', false);
1907
+	}
1908
+
1909
+
1910
+	/**
1911
+	 * @param string $post_id
1912
+	 */
1913
+	public function restore_cpt_item($post_id)
1914
+	{
1915
+		$this->_req_data['EVT_ID'] = $post_id;
1916
+		$this->_trash_or_restore_event('draft', false);
1917
+	}
1918
+
1919
+
1920
+	/**
1921
+	 * @param string $post_id
1922
+	 */
1923
+	public function delete_cpt_item($post_id)
1924
+	{
1925
+		throw new EE_Error(esc_html__('Please contact Event Espresso support with the details of the steps taken to produce this error.', 'event_espresso'));
1926
+		$this->_req_data['EVT_ID'] = $post_id;
1927
+		$this->_delete_event();
1928
+	}
1929
+
1930
+
1931
+	/**
1932
+	 * _trash_or_restore_event
1933
+	 *
1934
+	 * @access protected
1935
+	 * @param  string $event_status
1936
+	 * @param bool    $redirect_after
1937
+	 */
1938
+	protected function _trash_or_restore_event($event_status = 'trash', $redirect_after = true)
1939
+	{
1940
+		// determine the event id and set to array.
1941
+		$EVT_ID = isset($this->_req_data['EVT_ID']) ? absint($this->_req_data['EVT_ID']) : false;
1942
+		// loop thru events
1943
+		if ($EVT_ID) {
1944
+			// clean status
1945
+			$event_status = sanitize_key($event_status);
1946
+			// grab status
1947
+			if (! empty($event_status)) {
1948
+				$success = $this->_change_event_status($EVT_ID, $event_status);
1949
+			} else {
1950
+				$success = false;
1951
+				$msg = esc_html__(
1952
+					'An error occurred. The event could not be moved to the trash because a valid event status was not not supplied.',
1953
+					'event_espresso'
1954
+				);
1955
+				EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
1956
+			}
1957
+		} else {
1958
+			$success = false;
1959
+			$msg = esc_html__(
1960
+				'An error occurred. The event could not be moved to the trash because a valid event ID was not not supplied.',
1961
+				'event_espresso'
1962
+			);
1963
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
1964
+		}
1965
+		$action = $event_status == 'trash' ? 'moved to the trash' : 'restored from the trash';
1966
+		if ($redirect_after) {
1967
+			$this->_redirect_after_action($success, 'Event', $action, array('action' => 'default'));
1968
+		}
1969
+	}
1970
+
1971
+
1972
+	/**
1973
+	 * _trash_or_restore_events
1974
+	 *
1975
+	 * @access protected
1976
+	 * @param  string $event_status
1977
+	 * @return void
1978
+	 */
1979
+	protected function _trash_or_restore_events($event_status = 'trash')
1980
+	{
1981
+		// clean status
1982
+		$event_status = sanitize_key($event_status);
1983
+		// grab status
1984
+		if (! empty($event_status)) {
1985
+			$success = true;
1986
+			// determine the event id and set to array.
1987
+			$EVT_IDs = isset($this->_req_data['EVT_IDs']) ? (array) $this->_req_data['EVT_IDs'] : array();
1988
+			// loop thru events
1989
+			foreach ($EVT_IDs as $EVT_ID) {
1990
+				if ($EVT_ID = absint($EVT_ID)) {
1991
+					$results = $this->_change_event_status($EVT_ID, $event_status);
1992
+					$success = $results !== false ? $success : false;
1993
+				} else {
1994
+					$msg = sprintf(
1995
+						esc_html__(
1996
+							'An error occurred. Event #%d could not be moved to the trash because a valid event ID was not not supplied.',
1997
+							'event_espresso'
1998
+						),
1999
+						$EVT_ID
2000
+					);
2001
+					EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2002
+					$success = false;
2003
+				}
2004
+			}
2005
+		} else {
2006
+			$success = false;
2007
+			$msg = esc_html__(
2008
+				'An error occurred. The event could not be moved to the trash because a valid event status was not not supplied.',
2009
+				'event_espresso'
2010
+			);
2011
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2012
+		}
2013
+		// in order to force a pluralized result message we need to send back a success status greater than 1
2014
+		$success = $success ? 2 : false;
2015
+		$action = $event_status == 'trash' ? 'moved to the trash' : 'restored from the trash';
2016
+		$this->_redirect_after_action($success, 'Events', $action, array('action' => 'default'));
2017
+	}
2018
+
2019
+
2020
+	/**
2021
+	 * _trash_or_restore_events
2022
+	 *
2023
+	 * @access  private
2024
+	 * @param  int    $EVT_ID
2025
+	 * @param  string $event_status
2026
+	 * @return bool
2027
+	 */
2028
+	private function _change_event_status($EVT_ID = 0, $event_status = '')
2029
+	{
2030
+		// grab event id
2031
+		if (! $EVT_ID) {
2032
+			$msg = esc_html__(
2033
+				'An error occurred. No Event ID or an invalid Event ID was received.',
2034
+				'event_espresso'
2035
+			);
2036
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2037
+			return false;
2038
+		}
2039
+		$this->_cpt_model_obj = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2040
+		// clean status
2041
+		$event_status = sanitize_key($event_status);
2042
+		// grab status
2043
+		if (empty($event_status)) {
2044
+			$msg = esc_html__(
2045
+				'An error occurred. No Event Status or an invalid Event Status was received.',
2046
+				'event_espresso'
2047
+			);
2048
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2049
+			return false;
2050
+		}
2051
+		// was event trashed or restored ?
2052
+		switch ($event_status) {
2053
+			case 'draft':
2054
+				$action = 'restored from the trash';
2055
+				$hook = 'AHEE_event_restored_from_trash';
2056
+				break;
2057
+			case 'trash':
2058
+				$action = 'moved to the trash';
2059
+				$hook = 'AHEE_event_moved_to_trash';
2060
+				break;
2061
+			default:
2062
+				$action = 'updated';
2063
+				$hook = false;
2064
+		}
2065
+		// use class to change status
2066
+		$this->_cpt_model_obj->set_status($event_status);
2067
+		$success = $this->_cpt_model_obj->save();
2068
+		if ($success === false) {
2069
+			$msg = sprintf(esc_html__('An error occurred. The event could not be %s.', 'event_espresso'), $action);
2070
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2071
+			return false;
2072
+		}
2073
+		if ($hook) {
2074
+			do_action($hook);
2075
+		}
2076
+		return true;
2077
+	}
2078
+
2079
+
2080
+	/**
2081
+	 * _delete_event
2082
+	 *
2083
+	 * @access protected
2084
+	 * @param bool $redirect_after
2085
+	 */
2086
+	protected function _delete_event()
2087
+	{
2088
+		// determine the event id and set to array.
2089
+		$EVT_ID = isset($this->_req_data['EVT_ID']) ? absint($this->_req_data['EVT_ID']) : null;
2090
+		// @todo: prepare the contents of the deletion preview page via a batch job, then redirect to the preview page.
2091
+		wp_safe_redirect(
2092
+			EE_Admin_Page::add_query_args_and_nonce(
2093
+				[
2094
+					'action' => 'preview_deletion',
2095
+					'EVT_IDs[]' => $EVT_ID
2096
+				],
2097
+				$this->_admin_base_url
2098
+			)
2099
+		);
2100
+	}
2101
+
2102
+
2103
+	/**
2104
+	 * _delete_events
2105
+	 *
2106
+	 * @access protected
2107
+	 * @return void
2108
+	 */
2109
+	protected function _delete_events()
2110
+	{
2111
+		$EVT_IDs = isset($this->_req_data['EVT_IDs']) ? (array) $this->_req_data['EVT_IDs'] : array();
2112
+		$args = [
2113
+			'action' => 'preview_deletion',
2114
+		];
2115
+		foreach ($EVT_IDs as $EVT_ID) {
2116
+			$args['EVT_IDs[]'] = (int) $EVT_ID;
2117
+		}
2118
+		// @todo: prepare the contents of the deletion preview page via a batch job, then redirect to the preview page.
2119
+		wp_safe_redirect(
2120
+			EE_Admin_Page::add_query_args_and_nonce(
2121
+				$args,
2122
+				$this->_admin_base_url
2123
+			)
2124
+		);
2125
+	}
2126
+
2127
+	/**
2128
+	 * A page for users to preview what exactly will be deleted, and confirm they want to delete it.
2129
+	 * @since $VID:$
2130
+	 */
2131
+	protected function previewDeletion()
2132
+	{
2133
+		$EVT_IDs = isset($this->_req_data['EVT_IDs']) ? (array) $this->_req_data['EVT_IDs'] : array();
2134
+		$confirm_deletion_args = [
2135
+			'action' => 'confirm_deletion',
2136
+		];
2137
+		foreach ($EVT_IDs as $EVT_ID) {
2138
+			$confirm_deletion_args['EVT_IDs[]'] = (int) $EVT_ID;
2139
+		}
2140
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
2141
+			EVENTS_TEMPLATE_PATH . 'event_preview_deletion.template.php',
2142
+			[
2143
+				'form_url' => EE_Admin_Page::add_query_args_and_nonce(
2144
+					$confirm_deletion_args,
2145
+					$this->admin_base_url()
2146
+				)
2147
+			],
2148
+			true
2149
+		);
2150
+		$this->display_admin_page_with_no_sidebar();
2151
+	}
2152
+
2153
+	protected function confirmDeletion()
2154
+	{
2155
+		$event_ids = isset($this->_req_data['EVT_IDs']) ? $this->_req_data['EVT_IDs'] : array();
2156
+		$success = $this->deleteEventsAndDependentData($event_ids);
2157
+		$this->redirect_after_action(
2158
+			$success,
2159
+			esc_html__('Events', 'event_espresso'),
2160
+			esc_html__('deleted', 'event_espresso'),
2161
+			[
2162
+				'action' => 'default'
2163
+			]
2164
+		);
2165
+	}
2166
+
2167
+	/**
2168
+	 * Deletes the events and all dependent data, plus those events' non-global/non-default tickets, prices, and
2169
+	 * message template groups.
2170
+	 * @since $VID:$
2171
+	 * @param $event_ids
2172
+	 * @return int
2173
+	 * @throws EE_Error
2174
+	 * @throws InvalidArgumentException
2175
+	 * @throws ReflectionException
2176
+	 * @throws InvalidDataTypeException
2177
+	 * @throws InvalidInterfaceException
2178
+	 */
2179
+	protected function deleteEventsAndDependentData($event_ids)
2180
+	{
2181
+		// Call me an optimist.
2182
+		$success = true;
2183
+		$espresso_no_ticket_prices = get_option('ee_no_ticket_prices', array());
2184
+
2185
+		// Find all the root nodes to delete (this isn't just events, because there's other data, like related tickets,
2186
+		// prices, message templates, etc, whose model definition doesn't make them dependent on events. But,
2187
+		// we have no UI to access them independent of events, so they may as well get deleted too.)
2188
+		$model_objects_to_delete = [];
2189
+		foreach ($event_ids as $event_id) {
2190
+			$event = EEM_Event::instance()->get_one_by_ID($event_id);
2191 2191
 //            $model_objects_to_delete[] = $event;
2192
-            // Also, we want to delete their related, non-global, tickets, prices and message templates
2193
-            $related_non_global_tickets = EEM_Ticket::instance()->get_all_deleted_and_undeleted(
2194
-                [
2195
-                    [
2196
-                        'TKT_is_default' => false,
2197
-                        'Datetime.EVT_ID' => $event_id
2198
-                    ]
2199
-                ]
2200
-            );
2201
-            $related_non_global_prices = EEM_Price::instance()->get_all_deleted_and_undeleted(
2202
-                [
2203
-                    [
2204
-                        'PRC_is_default' => false,
2205
-                        'Ticket.Datetime.EVT_ID' => $event_id
2206
-                    ]
2207
-                ]
2208
-            );
2209
-            $related_message_templates = $event->get_many_related(
2210
-                'Message_Template_Group',
2211
-                [
2212
-                    [
2213
-                        'MTP_is_global' => false
2214
-                    ]
2215
-                ]
2216
-            );
2217
-            $model_objects_to_delete = array_merge(
2218
-                $model_objects_to_delete,
2219
-                [$event],
2220
-                $related_non_global_tickets,
2221
-                $related_non_global_prices,
2222
-                $related_message_templates
2223
-            );
2224
-        }
2225
-
2226
-        // Find all the dependent model objects we want to delete.
2227
-        $ids_to_delete = [];
2228
-        foreach ($model_objects_to_delete as $model_object_to_delete) {
2229
-            $node = new ModelObjNode($model_object_to_delete);
2230
-            $node->visit(9999);
2231
-            $ids_to_delete = array_replace_recursive($ids_to_delete, $node->getIds());
2232
-        }
2233
-
2234
-        // Delete them all, one query per model.
2235
-        foreach ($ids_to_delete as $model_name => $ids) {
2236
-            $model = EE_Registry::instance()->load_model($model_name);
2237
-            if ($model->has_primary_key_field()) {
2238
-                $where_conditions = [
2239
-                    $model->primary_key_name() => [
2240
-                        'IN',
2241
-                        $ids
2242
-                    ]
2243
-                ];
2244
-            } else {
2245
-                $where_conditions = [
2246
-                    'OR' => []
2247
-                ];
2248
-                foreach ($ids as $index_primary_key_string) {
2249
-                    $keys_n_values = $model->parse_index_primary_key_string($index_primary_key_string);
2250
-                    $where_conditions['OR'][ 'AND*' . $index_primary_key_string ] = $keys_n_values;
2251
-                }
2252
-            }
2253
-            if (!$model->delete_permanently(
2254
-                [
2255
-                    $where_conditions
2256
-                ],
2257
-                false
2258
-            )) {
2259
-                $success = false;
2260
-            }
2261
-        }
2262
-        if (isset($espresso_no_ticket_prices[ $event_id ])) {
2263
-            unset($espresso_no_ticket_prices[ $event_id ]);
2264
-        }
2265
-        // Fire a legacy action.
2266
-        foreach ($event_ids as $event_id) {
2267
-            do_action('AHEE__Events_Admin_Page___permanently_delete_event__after_event_deleted', $event_id);
2268
-        }
2269
-        update_option('ee_no_ticket_prices', $espresso_no_ticket_prices);
2270
-        return $success;
2271
-    }
2272
-
2273
-    /**
2274
-     * _permanently_delete_event
2275
-     *
2276
-     * @access  private
2277
-     * @param  int $EVT_ID
2278
-     * @return bool
2279
-     */
2280
-    private function _permanently_delete_event($EVT_ID = 0)
2281
-    {
2282
-        // grab event id
2283
-        if (! $EVT_ID) {
2284
-            $msg = esc_html__(
2285
-                'An error occurred. No Event ID or an invalid Event ID was received.',
2286
-                'event_espresso'
2287
-            );
2288
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2289
-            return false;
2290
-        }
2291
-        if (! $this->_cpt_model_obj instanceof EE_Event
2292
-            || $this->_cpt_model_obj->ID() !== $EVT_ID
2293
-        ) {
2294
-            $this->_cpt_model_obj = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2295
-        }
2296
-        if (! $this->_cpt_model_obj instanceof EE_Event) {
2297
-            return false;
2298
-        }
2299
-        // need to delete related tickets and prices first.
2300
-        $datetimes = $this->_cpt_model_obj->get_many_related('Datetime');
2301
-        foreach ($datetimes as $datetime) {
2302
-            $this->_cpt_model_obj->_remove_relation_to($datetime, 'Datetime');
2303
-            $tickets = $datetime->get_many_related('Ticket');
2304
-            foreach ($tickets as $ticket) {
2305
-                $ticket->_remove_relation_to($datetime, 'Datetime');
2306
-                $ticket->delete_related_permanently('Price');
2307
-                $ticket->delete_permanently();
2308
-            }
2309
-            $datetime->delete();
2310
-        }
2311
-        // what about related venues or terms?
2312
-        $venues = $this->_cpt_model_obj->get_many_related('Venue');
2313
-        foreach ($venues as $venue) {
2314
-            $this->_cpt_model_obj->_remove_relation_to($venue, 'Venue');
2315
-        }
2316
-        // any attached question groups?
2317
-        $question_groups = $this->_cpt_model_obj->get_many_related('Question_Group');
2318
-        if (! empty($question_groups)) {
2319
-            foreach ($question_groups as $question_group) {
2320
-                $this->_cpt_model_obj->_remove_relation_to($question_group, 'Question_Group');
2321
-            }
2322
-        }
2323
-        // Message Template Groups
2324
-        $this->_cpt_model_obj->_remove_relations('Message_Template_Group');
2325
-        /** @type EE_Term_Taxonomy[] $term_taxonomies */
2326
-        $term_taxonomies = $this->_cpt_model_obj->term_taxonomies();
2327
-        foreach ($term_taxonomies as $term_taxonomy) {
2328
-            $this->_cpt_model_obj->remove_relation_to_term_taxonomy($term_taxonomy);
2329
-        }
2330
-        $success = $this->_cpt_model_obj->delete_permanently();
2331
-        // did it all go as planned ?
2332
-        if ($success) {
2333
-            $msg = sprintf(esc_html__('Event ID # %d has been deleted.', 'event_espresso'), $EVT_ID);
2334
-            EE_Error::add_success($msg);
2335
-        } else {
2336
-            $msg = sprintf(
2337
-                esc_html__('An error occurred. Event ID # %d could not be deleted.', 'event_espresso'),
2338
-                $EVT_ID
2339
-            );
2340
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2341
-            return false;
2342
-        }
2343
-        do_action('AHEE__Events_Admin_Page___permanently_delete_event__after_event_deleted', $EVT_ID);
2344
-        return true;
2345
-    }
2346
-
2347
-
2348
-    /**
2349
-     * get total number of events
2350
-     *
2351
-     * @access public
2352
-     * @return int
2353
-     */
2354
-    public function total_events()
2355
-    {
2356
-        $count = EEM_Event::instance()->count(array('caps' => 'read_admin'), 'EVT_ID', true);
2357
-        return $count;
2358
-    }
2359
-
2360
-
2361
-    /**
2362
-     * get total number of draft events
2363
-     *
2364
-     * @access public
2365
-     * @return int
2366
-     */
2367
-    public function total_events_draft()
2368
-    {
2369
-        $where = array(
2370
-            'status' => array('IN', array('draft', 'auto-draft')),
2371
-        );
2372
-        $count = EEM_Event::instance()->count(array($where, 'caps' => 'read_admin'), 'EVT_ID', true);
2373
-        return $count;
2374
-    }
2375
-
2376
-
2377
-    /**
2378
-     * get total number of trashed events
2379
-     *
2380
-     * @access public
2381
-     * @return int
2382
-     */
2383
-    public function total_trashed_events()
2384
-    {
2385
-        $where = array(
2386
-            'status' => 'trash',
2387
-        );
2388
-        $count = EEM_Event::instance()->count(array($where, 'caps' => 'read_admin'), 'EVT_ID', true);
2389
-        return $count;
2390
-    }
2391
-
2392
-
2393
-    /**
2394
-     *    _default_event_settings
2395
-     *    This generates the Default Settings Tab
2396
-     *
2397
-     * @return void
2398
-     * @throws EE_Error
2399
-     */
2400
-    protected function _default_event_settings()
2401
-    {
2402
-        $this->_set_add_edit_form_tags('update_default_event_settings');
2403
-        $this->_set_publish_post_box_vars(null, false, false, null, false);
2404
-        $this->_template_args['admin_page_content'] = $this->_default_event_settings_form()->get_html();
2405
-        $this->display_admin_page_with_sidebar();
2406
-    }
2407
-
2408
-
2409
-    /**
2410
-     * Return the form for event settings.
2411
-     *
2412
-     * @return EE_Form_Section_Proper
2413
-     * @throws EE_Error
2414
-     */
2415
-    protected function _default_event_settings_form()
2416
-    {
2417
-        $registration_config = EE_Registry::instance()->CFG->registration;
2418
-        $registration_stati_for_selection = EEM_Registration::reg_status_array(
2419
-            // exclude
2420
-            array(
2421
-                EEM_Registration::status_id_cancelled,
2422
-                EEM_Registration::status_id_declined,
2423
-                EEM_Registration::status_id_incomplete,
2424
-                EEM_Registration::status_id_wait_list,
2425
-            ),
2426
-            true
2427
-        );
2428
-        return new EE_Form_Section_Proper(
2429
-            array(
2430
-                'name'            => 'update_default_event_settings',
2431
-                'html_id'         => 'update_default_event_settings',
2432
-                'html_class'      => 'form-table',
2433
-                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
2434
-                'subsections'     => apply_filters(
2435
-                    'FHEE__Events_Admin_Page___default_event_settings_form__form_subsections',
2436
-                    array(
2437
-                        'default_reg_status'  => new EE_Select_Input(
2438
-                            $registration_stati_for_selection,
2439
-                            array(
2440
-                                'default'         => isset($registration_config->default_STS_ID)
2441
-                                                     && array_key_exists(
2442
-                                                         $registration_config->default_STS_ID,
2443
-                                                         $registration_stati_for_selection
2444
-                                                     )
2445
-                                    ? sanitize_text_field($registration_config->default_STS_ID)
2446
-                                    : EEM_Registration::status_id_pending_payment,
2447
-                                'html_label_text' => esc_html__('Default Registration Status', 'event_espresso')
2448
-                                                     . EEH_Template::get_help_tab_link(
2449
-                                                         'default_settings_status_help_tab'
2450
-                                                     ),
2451
-                                'html_help_text'  => esc_html__(
2452
-                                    'This setting allows you to preselect what the default registration status setting is when creating an event.  Note that changing this setting does NOT retroactively apply it to existing events.',
2453
-                                    'event_espresso'
2454
-                                ),
2455
-                            )
2456
-                        ),
2457
-                        'default_max_tickets' => new EE_Integer_Input(
2458
-                            array(
2459
-                                'default'         => isset($registration_config->default_maximum_number_of_tickets)
2460
-                                    ? $registration_config->default_maximum_number_of_tickets
2461
-                                    : EEM_Event::get_default_additional_limit(),
2462
-                                'html_label_text' => esc_html__(
2463
-                                    'Default Maximum Tickets Allowed Per Order:',
2464
-                                    'event_espresso'
2465
-                                )
2466
-                                                     . EEH_Template::get_help_tab_link(
2467
-                                                         'default_maximum_tickets_help_tab"'
2468
-                                                     ),
2469
-                                'html_help_text'  => esc_html__(
2470
-                                    'This setting allows you to indicate what will be the default for the maximum number of tickets per order when creating new events.',
2471
-                                    'event_espresso'
2472
-                                ),
2473
-                            )
2474
-                        ),
2475
-                    )
2476
-                ),
2477
-            )
2478
-        );
2479
-    }
2480
-
2481
-
2482
-    /**
2483
-     * _update_default_event_settings
2484
-     *
2485
-     * @access protected
2486
-     * @return void
2487
-     * @throws EE_Error
2488
-     */
2489
-    protected function _update_default_event_settings()
2490
-    {
2491
-        $registration_config = EE_Registry::instance()->CFG->registration;
2492
-        $form = $this->_default_event_settings_form();
2493
-        if ($form->was_submitted()) {
2494
-            $form->receive_form_submission();
2495
-            if ($form->is_valid()) {
2496
-                $valid_data = $form->valid_data();
2497
-                if (isset($valid_data['default_reg_status'])) {
2498
-                    $registration_config->default_STS_ID = $valid_data['default_reg_status'];
2499
-                }
2500
-                if (isset($valid_data['default_max_tickets'])) {
2501
-                    $registration_config->default_maximum_number_of_tickets = $valid_data['default_max_tickets'];
2502
-                }
2503
-                // update because data was valid!
2504
-                EE_Registry::instance()->CFG->update_espresso_config();
2505
-                EE_Error::overwrite_success();
2506
-                EE_Error::add_success(
2507
-                    __('Default Event Settings were updated', 'event_espresso')
2508
-                );
2509
-            }
2510
-        }
2511
-        $this->_redirect_after_action(0, '', '', array('action' => 'default_event_settings'), true);
2512
-    }
2513
-
2514
-
2515
-    /*************        Templates        *************/
2516
-    protected function _template_settings()
2517
-    {
2518
-        $this->_admin_page_title = esc_html__('Template Settings (Preview)', 'event_espresso');
2519
-        $this->_template_args['preview_img'] = '<img src="'
2520
-                                               . EVENTS_ASSETS_URL
2521
-                                               . '/images/'
2522
-                                               . 'caffeinated_template_features.jpg" alt="'
2523
-                                               . esc_attr__('Template Settings Preview screenshot', 'event_espresso')
2524
-                                               . '" />';
2525
-        $this->_template_args['preview_text'] = '<strong>'
2526
-                                                . esc_html__(
2527
-                                                    'Template Settings is a feature that is only available in the premium version of Event Espresso 4 which is available with a support license purchase on EventEspresso.com. Template Settings allow you to configure some of the appearance options for both the Event List and Event Details pages.',
2528
-                                                    'event_espresso'
2529
-                                                ) . '</strong>';
2530
-        $this->display_admin_caf_preview_page('template_settings_tab');
2531
-    }
2532
-
2533
-
2534
-    /** Event Category Stuff **/
2535
-    /**
2536
-     * set the _category property with the category object for the loaded page.
2537
-     *
2538
-     * @access private
2539
-     * @return void
2540
-     */
2541
-    private function _set_category_object()
2542
-    {
2543
-        if (isset($this->_category->id) && ! empty($this->_category->id)) {
2544
-            return;
2545
-        } //already have the category object so get out.
2546
-        // set default category object
2547
-        $this->_set_empty_category_object();
2548
-        // only set if we've got an id
2549
-        if (! isset($this->_req_data['EVT_CAT_ID'])) {
2550
-            return;
2551
-        }
2552
-        $category_id = absint($this->_req_data['EVT_CAT_ID']);
2553
-        $term = get_term($category_id, EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY);
2554
-        if (! empty($term)) {
2555
-            $this->_category->category_name = $term->name;
2556
-            $this->_category->category_identifier = $term->slug;
2557
-            $this->_category->category_desc = $term->description;
2558
-            $this->_category->id = $term->term_id;
2559
-            $this->_category->parent = $term->parent;
2560
-        }
2561
-    }
2562
-
2563
-
2564
-    /**
2565
-     * Clears out category properties.
2566
-     */
2567
-    private function _set_empty_category_object()
2568
-    {
2569
-        $this->_category = new stdClass();
2570
-        $this->_category->category_name = $this->_category->category_identifier = $this->_category->category_desc = '';
2571
-        $this->_category->id = $this->_category->parent = 0;
2572
-    }
2573
-
2574
-
2575
-    /**
2576
-     * @throws EE_Error
2577
-     */
2578
-    protected function _category_list_table()
2579
-    {
2580
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2581
-        $this->_search_btn_label = esc_html__('Categories', 'event_espresso');
2582
-        $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
2583
-            'add_category',
2584
-            'add_category',
2585
-            array(),
2586
-            'add-new-h2'
2587
-        );
2588
-        $this->display_admin_list_table_page_with_sidebar();
2589
-    }
2590
-
2591
-
2592
-    /**
2593
-     * Output category details view.
2594
-     */
2595
-    protected function _category_details($view)
2596
-    {
2597
-        // load formatter helper
2598
-        // load field generator helper
2599
-        $route = $view == 'edit' ? 'update_category' : 'insert_category';
2600
-        $this->_set_add_edit_form_tags($route);
2601
-        $this->_set_category_object();
2602
-        $id = ! empty($this->_category->id) ? $this->_category->id : '';
2603
-        $delete_action = 'delete_category';
2604
-        // custom redirect
2605
-        $redirect = EE_Admin_Page::add_query_args_and_nonce(
2606
-            array('action' => 'category_list'),
2607
-            $this->_admin_base_url
2608
-        );
2609
-        $this->_set_publish_post_box_vars('EVT_CAT_ID', $id, $delete_action, $redirect);
2610
-        // take care of contents
2611
-        $this->_template_args['admin_page_content'] = $this->_category_details_content();
2612
-        $this->display_admin_page_with_sidebar();
2613
-    }
2614
-
2615
-
2616
-    /**
2617
-     * Output category details content.
2618
-     */
2619
-    protected function _category_details_content()
2620
-    {
2621
-        $editor_args['category_desc'] = array(
2622
-            'type'          => 'wp_editor',
2623
-            'value'         => EEH_Formatter::admin_format_content($this->_category->category_desc),
2624
-            'class'         => 'my_editor_custom',
2625
-            'wpeditor_args' => array('media_buttons' => false),
2626
-        );
2627
-        $_wp_editor = $this->_generate_admin_form_fields($editor_args, 'array');
2628
-        $all_terms = get_terms(
2629
-            array(EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY),
2630
-            array('hide_empty' => 0, 'exclude' => array($this->_category->id))
2631
-        );
2632
-        // setup category select for term parents.
2633
-        $category_select_values[] = array(
2634
-            'text' => esc_html__('No Parent', 'event_espresso'),
2635
-            'id'   => 0,
2636
-        );
2637
-        foreach ($all_terms as $term) {
2638
-            $category_select_values[] = array(
2639
-                'text' => $term->name,
2640
-                'id'   => $term->term_id,
2641
-            );
2642
-        }
2643
-        $category_select = EEH_Form_Fields::select_input(
2644
-            'category_parent',
2645
-            $category_select_values,
2646
-            $this->_category->parent
2647
-        );
2648
-        $template_args = array(
2649
-            'category'                 => $this->_category,
2650
-            'category_select'          => $category_select,
2651
-            'unique_id_info_help_link' => $this->_get_help_tab_link('unique_id_info'),
2652
-            'category_desc_editor'     => $_wp_editor['category_desc']['field'],
2653
-            'disable'                  => '',
2654
-            'disabled_message'         => false,
2655
-        );
2656
-        $template = EVENTS_TEMPLATE_PATH . 'event_category_details.template.php';
2657
-        return EEH_Template::display_template($template, $template_args, true);
2658
-    }
2659
-
2660
-
2661
-    /**
2662
-     * Handles deleting categories.
2663
-     */
2664
-    protected function _delete_categories()
2665
-    {
2666
-        $cat_ids = isset($this->_req_data['EVT_CAT_ID']) ? (array) $this->_req_data['EVT_CAT_ID']
2667
-            : (array) $this->_req_data['category_id'];
2668
-        foreach ($cat_ids as $cat_id) {
2669
-            $this->_delete_category($cat_id);
2670
-        }
2671
-        // doesn't matter what page we're coming from... we're going to the same place after delete.
2672
-        $query_args = array(
2673
-            'action' => 'category_list',
2674
-        );
2675
-        $this->_redirect_after_action(0, '', '', $query_args);
2676
-    }
2677
-
2678
-
2679
-    /**
2680
-     * Handles deleting specific category.
2681
-     *
2682
-     * @param int $cat_id
2683
-     */
2684
-    protected function _delete_category($cat_id)
2685
-    {
2686
-        $cat_id = absint($cat_id);
2687
-        wp_delete_term($cat_id, EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY);
2688
-    }
2689
-
2690
-
2691
-    /**
2692
-     * Handles triggering the update or insertion of a new category.
2693
-     *
2694
-     * @param bool $new_category true means we're triggering the insert of a new category.
2695
-     */
2696
-    protected function _insert_or_update_category($new_category)
2697
-    {
2698
-        $cat_id = $new_category ? $this->_insert_category() : $this->_insert_category(true);
2699
-        $success = 0; // we already have a success message so lets not send another.
2700
-        if ($cat_id) {
2701
-            $query_args = array(
2702
-                'action'     => 'edit_category',
2703
-                'EVT_CAT_ID' => $cat_id,
2704
-            );
2705
-        } else {
2706
-            $query_args = array('action' => 'add_category');
2707
-        }
2708
-        $this->_redirect_after_action($success, '', '', $query_args, true);
2709
-    }
2710
-
2711
-
2712
-    /**
2713
-     * Inserts or updates category
2714
-     *
2715
-     * @param bool $update (true indicates we're updating a category).
2716
-     * @return bool|mixed|string
2717
-     */
2718
-    private function _insert_category($update = false)
2719
-    {
2720
-        $cat_id = $update ? $this->_req_data['EVT_CAT_ID'] : '';
2721
-        $category_name = isset($this->_req_data['category_name']) ? $this->_req_data['category_name'] : '';
2722
-        $category_desc = isset($this->_req_data['category_desc']) ? $this->_req_data['category_desc'] : '';
2723
-        $category_parent = isset($this->_req_data['category_parent']) ? $this->_req_data['category_parent'] : 0;
2724
-        if (empty($category_name)) {
2725
-            $msg = esc_html__('You must add a name for the category.', 'event_espresso');
2726
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2727
-            return false;
2728
-        }
2729
-        $term_args = array(
2730
-            'name'        => $category_name,
2731
-            'description' => $category_desc,
2732
-            'parent'      => $category_parent,
2733
-        );
2734
-        // was the category_identifier input disabled?
2735
-        if (isset($this->_req_data['category_identifier'])) {
2736
-            $term_args['slug'] = $this->_req_data['category_identifier'];
2737
-        }
2738
-        $insert_ids = $update
2739
-            ? wp_update_term($cat_id, EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY, $term_args)
2740
-            : wp_insert_term($category_name, EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY, $term_args);
2741
-        if (! is_array($insert_ids)) {
2742
-            $msg = esc_html__(
2743
-                'An error occurred and the category has not been saved to the database.',
2744
-                'event_espresso'
2745
-            );
2746
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2747
-        } else {
2748
-            $cat_id = $insert_ids['term_id'];
2749
-            $msg = sprintf(esc_html__('The category %s was successfully saved', 'event_espresso'), $category_name);
2750
-            EE_Error::add_success($msg);
2751
-        }
2752
-        return $cat_id;
2753
-    }
2754
-
2755
-
2756
-    /**
2757
-     * Gets categories or count of categories matching the arguments in the request.
2758
-     *
2759
-     * @param int  $per_page
2760
-     * @param int  $current_page
2761
-     * @param bool $count
2762
-     * @return EE_Base_Class[]|EE_Term_Taxonomy[]|int
2763
-     */
2764
-    public function get_categories($per_page = 10, $current_page = 1, $count = false)
2765
-    {
2766
-        // testing term stuff
2767
-        $orderby = isset($this->_req_data['orderby']) ? $this->_req_data['orderby'] : 'Term.term_id';
2768
-        $order = isset($this->_req_data['order']) ? $this->_req_data['order'] : 'DESC';
2769
-        $limit = ($current_page - 1) * $per_page;
2770
-        $where = array('taxonomy' => EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY);
2771
-        if (isset($this->_req_data['s'])) {
2772
-            $sstr = '%' . $this->_req_data['s'] . '%';
2773
-            $where['OR'] = array(
2774
-                'Term.name'   => array('LIKE', $sstr),
2775
-                'description' => array('LIKE', $sstr),
2776
-            );
2777
-        }
2778
-        $query_params = array(
2779
-            $where,
2780
-            'order_by'   => array($orderby => $order),
2781
-            'limit'      => $limit . ',' . $per_page,
2782
-            'force_join' => array('Term'),
2783
-        );
2784
-        $categories = $count
2785
-            ? EEM_Term_Taxonomy::instance()->count($query_params, 'term_id')
2786
-            : EEM_Term_Taxonomy::instance()->get_all($query_params);
2787
-        return $categories;
2788
-    }
2789
-
2790
-    /* end category stuff */
2791
-    /**************/
2792
-
2793
-
2794
-    /**
2795
-     * Callback for the `ee_save_timezone_setting` ajax action.
2796
-     *
2797
-     * @throws EE_Error
2798
-     */
2799
-    public function save_timezonestring_setting()
2800
-    {
2801
-        $timezone_string = isset($this->_req_data['timezone_selected'])
2802
-            ? $this->_req_data['timezone_selected']
2803
-            : '';
2804
-        if (empty($timezone_string) || ! EEH_DTT_Helper::validate_timezone($timezone_string, false)) {
2805
-            EE_Error::add_error(
2806
-                esc_html__('An invalid timezone string submitted.', 'event_espresso'),
2807
-                __FILE__,
2808
-                __FUNCTION__,
2809
-                __LINE__
2810
-            );
2811
-            $this->_template_args['error'] = true;
2812
-            $this->_return_json();
2813
-        }
2814
-
2815
-        update_option('timezone_string', $timezone_string);
2816
-        EE_Error::add_success(
2817
-            esc_html__('Your timezone string was updated.', 'event_espresso')
2818
-        );
2819
-        $this->_template_args['success'] = true;
2820
-        $this->_return_json(true, array('action' => 'create_new'));
2821
-    }
2192
+			// Also, we want to delete their related, non-global, tickets, prices and message templates
2193
+			$related_non_global_tickets = EEM_Ticket::instance()->get_all_deleted_and_undeleted(
2194
+				[
2195
+					[
2196
+						'TKT_is_default' => false,
2197
+						'Datetime.EVT_ID' => $event_id
2198
+					]
2199
+				]
2200
+			);
2201
+			$related_non_global_prices = EEM_Price::instance()->get_all_deleted_and_undeleted(
2202
+				[
2203
+					[
2204
+						'PRC_is_default' => false,
2205
+						'Ticket.Datetime.EVT_ID' => $event_id
2206
+					]
2207
+				]
2208
+			);
2209
+			$related_message_templates = $event->get_many_related(
2210
+				'Message_Template_Group',
2211
+				[
2212
+					[
2213
+						'MTP_is_global' => false
2214
+					]
2215
+				]
2216
+			);
2217
+			$model_objects_to_delete = array_merge(
2218
+				$model_objects_to_delete,
2219
+				[$event],
2220
+				$related_non_global_tickets,
2221
+				$related_non_global_prices,
2222
+				$related_message_templates
2223
+			);
2224
+		}
2225
+
2226
+		// Find all the dependent model objects we want to delete.
2227
+		$ids_to_delete = [];
2228
+		foreach ($model_objects_to_delete as $model_object_to_delete) {
2229
+			$node = new ModelObjNode($model_object_to_delete);
2230
+			$node->visit(9999);
2231
+			$ids_to_delete = array_replace_recursive($ids_to_delete, $node->getIds());
2232
+		}
2233
+
2234
+		// Delete them all, one query per model.
2235
+		foreach ($ids_to_delete as $model_name => $ids) {
2236
+			$model = EE_Registry::instance()->load_model($model_name);
2237
+			if ($model->has_primary_key_field()) {
2238
+				$where_conditions = [
2239
+					$model->primary_key_name() => [
2240
+						'IN',
2241
+						$ids
2242
+					]
2243
+				];
2244
+			} else {
2245
+				$where_conditions = [
2246
+					'OR' => []
2247
+				];
2248
+				foreach ($ids as $index_primary_key_string) {
2249
+					$keys_n_values = $model->parse_index_primary_key_string($index_primary_key_string);
2250
+					$where_conditions['OR'][ 'AND*' . $index_primary_key_string ] = $keys_n_values;
2251
+				}
2252
+			}
2253
+			if (!$model->delete_permanently(
2254
+				[
2255
+					$where_conditions
2256
+				],
2257
+				false
2258
+			)) {
2259
+				$success = false;
2260
+			}
2261
+		}
2262
+		if (isset($espresso_no_ticket_prices[ $event_id ])) {
2263
+			unset($espresso_no_ticket_prices[ $event_id ]);
2264
+		}
2265
+		// Fire a legacy action.
2266
+		foreach ($event_ids as $event_id) {
2267
+			do_action('AHEE__Events_Admin_Page___permanently_delete_event__after_event_deleted', $event_id);
2268
+		}
2269
+		update_option('ee_no_ticket_prices', $espresso_no_ticket_prices);
2270
+		return $success;
2271
+	}
2272
+
2273
+	/**
2274
+	 * _permanently_delete_event
2275
+	 *
2276
+	 * @access  private
2277
+	 * @param  int $EVT_ID
2278
+	 * @return bool
2279
+	 */
2280
+	private function _permanently_delete_event($EVT_ID = 0)
2281
+	{
2282
+		// grab event id
2283
+		if (! $EVT_ID) {
2284
+			$msg = esc_html__(
2285
+				'An error occurred. No Event ID or an invalid Event ID was received.',
2286
+				'event_espresso'
2287
+			);
2288
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2289
+			return false;
2290
+		}
2291
+		if (! $this->_cpt_model_obj instanceof EE_Event
2292
+			|| $this->_cpt_model_obj->ID() !== $EVT_ID
2293
+		) {
2294
+			$this->_cpt_model_obj = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2295
+		}
2296
+		if (! $this->_cpt_model_obj instanceof EE_Event) {
2297
+			return false;
2298
+		}
2299
+		// need to delete related tickets and prices first.
2300
+		$datetimes = $this->_cpt_model_obj->get_many_related('Datetime');
2301
+		foreach ($datetimes as $datetime) {
2302
+			$this->_cpt_model_obj->_remove_relation_to($datetime, 'Datetime');
2303
+			$tickets = $datetime->get_many_related('Ticket');
2304
+			foreach ($tickets as $ticket) {
2305
+				$ticket->_remove_relation_to($datetime, 'Datetime');
2306
+				$ticket->delete_related_permanently('Price');
2307
+				$ticket->delete_permanently();
2308
+			}
2309
+			$datetime->delete();
2310
+		}
2311
+		// what about related venues or terms?
2312
+		$venues = $this->_cpt_model_obj->get_many_related('Venue');
2313
+		foreach ($venues as $venue) {
2314
+			$this->_cpt_model_obj->_remove_relation_to($venue, 'Venue');
2315
+		}
2316
+		// any attached question groups?
2317
+		$question_groups = $this->_cpt_model_obj->get_many_related('Question_Group');
2318
+		if (! empty($question_groups)) {
2319
+			foreach ($question_groups as $question_group) {
2320
+				$this->_cpt_model_obj->_remove_relation_to($question_group, 'Question_Group');
2321
+			}
2322
+		}
2323
+		// Message Template Groups
2324
+		$this->_cpt_model_obj->_remove_relations('Message_Template_Group');
2325
+		/** @type EE_Term_Taxonomy[] $term_taxonomies */
2326
+		$term_taxonomies = $this->_cpt_model_obj->term_taxonomies();
2327
+		foreach ($term_taxonomies as $term_taxonomy) {
2328
+			$this->_cpt_model_obj->remove_relation_to_term_taxonomy($term_taxonomy);
2329
+		}
2330
+		$success = $this->_cpt_model_obj->delete_permanently();
2331
+		// did it all go as planned ?
2332
+		if ($success) {
2333
+			$msg = sprintf(esc_html__('Event ID # %d has been deleted.', 'event_espresso'), $EVT_ID);
2334
+			EE_Error::add_success($msg);
2335
+		} else {
2336
+			$msg = sprintf(
2337
+				esc_html__('An error occurred. Event ID # %d could not be deleted.', 'event_espresso'),
2338
+				$EVT_ID
2339
+			);
2340
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2341
+			return false;
2342
+		}
2343
+		do_action('AHEE__Events_Admin_Page___permanently_delete_event__after_event_deleted', $EVT_ID);
2344
+		return true;
2345
+	}
2346
+
2347
+
2348
+	/**
2349
+	 * get total number of events
2350
+	 *
2351
+	 * @access public
2352
+	 * @return int
2353
+	 */
2354
+	public function total_events()
2355
+	{
2356
+		$count = EEM_Event::instance()->count(array('caps' => 'read_admin'), 'EVT_ID', true);
2357
+		return $count;
2358
+	}
2359
+
2360
+
2361
+	/**
2362
+	 * get total number of draft events
2363
+	 *
2364
+	 * @access public
2365
+	 * @return int
2366
+	 */
2367
+	public function total_events_draft()
2368
+	{
2369
+		$where = array(
2370
+			'status' => array('IN', array('draft', 'auto-draft')),
2371
+		);
2372
+		$count = EEM_Event::instance()->count(array($where, 'caps' => 'read_admin'), 'EVT_ID', true);
2373
+		return $count;
2374
+	}
2375
+
2376
+
2377
+	/**
2378
+	 * get total number of trashed events
2379
+	 *
2380
+	 * @access public
2381
+	 * @return int
2382
+	 */
2383
+	public function total_trashed_events()
2384
+	{
2385
+		$where = array(
2386
+			'status' => 'trash',
2387
+		);
2388
+		$count = EEM_Event::instance()->count(array($where, 'caps' => 'read_admin'), 'EVT_ID', true);
2389
+		return $count;
2390
+	}
2391
+
2392
+
2393
+	/**
2394
+	 *    _default_event_settings
2395
+	 *    This generates the Default Settings Tab
2396
+	 *
2397
+	 * @return void
2398
+	 * @throws EE_Error
2399
+	 */
2400
+	protected function _default_event_settings()
2401
+	{
2402
+		$this->_set_add_edit_form_tags('update_default_event_settings');
2403
+		$this->_set_publish_post_box_vars(null, false, false, null, false);
2404
+		$this->_template_args['admin_page_content'] = $this->_default_event_settings_form()->get_html();
2405
+		$this->display_admin_page_with_sidebar();
2406
+	}
2407
+
2408
+
2409
+	/**
2410
+	 * Return the form for event settings.
2411
+	 *
2412
+	 * @return EE_Form_Section_Proper
2413
+	 * @throws EE_Error
2414
+	 */
2415
+	protected function _default_event_settings_form()
2416
+	{
2417
+		$registration_config = EE_Registry::instance()->CFG->registration;
2418
+		$registration_stati_for_selection = EEM_Registration::reg_status_array(
2419
+			// exclude
2420
+			array(
2421
+				EEM_Registration::status_id_cancelled,
2422
+				EEM_Registration::status_id_declined,
2423
+				EEM_Registration::status_id_incomplete,
2424
+				EEM_Registration::status_id_wait_list,
2425
+			),
2426
+			true
2427
+		);
2428
+		return new EE_Form_Section_Proper(
2429
+			array(
2430
+				'name'            => 'update_default_event_settings',
2431
+				'html_id'         => 'update_default_event_settings',
2432
+				'html_class'      => 'form-table',
2433
+				'layout_strategy' => new EE_Admin_Two_Column_Layout(),
2434
+				'subsections'     => apply_filters(
2435
+					'FHEE__Events_Admin_Page___default_event_settings_form__form_subsections',
2436
+					array(
2437
+						'default_reg_status'  => new EE_Select_Input(
2438
+							$registration_stati_for_selection,
2439
+							array(
2440
+								'default'         => isset($registration_config->default_STS_ID)
2441
+													 && array_key_exists(
2442
+														 $registration_config->default_STS_ID,
2443
+														 $registration_stati_for_selection
2444
+													 )
2445
+									? sanitize_text_field($registration_config->default_STS_ID)
2446
+									: EEM_Registration::status_id_pending_payment,
2447
+								'html_label_text' => esc_html__('Default Registration Status', 'event_espresso')
2448
+													 . EEH_Template::get_help_tab_link(
2449
+														 'default_settings_status_help_tab'
2450
+													 ),
2451
+								'html_help_text'  => esc_html__(
2452
+									'This setting allows you to preselect what the default registration status setting is when creating an event.  Note that changing this setting does NOT retroactively apply it to existing events.',
2453
+									'event_espresso'
2454
+								),
2455
+							)
2456
+						),
2457
+						'default_max_tickets' => new EE_Integer_Input(
2458
+							array(
2459
+								'default'         => isset($registration_config->default_maximum_number_of_tickets)
2460
+									? $registration_config->default_maximum_number_of_tickets
2461
+									: EEM_Event::get_default_additional_limit(),
2462
+								'html_label_text' => esc_html__(
2463
+									'Default Maximum Tickets Allowed Per Order:',
2464
+									'event_espresso'
2465
+								)
2466
+													 . EEH_Template::get_help_tab_link(
2467
+														 'default_maximum_tickets_help_tab"'
2468
+													 ),
2469
+								'html_help_text'  => esc_html__(
2470
+									'This setting allows you to indicate what will be the default for the maximum number of tickets per order when creating new events.',
2471
+									'event_espresso'
2472
+								),
2473
+							)
2474
+						),
2475
+					)
2476
+				),
2477
+			)
2478
+		);
2479
+	}
2480
+
2481
+
2482
+	/**
2483
+	 * _update_default_event_settings
2484
+	 *
2485
+	 * @access protected
2486
+	 * @return void
2487
+	 * @throws EE_Error
2488
+	 */
2489
+	protected function _update_default_event_settings()
2490
+	{
2491
+		$registration_config = EE_Registry::instance()->CFG->registration;
2492
+		$form = $this->_default_event_settings_form();
2493
+		if ($form->was_submitted()) {
2494
+			$form->receive_form_submission();
2495
+			if ($form->is_valid()) {
2496
+				$valid_data = $form->valid_data();
2497
+				if (isset($valid_data['default_reg_status'])) {
2498
+					$registration_config->default_STS_ID = $valid_data['default_reg_status'];
2499
+				}
2500
+				if (isset($valid_data['default_max_tickets'])) {
2501
+					$registration_config->default_maximum_number_of_tickets = $valid_data['default_max_tickets'];
2502
+				}
2503
+				// update because data was valid!
2504
+				EE_Registry::instance()->CFG->update_espresso_config();
2505
+				EE_Error::overwrite_success();
2506
+				EE_Error::add_success(
2507
+					__('Default Event Settings were updated', 'event_espresso')
2508
+				);
2509
+			}
2510
+		}
2511
+		$this->_redirect_after_action(0, '', '', array('action' => 'default_event_settings'), true);
2512
+	}
2513
+
2514
+
2515
+	/*************        Templates        *************/
2516
+	protected function _template_settings()
2517
+	{
2518
+		$this->_admin_page_title = esc_html__('Template Settings (Preview)', 'event_espresso');
2519
+		$this->_template_args['preview_img'] = '<img src="'
2520
+											   . EVENTS_ASSETS_URL
2521
+											   . '/images/'
2522
+											   . 'caffeinated_template_features.jpg" alt="'
2523
+											   . esc_attr__('Template Settings Preview screenshot', 'event_espresso')
2524
+											   . '" />';
2525
+		$this->_template_args['preview_text'] = '<strong>'
2526
+												. esc_html__(
2527
+													'Template Settings is a feature that is only available in the premium version of Event Espresso 4 which is available with a support license purchase on EventEspresso.com. Template Settings allow you to configure some of the appearance options for both the Event List and Event Details pages.',
2528
+													'event_espresso'
2529
+												) . '</strong>';
2530
+		$this->display_admin_caf_preview_page('template_settings_tab');
2531
+	}
2532
+
2533
+
2534
+	/** Event Category Stuff **/
2535
+	/**
2536
+	 * set the _category property with the category object for the loaded page.
2537
+	 *
2538
+	 * @access private
2539
+	 * @return void
2540
+	 */
2541
+	private function _set_category_object()
2542
+	{
2543
+		if (isset($this->_category->id) && ! empty($this->_category->id)) {
2544
+			return;
2545
+		} //already have the category object so get out.
2546
+		// set default category object
2547
+		$this->_set_empty_category_object();
2548
+		// only set if we've got an id
2549
+		if (! isset($this->_req_data['EVT_CAT_ID'])) {
2550
+			return;
2551
+		}
2552
+		$category_id = absint($this->_req_data['EVT_CAT_ID']);
2553
+		$term = get_term($category_id, EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY);
2554
+		if (! empty($term)) {
2555
+			$this->_category->category_name = $term->name;
2556
+			$this->_category->category_identifier = $term->slug;
2557
+			$this->_category->category_desc = $term->description;
2558
+			$this->_category->id = $term->term_id;
2559
+			$this->_category->parent = $term->parent;
2560
+		}
2561
+	}
2562
+
2563
+
2564
+	/**
2565
+	 * Clears out category properties.
2566
+	 */
2567
+	private function _set_empty_category_object()
2568
+	{
2569
+		$this->_category = new stdClass();
2570
+		$this->_category->category_name = $this->_category->category_identifier = $this->_category->category_desc = '';
2571
+		$this->_category->id = $this->_category->parent = 0;
2572
+	}
2573
+
2574
+
2575
+	/**
2576
+	 * @throws EE_Error
2577
+	 */
2578
+	protected function _category_list_table()
2579
+	{
2580
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2581
+		$this->_search_btn_label = esc_html__('Categories', 'event_espresso');
2582
+		$this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
2583
+			'add_category',
2584
+			'add_category',
2585
+			array(),
2586
+			'add-new-h2'
2587
+		);
2588
+		$this->display_admin_list_table_page_with_sidebar();
2589
+	}
2590
+
2591
+
2592
+	/**
2593
+	 * Output category details view.
2594
+	 */
2595
+	protected function _category_details($view)
2596
+	{
2597
+		// load formatter helper
2598
+		// load field generator helper
2599
+		$route = $view == 'edit' ? 'update_category' : 'insert_category';
2600
+		$this->_set_add_edit_form_tags($route);
2601
+		$this->_set_category_object();
2602
+		$id = ! empty($this->_category->id) ? $this->_category->id : '';
2603
+		$delete_action = 'delete_category';
2604
+		// custom redirect
2605
+		$redirect = EE_Admin_Page::add_query_args_and_nonce(
2606
+			array('action' => 'category_list'),
2607
+			$this->_admin_base_url
2608
+		);
2609
+		$this->_set_publish_post_box_vars('EVT_CAT_ID', $id, $delete_action, $redirect);
2610
+		// take care of contents
2611
+		$this->_template_args['admin_page_content'] = $this->_category_details_content();
2612
+		$this->display_admin_page_with_sidebar();
2613
+	}
2614
+
2615
+
2616
+	/**
2617
+	 * Output category details content.
2618
+	 */
2619
+	protected function _category_details_content()
2620
+	{
2621
+		$editor_args['category_desc'] = array(
2622
+			'type'          => 'wp_editor',
2623
+			'value'         => EEH_Formatter::admin_format_content($this->_category->category_desc),
2624
+			'class'         => 'my_editor_custom',
2625
+			'wpeditor_args' => array('media_buttons' => false),
2626
+		);
2627
+		$_wp_editor = $this->_generate_admin_form_fields($editor_args, 'array');
2628
+		$all_terms = get_terms(
2629
+			array(EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY),
2630
+			array('hide_empty' => 0, 'exclude' => array($this->_category->id))
2631
+		);
2632
+		// setup category select for term parents.
2633
+		$category_select_values[] = array(
2634
+			'text' => esc_html__('No Parent', 'event_espresso'),
2635
+			'id'   => 0,
2636
+		);
2637
+		foreach ($all_terms as $term) {
2638
+			$category_select_values[] = array(
2639
+				'text' => $term->name,
2640
+				'id'   => $term->term_id,
2641
+			);
2642
+		}
2643
+		$category_select = EEH_Form_Fields::select_input(
2644
+			'category_parent',
2645
+			$category_select_values,
2646
+			$this->_category->parent
2647
+		);
2648
+		$template_args = array(
2649
+			'category'                 => $this->_category,
2650
+			'category_select'          => $category_select,
2651
+			'unique_id_info_help_link' => $this->_get_help_tab_link('unique_id_info'),
2652
+			'category_desc_editor'     => $_wp_editor['category_desc']['field'],
2653
+			'disable'                  => '',
2654
+			'disabled_message'         => false,
2655
+		);
2656
+		$template = EVENTS_TEMPLATE_PATH . 'event_category_details.template.php';
2657
+		return EEH_Template::display_template($template, $template_args, true);
2658
+	}
2659
+
2660
+
2661
+	/**
2662
+	 * Handles deleting categories.
2663
+	 */
2664
+	protected function _delete_categories()
2665
+	{
2666
+		$cat_ids = isset($this->_req_data['EVT_CAT_ID']) ? (array) $this->_req_data['EVT_CAT_ID']
2667
+			: (array) $this->_req_data['category_id'];
2668
+		foreach ($cat_ids as $cat_id) {
2669
+			$this->_delete_category($cat_id);
2670
+		}
2671
+		// doesn't matter what page we're coming from... we're going to the same place after delete.
2672
+		$query_args = array(
2673
+			'action' => 'category_list',
2674
+		);
2675
+		$this->_redirect_after_action(0, '', '', $query_args);
2676
+	}
2677
+
2678
+
2679
+	/**
2680
+	 * Handles deleting specific category.
2681
+	 *
2682
+	 * @param int $cat_id
2683
+	 */
2684
+	protected function _delete_category($cat_id)
2685
+	{
2686
+		$cat_id = absint($cat_id);
2687
+		wp_delete_term($cat_id, EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY);
2688
+	}
2689
+
2690
+
2691
+	/**
2692
+	 * Handles triggering the update or insertion of a new category.
2693
+	 *
2694
+	 * @param bool $new_category true means we're triggering the insert of a new category.
2695
+	 */
2696
+	protected function _insert_or_update_category($new_category)
2697
+	{
2698
+		$cat_id = $new_category ? $this->_insert_category() : $this->_insert_category(true);
2699
+		$success = 0; // we already have a success message so lets not send another.
2700
+		if ($cat_id) {
2701
+			$query_args = array(
2702
+				'action'     => 'edit_category',
2703
+				'EVT_CAT_ID' => $cat_id,
2704
+			);
2705
+		} else {
2706
+			$query_args = array('action' => 'add_category');
2707
+		}
2708
+		$this->_redirect_after_action($success, '', '', $query_args, true);
2709
+	}
2710
+
2711
+
2712
+	/**
2713
+	 * Inserts or updates category
2714
+	 *
2715
+	 * @param bool $update (true indicates we're updating a category).
2716
+	 * @return bool|mixed|string
2717
+	 */
2718
+	private function _insert_category($update = false)
2719
+	{
2720
+		$cat_id = $update ? $this->_req_data['EVT_CAT_ID'] : '';
2721
+		$category_name = isset($this->_req_data['category_name']) ? $this->_req_data['category_name'] : '';
2722
+		$category_desc = isset($this->_req_data['category_desc']) ? $this->_req_data['category_desc'] : '';
2723
+		$category_parent = isset($this->_req_data['category_parent']) ? $this->_req_data['category_parent'] : 0;
2724
+		if (empty($category_name)) {
2725
+			$msg = esc_html__('You must add a name for the category.', 'event_espresso');
2726
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2727
+			return false;
2728
+		}
2729
+		$term_args = array(
2730
+			'name'        => $category_name,
2731
+			'description' => $category_desc,
2732
+			'parent'      => $category_parent,
2733
+		);
2734
+		// was the category_identifier input disabled?
2735
+		if (isset($this->_req_data['category_identifier'])) {
2736
+			$term_args['slug'] = $this->_req_data['category_identifier'];
2737
+		}
2738
+		$insert_ids = $update
2739
+			? wp_update_term($cat_id, EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY, $term_args)
2740
+			: wp_insert_term($category_name, EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY, $term_args);
2741
+		if (! is_array($insert_ids)) {
2742
+			$msg = esc_html__(
2743
+				'An error occurred and the category has not been saved to the database.',
2744
+				'event_espresso'
2745
+			);
2746
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
2747
+		} else {
2748
+			$cat_id = $insert_ids['term_id'];
2749
+			$msg = sprintf(esc_html__('The category %s was successfully saved', 'event_espresso'), $category_name);
2750
+			EE_Error::add_success($msg);
2751
+		}
2752
+		return $cat_id;
2753
+	}
2754
+
2755
+
2756
+	/**
2757
+	 * Gets categories or count of categories matching the arguments in the request.
2758
+	 *
2759
+	 * @param int  $per_page
2760
+	 * @param int  $current_page
2761
+	 * @param bool $count
2762
+	 * @return EE_Base_Class[]|EE_Term_Taxonomy[]|int
2763
+	 */
2764
+	public function get_categories($per_page = 10, $current_page = 1, $count = false)
2765
+	{
2766
+		// testing term stuff
2767
+		$orderby = isset($this->_req_data['orderby']) ? $this->_req_data['orderby'] : 'Term.term_id';
2768
+		$order = isset($this->_req_data['order']) ? $this->_req_data['order'] : 'DESC';
2769
+		$limit = ($current_page - 1) * $per_page;
2770
+		$where = array('taxonomy' => EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY);
2771
+		if (isset($this->_req_data['s'])) {
2772
+			$sstr = '%' . $this->_req_data['s'] . '%';
2773
+			$where['OR'] = array(
2774
+				'Term.name'   => array('LIKE', $sstr),
2775
+				'description' => array('LIKE', $sstr),
2776
+			);
2777
+		}
2778
+		$query_params = array(
2779
+			$where,
2780
+			'order_by'   => array($orderby => $order),
2781
+			'limit'      => $limit . ',' . $per_page,
2782
+			'force_join' => array('Term'),
2783
+		);
2784
+		$categories = $count
2785
+			? EEM_Term_Taxonomy::instance()->count($query_params, 'term_id')
2786
+			: EEM_Term_Taxonomy::instance()->get_all($query_params);
2787
+		return $categories;
2788
+	}
2789
+
2790
+	/* end category stuff */
2791
+	/**************/
2792
+
2793
+
2794
+	/**
2795
+	 * Callback for the `ee_save_timezone_setting` ajax action.
2796
+	 *
2797
+	 * @throws EE_Error
2798
+	 */
2799
+	public function save_timezonestring_setting()
2800
+	{
2801
+		$timezone_string = isset($this->_req_data['timezone_selected'])
2802
+			? $this->_req_data['timezone_selected']
2803
+			: '';
2804
+		if (empty($timezone_string) || ! EEH_DTT_Helper::validate_timezone($timezone_string, false)) {
2805
+			EE_Error::add_error(
2806
+				esc_html__('An invalid timezone string submitted.', 'event_espresso'),
2807
+				__FILE__,
2808
+				__FUNCTION__,
2809
+				__LINE__
2810
+			);
2811
+			$this->_template_args['error'] = true;
2812
+			$this->_return_json();
2813
+		}
2814
+
2815
+		update_option('timezone_string', $timezone_string);
2816
+		EE_Error::add_success(
2817
+			esc_html__('Your timezone string was updated.', 'event_espresso')
2818
+		);
2819
+		$this->_template_args['success'] = true;
2820
+		$this->_return_json(true, array('action' => 'create_new'));
2821
+	}
2822 2822
 }
Please login to merge, or discard this patch.
admin_pages/events/Events_Admin_List_Table.class.php 2 patches
Indentation   +544 added lines, -544 removed lines patch added patch discarded remove patch
@@ -15,548 +15,548 @@
 block discarded – undo
15 15
 class Events_Admin_List_Table extends EE_Admin_List_Table
16 16
 {
17 17
 
18
-    /**
19
-     * @var EE_Datetime
20
-     */
21
-    private $_dtt;
22
-
23
-
24
-    /**
25
-     * Initial setup of data properties for the list table.
26
-     */
27
-    protected function _setup_data()
28
-    {
29
-        $this->_data = $this->_admin_page->get_events($this->_per_page, $this->_current_page);
30
-        $this->_all_data_count = $this->_admin_page->get_events(0, 0, true);
31
-    }
32
-
33
-
34
-    /**
35
-     * Set up of additional properties for the list table.
36
-     */
37
-    protected function _set_properties()
38
-    {
39
-        $this->_wp_list_args = array(
40
-            'singular' => esc_html__('event', 'event_espresso'),
41
-            'plural'   => esc_html__('events', 'event_espresso'),
42
-            'ajax'     => true, // for now
43
-            'screen'   => $this->_admin_page->get_current_screen()->id,
44
-        );
45
-        $this->_columns = array(
46
-            'cb'              => '<input type="checkbox" />',
47
-            'id'              => esc_html__('ID', 'event_espresso'),
48
-            'name'            => esc_html__('Name', 'event_espresso'),
49
-            'author'          => esc_html__('Author', 'event_espresso'),
50
-            'venue'           => esc_html__('Venue', 'event_espresso'),
51
-            'start_date_time' => esc_html__('Event Start', 'event_espresso'),
52
-            'reg_begins'      => esc_html__('On Sale', 'event_espresso'),
53
-            'attendees'       => '<span class="dashicons dashicons-groups ee-icon-color-ee-green ee-icon-size-20">'
54
-                                 . '<span class="screen-reader-text">'
55
-                                 . esc_html__('Approved Registrations', 'event_espresso')
56
-                                 . '</span>'
57
-                                 . '</span>',
58
-            // 'tkts_sold' => esc_html__('Tickets Sold', 'event_espresso'),
59
-            'actions'         => esc_html__('Actions', 'event_espresso'),
60
-        );
61
-        $this->addConditionalColumns();
62
-        $this->_sortable_columns = array(
63
-            'id'              => array('EVT_ID' => true),
64
-            'name'            => array('EVT_name' => false),
65
-            'author'          => array('EVT_wp_user' => false),
66
-            'venue'           => array('Venue.VNU_name' => false),
67
-            'start_date_time' => array('Datetime.DTT_EVT_start' => false),
68
-            'reg_begins'      => array('Datetime.Ticket.TKT_start_date' => false),
69
-        );
70
-
71
-        $this->_primary_column = 'id';
72
-        $this->_hidden_columns = array('author', 'event_category');
73
-    }
74
-
75
-
76
-    /**
77
-     * @return array
78
-     */
79
-    protected function _get_table_filters()
80
-    {
81
-        return array(); // no filters with decaf
82
-    }
83
-
84
-
85
-    /**
86
-     * Setup of views properties.
87
-     *
88
-     * @throws InvalidDataTypeException
89
-     * @throws InvalidInterfaceException
90
-     * @throws InvalidArgumentException
91
-     */
92
-    protected function _add_view_counts()
93
-    {
94
-        $this->_views['all']['count'] = $this->_admin_page->total_events();
95
-        $this->_views['draft']['count'] = $this->_admin_page->total_events_draft();
96
-        if (EE_Registry::instance()->CAP->current_user_can(
97
-            'ee_delete_events',
98
-            'espresso_events_trash_events'
99
-        )) {
100
-            $this->_views['trash']['count'] = $this->_admin_page->total_trashed_events();
101
-        }
102
-    }
103
-
104
-
105
-    /**
106
-     * @param EE_Event $item
107
-     * @return string
108
-     * @throws EE_Error
109
-     */
110
-    protected function _get_row_class($item)
111
-    {
112
-        $class = parent::_get_row_class($item);
113
-        // add status class
114
-        $class .= $item instanceof EE_Event
115
-            ? ' ee-status-strip event-status-' . $item->get_active_status()
116
-            : '';
117
-        if ($this->_has_checkbox_column) {
118
-            $class .= ' has-checkbox-column';
119
-        }
120
-        return $class;
121
-    }
122
-
123
-
124
-    /**
125
-     * @param EE_Event $item
126
-     * @return string
127
-     * @throws EE_Error
128
-     */
129
-    public function column_status(EE_Event $item)
130
-    {
131
-        return '<span class="ee-status-strip ee-status-strip-td event-status-'
132
-               . $item->get_active_status()
133
-               . '"></span>';
134
-    }
135
-
136
-
137
-    /**
138
-     * @param  EE_Event $item
139
-     * @return string
140
-     * @throws EE_Error
141
-     */
142
-    public function column_cb($item)
143
-    {
144
-        if (! $item instanceof EE_Event) {
145
-            return '';
146
-        }
147
-        $this->_dtt = $item->primary_datetime(); // set this for use in other columns
148
-        return sprintf(
149
-            '<input type="checkbox" name="EVT_IDs[]" value="%s" />',
150
-            $item->ID()
151
-        );
152
-    }
153
-
154
-
155
-    /**
156
-     * @param EE_Event $item
157
-     * @return mixed|string
158
-     * @throws EE_Error
159
-     */
160
-    public function column_id(EE_Event $item)
161
-    {
162
-        $content = $item->ID();
163
-        $content .= '  <span class="show-on-mobile-view-only">' . $item->name() . '</span>';
164
-        return $content;
165
-    }
166
-
167
-
168
-    /**
169
-     * @param EE_Event $item
170
-     * @return string
171
-     * @throws EE_Error
172
-     * @throws InvalidArgumentException
173
-     * @throws InvalidDataTypeException
174
-     * @throws InvalidInterfaceException
175
-     */
176
-    public function column_name(EE_Event $item)
177
-    {
178
-        $edit_query_args = array(
179
-            'action' => 'edit',
180
-            'post'   => $item->ID(),
181
-        );
182
-        $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
183
-        $actions = $this->_column_name_action_setup($item);
184
-        $status = ''; // $item->status() !== 'publish' ? ' (' . $item->status() . ')' : '';
185
-        $content = '<strong><a class="row-title" href="'
186
-                   . $edit_link . '">'
187
-                   . $item->name()
188
-                   . '</a></strong>'
189
-                   . $status;
190
-        $content .= '<br><span class="ee-status-text-small">'
191
-                    . EEH_Template::pretty_status(
192
-                        $item->get_active_status(),
193
-                        false,
194
-                        'sentence'
195
-                    )
196
-                    . '</span>';
197
-        $content .= $this->row_actions($actions);
198
-        return $content;
199
-    }
200
-
201
-
202
-    /**
203
-     * Just a method for setting up the actions for the name column
204
-     *
205
-     * @param EE_Event $item
206
-     * @return array array of actions
207
-     * @throws EE_Error
208
-     * @throws InvalidArgumentException
209
-     * @throws InvalidDataTypeException
210
-     * @throws InvalidInterfaceException
211
-     */
212
-    protected function _column_name_action_setup(EE_Event $item)
213
-    {
214
-        // todo: remove when attendees is active
215
-        if (! defined('REG_ADMIN_URL')) {
216
-            define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
217
-        }
218
-        $actions = array();
219
-        $restore_event_link = '';
220
-        $delete_event_link = '';
221
-        $trash_event_link = '';
222
-        if (EE_Registry::instance()->CAP->current_user_can(
223
-            'ee_edit_event',
224
-            'espresso_events_edit',
225
-            $item->ID()
226
-        )) {
227
-            $edit_query_args = array(
228
-                'action' => 'edit',
229
-                'post'   => $item->ID(),
230
-            );
231
-            $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
232
-            $actions['edit'] = '<a href="' . $edit_link . '"'
233
-                               . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
234
-                               . esc_html__('Edit', 'event_espresso')
235
-                               . '</a>';
236
-        }
237
-        if (EE_Registry::instance()->CAP->current_user_can(
238
-            'ee_read_registrations',
239
-            'espresso_registrations_view_registration'
240
-        )
241
-            && EE_Registry::instance()->CAP->current_user_can(
242
-                'ee_read_event',
243
-                'espresso_registrations_view_registration',
244
-                $item->ID()
245
-            )
246
-        ) {
247
-            $attendees_query_args = array(
248
-                'action'   => 'default',
249
-                'event_id' => $item->ID(),
250
-            );
251
-            $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
252
-            $actions['attendees'] = '<a href="' . $attendees_link . '"'
253
-                                    . ' title="' . esc_attr__('View Registrations', 'event_espresso') . '">'
254
-                                    . esc_html__('Registrations', 'event_espresso')
255
-                                    . '</a>';
256
-        }
257
-        if (EE_Registry::instance()->CAP->current_user_can(
258
-            'ee_delete_event',
259
-            'espresso_events_trash_event',
260
-            $item->ID()
261
-        )) {
262
-            $trash_event_query_args = array(
263
-                'action' => 'trash_event',
264
-                'EVT_ID' => $item->ID(),
265
-            );
266
-            $trash_event_link = EE_Admin_Page::add_query_args_and_nonce(
267
-                $trash_event_query_args,
268
-                EVENTS_ADMIN_URL
269
-            );
270
-        }
271
-        if (EE_Registry::instance()->CAP->current_user_can(
272
-            'ee_delete_event',
273
-            'espresso_events_restore_event',
274
-            $item->ID()
275
-        )) {
276
-            $restore_event_query_args = array(
277
-                'action' => 'restore_event',
278
-                'EVT_ID' => $item->ID(),
279
-            );
280
-            $restore_event_link = EE_Admin_Page::add_query_args_and_nonce(
281
-                $restore_event_query_args,
282
-                EVENTS_ADMIN_URL
283
-            );
284
-        }
285
-        if (EE_Registry::instance()->CAP->current_user_can(
286
-            'ee_delete_event',
287
-            'espresso_events_delete_event',
288
-            $item->ID()
289
-        )) {
290
-            $delete_event_query_args = array(
291
-                'action' => 'delete_event',
292
-                'EVT_ID' => $item->ID(),
293
-            );
294
-            $delete_event_link = EE_Admin_Page::add_query_args_and_nonce(
295
-                $delete_event_query_args,
296
-                EVENTS_ADMIN_URL
297
-            );
298
-        }
299
-        $view_link = get_permalink($item->ID());
300
-        $actions['view'] = '<a href="' . $view_link . '"'
301
-                           . ' title="' . esc_attr__('View Event', 'event_espresso') . '">'
302
-                           . esc_html__('View', 'event_espresso')
303
-                           . '</a>';
304
-        if ($item->get('status') === 'trash') {
305
-            if (EE_Registry::instance()->CAP->current_user_can(
306
-                'ee_delete_event',
307
-                'espresso_events_restore_event',
308
-                $item->ID()
309
-            )) {
310
-                $actions['restore_from_trash'] = '<a href="' . $restore_event_link . '"'
311
-                                                 . ' title="' . esc_attr__('Restore from Trash', 'event_espresso')
312
-                                                 . '">'
313
-                                                 . esc_html__('Restore from Trash', 'event_espresso')
314
-                                                 . '</a>';
315
-            }
316
-            if (EE_Registry::instance()->CAP->current_user_can(
317
-                'ee_delete_event',
318
-                'espresso_events_delete_event',
319
-                $item->ID()
320
-            )
321
-            ) {
322
-                $actions['delete'] = '<a href="' . $delete_event_link . '"'
323
-                                     . ' title="' . esc_attr__('Delete Permanently', 'event_espresso') . '">'
324
-                                     . esc_html__('Delete Permanently', 'event_espresso')
325
-                                     . '</a>';
326
-            }
327
-        } else {
328
-            if (EE_Registry::instance()->CAP->current_user_can(
329
-                'ee_delete_event',
330
-                'espresso_events_trash_event',
331
-                $item->ID()
332
-            )) {
333
-                $actions['move to trash'] = '<a href="' . $trash_event_link . '"'
334
-                                            . ' title="' . esc_attr__('Trash Event', 'event_espresso') . '">'
335
-                                            . esc_html__('Trash', 'event_espresso')
336
-                                            . '</a>';
337
-            }
338
-        }
339
-        return $actions;
340
-    }
341
-
342
-
343
-    /**
344
-     * @param EE_Event $item
345
-     * @return string
346
-     * @throws EE_Error
347
-     */
348
-    public function column_author(EE_Event $item)
349
-    {
350
-        // user author info
351
-        $event_author = get_userdata($item->wp_user());
352
-        $gravatar = get_avatar($item->wp_user(), '15');
353
-        // filter link
354
-        $query_args = array(
355
-            'action'      => 'default',
356
-            'EVT_wp_user' => $item->wp_user(),
357
-        );
358
-        $filter_url = EE_Admin_Page::add_query_args_and_nonce($query_args, EVENTS_ADMIN_URL);
359
-        return $gravatar . '  <a href="' . $filter_url . '"'
360
-               . ' title="' . esc_attr__('Click to filter events by this author.', 'event_espresso') . '">'
361
-               . $event_author->display_name
362
-               . '</a>';
363
-    }
364
-
365
-
366
-    /**
367
-     * @param EE_Event $event
368
-     * @return string
369
-     * @throws EE_Error
370
-     */
371
-    public function column_event_category(EE_Event $event)
372
-    {
373
-        $event_categories = $event->get_all_event_categories();
374
-        return implode(
375
-            ', ',
376
-            array_map(
377
-                function (EE_Term $category) {
378
-                    return $category->name();
379
-                },
380
-                $event_categories
381
-            )
382
-        );
383
-    }
384
-
385
-
386
-    /**
387
-     * @param EE_Event $item
388
-     * @return string
389
-     * @throws EE_Error
390
-     */
391
-    public function column_venue(EE_Event $item)
392
-    {
393
-        $venue = $item->get_first_related('Venue');
394
-        return ! empty($venue)
395
-            ? $venue->name()
396
-            : '';
397
-    }
398
-
399
-
400
-    /**
401
-     * @param EE_Event $item
402
-     * @return string
403
-     * @throws EE_Error
404
-     */
405
-    public function column_start_date_time(EE_Event $item)
406
-    {
407
-        return $this->_dtt instanceof EE_Datetime
408
-            ? $this->_dtt->get_i18n_datetime('DTT_EVT_start')
409
-            : esc_html__('No Date was saved for this Event', 'event_espresso');
410
-    }
411
-
412
-
413
-    /**
414
-     * @param EE_Event $item
415
-     * @return string
416
-     * @throws EE_Error
417
-     */
418
-    public function column_reg_begins(EE_Event $item)
419
-    {
420
-        $reg_start = $item->get_ticket_with_earliest_start_time();
421
-        return $reg_start instanceof EE_Ticket
422
-            ? $reg_start->get_i18n_datetime('TKT_start_date')
423
-            : esc_html__('No Tickets have been setup for this Event', 'event_espresso');
424
-    }
425
-
426
-
427
-    /**
428
-     * @param EE_Event $item
429
-     * @return int|string
430
-     * @throws EE_Error
431
-     * @throws InvalidArgumentException
432
-     * @throws InvalidDataTypeException
433
-     * @throws InvalidInterfaceException
434
-     */
435
-    public function column_attendees(EE_Event $item)
436
-    {
437
-        $attendees_query_args = array(
438
-            'action'   => 'default',
439
-            'event_id' => $item->ID(),
440
-        );
441
-        $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
442
-        $registered_attendees = EEM_Registration::instance()->get_event_registration_count($item->ID());
443
-        return EE_Registry::instance()->CAP->current_user_can(
444
-            'ee_read_event',
445
-            'espresso_registrations_view_registration',
446
-            $item->ID()
447
-        )
448
-               && EE_Registry::instance()->CAP->current_user_can(
449
-                   'ee_read_registrations',
450
-                   'espresso_registrations_view_registration'
451
-               )
452
-            ? '<a href="' . $attendees_link . '">' . $registered_attendees . '</a>'
453
-            : $registered_attendees;
454
-    }
455
-
456
-
457
-    /**
458
-     * @param EE_Event $item
459
-     * @return float
460
-     * @throws EE_Error
461
-     * @throws InvalidArgumentException
462
-     * @throws InvalidDataTypeException
463
-     * @throws InvalidInterfaceException
464
-     */
465
-    public function column_tkts_sold(EE_Event $item)
466
-    {
467
-        return EEM_Ticket::instance()->sum(array(array('Datetime.EVT_ID' => $item->ID())), 'TKT_sold');
468
-    }
469
-
470
-
471
-    /**
472
-     * @param EE_Event $item
473
-     * @return string
474
-     * @throws EE_Error
475
-     * @throws InvalidArgumentException
476
-     * @throws InvalidDataTypeException
477
-     * @throws InvalidInterfaceException
478
-     */
479
-    public function column_actions(EE_Event $item)
480
-    {
481
-        // todo: remove when attendees is active
482
-        if (! defined('REG_ADMIN_URL')) {
483
-            define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
484
-        }
485
-        $action_links = array();
486
-        $view_link = get_permalink($item->ID());
487
-        $action_links[] = '<a href="' . $view_link . '"'
488
-                          . ' title="' . esc_attr__('View Event', 'event_espresso') . '" target="_blank">';
489
-        $action_links[] = '<div class="dashicons dashicons-search"></div></a>';
490
-        if (EE_Registry::instance()->CAP->current_user_can(
491
-            'ee_edit_event',
492
-            'espresso_events_edit',
493
-            $item->ID()
494
-        )) {
495
-            $edit_query_args = array(
496
-                'action' => 'edit',
497
-                'post'   => $item->ID(),
498
-            );
499
-            $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
500
-            $action_links[] = '<a href="' . $edit_link . '"'
501
-                              . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
502
-                              . '<div class="ee-icon ee-icon-calendar-edit"></div>'
503
-                              . '</a>';
504
-        }
505
-        if (EE_Registry::instance()->CAP->current_user_can(
506
-            'ee_read_registrations',
507
-            'espresso_registrations_view_registration'
508
-        ) && EE_Registry::instance()->CAP->current_user_can(
509
-            'ee_read_event',
510
-            'espresso_registrations_view_registration',
511
-            $item->ID()
512
-        )
513
-        ) {
514
-            $attendees_query_args = array(
515
-                'action'   => 'default',
516
-                'event_id' => $item->ID(),
517
-            );
518
-            $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
519
-            $action_links[] = '<a href="' . $attendees_link . '"'
520
-                              . ' title="' . esc_attr__('View Registrants', 'event_espresso') . '">'
521
-                              . '<div class="dashicons dashicons-groups"></div>'
522
-                              . '</a>';
523
-        }
524
-        $action_links = apply_filters(
525
-            'FHEE__Events_Admin_List_Table__column_actions__action_links',
526
-            $action_links,
527
-            $item
528
-        );
529
-        return $this->_action_string(
530
-            implode("\n\t", $action_links),
531
-            $item,
532
-            'div'
533
-        );
534
-    }
535
-
536
-
537
-    /**
538
-     * Helper for adding columns conditionally
539
-     *
540
-     * @throws EE_Error
541
-     * @throws InvalidArgumentException
542
-     * @throws InvalidDataTypeException
543
-     * @throws InvalidInterfaceException
544
-     */
545
-    private function addConditionalColumns()
546
-    {
547
-        $event_category_count = EEM_Term::instance()->count(
548
-            [['Term_Taxonomy.taxonomy' => EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY]]
549
-        );
550
-        if ($event_category_count === 0) {
551
-            return;
552
-        }
553
-        $column_array = [];
554
-        foreach ($this->_columns as $column => $column_label) {
555
-            $column_array[ $column ] = $column_label;
556
-            if ($column === 'venue') {
557
-                $column_array['event_category'] = esc_html__('Event Category', 'event_espresso');
558
-            }
559
-        }
560
-        $this->_columns = $column_array;
561
-    }
18
+	/**
19
+	 * @var EE_Datetime
20
+	 */
21
+	private $_dtt;
22
+
23
+
24
+	/**
25
+	 * Initial setup of data properties for the list table.
26
+	 */
27
+	protected function _setup_data()
28
+	{
29
+		$this->_data = $this->_admin_page->get_events($this->_per_page, $this->_current_page);
30
+		$this->_all_data_count = $this->_admin_page->get_events(0, 0, true);
31
+	}
32
+
33
+
34
+	/**
35
+	 * Set up of additional properties for the list table.
36
+	 */
37
+	protected function _set_properties()
38
+	{
39
+		$this->_wp_list_args = array(
40
+			'singular' => esc_html__('event', 'event_espresso'),
41
+			'plural'   => esc_html__('events', 'event_espresso'),
42
+			'ajax'     => true, // for now
43
+			'screen'   => $this->_admin_page->get_current_screen()->id,
44
+		);
45
+		$this->_columns = array(
46
+			'cb'              => '<input type="checkbox" />',
47
+			'id'              => esc_html__('ID', 'event_espresso'),
48
+			'name'            => esc_html__('Name', 'event_espresso'),
49
+			'author'          => esc_html__('Author', 'event_espresso'),
50
+			'venue'           => esc_html__('Venue', 'event_espresso'),
51
+			'start_date_time' => esc_html__('Event Start', 'event_espresso'),
52
+			'reg_begins'      => esc_html__('On Sale', 'event_espresso'),
53
+			'attendees'       => '<span class="dashicons dashicons-groups ee-icon-color-ee-green ee-icon-size-20">'
54
+								 . '<span class="screen-reader-text">'
55
+								 . esc_html__('Approved Registrations', 'event_espresso')
56
+								 . '</span>'
57
+								 . '</span>',
58
+			// 'tkts_sold' => esc_html__('Tickets Sold', 'event_espresso'),
59
+			'actions'         => esc_html__('Actions', 'event_espresso'),
60
+		);
61
+		$this->addConditionalColumns();
62
+		$this->_sortable_columns = array(
63
+			'id'              => array('EVT_ID' => true),
64
+			'name'            => array('EVT_name' => false),
65
+			'author'          => array('EVT_wp_user' => false),
66
+			'venue'           => array('Venue.VNU_name' => false),
67
+			'start_date_time' => array('Datetime.DTT_EVT_start' => false),
68
+			'reg_begins'      => array('Datetime.Ticket.TKT_start_date' => false),
69
+		);
70
+
71
+		$this->_primary_column = 'id';
72
+		$this->_hidden_columns = array('author', 'event_category');
73
+	}
74
+
75
+
76
+	/**
77
+	 * @return array
78
+	 */
79
+	protected function _get_table_filters()
80
+	{
81
+		return array(); // no filters with decaf
82
+	}
83
+
84
+
85
+	/**
86
+	 * Setup of views properties.
87
+	 *
88
+	 * @throws InvalidDataTypeException
89
+	 * @throws InvalidInterfaceException
90
+	 * @throws InvalidArgumentException
91
+	 */
92
+	protected function _add_view_counts()
93
+	{
94
+		$this->_views['all']['count'] = $this->_admin_page->total_events();
95
+		$this->_views['draft']['count'] = $this->_admin_page->total_events_draft();
96
+		if (EE_Registry::instance()->CAP->current_user_can(
97
+			'ee_delete_events',
98
+			'espresso_events_trash_events'
99
+		)) {
100
+			$this->_views['trash']['count'] = $this->_admin_page->total_trashed_events();
101
+		}
102
+	}
103
+
104
+
105
+	/**
106
+	 * @param EE_Event $item
107
+	 * @return string
108
+	 * @throws EE_Error
109
+	 */
110
+	protected function _get_row_class($item)
111
+	{
112
+		$class = parent::_get_row_class($item);
113
+		// add status class
114
+		$class .= $item instanceof EE_Event
115
+			? ' ee-status-strip event-status-' . $item->get_active_status()
116
+			: '';
117
+		if ($this->_has_checkbox_column) {
118
+			$class .= ' has-checkbox-column';
119
+		}
120
+		return $class;
121
+	}
122
+
123
+
124
+	/**
125
+	 * @param EE_Event $item
126
+	 * @return string
127
+	 * @throws EE_Error
128
+	 */
129
+	public function column_status(EE_Event $item)
130
+	{
131
+		return '<span class="ee-status-strip ee-status-strip-td event-status-'
132
+			   . $item->get_active_status()
133
+			   . '"></span>';
134
+	}
135
+
136
+
137
+	/**
138
+	 * @param  EE_Event $item
139
+	 * @return string
140
+	 * @throws EE_Error
141
+	 */
142
+	public function column_cb($item)
143
+	{
144
+		if (! $item instanceof EE_Event) {
145
+			return '';
146
+		}
147
+		$this->_dtt = $item->primary_datetime(); // set this for use in other columns
148
+		return sprintf(
149
+			'<input type="checkbox" name="EVT_IDs[]" value="%s" />',
150
+			$item->ID()
151
+		);
152
+	}
153
+
154
+
155
+	/**
156
+	 * @param EE_Event $item
157
+	 * @return mixed|string
158
+	 * @throws EE_Error
159
+	 */
160
+	public function column_id(EE_Event $item)
161
+	{
162
+		$content = $item->ID();
163
+		$content .= '  <span class="show-on-mobile-view-only">' . $item->name() . '</span>';
164
+		return $content;
165
+	}
166
+
167
+
168
+	/**
169
+	 * @param EE_Event $item
170
+	 * @return string
171
+	 * @throws EE_Error
172
+	 * @throws InvalidArgumentException
173
+	 * @throws InvalidDataTypeException
174
+	 * @throws InvalidInterfaceException
175
+	 */
176
+	public function column_name(EE_Event $item)
177
+	{
178
+		$edit_query_args = array(
179
+			'action' => 'edit',
180
+			'post'   => $item->ID(),
181
+		);
182
+		$edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
183
+		$actions = $this->_column_name_action_setup($item);
184
+		$status = ''; // $item->status() !== 'publish' ? ' (' . $item->status() . ')' : '';
185
+		$content = '<strong><a class="row-title" href="'
186
+				   . $edit_link . '">'
187
+				   . $item->name()
188
+				   . '</a></strong>'
189
+				   . $status;
190
+		$content .= '<br><span class="ee-status-text-small">'
191
+					. EEH_Template::pretty_status(
192
+						$item->get_active_status(),
193
+						false,
194
+						'sentence'
195
+					)
196
+					. '</span>';
197
+		$content .= $this->row_actions($actions);
198
+		return $content;
199
+	}
200
+
201
+
202
+	/**
203
+	 * Just a method for setting up the actions for the name column
204
+	 *
205
+	 * @param EE_Event $item
206
+	 * @return array array of actions
207
+	 * @throws EE_Error
208
+	 * @throws InvalidArgumentException
209
+	 * @throws InvalidDataTypeException
210
+	 * @throws InvalidInterfaceException
211
+	 */
212
+	protected function _column_name_action_setup(EE_Event $item)
213
+	{
214
+		// todo: remove when attendees is active
215
+		if (! defined('REG_ADMIN_URL')) {
216
+			define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
217
+		}
218
+		$actions = array();
219
+		$restore_event_link = '';
220
+		$delete_event_link = '';
221
+		$trash_event_link = '';
222
+		if (EE_Registry::instance()->CAP->current_user_can(
223
+			'ee_edit_event',
224
+			'espresso_events_edit',
225
+			$item->ID()
226
+		)) {
227
+			$edit_query_args = array(
228
+				'action' => 'edit',
229
+				'post'   => $item->ID(),
230
+			);
231
+			$edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
232
+			$actions['edit'] = '<a href="' . $edit_link . '"'
233
+							   . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
234
+							   . esc_html__('Edit', 'event_espresso')
235
+							   . '</a>';
236
+		}
237
+		if (EE_Registry::instance()->CAP->current_user_can(
238
+			'ee_read_registrations',
239
+			'espresso_registrations_view_registration'
240
+		)
241
+			&& EE_Registry::instance()->CAP->current_user_can(
242
+				'ee_read_event',
243
+				'espresso_registrations_view_registration',
244
+				$item->ID()
245
+			)
246
+		) {
247
+			$attendees_query_args = array(
248
+				'action'   => 'default',
249
+				'event_id' => $item->ID(),
250
+			);
251
+			$attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
252
+			$actions['attendees'] = '<a href="' . $attendees_link . '"'
253
+									. ' title="' . esc_attr__('View Registrations', 'event_espresso') . '">'
254
+									. esc_html__('Registrations', 'event_espresso')
255
+									. '</a>';
256
+		}
257
+		if (EE_Registry::instance()->CAP->current_user_can(
258
+			'ee_delete_event',
259
+			'espresso_events_trash_event',
260
+			$item->ID()
261
+		)) {
262
+			$trash_event_query_args = array(
263
+				'action' => 'trash_event',
264
+				'EVT_ID' => $item->ID(),
265
+			);
266
+			$trash_event_link = EE_Admin_Page::add_query_args_and_nonce(
267
+				$trash_event_query_args,
268
+				EVENTS_ADMIN_URL
269
+			);
270
+		}
271
+		if (EE_Registry::instance()->CAP->current_user_can(
272
+			'ee_delete_event',
273
+			'espresso_events_restore_event',
274
+			$item->ID()
275
+		)) {
276
+			$restore_event_query_args = array(
277
+				'action' => 'restore_event',
278
+				'EVT_ID' => $item->ID(),
279
+			);
280
+			$restore_event_link = EE_Admin_Page::add_query_args_and_nonce(
281
+				$restore_event_query_args,
282
+				EVENTS_ADMIN_URL
283
+			);
284
+		}
285
+		if (EE_Registry::instance()->CAP->current_user_can(
286
+			'ee_delete_event',
287
+			'espresso_events_delete_event',
288
+			$item->ID()
289
+		)) {
290
+			$delete_event_query_args = array(
291
+				'action' => 'delete_event',
292
+				'EVT_ID' => $item->ID(),
293
+			);
294
+			$delete_event_link = EE_Admin_Page::add_query_args_and_nonce(
295
+				$delete_event_query_args,
296
+				EVENTS_ADMIN_URL
297
+			);
298
+		}
299
+		$view_link = get_permalink($item->ID());
300
+		$actions['view'] = '<a href="' . $view_link . '"'
301
+						   . ' title="' . esc_attr__('View Event', 'event_espresso') . '">'
302
+						   . esc_html__('View', 'event_espresso')
303
+						   . '</a>';
304
+		if ($item->get('status') === 'trash') {
305
+			if (EE_Registry::instance()->CAP->current_user_can(
306
+				'ee_delete_event',
307
+				'espresso_events_restore_event',
308
+				$item->ID()
309
+			)) {
310
+				$actions['restore_from_trash'] = '<a href="' . $restore_event_link . '"'
311
+												 . ' title="' . esc_attr__('Restore from Trash', 'event_espresso')
312
+												 . '">'
313
+												 . esc_html__('Restore from Trash', 'event_espresso')
314
+												 . '</a>';
315
+			}
316
+			if (EE_Registry::instance()->CAP->current_user_can(
317
+				'ee_delete_event',
318
+				'espresso_events_delete_event',
319
+				$item->ID()
320
+			)
321
+			) {
322
+				$actions['delete'] = '<a href="' . $delete_event_link . '"'
323
+									 . ' title="' . esc_attr__('Delete Permanently', 'event_espresso') . '">'
324
+									 . esc_html__('Delete Permanently', 'event_espresso')
325
+									 . '</a>';
326
+			}
327
+		} else {
328
+			if (EE_Registry::instance()->CAP->current_user_can(
329
+				'ee_delete_event',
330
+				'espresso_events_trash_event',
331
+				$item->ID()
332
+			)) {
333
+				$actions['move to trash'] = '<a href="' . $trash_event_link . '"'
334
+											. ' title="' . esc_attr__('Trash Event', 'event_espresso') . '">'
335
+											. esc_html__('Trash', 'event_espresso')
336
+											. '</a>';
337
+			}
338
+		}
339
+		return $actions;
340
+	}
341
+
342
+
343
+	/**
344
+	 * @param EE_Event $item
345
+	 * @return string
346
+	 * @throws EE_Error
347
+	 */
348
+	public function column_author(EE_Event $item)
349
+	{
350
+		// user author info
351
+		$event_author = get_userdata($item->wp_user());
352
+		$gravatar = get_avatar($item->wp_user(), '15');
353
+		// filter link
354
+		$query_args = array(
355
+			'action'      => 'default',
356
+			'EVT_wp_user' => $item->wp_user(),
357
+		);
358
+		$filter_url = EE_Admin_Page::add_query_args_and_nonce($query_args, EVENTS_ADMIN_URL);
359
+		return $gravatar . '  <a href="' . $filter_url . '"'
360
+			   . ' title="' . esc_attr__('Click to filter events by this author.', 'event_espresso') . '">'
361
+			   . $event_author->display_name
362
+			   . '</a>';
363
+	}
364
+
365
+
366
+	/**
367
+	 * @param EE_Event $event
368
+	 * @return string
369
+	 * @throws EE_Error
370
+	 */
371
+	public function column_event_category(EE_Event $event)
372
+	{
373
+		$event_categories = $event->get_all_event_categories();
374
+		return implode(
375
+			', ',
376
+			array_map(
377
+				function (EE_Term $category) {
378
+					return $category->name();
379
+				},
380
+				$event_categories
381
+			)
382
+		);
383
+	}
384
+
385
+
386
+	/**
387
+	 * @param EE_Event $item
388
+	 * @return string
389
+	 * @throws EE_Error
390
+	 */
391
+	public function column_venue(EE_Event $item)
392
+	{
393
+		$venue = $item->get_first_related('Venue');
394
+		return ! empty($venue)
395
+			? $venue->name()
396
+			: '';
397
+	}
398
+
399
+
400
+	/**
401
+	 * @param EE_Event $item
402
+	 * @return string
403
+	 * @throws EE_Error
404
+	 */
405
+	public function column_start_date_time(EE_Event $item)
406
+	{
407
+		return $this->_dtt instanceof EE_Datetime
408
+			? $this->_dtt->get_i18n_datetime('DTT_EVT_start')
409
+			: esc_html__('No Date was saved for this Event', 'event_espresso');
410
+	}
411
+
412
+
413
+	/**
414
+	 * @param EE_Event $item
415
+	 * @return string
416
+	 * @throws EE_Error
417
+	 */
418
+	public function column_reg_begins(EE_Event $item)
419
+	{
420
+		$reg_start = $item->get_ticket_with_earliest_start_time();
421
+		return $reg_start instanceof EE_Ticket
422
+			? $reg_start->get_i18n_datetime('TKT_start_date')
423
+			: esc_html__('No Tickets have been setup for this Event', 'event_espresso');
424
+	}
425
+
426
+
427
+	/**
428
+	 * @param EE_Event $item
429
+	 * @return int|string
430
+	 * @throws EE_Error
431
+	 * @throws InvalidArgumentException
432
+	 * @throws InvalidDataTypeException
433
+	 * @throws InvalidInterfaceException
434
+	 */
435
+	public function column_attendees(EE_Event $item)
436
+	{
437
+		$attendees_query_args = array(
438
+			'action'   => 'default',
439
+			'event_id' => $item->ID(),
440
+		);
441
+		$attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
442
+		$registered_attendees = EEM_Registration::instance()->get_event_registration_count($item->ID());
443
+		return EE_Registry::instance()->CAP->current_user_can(
444
+			'ee_read_event',
445
+			'espresso_registrations_view_registration',
446
+			$item->ID()
447
+		)
448
+			   && EE_Registry::instance()->CAP->current_user_can(
449
+				   'ee_read_registrations',
450
+				   'espresso_registrations_view_registration'
451
+			   )
452
+			? '<a href="' . $attendees_link . '">' . $registered_attendees . '</a>'
453
+			: $registered_attendees;
454
+	}
455
+
456
+
457
+	/**
458
+	 * @param EE_Event $item
459
+	 * @return float
460
+	 * @throws EE_Error
461
+	 * @throws InvalidArgumentException
462
+	 * @throws InvalidDataTypeException
463
+	 * @throws InvalidInterfaceException
464
+	 */
465
+	public function column_tkts_sold(EE_Event $item)
466
+	{
467
+		return EEM_Ticket::instance()->sum(array(array('Datetime.EVT_ID' => $item->ID())), 'TKT_sold');
468
+	}
469
+
470
+
471
+	/**
472
+	 * @param EE_Event $item
473
+	 * @return string
474
+	 * @throws EE_Error
475
+	 * @throws InvalidArgumentException
476
+	 * @throws InvalidDataTypeException
477
+	 * @throws InvalidInterfaceException
478
+	 */
479
+	public function column_actions(EE_Event $item)
480
+	{
481
+		// todo: remove when attendees is active
482
+		if (! defined('REG_ADMIN_URL')) {
483
+			define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
484
+		}
485
+		$action_links = array();
486
+		$view_link = get_permalink($item->ID());
487
+		$action_links[] = '<a href="' . $view_link . '"'
488
+						  . ' title="' . esc_attr__('View Event', 'event_espresso') . '" target="_blank">';
489
+		$action_links[] = '<div class="dashicons dashicons-search"></div></a>';
490
+		if (EE_Registry::instance()->CAP->current_user_can(
491
+			'ee_edit_event',
492
+			'espresso_events_edit',
493
+			$item->ID()
494
+		)) {
495
+			$edit_query_args = array(
496
+				'action' => 'edit',
497
+				'post'   => $item->ID(),
498
+			);
499
+			$edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
500
+			$action_links[] = '<a href="' . $edit_link . '"'
501
+							  . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
502
+							  . '<div class="ee-icon ee-icon-calendar-edit"></div>'
503
+							  . '</a>';
504
+		}
505
+		if (EE_Registry::instance()->CAP->current_user_can(
506
+			'ee_read_registrations',
507
+			'espresso_registrations_view_registration'
508
+		) && EE_Registry::instance()->CAP->current_user_can(
509
+			'ee_read_event',
510
+			'espresso_registrations_view_registration',
511
+			$item->ID()
512
+		)
513
+		) {
514
+			$attendees_query_args = array(
515
+				'action'   => 'default',
516
+				'event_id' => $item->ID(),
517
+			);
518
+			$attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
519
+			$action_links[] = '<a href="' . $attendees_link . '"'
520
+							  . ' title="' . esc_attr__('View Registrants', 'event_espresso') . '">'
521
+							  . '<div class="dashicons dashicons-groups"></div>'
522
+							  . '</a>';
523
+		}
524
+		$action_links = apply_filters(
525
+			'FHEE__Events_Admin_List_Table__column_actions__action_links',
526
+			$action_links,
527
+			$item
528
+		);
529
+		return $this->_action_string(
530
+			implode("\n\t", $action_links),
531
+			$item,
532
+			'div'
533
+		);
534
+	}
535
+
536
+
537
+	/**
538
+	 * Helper for adding columns conditionally
539
+	 *
540
+	 * @throws EE_Error
541
+	 * @throws InvalidArgumentException
542
+	 * @throws InvalidDataTypeException
543
+	 * @throws InvalidInterfaceException
544
+	 */
545
+	private function addConditionalColumns()
546
+	{
547
+		$event_category_count = EEM_Term::instance()->count(
548
+			[['Term_Taxonomy.taxonomy' => EEM_CPT_Base::EVENT_CATEGORY_TAXONOMY]]
549
+		);
550
+		if ($event_category_count === 0) {
551
+			return;
552
+		}
553
+		$column_array = [];
554
+		foreach ($this->_columns as $column => $column_label) {
555
+			$column_array[ $column ] = $column_label;
556
+			if ($column === 'venue') {
557
+				$column_array['event_category'] = esc_html__('Event Category', 'event_espresso');
558
+			}
559
+		}
560
+		$this->_columns = $column_array;
561
+	}
562 562
 }
Please login to merge, or discard this patch.
Spacing   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -112,7 +112,7 @@  discard block
 block discarded – undo
112 112
         $class = parent::_get_row_class($item);
113 113
         // add status class
114 114
         $class .= $item instanceof EE_Event
115
-            ? ' ee-status-strip event-status-' . $item->get_active_status()
115
+            ? ' ee-status-strip event-status-'.$item->get_active_status()
116 116
             : '';
117 117
         if ($this->_has_checkbox_column) {
118 118
             $class .= ' has-checkbox-column';
@@ -141,7 +141,7 @@  discard block
 block discarded – undo
141 141
      */
142 142
     public function column_cb($item)
143 143
     {
144
-        if (! $item instanceof EE_Event) {
144
+        if ( ! $item instanceof EE_Event) {
145 145
             return '';
146 146
         }
147 147
         $this->_dtt = $item->primary_datetime(); // set this for use in other columns
@@ -160,7 +160,7 @@  discard block
 block discarded – undo
160 160
     public function column_id(EE_Event $item)
161 161
     {
162 162
         $content = $item->ID();
163
-        $content .= '  <span class="show-on-mobile-view-only">' . $item->name() . '</span>';
163
+        $content .= '  <span class="show-on-mobile-view-only">'.$item->name().'</span>';
164 164
         return $content;
165 165
     }
166 166
 
@@ -183,7 +183,7 @@  discard block
 block discarded – undo
183 183
         $actions = $this->_column_name_action_setup($item);
184 184
         $status = ''; // $item->status() !== 'publish' ? ' (' . $item->status() . ')' : '';
185 185
         $content = '<strong><a class="row-title" href="'
186
-                   . $edit_link . '">'
186
+                   . $edit_link.'">'
187 187
                    . $item->name()
188 188
                    . '</a></strong>'
189 189
                    . $status;
@@ -212,7 +212,7 @@  discard block
 block discarded – undo
212 212
     protected function _column_name_action_setup(EE_Event $item)
213 213
     {
214 214
         // todo: remove when attendees is active
215
-        if (! defined('REG_ADMIN_URL')) {
215
+        if ( ! defined('REG_ADMIN_URL')) {
216 216
             define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
217 217
         }
218 218
         $actions = array();
@@ -229,8 +229,8 @@  discard block
 block discarded – undo
229 229
                 'post'   => $item->ID(),
230 230
             );
231 231
             $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
232
-            $actions['edit'] = '<a href="' . $edit_link . '"'
233
-                               . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
232
+            $actions['edit'] = '<a href="'.$edit_link.'"'
233
+                               . ' title="'.esc_attr__('Edit Event', 'event_espresso').'">'
234 234
                                . esc_html__('Edit', 'event_espresso')
235 235
                                . '</a>';
236 236
         }
@@ -249,8 +249,8 @@  discard block
 block discarded – undo
249 249
                 'event_id' => $item->ID(),
250 250
             );
251 251
             $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
252
-            $actions['attendees'] = '<a href="' . $attendees_link . '"'
253
-                                    . ' title="' . esc_attr__('View Registrations', 'event_espresso') . '">'
252
+            $actions['attendees'] = '<a href="'.$attendees_link.'"'
253
+                                    . ' title="'.esc_attr__('View Registrations', 'event_espresso').'">'
254 254
                                     . esc_html__('Registrations', 'event_espresso')
255 255
                                     . '</a>';
256 256
         }
@@ -297,8 +297,8 @@  discard block
 block discarded – undo
297 297
             );
298 298
         }
299 299
         $view_link = get_permalink($item->ID());
300
-        $actions['view'] = '<a href="' . $view_link . '"'
301
-                           . ' title="' . esc_attr__('View Event', 'event_espresso') . '">'
300
+        $actions['view'] = '<a href="'.$view_link.'"'
301
+                           . ' title="'.esc_attr__('View Event', 'event_espresso').'">'
302 302
                            . esc_html__('View', 'event_espresso')
303 303
                            . '</a>';
304 304
         if ($item->get('status') === 'trash') {
@@ -307,8 +307,8 @@  discard block
 block discarded – undo
307 307
                 'espresso_events_restore_event',
308 308
                 $item->ID()
309 309
             )) {
310
-                $actions['restore_from_trash'] = '<a href="' . $restore_event_link . '"'
311
-                                                 . ' title="' . esc_attr__('Restore from Trash', 'event_espresso')
310
+                $actions['restore_from_trash'] = '<a href="'.$restore_event_link.'"'
311
+                                                 . ' title="'.esc_attr__('Restore from Trash', 'event_espresso')
312 312
                                                  . '">'
313 313
                                                  . esc_html__('Restore from Trash', 'event_espresso')
314 314
                                                  . '</a>';
@@ -319,8 +319,8 @@  discard block
 block discarded – undo
319 319
                 $item->ID()
320 320
             )
321 321
             ) {
322
-                $actions['delete'] = '<a href="' . $delete_event_link . '"'
323
-                                     . ' title="' . esc_attr__('Delete Permanently', 'event_espresso') . '">'
322
+                $actions['delete'] = '<a href="'.$delete_event_link.'"'
323
+                                     . ' title="'.esc_attr__('Delete Permanently', 'event_espresso').'">'
324 324
                                      . esc_html__('Delete Permanently', 'event_espresso')
325 325
                                      . '</a>';
326 326
             }
@@ -330,8 +330,8 @@  discard block
 block discarded – undo
330 330
                 'espresso_events_trash_event',
331 331
                 $item->ID()
332 332
             )) {
333
-                $actions['move to trash'] = '<a href="' . $trash_event_link . '"'
334
-                                            . ' title="' . esc_attr__('Trash Event', 'event_espresso') . '">'
333
+                $actions['move to trash'] = '<a href="'.$trash_event_link.'"'
334
+                                            . ' title="'.esc_attr__('Trash Event', 'event_espresso').'">'
335 335
                                             . esc_html__('Trash', 'event_espresso')
336 336
                                             . '</a>';
337 337
             }
@@ -356,8 +356,8 @@  discard block
 block discarded – undo
356 356
             'EVT_wp_user' => $item->wp_user(),
357 357
         );
358 358
         $filter_url = EE_Admin_Page::add_query_args_and_nonce($query_args, EVENTS_ADMIN_URL);
359
-        return $gravatar . '  <a href="' . $filter_url . '"'
360
-               . ' title="' . esc_attr__('Click to filter events by this author.', 'event_espresso') . '">'
359
+        return $gravatar.'  <a href="'.$filter_url.'"'
360
+               . ' title="'.esc_attr__('Click to filter events by this author.', 'event_espresso').'">'
361 361
                . $event_author->display_name
362 362
                . '</a>';
363 363
     }
@@ -374,7 +374,7 @@  discard block
 block discarded – undo
374 374
         return implode(
375 375
             ', ',
376 376
             array_map(
377
-                function (EE_Term $category) {
377
+                function(EE_Term $category) {
378 378
                     return $category->name();
379 379
                 },
380 380
                 $event_categories
@@ -449,7 +449,7 @@  discard block
 block discarded – undo
449 449
                    'ee_read_registrations',
450 450
                    'espresso_registrations_view_registration'
451 451
                )
452
-            ? '<a href="' . $attendees_link . '">' . $registered_attendees . '</a>'
452
+            ? '<a href="'.$attendees_link.'">'.$registered_attendees.'</a>'
453 453
             : $registered_attendees;
454 454
     }
455 455
 
@@ -479,13 +479,13 @@  discard block
 block discarded – undo
479 479
     public function column_actions(EE_Event $item)
480 480
     {
481 481
         // todo: remove when attendees is active
482
-        if (! defined('REG_ADMIN_URL')) {
482
+        if ( ! defined('REG_ADMIN_URL')) {
483 483
             define('REG_ADMIN_URL', EVENTS_ADMIN_URL);
484 484
         }
485 485
         $action_links = array();
486 486
         $view_link = get_permalink($item->ID());
487
-        $action_links[] = '<a href="' . $view_link . '"'
488
-                          . ' title="' . esc_attr__('View Event', 'event_espresso') . '" target="_blank">';
487
+        $action_links[] = '<a href="'.$view_link.'"'
488
+                          . ' title="'.esc_attr__('View Event', 'event_espresso').'" target="_blank">';
489 489
         $action_links[] = '<div class="dashicons dashicons-search"></div></a>';
490 490
         if (EE_Registry::instance()->CAP->current_user_can(
491 491
             'ee_edit_event',
@@ -497,8 +497,8 @@  discard block
 block discarded – undo
497 497
                 'post'   => $item->ID(),
498 498
             );
499 499
             $edit_link = EE_Admin_Page::add_query_args_and_nonce($edit_query_args, EVENTS_ADMIN_URL);
500
-            $action_links[] = '<a href="' . $edit_link . '"'
501
-                              . ' title="' . esc_attr__('Edit Event', 'event_espresso') . '">'
500
+            $action_links[] = '<a href="'.$edit_link.'"'
501
+                              . ' title="'.esc_attr__('Edit Event', 'event_espresso').'">'
502 502
                               . '<div class="ee-icon ee-icon-calendar-edit"></div>'
503 503
                               . '</a>';
504 504
         }
@@ -516,8 +516,8 @@  discard block
 block discarded – undo
516 516
                 'event_id' => $item->ID(),
517 517
             );
518 518
             $attendees_link = EE_Admin_Page::add_query_args_and_nonce($attendees_query_args, REG_ADMIN_URL);
519
-            $action_links[] = '<a href="' . $attendees_link . '"'
520
-                              . ' title="' . esc_attr__('View Registrants', 'event_espresso') . '">'
519
+            $action_links[] = '<a href="'.$attendees_link.'"'
520
+                              . ' title="'.esc_attr__('View Registrants', 'event_espresso').'">'
521 521
                               . '<div class="dashicons dashicons-groups"></div>'
522 522
                               . '</a>';
523 523
         }
@@ -552,7 +552,7 @@  discard block
 block discarded – undo
552 552
         }
553 553
         $column_array = [];
554 554
         foreach ($this->_columns as $column => $column_label) {
555
-            $column_array[ $column ] = $column_label;
555
+            $column_array[$column] = $column_label;
556 556
             if ($column === 'venue') {
557 557
                 $column_array['event_category'] = esc_html__('Event Category', 'event_espresso');
558 558
             }
Please login to merge, or discard this patch.