Event Tickets - Version 4.2.2

Version Description

Download this release

Release Info

Developer lucatume
Plugin Icon 128x128 Event Tickets
Version 4.2.2
Comparing to
See all releases

Code changes from version 4.2.1.1 to 4.2.2

common/src/Tribe/Exception.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ /**
5
+ * Class Tribe__Exception
6
+ *
7
+ * Handles exceptions to log when not in debug mode.
8
+ */
9
+ class Tribe__Exception extends Exception {
10
+
11
+ /**
12
+ * @var Exception
13
+ */
14
+ private $original_exception;
15
+
16
+ /**
17
+ * Tribe__Exception constructor.
18
+ *
19
+ * @param Exception $original_exception
20
+ */
21
+ public function __construct( Exception $original_exception ) {
22
+ $this->original_exception = $original_exception;
23
+ }
24
+
25
+ /**
26
+ * Handles the exception throwing the original when debugging (`WP_DEBUG` defined and `true`)
27
+ * or quietly logging when `WP_DEBUG` is `false` or not set.
28
+ *
29
+ * @return bool `true` if the message was logged, `false` otherwise.
30
+ *
31
+ * @throws Exception
32
+ */
33
+ public function handle() {
34
+ $debug = defined( 'WP_DEBUG' ) && WP_DEBUG;
35
+
36
+ if ( $debug ) {
37
+ $this->throw_original_exception();
38
+ }
39
+
40
+ return $this->log_original_exception_message();
41
+ }
42
+
43
+ /**
44
+ * @return string
45
+ */
46
+ private function get_log_type_for_exception_code( $code ) {
47
+ $map = array(
48
+ // @todo: let's add a decent exception code to log type map here
49
+ );
50
+
51
+ return isset( $map[ $code ] ) ? $map[ $code ] : Tribe__Log::ERROR;
52
+ }
53
+
54
+ /**
55
+ * Throws the original exception.
56
+ *
57
+ * Provided as a manual override over the default `WP_DEBUG` dependent behaviour.
58
+ *
59
+ * @see Tribe__Exception::handle()
60
+ *
61
+ * @throws Exception
62
+ */
63
+ public function throw_original_exception() {
64
+ throw $this->original_exception;
65
+ }
66
+
67
+ /**
68
+ * Logs the original exception message.
69
+ *
70
+ * Provided as a manual override over the default `WP_DEBUG` dependent behaviour.
71
+ *
72
+ * @see Tribe__Exception::handle()
73
+ *
74
+ * @return bool `true` if the message was logged, `false` otherwise.
75
+ */
76
+ private function log_original_exception_message() {
77
+ if ( ! class_exists( 'Tribe__Log' ) ) {
78
+ return false;
79
+ }
80
+
81
+ $logger = new Tribe__Log();
82
+ $message = $this->original_exception->getMessage();
83
+ $log_type = $this->get_log_type_for_exception_code( $this->original_exception->getCode() );
84
+ $src = $this->original_exception->getFile() . ':' . $this->original_exception->getLine();
85
+
86
+ $logger->log( $message, $log_type, $src );
87
+
88
+ return true;
89
+ }
90
+ }
common/src/Tribe/Main.php CHANGED
@@ -17,7 +17,7 @@ class Tribe__Main {
17
  const OPTIONNAME = 'tribe_events_calendar_options';
18
  const OPTIONNAMENETWORK = 'tribe_events_calendar_network_options';
19
 
20
- const VERSION = '4.2.1.1';
21
  const FEED_URL = 'https://theeventscalendar.com/feed/';
22
 
23
  protected $plugin_context;
17
  const OPTIONNAME = 'tribe_events_calendar_options';
18
  const OPTIONNAMENETWORK = 'tribe_events_calendar_network_options';
19
 
20
+ const VERSION = '4.2.1';
21
  const FEED_URL = 'https://theeventscalendar.com/feed/';
22
 
23
  protected $plugin_context;
common/src/resources/css/tribe-common-admin.css CHANGED
@@ -729,6 +729,7 @@ table.plugins .tribe-plugin-update-message a {
729
  .tribe_welcome_page h2,
730
  .tribe_update_page h2 {
731
  font-size: 30px;
 
732
  margin-bottom: 20px;
733
  }
734
  .tribe_welcome_page h3,
729
  .tribe_welcome_page h2,
730
  .tribe_update_page h2 {
731
  font-size: 30px;
732
+ line-height: 1.2;
733
  margin-bottom: 20px;
734
  }
735
  .tribe_welcome_page h3,
common/src/resources/postcss/tribe-common-admin.pcss CHANGED
@@ -808,6 +808,7 @@ only screen and (min-device-pixel-ratio: 2) {
808
  .tribe_welcome_page h2,
809
  .tribe_update_page h2 {
810
  font-size: 30px;
 
811
  margin-bottom: 20px;
812
  }
813
 
808
  .tribe_welcome_page h2,
809
  .tribe_update_page h2 {
810
  font-size: 30px;
811
+ line-height: 1.2;
812
  margin-bottom: 20px;
813
  }
814
 
common/tribe-common.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Description: An event settings framework for managing shared options
4
- Version: 4.2.1.1
5
  Author: Modern Tribe, Inc.
6
  Author URI: http://m.tri.be/1x
7
  Text Domain: tribe-common
1
  <?php
2
  /*
3
  Description: An event settings framework for managing shared options
4
+ Version: 4.2.1dev1
5
  Author: Modern Tribe, Inc.
6
  Author URI: http://m.tri.be/1x
7
  Text Domain: tribe-common
event-tickets.php CHANGED
@@ -2,7 +2,7 @@
2
  /*
3
  Plugin Name: Event Tickets
4
  Description: Event Tickets allows your guests to RSVP from any post, page, or event.
5
- Version: 4.2.1.1
6
  Author: Modern Tribe, Inc.
7
  Author URI: http://m.tri.be/28
8
  License: GPLv2 or later
2
  /*
3
  Plugin Name: Event Tickets
4
  Description: Event Tickets allows your guests to RSVP from any post, page, or event.
5
+ Version: 4.2.2
6
  Author: Modern Tribe, Inc.
7
  Author URI: http://m.tri.be/28
8
  License: GPLv2 or later
readme.txt CHANGED
@@ -4,7 +4,7 @@ Contributors: ModernTribe, borkweb, zbtirrell, barry.hughes, bordoni, brianjesse
4
  Tags: events, add-on, ticket sales, tickets, calendar, community, registration, api, dates, date, posts, workshop, conference, meeting, seminar, concert, summit, The Events Calendar, Events Calendar PRO, ticket integration, event ticketing, RSVP, Event Tickets, Event Tickets Plus
5
  Requires at least: 3.9
6
  Tested up to: 4.5.3
7
- Stable tag: 4.2.1.1
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -191,6 +191,14 @@ Our Premium Plugins:
191
 
192
  == Changelog ==
193
 
 
 
 
 
 
 
 
 
194
  = [4.2.1.1] 2016-06-28 =
195
 
196
  * Fix - Ensure translations load as expected with all supported versions of WordPress (thanks to @JacobALund for originally reporting this on .org forums)
4
  Tags: events, add-on, ticket sales, tickets, calendar, community, registration, api, dates, date, posts, workshop, conference, meeting, seminar, concert, summit, The Events Calendar, Events Calendar PRO, ticket integration, event ticketing, RSVP, Event Tickets, Event Tickets Plus
5
  Requires at least: 3.9
6
  Tested up to: 4.5.3
7
+ Stable tag: 4.2.2
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
191
 
192
  == Changelog ==
193
 
194
+ = [4.2.2] 2016-07-06 =
195
+
196
+ * Fix - Send an email acknowledgement, rather than a set of tickets, when a user confirms they will not attend an event (RSVPs) [62549]
197
+ * Tweak - Add a period to the ticket header image setting [44797]
198
+ * Fix - Removed the ticket description in the admin area to allow for more room for tickets sold notes [61962]
199
+ * Fix - Displays the name of the ticket for each attendee on the order confirmation page [62548]
200
+ * Fix - Fixed issue where front-end attendees table check-in state would not show the correct value [62692]
201
+
202
  = [4.2.1.1] 2016-06-28 =
203
 
204
  * Fix - Ensure translations load as expected with all supported versions of WordPress (thanks to @JacobALund for originally reporting this on .org forums)
src/Tribe/Attendees_Table.php CHANGED
@@ -259,9 +259,14 @@ class Tribe__Tickets__Attendees_Table extends WP_List_Table {
259
 
260
  return sprintf( $button_template, $item['order_id_link_src'], __( 'View order', 'event-tickets' ) );
261
  }
262
-
263
- $checkin = sprintf( '<a href="#" data-attendee-id="%d" data-provider="%s" class="button-secondary tickets_checkin">%s</a>', esc_attr( $item['attendee_id'] ), esc_attr( $item['provider'] ), esc_html__( 'Check in', 'event-tickets' ) );
264
- $uncheckin = sprintf( '<span class="delete"><a href="#" data-attendee-id="%d" data-provider="%s" class="tickets_uncheckin">%s</a></span>', esc_attr( $item['attendee_id'] ), esc_attr( $item['provider'] ), esc_html__( 'Undo Check in', 'event-tickets' ) );
 
 
 
 
 
265
 
266
  return $checkin . $uncheckin;
267
  }
259
 
260
  return sprintf( $button_template, $item['order_id_link_src'], __( 'View order', 'event-tickets' ) );
261
  }
262
+ if ( empty( $this->event ) ) {
263
+ $checkin = sprintf( '<a href="#" data-attendee-id="%d" data-provider="%s" class="button-secondary tickets_checkin">%s</a>', esc_attr( $item['attendee_id'] ), esc_attr( $item['provider'] ), esc_html__( 'Check in', 'event-tickets' ) );
264
+ $uncheckin = sprintf( '<span class="delete"><a href="#" data-attendee-id="%d" data-provider="%s" class="tickets_uncheckin">%s</a></span>', esc_attr( $item['attendee_id'] ), esc_attr( $item['provider'] ), esc_html__( 'Undo Check in', 'event-tickets' ) );
265
+ } else {
266
+ // add the additional `data-event-id` attribute if this is an event
267
+ $checkin = sprintf( '<a href="#" data-attendee-id="%d" data-event-id="%d" data-provider="%s" class="button-secondary tickets_checkin">%s</a>', esc_attr( $item['attendee_id'] ), esc_attr($this->event->ID), esc_attr( $item['provider'] ), esc_html__( 'Check in', 'event-tickets' ) );
268
+ $uncheckin = sprintf( '<span class="delete"><a href="#" data-attendee-id="%d" data-event-id="%d" data-provider="%s" class="tickets_uncheckin">%s</a></span>', esc_attr( $item['attendee_id'] ), esc_attr($this->event->ID), esc_attr( $item['provider'] ), esc_html__( 'Undo Check in', 'event-tickets' ) );
269
+ }
270
 
271
  return $checkin . $uncheckin;
272
  }
src/Tribe/Main.php CHANGED
@@ -9,12 +9,12 @@ class Tribe__Tickets__Main {
9
  /**
10
  * Current version of this plugin
11
  */
12
- const VERSION = '4.2.1.1';
13
 
14
  /**
15
  * Min required The Events Calendar version
16
  */
17
- const MIN_TEC_VERSION = '4.2';
18
 
19
  /**
20
  * Name of the provider
9
  /**
10
  * Current version of this plugin
11
  */
12
+ const VERSION = '4.2.2';
13
 
14
  /**
15
  * Min required The Events Calendar version
16
  */
17
+ const MIN_TEC_VERSION = '4.2.2';
18
 
19
  /**
20
  * Name of the provider
src/Tribe/RSVP.php CHANGED
@@ -29,6 +29,13 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
29
  */
30
  const ATTENDEE_ORDER_KEY = '';
31
 
 
 
 
 
 
 
 
32
  /**
33
  *Name of the CPT that holds Tickets
34
  *
@@ -157,6 +164,7 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
157
  */
158
  add_action( 'template_redirect', array( $this, 'generate_tickets' ) );
159
  add_action( 'event_tickets_attendee_update', array( $this, 'update_attendee_data' ), 10, 3 );
 
160
  }
161
 
162
  /**
@@ -167,6 +175,8 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
167
  add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_resources' ), 11 );
168
  add_action( 'trashed_post', array( $this, 'maybe_redirect_to_attendees_report' ) );
169
  add_filter( 'post_updated_messages', array( $this, 'updated_messages' ) );
 
 
170
  }
171
 
172
  /**
@@ -270,7 +280,15 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
270
  }
271
 
272
  /**
273
- * Update the RSVP values for this user
 
 
 
 
 
 
 
 
274
  */
275
  public function update_attendee_data( $data, $order_id, $event_id ) {
276
  $user_id = get_current_user_id();
@@ -325,6 +343,35 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
325
  }
326
  }
327
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
328
  /**
329
  * Generate and store all the attendees information for a new order.
330
  */
@@ -412,20 +459,20 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
412
  /**
413
  * RSVP specific action fired when a RSVP-driven attendee ticket for an event is generated
414
  *
415
- * @var $attendee_id ID of attendee ticket
416
- * @var $event_id ID of event
417
- * @var $order_id RSVP order ID
418
- * @var $product_id RSVP product ID
419
  */
420
  do_action( 'event_tickets_rsvp_attendee_created', $attendee_id, $event_id, $order_id );
421
 
422
  /**
423
  * Action fired when an RSVP attendee ticket is created
424
  *
425
- * @var $attendee_id ID of the attendee post
426
- * @var $event_id Event post ID
427
- * @var $product_id RSVP ticket post ID
428
- * @var $order_attendee_id Attendee # for order
429
  */
430
  do_action( 'event_tickets_rsvp_ticket_created', $attendee_id, $event_id, $product_id, $order_attendee_id );
431
 
@@ -436,9 +483,9 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
436
  /**
437
  * Action fired when an RSVP has had attendee tickets generated for it
438
  *
439
- * @var $product_id RSVP ticket post ID
440
- * @var $order_id ID of the RSVP order
441
- * @var $qty Quantity ordered
442
  */
443
  do_action( 'event_tickets_rsvp_tickets_generated_for_product', $product_id, $order_id, $qty );
444
 
@@ -448,14 +495,19 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
448
  }
