The Events Calendar - Version 4.9.6

Version Description

Download this release

Release Info

Developer bordoni
Plugin Icon The Events Calendar
Version 4.9.6
Comparing to
See all releases

Code changes from version 4.9.5 to 4.9.6

Files changed (36) hide show
  1. common/lang/tribe-common-de_DE.mo +0 -0
  2. common/vendor/autoload.php +1 -1
  3. common/vendor/autoload_52.php +1 -1
  4. common/vendor/composer/autoload_commands_real.php +3 -3
  5. common/vendor/composer/autoload_framework_classmap.php +4 -0
  6. common/vendor/composer/autoload_framework_real.php +3 -3
  7. common/vendor/composer/autoload_real.php +4 -4
  8. common/vendor/composer/autoload_real_52.php +3 -3
  9. common/vendor/composer/autoload_static.php +5 -5
  10. lang/the-events-calendar-el.mo +0 -0
  11. lang/the-events-calendar-it_IT.mo +0 -0
  12. lang/the-events-calendar.pot +184 -184
  13. readme.txt +6 -1
  14. src/Tribe/Aggregator/API/Origins.php +65 -46
  15. src/Tribe/Aggregator/Event.php +6 -6
  16. src/Tribe/Aggregator/Processes/Queue_Control.php +3 -0
  17. src/Tribe/Aggregator/Record/Meetup.php +51 -0
  18. src/Tribe/Aggregator/Service.php +146 -44
  19. src/Tribe/Aggregator/Settings.php +183 -33
  20. src/Tribe/Main.php +1 -1
  21. src/admin-views/aggregator/origins/eventbrite.php +1 -1
  22. src/admin-views/aggregator/origins/meetup.php +29 -52
  23. src/admin-views/aggregator/settings.php +408 -406
  24. src/admin-views/aggregator/status.php +62 -57
  25. src/admin-views/aggregator/tabs/import-form.php +5 -5
  26. src/admin-views/tribe-options-addons-api.php +71 -44
  27. src/resources/css/aggregator-page.css +1 -1
  28. src/resources/css/aggregator-page.min.css +1 -1
  29. src/resources/css/events-admin.css +41 -0
  30. src/resources/css/events-admin.min.css +1 -1
  31. src/resources/postcss/aggregator-page.pcss +1 -1
  32. src/resources/postcss/events-admin.pcss +39 -0
  33. the-events-calendar.php +1 -1
  34. vendor/autoload.php +1 -1
  35. vendor/composer/autoload_real.php +4 -4
  36. vendor/composer/autoload_static.php +4 -4
common/lang/tribe-common-de_DE.mo CHANGED
Binary file
common/vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInitbcbc363bc013de3b66adfafccda907b0::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInite58475742c7836da432d03f1c8e41b6c::getLoader();
common/vendor/autoload_52.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
- return ComposerAutoloaderInita1cb95a067a388b281296448d37e9293::getLoader();
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
+ return ComposerAutoloaderInit4aaa34538b97318bfd1cb8ada46cad01::getLoader();
common/vendor/composer/autoload_commands_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_commands_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit4fca3e0e8299167cff806d0f02b8b16c
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit4fca3e0e8299167cff806d0f02b8b16c
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit4fca3e0e8299167cff806d0f02b8b16c', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit4fca3e0e8299167cff806d0f02b8b16c', 'loadClassLoader'));
25
 
26
  $classMap = require __DIR__ . '/autoload_commands_classmap.php';
27
  if ($classMap) {
2
 
3
  // autoload_commands_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInita71ece968808d28e9fb8d555ca7d303c
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInita71ece968808d28e9fb8d555ca7d303c', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInita71ece968808d28e9fb8d555ca7d303c', 'loadClassLoader'));
25
 
26
  $classMap = require __DIR__ . '/autoload_commands_classmap.php';