449
 
450
  /**
451
- * Action fired when an RSVP attendee tickets have been generated
452
  *
453
- * @var $order_id ID of the RSVP order
 
 
454
  */
455
- do_action( 'event_tickets_rsvp_tickets_generated', $order_id );
456
 
457
- if ( $has_tickets ) {
 
458
  $this->send_tickets_email( $order_id ) ;
 
 
459
  }
460
 
461
  // Redirect to the same page to prevent double purchase on refresh
@@ -468,6 +520,69 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
468
  }
469
 
470
  public function send_tickets_email( $order_id ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
471
  $attendees = $this->get_attendees_by_transaction( $order_id );
472
 
473
  if ( empty( $attendees ) ) {
@@ -481,12 +596,17 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
481
  return;
482
  }
483
 
484
- $content = apply_filters( 'tribe_rsvp_email_content', $this->generate_tickets_email_content( $attendees ) );
485
  $headers = apply_filters( 'tribe_rsvp_email_headers', array( 'Content-type: text/html' ) );
486
  $attachments = apply_filters( 'tribe_rsvp_email_attachments', array() );
487
  $to = apply_filters( 'tribe_rsvp_email_recipient', $to );
488
  $subject = apply_filters( 'tribe_rsvp_email_subject',
489
- sprintf( __( 'Your tickets from %s', 'event-tickets' ), get_bloginfo( 'name' ) ) );
 
 
 
 
 
 
490
 
491
  wp_mail( $to, $subject, $content, $headers, $attachments );
492
  }
@@ -516,6 +636,7 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
516
  'qr_ticket_id' => $post->ID,
517
  'security_code' => get_post_meta( $post->ID, $this->security_code, true ),
518
  'optout' => (bool) get_post_meta( $post->ID, self::ATTENDEE_OPTOUT_KEY, true ),
 
519
  );
520
  }
521
 
@@ -860,14 +981,14 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
860
  $status = get_post_meta( $attendee->ID, self::ATTENDEE_RSVP_KEY, true );
861
  $status_label = Tribe__Tickets__Tickets_View::instance()->get_rsvp_options( $status );
862
  $user_id = get_post_meta( $attendee->ID, self::ATTENDEE_USER_ID, true );
 
863
 
864
  if ( empty( $product_id ) ) {
865
  continue;
866
  }
867
 
868
  $product = get_post( $product_id );
869
- $product_title = ( ! empty( $product ) ) ? $product->post_title : get_post_meta( $attendee->ID, $this->deleted_product,
870
- true ) . ' ' . __( '(deleted)', 'event-tickets' );
871
 
872
  $attendee_data = array_merge(
873
  $this->get_order_data( $attendee->ID ),
@@ -881,6 +1002,7 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
881
  'order_status' => $status,
882
  'order_status_label' => $status_label,
883
  'user_id' => $user_id,
 
884
  )
885
  );
886
 
@@ -940,6 +1062,16 @@ class Tribe__Tickets__RSVP extends Tribe__Tickets__Tickets {
940
  return $data;
941
  }
942
 
 
 
 
 
 
 
 
 
 
 
943
 
944
  /**
945
  * Marks an attendee as checked in for an event
29
  */
30
  const ATTENDEE_ORDER_KEY = '';
31
 
32
+ /**
33
+ * Indicates if a ticket for this attendee was sent out via email.
34
+ *
35
+ * @var boolean
36
+ */
37
+ const ATTENDEE_TICKET_SENT = '_tribe_rsvp_attendee_ticket_sent';
38
+
39
  /**
40
  *Name of the CPT that holds Tickets
41
  *
164
  */
165
  add_action( 'template_redirect', array( $this, 'generate_tickets' ) );
166
  add_action( 'event_tickets_attendee_update', array( $this, 'update_attendee_data' ), 10, 3 );
167
+ add_action( 'event_tickets_after_attendees_update', array( $this, 'maybe_send_tickets_after_status_change' ) );
168
  }
169
 
170
  /**
175
  add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_resources' ), 11 );
176
  add_action( 'trashed_post', array( $this, 'maybe_redirect_to_attendees_report' ) );
177
  add_filter( 'post_updated_messages', array( $this, 'updated_messages' ) );
178
+ add_action( 'rsvp_checkin', array( $this, 'purge_attendees_transient' ) );
179
+ add_action( 'rsvp_uncheckin', array( $this, 'purge_attendees_transient' ) );
180
  }
181
 
182
  /**
280
  }
281
 
282
  /**
283
+ * Update the RSVP values for this user.
284
+ *
285
+ * Note that, within this method, $order_id refers to the attendee or ticket ID
286
+ * (it does not refer to an "order" in the sense of a transaction that may include
287
+ * multiple tickets, as is the case in some other methods for instance).
288
+ *
289
+ * @param array $data
290
+ * @param int $order_id
291
+ * @param int $event_id
292
  */
293
  public function update_attendee_data( $data, $order_id, $event_id ) {
294
  $user_id = get_current_user_id();
343
  }
344
  }
345
 
346
+ /**
347
+ * Triggers the sending of ticket emails after RSVP information is updated.
348
+ *
349
+ * This is useful if a user initially suggests they will not be attending
350
+ * an event (in which case we do not send tickets out) but where they
351
+ * incrementally amend the status of one or more of those tickets to
352
+ * attending, at which point we should send tickets out for any of those
353
+ * newly attending persons.
354
+ *
355
+ * @param $event_id
356
+ */
357
+ public function maybe_send_tickets_after_status_change( $event_id ) {
358
+ $transaction_ids = array();
359
+
360
+ foreach ( $this->get_event_attendees( $event_id ) as $attendee ) {
361
+ $transaction = get_post_meta( $attendee[ 'attendee_id' ], $this->order_key, true );
362
+
363
+ if ( ! empty( $transaction ) ) {
364
+ $transaction_ids[ $transaction ] = $transaction;
365
+ }
366
+ }
367
+
368
+ foreach ( $transaction_ids as $transaction ) {
369
+ // This method takes care of intelligently sending out emails only when
370
+ // required, for attendees that have not yet received their tickets
371
+ $this->send_tickets_email( $transaction );
372
+ }
373
+ }
374
+
375
  /**
376
  * Generate and store all the attendees information for a new order.
377
  */
459
  /**
460
  * RSVP specific action fired when a RSVP-driven attendee ticket for an event is generated
461
  *
462
+ * @param $attendee_id ID of attendee ticket
463
+ * @param $event_id ID of event
464
+ * @param $order_id RSVP order ID
465
+ * @param $product_id RSVP product ID
466
  */
467
  do_action( 'event_tickets_rsvp_attendee_created', $attendee_id, $event_id, $order_id );
468
 
469
  /**
470
  * Action fired when an RSVP attendee ticket is created
471
  *
472
+ * @param $attendee_id ID of the attendee post
473
+ * @param $event_id Event post ID
474
+ * @param $product_id RSVP ticket post ID
475
+ * @param $order_attendee_id Attendee # for order
476
  */
477
  do_action( 'event_tickets_rsvp_ticket_created', $attendee_id, $event_id, $product_id, $order_attendee_id );
478
 
483
  /**
484
  * Action fired when an RSVP has had attendee tickets generated for it
485
  *
486
+ * @param $product_id RSVP ticket post ID
487
+ * @param $order_id ID of the RSVP order
488
+ * @param $qty Quantity ordered
489
  */
490
  do_action( 'event_tickets_rsvp_tickets_generated_for_product', $product_id, $order_id, $qty );
491
 
495
  }
496
 
497
  /**
498
+ * Fires when an RSVP attendee tickets have been generated.
499
  *
500
+ * @param int $order_id ID of the RSVP order
501
+ * @param int $event_id ID of the event the order was placed for
502
+ * @param string $attendee_order_status 'yes' if the user indicated they will attend
503
  */
504
+ do_action( 'event_tickets_rsvp_tickets_generated', $order_id, $event_id, $attendee_order_status );
505
 
506
+ // No point sending tickets if their current intention is not to attend
507
+ if ( $has_tickets && 'yes' === $attendee_order_status ) {
508
  $this->send_tickets_email( $order_id ) ;
509
+ } elseif ( $has_tickets ) {
510
+ $this->send_non_attendance_confirmation( $order_id, $event_id );
511
  }
512
 
513
  // Redirect to the same page to prevent double purchase on refresh
520
  }
521
 