27
  if ($classMap) {
common/vendor/composer/autoload_framework_classmap.php CHANGED
@@ -71,6 +71,7 @@ return array(
71
  'Carbon\\CarbonTimeZone' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonTimeZone.php',
72
  'Carbon\\Cli\\Invoker' => $vendorDir . '/nesbot/carbon/src/Carbon/Cli/Invoker.php',
73
  'Carbon\\Exceptions\\InvalidDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php',
 
74
  'Carbon\\Factory' => $vendorDir . '/nesbot/carbon/src/Carbon/Factory.php',
75
  'Carbon\\FactoryImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/FactoryImmutable.php',
76
  'Carbon\\Language' => $vendorDir . '/nesbot/carbon/src/Carbon/Language.php',
@@ -666,6 +667,7 @@ return array(
666
  'Composer\\Util\\Hg' => $vendorDir . '/composer/composer/src/Composer/Util/Hg.php',
667
  'Composer\\Util\\IniHelper' => $vendorDir . '/composer/composer/src/Composer/Util/IniHelper.php',
668
  'Composer\\Util\\NoProxyPattern' => $vendorDir . '/composer/composer/src/Composer/Util/NoProxyPattern.php',
 
669
  'Composer\\Util\\Perforce' => $vendorDir . '/composer/composer/src/Composer/Util/Perforce.php',
670
  'Composer\\Util\\Platform' => $vendorDir . '/composer/composer/src/Composer/Util/Platform.php',
671
  'Composer\\Util\\ProcessExecutor' => $vendorDir . '/composer/composer/src/Composer/Util/ProcessExecutor.php',
@@ -676,6 +678,7 @@ return array(
676
  'Composer\\Util\\Svn' => $vendorDir . '/composer/composer/src/Composer/Util/Svn.php',
677
  'Composer\\Util\\TlsHelper' => $vendorDir . '/composer/composer/src/Composer/Util/TlsHelper.php',
678
  'Composer\\Util\\Url' => $vendorDir . '/composer/composer/src/Composer/Util/Url.php',
 
679
  'Composer\\XdebugHandler' => $vendorDir . '/composer/composer/src/Composer/XdebugHandler.php',
680
  'Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php',
681
  'Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php',
@@ -1039,6 +1042,7 @@ return array(
1039
  'Illuminate\\Contracts\\Queue\\QueueableEntity' => $vendorDir . '/illuminate/contracts/Queue/QueueableEntity.php',
1040
  'Illuminate\\Contracts\\Queue\\ShouldQueue' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueue.php',
1041
  'Illuminate\\Contracts\\Redis\\Connection' => $vendorDir . '/illuminate/contracts/Redis/Connection.php',
 
1042
  'Illuminate\\Contracts\\Redis\\Factory' => $vendorDir . '/illuminate/contracts/Redis/Factory.php',
1043
  'Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => $vendorDir . '/illuminate/contracts/Redis/LimiterTimeoutException.php',
1044
  'Illuminate\\Contracts\\Routing\\BindingRegistrar' => $vendorDir . '/illuminate/contracts/Routing/BindingRegistrar.php',
71
  'Carbon\\CarbonTimeZone' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonTimeZone.php',
72
  'Carbon\\Cli\\Invoker' => $vendorDir . '/nesbot/carbon/src/Carbon/Cli/Invoker.php',
73
  'Carbon\\Exceptions\\InvalidDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php',
74
+ 'Carbon\\Exceptions\\NotAPeriodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php',
75
  'Carbon\\Factory' => $vendorDir . '/nesbot/carbon/src/Carbon/Factory.php',
76
  'Carbon\\FactoryImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/FactoryImmutable.php',
77
  'Carbon\\Language' => $vendorDir . '/nesbot/carbon/src/Carbon/Language.php',
667
  'Composer\\Util\\Hg' => $vendorDir . '/composer/composer/src/Composer/Util/Hg.php',
668
  'Composer\\Util\\IniHelper' => $vendorDir . '/composer/composer/src/Composer/Util/IniHelper.php',
669
  'Composer\\Util\\NoProxyPattern' => $vendorDir . '/composer/composer/src/Composer/Util/NoProxyPattern.php',
670
+ 'Composer\\Util\\PackageSorter' => $vendorDir . '/composer/composer/src/Composer/Util/PackageSorter.php',
671
  'Composer\\Util\\Perforce' => $vendorDir . '/composer/composer/src/Composer/Util/Perforce.php',
672
  'Composer\\Util\\Platform' => $vendorDir . '/composer/composer/src/Composer/Util/Platform.php',
673
  'Composer\\Util\\ProcessExecutor' => $vendorDir . '/composer/composer/src/Composer/Util/ProcessExecutor.php',
678
  'Composer\\Util\\Svn' => $vendorDir . '/composer/composer/src/Composer/Util/Svn.php',
679
  'Composer\\Util\\TlsHelper' => $vendorDir . '/composer/composer/src/Composer/Util/TlsHelper.php',
680
  'Composer\\Util\\Url' => $vendorDir . '/composer/composer/src/Composer/Util/Url.php',
681
+ 'Composer\\Util\\Zip' => $vendorDir . '/composer/composer/src/Composer/Util/Zip.php',
682
  'Composer\\XdebugHandler' => $vendorDir . '/composer/composer/src/Composer/XdebugHandler.php',
683
  'Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php',
684
  'Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php',
1042
  'Illuminate\\Contracts\\Queue\\QueueableEntity' => $vendorDir . '/illuminate/contracts/Queue/QueueableEntity.php',
1043
  'Illuminate\\Contracts\\Queue\\ShouldQueue' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueue.php',
1044
  'Illuminate\\Contracts\\Redis\\Connection' => $vendorDir . '/illuminate/contracts/Redis/Connection.php',
1045
+ 'Illuminate\\Contracts\\Redis\\Connector' => $vendorDir . '/illuminate/contracts/Redis/Connector.php',
1046
  'Illuminate\\Contracts\\Redis\\Factory' => $vendorDir . '/illuminate/contracts/Redis/Factory.php',
1047
  'Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => $vendorDir . '/illuminate/contracts/Redis/LimiterTimeoutException.php',
1048
  'Illuminate\\Contracts\\Routing\\BindingRegistrar' => $vendorDir . '/illuminate/contracts/Routing/BindingRegistrar.php',
common/vendor/composer/autoload_framework_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_framework_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit3f9295fed24f82a64f823d62040363aa
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit3f9295fed24f82a64f823d62040363aa
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit3f9295fed24f82a64f823d62040363aa', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit3f9295fed24f82a64f823d62040363aa', 'loadClassLoader'));
25
 
26
  $classMap = require __DIR__ . '/autoload_framework_classmap.php';
27
  if ($classMap) {
2
 
3
  // autoload_framework_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit1f26aac0a5c1887bcdab775a0f87f83f
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit1f26aac0a5c1887bcdab775a0f87f83f', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit1f26aac0a5c1887bcdab775a0f87f83f', 'loadClassLoader'));
25
 
26
  $classMap = require __DIR__ . '/autoload_framework_classmap.php';
27
  if ($classMap) {
common/vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInitbcbc363bc013de3b66adfafccda907b0
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInitbcbc363bc013de3b66adfafccda907b0
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInitbcbc363bc013de3b66adfafccda907b0', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInitbcbc363bc013de3b66adfafccda907b0', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInitbcbc363bc013de3b66adfafccda907b0::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInite58475742c7836da432d03f1c8e41b6c
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInite58475742c7836da432d03f1c8e41b6c', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInite58475742c7836da432d03f1c8e41b6c', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
+ call_user_func(\Composer\Autoload\ComposerStaticInite58475742c7836da432d03f1c8e41b6c::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
common/vendor/composer/autoload_real_52.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
- class ComposerAutoloaderInita1cb95a067a388b281296448d37e9293 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
@@ -19,9 +19,9 @@ class ComposerAutoloaderInita1cb95a067a388b281296448d37e9293 {
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInita1cb95a067a388b281296448d37e9293', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInita1cb95a067a388b281296448d37e9293', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
+ class ComposerAutoloaderInit4aaa34538b97318bfd1cb8ada46cad01 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit4aaa34538b97318bfd1cb8ada46cad01', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit4aaa34538b97318bfd1cb8ada46cad01', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
common/vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInitbcbc363bc013de3b66adfafccda907b0
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'T' =>
@@ -66,10 +66,10 @@ class ComposerStaticInitbcbc363bc013de3b66adfafccda907b0
66
  public static function getInitializer(ClassLoader $loader)
67
  {
68
  return \Closure::bind(function () use ($loader) {
69
- $loader->prefixLengthsPsr4 = ComposerStaticInitbcbc363bc013de3b66adfafccda907b0::$prefixLengthsPsr4;
70
- $loader->prefixDirsPsr4 = ComposerStaticInitbcbc363bc013de3b66adfafccda907b0::$prefixDirsPsr4;
71
- $loader->prefixesPsr0 = ComposerStaticInitbcbc363bc013de3b66adfafccda907b0::$prefixesPsr0;
72
- $loader->classMap = ComposerStaticInitbcbc363bc013de3b66adfafccda907b0::$classMap;
73
 
74
  }, null, ClassLoader::class);
75
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInite58475742c7836da432d03f1c8e41b6c
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'T' =>
66
  public static function getInitializer(ClassLoader $loader)
67
  {
68
  return \Closure::bind(function () use ($loader) {
69
+ $loader->prefixLengthsPsr4 = ComposerStaticInite58475742c7836da432d03f1c8e41b6c::$prefixLengthsPsr4;
70
+ $loader->prefixDirsPsr4 = ComposerStaticInite58475742c7836da432d03f1c8e41b6c::$prefixDirsPsr4;
71
+ $loader->prefixesPsr0 = ComposerStaticInite58475742c7836da432d03f1c8e41b6c::$prefixesPsr0;
72
+ $loader->classMap = ComposerStaticInite58475742c7836da432d03f1c8e41b6c::$classMap;
73
 
74
  }, null, ClassLoader::class);
75
  }
lang/the-events-calendar-el.mo CHANGED
Binary file
lang/the-events-calendar-it_IT.mo CHANGED
Binary file
lang/the-events-calendar.pot CHANGED
@@ -2,14 +2,14 @@
2
  # This file is distributed under the same license as the The Events Calendar package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: The Events Calendar 4.9.5\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/the-events-"
7
  "calendar\n"
8
- "POT-Creation-Date: 2019-07-24 15:19:43+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "PO-Revision-Date: 2019-07-24 15:19\n"
13
  "Last-Translator: \n"
14
  "Language-Team: \n"
15
 
@@ -174,50 +174,50 @@ msgctxt "%s Event count in admin list"
174
  msgid "All %s"
175
  msgstr ""
176
 
177
- #: src/Tribe/Aggregator/API/Origins.php:31
178
- #: src/Tribe/Aggregator/Admin_Bar.php:97 src/Tribe/Aggregator/Service.php:781
179
  msgid "CSV File"
180
  msgstr ""
181
 
182
- #: src/Tribe/Aggregator/API/Origins.php:36
183
  #: src/Tribe/Aggregator/Record/Eventbrite.php:88
184
- #: src/admin-views/aggregator/settings.php:629
185
  #: src/admin-views/aggregator/status.php:181
186
- #: src/admin-views/tribe-options-addons-api.php:70
187
  msgid "Eventbrite"
188
  msgstr ""
189
 
190
- #: src/Tribe/Aggregator/API/Origins.php:42
191
  #: src/Tribe/Aggregator/Record/gCal.php:14
192
  #: src/Tribe/Editor/Blocks/Event_Links.php:26 src/Tribe/iCal.php:109
193
- #: src/admin-views/aggregator/settings.php:617
194
  msgid "Google Calendar"
195
  msgstr ""
196
 
197
- #: src/Tribe/Aggregator/API/Origins.php:48
198
  #: src/Tribe/Aggregator/Record/iCal.php:14
199
- #: src/admin-views/aggregator/settings.php:609
200
  msgid "iCalendar"
201
  msgstr ""
202
 
203
- #: src/Tribe/Aggregator/API/Origins.php:54
204
- #: src/admin-views/aggregator/settings.php:613
205
  msgid "ICS File"
206
  msgstr ""
207
 
208
- #: src/Tribe/Aggregator/API/Origins.php:60
209
  #: src/Tribe/Aggregator/Record/Meetup.php:40
210
- #: src/admin-views/aggregator/settings.php:621
211
- #: src/admin-views/aggregator/status.php:203
212
- #: src/admin-views/tribe-options-addons-api.php:16
213
  msgid "Meetup"
214
  msgstr ""
215
 
216
- #: src/Tribe/Aggregator/API/Origins.php:66
217
  msgid "Other URL (beta)"
218
  msgstr ""
219
 
220
- #: src/Tribe/Aggregator/API/Origins.php:235 src/Tribe/Aggregator.php:227
221
  msgid "Event Aggregator"
222
  msgstr ""
223
 
@@ -271,7 +271,7 @@ msgid ""
271
  "The image associated with your event could not be attached to the event."
272
  msgstr ""
273
 
274
- #: src/Tribe/Aggregator/Errors.php:46 src/Tribe/Aggregator/Service.php:696
275
  msgid ""
276
  "The daily limit of %d import requests to the Event Aggregator service has "
277
  "been reached. Please try again later."
@@ -349,8 +349,8 @@ msgid ""
349
  "Licenses before using this service."
350
  msgstr ""
351
 
352
- #: src/Tribe/Aggregator/Errors.php:64 src/Tribe/Aggregator/Service.php:215
353
- #: src/Tribe/Aggregator/Service.php:222
354
  msgid ""
355
  "There may be an issue with the Event Aggregator server. Please try your "
356
  "import again later."
@@ -648,7 +648,7 @@ msgid ""
648
  msgstr ""
649
 
650
  #: src/Tribe/Aggregator/Record/CSV.php:75
651
- #: src/admin-views/aggregator/settings.php:605
652
  #: src/deprecated/Tribe__Events__Importer__Admin_Page.php:239
653
  msgid "CSV"
654
  msgstr ""
@@ -1012,38 +1012,38 @@ msgid_plural "Draft <span class=\"count\">(%s)</span>"
1012
  msgstr[0] ""
1013
  msgstr[1] ""
1014
 
1015
- #: src/Tribe/Aggregator/Service.php:198
1016
  msgid ""
1017
  "Connection timed out while transferring the feed. If you are dealing with "
1018
  "large feeds you may need to customize the "
1019
  "tribe_aggregator_connection_timeout filter."
1020
  msgstr ""
1021
 
1022
- #: src/Tribe/Aggregator/Service.php:207
1023
  msgid ""
1024
  "Event Aggregator server has blocked your request. Please try your import "
1025
  "again later or contact support to know why."
1026
  msgstr ""
1027
 
1028
- #: src/Tribe/Aggregator/Service.php:235
1029
  msgid ""
1030
  "The response from the Event Aggregator server was badly formed and could not "
1031
  "be understood. Please try again."
1032
  msgstr ""
1033
 
1034
- #: src/Tribe/Aggregator/Service.php:679
1035
  msgid "the UID part of the iCalendar Specification"
1036
  msgstr ""
1037
 
1038
- #: src/Tribe/Aggregator/Service.php:683
1039
  msgid "Sorry, but something went wrong. Please try again."
1040
  msgstr ""
1041
 
1042
- #: src/Tribe/Aggregator/Service.php:684
1043
  msgid "Events could not be imported. The import parameters were invalid."
1044
  msgstr ""
1045
 
1046
- #: src/Tribe/Aggregator/Service.php:685
1047
  msgid ""
1048
  "Events cannot be imported because Eventbrite has returned an error. This "
1049
  "could mean that the event ID does not exist, the event or source is marked "
@@ -1053,98 +1053,98 @@ msgid ""
1053
  "in our knowledgebase</a>."
1054
  msgstr ""
1055
 
1056
- #: src/Tribe/Aggregator/Service.php:686
1057
  msgid "No upcoming Eventbrite events found."
1058
  msgstr ""
1059
 
1060
- #: src/Tribe/Aggregator/Service.php:687
1061
  msgid "The URL provided could not be reached."
1062
  msgstr ""
1063
 
1064
- #: src/Tribe/Aggregator/Service.php:688
1065
  msgid "The URL provided failed to load."
1066
  msgstr ""
1067
 
1068
- #: src/Tribe/Aggregator/Service.php:689
1069
  msgid "The image associated with your event could not be imported."
1070
  msgstr ""
1071
 
1072
- #: src/Tribe/Aggregator/Service.php:690
1073
  msgid ""
1074
  "The image associated with your event is not accessible with your API key."
1075
  msgstr ""
1076
 
1077
- #: src/Tribe/Aggregator/Service.php:691
1078
  msgid ""
1079
  "The import failed for an unknown reason. Please try again. If the problem "
1080
  "persists, please contact support."
1081
  msgstr ""
1082
 
1083
- #: src/Tribe/Aggregator/Service.php:692
1084
  msgid ""
1085
  "Events could not be imported. The URL provided did not have events in the "
1086
  "proper format."
1087
  msgstr ""
1088
 
1089
- #: src/Tribe/Aggregator/Service.php:693
1090
  msgid ""
1091
  "The file provided could not be opened. Please confirm that it is a properly "
1092
  "formatted .ics file."
1093
  msgstr ""
1094
 
1095
- #: src/Tribe/Aggregator/Service.php:694
1096
  msgid "Your Meetup API key is invalid."
1097
  msgstr ""
1098
 
1099
- #: src/Tribe/Aggregator/Service.php:695
1100
  msgid ""
1101
  "Event Aggregator cannot reach Meetup.com because you exceeded the request "
1102
  "limit for your Meetup API key."
1103
  msgstr ""
1104
 
1105
- #: src/Tribe/Aggregator/Service.php:697
1106
  msgid "The import is in progress."
1107
  msgstr ""
1108
 
1109
- #: src/Tribe/Aggregator/Service.php:698
1110
  msgid "The import will be starting soon."
1111
  msgstr ""
1112
 
1113
- #: src/Tribe/Aggregator/Service.php:699
1114
  msgid "Success"
1115
  msgstr ""
1116
 
1117
- #: src/Tribe/Aggregator/Service.php:700
1118
  msgid "Import created"
1119
  msgstr ""
1120
 
1121
- #: src/Tribe/Aggregator/Service.php:701
1122
  msgid "Successfully fetched Eventbrite Token"
1123
  msgstr ""
1124
 
1125
- #: src/Tribe/Aggregator/Service.php:702
1126
  msgid "Successfully loaded import origins"
1127
  msgstr ""
1128
 
1129
- #: src/Tribe/Aggregator/Service.php:703
1130
  msgid "Import is complete"
1131
  msgstr ""
1132
 
1133
- #: src/Tribe/Aggregator/Service.php:704
1134
  msgid "Import queued"
1135
  msgstr ""
1136
 
1137
- #: src/Tribe/Aggregator/Service.php:705
1138
  msgid "Events could not be imported. The URL provided could not be reached."
1139
  msgstr ""
1140
 
1141
- #: src/Tribe/Aggregator/Service.php:706
1142
  msgid ""
1143
  "The requested source does not have any upcoming and published events "
1144
  "matching the search criteria."
1145
  msgstr ""
1146
 
1147
- #: src/Tribe/Aggregator/Service.php:708
1148
  msgctxt ""
1149
  "The placeholder is for the localized version of the iCal UID specification "
1150
  "link"
@@ -1156,7 +1156,7 @@ msgid ""
1156
  "help them more quickly resolve their feed's UID issue."
1157
  msgstr ""
1158
 
1159
- #: src/Tribe/Aggregator/Service.php:716
1160
  msgctxt ""
1161
  "The placeholder is for the localized version of the iCal UID specification "
1162
  "link"
@@ -1168,83 +1168,83 @@ msgid ""
1168
  "help them more quickly resolve their feed's UID issue."
1169
  msgstr ""
1170
 
1171
- #: src/Tribe/Aggregator/Service.php:738
1172
  msgid "Unknown service message"
1173
  msgstr ""
1174
 
1175
- #: src/Tribe/Aggregator/Settings.php:357
1176
  msgid "By date range"
1177
  msgstr ""
1178
 
1179
- #: src/Tribe/Aggregator/Settings.php:358
1180
  msgid "By number of events"
1181
  msgstr ""
1182
 
1183
- #: src/Tribe/Aggregator/Settings.php:359
1184
  msgid "Do not limit (not recommended)"
1185
  msgstr ""
1186
 
1187
- #: src/Tribe/Aggregator/Settings.php:386 src/Tribe/Aggregator/Settings.php:387
1188
  msgid "24 hours"
1189
  msgstr ""
1190
 
1191
- #: src/Tribe/Aggregator/Settings.php:390 src/Tribe/Aggregator/Settings.php:391
1192
  msgid "72 hours"
1193
  msgstr ""
1194
 
1195
- #: src/Tribe/Aggregator/Settings.php:394
1196
  msgid "One week"
1197
  msgstr ""
1198
 
1199
- #: src/Tribe/Aggregator/Settings.php:395
1200
  msgid "one week"
1201
  msgstr ""
1202
 
1203
- #: src/Tribe/Aggregator/Settings.php:398
1204
  msgid "Two weeks"
1205
  msgstr ""
1206
 
1207
- #: src/Tribe/Aggregator/Settings.php:399
1208
  msgid "two weeks"
1209
  msgstr ""
1210
 
1211
- #: src/Tribe/Aggregator/Settings.php:402
1212
  msgid "Three weeks"
1213
  msgstr ""
1214
 
1215
- #: src/Tribe/Aggregator/Settings.php:403
1216
  msgid "three weeks"
1217
  msgstr ""
1218
 
1219
- #: src/Tribe/Aggregator/Settings.php:406
1220
  msgid "One month"
1221
  msgstr ""
1222
 
1223
- #: src/Tribe/Aggregator/Settings.php:407
1224
  msgid "one month"
1225
  msgstr ""
1226
 
1227
- #: src/Tribe/Aggregator/Settings.php:410
1228
  msgid "Two months"
1229
  msgstr ""
1230
 
1231
- #: src/Tribe/Aggregator/Settings.php:411
1232
  msgid "two months"
1233
  msgstr ""
1234
 
1235
- #: src/Tribe/Aggregator/Settings.php:414
1236
  msgid "Three months"
1237
  msgstr ""
1238
 
1239
- #: src/Tribe/Aggregator/Settings.php:415
1240
  msgid "three months"
1241
  msgstr ""
1242
 
1243
- #: src/Tribe/Aggregator/Settings.php:699
1244
  msgid "Asynchronous"
1245
  msgstr ""
1246
 
1247
- #: src/Tribe/Aggregator/Settings.php:703
1248
  msgid "Cron-based"
1249
  msgstr ""
1250
 
@@ -1929,7 +1929,6 @@ msgid "You are using a custom Google Maps API key."
1929
  msgstr ""
1930
 
1931
  #: src/Tribe/Google/Maps_API_Key.php:55 src/Tribe/Google/Maps_API_Key.php:108
1932
- #: src/admin-views/tribe-options-addons-api.php:25
1933
  msgid "Click here"
1934
  msgstr ""
1935
 
@@ -2503,7 +2502,7 @@ msgstr ""
2503
  msgid "Upcoming Events"
2504
  msgstr ""
2505
 
2506
- #. #-#-#-#-# the-events-calendar.pot (The Events Calendar 4.9.5) #-#-#-#-#
2507
  #. Plugin Name of the plugin/theme
2508
  #: src/Tribe/Main.php:904 src/Tribe/Main.php:1258 src/Tribe/Privacy.php:29
2509
  #: src/functions/template-tags/general.php:1357 the-events-calendar.php:56
@@ -4665,8 +4664,8 @@ msgid "Filters"
4665
  msgstr ""
4666
 
4667
  #: src/admin-views/admin-update-message.php:61
4668
- #: src/admin-views/aggregator/settings.php:710
4669
- #: src/admin-views/aggregator/settings.php:750
4670
  msgid "Imports"
4671
  msgstr ""
4672
 
@@ -4893,7 +4892,7 @@ msgstr ""
4893
  #: src/admin-views/aggregator/origins/gcal.php:114
4894
  #: src/admin-views/aggregator/origins/ical.php:108
4895
  #: src/admin-views/aggregator/origins/ics.php:51
4896
- #: src/admin-views/aggregator/origins/meetup.php:162
4897
  #: src/admin-views/aggregator/origins/url.php:119
4898
  #: src/deprecated/facebook.php:140
4899
  msgid "Preview"
@@ -4953,8 +4952,8 @@ msgstr ""
4953
  #: src/admin-views/aggregator/origins/gcal.php:37
4954
  #: src/admin-views/aggregator/origins/ical.php:25
4955
  #: src/admin-views/aggregator/origins/ical.php:37
4956
- #: src/admin-views/aggregator/origins/meetup.php:80
4957
- #: src/admin-views/aggregator/origins/meetup.php:92
4958
  #: src/admin-views/aggregator/origins/url.php:25
4959
  #: src/admin-views/aggregator/origins/url.php:37 src/deprecated/facebook.php:55
4960
  #: src/deprecated/facebook.php:67
@@ -4964,7 +4963,7 @@ msgstr ""
4964
  #: src/admin-views/aggregator/origins/eventbrite.php:68
4965
  #: src/admin-views/aggregator/origins/gcal.php:36
4966
  #: src/admin-views/aggregator/origins/ical.php:36
4967
- #: src/admin-views/aggregator/origins/meetup.php:91
4968
  #: src/admin-views/aggregator/origins/url.php:36 src/deprecated/facebook.php:66
4969
  msgid "One-Time Import"
4970
  msgstr ""
@@ -4996,7 +4995,7 @@ msgstr ""
4996
  #: src/admin-views/aggregator/origins/eventbrite.php:158
4997
  #: src/admin-views/aggregator/origins/gcal.php:81
4998
  #: src/admin-views/aggregator/origins/ical.php:82
4999
- #: src/admin-views/aggregator/origins/meetup.php:137
5000
  #: src/admin-views/aggregator/origins/url.php:82
5001
  #: src/admin-views/events-meta-box.php:189 src/deprecated/facebook.php:112
5002
  msgid "URL:"
@@ -5118,37 +5117,25 @@ msgid ""
5118
  "schedule. Single events can be added via a one-time import."
5119
  msgstr ""
5120
 
5121
- #: src/admin-views/aggregator/origins/meetup.php:32
5122
- msgid ""
5123
- "Enter your Meetup API key to import Meetup events. %1$sClick here to get "
5124
- "your Meetup API key%2$s. You only need to do this once, it will be saved "
5125
- "under %3$sEvents &gt; Settings &gt; APIs%4$s"
5126
  msgstr ""
5127
 
5128
- #: src/admin-views/aggregator/origins/meetup.php:47
5129
- msgid ""
5130
- "Your Meetup API key has been saved to %1$sEvents &gt; Settings &gt; APIs%2$s"
5131
  msgstr ""
5132
 
5133
- #: src/admin-views/aggregator/origins/meetup.php:59
5134
- msgid "Meetup API Key:"
5135
- msgstr ""
5136
-
5137
- #: src/admin-views/aggregator/origins/meetup.php:61
5138
- msgid "Save"
5139
- msgstr ""
5140
-
5141
- #: src/admin-views/aggregator/origins/meetup.php:138
5142
  msgid "meetup.com/example"
5143
  msgstr ""
5144
 
5145
- #: src/admin-views/aggregator/origins/meetup.php:139
5146
  msgid ""
5147
  "Enter the url for a Meetup group, page, or individual. You can also enter "
5148
  "the url of a single Meetup event."
5149
  msgstr ""
5150
 
5151
- #: src/admin-views/aggregator/origins/meetup.php:154
5152
  msgid "Invalid Meetup URL"
5153
  msgstr ""
5154
 
@@ -5274,12 +5261,12 @@ msgstr ""
5274
 
5275
  #: src/admin-views/aggregator/settings.php:75
5276
  #: src/admin-views/aggregator/settings.php:135
5277
- #: src/admin-views/aggregator/settings.php:244
5278
- #: src/admin-views/aggregator/settings.php:288
5279
- #: src/admin-views/aggregator/settings.php:332
5280
- #: src/admin-views/aggregator/settings.php:388
5281
- #: src/admin-views/aggregator/settings.php:432
5282
- #: src/admin-views/aggregator/settings.php:511
5283
  msgid "Default Status"
5284
  msgstr ""
5285
 
@@ -5289,12 +5276,12 @@ msgstr ""
5289
 
5290
  #: src/admin-views/aggregator/settings.php:87
5291
  #: src/admin-views/aggregator/settings.php:147
5292
- #: src/admin-views/aggregator/settings.php:256
5293
- #: src/admin-views/aggregator/settings.php:300
5294
- #: src/admin-views/aggregator/settings.php:344
5295
- #: src/admin-views/aggregator/settings.php:400
5296
- #: src/admin-views/aggregator/settings.php:444
5297
- #: src/admin-views/aggregator/settings.php:523
5298
  msgid "Default Event Category"
5299
  msgstr ""
5300
 
@@ -5338,22 +5325,22 @@ msgid "The default event category for events"
5338
  msgstr ""
5339
 
5340
  #: src/admin-views/aggregator/settings.php:159
 
 
 
 
 
 
 
 
 
 
5341
  #: src/admin-views/aggregator/settings.php:268
5342
  #: src/admin-views/aggregator/settings.php:312
5343
  #: src/admin-views/aggregator/settings.php:356
5344
  #: src/admin-views/aggregator/settings.php:412
5345
  #: src/admin-views/aggregator/settings.php:456
5346
  #: src/admin-views/aggregator/settings.php:535
5347
- msgid "Show Map"
5348
- msgstr ""
5349
-
5350
- #: src/admin-views/aggregator/settings.php:160
5351
- #: src/admin-views/aggregator/settings.php:269
5352
- #: src/admin-views/aggregator/settings.php:313
5353
- #: src/admin-views/aggregator/settings.php:357
5354
- #: src/admin-views/aggregator/settings.php:413
5355
- #: src/admin-views/aggregator/settings.php:457
5356
- #: src/admin-views/aggregator/settings.php:536
5357
  msgid "Show map by default on imported event and venues"
5358
  msgstr ""
5359
 
@@ -5368,111 +5355,111 @@ msgid ""
5368
  "time period or a smaller number of events may improve results."
5369
  msgstr ""
5370
 
5371
- #: src/admin-views/aggregator/settings.php:184
5372
- #: src/admin-views/aggregator/settings.php:468
5373
  msgid "Import Date Range Limit"
5374
  msgstr ""
5375
 
5376
- #: src/admin-views/aggregator/settings.php:185
5377
  msgid ""
5378
  "When importing from an event source, this is how far into the future the "
5379
  "events will be fetched; on slower websites a larger date range may impact "
5380
  "the success of imports. Selecting a shorter time period may improve results."
5381
  msgstr ""
5382
 
5383
- #: src/admin-views/aggregator/settings.php:201
5384
  msgid "Import Quantity Limit"
5385
  msgstr ""
5386
 
5387
- #: src/admin-views/aggregator/settings.php:202
5388
  msgid ""
5389
  "When importing from an event source, this is the maximum number of events "
5390
  "that will be imported; on slower websites this may impact the success of "
5391
  "imports. Setting this to a smaller number may improve results."
5392
  msgstr ""
5393
 
5394
- #: src/admin-views/aggregator/settings.php:218
5395
  msgid "Import Process System"
5396
  msgstr ""
5397
 
5398
- #: src/admin-views/aggregator/settings.php:219
5399
  msgid ""
5400
  "The Asynchronous import process is faster and does not rely on WordPress "
5401
  "Cron but might not work correctly in all WordPress installations, try "
5402
  "switching to the Cron-based process for maximum compatibility."
5403
  msgstr ""
5404
 
5405
- #: src/admin-views/aggregator/settings.php:230
5406
  msgid "Stop current processes"
5407
  msgstr ""
5408
 
5409
- #: src/admin-views/aggregator/settings.php:239
5410
  msgid "iCalendar Import Settings"
5411
  msgstr ""
5412
 
5413
- #: src/admin-views/aggregator/settings.php:245
5414
  msgid "The default post status for events imported via iCalendar"
5415
  msgstr ""
5416
 
5417
- #: src/admin-views/aggregator/settings.php:257
5418
  msgid "The default event category for events imported via iCalendar"
5419
  msgstr ""
5420
 
5421
- #: src/admin-views/aggregator/settings.php:283
5422
  msgid "ICS File Import Settings"
5423
  msgstr ""
5424
 
5425
- #: src/admin-views/aggregator/settings.php:289
5426
  msgid "The default post status for events imported via .ics files"
5427
  msgstr ""
5428
 
5429
- #: src/admin-views/aggregator/settings.php:301
5430
  msgid "The default event category for events imported via .ics files"
5431
  msgstr ""
5432
 
5433
- #: src/admin-views/aggregator/settings.php:327
5434
  msgid "Google Calendar Import Settings"
5435
  msgstr ""
5436
 
5437
- #: src/admin-views/aggregator/settings.php:333
5438
  msgid "The default post status for events imported via Google Calendar"
5439
  msgstr ""
5440
 
5441
- #: src/admin-views/aggregator/settings.php:345
5442
  msgid "The default event category for events imported via Google Calendar"
5443
  msgstr ""
5444
 
5445
- #: src/admin-views/aggregator/settings.php:371
5446
  msgid "Meetup Import Settings"
5447
  msgstr ""
5448
 
5449
- #: src/admin-views/aggregator/settings.php:377
5450
  msgid ""
5451
  "To import Meetup events, please be sure to add your Meetup API key on "
5452
  "%1$sEvents > Settings > APIs%2$s"
5453
  msgstr ""
5454
 
5455
- #: src/admin-views/aggregator/settings.php:389
5456
  msgid "The default post status for events imported via Meetup"
5457
  msgstr ""
5458
 
5459
- #: src/admin-views/aggregator/settings.php:401
5460
  msgid "The default event category for events imported via Meetup"
5461
  msgstr ""
5462
 
5463
- #: src/admin-views/aggregator/settings.php:427
5464
  msgid "Other URL Import Settings"
5465
  msgstr ""
5466
 
5467
- #: src/admin-views/aggregator/settings.php:433
5468
  msgid "The default post status for events imported via other URLs"
5469
  msgstr ""
5470
 
5471
- #: src/admin-views/aggregator/settings.php:445
5472
  msgid "The default event category for events imported via other URLs"
5473
  msgstr ""
5474
 
5475
- #: src/admin-views/aggregator/settings.php:469
5476
  msgid ""
5477
  "When importing from a website that uses The Events Calendar, the REST API "
5478
  "will attempt to fetch events this far in the future. That website's hosting "
@@ -5480,46 +5467,46 @@ msgid ""
5480
  "may improve results."
5481
  msgstr ""
5482
 
5483
- #: src/admin-views/aggregator/settings.php:480
5484
  msgid "Import Event Settings"
5485
  msgstr ""
5486
 
5487
- #: src/admin-views/aggregator/settings.php:481
5488
  msgid ""
5489
  "Fetch source event's settings (e.g. Show Maps Link or Sticky in Month View) "
5490
  "when importing from another site using The Events Calendar."
5491
  msgstr ""
5492
 
5493
- #: src/admin-views/aggregator/settings.php:493
5494
  #: src/admin-views/aggregator/tabs/import-form.php:16
5495
  msgid "(do not override)"
5496
  msgstr ""
5497
 
5498
- #: src/admin-views/aggregator/settings.php:506
5499
  msgid "Eventbrite Import Settings"
5500
  msgstr ""
5501
 
5502
- #: src/admin-views/aggregator/settings.php:512
5503
  msgid "The default post status for events imported via Eventbrite"
5504
  msgstr ""
5505
 
5506
- #: src/admin-views/aggregator/settings.php:524
5507
  msgid "The default event category for events imported via Eventbrite"
5508
  msgstr ""
5509
 
5510
- #: src/admin-views/aggregator/settings.php:597
5511
  msgid "Update Authority"
5512
  msgstr ""
5513
 
5514
- #: src/admin-views/aggregator/settings.php:601
5515
  msgid "Global"
5516
  msgstr ""
5517
 
5518
- #: src/admin-views/aggregator/settings.php:625
5519
  msgid "Other URLs"
5520
  msgstr ""
5521
 
5522
- #: src/admin-views/aggregator/settings.php:672
5523
  msgid ""
5524
  "Use the options below to configure your imports. Global Import Settings "
5525
  "apply to all imports, but you can also override the global settings by "
@@ -5527,17 +5514,17 @@ msgid ""
5527
  "Status on the %1$s."
5528
  msgstr ""
5529
 
5530
- #: src/admin-views/aggregator/settings.php:676
5531
  msgid "Help page"
5532
  msgstr ""
5533
 
5534
- #: src/admin-views/aggregator/settings.php:696
5535
  msgid ""
5536
  "Use the options below to configure your imports. Looking for more ways to "
5537
  "import events from other websites?"
5538
  msgstr ""
5539
 
5540
- #: src/admin-views/aggregator/settings.php:697
5541
  msgid "Check out Event Aggregator."
5542
  msgstr ""
5543
 
@@ -5653,19 +5640,21 @@ msgid "Limited connectivity with Eventbrite"
5653
  msgstr ""
5654
 
5655
  #: src/admin-views/aggregator/status.php:176
 
5656
  msgid "The service has disabled oAuth. Some types of events may not import."
5657
  msgstr ""
5658
 
5659
- #: src/admin-views/aggregator/status.php:191
5660
- msgid "API key entered"
5661
  msgstr ""
5662
 
5663
- #: src/admin-views/aggregator/status.php:195
5664
- msgid "You have not entered a Meetup API key"
 
5665
  msgstr ""
5666
 
5667
- #: src/admin-views/aggregator/status.php:197
5668
- msgid "Enter your API key"
5669
  msgstr ""
5670
 
5671
  #: src/admin-views/aggregator/tabs/import-form.php:31
@@ -6143,50 +6132,61 @@ msgid ""
6143
  "to these external services. These services may be located abroad."
6144
  msgstr ""
6145
 
6146
- #: src/admin-views/tribe-options-addons-api.php:20
6147
- msgid "You need a Meetup API Key to import your events from Meetup."
 
 
 
 
6148
  msgstr ""
6149
 
6150
  #: src/admin-views/tribe-options-addons-api.php:24
6151
- msgid "Meetup API Key"
6152
  msgstr ""
6153
 
6154
- #: src/admin-views/tribe-options-addons-api.php:25
6155
- msgid "%s to view your Meetup API Key"
6156
  msgstr ""
6157
 
6158
- #: src/admin-views/tribe-options-addons-api.php:45
6159
- msgid "Eventbrite Token"
 
6160
  msgstr ""
6161
 
6162
  #: src/admin-views/tribe-options-addons-api.php:49
 
 
 
 
 
 
 
 
 
 
6163
  msgid "You need to connect to Eventbrite for Event Aggregator to work properly"
6164
  msgstr ""
6165
 
6166
- #: src/admin-views/tribe-options-addons-api.php:50
6167
  msgid "Connect to Eventbrite"
6168
  msgstr ""
6169
 
6170
- #: src/admin-views/tribe-options-addons-api.php:52
6171
  msgid "Refresh your connection to Eventbrite"
6172
  msgstr ""
6173
 
6174
- #: src/admin-views/tribe-options-addons-api.php:53
6175
- msgid "Disconnect"
6176
- msgstr ""
6177
-
6178
- #: src/admin-views/tribe-options-addons-api.php:74
6179
  msgid ""
6180
  "You need to connect Event Aggregator to Eventbrite to import your events "
6181
  "from Eventbrite."
6182
  msgstr ""
6183
 
6184
- #: src/admin-views/tribe-options-addons-api.php:95
6185
- #: src/admin-views/tribe-options-addons-api.php:135
6186
  msgid "APIs"
6187
  msgstr ""
6188
 
6189
- #: src/admin-views/tribe-options-addons-api.php:99
6190
  msgid ""
6191
  "Some features and add-ons require you to enter an API key or log into a "
6192
  "third-party website so that The Events Calendar can communicate with an "
2
  # This file is distributed under the same license as the The Events Calendar package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: The Events Calendar 4.9.6\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/the-events-"
7
  "calendar\n"
8
+ "POT-Creation-Date: 2019-08-07 19:15:21+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "PO-Revision-Date: 2019-08-07 19:15\n"
13
  "Last-Translator: \n"
14
  "Language-Team: \n"
15
 
174
  msgid "All %s"
175
  msgstr ""
176
 
177
+ #: src/Tribe/Aggregator/API/Origins.php:36
178
+ #: src/Tribe/Aggregator/Admin_Bar.php:97 src/Tribe/Aggregator/Service.php:796
179
  msgid "CSV File"
180
  msgstr ""
181
 
182
+ #: src/Tribe/Aggregator/API/Origins.php:41
183
  #: src/Tribe/Aggregator/Record/Eventbrite.php:88
184
+ #: src/admin-views/aggregator/settings.php:628
185
  #: src/admin-views/aggregator/status.php:181
186
+ #: src/admin-views/tribe-options-addons-api.php:97
187
  msgid "Eventbrite"
188
  msgstr ""
189
 
190
+ #: src/Tribe/Aggregator/API/Origins.php:47
191
  #: src/Tribe/Aggregator/Record/gCal.php:14
192
  #: src/Tribe/Editor/Blocks/Event_Links.php:26 src/Tribe/iCal.php:109
193
+ #: src/admin-views/aggregator/settings.php:616
194
  msgid "Google Calendar"
195
  msgstr ""
196
 
197
+ #: src/Tribe/Aggregator/API/Origins.php:53
198
  #: src/Tribe/Aggregator/Record/iCal.php:14
199
+ #: src/admin-views/aggregator/settings.php:608
200
  msgid "iCalendar"
201
  msgstr ""
202
 
203
+ #: src/Tribe/Aggregator/API/Origins.php:59
204
+ #: src/admin-views/aggregator/settings.php:612
205
  msgid "ICS File"
206
  msgstr ""
207
 
208
+ #: src/Tribe/Aggregator/API/Origins.php:65
209
  #: src/Tribe/Aggregator/Record/Meetup.php:40
210
+ #: src/admin-views/aggregator/settings.php:620
211
+ #: src/admin-views/aggregator/status.php:208
212
+ #: src/admin-views/tribe-options-addons-api.php:45
213
  msgid "Meetup"
214
  msgstr ""
215
 
216
+ #: src/Tribe/Aggregator/API/Origins.php:71
217
  msgid "Other URL (beta)"
218
  msgstr ""
219
 
220
+ #: src/Tribe/Aggregator/API/Origins.php:227 src/Tribe/Aggregator.php:227
221
  msgid "Event Aggregator"
222
  msgstr ""
223
 
271
  "The image associated with your event could not be attached to the event."
272
  msgstr ""
273
 
274
+ #: src/Tribe/Aggregator/Errors.php:46 src/Tribe/Aggregator/Service.php:706
275
  msgid ""
276
  "The daily limit of %d import requests to the Event Aggregator service has "
277
  "been reached. Please try again later."
349
  "Licenses before using this service."
350
  msgstr ""
351
 
352
+ #: src/Tribe/Aggregator/Errors.php:64 src/Tribe/Aggregator/Service.php:224
353
+ #: src/Tribe/Aggregator/Service.php:231
354
  msgid ""
355
  "There may be an issue with the Event Aggregator server. Please try your "
356
  "import again later."
648
  msgstr ""
649
 
650
  #: src/Tribe/Aggregator/Record/CSV.php:75
651
+ #: src/admin-views/aggregator/settings.php:604
652
  #: src/deprecated/Tribe__Events__Importer__Admin_Page.php:239
653
  msgid "CSV"
654
  msgstr ""
1012
  msgstr[0] ""
1013
  msgstr[1] ""
1014
 
1015
+ #: src/Tribe/Aggregator/Service.php:207
1016
  msgid ""
1017
  "Connection timed out while transferring the feed. If you are dealing with "
1018
  "large feeds you may need to customize the "
1019
  "tribe_aggregator_connection_timeout filter."
1020
  msgstr ""
1021
 
1022
+ #: src/Tribe/Aggregator/Service.php:216
1023
  msgid ""
1024
  "Event Aggregator server has blocked your request. Please try your import "
1025
  "again later or contact support to know why."
1026
  msgstr ""
1027
 
1028
+ #: src/Tribe/Aggregator/Service.php:244
1029
  msgid ""
1030
  "The response from the Event Aggregator server was badly formed and could not "
1031
  "be understood. Please try again."
1032
  msgstr ""
1033
 
1034
+ #: src/Tribe/Aggregator/Service.php:688
1035
  msgid "the UID part of the iCalendar Specification"
1036
  msgstr ""
1037
 
1038
+ #: src/Tribe/Aggregator/Service.php:693
1039
  msgid "Sorry, but something went wrong. Please try again."
1040
  msgstr ""
1041
 
1042
+ #: src/Tribe/Aggregator/Service.php:694
1043
  msgid "Events could not be imported. The import parameters were invalid."
1044
  msgstr ""
1045
 
1046
+ #: src/Tribe/Aggregator/Service.php:695
1047
  msgid ""
1048
  "Events cannot be imported because Eventbrite has returned an error. This "
1049
  "could mean that the event ID does not exist, the event or source is marked "
1053
  "in our knowledgebase</a>."
1054
  msgstr ""
1055
 
1056
+ #: src/Tribe/Aggregator/Service.php:696
1057
  msgid "No upcoming Eventbrite events found."
1058
  msgstr ""
1059
 
1060
+ #: src/Tribe/Aggregator/Service.php:697
1061
  msgid "The URL provided could not be reached."
1062
  msgstr ""
1063
 
1064
+ #: src/Tribe/Aggregator/Service.php:698
1065
  msgid "The URL provided failed to load."
1066
  msgstr ""
1067
 
1068
+ #: src/Tribe/Aggregator/Service.php:699
1069
  msgid "The image associated with your event could not be imported."
1070
  msgstr ""
1071
 
1072
+ #: src/Tribe/Aggregator/Service.php:700
1073
  msgid ""
1074
  "The image associated with your event is not accessible with your API key."
1075
  msgstr ""
1076
 
1077
+ #: src/Tribe/Aggregator/Service.php:701
1078
  msgid ""
1079
  "The import failed for an unknown reason. Please try again. If the problem "
1080
  "persists, please contact support."
1081
  msgstr ""
1082
 
1083
+ #: src/Tribe/Aggregator/Service.php:702
1084
  msgid ""
1085
  "Events could not be imported. The URL provided did not have events in the "
1086
  "proper format."
1087
  msgstr ""
1088
 
1089
+ #: src/Tribe/Aggregator/Service.php:703
1090
  msgid ""
1091
  "The file provided could not be opened. Please confirm that it is a properly "
1092
  "formatted .ics file."
1093
  msgstr ""
1094
 
1095
+ #: src/Tribe/Aggregator/Service.php:704
1096
  msgid "Your Meetup API key is invalid."
1097
  msgstr ""
1098
 
1099
+ #: src/Tribe/Aggregator/Service.php:705
1100
  msgid ""
1101
  "Event Aggregator cannot reach Meetup.com because you exceeded the request "
1102
  "limit for your Meetup API key."
1103
  msgstr ""
1104
 
1105
+ #: src/Tribe/Aggregator/Service.php:708
1106
  msgid "The import is in progress."
1107
  msgstr ""
1108
 
1109
+ #: src/Tribe/Aggregator/Service.php:710
1110
  msgid "The import will be starting soon."
1111
  msgstr ""
1112
 
1113
+ #: src/Tribe/Aggregator/Service.php:712
1114
  msgid "Success"
1115
  msgstr ""
1116
 
1117
+ #: src/Tribe/Aggregator/Service.php:713
1118
  msgid "Import created"
1119
  msgstr ""
1120
 
1121
+ #: src/Tribe/Aggregator/Service.php:714
1122
  msgid "Successfully fetched Eventbrite Token"
1123
  msgstr ""
1124
 
1125
+ #: src/Tribe/Aggregator/Service.php:715
1126
  msgid "Successfully loaded import origins"
1127
  msgstr ""
1128
 
1129
+ #: src/Tribe/Aggregator/Service.php:716
1130
  msgid "Import is complete"
1131
  msgstr ""
1132
 
1133
+ #: src/Tribe/Aggregator/Service.php:717
1134
  msgid "Import queued"
1135
  msgstr ""
1136
 
1137
+ #: src/Tribe/Aggregator/Service.php:718
1138
  msgid "Events could not be imported. The URL provided could not be reached."
1139
  msgstr ""
1140
 
1141
+ #: src/Tribe/Aggregator/Service.php:719
1142
  msgid ""
1143
  "The requested source does not have any upcoming and published events "
1144
  "matching the search criteria."
1145
  msgstr ""
1146
 
1147
+ #: src/Tribe/Aggregator/Service.php:721
1148
  msgctxt ""
1149
  "The placeholder is for the localized version of the iCal UID specification "
1150
  "link"
1156
  "help them more quickly resolve their feed's UID issue."
1157
  msgstr ""
1158
 
1159
+ #: src/Tribe/Aggregator/Service.php:730
1160
  msgctxt ""
1161
  "The placeholder is for the localized version of the iCal UID specification "
1162
  "link"
1168
  "help them more quickly resolve their feed's UID issue."
1169
  msgstr ""
1170
 
1171
+ #: src/Tribe/Aggregator/Service.php:752
1172
  msgid "Unknown service message"
1173
  msgstr ""
1174
 
1175
+ #: src/Tribe/Aggregator/Settings.php:507
1176
  msgid "By date range"
1177
  msgstr ""
1178
 
1179
+ #: src/Tribe/Aggregator/Settings.php:508
1180
  msgid "By number of events"
1181
  msgstr ""
1182
 
1183
+ #: src/Tribe/Aggregator/Settings.php:509
1184
  msgid "Do not limit (not recommended)"
1185
  msgstr ""
1186
 
1187
+ #: src/Tribe/Aggregator/Settings.php:536 src/Tribe/Aggregator/Settings.php:537
1188
  msgid "24 hours"
1189
  msgstr ""
1190
 
1191
+ #: src/Tribe/Aggregator/Settings.php:540 src/Tribe/Aggregator/Settings.php:541
1192
  msgid "72 hours"
1193
  msgstr ""
1194
 
1195
+ #: src/Tribe/Aggregator/Settings.php:544
1196
  msgid "One week"
1197
  msgstr ""
1198
 
1199
+ #: src/Tribe/Aggregator/Settings.php:545
1200
  msgid "one week"
1201
  msgstr ""
1202
 
1203
+ #: src/Tribe/Aggregator/Settings.php:548
1204
  msgid "Two weeks"
1205
  msgstr ""
1206
 
1207
+ #: src/Tribe/Aggregator/Settings.php:549
1208
  msgid "two weeks"
1209
  msgstr ""
1210
 
1211
+ #: src/Tribe/Aggregator/Settings.php:552
1212
  msgid "Three weeks"
1213
  msgstr ""
1214
 
1215
+ #: src/Tribe/Aggregator/Settings.php:553
1216
  msgid "three weeks"
1217
  msgstr ""
1218
 
1219
+ #: src/Tribe/Aggregator/Settings.php:556
1220
  msgid "One month"
1221
  msgstr ""
1222
 
1223
+ #: src/Tribe/Aggregator/Settings.php:557
1224
  msgid "one month"
1225
  msgstr ""
1226
 
1227
+ #: src/Tribe/Aggregator/Settings.php:560
1228
  msgid "Two months"
1229
  msgstr ""
1230
 
1231
+ #: src/Tribe/Aggregator/Settings.php:561
1232
  msgid "two months"
1233
  msgstr ""
1234
 
1235
+ #: src/Tribe/Aggregator/Settings.php:564
1236
  msgid "Three months"
1237
  msgstr ""
1238
 
1239
+ #: src/Tribe/Aggregator/Settings.php:565
1240
  msgid "three months"
1241
  msgstr ""
1242
 
1243
+ #: src/Tribe/Aggregator/Settings.php:849
1244
  msgid "Asynchronous"
1245
  msgstr ""
1246
 
1247
+ #: src/Tribe/Aggregator/Settings.php:853
1248
  msgid "Cron-based"
1249
  msgstr ""
1250
 
1929
  msgstr ""
1930
 
1931
  #: src/Tribe/Google/Maps_API_Key.php:55 src/Tribe/Google/Maps_API_Key.php:108
 
1932
  msgid "Click here"
1933
  msgstr ""
1934
 
2502
  msgid "Upcoming Events"
2503
  msgstr ""
2504
 
2505
+ #. #-#-#-#-# the-events-calendar.pot (The Events Calendar 4.9.6) #-#-#-#-#
2506
  #. Plugin Name of the plugin/theme
2507
  #: src/Tribe/Main.php:904 src/Tribe/Main.php:1258 src/Tribe/Privacy.php:29
2508
  #: src/functions/template-tags/general.php:1357 the-events-calendar.php:56
4664
  msgstr ""
4665
 
4666
  #: src/admin-views/admin-update-message.php:61
4667
+ #: src/admin-views/aggregator/settings.php:712
4668
+ #: src/admin-views/aggregator/settings.php:752
4669
  msgid "Imports"
4670
  msgstr ""
4671
 
4892
  #: src/admin-views/aggregator/origins/gcal.php:114
4893
  #: src/admin-views/aggregator/origins/ical.php:108
4894
  #: src/admin-views/aggregator/origins/ics.php:51
4895
+ #: src/admin-views/aggregator/origins/meetup.php:139
4896
  #: src/admin-views/aggregator/origins/url.php:119
4897
  #: src/deprecated/facebook.php:140
4898
  msgid "Preview"
4952
  #: src/admin-views/aggregator/origins/gcal.php:37
4953
  #: src/admin-views/aggregator/origins/ical.php:25
4954
  #: src/admin-views/aggregator/origins/ical.php:37
4955
+ #: src/admin-views/aggregator/origins/meetup.php:57
4956
+ #: src/admin-views/aggregator/origins/meetup.php:69
4957
  #: src/admin-views/aggregator/origins/url.php:25
4958
  #: src/admin-views/aggregator/origins/url.php:37 src/deprecated/facebook.php:55
4959
  #: src/deprecated/facebook.php:67
4963
  #: src/admin-views/aggregator/origins/eventbrite.php:68
4964
  #: src/admin-views/aggregator/origins/gcal.php:36
4965
  #: src/admin-views/aggregator/origins/ical.php:36
4966
+ #: src/admin-views/aggregator/origins/meetup.php:68
4967
  #: src/admin-views/aggregator/origins/url.php:36 src/deprecated/facebook.php:66
4968
  msgid "One-Time Import"
4969
  msgstr ""
4995
  #: src/admin-views/aggregator/origins/eventbrite.php:158
4996
  #: src/admin-views/aggregator/origins/gcal.php:81
4997
  #: src/admin-views/aggregator/origins/ical.php:82
4998
+ #: src/admin-views/aggregator/origins/meetup.php:114
4999
  #: src/admin-views/aggregator/origins/url.php:82
5000
  #: src/admin-views/events-meta-box.php:189 src/deprecated/facebook.php:112
5001
  msgid "URL:"
5117
  "schedule. Single events can be added via a one-time import."
5118
  msgstr ""
5119
 
5120
+ #: src/admin-views/aggregator/origins/meetup.php:34
5121
+ msgid "Please log in to enable event imports from Meetup."
 
 
 
5122
  msgstr ""
5123
 
5124
+ #: src/admin-views/aggregator/origins/meetup.php:41
5125
+ msgid "Log into Meetup"
 
5126
  msgstr ""
5127
 
5128
+ #: src/admin-views/aggregator/origins/meetup.php:115
 
 
 
 
 
 
 
 
5129
  msgid "meetup.com/example"
5130
  msgstr ""
5131
 
5132
+ #: src/admin-views/aggregator/origins/meetup.php:116
5133
  msgid ""
5134
  "Enter the url for a Meetup group, page, or individual. You can also enter "
5135
  "the url of a single Meetup event."
5136
  msgstr ""
5137
 
5138
+ #: src/admin-views/aggregator/origins/meetup.php:131
5139
  msgid "Invalid Meetup URL"
5140
  msgstr ""
5141
 
5261
 
5262
  #: src/admin-views/aggregator/settings.php:75
5263
  #: src/admin-views/aggregator/settings.php:135
5264
+ #: src/admin-views/aggregator/settings.php:243
5265
+ #: src/admin-views/aggregator/settings.php:287
5266
+ #: src/admin-views/aggregator/settings.php:331
5267
+ #: src/admin-views/aggregator/settings.php:387
5268
+ #: src/admin-views/aggregator/settings.php:431
5269
+ #: src/admin-views/aggregator/settings.php:510
5270
  msgid "Default Status"
5271
  msgstr ""
5272
 
5276
 
5277
  #: src/admin-views/aggregator/settings.php:87
5278
  #: src/admin-views/aggregator/settings.php:147
5279
+ #: src/admin-views/aggregator/settings.php:255
5280
+ #: src/admin-views/aggregator/settings.php:299
5281
+ #: src/admin-views/aggregator/settings.php:343
5282
+ #: src/admin-views/aggregator/settings.php:399
5283
+ #: src/admin-views/aggregator/settings.php:443
5284
+ #: src/admin-views/aggregator/settings.php:522
5285
  msgid "Default Event Category"
5286
  msgstr ""
5287
 
5325
  msgstr ""
5326
 
5327
  #: src/admin-views/aggregator/settings.php:159
5328
+ #: src/admin-views/aggregator/settings.php:267
5329
+ #: src/admin-views/aggregator/settings.php:311
5330
+ #: src/admin-views/aggregator/settings.php:355
5331
+ #: src/admin-views/aggregator/settings.php:411
5332
+ #: src/admin-views/aggregator/settings.php:455
5333
+ #: src/admin-views/aggregator/settings.php:534
5334
+ msgid "Show Map"
5335
+ msgstr ""
5336
+
5337
+ #: src/admin-views/aggregator/settings.php:160
5338
  #: src/admin-views/aggregator/settings.php:268
5339
  #: src/admin-views/aggregator/settings.php:312
5340
  #: src/admin-views/aggregator/settings.php:356
5341
  #: src/admin-views/aggregator/settings.php:412
5342
  #: src/admin-views/aggregator/settings.php:456
5343
  #: src/admin-views/aggregator/settings.php:535
 
 
 
 
 
 
 
 
 
 
5344
  msgid "Show map by default on imported event and venues"
5345
  msgstr ""
5346
 
5355
  "time period or a smaller number of events may improve results."
5356
  msgstr ""
5357
 
5358
+ #: src/admin-views/aggregator/settings.php:183
5359
+ #: src/admin-views/aggregator/settings.php:467
5360
  msgid "Import Date Range Limit"
5361
  msgstr ""
5362
 
5363
+ #: src/admin-views/aggregator/settings.php:184
5364
  msgid ""
5365
  "When importing from an event source, this is how far into the future the "
5366
  "events will be fetched; on slower websites a larger date range may impact "
5367
  "the success of imports. Selecting a shorter time period may improve results."
5368
  msgstr ""
5369
 
5370
+ #: src/admin-views/aggregator/settings.php:200
5371
  msgid "Import Quantity Limit"
5372
  msgstr ""
5373
 
5374
+ #: src/admin-views/aggregator/settings.php:201
5375
  msgid ""
5376
  "When importing from an event source, this is the maximum number of events "
5377
  "that will be imported; on slower websites this may impact the success of "
5378
  "imports. Setting this to a smaller number may improve results."
5379
  msgstr ""
5380
 
5381
+ #: src/admin-views/aggregator/settings.php:217
5382
  msgid "Import Process System"
5383
  msgstr ""
5384
 
5385
+ #: src/admin-views/aggregator/settings.php:218
5386
  msgid ""
5387
  "The Asynchronous import process is faster and does not rely on WordPress "
5388
  "Cron but might not work correctly in all WordPress installations, try "
5389
  "switching to the Cron-based process for maximum compatibility."
5390
  msgstr ""
5391
 
5392
+ #: src/admin-views/aggregator/settings.php:229
5393
  msgid "Stop current processes"
5394
  msgstr ""
5395
 
5396
+ #: src/admin-views/aggregator/settings.php:238
5397
  msgid "iCalendar Import Settings"
5398
  msgstr ""
5399
 
5400
+ #: src/admin-views/aggregator/settings.php:244
5401
  msgid "The default post status for events imported via iCalendar"
5402
  msgstr ""
5403
 
5404
+ #: src/admin-views/aggregator/settings.php:256
5405
  msgid "The default event category for events imported via iCalendar"
5406
  msgstr ""
5407
 
5408
+ #: src/admin-views/aggregator/settings.php:282
5409
  msgid "ICS File Import Settings"
5410
  msgstr ""
5411
 
5412
+ #: src/admin-views/aggregator/settings.php:288
5413
  msgid "The default post status for events imported via .ics files"
5414
  msgstr ""
5415
 
5416
+ #: src/admin-views/aggregator/settings.php:300
5417
  msgid "The default event category for events imported via .ics files"
5418
  msgstr ""
5419
 
5420
+ #: src/admin-views/aggregator/settings.php:326
5421
  msgid "Google Calendar Import Settings"
5422
  msgstr ""
5423
 
5424
+ #: src/admin-views/aggregator/settings.php:332
5425
  msgid "The default post status for events imported via Google Calendar"
5426
  msgstr ""
5427
 
5428
+ #: src/admin-views/aggregator/settings.php:344
5429
  msgid "The default event category for events imported via Google Calendar"
5430
  msgstr ""
5431
 
5432
+ #: src/admin-views/aggregator/settings.php:370
5433
  msgid "Meetup Import Settings"
5434
  msgstr ""
5435
 
5436
+ #: src/admin-views/aggregator/settings.php:376
5437
  msgid ""
5438
  "To import Meetup events, please be sure to add your Meetup API key on "
5439
  "%1$sEvents > Settings > APIs%2$s"
5440
  msgstr ""
5441
 
5442
+ #: src/admin-views/aggregator/settings.php:388
5443
  msgid "The default post status for events imported via Meetup"
5444
  msgstr ""
5445
 
5446
+ #: src/admin-views/aggregator/settings.php:400
5447
  msgid "The default event category for events imported via Meetup"
5448
  msgstr ""
5449
 
5450
+ #: src/admin-views/aggregator/settings.php:426
5451
  msgid "Other URL Import Settings"
5452
  msgstr ""
5453
 
5454
+ #: src/admin-views/aggregator/settings.php:432
5455
  msgid "The default post status for events imported via other URLs"
5456
  msgstr ""
5457
 
5458
+ #: src/admin-views/aggregator/settings.php:444
5459
  msgid "The default event category for events imported via other URLs"
5460
  msgstr ""
5461
 
5462
+ #: src/admin-views/aggregator/settings.php:468
5463
  msgid ""
5464
  "When importing from a website that uses The Events Calendar, the REST API "
5465
  "will attempt to fetch events this far in the future. That website's hosting "
5467
  "may improve results."
5468
  msgstr ""
5469
 
5470
+ #: src/admin-views/aggregator/settings.php:479
5471
  msgid "Import Event Settings"
5472
  msgstr ""
5473
 
5474
+ #: src/admin-views/aggregator/settings.php:480
5475
  msgid ""
5476
  "Fetch source event's settings (e.g. Show Maps Link or Sticky in Month View) "
5477
  "when importing from another site using The Events Calendar."
5478
  msgstr ""
5479
 
5480
+ #: src/admin-views/aggregator/settings.php:492
5481
  #: src/admin-views/aggregator/tabs/import-form.php:16
5482
  msgid "(do not override)"
5483
  msgstr ""
5484
 
5485
+ #: src/admin-views/aggregator/settings.php:505
5486
  msgid "Eventbrite Import Settings"
5487
  msgstr ""
5488
 
5489
+ #: src/admin-views/aggregator/settings.php:511
5490
  msgid "The default post status for events imported via Eventbrite"
5491
  msgstr ""
5492
 
5493
+ #: src/admin-views/aggregator/settings.php:523
5494
  msgid "The default event category for events imported via Eventbrite"
5495
  msgstr ""
5496
 
5497
+ #: src/admin-views/aggregator/settings.php:596
5498
  msgid "Update Authority"
5499
  msgstr ""
5500
 
5501
+ #: src/admin-views/aggregator/settings.php:600
5502
  msgid "Global"
5503
  msgstr ""
5504
 
5505
+ #: src/admin-views/aggregator/settings.php:624
5506
  msgid "Other URLs"
5507
  msgstr ""
5508
 
5509
+ #: src/admin-views/aggregator/settings.php:674
5510
  msgid ""
5511
  "Use the options below to configure your imports. Global Import Settings "
5512
  "apply to all imports, but you can also override the global settings by "
5514
  "Status on the %1$s."
5515
  msgstr ""
5516
 
5517
+ #: src/admin-views/aggregator/settings.php:678
5518
  msgid "Help page"
5519
  msgstr ""
5520
 
5521
+ #: src/admin-views/aggregator/settings.php:698
5522
  msgid ""
5523
  "Use the options below to configure your imports. Looking for more ways to "
5524
  "import events from other websites?"
5525
  msgstr ""
5526
 
5527
+ #: src/admin-views/aggregator/settings.php:699
5528
  msgid "Check out Event Aggregator."
5529
  msgstr ""
5530
 
5640
  msgstr ""
5641
 
5642
  #: src/admin-views/aggregator/status.php:176
5643
+ #: src/admin-views/aggregator/status.php:203
5644
  msgid "The service has disabled oAuth. Some types of events may not import."
5645
  msgstr ""
5646
 
5647
+ #: src/admin-views/aggregator/status.php:196
5648
+ msgid "You have not connected Event Aggregator to Meetup"
5649
  msgstr ""
5650
 
5651
+ #: src/admin-views/aggregator/status.php:198
5652
+ msgctxt "link for connecting meetup"
5653
+ msgid "Connect to Meetup"
5654
  msgstr ""
5655
 
5656
+ #: src/admin-views/aggregator/status.php:202
5657
+ msgid "Limited connectivity with Meetup"
5658
  msgstr ""
5659
 
5660
  #: src/admin-views/aggregator/tabs/import-form.php:31
6132
  "to these external services. These services may be located abroad."
6133
  msgstr ""
6134
 
6135
+ #: src/admin-views/tribe-options-addons-api.php:19
6136
+ msgid "Meetup Token"
6137
+ msgstr ""
6138
+
6139
+ #: src/admin-views/tribe-options-addons-api.php:23
6140
+ msgid "You need to connect to Meetup for Event Aggregator to work properly"
6141
  msgstr ""
6142
 
6143
  #: src/admin-views/tribe-options-addons-api.php:24
6144
+ msgid "Connect to Meetup"
6145
  msgstr ""
6146
 
6147
+ #: src/admin-views/tribe-options-addons-api.php:26
6148
+ msgid "Refresh your connection to Meetup"
6149
  msgstr ""
6150
 
6151
+ #: src/admin-views/tribe-options-addons-api.php:27
6152
+ #: src/admin-views/tribe-options-addons-api.php:80
6153
+ msgid "Disconnect"
6154
  msgstr ""
6155
 
6156
  #: src/admin-views/tribe-options-addons-api.php:49
6157
+ msgid ""
6158
+ "You need to connect Event Aggregator to Meetup to import your events from "
6159
+ "Meetup."
6160
+ msgstr ""
6161
+
6162
+ #: src/admin-views/tribe-options-addons-api.php:72
6163
+ msgid "Eventbrite Token"
6164
+ msgstr ""
6165
+
6166
+ #: src/admin-views/tribe-options-addons-api.php:76
6167
  msgid "You need to connect to Eventbrite for Event Aggregator to work properly"
6168
  msgstr ""
6169
 
6170
+ #: src/admin-views/tribe-options-addons-api.php:77
6171
  msgid "Connect to Eventbrite"
6172
  msgstr ""
6173
 
6174
+ #: src/admin-views/tribe-options-addons-api.php:79
6175
  msgid "Refresh your connection to Eventbrite"
6176
  msgstr ""
6177
 
6178
+ #: src/admin-views/tribe-options-addons-api.php:101
 
 
 
 
6179
  msgid ""
6180
  "You need to connect Event Aggregator to Eventbrite to import your events "
6181
  "from Eventbrite."
6182
  msgstr ""
6183
 
6184
+ #: src/admin-views/tribe-options-addons-api.php:122
6185
+ #: src/admin-views/tribe-options-addons-api.php:162
6186
  msgid "APIs"
6187
  msgstr ""
6188
 
6189
+ #: src/admin-views/tribe-options-addons-api.php:126
6190
  msgid ""
6191
  "Some features and add-ons require you to enter an API key or log into a "
6192
  "third-party website so that The Events Calendar can communicate with an "
readme.txt CHANGED
@@ -4,7 +4,7 @@ Contributors: ModernTribe, borkweb, barry.hughes, bordoni, brianjessee, aguseo,
4
  Tags: events, calendar, event, venue, organizer, dates, date, google maps, conference, workshop, concert, meeting, seminar, summit, class, modern tribe, tribe, widget
5
  Donate link: http://m.tri.be/29
6
  Requires at least: 4.7
7
- Stable tag: 4.9.5
8
  Tested up to: 5.2.2
9
  Requires PHP: 5.6
10
  License: GPLv2 or later
@@ -215,6 +215,11 @@ Still not happy? Shoot us an email to support@theeventscalendar.com or tweet to
215
 
216
  == Changelog ==
217
 
 
 
 
 
 
218
  = [4.9.5] 2019-07-25 =
219
 
220
  * Tweak - Update redirection URLs for Freemius actions [130281]
4
  Tags: events, calendar, event, venue, organizer, dates, date, google maps, conference, workshop, concert, meeting, seminar, summit, class, modern tribe, tribe, widget
5
  Donate link: http://m.tri.be/29
6
  Requires at least: 4.7
7
+ Stable tag: 4.9.6
8
  Tested up to: 5.2.2
9
  Requires PHP: 5.6
10
  License: GPLv2 or later
215
 
216
  == Changelog ==
217
 
218
+ = [4.9.6] 2019-08-07 =
219
+
220
+ * Tweak - Update Event Aggregator to include compatibility with new Meetup API requirements - [See more](http://m.tri.be/1afb) [125635]
221
+ * Language - 5 new strings added, 120 updated, 5 fuzzied, and 10 obsoleted
222
+
223
  = [4.9.5] 2019-07-25 =
224
 
225
  * Tweak - Update redirection URLs for Freemius actions [130281]
src/Tribe/Aggregator/API/Origins.php CHANGED
@@ -4,6 +4,11 @@ defined( 'WPINC' ) or die;
4
 
5
  class Tribe__Events__Aggregator__API__Origins extends Tribe__Events__Aggregator__API__Abstract {
6
 
 
 
 
 
 
7
  /**
8
  * @var array
9
  */
@@ -102,7 +107,10 @@ class Tribe__Events__Aggregator__API__Origins extends Tribe__Events__Aggregator_
102
  */
103
  private function enable_service_origins() {
104
  $cached_origins = get_transient( "{$this->cache_group}_origins" );
105
- if ( $cached_origins ) {
 
 
 
106
  $this->origins = $cached_origins;
107
  return $this->origins;
108
  }
@@ -141,31 +149,31 @@ class Tribe__Events__Aggregator__API__Origins extends Tribe__Events__Aggregator_
141
  * Fetches origin data from the service and sets necessary transients
142
  */
143
  private function fetch_origin_data() {
144
- $cached = tribe_get_var( 'events-aggregator.origins-data' );
145
- if ( empty( $cached ) ) {
146
- // try to see if we have a lock in place
147
- $cached = get_transient( "{$this->cache_group}_fetch_lock" );
148
  }
149
 
150
- if ( ! empty( $cached ) ) {
151
- return $cached;
152
  }
153
 
154
  list( $origin_data, $error ) = $this->service->get_origins( true );
155
  $origin_data = (object) $origin_data;
 
156
 
157
  if ( empty( $error ) ) {
158
- if ( ! get_transient( "{$this->cache_group}_origin_oauth" ) && ! empty( $origin_data->oauth ) ) {
159
- set_transient( "{$this->cache_group}_origin_oauth", $origin_data->oauth, 6 * HOUR_IN_SECONDS );
160
- }
161
-
162
- if ( ! get_transient( "{$this->cache_group}_origin_limit" ) && ! empty( $origin_data->limit ) ) {
163
- set_transient( "{$this->cache_group}_origin_limit", $origin_data->limit, 6 * HOUR_IN_SECONDS );
164
- }
165
  } elseif ( 403 == wp_remote_retrieve_response_code( $error ) ) {
166
- // store the origins data for 5' only
167
  $origin_data->expiration = 300;
168
- // and avoid bugging the service for 5'
169
  set_transient( "{$this->cache_group}_fetch_lock", $origin_data, 300 );
170
  }
171
 
@@ -176,56 +184,40 @@ class Tribe__Events__Aggregator__API__Origins extends Tribe__Events__Aggregator_
176
  }
177
 
178
  /**
179
- * Returns whether oauth for a given origin is enabled
180
  *
181
- * @param string $origin Origin
182
  *
183
- * @return boolean
 
 
184
  */
185
  public function is_oauth_enabled( $origin ) {
186
 
187
- if ( 'eventbrite' !== $origin && ! tribe( 'events-aggregator.main' )->is_service_active() ) {
188
  return false;
189
  }
190
 
191
- if ( 'eventbrite' === $origin && class_exists( 'Tribe__Events__Tickets__Eventbrite__Main' ) ) {
192
  return true;
193
  }
194
 
195
- $cached_oauth_settings = get_transient( "{$this->cache_group}_origin_oauth" );
196
- if ( $cached_oauth_settings && isset( $cached_oauth_settings->$origin ) ) {
197
- return (bool) $cached_oauth_settings->$origin;
198
- }
199
-
200
- $service_origins = $this->fetch_origin_data();
201
-
202
- if ( ! isset( $service_origins->oauth->$origin ) ) {
203
- return false;
204
- }
205
 
206
- return (bool) $service_origins->oauth->$origin;
207
  }
208
 
209
  /**
210
- * Get origin limit values
211
  *
212
- * @param string $type Type of limit to retrieve
213
  *
214
- * @return int
215
  */
216
  public function get_limit( $type = 'import' ) {
217
- $cached_limit_settings = get_transient( "{$this->cache_group}_origin_limit" );
218
- if ( $cached_limit_settings && isset( $cached_limit_settings->$type ) ) {
219
- return (int) $cached_limit_settings->$type;
220
- }
221
-
222
- $service_origins = $this->fetch_origin_data();
223
 
224
- if ( ! isset( $service_origins->limit->$type ) ) {
225
- return false;
226
- }
227
-
228
- return (int) $service_origins->limit->$type;
229
  }
230
 
231
  public function get_name( $id ) {
@@ -253,4 +245,31 @@ class Tribe__Events__Aggregator__API__Origins extends Tribe__Events__Aggregator_
253
 
254
  return $this->is_ea_disabled ? in_array( $origin, $this->available_when_disabled ) : true;
255
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  }
4
 
5
  class Tribe__Events__Aggregator__API__Origins extends Tribe__Events__Aggregator__API__Abstract {
6
 
7
+ /**
8
+ * @since 4.9.6
9
+ */
10
+ const VERSION = '1.1.0';
11
+
12
  /**
13
  * @var array
14
  */
107
  */
108
  private function enable_service_origins() {
109
  $cached_origins = get_transient( "{$this->cache_group}_origins" );
110
+ $cached_version = ! empty( $cached_origins->version )
111
+ ? $cached_origins->version
112
+ : '1.0.0';
113
+ if ( $cached_origins && version_compare( $cached_version, static::VERSION, '=' ) ) {
114
  $this->origins = $cached_origins;
115
  return $this->origins;
116
  }
149
  * Fetches origin data from the service and sets necessary transients
150
  */
151
  private function fetch_origin_data() {
152
+ $request_cached = tribe_get_var( 'events-aggregator.origins-data' );
153
+ if ( empty( $request_cached ) ) {
154
+ // Try to see if we have a lock in place.
155
+ $lock = get_transient( "{$this->cache_group}_fetch_lock" );
156
  }
157
 
158
+ if ( ! empty( $lock ) ) {
159
+ return $request_cached;
160
  }
161
 
162
  list( $origin_data, $error ) = $this->service->get_origins( true );
163
  $origin_data = (object) $origin_data;
164
+ $version = ! empty( $origin_data->version ) ? $origin_data->version : '1.0.0';
165
 
166
  if ( empty( $error ) ) {
167
+ // Refresh some accessory transients and embed the version in them.
168
+ $oauth_data = $origin_data->oauth;
169
+ $limit_data = $origin_data->limit;
170
+ $oauth_data->version = $limit_data->version = $version;
171
+ set_transient( "{$this->cache_group}_origin_oauth", $oauth_data, 6 * HOUR_IN_SECONDS );
172
+ set_transient( "{$this->cache_group}_origin_limit", $limit_data, 6 * HOUR_IN_SECONDS );
 
173
  } elseif ( 403 == wp_remote_retrieve_response_code( $error ) ) {
174
+ // Store the origins data for 5' only.
175
  $origin_data->expiration = 300;
176
+ // And avoid bugging the service for 5'.
177
  set_transient( "{$this->cache_group}_fetch_lock", $origin_data, 300 );
178
  }
179
 
184
  }
185
 
186
  /**
187
+ * Returns whether oauth for a given origin is enabled.
188
  *
189
+ * The OAuth status for the origin is enabled on EA Service side.
190
  *
191
+ * @param string $origin The origin to check the OAuth status for.
192
+ *
193
+ * @return boolean Whether OAuth is enabled for the origin or not.
194
  */
195
  public function is_oauth_enabled( $origin ) {
196
 
197
+ if ( 'eventbrite' !== $origin && ! tribe( 'events-aggregator.main' )->is_service_active() ) {
198
  return false;
199
  }
200
 
201
+ if ( 'eventbrite' === $origin && class_exists( 'Tribe__Events__Tickets__Eventbrite__Main' ) ) {
202
  return true;
203
  }
204
 
205
+ $oauth = $this->get_data( 'oauth' );
 
 
 
 
 
 
 
 
 
206
 
207
+ return ! empty( $oauth->{$origin} ) && (bool) $oauth->{$origin};
208
  }
209
 
210
  /**
211
+ * Get origin limit values for an operation.
212
  *
213
+ * @param string $type Type of operation limit to retrieve; defaults to `import`.
214
  *
215
+ * @return int The numeric limit (how many times) applied to the operation.
216
  */
217
  public function get_limit( $type = 'import' ) {
218
+ $limits = $this->get_data( 'limit' );
 
 
 
 
 
219
 
220
+ return ! empty( $limits->{$type} ) ? (int) $limits->{$type} : false;
 
 
 
 
221
  }
222
 
223
  public function get_name( $id ) {
245
 
246
  return $this->is_ea_disabled ? in_array( $origin, $this->available_when_disabled ) : true;
247
  }
248
+
249
+ /**
250
+ * Gets the data for an internal Origins data key.
251
+ *
252
+ * The result might be cached from a previous request.
253
+ *
254
+ * @since 4.9.6
255
+ *
256
+ * @param string|null $key The key to fetch the data for.
257
+ *
258
+ * @return mixed|object|bool The data associated with the key if any and available, `false` otherwise.
259
+ */
260
+ public function get_data( $key ) {
261
+ if ( null === $key ) {
262
+ return $this->fetch_origin_data();
263
+ }
264
+
265
+ $data = get_transient( "{$this->cache_group}_origin_{$key}" );
266
+ $cached_version = isset( $data->version ) ? $data->version : '1.0.0';
267
+
268
+ if ( ! version_compare( $cached_version, static::VERSION, '=' ) ) {
269
+ $origin_data = $this->fetch_origin_data();
270
+ $data = ! empty( $origin_data->{$key} ) ? $origin_data->{$key} : false;
271
+ }
272
+
273
+ return $data;
274
+ }
275
  }
src/Tribe/Aggregator/Event.php CHANGED
@@ -68,7 +68,7 @@ class Tribe__Events__Aggregator__Event {
68
  $event = array();
69
  $item = (object) $item;
70
 
71
- $field_map = array(
72
  'title' => 'post_title',
73
  'description' => 'post_content',
74
  'excerpt' => 'post_excerpt',
@@ -101,9 +101,9 @@ class Tribe__Events__Aggregator__Event {
101
  'hide_from_listings' => 'hide_from_listings',
102
  'sticky' => 'sticky',
103
  'featured' => 'feature_event',
104
- );
105
 
106
- $venue_field_map = array(
107
  '_venue_id' => 'VenueID',
108
  'meetup_id' => 'VenueMeetupID',
109
  'eventbrite_id' => 'VenueEventBriteID',
@@ -119,9 +119,9 @@ class Tribe__Events__Aggregator__Event {
119
  'overwrite_coordinates' => 'OverwriteCoords',
120
  'latitude' => 'Lat',
121
  'longitude' => 'Lng',
122
- );
123
 
124
- $organizer_field_map = array(
125
  '_organizer_id' => 'OrganizerID',
126
  'meetup_id' => 'OrganizerMeetupID',
127
  'eventbrite_id' => 'OrganizerEventBriteID',
@@ -129,7 +129,7 @@ class Tribe__Events__Aggregator__Event {
129
  'phone' => 'Phone',
130
  'email' => 'Email',
131
  'website' => 'Website',
132
- );
133
 
134
  /**
135
  * Allows filtering to add other field mapping values.
68
  $event = array();
69
  $item = (object) $item;
70
 
71
+ $field_map = [
72
  'title' => 'post_title',
73
  'description' => 'post_content',
74
  'excerpt' => 'post_excerpt',
101
  'hide_from_listings' => 'hide_from_listings',
102
  'sticky' => 'sticky',
103
  'featured' => 'feature_event',
104
+ ];
105
 
106
+ $venue_field_map = [
107
  '_venue_id' => 'VenueID',
108
  'meetup_id' => 'VenueMeetupID',
109
  'eventbrite_id' => 'VenueEventBriteID',
119
  'overwrite_coordinates' => 'OverwriteCoords',
120
  'latitude' => 'Lat',
121
  'longitude' => 'Lng',
122
+ ];
123
 
124
+ $organizer_field_map = [
125
  '_organizer_id' => 'OrganizerID',
126
  'meetup_id' => 'OrganizerMeetupID',
127
  'eventbrite_id' => 'OrganizerEventBriteID',
129
  'phone' => 'Phone',
130
  'email' => 'Email',
131
  'website' => 'Website',
132
+ ];
133
 
134
  /**
135
  * Allows filtering to add other field mapping values.
src/Tribe/Aggregator/Processes/Queue_Control.php CHANGED
@@ -28,6 +28,9 @@ class Tribe__Events__Aggregator__Processes__Queue_Control {
28
 
29
  $cleared = $this->clear_queues();
30
 
 
 
 
31
  $location = null !== $location
32
  ? $location
33
  : remove_query_arg( self::CLEAR_PROCESSES );
28
 
29
  $cleared = $this->clear_queues();
30
 
31
+ // Let's also re-run, forcing it, the feature support check to make sure we still support Async processing.
32
+ tribe( 'feature-detection' )->supports_async_process( true );
33
+
34
  $location = null !== $location
35
  ? $location
36
  : remove_query_arg( self::CLEAR_PROCESSES );
src/Tribe/Aggregator/Record/Meetup.php CHANGED
@@ -77,4 +77,55 @@ class Tribe__Events__Aggregator__Record__Meetup extends Tribe__Events__Aggregato
77
 
78
  return self::preserve_event_option_fields( $event );
79
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  }
77
 
78
  return self::preserve_event_option_fields( $event );
79
  }
80
+
81
+ /**
82
+ * Returns the Meetup authorization token generation URL.
83
+ *
84
+ * @since 4.9.6
85
+ *
86
+ * @param array $args
87
+ *
88
+ * @return string Either the URL to obtain Eventbrite authorization token or an empty string.
89
+ */
90
+ public static function get_auth_url( $args = array() ) {
91
+ $service = tribe( 'events-aggregator.service' );
92
+
93
+ $api = $service->api();
94
+ if ( $api instanceof WP_Error ) {
95
+ return '';
96
+ }
97
+
98
+ $key = $api->key;
99
+ $key2 = null;
100
+
101
+ if ( ! empty( $api->licenses['tribe-meetup'] ) ) {
102
+ $meetup_license = $api->licenses['tribe-meetup'];
103
+
104
+ if ( empty( $key ) ) {
105
+ $key = $meetup_license;
106
+ } else {
107
+ $key2 = $meetup_license;
108
+ }
109
+ }
110
+
111
+ $url = $api->domain . 'meetup/' . $key;
112
+ $defaults = array(
113
+ 'referral' => urlencode( home_url() ),
114
+ 'admin_url' => urlencode( get_admin_url() ),
115
+ 'type' => 'new',
116
+ 'lang' => get_bloginfo( 'language' ),
117
+ );
118
+
119
+ if ( $key2 ) {
120
+ $defaults['licenses'] = array(
121
+ 'tribe-meetup' => $key2,
122
+ );
123
+ }
124
+
125
+ $args = wp_parse_args( $args, $defaults );
126
+
127
+ $url = add_query_arg( $args, $url );
128
+
129
+ return $url;
130
+ }
131
  }
src/Tribe/Aggregator/Service.php CHANGED
@@ -29,6 +29,15 @@ class Tribe__Events__Aggregator__Service {
29
  */
30
  public static $auth_transient = 'tribe_aggregator_has_eventbrite_authorized_response';
31
 
 
 
 
 
 
 
 
 
 
32
  /**
33
  * API varibles stored in a single Object
34
  *
@@ -40,13 +49,13 @@ class Tribe__Events__Aggregator__Service {
40
  * @type array $licenses Array with plugins and licenses that we will pass to EA
41
  * }
42
  */
43
- public $api = array(
44
- 'key' => null,
45
- 'version' => 'v1',
46
- 'domain' => 'https://ea.theeventscalendar.com/',
47
- 'path' => 'api/aggregator/',
48
  'licenses' => array(),
49
- );
50
 
51
  /**
52
  * @var Tribe__Events__Aggregator__API__Requests
@@ -257,7 +266,7 @@ class Tribe__Events__Aggregator__Service {
257
  }
258
 
259
  if ( empty( $data['body'] ) ) {
260
- $args = array( 'body' => $data );
261
  } else {
262
  $args = $data;
263
  }
@@ -276,7 +285,7 @@ class Tribe__Events__Aggregator__Service {
276
  $json = json_decode( wp_remote_retrieve_body( $response ) );
277
 
278
  if ( empty( $json ) ) {
279
- return tribe_error( 'core:aggregator:invalid-json-response', array( 'response' => $response ), array( 'response' => $response ) );
280
  }
281
 
282
  return $json;
@@ -299,7 +308,7 @@ class Tribe__Events__Aggregator__Service {
299
  if ( is_wp_error( $response ) || empty( $response->status ) ) {
300
  $error = $response;
301
 
302
- return $return_error ? array( $origins, $error ) : $origins;
303
  }
304
 
305
  if ( $response && 'success' === $response->status ) {
@@ -307,7 +316,7 @@ class Tribe__Events__Aggregator__Service {
307
  }
308
 
309
  return $return_error
310
- ? array( $origins, $error )
311
  : $origins;
312
  }
313
 
@@ -319,11 +328,11 @@ class Tribe__Events__Aggregator__Service {
319
  * @return mixed|void
320
  */
321
  public function get_eventbrite_args( ) {
322
- $args = array(
323
  'referral' => urlencode( home_url() ),
324
  'url' => urlencode( site_url() ),
325
  'secret_key' => tribe( 'events-aggregator.settings' )->get_eb_security_key()->security_key,
326
- );
327
 
328
  /**
329
  * Allow filtering for which params we are sending to EA for Token callback
@@ -384,7 +393,7 @@ class Tribe__Events__Aggregator__Service {
384
 
385
  // If we have an WP_Error we return only CSV
386
  if ( is_wp_error( $response ) ) {
387
- return tribe_error( 'core:aggregator:invalid-eventbrite-token', array(), array( 'response' => $response ) );
388
  } else {
389
  delete_transient( self::$auth_transient );
390
  }
@@ -455,15 +464,15 @@ class Tribe__Events__Aggregator__Service {
455
  */
456
  $args = apply_filters( 'tribe_aggregator_service_post_import_args', $args, $this );
457
 
458
- $request_args = array(
459
  'body' => $args,
460
- );
461
 
462
  if ( isset( $args['file'] ) ) {
463
  $boundary = wp_generate_password( 24 );
464
- $headers = array(
465
  'content-type' => 'multipart/form-data; boundary=' . $boundary,
466
- );
467
 
468
  $payload = array();
469
  foreach ( $args as $name => $value ) {
@@ -679,31 +688,35 @@ class Tribe__Events__Aggregator__Service {
679
  esc_html__( 'the UID part of the iCalendar Specification', 'the-events-calendar' )
680
  );
681
 
682
- $this->service_messages = array(
683
- 'error:create-import-failed' => __( 'Sorry, but something went wrong. Please try again.', 'the-events-calendar' ),
 
684
  'error:create-import-invalid-params' => __( 'Events could not be imported. The import parameters were invalid.', 'the-events-calendar' ),
685
  'error:eb-permissions' => __( 'Events cannot be imported because Eventbrite has returned an error. This could mean that the event ID does not exist, the event or source is marked as Private, or the event or source has been otherwise restricted by Eventbrite. You can <a href="https://theeventscalendar.com/knowledgebase/import-errors/" target="_blank">read more about Eventbrite restrictions in our knowledgebase</a>.', 'the-events-calendar' ),
686
- 'error:eb-no-results' => __( 'No upcoming Eventbrite events found.', 'the-events-calendar' ),
687
- 'error:fetch-404' => __( 'The URL provided could not be reached.', 'the-events-calendar' ),
688
- 'error:fetch-failed' => __( 'The URL provided failed to load.', 'the-events-calendar' ),
689
- 'error:get-image' => __( 'The image associated with your event could not be imported.', 'the-events-calendar' ),
690
- 'error:get-image-bad-association' => __( 'The image associated with your event is not accessible with your API key.', 'the-events-calendar' ),
691
- 'error:import-failed' => __( 'The import failed for an unknown reason. Please try again. If the problem persists, please contact support.', 'the-events-calendar' ),
692
- 'error:invalid-ical-url' => __( 'Events could not be imported. The URL provided did not have events in the proper format.', 'the-events-calendar' ),
693
- 'error:invalid-ics-file' => __( 'The file provided could not be opened. Please confirm that it is a properly formatted .ics file.', 'the-events-calendar' ),
694
- 'error:meetup-api-key' => __( 'Your Meetup API key is invalid.', 'the-events-calendar' ),
695
- 'error:meetup-api-quota' => __( 'Event Aggregator cannot reach Meetup.com because you exceeded the request limit for your Meetup API key.', 'the-events-calendar' ),
696
- 'error:usage-limit-exceeded' => __( 'The daily limit of %d import requests to the Event Aggregator service has been reached. Please try again later.', 'the-events-calendar' ),
697
- 'fetching' => __( 'The import is in progress.', 'the-events-calendar' ),
698
- 'queued' => __( 'The import will be starting soon.', 'the-events-calendar' ),
699
- 'success' => __( 'Success', 'the-events-calendar' ),
700
- 'success:create-import' => __( 'Import created', 'the-events-calendar' ),
701
- 'success:eventbrite-get-token' => __( 'Successfully fetched Eventbrite Token', 'the-events-calendar' ),
702
- 'success:get-origin' => __( 'Successfully loaded import origins', 'the-events-calendar' ),
703
- 'success:import-complete' => __( 'Import is complete', 'the-events-calendar' ),
704
- 'success:queued' => __( 'Import queued', 'the-events-calendar' ),
705
- 'error:invalid-other-url' => __( 'Events could not be imported. The URL provided could not be reached.', 'the-events-calendar' ),
706
- 'error:no-results' => __( 'The requested source does not have any upcoming and published events matching the search criteria.', 'the-events-calendar' ),
 
 
 
707
  'error:ical-missing-uids-schedule' => sprintf(
708
  _x(
709
  'Some events at the requested source are missing the UID attribute required by the iCalendar Specification. Creating a scheduled import would generate duplicate events on each import. Instead, please use a One-Time import or contact the source provider to fix the UID issue; linking them to %s may help them more quickly resolve their feed\'s UID issue.',
@@ -712,6 +725,7 @@ class Tribe__Events__Aggregator__Service {
712
  ),
713
  $ical_uid_specification_link
714
  ),
 
715
  'warning:ical-missing-uids-manual' => sprintf(
716
  _x(
717
  'Some events at the requested source are missing the UID attribute required by the iCalendar Specification. One-Time and ICS File imports are allowed but successive imports will create duplicated events on your site. Please contact the source provider to fix the UID issue; linking them to %s may help them more quickly resolve their feed\'s UID issue.',
@@ -719,7 +733,7 @@ class Tribe__Events__Aggregator__Service {
719
  'the-events-calendar' ),
720
  $ical_uid_specification_link
721
  ),
722
- );
723
 
724
  /**
725
  * Filters the service messages map to allow addition and removal of messages.
@@ -746,13 +760,14 @@ class Tribe__Events__Aggregator__Service {
746
  * @return bool Whether the import was confirmed or not.
747
  */
748
  public function confirm_import( $args ) {
749
- $keys = array( 'origin', 'source', 'type' );
750
  $keys = array_combine( $keys, $keys );
751
  $confirmation_args = array_intersect_key( $args, $keys );
752
- $confirmation_args = array_merge( $confirmation_args, array(
753
  'eventbrite_token' => '1',
754
  'meetup_api_key' => '1',
755
- ) );
 
756
 
757
  // Set site for origin(s) that need it for new token handling.
758
  if ( 'eventbrite' === $confirmation_args['origin'] ) {
@@ -847,6 +862,93 @@ class Tribe__Events__Aggregator__Service {
847
  return $args;
848
  }
849
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
850
  /**
851
  * Fetch Facebook Extended Token from the Service
852
  *
29
  */
30
  public static $auth_transient = 'tribe_aggregator_has_eventbrite_authorized_response';
31
 
32
+ /**
33
+ * The name of the transient containing the Meetup authorization response.
34
+ *
35
+ * @since 4.9.6
36
+ *
37
+ * @var string
38
+ */
39
+ public static $auth_transient_meetup = 'tribe_aggregator_has_meetup_authorized_response';
40
+
41
  /**
42
  * API varibles stored in a single Object
43
  *
49
  * @type array $licenses Array with plugins and licenses that we will pass to EA
50
  * }
51
  */
52
+ public $api = [
53
+ 'key' => null,
54
+ 'version' => 'v1',
55
+ 'domain' => 'https://ea.theeventscalendar.com/',
56
+ 'path' => 'api/aggregator/',
57
  'licenses' => array(),
58
+ ];
59
 
60
  /**
61
  * @var Tribe__Events__Aggregator__API__Requests
266
  }
267
 
268
  if ( empty( $data['body'] ) ) {
269
+ $args = [ 'body' => $data ];
270
  } else {
271
  $args = $data;
272
  }
285
  $json = json_decode( wp_remote_retrieve_body( $response ) );
286
 
287
  if ( empty( $json ) ) {
288
+ return tribe_error( 'core:aggregator:invalid-json-response', [ 'response' => $response ], [ 'response' => $response ] );
289
  }
290
 
291
  return $json;
308
  if ( is_wp_error( $response ) || empty( $response->status ) ) {
309
  $error = $response;
310
 
311
+ return $return_error ? [ $origins, $error ] : $origins;
312
  }
313
 
314
  if ( $response && 'success' === $response->status ) {
316
  }
317
 
318
  return $return_error
319
+ ? [ $origins, $error ]
320
  : $origins;
321
  }
322
 
328
  * @return mixed|void
329
  */
330
  public function get_eventbrite_args( ) {
331
+ $args = [
332
  'referral' => urlencode( home_url() ),
333
  'url' => urlencode( site_url() ),
334
  'secret_key' => tribe( 'events-aggregator.settings' )->get_eb_security_key()->security_key,
335
+ ];
336
 
337
  /**
338
  * Allow filtering for which params we are sending to EA for Token callback
393
 
394
  // If we have an WP_Error we return only CSV
395
  if ( is_wp_error( $response ) ) {
396
+ return tribe_error( 'core:aggregator:invalid-eventbrite-token', array(), [ 'response' => $response ] );
397
  } else {
398
  delete_transient( self::$auth_transient );
399
  }
464
  */
465
  $args = apply_filters( 'tribe_aggregator_service_post_import_args', $args, $this );
466
 
467
+ $request_args = [
468
  'body' => $args,
469
+ ];
470
 
471
  if ( isset( $args['file'] ) ) {
472
  $boundary = wp_generate_password( 24 );
473
+ $headers = [
474
  'content-type' => 'multipart/form-data; boundary=' . $boundary,
475
+ ];
476
 
477
  $payload = array();
478
  foreach ( $args as $name => $value ) {
688
  esc_html__( 'the UID part of the iCalendar Specification', 'the-events-calendar' )
689
  );
690
 
691
+ $this->service_messages = [
692
+ /* Error */
693
+ 'error:create-import-failed' => __( 'Sorry, but something went wrong. Please try again.', 'the-events-calendar' ),
694
  'error:create-import-invalid-params' => __( 'Events could not be imported. The import parameters were invalid.', 'the-events-calendar' ),
695
  'error:eb-permissions' => __( 'Events cannot be imported because Eventbrite has returned an error. This could mean that the event ID does not exist, the event or source is marked as Private, or the event or source has been otherwise restricted by Eventbrite. You can <a href="https://theeventscalendar.com/knowledgebase/import-errors/" target="_blank">read more about Eventbrite restrictions in our knowledgebase</a>.', 'the-events-calendar' ),
696
+ 'error:eb-no-results' => __( 'No upcoming Eventbrite events found.', 'the-events-calendar' ),
697
+ 'error:fetch-404' => __( 'The URL provided could not be reached.', 'the-events-calendar' ),
698
+ 'error:fetch-failed' => __( 'The URL provided failed to load.', 'the-events-calendar' ),
699
+ 'error:get-image' => __( 'The image associated with your event could not be imported.', 'the-events-calendar' ),
700
+ 'error:get-image-bad-association' => __( 'The image associated with your event is not accessible with your API key.', 'the-events-calendar' ),
701
+ 'error:import-failed' => __( 'The import failed for an unknown reason. Please try again. If the problem persists, please contact support.', 'the-events-calendar' ),
702
+ 'error:invalid-ical-url' => __( 'Events could not be imported. The URL provided did not have events in the proper format.', 'the-events-calendar' ),
703
+ 'error:invalid-ics-file' => __( 'The file provided could not be opened. Please confirm that it is a properly formatted .ics file.', 'the-events-calendar' ),
704
+ 'error:meetup-api-key' => __( 'Your Meetup API key is invalid.', 'the-events-calendar' ),
705
+ 'error:meetup-api-quota' => __( 'Event Aggregator cannot reach Meetup.com because you exceeded the request limit for your Meetup API key.', 'the-events-calendar' ),
706
+ 'error:usage-limit-exceeded' => __( 'The daily limit of %d import requests to the Event Aggregator service has been reached. Please try again later.', 'the-events-calendar' ),
707
+ /* Fetching */
708
+ 'fetching' => __( 'The import is in progress.', 'the-events-calendar' ),
709
+ /* Queued */
710
+ 'queued' => __( 'The import will be starting soon.', 'the-events-calendar' ),
711
+ /* Success */
712
+ 'success' => __( 'Success', 'the-events-calendar' ),
713
+ 'success:create-import' => __( 'Import created', 'the-events-calendar' ),
714
+ 'success:eventbrite-get-token' => __( 'Successfully fetched Eventbrite Token', 'the-events-calendar' ),
715
+ 'success:get-origin' => __( 'Successfully loaded import origins', 'the-events-calendar' ),
716
+ 'success:import-complete' => __( 'Import is complete', 'the-events-calendar' ),
717
+ 'success:queued' => __( 'Import queued', 'the-events-calendar' ),
718
+ 'error:invalid-other-url' => __( 'Events could not be imported. The URL provided could not be reached.', 'the-events-calendar' ),
719
+ 'error:no-results' => __( 'The requested source does not have any upcoming and published events matching the search criteria.', 'the-events-calendar' ),
720
  'error:ical-missing-uids-schedule' => sprintf(
721
  _x(
722
  'Some events at the requested source are missing the UID attribute required by the iCalendar Specification. Creating a scheduled import would generate duplicate events on each import. Instead, please use a One-Time import or contact the source provider to fix the UID issue; linking them to %s may help them more quickly resolve their feed\'s UID issue.',
725
  ),
726
  $ical_uid_specification_link
727
  ),
728
+ /* Warning */
729
  'warning:ical-missing-uids-manual' => sprintf(
730
  _x(
731
  'Some events at the requested source are missing the UID attribute required by the iCalendar Specification. One-Time and ICS File imports are allowed but successive imports will create duplicated events on your site. Please contact the source provider to fix the UID issue; linking them to %s may help them more quickly resolve their feed\'s UID issue.',
733
  'the-events-calendar' ),
734
  $ical_uid_specification_link
735
  ),
736
+ ];
737
 
738
  /**
739
  * Filters the service messages map to allow addition and removal of messages.
760
  * @return bool Whether the import was confirmed or not.
761
  */
762
  public function confirm_import( $args ) {
763
+ $keys = [ 'origin', 'source', 'type' ];
764
  $keys = array_combine( $keys, $keys );
765
  $confirmation_args = array_intersect_key( $args, $keys );
766
+ $confirmation_args = array_merge( $confirmation_args, [
767
  'eventbrite_token' => '1',
768
  'meetup_api_key' => '1',
769
+ ]
770
+ );
771
 
772
  // Set site for origin(s) that need it for new token handling.
773
  if ( 'eventbrite' === $confirmation_args['origin'] ) {
862
  return $args;
863
  }
864
 
865
+ /**
866
+ * Get Meetup Arguments for EA
867
+ *
868
+ * @since 4.9.6
869
+ *
870
+ * @return mixed|void
871
+ */
872
+ public function get_meetup_args() {
873
+ $args = [
874
+ 'referral' => urlencode( home_url() ),
875
+ 'url' => urlencode( site_url() ),
876
+ 'secret_key' => tribe( 'events-aggregator.settings' )->get_meetup_security_key()->security_key,
877
+ ];
878
+
879
+ /**
880
+ * Allow filtering for which params we are sending to EA for Token callback
881
+ *
882
+ * @since 4.9.6
883
+ *
884
+ * @param array $args Which arguments are sent to Token Callback
885
+ */
886
+ return apply_filters( 'tribe_aggregator_meetup_token_callback_args', $args );
887
+ }
888
+
889
+ /**
890
+ * Fetch Meetup Extended Token from the Service.
891
+ *
892
+ * @since 4.9.6
893
+ *
894
+ * @param bool $request_security_key Whether to explicitly request the Meetup security key in the response or not.
895
+ *
896
+ * @return stdClass|WP_Error Either the Event Aggregator Service response or a `WP_Error` on failure.
897
+ */
898
+ public function has_meetup_authorized( $request_security_key = false ) {
899
+
900
+ $args = $this->get_meetup_args();
901
+
902
+ if ( $request_security_key ) {
903
+ $args['secret_key'] = 'request';
904
+ }
905
+
906
+ $cached_response = get_transient( self::$auth_transient_meetup );
907
+
908
+ if ( false !== $cached_response ) {
909
+ return $cached_response;
910
+ }
911
+
912
+ $response = $this->get( 'meetup/validate', $args );
913
+
914
+ // If we have an WP_Error we return only CSV.
915
+ if ( $response instanceof WP_Error ) {
916
+ $response = tribe_error( 'core:aggregator:invalid-meetup-token', array(), [ 'response' => $response ] );
917
+ } elseif (
918
+ false === $cached_response
919
+ && isset( $response->status )
920
+ && 'error' !== $response->status
921
+ ) {
922
+ // Check this each 15 minutes.
923
+ set_transient( self::$auth_transient_meetup, $response, 900 );
924
+ }
925
+
926
+ return $response;
927
+ }
928
+
929
+ /**
930
+ * Disconnect Meetup Token on EA
931
+ *
932
+ * @since 4.9.6
933
+ *
934
+ * @return stdClass|WP_Error
935
+ */
936
+ public function disconnect_meetup_token() {
937
+
938
+ $args = $this->get_meetup_args();
939
+
940
+ $response = $this->get( 'meetup/disconnect', $args );
941
+
942
+ // If we have an WP_Error we return only CSV
943
+ if ( is_wp_error( $response ) ) {
944
+ return tribe_error( 'core:aggregator:invalid-meetup-token', array(), [ 'response' => $response ] );
945
+ } else {
946
+ delete_transient( self::$auth_transient_meetup );
947
+ }
948
+
949
+ return $response;
950
+ }
951
+
952
  /**
953
  * Fetch Facebook Extended Token from the Service
954
  *
src/Tribe/Aggregator/Settings.php CHANGED
@@ -30,8 +30,9 @@ class Tribe__Events__Aggregator__Settings {
30
  * Note: This should load on `plugins_loaded@P10`
31
  */
32
  public function __construct() {
33
- add_action( 'tribe_settings_do_tabs', array( $this, 'do_import_settings_tab' ) );
34
- add_action( 'current_screen', array( $this, 'maybe_clear_eb_credentials' ) );
 
35
  }
36
 
37
  /**
@@ -62,7 +63,7 @@ class Tribe__Events__Aggregator__Settings {
62
  $this->clear_eb_credentials();
63
 
64
  wp_redirect(
65
- Tribe__Settings::instance()->get_url( array( 'tab' => 'addons' ) )
66
  );
67
  die;
68
  }
@@ -74,9 +75,9 @@ class Tribe__Events__Aggregator__Settings {
74
  *
75
  */
76
  public function get_eb_security_key() {
77
- $args = array(
78
  'security_key' => tribe_get_option( 'eb_security_key' ),
79
- );
80
 
81
  return (object) $args;
82
  }
@@ -175,12 +176,161 @@ class Tribe__Events__Aggregator__Settings {
175
  return true;
176
  }
177
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  public function do_import_settings_tab() {
179
  include_once Tribe__Events__Main::instance()->plugin_path . 'src/admin-views/aggregator/settings.php';
180
  }
181
 
182
  public function get_all_default_settings() {
183
- $origins = array(
184
  'csv',
185
  'gcal',
186
  'ical',
@@ -188,7 +338,7 @@ class Tribe__Events__Aggregator__Settings {
188
  'eventbrite',
189
  'meetup',
190
  'url',
191
- );
192
 
193
  /**
194
  * Filters the origins available for the default import settings handling.
@@ -202,11 +352,11 @@ class Tribe__Events__Aggregator__Settings {
202
  $settings = array();
203
 
204
  foreach ( $origins as $origin ) {
205
- $settings[ $origin ] = array(
206
  'post_status' => $this->default_post_status( $origin ),
207
  'category' => $this->default_category( $origin ),
208
  'map' => $this->default_map( $origin ),
209
- );
210
  }
211
 
212
  return $settings;
@@ -353,11 +503,11 @@ class Tribe__Events__Aggregator__Settings {
353
  * format.
354
  */
355
  public function get_import_limit_type_options( ) {
356
- $options = array(
357
  'range' => __( 'By date range', 'the-events-calendar' ),
358
  'count' => __( 'By number of events', 'the-events-calendar' ),
359
  'no_limit' => __( 'Do not limit (not recommended)', 'the-events-calendar' ),
360
- );
361
 
362
  /**
363
  * Filters the options available for the default import limit options.
@@ -382,38 +532,38 @@ class Tribe__Events__Aggregator__Settings {
382
  */
383
  protected function get_range_options() {
384
  return array(
385
- DAY_IN_SECONDS => array(
386
  'title' => __( '24 hours', 'the-events-calendar' ),
387
  'range' => __( '24 hours', 'the-events-calendar' ),
388
- ),
389
- 3 * DAY_IN_SECONDS => array(
390
  'title' => __( '72 hours', 'the-events-calendar' ),
391
  'range' => __( '72 hours', 'the-events-calendar' ),
392
- ),
393
- WEEK_IN_SECONDS => array(
394
  'title' => __( 'One week', 'the-events-calendar' ),
395
  'range' => __( 'one week', 'the-events-calendar' ),
396
- ),
397
- 2 * WEEK_IN_SECONDS => array(
398
  'title' => __( 'Two weeks', 'the-events-calendar' ),
399
  'range' => __( 'two weeks', 'the-events-calendar' ),
400
- ),
401
- 3 * WEEK_IN_SECONDS => array(
402
  'title' => __( 'Three weeks', 'the-events-calendar' ),
403
  'range' => __( 'three weeks', 'the-events-calendar' ),
404
- ),
405
- 30 * DAY_IN_SECONDS => array(
406
  'title' => __( 'One month', 'the-events-calendar' ),
407
  'range' => __( 'one month', 'the-events-calendar' ),
408
- ),
409
- 2 * 30 * DAY_IN_SECONDS => array(
410
  'title' => __( 'Two months', 'the-events-calendar' ),
411
  'range' => __( 'two months', 'the-events-calendar' ),
412
- ),
413
- 3 * 30 * DAY_IN_SECONDS => array(
414
  'title' => __( 'Three months', 'the-events-calendar' ),
415
  'range' => __( 'three months', 'the-events-calendar' ),
416
- ),
417
  );
418
  }
419
 
@@ -457,7 +607,7 @@ class Tribe__Events__Aggregator__Settings {
457
  * @return array $options An array of arrays in the format [ <number> => <number> ].
458
  */
459
  public function get_import_limit_count_options() {
460
- $numbers = array( 50, 100, 200, 300, 500, 750, 1000, 1500, 2000, 2500, 3000, 3500, 4000 );
461
 
462
  $options = array_combine( $numbers, $numbers );
463
 
@@ -518,10 +668,10 @@ class Tribe__Events__Aggregator__Settings {
518
  * @return array
519
  */
520
  public function get_source_origin_regexp() {
521
- $origins = array(
522
  'eventbrite' => Tribe__Events__Aggregator__Record__Eventbrite::get_source_regexp(),
523
  'meetup' => Tribe__Events__Aggregator__Record__Meetup::get_source_regexp(),
524
- );
525
 
526
  /**
527
  * Allows external plugins to filter which are the source Regular EXP
@@ -593,7 +743,7 @@ class Tribe__Events__Aggregator__Settings {
593
  $this->clear_fb_credentials();
594
 
595
  wp_redirect(
596
- Tribe__Settings::instance()->get_url( array( 'tab' => 'addons' ) )
597
  );
598
  die;
599
  }
@@ -604,11 +754,11 @@ class Tribe__Events__Aggregator__Settings {
604
  public function get_fb_credentials() {
605
  _deprecated_function( __FUNCTION__, '4.6.23', 'Importing from Facebook is no longer supported in Event Aggregator.' );
606
 
607
- $args = array(
608
  'token' => tribe_get_option( 'fb_token' ),
609
  'expires' => tribe_get_option( 'fb_token_expires' ),
610
  'scopes' => tribe_get_option( 'fb_token_scopes' ),
611
- );
612
 
613
  return (object) $args;
614
  }
30
  * Note: This should load on `plugins_loaded@P10`
31
  */
32
  public function __construct() {
33
+ add_action( 'tribe_settings_do_tabs', [ $this, 'do_import_settings_tab' ] );
34
+ add_action( 'current_screen', [ $this, 'maybe_clear_eb_credentials' ] );
35
+ add_action( 'current_screen', [ $this, 'maybe_clear_meetup_credentials' ] );
36
  }
37
 
38
  /**
63
  $this->clear_eb_credentials();
64
 
65
  wp_redirect(
66
+ Tribe__Settings::instance()->get_url( [ 'tab' => 'addons' ] )
67
  );
68
  die;
69
  }
75
  *
76
  */
77
  public function get_eb_security_key() {
78
+ $args = [
79
  'security_key' => tribe_get_option( 'eb_security_key' ),
80
+ ];
81
 
82
  return (object) $args;
83
  }
176
  return true;
177
  }
178
 
179
+ /**
180
+ * Hooked to current_screen, this method identifies whether or not eb credentials should be cleared
181
+ *
182
+ * @since 4.9.6
183
+ *
184
+ * @param WP_Screen $screen The current screen instance.
185
+ */
186
+ public function maybe_clear_meetup_credentials( $screen ) {
187
+ if ( 'tribe_events_page_tribe-common' !== $screen->base ) {
188
+ return;
189
+ }
190
+
191
+ if ( tribe_get_request_var( 'tab', false ) !== 'addons' ) {
192
+ return;
193
+ }
194
+
195
+ $action = tribe_get_request_var( 'action' ) === 'disconnect-meetup';
196
+ $nonce = tribe_get_request_var( '_wpnonce' );
197
+
198
+ if ( ! ( $action && $nonce && wp_verify_nonce( $nonce, 'disconnect-meetup' ) ) ) {
199
+ return;
200
+ }
201
+
202
+ $this->clear_meetup_credentials();
203
+
204
+ wp_redirect(
205
+ Tribe__Settings::instance()->get_url( [ 'tab' => 'addons' ] )
206
+ );
207
+ die;
208
+ }
209
+
210
+ /**
211
+ * Get EB Security Key
212
+ *
213
+ * @since 4.9.6
214
+ *
215
+ */
216
+ public function get_meetup_security_key() {
217
+ $args = [
218
+ 'security_key' => tribe_get_option( 'meetup_security_key' ),
219
+ ];
220
+
221
+ return (object) $args;
222
+ }
223
+
224
+ /**
225
+ * Check if Security Key
226
+ *
227
+ * @since 4.9.6
228
+ *
229
+ * @return bool
230
+ *
231
+ */
232
+ public function has_meetup_security_key() {
233
+ $credentials = $this->get_meetup_security_key();
234
+
235
+ return ! empty( $credentials->security_key );
236
+ }
237
+
238
+ /**
239
+ * Handle Checking if there is a Security Key and Saving It
240
+ *
241
+ * @since 4.9.6
242
+ *
243
+ * @param object $eb_authorized object from EA service for Meetup Validation
244
+ *
245
+ * @return bool
246
+ */
247
+ public function handle_meetup_security_key( $meetup_authorized ) {
248
+
249
+ // key is sent on initial authorization and save it if we have it
250
+ if ( ! empty( $meetup_authorized->data->secret_key ) ) {
251
+ tribe_update_option( 'meetup_security_key', esc_attr( $meetup_authorized->data->secret_key ) );
252
+
253
+ // If we have a Meetup OAuth flow security key, then we can remove the old Meetup API key, if any.
254
+ tribe_update_option( 'meetup_api_key', '' );
255
+
256
+ return true;
257
+ }
258
+
259
+
260
+ if ( $this->has_meetup_security_key() ) {
261
+ return true;
262
+ }
263
+
264
+ return false;
265
+ }
266
+
267
+ /**
268
+ * Disconnect Meetup from EA
269
+ *
270
+ * @since 4.9.6
271
+ */
272
+ public function clear_meetup_credentials() {
273
+
274
+ tribe( 'events-aggregator.service' )->disconnect_meetup_token();
275
+
276
+ tribe_update_option( 'meetup_security_key', null );
277
+ delete_transient( Tribe__Events__Aggregator__Service::$auth_transient_meetup );
278
+
279
+ }
280
+
281
+ /**
282
+ * Given a URL, tack on the parts of the URL that gets used to disconnect Meetup
283
+ *
284
+ * @param string $url
285
+ *
286
+ * @since 4.9.6
287
+ *
288
+ * @return string The URL to issue a Meeetup disconnect request to EA Service.
289
+ */
290
+ public function build_disconnect_meetup_url( $url ) {
291
+ return wp_nonce_url(
292
+ add_query_arg(
293
+ 'action',
294
+ 'disconnect-meetup',
295
+ $url
296
+ ),
297
+ 'disconnect-meetup'
298
+ );
299
+ }
300
+
301
+ /**
302
+ * Check if the Meetup API credentials are connected in EA and correctly set.
303
+ *
304
+ * @since 4.9.6
305
+ *
306
+ * @return bool Whether the Meetup credentials are valid or not.
307
+ */
308
+ public function is_ea_authorized_for_meetup() {
309
+ // If the service hasn't enabled oauth for Meetup, always assume it is valid.
310
+ if ( ! tribe( 'events-aggregator.main' )->api( 'origins' )->is_oauth_enabled( 'meetup' ) ) {
311
+ return true;
312
+ }
313
+
314
+ $request_secret_key = ! $this->has_meetup_security_key();
315
+ $meetup_authorized = tribe( 'events-aggregator.service' )->has_meetup_authorized( $request_secret_key );
316
+
317
+ if ( empty( $meetup_authorized->status ) || 'success' !== $meetup_authorized->status ) {
318
+ return false;
319
+ }
320
+
321
+ if ( ! $this->handle_meetup_security_key( $meetup_authorized ) ) {
322
+ return false;
323
+ }
324
+
325
+ return true;
326
+ }
327
+
328
  public function do_import_settings_tab() {
329
  include_once Tribe__Events__Main::instance()->plugin_path . 'src/admin-views/aggregator/settings.php';
330
  }
331
 
332
  public function get_all_default_settings() {
333
+ $origins = [
334
  'csv',
335
  'gcal',
336
  'ical',
338
  'eventbrite',
339
  'meetup',
340
  'url',
341
+ ];
342
 
343
  /**
344
  * Filters the origins available for the default import settings handling.
352
  $settings = array();
353
 
354
  foreach ( $origins as $origin ) {
355
+ $settings[ $origin ] = [
356
  'post_status' => $this->default_post_status( $origin ),
357
  'category' => $this->default_category( $origin ),
358
  'map' => $this->default_map( $origin ),
359
+ ];
360
  }
361
 
362
  return $settings;
503
  * format.
504
  */
505
  public function get_import_limit_type_options( ) {
506
+ $options = [
507
  'range' => __( 'By date range', 'the-events-calendar' ),
508
  'count' => __( 'By number of events', 'the-events-calendar' ),
509
  'no_limit' => __( 'Do not limit (not recommended)', 'the-events-calendar' ),
510
+ ];
511
 
512
  /**
513
  * Filters the options available for the default import limit options.
532
  */
533
  protected function get_range_options() {
534
  return array(
535
+ DAY_IN_SECONDS => [
536
  'title' => __( '24 hours', 'the-events-calendar' ),
537
  'range' => __( '24 hours', 'the-events-calendar' ),
538
+ ],
539
+ 3 * DAY_IN_SECONDS => [
540
  'title' => __( '72 hours', 'the-events-calendar' ),
541
  'range' => __( '72 hours', 'the-events-calendar' ),
542
+ ],
543
+ WEEK_IN_SECONDS => [
544
  'title' => __( 'One week', 'the-events-calendar' ),
545
  'range' => __( 'one week', 'the-events-calendar' ),
546
+ ],
547
+ 2 * WEEK_IN_SECONDS => [
548
  'title' => __( 'Two weeks', 'the-events-calendar' ),
549
  'range' => __( 'two weeks', 'the-events-calendar' ),
550
+ ],
551
+ 3 * WEEK_IN_SECONDS => [
552
  'title' => __( 'Three weeks', 'the-events-calendar' ),
553
  'range' => __( 'three weeks', 'the-events-calendar' ),
554
+ ],
555
+ 30 * DAY_IN_SECONDS => [
556
  'title' => __( 'One month', 'the-events-calendar' ),
557
  'range' => __( 'one month', 'the-events-calendar' ),
558
+ ],
559
+ 2 * 30 * DAY_IN_SECONDS => [
560
  'title' => __( 'Two months', 'the-events-calendar' ),
561
  'range' => __( 'two months', 'the-events-calendar' ),
562
+ ],
563
+ 3 * 30 * DAY_IN_SECONDS => [
564
  'title' => __( 'Three months', 'the-events-calendar' ),
565
  'range' => __( 'three months', 'the-events-calendar' ),
566
+ ],
567
  );
568
  }
569
 
607
  * @return array $options An array of arrays in the format [ <number> => <number> ].
608
  */
609
  public function get_import_limit_count_options() {
610
+ $numbers = [ 50, 100, 200, 300, 500, 750, 1000, 1500, 2000, 2500, 3000, 3500, 4000 ];
611
 
612
  $options = array_combine( $numbers, $numbers );
613
 
668
  * @return array
669
  */
670
  public function get_source_origin_regexp() {
671
+ $origins = [
672
  'eventbrite' => Tribe__Events__Aggregator__Record__Eventbrite::get_source_regexp(),
673
  'meetup' => Tribe__Events__Aggregator__Record__Meetup::get_source_regexp(),
674
+ ];
675
 
676
  /**
677
  * Allows external plugins to filter which are the source Regular EXP
743
  $this->clear_fb_credentials();
744
 
745
  wp_redirect(
746
+ Tribe__Settings::instance()->get_url( [ 'tab' => 'addons' ] )
747
  );
748
  die;
749
  }
754
  public function get_fb_credentials() {
755
  _deprecated_function( __FUNCTION__, '4.6.23', 'Importing from Facebook is no longer supported in Event Aggregator.' );
756
 
757
+ $args = [
758
  'token' => tribe_get_option( 'fb_token' ),
759
  'expires' => tribe_get_option( 'fb_token_expires' ),
760
  'scopes' => tribe_get_option( 'fb_token_scopes' ),
761
+ ];
762
 
763
  return (object) $args;
764
  }
src/Tribe/Main.php CHANGED
@@ -32,7 +32,7 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
32
  const VENUE_POST_TYPE = 'tribe_venue';
33
  const ORGANIZER_POST_TYPE = 'tribe_organizer';
34
 
35
- const VERSION = '4.9.5';
36
 
37
  /**
38
  * Min Pro Addon
32
  const VENUE_POST_TYPE = 'tribe_venue';
33
  const ORGANIZER_POST_TYPE = 'tribe_organizer';
34
 
35
+ const VERSION = '4.9.6';
36
 
37
  /**
38
  * Min Pro Addon
src/admin-views/aggregator/origins/eventbrite.php CHANGED
@@ -41,7 +41,7 @@ if ( $missing_eventbrite_credentials ) :
41
  );
42
  ?>
43
  </p>
44
- <a class="tribe-ea-eventbrite-button" href="<?php echo esc_url( Tribe__Events__Aggregator__Record__Eventbrite::get_auth_url() ); ?>"><?php esc_html_e( 'Log into Eventbrite', 'the-events-calendar' ); ?></a>
45
  </div>
46
  </td>
47
  </tr>
41
  );
42
  ?>
43
  </p>
44
+ <a class="tribe-ea-eventbrite-button tribe-ea-login-button" href="<?php echo esc_url( Tribe__Events__Aggregator__Record__Eventbrite::get_auth_url() ); ?>"><?php esc_html_e( 'Log into Eventbrite', 'the-events-calendar' ); ?></a>
45
  </div>
46
  </td>
47
  </tr>
src/admin-views/aggregator/origins/meetup.php CHANGED
@@ -15,65 +15,42 @@ $frequency->source = 'meetup_import_frequency';
15
  $cron = Tribe__Events__Aggregator__Cron::instance();
16
  $frequencies = $cron->get_frequency();
17
 
18
- $meetup_api_key = tribe_get_option( 'meetup_api_key' );
19
- $missing_meetup_credentials = ! $meetup_api_key;
 
20
 
21
- ?>
22
- <tr class="tribe-dependent tribe-credential-row" data-depends="#tribe-ea-field-origin" data-condition="meetup">
23
- <td colspan="2" class="<?php echo esc_attr( $missing_meetup_credentials ? 'enter-credentials' : 'has-credentials' ); ?>">
24
- <?php
25
- if ( $missing_meetup_credentials ) :
26
- ?>
 
27
  <input type="hidden" name="has-credentials" id="tribe-has-meetup-credentials" value="0">
28
  <div class="tribe-message tribe-credentials-prompt">
29
- <span class="dashicons dashicons-warning"></span>
30
- <?php
31
- printf(
32
- esc_html__(
33
- 'Enter your Meetup API key to import Meetup events. %1$sClick here to get your Meetup API key%2$s. You only need to do this once, it will be saved under %3$sEvents &gt; Settings &gt; APIs%4$s',
34
- 'the-events-calendar'
35
- ),
36
- '<a href="https://secure.meetup.com/meetup_api/key/">',
37
- '</a>',
38
- '<a href="' . esc_url( Tribe__Settings::instance()->get_url( array( 'tab' => 'addons' ) ) ) . '">',
39
- '</a>'
40
- );
41
- ?>
42
- </div>
43
- <div class="tribe-message tribe-credentials-success">
44
- <span class="dashicons dashicons-yes"></span>
45
- <?php
46
- printf(
47
- esc_html__(
48
- 'Your Meetup API key has been saved to %1$sEvents &gt; Settings &gt; APIs%2$s',
49
  'the-events-calendar'
50
- ),
51
- '<a href="' . esc_url( Tribe__Settings::instance()->get_url( array( 'tab' => 'addons' ) ) ) . '">',
52
- '</a>'
53
- );
54
- ?>
 
55
  </div>
56
- <div class="tribe-fieldset">
57
- <?php wp_nonce_field( 'tribe-save-meetup-credentials' ); ?>
58
- <input type="hidden" name="tribe_credentials_which" value="meetup">
59
- <label for="meetup_api_key"><?php esc_html_e( 'Meetup API Key:', 'the-events-calendar' ); ?></label>
60
- <input type="text" name="meetup_api_key" id="meetup_api_key" value="<?php echo esc_attr( $meetup_api_key ); ?>">
61
- <button type="button" class="button tribe-save"><?php esc_html_e( 'Save', 'the-events-calendar' ); ?></button>
62
- </div>
63
- <?php
64
- else:
65
- ?>
66
- <input type="hidden" name="has-credentials" id="tribe-has-meetup-credentials" value="1">
67
- <?php
68
- endif;
69
- ?>
70
- </td>
71
- </tr>
72
- <tr class="tribe-dependent" data-depends="#tribe-ea-field-origin" data-condition="meetup">
73
- <th scope="row" class="tribe-dependent" data-depends="#tribe-has-meetup-credentials" data-condition="1">
74
  <label for="tribe-ea-field-import_type"><?php echo esc_html( $field->label ); ?></label>
75
  </th>
76
- <td class="tribe-dependent" data-depends="#tribe-has-meetup-credentials" data-condition="1">
77
 
78
  <?php if ( 'edit' === $aggregator_action ) : ?>
79
  <input type="hidden" name="aggregator[meetup][import_type]" id="tribe-ea-field-meetup_import_type" value="schedule" />
15
  $cron = Tribe__Events__Aggregator__Cron::instance();
16
  $frequencies = $cron->get_frequency();
17
 
18
+ $missing_meetup_credentials = ! tribe( 'events-aggregator.settings' )->is_ea_authorized_for_meetup();
19
+ $data_depends = '#tribe-ea-field-origin';
20
+ $data_condition = 'meetup';
21
 
22
+ if ( $missing_meetup_credentials ) :
23
+ $data_depends = '#tribe-has-meetup-credentials';
24
+ $data_condition = '1';
25
+ $meetup_auth_url = Tribe__Events__Aggregator__Record__Meetup::get_auth_url();
26
+ ?>
27
+ <tr class="tribe-dependent tribe-credential-row" data-depends="#tribe-ea-field-origin" data-condition="meetup">
28
+ <td colspan="2" class="<?php echo esc_attr( $missing_meetup_credentials ? 'enter-credentials' : 'has-credentials' ); ?>">
29
  <input type="hidden" name="has-credentials" id="tribe-has-meetup-credentials" value="0">
30
  <div class="tribe-message tribe-credentials-prompt">
31
+ <p>
32
+ <span class="dashicons dashicons-warning"></span>
33
+ <?php
34
+ esc_html_e(
35
+ 'Please log in to enable event imports from Meetup.',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  'the-events-calendar'
37
+ );
38
+ ?>
39
+ </p>
40
+ <a class="tribe-ea-meetup-button tribe-ea-login-button" href="<?php echo esc_url( $meetup_auth_url ); ?>">
41
+ <?php esc_html_e( 'Log into Meetup', 'the-events-calendar' ); ?>
42
+ </a>
43
  </div>
44
+ </td>
45
+ </tr>
46
+ <?php endif; ?>
47
+
48
+ <tr class="tribe-dependent" data-depends="<?php echo esc_attr( $data_depends ); ?>"
49
+ data-condition="<?php echo esc_attr( $data_condition ); ?>">
50
+ <th scope="row">
 
 
 
 
 
 
 
 
 
 
 
51
  <label for="tribe-ea-field-import_type"><?php echo esc_html( $field->label ); ?></label>
52
  </th>
53
+ <td>
54
 
55
  <?php if ( 'edit' === $aggregator_action ) : ?>
56
  <input type="hidden" name="aggregator[meetup][import_type]" id="tribe-ea-field-meetup_import_type" value="schedule" />
src/admin-views/aggregator/settings.php CHANGED
@@ -6,16 +6,16 @@
6
  $internal = array();
7
  $use_global_settings_phrase = esc_html__( 'Use global import settings', 'the-events-calendar' );
8
  $post_statuses = get_post_statuses( array() );
9
- $category_dropdown = wp_dropdown_categories( array(
10
  'echo' => false,
11
  'hide_empty' => false,
12
  'orderby' => 'post_title',
13
  'taxonomy' => Tribe__Events__Main::TAXONOMY,
14
- ) );
15
  preg_match_all( '!\<option.*value="([^"]+)"[^\>]*\>(.*)\</option\>!m', $category_dropdown, $matches );
16
- $categories = array(
17
  '' => __( 'No default category', 'the-events-calendar' ),
18
- );
19
  $events_aggregator_is_active = tribe( 'events-aggregator.main' )->is_service_active();
20
 
21
  $origin_post_statuses = $events_aggregator_is_active
@@ -31,46 +31,46 @@ foreach ( $matches[1] as $key => $match ) {
31
  $origin_categories[ $match ] = $matches[2][ $key ];
32
  }
33
 
34
- $yes_no_options = array(
35
  'no' => __( 'No', 'the-events-calendar' ),
36
  'yes' => __( 'Yes', 'the-events-calendar' ),
37
- );
38
 
39
  $origin_show_map_options = array( '' => $use_global_settings_phrase ) + $yes_no_options;
40
 
41
- $change_authority = array(
42
- 'import-defaults-update_authority' => array(
43
  'type' => 'html',
44
  'html' => '<h3 id="tribe-import-update-authority">' . esc_html__( 'Event Update Authority', 'the-events-calendar' ) . '</h3>',
45
  'priority' => 1.1,
46
- ),
47
- 'info-update_authority' => array(
48
  'type' => 'html',
49
  'html' => '<p>' . esc_html__( 'You can make changes to imported events via The Events Calendar and see those changes reflected on your site’s calendar. The owner of the original event source (e.g. the iCalendar feed or Meetup group) might also make changes to their event. If you choose to re-import an altered event (manually or via a scheduled import), any changes made at the source or on your calendar will need to be addressed.', 'the-events-calendar' ) . '</p>',
50
  'priority' => 1.2,
51
- ),
52
- 'tribe_aggregator_default_update_authority' => array(
53
  'type' => 'radio',
54
  'label' => esc_html__( 'Event Update Authority', 'the-events-calendar' ),
55
  'validation_type' => 'options',
56
  'default' => Tribe__Events__Aggregator__Settings::$default_update_authority,
57
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
58
- 'options' => array(
59
  'overwrite' => __( 'Overwrite my event with any changes from the original source.', 'the-events-calendar' ),
60
  'retain' => __( 'Do not re-import events. Changes made locally will be preserved.', 'the-events-calendar' ),
61
  'preserve_changes' => __( 'Import events but preserve local changes to event fields.', 'the-events-calendar' ),
62
- ),
63
  'priority' => 1.3,
64
- ),
65
- );
66
 
67
- $csv = array(
68
- 'csv-defaults' => array(
69
- 'type' => 'html',
70
- 'html' => '<h3 id="tribe-import-csv-settings">' . esc_html__( 'CSV Import Settings', 'the-events-calendar' ) . '</h3>',
71
  'priority' => 10.1,
72
- ),
73
- 'tribe_aggregator_default_csv_post_status' => array(
74
  'type' => 'dropdown',
75
  'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
76
  'tooltip' => esc_html__( 'The default post status for events imported via CSV', 'the-events-calendar' ),
@@ -80,9 +80,9 @@ $csv = array(
80
  'can_be_empty' => true,
81
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
82
  'options' => $origin_post_statuses,
83
- 'priority' => 10.2,
84
- ),
85
- 'tribe_aggregator_default_csv_category' => array(
86
  'type' => 'dropdown',
87
  'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
88
  'tooltip' => esc_html__( 'The default event category for events imported via CSV', 'the-events-calendar' ),
@@ -92,26 +92,26 @@ $csv = array(
92
  'can_be_empty' => true,
93
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
94
  'options' => $origin_categories,
95
- 'priority' => 10.3,
96
- ),
97
- );
98
-
99
- $ea_disable = array(
100
- 'tribe_aggregator_disable_header' => array(
101
- 'type' => 'html',
102
- 'html' => '<h3 id="tribe-import-ea-disable">' . esc_html__( 'Event Aggregator Control', 'the-events-calendar' ) . '</h3>',
103
  'priority' => 50.1,
104
- ),
105
- 'tribe_aggregator_disable' => array(
106
  'type' => 'checkbox_bool',
107
  'label' => __( 'Disable Event Aggregator imports', 'the-events-calendar' ),
108
  'tooltip' => __( 'Stop all Event Aggregator imports from running. Existing imported events will not be affected. Imports via CSV file will still be available.', 'the-events-calendar' ),
109
  'default' => false,
110
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
111
  'validation_type' => 'boolean',
112
- 'priority' => 50.2,
113
- ),
114
- );
115
 
116
  $global = $ical = $ics = $gcal = $meetup = $url = $eb_fields = array();
117
  // if there's an Event Aggregator license key, add the Global settings, iCal, and Meetup fields
@@ -124,256 +124,255 @@ if ( Tribe__Events__Aggregator::is_service_active() ) {
124
  )
125
  );
126
 
127
- $global = array(
128
- 'import-defaults' => array(
129
- 'type' => 'html',
130
- 'html' => '<h3 id="tribe-import-global-settings">' . esc_html__( 'Global Import Settings', 'the-events-calendar' ) . '</h3>',
131
  'priority' => 5.1,
132
- ),
133
- 'tribe_aggregator_default_post_status' => array(
134
- 'type' => 'dropdown',
135
- 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
136
- 'tooltip' => esc_html__( 'The default post status for events', 'the-events-calendar' ),
137
- 'size' => 'medium',
138
  'validation_type' => 'options',
139
- 'default' => 'publish',
140
- 'can_be_empty' => true,
141
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
142
- 'options' => $post_statuses,
143
- 'priority' => 5.2,
144
- ),
145
- 'tribe_aggregator_default_category' => array(
146
- 'type' => 'dropdown',
147
- 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
148
- 'tooltip' => esc_html__( 'The default event category for events', 'the-events-calendar' ),
149
- 'size' => 'medium',
150
  'validation_type' => 'options',
151
- 'default' => '',
152
- 'can_be_empty' => true,
153
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
154
- 'options' => $categories,
155
- 'priority' => 5.3,
156
- ),
157
- 'tribe_aggregator_default_show_map' => array(
158
- 'type' => 'dropdown',
159
- 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
160
- 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
161
- 'size' => 'medium',
162
  'validation_type' => 'options',
163
- 'default' => 'no',
164
- 'can_be_empty' => true,
165
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
166
- 'options' => $yes_no_options,
167
- 'priority' => 5.4,
168
- ),
169
- 'tribe_aggregator_default_import_limit_type' => array(
170
- 'type' => 'dropdown',
171
- 'label' => esc_html__( 'Import Limit Type', 'the-events-calendar' ),
172
- 'tooltip' => esc_html__( 'Limit the number of imported events by number, date range, or not at all; on slower websites this may impact the success of imports. Selecting a shorter time period or a smaller number of events may improve results.', 'the-events-calendar' ),
173
-
174
- 'size' => 'medium',
175
  'validation_type' => 'options',
176
- 'default' => 'range',
177
- 'can_be_empty' => false,
178
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
179
- 'options' => tribe( 'events-aggregator.settings' )->get_import_limit_type_options(),
180
- 'priority' => 5.5,
181
- ),
182
- 'tribe_aggregator_default_import_limit_range' => array(
183
- 'type' => 'dropdown',
184
- 'label' => esc_html__( 'Import Date Range Limit', 'the-events-calendar' ),
185
- 'tooltip' => esc_html__( 'When importing from an event source, this is how far into the future the events will be fetched; on slower websites a larger date range may impact the success of imports. Selecting a shorter time period may improve results.', 'the-events-calendar' ),
186
- 'size' => 'medium',
187
  'validation_type' => 'options',
188
- 'default' => tribe( 'events-aggregator.settings' )->get_import_range_default( true ),
189
- 'can_be_empty' => true,
190
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
191
- 'options' => tribe( 'events-aggregator.settings' )->get_import_range_options( true ),
192
- 'class' => 'tribe-dependent',
193
- 'fieldset_attributes' => array(
194
  'data-depends' => '#tribe_aggregator_default_import_limit_type-select',
195
  'data-condition' => 'range',
196
- ),
197
- 'priority' => 5.6,
198
- ),
199
- 'tribe_aggregator_default_import_limit_number' => array(
200
- 'type' => 'dropdown',
201
- 'label' => esc_html__( 'Import Quantity Limit', 'the-events-calendar' ),
202
- 'tooltip' => esc_html__( 'When importing from an event source, this is the maximum number of events that will be imported; on slower websites this may impact the success of imports. Setting this to a smaller number may improve results.', 'the-events-calendar' ),
203
- 'size' => 'medium',
204
  'validation_type' => 'options',
205
- 'default' => tribe( 'events-aggregator.settings' )->get_import_limit_count_default(),
206
- 'can_be_empty' => true,
207
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
208
- 'options' => tribe( 'events-aggregator.settings' )->get_import_limit_count_options(),
209
- 'class' => 'tribe-dependent',
210
- 'fieldset_attributes' => array(
211
  'data-depends' => '#tribe_aggregator_default_import_limit_type-select',
212
  'data-condition' => 'count',
213
- ),
214
- 'priority' => 5.7,
215
- ),
216
- 'tribe_aggregator_import_process_system' => array(
217
- 'type' => 'dropdown',
218
- 'label' => esc_html__( 'Import Process System', 'the-events-calendar' ),
219
- 'tooltip' => esc_html__( 'The Asynchronous import process is faster and does not rely on WordPress Cron but might not work correctly in all WordPress installations, try switching to the Cron-based process for maximum compatibility.', 'the-events-calendar' ),
220
- 'size' => 'medium',
221
  'validation_type' => 'options',
222
- 'default' => tribe( 'events-aggregator.settings' )->get_import_process_default( false ),
223
- 'can_be_empty' => false,
224
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
225
- 'options' => tribe( 'events-aggregator.settings' )->get_import_process_options( true ),
226
- 'priority' => 5.8,
227
- ),
228
- 'tribe_aggregator_import_process_control' => array(
229
- 'type' => 'wrapped_html',
230
- 'label' => esc_html__( 'Stop current processes', 'the-events-calendar' ),
231
- 'html' => $stop_running_processes_message,
232
- 'priority' => 5.9,
233
- ),
234
- );
235
-
236
- $ical = array(
237
- 'ical-defaults' => array(
238
  'type' => 'html',
239
  'html' => '<h3 id="tribe-import-ical-settings">' . esc_html__( 'iCalendar Import Settings', 'the-events-calendar' ) . '</h3>',
240
  'priority' => 20.1,
241
- ),
242
- 'tribe_aggregator_default_ical_post_status' => array(
243
- 'type' => 'dropdown',
244
- 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
245
- 'tooltip' => esc_html__( 'The default post status for events imported via iCalendar', 'the-events-calendar' ),
246
- 'size' => 'medium',
247
  'validation_type' => 'options',
248
- 'default' => '',
249
- 'can_be_empty' => true,
250
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
251
- 'options' => $origin_post_statuses,
252
- 'priority' => 20.2,
253
- ),
254
- 'tribe_aggregator_default_ical_category' => array(
255
- 'type' => 'dropdown',
256
- 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
257
- 'tooltip' => esc_html__( 'The default event category for events imported via iCalendar', 'the-events-calendar' ),
258
- 'size' => 'medium',
259
  'validation_type' => 'options',
260
- 'default' => '',
261
- 'can_be_empty' => true,
262
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
263
- 'options' => $origin_categories,
264
- 'priority' => 20.3,
265
- ),
266
- 'tribe_aggregator_default_ical_show_map' => array(
267
- 'type' => 'dropdown',
268
- 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
269
- 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
270
- 'size' => 'medium',
271
  'validation_type' => 'options',
272
- 'default' => '',
273
- 'can_be_empty' => true,
274
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
275
- 'options' => $origin_show_map_options,
276
- 'priority' => 20.4,
277
- ),
278
- );
279
 
280
- $ics = array(
281
- 'ics-defaults' => array(
282
  'type' => 'html',
283
  'html' => '<h3 id="tribe-import-ics-settings">' . esc_html__( 'ICS File Import Settings', 'the-events-calendar' ) . '</h3>',
284
- 'priority' => 25.1,
285
- ),
286
- 'tribe_aggregator_default_ics_post_status' => array(
287
- 'type' => 'dropdown',
288
- 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
289
- 'tooltip' => esc_html__( 'The default post status for events imported via .ics files', 'the-events-calendar' ),
290
- 'size' => 'medium',
291
  'validation_type' => 'options',
292
- 'default' => '',
293
- 'can_be_empty' => true,
294
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
295
- 'options' => $origin_post_statuses,
296
- 'priority' => 25.2,
297
- ),
298
- 'tribe_aggregator_default_ics_category' => array(
299
- 'type' => 'dropdown',
300
- 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
301
- 'tooltip' => esc_html__( 'The default event category for events imported via .ics files', 'the-events-calendar' ),
302
- 'size' => 'medium',
303
  'validation_type' => 'options',
304
- 'default' => '',
305
- 'can_be_empty' => true,
306
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
307
- 'options' => $origin_categories,
308
- 'priority' => 25.3,
309
- ),
310
- 'tribe_aggregator_default_ics_show_map' => array(
311
- 'type' => 'dropdown',
312
- 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
313
- 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
314
- 'size' => 'medium',
315
  'validation_type' => 'options',
316
- 'default' => '',
317
- 'can_be_empty' => true,
318
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
319
- 'options' => $origin_show_map_options,
320
- 'priority' => 25.4,
321
- ),
322
- );
323
 
324
- $gcal = array(
325
- 'gcal-defaults' => array(
326
  'type' => 'html',
327
  'html' => '<h3 id="tribe-import-google-settings">' . esc_html__( 'Google Calendar Import Settings', 'the-events-calendar' ) . '</h3>',
328
- 'priority' => 35.1,
329
- ),
330
- 'tribe_aggregator_default_gcal_post_status' => array(
331
- 'type' => 'dropdown',
332
- 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
333
- 'tooltip' => esc_html__( 'The default post status for events imported via Google Calendar', 'the-events-calendar' ),
334
- 'size' => 'medium',
335
  'validation_type' => 'options',
336
- 'default' => '',
337
- 'can_be_empty' => true,
338
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
339
- 'options' => $origin_post_statuses,
340
- 'priority' => 35.2,
341
- ),
342
- 'tribe_aggregator_default_gcal_category' => array(
343
- 'type' => 'dropdown',
344
- 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
345
- 'tooltip' => esc_html__( 'The default event category for events imported via Google Calendar', 'the-events-calendar' ),
346
- 'size' => 'medium',
347
  'validation_type' => 'options',
348
- 'default' => '',
349
- 'can_be_empty' => true,
350
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
351
- 'options' => $origin_categories,
352
- 'priority' => 35.3,
353
- ),
354
- 'tribe_aggregator_default_gcal_show_map' => array(
355
- 'type' => 'dropdown',
356
- 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
357
- 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
358
- 'size' => 'medium',
359
  'validation_type' => 'options',
360
- 'default' => '',
361
- 'can_be_empty' => true,
362
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
363
- 'options' => $origin_show_map_options,
364
- 'priority' => 35.4,
365
- ),
366
- );
367
 
368
- $meetup = array(
369
- 'meetup-defaults' => array(
370
  'type' => 'html',
371
  'html' => '<h3 id="tribe-import-meetup-settings">' . esc_html__( 'Meetup Import Settings', 'the-events-calendar' ) . '</h3>',
372
  'priority' => 40.1,
373
- ),
374
- 'meetup-defaults-info' => array(
375
- 'type' => 'html',
376
- 'html' => '<p>' . sprintf(
377
  esc_html__(
378
  'To import Meetup events, please be sure to add your Meetup API key on %1$sEvents > Settings > APIs%2$s',
379
  'the-events-calendar'
@@ -381,116 +380,116 @@ if ( Tribe__Events__Aggregator::is_service_active() ) {
381
  '<a href="' . admin_url( Tribe__Settings::$parent_page . '&page=tribe-common&tab=addons' ) . '">',
382
  '</a>'
383
  ). '</p>',
384
- 'priority' => 40.2,
385
- ),
386
- 'tribe_aggregator_default_meetup_post_status' => array(
387
- 'type' => 'dropdown',
388
- 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
389
- 'tooltip' => esc_html__( 'The default post status for events imported via Meetup', 'the-events-calendar' ),
390
- 'size' => 'medium',
391
  'validation_type' => 'options',
392
- 'default' => '',
393
- 'can_be_empty' => true,
394
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
395
- 'options' => $origin_post_statuses,
396
- 'priority' => 40.3,
397
- ),
398
- 'tribe_aggregator_default_meetup_category' => array(
399
- 'type' => 'dropdown',
400
- 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
401
- 'tooltip' => esc_html__( 'The default event category for events imported via Meetup', 'the-events-calendar' ),
402
- 'size' => 'medium',
403
  'validation_type' => 'options',
404
- 'default' => '',
405
- 'can_be_empty' => true,
406
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
407
- 'options' => $origin_categories,
408
- 'priority' => 40.4,
409
- ),
410
- 'tribe_aggregator_default_meetup_show_map' => array(
411
- 'type' => 'dropdown',
412
- 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
413
- 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
414
- 'size' => 'medium',
415
  'validation_type' => 'options',
416
- 'default' => '',
417
- 'can_be_empty' => true,
418
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
419
- 'options' => $origin_show_map_options,
420
- 'priority' => 40.5,
421
- ),
422
- );
423
-
424
- $url = array(
425
- 'url-defaults' => array(
426
- 'type' => 'html',
427
- 'html' => '<h3 id="tribe-import-url-settings">' . esc_html__( 'Other URL Import Settings', 'the-events-calendar' ) . '</h3>',
428
- 'priority' => 45.1,
429
- ),
430
- 'tribe_aggregator_default_url_post_status' => array(
431
- 'type' => 'dropdown',
432
- 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
433
- 'tooltip' => esc_html__( 'The default post status for events imported via other URLs', 'the-events-calendar' ),
434
- 'size' => 'medium',
435
  'validation_type' => 'options',
436
- 'default' => '',
437
- 'can_be_empty' => true,
438
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
439
- 'options' => $origin_post_statuses,
440
- 'priority' => 45.2,
441
- ),
442
- 'tribe_aggregator_default_url_category' => array(
443
- 'type' => 'dropdown',
444
- 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
445
- 'tooltip' => esc_html__( 'The default event category for events imported via other URLs', 'the-events-calendar' ),
446
- 'size' => 'medium',
447
  'validation_type' => 'options',
448
- 'default' => '',
449
- 'can_be_empty' => true,
450
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
451
- 'options' => $origin_categories,
452
- 'priority' => 45.3,
453
- ),
454
- 'tribe_aggregator_default_url_show_map' => array(
455
- 'type' => 'dropdown',
456
- 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
457
- 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
458
- 'size' => 'medium',
459
  'validation_type' => 'options',
460
- 'default' => '',
461
- 'can_be_empty' => true,
462
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
463
- 'options' => $origin_show_map_options,
464
- 'priority' => 45.4,
465
- ),
466
- 'tribe_aggregator_default_url_import_range' => array(
467
- 'type' => 'dropdown',
468
- 'label' => esc_html__( 'Import Date Range Limit', 'the-events-calendar' ),
469
- 'tooltip' => esc_html__( 'When importing from a website that uses The Events Calendar, the REST API will attempt to fetch events this far in the future. That website\'s hosting resources may impact the success of imports. Selecting a shorter time period may improve results.', 'the-events-calendar' ) . ' ' . sprintf( '<a href="%1$s" target="_blank">%2$s</a>', esc_attr( 'https://theeventscalendar.com/knowledgebase/url-import-errors-event-aggregator/' ), esc_html( 'Learn more.' ) ),
470
- 'size' => 'medium',
471
  'validation_type' => 'options',
472
- 'default' => tribe( 'events-aggregator.settings' )->get_import_range_default(),
473
- 'can_be_empty' => false,
474
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
475
- 'options' => tribe( 'events-aggregator.settings' )->get_url_import_range_options( true ),
476
- 'priority' => 45.5,
477
- ),
478
- 'tribe_aggregator_default_url_import_event_settings' => array(
479
- 'type' => 'dropdown',
480
- 'label' => esc_html__( 'Import Event Settings', 'the-events-calendar' ),
481
- 'tooltip' => esc_html__( "Fetch source event's settings (e.g. Show Maps Link or Sticky in Month View) when importing from another site using The Events Calendar.", 'the-events-calendar' ),
482
- 'size' => 'medium',
483
  'validation_type' => 'options',
484
- 'default' => 'no',
485
- 'can_be_empty' => true,
486
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
487
- 'options' => $yes_no_options,
488
- 'priority' => 45.6,
489
- ),
490
- );
491
 
492
  // Ensure that "(do not override)" is set up for Eventbrite import statuses, and "Published" is not.
493
- $eventbrite_origin_post_statuses = array( 'do_not_override' => esc_html__( '(do not override)', 'the-events-calendar' ) );
494
  $eventbrite_origin_post_statuses = $eventbrite_origin_post_statuses + $origin_post_statuses;
495
 
496
  unset( $eventbrite_origin_post_statuses['publish'] );
@@ -500,13 +499,13 @@ if ( Tribe__Events__Aggregator::is_service_active() ) {
500
  unset( $eventbrite_origin_post_statuses[''] );
501
  }
502
 
503
- $eb_fields = array(
504
- 'eventbrite-defaults' => array(
505
  'type' => 'html',
506
  'html' => '<h3 id="tribe-import-eventbrite-settings">' . esc_html__( 'Eventbrite Import Settings', 'the-events-calendar' ) . '</h3>',
507
  'priority' => 17.1,
508
- ),
509
- 'tribe_aggregator_default_eventbrite_post_status' => array(
510
  'type' => 'dropdown',
511
  'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
512
  'tooltip' => esc_html__( 'The default post status for events imported via Eventbrite', 'the-events-calendar' ),
@@ -517,8 +516,8 @@ if ( Tribe__Events__Aggregator::is_service_active() ) {
517
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
518
  'options' => $eventbrite_origin_post_statuses,
519
  'priority' => 17.2,
520
- ),
521
- 'tribe_aggregator_default_eventbrite_category' => array(
522
  'type' => 'dropdown',
523
  'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
524
  'tooltip' => esc_html__( 'The default event category for events imported via Eventbrite', 'the-events-calendar' ),
@@ -529,8 +528,8 @@ if ( Tribe__Events__Aggregator::is_service_active() ) {
529
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
530
  'options' => $origin_categories,
531
  'priority' => 17.3,
532
- ),
533
- 'tribe_aggregator_default_eventbrite_show_map' => array(
534
  'type' => 'dropdown',
535
  'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
536
  'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
@@ -541,8 +540,8 @@ if ( Tribe__Events__Aggregator::is_service_active() ) {
541
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
542
  'options' => $origin_show_map_options,
543
  'priority' => 17.4,
544
- ),
545
- );
546
  }
547
 
548
  $internal = array_merge(
@@ -592,56 +591,59 @@ if ( get_bloginfo( 'version' ) >= 4.7 ) {
592
 
593
  if ( tribe( 'events-aggregator.main' )->is_service_active() ) {
594
 
595
- $import_setting_links = array(
596
- 'update-authority' => array(
597
  'name' => __( 'Update Authority', 'the-events-calendar' ),
598
  'priority' => 5,
599
- ),
600
- 'global-settings' => array(
601
  'name' => __( 'Global', 'the-events-calendar' ),
602
  'priority' => 10,
603
- ),
604
- 'csv-settings' => array(
605
  'name' => __( 'CSV', 'the-events-calendar' ),
606
  'priority' => 15,
607
- ),
608
- 'ical-settings' => array(
609
  'name' => __( 'iCalendar', 'the-events-calendar' ),
610
  'priority' => 20,
611
- ),
612
- 'ics-settings' => array(
613
  'name' => __( 'ICS File', 'the-events-calendar' ),
614
  'priority' => 25,
615
- ),
616
- 'google-settings' => array(
617
  'name' => __( 'Google Calendar', 'the-events-calendar' ),
618
  'priority' => 35,
619
- ),
620
- 'meetup-settings' => array(
621
  'name' => __( 'Meetup', 'the-events-calendar' ),
622
  'priority' => 40,
623
- ),
624
- 'url-settings' => array(
625
  'name' => __( 'Other URLs', 'the-events-calendar' ),
626
  'priority' => 45,
627
- ),
628
- 'eventbrite-settings' => array(
629
  'name' => __( 'Eventbrite', 'the-events-calendar' ),
630
  'priority' => 17,
631
- ),
632
- );
633
 
634
  /**
635
  * If Eventbrite Tickets is enabled and Event Aggregator is disabled, display the correct import links
636
  */
637
- if ( class_exists( 'Tribe__Events__Tickets__Eventbrite__Main' ) && ! tribe( 'events-aggregator.main' )->has_license_key() ) {
638
- $ea_keys = array(
 
 
 
639
  'ical-settings',
640
  'ics-settings',
641
  'google-settings',
642
  'meetup-settings',
643
  'url-settings',
644
- );
645
 
646
  foreach ( $ea_keys as $key ) {
647
  unset( $import_setting_links[ $key ] );
@@ -673,7 +675,7 @@ if ( tribe( 'events-aggregator.main' )->is_service_active() ) {
673
  'Use the options below to configure your imports. Global Import Settings apply to all imports, but you can also override the global settings by adjusting the origin-specific options. Check your Event Aggregator Service Status on the %1$s.',
674
  'the-events-calendar'
675
  ),
676
- '<a href="' . Tribe__Settings::instance()->get_url( array( 'page' => 'tribe-help' ) ) . '#tribe-tribe-aggregator-status">' . esc_html__( 'Help page', 'the-events-calendar' ) . '</a>'
677
  );
678
  ?>
679
  </p>
@@ -700,35 +702,35 @@ if ( tribe( 'events-aggregator.main' )->is_service_active() ) {
700
  }
701
 
702
  $fields = array_merge(
703
- array(
704
- 'import-box-start' => array(
705
  'type' => 'html',
706
  'html' => '<div id="modern-tribe-info">',
707
- ),
708
- 'import-box-title' => array(
709
  'type' => 'html',
710
  'html' => '<h2>' . esc_html__( 'Imports', 'the-events-calendar' ) . '</h2>',
711
- ),
712
- 'import-box-description' => array(
713
  'type' => 'html',
714
  'html' => '<p>' . $import_instructions . '</p>',
715
- ),
716
- 'import-box-end' => array(
717
  'type' => 'html',
718
  'html' => '</div>',
719
- ),
720
- 'import-form-content-start' => array(
721
  'type' => 'html',
722
  'html' => '<div class="tribe-settings-form-wrap">',
723
- ),
724
- ),
725
  $internal,
726
- array(
727
- 'addons-form-content-end' => array(
728
  'type' => 'html',
729
  'html' => '</div>',
730
- ),
731
- )
732
  );
733
 
734
  /**
@@ -739,10 +741,10 @@ $fields = array_merge(
739
  */
740
  $import = apply_filters(
741
  'tribe_aggregator_tab',
742
- array(
743
  'priority' => 50,
744
  'fields' => $fields,
745
- )
746
  );
747
 
748
  // Only create the Add-ons Tab if there is any
6
  $internal = array();
7
  $use_global_settings_phrase = esc_html__( 'Use global import settings', 'the-events-calendar' );
8
  $post_statuses = get_post_statuses( array() );
9
+ $category_dropdown = wp_dropdown_categories( [
10
  'echo' => false,
11
  'hide_empty' => false,
12
  'orderby' => 'post_title',
13
  'taxonomy' => Tribe__Events__Main::TAXONOMY,
14
+ ] );
15
  preg_match_all( '!\<option.*value="([^"]+)"[^\>]*\>(.*)\</option\>!m', $category_dropdown, $matches );
16
+ $categories = [
17
  '' => __( 'No default category', 'the-events-calendar' ),
18
+ ];
19
  $events_aggregator_is_active = tribe( 'events-aggregator.main' )->is_service_active();
20
 
21
  $origin_post_statuses = $events_aggregator_is_active
31
  $origin_categories[ $match ] = $matches[2][ $key ];
32
  }
33
 
34
+ $yes_no_options = [
35
  'no' => __( 'No', 'the-events-calendar' ),
36
  'yes' => __( 'Yes', 'the-events-calendar' ),
37
+ ];
38
 
39
  $origin_show_map_options = array( '' => $use_global_settings_phrase ) + $yes_no_options;
40
 
41
+ $change_authority = [
42
+ 'import-defaults-update_authority' => [
43
  'type' => 'html',
44
  'html' => '<h3 id="tribe-import-update-authority">' . esc_html__( 'Event Update Authority', 'the-events-calendar' ) . '</h3>',
45
  'priority' => 1.1,
46
+ ],
47
+ 'info-update_authority' => [
48
  'type' => 'html',
49
  'html' => '<p>' . esc_html__( 'You can make changes to imported events via The Events Calendar and see those changes reflected on your site’s calendar. The owner of the original event source (e.g. the iCalendar feed or Meetup group) might also make changes to their event. If you choose to re-import an altered event (manually or via a scheduled import), any changes made at the source or on your calendar will need to be addressed.', 'the-events-calendar' ) . '</p>',
50
  'priority' => 1.2,
51
+ ],
52
+ 'tribe_aggregator_default_update_authority' => [
53
  'type' => 'radio',
54
  'label' => esc_html__( 'Event Update Authority', 'the-events-calendar' ),
55
  'validation_type' => 'options',
56
  'default' => Tribe__Events__Aggregator__Settings::$default_update_authority,
57
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
58
+ 'options' => [
59
  'overwrite' => __( 'Overwrite my event with any changes from the original source.', 'the-events-calendar' ),
60
  'retain' => __( 'Do not re-import events. Changes made locally will be preserved.', 'the-events-calendar' ),
61
  'preserve_changes' => __( 'Import events but preserve local changes to event fields.', 'the-events-calendar' ),
62
+ ],
63
  'priority' => 1.3,
64
+ ],
65
+ ];
66
 
67
+ $csv = [
68
+ 'csv-defaults' => [
69
+ 'type' => 'html',
70
+ 'html' => '<h3 id="tribe-import-csv-settings">' . esc_html__( 'CSV Import Settings', 'the-events-calendar' ) . '</h3>',
71
  'priority' => 10.1,
72
+ ],
73
+ 'tribe_aggregator_default_csv_post_status' => [
74
  'type' => 'dropdown',
75
  'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
76
  'tooltip' => esc_html__( 'The default post status for events imported via CSV', 'the-events-calendar' ),
80
  'can_be_empty' => true,
81
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
82
  'options' => $origin_post_statuses,
83
+ 'priority' => 10.2,
84
+ ],
85
+ 'tribe_aggregator_default_csv_category' => [
86
  'type' => 'dropdown',
87
  'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
88
  'tooltip' => esc_html__( 'The default event category for events imported via CSV', 'the-events-calendar' ),
92
  'can_be_empty' => true,
93
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
94
  'options' => $origin_categories,
95
+ 'priority' => 10.3,
96
+ ],
97
+ ];
98
+
99
+ $ea_disable = [
100
+ 'tribe_aggregator_disable_header' => [
101
+ 'type' => 'html',
102
+ 'html' => '<h3 id="tribe-import-ea-disable">' . esc_html__( 'Event Aggregator Control', 'the-events-calendar' ) . '</h3>',
103
  'priority' => 50.1,
104
+ ],
105
+ 'tribe_aggregator_disable' => [
106
  'type' => 'checkbox_bool',
107
  'label' => __( 'Disable Event Aggregator imports', 'the-events-calendar' ),
108
  'tooltip' => __( 'Stop all Event Aggregator imports from running. Existing imported events will not be affected. Imports via CSV file will still be available.', 'the-events-calendar' ),
109
  'default' => false,
110
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
111
  'validation_type' => 'boolean',
112
+ 'priority' => 50.2,
113
+ ],
114
+ ];
115
 
116
  $global = $ical = $ics = $gcal = $meetup = $url = $eb_fields = array();
117
  // if there's an Event Aggregator license key, add the Global settings, iCal, and Meetup fields
124
  )
125
  );
126
 
127
+ $global = [
128
+ 'import-defaults' => [
129
+ 'type' => 'html',
130
+ 'html' => '<h3 id="tribe-import-global-settings">' . esc_html__( 'Global Import Settings', 'the-events-calendar' ) . '</h3>',
131
  'priority' => 5.1,
132
+ ],
133
+ 'tribe_aggregator_default_post_status' => [
134
+ 'type' => 'dropdown',
135
+ 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
136
+ 'tooltip' => esc_html__( 'The default post status for events', 'the-events-calendar' ),
137
+ 'size' => 'medium',
138
  'validation_type' => 'options',
139
+ 'default' => 'publish',
140
+ 'can_be_empty' => true,
141
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
142
+ 'options' => $post_statuses,
143
+ 'priority' => 5.2,
144
+ ],
145
+ 'tribe_aggregator_default_category' => [
146
+ 'type' => 'dropdown',
147
+ 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
148
+ 'tooltip' => esc_html__( 'The default event category for events', 'the-events-calendar' ),
149
+ 'size' => 'medium',
150
  'validation_type' => 'options',
151
+ 'default' => '',
152
+ 'can_be_empty' => true,
153
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
154
+ 'options' => $categories,
155
+ 'priority' => 5.3,
156
+ ],
157
+ 'tribe_aggregator_default_show_map' => [
158
+ 'type' => 'dropdown',
159
+ 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
160
+ 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
161
+ 'size' => 'medium',
162
  'validation_type' => 'options',
163
+ 'default' => 'no',
164
+ 'can_be_empty' => true,
165
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
166
+ 'options' => $yes_no_options,
167
+ 'priority' => 5.4,
168
+ ],
169
+ 'tribe_aggregator_default_import_limit_type' => [
170
+ 'type' => 'dropdown',
171
+ 'label' => esc_html__( 'Import Limit Type', 'the-events-calendar' ),
172
+ 'tooltip' => esc_html__( 'Limit the number of imported events by number, date range, or not at all; on slower websites this may impact the success of imports. Selecting a shorter time period or a smaller number of events may improve results.', 'the-events-calendar' ),
173
+ 'size' => 'medium',
 
174
  'validation_type' => 'options',
175
+ 'default' => 'range',
176
+ 'can_be_empty' => false,
177
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
178
+ 'options' => tribe( 'events-aggregator.settings' )->get_import_limit_type_options(),
179
+ 'priority' => 5.5,
180
+ ],
181
+ 'tribe_aggregator_default_import_limit_range' => [
182
+ 'type' => 'dropdown',
183
+ 'label' => esc_html__( 'Import Date Range Limit', 'the-events-calendar' ),
184
+ 'tooltip' => esc_html__( 'When importing from an event source, this is how far into the future the events will be fetched; on slower websites a larger date range may impact the success of imports. Selecting a shorter time period may improve results.', 'the-events-calendar' ),
185
+ 'size' => 'medium',
186
  'validation_type' => 'options',
187
+ 'default' => tribe( 'events-aggregator.settings' )->get_import_range_default( true ),
188
+ 'can_be_empty' => true,
189
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
190
+ 'options' => tribe( 'events-aggregator.settings' )->get_import_range_options( true ),
191
+ 'class' => 'tribe-dependent',
192
+ 'fieldset_attributes' => [
193
  'data-depends' => '#tribe_aggregator_default_import_limit_type-select',
194
  'data-condition' => 'range',
195
+ ],
196
+ 'priority' => 5.6,
197
+ ],
198
+ 'tribe_aggregator_default_import_limit_number' => [
199
+ 'type' => 'dropdown',
200
+ 'label' => esc_html__( 'Import Quantity Limit', 'the-events-calendar' ),
201
+ 'tooltip' => esc_html__( 'When importing from an event source, this is the maximum number of events that will be imported; on slower websites this may impact the success of imports. Setting this to a smaller number may improve results.', 'the-events-calendar' ),
202
+ 'size' => 'medium',
203
  'validation_type' => 'options',
204
+ 'default' => tribe( 'events-aggregator.settings' )->get_import_limit_count_default(),
205
+ 'can_be_empty' => true,
206
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
207
+ 'options' => tribe( 'events-aggregator.settings' )->get_import_limit_count_options(),
208
+ 'class' => 'tribe-dependent',
209
+ 'fieldset_attributes' => [
210
  'data-depends' => '#tribe_aggregator_default_import_limit_type-select',
211
  'data-condition' => 'count',
212
+ ],
213
+ 'priority' => 5.7,
214
+ ],
215
+ 'tribe_aggregator_import_process_system' => [
216
+ 'type' => 'dropdown',
217
+ 'label' => esc_html__( 'Import Process System', 'the-events-calendar' ),
218
+ 'tooltip' => esc_html__( 'The Asynchronous import process is faster and does not rely on WordPress Cron but might not work correctly in all WordPress installations, try switching to the Cron-based process for maximum compatibility.', 'the-events-calendar' ),
219
+ 'size' => 'medium',
220
  'validation_type' => 'options',
221
+ 'default' => tribe( 'events-aggregator.settings' )->get_import_process_default( false ),
222
+ 'can_be_empty' => false,
223
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
224
+ 'options' => tribe( 'events-aggregator.settings' )->get_import_process_options( true ),
225
+ 'priority' => 5.8,
226
+ ],
227
+ 'tribe_aggregator_import_process_control' => [
228
+ 'type' => 'wrapped_html',
229
+ 'label' => esc_html__( 'Stop current processes', 'the-events-calendar' ),
230
+ 'html' => $stop_running_processes_message,
231
+ 'priority' => 5.9,
232
+ ],
233
+ ];
234
+
235
+ $ical = [
236
+ 'ical-defaults' => [
237
  'type' => 'html',
238
  'html' => '<h3 id="tribe-import-ical-settings">' . esc_html__( 'iCalendar Import Settings', 'the-events-calendar' ) . '</h3>',
239
  'priority' => 20.1,
240
+ ],
241
+ 'tribe_aggregator_default_ical_post_status' => [
242
+ 'type' => 'dropdown',
243
+ 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
244
+ 'tooltip' => esc_html__( 'The default post status for events imported via iCalendar', 'the-events-calendar' ),
245
+ 'size' => 'medium',
246
  'validation_type' => 'options',
247
+ 'default' => '',
248
+ 'can_be_empty' => true,
249
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
250
+ 'options' => $origin_post_statuses,
251
+ 'priority' => 20.2,
252
+ ],
253
+ 'tribe_aggregator_default_ical_category' => [
254
+ 'type' => 'dropdown',
255
+ 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
256
+ 'tooltip' => esc_html__( 'The default event category for events imported via iCalendar', 'the-events-calendar' ),
257
+ 'size' => 'medium',
258
  'validation_type' => 'options',
259
+ 'default' => '',
260
+ 'can_be_empty' => true,
261
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
262
+ 'options' => $origin_categories,
263
+ 'priority' => 20.3,
264
+ ],
265
+ 'tribe_aggregator_default_ical_show_map' => [
266
+ 'type' => 'dropdown',
267
+ 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
268
+ 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
269
+ 'size' => 'medium',
270
  'validation_type' => 'options',
271
+ 'default' => '',
272
+ 'can_be_empty' => true,
273
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
274
+ 'options' => $origin_show_map_options,
275
+ 'priority' => 20.4,
276
+ ],
277
+ ];
278
 
279
+ $ics = [
280
+ 'ics-defaults' => [
281
  'type' => 'html',
282
  'html' => '<h3 id="tribe-import-ics-settings">' . esc_html__( 'ICS File Import Settings', 'the-events-calendar' ) . '</h3>',
283
+ 'priority' => 25.1,
284
+ ],
285
+ 'tribe_aggregator_default_ics_post_status' => [
286
+ 'type' => 'dropdown',
287
+ 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
288
+ 'tooltip' => esc_html__( 'The default post status for events imported via .ics files', 'the-events-calendar' ),
289
+ 'size' => 'medium',
290
  'validation_type' => 'options',
291
+ 'default' => '',
292
+ 'can_be_empty' => true,
293
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
294
+ 'options' => $origin_post_statuses,
295
+ 'priority' => 25.2,
296
+ ],
297
+ 'tribe_aggregator_default_ics_category' => [
298
+ 'type' => 'dropdown',
299
+ 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
300
+ 'tooltip' => esc_html__( 'The default event category for events imported via .ics files', 'the-events-calendar' ),
301
+ 'size' => 'medium',
302
  'validation_type' => 'options',
303
+ 'default' => '',
304
+ 'can_be_empty' => true,
305
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
306
+ 'options' => $origin_categories,
307
+ 'priority' => 25.3,
308
+ ],
309
+ 'tribe_aggregator_default_ics_show_map' => [
310
+ 'type' => 'dropdown',
311
+ 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
312
+ 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
313
+ 'size' => 'medium',
314
  'validation_type' => 'options',
315
+ 'default' => '',
316
+ 'can_be_empty' => true,
317
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
318
+ 'options' => $origin_show_map_options,
319
+ 'priority' => 25.4,
320
+ ],
321
+ ];
322
 
323
+ $gcal = [
324
+ 'gcal-defaults' => [
325
  'type' => 'html',
326
  'html' => '<h3 id="tribe-import-google-settings">' . esc_html__( 'Google Calendar Import Settings', 'the-events-calendar' ) . '</h3>',
327
+ 'priority' => 35.1,
328
+ ],
329
+ 'tribe_aggregator_default_gcal_post_status' => [
330
+ 'type' => 'dropdown',
331
+ 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
332
+ 'tooltip' => esc_html__( 'The default post status for events imported via Google Calendar', 'the-events-calendar' ),
333
+ 'size' => 'medium',
334
  'validation_type' => 'options',
335
+ 'default' => '',
336
+ 'can_be_empty' => true,
337
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
338
+ 'options' => $origin_post_statuses,
339
+ 'priority' => 35.2,
340
+ ],
341
+ 'tribe_aggregator_default_gcal_category' => [
342
+ 'type' => 'dropdown',
343
+ 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
344
+ 'tooltip' => esc_html__( 'The default event category for events imported via Google Calendar', 'the-events-calendar' ),
345
+ 'size' => 'medium',
346
  'validation_type' => 'options',
347
+ 'default' => '',
348
+ 'can_be_empty' => true,
349
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
350
+ 'options' => $origin_categories,
351
+ 'priority' => 35.3,
352
+ ],
353
+ 'tribe_aggregator_default_gcal_show_map' => [
354
+ 'type' => 'dropdown',
355
+ 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
356
+ 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
357
+ 'size' => 'medium',
358
  'validation_type' => 'options',
359
+ 'default' => '',
360
+ 'can_be_empty' => true,
361
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
362
+ 'options' => $origin_show_map_options,
363
+ 'priority' => 35.4,
364
+ ],
365
+ ];
366
 
367
+ $meetup = [
368
+ 'meetup-defaults' => [
369
  'type' => 'html',
370
  'html' => '<h3 id="tribe-import-meetup-settings">' . esc_html__( 'Meetup Import Settings', 'the-events-calendar' ) . '</h3>',
371
  'priority' => 40.1,
372
+ ],
373
+ 'meetup-defaults-info' => [
374
+ 'type' => 'html',
375
+ 'html' => '<p>' . sprintf(
376
  esc_html__(
377
  'To import Meetup events, please be sure to add your Meetup API key on %1$sEvents > Settings > APIs%2$s',
378
  'the-events-calendar'
380
  '<a href="' . admin_url( Tribe__Settings::$parent_page . '&page=tribe-common&tab=addons' ) . '">',
381
  '</a>'
382
  ). '</p>',
383
+ 'priority' => 40.2,
384
+ ],
385
+ 'tribe_aggregator_default_meetup_post_status' => [
386
+ 'type' => 'dropdown',
387
+ 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
388
+ 'tooltip' => esc_html__( 'The default post status for events imported via Meetup', 'the-events-calendar' ),
389
+ 'size' => 'medium',
390
  'validation_type' => 'options',
391
+ 'default' => '',
392
+ 'can_be_empty' => true,
393
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
394
+ 'options' => $origin_post_statuses,
395
+ 'priority' => 40.3,
396
+ ],
397
+ 'tribe_aggregator_default_meetup_category' => [
398
+ 'type' => 'dropdown',
399
+ 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
400
+ 'tooltip' => esc_html__( 'The default event category for events imported via Meetup', 'the-events-calendar' ),
401
+ 'size' => 'medium',
402
  'validation_type' => 'options',
403
+ 'default' => '',
404
+ 'can_be_empty' => true,
405
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
406
+ 'options' => $origin_categories,
407
+ 'priority' => 40.4,
408
+ ],
409
+ 'tribe_aggregator_default_meetup_show_map' => [
410
+ 'type' => 'dropdown',
411
+ 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
412
+ 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
413
+ 'size' => 'medium',
414
  'validation_type' => 'options',
415
+ 'default' => '',
416
+ 'can_be_empty' => true,
417
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
418
+ 'options' => $origin_show_map_options,
419
+ 'priority' => 40.5,
420
+ ],
421
+ ];
422
+
423
+ $url = [
424
+ 'url-defaults' => [
425
+ 'type' => 'html',
426
+ 'html' => '<h3 id="tribe-import-url-settings">' . esc_html__( 'Other URL Import Settings', 'the-events-calendar' ) . '</h3>',
427
+ 'priority' => 45.1,
428
+ ],
429
+ 'tribe_aggregator_default_url_post_status' => [
430
+ 'type' => 'dropdown',
431
+ 'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
432
+ 'tooltip' => esc_html__( 'The default post status for events imported via other URLs', 'the-events-calendar' ),
433
+ 'size' => 'medium',
434
  'validation_type' => 'options',
435
+ 'default' => '',
436
+ 'can_be_empty' => true,
437
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
438
+ 'options' => $origin_post_statuses,
439
+ 'priority' => 45.2,
440
+ ],
441
+ 'tribe_aggregator_default_url_category' => [
442
+ 'type' => 'dropdown',
443
+ 'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
444
+ 'tooltip' => esc_html__( 'The default event category for events imported via other URLs', 'the-events-calendar' ),
445
+ 'size' => 'medium',
446
  'validation_type' => 'options',
447
+ 'default' => '',
448
+ 'can_be_empty' => true,
449
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
450
+ 'options' => $origin_categories,
451
+ 'priority' => 45.3,
452
+ ],
453
+ 'tribe_aggregator_default_url_show_map' => [
454
+ 'type' => 'dropdown',
455
+ 'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
456
+ 'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
457
+ 'size' => 'medium',
458
  'validation_type' => 'options',
459
+ 'default' => '',
460
+ 'can_be_empty' => true,
461
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
462
+ 'options' => $origin_show_map_options,
463
+ 'priority' => 45.4,
464
+ ],
465
+ 'tribe_aggregator_default_url_import_range' => [
466
+ 'type' => 'dropdown',
467
+ 'label' => esc_html__( 'Import Date Range Limit', 'the-events-calendar' ),
468
+ 'tooltip' => esc_html__( 'When importing from a website that uses The Events Calendar, the REST API will attempt to fetch events this far in the future. That website\'s hosting resources may impact the success of imports. Selecting a shorter time period may improve results.', 'the-events-calendar' ) . ' ' . sprintf( '<a href="%1$s" target="_blank">%2$s</a>', esc_attr( 'https://theeventscalendar.com/knowledgebase/url-import-errors-event-aggregator/' ), esc_html( 'Learn more.' ) ),
469
+ 'size' => 'medium',
470
  'validation_type' => 'options',
471
+ 'default' => tribe( 'events-aggregator.settings' )->get_import_range_default(),
472
+ 'can_be_empty' => false,
473
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
474
+ 'options' => tribe( 'events-aggregator.settings' )->get_url_import_range_options( true ),
475
+ 'priority' => 45.5,
476
+ ],
477
+ 'tribe_aggregator_default_url_import_event_settings' => [
478
+ 'type' => 'dropdown',
479
+ 'label' => esc_html__( 'Import Event Settings', 'the-events-calendar' ),
480
+ 'tooltip' => esc_html__( "Fetch source event's settings (e.g. Show Maps Link or Sticky in Month View) when importing from another site using The Events Calendar.", 'the-events-calendar' ),
481
+ 'size' => 'medium',
482
  'validation_type' => 'options',
483
+ 'default' => 'no',
484
+ 'can_be_empty' => true,
485
+ 'parent_option' => Tribe__Events__Main::OPTIONNAME,
486
+ 'options' => $yes_no_options,
487
+ 'priority' => 45.6,
488
+ ],
489
+ ];
490
 
491
  // Ensure that "(do not override)" is set up for Eventbrite import statuses, and "Published" is not.
492
+ $eventbrite_origin_post_statuses = [ 'do_not_override' => esc_html__( '(do not override)', 'the-events-calendar' ) ];
493
  $eventbrite_origin_post_statuses = $eventbrite_origin_post_statuses + $origin_post_statuses;
494
 
495
  unset( $eventbrite_origin_post_statuses['publish'] );
499
  unset( $eventbrite_origin_post_statuses[''] );
500
  }
501
 
502
+ $eb_fields = [
503
+ 'eventbrite-defaults' => [
504
  'type' => 'html',
505
  'html' => '<h3 id="tribe-import-eventbrite-settings">' . esc_html__( 'Eventbrite Import Settings', 'the-events-calendar' ) . '</h3>',
506
  'priority' => 17.1,
507
+ ],
508
+ 'tribe_aggregator_default_eventbrite_post_status' => [
509
  'type' => 'dropdown',
510
  'label' => esc_html__( 'Default Status', 'the-events-calendar' ),
511
  'tooltip' => esc_html__( 'The default post status for events imported via Eventbrite', 'the-events-calendar' ),
516
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
517
  'options' => $eventbrite_origin_post_statuses,
518
  'priority' => 17.2,
519
+ ],
520
+ 'tribe_aggregator_default_eventbrite_category' => [
521
  'type' => 'dropdown',
522
  'label' => esc_html__( 'Default Event Category', 'the-events-calendar' ),
523
  'tooltip' => esc_html__( 'The default event category for events imported via Eventbrite', 'the-events-calendar' ),
528
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
529
  'options' => $origin_categories,
530
  'priority' => 17.3,
531
+ ],
532
+ 'tribe_aggregator_default_eventbrite_show_map' => [
533
  'type' => 'dropdown',
534
  'label' => esc_html__( 'Show Map', 'the-events-calendar' ),
535
  'tooltip' => esc_html__( 'Show map by default on imported event and venues', 'the-events-calendar' ),
540
  'parent_option' => Tribe__Events__Main::OPTIONNAME,
541
  'options' => $origin_show_map_options,
542
  'priority' => 17.4,
543
+ ],
544
+ ];
545
  }
546
 
547
  $internal = array_merge(
591
 
592
  if ( tribe( 'events-aggregator.main' )->is_service_active() ) {
593
 
594
+ $import_setting_links = [
595
+ 'update-authority' => [
596
  'name' => __( 'Update Authority', 'the-events-calendar' ),
597
  'priority' => 5,
598
+ ],
599
+ 'global-settings' => [
600
  'name' => __( 'Global', 'the-events-calendar' ),
601
  'priority' => 10,
602
+ ],
603
+ 'csv-settings' => [
604
  'name' => __( 'CSV', 'the-events-calendar' ),
605
  'priority' => 15,
606
+ ],
607
+ 'ical-settings' => [
608
  'name' => __( 'iCalendar', 'the-events-calendar' ),
609
  'priority' => 20,
610
+ ],
611
+ 'ics-settings' => [
612
  'name' => __( 'ICS File', 'the-events-calendar' ),
613
  'priority' => 25,
614
+ ],
615
+ 'google-settings' => [
616
  'name' => __( 'Google Calendar', 'the-events-calendar' ),
617
  'priority' => 35,
618
+ ],
619
+ 'meetup-settings' => [
620
  'name' => __( 'Meetup', 'the-events-calendar' ),
621
  'priority' => 40,
622
+ ],
623
+ 'url-settings' => [
624
  'name' => __( 'Other URLs', 'the-events-calendar' ),
625
  'priority' => 45,
626
+ ],
627
+ 'eventbrite-settings' => [
628
  'name' => __( 'Eventbrite', 'the-events-calendar' ),
629
  'priority' => 17,
630
+ ],
631
+ ];
632
 
633
  /**
634
  * If Eventbrite Tickets is enabled and Event Aggregator is disabled, display the correct import links
635
  */
636
+ if (
637
+ class_exists( 'Tribe__Events__Tickets__Eventbrite__Main' )
638
+ && ! tribe( 'events-aggregator.main' )->has_license_key()
639
+ ) {
640
+ $ea_keys = [
641
  'ical-settings',
642
  'ics-settings',
643
  'google-settings',
644
  'meetup-settings',
645
  'url-settings',
646
+ ];
647
 
648
  foreach ( $ea_keys as $key ) {
649
  unset( $import_setting_links[ $key ] );
675
  'Use the options below to configure your imports. Global Import Settings apply to all imports, but you can also override the global settings by adjusting the origin-specific options. Check your Event Aggregator Service Status on the %1$s.',
676
  'the-events-calendar'
677
  ),
678
+ '<a href="' . esc_url( Tribe__Settings::instance()->get_url( [ 'page' => 'tribe-help' ] ) ) . '#tribe-tribe-aggregator-status">' . esc_html__( 'Help page', 'the-events-calendar' ) . '</a>'
679
  );
680
  ?>
681
  </p>
702
  }
703
 
704
  $fields = array_merge(
705
+ [
706
+ 'import-box-start' => [
707
  'type' => 'html',
708
  'html' => '<div id="modern-tribe-info">',
709
+ ],
710
+ 'import-box-title' => [
711
  'type' => 'html',
712
  'html' => '<h2>' . esc_html__( 'Imports', 'the-events-calendar' ) . '</h2>',
713
+ ],
714
+ 'import-box-description' => [
715
  'type' => 'html',
716
  'html' => '<p>' . $import_instructions . '</p>',
717
+ ],
718
+ 'import-box-end' => [
719
  'type' => 'html',
720
  'html' => '</div>',
721
+ ],
722
+ 'import-form-content-start' => [
723
  'type' => 'html',
724
  'html' => '<div class="tribe-settings-form-wrap">',
725
+ ],
726
+ ],
727
  $internal,
728
+ [
729
+ 'addons-form-content-end' => [
730
  'type' => 'html',
731
  'html' => '</div>',
732
+ ],
733
+ ]
734
  );
735
 
736
  /**
741
  */
742
  $import = apply_filters(
743
  'tribe_aggregator_tab',
744
+ [
745
  'priority' => 50,
746
  'fields' => $fields,
747
+ ]
748
  );
749
 
750
  // Only create the Add-ons Tab if there is any
src/admin-views/aggregator/status.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php
2
- $indicator_icons = array(
3
- 'good' => 'marker',
4
  'warning' => 'warning',
5
- 'bad' => 'dismiss',
6
- );
7
 
8
  $show_third_party_accounts = ! is_network_admin();
9
  ?>
@@ -20,19 +20,19 @@ $show_third_party_accounts = ! is_network_admin();
20
  $ea_active = false;
21
  if ( tribe( 'events-aggregator.main' )->is_service_active() ) {
22
  $indicator = 'good';
23
- $text = __( 'Your license is valid', 'the-events-calendar' );
24
  $ea_active = true;
25
  } else {
26
  $service_status = tribe( 'events-aggregator.service' )->api()->get_error_code();
27
 
28
  $indicator = 'bad';
29
  if ( 'core:aggregator:invalid-service-key' == $service_status ) {
30
- $text = __( 'You do not have a license', 'the-events-calendar' );
31
- $notes = '<a href="https://theeventscalendar.com/wordpress-event-aggregator/?utm_source=importsettings&utm_medium=plugin-tec&utm_campaign=in-app">';
32
  $notes .= esc_html__( 'Buy Event Aggregator to access more event sources and automatic imports!', 'the-events-calendar' );
33
  $notes .= '</a>';
34
  } else {
35
- $text = __( 'Your license is invalid', 'the-events-calendar' );
36
  $notes = '<a href="' . esc_url( Tribe__Settings::instance()->get_url( array( 'tab' => 'licenses' ) ) ) . '">' . esc_html__( 'Check your license key', 'the-events-calendar' ) . '</a>';
37
  }
38
  }
@@ -41,7 +41,7 @@ $show_third_party_accounts = ! is_network_admin();
41
  <td class="label"><?php esc_html_e( 'License Key', 'the-events-calendar' ); ?></td>
42
  <td class="indicator <?php esc_attr_e( $indicator ); ?>"><span class="dashicons dashicons-<?php echo esc_attr( $indicator_icons[ $indicator ] ); ?>"></span></td>
43
  <td><?php echo esc_html( $text ); ?></td>
44
- <td><?php echo $notes; ?></td>
45
  </tr>
46
  <?php
47
  // if EA is not active, bail out of the rest of this
@@ -50,20 +50,20 @@ $show_third_party_accounts = ! is_network_admin();
50
  return ob_get_clean();
51
  }
52
 
53
- $service = tribe( 'events-aggregator.service' );
54
- $import_limit = $service->get_limit( 'import' );
55
  $import_available = $service->get_limit_remaining();
56
- $import_count = $service->get_limit_usage();
57
 
58
  $indicator = 'good';
59
- $notes = '&nbsp;';
60
 
61
  if ( 0 === $import_limit || $import_count >= $import_limit ) {
62
  $indicator = 'bad';
63
- $notes = esc_html__( 'You have reached your daily import limit. Scheduled imports will be paused until tomorrow.', 'the-events-calendar' );
64
  } elseif ( $import_count / $import_limit >= 0.8 ) {
65
  $indicator = 'warning';
66
- $notes = esc_html__( 'You are approaching your daily import limit. You may want to adjust your Scheduled Import frequencies.', 'the-events-calendar' );
67
  }
68
 
69
  $text = sprintf( // import count and limit
@@ -77,7 +77,7 @@ $show_third_party_accounts = ! is_network_admin();
77
  <td class="label"><?php esc_html_e( 'Current usage', 'the-events-calendar' ); ?></td>
78
  <td class="indicator <?php esc_attr_e( $indicator ); ?>"><span class="dashicons dashicons-<?php echo esc_attr( $indicator_icons[ $indicator ] ); ?>"></span></td>
79
  <td><?php echo esc_html( $text ); ?></td>
80
- <td><?php echo $notes; ?></td>
81
  </tr>
82
  </tbody>
83
  </table>
@@ -91,15 +91,15 @@ $show_third_party_accounts = ! is_network_admin();
91
  <tbody>
92
  <?php
93
  $indicator = 'good';
94
- $notes = '&nbsp;';
95
 
96
  $ea_server = tribe( 'events-aggregator.service' )->api()->domain;
97
- $up = tribe( 'events-aggregator.service' )->get( 'status/up' );
98
 
99
  if ( ! $up || is_wp_error( $up ) ) {
100
  $indicator = 'bad';
101
  /* translators: %s: Event Aggregator Server URL */
102
- $text = sprintf( __( 'Not connected to %s', 'the-events-calendar' ), $ea_server );
103
  $notes = esc_html__( 'The server is not currently responding', 'the-events-calendar' );
104
  } elseif ( is_object( $up ) && is_object( $up->data ) && isset( $up->data->status ) && 400 <= $up->data->status ) {
105
  // this is a rare condition that should never happen
@@ -109,7 +109,7 @@ $show_third_party_accounts = ! is_network_admin();
109
  /* translators: %s: Event Aggregator Server URL */
110
  $text = sprintf( __( 'Not connected to %s', 'the-events-calendar' ), $ea_server );
111
 
112
- $notes = __( 'The server is responding with an error:', 'the-events-calendar' );
113
  $notes .= '<pre>';
114
  $notes .= esc_html( $up->message );
115
  $notes .= '</pre>';
@@ -133,8 +133,8 @@ $show_third_party_accounts = ! is_network_admin();
133
  // @todo add API request for pingback check
134
  if ( defined( 'DISABLE_WP_CRON' ) && true === DISABLE_WP_CRON ) {
135
  $indicator = 'warning';
136
- $text = __( 'WP Cron not enabled', 'the-events-calendar' );
137
- $notes = esc_html__( 'Scheduled imports may not run reliably', 'the-events-calendar' );
138
  } else {
139
  $text = __( 'WP Cron enabled', 'the-events-calendar' );
140
  }
@@ -150,18 +150,18 @@ $show_third_party_accounts = ! is_network_admin();
150
  </table>
151
 
152
  <?php if ( $show_third_party_accounts ) : ?>
153
- <table class="event-aggregator-status">
154
- <thead>
155
- <tr class="table-heading">
156
- <th colspan="4"><?php esc_html_e( 'Third Party Accounts', 'the-events-calendar' ); ?></th>
157
- </tr>
158
- </thead>
159
- <tbody>
160
  <?php
161
  // Eventbrite status section
162
  $indicator = 'good';
163
- $notes = '&nbsp;';
164
- $text = 'Connected';
165
 
166
  if ( tribe( 'events-aggregator.main' )->api( 'origins' )->is_oauth_enabled( 'eventbrite' ) ) {
167
  if ( ! tribe( 'events-aggregator.settings' )->has_eb_security_key() ) {
@@ -176,36 +176,41 @@ $show_third_party_accounts = ! is_network_admin();
176
  $notes = esc_html__( 'The service has disabled oAuth. Some types of events may not import.', 'the-events-calendar' );
177
  }
178
  ?>
179
- <tr>
180
- <td class="label">
181
- <img src="<?php echo esc_url( tribe_events_resource_url( 'images/aggregator/eventbrite.png' ) ); ?>" /><span><?php esc_html_e( 'Eventbrite', 'the-events-calendar' ); ?></span>
182
- </td>
183
- <td class="indicator <?php esc_attr_e( $indicator ); ?>"><span class="dashicons dashicons-<?php echo esc_attr( $indicator_icons[ $indicator ] ); ?>"></span></td>
184
- <td><?php echo esc_html( $text ); ?></td>
185
- <td><?php echo $notes; ?></td>
186
- </tr>
187
  <?php
188
  // Meetup status section
189
  $indicator = 'good';
190
- $notes = '&nbsp;';
191
- $text = __( 'API key entered', 'the-events-calendar' );
192
- $meetup_api_key = tribe_get_option( 'meetup_api_key' );
193
- if ( ! $meetup_api_key ) {
 
 
 
 
 
 
 
194
  $indicator = 'warning';
195
- $text = __( 'You have not entered a Meetup API key', 'the-events-calendar' );
196
- $notes = '<a href="' . esc_url( Tribe__Settings::instance()->get_url( array( 'tab' => 'addons' ) ) ) . '">';
197
- $notes .= esc_html__( 'Enter your API key', 'the-events-calendar' );
198
- $notes .= '</a>';
199
  }
200
  ?>
201
- <tr>
202
- <td class="label">
203
- <img src="<?php echo esc_url( tribe_events_resource_url( 'images/aggregator/meetup.png' ) ); ?>" /><span><?php esc_html_e( 'Meetup', 'the-events-calendar' ); ?></span>
204
- </td>
205
- <td class="indicator <?php esc_attr_e( $indicator ); ?>"><span class="dashicons dashicons-<?php echo esc_attr( $indicator_icons[ $indicator ] ); ?>"></span></td>
206
- <td><?php echo esc_html( $text ); ?></td>
207
- <td><?php echo $notes; // Escaping handled above ?></td>
208
- </tr>
209
  <?php
210
  /**
211
  * Fires below the rows in the third party status table.
@@ -218,6 +223,6 @@ $show_third_party_accounts = ! is_network_admin();
218
  */
219
  do_action( 'tribe_events_status_third_party', $indicator_icons );
220
  ?>
221
- </tbody>
222
- </table>
223
  <?php endif; ?>
1
  <?php
2
+ $indicator_icons = [
3
+ 'good' => 'marker',
4
  'warning' => 'warning',
5
+ 'bad' => 'dismiss',
6
+ ];
7
 
8
  $show_third_party_accounts = ! is_network_admin();
9
  ?>
20
  $ea_active = false;
21
  if ( tribe( 'events-aggregator.main' )->is_service_active() ) {
22
  $indicator = 'good';
23
+ $text = __( 'Your license is valid', 'the-events-calendar' );
24
  $ea_active = true;
25
  } else {
26
  $service_status = tribe( 'events-aggregator.service' )->api()->get_error_code();
27
 
28
  $indicator = 'bad';
29
  if ( 'core:aggregator:invalid-service-key' == $service_status ) {
30
+ $text = __( 'You do not have a license', 'the-events-calendar' );
31
+ $notes = '<a href="https://theeventscalendar.com/wordpress-event-aggregator/?utm_source=importsettings&utm_medium=plugin-tec&utm_campaign=in-app">';
32
  $notes .= esc_html__( 'Buy Event Aggregator to access more event sources and automatic imports!', 'the-events-calendar' );
33
  $notes .= '</a>';
34
  } else {
35
+ $text = __( 'Your license is invalid', 'the-events-calendar' );
36
  $notes = '<a href="' . esc_url( Tribe__Settings::instance()->get_url( array( 'tab' => 'licenses' ) ) ) . '">' . esc_html__( 'Check your license key', 'the-events-calendar' ) . '</a>';
37
  }
38
  }
41
  <td class="label"><?php esc_html_e( 'License Key', 'the-events-calendar' ); ?></td>
42
  <td class="indicator <?php esc_attr_e( $indicator ); ?>"><span class="dashicons dashicons-<?php echo esc_attr( $indicator_icons[ $indicator ] ); ?>"></span></td>
43
  <td><?php echo esc_html( $text ); ?></td>
44
+ <td><?php echo $notes; // Escaping handled above. ?></td>
45
  </tr>
46
  <?php
47
  // if EA is not active, bail out of the rest of this
50
  return ob_get_clean();
51
  }
52
 
53
+ $service = tribe( 'events-aggregator.service' );
54
+ $import_limit = $service->get_limit( 'import' );
55
  $import_available = $service->get_limit_remaining();
56
+ $import_count = $service->get_limit_usage();
57
 
58
  $indicator = 'good';
59
+ $notes = '&nbsp;';
60
 
61
  if ( 0 === $import_limit || $import_count >= $import_limit ) {
62
  $indicator = 'bad';
63
+ $notes = esc_html__( 'You have reached your daily import limit. Scheduled imports will be paused until tomorrow.', 'the-events-calendar' );
64
  } elseif ( $import_count / $import_limit >= 0.8 ) {
65
  $indicator = 'warning';
66
+ $notes = esc_html__( 'You are approaching your daily import limit. You may want to adjust your Scheduled Import frequencies.', 'the-events-calendar' );
67
  }
68
 
69
  $text = sprintf( // import count and limit
77
  <td class="label"><?php esc_html_e( 'Current usage', 'the-events-calendar' ); ?></td>
78
  <td class="indicator <?php esc_attr_e( $indicator ); ?>"><span class="dashicons dashicons-<?php echo esc_attr( $indicator_icons[ $indicator ] ); ?>"></span></td>
79
  <td><?php echo esc_html( $text ); ?></td>
80
+ <td><?php echo $notes; // Escaping handled above. ?></td>
81
  </tr>
82
  </tbody>
83
  </table>
91
  <tbody>
92
  <?php
93
  $indicator = 'good';
94
+ $notes = '&nbsp;';
95
 
96
  $ea_server = tribe( 'events-aggregator.service' )->api()->domain;
97
+ $up = tribe( 'events-aggregator.service' )->get( 'status/up' );
98
 
99
  if ( ! $up || is_wp_error( $up ) ) {
100
  $indicator = 'bad';
101
  /* translators: %s: Event Aggregator Server URL */
102
+ $text = sprintf( __( 'Not connected to %s', 'the-events-calendar' ), $ea_server );
103
  $notes = esc_html__( 'The server is not currently responding', 'the-events-calendar' );
104
  } elseif ( is_object( $up ) && is_object( $up->data ) && isset( $up->data->status ) && 400 <= $up->data->status ) {
105
  // this is a rare condition that should never happen
109
  /* translators: %s: Event Aggregator Server URL */
110
  $text = sprintf( __( 'Not connected to %s', 'the-events-calendar' ), $ea_server );
111
 
112
+ $notes = __( 'The server is responding with an error:', 'the-events-calendar' );
113
  $notes .= '<pre>';
114
  $notes .= esc_html( $up->message );
115
  $notes .= '</pre>';
133
  // @todo add API request for pingback check
134
  if ( defined( 'DISABLE_WP_CRON' ) && true === DISABLE_WP_CRON ) {
135
  $indicator = 'warning';
136
+ $text = __( 'WP Cron not enabled', 'the-events-calendar' );
137
+ $notes = esc_html__( 'Scheduled imports may not run reliably', 'the-events-calendar' );
138
  } else {
139
  $text = __( 'WP Cron enabled', 'the-events-calendar' );
140
  }
150
  </table>
151
 
152
  <?php if ( $show_third_party_accounts ) : ?>
153
+ <table class="event-aggregator-status">
154
+ <thead>
155
+ <tr class="table-heading">
156
+ <th colspan="4"><?php esc_html_e( 'Third Party Accounts', 'the-events-calendar' ); ?></th>
157
+ </tr>
158
+ </thead>
159
+ <tbody>
160
  <?php
161
  // Eventbrite status section
162
  $indicator = 'good';
163
+ $notes = '&nbsp;';
164
+ $text = 'Connected';
165
 
166
  if ( tribe( 'events-aggregator.main' )->api( 'origins' )->is_oauth_enabled( 'eventbrite' ) ) {
167
  if ( ! tribe( 'events-aggregator.settings' )->has_eb_security_key() ) {
176
  $notes = esc_html__( 'The service has disabled oAuth. Some types of events may not import.', 'the-events-calendar' );
177
  }
178
  ?>
179
+ <tr>
180
+ <td class="label">
181
+ <img src="<?php echo esc_url( tribe_events_resource_url( 'images/aggregator/eventbrite.png' ) ); ?>" /><span><?php esc_html_e( 'Eventbrite', 'the-events-calendar' ); ?></span>
182
+ </td>
183
+ <td class="indicator <?php esc_attr_e( $indicator ); ?>"><span class="dashicons dashicons-<?php echo esc_attr( $indicator_icons[ $indicator ] ); ?>"></span></td>
184
+ <td><?php echo esc_html( $text ); ?></td>
185
+ <td><?php echo $notes; // Escaping handled above. ?></td>
186
+ </tr>
187
  <?php
188
  // Meetup status section
189
  $indicator = 'good';
190
+ $notes = '&nbsp;';
191
+ $text = 'Connected';
192
+
193
+ if ( tribe( 'events-aggregator.main' )->api( 'origins' )->is_oauth_enabled( 'meetup' ) ) {
194
+ if ( ! tribe( 'events-aggregator.settings' )->has_meetup_security_key() ) {
195
+ $indicator = 'warning';
196
+ $text = __( 'You have not connected Event Aggregator to Meetup', 'the-events-calendar' );
197
+ $meetup_auth_url = Tribe__Events__Aggregator__Record__Meetup::get_auth_url( array( 'back' => 'settings' ) );
198
+ $notes = '<a href="' . esc_url( $meetup_auth_url ). '">' . esc_html_x( 'Connect to Meetup', 'link for connecting meetup', 'the-events-calendar' ) . '</a>';
199
+ }
200
+ } else {
201
  $indicator = 'warning';
202
+ $text = __( 'Limited connectivity with Meetup', 'the-events-calendar' );
203
+ $notes = esc_html__( 'The service has disabled oAuth. Some types of events may not import.', 'the-events-calendar' );
 
 
204
  }
205
  ?>
206
+ <tr>
207
+ <td class="label">
208
+ <img src="<?php echo esc_url( tribe_events_resource_url( 'images/aggregator/meetup.png' ) ); ?>" /><span><?php esc_html_e( 'Meetup', 'the-events-calendar' ); ?></span>
209
+ </td>
210
+ <td class="indicator <?php esc_attr_e( $indicator ); ?>"><span class="dashicons dashicons-<?php echo esc_attr( $indicator_icons[ $indicator ] ); ?>"></span></td>
211
+ <td><?php echo esc_html( $text ); ?></td>
212
+ <td><?php echo $notes; // Escaping handled above. ?></td>
213
+ </tr>
214
  <?php
215
  /**
216
  * Fires below the rows in the third party status table.
223
  */
224
  do_action( 'tribe_events_status_third_party', $indicator_icons );
225
  ?>
226
+ </tbody>
227
+ </table>
228
  <?php endif; ?>
src/admin-views/aggregator/tabs/import-form.php CHANGED
@@ -13,12 +13,12 @@ $default_category = empty( $default_category ) ? tribe_get_option( 'tribe_agg
13
  $post_statuses = get_post_statuses( array() );
14
 
15
  // Ensure the "(do not override)" status is set up for Eventbrite imports, and "Published" is removed.
16
- $do_not_override_status = array( 'do_not_override' => esc_html__( '(do not override)', 'the-events-calendar' ) );
17
  $eventbrite_post_statuses = $do_not_override_status + $post_statuses;
18
  unset( $eventbrite_post_statuses['publish'] );
19
 
20
  $category_dropdown = array();
21
- $category_dropdown = wp_dropdown_categories( array(
22
  'echo' => false,
23
  'name' => 'aggregator[category]',
24
  'id' => 'tribe-ea-field-category',
@@ -26,7 +26,7 @@ $category_dropdown = wp_dropdown_categories( array(
26
  'class' => 'tribe-ea-field tribe-ea-dropdown tribe-ea-size-large',
27
  'orderby' => 'post_title',
28
  'taxonomy' => Tribe__Events__Main::TAXONOMY,
29
- ) );
30
  $category_dropdown = preg_replace( '!\<select!', '<select data-hide-search', $category_dropdown );
31
  $category_dropdown = preg_replace( '!(\<select[^\>]*\>)!', '$1<option value="">' . __( 'No Additional Categories', 'the-events-calendar' ) . '</option>', $category_dropdown );
32
  $category_dropdown = preg_replace( '!(value="' . $default_category . '")!', '$1 selected', $category_dropdown );
@@ -128,10 +128,10 @@ wp_nonce_field( 'tribe-aggregator-save-import', 'tribe_aggregator_nonce' );
128
  </tr>
129
 
130
  <?php
131
- $form_args = array(
132
  'record' => $record,
133
  'aggregator_action' => $aggregator_action,
134
- );
135
 
136
  if ( 'edit' === $aggregator_action ) {
137
  $this->template( 'origins/' . $record->meta['origin'], $form_args );
13
  $post_statuses = get_post_statuses( array() );
14
 
15
  // Ensure the "(do not override)" status is set up for Eventbrite imports, and "Published" is removed.
16
+ $do_not_override_status = [ 'do_not_override' => esc_html__( '(do not override)', 'the-events-calendar' ) ];
17
  $eventbrite_post_statuses = $do_not_override_status + $post_statuses;
18
  unset( $eventbrite_post_statuses['publish'] );
19
 
20
  $category_dropdown = array();
21
+ $category_dropdown = wp_dropdown_categories( [
22
  'echo' => false,
23
  'name' => 'aggregator[category]',
24
  'id' => 'tribe-ea-field-category',
26
  'class' => 'tribe-ea-field tribe-ea-dropdown tribe-ea-size-large',
27
  'orderby' => 'post_title',
28
  'taxonomy' => Tribe__Events__Main::TAXONOMY,
29
+ ] );
30
  $category_dropdown = preg_replace( '!\<select!', '<select data-hide-search', $category_dropdown );
31
  $category_dropdown = preg_replace( '!(\<select[^\>]*\>)!', '$1<option value="">' . __( 'No Additional Categories', 'the-events-calendar' ) . '</option>', $category_dropdown );
32
  $category_dropdown = preg_replace( '!(value="' . $default_category . '")!', '$1 selected', $category_dropdown );
128
  </tr>
129
 
130
  <?php
131
+ $form_args = [
132
  'record' => $record,
133
  'aggregator_action' => $aggregator_action,
134
+ ];
135
 
136
  if ( 'edit' === $aggregator_action ) {
137
  $this->template( 'origins/' . $record->meta['origin'], $form_args );
src/admin-views/tribe-options-addons-api.php CHANGED
@@ -5,30 +5,57 @@
5
  */
6
  $internal = array();
7
 
8
- $current_url = Tribe__Settings::instance()->get_url( array( 'tab' => 'addons' ) );
9
 
10
  // if there's an Event Aggregator license key, add the Meetup.com API fields
11
  if ( get_option( 'pue_install_key_event_aggregator' ) ) {
12
 
13
- $internal = array(
14
- 'meetup-start' => array(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  'type' => 'html',
16
  'html' => '<h3>' . esc_html__( 'Meetup', 'the-events-calendar' ) . '</h3>',
17
- ),
18
- 'meetup-info-box' => array(
 
 
 
 
19
  'type' => 'html',
20
- 'html' => '<p>' . esc_html__( 'You need a Meetup API Key to import your events from Meetup.', 'the-events-calendar' ) . '</p>',
21
- ),
22
- 'meetup_api_key' => array(
23
- 'type' => 'text',
24
- 'label' => esc_html__( 'Meetup API Key', 'the-events-calendar' ),
25
- 'tooltip' => sprintf( __( '%s to view your Meetup API Key', 'the-events-calendar' ), '<a href="https://secure.meetup.com/meetup_api/key/" target="_blank">' . __( 'Click here', 'the-events-calendar' ) . '</a>' ),
26
- 'size' => 'medium',
27
- 'validation_type' => 'alpha_numeric',
28
- 'can_be_empty' => true,
29
- 'parent_option' => Tribe__Events__Main::OPTIONNAME,
30
- ),
31
- );
32
  }
33
 
34
  /**
@@ -54,7 +81,7 @@ if ( class_exists( 'Tribe__Events__Tickets__Eventbrite__Main' ) || get_option( '
54
  $eventbrite_disconnect_url = tribe( 'events-aggregator.settings' )->build_disconnect_eventbrite_url( $current_url );
55
  }
56
  ?>
57
- <a target="_blank" class="tribe-ea-eventbrite-button" href="<?php echo esc_url( Tribe__Events__Aggregator__Record__Eventbrite::get_auth_url( array( 'back' => 'settings' ) ) ); ?>"><?php esc_html_e( $eventbrite_button_label ); ?></a>
58
  <?php if ( ! $missing_eb_credentials ) : ?>
59
  <a href="<?php echo esc_url( $eventbrite_disconnect_url ); ?>" class="tribe-ea-eventbrite-disconnect"><?php echo esc_html( $eventbrite_disconnect_label ); ?></a>
60
  <?php endif; ?>
@@ -64,20 +91,20 @@ if ( class_exists( 'Tribe__Events__Tickets__Eventbrite__Main' ) || get_option( '
64
  <?php
65
  $eventbrite_token_html = ob_get_clean();
66
 
67
- $internal2 = array(
68
- 'eb-start' => array(
69
  'type' => 'html',
70
  'html' => '<h3>' . esc_html__( 'Eventbrite', 'the-events-calendar' ) . '</h3>',
71
- ),
72
- 'eb-info-box' => array(
73
  'type' => 'html',
74
  'html' => '<p>' . esc_html__( 'You need to connect Event Aggregator to Eventbrite to import your events from Eventbrite.', 'the-events-calendar' ) . '</p>',
75
- ),
76
- 'eb_token_button' => array(
77
  'type' => 'html',
78
  'html' => $eventbrite_token_html,
79
- ),
80
- );
81
 
82
  $internal = array_merge( $internal, $internal2 );
83
  }
@@ -85,35 +112,35 @@ if ( class_exists( 'Tribe__Events__Tickets__Eventbrite__Main' ) || get_option( '
85
  $internal = apply_filters( 'tribe_addons_tab_fields', $internal );
86
 
87
  $fields = array_merge(
88
- array(
89
- 'addons-box-start' => array(
90
  'type' => 'html',
91
  'html' => '<div id="modern-tribe-info">',
92
- ),
93
- 'addons-box-title' => array(
94
  'type' => 'html',
95
  'html' => '<h2>' . esc_html__( 'APIs', 'the-events-calendar' ) . '</h2>',
96
- ),
97
- 'addons-box-description' => array(
98
  'type' => 'html',
99
  'html' => '<p>' . __( 'Some features and add-ons require you to enter an API key or log into a third-party website so that The Events Calendar can communicate with an outside source.', 'the-events-calendar' ) . '</p>',
100
- ),
101
- 'addons-box-end' => array(
102
  'type' => 'html',
103
  'html' => '</div>',
104
- ),
105
- 'addons-form-content-start' => array(
106
  'type' => 'html',
107
  'html' => '<div class="tribe-settings-form-wrap">',
108
- ),
109
- ),
110
  $internal,
111
- array(
112
- 'addons-form-content-end' => array(
113
  'type' => 'html',
114
  'html' => '</div>',
115
- ),
116
- )
117
  );
118
 
119
  /**
@@ -124,10 +151,10 @@ $fields = array_merge(
124
  */
125
  $addons = apply_filters(
126
  'tribe_addons_tab',
127
- array(
128
  'priority' => 50,
129
  'fields' => $fields,
130
- )
131
  );
132
 
133
  // Only create the Add-ons Tab if there is any
5
  */
6
  $internal = array();
7
 
8
+ $current_url = Tribe__Settings::instance()->get_url( [ 'tab' => 'addons' ] );
9
 
10
  // if there's an Event Aggregator license key, add the Meetup.com API fields
11
  if ( get_option( 'pue_install_key_event_aggregator' ) ) {
12
 
13
+ $missing_meetup_credentials = ! tribe( 'events-aggregator.settings' )->is_ea_authorized_for_meetup();
14
+
15
+ ob_start();
16
+ ?>
17
+
18
+ <fieldset id="tribe-field-meetup_token" class="tribe-field tribe-field-text tribe-size-medium">
19
+ <legend class="tribe-field-label"><?php esc_html_e( 'Meetup Token', 'the-events-calendar' ) ?></legend>
20
+ <div class="tribe-field-wrap">
21
+ <?php
22
+ if ( $missing_meetup_credentials ) {
23
+ echo '<p>' . esc_html__( 'You need to connect to Meetup for Event Aggregator to work properly' ) . '</p>';
24
+ $meetup_button_label = __( 'Connect to Meetup', 'the-events-calendar' );
25
+ } else {
26
+ $meetup_button_label = __( 'Refresh your connection to Meetup', 'the-events-calendar' );
27
+ $meetup_disconnect_label = __( 'Disconnect', 'the-events-calendar' );
28
+ $meetup_disconnect_url = tribe( 'events-aggregator.settings' )->build_disconnect_meetup_url( $current_url );
29
+ }
30
+ ?>
31
+ <a target="_blank" class="tribe-ea-meetup-button" href="<?php echo esc_url( Tribe__Events__Aggregator__Record__Meetup::get_auth_url( [ 'back' => 'settings' ] ) ); ?>">
32
+ <?php esc_html_e( $meetup_button_label ); ?></a>
33
+ <?php if ( ! $missing_meetup_credentials ) : ?>
34
+ <a href="<?php echo esc_url( $meetup_disconnect_url ); ?>" class="tribe-ea-meetup-disconnect"><?php echo esc_html( $meetup_disconnect_label ); ?></a>
35
+ <?php endif; ?>
36
+ </div>
37
+ </fieldset>
38
+
39
+ <?php
40
+ $meetup_token_html = ob_get_clean();
41
+
42
+ $internal_meetup = [
43
+ 'meetup-start' => [
44
  'type' => 'html',
45
  'html' => '<h3>' . esc_html__( 'Meetup', 'the-events-calendar' ) . '</h3>',
46
+ ],
47
+ 'meetup-info-box' => [
48
+ 'type' => 'html',
49
+ 'html' => '<p>' . esc_html__( 'You need to connect Event Aggregator to Meetup to import your events from Meetup.', 'the-events-calendar' ) . '</p>',
50
+ ],
51
+ 'meetup_token_button' => [
52
  'type' => 'html',
53
+ 'html' => $meetup_token_html,
54
+ ],
55
+ ];
56
+
57
+ $internal = array_merge( $internal, $internal_meetup );
58
+
 
 
 
 
 
 
59
  }
60
 
61
  /**
81
  $eventbrite_disconnect_url = tribe( 'events-aggregator.settings' )->build_disconnect_eventbrite_url( $current_url );
82
  }
83
  ?>
84
+ <a target="_blank" class="tribe-ea-eventbrite-button" href="<?php echo esc_url( Tribe__Events__Aggregator__Record__Eventbrite::get_auth_url( [ 'back' => 'settings' ] ) ); ?>"><?php esc_html_e( $eventbrite_button_label ); ?></a>
85
  <?php if ( ! $missing_eb_credentials ) : ?>
86
  <a href="<?php echo esc_url( $eventbrite_disconnect_url ); ?>" class="tribe-ea-eventbrite-disconnect"><?php echo esc_html( $eventbrite_disconnect_label ); ?></a>
87
  <?php endif; ?>
91
  <?php
92
  $eventbrite_token_html = ob_get_clean();
93
 
94
+ $internal2 = [
95
+ 'eb-start' => [
96
  'type' => 'html',
97
  'html' => '<h3>' . esc_html__( 'Eventbrite', 'the-events-calendar' ) . '</h3>',
98
+ ],
99
+ 'eb-info-box' => [
100
  'type' => 'html',
101
  'html' => '<p>' . esc_html__( 'You need to connect Event Aggregator to Eventbrite to import your events from Eventbrite.', 'the-events-calendar' ) . '</p>',
102
+ ],
103
+ 'eb_token_button' => [
104
  'type' => 'html',
105
  'html' => $eventbrite_token_html,
106
+ ],
107
+ ];
108
 
109
  $internal = array_merge( $internal, $internal2 );
110
  }
112
  $internal = apply_filters( 'tribe_addons_tab_fields', $internal );
113
 
114
  $fields = array_merge(
115
+ [
116
+ 'addons-box-start' => [
117
  'type' => 'html',
118
  'html' => '<div id="modern-tribe-info">',
119
+ ],
120
+ 'addons-box-title' => [
121
  'type' => 'html',
122
  'html' => '<h2>' . esc_html__( 'APIs', 'the-events-calendar' ) . '</h2>',
123
+ ],
124
+ 'addons-box-description' => [
125
  'type' => 'html',
126
  'html' => '<p>' . __( 'Some features and add-ons require you to enter an API key or log into a third-party website so that The Events Calendar can communicate with an outside source.', 'the-events-calendar' ) . '</p>',
127
+ ],
128
+ 'addons-box-end' => [
129
  'type' => 'html',
130
  'html' => '</div>',
131
+ ],
132
+ 'addons-form-content-start' => [
133
  'type' => 'html',
134
  'html' => '<div class="tribe-settings-form-wrap">',
135
+ ],
136
+ ],
137
  $internal,
138
+ [
139
+ 'addons-form-content-end' => [
140
  'type' => 'html',
141
  'html' => '</div>',
142
+ ],
143
+ ]
144
  );
145
 
146
  /**
151
  */
152
  $addons = apply_filters(
153
  'tribe_addons_tab',
154
+ [
155
  'priority' => 50,
156
  'fields' => $fields,
157
+ ]
158
  );
159
 
160
  // Only create the Add-ons Tab if there is any
src/resources/css/aggregator-page.css CHANGED
@@ -419,7 +419,7 @@
419
  margin-bottom: .25em;
420
  }
421
 
422
- .tribe-ea .tribe-ea-eventbrite-button {
423
  margin-left: 2rem;
424
  margin-top: 1rem;
425
  }
419
  margin-bottom: .25em;
420
  }
421
 
422
+ .tribe-ea .tribe-ea-login-button {
423
  margin-left: 2rem;
424
  margin-top: 1rem;
425
  }
src/resources/css/aggregator-page.min.css CHANGED
@@ -1 +1 @@
1
- .tribe-ea .tribe-ea-tab{padding:20px;margin-top:20px;border:1px solid #ccc;background-color:#fff}.tribe-ea .tribe-ea-tab .form-table th[scope=row]{width:140px}.tribe-ea .tribe-ea-tab .form-table tr{position:relative}.tribe-ea .tribe-ea-tab .form-table .eb-url-row th[scope=row]{padding:0}.tribe-ea .tribe-ea-tab .form-table .eb-url-row td{padding:0 10px}.tribe-ea .tribe-ea-tab .subsubsub li{font-weight:700}.tribe-ea .tribe-ea-tab .subsubsub .count,.tribe-ea .tribe-ea-tab .subsubsub a{font-weight:400}.tribe-ea .tribe-ea-help{padding:4px;color:#0073aa;cursor:pointer}.tribe-ea .tribe-ea-hidden{display:none}.tribe-ea .tribe-ea-file-name{display:inline-block;font-style:italic;line-height:26px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:auto}.tribe-ea .tribe-ea-raw-list{line-height:1.25em;list-style:square;margin-top:0;margin-left:22px;margin-bottom:6px}.tribe-ea .tribe-ea-raw-list>li{margin-bottom:2px}.tribe-ea .tribe-ea-total{font-weight:600}.tribe-ea .tribe-ea-size-tiny{width:75px}.tribe-ea .tribe-ea-size-small{width:100px}.tribe-ea .tribe-ea-size-medium{width:150px}.tribe-ea .tribe-ea-size-large{width:200px}.tribe-ea .tribe-ea-size-xlarge{width:405px}.tribe-ea .has-credentials{padding:0}.tribe-ea .tribe-button-row{padding-left:0}.tribe-ea .tribe-ea-fileicon{padding:3px}.tribe-ea .tribe-ea-field-readonly{line-height:30px}.tribe-ea .tribe-ea-field-readonly+.tribe-ea-field{margin-left:10px}.tribe-ea .tribe-ea-field.tribe-field-inline-dropdown{margin-left:0}.tribe-ea .tribe-credential-row{border-top:15px solid #fff}.tribe-ea .enter-credentials{background-color:#f8eceb;padding:1rem}.tribe-ea .enter-credentials.credentials-entered{background-color:#ebf2eb}.tribe-ea .enter-credentials.credentials-entered .tribe-credentials-prompt,.tribe-ea .enter-credentials.credentials-entered .tribe-fieldset{display:none}.tribe-ea .enter-credentials.credentials-entered .tribe-credentials-success{display:block;margin-bottom:0}.tribe-ea .enter-credentials input{max-width:250px;width:75%}.tribe-ea .enter-credentials .dashicons{font-size:1.5rem;line-height:1.2rem;margin-right:.5rem}.tribe-ea .enter-credentials .dashicons-warning{color:#d54e21}.tribe-ea .enter-credentials .dashicons-yes{color:#41a341;font-size:2rem}.tribe-ea .enter-credentials #facebook_api_key{margin-right:1.5rem}.tribe-ea .enter-credentials .tribe-credentials-success{display:none}.tribe-ea .manage-column.column-frequency,.tribe-ea .manage-column.column-imported{width:15%}.tribe-ea .manage-column.column-total{width:15%;text-align:left}.tribe-ea .tribe-ea-tab-scheduled td.column-source{padding-left:10px}.tribe-ea .tribe-ea-tab-scheduled td.column-source :not(.row-actions) a:first-of-type{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;display:inline-block;max-width:100%;vertical-align:bottom}.tribe-ea td.column-source{padding-left:50px;position:relative}.tribe-ea td.column-total{text-align:left}.tribe-ea .dashicons.tribe-ea-status-failed{color:#dc3232}.tribe-ea .tribe-ea-report-status{position:absolute;width:45px;bottom:0;top:0;left:0;font-size:25px}.tribe-ea .tribe-ea-report-status>.dashicons{width:100%;padding-top:10px;font-size:inherit}.tribe-ea .tribe-ea-report-status .tribe-ea-status-success{color:#46b450}.tribe-ea .tribe-ea-report-status .tribe-ea-status-scheduled{color:#00a0d2}.tribe-ea .tribe-ea-report-status .tribe-ea-status-failed{color:#dc3232}.tribe-ea .tribe-ea-report-status .tribe-ea-status-pending{color:#ffb900;font-size:.8em}.tribe-ea .select2-container-multi .select2-choices .select2-search-field input{height:25px}.tribe-ea .select2-container{margin:0 1px 0 0}.tribe-ea input,.tribe-ea select{margin-left:0}.tribe-ea .tribe-refine{margin-bottom:.25rem}.tribe-ea .tribe-refine:last-child{margin-bottom:0}.tribe-ea .tribe-date-helper{color:gray}.tribe-ea .tribe-ea-inline-label{padding-top:7px}.tribe-ea .tribe-notice-tribe-missing-aggregator-license{background:url(../images/aggregator/ea-upsell-bkg.svg) transparent no-repeat;background-size:cover;border:none;padding:60px 0;text-align:center}.tribe-ea .tribe-notice-tribe-missing-aggregator-license .upsell-banner{margin-bottom:30px;margin-left:auto;margin-right:auto}.tribe-ea .tribe-notice-tribe-missing-aggregator-license h3{color:#fff;font-size:22px;font-weight:400;letter-spacing:1.5px}.tribe-ea .tribe-notice-tribe-missing-aggregator-license p{color:#fff;font-size:16px;font-weight:300;letter-spacing:1px;margin:0 auto 30px;width:50%}.tribe-ea .tribe-notice-tribe-missing-aggregator-license a:not(.tribe-button){color:#abd8e8}.tribe-ea .tribe-notice-tribe-missing-aggregator-license a:not(.tribe-button):active,.tribe-ea .tribe-notice-tribe-missing-aggregator-license a:not(.tribe-button):hover{color:#cbe1e8}.tribe-ea .tribe-banner{display:flex;align-items:center;justify-content:center;flex:1 1 auto}.tribe-ea .tribe-banner.tribe-active.tribe-dependent{display:flex}.tribe-ea .tribe-banner.tribe-banner-eventbrite-tickets{background-image:linear-gradient(135deg,#0178ba,#0178ba 25%,#01bdac 65%,#01bdac);background-size:cover;padding:0;text-align:center}.tribe-ea .tribe-banner.tribe-banner-eventbrite-tickets h3{color:#fff;font-size:26px;letter-spacing:1px;font-weight:400;padding:0 45px}.tribe-ea .tribe-banner.tribe-banner-eventbrite-tickets img{max-width:165px}.tribe-ea .tribe-button{border:1px solid;border-radius:3px;color:#fff;display:inline-block;font-size:13px;font-weight:300;letter-spacing:1.5px;padding:15px 30px;text-decoration:none;text-transform:uppercase}.tribe-ea .tribe-button-primary{background:#000;border-color:#000;margin-right:5px}.tribe-ea .tribe-button-secondary{background:transparent;border-color:#fff;margin-left:10px}.tribe-ea .dataTables_filter,.tribe-ea .dataTables_length{line-height:28px;margin-bottom:.5rem}.tribe-ea .dataTables_filter select,.tribe-ea .dataTables_length select{margin-top:-2px}.tribe-ea .tribe-view-filters.tribe-active+.tribe-filters{display:block}.tribe-ea dl.tribe-filters{display:none;margin-left:.5rem;margin-top:0}.tribe-ea dl.tribe-filters dt{clear:left;display:inline-block;font-weight:700;margin-right:.25rem}.tribe-ea dl.tribe-filters dd{display:inline;margin-left:0}.tribe-ea dl.tribe-filters dd:after{content:"";display:block;margin-bottom:.25rem}.tribe-ea .widefat td p{margin-bottom:.25em}.tribe-ea .tribe-ea-eventbrite-button{margin-left:2rem;margin-top:1rem}.tribe-ea-table-container{background-color:#fafafa;border:1px solid #e7e7e7;min-height:25px;padding:.5rem}.tribe-preview-container{display:none;padding-left:1rem;padding-right:1rem;margin-top:.5rem}.edit-form .tribe-preview-container,.show-data .tribe-preview-container,.tribe-preview-container.tribe-fetch-error,.tribe-preview-container.tribe-fetched,.tribe-preview-container.tribe-fetching{display:block}.tribe-preview-container.tribe-fetching .spinner-container{display:block;text-align:center}.tribe-preview-container.tribe-fetch-error .tribe-fetch-error-message{display:block}.tribe-preview-container .data-container{display:none}.tribe-preview-container .data-container.csv-data #tribe-csv-preview-message{display:block}.tribe-preview-container .data-container.csv-data #tribe-remote-preview-message{display:none}.tribe-preview-container .data-container #tribe-remote-preview-message{display:block}.tribe-preview-container>td{padding-left:0;padding-right:0}.tribe-preview-container .tribe-column-end-date,.tribe-preview-container .tribe-column-start-date,.tribe-preview-container .tribe-column-start-time{width:8em}.tribe-preview-container .spinner-container,.tribe-preview-container .tribe-fetch-error-message{display:none}.tribe-preview-container .spinner{float:none;margin-left:auto;margin-right:auto;visibility:visible}.tribe-preview-container .spinner-message{display:block;margin-top:.25rem}.tribe-preview-container .dataTable{float:left}.tribe-preview-container .dataTable .check-column input,.tribe-preview-container .dataTable .column-cb input{display:none}.tribe-preview-container .dataTable tfoot th,.tribe-preview-container .dataTable thead th{padding-right:20px;white-space:nowrap}.tribe-preview-container .dataTable thead tr+tr th{background:#f3f3f3;border-bottom:0;font-weight:700}.tribe-preview-container .tribe-td-height-limit{max-height:50px;overflow:hidden}.tribe-preview-container .display-checkboxes .check-column input,.tribe-preview-container .display-checkboxes .column-cb input{display:inline-block}.tribe-preview-container .tribe-preview-message{display:none;font-weight:700;line-height:26px}.tribe-preview-container #tribe-ea-field-post_status+label{margin-left:1rem}.tribe-default-settings{display:none;overflow:hidden;padding-bottom:1rem;padding-top:1rem}.tribe-default-settings label{display:inline-block;line-height:26px}.edit-form .tribe-default-settings,.edit-form .tribe-finalize-container,.show-data .data-container,.show-data .tribe-default-settings,.show-data .tribe-finalize-container{display:block}.edit-form .tribe-cancel{display:inline-block}.tribe-ea-form .tribe-bumpdown-manual,.tribe-ea-form .tribe-bumpdown-scheduled,.tribe-ea-form[data-origin=csv] .dataTables_filter,.tribe-ea-form[data-origin=csv] .dataTables_info,.tribe-ea-form[data-origin=csv] .dataTables_length,.tribe-ea-form[data-origin=csv] .dataTables_paginate{display:none}.tribe-ea-form[data-type=manual] .tribe-bumpdown-manual,.tribe-ea-form[data-type=schedule] .tribe-bumpdown-scheduled{display:inline-block}.tribe-cancel{display:none}.tribe-finalize-container{display:none;padding-top:1.5rem}.tribe-finalize-container .tribe-timezone-message{font-style:italic;padding-top:.5rem}.tribe-finalize-container .tribe-limits-message{font-style:italic;padding:0;margin:1em 0 -1.5em}.tribe-message-loader{display:none}.tribe-notice-aggregator-update-msg .progress{border:1px solid #ccc;float:left;margin-right:1rem;padding:1px;width:18rem}.tribe-notice-aggregator-update-msg .progress .bar{background:#ffba00;height:1rem;width:1%}.tribe-notice-aggregator-update-msg.completed{border-left-color:#46b450}.tribe-notice-aggregator-update-msg.completed .progress .bar{background:#7ad03a}.tribe-notice-aggregator-update-msg .tracker{margin:0;padding:0}.tribe-notice-aggregator-update-msg .tracker .tracked-item{display:none;margin:.25rem 0}.tribe-notice-aggregator-update-msg .tracker.has-created,.tribe-notice-aggregator-update-msg .tracker.has-skipped,.tribe-notice-aggregator-update-msg .tracker.has-updated{padding-bottom:.25rem}.tribe-notice-aggregator-update-msg .tracker.has-created .track-created,.tribe-notice-aggregator-update-msg .tracker.has-created .track-remaining,.tribe-notice-aggregator-update-msg .tracker.has-skipped .track-remaining,.tribe-notice-aggregator-update-msg .tracker.has-skipped .track-skipped,.tribe-notice-aggregator-update-msg .tracker.has-updated .track-remaining,.tribe-notice-aggregator-update-msg .tracker.has-updated .track-updated{display:block}.tribe-ea-tab-edit .tribe-bumpdown-trigger.tribe-ea-help{display:none}.select2-disabled{margin-bottom:0;color:gray;cursor:default}.tribe-dropdown-subtitle{font-size:11px;color:gray}.select2-highlighted .tribe-dropdown-subtitle{color:#fff}.tribe-aggregator-inactive .tribe-ea-tab-scheduled .widefat p,.tribe-aggregator-inactive .tribe-ea-tab-scheduled .widefat td,.tribe-aggregator-inactive .tribe-ea-tab-scheduled .widefat ul{color:#ccc}.tribe-ea-field-wrapper-post_status{min-width:275px}.tribe-ea-field-wrapper-post_status.tribe-active{float:left}@media screen and (max-width:782px){.tribe-ea .form-table td{padding-right:0}.tribe-ea .form-table td input[type=text]{width:92%;display:inline-block}.tribe-ea td.tribe-dependent.tribe-active{display:block}.tribe-ea input+.tribe-ea-help{line-height:30px}}
1
+ .tribe-ea .tribe-ea-tab{padding:20px;margin-top:20px;border:1px solid #ccc;background-color:#fff}.tribe-ea .tribe-ea-tab .form-table th[scope=row]{width:140px}.tribe-ea .tribe-ea-tab .form-table tr{position:relative}.tribe-ea .tribe-ea-tab .form-table .eb-url-row th[scope=row]{padding:0}.tribe-ea .tribe-ea-tab .form-table .eb-url-row td{padding:0 10px}.tribe-ea .tribe-ea-tab .subsubsub li{font-weight:700}.tribe-ea .tribe-ea-tab .subsubsub .count,.tribe-ea .tribe-ea-tab .subsubsub a{font-weight:400}.tribe-ea .tribe-ea-help{padding:4px;color:#0073aa;cursor:pointer}.tribe-ea .tribe-ea-hidden{display:none}.tribe-ea .tribe-ea-file-name{display:inline-block;font-style:italic;line-height:26px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:auto}.tribe-ea .tribe-ea-raw-list{line-height:1.25em;list-style:square;margin-top:0;margin-left:22px;margin-bottom:6px}.tribe-ea .tribe-ea-raw-list>li{margin-bottom:2px}.tribe-ea .tribe-ea-total{font-weight:600}.tribe-ea .tribe-ea-size-tiny{width:75px}.tribe-ea .tribe-ea-size-small{width:100px}.tribe-ea .tribe-ea-size-medium{width:150px}.tribe-ea .tribe-ea-size-large{width:200px}.tribe-ea .tribe-ea-size-xlarge{width:405px}.tribe-ea .has-credentials{padding:0}.tribe-ea .tribe-button-row{padding-left:0}.tribe-ea .tribe-ea-fileicon{padding:3px}.tribe-ea .tribe-ea-field-readonly{line-height:30px}.tribe-ea .tribe-ea-field-readonly+.tribe-ea-field{margin-left:10px}.tribe-ea .tribe-ea-field.tribe-field-inline-dropdown{margin-left:0}.tribe-ea .tribe-credential-row{border-top:15px solid #fff}.tribe-ea .enter-credentials{background-color:#f8eceb;padding:1rem}.tribe-ea .enter-credentials.credentials-entered{background-color:#ebf2eb}.tribe-ea .enter-credentials.credentials-entered .tribe-credentials-prompt,.tribe-ea .enter-credentials.credentials-entered .tribe-fieldset{display:none}.tribe-ea .enter-credentials.credentials-entered .tribe-credentials-success{display:block;margin-bottom:0}.tribe-ea .enter-credentials input{max-width:250px;width:75%}.tribe-ea .enter-credentials .dashicons{font-size:1.5rem;line-height:1.2rem;margin-right:.5rem}.tribe-ea .enter-credentials .dashicons-warning{color:#d54e21}.tribe-ea .enter-credentials .dashicons-yes{color:#41a341;font-size:2rem}.tribe-ea .enter-credentials #facebook_api_key{margin-right:1.5rem}.tribe-ea .enter-credentials .tribe-credentials-success{display:none}.tribe-ea .manage-column.column-frequency,.tribe-ea .manage-column.column-imported{width:15%}.tribe-ea .manage-column.column-total{width:15%;text-align:left}.tribe-ea .tribe-ea-tab-scheduled td.column-source{padding-left:10px}.tribe-ea .tribe-ea-tab-scheduled td.column-source :not(.row-actions) a:first-of-type{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;display:inline-block;max-width:100%;vertical-align:bottom}.tribe-ea td.column-source{padding-left:50px;position:relative}.tribe-ea td.column-total{text-align:left}.tribe-ea .dashicons.tribe-ea-status-failed{color:#dc3232}.tribe-ea .tribe-ea-report-status{position:absolute;width:45px;bottom:0;top:0;left:0;font-size:25px}.tribe-ea .tribe-ea-report-status>.dashicons{width:100%;padding-top:10px;font-size:inherit}.tribe-ea .tribe-ea-report-status .tribe-ea-status-success{color:#46b450}.tribe-ea .tribe-ea-report-status .tribe-ea-status-scheduled{color:#00a0d2}.tribe-ea .tribe-ea-report-status .tribe-ea-status-failed{color:#dc3232}.tribe-ea .tribe-ea-report-status .tribe-ea-status-pending{color:#ffb900;font-size:.8em}.tribe-ea .select2-container-multi .select2-choices .select2-search-field input{height:25px}.tribe-ea .select2-container{margin:0 1px 0 0}.tribe-ea input,.tribe-ea select{margin-left:0}.tribe-ea .tribe-refine{margin-bottom:.25rem}.tribe-ea .tribe-refine:last-child{margin-bottom:0}.tribe-ea .tribe-date-helper{color:gray}.tribe-ea .tribe-ea-inline-label{padding-top:7px}.tribe-ea .tribe-notice-tribe-missing-aggregator-license{background:url(../images/aggregator/ea-upsell-bkg.svg) transparent no-repeat;background-size:cover;border:none;padding:60px 0;text-align:center}.tribe-ea .tribe-notice-tribe-missing-aggregator-license .upsell-banner{margin-bottom:30px;margin-left:auto;margin-right:auto}.tribe-ea .tribe-notice-tribe-missing-aggregator-license h3{color:#fff;font-size:22px;font-weight:400;letter-spacing:1.5px}.tribe-ea .tribe-notice-tribe-missing-aggregator-license p{color:#fff;font-size:16px;font-weight:300;letter-spacing:1px;margin:0 auto 30px;width:50%}.tribe-ea .tribe-notice-tribe-missing-aggregator-license a:not(.tribe-button){color:#abd8e8}.tribe-ea .tribe-notice-tribe-missing-aggregator-license a:not(.tribe-button):active,.tribe-ea .tribe-notice-tribe-missing-aggregator-license a:not(.tribe-button):hover{color:#cbe1e8}.tribe-ea .tribe-banner{display:flex;align-items:center;justify-content:center;flex:1 1 auto}.tribe-ea .tribe-banner.tribe-active.tribe-dependent{display:flex}.tribe-ea .tribe-banner.tribe-banner-eventbrite-tickets{background-image:linear-gradient(135deg,#0178ba,#0178ba 25%,#01bdac 65%,#01bdac);background-size:cover;padding:0;text-align:center}.tribe-ea .tribe-banner.tribe-banner-eventbrite-tickets h3{color:#fff;font-size:26px;letter-spacing:1px;font-weight:400;padding:0 45px}.tribe-ea .tribe-banner.tribe-banner-eventbrite-tickets img{max-width:165px}.tribe-ea .tribe-button{border:1px solid;border-radius:3px;color:#fff;display:inline-block;font-size:13px;font-weight:300;letter-spacing:1.5px;padding:15px 30px;text-decoration:none;text-transform:uppercase}.tribe-ea .tribe-button-primary{background:#000;border-color:#000;margin-right:5px}.tribe-ea .tribe-button-secondary{background:transparent;border-color:#fff;margin-left:10px}.tribe-ea .dataTables_filter,.tribe-ea .dataTables_length{line-height:28px;margin-bottom:.5rem}.tribe-ea .dataTables_filter select,.tribe-ea .dataTables_length select{margin-top:-2px}.tribe-ea .tribe-view-filters.tribe-active+.tribe-filters{display:block}.tribe-ea dl.tribe-filters{display:none;margin-left:.5rem;margin-top:0}.tribe-ea dl.tribe-filters dt{clear:left;display:inline-block;font-weight:700;margin-right:.25rem}.tribe-ea dl.tribe-filters dd{display:inline;margin-left:0}.tribe-ea dl.tribe-filters dd:after{content:"";display:block;margin-bottom:.25rem}.tribe-ea .widefat td p{margin-bottom:.25em}.tribe-ea .tribe-ea-login-button{margin-left:2rem;margin-top:1rem}.tribe-ea-table-container{background-color:#fafafa;border:1px solid #e7e7e7;min-height:25px;padding:.5rem}.tribe-preview-container{display:none;padding-left:1rem;padding-right:1rem;margin-top:.5rem}.edit-form .tribe-preview-container,.show-data .tribe-preview-container,.tribe-preview-container.tribe-fetch-error,.tribe-preview-container.tribe-fetched,.tribe-preview-container.tribe-fetching{display:block}.tribe-preview-container.tribe-fetching .spinner-container{display:block;text-align:center}.tribe-preview-container.tribe-fetch-error .tribe-fetch-error-message{display:block}.tribe-preview-container .data-container{display:none}.tribe-preview-container .data-container.csv-data #tribe-csv-preview-message{display:block}.tribe-preview-container .data-container.csv-data #tribe-remote-preview-message{display:none}.tribe-preview-container .data-container #tribe-remote-preview-message{display:block}.tribe-preview-container>td{padding-left:0;padding-right:0}.tribe-preview-container .tribe-column-end-date,.tribe-preview-container .tribe-column-start-date,.tribe-preview-container .tribe-column-start-time{width:8em}.tribe-preview-container .spinner-container,.tribe-preview-container .tribe-fetch-error-message{display:none}.tribe-preview-container .spinner{float:none;margin-left:auto;margin-right:auto;visibility:visible}.tribe-preview-container .spinner-message{display:block;margin-top:.25rem}.tribe-preview-container .dataTable{float:left}.tribe-preview-container .dataTable .check-column input,.tribe-preview-container .dataTable .column-cb input{display:none}.tribe-preview-container .dataTable tfoot th,.tribe-preview-container .dataTable thead th{padding-right:20px;white-space:nowrap}.tribe-preview-container .dataTable thead tr+tr th{background:#f3f3f3;border-bottom:0;font-weight:700}.tribe-preview-container .tribe-td-height-limit{max-height:50px;overflow:hidden}.tribe-preview-container .display-checkboxes .check-column input,.tribe-preview-container .display-checkboxes .column-cb input{display:inline-block}.tribe-preview-container .tribe-preview-message{display:none;font-weight:700;line-height:26px}.tribe-preview-container #tribe-ea-field-post_status+label{margin-left:1rem}.tribe-default-settings{display:none;overflow:hidden;padding-bottom:1rem;padding-top:1rem}.tribe-default-settings label{display:inline-block;line-height:26px}.edit-form .tribe-default-settings,.edit-form .tribe-finalize-container,.show-data .data-container,.show-data .tribe-default-settings,.show-data .tribe-finalize-container{display:block}.edit-form .tribe-cancel{display:inline-block}.tribe-ea-form .tribe-bumpdown-manual,.tribe-ea-form .tribe-bumpdown-scheduled,.tribe-ea-form[data-origin=csv] .dataTables_filter,.tribe-ea-form[data-origin=csv] .dataTables_info,.tribe-ea-form[data-origin=csv] .dataTables_length,.tribe-ea-form[data-origin=csv] .dataTables_paginate{display:none}.tribe-ea-form[data-type=manual] .tribe-bumpdown-manual,.tribe-ea-form[data-type=schedule] .tribe-bumpdown-scheduled{display:inline-block}.tribe-cancel{display:none}.tribe-finalize-container{display:none;padding-top:1.5rem}.tribe-finalize-container .tribe-timezone-message{font-style:italic;padding-top:.5rem}.tribe-finalize-container .tribe-limits-message{font-style:italic;padding:0;margin:1em 0 -1.5em}.tribe-message-loader{display:none}.tribe-notice-aggregator-update-msg .progress{border:1px solid #ccc;float:left;margin-right:1rem;padding:1px;width:18rem}.tribe-notice-aggregator-update-msg .progress .bar{background:#ffba00;height:1rem;width:1%}.tribe-notice-aggregator-update-msg.completed{border-left-color:#46b450}.tribe-notice-aggregator-update-msg.completed .progress .bar{background:#7ad03a}.tribe-notice-aggregator-update-msg .tracker{margin:0;padding:0}.tribe-notice-aggregator-update-msg .tracker .tracked-item{display:none;margin:.25rem 0}.tribe-notice-aggregator-update-msg .tracker.has-created,.tribe-notice-aggregator-update-msg .tracker.has-skipped,.tribe-notice-aggregator-update-msg .tracker.has-updated{padding-bottom:.25rem}.tribe-notice-aggregator-update-msg .tracker.has-created .track-created,.tribe-notice-aggregator-update-msg .tracker.has-created .track-remaining,.tribe-notice-aggregator-update-msg .tracker.has-skipped .track-remaining,.tribe-notice-aggregator-update-msg .tracker.has-skipped .track-skipped,.tribe-notice-aggregator-update-msg .tracker.has-updated .track-remaining,.tribe-notice-aggregator-update-msg .tracker.has-updated .track-updated{display:block}.tribe-ea-tab-edit .tribe-bumpdown-trigger.tribe-ea-help{display:none}.select2-disabled{margin-bottom:0;color:gray;cursor:default}.tribe-dropdown-subtitle{font-size:11px;color:gray}.select2-highlighted .tribe-dropdown-subtitle{color:#fff}.tribe-aggregator-inactive .tribe-ea-tab-scheduled .widefat p,.tribe-aggregator-inactive .tribe-ea-tab-scheduled .widefat td,.tribe-aggregator-inactive .tribe-ea-tab-scheduled .widefat ul{color:#ccc}.tribe-ea-field-wrapper-post_status{min-width:275px}.tribe-ea-field-wrapper-post_status.tribe-active{float:left}@media screen and (max-width:782px){.tribe-ea .form-table td{padding-right:0}.tribe-ea .form-table td input[type=text]{width:92%;display:inline-block}.tribe-ea td.tribe-dependent.tribe-active{display:block}.tribe-ea input+.tribe-ea-help{line-height:30px}}
src/resources/css/events-admin.css CHANGED
@@ -460,6 +460,47 @@ table.eventForm {
460
  background: #c85b2f;
461
  }
462
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
463
  /* = Event Aggregator Status
464
  =============================================*/
465
 
460
  background: #c85b2f;
461
  }
462
 
463
+ /*
464
+ Meetup
465
+ */
466
+
467
+ .tribe-ea-meetup-disconnect {
468
+ color: #a00;
469
+ display: inline-block;
470
+ margin-left: 1rem;
471
+ }
472
+
473
+ .tribe-ea-meetup-disconnect:active,
474
+ .tribe-ea-meetup-disconnect:hover {
475
+ color: #f00;
476
+ }
477
+
478
+ .tribe-ea-meetup-button {
479
+ border-radius: 3px;
480
+ color: #fff;
481
+ display: inline-block;
482
+ padding: .5rem 1.5rem;
483
+ text-decoration: none;
484
+ -webkit-transition: background-color 0.5s ease;
485
+ transition: background-color 0.5s ease;
486
+ }
487
+
488
+ .tribe-ea-meetup-button:active,
489
+ .tribe-ea-meetup-button:hover {
490
+ color: #fff;
491
+ cursor: pointer;
492
+ }
493
+
494
+ .tribe-ea-meetup-button {
495
+ background: #f41940;
496
+ }
497
+
498
+ .tribe-ea-meetup-button:active,
499
+ .tribe-ea-meetup-button:hover,
500
+ .tribe-ea-meetup-button:focus {
501
+ background: #f41940;
502
+ }
503
+
504
  /* = Event Aggregator Status
505
  =============================================*/
506
 
src/resources/css/events-admin.min.css CHANGED
@@ -1 +1 @@
1
- .events-cal #post-query-submit,.events-cal .tablenav select[name=m]{display:none}.fixed .column-end-date,.fixed .column-events-cats,.fixed .column-start-date{width:14%}#additional-field-table input,#additional-field-table select,#additional-field-table textarea{width:200px}#additional-field-table tbody tr{height:72px}.tribe-restore-link+a{display:none}.eventForm{margin-top:-20px}.eventForm td{font-size:12px;padding:0 6px 10px 0;vertical-align:middle}.eventForm td input.alignleft,.eventForm td select.alignleft{margin-right:.3rem}.eventForm #EventURL{width:70%}.eventForm #event-meta td{vertical-align:top}.eventForm #event-meta td:first-child{line-height:30px}.eventForm #event-meta td div{margin-bottom:10px}.eventForm #event-meta td div:last-child{margin-bottom:20px}.eventForm textarea{width:100%}.eventForm h4{font-size:1.2em;margin:1em 0}.eventForm h4.event-time{margin-top:0}.eventForm .tribe_sectionheader{padding-bottom:5px}.eventForm p{margin:0 0 10px}.eventForm input[type=color],.eventForm input[type=date],.eventForm input[type=datetime-local],.eventForm input[type=datetime],.eventForm input[type=email],.eventForm input[type=month],.eventForm input[type=number],.eventForm input[type=password],.eventForm input[type=search],.eventForm input[type=tel],.eventForm input[type=text],.eventForm input[type=time],.eventForm input[type=url],.eventForm input[type=week]{background-image:none;border:1px solid #ccc;border-radius:3px;line-height:20px;margin-left:0}.eventForm .event-dynamic-helper-text{color:#999;font-style:italic;padding:0}.eventForm .tribe-datetime-block .tribe-allday{margin:10px 0 0}.eventForm .tribe-datetime-block .tribe-field-end_date,.eventForm .tribe-datetime-block .tribe-field-end_time,.eventForm .tribe-datetime-block .tribe-field-start_date,.eventForm .tribe-datetime-block .tribe-field-start_time{height:28px}.eventForm .tribe-datetime-block .tribe-field-end_date,.eventForm .tribe-datetime-block .tribe-field-start_date{width:100px}.eventForm .tribe-datetime-block .tribe-field-end_time,.eventForm .tribe-datetime-block .tribe-field-start_time{width:80px}.eventForm .tribe-datetime-block .tribe-field-timezone{width:100%;max-width:199px;min-width:100px;margin-top:-2px;display:none}.eventForm .tribe-datetime-block .tribe-field-timezone.select2-container{display:inline-block;margin-top:-4px}.eventForm .tribe-datetime-block .tribe-change-timezone{white-space:nowrap}.eventForm .tribe-datetime-label{vertical-align:top;padding-top:5px}.ui-datepicker-calendar .ui-datepicker-today a{background:linear-gradient(354deg,#ccc,#eee);color:#000}.ui-datepicker-calendar .ui-datepicker-today.ui-datepicker-current-day a{background:linear-gradient(354deg,#0a55a0,#1288eb);color:#fff}.ui-datepicker select.ui-datepicker-month{width:8rem}.tribe-community-event-info{width:100%;margin:10px}#EventInfo,.eventtable{width:100%;margin:0;padding-top:0}#event_tickets,.eventtable.ticket_list.eventForm{table-layout:fixed}#ticket_end_date,#ticket_start_date{width:100px}.form-table form input{border:none}#submitLabel{display:block}#submitLabel input{display:block;padding:0}#EventBriteDetailDiv h4,.eventForm .tribe_sectionheader h4,.tribe-community-event-info h4{padding-bottom:6px;text-transform:uppercase;border-bottom:1px solid #e5e5e5}.tribe-events-error{display:none}.tribe-events-multi-event-day{color:#0f81bb}.ui-front{z-index:1000000}.events-cal .ui-widget-overlay.ui-front{z-index:90}.edit-linked-post-link{display:inline-block;margin-left:10px}.linked-post-wrapper tbody+tbody tr.saved_linked-post td,.linked-post-wrapper tbody+tfoot tr td{margin-top:1em;padding-top:1em}.linked-post-wrapper .linked-post td:first-child{padding-left:30px}.move-linked-post-group{padding-right:.5em;cursor:move}.tribe-delete-this{float:right;color:#444}.tribe-delete-this.hover-state,.tribe-delete-this:hover{color:#a00}.tribe-delete-this.tribe-confirm-delete-this,.tribe_community_edit .edit-linked-post-link a{display:none}.tribe-linked-post-error.error{display:inline;margin-left:5px;padding:5px 10px}#tribe-field-toggle_blocks_editor_hidden_field{display:none}#EventBriteDetailDiv small,.tribe-community-event-info small{font-size:10px;color:#a3a3a3}#eventBriteTicketing,#mainDonateRow{margin:-11px 6px 0;padding:10px 15px;border:1px solid #e2e2e2;border-radius:3px;-webkit-border-top-left-radius:0;-moz-border-radius-topleft:0;-webkit-border-top-right-radius:0;-moz-border-radius-topright:0;-khtml-border-radius:3px;background:url(../images/bg_fade.png) repeat-x 0 0;background-color:#fff}#eventBriteTicketing h2{height:80px;margin:0;background:url(../images/eb_press_little.gif) no-repeat 100% 0}.tribe-community-event-info,table.eventForm{width:100%}#custom-recurrence-weeks label{display:block;float:left;width:45px;margin-bottom:3px}#custom-recurrence-frequency input{width:30px}#custom-recurrence-years label{display:block;float:left;width:50px;margin-bottom:3px}#recurrence-changed-row{display:none;color:red}#rec-days-error,#rec-end-error{color:red}.rec-error{display:none}#recurrence-pattern-description{font-style:italic}.recurrence-pattern-description-row{display:none}.chosen,.chzn-container,.tribe-chosen{margin-right:10px!important}#defaultCountry,#eventsDefaultState,#StateProvinceSelect,.events-dropdown{min-width:220px}.multi-day-cutoff-dropdown{width:100px!important}.inactive-sidebar .widget,.widget-liquid-right .sidebar-description,.widget-liquid-right .widget{overflow:visible!important}.tribe-aggregator-import-details{overflow:hidden}.tribe-aggregator-import-details dt{clear:left;float:left;margin-right:.25rem}.tribe-aggregator-import-details dd{margin-left:0}.tribe-aggregator-import-details .tribe-value{font-weight:700}.tribe-ea-eventbrite-disconnect{color:#a00;display:inline-block;margin-left:1rem}.tribe-ea-eventbrite-disconnect:active,.tribe-ea-eventbrite-disconnect:hover{color:red}.tribe-ea-eventbrite-button{border-radius:3px;color:#fff;display:inline-block;padding:.5rem 1.5rem;text-decoration:none;transition:background-color .5s ease}.tribe-ea-eventbrite-button:active,.tribe-ea-eventbrite-button:hover{color:#fff;cursor:pointer}.tribe-ea-eventbrite-button{background:#f6682f}.tribe-ea-eventbrite-button:active,.tribe-ea-eventbrite-button:focus,.tribe-ea-eventbrite-button:hover{background:#c85b2f}.event-aggregator-status{background-color:#fff;width:100%;border:2px solid #e4e5e6;border-spacing:0;margin-bottom:16px}.event-aggregator-status tbody tr:nth-child(2n) td{background-color:#f9f9f9}.event-aggregator-status th{text-align:left;border-bottom:1px solid #e4e5e6}.event-aggregator-status td,.event-aggregator-status th{padding:8px 12px;background-color:#fff}.event-aggregator-status td.label{width:220px}.event-aggregator-status td.label img{width:18px;height:18px;margin-right:6px;float:left}.event-aggregator-status td.indicator{width:20px}.event-aggregator-status td.indicator.good{color:#38b042}.event-aggregator-status td.indicator.bad{color:#ed5047}.event-aggregator-status td.indicator.warning{color:#f3ae46}@media (max-width:782px){.eventForm .tribe-datetime-block .tribe-field-end_date,.eventForm .tribe-datetime-block .tribe-field-start_date{width:63%;display:inline-block}.eventForm .tribe-datetime-block .tribe-field-end_time,.eventForm .tribe-datetime-block .tribe-field-start_time{width:35%;display:inline-block}.eventForm .tribe-datetime-block .tribe-datetime-separator{width:100%;display:block;text-align:center;padding:5px 0}.eventForm .tribe-datetime-block .tribe-field-timezone.select2-container{display:table;margin:10px auto 0}.eventForm .tribe-datetime-block .tribe-change-timezone{width:100%;display:block;text-align:center;padding:5px 0}}@media(min-width:1193px){.eventForm .tribe-datetime-block .tribe-field-timezone{width:calc(100% - 400px)}}
1
+ .events-cal #post-query-submit,.events-cal .tablenav select[name=m]{display:none}.fixed .column-end-date,.fixed .column-events-cats,.fixed .column-start-date{width:14%}#additional-field-table input,#additional-field-table select,#additional-field-table textarea{width:200px}#additional-field-table tbody tr{height:72px}.tribe-restore-link+a{display:none}.eventForm{margin-top:-20px}.eventForm td{font-size:12px;padding:0 6px 10px 0;vertical-align:middle}.eventForm td input.alignleft,.eventForm td select.alignleft{margin-right:.3rem}.eventForm #EventURL{width:70%}.eventForm #event-meta td{vertical-align:top}.eventForm #event-meta td:first-child{line-height:30px}.eventForm #event-meta td div{margin-bottom:10px}.eventForm #event-meta td div:last-child{margin-bottom:20px}.eventForm textarea{width:100%}.eventForm h4{font-size:1.2em;margin:1em 0}.eventForm h4.event-time{margin-top:0}.eventForm .tribe_sectionheader{padding-bottom:5px}.eventForm p{margin:0 0 10px}.eventForm input[type=color],.eventForm input[type=date],.eventForm input[type=datetime-local],.eventForm input[type=datetime],.eventForm input[type=email],.eventForm input[type=month],.eventForm input[type=number],.eventForm input[type=password],.eventForm input[type=search],.eventForm input[type=tel],.eventForm input[type=text],.eventForm input[type=time],.eventForm input[type=url],.eventForm input[type=week]{background-image:none;border:1px solid #ccc;border-radius:3px;line-height:20px;margin-left:0}.eventForm .event-dynamic-helper-text{color:#999;font-style:italic;padding:0}.eventForm .tribe-datetime-block .tribe-allday{margin:10px 0 0}.eventForm .tribe-datetime-block .tribe-field-end_date,.eventForm .tribe-datetime-block .tribe-field-end_time,.eventForm .tribe-datetime-block .tribe-field-start_date,.eventForm .tribe-datetime-block .tribe-field-start_time{height:28px}.eventForm .tribe-datetime-block .tribe-field-end_date,.eventForm .tribe-datetime-block .tribe-field-start_date{width:100px}.eventForm .tribe-datetime-block .tribe-field-end_time,.eventForm .tribe-datetime-block .tribe-field-start_time{width:80px}.eventForm .tribe-datetime-block .tribe-field-timezone{width:100%;max-width:199px;min-width:100px;margin-top:-2px;display:none}.eventForm .tribe-datetime-block .tribe-field-timezone.select2-container{display:inline-block;margin-top:-4px}.eventForm .tribe-datetime-block .tribe-change-timezone{white-space:nowrap}.eventForm .tribe-datetime-label{vertical-align:top;padding-top:5px}.ui-datepicker-calendar .ui-datepicker-today a{background:linear-gradient(354deg,#ccc,#eee);color:#000}.ui-datepicker-calendar .ui-datepicker-today.ui-datepicker-current-day a{background:linear-gradient(354deg,#0a55a0,#1288eb);color:#fff}.ui-datepicker select.ui-datepicker-month{width:8rem}.tribe-community-event-info{width:100%;margin:10px}#EventInfo,.eventtable{width:100%;margin:0;padding-top:0}#event_tickets,.eventtable.ticket_list.eventForm{table-layout:fixed}#ticket_end_date,#ticket_start_date{width:100px}.form-table form input{border:none}#submitLabel{display:block}#submitLabel input{display:block;padding:0}#EventBriteDetailDiv h4,.eventForm .tribe_sectionheader h4,.tribe-community-event-info h4{padding-bottom:6px;text-transform:uppercase;border-bottom:1px solid #e5e5e5}.tribe-events-error{display:none}.tribe-events-multi-event-day{color:#0f81bb}.ui-front{z-index:1000000}.events-cal .ui-widget-overlay.ui-front{z-index:90}.edit-linked-post-link{display:inline-block;margin-left:10px}.linked-post-wrapper tbody+tbody tr.saved_linked-post td,.linked-post-wrapper tbody+tfoot tr td{margin-top:1em;padding-top:1em}.linked-post-wrapper .linked-post td:first-child{padding-left:30px}.move-linked-post-group{padding-right:.5em;cursor:move}.tribe-delete-this{float:right;color:#444}.tribe-delete-this.hover-state,.tribe-delete-this:hover{color:#a00}.tribe-delete-this.tribe-confirm-delete-this,.tribe_community_edit .edit-linked-post-link a{display:none}.tribe-linked-post-error.error{display:inline;margin-left:5px;padding:5px 10px}#tribe-field-toggle_blocks_editor_hidden_field{display:none}#EventBriteDetailDiv small,.tribe-community-event-info small{font-size:10px;color:#a3a3a3}#eventBriteTicketing,#mainDonateRow{margin:-11px 6px 0;padding:10px 15px;border:1px solid #e2e2e2;border-radius:3px;-webkit-border-top-left-radius:0;-moz-border-radius-topleft:0;-webkit-border-top-right-radius:0;-moz-border-radius-topright:0;-khtml-border-radius:3px;background:url(../images/bg_fade.png) repeat-x 0 0;background-color:#fff}#eventBriteTicketing h2{height:80px;margin:0;background:url(../images/eb_press_little.gif) no-repeat 100% 0}.tribe-community-event-info,table.eventForm{width:100%}#custom-recurrence-weeks label{display:block;float:left;width:45px;margin-bottom:3px}#custom-recurrence-frequency input{width:30px}#custom-recurrence-years label{display:block;float:left;width:50px;margin-bottom:3px}#recurrence-changed-row{display:none;color:red}#rec-days-error,#rec-end-error{color:red}.rec-error{display:none}#recurrence-pattern-description{font-style:italic}.recurrence-pattern-description-row{display:none}.chosen,.chzn-container,.tribe-chosen{margin-right:10px!important}#defaultCountry,#eventsDefaultState,#StateProvinceSelect,.events-dropdown{min-width:220px}.multi-day-cutoff-dropdown{width:100px!important}.inactive-sidebar .widget,.widget-liquid-right .sidebar-description,.widget-liquid-right .widget{overflow:visible!important}.tribe-aggregator-import-details{overflow:hidden}.tribe-aggregator-import-details dt{clear:left;float:left;margin-right:.25rem}.tribe-aggregator-import-details dd{margin-left:0}.tribe-aggregator-import-details .tribe-value{font-weight:700}.tribe-ea-eventbrite-disconnect{color:#a00;display:inline-block;margin-left:1rem}.tribe-ea-eventbrite-disconnect:active,.tribe-ea-eventbrite-disconnect:hover{color:red}.tribe-ea-eventbrite-button{border-radius:3px;color:#fff;display:inline-block;padding:.5rem 1.5rem;text-decoration:none;transition:background-color .5s ease}.tribe-ea-eventbrite-button:active,.tribe-ea-eventbrite-button:hover{color:#fff;cursor:pointer}.tribe-ea-eventbrite-button{background:#f6682f}.tribe-ea-eventbrite-button:active,.tribe-ea-eventbrite-button:focus,.tribe-ea-eventbrite-button:hover{background:#c85b2f}.tribe-ea-meetup-disconnect{color:#a00;display:inline-block;margin-left:1rem}.tribe-ea-meetup-disconnect:active,.tribe-ea-meetup-disconnect:hover{color:red}.tribe-ea-meetup-button{border-radius:3px;color:#fff;display:inline-block;padding:.5rem 1.5rem;text-decoration:none;transition:background-color .5s ease}.tribe-ea-meetup-button:active,.tribe-ea-meetup-button:hover{color:#fff;cursor:pointer}.tribe-ea-meetup-button,.tribe-ea-meetup-button:active,.tribe-ea-meetup-button:focus,.tribe-ea-meetup-button:hover{background:#f41940}.event-aggregator-status{background-color:#fff;width:100%;border:2px solid #e4e5e6;border-spacing:0;margin-bottom:16px}.event-aggregator-status tbody tr:nth-child(2n) td{background-color:#f9f9f9}.event-aggregator-status th{text-align:left;border-bottom:1px solid #e4e5e6}.event-aggregator-status td,.event-aggregator-status th{padding:8px 12px;background-color:#fff}.event-aggregator-status td.label{width:220px}.event-aggregator-status td.label img{width:18px;height:18px;margin-right:6px;float:left}.event-aggregator-status td.indicator{width:20px}.event-aggregator-status td.indicator.good{color:#38b042}.event-aggregator-status td.indicator.bad{color:#ed5047}.event-aggregator-status td.indicator.warning{color:#f3ae46}@media (max-width:782px){.eventForm .tribe-datetime-block .tribe-field-end_date,.eventForm .tribe-datetime-block .tribe-field-start_date{width:63%;display:inline-block}.eventForm .tribe-datetime-block .tribe-field-end_time,.eventForm .tribe-datetime-block .tribe-field-start_time{width:35%;display:inline-block}.eventForm .tribe-datetime-block .tribe-datetime-separator{width:100%;display:block;text-align:center;padding:5px 0}.eventForm .tribe-datetime-block .tribe-field-timezone.select2-container{display:table;margin:10px auto 0}.eventForm .tribe-datetime-block .tribe-change-timezone{width:100%;display:block;text-align:center;padding:5px 0}}@media(min-width:1193px){.eventForm .tribe-datetime-block .tribe-field-timezone{width:calc(100% - 400px)}}
src/resources/postcss/aggregator-page.pcss CHANGED
@@ -415,7 +415,7 @@
415
  margin-bottom: .25em;
416
  }
417
 
418
- .tribe-ea-eventbrite-button {
419
  margin-left: 2rem;
420
  margin-top: 1rem;
421
  }
415
  margin-bottom: .25em;
416
  }
417
 
418
+ .tribe-ea-login-button {
419
  margin-left: 2rem;
420
  margin-top: 1rem;
421
  }
src/resources/postcss/events-admin.pcss CHANGED
@@ -495,6 +495,45 @@ table.eventForm {
495
  }
496
  }
497
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
498
 
499
 
500
  /* = Event Aggregator Status
495
  }
496
  }
497
 
498
+ /*
499
+ Meetup
500
+ */
501
+ .tribe-ea-meetup-disconnect {
502
+ color: #a00;
503
+ display: inline-block;
504
+ margin-left: 1rem;
505
+
506
+ &:active,
507
+ &:hover {
508
+ color: #f00;
509
+ }
510
+ }
511
+
512
+ .tribe-ea-meetup-button {
513
+ border-radius: 3px;
514
+ color: #fff;
515
+ display: inline-block;
516
+ padding: .5rem 1.5rem;
517
+ text-decoration: none;
518
+ transition: background-color 0.5s ease;
519
+
520
+ &:active,
521
+ &:hover {
522
+ color: #fff;
523
+ cursor: pointer;
524
+ }
525
+ }
526
+
527
+ .tribe-ea-meetup-button {
528
+ background: #f41940;
529
+
530
+ &:active,
531
+ &:hover,
532
+ &:focus {
533
+ background: #f41940;
534
+ }
535
+ }
536
+
537
 
538
 
539
  /* = Event Aggregator Status
the-events-calendar.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Plugin Name: The Events Calendar
4
  * Description: The Events Calendar is a carefully crafted, extensible plugin that lets you easily share your events. Beautiful. Solid. Awesome.
5
- * Version: 4.9.5
6
  * Author: Modern Tribe, Inc.
7
  * Author URI: http://m.tri.be/1x
8
  * Text Domain: the-events-calendar
2
  /**
3
  * Plugin Name: The Events Calendar
4
  * Description: The Events Calendar is a carefully crafted, extensible plugin that lets you easily share your events. Beautiful. Solid. Awesome.
5
+ * Version: 4.9.6
6
  * Author: Modern Tribe, Inc.
7
  * Author URI: http://m.tri.be/1x
8
  * Text Domain: the-events-calendar
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit2ed272add03d71d5b8076bf3942482a8::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit1e14d36a81f25b127dfe9ca1d1950e7c::getLoader();
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit2ed272add03d71d5b8076bf3942482a8
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInit2ed272add03d71d5b8076bf3942482a8
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit2ed272add03d71d5b8076bf3942482a8', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit2ed272add03d71d5b8076bf3942482a8', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInit2ed272add03d71d5b8076bf3942482a8::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit1e14d36a81f25b127dfe9ca1d1950e7c
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit1e14d36a81f25b127dfe9ca1d1950e7c', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit1e14d36a81f25b127dfe9ca1d1950e7c', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
+ call_user_func(\Composer\Autoload\ComposerStaticInit1e14d36a81f25b127dfe9ca1d1950e7c::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit2ed272add03d71d5b8076bf3942482a8
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'T' =>
@@ -135,9 +135,9 @@ class ComposerStaticInit2ed272add03d71d5b8076bf3942482a8
135
  public static function getInitializer(ClassLoader $loader)
136
  {
137
  return \Closure::bind(function () use ($loader) {
138
- $loader->prefixLengthsPsr4 = ComposerStaticInit2ed272add03d71d5b8076bf3942482a8::$prefixLengthsPsr4;
139
- $loader->prefixDirsPsr4 = ComposerStaticInit2ed272add03d71d5b8076bf3942482a8::$prefixDirsPsr4;
140
- $loader->classMap = ComposerStaticInit2ed272add03d71d5b8076bf3942482a8::$classMap;
141
 
142
  }, null, ClassLoader::class);
143
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit1e14d36a81f25b127dfe9ca1d1950e7c
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'T' =>
135
  public static function getInitializer(ClassLoader $loader)
136
  {
137
  return \Closure::bind(function () use ($loader) {
138
+ $loader->prefixLengthsPsr4 = ComposerStaticInit1e14d36a81f25b127dfe9ca1d1950e7c::$prefixLengthsPsr4;
139
+ $loader->prefixDirsPsr4 = ComposerStaticInit1e14d36a81f25b127dfe9ca1d1950e7c::$prefixDirsPsr4;
140
+ $loader->classMap = ComposerStaticInit1e14d36a81f25b127dfe9ca1d1950e7c::$classMap;
141
 
142
  }, null, ClassLoader::class);
143
  }