522
  public function send_tickets_email( $order_id ) {
523
+ $all_attendees = $this->get_attendees_by_transaction( $order_id );
524
+ $to_send = array();
525
+
526
+ if ( empty( $all_attendees ) ) {
527
+ return;
528
+ }
529
+
530
+ // Look at each attendee and check if a ticket was sent: in each case where a ticket
531
+ // has not yet been sent we should a) send the ticket out by email and b) record the
532
+ // fact it was sent
533
+ foreach ( $all_attendees as $single_attendee ) {
534
+ // Do not add those attendees/tickets marked as not attending (note that despite the name
535
+ // 'qr_ticket_id', this key is not QR code specific, it's simply the attendee post ID)
536
+ if ( 'yes' !== get_post_meta( $single_attendee[ 'qr_ticket_id' ], self::ATTENDEE_RSVP_KEY, true ) ) {
537
+ continue;
538
+ }
539
+
540
+ // Only add those attendees/tickets that haven't already been sent
541
+ if ( empty( $single_attendee[ 'ticket_sent' ] ) ) {
542
+ $to_send[] = $single_attendee;
543
+ update_post_meta( $single_attendee[ 'qr_ticket_id' ], self::ATTENDEE_TICKET_SENT, true );
544
+ }
545
+ }
546
+
547
+ /**
548
+ * Controls the list of tickets which will be emailed out.
549
+ *
550
+ * @param array $to_send list of tickets to be sent out by email
551
+ * @param array $all_attendees list of all attendees/tickets, including those already sent out
552
+ * @param int $order_id
553
+ *
554
+ */
555
+ $to_send = (array) apply_filters( 'tribe_tickets_rsvp_tickets_to_send', $to_send, $all_attendees, $order_id );
556
+
557
+ if ( empty( $to_send ) ) {
558
+ return;
559
+ }
560
+
561
+ // For now all ticket holders in an order share the same email
562
+ $to = $all_attendees['0']['holder_email'];
563
+
564
+ if ( ! is_email( $to ) ) {
565
+ return;
566
+ }
567
+
568
+ $content = apply_filters( 'tribe_rsvp_email_content', $this->generate_tickets_email_content( $to_send ) );
569
+ $headers = apply_filters( 'tribe_rsvp_email_headers', array( 'Content-type: text/html' ) );
570
+ $attachments = apply_filters( 'tribe_rsvp_email_attachments', array() );
571
+ $to = apply_filters( 'tribe_rsvp_email_recipient', $to );
572
+ $subject = apply_filters( 'tribe_rsvp_email_subject',
573
+ sprintf( __( 'Your tickets from %s', 'event-tickets' ), get_bloginfo( 'name' ) ) );
574
+
575
+ wp_mail( $to, $subject, $content, $headers, $attachments );
576
+ }
577
+
578
+ /**
579
+ * Dispatches a confirmation email that acknowledges the user has RSVP'd
580
+ * in cases where they have indicated that they will *not* be attending.
581
+ *
582
+ * @param int $order_id
583
+ * @param int $event_id
584
+ */
585
+ public function send_non_attendance_confirmation( $order_id, $event_id ) {
586
  $attendees = $this->get_attendees_by_transaction( $order_id );
587
 
588
  if ( empty( $attendees ) ) {
596
  return;
597
  }
598
 
 
599
  $headers = apply_filters( 'tribe_rsvp_email_headers', array( 'Content-type: text/html' ) );
600
  $attachments = apply_filters( 'tribe_rsvp_email_attachments', array() );
601
  $to = apply_filters( 'tribe_rsvp_email_recipient', $to );
602
  $subject = apply_filters( 'tribe_rsvp_email_subject',
603
+ sprintf( __( 'You confirmed you will not be attending %s', 'event-tickets' ), get_the_title( $event_id ) )
604
+ );
605
+
606
+ $template_data = array( 'event_id' => $event_id, 'order_id' => $order_id, 'attendees' => $attendees );
607
+ $content = apply_filters( 'tribe_rsvp_email_content',
608
+ tribe_tickets_get_template_part( 'tickets/email-non-attendance', null, $template_data, false )
609
+ );
610
 
611
  wp_mail( $to, $subject, $content, $headers, $attachments );
612
  }
636
  'qr_ticket_id' => $post->ID,
637
  'security_code' => get_post_meta( $post->ID, $this->security_code, true ),
638
  'optout' => (bool) get_post_meta( $post->ID, self::ATTENDEE_OPTOUT_KEY, true ),
639
+ 'ticket_sent' => (bool) get_post_meta( $post->ID, self::ATTENDEE_TICKET_SENT, true ),
640
  );
641
  }
642
 
981
  $status = get_post_meta( $attendee->ID, self::ATTENDEE_RSVP_KEY, true );
982
  $status_label = Tribe__Tickets__Tickets_View::instance()->get_rsvp_options( $status );
983
  $user_id = get_post_meta( $attendee->ID, self::ATTENDEE_USER_ID, true );
984
+ $ticket_sent = (bool) get_post_meta( $attendee->ID, self::ATTENDEE_TICKET_SENT, true );
985
 
986
  if ( empty( $product_id ) ) {
987
  continue;
988
  }
989
 
990
  $product = get_post( $product_id );
991
+ $product_title = ( ! empty( $product ) ) ? $product->post_title : get_post_meta( $attendee->ID, $this->deleted_product, true ) . ' ' . __( '(deleted)', 'event-tickets' );
 
992
 
993
  $attendee_data = array_merge(
994
  $this->get_order_data( $attendee->ID ),
1002
  'order_status' => $status,
1003
  'order_status_label' => $status_label,
1004
  'user_id' => $user_id,
1005
+ 'ticket_sent' => $ticket_sent,
1006
  )
1007
  );
1008
 
1062
  return $data;
1063
  }
1064
 
1065
+ /**
1066
+ * Remove the Post Transients when a Shopp Ticket is bought
1067
+ *
1068
+ * @param int $attendee_id
1069
+ * @return void
1070
+ */
1071
+ public function purge_attendees_transient( $attendee_id ) {
1072
+ $event_id = get_post_meta( $attendee_id, self::ATTENDEE_EVENT_KEY, true );
1073
+ Tribe__Post_Transient::instance()->delete( $event_id, Tribe__Tickets__Tickets::ATTENDEES_CACHE );
1074
+ }
1075
 
1076
  /**
1077
  * Marks an attendee as checked in for an event
src/Tribe/Tickets.php CHANGED
@@ -469,9 +469,11 @@ if ( ! class_exists( 'Tribe__Tickets__Tickets' ) ) {
469
  $order_id = $_POST['order_ID'];
470
 
471
  // Pass the control to the child object
472
- $return = $this->checkin( $order_id );
473
 
474
- $this->ajax_ok( $return );
 
 
475
  }
476
 
477
  /**
@@ -497,9 +499,11 @@ if ( ! class_exists( 'Tribe__Tickets__Tickets' ) ) {
497
  $order_id = $_POST['order_ID'];
498
 
499
  // Pass the control to the child object
500
- $return = $this->uncheckin( $order_id );
 
 
501
 
502
- $this->ajax_ok( $return );
503
  }
504
 
505
  /**
@@ -1389,5 +1393,15 @@ if ( ! class_exists( 'Tribe__Tickets__Tickets' ) ) {
1389
  */
1390
  return apply_filters( 'tribe_tickets_ticket_login_url', $login_url );
1391
  }
 
 
 
 
 
 
 
 
 
 
1392
  }
1393
  }
469
  $order_id = $_POST['order_ID'];
470
 
471
  // Pass the control to the child object
472
+ $did_checkin = $this->checkin( $order_id );
473
 
474
+ $this->maybe_update_attendees_cache( $did_checkin );
475
+
476
+ $this->ajax_ok( $did_checkin );
477
  }
478
 
479
  /**
499
  $order_id = $_POST['order_ID'];
500
 
501
  // Pass the control to the child object
502
+ $did_uncheckin = $this->uncheckin( $order_id );
503
+
504
+ $this->maybe_update_attendees_cache( $did_uncheckin );
505
 
506
+ $this->ajax_ok( $did_uncheckin );
507
  }
508
 
509
  /**
1393
  */
1394
  return apply_filters( 'tribe_tickets_ticket_login_url', $login_url );
1395
  }
1396
+
1397
+ /**
1398
+ * @param $operation_did_complete
1399
+ */
1400
+ private function maybe_update_attendees_cache( $operation_did_complete ) {
1401
+ if ( $operation_did_complete && ! empty( $_POST['event_ID'] ) && tribe_is_event( $_POST['event_ID'] ) ) {
1402
+ $post_transient = Tribe__Post_Transient::instance();
1403
+ $post_transient->delete( $_POST['event_ID'], self::ATTENDEES_CACHE );
1404
+ }
1405
+ }
1406
  }
1407
  }
src/admin-views/attendees.php CHANGED
@@ -110,9 +110,9 @@ $total_deleted = Tribe__Tickets__Attendance::instance( $event_id )->get_delete
110
  <?php do_action( 'tribe_events_tickets_attendees_event_summary_table_after', $event_id ); ?>
111
 
112
  <form id="topics-filter" method="post">
113
- <input type="hidden" name="page" value="<?php echo esc_attr( isset( $_GET['page'] ) ? $_GET['page'] : '' ); ?>" />
114
- <input type="hidden" name="event_id" id="event_id" value="<?php echo esc_attr( $event_id ); ?>" />
115
- <input type="hidden" name="post_type" value="<?php echo esc_attr( $event->post_type ); ?>" />
116
  <?php $this->attendees_table->display() ?>
117
  </form>
118
  </div>
110
  <?php do_action( 'tribe_events_tickets_attendees_event_summary_table_after', $event_id ); ?>
111
 
112
  <form id="topics-filter" method="post">
113
+ <input type="hidden" name="<?php echo esc_attr( is_admin() ? 'page' : 'tribe[page]' ); ?>" value="<?php echo esc_attr( isset( $_GET['page'] ) ? $_GET['page'] : '' ); ?>" />
114
+ <input type="hidden" name="<?php echo esc_attr( is_admin() ? 'event_id' : 'tribe[event_id]' ); ?>" id="event_id" value="<?php echo esc_attr( $event_id ); ?>" />
115
+ <input type="hidden" name="<?php echo esc_attr( is_admin() ? 'post_type' : 'tribe[post_type]' ); ?>" value="<?php echo esc_attr( $event->post_type ); ?>" />
116
  <?php $this->attendees_table->display() ?>
117
  </form>
118
  </div>
src/admin-views/list.php CHANGED
@@ -113,9 +113,6 @@
113
  <td nowrap="nowrap">
114
  <?php echo tribe_tickets_get_ticket_stock_message( $ticket ); ?>
115
  </td>
116
- <td width="40%" valign="top">
117
- <?php echo esc_html( $ticket->description ); ?>
118
- </td>
119
  </tr>
120
  <?php
121
  $count ++;
113
  <td nowrap="nowrap">
114
  <?php echo tribe_tickets_get_ticket_stock_message( $ticket ); ?>
115
  </td>
 
 
 
116
  </tr>
117
  <?php
118
  $count ++;
src/admin-views/meta-box.php CHANGED
@@ -39,7 +39,7 @@ $modules = Tribe__Tickets__Tickets::modules();
39
  <table class="eventtable ticket_list eventForm">
40
  <tr class="tribe-tickets-image-upload">
41
  <td>
42
- <?php esc_html_e( 'Upload image for the ticket header', 'event-tickets' ); ?>
43
  <p class="description"><?php esc_html_e( 'The maximum image size in the email will be 580px wide by any height, and then scaled for mobile. If you would like "retina" support use an image sized to 1160px wide.', 'event-tickets' ); ?></p>
44
  </td>
45
  <td>
39
  <table class="eventtable ticket_list eventForm">
40
  <tr class="tribe-tickets-image-upload">
41
  <td>
42
+ <?php esc_html_e( 'Upload image for the ticket header.', 'event-tickets' ); ?>
43
  <p class="description"><?php esc_html_e( 'The maximum image size in the email will be 580px wide by any height, and then scaled for mobile. If you would like "retina" support use an image sized to 1160px wide.', 'event-tickets' ); ?></p>
44
  </td>
45
  <td>
src/resources/css/rsvp.css CHANGED
@@ -139,6 +139,18 @@
139
  margin: 0 0 .5em 0;
140
  }
141
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  .tribe-answer select {
143
  background: white;
144
  border: 1px solid #ddd;
139
  margin: 0 0 .5em 0;
140
  }
141
 
142
+ .tribe-answer {
143
+ line-height: 2;
144
+ }
145
+
146
+ .tribe-answer .type-label {
147
+ padding-right: .5em;
148
+ }
149
+
150
+ .tribe-answer label {
151
+ display: block;
152
+ }
153
+
154
  .tribe-answer select {
155
  background: white;
156
  border: 1px solid #ddd;
src/resources/css/rsvp.min.css CHANGED
@@ -1 +1 @@
1
- .tribe-rsvp{padding:20px 0}.tribe-tickets-meta-row{display:none}.tribe-tickets-has-rsvp .tribe-tickets-meta-row{display:table-row}.tribe-tickets-attendee{padding:10px}.tribe-events-tickets td{padding:8px 10px}.tribe-events-style-full .tribe-events-tickets .tribe-tickets-attendee table,.tribe-events-style-full .tribe-events-tickets .tribe-tickets-attendee td,.tribe-events-style-full .tribe-events-tickets .tribe-tickets-attendee tr,.tribe-events-tickets .tribe-tickets-attendee table,.tribe-events-tickets .tribe-tickets-attendee td,.tribe-events-tickets .tribe-tickets-attendee tr{border:0}.tribe-rsvp-message-display .tribe-rsvp-messages{display:block}.tribe-rsvp-messages{display:none;padding:10px 10px 5px}.tribe-rsvp-message{border-radius:3px;border-style:solid;border-width:1px;font-size:12px;margin:0 0 5px;padding:0 .6em}.tribe-rsvp-message-success{background-color:#ffffe0;border-color:#e6db55}.tribe-rsvp-message-error{background-color:#ffebe8;border-color:#c00}.tribe-ticket-quantity{width:100%}.tickets-unavailable{font-style:italic}.tribe-rsvp-list{list-style:none;padding:0;margin:0}.tribe-rsvp-list>.tribe-item{padding:20px;border:1px solid #ededed;border-bottom:0}.tribe-rsvp-list>.tribe-item:last-child{border-bottom:1px solid #ededed;margin-bottom:20px}.tribe-rsvp-list>.tribe-item.tribe-disabled{background-color:#efefef;border-color:#ddd;color:#717171}.tribe-rsvp-list>.tribe-item.tribe-disabled:last-child{border-bottom-color:#ddd}.tribe-rsvp-list>.tribe-item .tribe-answer{float:right;display:inline-block}.tribe-rsvp-list>.tribe-item table{border:0;margin:0}.tribe-rsvp-list>.tribe-item td{border:0}.list-attendee{color:#999;display:inline-block;letter-spacing:1px;text-transform:uppercase}.tribe-link-tickets-message{text-align:center;padding:20px;border:1px solid #ededed}.tribe-submit-tickets-form{margin-top:20px}.user-details{margin:0 0 1.5em}.user-details p{margin:0 0 .5em}.tribe-answer select{background:#fff;border:1px solid #ddd}.tribe-rsvp h2{margin-bottom:20px;line-height:1.2}.event-tickets-meta-label{font-weight:700;margin:0 1em 0 0}.tribe-theme-parent-twentysixteen .comment-content a,.tribe-theme-parent-twentysixteen .entry-content a,.tribe-theme-parent-twentysixteen .entry-footer a:hover,.tribe-theme-parent-twentysixteen .entry-summary a,.tribe-theme-parent-twentysixteen .logged-in-as a,.tribe-theme-parent-twentysixteen .pingback .comment-body>a,.tribe-theme-parent-twentysixteen .site-info a:hover,.tribe-theme-parent-twentysixteen .taxonomy-description a,.tribe-theme-parent-twentysixteen .textwidget a,.tribe-theme-twentysixteen .comment-content a,.tribe-theme-twentysixteen .entry-content a,.tribe-theme-twentysixteen .entry-footer a:hover,.tribe-theme-twentysixteen .entry-summary a,.tribe-theme-twentysixteen .logged-in-as a,.tribe-theme-twentysixteen .pingback .comment-body>a,.tribe-theme-twentysixteen .site-info a:hover,.tribe-theme-twentysixteen .taxonomy-description a,.tribe-theme-twentysixteen .textwidget a{box-shadow:none}
1
+ .tribe-rsvp{padding:20px 0}.tribe-tickets-meta-row{display:none}.tribe-tickets-has-rsvp .tribe-tickets-meta-row{display:table-row}.tribe-tickets-attendee{padding:10px}.tribe-events-tickets td{padding:8px 10px}.tribe-events-style-full .tribe-events-tickets .tribe-tickets-attendee table,.tribe-events-style-full .tribe-events-tickets .tribe-tickets-attendee td,.tribe-events-style-full .tribe-events-tickets .tribe-tickets-attendee tr,.tribe-events-tickets .tribe-tickets-attendee table,.tribe-events-tickets .tribe-tickets-attendee td,.tribe-events-tickets .tribe-tickets-attendee tr{border:0}.tribe-rsvp-message-display .tribe-rsvp-messages{display:block}.tribe-rsvp-messages{display:none;padding:10px 10px 5px}.tribe-rsvp-message{border-radius:3px;border-style:solid;border-width:1px;font-size:12px;margin:0 0 5px;padding:0 .6em}.tribe-rsvp-message-success{background-color:#ffffe0;border-color:#e6db55}.tribe-rsvp-message-error{background-color:#ffebe8;border-color:#c00}.tribe-ticket-quantity{width:100%}.tickets-unavailable{font-style:italic}.tribe-rsvp-list{list-style:none;padding:0;margin:0}.tribe-rsvp-list>.tribe-item{padding:20px;border:1px solid #ededed;border-bottom:0}.tribe-rsvp-list>.tribe-item:last-child{border-bottom:1px solid #ededed;margin-bottom:20px}.tribe-rsvp-list>.tribe-item.tribe-disabled{background-color:#efefef;border-color:#ddd;color:#717171}.tribe-rsvp-list>.tribe-item.tribe-disabled:last-child{border-bottom-color:#ddd}.tribe-rsvp-list>.tribe-item .tribe-answer{float:right;display:inline-block}.tribe-rsvp-list>.tribe-item table{border:0;margin:0}.tribe-rsvp-list>.tribe-item td{border:0}.list-attendee{color:#999;display:inline-block;letter-spacing:1px;text-transform:uppercase}.tribe-link-tickets-message{text-align:center;padding:20px;border:1px solid #ededed}.tribe-submit-tickets-form{margin-top:20px}.user-details{margin:0 0 1.5em}.user-details p{margin:0 0 .5em}.tribe-answer{line-height:2}.tribe-answer .type-label{padding-right:.5em}.tribe-answer label{display:block}.tribe-answer select{background:#fff;border:1px solid #ddd}.tribe-rsvp h2{margin-bottom:20px;line-height:1.2}.event-tickets-meta-label{font-weight:700;margin:0 1em 0 0}.tribe-theme-parent-twentysixteen .comment-content a,.tribe-theme-parent-twentysixteen .entry-content a,.tribe-theme-parent-twentysixteen .entry-footer a:hover,.tribe-theme-parent-twentysixteen .entry-summary a,.tribe-theme-parent-twentysixteen .logged-in-as a,.tribe-theme-parent-twentysixteen .pingback .comment-body>a,.tribe-theme-parent-twentysixteen .site-info a:hover,.tribe-theme-parent-twentysixteen .taxonomy-description a,.tribe-theme-parent-twentysixteen .textwidget a,.tribe-theme-twentysixteen .comment-content a,.tribe-theme-twentysixteen .entry-content a,.tribe-theme-twentysixteen .entry-footer a:hover,.tribe-theme-twentysixteen .entry-summary a,.tribe-theme-twentysixteen .logged-in-as a,.tribe-theme-twentysixteen .pingback .comment-body>a,.tribe-theme-twentysixteen .site-info a:hover,.tribe-theme-twentysixteen .taxonomy-description a,.tribe-theme-twentysixteen .textwidget a{box-shadow:none}
src/resources/css/tickets-attendees.min.css CHANGED
@@ -1 +1 @@
1
- #tribe-attendees-summary{padding-bottom:10px;position:relative}#tribe-attendees-summary .about-description,#tribe-attendees-summary h3{width:66%}#tribe-attendees-summary .about-description a{color:inherit}#tribe-attendees-summary .welcome-panel-column-container{position:static;position:initial}#tribe-attendees-summary .welcome-panel-column li{line-height:1.4em;margin-bottom:2px}#tribe-attendees-summary .welcome-panel-last{border-left:1px solid #eee;bottom:0;padding:10px 20px 5px;position:absolute;right:0;top:0;width:200px}#tribe-attendees-summary .welcome-panel-last h4{font-size:1.5em;text-align:center}#tribe-attendees-summary .welcome-panel-last li{font-size:1.2em}.tribe-attendees-page a.tickets_uncheckin{display:none}.tribe-attendees-page .tickets_checked td{opacity:.7;text-decoration:line-through}.tribe-attendees-page .tickets_checked a.tickets_checkin{display:none}.tribe-attendees-page .tickets_checked td.column-check_in{text-decoration:none!important}.tribe-attendees-page .tickets_checked a.tickets_uncheckin{display:block}.tribe-attendees-page .column-attendee_id,.tribe-attendees-page .column-order_id{width:70px}.tribe-attendees-page .email,.tribe-attendees-page .export,.tribe-attendees-page .print{margin:1px 8px 0 0}.tribe-attendees-email .tribe-attendees-email-message{float:left;margin:0}.tribe-attendees-email .button-primary{margin-top:3px}.tribe-attendees-email-message ul{font-size:13px;line-height:1.5;margin:.5em 0;padding:2px}.tribe-attendees-email-message ul li:last-child{margin-bottom:0}#attendees_email_wrapper{margin-top:10px;overflow:hidden;padding:20px}#attendees_email_wrapper label{display:block}#attendees_email_wrapper label span{display:inline-block;width:105px}#attendees_email_wrapper input[type=text],#attendees_email_wrapper select{width:285px}#attendees_email_wrapper .attendees_or{display:block;font-size:20px;margin:20px 0;text-align:center}@media screen and (max-width:870px){#tribe-attendees-summary .about-description,#tribe-attendees-summary h3{width:100%}#tribe-attendees-summary .welcome-panel-column-container{margin-bottom:115px}#tribe-attendees-summary .welcome-panel-column li{display:list-item}#tribe-attendees-summary .welcome-panel-last{border-left:0;border-top:1px solid #eee;bottom:0;left:0;right:0;top:auto;top:initial;width:100%}#tribe-attendees-summary .welcome-panel-last ul{float:left;width:50%}}@media screen and (min-width:870px){#tribe-attendees-summary .welcome-panel-last ul:first-child{margin-bottom:0}#tribe-attendees-summary .welcome-panel-last ul:last-child{margin-top:0}}@media screen and (max-width:782px){.tribe-attendees-email-message .notice-dismiss{padding:9px}}
1
+ #tribe-attendees-summary{padding-bottom:10px;position:relative}#tribe-attendees-summary .about-description,#tribe-attendees-summary h3{width:66%}#tribe-attendees-summary .about-description a{color:inherit}#tribe-attendees-summary .welcome-panel-column-container{position:static}#tribe-attendees-summary .welcome-panel-column li{line-height:1.4em;margin-bottom:2px}#tribe-attendees-summary .welcome-panel-last{border-left:1px solid #eee;bottom:0;padding:10px 20px 5px;position:absolute;right:0;top:0;width:200px}#tribe-attendees-summary .welcome-panel-last h4{font-size:1.5em;text-align:center}#tribe-attendees-summary .welcome-panel-last li{font-size:1.2em}.tribe-attendees-page a.tickets_uncheckin{display:none}.tribe-attendees-page .tickets_checked td{opacity:.7;text-decoration:line-through}.tribe-attendees-page .tickets_checked a.tickets_checkin{display:none}.tribe-attendees-page .tickets_checked td.column-check_in{text-decoration:none!important}.tribe-attendees-page .tickets_checked a.tickets_uncheckin{display:block}.tribe-attendees-page .column-attendee_id,.tribe-attendees-page .column-order_id{width:70px}.tribe-attendees-page .email,.tribe-attendees-page .export,.tribe-attendees-page .print{margin:1px 8px 0 0}.tribe-attendees-email .tribe-attendees-email-message{float:left;margin:0}.tribe-attendees-email .button-primary{margin-top:3px}.tribe-attendees-email-message ul{font-size:13px;line-height:1.5;margin:.5em 0;padding:2px}.tribe-attendees-email-message ul li:last-child{margin-bottom:0}#attendees_email_wrapper{margin-top:10px;overflow:hidden;padding:20px}#attendees_email_wrapper label{display:block}#attendees_email_wrapper label span{display:inline-block;width:105px}#attendees_email_wrapper input[type=text],#attendees_email_wrapper select{width:285px}#attendees_email_wrapper .attendees_or{display:block;font-size:20px;margin:20px 0;text-align:center}@media screen and (max-width:870px){#tribe-attendees-summary .about-description,#tribe-attendees-summary h3{width:100%}#tribe-attendees-summary .welcome-panel-column-container{margin-bottom:115px}#tribe-attendees-summary .welcome-panel-column li{display:list-item}#tribe-attendees-summary .welcome-panel-last{border-left:0;border-top:1px solid #eee;bottom:0;left:0;right:0;top:auto;width:100%}#tribe-attendees-summary .welcome-panel-last ul{float:left;width:50%}}@media screen and (min-width:870px){#tribe-attendees-summary .welcome-panel-last ul:first-child{margin-bottom:0}#tribe-attendees-summary .welcome-panel-last ul:last-child{margin-top:0}}@media screen and (max-width:782px){.tribe-attendees-email-message .notice-dismiss{padding:9px}}
src/resources/js/frontend-ticket-form.min.js CHANGED
@@ -1 +1 @@
1
- var tribe_tickets_ticket_form={};!function(t,e){var _,c;e.init=function(){_=t(".tribe-events-tickets"),c=_.find(".quantity").find(".qty"),c.on("change",e.on_quantity_change)},e.on_quantity_change=function(){var _=t(this),c=e.get_matching_ticket_id(this);e.ticket_uses_global_stock(c)?e.global_stock_quantity_changed(_,c):e.normal_stock_quantity_changed(_,c)},e.global_stock_quantity_changed=function(t,_){var c=t.val(),i=e.get_event_id(_),a=e.get_cap(_),o=e.get_global_stock(i),n=e.currently_requested_global_event_stock(i);n>o&&(c-=n-o),e.stock_mode_is_capped(_)&&c>a&&(c=a),0>=c&&(c=0),t.val(c),e.update_available_stock_counts(i)},e.normal_stock_quantity_changed=function(t,c){var i,a=t.val(),o=e.get_single_stock(c);a>o&&(a=o),t.val(a),i=o-a,_.find(".available-stock[data-product-id="+c+"]").html(i)},e.update_available_stock_counts=function(c){var i=e.get_tickets_of(c),a=e.get_global_stock(c)-e.currently_requested_global_event_stock(c);for(var o in i)if(i.hasOwnProperty(o)){0>a&&(a=0);var n=i[o];if("global"===n.mode&&_.find(".available-stock[data-product-id="+o+"]").html(a),"capped"===n.mode){var r=Math.min(a,n.cap),s=parseInt(t("[data-product-id="+o+"]").find("input").val(),10),d=n.cap-s;0>d?d=0:d>r&&(d=r),_.find(".available-stock[data-product-id="+o+"]").html(d)}}},e.get_matching_ticket_id=function(e){var _=t(e).closest("[data-product-id]");if(_.length)return _.data("product-id")},e.get_ticket_property=function(t,e){if("object"!=typeof tribe_tickets_stock_data)return!1;var _=tribe_tickets_stock_data.tickets[t];return"undefined"===tribe_tickets_stock_data.tickets[t]?!1:_[e]},e.get_tickets_of=function(t){if("object"!=typeof tribe_tickets_stock_data)return!1;var e=[];for(var _ in tribe_tickets_stock_data.tickets){var c=tribe_tickets_stock_data.tickets[_];t===c.event_id&&(e[_]=c)}return e},e.currently_requested_global_event_stock=function(t){var c=0,i=e.get_tickets_of(t);for(var a in i)switch(tribe_tickets_stock_data.tickets[a].mode){case"global":case"capped":c+=parseInt(_.find("[data-product-id="+a+"]").find(".qty").val(),10)}return c},e.get_event_property=function(t,e){if("object"!=typeof tribe_tickets_stock_data)return!1;var _=tribe_tickets_stock_data.events[t];return"undefined"===tribe_tickets_stock_data.events[t]?!1:_[e]},e.stock_mode_is_global=function(t){return"global"===e.get_mode(t)},e.stock_mode_is_capped=function(t){return"capped"===e.get_mode(t)},e.ticket_uses_global_stock=function(t){return e.stock_mode_is_capped(t)||e.stock_mode_is_global(t)},e.get_mode=function(t){return e.get_ticket_property(t,"mode")},e.get_event_id=function(t){return e.get_ticket_property(t,"event_id")},e.get_cap=function(t){return e.get_ticket_property(t,"cap")},e.get_global_stock=function(t){return e.get_event_property(t,"stock")},e.get_single_stock=function(t){return e.get_ticket_property(t,"stock")},t(function(){e.init()})}(jQuery,tribe_tickets_ticket_form);
1
+ var tribe_tickets_ticket_form={};!function(t,e){var _,c;e.init=function(){_=t(".tribe-events-tickets"),c=_.find(".quantity").find(".qty"),c.on("change",e.on_quantity_change)},e.on_quantity_change=function(){var _=t(this),c=e.get_matching_ticket_id(this);e.ticket_uses_global_stock(c)?e.global_stock_quantity_changed(_,c):e.normal_stock_quantity_changed(_,c)},e.global_stock_quantity_changed=function(t,_){var c=t.val(),i=e.get_event_id(_),a=e.get_cap(_),o=e.get_global_stock(i),n=e.currently_requested_global_event_stock(i);n>o&&(c-=n-o),e.stock_mode_is_capped(_)&&c>a&&(c=a),0>=c&&(c=0),t.val(c),e.update_available_stock_counts(i)},e.normal_stock_quantity_changed=function(t,c){var i,a=t.val(),o=e.get_single_stock(c);a>o&&(a=o),t.val(a),i=o-a,_.find(".available-stock[data-product-id="+c+"]").html(i)},e.update_available_stock_counts=function(c){var i=e.get_tickets_of(c),a=e.get_global_stock(c)-e.currently_requested_global_event_stock(c);for(var o in i)if(i.hasOwnProperty(o)){a<0&&(a=0);var n=i[o];if("global"===n.mode&&_.find(".available-stock[data-product-id="+o+"]").html(a),"capped"===n.mode){var r=Math.min(a,n.cap),s=parseInt(t("[data-product-id="+o+"]").find("input").val(),10),d=n.cap-s;d<0?d=0:d>r&&(d=r),_.find(".available-stock[data-product-id="+o+"]").html(d)}}},e.get_matching_ticket_id=function(e){var _=t(e).closest("[data-product-id]");if(_.length)return _.data("product-id")},e.get_ticket_property=function(t,e){if("object"!=typeof tribe_tickets_stock_data)return!1;var _=tribe_tickets_stock_data.tickets[t];return"undefined"!==tribe_tickets_stock_data.tickets[t]&&_[e]},e.get_tickets_of=function(t){if("object"!=typeof tribe_tickets_stock_data)return!1;var e=[];for(var _ in tribe_tickets_stock_data.tickets){var c=tribe_tickets_stock_data.tickets[_];t===c.event_id&&(e[_]=c)}return e},e.currently_requested_global_event_stock=function(t){var c=0,i=e.get_tickets_of(t);for(var a in i)switch(tribe_tickets_stock_data.tickets[a].mode){case"global":case"capped":c+=parseInt(_.find("[data-product-id="+a+"]").find(".qty").val(),10)}return c},e.get_event_property=function(t,e){if("object"!=typeof tribe_tickets_stock_data)return!1;var _=tribe_tickets_stock_data.events[t];return"undefined"!==tribe_tickets_stock_data.events[t]&&_[e]},e.stock_mode_is_global=function(t){return"global"===e.get_mode(t)},e.stock_mode_is_capped=function(t){return"capped"===e.get_mode(t)},e.ticket_uses_global_stock=function(t){return e.stock_mode_is_capped(t)||e.stock_mode_is_global(t)},e.get_mode=function(t){return e.get_ticket_property(t,"mode")},e.get_event_id=function(t){return e.get_ticket_property(t,"event_id")},e.get_cap=function(t){return e.get_ticket_property(t,"cap")},e.get_global_stock=function(t){return e.get_event_property(t,"stock")},e.get_single_stock=function(t){return e.get_ticket_property(t,"stock")},t(function(){e.init()})}(jQuery,tribe_tickets_ticket_form);
src/resources/js/tickets-attendees.js CHANGED
@@ -88,6 +88,11 @@ jQuery( document ).ready( function( $ ) {
88
  order_ID: obj.attr( 'data-attendee-id' ),
89
  nonce : Attendees.checkin_nonce
90
  };
 
 
 
 
 
91
 
92
  $.post(
93
  ajaxurl,
@@ -117,6 +122,11 @@ jQuery( document ).ready( function( $ ) {
117
  nonce : Attendees.uncheckin_nonce
118
  };
119
 
 
 
 
 
 
120
  $.post(
121
  ajaxurl,
122
  params,
88
  order_ID: obj.attr( 'data-attendee-id' ),
89
  nonce : Attendees.checkin_nonce
90
  };
91
+
92
+ // add event_ID information if available
93
+ if ( obj.attr( 'data-event-id' ) ) {
94
+ params.event_ID = obj.attr( 'data-event-id' );
95
+ }
96
 
97
  $.post(
98
  ajaxurl,
122
  nonce : Attendees.uncheckin_nonce
123
  };
124
 
125
+ // add event_ID information if available
126
+ if ( obj.attr( 'data-event-id' ) ) {
127
+ params.event_ID = obj.attr( 'data-event-id' );
128
+ }
129
+
130
  $.post(
131
  ajaxurl,
132
  params,
src/resources/js/tickets-attendees.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(document).ready(function(e){if("undefined"!=typeof AttendeesPointer&&null!==AttendeesPointer){options=e.extend(AttendeesPointer.options,{close:function(){e.post(ajaxurl,{pointer:AttendeesPointer.pointer_id,action:"dismiss-wp-pointer"})},open:function(e,t){t.pointer.css({top:parseInt(t.pointer.css("top").replace("px",""),10)+5}).find(".wp-pointer-arrow").css({right:"50px",left:"auto"}),t.element.on({click:function(){t.element.pointer("close")}})}});e(AttendeesPointer.target).pointer(options).pointer("open").pointer("widget")}e("input.print").on("click",function(e){window.print()});var t=e(document.getElementById("filter_attendee"));t.on("keydown",function(e){return 13===e.keyCode?!1:void 0}),t.on("keyup paste",function(){var t=jQuery(this).val().toLowerCase();e("#the-list").find("tr").each(function(n,i){var r=e(i),o=r.children("td.order_id").children("a").text(),c=r.children("td.attendee_id").text(),d=r.children("td.security").text(),a=0===c.indexOf(t)||0===o.indexOf(t)||0===d.indexOf(t),s=r.children("td.purchaser_name").text().toLowerCase(),p=0===s.indexOf(t)||s.indexOf(" "+t)>1;a||p?r.show():r.hide()})}),e(".tribe-attendees-email").on({submit:function(t){e(".tribe-attendees-email").hide(),e(document.getElementById("tribe-loading")).show()}}),e(".tickets_checkin").click(function(t){var n=jQuery(this),i={action:"tribe-ticket-checkin-"+n.attr("data-provider"),provider:n.attr("data-provider"),order_ID:n.attr("data-attendee-id"),nonce:Attendees.checkin_nonce};e.post(ajaxurl,i,function(t){t.success&&(n.parent("td").parent("tr").addClass("tickets_checked"),e("#total_checkedin").text(parseInt(e("#total_checkedin").text())+1))},"json"),t.preventDefault()}),e(".tickets_uncheckin").click(function(t){var n=jQuery(this),i={action:"tribe-ticket-uncheckin-"+n.attr("data-provider"),provider:n.attr("data-provider"),order_ID:n.attr("data-attendee-id"),nonce:Attendees.uncheckin_nonce};e.post(ajaxurl,i,function(t){t.success&&(n.parent("span").parent("td").parent("tr").removeClass("tickets_checked"),e("#total_checkedin").text(parseInt(e("#total_checkedin").text())-1))},"json"),t.preventDefault()})});
1
+ jQuery(document).ready(function(e){if("undefined"!=typeof AttendeesPointer&&null!==AttendeesPointer){options=e.extend(AttendeesPointer.options,{close:function(){e.post(ajaxurl,{pointer:AttendeesPointer.pointer_id,action:"dismiss-wp-pointer"})},open:function(e,t){t.pointer.css({top:parseInt(t.pointer.css("top").replace("px",""),10)+5}).find(".wp-pointer-arrow").css({right:"50px",left:"auto"}),t.element.on({click:function(){t.element.pointer("close")}})}});e(AttendeesPointer.target).pointer(options).pointer("open").pointer("widget")}e("input.print").on("click",function(e){window.print()});var t=e(document.getElementById("filter_attendee"));t.on("keydown",function(e){if(13===e.keyCode)return!1}),t.on("keyup paste",function(){var t=jQuery(this).val().toLowerCase();e("#the-list").find("tr").each(function(n,i){var r=e(i),o=r.children("td.order_id").children("a").text(),a=r.children("td.attendee_id").text(),d=r.children("td.security").text(),c=0===a.indexOf(t)||0===o.indexOf(t)||0===d.indexOf(t),s=r.children("td.purchaser_name").text().toLowerCase(),p=0===s.indexOf(t)||s.indexOf(" "+t)>1;c||p?r.show():r.hide()})}),e(".tribe-attendees-email").on({submit:function(t){e(".tribe-attendees-email").hide(),e(document.getElementById("tribe-loading")).show()}}),e(".tickets_checkin").click(function(t){var n=jQuery(this),i={action:"tribe-ticket-checkin-"+n.attr("data-provider"),provider:n.attr("data-provider"),order_ID:n.attr("data-attendee-id"),nonce:Attendees.checkin_nonce};n.attr("data-event-id")&&(i.event_ID=n.attr("data-event-id")),e.post(ajaxurl,i,function(t){t.success&&(n.parent("td").parent("tr").addClass("tickets_checked"),e("#total_checkedin").text(parseInt(e("#total_checkedin").text())+1))},"json"),t.preventDefault()}),e(".tickets_uncheckin").click(function(t){var n=jQuery(this),i={action:"tribe-ticket-uncheckin-"+n.attr("data-provider"),provider:n.attr("data-provider"),order_ID:n.attr("data-attendee-id"),nonce:Attendees.uncheckin_nonce};n.attr("data-event-id")&&(i.event_ID=n.attr("data-event-id")),e.post(ajaxurl,i,function(t){t.success&&(n.parent("span").parent("td").parent("tr").removeClass("tickets_checked"),e("#total_checkedin").text(parseInt(e("#total_checkedin").text())-1))},"json"),t.preventDefault()})});
src/resources/js/tickets.min.js CHANGED
@@ -1 +1 @@
1
- var ticketHeaderImage=window.ticketHeaderImage||{};!function(t,e,i){"use strict";ticketHeaderImage={uploader:function(){var t=wp.media({title:HeaderImageData.title,multiple:!1,library:{type:"image"},button:{text:HeaderImageData.button}});return t.on("close",function(){var e=t.state().get("selection").toJSON();e.length&&ticketHeaderImage.render(e[0])}),t.open(),!1},render:function(t){e("#tribe_ticket_header_preview").html(ticketHeaderImage.imgHTML(t)),e("#tribe_ticket_header_image_id").val(t.id),e("#tribe_ticket_header_remove").show()},imgHTML:function(t){var e='<img src="'+t.url+'" ';return e+='width="'+t.width+'" ',e+='height="'+t.height+'" ',e+="/>"}},e(document).ready(function(){function i(){return s.prop("checked")}function a(){l=!0,c.trigger("set-global-stock-fields.tribe")}function r(){e("tr.ticket_advanced").hide(),e("tr.ticket_advanced_"+n()+":not(.sale_price)").show(),c.trigger("set-advanced-fields.tribe"),e(document.getElementById("tribetickets")).trigger("ticket-provider-changed.tribe")}function n(){var t=e('input[name="ticket_provider"]:checked');return t.length>0?t[0].value:""}var d=e("#tribe-event-datepickers"),c=e("#tribetickets"),o=e("#event_tickets"),s=e("#tribe-tickets-enable-global-stock"),_=e("#tribe-tickets-global-stock-level"),l=!1,k=e("html, body"),g=0;c.on({"spin.tribe":function(t,i){("undefined"==typeof i||e.inArray(i,["start","stop"]))&&(i="stop"),"stop"===i?o.css("opacity","1").find("#tribe-loading").hide():o.css("opacity","0.5").find("#tribe-loading").show()},"clear.tribe":function(){var t=e(this),i=t.find("#ticket_form"),a=i.find("tr:not(.event-wide-settings)");t.find("a#ticket_form_toggle").show(),a.find('input:not(:button):not(:radio):not(:checkbox):not([type="hidden"]), textarea').val(""),a.find("input:checkbox").attr("checked",!1),a.find("#ticket_id").val(""),t.find('#ticket_form input[name="show_attendee_info"]').prop("checked",!1).change(),t.find("input[data-default-value]").each(function(){var t=e(this);t.val(t.data("default-value"))}),t.find("#ticket_start_date").datepicker("option","maxDate",null),t.find("#ticket_end_date").datepicker("option","minDate",null),t.find(".ticket_start_time, .ticket_end_time, .ticket.sale_price").hide(),t.find("#ticket_price").removeProp("disabled").siblings(".no-update-message").html("").hide().end().siblings(".description").show(),e("#tribe-tickets-attendee-sortables").empty(),e(".tribe-tickets-attendee-saved-fields").show(),i.hide()},"focus.tribe":function(){k.animate({scrollTop:o.offset().top-50},500)},"set-advanced-fields.tribe":function(){var t=e(this),i=t.find("#ticket_form"),a=i.find("tr.ticket_advanced:not(.ticket_advanced_meta)").find("input, select, textarea"),r=i.find("#ticket_provider:checked").val();a.each(function(){var t=e(this);t.attr("name")&&t.data("name",t.attr("name")).attr({name:"",id:""}),t.closest("tr").hasClass("ticket_advanced_"+r)&&t.data("name")&&0===t.attr("name").length&&t.attr({name:t.data("name"),id:t.data("name")})}),c.trigger("set-global-stock-fields.tribe"),e("#ticket_global_stock").change(function(){c.trigger("set-global-stock-fields.tribe")})},"set-global-stock-fields.tribe":function(){var t=n(),a=e(this).find("#ticket_form").find(".ticket_advanced_"+t);if(!(a.length<1)){var r=a.filter(".stock"),d=a.filter(".global-stock-mode"),c=d.filter(".sales-cap-field"),o=e("#ticket_global_stock").val(),s=i();if(_.toggle(s),d.toggle(i()),r.toggle(!s),s)switch(o){case"global":c.hide(),r.hide();break;case"capped":c.show(),r.hide();break;case"own":c.hide(),r.show()}}}}),d.length&&(g=d.data("startofweek"));var p={dateFormat:"yy-mm-dd",showAnim:"fadeIn",changeMonth:!0,changeYear:!0,numberOfMonths:3,firstDay:g,showButtonPanel:!0,onChange:function(){},onSelect:function(t,i){var a=e.datepicker.parseDate("yy-mm-dd",t);"ticket_start_date"===i.id?(e("#ticket_end_date").datepicker("option","minDate",a),a?e(".ticket_start_time").show():e(".ticket_start_time").hide()):(e("#ticket_start_date").datepicker("option","maxDate",a),a?e(".ticket_end_time").show():e(".ticket_end_time").hide())}};e("#ticket_start_date").datepicker(p).keyup(function(t){8!==t.keyCode&&46!==t.keyCode||e.datepicker._clearDate(this)}),e("#ticket_end_date").datepicker(p).keyup(function(t){8!==t.keyCode&&46!==t.keyCode||e.datepicker._clearDate(this)}),s.change(a),s.trigger("change"),l=!1,e("input[name=ticket_provider]:radio").change(function(){r()}),e("input[name=ticket_provider]:checked").each(function(){r()}),e("a#ticket_form_toggle").click(function(t){e("h4.ticket_form_title_edit").hide(),e("h4.ticket_form_title_add").show(),e(this).hide(),c.trigger("clear.tribe").trigger("set-advanced-fields.tribe").trigger("focus.tribe"),e("#ticket_form").show(),e(document.getElementById("tribetickets")).trigger("ticket-provider-changed.tribe"),t.preventDefault()}),e("#ticket_form_cancel").click(function(){c.trigger("clear.tribe").trigger("set-advanced-fields.tribe").trigger("focus.tribe")}),e("#ticket_form_save").click(function(t){var i=e("#ticket_form_table"),a=i.find("#ticket_provider:checked").val(),r=i.find(".ticket, .ticket_advanced_meta, .ticket_advanced_"+a);c.trigger("save-ticket.tribe",t).trigger("spin.tribe","start");var n={action:"tribe-ticket-add-"+e("input[name=ticket_provider]:checked").val(),formdata:r.find(".ticket_field").serialize(),post_ID:e("#post_ID").val(),nonce:TribeTickets.add_ticket_nonce};e.post(ajaxurl,n,function(t){c.trigger("saved-ticket.tribe",t),t.success&&(c.trigger("clear.tribe"),e("td.ticket_list_container").empty().html(t.data.html),e(".ticket_time").hide())},"json").complete(function(){c.trigger("spin.tribe","stop").trigger("focus.tribe")})}),c.on("click",".ticket_delete",function(t){t.preventDefault(),c.trigger("delete-ticket.tribe",t).trigger("spin.tribe","start");var i={action:"tribe-ticket-delete-"+e(this).attr("attr-provider"),post_ID:e("#post_ID").val(),ticket_id:e(this).attr("attr-ticket-id"),nonce:TribeTickets.remove_ticket_nonce};e.post(ajaxurl,i,function(t){c.trigger("deleted-ticket.tribe",t),t.success&&(c.trigger("clear.tribe"),e("td.ticket_list_container").empty().html(t.data))},"json").complete(function(){c.trigger("spin.tribe","stop")})}),c.on("click",".ticket_edit",function(t){t.preventDefault(),e("h4.ticket_form_title_edit").show(),e("h4.ticket_form_title_add").hide(),c.trigger("spin.tribe","start");var i={action:"tribe-ticket-edit-"+e(this).attr("attr-provider"),post_ID:e("#post_ID").val(),ticket_id:e(this).attr("attr-ticket-id"),nonce:TribeTickets.edit_ticket_nonce};e.post(ajaxurl,i,function(t){c.trigger("clear.tribe").trigger("set-advanced-fields.tribe").trigger("edit-ticket.tribe",t);var i=t.data.price,a=i,r=!1;"undefined"!=typeof t.data.on_sale&&t.data.on_sale&&(r=!0,i=t.data.regular_price),e("#ticket_id").val(t.data.ID),e("#ticket_name").val(t.data.name),e("#ticket_description").val(t.data.description),r&&e(".ticket_advanced_"+t.data.provider_class+".sale_price").show();var n=t.data.start_date.substring(0,10),d=t.data.end_date.substring(0,10);e("#ticket_start_date").val(n),e("#ticket_end_date").val(d);var o=e(document.getElementById("ticket_start_meridian")),s=e(document.getElementById("ticket_end_meridian"));if(t.data.start_date){var _=parseInt(t.data.start_date.substring(11,13)),l="am";_>12&&o.length&&(l="pm",_=parseInt(_)-12,_=("0"+_).slice(-2)),12===_&&(l="pm"),0===_&&"am"===l&&(_=12),_=_.toString(),1===_.length&&(_="0"+_),e("#ticket_start_hour").val(_),e("#ticket_start_meridian").val(l),e(".ticket_start_time").show()}if(t.data.end_date){var k=parseInt(t.data.end_date.substring(11,13)),g="am";k>12&&s.length&&(g="pm",k=parseInt(k)-12,k=("0"+k).slice(-2)),12===k&&(g="pm"),0===k&&"am"===g&&(k=12),k=k.toString(),1===k.length&&(k="0"+k),e("#ticket_end_hour").val(k),e("#ticket_end_meridian").val(g),e("#ticket_start_minute").val(t.data.start_date.substring(14,16)),e("#ticket_end_minute").val(t.data.end_date.substring(14,16)),e(".ticket_end_time").show()}var p=e("tr.ticket_advanced input");p.data("name",p.attr("name")).attr({name:"",id:""}),e("tr.ticket_advanced").remove(),e("tr.ticket.bottom").before(t.data.advanced_fields),e("input:radio[name=ticket_provider]").filter("[value="+t.data.provider_class+"]").click(),e("input[name=ticket_provider]:radio").change();var m=c.find("#ticket_price");m.val(i),"undefined"!=typeof t.data.disallow_update_price_message?m.siblings(".no-update-message").html(t.data.disallow_update_price_message):m.siblings(".no-update-message").html(""),"undefined"==typeof t.data.can_update_price||t.data.can_update_price?(m.removeProp("disabled"),m.siblings(".description").show(),m.siblings(".no-update-message").hide()):(m.prop("disabled","disabled"),m.siblings(".description").hide(),m.siblings(".no-update-message").show());var f=c.find("#ticket_sale_price");r?f.val(a).closest("tr").show():f.closest("tr").hide(),"undefined"!=typeof t.data.purchase_limit&&t.data.purchase_limit&&e("#ticket_purchase_limit").val(t.data.purchase_limit),c.find(".bumpdown-trigger").bumpdown(),c.find(".bumpdown").hide(),e("a#ticket_form_toggle").hide(),e("#ticket_form").show(),c.trigger("set-advanced-fields.tribe").trigger("edit-ticket.tribe")},"json").complete(function(){c.trigger("spin.tribe","stop").trigger("focus.tribe")})}).on("click","#tribe_ticket_header_image",function(t){t.preventDefault(),ticketHeaderImage.uploader("","")});var m=e("#tribe_ticket_header_remove"),f=e("#tribe_ticket_header_preview");if(f.find("img").length&&m.show(),_.change(function(){l=!0}),e('input[type="submit"]').click(function(){l=!1}),e(t).on("beforeunload",function(){return l?tribe_global_stock_admin_ui.nav_away_msg:void 0}),e("body").on("click","#tribe_ticket_header_remove",function(t){t.preventDefault(),f.html(""),m.hide(),e("#tribe_ticket_header_image_id").val("")}),e("#tribe_ticket_header_preview img").length){var h=e("#tribe_ticket_header_preview img");h.removeAttr("width").removeAttr("height"),c.width()<h.width()&&h.css("width","95%")}})}(window,jQuery);
1
+ var ticketHeaderImage=window.ticketHeaderImage||{};!function(t,e,i){"use strict";ticketHeaderImage={uploader:function(){var t=wp.media({title:HeaderImageData.title,multiple:!1,library:{type:"image"},button:{text:HeaderImageData.button}});return t.on("close",function(){var e=t.state().get("selection").toJSON();e.length&&ticketHeaderImage.render(e[0])}),t.open(),!1},render:function(t){e("#tribe_ticket_header_preview").html(ticketHeaderImage.imgHTML(t)),e("#tribe_ticket_header_image_id").val(t.id),e("#tribe_ticket_header_remove").show()},imgHTML:function(t){var e='<img src="'+t.url+'" ';return e+='width="'+t.width+'" ',e+='height="'+t.height+'" ',e+="/>"}},e(document).ready(function(){function i(){return s.prop("checked")}function a(){l=!0,c.trigger("set-global-stock-fields.tribe")}function r(){e("tr.ticket_advanced").hide(),e("tr.ticket_advanced_"+n()+":not(.sale_price)").show(),c.trigger("set-advanced-fields.tribe"),e(document.getElementById("tribetickets")).trigger("ticket-provider-changed.tribe")}function n(){var t=e('input[name="ticket_provider"]:checked');return t.length>0?t[0].value:""}var d=e("#tribe-event-datepickers"),c=e("#tribetickets"),o=e("#event_tickets"),s=e("#tribe-tickets-enable-global-stock"),_=e("#tribe-tickets-global-stock-level"),l=!1,k=e("html, body"),g=0;c.on({"spin.tribe":function(t,i){("undefined"==typeof i||e.inArray(i,["start","stop"]))&&(i="stop"),"stop"===i?o.css("opacity","1").find("#tribe-loading").hide():o.css("opacity","0.5").find("#tribe-loading").show()},"clear.tribe":function(){var t=e(this),i=t.find("#ticket_form"),a=i.find("tr:not(.event-wide-settings)");t.find("a#ticket_form_toggle").show(),a.find('input:not(:button):not(:radio):not(:checkbox):not([type="hidden"]), textarea').val(""),a.find("input:checkbox").attr("checked",!1),a.find("#ticket_id").val(""),t.find('#ticket_form input[name="show_attendee_info"]').prop("checked",!1).change(),t.find("input[data-default-value]").each(function(){var t=e(this);t.val(t.data("default-value"))}),t.find("#ticket_start_date").datepicker("option","maxDate",null),t.find("#ticket_end_date").datepicker("option","minDate",null),t.find(".ticket_start_time, .ticket_end_time, .ticket.sale_price").hide(),t.find("#ticket_price").removeProp("disabled").siblings(".no-update-message").html("").hide().end().siblings(".description").show(),e("#tribe-tickets-attendee-sortables").empty(),e(".tribe-tickets-attendee-saved-fields").show(),i.hide()},"focus.tribe":function(){k.animate({scrollTop:o.offset().top-50},500)},"set-advanced-fields.tribe":function(){var t=e(this),i=t.find("#ticket_form"),a=i.find("tr.ticket_advanced:not(.ticket_advanced_meta)").find("input, select, textarea"),r=i.find("#ticket_provider:checked").val();a.each(function(){var t=e(this);t.attr("name")&&t.data("name",t.attr("name")).attr({name:"",id:""}),t.closest("tr").hasClass("ticket_advanced_"+r)&&t.data("name")&&0===t.attr("name").length&&t.attr({name:t.data("name"),id:t.data("name")})}),c.trigger("set-global-stock-fields.tribe"),e("#ticket_global_stock").change(function(){c.trigger("set-global-stock-fields.tribe")})},"set-global-stock-fields.tribe":function(){var t=n(),a=e(this).find("#ticket_form").find(".ticket_advanced_"+t);if(!(a.length<1)){var r=a.filter(".stock"),d=a.filter(".global-stock-mode"),c=d.filter(".sales-cap-field"),o=e("#ticket_global_stock").val(),s=i();if(_.toggle(s),d.toggle(i()),r.toggle(!s),s)switch(o){case"global":c.hide(),r.hide();break;case"capped":c.show(),r.hide();break;case"own":c.hide(),r.show()}}}}),d.length&&(g=d.data("startofweek"));var p={dateFormat:"yy-mm-dd",showAnim:"fadeIn",changeMonth:!0,changeYear:!0,numberOfMonths:3,firstDay:g,showButtonPanel:!0,onChange:function(){},onSelect:function(t,i){var a=e.datepicker.parseDate("yy-mm-dd",t);"ticket_start_date"===i.id?(e("#ticket_end_date").datepicker("option","minDate",a),a?e(".ticket_start_time").show():e(".ticket_start_time").hide()):(e("#ticket_start_date").datepicker("option","maxDate",a),a?e(".ticket_end_time").show():e(".ticket_end_time").hide())}};e("#ticket_start_date").datepicker(p).keyup(function(t){8!==t.keyCode&&46!==t.keyCode||e.datepicker._clearDate(this)}),e("#ticket_end_date").datepicker(p).keyup(function(t){8!==t.keyCode&&46!==t.keyCode||e.datepicker._clearDate(this)}),s.change(a),s.trigger("change"),l=!1,e("input[name=ticket_provider]:radio").change(function(){r()}),e("input[name=ticket_provider]:checked").each(function(){r()}),e("a#ticket_form_toggle").click(function(t){e("h4.ticket_form_title_edit").hide(),e("h4.ticket_form_title_add").show(),e(this).hide(),c.trigger("clear.tribe").trigger("set-advanced-fields.tribe").trigger("focus.tribe"),e("#ticket_form").show(),e(document.getElementById("tribetickets")).trigger("ticket-provider-changed.tribe"),t.preventDefault()}),e("#ticket_form_cancel").click(function(){c.trigger("clear.tribe").trigger("set-advanced-fields.tribe").trigger("focus.tribe")}),e("#ticket_form_save").click(function(t){var i=e("#ticket_form_table"),a=i.find("#ticket_provider:checked").val(),r=i.find(".ticket, .ticket_advanced_meta, .ticket_advanced_"+a);c.trigger("save-ticket.tribe",t).trigger("spin.tribe","start");var n={action:"tribe-ticket-add-"+e("input[name=ticket_provider]:checked").val(),formdata:r.find(".ticket_field").serialize(),post_ID:e("#post_ID").val(),nonce:TribeTickets.add_ticket_nonce};e.post(ajaxurl,n,function(t){c.trigger("saved-ticket.tribe",t),t.success&&(c.trigger("clear.tribe"),e("td.ticket_list_container").empty().html(t.data.html),e(".ticket_time").hide())},"json").complete(function(){c.trigger("spin.tribe","stop").trigger("focus.tribe")})}),c.on("click",".ticket_delete",function(t){t.preventDefault(),c.trigger("delete-ticket.tribe",t).trigger("spin.tribe","start");var i={action:"tribe-ticket-delete-"+e(this).attr("attr-provider"),post_ID:e("#post_ID").val(),ticket_id:e(this).attr("attr-ticket-id"),nonce:TribeTickets.remove_ticket_nonce};e.post(ajaxurl,i,function(t){c.trigger("deleted-ticket.tribe",t),t.success&&(c.trigger("clear.tribe"),e("td.ticket_list_container").empty().html(t.data))},"json").complete(function(){c.trigger("spin.tribe","stop")})}),c.on("click",".ticket_edit",function(t){t.preventDefault(),e("h4.ticket_form_title_edit").show(),e("h4.ticket_form_title_add").hide(),c.trigger("spin.tribe","start");var i={action:"tribe-ticket-edit-"+e(this).attr("attr-provider"),post_ID:e("#post_ID").val(),ticket_id:e(this).attr("attr-ticket-id"),nonce:TribeTickets.edit_ticket_nonce};e.post(ajaxurl,i,function(t){c.trigger("clear.tribe").trigger("set-advanced-fields.tribe").trigger("edit-ticket.tribe",t);var i=t.data.price,a=i,r=!1;"undefined"!=typeof t.data.on_sale&&t.data.on_sale&&(r=!0,i=t.data.regular_price),e("#ticket_id").val(t.data.ID),e("#ticket_name").val(t.data.name),e("#ticket_description").val(t.data.description),r&&e(".ticket_advanced_"+t.data.provider_class+".sale_price").show();var n=t.data.start_date.substring(0,10),d=t.data.end_date.substring(0,10);e("#ticket_start_date").val(n),e("#ticket_end_date").val(d);var o=e(document.getElementById("ticket_start_meridian")),s=e(document.getElementById("ticket_end_meridian"));if(t.data.start_date){var _=parseInt(t.data.start_date.substring(11,13)),l="am";_>12&&o.length&&(l="pm",_=parseInt(_)-12,_=("0"+_).slice(-2)),12===_&&(l="pm"),0===_&&"am"===l&&(_=12),_=_.toString(),1===_.length&&(_="0"+_),e("#ticket_start_hour").val(_),e("#ticket_start_meridian").val(l),e(".ticket_start_time").show()}if(t.data.end_date){var k=parseInt(t.data.end_date.substring(11,13)),g="am";k>12&&s.length&&(g="pm",k=parseInt(k)-12,k=("0"+k).slice(-2)),12===k&&(g="pm"),0===k&&"am"===g&&(k=12),k=k.toString(),1===k.length&&(k="0"+k),e("#ticket_end_hour").val(k),e("#ticket_end_meridian").val(g),e("#ticket_start_minute").val(t.data.start_date.substring(14,16)),e("#ticket_end_minute").val(t.data.end_date.substring(14,16)),e(".ticket_end_time").show()}var p=e("tr.ticket_advanced input");p.data("name",p.attr("name")).attr({name:"",id:""}),e("tr.ticket_advanced").remove(),e("tr.ticket.bottom").before(t.data.advanced_fields),e("input:radio[name=ticket_provider]").filter("[value="+t.data.provider_class+"]").click(),e("input[name=ticket_provider]:radio").change();var m=c.find("#ticket_price");m.val(i),"undefined"!=typeof t.data.disallow_update_price_message?m.siblings(".no-update-message").html(t.data.disallow_update_price_message):m.siblings(".no-update-message").html(""),"undefined"==typeof t.data.can_update_price||t.data.can_update_price?(m.removeProp("disabled"),m.siblings(".description").show(),m.siblings(".no-update-message").hide()):(m.prop("disabled","disabled"),m.siblings(".description").hide(),m.siblings(".no-update-message").show());var f=c.find("#ticket_sale_price");r?f.val(a).closest("tr").show():f.closest("tr").hide(),"undefined"!=typeof t.data.purchase_limit&&t.data.purchase_limit&&e("#ticket_purchase_limit").val(t.data.purchase_limit),c.find(".bumpdown-trigger").bumpdown(),c.find(".bumpdown").hide(),e("a#ticket_form_toggle").hide(),e("#ticket_form").show(),c.trigger("set-advanced-fields.tribe").trigger("edit-ticket.tribe")},"json").complete(function(){c.trigger("spin.tribe","stop").trigger("focus.tribe")})}).on("click","#tribe_ticket_header_image",function(t){t.preventDefault(),ticketHeaderImage.uploader("","")});var m=e("#tribe_ticket_header_remove"),f=e("#tribe_ticket_header_preview");if(f.find("img").length&&m.show(),_.change(function(){l=!0}),e('input[type="submit"]').click(function(){l=!1}),e(t).on("beforeunload",function(){if(l)return tribe_global_stock_admin_ui.nav_away_msg}),e("body").on("click","#tribe_ticket_header_remove",function(t){t.preventDefault(),f.html(""),m.hide(),e("#tribe_ticket_header_image_id").val("")}),e("#tribe_ticket_header_preview img").length){var h=e("#tribe_ticket_header_preview img");h.removeAttr("width").removeAttr("height"),c.width()<h.width()&&h.css("width","95%")}})}(window,jQuery);
src/resources/postcss/rsvp.pcss CHANGED
@@ -130,6 +130,14 @@
130
  }
131
 
132
  .tribe-answer {
 
 
 
 
 
 
 
 
133
  select {
134
  background: white;
135
  border: 1px solid #ddd;
130
  }
131
 
132
  .tribe-answer {
133
+ line-height: 2;
134
+
135
+ .type-label {
136
+ padding-right: .5em;
137
+ }
138
+ label {
139
+ display: block;
140
+ }
141
  select {
142
  background: white;
143
  border: 1px solid #ddd;
src/views/tickets/email-non-attendance.php ADDED
@@ -0,0 +1,270 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Email used to notify someone that their RSVP was received.
4
+ *
5
+ * This email is used on those occasions where the user noted
6
+ * that they would *not* be attending. You may override this
7
+ * template in your own theme by creating a file at:
8
+ *
9
+ * [your-theme]/tribe-events/tickets/email-non-attendance.php
10
+ *
11
+ * @var int $event_id
12
+ * @var int $order_id
13
+ * @var array $attendees
14
+ *
15
+ * @version 4.2.2
16
+ */
17
+
18
+ $start_date = tribe_get_start_date( $event_id );
19
+ ?>
20
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
21
+ <html xmlns="http://www.w3.org/1999/xhtml">
22
+ <head>
23
+ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
24
+ <title><?php esc_html_e( 'Your tickets', 'event-tickets' ); ?></title>
25
+ <meta name="viewport" content="width=device-width" />
26
+ <style type="text/css">
27
+ h1, h2, h3, h4, h5, h6 {
28
+ color : #0a0a0e;
29
+ }
30
+
31
+ a, img {
32
+ border : 0;
33
+ outline : 0;
34
+ }
35
+
36
+ #outlook a {
37
+ padding : 0;
38
+ }
39
+
40
+ .ReadMsgBody, .ExternalClass {
41
+ width : 100%
42
+ }
43
+
44
+ .yshortcuts, a .yshortcuts, a .yshortcuts:hover, a .yshortcuts:active, a .yshortcuts:focus {
45
+ background-color : transparent !important;
46
+ border : none !important;
47
+ color : inherit !important;
48
+ }
49
+
50
+ body {
51
+ background : #ffffff;
52
+ min-height : 1000px;
53
+ font-family : sans-serif;
54
+ font-size : 14px;
55
+ }
56
+
57
+ .appleLinks a {
58
+ color : #006caa;
59
+ text-decoration : underline;
60
+ }
61
+
62
+ @media only screen and (max-width: 480px) {
63
+ body, table, td, p, a, li, blockquote {
64
+ -webkit-text-size-adjust : none !important;
65
+ }
66
+
67
+ body {
68
+ width : 100% !important;
69
+ min-width : 100% !important;
70
+ }
71
+
72
+ body[yahoo] h2 {
73
+ line-height : 120% !important;
74
+ font-size : 28px !important;
75
+ margin : 15px 0 10px 0 !important;
76
+ }
77
+
78
+ table.content,
79
+ table.wrapper,
80
+ table.inner-wrapper {
81
+ width : 100% !important;
82
+ }
83
+
84
+ table.ticket-content {
85
+ width : 90% !important;
86
+ padding : 20px 0 !important;
87
+ }
88
+
89
+ table.ticket-details {
90
+ position : relative;
91
+ padding-bottom : 100px !important;
92
+ }
93
+
94
+ table.ticket-break {
95
+ width : 100% !important;
96
+ }
97
+
98
+ td.wrapper {
99
+ width : 100% !important;
100
+ }
101
+
102
+ td.ticket-content {
103
+ width : 100% !important;
104
+ }
105
+
106
+ td.ticket-image img {
107
+ max-width : 100% !important;
108
+ width : 100% !important;
109
+ height : auto !important;
110
+ }
111
+
112
+ td.ticket-details {
113
+ width : 33% !important;
114
+ padding-right : 10px !important;
115
+ border-top : 1px solid #ddd !important;
116
+ }
117
+
118
+ td.ticket-details h6 {
119
+ margin-top : 20px !important;
120
+ }
121
+
122
+ td.ticket-details.new-row {
123
+ width : 50% !important;
124
+ height : 80px !important;
125
+ border-top : 0 !important;
126
+ position : absolute !important;
127
+ bottom : 0 !important;
128
+ display : block !important;
129
+ }
130
+
131
+ td.ticket-details.new-left-row {
132
+ left : 0 !important;
133
+ }
134
+
135
+ td.ticket-details.new-right-row {
136
+ right : 0 !important;
137
+ }
138
+
139
+ table.ticket-venue {
140
+ position : relative !important;
141
+ width : 100% !important;
142
+ padding-bottom : 150px !important;
143
+ }
144
+
145
+ td.ticket-venue,
146
+ td.ticket-organizer,
147
+ td.ticket-qr {
148
+ width : 100% !important;
149
+ border-top : 1px solid #ddd !important;
150
+ }
151
+
152
+ td.ticket-venue h6,
153
+ td.ticket-organizer h6 {
154
+ margin-top : 20px !important;
155
+ }
156
+
157
+ td.ticket-qr {
158
+ text-align : left !important
159
+ }
160
+
161
+ td.ticket-qr img {
162
+ float : none !important;
163
+ margin-top : 20px !important
164
+ }
165
+
166
+ td.ticket-organizer,
167
+ td.ticket-qr {
168
+ position : absolute;
169
+ display : block;
170
+ left : 0;
171
+ bottom : 0;
172
+ }
173
+
174
+ td.ticket-organizer {
175
+ bottom : 0px;
176
+ height : 100px !important;
177
+ }
178
+
179
+ td.ticket-venue-child {
180
+ width : 50% !important;
181
+ }
182
+
183
+ table.venue-details {
184
+ position : relative !important;
185
+ width : 100% !important;
186
+ }
187
+
188
+ a[href^="tel"], a[href^="sms"] {
189
+ text-decoration : none;
190
+ color : black;
191
+ pointer-events : none;
192
+ cursor : default;
193
+ }
194
+
195
+ .mobile_link a[href^="tel"], .mobile_link a[href^="sms"] {
196
+ text-decoration : default;
197
+ color : #006caa !important;
198
+ pointer-events : auto;
199
+ cursor : default;
200
+ }
201
+ }
202
+
203
+ @media only screen and (max-width: 320px) {
204
+ td.ticket-venue h6,
205
+ td.ticket-organizer h6,
206
+ td.ticket-details h6 {
207
+ font-size : 12px !important;
208
+ }
209
+ }
210
+
211
+ @media print {
212
+ .ticket-break {
213
+ page-break-before : always !important;
214
+ }
215
+ }
216
+
217
+ <?php do_action( 'tribe_tickets_ticket_email_styles' );?>
218
+
219
+ </style>
220
+ </head>
221
+ <body yahoo="fix" alink="#006caa" link="#006caa" text="#000000" bgcolor="#ffffff" style="width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0 auto; padding:20px 0 0 0; background:#ffffff; min-height:1000px;">
222
+ <div style="margin:0; padding:0; width:100% !important; font-family: 'Helvetica Neue', Helvetica, sans-serif; font-size:14px; line-height:145%; text-align:left;">
223
+ <center>
224
+ <?php
225
+ /**
226
+ * Fires immediately before the main body of content within ticket emails
227
+ * is rendered.
228
+ */
229
+ do_action( 'tribe_tickets_ticket_email_top' );
230
+ ?>
231
+
232
+ <table class="content" align="center" width="620" cellspacing="0" cellpadding="0" border="0" bgcolor="#ffffff" style="margin:0 auto; padding:0;<?php echo $break; ?>;">
233
+ <tr>
234
+ <td align="center" valign="top" class="wrapper" width="620">
235
+ <h2 style="color:#0a0a0e; margin:0 0 10px 0 !important; font-family: 'Helvetica Neue', Helvetica, sans-serif; font-style:normal; font-weight:700; font-size:28px; letter-spacing:normal; line-height: 100%; text-align:left;">
236
+ <span style="color:#0a0a0e !important">
237
+ <?php echo esc_html( get_the_title( $event_id ) ); ?>
238
+ </span>
239
+ </h2>
240
+
241
+ <?php if ( ! empty( $start_date ) ): ?>
242
+ <h4 style="color:#0a0a0e; margin:0 !important; font-family: 'Helvetica Neue', Helvetica, sans-serif; font-style:normal; font-weight:700; font-size:15px; letter-spacing:normal; line-height: 100%; text-align:left;">
243
+ <span style="color:#0a0a0e !important"><?php echo $start_date; ?></span>
244
+ </h4>
245
+ <?php endif; ?>
246
+
247
+ <p style="text-align:left;">
248
+ <?php _e( 'Thank you for confirming that you will not be attending the above event.', 'event-tickets' ); ?>
249
+ </p>
250
+
251
+ <p>
252
+ <a href="<?php echo esc_url( get_permalink( $event_id ) ); ?>"><?php echo esc_html( get_the_title( $event_id ) ); ?></a>
253
+ <a href="<?php echo esc_url( get_home_url() ); ?>"><?php echo esc_html( get_bloginfo( 'name' ) ); ?></a>
254
+ </p>
255
+ </td>
256
+ </tr>
257
+ </table>
258
+
259
+ <?php
260
+ /**
261
+ * Fires immediately after the main body of content within ticket emails
262
+ * is rendered.
263
+ */
264
+ do_action( 'tribe_tickets_ticket_email_bottom' );
265
+ ?>
266
+
267
+ </center>
268
+ </div>
269
+ </body>
270
+ </html>
src/views/tickets/orders-rsvp.php CHANGED
@@ -5,7 +5,7 @@
5
  * Override this template in your own theme by creating a file at [your-theme]/tribe-events/tickets/orders-rsvp.php
6
  *
7
  * @package TribeEventsCalendar
8
- * @version 4.2
9
  *
10
  */
11
 
@@ -68,6 +68,7 @@ $attendee_groups = $view->get_event_rsvp_attendees_by_purchaser( $post_id, $user
68
  <?php esc_html_e( 'RSVP: ', 'event-tickets' ); ?>
69
  <?php $view->render_rsvp_selector( "attendee[{$key}][order_status]", $attendee['order_status'], $post_id, $attendee['product_id'] ); ?>
70
  </label>
 
71
  </div>
72
  <?php
73
  /**
5
  * Override this template in your own theme by creating a file at [your-theme]/tribe-events/tickets/orders-rsvp.php
6
  *
7
  * @package TribeEventsCalendar
8
+ * @version 4.2.2
9
  *
10
  */
11
 
68
  <?php esc_html_e( 'RSVP: ', 'event-tickets' ); ?>
69
  <?php $view->render_rsvp_selector( "attendee[{$key}][order_status]", $attendee['order_status'], $post_id, $attendee['product_id'] ); ?>
70
  </label>
71
+ <div class="ticket-type"><span class="type-label"><?php esc_html_e( 'Type: ', 'event-tickets' );?></span><?php esc_html_e( $attendee['ticket'] );?></div>
72
  </div>
73
  <?php
74
  /**