Easy Digital Downloads - Version 2.11.4

Version Description

Download this release

Release Info

Developer cklosows
Plugin Icon 128x128 Easy Digital Downloads
Version 2.11.4
Comparing to
See all releases

Code changes from version 2.11.3.1 to 2.11.4

Files changed (80) hide show
  1. assets/css/edd-admin.css +645 -77
  2. assets/css/edd-admin.min.css +1 -1
  3. assets/css/extension-manager.css +143 -0
  4. assets/css/extension-manager.min.css +1 -0
  5. assets/js/admin-notifications.js +118 -0
  6. assets/js/admin-notifications.min.js +1 -0
  7. assets/js/admin-scripts.js +10 -79
  8. assets/js/admin-scripts.min.js +1 -1
  9. assets/js/alpine.min.js +5 -0
  10. assets/js/extension-manager.js +75 -0
  11. assets/js/extension-manager.min.js +1 -0
  12. easy-digital-downloads.php +83 -15
  13. includes/admin/admin-pages.php +5 -0
  14. includes/admin/class-edd-notices.php +3 -3
  15. includes/admin/class-pass-manager.php +117 -13
  16. includes/admin/dashboard-widgets.php +12 -2
  17. includes/admin/downloads/metabox.php +1 -103
  18. includes/admin/extensions/abstract-extension.php +344 -0
  19. includes/admin/extensions/class-extension-manager.php +485 -0
  20. includes/admin/extensions/class-extension-product-data.php +111 -0
  21. includes/admin/extensions/class-extensions-api.php +222 -0
  22. includes/admin/extensions/product-education/class-email-marketing.php +127 -0
  23. includes/admin/extensions/product-education/class-invoices.php +116 -0
  24. includes/admin/extensions/product-education/class-recurring.php +116 -0
  25. includes/admin/extensions/product-education/class-reviews.php +144 -0
  26. includes/admin/extensions/product-education/class-wpsmtp.php +232 -0
  27. includes/admin/installers/class-install-skin.php +29 -0
  28. includes/admin/installers/class-plugin-silent-upgrader-skin.php +57 -0
  29. includes/admin/installers/class-plugin-silent-upgrader.php +608 -0
  30. includes/admin/promos/class-promo-handler.php +49 -6
  31. includes/admin/promos/notices/abstract-notice.php +7 -2
  32. includes/admin/promos/notices/class-five-star-review-dashboard.php +189 -0
  33. includes/admin/promos/notices/class-five-star-review-settings.php +68 -0
  34. includes/admin/promos/notices/class-license-upgrade-notice.php +1 -4
  35. includes/admin/reporting/export/class-batch-export-customers.php +27 -18
  36. includes/admin/reporting/export/class-batch-export-earnings-report.php +10 -19
  37. includes/admin/settings/contextual-help.php +26 -15
  38. includes/admin/settings/display-settings.php +43 -6
  39. includes/admin/settings/register-settings.php +46 -142
  40. includes/admin/settings/settings-compatibility.php +164 -0
  41. includes/admin/upload-functions.php +1 -1
  42. includes/admin/views/notifications.php +106 -0
  43. includes/ajax-functions.php +7 -0
  44. includes/api/v3/Endpoint.php +26 -0
  45. includes/api/v3/Notifications.php +124 -0
  46. includes/class-edd-cli.php +3 -2
  47. includes/class-edd-license-handler.php +19 -6
  48. includes/database/NotificationsDB.php +258 -0
  49. includes/deprecated-functions.php +284 -0
  50. includes/download-functions.php +42 -25
  51. includes/emails/actions.php +10 -2
  52. includes/emails/class-edd-emails.php +2 -0
  53. includes/emails/functions.php +4 -97
  54. includes/extensions/ExtensionRegistry.php +74 -0
  55. includes/extensions/licensing-functions.php +97 -0
  56. includes/gateways/paypal-standard.php +1 -1
  57. includes/gateways/stripe/edd-stripe.php +4 -4
  58. includes/gateways/stripe/includes/admin/admin-actions.php +23 -0
  59. includes/gateways/stripe/includes/admin/admin-filters.php +33 -19
  60. includes/gateways/stripe/includes/admin/settings/stripe-connect.php +3 -11
  61. includes/gateways/stripe/includes/admin/upgrade-functions.php +24 -1
  62. includes/gateways/stripe/includes/class-edd-stripe.php +22 -10
  63. includes/gateways/stripe/includes/payment-methods/buy-now/functions.php +5 -3
  64. includes/gateways/stripe/includes/scripts.php +1 -1
  65. includes/gateways/stripe/vendor/composer/ClassLoader.php +4 -40
  66. includes/gateways/stripe/vendor/composer/LICENSE +0 -2
  67. includes/gateways/stripe/vendor/composer/autoload_classmap.php +0 -1
  68. includes/gateways/stripe/vendor/composer/autoload_real.php +2 -4
  69. includes/gateways/stripe/vendor/composer/autoload_static.php +0 -5
  70. includes/gateways/stripe/vendor/composer/installed.json +213 -219
  71. includes/gateways/stripe/vendor/composer/installed.php +2 -2
  72. includes/install.php +8 -0
  73. includes/misc-functions.php +39 -19
  74. includes/models/Notification.php +192 -0
  75. includes/process-download.php +1 -0
  76. includes/scripts.php +19 -0
  77. includes/utils/EnvironmentChecker.php +227 -0
  78. includes/utils/NotificationImporter.php +228 -0
  79. languages/easy-digital-downloads.pot +820 -592
  80. readme.txt +33 -9
assets/css/edd-admin.css CHANGED
@@ -10,6 +10,7 @@
10
  .edd-hidden {
11
  display: none;
12
  }
 
13
  .edd-clearfix:after {
14
  content: ".";
15
  display: block;
@@ -17,13 +18,16 @@
17
  text-indent: -9999px;
18
  visibility: hidden;
19
  }
 
20
  .edd-wrap a,
21
  .edd-notice .notice-dismiss {
22
  text-decoration: none;
23
  }
 
24
  a.edd-delete {
25
  color: #a00;
26
  }
 
27
  a.edd-delete:hover {
28
  color: #f00;
29
  }
@@ -47,11 +51,69 @@ body.post-type-download #screen-meta {
47
  background: #fff;
48
  }
49
 
 
 
 
 
 
 
50
  #edd-header img {
51
  display: block;
52
  margin: 0;
53
  max-width: 300px;
54
- margin-left: 20px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  }
56
 
57
  .edd-settings-sub-nav {
@@ -134,10 +196,13 @@ body.post-type-download #screen-meta {
134
  margin: 4px 0 0;
135
  }
136
 
137
- .download_page_edd-settings .form-table input.small-text ~ label,
138
- .download_page_edd-settings .form-table input[type="checkbox"] + label { display: inline; }
139
- .download_page_edd-settings .form-table tr > th > strong,
140
- .download_page_edd-settings .form-table tr > th > h3 {
 
 
 
141
  font-size: 1.2em;
142
  font-weight: 600;
143
  margin: 0 auto;
@@ -153,7 +218,7 @@ body.post-type-download #screen-meta {
153
  background: #333 !important;
154
  border-width: 1px !important;
155
  border-radius: 3px !important;
156
- box-shadow: 1px 1px 2px 1px rgba(214,214,214,0.5) !important;
157
  color: #dedede !important;
158
  max-width: 300px !important;
159
  padding: 7px !important;
@@ -163,9 +228,9 @@ body.post-type-download #screen-meta {
163
  }
164
 
165
  .download_page_edd-settings .edd-settings-payment-icon-wrapper {
166
- margin-right:10px;
167
- line-height:16px;
168
- height:16px;
169
  display: table;
170
  }
171
 
@@ -181,18 +246,23 @@ body.post-type-download #screen-meta {
181
  right: 0;
182
  position: absolute;
183
  }
 
184
  .edd-add-ons-footer {
185
  padding-top: 10px;
186
  }
 
187
  #edd-add-ons h2 {
188
  margin: 0 0 15px;
189
  }
 
190
  .edd-add-ons-view-wrapper {
191
  height: 50px;
192
  }
 
193
  #edd-add-ons h2 .button-primary {
194
  position: absolute;
195
  }
 
196
  #edd-add-ons .edd-extension {
197
  background: #fff;
198
  border: 1px solid #ccc;
@@ -203,30 +273,37 @@ body.post-type-download #screen-meta {
203
  width: 320px;
204
  height: 315px;
205
  }
 
206
  #edd-add-ons .edd-extension h3 {
207
  font-size: 13px;
208
  margin: 0 0 8px;
209
  }
 
210
  #edd-add-ons .edd-extension .button-secondary {
211
  position: absolute;
212
  bottom: 14px;
213
  left: 14px;
214
  }
 
215
  #edd-add-ons .edd-browse-all {
216
- clear:both;
217
- width:100%;
218
  }
 
219
  #edd-add-ons .edd-extension .third-party {
220
  display: none;
221
  }
 
222
  #edd-add-ons .edd-starter-package {
223
  background-color: #85c0e5;
224
  border-color: #62a9d7;
225
  color: #fff;
226
  }
 
227
  #edd-add-ons .edd-starter-package h3 {
228
  color: #fff;
229
  }
 
230
  #edd-add-ons .edd-extension .wp-post-image {
231
  width: 100%;
232
  height: auto;
@@ -240,6 +317,7 @@ body.post-type-download #screen-meta {
240
  height: 100px;
241
  min-width: 200px;
242
  }
 
243
  #edd-add-discount input[type="text"],
244
  #edd-edit-discount input[type="text"] {
245
  width: 300px;
@@ -259,8 +337,8 @@ body.post-type-download #screen-meta {
259
  clear: both;
260
  background-image: -webkit-gradient(linear, left bottom, left top, from(#f5f5f5), to(#fafafa));
261
  background-image: -webkit-linear-gradient(bottom, #f5f5f5, #fafafa);
262
- background-image: -moz-linear-gradient(bottom, #f5f5f5, #fafafa);
263
- background-image: -o-linear-gradient(bottom, #f5f5f5, #fafafa);
264
  background-image: linear-gradient(to top, #f5f5f5, #fafafa);
265
  border-color: #dfdfdf;
266
  border-width: 1px;
@@ -272,45 +350,56 @@ body.post-type-download #screen-meta {
272
  padding: 12px;
273
  margin: 8px 0;
274
  }
 
275
  #edd-payments-filter ul.subsubsub {
276
  margin-bottom: 8px;
277
  }
 
278
  #edd-payment-filters p {
279
  color: #777;
280
  }
 
281
  #edd-payment-date-filters input {
282
  vertical-align: middle;
283
  }
 
284
  tr.status-refunded td {
285
  background: #cecece;
286
  border-top-color: #ccc;
287
  }
 
288
  .wp-list-table.downloads th#ID {
289
  width: 80px;
290
  }
 
291
  .wp-list-table.downloads th#details {
292
  width: 130px;
293
  }
 
294
  .wp-list-table.downloads th#date {
295
  width: 140px;
296
  }
 
297
  .wp-list-table.downloads th#user {
298
  width: 130px;
299
  }
 
300
  .edd-mobile-link {
301
  line-height: 32px;
302
  vertical-align: middle;
303
  }
 
304
  .edd-mobile-link img {
305
  max-width: 80%;
306
  height: auto;
307
  float: left;
308
  }
309
 
310
- @media handheld, only screen and (max-width: 640px) {
 
311
 
312
  .wp-list-table.downloads th {
313
- width: auto!important;
314
  }
315
 
316
  }
@@ -319,6 +408,7 @@ tr.status-refunded td {
319
  margin-left: -8px;
320
  margin-top: -8px;
321
  }
 
322
  #edd-download-link-textarea {
323
  width: 100%;
324
  }
@@ -330,51 +420,64 @@ tr.status-refunded td {
330
  width: 225px;
331
  float: left;
332
  }
 
333
  .edd_files_url_label {
334
  width: 220px;
335
  float: left;
336
  }
 
337
  #postbox-container-1 .edd_files_name_label {
338
  width: 80px;
339
  }
 
340
  #postbox-container-1 .edd_files_url_label {
341
  width: 80px;
342
  }
 
343
  .edd-add-repeatable-row {
344
  margin: 10px 0;
345
  }
 
346
  .edd-add-repeatable-row .submit {
347
  padding: 0 !important;
348
  }
 
349
  .edd_variable_prices_wrapper:not(:first-child),
350
  .edd_repeatable_upload_wrapper:not(:first-child) {
351
  margin-top: 12px;
352
  }
 
353
  .edd-repeatable-row-actions {
354
  color: #777;
355
  font-size: 12px;
356
  }
 
357
  .edd-repeatable-row-actions a {
358
  text-decoration: none;
359
  width: auto;
360
  cursor: pointer;
361
  vertical-align: middle;
362
  }
 
363
  .edd-repeatable-row-actions .toggle-custom-price-option-section {
364
  color: #777;
365
  }
 
366
  .edd-repeatable-row-actions .toggle-custom-price-option-section:hover {
367
  color: #444;
368
  }
 
369
  .edd-repeatable-row-header,
370
  .edd-bundle-products-header {
371
  clear: both;
372
  background: #f1f1f1;
373
  border: 1px solid #e5e5e5;
374
  }
 
375
  .edd-repeatable-row-header {
376
  cursor: move;
377
  }
 
378
  .edd-repeatable-row-header:before,
379
  .edd-repeatable-row-header:after,
380
  .edd-bundled-product-row:before,
@@ -382,14 +485,17 @@ tr.status-refunded td {
382
  content: '';
383
  display: table;
384
  }
 
385
  .edd-repeatable-row-header:after,
386
  .edd-bundled-product-row:after {
387
  clear: both;
388
  }
 
389
  .edd-repeatable-row-title {
390
  float: left;
391
  font-weight: 600;
392
  }
 
393
  .edd-bundled-product-item-reorder .edd-product-file-reorder {
394
  color: #e5e5e5;
395
  font-family: "dashicons";
@@ -400,25 +506,30 @@ tr.status-refunded td {
400
  vertical-align: top;
401
  transition: .2s color;
402
  }
 
403
  .edd-bundled-product-item-reorder .edd-product-file-reorder:hover {
404
  color: #bbb;
405
  }
 
406
  .edd-repeatable-row-title,
407
  .edd-repeatable-row-actions {
408
  padding: 8px;
409
  box-sizing: border-box;
410
  }
 
411
  .edd-repeatable-row-actions {
412
  float: right;
413
  text-align: right;
414
  padding: 8px;
415
  }
 
416
  .edd-repeatable-row-actions .edd-remove-row,
417
  .edd-bundled-product-row .edd-remove-row {
418
  font-size: 12px;
419
  width: auto;
420
  cursor: pointer;
421
  }
 
422
  .edd-repeatable-row-standard-fields,
423
  .edd-bundled-product-row {
424
  background: #f9f9f9;
@@ -427,14 +538,17 @@ tr.status-refunded td {
427
  border-style: solid;
428
  border-color: #e5e5e5;
429
  }
 
430
  .edd-repeatable-row-setting-label {
431
  display: block;
432
  margin-bottom: 4px;
433
  }
 
434
  .edd-repeatable-row-setting-label .edd-help-tip {
435
  display: inline-block;
436
  margin-left: 4px;
437
  }
 
438
  .edd-option-name,
439
  .edd-option-price,
440
  .edd_repeatable_default,
@@ -448,34 +562,43 @@ tr.status-refunded td {
448
  display: inline-block;
449
  vertical-align: top;
450
  }
 
451
  .edd-option-name {
452
  width: 38%;
453
  margin-right: 5%;
454
  }
 
455
  .edd-option-price {
456
  min-width: 100px;
457
  }
 
458
  .edd_repeatable_default {
459
  text-align: center;
460
  min-width: 80px;
461
  }
 
462
  .edd-file-name {
463
  width: 18%;
464
  margin-right: 3%;
465
  }
 
466
  .edd-file-url {
467
  width: 65%;
468
  }
 
469
  .edd-repeatable-row-standard-fields.has-variable-pricing .edd-file-url {
470
  width: 38%;
471
  margin-right: 5%;
472
  }
 
473
  .edd-file-assignment {
474
  width: 27%;
475
  }
 
476
  .edd-file-assignment .edd-repeatable-row-setting-label {
477
  margin-bottom: 0;
478
  }
 
479
  .edd-custom-price-option-sections-wrap {
480
  display: none;
481
  border-width: 0 1px 1px;
@@ -484,64 +607,80 @@ tr.status-refunded td {
484
  box-sizing: border-box;
485
  width: 100%;
486
  }
 
487
  .edd-custom-price-option-section {
488
  display: block;
489
  padding: 10px 8px;
490
- border-bottom: 1px solid rgba( 222, 222, 222, 0.3 );
491
  }
 
492
  .edd-custom-price-option-section:last-child {
493
  border-bottom: none;
494
  }
495
- label.edd_prices_shipping { /* remove once Simple Shipping markup is improved */
 
 
496
  display: none !important;
497
  }
 
498
  .edd-custom-price-option-section-title {
499
  display: block;
500
  font-size: 14px;
501
  font-weight: 600;
502
  padding: 0 0 10px;
503
  }
504
- .edd-custom-price-option-section > *:not(.edd-custom-price-option-section-title) {
 
505
  display: inline-block;
506
  padding-right: 20px;
507
  vertical-align: top;
508
  margin-bottom: 4px;
509
  }
510
- .edd-custom-price-option-section > *:not(.edd-custom-price-option-section-title) label {
 
511
  display: block;
512
  margin-bottom: 2px;
513
  }
 
514
  .edd-bundle-products-header {
515
  font-weight: 600;
516
  padding: 8px;
517
  }
 
518
  .edd-bundled-product-row .edd-bundled-product-item-reorder {
519
  min-width: 30px;
520
  margin-right: 8px;
521
  }
 
522
  .edd-bundled-product-row .edd-bundled-product-item-reorder .edd-product-file-reorder {
523
  font-size: 20px;
524
  font-weight: 300;
525
  padding: 16px 4px 0;
526
  cursor: move;
527
  }
 
528
  .edd-bundled-product-row .edd-bundled-product-item {
529
  width: 60%;
530
  margin-right: 3%;
531
  }
 
532
  .edd-bundled-product-row.has-variable-pricing .edd-bundled-product-item {
533
  width: 47%;
534
  }
 
535
  .edd-bundled-product-row .edd-bundled-product-price-assignment {
536
  width: 23%;
537
  margin-right: 3%;
538
  }
 
539
  .edd-bundled-product-row .edd-bundled-product-actions {
540
  float: right;
541
  }
 
542
  .edd_repeatable_upload_wrapper .edd_repeatable_upload_field_container {
543
  position: relative;
544
  }
 
545
  .edd_upload_file {
546
  background: #fff;
547
  display: block;
@@ -550,41 +689,51 @@ label.edd_prices_shipping { /* remove once Simple Shipping markup is improved */
550
  top: 3px;
551
  right: 7px;
552
  }
 
553
  .edd_upload_field {
554
  padding-right: 8em !important;
555
  }
 
556
  textarea#edd-payment-note {
557
  width: 100%;
558
  height: 4em;
559
  margin: 0;
560
  }
 
561
  #edd-purchased-files .row .edd-purchased-files-list-wrapper .download {
562
  line-height: 1.4;
563
  }
 
564
  #edd-purchased-files .edd-purchased-files-list-wrapper .edd-purchased-option {
565
  color: #666;
566
  }
 
567
  input[class*="edd-price-field"] {
568
  padding: 3px 5px;
569
  width: 75px;
570
  }
 
571
  [class*="item_"] [class*="edd-payment-details-download-"][type="number"].small-text,
572
  #edd-order-download-quantity[type="number"].small-text,
573
  #edd-order-download-tax[type="text"].small-text {
574
  height: 25px;
575
  }
 
576
  .item_price .edd-payment-details-download-quantity[type="number"].small-text,
577
  #edd-order-download-quantity[type="number"].small-text {
578
  width: 55px;
579
  }
 
580
  .item_tax .edd-payment-details-download-item-tax[type="number"].small-text,
581
  #edd-order-download-tax[type="text"].small-text {
582
  width: 75px;
583
  }
 
584
  .edd_repeatable_upload_wrapper .pricing select,
585
  .edd_repeatable_product_wrapper .edd-select {
586
  min-width: 100%;
587
  }
 
588
  #edd_product_notes_field {
589
  display: block;
590
  margin: 12px 0 0;
@@ -604,9 +753,10 @@ input[class*="edd-price-field"] {
604
  width: 10px;
605
  height: 10px;
606
  }
 
607
  .edd_remove_repeatable:active,
608
  .edd_remove_repeatable:hover,
609
- .edd_remove_repeatable:focus {
610
  background-position: -10px 0 !important;
611
  }
612
 
@@ -616,35 +766,45 @@ input[class*="edd-price-field"] {
616
  #edd-edit-order-form .column {
617
  width: 32%;
618
  }
 
619
  .edd-edit-purchase-element[class*="columns-"] ul li {
620
  padding-right: 1%;
621
  }
 
622
  #edd-edit-order-form .columns-4 .column:nth-child(2n+1),
623
  #edd-edit-order-form .columns-5 .column:nth-child(3n+1),
624
  #edd-edit-order-form .column:nth-child(2n+1) {
625
  margin-right: 0;
626
  }
 
627
  #edd-edit-order-form input.large-text {
628
  width: 90%;
629
  }
 
630
  .edd-edit-purchase-element ul li.download {
631
  width: 35%;
632
  }
 
633
  .edd-edit-purchase-element ul li.item_price {
634
  width: 15%;
635
  }
 
636
  .edd-edit-purchase-element ul li.item_price.item_quantity {
637
  width: 25%;
638
  }
 
639
  .edd-edit-purchase-element ul li.item_tax {
640
  width: 15%;
641
  }
 
642
  .edd-edit-purchase-element ul li.price {
643
  width: 20%;
644
  }
 
645
  .edd-admin-box .label {
646
  font-weight: 600;
647
  }
 
648
  .edd-admin-box-inside {
649
  border-bottom: 1px solid #eee;
650
  clear: both;
@@ -652,57 +812,73 @@ input[class*="edd-price-field"] {
652
  margin: 0;
653
  word-break: break-word;
654
  }
 
655
  .rtl .edd-admin-box-inside {
656
  padding: 5px 10px 5px 0;
657
  }
 
658
  .edd-admin-box-inside .strong {
659
  font-weight: 600;
660
  }
 
661
  .edd-payment-fees .fee-label {
662
  color: #666;
663
  font-weight: normal;
664
  }
 
665
  .edd-admin-box .right {
666
  float: right;
667
  }
 
668
  .rtl .edd-admin-box .right {
669
  float: left;
670
  margin-left: 10px;
671
  }
 
672
  #edd-order-update .inside,
673
  #edd-order-details .inside {
674
  margin: 0;
675
  padding: 0;
676
  }
 
677
  #edd-order-update input.edd_datepicker {
678
  width: 180px;
679
  }
 
680
  #edd-order-update input[type="number"].edd-payment-time-hour,
681
  #edd-order-update input[type="number"].edd-payment-time-min {
682
  width: 50px;
683
  }
 
684
  #edd-order-update .edd-tax-rate {
685
  color: #9c9c9c;
686
  font-style: italic;
687
  }
 
688
  #edd-order-resend-receipt .inside {
689
  margin-top: 11px;
690
  }
 
691
  #edd-order-resend-receipt .edd-order-resend-receipt-addresses {
692
  margin-top: 10px;
693
  }
 
694
  .edd-admin-box-inside:last-child {
695
  border-bottom: 0;
696
  }
 
697
  #edd-edit-order-form .data-payment-key {
698
  word-break: break-all;
699
  }
 
700
  .edd-order-update-box #major-publishing-actions .button-secondary {
701
  margin-right: 10px;
702
  }
 
703
  .edd-edit-purchase-element .edd-select-chosen {
704
  width: 196px;
705
  }
 
706
  .edd-edit-purchase-element ul,
707
  #edd-order-address-country-wrap select,
708
  #edd-customer-details .order-data-address input,
@@ -711,29 +887,37 @@ input[class*="edd-price-field"] {
711
  clear: both;
712
  display: block;
713
  }
 
714
  #edd-customer-details .customer-info .column {
715
  width: 49%;
716
  }
 
717
  #edd-customer-details .actions {
718
  float: right;
719
  }
 
720
  .edd-order-data input.small-text {
721
  margin: 0;
722
  }
 
723
  .edd-order-data input.med-text {
724
  margin: 0;
725
  width: 100px;
726
  }
 
727
  #edd-order-update span.label {
728
  display: inline;
729
  width: 50px;
730
  }
 
731
  .edd-order-update-box .button-primary {
732
  margin-right: 0;
733
  }
 
734
  #edd-edit-order-form .column .description {
735
  padding-right: 10px;
736
  }
 
737
  #edd-edit-order-form .column,
738
  .edd-edit-purchase-element ul li {
739
  display: inline-block;
@@ -742,104 +926,132 @@ input[class*="edd-price-field"] {
742
  margin: 0;
743
  vertical-align: middle;
744
  }
 
745
  .edd-edit-purchase-element .row {
746
  padding: 12px;
747
  }
 
748
  .edd-edit-purchase-element .row:not(:last-child) {
749
  border-bottom: 1px solid #eee;
750
  }
 
751
  .edd-edit-purchase-element .row:nth-child(odd):not(.header) {
752
  background-color: #f9f9f9;
753
  }
 
754
  .edd-edit-purchase-element .row.header {
755
  padding: 6px 12px;
756
  font-weight: 600;
757
  vertical-align: top;
758
  }
 
759
  .edd-edit-purchase-element ul {
760
  font-size: 0;
761
  }
 
762
  .edd-edit-purchase-element ul li {
763
  font-size: 13px;
764
  }
 
765
  #edd-order-data .data span {
766
  color: #666;
767
  font-weight: 600;
768
  }
 
769
  .edd-edit-purchase-element .inside {
770
  padding: 12px;
771
  }
 
772
  .edd-edit-purchase-element .edd-purchased-download-title {
773
  font-size: 14px;
774
  font-weight: 500;
775
  }
 
776
  .edd-edit-purchase-element .edd-purchased-download-title .deleted {
777
  color: #777;
778
  }
 
779
  .edd-edit-purchase-element .edd-purchased-download-actions {
780
  color: #777;
781
  line-height: 1.4;
782
  }
 
783
  .edd-edit-purchase-element .edd-purchased-download-actions .edd-purchased-download-actions-label {
784
  font-weight: 500;
785
  }
 
786
  .edd-edit-purchase-element .edd-purchased-download-actions a {
787
  color: #777;
788
  font-size: 12px;
789
  }
 
790
  .edd-edit-purchase-element .edd-purchased-download-actions a:hover {
791
  color: #444;
792
  }
 
793
  .edd-edit-purchase-element .edd-purchased-download-actions .edd-order-remove-download {
794
  color: #a00;
795
  }
 
796
  .edd-edit-purchase-element .edd-purchased-download-actions .edd-order-remove-download:hover {
797
  color: #f00;
798
  }
 
799
  #edd-order-recalc-total {
800
  float: right;
801
  }
 
802
  .edd_repeatable_upload_wrapper .pricing select,
803
  .edd_repeatable_product_wrapper .edd-select,
804
  #edd_products .edd-select {
805
  min-width: 100%;
806
  max-width: 200px;
807
  }
 
808
  .edd_repeatable_product_wrapper td {
809
  overflow: visible;
810
  }
 
811
  .edd-payment-details-label-mobile {
812
  display: none;
813
  }
814
 
815
- @media screen and ( max-width: 1284px ) {
816
 
817
  .edd-edit-purchase-element ul li.download {
818
  padding-bottom: 15px;
819
  width: 100%;
820
  }
 
821
  .edd-edit-purchase-element .edd-purchased-download-title {
822
  font-size: 16px;
823
  }
 
824
  .edd-edit-purchase-element ul li.item_price {
825
  width: 22%;
826
  }
 
827
  .edd-edit-purchase-element ul li.item_price.item_quantity {
828
  width: 35%;
829
  }
 
830
  .edd-edit-purchase-element ul li.item_tax {
831
  width: 25%;
832
  }
 
833
  .edd-edit-purchase-element ul li.price {
834
  width: 20%;
835
  }
 
836
  .edd-edit-purchase-element .edd-purchased-download-actions {
837
  padding-top: 10px;
838
  }
 
839
  .edd-purchased-files-header,
840
  .edd-add-download-to-purchase-header {
841
  display: none;
842
  }
 
843
  .edd-payment-details-label-mobile {
844
  display: block;
845
  font-weight: 500;
@@ -848,17 +1060,20 @@ input[class*="edd-price-field"] {
848
 
849
  }
850
 
851
- @media screen and ( max-width: 1024px ) {
852
 
853
  .edd-edit-purchase-element ul li.item_price.item_quantity {
854
  width: 40%;
855
  }
 
856
  .edd-edit-purchase-element ul li.price {
857
  width: 24%;
858
  }
 
859
  .edd-edit-purchase-element .edd-purchased-download-actions {
860
  padding-top: 15px;
861
  }
 
862
  .edd-edit-purchase-element .edd-purchased-download-actions,
863
  .edd-edit-purchase-element .edd-purchased-download-actions a {
864
  font-size: 14px;
@@ -866,38 +1081,44 @@ input[class*="edd-price-field"] {
866
 
867
  }
868
 
869
- @media screen and ( max-width: 782px ) {
870
 
871
  #edd-edit-order-form .column {
872
  width: 49%;
873
  }
 
874
  .edd-edit-purchase-element ul li.item_price,
875
  .edd-edit-purchase-element ul li.item_price.item_quantity {
876
  padding-bottom: 10px;
877
  }
 
878
  .edd-edit-purchase-element ul li.item_price.item_quantity {
879
  width: 35%;
880
  }
 
881
  .edd-edit-purchase-element ul li.item_tax,
882
  .edd-edit-purchase-element ul li.price {
883
  width: 20%;
884
  padding-bottom: 10px;
885
  }
 
886
  .edd-payment-details-label-mobile {
887
  font-size: 14px;
888
  font-weight: 500;
889
  }
 
890
  .edd-price-currency,
891
  .edd-payment-details-download-amount {
892
  font-size: 16px;
893
  }
 
894
  .order-data-column input[type="email"] {
895
  padding: 6px 10px;
896
  }
897
 
898
  }
899
 
900
- @media screen and ( max-width: 600px ) {
901
 
902
  .edd-edit-purchase-element ul li.item_price,
903
  .edd-edit-purchase-element ul li.item_price.item_quantity,
@@ -905,14 +1126,17 @@ input[class*="edd-price-field"] {
905
  width: 100%;
906
  padding-bottom: 20px;
907
  }
 
908
  .edd-edit-purchase-element ul li.price,
909
  .edd-edit-purchase-element .edd-add-download-to-purchase ul li.item_tax {
910
  width: 100%;
911
  padding-bottom: 0;
912
  }
 
913
  .edd-edit-purchase-element .edd-add-download-to-purchase-actions {
914
  padding-top: 15px;
915
  }
 
916
  #edd-edit-order-form .column {
917
  width: 100%;
918
  }
@@ -922,12 +1146,14 @@ input[class*="edd-price-field"] {
922
  /** Stats */
923
  #edd_product_stats .label {
924
  display: inline-block;
925
- }
 
926
  #edd_product_stats hr {
927
  border-style: solid;
928
  border-width: 1px;
929
  border-color: #ccc #fff #fff #ccc;
930
  }
 
931
  #edd_product_stats .product-sales-stats:before,
932
  #edd_product_stats .product-earnings-stats:before {
933
  color: #82878c;
@@ -943,9 +1169,11 @@ input[class*="edd-price-field"] {
943
  -webkit-font-smoothing: antialiased;
944
  -moz-osx-font-smoothing: grayscale;
945
  }
 
946
  #edd_product_stats .product-sales-stats:before {
947
  content: '\f174';
948
  }
 
949
  #edd_product_stats .product-earnings-stats:before {
950
  content: '\f239';
951
  }
@@ -953,41 +1181,49 @@ input[class*="edd-price-field"] {
953
  /* Dashboard Widget Styles
954
  -------------------------------------------------------------- */
955
 
956
- .edd_dashboard_widget table thead td{
957
  border-bottom: 1px solid #ececec;
958
  color: #777;
959
  }
 
960
  .edd_dashboard_widget .table_left {
961
  float: left;
962
  width: 45%;
963
  }
 
964
  .edd_dashboard_widget .table_right {
965
  float: right;
966
  width: 45%;
967
  }
 
968
  .edd_dashboard_widget .inside {
969
  font-size: 12px;
970
  }
 
971
  .edd_dashboard_widget td {
972
  padding: 3px 0;
973
  }
 
974
  .edd_dashboard_widget .b,
975
  .edd_dashboard_widget .t {
976
  line-height: 1.5;
977
  vertical-align: middle;
978
  }
 
979
  .edd_dashboard_widget .b {
980
  font-size: 14px;
981
- font-family: Georgia,"Times New Roman","Bitstream Charter",Times,serif;
982
  padding-right: 6px;
983
  width: auto;
984
  }
 
985
  .edd_dashboard_widget .t {
986
  font-size: 12px;
987
  padding-right: 12px;
988
  color: #777;
989
  width: 100%;
990
  }
 
991
  .edd_dashboard_widget .label_heading {
992
  border-top: 1px solid #ececec;
993
  color: #8f8f8f;
@@ -998,6 +1234,7 @@ input[class*="edd-price-field"] {
998
  padding-top: 10px;
999
  margin: 0 0 8px 12px;
1000
  }
 
1001
  .edd_dashboard_widget .edd_dashboard_widget_subheading {
1002
  border-top: 1px solid #ececec;
1003
  color: #8f8f8f;
@@ -1005,9 +1242,11 @@ input[class*="edd-price-field"] {
1005
  padding-top: 10px;
1006
  margin: 1em 0 0 0;
1007
  }
1008
- .edd_dashboard_widget .edd_dashboard_widget_subheading + .table {
 
1009
  margin: 8px 0 0 0;
1010
  }
 
1011
  .edd_dashboard_widget .edd_price_label {
1012
  background: rgb(0, 118, 156);
1013
  border-radius: 3px;
@@ -1016,19 +1255,23 @@ input[class*="edd-price-field"] {
1016
  padding: 2px 4px;
1017
  margin-right: 2px;
1018
  }
 
1019
  .edd_dashboard_widget table {
1020
  width: 100%;
1021
  margin-left: 0;
1022
  margin-bottom: 1em;
1023
  }
 
1024
  td.edd_order_label {
1025
  width: 80%;
1026
  }
 
1027
  td.edd_order_price {
1028
  text-align: right;
1029
  }
1030
 
1031
- @media handheld, only screen and (max-width: 1000px) {
 
1032
 
1033
  .edd_dashboard_widget .edd-recent-email {
1034
  display: none;
@@ -1042,19 +1285,23 @@ td.edd_order_price {
1042
  #edd-dashboard-widgets-wrap .postbox h3 {
1043
  cursor: default;
1044
  }
 
1045
  #edd-graphs-date-options,
1046
  #edd-date-range-options {
1047
  float: left;
1048
  }
 
1049
  #edd-date-range-options span {
1050
  float: left;
1051
  line-height: 24px;
1052
  height: 24px;
1053
  margin-right: 6px;
1054
  }
 
1055
  .edd-import-export-form {
1056
  position: relative;
1057
  }
 
1058
  .edd-import-export-form .edd-progress {
1059
  background: #ddd;
1060
  position: absolute;
@@ -1062,11 +1309,13 @@ td.edd_order_price {
1062
  width: 95%;
1063
  height: 15px;
1064
  }
 
1065
  .edd-import-export-form .edd-progress div {
1066
  background: #ccc;
1067
  height: 100%;
1068
  width: 0;
1069
  }
 
1070
  .edd-import-export-form .notice-wrap {
1071
  background-color: #f4f4f4;
1072
  border-style: solid;
@@ -1078,63 +1327,80 @@ td.edd_order_price {
1078
  position: relative;
1079
  width: 100%;
1080
  }
 
1081
  .edd-import-export-form .notice-wrap .spinner {
1082
  margin: 4px 10px 8px;
1083
  float: right;
1084
  }
 
1085
  .admin-color-fresh .edd-import-export-form .edd-progress div {
1086
  background: #0073aa;
1087
  }
 
1088
  .admin-color-light .edd-import-export-form .edd-progress div {
1089
  background: #888;
1090
  }
 
1091
  .admin-color-blue .edd-import-export-form .edd-progress div {
1092
  background: #096484;
1093
  }
 
1094
  .admin-color-coffee .edd-import-export-form .edd-progress div {
1095
  background: #c7a589;
1096
  }
 
1097
  .admin-color-ectoplasm .edd-import-export-form .edd-progress div {
1098
  background: #a3b745;
1099
  }
 
1100
  .admin-color-midnight .edd-import-export-form .edd-progress div {
1101
  background: #e14d43;
1102
  }
 
1103
  .admin-color-sunrise .edd-import-export-form .edd-progress div {
1104
  background: #dd823b;
1105
  }
 
1106
  #edd-graphs-filter label {
1107
  vertical-align: inherit;
1108
  }
 
1109
  #edd-graphs-filter .graph-option-section {
1110
  float: left;
1111
  line-height: 2.5em;
1112
  padding-right: 5px;
1113
  }
 
1114
  .edd-mix-totals {
1115
  background-color: #fff;
1116
  border: 1px solid #e5e5e5;
1117
- box-shadow: 0 1px 1px rgba(0,0,0,0.04);
1118
  padding: 10px;
1119
  }
 
1120
  .edd-mix-chart {
1121
  display: inline-block;
1122
  width: 49%;
1123
  vertical-align: top;
1124
  }
 
1125
  .edd-graph-notes {
1126
  color: #9c9c9c;
1127
  }
 
1128
  .edd-graph-notes span {
1129
  display: block;
1130
  }
 
1131
  .edd-pie-graph .legend {
1132
  display: none;
1133
  }
 
1134
  .edd-pie-legend {
1135
  overflow: auto;
1136
  margin-top: 10px;
1137
  }
 
1138
  .edd-legend-item-wrapper {
1139
  color: #333;
1140
  display: inline-block;
@@ -1143,6 +1409,7 @@ td.edd_order_price {
1143
  width: 48%;
1144
  height: 20px;
1145
  }
 
1146
  .edd-legend-color {
1147
  border: 1px solid #cfcfcf;
1148
  display: inline-block;
@@ -1150,6 +1417,7 @@ td.edd_order_price {
1150
  width: 20px;
1151
  height: 15px;
1152
  }
 
1153
  .edd-pie-legend-item {
1154
  display: inline-block;
1155
  vertical-align: top;
@@ -1161,21 +1429,18 @@ td.edd_order_price {
1161
 
1162
  /* Settings page styles
1163
  -------------------------------------------------------------- */
1164
-
1165
- [id*="edd-sendwp-"].button,
1166
  [id*="edd-recapture-"].button {
1167
  font-size: 16px;
1168
  height: auto;
1169
  padding: 8px 14px;
1170
  margin: 6px 0 0;
1171
  }
1172
- [id*="edd-sendwp-"].button .dashicons,
1173
  [id*="edd-recapture-"].button .dashicons {
1174
  line-height: 29px;
1175
  margin-right: 8px;
1176
  }
1177
- [id*="edd-sendwp-"].button .edd-loading,
1178
- [id*="edd-sendwp-"].button .edd-loading:after,
1179
  [id*="edd-recapture-"].button .edd-loading,
1180
  [id*="edd-recapture-"].button .edd-loading:after {
1181
  border-radius: 50%;
@@ -1183,14 +1448,14 @@ td.edd_order_price {
1183
  width: 14px;
1184
  height: 14px;
1185
  }
1186
- [id*="edd-sendwp-"].button .edd-loading,
1187
  [id*="edd-recapture-"].button .edd-loading {
1188
  position: relative;
1189
  top: 3px;
1190
  margin-left: 4px;
1191
- box-shadow: 0 0 2px rgba(0,0,0,.2);
1192
  }
1193
- [id*="edd-sendwp-"].button .edd-loading,
1194
  [id*="edd-recapture-"].button .edd-loading {
1195
  -webkit-animation: edd-spinning 1.1s infinite linear;
1196
  animation: edd-spinning 1.1s infinite linear;
@@ -1203,7 +1468,7 @@ td.edd_order_price {
1203
  -ms-transform: translateZ(0);
1204
  transform: translateZ(0);
1205
  }
1206
- #edd-sendwp-disconnect.button .edd-loading.dark,
1207
  #edd-recapture-disconnect.button .edd-loading.dark {
1208
  border-top-color: rgba(0, 0, 0, 0.2);
1209
  border-right-color: rgba(0, 0, 0, 0.2);
@@ -1211,46 +1476,57 @@ td.edd_order_price {
1211
  border-left-color: #666;
1212
  box-shadow: none;
1213
  }
 
1214
  .recapture-notice {
1215
  position: relative;
1216
  }
 
1217
  @-webkit-keyframes edd-spinning {
1218
  0% {
1219
  -webkit-transform: rotate(0deg);
1220
  transform: rotate(0deg);
1221
  }
 
1222
  100% {
1223
  -webkit-transform: rotate(360deg);
1224
  transform: rotate(360deg);
1225
  }
1226
  }
 
1227
  @keyframes edd-spinning {
1228
  0% {
1229
  -webkit-transform: rotate(0deg);
1230
  transform: rotate(0deg);
1231
  }
 
1232
  100% {
1233
  -webkit-transform: rotate(360deg);
1234
  transform: rotate(360deg);
1235
  }
1236
  }
 
1237
  #edd_tax_rates {
1238
  margin: 1em 0 0;
1239
  }
 
1240
  #edd_tax_rates .edd_tax_country *,
1241
  #edd_tax_rates .edd_tax_state * {
1242
  max-width: 100%;
1243
  }
 
1244
  #edd_tax_rates .edd_tax_country,
1245
  #edd_tax_rates .edd_tax_state {
1246
  width: 180px;
1247
  }
 
1248
  #edd_tax_rates .edd_tax_rate {
1249
  width: 80px;
1250
  }
 
1251
  #edd_tax_rates th {
1252
  padding: 15px 10px;
1253
  }
 
1254
  .wrap-licenses .form-table,
1255
  .wrap-licenses thead,
1256
  .wrap-licenses tbody,
@@ -1261,6 +1537,7 @@ td.edd_order_price {
1261
  .wrap-licenses caption {
1262
  display: block;
1263
  }
 
1264
  .wrap-licenses .form-table tr {
1265
  float: left;
1266
  margin: 0 15px 15px 0;
@@ -1273,6 +1550,7 @@ td.edd_order_price {
1273
  position: relative;
1274
  box-sizing: border-box;
1275
  }
 
1276
  .wrap-licenses .form-table th {
1277
  background: #f9f9f9;
1278
  padding: 14px;
@@ -1280,13 +1558,16 @@ td.edd_order_price {
1280
  margin: -14px -14px 20px;
1281
  width: 100%;
1282
  }
 
1283
  .wrap-licenses .form-table td {
1284
  padding: 0;
1285
  }
 
1286
  .wrap-licenses td input.regular-text {
1287
  margin: 0 0 8px;
1288
  width: 100%;
1289
  }
 
1290
  .wrap-licenses .edd-license-data[class*="edd-license-"] {
1291
  position: absolute;
1292
  background: #fafafa;
@@ -1298,22 +1579,27 @@ td.edd_order_price {
1298
  bottom: 14px;
1299
  box-sizing: border-box;
1300
  }
 
1301
  .wrap-licenses .edd-license-data[class*="edd-license-"] a {
1302
  color: #444;
1303
  }
 
1304
  .wrap-licenses .edd-license-data[class*="edd-license-"] a:hover {
1305
  text-decoration: none;
1306
  }
 
1307
  .wrap-licenses .edd-license-data.license-expires-soon-notice {
1308
  background-color: #00a0d2;
1309
  color: #fff;
1310
  border-color: #00a0d2;
1311
  }
 
1312
  .wrap-licenses .edd-license-data.edd-license-expired {
1313
  background-color: #e24e4e;
1314
  color: #fff;
1315
  border-color: #e24e4e;
1316
  }
 
1317
  .wrap-licenses .edd-license-data.edd-license-error,
1318
  .wrap-licenses .edd-license-data.edd-license-missing,
1319
  .wrap-licenses .edd-license-data.edd-license-invalid,
@@ -1322,18 +1608,22 @@ td.edd_order_price {
1322
  background-color: #ffebcd;
1323
  border-color: #ffebcd;
1324
  }
 
1325
  .wrap-licenses .edd-license-data p {
1326
  font-size: 13px;
1327
  margin-top: 0;
1328
  }
 
1329
  .wrap-licenses .edd-license-data.license-expires-soon-notice a,
1330
  .wrap-licenses .edd-license-data.edd-license-expired a {
1331
  color: #fff;
1332
  }
 
1333
  .wrap-licenses .edd-license-data.license-expires-soon-notice a:hover,
1334
  .wrap-licenses .edd-license-data.edd-license-expired a:hover {
1335
  text-decoration: none;
1336
  }
 
1337
  .wrap-licenses p.submit {
1338
  clear: both;
1339
  }
@@ -1364,10 +1654,11 @@ td.edd_order_price {
1364
  -------------------------------------------------------------- */
1365
 
1366
  .edd-graph .y1Axis {
1367
- color: rgb( 237, 194, 64 )!important;
1368
  }
 
1369
  .edd-graph .y2Axis {
1370
- color: rgb( 175, 216, 248 )!important;
1371
  }
1372
 
1373
  /* API Table Styles
@@ -1384,28 +1675,34 @@ td.edd_order_price {
1384
  width: 100%;
1385
  max-width: 300px;
1386
  }
 
1387
  .chosen-container-multi .chosen-choices {
1388
  background-image: none;
1389
  border-color: #dfdfdf;
1390
  -webkit-border-radius: 3px;
1391
  border-radius: 3px;
1392
  }
 
1393
  .chosen-container-multi .chosen-choices input {
1394
  border-color: #dfdfdf;
1395
- height:27px!important;
1396
- margin:2px;
1397
  }
 
1398
  .chosen-container .chosen-drop {
1399
  border-color: #aaa;
1400
  -webkit-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1);
1401
  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1);
1402
  }
 
1403
  .chosen-container .search-field {
1404
- float: none!important;
1405
  }
 
1406
  .chosen-container .search-field input {
1407
- width: 90%!important;
1408
  }
 
1409
  .chosen-container-active .chosen-choices {
1410
  border-color: #aaa;
1411
  -webkit-border-top-left-radius: 3px;
@@ -1422,20 +1719,24 @@ td.edd_order_price {
1422
  .download_page_edd-tools .tablenav .actions {
1423
  overflow: visible;
1424
  }
 
1425
  .edd_user_search_wrap {
1426
  position: relative;
1427
  overflow: visible;
1428
  }
 
1429
  .edd_user_search_results {
1430
  position: absolute;
1431
  left: 0;
1432
  top: 27px;
1433
  }
 
1434
  .edd_user_search_results a.edd-ajax-user-cancel {
1435
  position: absolute;
1436
  right: 6px;
1437
  top: 2px;
1438
  }
 
1439
  .edd_user_search_results ul {
1440
  background: #f0f0f0;
1441
  border: 1px solid #dfdfdf;
@@ -1450,7 +1751,7 @@ td.edd_order_price {
1450
  color: #999;
1451
  }
1452
 
1453
- @media screen and ( max-width: 1100px ) {
1454
 
1455
  .edd-mix-chart {
1456
  display: block;
@@ -1465,27 +1766,30 @@ td.edd_order_price {
1465
 
1466
  }
1467
 
1468
- @media screen and ( max-width: 782px ) {
1469
 
1470
  .post-type-download .nav-tab-wrapper a {
1471
  font-size: 70%;
1472
  padding: 2px 4px;
1473
  }
 
1474
  .download_page_edd-tools .apikeys .column-user {
1475
  width: 80px;
1476
  }
 
1477
  .license-lifetime-notice,
1478
  .license-expiration-date-notice,
1479
  .license-null {
1480
  padding-left: 0;
1481
  }
 
1482
  [class^="license-"] input[type="text"] {
1483
  margin-bottom: 3px;
1484
  }
1485
 
1486
  }
1487
 
1488
- @media screen and ( max-width: 600px ) {
1489
  .wrap-licenses .form-table tr {
1490
  width: 100%;
1491
  min-height: 230px;
@@ -1502,10 +1806,11 @@ td.edd_order_price {
1502
  #edd-item-wrapper {
1503
  background: #f5f5f5;
1504
  border: 1px solid #e5e5e5;
1505
- webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);
1506
- box-shadow: 0 1px 1px rgba(0,0,0,0.04);
1507
  max-width: 830px;
1508
  }
 
1509
  #edd-item-wrapper:after {
1510
  content: "";
1511
  display: block;
@@ -1514,15 +1819,18 @@ td.edd_order_price {
1514
  font-size: 0;
1515
  height: 0;
1516
  }
 
1517
  #edd-item-tab-wrapper {
1518
- float:left;
1519
  width: 18%;
1520
  z-index: 1;
1521
  }
 
1522
  #edd-item-tab-wrapper-list {
1523
  background: #fff;
1524
  margin: 0;
1525
  }
 
1526
  #edd-item-tab-wrapper-list li {
1527
  display: block;
1528
  background-color: #eaeaea;
@@ -1536,39 +1844,48 @@ td.edd_order_price {
1536
  hyphens: auto;
1537
  word-wrap: break-word;
1538
  }
 
1539
  #edd-item-tab-wrapper-list li a {
1540
  display: block;
1541
  padding: 8px 10px 8px 6px;
1542
  }
 
1543
  #edd-item-tab-wrapper-list li.active {
1544
  display: block;
1545
  background-color: #fff;
1546
  padding: 8px 10px 8px 6px;
1547
  }
 
1548
  #edd-item-tab-wrapper-list .inactive a,
1549
  #edd-item-tab-wrapper-list .inactive a:visited {
1550
  background-color: #f5f5f5;
1551
  color: #444;
1552
  text-decoration: none;
1553
  }
 
1554
  #edd-item-tab-wrapper-list .inactive a:hover {
1555
  background-color: #fff;
1556
  }
 
1557
  #edd-item-tab-wrapper-list .dashicons {
1558
  color: #444;
1559
  font-size: 16px;
1560
  min-width: 24px;
1561
  height: auto;
1562
  }
 
1563
  #edd-item-card-wrapper .left {
1564
  float: left;
1565
  }
 
1566
  #edd-item-card-wrapper .right {
1567
  float: right;
1568
  }
 
1569
  #edd-item-card-wrapper input {
1570
  font-weight: normal;
1571
  }
 
1572
  #edd-item-card-wrapper {
1573
  background-color: #fff;
1574
  border: 1px solid #e5e5e5;
@@ -1578,206 +1895,257 @@ td.edd_order_price {
1578
  width: 700px;
1579
  z-index: 2;
1580
  }
 
1581
  .edd-item-has-tabs #edd-item-card-wrapper {
1582
  border-width: 0 0 0 1px;
1583
  width: 82%;
1584
  }
 
1585
  #edd-item-card-wrapper .customer-section {
1586
  border-bottom: 1px solid #eee;
1587
  margin-bottom: 10px;
1588
  overflow: auto;
1589
  }
 
1590
  #edd-item-card-wrapper .customer-section table {
1591
  margin-bottom: 20px;
1592
  }
1593
- #edd-item-card-wrapper > div {
 
1594
  padding: 0px 20px;
1595
  }
1596
- #edd-item-card-wrapper > div:first-child {
 
1597
  padding-top: 20px;
1598
  }
1599
- #edd-item-card-wrapper > div:last-child {
 
1600
  border: none;
1601
  padding-bottom: 20px;
1602
  }
 
1603
  #edd-item-card-wrapper .avatar-wrap {
1604
  padding-right: 10px;
1605
  text-align: center;
1606
  }
 
1607
  #edd-item-card-wrapper .customer-id {
1608
  font-size: 24px;
1609
  font-weight: 600;
1610
  }
 
1611
  #edd-item-card-wrapper .customer-main-wrapper input {
1612
  width: 200px;
1613
  }
 
1614
  #edd-item-card-wrapper .customer-address-wrapper {
1615
  margin-right: 25px;
1616
  max-width: 33%;
1617
  width: 202px;
1618
  }
 
1619
  #edd-item-card-wrapper .customer-address-wrapper select {
1620
  width: 200px;
1621
  }
 
1622
  #edd-item-card-wrapper .customer-info {
1623
  margin-top: 5px;
1624
  margin-bottom: 10px;
1625
  min-height: 185px;
1626
  }
 
1627
  #edd-item-card-wrapper .info-wrapper {
1628
  min-height: 125px;
1629
  overflow: visible;
1630
  }
 
1631
  #edd-item-card-wrapper a.delete {
1632
  color: #ff0000;
1633
  margin-right: 5px;
1634
  text-decoration: none;
1635
  }
 
1636
  .customer-info .customer-name {
1637
  font-size: 24px;
1638
  font-weight: 600;
1639
  }
 
1640
  .customer-edit-link a,
1641
  .disconnect-user a {
1642
  font-size: 12px;
1643
  font-weight: normal;
1644
  text-decoration: none;
1645
  }
 
1646
  #customer-edit-actions {
1647
  line-height: 28px;
1648
  margin-bottom: 20px;
1649
  text-align: center;
1650
  }
 
1651
  #customer-edit-actions .button-secondary {
1652
  margin-right: 10px;
1653
  }
 
1654
  #edd-item-card-wrapper .row-title {
1655
  width: 30%;
1656
  }
 
1657
  #edd-item-card-wrapper .info-item {
1658
  display: block;
1659
  line-height: 16px;
1660
  padding-bottom: 5px;
1661
  }
 
1662
  #edd-item-card-wrapper .edit-item {
1663
  display: none;
1664
  }
 
1665
  #edd-item-card-wrapper .edd_user_search_results {
1666
  left: 1px;
1667
  top: 16px;
1668
  }
 
1669
  #edd-item-card-wrapper .edd_user_search_results ul {
1670
  width: 200px;
1671
  }
 
1672
  #edd-item-stats-wrapper {
1673
  margin: 0 auto;
1674
  min-height: 30px;
1675
  text-align: center;
1676
  }
 
1677
  #edd-item-stats-wrapper li {
1678
  font-size: 14px;
1679
  float: left;
1680
  line-height: 22px;
1681
  width: 50%;
1682
  }
 
1683
  #edd-item-stats-wrapper a {
1684
  text-decoration: none;
1685
  }
 
1686
  #edd-item-stats-wrapper .dashicons {
1687
  color: #888;
1688
  }
 
1689
  #edd-item-tables-wrapper table {
1690
  text-align: center;
1691
  width: 100%;
1692
  }
 
1693
  #edd-item-tables-wrapper th {
1694
  text-align: center;
1695
  }
1696
- #edd-item-tables-wrapper .downloads tr > th:first-child,
1697
- #edd-item-tables-wrapper .downloads tr > td:first-child,
1698
- #edd-item-tables-wrapper .emails tr > th:first-child,
1699
- #edd-item-tables-wrapper .emails tr > td:first-child {
 
1700
  text-align: left;
1701
  }
1702
- #edd-item-tables-wrapper .downloads tr > td:only-child {
 
1703
  text-align: center;
1704
  }
 
1705
  #edd-item-tables-wrapper .emails .add-customer-email-row td {
1706
  background-color: #f9f9f9;
1707
  border-top: 1px solid #e5e5e5;
1708
  }
 
1709
  #edd-item-tables-wrapper .emails .primary-email-icon {
1710
  font-size: 13px;
1711
  vertical-align: middle;
1712
  line-height: 1.5em;
1713
  }
 
1714
  #edd-item-tables-wrapper .emails input {
1715
  vertical-align: middle;
1716
  margin: 6px 0;
1717
  }
 
1718
  #edd-item-tables-wrapper .emails .spinner {
1719
  float: none;
1720
  }
 
1721
  #edd-item-notes-wrapper {
1722
  min-height: 50px;
1723
  }
 
1724
  .edd-item-notes-header span,
1725
  .edd-item-notes-header img {
1726
  font-weight: 600;
1727
  line-height: 30px;
1728
  vertical-align: middle;
1729
  }
 
1730
  .customer-note-input {
1731
  margin-bottom: 5px;
1732
  width: 100%;
1733
  }
 
1734
  #edd-customer-notes div:nth-of-type(even) {
1735
  background-color: #fcfcfc;
1736
  }
 
1737
  .customer-note-wrapper {
1738
  border-bottom: 1px solid #f9f9f9;
1739
  min-height: 38px;
1740
  padding: 7px 0 7px 7px;
1741
  }
 
1742
  .customer-note-wrapper span {
1743
  display: block;
1744
  }
 
1745
  .note-content-wrap {
1746
  padding-top: 7px;
1747
  }
 
1748
  .delete-customer {
1749
  text-align: center;
1750
  }
 
1751
  #edd-item-card-wrapper .notice-container {
1752
  padding-left: 20px;
1753
  padding-right: 20px;
1754
  margin-left: -20px;
1755
  margin-right: -20px;
1756
  }
1757
- #edd-item-card-wrapper .add-customer-email-wrapper > #add-customer-email {
 
1758
  vertical-align: middle;
1759
  }
1760
 
1761
- @media screen and ( max-width: 810px ) and ( min-width: 656px ) {
1762
  .customer-info .customer-name {
1763
  font-size: 16px;
1764
  }
1765
- #edd-item-card-wrapper .widefat td, .widefat th {
 
 
1766
  padding: 4px 6px;
1767
- max-width: 100px!important;
1768
  display: table-cell;
1769
  }
1770
  }
1771
- @media screen and ( max-width: 781px ) {
 
 
1772
  #edd-item-tab-wrapper,
1773
  #edd-item-card-wrapper {
1774
  margin: 0;
1775
  width: 100%;
1776
  }
 
1777
  #edd-item-tab-wrapper-list {
1778
  background: #fff;
1779
  margin: 0;
1780
  }
 
1781
  #edd-item-tab-wrapper-list li {
1782
  float: left;
1783
  display: inline;
@@ -1788,26 +2156,32 @@ td.edd_order_price {
1788
  border-color: #e5e5e5;
1789
  width: 33.33333%;
1790
  }
 
1791
  #edd-item-tab-wrapper-list li:nth-child(3n+3) {
1792
  border-width: 0 0 1px 0;
1793
  }
 
1794
  #edd-item-tab-wrapper-list .dashicons {
1795
  font-size: 18px;
1796
  }
1797
- .edd-item-has-tabs #edd-item-card-wrapper {
 
1798
  border-top: 1px solid #e5e5e5;
1799
  border-left: 0;
1800
  margin-top: -1px;
1801
  width: 100%;
1802
  }
1803
  }
1804
- @media screen and ( max-width: 656px ) {
 
1805
  #edd-item-card-wrapper .customer-info {
1806
  min-height: 220px;
1807
  }
 
1808
  .edd-item-info.customer-info {
1809
  position: relative;
1810
  }
 
1811
  #edd-item-card-wrapper .customer-address-wrapper {
1812
  float: none;
1813
  position: absolute;
@@ -1815,50 +2189,62 @@ td.edd_order_price {
1815
  left: 110px;
1816
  max-width: 200px;
1817
  }
 
1818
  #edd-item-card-wrapper .customer-main-wrapper {
1819
  float: none;
1820
  position: absolute;
1821
  left: 110px;
1822
  }
 
1823
  .customer-info .customer-name {
1824
  font-size: 16px;
1825
  }
 
1826
  #edd-item-card-wrapper #edd-item-stats-wrapper {
1827
  padding-left: 0;
1828
  padding-right: 0;
1829
  }
 
1830
  #edd-item-card-wrapper .customer-section {
1831
  margin-bottom: 0;
1832
  }
 
1833
  #edd-item-card-wrapper .widefat td,
1834
  #edd-item-card-wrapper .widefat th {
1835
  padding: 4px 6px;
1836
- max-width: 100px!important;
1837
  display: table-cell;
1838
  overflow: hidden;
1839
  }
 
1840
  #edd-item-card-wrapper .customer-id {
1841
  font-size: 16px;
1842
  }
1843
  }
1844
- @media screen and ( max-width: 480px ) {
 
1845
  #edd-item-tab-wrapper-list li {
1846
  width: 50%;
1847
  }
 
1848
  #edd-item-tab-wrapper-list li:nth-child(3n+3) {
1849
  border-width: 0 1px 1px 0;
1850
  }
 
1851
  #edd-item-tab-wrapper-list li:nth-child(even) {
1852
  border-width: 0 0 1px 0;
1853
  }
 
1854
  .edd-repeatable-row-title,
1855
  .edd-repeatable-row-actions {
1856
  text-align: left;
1857
  width: 100%;
1858
  }
 
1859
  .edd-repeatable-row-title {
1860
  padding-bottom: 0;
1861
  }
 
1862
  .edd-option-name,
1863
  .edd-option-price,
1864
  .edd_repeatable_default,
@@ -1873,9 +2259,11 @@ td.edd_order_price {
1873
  width: 100% !important;
1874
  margin: 10px 0;
1875
  }
 
1876
  .edd-bundled-product-row .edd-bundled-product-actions {
1877
  float: none;
1878
  }
 
1879
  .edd-bundled-product-row .edd-bundled-product-item-reorder .edd-product-file-reorder {
1880
  padding: 0;
1881
  }
@@ -1893,7 +2281,8 @@ td.edd_order_price {
1893
  #edd-payment-date-filters span {
1894
  display: block;
1895
  }
1896
- #edd-payment-date-filters span > input {
 
1897
  float: right;
1898
  }
1899
 
@@ -1941,13 +2330,14 @@ td.edd_order_price {
1941
  .recount-stats-controls form {
1942
  display: inline;
1943
  }
 
1944
  .edd-recount-stats-descriptions span {
1945
  display: none;
1946
  line-height: 24px;
1947
  }
1948
 
1949
  #edd-debug-log p.submit {
1950
- margin: 20px 0 0;
1951
  padding: 0;
1952
  }
1953
 
@@ -2075,7 +2465,7 @@ td.edd_order_price {
2075
  }
2076
 
2077
  /* Settings sidebar responsive behavior */
2078
- @media all and ( min-width: 1080px ) {
2079
 
2080
  .edd-has-sidebar .edd-settings-content {
2081
  float: left;
@@ -2088,7 +2478,7 @@ td.edd_order_price {
2088
  }
2089
  }
2090
 
2091
- @media all and ( min-width: 1240px ) {
2092
 
2093
  .edd-has-sidebar .edd-settings-content {
2094
  width: 74%;
@@ -2141,22 +2531,27 @@ td.edd_order_price {
2141
  background: #2d6ca2;
2142
  display: none;
2143
  }
2144
- @media screen and ( min-width: 783px ) {
 
2145
  .edd-admin-notice-top-of-page {
2146
  padding: 10px 46px 10px 22px;
2147
  }
2148
  }
2149
- @media screen and ( min-width: 961px ) {
 
2150
  .edd-admin-notice-top-of-page {
2151
  text-align: center;
2152
  }
2153
  }
 
2154
  .edd-admin-notice-top-of-page a {
2155
  color: #fff;
2156
  }
 
2157
  .edd-admin-notice-top-of-page a:hover {
2158
  text-decoration: none;
2159
  }
 
2160
  .edd-admin-notice-top-of-page .button-link {
2161
  position: absolute;
2162
  top: 48px;
@@ -2168,18 +2563,21 @@ td.edd_order_price {
2168
  margin-left: 5px;
2169
  padding: 6px 10px;
2170
  }
 
2171
  .edd-admin-notice-top-of-page .button-link:hover,
2172
  .edd-admin-notice-top-of-page .button-link:active,
2173
  .edd-admin-notice-top-of-page .button-link:focus {
2174
  color: #fff;
2175
  text-decoration: none;
2176
  }
2177
- @media screen and ( min-width: 601px ) {
 
2178
  .edd-admin-notice-top-of-page .button-link {
2179
  top: 1px;
2180
  }
2181
  }
2182
- @media screen and ( min-width: 783px ) {
 
2183
  .edd-admin-notice-top-of-page .button-link {
2184
  right: 9px;
2185
  }
@@ -2190,19 +2588,189 @@ td.edd_order_price {
2190
  .edd-paypal-account-status ul {
2191
  margin-left: 25px;
2192
  }
2193
- .edd-paypal-account-status > li {
 
2194
  margin-bottom: 1em;
2195
  }
 
2196
  .edd-paypal-account-status ul:not(.edd-paypal-webhook-events) {
2197
  list-style: disc;
2198
  list-style-position: inside;
2199
  }
 
2200
  .edd-paypal-account-status ul:not(.edd-paypal-webhook-events) li {
2201
  margin: .25em 0;
2202
  }
 
2203
  .edd-paypal-account-status .dashicons-yes {
2204
  color: #008a20;
2205
  }
 
2206
  .edd-paypal-account-status .dashicons-no {
2207
  color: #d63638;
2208
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  .edd-hidden {
11
  display: none;
12
  }
13
+
14
  .edd-clearfix:after {
15
  content: ".";
16
  display: block;
18
  text-indent: -9999px;
19
  visibility: hidden;
20
  }
21
+
22
  .edd-wrap a,
23
  .edd-notice .notice-dismiss {
24
  text-decoration: none;
25
  }
26
+
27
  a.edd-delete {
28
  color: #a00;
29
  }
30
+
31
  a.edd-delete:hover {
32
  color: #f00;
33
  }
51
  background: #fff;
52
  }
53
 
54
+ #edd-header-wrapper {
55
+ display: flex;
56
+ justify-content: space-between;
57
+ padding: 0 20px;
58
+ }
59
+
60
  #edd-header img {
61
  display: block;
62
  margin: 0;
63
  max-width: 300px;
64
+ }
65
+
66
+ .no-js #edd-header-actions {
67
+ display: none;
68
+ }
69
+
70
+ #edd-header .edd-round {
71
+ position: relative;
72
+ background-color: #f3f4f5;
73
+ border-radius: 50%;
74
+ width: 40px;
75
+ height: 40px;
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ margin-left: 10px;
80
+ cursor: pointer;
81
+ transition: background-color .2s ease;
82
+ }
83
+
84
+ button.edd-round {
85
+ border: none;
86
+ }
87
+ #edd-header button.edd-round:hover {
88
+ background-color: #e5e5e5;
89
+ }
90
+ button.edd-round:focus, button.edd-round:active {
91
+ outline: 2px solid #0c5d95;
92
+ }
93
+
94
+ #edd-header .edd-number {
95
+ position: absolute;
96
+ background-color: #df2a4a;
97
+ width: 16px;
98
+ height: 16px;
99
+ font-weight: 600;
100
+ font-size: 10px;
101
+ color: #fff;
102
+ top: -8px;
103
+ left: 50%;
104
+ transform: translateX(-50%);
105
+ margin: 0;
106
+ -webkit-animation: bounce 2s 5;
107
+ animation: bounce 2s 5;
108
+ }
109
+
110
+ #edd-header .edd-number.edd-hidden {
111
+ display: none !important;
112
+ }
113
+
114
+ #edd-header .edd-round svg {
115
+ width: 20px;
116
+ height: 20px;
117
  }
118
 
119
  .edd-settings-sub-nav {
196
  margin: 4px 0 0;
197
  }
198
 
199
+ .download_page_edd-settings .form-table input.small-text~label,
200
+ .download_page_edd-settings .form-table input[type="checkbox"]+label {
201
+ display: inline;
202
+ }
203
+
204
+ .download_page_edd-settings .form-table tr>th>strong,
205
+ .download_page_edd-settings .form-table tr>th>h3 {
206
  font-size: 1.2em;
207
  font-weight: 600;
208
  margin: 0 auto;
218
  background: #333 !important;
219
  border-width: 1px !important;
220
  border-radius: 3px !important;
221
+ box-shadow: 1px 1px 2px 1px rgba(214, 214, 214, 0.5) !important;
222
  color: #dedede !important;
223
  max-width: 300px !important;
224
  padding: 7px !important;
228
  }
229
 
230
  .download_page_edd-settings .edd-settings-payment-icon-wrapper {
231
+ margin-right: 10px;
232
+ line-height: 16px;
233
+ height: 16px;
234
  display: table;
235
  }
236
 
246
  right: 0;
247
  position: absolute;
248
  }
249
+
250
  .edd-add-ons-footer {
251
  padding-top: 10px;
252
  }
253
+
254
  #edd-add-ons h2 {
255
  margin: 0 0 15px;
256
  }
257
+
258
  .edd-add-ons-view-wrapper {
259
  height: 50px;
260
  }
261
+
262
  #edd-add-ons h2 .button-primary {
263
  position: absolute;
264
  }
265
+
266
  #edd-add-ons .edd-extension {
267
  background: #fff;
268
  border: 1px solid #ccc;
273
  width: 320px;
274
  height: 315px;
275
  }
276
+
277
  #edd-add-ons .edd-extension h3 {
278
  font-size: 13px;
279
  margin: 0 0 8px;
280
  }
281
+
282
  #edd-add-ons .edd-extension .button-secondary {
283
  position: absolute;
284
  bottom: 14px;
285
  left: 14px;
286
  }
287
+
288
  #edd-add-ons .edd-browse-all {
289
+ clear: both;
290
+ width: 100%;
291
  }
292
+
293
  #edd-add-ons .edd-extension .third-party {
294
  display: none;
295
  }
296
+
297
  #edd-add-ons .edd-starter-package {
298
  background-color: #85c0e5;
299
  border-color: #62a9d7;
300
  color: #fff;
301
  }
302
+
303
  #edd-add-ons .edd-starter-package h3 {
304
  color: #fff;
305
  }
306
+
307
  #edd-add-ons .edd-extension .wp-post-image {
308
  width: 100%;
309
  height: auto;
317
  height: 100px;
318
  min-width: 200px;
319
  }
320
+
321
  #edd-add-discount input[type="text"],
322
  #edd-edit-discount input[type="text"] {
323
  width: 300px;
337
  clear: both;
338
  background-image: -webkit-gradient(linear, left bottom, left top, from(#f5f5f5), to(#fafafa));
339
  background-image: -webkit-linear-gradient(bottom, #f5f5f5, #fafafa);
340
+ background-image: -moz-linear-gradient(bottom, #f5f5f5, #fafafa);
341
+ background-image: -o-linear-gradient(bottom, #f5f5f5, #fafafa);
342
  background-image: linear-gradient(to top, #f5f5f5, #fafafa);
343
  border-color: #dfdfdf;
344
  border-width: 1px;
350
  padding: 12px;
351
  margin: 8px 0;
352
  }
353
+
354
  #edd-payments-filter ul.subsubsub {
355
  margin-bottom: 8px;
356
  }
357
+
358
  #edd-payment-filters p {
359
  color: #777;
360
  }
361
+
362
  #edd-payment-date-filters input {
363
  vertical-align: middle;
364
  }
365
+
366
  tr.status-refunded td {
367
  background: #cecece;
368
  border-top-color: #ccc;
369
  }
370
+
371
  .wp-list-table.downloads th#ID {
372
  width: 80px;
373
  }
374
+
375
  .wp-list-table.downloads th#details {
376
  width: 130px;
377
  }
378
+
379
  .wp-list-table.downloads th#date {
380
  width: 140px;
381
  }
382
+
383
  .wp-list-table.downloads th#user {
384
  width: 130px;
385
  }
386
+
387
  .edd-mobile-link {
388
  line-height: 32px;
389
  vertical-align: middle;
390
  }
391
+
392
  .edd-mobile-link img {
393
  max-width: 80%;
394
  height: auto;
395
  float: left;
396
  }
397
 
398
+ @media handheld,
399
+ only screen and (max-width: 640px) {
400
 
401
  .wp-list-table.downloads th {
402
+ width: auto !important;
403
  }
404
 
405
  }
408
  margin-left: -8px;
409
  margin-top: -8px;
410
  }
411
+
412
  #edd-download-link-textarea {
413
  width: 100%;
414
  }
420
  width: 225px;
421
  float: left;
422
  }
423
+
424
  .edd_files_url_label {
425
  width: 220px;
426
  float: left;
427
  }
428
+
429
  #postbox-container-1 .edd_files_name_label {
430
  width: 80px;
431
  }
432
+
433
  #postbox-container-1 .edd_files_url_label {
434
  width: 80px;
435
  }
436
+
437
  .edd-add-repeatable-row {
438
  margin: 10px 0;
439
  }
440
+
441
  .edd-add-repeatable-row .submit {
442
  padding: 0 !important;
443
  }
444
+
445
  .edd_variable_prices_wrapper:not(:first-child),
446
  .edd_repeatable_upload_wrapper:not(:first-child) {
447
  margin-top: 12px;
448
  }
449
+
450
  .edd-repeatable-row-actions {
451
  color: #777;
452
  font-size: 12px;
453
  }
454
+
455
  .edd-repeatable-row-actions a {
456
  text-decoration: none;
457
  width: auto;
458
  cursor: pointer;
459
  vertical-align: middle;
460
  }
461
+
462
  .edd-repeatable-row-actions .toggle-custom-price-option-section {
463
  color: #777;
464
  }
465
+
466
  .edd-repeatable-row-actions .toggle-custom-price-option-section:hover {
467
  color: #444;
468
  }
469
+
470
  .edd-repeatable-row-header,
471
  .edd-bundle-products-header {
472
  clear: both;
473
  background: #f1f1f1;
474
  border: 1px solid #e5e5e5;
475
  }
476
+
477
  .edd-repeatable-row-header {
478
  cursor: move;
479
  }
480
+
481
  .edd-repeatable-row-header:before,
482
  .edd-repeatable-row-header:after,
483
  .edd-bundled-product-row:before,
485
  content: '';
486
  display: table;
487
  }
488
+
489
  .edd-repeatable-row-header:after,
490
  .edd-bundled-product-row:after {
491
  clear: both;
492
  }
493
+
494
  .edd-repeatable-row-title {
495
  float: left;
496
  font-weight: 600;
497
  }
498
+
499
  .edd-bundled-product-item-reorder .edd-product-file-reorder {
500
  color: #e5e5e5;
501
  font-family: "dashicons";
506
  vertical-align: top;
507
  transition: .2s color;
508
  }
509
+
510
  .edd-bundled-product-item-reorder .edd-product-file-reorder:hover {
511
  color: #bbb;
512
  }
513
+
514
  .edd-repeatable-row-title,
515
  .edd-repeatable-row-actions {
516
  padding: 8px;
517
  box-sizing: border-box;
518
  }
519
+
520
  .edd-repeatable-row-actions {
521
  float: right;
522
  text-align: right;
523
  padding: 8px;
524
  }
525
+
526
  .edd-repeatable-row-actions .edd-remove-row,
527
  .edd-bundled-product-row .edd-remove-row {
528
  font-size: 12px;
529
  width: auto;
530
  cursor: pointer;
531
  }
532
+
533
  .edd-repeatable-row-standard-fields,
534
  .edd-bundled-product-row {
535
  background: #f9f9f9;
538
  border-style: solid;
539
  border-color: #e5e5e5;
540
  }
541
+
542
  .edd-repeatable-row-setting-label {
543
  display: block;
544
  margin-bottom: 4px;
545
  }
546
+
547
  .edd-repeatable-row-setting-label .edd-help-tip {
548
  display: inline-block;
549
  margin-left: 4px;
550
  }
551
+
552
  .edd-option-name,
553
  .edd-option-price,
554
  .edd_repeatable_default,
562
  display: inline-block;
563
  vertical-align: top;
564
  }
565
+
566
  .edd-option-name {
567
  width: 38%;
568
  margin-right: 5%;
569
  }
570
+
571
  .edd-option-price {
572
  min-width: 100px;
573
  }
574
+
575
  .edd_repeatable_default {
576
  text-align: center;
577
  min-width: 80px;
578
  }
579
+
580
  .edd-file-name {
581
  width: 18%;
582
  margin-right: 3%;
583
  }
584
+
585
  .edd-file-url {
586
  width: 65%;
587
  }
588
+
589
  .edd-repeatable-row-standard-fields.has-variable-pricing .edd-file-url {
590
  width: 38%;
591
  margin-right: 5%;
592
  }
593
+
594
  .edd-file-assignment {
595
  width: 27%;
596
  }
597
+
598
  .edd-file-assignment .edd-repeatable-row-setting-label {
599
  margin-bottom: 0;
600
  }
601
+
602
  .edd-custom-price-option-sections-wrap {
603
  display: none;
604
  border-width: 0 1px 1px;
607
  box-sizing: border-box;
608
  width: 100%;
609
  }
610
+
611
  .edd-custom-price-option-section {
612
  display: block;
613
  padding: 10px 8px;
614
+ border-bottom: 1px solid rgba(222, 222, 222, 0.3);
615
  }
616
+
617
  .edd-custom-price-option-section:last-child {
618
  border-bottom: none;
619
  }
620
+
621
+ label.edd_prices_shipping {
622
+ /* remove once Simple Shipping markup is improved */
623
  display: none !important;
624
  }
625
+
626
  .edd-custom-price-option-section-title {
627
  display: block;
628
  font-size: 14px;
629
  font-weight: 600;
630
  padding: 0 0 10px;
631
  }
632
+
633
+ .edd-custom-price-option-section>*:not(.edd-custom-price-option-section-title) {
634
  display: inline-block;
635
  padding-right: 20px;
636
  vertical-align: top;
637
  margin-bottom: 4px;
638
  }
639
+
640
+ .edd-custom-price-option-section>*:not(.edd-custom-price-option-section-title) label {
641
  display: block;
642
  margin-bottom: 2px;
643
  }
644
+
645
  .edd-bundle-products-header {
646
  font-weight: 600;
647
  padding: 8px;
648
  }
649
+
650
  .edd-bundled-product-row .edd-bundled-product-item-reorder {
651
  min-width: 30px;
652
  margin-right: 8px;
653
  }
654
+
655
  .edd-bundled-product-row .edd-bundled-product-item-reorder .edd-product-file-reorder {
656
  font-size: 20px;
657
  font-weight: 300;
658
  padding: 16px 4px 0;
659
  cursor: move;
660
  }
661
+
662
  .edd-bundled-product-row .edd-bundled-product-item {
663
  width: 60%;
664
  margin-right: 3%;
665
  }
666
+
667
  .edd-bundled-product-row.has-variable-pricing .edd-bundled-product-item {
668
  width: 47%;
669
  }
670
+
671
  .edd-bundled-product-row .edd-bundled-product-price-assignment {
672
  width: 23%;
673
  margin-right: 3%;
674
  }
675
+
676
  .edd-bundled-product-row .edd-bundled-product-actions {
677
  float: right;
678
  }
679
+
680
  .edd_repeatable_upload_wrapper .edd_repeatable_upload_field_container {
681
  position: relative;
682
  }
683
+
684
  .edd_upload_file {
685
  background: #fff;
686
  display: block;
689
  top: 3px;
690
  right: 7px;
691
  }
692
+
693
  .edd_upload_field {
694
  padding-right: 8em !important;
695
  }
696
+
697
  textarea#edd-payment-note {
698
  width: 100%;
699
  height: 4em;
700
  margin: 0;
701
  }
702
+
703
  #edd-purchased-files .row .edd-purchased-files-list-wrapper .download {
704
  line-height: 1.4;
705
  }
706
+
707
  #edd-purchased-files .edd-purchased-files-list-wrapper .edd-purchased-option {
708
  color: #666;
709
  }
710
+
711
  input[class*="edd-price-field"] {
712
  padding: 3px 5px;
713
  width: 75px;
714
  }
715
+
716
  [class*="item_"] [class*="edd-payment-details-download-"][type="number"].small-text,
717
  #edd-order-download-quantity[type="number"].small-text,
718
  #edd-order-download-tax[type="text"].small-text {
719
  height: 25px;
720
  }
721
+
722
  .item_price .edd-payment-details-download-quantity[type="number"].small-text,
723
  #edd-order-download-quantity[type="number"].small-text {
724
  width: 55px;
725
  }
726
+
727
  .item_tax .edd-payment-details-download-item-tax[type="number"].small-text,
728
  #edd-order-download-tax[type="text"].small-text {
729
  width: 75px;
730
  }
731
+
732
  .edd_repeatable_upload_wrapper .pricing select,
733
  .edd_repeatable_product_wrapper .edd-select {
734
  min-width: 100%;
735
  }
736
+
737
  #edd_product_notes_field {
738
  display: block;
739
  margin: 12px 0 0;
753
  width: 10px;
754
  height: 10px;
755
  }
756
+
757
  .edd_remove_repeatable:active,
758
  .edd_remove_repeatable:hover,
759
+ .edd_remove_repeatable:focus {
760
  background-position: -10px 0 !important;
761
  }
762
 
766
  #edd-edit-order-form .column {
767
  width: 32%;
768
  }
769
+
770
  .edd-edit-purchase-element[class*="columns-"] ul li {
771
  padding-right: 1%;
772
  }
773
+
774
  #edd-edit-order-form .columns-4 .column:nth-child(2n+1),
775
  #edd-edit-order-form .columns-5 .column:nth-child(3n+1),
776
  #edd-edit-order-form .column:nth-child(2n+1) {
777
  margin-right: 0;
778
  }
779
+
780
  #edd-edit-order-form input.large-text {
781
  width: 90%;
782
  }
783
+
784
  .edd-edit-purchase-element ul li.download {
785
  width: 35%;
786
  }
787
+
788
  .edd-edit-purchase-element ul li.item_price {
789
  width: 15%;
790
  }
791
+
792
  .edd-edit-purchase-element ul li.item_price.item_quantity {
793
  width: 25%;
794
  }
795
+
796
  .edd-edit-purchase-element ul li.item_tax {
797
  width: 15%;
798
  }
799
+
800
  .edd-edit-purchase-element ul li.price {
801
  width: 20%;
802
  }
803
+
804
  .edd-admin-box .label {
805
  font-weight: 600;
806
  }
807
+
808
  .edd-admin-box-inside {
809
  border-bottom: 1px solid #eee;
810
  clear: both;
812
  margin: 0;
813
  word-break: break-word;
814
  }
815
+
816
  .rtl .edd-admin-box-inside {
817
  padding: 5px 10px 5px 0;
818
  }
819
+
820
  .edd-admin-box-inside .strong {
821
  font-weight: 600;
822
  }
823
+
824
  .edd-payment-fees .fee-label {
825
  color: #666;
826
  font-weight: normal;
827
  }
828
+
829
  .edd-admin-box .right {
830
  float: right;
831
  }
832
+
833
  .rtl .edd-admin-box .right {
834
  float: left;
835
  margin-left: 10px;
836
  }
837
+
838
  #edd-order-update .inside,
839
  #edd-order-details .inside {
840
  margin: 0;
841
  padding: 0;
842
  }
843
+
844
  #edd-order-update input.edd_datepicker {
845
  width: 180px;
846
  }
847
+
848
  #edd-order-update input[type="number"].edd-payment-time-hour,
849
  #edd-order-update input[type="number"].edd-payment-time-min {
850
  width: 50px;
851
  }
852
+
853
  #edd-order-update .edd-tax-rate {
854
  color: #9c9c9c;
855
  font-style: italic;
856
  }
857
+
858
  #edd-order-resend-receipt .inside {
859
  margin-top: 11px;
860
  }
861
+
862
  #edd-order-resend-receipt .edd-order-resend-receipt-addresses {
863
  margin-top: 10px;
864
  }
865
+
866
  .edd-admin-box-inside:last-child {
867
  border-bottom: 0;
868
  }
869
+
870
  #edd-edit-order-form .data-payment-key {
871
  word-break: break-all;
872
  }
873
+
874
  .edd-order-update-box #major-publishing-actions .button-secondary {
875
  margin-right: 10px;
876
  }
877
+
878
  .edd-edit-purchase-element .edd-select-chosen {
879
  width: 196px;
880
  }
881
+
882
  .edd-edit-purchase-element ul,
883
  #edd-order-address-country-wrap select,
884
  #edd-customer-details .order-data-address input,
887
  clear: both;
888
  display: block;
889
  }
890
+
891
  #edd-customer-details .customer-info .column {
892
  width: 49%;
893
  }
894
+
895
  #edd-customer-details .actions {
896
  float: right;
897
  }
898
+
899
  .edd-order-data input.small-text {
900
  margin: 0;
901
  }
902
+
903
  .edd-order-data input.med-text {
904
  margin: 0;
905
  width: 100px;
906
  }
907
+
908
  #edd-order-update span.label {
909
  display: inline;
910
  width: 50px;
911
  }
912
+
913
  .edd-order-update-box .button-primary {
914
  margin-right: 0;
915
  }
916
+
917
  #edd-edit-order-form .column .description {
918
  padding-right: 10px;
919
  }
920
+
921
  #edd-edit-order-form .column,
922
  .edd-edit-purchase-element ul li {
923
  display: inline-block;
926
  margin: 0;
927
  vertical-align: middle;
928
  }
929
+
930
  .edd-edit-purchase-element .row {
931
  padding: 12px;
932
  }
933
+
934
  .edd-edit-purchase-element .row:not(:last-child) {
935
  border-bottom: 1px solid #eee;
936
  }
937
+
938
  .edd-edit-purchase-element .row:nth-child(odd):not(.header) {
939
  background-color: #f9f9f9;
940
  }
941
+
942
  .edd-edit-purchase-element .row.header {
943
  padding: 6px 12px;
944
  font-weight: 600;
945
  vertical-align: top;
946
  }
947
+
948
  .edd-edit-purchase-element ul {
949
  font-size: 0;
950
  }
951
+
952
  .edd-edit-purchase-element ul li {
953
  font-size: 13px;
954
  }
955
+
956
  #edd-order-data .data span {
957
  color: #666;
958
  font-weight: 600;
959
  }
960
+
961
  .edd-edit-purchase-element .inside {
962
  padding: 12px;
963
  }
964
+
965
  .edd-edit-purchase-element .edd-purchased-download-title {
966
  font-size: 14px;
967
  font-weight: 500;
968
  }
969
+
970
  .edd-edit-purchase-element .edd-purchased-download-title .deleted {
971
  color: #777;
972
  }
973
+
974
  .edd-edit-purchase-element .edd-purchased-download-actions {
975
  color: #777;
976
  line-height: 1.4;
977
  }
978
+
979
  .edd-edit-purchase-element .edd-purchased-download-actions .edd-purchased-download-actions-label {
980
  font-weight: 500;
981
  }
982
+
983
  .edd-edit-purchase-element .edd-purchased-download-actions a {
984
  color: #777;
985
  font-size: 12px;
986
  }
987
+
988
  .edd-edit-purchase-element .edd-purchased-download-actions a:hover {
989
  color: #444;
990
  }
991
+
992
  .edd-edit-purchase-element .edd-purchased-download-actions .edd-order-remove-download {
993
  color: #a00;
994
  }
995
+
996
  .edd-edit-purchase-element .edd-purchased-download-actions .edd-order-remove-download:hover {
997
  color: #f00;
998
  }
999
+
1000
  #edd-order-recalc-total {
1001
  float: right;
1002
  }
1003
+
1004
  .edd_repeatable_upload_wrapper .pricing select,
1005
  .edd_repeatable_product_wrapper .edd-select,
1006
  #edd_products .edd-select {
1007
  min-width: 100%;
1008
  max-width: 200px;
1009
  }
1010
+
1011
  .edd_repeatable_product_wrapper td {
1012
  overflow: visible;
1013
  }
1014
+
1015
  .edd-payment-details-label-mobile {
1016
  display: none;
1017
  }
1018
 
1019
+ @media screen and (max-width: 1284px) {
1020
 
1021
  .edd-edit-purchase-element ul li.download {
1022
  padding-bottom: 15px;
1023
  width: 100%;
1024
  }
1025
+
1026
  .edd-edit-purchase-element .edd-purchased-download-title {
1027
  font-size: 16px;
1028
  }
1029
+
1030
  .edd-edit-purchase-element ul li.item_price {
1031
  width: 22%;
1032
  }
1033
+
1034
  .edd-edit-purchase-element ul li.item_price.item_quantity {
1035
  width: 35%;
1036
  }
1037
+
1038
  .edd-edit-purchase-element ul li.item_tax {
1039
  width: 25%;
1040
  }
1041
+
1042
  .edd-edit-purchase-element ul li.price {
1043
  width: 20%;
1044
  }
1045
+
1046
  .edd-edit-purchase-element .edd-purchased-download-actions {
1047
  padding-top: 10px;
1048
  }
1049
+
1050
  .edd-purchased-files-header,
1051
  .edd-add-download-to-purchase-header {
1052
  display: none;
1053
  }
1054
+
1055
  .edd-payment-details-label-mobile {
1056
  display: block;
1057
  font-weight: 500;
1060
 
1061
  }
1062
 
1063
+ @media screen and (max-width: 1024px) {
1064
 
1065
  .edd-edit-purchase-element ul li.item_price.item_quantity {
1066
  width: 40%;
1067
  }
1068
+
1069
  .edd-edit-purchase-element ul li.price {
1070
  width: 24%;
1071
  }
1072
+
1073
  .edd-edit-purchase-element .edd-purchased-download-actions {
1074
  padding-top: 15px;
1075
  }
1076
+
1077
  .edd-edit-purchase-element .edd-purchased-download-actions,
1078
  .edd-edit-purchase-element .edd-purchased-download-actions a {
1079
  font-size: 14px;
1081
 
1082
  }
1083
 
1084
+ @media screen and (max-width: 782px) {
1085
 
1086
  #edd-edit-order-form .column {
1087
  width: 49%;
1088
  }
1089
+
1090
  .edd-edit-purchase-element ul li.item_price,
1091
  .edd-edit-purchase-element ul li.item_price.item_quantity {
1092
  padding-bottom: 10px;
1093
  }
1094
+
1095
  .edd-edit-purchase-element ul li.item_price.item_quantity {
1096
  width: 35%;
1097
  }
1098
+
1099
  .edd-edit-purchase-element ul li.item_tax,
1100
  .edd-edit-purchase-element ul li.price {
1101
  width: 20%;
1102
  padding-bottom: 10px;
1103
  }
1104
+
1105
  .edd-payment-details-label-mobile {
1106
  font-size: 14px;
1107
  font-weight: 500;
1108
  }
1109
+
1110
  .edd-price-currency,
1111
  .edd-payment-details-download-amount {
1112
  font-size: 16px;
1113
  }
1114
+
1115
  .order-data-column input[type="email"] {
1116
  padding: 6px 10px;
1117
  }
1118
 
1119
  }
1120
 
1121
+ @media screen and (max-width: 600px) {
1122
 
1123
  .edd-edit-purchase-element ul li.item_price,
1124
  .edd-edit-purchase-element ul li.item_price.item_quantity,
1126
  width: 100%;
1127
  padding-bottom: 20px;
1128
  }
1129
+
1130
  .edd-edit-purchase-element ul li.price,
1131
  .edd-edit-purchase-element .edd-add-download-to-purchase ul li.item_tax {
1132
  width: 100%;
1133
  padding-bottom: 0;
1134
  }
1135
+
1136
  .edd-edit-purchase-element .edd-add-download-to-purchase-actions {
1137
  padding-top: 15px;
1138
  }
1139
+
1140
  #edd-edit-order-form .column {
1141
  width: 100%;
1142
  }
1146
  /** Stats */
1147
  #edd_product_stats .label {
1148
  display: inline-block;
1149
+ }
1150
+
1151
  #edd_product_stats hr {
1152
  border-style: solid;
1153
  border-width: 1px;
1154
  border-color: #ccc #fff #fff #ccc;
1155
  }
1156
+
1157
  #edd_product_stats .product-sales-stats:before,
1158
  #edd_product_stats .product-earnings-stats:before {
1159
  color: #82878c;
1169
  -webkit-font-smoothing: antialiased;
1170
  -moz-osx-font-smoothing: grayscale;
1171
  }
1172
+
1173
  #edd_product_stats .product-sales-stats:before {
1174
  content: '\f174';
1175
  }
1176
+
1177
  #edd_product_stats .product-earnings-stats:before {
1178
  content: '\f239';
1179
  }
1181
  /* Dashboard Widget Styles
1182
  -------------------------------------------------------------- */
1183
 
1184
+ .edd_dashboard_widget table thead td {
1185
  border-bottom: 1px solid #ececec;
1186
  color: #777;
1187
  }
1188
+
1189
  .edd_dashboard_widget .table_left {
1190
  float: left;
1191
  width: 45%;
1192
  }
1193
+
1194
  .edd_dashboard_widget .table_right {
1195
  float: right;
1196
  width: 45%;
1197
  }
1198
+
1199
  .edd_dashboard_widget .inside {
1200
  font-size: 12px;
1201
  }
1202
+
1203
  .edd_dashboard_widget td {
1204
  padding: 3px 0;
1205
  }
1206
+
1207
  .edd_dashboard_widget .b,
1208
  .edd_dashboard_widget .t {
1209
  line-height: 1.5;
1210
  vertical-align: middle;
1211
  }
1212
+
1213
  .edd_dashboard_widget .b {
1214
  font-size: 14px;
1215
+ font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif;
1216
  padding-right: 6px;
1217
  width: auto;
1218
  }
1219
+
1220
  .edd_dashboard_widget .t {
1221
  font-size: 12px;
1222
  padding-right: 12px;
1223
  color: #777;
1224
  width: 100%;
1225
  }
1226
+
1227
  .edd_dashboard_widget .label_heading {
1228
  border-top: 1px solid #ececec;
1229
  color: #8f8f8f;
1234
  padding-top: 10px;
1235
  margin: 0 0 8px 12px;
1236
  }
1237
+
1238
  .edd_dashboard_widget .edd_dashboard_widget_subheading {
1239
  border-top: 1px solid #ececec;
1240
  color: #8f8f8f;
1242
  padding-top: 10px;
1243
  margin: 1em 0 0 0;
1244
  }
1245
+
1246
+ .edd_dashboard_widget .edd_dashboard_widget_subheading+.table {
1247
  margin: 8px 0 0 0;
1248
  }
1249
+
1250
  .edd_dashboard_widget .edd_price_label {
1251
  background: rgb(0, 118, 156);
1252
  border-radius: 3px;
1255
  padding: 2px 4px;
1256
  margin-right: 2px;
1257
  }
1258
+
1259
  .edd_dashboard_widget table {
1260
  width: 100%;
1261
  margin-left: 0;
1262
  margin-bottom: 1em;
1263
  }
1264
+
1265
  td.edd_order_label {
1266
  width: 80%;
1267
  }
1268
+
1269
  td.edd_order_price {
1270
  text-align: right;
1271
  }
1272
 
1273
+ @media handheld,
1274
+ only screen and (max-width: 1000px) {
1275
 
1276
  .edd_dashboard_widget .edd-recent-email {
1277
  display: none;
1285
  #edd-dashboard-widgets-wrap .postbox h3 {
1286
  cursor: default;
1287
  }
1288
+
1289
  #edd-graphs-date-options,
1290
  #edd-date-range-options {
1291
  float: left;
1292
  }
1293
+
1294
  #edd-date-range-options span {
1295
  float: left;
1296
  line-height: 24px;
1297
  height: 24px;
1298
  margin-right: 6px;
1299
  }
1300
+
1301
  .edd-import-export-form {
1302
  position: relative;
1303
  }
1304
+
1305
  .edd-import-export-form .edd-progress {
1306
  background: #ddd;
1307
  position: absolute;
1309
  width: 95%;
1310
  height: 15px;
1311
  }
1312
+
1313
  .edd-import-export-form .edd-progress div {
1314
  background: #ccc;
1315
  height: 100%;
1316
  width: 0;
1317
  }
1318
+
1319
  .edd-import-export-form .notice-wrap {
1320
  background-color: #f4f4f4;
1321
  border-style: solid;
1327
  position: relative;
1328
  width: 100%;
1329
  }
1330
+
1331
  .edd-import-export-form .notice-wrap .spinner {
1332
  margin: 4px 10px 8px;
1333
  float: right;
1334
  }
1335
+
1336
  .admin-color-fresh .edd-import-export-form .edd-progress div {
1337
  background: #0073aa;
1338
  }
1339
+
1340
  .admin-color-light .edd-import-export-form .edd-progress div {
1341
  background: #888;
1342
  }
1343
+
1344
  .admin-color-blue .edd-import-export-form .edd-progress div {
1345
  background: #096484;
1346
  }
1347
+
1348
  .admin-color-coffee .edd-import-export-form .edd-progress div {
1349
  background: #c7a589;
1350
  }
1351
+
1352
  .admin-color-ectoplasm .edd-import-export-form .edd-progress div {
1353
  background: #a3b745;
1354
  }
1355
+
1356
  .admin-color-midnight .edd-import-export-form .edd-progress div {
1357
  background: #e14d43;
1358
  }
1359
+
1360
  .admin-color-sunrise .edd-import-export-form .edd-progress div {
1361
  background: #dd823b;
1362
  }
1363
+
1364
  #edd-graphs-filter label {
1365
  vertical-align: inherit;
1366
  }
1367
+
1368
  #edd-graphs-filter .graph-option-section {
1369
  float: left;
1370
  line-height: 2.5em;
1371
  padding-right: 5px;
1372
  }
1373
+
1374
  .edd-mix-totals {
1375
  background-color: #fff;
1376
  border: 1px solid #e5e5e5;
1377
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
1378
  padding: 10px;
1379
  }
1380
+
1381
  .edd-mix-chart {
1382
  display: inline-block;
1383
  width: 49%;
1384
  vertical-align: top;
1385
  }
1386
+
1387
  .edd-graph-notes {
1388
  color: #9c9c9c;
1389
  }
1390
+
1391
  .edd-graph-notes span {
1392
  display: block;
1393
  }
1394
+
1395
  .edd-pie-graph .legend {
1396
  display: none;
1397
  }
1398
+
1399
  .edd-pie-legend {
1400
  overflow: auto;
1401
  margin-top: 10px;
1402
  }
1403
+
1404
  .edd-legend-item-wrapper {
1405
  color: #333;
1406
  display: inline-block;
1409
  width: 48%;
1410
  height: 20px;
1411
  }
1412
+
1413
  .edd-legend-color {
1414
  border: 1px solid #cfcfcf;
1415
  display: inline-block;
1417
  width: 20px;
1418
  height: 15px;
1419
  }
1420
+
1421
  .edd-pie-legend-item {
1422
  display: inline-block;
1423
  vertical-align: top;
1429
 
1430
  /* Settings page styles
1431
  -------------------------------------------------------------- */
 
 
1432
  [id*="edd-recapture-"].button {
1433
  font-size: 16px;
1434
  height: auto;
1435
  padding: 8px 14px;
1436
  margin: 6px 0 0;
1437
  }
1438
+
1439
  [id*="edd-recapture-"].button .dashicons {
1440
  line-height: 29px;
1441
  margin-right: 8px;
1442
  }
1443
+
 
1444
  [id*="edd-recapture-"].button .edd-loading,
1445
  [id*="edd-recapture-"].button .edd-loading:after {
1446
  border-radius: 50%;
1448
  width: 14px;
1449
  height: 14px;
1450
  }
1451
+
1452
  [id*="edd-recapture-"].button .edd-loading {
1453
  position: relative;
1454
  top: 3px;
1455
  margin-left: 4px;
1456
+ box-shadow: 0 0 2px rgba(0, 0, 0, .2);
1457
  }
1458
+
1459
  [id*="edd-recapture-"].button .edd-loading {
1460
  -webkit-animation: edd-spinning 1.1s infinite linear;
1461
  animation: edd-spinning 1.1s infinite linear;
1468
  -ms-transform: translateZ(0);
1469
  transform: translateZ(0);
1470
  }
1471
+
1472
  #edd-recapture-disconnect.button .edd-loading.dark {
1473
  border-top-color: rgba(0, 0, 0, 0.2);
1474
  border-right-color: rgba(0, 0, 0, 0.2);
1476
  border-left-color: #666;
1477
  box-shadow: none;
1478
  }
1479
+
1480
  .recapture-notice {
1481
  position: relative;
1482
  }
1483
+
1484
  @-webkit-keyframes edd-spinning {
1485
  0% {
1486
  -webkit-transform: rotate(0deg);
1487
  transform: rotate(0deg);
1488
  }
1489
+
1490
  100% {
1491
  -webkit-transform: rotate(360deg);
1492
  transform: rotate(360deg);
1493
  }
1494
  }
1495
+
1496
  @keyframes edd-spinning {
1497
  0% {
1498
  -webkit-transform: rotate(0deg);
1499
  transform: rotate(0deg);
1500
  }
1501
+
1502
  100% {
1503
  -webkit-transform: rotate(360deg);
1504
  transform: rotate(360deg);
1505
  }
1506
  }
1507
+
1508
  #edd_tax_rates {
1509
  margin: 1em 0 0;
1510
  }
1511
+
1512
  #edd_tax_rates .edd_tax_country *,
1513
  #edd_tax_rates .edd_tax_state * {
1514
  max-width: 100%;
1515
  }
1516
+
1517
  #edd_tax_rates .edd_tax_country,
1518
  #edd_tax_rates .edd_tax_state {
1519
  width: 180px;
1520
  }
1521
+
1522
  #edd_tax_rates .edd_tax_rate {
1523
  width: 80px;
1524
  }
1525
+
1526
  #edd_tax_rates th {
1527
  padding: 15px 10px;
1528
  }
1529
+
1530
  .wrap-licenses .form-table,
1531
  .wrap-licenses thead,
1532
  .wrap-licenses tbody,
1537
  .wrap-licenses caption {
1538
  display: block;
1539
  }
1540
+
1541
  .wrap-licenses .form-table tr {
1542
  float: left;
1543
  margin: 0 15px 15px 0;
1550
  position: relative;
1551
  box-sizing: border-box;
1552
  }
1553
+
1554
  .wrap-licenses .form-table th {
1555
  background: #f9f9f9;
1556
  padding: 14px;
1558
  margin: -14px -14px 20px;
1559
  width: 100%;
1560
  }
1561
+
1562
  .wrap-licenses .form-table td {
1563
  padding: 0;
1564
  }
1565
+
1566
  .wrap-licenses td input.regular-text {
1567
  margin: 0 0 8px;
1568
  width: 100%;
1569
  }
1570
+
1571
  .wrap-licenses .edd-license-data[class*="edd-license-"] {
1572
  position: absolute;
1573
  background: #fafafa;
1579
  bottom: 14px;
1580
  box-sizing: border-box;
1581
  }
1582
+
1583
  .wrap-licenses .edd-license-data[class*="edd-license-"] a {
1584
  color: #444;
1585
  }
1586
+
1587
  .wrap-licenses .edd-license-data[class*="edd-license-"] a:hover {
1588
  text-decoration: none;
1589
  }
1590
+
1591
  .wrap-licenses .edd-license-data.license-expires-soon-notice {
1592
  background-color: #00a0d2;
1593
  color: #fff;
1594
  border-color: #00a0d2;
1595
  }
1596
+
1597
  .wrap-licenses .edd-license-data.edd-license-expired {
1598
  background-color: #e24e4e;
1599
  color: #fff;
1600
  border-color: #e24e4e;
1601
  }
1602
+
1603
  .wrap-licenses .edd-license-data.edd-license-error,
1604
  .wrap-licenses .edd-license-data.edd-license-missing,
1605
  .wrap-licenses .edd-license-data.edd-license-invalid,
1608
  background-color: #ffebcd;
1609
  border-color: #ffebcd;
1610
  }
1611
+
1612
  .wrap-licenses .edd-license-data p {
1613
  font-size: 13px;
1614
  margin-top: 0;
1615
  }
1616
+
1617
  .wrap-licenses .edd-license-data.license-expires-soon-notice a,
1618
  .wrap-licenses .edd-license-data.edd-license-expired a {
1619
  color: #fff;
1620
  }
1621
+
1622
  .wrap-licenses .edd-license-data.license-expires-soon-notice a:hover,
1623
  .wrap-licenses .edd-license-data.edd-license-expired a:hover {
1624
  text-decoration: none;
1625
  }
1626
+
1627
  .wrap-licenses p.submit {
1628
  clear: both;
1629
  }
1654
  -------------------------------------------------------------- */
1655
 
1656
  .edd-graph .y1Axis {
1657
+ color: rgb(237, 194, 64) !important;
1658
  }
1659
+
1660
  .edd-graph .y2Axis {
1661
+ color: rgb(175, 216, 248) !important;
1662
  }
1663
 
1664
  /* API Table Styles
1675
  width: 100%;
1676
  max-width: 300px;
1677
  }
1678
+
1679
  .chosen-container-multi .chosen-choices {
1680
  background-image: none;
1681
  border-color: #dfdfdf;
1682
  -webkit-border-radius: 3px;
1683
  border-radius: 3px;
1684
  }
1685
+
1686
  .chosen-container-multi .chosen-choices input {
1687
  border-color: #dfdfdf;
1688
+ height: 27px !important;
1689
+ margin: 2px;
1690
  }
1691
+
1692
  .chosen-container .chosen-drop {
1693
  border-color: #aaa;
1694
  -webkit-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1);
1695
  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1);
1696
  }
1697
+
1698
  .chosen-container .search-field {
1699
+ float: none !important;
1700
  }
1701
+
1702
  .chosen-container .search-field input {
1703
+ width: 90% !important;
1704
  }
1705
+
1706
  .chosen-container-active .chosen-choices {
1707
  border-color: #aaa;
1708
  -webkit-border-top-left-radius: 3px;
1719
  .download_page_edd-tools .tablenav .actions {
1720
  overflow: visible;
1721
  }
1722
+
1723
  .edd_user_search_wrap {
1724
  position: relative;
1725
  overflow: visible;
1726
  }
1727
+
1728
  .edd_user_search_results {
1729
  position: absolute;
1730
  left: 0;
1731
  top: 27px;
1732
  }
1733
+
1734
  .edd_user_search_results a.edd-ajax-user-cancel {
1735
  position: absolute;
1736
  right: 6px;
1737
  top: 2px;
1738
  }
1739
+
1740
  .edd_user_search_results ul {
1741
  background: #f0f0f0;
1742
  border: 1px solid #dfdfdf;
1751
  color: #999;
1752
  }
1753
 
1754
+ @media screen and (max-width: 1100px) {
1755
 
1756
  .edd-mix-chart {
1757
  display: block;
1766
 
1767
  }
1768
 
1769
+ @media screen and (max-width: 782px) {
1770
 
1771
  .post-type-download .nav-tab-wrapper a {
1772
  font-size: 70%;
1773
  padding: 2px 4px;
1774
  }
1775
+
1776
  .download_page_edd-tools .apikeys .column-user {
1777
  width: 80px;
1778
  }
1779
+
1780
  .license-lifetime-notice,
1781
  .license-expiration-date-notice,
1782
  .license-null {
1783
  padding-left: 0;
1784
  }
1785
+
1786
  [class^="license-"] input[type="text"] {
1787
  margin-bottom: 3px;
1788
  }
1789
 
1790
  }
1791
 
1792
+ @media screen and (max-width: 600px) {
1793
  .wrap-licenses .form-table tr {
1794
  width: 100%;
1795
  min-height: 230px;
1806
  #edd-item-wrapper {
1807
  background: #f5f5f5;
1808
  border: 1px solid #e5e5e5;
1809
+ webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
1810
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
1811
  max-width: 830px;
1812
  }
1813
+
1814
  #edd-item-wrapper:after {
1815
  content: "";
1816
  display: block;
1819
  font-size: 0;
1820
  height: 0;
1821
  }
1822
+
1823
  #edd-item-tab-wrapper {
1824
+ float: left;
1825
  width: 18%;
1826
  z-index: 1;
1827
  }
1828
+
1829
  #edd-item-tab-wrapper-list {
1830
  background: #fff;
1831
  margin: 0;
1832
  }
1833
+
1834
  #edd-item-tab-wrapper-list li {
1835
  display: block;
1836
  background-color: #eaeaea;
1844
  hyphens: auto;
1845
  word-wrap: break-word;
1846
  }
1847
+
1848
  #edd-item-tab-wrapper-list li a {
1849
  display: block;
1850
  padding: 8px 10px 8px 6px;
1851
  }
1852
+
1853
  #edd-item-tab-wrapper-list li.active {
1854
  display: block;
1855
  background-color: #fff;
1856
  padding: 8px 10px 8px 6px;
1857
  }
1858
+
1859
  #edd-item-tab-wrapper-list .inactive a,
1860
  #edd-item-tab-wrapper-list .inactive a:visited {
1861
  background-color: #f5f5f5;
1862
  color: #444;
1863
  text-decoration: none;
1864
  }
1865
+
1866
  #edd-item-tab-wrapper-list .inactive a:hover {
1867
  background-color: #fff;
1868
  }
1869
+
1870
  #edd-item-tab-wrapper-list .dashicons {
1871
  color: #444;
1872
  font-size: 16px;
1873
  min-width: 24px;
1874
  height: auto;
1875
  }
1876
+
1877
  #edd-item-card-wrapper .left {
1878
  float: left;
1879
  }
1880
+
1881
  #edd-item-card-wrapper .right {
1882
  float: right;
1883
  }
1884
+
1885
  #edd-item-card-wrapper input {
1886
  font-weight: normal;
1887
  }
1888
+
1889
  #edd-item-card-wrapper {
1890
  background-color: #fff;
1891
  border: 1px solid #e5e5e5;
1895
  width: 700px;
1896
  z-index: 2;
1897
  }
1898
+
1899
  .edd-item-has-tabs #edd-item-card-wrapper {
1900
  border-width: 0 0 0 1px;
1901
  width: 82%;
1902
  }
1903
+
1904
  #edd-item-card-wrapper .customer-section {
1905
  border-bottom: 1px solid #eee;
1906
  margin-bottom: 10px;
1907
  overflow: auto;
1908
  }
1909
+
1910
  #edd-item-card-wrapper .customer-section table {
1911
  margin-bottom: 20px;
1912
  }
1913
+
1914
+ #edd-item-card-wrapper>div {
1915
  padding: 0px 20px;
1916
  }
1917
+
1918
+ #edd-item-card-wrapper>div:first-child {
1919
  padding-top: 20px;
1920
  }
1921
+
1922
+ #edd-item-card-wrapper>div:last-child {
1923
  border: none;
1924
  padding-bottom: 20px;
1925
  }
1926
+
1927
  #edd-item-card-wrapper .avatar-wrap {
1928
  padding-right: 10px;
1929
  text-align: center;
1930
  }
1931
+
1932
  #edd-item-card-wrapper .customer-id {
1933
  font-size: 24px;
1934
  font-weight: 600;
1935
  }
1936
+
1937
  #edd-item-card-wrapper .customer-main-wrapper input {
1938
  width: 200px;
1939
  }
1940
+
1941
  #edd-item-card-wrapper .customer-address-wrapper {
1942
  margin-right: 25px;
1943
  max-width: 33%;
1944
  width: 202px;
1945
  }
1946
+
1947
  #edd-item-card-wrapper .customer-address-wrapper select {
1948
  width: 200px;
1949
  }
1950
+
1951
  #edd-item-card-wrapper .customer-info {
1952
  margin-top: 5px;
1953
  margin-bottom: 10px;
1954
  min-height: 185px;
1955
  }
1956
+
1957
  #edd-item-card-wrapper .info-wrapper {
1958
  min-height: 125px;
1959
  overflow: visible;
1960
  }
1961
+
1962
  #edd-item-card-wrapper a.delete {
1963
  color: #ff0000;
1964
  margin-right: 5px;
1965
  text-decoration: none;
1966
  }
1967
+
1968
  .customer-info .customer-name {
1969
  font-size: 24px;
1970
  font-weight: 600;
1971
  }
1972
+
1973
  .customer-edit-link a,
1974
  .disconnect-user a {
1975
  font-size: 12px;
1976
  font-weight: normal;
1977
  text-decoration: none;
1978
  }
1979
+
1980
  #customer-edit-actions {
1981
  line-height: 28px;
1982
  margin-bottom: 20px;
1983
  text-align: center;
1984
  }
1985
+
1986
  #customer-edit-actions .button-secondary {
1987
  margin-right: 10px;
1988
  }
1989
+
1990
  #edd-item-card-wrapper .row-title {
1991
  width: 30%;
1992
  }
1993
+
1994
  #edd-item-card-wrapper .info-item {
1995
  display: block;
1996
  line-height: 16px;
1997
  padding-bottom: 5px;
1998
  }
1999
+
2000
  #edd-item-card-wrapper .edit-item {
2001
  display: none;
2002
  }
2003
+
2004
  #edd-item-card-wrapper .edd_user_search_results {
2005
  left: 1px;
2006
  top: 16px;
2007
  }
2008
+
2009
  #edd-item-card-wrapper .edd_user_search_results ul {
2010
  width: 200px;
2011
  }
2012
+
2013
  #edd-item-stats-wrapper {
2014
  margin: 0 auto;
2015
  min-height: 30px;
2016
  text-align: center;
2017
  }
2018
+
2019
  #edd-item-stats-wrapper li {
2020
  font-size: 14px;
2021
  float: left;
2022
  line-height: 22px;
2023
  width: 50%;
2024
  }
2025
+
2026
  #edd-item-stats-wrapper a {
2027
  text-decoration: none;
2028
  }
2029
+
2030
  #edd-item-stats-wrapper .dashicons {
2031
  color: #888;
2032
  }
2033
+
2034
  #edd-item-tables-wrapper table {
2035
  text-align: center;
2036
  width: 100%;
2037
  }
2038
+
2039
  #edd-item-tables-wrapper th {
2040
  text-align: center;
2041
  }
2042
+
2043
+ #edd-item-tables-wrapper .downloads tr>th:first-child,
2044
+ #edd-item-tables-wrapper .downloads tr>td:first-child,
2045
+ #edd-item-tables-wrapper .emails tr>th:first-child,
2046
+ #edd-item-tables-wrapper .emails tr>td:first-child {
2047
  text-align: left;
2048
  }
2049
+
2050
+ #edd-item-tables-wrapper .downloads tr>td:only-child {
2051
  text-align: center;
2052
  }
2053
+
2054
  #edd-item-tables-wrapper .emails .add-customer-email-row td {
2055
  background-color: #f9f9f9;
2056
  border-top: 1px solid #e5e5e5;
2057
  }
2058
+
2059
  #edd-item-tables-wrapper .emails .primary-email-icon {
2060
  font-size: 13px;
2061
  vertical-align: middle;
2062
  line-height: 1.5em;
2063
  }
2064
+
2065
  #edd-item-tables-wrapper .emails input {
2066
  vertical-align: middle;
2067
  margin: 6px 0;
2068
  }
2069
+
2070
  #edd-item-tables-wrapper .emails .spinner {
2071
  float: none;
2072
  }
2073
+
2074
  #edd-item-notes-wrapper {
2075
  min-height: 50px;
2076
  }
2077
+
2078
  .edd-item-notes-header span,
2079
  .edd-item-notes-header img {
2080
  font-weight: 600;
2081
  line-height: 30px;
2082
  vertical-align: middle;
2083
  }
2084
+
2085
  .customer-note-input {
2086
  margin-bottom: 5px;
2087
  width: 100%;
2088
  }
2089
+
2090
  #edd-customer-notes div:nth-of-type(even) {
2091
  background-color: #fcfcfc;
2092
  }
2093
+
2094
  .customer-note-wrapper {
2095
  border-bottom: 1px solid #f9f9f9;
2096
  min-height: 38px;
2097
  padding: 7px 0 7px 7px;
2098
  }
2099
+
2100
  .customer-note-wrapper span {
2101
  display: block;
2102
  }
2103
+
2104
  .note-content-wrap {
2105
  padding-top: 7px;
2106
  }
2107
+
2108
  .delete-customer {
2109
  text-align: center;
2110
  }
2111
+
2112
  #edd-item-card-wrapper .notice-container {
2113
  padding-left: 20px;
2114
  padding-right: 20px;
2115
  margin-left: -20px;
2116
  margin-right: -20px;
2117
  }
2118
+
2119
+ #edd-item-card-wrapper .add-customer-email-wrapper>#add-customer-email {
2120
  vertical-align: middle;
2121
  }
2122
 
2123
+ @media screen and (max-width: 810px) and (min-width: 656px) {
2124
  .customer-info .customer-name {
2125
  font-size: 16px;
2126
  }
2127
+
2128
+ #edd-item-card-wrapper .widefat td,
2129
+ .widefat th {
2130
  padding: 4px 6px;
2131
+ max-width: 100px !important;
2132
  display: table-cell;
2133
  }
2134
  }
2135
+
2136
+ @media screen and (max-width: 781px) {
2137
+
2138
  #edd-item-tab-wrapper,
2139
  #edd-item-card-wrapper {
2140
  margin: 0;
2141
  width: 100%;
2142
  }
2143
+
2144
  #edd-item-tab-wrapper-list {
2145
  background: #fff;
2146
  margin: 0;
2147
  }
2148
+
2149
  #edd-item-tab-wrapper-list li {
2150
  float: left;
2151
  display: inline;
2156
  border-color: #e5e5e5;
2157
  width: 33.33333%;
2158
  }
2159
+
2160
  #edd-item-tab-wrapper-list li:nth-child(3n+3) {
2161
  border-width: 0 0 1px 0;
2162
  }
2163
+
2164
  #edd-item-tab-wrapper-list .dashicons {
2165
  font-size: 18px;
2166
  }
2167
+
2168
+ .edd-item-has-tabs #edd-item-card-wrapper {
2169
  border-top: 1px solid #e5e5e5;
2170
  border-left: 0;
2171
  margin-top: -1px;
2172
  width: 100%;
2173
  }
2174
  }
2175
+
2176
+ @media screen and (max-width: 656px) {
2177
  #edd-item-card-wrapper .customer-info {
2178
  min-height: 220px;
2179
  }
2180
+
2181
  .edd-item-info.customer-info {
2182
  position: relative;
2183
  }
2184
+
2185
  #edd-item-card-wrapper .customer-address-wrapper {
2186
  float: none;
2187
  position: absolute;
2189
  left: 110px;
2190
  max-width: 200px;
2191
  }
2192
+
2193
  #edd-item-card-wrapper .customer-main-wrapper {
2194
  float: none;
2195
  position: absolute;
2196
  left: 110px;
2197
  }
2198
+
2199
  .customer-info .customer-name {
2200
  font-size: 16px;
2201
  }
2202
+
2203
  #edd-item-card-wrapper #edd-item-stats-wrapper {
2204
  padding-left: 0;
2205
  padding-right: 0;
2206
  }
2207
+
2208
  #edd-item-card-wrapper .customer-section {
2209
  margin-bottom: 0;
2210
  }
2211
+
2212
  #edd-item-card-wrapper .widefat td,
2213
  #edd-item-card-wrapper .widefat th {
2214
  padding: 4px 6px;
2215
+ max-width: 100px !important;
2216
  display: table-cell;
2217
  overflow: hidden;
2218
  }
2219
+
2220
  #edd-item-card-wrapper .customer-id {
2221
  font-size: 16px;
2222
  }
2223
  }
2224
+
2225
+ @media screen and (max-width: 480px) {
2226
  #edd-item-tab-wrapper-list li {
2227
  width: 50%;
2228
  }
2229
+
2230
  #edd-item-tab-wrapper-list li:nth-child(3n+3) {
2231
  border-width: 0 1px 1px 0;
2232
  }
2233
+
2234
  #edd-item-tab-wrapper-list li:nth-child(even) {
2235
  border-width: 0 0 1px 0;
2236
  }
2237
+
2238
  .edd-repeatable-row-title,
2239
  .edd-repeatable-row-actions {
2240
  text-align: left;
2241
  width: 100%;
2242
  }
2243
+
2244
  .edd-repeatable-row-title {
2245
  padding-bottom: 0;
2246
  }
2247
+
2248
  .edd-option-name,
2249
  .edd-option-price,
2250
  .edd_repeatable_default,
2259
  width: 100% !important;
2260
  margin: 10px 0;
2261
  }
2262
+
2263
  .edd-bundled-product-row .edd-bundled-product-actions {
2264
  float: none;
2265
  }
2266
+
2267
  .edd-bundled-product-row .edd-bundled-product-item-reorder .edd-product-file-reorder {
2268
  padding: 0;
2269
  }
2281
  #edd-payment-date-filters span {
2282
  display: block;
2283
  }
2284
+
2285
+ #edd-payment-date-filters span>input {
2286
  float: right;
2287
  }
2288
 
2330
  .recount-stats-controls form {
2331
  display: inline;
2332
  }
2333
+
2334
  .edd-recount-stats-descriptions span {
2335
  display: none;
2336
  line-height: 24px;
2337
  }
2338
 
2339
  #edd-debug-log p.submit {
2340
+ margin: 20px 0 0;
2341
  padding: 0;
2342
  }
2343
 
2465
  }
2466
 
2467
  /* Settings sidebar responsive behavior */
2468
+ @media all and (min-width: 1080px) {
2469
 
2470
  .edd-has-sidebar .edd-settings-content {
2471
  float: left;
2478
  }
2479
  }
2480
 
2481
+ @media all and (min-width: 1240px) {
2482
 
2483
  .edd-has-sidebar .edd-settings-content {
2484
  width: 74%;
2531
  background: #2d6ca2;
2532
  display: none;
2533
  }
2534
+
2535
+ @media screen and (min-width: 783px) {
2536
  .edd-admin-notice-top-of-page {
2537
  padding: 10px 46px 10px 22px;
2538
  }
2539
  }
2540
+
2541
+ @media screen and (min-width: 961px) {
2542
  .edd-admin-notice-top-of-page {
2543
  text-align: center;
2544
  }
2545
  }
2546
+
2547
  .edd-admin-notice-top-of-page a {
2548
  color: #fff;
2549
  }
2550
+
2551
  .edd-admin-notice-top-of-page a:hover {
2552
  text-decoration: none;
2553
  }
2554
+
2555
  .edd-admin-notice-top-of-page .button-link {
2556
  position: absolute;
2557
  top: 48px;
2563
  margin-left: 5px;
2564
  padding: 6px 10px;
2565
  }
2566
+
2567
  .edd-admin-notice-top-of-page .button-link:hover,
2568
  .edd-admin-notice-top-of-page .button-link:active,
2569
  .edd-admin-notice-top-of-page .button-link:focus {
2570
  color: #fff;
2571
  text-decoration: none;
2572
  }
2573
+
2574
+ @media screen and (min-width: 601px) {
2575
  .edd-admin-notice-top-of-page .button-link {
2576
  top: 1px;
2577
  }
2578
  }
2579
+
2580
+ @media screen and (min-width: 783px) {
2581
  .edd-admin-notice-top-of-page .button-link {
2582
  right: 9px;
2583
  }
2588
  .edd-paypal-account-status ul {
2589
  margin-left: 25px;
2590
  }
2591
+
2592
+ .edd-paypal-account-status>li {
2593
  margin-bottom: 1em;
2594
  }
2595
+
2596
  .edd-paypal-account-status ul:not(.edd-paypal-webhook-events) {
2597
  list-style: disc;
2598
  list-style-position: inside;
2599
  }
2600
+
2601
  .edd-paypal-account-status ul:not(.edd-paypal-webhook-events) li {
2602
  margin: .25em 0;
2603
  }
2604
+
2605
  .edd-paypal-account-status .dashicons-yes {
2606
  color: #008a20;
2607
  }
2608
+
2609
  .edd-paypal-account-status .dashicons-no {
2610
  color: #d63638;
2611
  }
2612
+ /* Five Star Review Request
2613
+ ------------------------------------------------------------- */
2614
+ #edd-admin-notice-five-star-review {
2615
+ display: grid;
2616
+ }
2617
+
2618
+ #edd_dashboard_sales .edd-promo-notice {
2619
+ border-bottom: 1px solid #c3c4c7;
2620
+ }
2621
+
2622
+ .edd-review-actions {
2623
+ display: flex;
2624
+ gap: 6px;
2625
+ margin: 0 0 16px 0;
2626
+ }
2627
+
2628
+ .edd-promo-notice .edd-peeking {
2629
+ align-self: flex-end;
2630
+ justify-self: flex-end;
2631
+ margin-right: 16px;
2632
+ margin-bottom: -1px;
2633
+ }
2634
+
2635
+ @media screen and (max-width: 782px) {
2636
+ #edd-admin-notice-five-star-review.notice .edd-peeking {
2637
+ margin-bottom: -6px;
2638
+ }
2639
+ }
2640
+
2641
+ @media screen and (min-width: 400px) {
2642
+ .edd-promo-notice .edd-peeking {
2643
+ justify-self: flex-start;
2644
+ margin-right: 0;
2645
+ margin-left: 200px;
2646
+ }
2647
+ }
2648
+
2649
+ .edd-review-step,
2650
+ .edd-promo-notice .edd-peeking {
2651
+ grid-area: 1/-1;
2652
+ }
2653
+
2654
+ /* Notifications
2655
+ -------------------------------------------------------------- */
2656
+ .edd-overlay {
2657
+ position: fixed;
2658
+ z-index: 1052;
2659
+ top: 0;
2660
+ right: 0;
2661
+ bottom: 0;
2662
+ left: 160px;
2663
+ background-color: #141b38;
2664
+ opacity: .5;
2665
+ transition: .5s;
2666
+ }
2667
+
2668
+ .edd-slide-in {
2669
+ transform: translateX(100%) !important;
2670
+ -webkit-transform: translateX(100%) !important;
2671
+ }
2672
+
2673
+ #edd-notifications-panel {
2674
+ background-color: white;
2675
+ height: 100%;
2676
+ width: 100%;
2677
+ max-width: 570px;
2678
+ position: fixed;
2679
+ z-index: 1053;
2680
+ top: 0;
2681
+ right: 0;
2682
+ bottom: 0;
2683
+ overflow-x: hidden;
2684
+ transition: .5s;
2685
+
2686
+ transform: translateX(0%);
2687
+ -webkit-transform: translateX(0%);
2688
+ }
2689
+ body.admin-bar #edd-notifications-panel {
2690
+ top: 32px;
2691
+ }
2692
+ @media screen and (max-width: 600px) {
2693
+ body.admin-bar #edd-notifications-panel {
2694
+ top: 46px;
2695
+ }
2696
+ }
2697
+
2698
+ #edd-notifications-header {
2699
+ display: flex;
2700
+ align-items: center;
2701
+ padding: 0 30px;
2702
+ color: #fff;
2703
+ background-color: #0c5d95;
2704
+ }
2705
+ #edd-notifications-header h3 {
2706
+ color: #fff;
2707
+ flex: 1;
2708
+ }
2709
+ #edd-notifications-header .edd-close {
2710
+ background: none;
2711
+ border: none;
2712
+ color: #fff;
2713
+ cursor: pointer;
2714
+ }
2715
+
2716
+ #edd-notifications-body {
2717
+ padding: 30px;
2718
+ }
2719
+
2720
+ .edd-notification {
2721
+ display: flex;
2722
+ gap: 20px;
2723
+ margin-bottom: 20px;
2724
+ }
2725
+ .edd-notification--icon {
2726
+ color: #00aa63;
2727
+ }
2728
+ .edd-notification--icon.edd-notification--icon-info {
2729
+ color: #005ae0;
2730
+ }
2731
+ .edd-notification--icon.edd-notification--icon-warning {
2732
+ color: #f18200;
2733
+ }
2734
+ .edd-notification--icon.edd-notification--icon-error {
2735
+ color: #df2a4a;
2736
+ }
2737
+ .edd-notification--body {
2738
+ flex: 1;
2739
+ }
2740
+ .edd-notification--header {
2741
+ align-items: center;
2742
+ display: flex;
2743
+ justify-content: space-between;
2744
+ gap: 5px;
2745
+ margin-bottom: 7px;
2746
+ }
2747
+ .edd-notification--title {
2748
+ color: #141b38;
2749
+ flex: 1;
2750
+ font-size: 16px;
2751
+ font-weight: 600;
2752
+ margin: 0;
2753
+ }
2754
+ .edd-notification--date {
2755
+ color: #71747e;
2756
+ font-size: 12px;
2757
+ }
2758
+ .edd-notification--actions {
2759
+ flex-wrap: wrap;
2760
+ display: flex;
2761
+ align-items: center;
2762
+ gap: 5px;
2763
+ margin-top: 10px;
2764
+ }
2765
+ .edd-notification--dismiss {
2766
+ background: none !important;
2767
+ border: none !important;
2768
+ box-shadow: none !important;
2769
+ color: #71747e !important;
2770
+ cursor: pointer;
2771
+ padding: 0 10px;
2772
+ text-decoration: underline;
2773
+ }
2774
+ .edd-notification--dismiss:hover {
2775
+ text-decoration: none;
2776
+ }
assets/css/edd-admin.min.css CHANGED
@@ -1 +1 @@
1
- .edd-hidden{display:none}.edd-clearfix:after{content:".";display:block;height:0;text-indent:-9999px;visibility:hidden}.edd-notice .notice-dismiss,.edd-wrap a{text-decoration:none}a.edd-delete{color:#a00}a.edd-delete:hover{color:red}body.post-type-download #contextual-help-link-wrap,body.post-type-download #screen-options-link-wrap{top:5px!important}body.post-type-download #screen-meta{margin:0 0 -1px -20px}#edd-header{border-top:5px solid #0c5d95;border-bottom:1px solid #c3c4c7;padding:22px 0;margin-left:-20px;background:#fff}#edd-header img{display:block;margin:0;max-width:300px;margin-left:20px}.edd-settings-sub-nav{margin:0 0 10px 0;width:100%;border-bottom:1px solid #ccc;box-shadow:0 1px 1px rgba(0,0,0,.04)}.edd-settings-sub-nav a{padding:13px;display:block}.edd-settings-sub-nav a.current{border-bottom:4px solid #000;padding-bottom:9px}.admin-color-fresh .edd-settings-sub-nav a.current{border-bottom-color:#00a0d2}.admin-color-blue .edd-settings-sub-nav a.current{border-bottom-color:#096484}.admin-color-coffee .edd-settings-sub-nav a.current{border-bottom-color:#c7a589}.admin-color-ectoplasm .edd-settings-sub-nav a.current{border-bottom-color:#a3b745}.admin-color-midnight .edd-settings-sub-nav a.current{border-bottom-color:#e14d43}.admin-color-ocean .edd-settings-sub-nav a.current{border-bottom-color:#627c83}.admin-color-sunrise .edd-settings-sub-nav a.current{border-bottom-color:#be3631}.admin-color-light .edd-settings-sub-nav a.current{border-bottom-color:#888}.admin-color-evergreen .edd-settings-sub-nav a.current{border-bottom-color:#36533f}.admin-color-mint .edd-settings-sub-nav a.current{border-bottom-color:#4f6d59}.admin-color-modern .edd-settings-sub-nav a.current{border-bottom-color:#3858e9}.download_page_edd-settings .form-table label{color:#666;font-size:14px;font-style:italic;margin:4px 0 0}.download_page_edd-settings .form-table input.small-text~label,.download_page_edd-settings .form-table input[type=checkbox]+label{display:inline}.download_page_edd-settings .form-table tr>th>h3,.download_page_edd-settings .form-table tr>th>strong{font-size:1.2em;font-weight:600;margin:0 auto}.edd-help-tip{cursor:help}.edd-ui-tooltip{position:absolute;background:#333!important;border-width:1px!important;border-radius:3px!important;box-shadow:1px 1px 2px 1px rgba(214,214,214,.5)!important;color:#dedede!important;max-width:300px!important;padding:7px!important;text-rendering:optimizeLegibility;text-shadow:none!important;z-index:9999!important}.download_page_edd-settings .edd-settings-payment-icon-wrapper{margin-right:10px;line-height:16px;height:16px;display:table}#edd-add-ons h2.nav-tab-wrapper{position:relative}.edd-tab-span{top:-6px;right:0;position:absolute}.edd-add-ons-footer{padding-top:10px}#edd-add-ons h2{margin:0 0 15px}.edd-add-ons-view-wrapper{height:50px}#edd-add-ons h2 .button-primary{position:absolute}#edd-add-ons .edd-extension{background:#fff;border:1px solid #ccc;float:left;padding:14px;position:relative;margin:0 15px 15px 0;width:320px;height:315px}#edd-add-ons .edd-extension h3{font-size:13px;margin:0 0 8px}#edd-add-ons .edd-extension .button-secondary{position:absolute;bottom:14px;left:14px}#edd-add-ons .edd-browse-all{clear:both;width:100%}#edd-add-ons .edd-extension .third-party{display:none}#edd-add-ons .edd-starter-package{background-color:#85c0e5;border-color:#62a9d7;color:#fff}#edd-add-ons .edd-starter-package h3{color:#fff}#edd-add-ons .edd-extension .wp-post-image{width:100%;height:auto;vertical-align:bottom}#edd-products{height:100px;min-width:200px}#edd-add-discount input[type=text],#edd-edit-discount input[type=text]{width:300px}#edd-add-discount input.edd-price-field,#edd-edit-discount input.edd-price-field{padding:3px 5px;width:75px}#edd-payment-filters{background:#f5f5f5;clear:both;background-image:-webkit-gradient(linear,left bottom,left top,from(#f5f5f5),to(#fafafa));background-image:-webkit-linear-gradient(bottom,#f5f5f5,#fafafa);background-image:-moz-linear-gradient(bottom,#f5f5f5,#fafafa);background-image:-o-linear-gradient(bottom,#f5f5f5,#fafafa);background-image:linear-gradient(to top,#f5f5f5,#fafafa);border-color:#dfdfdf;border-width:1px;border-style:solid;border-radius:3px;font-size:13px;line-height:2.1em;overflow:auto;padding:12px;margin:8px 0}#edd-payments-filter ul.subsubsub{margin-bottom:8px}#edd-payment-filters p{color:#777}#edd-payment-date-filters input{vertical-align:middle}tr.status-refunded td{background:#cecece;border-top-color:#ccc}.wp-list-table.downloads th#ID{width:80px}.wp-list-table.downloads th#details{width:130px}.wp-list-table.downloads th#date{width:140px}.wp-list-table.downloads th#user{width:130px}.edd-mobile-link{line-height:32px;vertical-align:middle}.edd-mobile-link img{max-width:80%;height:auto;float:left}@media handheld,only screen and (max-width:640px){.wp-list-table.downloads th{width:auto!important}}.download_page_edd-payment-history .ui-dialog .ui-dialog-titlebar-close span{margin-left:-8px;margin-top:-8px}#edd-download-link-textarea{width:100%}.edd_files_name_label{width:225px;float:left}.edd_files_url_label{width:220px;float:left}#postbox-container-1 .edd_files_name_label{width:80px}#postbox-container-1 .edd_files_url_label{width:80px}.edd-add-repeatable-row{margin:10px 0}.edd-add-repeatable-row .submit{padding:0!important}.edd_repeatable_upload_wrapper:not(:first-child),.edd_variable_prices_wrapper:not(:first-child){margin-top:12px}.edd-repeatable-row-actions{color:#777;font-size:12px}.edd-repeatable-row-actions a{text-decoration:none;width:auto;cursor:pointer;vertical-align:middle}.edd-repeatable-row-actions .toggle-custom-price-option-section{color:#777}.edd-repeatable-row-actions .toggle-custom-price-option-section:hover{color:#444}.edd-bundle-products-header,.edd-repeatable-row-header{clear:both;background:#f1f1f1;border:1px solid #e5e5e5}.edd-repeatable-row-header{cursor:move}.edd-bundled-product-row:after,.edd-bundled-product-row:before,.edd-repeatable-row-header:after,.edd-repeatable-row-header:before{content:'';display:table}.edd-bundled-product-row:after,.edd-repeatable-row-header:after{clear:both}.edd-repeatable-row-title{float:left;font-weight:600}.edd-bundled-product-item-reorder .edd-product-file-reorder{color:#e5e5e5;font-family:dashicons;content:"\f545";font-size:18px;font-weight:300;margin-left:4px;vertical-align:top;transition:.2s color}.edd-bundled-product-item-reorder .edd-product-file-reorder:hover{color:#bbb}.edd-repeatable-row-actions,.edd-repeatable-row-title{padding:8px;box-sizing:border-box}.edd-repeatable-row-actions{float:right;text-align:right;padding:8px}.edd-bundled-product-row .edd-remove-row,.edd-repeatable-row-actions .edd-remove-row{font-size:12px;width:auto;cursor:pointer}.edd-bundled-product-row,.edd-repeatable-row-standard-fields{background:#f9f9f9;padding:8px;border-width:0 1px 1px;border-style:solid;border-color:#e5e5e5}.edd-repeatable-row-setting-label{display:block;margin-bottom:4px}.edd-repeatable-row-setting-label .edd-help-tip{display:inline-block;margin-left:4px}.edd-bundled-product-row .edd-bundled-product-actions,.edd-bundled-product-row .edd-bundled-product-item,.edd-bundled-product-row .edd-bundled-product-item-reorder,.edd-bundled-product-row .edd-bundled-product-price-assignment,.edd-file-assignment,.edd-file-name,.edd-file-url,.edd-option-name,.edd-option-price,.edd_repeatable_default{display:inline-block;vertical-align:top}.edd-option-name{width:38%;margin-right:5%}.edd-option-price{min-width:100px}.edd_repeatable_default{text-align:center;min-width:80px}.edd-file-name{width:18%;margin-right:3%}.edd-file-url{width:65%}.edd-repeatable-row-standard-fields.has-variable-pricing .edd-file-url{width:38%;margin-right:5%}.edd-file-assignment{width:27%}.edd-file-assignment .edd-repeatable-row-setting-label{margin-bottom:0}.edd-custom-price-option-sections-wrap{display:none;border-width:0 1px 1px;border-style:solid;border-color:#e5e5e5;box-sizing:border-box;width:100%}.edd-custom-price-option-section{display:block;padding:10px 8px;border-bottom:1px solid rgba(222,222,222,.3)}.edd-custom-price-option-section:last-child{border-bottom:none}label.edd_prices_shipping{display:none!important}.edd-custom-price-option-section-title{display:block;font-size:14px;font-weight:600;padding:0 0 10px}.edd-custom-price-option-section>:not(.edd-custom-price-option-section-title){display:inline-block;padding-right:20px;vertical-align:top;margin-bottom:4px}.edd-custom-price-option-section>:not(.edd-custom-price-option-section-title) label{display:block;margin-bottom:2px}.edd-bundle-products-header{font-weight:600;padding:8px}.edd-bundled-product-row .edd-bundled-product-item-reorder{min-width:30px;margin-right:8px}.edd-bundled-product-row .edd-bundled-product-item-reorder .edd-product-file-reorder{font-size:20px;font-weight:300;padding:16px 4px 0;cursor:move}.edd-bundled-product-row .edd-bundled-product-item{width:60%;margin-right:3%}.edd-bundled-product-row.has-variable-pricing .edd-bundled-product-item{width:47%}.edd-bundled-product-row .edd-bundled-product-price-assignment{width:23%;margin-right:3%}.edd-bundled-product-row .edd-bundled-product-actions{float:right}.edd_repeatable_upload_wrapper .edd_repeatable_upload_field_container{position:relative}.edd_upload_file{background:#fff;display:block;padding:2px 8px 2px;position:absolute;top:3px;right:7px}.edd_upload_field{padding-right:8em!important}textarea#edd-payment-note{width:100%;height:4em;margin:0}#edd-purchased-files .row .edd-purchased-files-list-wrapper .download{line-height:1.4}#edd-purchased-files .edd-purchased-files-list-wrapper .edd-purchased-option{color:#666}input[class*=edd-price-field]{padding:3px 5px;width:75px}#edd-order-download-quantity[type=number].small-text,#edd-order-download-tax[type=text].small-text,[class*=item_] [class*=edd-payment-details-download-][type=number].small-text{height:25px}#edd-order-download-quantity[type=number].small-text,.item_price .edd-payment-details-download-quantity[type=number].small-text{width:55px}#edd-order-download-tax[type=text].small-text,.item_tax .edd-payment-details-download-item-tax[type=number].small-text{width:75px}.edd_repeatable_product_wrapper .edd-select,.edd_repeatable_upload_wrapper .pricing select{min-width:100%}#edd_product_notes_field{display:block;margin:12px 0 0;height:4em;width:100%}.edd_remove_repeatable{border:none;cursor:pointer;display:inline-block;padding:0;overflow:hidden;margin:8px 0 0 0;text-indent:-9999px;width:10px;height:10px}.edd_remove_repeatable:active,.edd_remove_repeatable:focus,.edd_remove_repeatable:hover{background-position:-10px 0!important}#edd-edit-order-form .column{width:32%}.edd-edit-purchase-element[class*=columns-] ul li{padding-right:1%}#edd-edit-order-form .column:nth-child(2n+1),#edd-edit-order-form .columns-4 .column:nth-child(2n+1),#edd-edit-order-form .columns-5 .column:nth-child(3n+1){margin-right:0}#edd-edit-order-form input.large-text{width:90%}.edd-edit-purchase-element ul li.download{width:35%}.edd-edit-purchase-element ul li.item_price{width:15%}.edd-edit-purchase-element ul li.item_price.item_quantity{width:25%}.edd-edit-purchase-element ul li.item_tax{width:15%}.edd-edit-purchase-element ul li.price{width:20%}.edd-admin-box .label{font-weight:600}.edd-admin-box-inside{border-bottom:1px solid #eee;clear:both;padding:3px 12px;margin:0;word-break:break-word}.rtl .edd-admin-box-inside{padding:5px 10px 5px 0}.edd-admin-box-inside .strong{font-weight:600}.edd-payment-fees .fee-label{color:#666;font-weight:400}.edd-admin-box .right{float:right}.rtl .edd-admin-box .right{float:left;margin-left:10px}#edd-order-details .inside,#edd-order-update .inside{margin:0;padding:0}#edd-order-update input.edd_datepicker{width:180px}#edd-order-update input[type=number].edd-payment-time-hour,#edd-order-update input[type=number].edd-payment-time-min{width:50px}#edd-order-update .edd-tax-rate{color:#9c9c9c;font-style:italic}#edd-order-resend-receipt .inside{margin-top:11px}#edd-order-resend-receipt .edd-order-resend-receipt-addresses{margin-top:10px}.edd-admin-box-inside:last-child{border-bottom:0}#edd-edit-order-form .data-payment-key{word-break:break-all}.edd-order-update-box #major-publishing-actions .button-secondary{margin-right:10px}.edd-edit-purchase-element .edd-select-chosen{width:196px}#edd-customer-details .order-data-address input,#edd-customer-details .order-data-column p.data input,#edd-edit-order-form .column input,#edd-order-address-country-wrap select,.edd-edit-purchase-element ul{clear:both;display:block}#edd-customer-details .customer-info .column{width:49%}#edd-customer-details .actions{float:right}.edd-order-data input.small-text{margin:0}.edd-order-data input.med-text{margin:0;width:100px}#edd-order-update span.label{display:inline;width:50px}.edd-order-update-box .button-primary{margin-right:0}#edd-edit-order-form .column .description{padding-right:10px}#edd-edit-order-form .column,.edd-edit-purchase-element ul li{display:inline-block;line-height:1.4;position:relative;margin:0;vertical-align:middle}.edd-edit-purchase-element .row{padding:12px}.edd-edit-purchase-element .row:not(:last-child){border-bottom:1px solid #eee}.edd-edit-purchase-element .row:nth-child(odd):not(.header){background-color:#f9f9f9}.edd-edit-purchase-element .row.header{padding:6px 12px;font-weight:600;vertical-align:top}.edd-edit-purchase-element ul{font-size:0}.edd-edit-purchase-element ul li{font-size:13px}#edd-order-data .data span{color:#666;font-weight:600}.edd-edit-purchase-element .inside{padding:12px}.edd-edit-purchase-element .edd-purchased-download-title{font-size:14px;font-weight:500}.edd-edit-purchase-element .edd-purchased-download-title .deleted{color:#777}.edd-edit-purchase-element .edd-purchased-download-actions{color:#777;line-height:1.4}.edd-edit-purchase-element .edd-purchased-download-actions .edd-purchased-download-actions-label{font-weight:500}.edd-edit-purchase-element .edd-purchased-download-actions a{color:#777;font-size:12px}.edd-edit-purchase-element .edd-purchased-download-actions a:hover{color:#444}.edd-edit-purchase-element .edd-purchased-download-actions .edd-order-remove-download{color:#a00}.edd-edit-purchase-element .edd-purchased-download-actions .edd-order-remove-download:hover{color:red}#edd-order-recalc-total{float:right}#edd_products .edd-select,.edd_repeatable_product_wrapper .edd-select,.edd_repeatable_upload_wrapper .pricing select{min-width:100%;max-width:200px}.edd_repeatable_product_wrapper td{overflow:visible}.edd-payment-details-label-mobile{display:none}@media screen and (max-width:1284px){.edd-edit-purchase-element ul li.download{padding-bottom:15px;width:100%}.edd-edit-purchase-element .edd-purchased-download-title{font-size:16px}.edd-edit-purchase-element ul li.item_price{width:22%}.edd-edit-purchase-element ul li.item_price.item_quantity{width:35%}.edd-edit-purchase-element ul li.item_tax{width:25%}.edd-edit-purchase-element ul li.price{width:20%}.edd-edit-purchase-element .edd-purchased-download-actions{padding-top:10px}.edd-add-download-to-purchase-header,.edd-purchased-files-header{display:none}.edd-payment-details-label-mobile{display:block;font-weight:500;padding-bottom:6px}}@media screen and (max-width:1024px){.edd-edit-purchase-element ul li.item_price.item_quantity{width:40%}.edd-edit-purchase-element ul li.price{width:24%}.edd-edit-purchase-element .edd-purchased-download-actions{padding-top:15px}.edd-edit-purchase-element .edd-purchased-download-actions,.edd-edit-purchase-element .edd-purchased-download-actions a{font-size:14px}}@media screen and (max-width:782px){#edd-edit-order-form .column{width:49%}.edd-edit-purchase-element ul li.item_price,.edd-edit-purchase-element ul li.item_price.item_quantity{padding-bottom:10px}.edd-edit-purchase-element ul li.item_price.item_quantity{width:35%}.edd-edit-purchase-element ul li.item_tax,.edd-edit-purchase-element ul li.price{width:20%;padding-bottom:10px}.edd-payment-details-label-mobile{font-size:14px;font-weight:500}.edd-payment-details-download-amount,.edd-price-currency{font-size:16px}.order-data-column input[type=email]{padding:6px 10px}}@media screen and (max-width:600px){.edd-edit-purchase-element ul li.item_price,.edd-edit-purchase-element ul li.item_price.item_quantity,.edd-edit-purchase-element ul li.item_tax{width:100%;padding-bottom:20px}.edd-edit-purchase-element .edd-add-download-to-purchase ul li.item_tax,.edd-edit-purchase-element ul li.price{width:100%;padding-bottom:0}.edd-edit-purchase-element .edd-add-download-to-purchase-actions{padding-top:15px}#edd-edit-order-form .column{width:100%}}#edd_product_stats .label{display:inline-block}#edd_product_stats hr{border-style:solid;border-width:1px;border-color:#ccc #fff #fff #ccc}#edd_product_stats .product-earnings-stats:before,#edd_product_stats .product-sales-stats:before{color:#82878c;font:normal 20px/1 dashicons;display:inline-block;padding:0 2px 0 0;position:relative;top:0;left:-1px;speak:none;text-decoration:none!important;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#edd_product_stats .product-sales-stats:before{content:'\f174'}#edd_product_stats .product-earnings-stats:before{content:'\f239'}.edd_dashboard_widget table thead td{border-bottom:1px solid #ececec;color:#777}.edd_dashboard_widget .table_left{float:left;width:45%}.edd_dashboard_widget .table_right{float:right;width:45%}.edd_dashboard_widget .inside{font-size:12px}.edd_dashboard_widget td{padding:3px 0}.edd_dashboard_widget .b,.edd_dashboard_widget .t{line-height:1.5;vertical-align:middle}.edd_dashboard_widget .b{font-size:14px;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;padding-right:6px;width:auto}.edd_dashboard_widget .t{font-size:12px;padding-right:12px;color:#777;width:100%}.edd_dashboard_widget .label_heading{border-top:1px solid #ececec;color:#8f8f8f;font-family:Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;display:block;padding-top:10px;margin:0 0 8px 12px}.edd_dashboard_widget .edd_dashboard_widget_subheading{border-top:1px solid #ececec;color:#8f8f8f;font-size:14px;padding-top:10px;margin:1em 0 0 0}.edd_dashboard_widget .edd_dashboard_widget_subheading+.table{margin:8px 0 0 0}.edd_dashboard_widget .edd_price_label{background:#00769c;border-radius:3px;color:#fff;font-size:10px;padding:2px 4px;margin-right:2px}.edd_dashboard_widget table{width:100%;margin-left:0;margin-bottom:1em}td.edd_order_label{width:80%}td.edd_order_price{text-align:right}@media handheld,only screen and (max-width:1000px){.edd_dashboard_widget .edd-recent-email{display:none}}#edd-dashboard-widgets-wrap .postbox h3{cursor:default}#edd-date-range-options,#edd-graphs-date-options{float:left}#edd-date-range-options span{float:left;line-height:24px;height:24px;margin-right:6px}.edd-import-export-form{position:relative}.edd-import-export-form .edd-progress{background:#ddd;position:absolute;bottom:15px;width:95%;height:15px}.edd-import-export-form .edd-progress div{background:#ccc;height:100%;width:0}.edd-import-export-form .notice-wrap{background-color:#f4f4f4;border-style:solid;border-width:1px 0;border-color:#eae9e9;padding:12px 12px 4px;overflow:auto;margin:20px -12px -23px;position:relative;width:100%}.edd-import-export-form .notice-wrap .spinner{margin:4px 10px 8px;float:right}.admin-color-fresh .edd-import-export-form .edd-progress div{background:#0073aa}.admin-color-light .edd-import-export-form .edd-progress div{background:#888}.admin-color-blue .edd-import-export-form .edd-progress div{background:#096484}.admin-color-coffee .edd-import-export-form .edd-progress div{background:#c7a589}.admin-color-ectoplasm .edd-import-export-form .edd-progress div{background:#a3b745}.admin-color-midnight .edd-import-export-form .edd-progress div{background:#e14d43}.admin-color-sunrise .edd-import-export-form .edd-progress div{background:#dd823b}#edd-graphs-filter label{vertical-align:inherit}#edd-graphs-filter .graph-option-section{float:left;line-height:2.5em;padding-right:5px}.edd-mix-totals{background-color:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);padding:10px}.edd-mix-chart{display:inline-block;width:49%;vertical-align:top}.edd-graph-notes{color:#9c9c9c}.edd-graph-notes span{display:block}.edd-pie-graph .legend{display:none}.edd-pie-legend{overflow:auto;margin-top:10px}.edd-legend-item-wrapper{color:#333;display:inline-block;font-size:8pt;padding:2px 5px 0 5px;width:48%;height:20px}.edd-legend-color{border:1px solid #cfcfcf;display:inline-block;margin-right:5px;width:20px;height:15px}.edd-pie-legend-item{display:inline-block;vertical-align:top;width:80%}[id*=edd-recapture-].button,[id*=edd-sendwp-].button{font-size:16px;height:auto;padding:8px 14px;margin:6px 0 0}[id*=edd-recapture-].button .dashicons,[id*=edd-sendwp-].button .dashicons{line-height:29px;margin-right:8px}[id*=edd-recapture-].button .edd-loading,[id*=edd-recapture-].button .edd-loading:after,[id*=edd-sendwp-].button .edd-loading,[id*=edd-sendwp-].button .edd-loading:after{border-radius:50%;display:inline-block;width:14px;height:14px}[id*=edd-recapture-].button .edd-loading,[id*=edd-sendwp-].button .edd-loading{position:relative;top:3px;margin-left:4px;box-shadow:0 0 2px rgba(0,0,0,.2)}[id*=edd-recapture-].button .edd-loading,[id*=edd-sendwp-].button .edd-loading{-webkit-animation:edd-spinning 1.1s infinite linear;animation:edd-spinning 1.1s infinite linear;border-top:2px solid rgba(255,255,255,.5);border-right:2px solid rgba(255,255,255,.5);border-bottom:2px solid rgba(255,255,255,.5);border-left:2px solid #fff;font-size:14px;-ms-transform:translateZ(0);transform:translateZ(0)}#edd-recapture-disconnect.button .edd-loading.dark,#edd-sendwp-disconnect.button .edd-loading.dark{border-top-color:rgba(0,0,0,.2);border-right-color:rgba(0,0,0,.2);border-bottom-color:rgba(0,0,0,.2);border-left-color:#666;box-shadow:none}.recapture-notice{position:relative}@-webkit-keyframes edd-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes edd-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}#edd_tax_rates{margin:1em 0 0}#edd_tax_rates .edd_tax_country *,#edd_tax_rates .edd_tax_state *{max-width:100%}#edd_tax_rates .edd_tax_country,#edd_tax_rates .edd_tax_state{width:180px}#edd_tax_rates .edd_tax_rate{width:80px}#edd_tax_rates th{padding:15px 10px}.wrap-licenses .form-table,.wrap-licenses caption,.wrap-licenses tbody,.wrap-licenses td,.wrap-licenses tfoot,.wrap-licenses th,.wrap-licenses thead,.wrap-licenses tr{display:block}.wrap-licenses .form-table tr{float:left;margin:0 15px 15px 0;background:#fff;border:1px solid #ccc;width:30.5%;max-width:350px;padding:14px;min-height:220px;position:relative;box-sizing:border-box}.wrap-licenses .form-table th{background:#f9f9f9;padding:14px;border-bottom:1px solid #ccc;margin:-14px -14px 20px;width:100%}.wrap-licenses .form-table td{padding:0}.wrap-licenses td input.regular-text{margin:0 0 8px;width:100%}.wrap-licenses .edd-license-data[class*=edd-license-]{position:absolute;background:#fafafa;padding:14px;border-top:1px solid #eee;margin:20px -14px -14px;min-height:67px;width:100%;bottom:14px;box-sizing:border-box}.wrap-licenses .edd-license-data[class*=edd-license-] a{color:#444}.wrap-licenses .edd-license-data[class*=edd-license-] a:hover{text-decoration:none}.wrap-licenses .edd-license-data.license-expires-soon-notice{background-color:#00a0d2;color:#fff;border-color:#00a0d2}.wrap-licenses .edd-license-data.edd-license-expired{background-color:#e24e4e;color:#fff;border-color:#e24e4e}.wrap-licenses .edd-license-data.edd-license-error,.wrap-licenses .edd-license-data.edd-license-invalid,.wrap-licenses .edd-license-data.edd-license-item_name_mismatch,.wrap-licenses .edd-license-data.edd-license-missing,.wrap-licenses .edd-license-data.edd-license-site_inactive{background-color:#ffebcd;border-color:#ffebcd}.wrap-licenses .edd-license-data p{font-size:13px;margin-top:0}.wrap-licenses .edd-license-data.edd-license-expired a,.wrap-licenses .edd-license-data.license-expires-soon-notice a{color:#fff}.wrap-licenses .edd-license-data.edd-license-expired a:hover,.wrap-licenses .edd-license-data.license-expires-soon-notice a:hover{text-decoration:none}.wrap-licenses p.submit{clear:both}#system-info-textarea{background:0 0;font-family:Menlo,Monaco,monospace;display:block;overflow:auto;white-space:pre;width:800px;height:400px}#TB_window #edd-add-download:active,#TB_window #edd-add-download:focus,#TB_window #edd-add-download:hover{color:#fff}.edd-graph .y1Axis{color:#edc240!important}.edd-graph .y2Axis{color:#afd8f8!important}.download_page_edd-tools .apikeys .column-user{width:192px}.edd-select-chosen{width:100%;max-width:300px}.chosen-container-multi .chosen-choices{background-image:none;border-color:#dfdfdf;-webkit-border-radius:3px;border-radius:3px}.chosen-container-multi .chosen-choices input{border-color:#dfdfdf;height:27px!important;margin:2px}.chosen-container .chosen-drop{border-color:#aaa;-webkit-box-shadow:1px 1px 2px rgba(0,0,0,.1);box-shadow:1px 1px 2px rgba(0,0,0,.1)}.chosen-container .search-field{float:none!important}.chosen-container .search-field input{width:90%!important}.chosen-container-active .chosen-choices{border-color:#aaa;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;-webkit-box-shadow:1px 1px 2px rgba(0,0,0,.1);box-shadow:1px 1px 2px rgba(0,0,0,.1)}.download_page_edd-tools .tablenav .actions{overflow:visible}.edd_user_search_wrap{position:relative;overflow:visible}.edd_user_search_results{position:absolute;left:0;top:27px}.edd_user_search_results a.edd-ajax-user-cancel{position:absolute;right:6px;top:2px}.edd_user_search_results ul{background:#f0f0f0;border:1px solid #dfdfdf;overflow-y:scroll;padding:10px 10px 4px;margin:0;max-height:200px;width:300px}.wp-list-table .type-download .row-actions{color:#999}@media screen and (max-width:1100px){.edd-mix-chart{display:block;width:100%}.wrap-licenses .form-table tr{width:46%;max-width:none;min-height:230px}}@media screen and (max-width:782px){.post-type-download .nav-tab-wrapper a{font-size:70%;padding:2px 4px}.download_page_edd-tools .apikeys .column-user{width:80px}.license-expiration-date-notice,.license-lifetime-notice,.license-null{padding-left:0}[class^=license-] input[type=text]{margin-bottom:3px}}@media screen and (max-width:600px){.wrap-licenses .form-table tr{width:100%;min-height:230px}#edd-edit-order-form input.large-text{width:100%}}#edd-item-wrapper{background:#f5f5f5;border:1px solid #e5e5e5;webkit-box-shadow:0 1px 1px rgba(0,0,0,0.04);box-shadow:0 1px 1px rgba(0,0,0,.04);max-width:830px}#edd-item-wrapper:after{content:"";display:block;clear:both;visibility:hidden;font-size:0;height:0}#edd-item-tab-wrapper{float:left;width:18%;z-index:1}#edd-item-tab-wrapper-list{background:#fff;margin:0}#edd-item-tab-wrapper-list li{display:block;background-color:#eaeaea;color:#444;font-size:12px;border-bottom:1px solid #e5e5e5;margin-bottom:0;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;word-wrap:break-word}#edd-item-tab-wrapper-list li a{display:block;padding:8px 10px 8px 6px}#edd-item-tab-wrapper-list li.active{display:block;background-color:#fff;padding:8px 10px 8px 6px}#edd-item-tab-wrapper-list .inactive a,#edd-item-tab-wrapper-list .inactive a:visited{background-color:#f5f5f5;color:#444;text-decoration:none}#edd-item-tab-wrapper-list .inactive a:hover{background-color:#fff}#edd-item-tab-wrapper-list .dashicons{color:#444;font-size:16px;min-width:24px;height:auto}#edd-item-card-wrapper .left{float:left}#edd-item-card-wrapper .right{float:right}#edd-item-card-wrapper input{font-weight:400}#edd-item-card-wrapper{background-color:#fff;border:1px solid #e5e5e5;display:inline-block;margin-left:-1px;min-height:200px;width:700px;z-index:2}.edd-item-has-tabs #edd-item-card-wrapper{border-width:0 0 0 1px;width:82%}#edd-item-card-wrapper .customer-section{border-bottom:1px solid #eee;margin-bottom:10px;overflow:auto}#edd-item-card-wrapper .customer-section table{margin-bottom:20px}#edd-item-card-wrapper>div{padding:0 20px}#edd-item-card-wrapper>div:first-child{padding-top:20px}#edd-item-card-wrapper>div:last-child{border:none;padding-bottom:20px}#edd-item-card-wrapper .avatar-wrap{padding-right:10px;text-align:center}#edd-item-card-wrapper .customer-id{font-size:24px;font-weight:600}#edd-item-card-wrapper .customer-main-wrapper input{width:200px}#edd-item-card-wrapper .customer-address-wrapper{margin-right:25px;max-width:33%;width:202px}#edd-item-card-wrapper .customer-address-wrapper select{width:200px}#edd-item-card-wrapper .customer-info{margin-top:5px;margin-bottom:10px;min-height:185px}#edd-item-card-wrapper .info-wrapper{min-height:125px;overflow:visible}#edd-item-card-wrapper a.delete{color:red;margin-right:5px;text-decoration:none}.customer-info .customer-name{font-size:24px;font-weight:600}.customer-edit-link a,.disconnect-user a{font-size:12px;font-weight:400;text-decoration:none}#customer-edit-actions{line-height:28px;margin-bottom:20px;text-align:center}#customer-edit-actions .button-secondary{margin-right:10px}#edd-item-card-wrapper .row-title{width:30%}#edd-item-card-wrapper .info-item{display:block;line-height:16px;padding-bottom:5px}#edd-item-card-wrapper .edit-item{display:none}#edd-item-card-wrapper .edd_user_search_results{left:1px;top:16px}#edd-item-card-wrapper .edd_user_search_results ul{width:200px}#edd-item-stats-wrapper{margin:0 auto;min-height:30px;text-align:center}#edd-item-stats-wrapper li{font-size:14px;float:left;line-height:22px;width:50%}#edd-item-stats-wrapper a{text-decoration:none}#edd-item-stats-wrapper .dashicons{color:#888}#edd-item-tables-wrapper table{text-align:center;width:100%}#edd-item-tables-wrapper th{text-align:center}#edd-item-tables-wrapper .downloads tr>td:first-child,#edd-item-tables-wrapper .downloads tr>th:first-child,#edd-item-tables-wrapper .emails tr>td:first-child,#edd-item-tables-wrapper .emails tr>th:first-child{text-align:left}#edd-item-tables-wrapper .downloads tr>td:only-child{text-align:center}#edd-item-tables-wrapper .emails .add-customer-email-row td{background-color:#f9f9f9;border-top:1px solid #e5e5e5}#edd-item-tables-wrapper .emails .primary-email-icon{font-size:13px;vertical-align:middle;line-height:1.5em}#edd-item-tables-wrapper .emails input{vertical-align:middle;margin:6px 0}#edd-item-tables-wrapper .emails .spinner{float:none}#edd-item-notes-wrapper{min-height:50px}.edd-item-notes-header img,.edd-item-notes-header span{font-weight:600;line-height:30px;vertical-align:middle}.customer-note-input{margin-bottom:5px;width:100%}#edd-customer-notes div:nth-of-type(even){background-color:#fcfcfc}.customer-note-wrapper{border-bottom:1px solid #f9f9f9;min-height:38px;padding:7px 0 7px 7px}.customer-note-wrapper span{display:block}.note-content-wrap{padding-top:7px}.delete-customer{text-align:center}#edd-item-card-wrapper .notice-container{padding-left:20px;padding-right:20px;margin-left:-20px;margin-right:-20px}#edd-item-card-wrapper .add-customer-email-wrapper>#add-customer-email{vertical-align:middle}@media screen and (max-width:810px) and (min-width:656px){.customer-info .customer-name{font-size:16px}#edd-item-card-wrapper .widefat td,.widefat th{padding:4px 6px;max-width:100px!important;display:table-cell}}@media screen and (max-width:781px){#edd-item-card-wrapper,#edd-item-tab-wrapper{margin:0;width:100%}#edd-item-tab-wrapper-list{background:#fff;margin:0}#edd-item-tab-wrapper-list li{float:left;display:inline;font-size:14px;box-sizing:border-box;border-width:0 1px 1px 0;border-style:solid;border-color:#e5e5e5;width:33.33333%}#edd-item-tab-wrapper-list li:nth-child(3n+3){border-width:0 0 1px 0}#edd-item-tab-wrapper-list .dashicons{font-size:18px}.edd-item-has-tabs #edd-item-card-wrapper{border-top:1px solid #e5e5e5;border-left:0;margin-top:-1px;width:100%}}@media screen and (max-width:656px){#edd-item-card-wrapper .customer-info{min-height:220px}.edd-item-info.customer-info{position:relative}#edd-item-card-wrapper .customer-address-wrapper{float:none;position:absolute;top:84px;left:110px;max-width:200px}#edd-item-card-wrapper .customer-main-wrapper{float:none;position:absolute;left:110px}.customer-info .customer-name{font-size:16px}#edd-item-card-wrapper #edd-item-stats-wrapper{padding-left:0;padding-right:0}#edd-item-card-wrapper .customer-section{margin-bottom:0}#edd-item-card-wrapper .widefat td,#edd-item-card-wrapper .widefat th{padding:4px 6px;max-width:100px!important;display:table-cell;overflow:hidden}#edd-item-card-wrapper .customer-id{font-size:16px}}@media screen and (max-width:480px){#edd-item-tab-wrapper-list li{width:50%}#edd-item-tab-wrapper-list li:nth-child(3n+3){border-width:0 1px 1px 0}#edd-item-tab-wrapper-list li:nth-child(even){border-width:0 0 1px 0}.edd-repeatable-row-actions,.edd-repeatable-row-title{text-align:left;width:100%}.edd-repeatable-row-title{padding-bottom:0}.edd-bundled-product-item-reorder,.edd-bundled-product-row .edd-bundled-product-item,.edd-bundled-product-row .edd-bundled-product-price-assignment,.edd-file-assignment,.edd-file-name,.edd-file-url,.edd-option-name,.edd-option-price,.edd_repeatable_default{float:none;text-align:left;width:100%!important;margin:10px 0}.edd-bundled-product-row .edd-bundled-product-actions{float:none}.edd-bundled-product-row .edd-bundled-product-item-reorder .edd-product-file-reorder{padding:0}#edd-payment-filters span{display:block;margin:2px 0}#edd-payment-filters a,.download_page_edd-reports .button{text-align:center}#edd-payment-date-filters span{display:block}#edd-payment-date-filters span>input{float:right}#edd-add-discount select[multiple] option,#edd-edit-discount select[multiple] option{height:20px}#edd-add-discount input[type=text],#edd-edit-discount input[type=text],#edd-payment-filters a,#edd-payment-filters input:not([type=radio]),#edd-payment-filters select,#system-info-textarea,.download_page_edd-reports .inside .button,.download_page_edd-reports .inside input[type=submit],.download_page_edd-reports .inside input[type=text],.download_page_edd-reports .inside select,.download_page_edd-settings .inside input[type=button],.download_page_edd-tools .inside input[type=submit],.download_page_edd-tools .inside input[type=text],.download_page_edd-tools .inside select{width:100%}#edd-add-discount select[multiple],#edd-edit-discount select[multiple],.download_page_edd-tools select[multiple]{height:200px!important}.download_page_edd-settings input[type=checkbox]{margin:2px 0}.post-type-download input[type=checkbox]{margin-left:2px}}.recount-stats-controls form{display:inline}.edd-recount-stats-descriptions span{display:none;line-height:24px}#edd-debug-log p.submit{margin:20px 0 0;padding:0}#edd-debug-log .edd-inline-button{margin-left:5px}.edd-settings-sidebar{padding-top:27px}.edd-settings-sidebar-content{background-color:#fff;text-align:center;border:1px solid #ddd;box-sizing:border-box;max-width:300px}.edd-settings-sidebar-content p{font-size:14px;line-height:1.5;margin-top:0}.edd-sidebar-header-section{background-color:#35495c;line-height:1;padding:26px 20px 24px;border-bottom:3px dashed #fafafa}.edd-sidebar-description-section{background-color:#fafafa;padding:16px 20px;border-bottom:1px solid #ddd}.edd-sidebar-description-section .edd-sidebar-description{margin:0}.edd-sidebar-coupon-section{font-size:14px;padding:16px 20px}.edd-sidebar-coupon-section label{display:block;line-height:1.4;margin-bottom:6px}.edd-sidebar-coupon-section label strong{color:#253b51;font-weight:700}.edd-sidebar-coupon-section input{background:#f4f7fa;font-size:22px;font-weight:600;text-align:center;padding:10px;border:2px dashed #2794da;border-radius:4px;margin-bottom:16px;box-shadow:none;width:100%}.edd-sidebar-coupon-section input:focus{border:2px dashed #2794da;box-shadow:none}.edd-settings-sidebar-content .edd-coupon-note{color:#6c7883;font-size:13px;font-style:italic;margin:0}.edd-settings-sidebar-content .edd-coupon-note a{color:#253b51}.edd-settings-sidebar-content .edd-coupon-note a:hover{text-decoration:none}.edd-sidebar-footer-section{background-color:#fafafa;padding:16px 20px;border-top:1px solid #ddd}.edd-sidebar-footer-section .edd-cta-button{display:block;background-color:#2794da;color:#fff;text-decoration:none;font-size:20px;font-weight:700;text-transform:uppercase;padding:17px 10px;border:none;border-radius:4px;width:100%;box-sizing:border-box;box-shadow:none;transition:background-color .2s}.edd-sidebar-footer-section .edd-cta-button:hover{background-color:#2386c5}@media all and (min-width:1080px){.edd-has-sidebar .edd-settings-content{float:left;width:67%}.edd-has-sidebar .edd-settings-sidebar{float:right;width:31%}}@media all and (min-width:1240px){.edd-has-sidebar .edd-settings-content{width:74%}.edd-has-sidebar .edd-settings-sidebar{width:23%}}.taxes-tab .edd-has-sidebar .edd-settings-content,.taxes-tab .edd-has-sidebar .edd-settings-sidebar{float:none;width:100%}.bfcm-promo-img-container{background-color:#35495c;width:100%;height:160px}.bfcm-code{color:#2794da;font-weight:700}.sale-ends{position:absolute;bottom:9px;right:14px;display:inline-block;color:#6c7883;font-size:12px;text-align:right;font-style:italic;width:150px}.edd-admin-notice-top-of-page{font-size:15px;line-height:1.4;color:#fff;margin-left:-20px;padding:12px 32px 12px 20px;background:#2d6ca2;display:none}@media screen and (min-width:783px){.edd-admin-notice-top-of-page{padding:10px 46px 10px 22px}}@media screen and (min-width:961px){.edd-admin-notice-top-of-page{text-align:center}}.edd-admin-notice-top-of-page a{color:#fff}.edd-admin-notice-top-of-page a:hover{text-decoration:none}.edd-admin-notice-top-of-page .button-link{position:absolute;top:48px;right:-1px;font-size:20px;color:#fff;font-weight:700;text-decoration:none;margin-left:5px;padding:6px 10px}.edd-admin-notice-top-of-page .button-link:active,.edd-admin-notice-top-of-page .button-link:focus,.edd-admin-notice-top-of-page .button-link:hover{color:#fff;text-decoration:none}@media screen and (min-width:601px){.edd-admin-notice-top-of-page .button-link{top:1px}}@media screen and (min-width:783px){.edd-admin-notice-top-of-page .button-link{right:9px}}.edd-paypal-account-status ul{margin-left:25px}.edd-paypal-account-status>li{margin-bottom:1em}.edd-paypal-account-status ul:not(.edd-paypal-webhook-events){list-style:disc;list-style-position:inside}.edd-paypal-account-status ul:not(.edd-paypal-webhook-events) li{margin:.25em 0}.edd-paypal-account-status .dashicons-yes{color:#008a20}.edd-paypal-account-status .dashicons-no{color:#d63638}
1
+ .edd-hidden{display:none}.edd-clearfix:after{content:".";display:block;height:0;text-indent:-9999px;visibility:hidden}.edd-notice .notice-dismiss,.edd-wrap a{text-decoration:none}a.edd-delete{color:#a00}a.edd-delete:hover{color:red}body.post-type-download #contextual-help-link-wrap,body.post-type-download #screen-options-link-wrap{top:5px!important}body.post-type-download #screen-meta{margin:0 0 -1px -20px}#edd-header{border-top:5px solid #0c5d95;border-bottom:1px solid #c3c4c7;padding:22px 0;margin-left:-20px;background:#fff}#edd-header-wrapper{display:flex;justify-content:space-between;padding:0 20px}#edd-header img{display:block;margin:0;max-width:300px}.no-js #edd-header-actions{display:none}#edd-header .edd-round{position:relative;background-color:#f3f4f5;border-radius:50%;width:40px;height:40px;display:flex;align-items:center;justify-content:center;margin-left:10px;cursor:pointer;transition:background-color .2s ease}button.edd-round{border:none}#edd-header button.edd-round:hover{background-color:#e5e5e5}button.edd-round:active,button.edd-round:focus{outline:2px solid #0c5d95}#edd-header .edd-number{position:absolute;background-color:#df2a4a;width:16px;height:16px;font-weight:600;font-size:10px;color:#fff;top:-8px;left:50%;transform:translateX(-50%);margin:0;-webkit-animation:bounce 2s 5;animation:bounce 2s 5}#edd-header .edd-number.edd-hidden{display:none!important}#edd-header .edd-round svg{width:20px;height:20px}.edd-settings-sub-nav{margin:0 0 10px 0;width:100%;border-bottom:1px solid #ccc;box-shadow:0 1px 1px rgba(0,0,0,.04)}.edd-settings-sub-nav a{padding:13px;display:block}.edd-settings-sub-nav a.current{border-bottom:4px solid #000;padding-bottom:9px}.admin-color-fresh .edd-settings-sub-nav a.current{border-bottom-color:#00a0d2}.admin-color-blue .edd-settings-sub-nav a.current{border-bottom-color:#096484}.admin-color-coffee .edd-settings-sub-nav a.current{border-bottom-color:#c7a589}.admin-color-ectoplasm .edd-settings-sub-nav a.current{border-bottom-color:#a3b745}.admin-color-midnight .edd-settings-sub-nav a.current{border-bottom-color:#e14d43}.admin-color-ocean .edd-settings-sub-nav a.current{border-bottom-color:#627c83}.admin-color-sunrise .edd-settings-sub-nav a.current{border-bottom-color:#be3631}.admin-color-light .edd-settings-sub-nav a.current{border-bottom-color:#888}.admin-color-evergreen .edd-settings-sub-nav a.current{border-bottom-color:#36533f}.admin-color-mint .edd-settings-sub-nav a.current{border-bottom-color:#4f6d59}.admin-color-modern .edd-settings-sub-nav a.current{border-bottom-color:#3858e9}.download_page_edd-settings .form-table label{color:#666;font-size:14px;font-style:italic;margin:4px 0 0}.download_page_edd-settings .form-table input.small-text~label,.download_page_edd-settings .form-table input[type=checkbox]+label{display:inline}.download_page_edd-settings .form-table tr>th>h3,.download_page_edd-settings .form-table tr>th>strong{font-size:1.2em;font-weight:600;margin:0 auto}.edd-help-tip{cursor:help}.edd-ui-tooltip{position:absolute;background:#333!important;border-width:1px!important;border-radius:3px!important;box-shadow:1px 1px 2px 1px rgba(214,214,214,.5)!important;color:#dedede!important;max-width:300px!important;padding:7px!important;text-rendering:optimizeLegibility;text-shadow:none!important;z-index:9999!important}.download_page_edd-settings .edd-settings-payment-icon-wrapper{margin-right:10px;line-height:16px;height:16px;display:table}#edd-add-ons h2.nav-tab-wrapper{position:relative}.edd-tab-span{top:-6px;right:0;position:absolute}.edd-add-ons-footer{padding-top:10px}#edd-add-ons h2{margin:0 0 15px}.edd-add-ons-view-wrapper{height:50px}#edd-add-ons h2 .button-primary{position:absolute}#edd-add-ons .edd-extension{background:#fff;border:1px solid #ccc;float:left;padding:14px;position:relative;margin:0 15px 15px 0;width:320px;height:315px}#edd-add-ons .edd-extension h3{font-size:13px;margin:0 0 8px}#edd-add-ons .edd-extension .button-secondary{position:absolute;bottom:14px;left:14px}#edd-add-ons .edd-browse-all{clear:both;width:100%}#edd-add-ons .edd-extension .third-party{display:none}#edd-add-ons .edd-starter-package{background-color:#85c0e5;border-color:#62a9d7;color:#fff}#edd-add-ons .edd-starter-package h3{color:#fff}#edd-add-ons .edd-extension .wp-post-image{width:100%;height:auto;vertical-align:bottom}#edd-products{height:100px;min-width:200px}#edd-add-discount input[type=text],#edd-edit-discount input[type=text]{width:300px}#edd-add-discount input.edd-price-field,#edd-edit-discount input.edd-price-field{padding:3px 5px;width:75px}#edd-payment-filters{background:#f5f5f5;clear:both;background-image:-webkit-gradient(linear,left bottom,left top,from(#f5f5f5),to(#fafafa));background-image:-webkit-linear-gradient(bottom,#f5f5f5,#fafafa);background-image:-moz-linear-gradient(bottom,#f5f5f5,#fafafa);background-image:-o-linear-gradient(bottom,#f5f5f5,#fafafa);background-image:linear-gradient(to top,#f5f5f5,#fafafa);border-color:#dfdfdf;border-width:1px;border-style:solid;border-radius:3px;font-size:13px;line-height:2.1em;overflow:auto;padding:12px;margin:8px 0}#edd-payments-filter ul.subsubsub{margin-bottom:8px}#edd-payment-filters p{color:#777}#edd-payment-date-filters input{vertical-align:middle}tr.status-refunded td{background:#cecece;border-top-color:#ccc}.wp-list-table.downloads th#ID{width:80px}.wp-list-table.downloads th#details{width:130px}.wp-list-table.downloads th#date{width:140px}.wp-list-table.downloads th#user{width:130px}.edd-mobile-link{line-height:32px;vertical-align:middle}.edd-mobile-link img{max-width:80%;height:auto;float:left}@media handheld,only screen and (max-width:640px){.wp-list-table.downloads th{width:auto!important}}.download_page_edd-payment-history .ui-dialog .ui-dialog-titlebar-close span{margin-left:-8px;margin-top:-8px}#edd-download-link-textarea{width:100%}.edd_files_name_label{width:225px;float:left}.edd_files_url_label{width:220px;float:left}#postbox-container-1 .edd_files_name_label{width:80px}#postbox-container-1 .edd_files_url_label{width:80px}.edd-add-repeatable-row{margin:10px 0}.edd-add-repeatable-row .submit{padding:0!important}.edd_repeatable_upload_wrapper:not(:first-child),.edd_variable_prices_wrapper:not(:first-child){margin-top:12px}.edd-repeatable-row-actions{color:#777;font-size:12px}.edd-repeatable-row-actions a{text-decoration:none;width:auto;cursor:pointer;vertical-align:middle}.edd-repeatable-row-actions .toggle-custom-price-option-section{color:#777}.edd-repeatable-row-actions .toggle-custom-price-option-section:hover{color:#444}.edd-bundle-products-header,.edd-repeatable-row-header{clear:both;background:#f1f1f1;border:1px solid #e5e5e5}.edd-repeatable-row-header{cursor:move}.edd-bundled-product-row:after,.edd-bundled-product-row:before,.edd-repeatable-row-header:after,.edd-repeatable-row-header:before{content:'';display:table}.edd-bundled-product-row:after,.edd-repeatable-row-header:after{clear:both}.edd-repeatable-row-title{float:left;font-weight:600}.edd-bundled-product-item-reorder .edd-product-file-reorder{color:#e5e5e5;font-family:dashicons;content:"\f545";font-size:18px;font-weight:300;margin-left:4px;vertical-align:top;transition:.2s color}.edd-bundled-product-item-reorder .edd-product-file-reorder:hover{color:#bbb}.edd-repeatable-row-actions,.edd-repeatable-row-title{padding:8px;box-sizing:border-box}.edd-repeatable-row-actions{float:right;text-align:right;padding:8px}.edd-bundled-product-row .edd-remove-row,.edd-repeatable-row-actions .edd-remove-row{font-size:12px;width:auto;cursor:pointer}.edd-bundled-product-row,.edd-repeatable-row-standard-fields{background:#f9f9f9;padding:8px;border-width:0 1px 1px;border-style:solid;border-color:#e5e5e5}.edd-repeatable-row-setting-label{display:block;margin-bottom:4px}.edd-repeatable-row-setting-label .edd-help-tip{display:inline-block;margin-left:4px}.edd-bundled-product-row .edd-bundled-product-actions,.edd-bundled-product-row .edd-bundled-product-item,.edd-bundled-product-row .edd-bundled-product-item-reorder,.edd-bundled-product-row .edd-bundled-product-price-assignment,.edd-file-assignment,.edd-file-name,.edd-file-url,.edd-option-name,.edd-option-price,.edd_repeatable_default{display:inline-block;vertical-align:top}.edd-option-name{width:38%;margin-right:5%}.edd-option-price{min-width:100px}.edd_repeatable_default{text-align:center;min-width:80px}.edd-file-name{width:18%;margin-right:3%}.edd-file-url{width:65%}.edd-repeatable-row-standard-fields.has-variable-pricing .edd-file-url{width:38%;margin-right:5%}.edd-file-assignment{width:27%}.edd-file-assignment .edd-repeatable-row-setting-label{margin-bottom:0}.edd-custom-price-option-sections-wrap{display:none;border-width:0 1px 1px;border-style:solid;border-color:#e5e5e5;box-sizing:border-box;width:100%}.edd-custom-price-option-section{display:block;padding:10px 8px;border-bottom:1px solid rgba(222,222,222,.3)}.edd-custom-price-option-section:last-child{border-bottom:none}label.edd_prices_shipping{display:none!important}.edd-custom-price-option-section-title{display:block;font-size:14px;font-weight:600;padding:0 0 10px}.edd-custom-price-option-section>:not(.edd-custom-price-option-section-title){display:inline-block;padding-right:20px;vertical-align:top;margin-bottom:4px}.edd-custom-price-option-section>:not(.edd-custom-price-option-section-title) label{display:block;margin-bottom:2px}.edd-bundle-products-header{font-weight:600;padding:8px}.edd-bundled-product-row .edd-bundled-product-item-reorder{min-width:30px;margin-right:8px}.edd-bundled-product-row .edd-bundled-product-item-reorder .edd-product-file-reorder{font-size:20px;font-weight:300;padding:16px 4px 0;cursor:move}.edd-bundled-product-row .edd-bundled-product-item{width:60%;margin-right:3%}.edd-bundled-product-row.has-variable-pricing .edd-bundled-product-item{width:47%}.edd-bundled-product-row .edd-bundled-product-price-assignment{width:23%;margin-right:3%}.edd-bundled-product-row .edd-bundled-product-actions{float:right}.edd_repeatable_upload_wrapper .edd_repeatable_upload_field_container{position:relative}.edd_upload_file{background:#fff;display:block;padding:2px 8px 2px;position:absolute;top:3px;right:7px}.edd_upload_field{padding-right:8em!important}textarea#edd-payment-note{width:100%;height:4em;margin:0}#edd-purchased-files .row .edd-purchased-files-list-wrapper .download{line-height:1.4}#edd-purchased-files .edd-purchased-files-list-wrapper .edd-purchased-option{color:#666}input[class*=edd-price-field]{padding:3px 5px;width:75px}#edd-order-download-quantity[type=number].small-text,#edd-order-download-tax[type=text].small-text,[class*=item_] [class*=edd-payment-details-download-][type=number].small-text{height:25px}#edd-order-download-quantity[type=number].small-text,.item_price .edd-payment-details-download-quantity[type=number].small-text{width:55px}#edd-order-download-tax[type=text].small-text,.item_tax .edd-payment-details-download-item-tax[type=number].small-text{width:75px}.edd_repeatable_product_wrapper .edd-select,.edd_repeatable_upload_wrapper .pricing select{min-width:100%}#edd_product_notes_field{display:block;margin:12px 0 0;height:4em;width:100%}.edd_remove_repeatable{border:none;cursor:pointer;display:inline-block;padding:0;overflow:hidden;margin:8px 0 0 0;text-indent:-9999px;width:10px;height:10px}.edd_remove_repeatable:active,.edd_remove_repeatable:focus,.edd_remove_repeatable:hover{background-position:-10px 0!important}#edd-edit-order-form .column{width:32%}.edd-edit-purchase-element[class*=columns-] ul li{padding-right:1%}#edd-edit-order-form .column:nth-child(2n+1),#edd-edit-order-form .columns-4 .column:nth-child(2n+1),#edd-edit-order-form .columns-5 .column:nth-child(3n+1){margin-right:0}#edd-edit-order-form input.large-text{width:90%}.edd-edit-purchase-element ul li.download{width:35%}.edd-edit-purchase-element ul li.item_price{width:15%}.edd-edit-purchase-element ul li.item_price.item_quantity{width:25%}.edd-edit-purchase-element ul li.item_tax{width:15%}.edd-edit-purchase-element ul li.price{width:20%}.edd-admin-box .label{font-weight:600}.edd-admin-box-inside{border-bottom:1px solid #eee;clear:both;padding:3px 12px;margin:0;word-break:break-word}.rtl .edd-admin-box-inside{padding:5px 10px 5px 0}.edd-admin-box-inside .strong{font-weight:600}.edd-payment-fees .fee-label{color:#666;font-weight:400}.edd-admin-box .right{float:right}.rtl .edd-admin-box .right{float:left;margin-left:10px}#edd-order-details .inside,#edd-order-update .inside{margin:0;padding:0}#edd-order-update input.edd_datepicker{width:180px}#edd-order-update input[type=number].edd-payment-time-hour,#edd-order-update input[type=number].edd-payment-time-min{width:50px}#edd-order-update .edd-tax-rate{color:#9c9c9c;font-style:italic}#edd-order-resend-receipt .inside{margin-top:11px}#edd-order-resend-receipt .edd-order-resend-receipt-addresses{margin-top:10px}.edd-admin-box-inside:last-child{border-bottom:0}#edd-edit-order-form .data-payment-key{word-break:break-all}.edd-order-update-box #major-publishing-actions .button-secondary{margin-right:10px}.edd-edit-purchase-element .edd-select-chosen{width:196px}#edd-customer-details .order-data-address input,#edd-customer-details .order-data-column p.data input,#edd-edit-order-form .column input,#edd-order-address-country-wrap select,.edd-edit-purchase-element ul{clear:both;display:block}#edd-customer-details .customer-info .column{width:49%}#edd-customer-details .actions{float:right}.edd-order-data input.small-text{margin:0}.edd-order-data input.med-text{margin:0;width:100px}#edd-order-update span.label{display:inline;width:50px}.edd-order-update-box .button-primary{margin-right:0}#edd-edit-order-form .column .description{padding-right:10px}#edd-edit-order-form .column,.edd-edit-purchase-element ul li{display:inline-block;line-height:1.4;position:relative;margin:0;vertical-align:middle}.edd-edit-purchase-element .row{padding:12px}.edd-edit-purchase-element .row:not(:last-child){border-bottom:1px solid #eee}.edd-edit-purchase-element .row:nth-child(odd):not(.header){background-color:#f9f9f9}.edd-edit-purchase-element .row.header{padding:6px 12px;font-weight:600;vertical-align:top}.edd-edit-purchase-element ul{font-size:0}.edd-edit-purchase-element ul li{font-size:13px}#edd-order-data .data span{color:#666;font-weight:600}.edd-edit-purchase-element .inside{padding:12px}.edd-edit-purchase-element .edd-purchased-download-title{font-size:14px;font-weight:500}.edd-edit-purchase-element .edd-purchased-download-title .deleted{color:#777}.edd-edit-purchase-element .edd-purchased-download-actions{color:#777;line-height:1.4}.edd-edit-purchase-element .edd-purchased-download-actions .edd-purchased-download-actions-label{font-weight:500}.edd-edit-purchase-element .edd-purchased-download-actions a{color:#777;font-size:12px}.edd-edit-purchase-element .edd-purchased-download-actions a:hover{color:#444}.edd-edit-purchase-element .edd-purchased-download-actions .edd-order-remove-download{color:#a00}.edd-edit-purchase-element .edd-purchased-download-actions .edd-order-remove-download:hover{color:red}#edd-order-recalc-total{float:right}#edd_products .edd-select,.edd_repeatable_product_wrapper .edd-select,.edd_repeatable_upload_wrapper .pricing select{min-width:100%;max-width:200px}.edd_repeatable_product_wrapper td{overflow:visible}.edd-payment-details-label-mobile{display:none}@media screen and (max-width:1284px){.edd-edit-purchase-element ul li.download{padding-bottom:15px;width:100%}.edd-edit-purchase-element .edd-purchased-download-title{font-size:16px}.edd-edit-purchase-element ul li.item_price{width:22%}.edd-edit-purchase-element ul li.item_price.item_quantity{width:35%}.edd-edit-purchase-element ul li.item_tax{width:25%}.edd-edit-purchase-element ul li.price{width:20%}.edd-edit-purchase-element .edd-purchased-download-actions{padding-top:10px}.edd-add-download-to-purchase-header,.edd-purchased-files-header{display:none}.edd-payment-details-label-mobile{display:block;font-weight:500;padding-bottom:6px}}@media screen and (max-width:1024px){.edd-edit-purchase-element ul li.item_price.item_quantity{width:40%}.edd-edit-purchase-element ul li.price{width:24%}.edd-edit-purchase-element .edd-purchased-download-actions{padding-top:15px}.edd-edit-purchase-element .edd-purchased-download-actions,.edd-edit-purchase-element .edd-purchased-download-actions a{font-size:14px}}@media screen and (max-width:782px){#edd-edit-order-form .column{width:49%}.edd-edit-purchase-element ul li.item_price,.edd-edit-purchase-element ul li.item_price.item_quantity{padding-bottom:10px}.edd-edit-purchase-element ul li.item_price.item_quantity{width:35%}.edd-edit-purchase-element ul li.item_tax,.edd-edit-purchase-element ul li.price{width:20%;padding-bottom:10px}.edd-payment-details-label-mobile{font-size:14px;font-weight:500}.edd-payment-details-download-amount,.edd-price-currency{font-size:16px}.order-data-column input[type=email]{padding:6px 10px}}@media screen and (max-width:600px){.edd-edit-purchase-element ul li.item_price,.edd-edit-purchase-element ul li.item_price.item_quantity,.edd-edit-purchase-element ul li.item_tax{width:100%;padding-bottom:20px}.edd-edit-purchase-element .edd-add-download-to-purchase ul li.item_tax,.edd-edit-purchase-element ul li.price{width:100%;padding-bottom:0}.edd-edit-purchase-element .edd-add-download-to-purchase-actions{padding-top:15px}#edd-edit-order-form .column{width:100%}}#edd_product_stats .label{display:inline-block}#edd_product_stats hr{border-style:solid;border-width:1px;border-color:#ccc #fff #fff #ccc}#edd_product_stats .product-earnings-stats:before,#edd_product_stats .product-sales-stats:before{color:#82878c;font:normal 20px/1 dashicons;display:inline-block;padding:0 2px 0 0;position:relative;top:0;left:-1px;speak:none;text-decoration:none!important;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#edd_product_stats .product-sales-stats:before{content:'\f174'}#edd_product_stats .product-earnings-stats:before{content:'\f239'}.edd_dashboard_widget table thead td{border-bottom:1px solid #ececec;color:#777}.edd_dashboard_widget .table_left{float:left;width:45%}.edd_dashboard_widget .table_right{float:right;width:45%}.edd_dashboard_widget .inside{font-size:12px}.edd_dashboard_widget td{padding:3px 0}.edd_dashboard_widget .b,.edd_dashboard_widget .t{line-height:1.5;vertical-align:middle}.edd_dashboard_widget .b{font-size:14px;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;padding-right:6px;width:auto}.edd_dashboard_widget .t{font-size:12px;padding-right:12px;color:#777;width:100%}.edd_dashboard_widget .label_heading{border-top:1px solid #ececec;color:#8f8f8f;font-family:Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;display:block;padding-top:10px;margin:0 0 8px 12px}.edd_dashboard_widget .edd_dashboard_widget_subheading{border-top:1px solid #ececec;color:#8f8f8f;font-size:14px;padding-top:10px;margin:1em 0 0 0}.edd_dashboard_widget .edd_dashboard_widget_subheading+.table{margin:8px 0 0 0}.edd_dashboard_widget .edd_price_label{background:#00769c;border-radius:3px;color:#fff;font-size:10px;padding:2px 4px;margin-right:2px}.edd_dashboard_widget table{width:100%;margin-left:0;margin-bottom:1em}td.edd_order_label{width:80%}td.edd_order_price{text-align:right}@media handheld,only screen and (max-width:1000px){.edd_dashboard_widget .edd-recent-email{display:none}}#edd-dashboard-widgets-wrap .postbox h3{cursor:default}#edd-date-range-options,#edd-graphs-date-options{float:left}#edd-date-range-options span{float:left;line-height:24px;height:24px;margin-right:6px}.edd-import-export-form{position:relative}.edd-import-export-form .edd-progress{background:#ddd;position:absolute;bottom:15px;width:95%;height:15px}.edd-import-export-form .edd-progress div{background:#ccc;height:100%;width:0}.edd-import-export-form .notice-wrap{background-color:#f4f4f4;border-style:solid;border-width:1px 0;border-color:#eae9e9;padding:12px 12px 4px;overflow:auto;margin:20px -12px -23px;position:relative;width:100%}.edd-import-export-form .notice-wrap .spinner{margin:4px 10px 8px;float:right}.admin-color-fresh .edd-import-export-form .edd-progress div{background:#0073aa}.admin-color-light .edd-import-export-form .edd-progress div{background:#888}.admin-color-blue .edd-import-export-form .edd-progress div{background:#096484}.admin-color-coffee .edd-import-export-form .edd-progress div{background:#c7a589}.admin-color-ectoplasm .edd-import-export-form .edd-progress div{background:#a3b745}.admin-color-midnight .edd-import-export-form .edd-progress div{background:#e14d43}.admin-color-sunrise .edd-import-export-form .edd-progress div{background:#dd823b}#edd-graphs-filter label{vertical-align:inherit}#edd-graphs-filter .graph-option-section{float:left;line-height:2.5em;padding-right:5px}.edd-mix-totals{background-color:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);padding:10px}.edd-mix-chart{display:inline-block;width:49%;vertical-align:top}.edd-graph-notes{color:#9c9c9c}.edd-graph-notes span{display:block}.edd-pie-graph .legend{display:none}.edd-pie-legend{overflow:auto;margin-top:10px}.edd-legend-item-wrapper{color:#333;display:inline-block;font-size:8pt;padding:2px 5px 0 5px;width:48%;height:20px}.edd-legend-color{border:1px solid #cfcfcf;display:inline-block;margin-right:5px;width:20px;height:15px}.edd-pie-legend-item{display:inline-block;vertical-align:top;width:80%}[id*=edd-recapture-].button{font-size:16px;height:auto;padding:8px 14px;margin:6px 0 0}[id*=edd-recapture-].button .dashicons{line-height:29px;margin-right:8px}[id*=edd-recapture-].button .edd-loading,[id*=edd-recapture-].button .edd-loading:after{border-radius:50%;display:inline-block;width:14px;height:14px}[id*=edd-recapture-].button .edd-loading{position:relative;top:3px;margin-left:4px;box-shadow:0 0 2px rgba(0,0,0,.2)}[id*=edd-recapture-].button .edd-loading{-webkit-animation:edd-spinning 1.1s infinite linear;animation:edd-spinning 1.1s infinite linear;border-top:2px solid rgba(255,255,255,.5);border-right:2px solid rgba(255,255,255,.5);border-bottom:2px solid rgba(255,255,255,.5);border-left:2px solid #fff;font-size:14px;-ms-transform:translateZ(0);transform:translateZ(0)}#edd-recapture-disconnect.button .edd-loading.dark{border-top-color:rgba(0,0,0,.2);border-right-color:rgba(0,0,0,.2);border-bottom-color:rgba(0,0,0,.2);border-left-color:#666;box-shadow:none}.recapture-notice{position:relative}@-webkit-keyframes edd-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes edd-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}#edd_tax_rates{margin:1em 0 0}#edd_tax_rates .edd_tax_country *,#edd_tax_rates .edd_tax_state *{max-width:100%}#edd_tax_rates .edd_tax_country,#edd_tax_rates .edd_tax_state{width:180px}#edd_tax_rates .edd_tax_rate{width:80px}#edd_tax_rates th{padding:15px 10px}.wrap-licenses .form-table,.wrap-licenses caption,.wrap-licenses tbody,.wrap-licenses td,.wrap-licenses tfoot,.wrap-licenses th,.wrap-licenses thead,.wrap-licenses tr{display:block}.wrap-licenses .form-table tr{float:left;margin:0 15px 15px 0;background:#fff;border:1px solid #ccc;width:30.5%;max-width:350px;padding:14px;min-height:220px;position:relative;box-sizing:border-box}.wrap-licenses .form-table th{background:#f9f9f9;padding:14px;border-bottom:1px solid #ccc;margin:-14px -14px 20px;width:100%}.wrap-licenses .form-table td{padding:0}.wrap-licenses td input.regular-text{margin:0 0 8px;width:100%}.wrap-licenses .edd-license-data[class*=edd-license-]{position:absolute;background:#fafafa;padding:14px;border-top:1px solid #eee;margin:20px -14px -14px;min-height:67px;width:100%;bottom:14px;box-sizing:border-box}.wrap-licenses .edd-license-data[class*=edd-license-] a{color:#444}.wrap-licenses .edd-license-data[class*=edd-license-] a:hover{text-decoration:none}.wrap-licenses .edd-license-data.license-expires-soon-notice{background-color:#00a0d2;color:#fff;border-color:#00a0d2}.wrap-licenses .edd-license-data.edd-license-expired{background-color:#e24e4e;color:#fff;border-color:#e24e4e}.wrap-licenses .edd-license-data.edd-license-error,.wrap-licenses .edd-license-data.edd-license-invalid,.wrap-licenses .edd-license-data.edd-license-item_name_mismatch,.wrap-licenses .edd-license-data.edd-license-missing,.wrap-licenses .edd-license-data.edd-license-site_inactive{background-color:#ffebcd;border-color:#ffebcd}.wrap-licenses .edd-license-data p{font-size:13px;margin-top:0}.wrap-licenses .edd-license-data.edd-license-expired a,.wrap-licenses .edd-license-data.license-expires-soon-notice a{color:#fff}.wrap-licenses .edd-license-data.edd-license-expired a:hover,.wrap-licenses .edd-license-data.license-expires-soon-notice a:hover{text-decoration:none}.wrap-licenses p.submit{clear:both}#system-info-textarea{background:0 0;font-family:Menlo,Monaco,monospace;display:block;overflow:auto;white-space:pre;width:800px;height:400px}#TB_window #edd-add-download:active,#TB_window #edd-add-download:focus,#TB_window #edd-add-download:hover{color:#fff}.edd-graph .y1Axis{color:#edc240!important}.edd-graph .y2Axis{color:#afd8f8!important}.download_page_edd-tools .apikeys .column-user{width:192px}.edd-select-chosen{width:100%;max-width:300px}.chosen-container-multi .chosen-choices{background-image:none;border-color:#dfdfdf;-webkit-border-radius:3px;border-radius:3px}.chosen-container-multi .chosen-choices input{border-color:#dfdfdf;height:27px!important;margin:2px}.chosen-container .chosen-drop{border-color:#aaa;-webkit-box-shadow:1px 1px 2px rgba(0,0,0,.1);box-shadow:1px 1px 2px rgba(0,0,0,.1)}.chosen-container .search-field{float:none!important}.chosen-container .search-field input{width:90%!important}.chosen-container-active .chosen-choices{border-color:#aaa;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;-webkit-box-shadow:1px 1px 2px rgba(0,0,0,.1);box-shadow:1px 1px 2px rgba(0,0,0,.1)}.download_page_edd-tools .tablenav .actions{overflow:visible}.edd_user_search_wrap{position:relative;overflow:visible}.edd_user_search_results{position:absolute;left:0;top:27px}.edd_user_search_results a.edd-ajax-user-cancel{position:absolute;right:6px;top:2px}.edd_user_search_results ul{background:#f0f0f0;border:1px solid #dfdfdf;overflow-y:scroll;padding:10px 10px 4px;margin:0;max-height:200px;width:300px}.wp-list-table .type-download .row-actions{color:#999}@media screen and (max-width:1100px){.edd-mix-chart{display:block;width:100%}.wrap-licenses .form-table tr{width:46%;max-width:none;min-height:230px}}@media screen and (max-width:782px){.post-type-download .nav-tab-wrapper a{font-size:70%;padding:2px 4px}.download_page_edd-tools .apikeys .column-user{width:80px}.license-expiration-date-notice,.license-lifetime-notice,.license-null{padding-left:0}[class^=license-] input[type=text]{margin-bottom:3px}}@media screen and (max-width:600px){.wrap-licenses .form-table tr{width:100%;min-height:230px}#edd-edit-order-form input.large-text{width:100%}}#edd-item-wrapper{background:#f5f5f5;border:1px solid #e5e5e5;webkit-box-shadow:0 1px 1px rgba(0,0,0,0.04);box-shadow:0 1px 1px rgba(0,0,0,.04);max-width:830px}#edd-item-wrapper:after{content:"";display:block;clear:both;visibility:hidden;font-size:0;height:0}#edd-item-tab-wrapper{float:left;width:18%;z-index:1}#edd-item-tab-wrapper-list{background:#fff;margin:0}#edd-item-tab-wrapper-list li{display:block;background-color:#eaeaea;color:#444;font-size:12px;border-bottom:1px solid #e5e5e5;margin-bottom:0;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;word-wrap:break-word}#edd-item-tab-wrapper-list li a{display:block;padding:8px 10px 8px 6px}#edd-item-tab-wrapper-list li.active{display:block;background-color:#fff;padding:8px 10px 8px 6px}#edd-item-tab-wrapper-list .inactive a,#edd-item-tab-wrapper-list .inactive a:visited{background-color:#f5f5f5;color:#444;text-decoration:none}#edd-item-tab-wrapper-list .inactive a:hover{background-color:#fff}#edd-item-tab-wrapper-list .dashicons{color:#444;font-size:16px;min-width:24px;height:auto}#edd-item-card-wrapper .left{float:left}#edd-item-card-wrapper .right{float:right}#edd-item-card-wrapper input{font-weight:400}#edd-item-card-wrapper{background-color:#fff;border:1px solid #e5e5e5;display:inline-block;margin-left:-1px;min-height:200px;width:700px;z-index:2}.edd-item-has-tabs #edd-item-card-wrapper{border-width:0 0 0 1px;width:82%}#edd-item-card-wrapper .customer-section{border-bottom:1px solid #eee;margin-bottom:10px;overflow:auto}#edd-item-card-wrapper .customer-section table{margin-bottom:20px}#edd-item-card-wrapper>div{padding:0 20px}#edd-item-card-wrapper>div:first-child{padding-top:20px}#edd-item-card-wrapper>div:last-child{border:none;padding-bottom:20px}#edd-item-card-wrapper .avatar-wrap{padding-right:10px;text-align:center}#edd-item-card-wrapper .customer-id{font-size:24px;font-weight:600}#edd-item-card-wrapper .customer-main-wrapper input{width:200px}#edd-item-card-wrapper .customer-address-wrapper{margin-right:25px;max-width:33%;width:202px}#edd-item-card-wrapper .customer-address-wrapper select{width:200px}#edd-item-card-wrapper .customer-info{margin-top:5px;margin-bottom:10px;min-height:185px}#edd-item-card-wrapper .info-wrapper{min-height:125px;overflow:visible}#edd-item-card-wrapper a.delete{color:red;margin-right:5px;text-decoration:none}.customer-info .customer-name{font-size:24px;font-weight:600}.customer-edit-link a,.disconnect-user a{font-size:12px;font-weight:400;text-decoration:none}#customer-edit-actions{line-height:28px;margin-bottom:20px;text-align:center}#customer-edit-actions .button-secondary{margin-right:10px}#edd-item-card-wrapper .row-title{width:30%}#edd-item-card-wrapper .info-item{display:block;line-height:16px;padding-bottom:5px}#edd-item-card-wrapper .edit-item{display:none}#edd-item-card-wrapper .edd_user_search_results{left:1px;top:16px}#edd-item-card-wrapper .edd_user_search_results ul{width:200px}#edd-item-stats-wrapper{margin:0 auto;min-height:30px;text-align:center}#edd-item-stats-wrapper li{font-size:14px;float:left;line-height:22px;width:50%}#edd-item-stats-wrapper a{text-decoration:none}#edd-item-stats-wrapper .dashicons{color:#888}#edd-item-tables-wrapper table{text-align:center;width:100%}#edd-item-tables-wrapper th{text-align:center}#edd-item-tables-wrapper .downloads tr>td:first-child,#edd-item-tables-wrapper .downloads tr>th:first-child,#edd-item-tables-wrapper .emails tr>td:first-child,#edd-item-tables-wrapper .emails tr>th:first-child{text-align:left}#edd-item-tables-wrapper .downloads tr>td:only-child{text-align:center}#edd-item-tables-wrapper .emails .add-customer-email-row td{background-color:#f9f9f9;border-top:1px solid #e5e5e5}#edd-item-tables-wrapper .emails .primary-email-icon{font-size:13px;vertical-align:middle;line-height:1.5em}#edd-item-tables-wrapper .emails input{vertical-align:middle;margin:6px 0}#edd-item-tables-wrapper .emails .spinner{float:none}#edd-item-notes-wrapper{min-height:50px}.edd-item-notes-header img,.edd-item-notes-header span{font-weight:600;line-height:30px;vertical-align:middle}.customer-note-input{margin-bottom:5px;width:100%}#edd-customer-notes div:nth-of-type(even){background-color:#fcfcfc}.customer-note-wrapper{border-bottom:1px solid #f9f9f9;min-height:38px;padding:7px 0 7px 7px}.customer-note-wrapper span{display:block}.note-content-wrap{padding-top:7px}.delete-customer{text-align:center}#edd-item-card-wrapper .notice-container{padding-left:20px;padding-right:20px;margin-left:-20px;margin-right:-20px}#edd-item-card-wrapper .add-customer-email-wrapper>#add-customer-email{vertical-align:middle}@media screen and (max-width:810px) and (min-width:656px){.customer-info .customer-name{font-size:16px}#edd-item-card-wrapper .widefat td,.widefat th{padding:4px 6px;max-width:100px!important;display:table-cell}}@media screen and (max-width:781px){#edd-item-card-wrapper,#edd-item-tab-wrapper{margin:0;width:100%}#edd-item-tab-wrapper-list{background:#fff;margin:0}#edd-item-tab-wrapper-list li{float:left;display:inline;font-size:14px;box-sizing:border-box;border-width:0 1px 1px 0;border-style:solid;border-color:#e5e5e5;width:33.33333%}#edd-item-tab-wrapper-list li:nth-child(3n+3){border-width:0 0 1px 0}#edd-item-tab-wrapper-list .dashicons{font-size:18px}.edd-item-has-tabs #edd-item-card-wrapper{border-top:1px solid #e5e5e5;border-left:0;margin-top:-1px;width:100%}}@media screen and (max-width:656px){#edd-item-card-wrapper .customer-info{min-height:220px}.edd-item-info.customer-info{position:relative}#edd-item-card-wrapper .customer-address-wrapper{float:none;position:absolute;top:84px;left:110px;max-width:200px}#edd-item-card-wrapper .customer-main-wrapper{float:none;position:absolute;left:110px}.customer-info .customer-name{font-size:16px}#edd-item-card-wrapper #edd-item-stats-wrapper{padding-left:0;padding-right:0}#edd-item-card-wrapper .customer-section{margin-bottom:0}#edd-item-card-wrapper .widefat td,#edd-item-card-wrapper .widefat th{padding:4px 6px;max-width:100px!important;display:table-cell;overflow:hidden}#edd-item-card-wrapper .customer-id{font-size:16px}}@media screen and (max-width:480px){#edd-item-tab-wrapper-list li{width:50%}#edd-item-tab-wrapper-list li:nth-child(3n+3){border-width:0 1px 1px 0}#edd-item-tab-wrapper-list li:nth-child(even){border-width:0 0 1px 0}.edd-repeatable-row-actions,.edd-repeatable-row-title{text-align:left;width:100%}.edd-repeatable-row-title{padding-bottom:0}.edd-bundled-product-item-reorder,.edd-bundled-product-row .edd-bundled-product-item,.edd-bundled-product-row .edd-bundled-product-price-assignment,.edd-file-assignment,.edd-file-name,.edd-file-url,.edd-option-name,.edd-option-price,.edd_repeatable_default{float:none;text-align:left;width:100%!important;margin:10px 0}.edd-bundled-product-row .edd-bundled-product-actions{float:none}.edd-bundled-product-row .edd-bundled-product-item-reorder .edd-product-file-reorder{padding:0}#edd-payment-filters span{display:block;margin:2px 0}#edd-payment-filters a,.download_page_edd-reports .button{text-align:center}#edd-payment-date-filters span{display:block}#edd-payment-date-filters span>input{float:right}#edd-add-discount select[multiple] option,#edd-edit-discount select[multiple] option{height:20px}#edd-add-discount input[type=text],#edd-edit-discount input[type=text],#edd-payment-filters a,#edd-payment-filters input:not([type=radio]),#edd-payment-filters select,#system-info-textarea,.download_page_edd-reports .inside .button,.download_page_edd-reports .inside input[type=submit],.download_page_edd-reports .inside input[type=text],.download_page_edd-reports .inside select,.download_page_edd-settings .inside input[type=button],.download_page_edd-tools .inside input[type=submit],.download_page_edd-tools .inside input[type=text],.download_page_edd-tools .inside select{width:100%}#edd-add-discount select[multiple],#edd-edit-discount select[multiple],.download_page_edd-tools select[multiple]{height:200px!important}.download_page_edd-settings input[type=checkbox]{margin:2px 0}.post-type-download input[type=checkbox]{margin-left:2px}}.recount-stats-controls form{display:inline}.edd-recount-stats-descriptions span{display:none;line-height:24px}#edd-debug-log p.submit{margin:20px 0 0;padding:0}#edd-debug-log .edd-inline-button{margin-left:5px}.edd-settings-sidebar{padding-top:27px}.edd-settings-sidebar-content{background-color:#fff;text-align:center;border:1px solid #ddd;box-sizing:border-box;max-width:300px}.edd-settings-sidebar-content p{font-size:14px;line-height:1.5;margin-top:0}.edd-sidebar-header-section{background-color:#35495c;line-height:1;padding:26px 20px 24px;border-bottom:3px dashed #fafafa}.edd-sidebar-description-section{background-color:#fafafa;padding:16px 20px;border-bottom:1px solid #ddd}.edd-sidebar-description-section .edd-sidebar-description{margin:0}.edd-sidebar-coupon-section{font-size:14px;padding:16px 20px}.edd-sidebar-coupon-section label{display:block;line-height:1.4;margin-bottom:6px}.edd-sidebar-coupon-section label strong{color:#253b51;font-weight:700}.edd-sidebar-coupon-section input{background:#f4f7fa;font-size:22px;font-weight:600;text-align:center;padding:10px;border:2px dashed #2794da;border-radius:4px;margin-bottom:16px;box-shadow:none;width:100%}.edd-sidebar-coupon-section input:focus{border:2px dashed #2794da;box-shadow:none}.edd-settings-sidebar-content .edd-coupon-note{color:#6c7883;font-size:13px;font-style:italic;margin:0}.edd-settings-sidebar-content .edd-coupon-note a{color:#253b51}.edd-settings-sidebar-content .edd-coupon-note a:hover{text-decoration:none}.edd-sidebar-footer-section{background-color:#fafafa;padding:16px 20px;border-top:1px solid #ddd}.edd-sidebar-footer-section .edd-cta-button{display:block;background-color:#2794da;color:#fff;text-decoration:none;font-size:20px;font-weight:700;text-transform:uppercase;padding:17px 10px;border:none;border-radius:4px;width:100%;box-sizing:border-box;box-shadow:none;transition:background-color .2s}.edd-sidebar-footer-section .edd-cta-button:hover{background-color:#2386c5}@media all and (min-width:1080px){.edd-has-sidebar .edd-settings-content{float:left;width:67%}.edd-has-sidebar .edd-settings-sidebar{float:right;width:31%}}@media all and (min-width:1240px){.edd-has-sidebar .edd-settings-content{width:74%}.edd-has-sidebar .edd-settings-sidebar{width:23%}}.taxes-tab .edd-has-sidebar .edd-settings-content,.taxes-tab .edd-has-sidebar .edd-settings-sidebar{float:none;width:100%}.bfcm-promo-img-container{background-color:#35495c;width:100%;height:160px}.bfcm-code{color:#2794da;font-weight:700}.sale-ends{position:absolute;bottom:9px;right:14px;display:inline-block;color:#6c7883;font-size:12px;text-align:right;font-style:italic;width:150px}.edd-admin-notice-top-of-page{font-size:15px;line-height:1.4;color:#fff;margin-left:-20px;padding:12px 32px 12px 20px;background:#2d6ca2;display:none}@media screen and (min-width:783px){.edd-admin-notice-top-of-page{padding:10px 46px 10px 22px}}@media screen and (min-width:961px){.edd-admin-notice-top-of-page{text-align:center}}.edd-admin-notice-top-of-page a{color:#fff}.edd-admin-notice-top-of-page a:hover{text-decoration:none}.edd-admin-notice-top-of-page .button-link{position:absolute;top:48px;right:-1px;font-size:20px;color:#fff;font-weight:700;text-decoration:none;margin-left:5px;padding:6px 10px}.edd-admin-notice-top-of-page .button-link:active,.edd-admin-notice-top-of-page .button-link:focus,.edd-admin-notice-top-of-page .button-link:hover{color:#fff;text-decoration:none}@media screen and (min-width:601px){.edd-admin-notice-top-of-page .button-link{top:1px}}@media screen and (min-width:783px){.edd-admin-notice-top-of-page .button-link{right:9px}}.edd-paypal-account-status ul{margin-left:25px}.edd-paypal-account-status>li{margin-bottom:1em}.edd-paypal-account-status ul:not(.edd-paypal-webhook-events){list-style:disc;list-style-position:inside}.edd-paypal-account-status ul:not(.edd-paypal-webhook-events) li{margin:.25em 0}.edd-paypal-account-status .dashicons-yes{color:#008a20}.edd-paypal-account-status .dashicons-no{color:#d63638}#edd-admin-notice-five-star-review{display:grid}#edd_dashboard_sales .edd-promo-notice{border-bottom:1px solid #c3c4c7}.edd-review-actions{display:flex;gap:6px;margin:0 0 16px 0}.edd-promo-notice .edd-peeking{align-self:flex-end;justify-self:flex-end;margin-right:16px;margin-bottom:-1px}@media screen and (max-width:782px){#edd-admin-notice-five-star-review.notice .edd-peeking{margin-bottom:-6px}}@media screen and (min-width:400px){.edd-promo-notice .edd-peeking{justify-self:flex-start;margin-right:0;margin-left:200px}}.edd-promo-notice .edd-peeking,.edd-review-step{grid-area:1/-1}.edd-overlay{position:fixed;z-index:1052;top:0;right:0;bottom:0;left:160px;background-color:#141b38;opacity:.5;transition:.5s}.edd-slide-in{transform:translateX(100%)!important;-webkit-transform:translateX(100%)!important}#edd-notifications-panel{background-color:#fff;height:100%;width:100%;max-width:570px;position:fixed;z-index:1053;top:0;right:0;bottom:0;overflow-x:hidden;transition:.5s;transform:translateX(0);-webkit-transform:translateX(0)}body.admin-bar #edd-notifications-panel{top:32px}@media screen and (max-width:600px){body.admin-bar #edd-notifications-panel{top:46px}}#edd-notifications-header{display:flex;align-items:center;padding:0 30px;color:#fff;background-color:#0c5d95}#edd-notifications-header h3{color:#fff;flex:1}#edd-notifications-header .edd-close{background:0 0;border:none;color:#fff;cursor:pointer}#edd-notifications-body{padding:30px}.edd-notification{display:flex;gap:20px;margin-bottom:20px}.edd-notification--icon{color:#00aa63}.edd-notification--icon.edd-notification--icon-info{color:#005ae0}.edd-notification--icon.edd-notification--icon-warning{color:#f18200}.edd-notification--icon.edd-notification--icon-error{color:#df2a4a}.edd-notification--body{flex:1}.edd-notification--header{align-items:center;display:flex;justify-content:space-between;gap:5px;margin-bottom:7px}.edd-notification--title{color:#141b38;flex:1;font-size:16px;font-weight:600;margin:0}.edd-notification--date{color:#71747e;font-size:12px}.edd-notification--actions{flex-wrap:wrap;display:flex;align-items:center;gap:5px;margin-top:10px}.edd-notification--dismiss{background:0 0!important;border:none!important;box-shadow:none!important;color:#71747e!important;cursor:pointer;padding:0 10px;text-decoration:underline}.edd-notification--dismiss:hover{text-decoration:none}
assets/css/extension-manager.css ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Extension Manager
2
+ ------------------------------------------------------------- */
3
+
4
+ .edd-extension-manager__card {
5
+ background-color: #fff;
6
+ padding: 2em;
7
+ margin: 0;
8
+ display: flex;
9
+ flex-direction: column;
10
+ justify-content: space-between;
11
+ }
12
+
13
+ .edd-extension-manager__card-group .edd-extension-manager__card {
14
+ float: left;
15
+ max-width: 360px;
16
+ margin: 1em;
17
+ }
18
+
19
+ @supports(grid-area: auto) {
20
+ .edd-extension-manager__card-group {
21
+ display: grid;
22
+ grid-template-columns: auto;
23
+ gap: 1em;
24
+ margin-top: 24px;
25
+ }
26
+
27
+ .edd-extension-manager__card-group .edd-extension-manager__card {
28
+ float: none;
29
+ margin: 0;
30
+ max-width: unset;
31
+ }
32
+ }
33
+
34
+ .inside .edd-extension-manager__card {
35
+ padding: 0;
36
+ }
37
+
38
+ .edd-extension-manager__title {
39
+ margin: 0 0 1em 0;
40
+ }
41
+
42
+ .edd-extension-manager__group {
43
+ display: grid;
44
+ }
45
+
46
+ .edd-extension-manager__step {
47
+ grid-area: 1/-1;
48
+ margin: 0;
49
+ }
50
+
51
+ .edd-extension-manager__step:not(:first-of-type) {
52
+ display: none;
53
+ }
54
+
55
+ .edd-extension-manager__step .button {
56
+ display: table;
57
+ margin: 0 auto;
58
+ text-align: center;
59
+ white-space: normal;
60
+ }
61
+
62
+ td .edd-extension-manager__step .button {
63
+ display: inline-block;
64
+ }
65
+
66
+ .edd-extension-manager__body {
67
+ display: grid;
68
+ gap: 1.5em;
69
+ grid-template-rows: auto 1fr;
70
+ flex-grow: 1;
71
+ }
72
+
73
+ .edd-extension-manager__image img {
74
+ display: block;
75
+ margin: 0 auto;
76
+ max-width: 500px;
77
+ width: 100%;
78
+ }
79
+
80
+ .edd-extension-manager__features ul {
81
+ display: grid;
82
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
83
+ }
84
+
85
+ .edd-extension-manager__features .dashicons-yes {
86
+ color: #008a20;
87
+ margin-right: .25em;
88
+ }
89
+
90
+ .edd-extension-manager__body .notice {
91
+ max-width: 320px;
92
+ }
93
+
94
+ /* Extension Manager Style Variations
95
+ --------------------------------------- */
96
+ .edd-extension-manager__card--horizontal {
97
+ margin: 24px 0;
98
+ max-width: 700px;
99
+ }
100
+
101
+ .edd-extension-manager__card--detailed {
102
+ background-color: transparent;
103
+ max-width: 700px;
104
+ }
105
+
106
+ .edd-extension-manager__card--detailed-2col {
107
+ background-color: transparent;
108
+ max-width: 900px;
109
+ }
110
+
111
+ .edd-extension-manager__card--detailed .edd-extension-manager__title,
112
+ .edd-extension-manager__card--detailed-2col .edd-extension-manager__title {
113
+ border-bottom: 1px solid #ccc;
114
+ padding-bottom: 1em;
115
+ }
116
+
117
+ @media screen and (min-width: 601px) {
118
+ .edd-extension-manager__card-group {
119
+ grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
120
+ }
121
+
122
+ .edd-extension-manager__card--horizontal .edd-extension-manager__body {
123
+ grid-template-columns: minmax(0, 300px) 1fr;
124
+ grid-template-rows: 1fr auto;
125
+ grid-auto-flow: column;
126
+ }
127
+
128
+ .edd-extension-manager__card--horizontal .edd-extension-manager__image {
129
+ grid-row: 1 / 4;
130
+ }
131
+
132
+ .edd-extension-manager__features,
133
+ .edd-extension-manager__card--horizontal .edd-extension-manager__description {
134
+ align-self: center;
135
+ }
136
+ }
137
+
138
+ @media screen and (min-width: 783px) {
139
+ .edd-extension-manager__card--detailed-2col .edd-extension-manager__body {
140
+ grid-template-columns: minmax(0, 375px) 1fr;
141
+ grid-auto-flow: column;
142
+ }
143
+ }
assets/css/extension-manager.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .edd-extension-manager__card{background-color:#fff;padding:2em;margin:0;display:flex;flex-direction:column;justify-content:space-between}.edd-extension-manager__card-group .edd-extension-manager__card{float:left;max-width:360px;margin:1em}@supports(grid-area:auto){.edd-extension-manager__card-group{display:grid;grid-template-columns:auto;gap:1em;margin-top:24px}.edd-extension-manager__card-group .edd-extension-manager__card{float:none;margin:0;max-width:unset}}.inside .edd-extension-manager__card{padding:0}.edd-extension-manager__title{margin:0 0 1em 0}.edd-extension-manager__group{display:grid}.edd-extension-manager__step{grid-area:1/-1;margin:0}.edd-extension-manager__step:not(:first-of-type){display:none}.edd-extension-manager__step .button{display:table;margin:0 auto;text-align:center;white-space:normal}td .edd-extension-manager__step .button{display:inline-block}.edd-extension-manager__body{display:grid;gap:1.5em;grid-template-rows:auto 1fr;flex-grow:1}.edd-extension-manager__image img{display:block;margin:0 auto;max-width:500px;width:100%}.edd-extension-manager__features ul{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.edd-extension-manager__features .dashicons-yes{color:#008a20;margin-right:.25em}.edd-extension-manager__body .notice{max-width:320px}.edd-extension-manager__card--horizontal{margin:24px 0;max-width:700px}.edd-extension-manager__card--detailed{background-color:transparent;max-width:700px}.edd-extension-manager__card--detailed-2col{background-color:transparent;max-width:900px}.edd-extension-manager__card--detailed .edd-extension-manager__title,.edd-extension-manager__card--detailed-2col .edd-extension-manager__title{border-bottom:1px solid #ccc;padding-bottom:1em}@media screen and (min-width:601px){.edd-extension-manager__card-group{grid-template-columns:repeat(auto-fill,minmax(360px,1fr))}.edd-extension-manager__card--horizontal .edd-extension-manager__body{grid-template-columns:minmax(0,300px) 1fr;grid-template-rows:1fr auto;grid-auto-flow:column}.edd-extension-manager__card--horizontal .edd-extension-manager__image{grid-row:1/4}.edd-extension-manager__card--horizontal .edd-extension-manager__description,.edd-extension-manager__features{align-self:center}}@media screen and (min-width:783px){.edd-extension-manager__card--detailed-2col .edd-extension-manager__body{grid-template-columns:minmax(0,375px) 1fr;grid-auto-flow:column}}
assets/js/admin-notifications.js ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* global eddNotificationsVars */
2
+
3
+ document.addEventListener( 'alpine:init', () => {
4
+ Alpine.store( 'eddNotifications', {
5
+ isPanelOpen: false,
6
+ notificationsLoaded: false,
7
+ numberActiveNotifications: 0,
8
+ activeNotifications: [],
9
+ inactiveNotifications: [],
10
+
11
+ init: function() {
12
+ const eddNotifications = this;
13
+
14
+ /*
15
+ * The bubble starts out hidden until AlpineJS is initialized. Once it is, we remove
16
+ * the hidden class. This prevents a flash of the bubble's visibility in the event that there
17
+ * are no notifications.
18
+ */
19
+ const notificationCountBubble = document.querySelector( '#edd-notification-button .edd-number' );
20
+ if ( notificationCountBubble ) {
21
+ notificationCountBubble.classList.remove( 'edd-hidden' );
22
+ }
23
+
24
+ document.addEventListener( 'keydown', function( e ) {
25
+ if ( e.key === 'Escape' ) {
26
+ eddNotifications.closePanel();
27
+ }
28
+ } );
29
+ },
30
+
31
+ openPanel: function() {
32
+ const panelHeader = document.getElementById( 'edd-notifications-header' );
33
+
34
+ if ( this.notificationsLoaded ) {
35
+ this.isPanelOpen = true;
36
+ if ( panelHeader ) {
37
+ setTimeout( function() {
38
+ panelHeader.focus();
39
+ } );
40
+ }
41
+
42
+ return;
43
+ }
44
+
45
+ this.isPanelOpen = true;
46
+
47
+ this.apiRequest( '/notifications', 'GET' )
48
+ .then( data => {
49
+ this.activeNotifications = data.active;
50
+ this.inactiveNotifications = data.dismissed;
51
+ this.notificationsLoaded = true;
52
+
53
+ if ( panelHeader ) {
54
+ panelHeader.focus();
55
+ }
56
+ } )
57
+ .catch( error => {
58
+ console.log( 'Notification error', error );
59
+ } );
60
+ },
61
+
62
+ closePanel: function() {
63
+ if ( ! this.isPanelOpen ) {
64
+ return;
65
+ }
66
+
67
+ this.isPanelOpen = false;
68
+
69
+ const notificationButton = document.getElementById( 'edd-notification-button' );
70
+ if ( notificationButton ) {
71
+ notificationButton.focus();
72
+ }
73
+ },
74
+
75
+ apiRequest: function( endpoint, method ) {
76
+ return fetch( eddNotificationsVars.restBase + endpoint, {
77
+ method: method,
78
+ credentials: 'same-origin',
79
+ headers: {
80
+ 'Content-Type': 'application/json',
81
+ 'X-WP-Nonce': eddNotificationsVars.restNonce
82
+ }
83
+ } ).then( response => {
84
+ if ( ! response.ok ) {
85
+ return Promise.reject( response );
86
+ }
87
+
88
+ /*
89
+ * Returning response.text() instead of response.json() because dismissing
90
+ * a notification doesn't return a JSON response, so response.json() will break.
91
+ */
92
+ return response.text();
93
+ //return response.json();
94
+ } ).then( data => {
95
+ return data ? JSON.parse( data ) : null;
96
+ } );
97
+ } ,
98
+
99
+ dismiss: function( event, index ) {
100
+ if ( 'undefined' === typeof this.activeNotifications[ index ] ) {
101
+ return;
102
+ }
103
+
104
+ event.target.disabled = true;
105
+
106
+ const notification = this.activeNotifications[ index ];
107
+
108
+ this.apiRequest( '/notifications/' + notification.id, 'DELETE' )
109
+ .then( response => {
110
+ this.activeNotifications.splice( index, 1 );
111
+ this.numberActiveNotifications = this.activeNotifications.length;
112
+ } )
113
+ .catch( error => {
114
+ console.log( 'Dismiss error', error );
115
+ } );
116
+ }
117
+ } );
118
+ } );
assets/js/admin-notifications.min.js ADDED
@@ -0,0 +1 @@
 
1
+ document.addEventListener("alpine:init",()=>{Alpine.store("eddNotifications",{isPanelOpen:!1,notificationsLoaded:!1,numberActiveNotifications:0,activeNotifications:[],inactiveNotifications:[],init:function(){const eddNotifications=this,notificationCountBubble=document.querySelector("#edd-notification-button .edd-number");notificationCountBubble&&notificationCountBubble.classList.remove("edd-hidden"),document.addEventListener("keydown",function(e){"Escape"===e.key&&eddNotifications.closePanel()})},openPanel:function(){const panelHeader=document.getElementById("edd-notifications-header");if(this.notificationsLoaded)return this.isPanelOpen=!0,void(panelHeader&&setTimeout(function(){panelHeader.focus()}));this.isPanelOpen=!0,this.apiRequest("/notifications","GET").then(data=>{this.activeNotifications=data.active,this.inactiveNotifications=data.dismissed,this.notificationsLoaded=!0,panelHeader&&panelHeader.focus()}).catch(error=>{console.log("Notification error",error)})},closePanel:function(){if(this.isPanelOpen){this.isPanelOpen=!1;const notificationButton=document.getElementById("edd-notification-button");notificationButton&&notificationButton.focus()}},apiRequest:function(endpoint,method){return fetch(eddNotificationsVars.restBase+endpoint,{method:method,credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":eddNotificationsVars.restNonce}}).then(response=>response.ok?response.text():Promise.reject(response)).then(data=>data?JSON.parse(data):null)},dismiss:function(notification,index){void 0!==this.activeNotifications[index]&&(notification.target.disabled=!0,notification=this.activeNotifications[index],this.apiRequest("/notifications/"+notification.id,"DELETE").then(response=>{this.activeNotifications.splice(index,1),this.numberActiveNotifications=this.activeNotifications.length}).catch(error=>{console.log("Dismiss error",error)}))}})});
assets/js/admin-scripts.js CHANGED
@@ -86,6 +86,10 @@ jQuery(document).ready(function ($) {
86
  $( this ).val( parseInt( key ) ).removeAttr('checked');
87
  });
88
 
 
 
 
 
89
  clone.find( '.edd_repeatable_condition_field' ).each ( function() {
90
  $( this ).find( 'option:eq(0)' ).prop( 'selected', 'selected' );
91
  });
@@ -1204,23 +1208,6 @@ jQuery(document).ready(function ($) {
1204
 
1205
  emails : function() {
1206
 
1207
- $('#edd-sendwp-connect').on('click', function(e) {
1208
-
1209
- e.preventDefault();
1210
- $(this).html( edd_vars.wait + ' <span class="edd-loading"></span>' );
1211
- document.body.style.cursor = 'wait';
1212
- easy_digital_downloads_sendwp_remote_install();
1213
-
1214
- });
1215
-
1216
- $('#edd-sendwp-disconnect').on('click', function(e) {
1217
- e.preventDefault();
1218
- $(this).html( edd_vars.wait + ' <span class="edd-loading dark"></span>' );
1219
- document.body.style.cursor = 'wait';
1220
- easy_digital_downloads_sendwp_disconnect();
1221
-
1222
- });
1223
-
1224
  $('#edd-recapture-connect').on('click', function(e) {
1225
 
1226
  e.preventDefault();
@@ -1250,7 +1237,7 @@ jQuery(document).ready(function ($) {
1250
  } else {
1251
  symlink.show();
1252
  }
1253
- });
1254
  }
1255
 
1256
  }
@@ -2059,7 +2046,10 @@ jQuery(document).ready(function ($) {
2059
  var notice = $( this );
2060
 
2061
  notice.on( 'click', '.edd-promo-notice-dismiss', function( e ) {
2062
- e.preventDefault();
 
 
 
2063
 
2064
  $.ajax( {
2065
  type: 'POST',
@@ -2137,7 +2127,7 @@ jQuery(document).ready(function ($) {
2137
  },
2138
  url: ajaxurl,
2139
  success: function (response) {
2140
- $('#edd_dashboard_sales .inside').html( response );
2141
  }
2142
  });
2143
  }
@@ -2215,65 +2205,6 @@ function edd_attach_tooltips( selector ) {
2215
  });
2216
  }
2217
 
2218
- function easy_digital_downloads_sendwp_remote_install() {
2219
- var data = {
2220
- 'action': 'edd_sendwp_remote_install',
2221
- };
2222
-
2223
- // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
2224
- jQuery.post(ajaxurl, data, function( response ) {
2225
-
2226
- if( ! response.success ) {
2227
-
2228
- if( confirm( response.data.error ) ) {
2229
- location.reload();
2230
- return;
2231
- }
2232
- }
2233
-
2234
- easy_digital_downloads_sendwp_register_client(
2235
- response.data.register_url,
2236
- response.data.client_name,
2237
- response.data.client_secret,
2238
- response.data.client_redirect,
2239
- response.data.partner_id
2240
- );
2241
- });
2242
- }
2243
-
2244
- function easy_digital_downloads_sendwp_disconnect() {
2245
- var data = {
2246
- 'action': 'edd_sendwp_disconnect',
2247
- };
2248
-
2249
- jQuery.post(ajaxurl, data, function( response ) {
2250
- location.reload();
2251
- });
2252
- }
2253
-
2254
- function easy_digital_downloads_sendwp_register_client(register_url, client_name, client_secret, client_redirect, partner_id) {
2255
-
2256
- var form = document.createElement("form");
2257
- form.setAttribute("method", 'POST');
2258
- form.setAttribute("action", register_url);
2259
-
2260
- function easy_digital_downloads_sendwp_append_form_input(name, value) {
2261
- var input = document.createElement("input");
2262
- input.setAttribute("type", "hidden");
2263
- input.setAttribute("name", name);
2264
- input.setAttribute("value", value);
2265
- form.appendChild(input);
2266
- }
2267
-
2268
- easy_digital_downloads_sendwp_append_form_input('client_name', client_name);
2269
- easy_digital_downloads_sendwp_append_form_input('client_secret', client_secret);
2270
- easy_digital_downloads_sendwp_append_form_input('client_redirect', client_redirect);
2271
- easy_digital_downloads_sendwp_append_form_input('partner_id', partner_id);
2272
-
2273
- document.body.appendChild(form);
2274
- form.submit();
2275
- }
2276
-
2277
  function easy_digital_downloads_recapture_remote_install() {
2278
  var data = {
2279
  'action': 'edd_recapture_remote_install',
86
  $( this ).val( parseInt( key ) ).removeAttr('checked');
87
  });
88
 
89
+ clone.find( '.edd_repeatable_index' ).each( function () {
90
+ $( this ).val( parseInt( key ) );
91
+ } );
92
+
93
  clone.find( '.edd_repeatable_condition_field' ).each ( function() {
94
  $( this ).find( 'option:eq(0)' ).prop( 'selected', 'selected' );
95
  });
1208
 
1209
  emails : function() {
1210
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1211
  $('#edd-recapture-connect').on('click', function(e) {
1212
 
1213
  e.preventDefault();
1237
  } else {
1238
  symlink.show();
1239
  }
1240
+ } );
1241
  }
1242
 
1243
  }
2046
  var notice = $( this );
2047
 
2048
  notice.on( 'click', '.edd-promo-notice-dismiss', function( e ) {
2049
+ // Only prevent default behavior for buttons, not links.
2050
+ if ( !$( this ).attr( 'href' ) ) {
2051
+ e.preventDefault();
2052
+ }
2053
 
2054
  $.ajax( {
2055
  type: 'POST',
2127
  },
2128
  url: ajaxurl,
2129
  success: function (response) {
2130
+ $( '#edd_dashboard_sales .edd-loading' ).html( response );
2131
  }
2132
  });
2133
  }
2205
  });
2206
  }
2207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2208
  function easy_digital_downloads_recapture_remote_install() {
2209
  var data = {
2210
  'action': 'edd_recapture_remote_install',
assets/js/admin-scripts.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(document).ready(function($){edd_attach_tooltips($(".edd-help-tip"));var EDD_Download_Configuration={init:function(){this.add(),this.move(),this.remove(),this.type(),this.prices(),this.files(),this.updatePrices()},clone_repeatable:function(row){var key;highest=1;return row.parent().find(".edd_repeatable_row").each(function(){var current=$(this).data("key");parseInt(current)>highest&&(highest=current)}),key=highest+=1,clone=row.clone(),clone.removeClass("edd_add_blank"),clone.attr("data-key",key),clone.find("input, select, textarea").val("").each(function(){var name=$(this).attr("name"),id=$(this).attr("id");name&&(name=name.replace(/\[(\d+)\]/,"["+parseInt(key)+"]"),$(this).attr("name",name)),$(this).attr("data-key",key),void 0!==id&&(id=id.replace(/(\d+)/,parseInt(key)),$(this).attr("id",id))}),clone.find("select").each(function(){$(this).val(row.find('select[name="'+$(this).attr("name")+'"]').val())}),clone.find('input[type="checkbox"]').each(function(){$(this).is(":checked")&&$(this).prop("checked",!1),$(this).val(1)}),clone.find("span.edd_price_id").each(function(){$(this).text(parseInt(key))}),clone.find("span.edd_file_id").each(function(){$(this).text(parseInt(key))}),clone.find(".edd_repeatable_default_input").each(function(){$(this).val(parseInt(key)).removeAttr("checked")}),clone.find(".edd_repeatable_condition_field").each(function(){$(this).find("option:eq(0)").prop("selected","selected")}),clone.find(".search-choice").remove(),clone.find(".chosen-container").remove(),edd_attach_tooltips(clone.find(".edd-help-tip")),clone},add:function(){$(document.body).on("click",".submit .edd_add_repeatable",function(clone){clone.preventDefault();var row=$(this).parent().parent().prev(".edd_repeatable_row"),clone=EDD_Download_Configuration.clone_repeatable(row);clone.insertAfter(row).find("input, textarea, select").filter(":visible").eq(0).focus(),clone.find(".edd-select-chosen").chosen({inherit_select_classes:!0,placeholder_text_single:edd_vars.one_option,placeholder_text_multiple:edd_vars.one_or_more_option}),clone.find(".edd-select-chosen").css("width","100%"),clone.find(".edd-select-chosen .chosen-search input").attr("placeholder",edd_vars.search_placeholder)})},move:function(){$(".edd_repeatable_table .edd-repeatables-wrap").sortable({handle:".edd-draghandle-anchor",items:".edd_repeatable_row",opacity:.6,cursor:"move",axis:"y",update:function(){var count=0;$(this).find(".edd_repeatable_row").each(function(){$(this).find("input.edd_repeatable_index").each(function(){$(this).val(count)}),count++})}})},remove:function(){$(document.body).on("click",".edd-remove-row, .edd_remove_repeatable",function(firstFocusable){firstFocusable.preventDefault();var row=$(this).parents(".edd_repeatable_row"),count=row.parent().find(".edd_repeatable_row").length,type=$(this).data("type"),repeatable="div.edd_repeatable_"+type+"s",price_row_id=$(this).is(".ui-sortable .edd_repeatable_row:first-child .edd-remove-row, .ui-sortable .edd_repeatable_row:first-child .edd_remove_repeatable")?row.next(".edd_repeatable_row"):row.prev(".edd_repeatable_row"),firstFocusable=price_row_id.find("select, input, textarea, button").filter(":visible").eq(0);if("price"===type&&(price_row_id=row.data("key"),$('.edd_repeatable_condition_field option[value="'+price_row_id+'"]').remove()),1<count)$("input, select",row).val(""),row.fadeOut("fast").remove(),firstFocusable.focus();else switch(type){case"price":alert(edd_vars.one_price_min);break;case"file":$("input, select",row).val("");break;default:alert(edd_vars.one_field_min)}$(repeatable).each(function(rowIndex){$(this).find("input, select").each(function(){var name=(name=$(this).attr("name")).replace(/\[(\d+)\]/,"["+rowIndex+"]");$(this).attr("name",name).attr("id",name)})})})},type:function(){$(document.body).on("change","#_edd_product_type",function(e){var edd_products=$("#edd_products"),edd_download_files=$("#edd_download_files"),edd_download_limit_wrap=$("#edd_download_limit_wrap");"bundle"===$(this).val()?(edd_products.show(),edd_download_files.hide(),edd_download_limit_wrap.hide()):(edd_products.hide(),edd_download_files.show(),edd_download_limit_wrap.show())})},prices:function(){$(document.body).on("change","#edd_variable_pricing",function(e){var checked=$(this).is(":checked"),single=$("#edd_regular_price_field"),variable=$("#edd_variable_price_fields, .edd_repeatable_table .pricing"),bundleRow=$(".edd-bundled-product-row, .edd-repeatable-row-standard-fields");checked?(single.hide(),variable.show(),bundleRow.addClass("has-variable-pricing")):(single.show(),variable.hide(),bundleRow.removeClass("has-variable-pricing"))})},files:function(){var file_frame;window.formfield="",$(document.body).on("click",".edd_upload_file_button",function(button){button.preventDefault();button=$(this);window.formfield=$(this).closest(".edd_repeatable_upload_wrapper"),file_frame||((file_frame=wp.media.frames.file_frame=wp.media({frame:"post",state:"insert",title:button.data("uploader-title"),button:{text:button.data("uploader-button-text")},multiple:"0"!=$(this).data("multiple")})).on("menu:render:default",function(view){view.unset("library-separator"),view.unset("gallery"),view.unset("featured-image"),view.unset("embed"),view.set({})}),file_frame.on("insert",function(){file_frame.state().get("selection").each(function(attachment,clone){var row,selectedSize="image"===(attachment=attachment.toJSON()).type&&$(".attachment-display-settings .size option:selected").val(),selectedURL=attachment.url,selectedName=0<attachment.title.length?attachment.title:attachment.filename;selectedSize&&void 0!==attachment.sizes[selectedSize]&&(selectedURL=attachment.sizes[selectedSize].url),"image"===attachment.type&&(selectedName=selectedSize&&void 0!==attachment.sizes[selectedSize]?selectedName+"-"+attachment.sizes[selectedSize].width+"x"+attachment.sizes[selectedSize].height:selectedName+"-"+attachment.width+"x"+attachment.height),0===clone?(window.formfield.find(".edd_repeatable_attachment_id_field").val(attachment.id),window.formfield.find(".edd_repeatable_thumbnail_size_field").val(selectedSize),window.formfield.find(".edd_repeatable_upload_field").val(selectedURL),window.formfield.find(".edd_repeatable_name_field").val(selectedName)):(row=window.formfield,(clone=EDD_Download_Configuration.clone_repeatable(row)).find(".edd_repeatable_attachment_id_field").val(attachment.id),clone.find(".edd_repeatable_thumbnail_size_field").val(selectedSize),clone.find(".edd_repeatable_upload_field").val(selectedURL),clone.find(".edd_repeatable_name_field").val(selectedName),clone.insertAfter(row))})})),file_frame.open()}),window.formfield=""},updatePrices:function(){$("#edd_price_fields").on("keyup",".edd_variable_prices_name",function(){var key=$(this).parents(".edd_repeatable_row").data("key"),name=$(this).val(),field_option=$(".edd_repeatable_condition_field option[value="+key+"]");0<field_option.length?field_option.text(name):$(".edd_repeatable_condition_field").append($("<option></option>").attr("value",key).text(name))})}};$(document.body).on("click",".toggle-custom-price-option-section",function(header){header.preventDefault();var show=$(this).html()==edd_vars.show_advanced_settings;show?$(this).html(edd_vars.hide_advanced_settings):$(this).html(edd_vars.show_advanced_settings);header=$(this).parents(".edd-repeatable-row-header");header.siblings(".edd-custom-price-option-sections-wrap").slideToggle(),$(":input:not(input[type=button],input[type=submit],button):visible:first",show?header.siblings(".edd-custom-price-option-sections-wrap"):header.siblings(".edd-repeatable-row-standard-fields")).focus()}),EDD_Download_Configuration.init();var typingTimer,edd_datepicker=$(".edd_datepicker");0<edd_datepicker.length&&edd_datepicker.datepicker({dateFormat:"mm/dd/yy"}),{init:function(){this.edit_address(),this.remove_download(),this.add_download(),this.change_customer(),this.new_customer(),this.edit_price(),this.recalculate_total(),this.variable_prices_check(),this.add_note(),this.remove_note(),this.resend_receipt(),this.copy_download_link()},edit_address:function(){$('select[name="edd-payment-address[0][country]"]').change(function(){var data=$(this),data={action:"edd_get_shop_states",country:data.val(),nonce:data.data("nonce"),field_name:"edd-payment-address[0][state]"};return $.post(ajaxurl,data,function(response){var state_wrapper=$("#edd-order-address-state-wrap select, #edd-order-address-state-wrap input");$("#edd-order-address-state-wrap .chosen-container").remove(),"nostates"==response?state_wrapper.replaceWith('<input type="text" name="edd-payment-address[0][state]" value="" class="edd-edit-toggles medium-text"/>'):state_wrapper.replaceWith(response)}),!1})},remove_download:function(){$("#edd-purchased-files").on("click",".edd-order-remove-download",function(){var key,download_id,price_id,quantity,amount,fees,currently_removed;return 1===$(document.body).find("#edd-purchased-files > .row:not(.header)").length?alert(edd_vars.one_download_min):confirm(edd_vars.delete_payment_download)&&(key=$(this).data("key"),$(".edd-payment-id").val(),download_id=$('input[name="edd-payment-details-downloads['+key+'][id]"]').val(),price_id=$('input[name="edd-payment-details-downloads['+key+'][price_id]"]').val(),quantity=$('input[name="edd-payment-details-downloads['+key+'][quantity]"]').val(),amount=$('input[name="edd-payment-details-downloads['+key+'][amount]"]').val(),$('input[name="edd-payment-details-downloads['+key+'][tax]"]').length&&(fees=$('input[name="edd-payment-details-downloads['+key+'][tax]"]').val()),$('input[name="edd-payment-details-downloads['+key+'][fees]"]').length&&(fees=$.parseJSON($('input[name="edd-payment-details-downloads['+key+'][fees]"]').val())),currently_removed=$('input[name="edd-payment-removed"]').val(),(currently_removed=(currently_removed=$.parseJSON(currently_removed)).length<1?{}:currently_removed)[key]=[{id:download_id,price_id:price_id,quantity:quantity,amount:amount,cart_index:key}],$('input[name="edd-payment-removed"]').val(JSON.stringify(currently_removed)),$(this).parent().parent().remove(),fees&&fees.length&&$.each(fees,function(key,value){$('*li[data-fee-id="'+value+'"]').remove()}),$("#edd-payment-downloads-changed").val(1),$(".edd-order-payment-recalc-totals").show()),!1})},change_customer:function(){$("#edd-customer-details").on("click",".edd-payment-change-customer, .edd-payment-change-customer-cancel",function(cancel){cancel.preventDefault();var change_customer=$(this).hasClass("edd-payment-change-customer"),cancel=$(this).hasClass("edd-payment-change-customer-cancel");change_customer?($(".customer-info").hide(),$(".change-customer").show(),$(".edd-payment-change-customer-input").css("width","auto")):cancel&&($(".customer-info").show(),$(".change-customer").hide())})},new_customer:function(){$("#edd-customer-details").on("click",".edd-payment-new-customer, .edd-payment-new-customer-cancel",function(cancel){cancel.preventDefault();var new_customer=$(this).hasClass("edd-payment-new-customer"),cancel=$(this).hasClass("edd-payment-new-customer-cancel");new_customer?($(".customer-info").hide(),$(".new-customer").show()):cancel&&($(".customer-info").show(),$(".new-customer").hide());new_customer=$("#edd-new-customer");$(".new-customer").is(":visible")?new_customer.val(1):new_customer.val(0)})},add_download:function(){$(".edd-edit-purchase-element").on("click","#edd-order-add-download",function(download_title){download_title.preventDefault();var quantity=$("#edd_order_download_select"),item_price=$("#edd-order-download-quantity"),item_total=$("#edd-order-download-price"),price_id=$("#edd-order-download-tax"),clone=$(".edd_price_options_select option:selected"),download_id=quantity.val(),download_title=quantity.find(":selected").text(),quantity=item_price.val(),item_price=item_total.val(),item_total=price_id.val(),price_id=clone.val(),clone=clone.text();if(download_id<1)return!1;if(item_price=item_price||0,item_price=parseFloat(item_price),isNaN(item_price))return alert(edd_vars.numeric_item_price),!1;if(item_total=parseFloat(item_total),isNaN(item_total))return alert(edd_vars.numeric_item_tax),!1;if(isNaN(parseInt(quantity)))return alert(edd_vars.numeric_quantity),!1;clone&&(download_title=download_title+" - "+clone);var count=$("#edd-purchased-files div.row:not(.edd-purchased-files-header)").length;0==count&&alert(edd_vars.no_downloads_error);clone=$("#edd-purchased-files div.row:not(.edd-purchased-files-header):last").clone();clone.find(".download span").html('<a href="post.php?post='+download_id+'&action=edit"></a>'),clone.find(".download span a").text(download_title),clone.find(".edd-payment-details-download-item-price").val(item_price.toFixed(edd_vars.currency_decimals)),clone.find(".edd-payment-details-download-item-tax").val(item_total.toFixed(edd_vars.currency_decimals)),clone.find("input.edd-payment-details-download-id").val(download_id),clone.find("input.edd-payment-details-download-price-id").val(price_id);item_total=(item_total=item_price*quantity+item_total).toFixed(edd_vars.currency_decimals);clone.find("span.edd-payment-details-download-amount").text(item_total),clone.find("input.edd-payment-details-download-amount").val(item_total),clone.find("input.edd-payment-details-download-quantity").val(quantity),clone.find("input.edd-payment-details-download-has-log").val(0),clone.find(".edd-copy-download-link-wrapper").remove(),clone.find("input").each(function(){var name=(name=$(this).attr("name")).replace(/\[(\d+)\]/,"["+parseInt(count)+"]");$(this).attr("name",name).attr("id",name)}),clone.find("a.edd-order-remove-download").attr("data-key",parseInt(count)),$("#edd-payment-downloads-changed").val(1),$("#edd-purchased-files div.row .edd-purchased-download-title .deleted").length&&$("#edd-purchased-files div.row:last").remove(),$(clone).insertAfter("#edd-purchased-files div.row:last"),$(".edd-order-payment-recalc-totals").show(),$(".edd-add-download-field").val("")})},edit_price:function(){$(document.body).on("change keyup",".edd-payment-item-input",function(){var row=$(this).parents("ul.edd-purchased-files-list-wrapper");$(".edd-order-payment-recalc-totals").show();var quantity=row.find("input.edd-payment-details-download-quantity").val().replace(edd_vars.thousands_separator,""),item_price=row.find("input.edd-payment-details-download-item-price").val().replace(edd_vars.thousands_separator,""),item_total=row.find("input.edd-payment-details-download-item-tax").val().replace(edd_vars.thousands_separator,""),item_price=parseFloat(item_price);if(isNaN(item_price))return alert(edd_vars.numeric_item_price),!1;item_total=parseFloat(item_total),isNaN(item_total)&&(item_total=0);item_total=(item_total=item_price*(quantity=isNaN(parseInt(quantity))?1:quantity)+item_total).toFixed(edd_vars.currency_decimals);row.find("input.edd-payment-details-download-amount").val(item_total),row.find("span.edd-payment-details-download-amount").text(item_total)})},recalculate_total:function(){$("#edd-order-recalc-total").on("click",function(taxes){taxes.preventDefault();var total=0,tax=0,totals=$("#edd-purchased-files .row input.edd-payment-details-download-amount"),taxes=$("#edd-purchased-files .row input.edd-payment-details-download-item-tax");totals.length&&totals.each(function(){total+=parseFloat($(this).val())}),taxes.length&&taxes.each(function(){tax+=parseFloat($(this).val())}),$(".edd-payment-fees").length&&$(".edd-payment-fees span.fee-amount").each(function(){total+=parseFloat($(this).data("fee"))}),$("input[name=edd-payment-total]").val(total.toFixed(edd_vars.currency_decimals)),$("input[name=edd-payment-tax]").val(tax.toFixed(edd_vars.currency_decimals))})},variable_prices_check:function(){$(".edd-edit-purchase-element").on("change","select#edd_order_download_select",function(){var $this=$(this),download_id=$this.val();0<parseInt(download_id)&&$.ajax({type:"POST",data:{action:"edd_check_for_download_price_variations",download_id:download_id},url:ajaxurl,success:function(response){$(".edd_price_options_select").remove(),$(response).insertAfter($this.next())}}).fail(function(data){window.console&&window.console.log&&console.log(data)})})},add_note:function(){$("#edd-add-payment-note").on("click",function(postData){postData.preventDefault();var border_color,postData={action:"edd_insert_payment_note",payment_id:$(this).data("payment-id"),note:$("#edd-payment-note").val()};postData.note?$.ajax({type:"POST",data:postData,url:ajaxurl,success:function(response){$("#edd-payment-notes-inner").append(response),$(".edd-no-payment-notes").hide(),$("#edd-payment-note").val("")}}).fail(function(data){window.console&&window.console.log&&console.log(data)}):(border_color=$("#edd-payment-note").css("border-color"),$("#edd-payment-note").css("border-color","red"),setTimeout(function(){$("#edd-payment-note").css("border-color",border_color)},500))})},remove_note:function(){$(document.body).on("click",".edd-delete-payment-note",function(e){if(e.preventDefault(),confirm(edd_vars.delete_payment_note)){var postData={action:"edd_delete_payment_note",payment_id:$(this).data("payment-id"),note_id:$(this).data("note-id")};return $.ajax({type:"POST",data:postData,url:ajaxurl,success:function(response){return $("#edd-payment-note-"+postData.note_id).remove(),$(".edd-payment-note").length||$(".edd-no-payment-notes").show(),!1}}).fail(function(data){window.console&&window.console.log&&console.log(data)}),!0}})},resend_receipt:function(){var emails_wrap=$(".edd-order-resend-receipt-addresses");$(document.body).on("click","#edd-select-receipt-email",function(e){e.preventDefault(),emails_wrap.slideDown()}),$(document.body).on("change",".edd-order-resend-receipt-email",function(){var href=$("#edd-select-receipt-email").prop("href")+"&email="+$(this).val();confirm(edd_vars.resend_receipt)&&(window.location=href)}),$(document.body).on("click","#edd-resend-receipt",function(e){return confirm(edd_vars.resend_receipt)})},copy_download_link:function(){$(document.body).on("click",".edd-copy-download-link",function(postData){postData.preventDefault();postData=$(this),postData={action:"edd_get_file_download_link",payment_id:$('input[name="edd_payment_id"]').val(),download_id:postData.data("download-id"),price_id:postData.data("price-id")};$.ajax({type:"POST",data:postData,url:ajaxurl,success:function(link){return $("#edd-download-link").dialog({width:400}).html('<textarea rows="10" cols="40" id="edd-download-link-textarea">'+link+"</textarea>"),$("#edd-download-link-textarea").focus().select(),!1}}).fail(function(data){window.console&&window.console.log&&console.log(data)})})}}.init(),{init:function(){this.type_select(),this.product_requirements()},type_select:function(){$("#edd-edit-discount #edd-type, #edd-add-discount #edd-type").change(function(){var val=$(this).val();$(".edd-amount-description").hide(),$(".edd-amount-description."+val+"-discount").show()})},product_requirements:function(){$("#products").change(function(){var product_conditions=$("#edd-discount-product-conditions");$(this).val()?product_conditions.show():product_conditions.hide()})}}.init(),{init:function(){this.date_options(),this.customers_export()},date_options:function(){$("#edd-graphs-date-options").change(function(){var $this=$(this),date_range_options=$("#edd-date-range-options");"other"===$this.val()?date_range_options.show():date_range_options.hide()})},customers_export:function(){$("#edd_customer_export_download").change(function(){var price_options_select,$this=$(this),data=$("option:selected",$this).val(),customer_export_option=$("#edd_customer_export_option");"0"===$this.val()?customer_export_option.show():customer_export_option.hide(),0!=parseInt(data)?(data={action:"edd_check_for_download_price_variations",download_id:data,all_prices:!0},price_options_select=$(".edd_price_options_select"),$.post(ajaxurl,data,function(response){price_options_select.remove(),$("#edd_customer_export_download_chosen").after(response)})):price_options_select.remove()})}}.init(),{init:function(){this.general(),this.taxes(),this.emails(),this.misc()},general:function(){var file_frame,edd_settings_upload_button=$(".edd-color-picker");edd_settings_upload_button.length&&edd_settings_upload_button.wpColorPicker(),"undefined"==typeof wp||"1"!==edd_vars.new_media_ui?0<(edd_settings_upload_button=$(".edd_settings_upload_button")).length&&(window.formfield="",$(document.body).on("click",edd_settings_upload_button,function(e){e.preventDefault(),window.formfield=$(this).parent().prev(),window.tbframe_interval=setInterval(function(){jQuery("#TB_iframeContent").contents().find(".savesend .button").val(edd_vars.use_this_file).end().find("#insert-gallery, .wp-post-thumbnail").hide()},2e3),tb_show(edd_vars.add_new_download,"media-upload.php?TB_iframe=true")}),window.edd_send_to_editor=window.send_to_editor,window.send_to_editor=function(html){window.formfield?(imgurl=$("a","<div>"+html+"</div>").attr("href"),window.formfield.val(imgurl),window.clearInterval(window.tbframe_interval),tb_remove()):window.edd_send_to_editor(html),window.send_to_editor=window.edd_send_to_editor,window.formfield="",window.imagefield=!1}):(window.formfield="",$(document.body).on("click",".edd_settings_upload_button",function(button){button.preventDefault();button=$(this);window.formfield=$(this).parent().prev(),file_frame||((file_frame=wp.media.frames.file_frame=wp.media({frame:"post",state:"insert",title:button.data("uploader_title"),button:{text:button.data("uploader_button_text")},multiple:!1})).on("menu:render:default",function(view){view.unset("library-separator"),view.unset("gallery"),view.unset("featured-image"),view.unset("embed"),view.set({})}),file_frame.on("insert",function(){file_frame.state().get("selection").each(function(attachment,index){attachment=attachment.toJSON(),window.formfield.val(attachment.url)})})),file_frame.open()}),window.formfield="")},taxes:function(){var no_states=$("select.edd-no-states");no_states.length&&no_states.closest("tr").addClass("hidden"),$('select[name="edd_settings[base_country]"]').change(function(){var data=$(this),$tr=data.closest("tr"),data={action:"edd_get_shop_states",country:data.val(),nonce:data.data("nonce"),field_name:"edd_settings[base_state]"};return $.post(ajaxurl,data,function(response){"nostates"==response?$tr.next().addClass("hidden"):($tr.next().removeClass("hidden"),$tr.next().find("select").replaceWith(response))}),!1}),$(document.body).on("change","#edd_tax_rates select.edd-tax-country",function(){var $this=$(this),data={action:"edd_get_shop_states",country:$this.val(),nonce:$this.data("nonce"),field_name:$this.attr("name").replace("country","state")};return $.post(ajaxurl,data,function(response){var text_field;"nostates"==response?(text_field='<input type="text" name="'+data.field_name+'" value=""/>',$this.parent().next().find("select").replaceWith(text_field)):($this.parent().next().find("input,select").show(),$this.parent().next().find("input,select").replaceWith(response))}),!1}),$("#edd_add_tax_rate").on("click",function(){var row=$("#edd_tax_rates tr:last"),clone=row.clone(),count=row.parent().find("tr").length;return clone.find("td input").not(":input[type=checkbox]").val(""),clone.find('td [type="checkbox"]').attr("checked",!1),clone.find("input, select").each(function(){var name=(name=$(this).attr("name")).replace(/\[(\d+)\]/,"["+parseInt(count)+"]");$(this).attr("name",name).attr("id",name)}),clone.find("label").each(function(){var name=(name=$(this).attr("for")).replace(/\[(\d+)\]/,"["+parseInt(count)+"]");$(this).attr("for",name)}),clone.insertAfter(row),!1}),$(document.body).on("click","#edd_tax_rates .edd_remove_tax_rate",function(){return confirm(edd_vars.delete_tax_rate)&&(2===$("#edd_tax_rates tr:visible").length?($("#edd_tax_rates select").val(""),$('#edd_tax_rates input[type="text"]').val(""),$('#edd_tax_rates input[type="number"]').val(""),$('#edd_tax_rates input[type="checkbox"]').attr("checked",!1)):$(this).closest("tr").remove(),$("#edd_tax_rates tr").each(function(rowIndex){$(this).children().find("input, select").each(function(){var name=(name=$(this).attr("name")).replace(/\[(\d+)\]/,"["+(rowIndex-1)+"]");$(this).attr("name",name).attr("id",name)})})),!1})},emails:function(){$("#edd-sendwp-connect").on("click",function(e){e.preventDefault(),$(this).html(edd_vars.wait+' <span class="edd-loading"></span>'),document.body.style.cursor="wait",easy_digital_downloads_sendwp_remote_install()}),$("#edd-sendwp-disconnect").on("click",function(e){e.preventDefault(),$(this).html(edd_vars.wait+' <span class="edd-loading dark"></span>'),document.body.style.cursor="wait",easy_digital_downloads_sendwp_disconnect()}),$("#edd-recapture-connect").on("click",function(e){e.preventDefault(),$(this).html(edd_vars.wait+' <span class="edd-loading"></span>'),document.body.style.cursor="wait",easy_digital_downloads_recapture_remote_install()})},misc:function(){var downloadMethod=$('select[name="edd_settings[download_method]"]'),symlink=downloadMethod.parent().parent().next();"direct"==downloadMethod.val()&&(symlink.hide(),symlink.find("input").prop("checked",!1)),downloadMethod.on("change",function(){"direct"==$(this).val()?(symlink.hide(),symlink.find("input").prop("checked",!1)):symlink.show()})}}.init(),$(".download_page_edd-payment-history .row-actions .delete a, a.edd-delete-payment").on("click",function(){return!!confirm(edd_vars.delete_payment)}),$("body").on("click","#the-list .editinline",function(){var post_id=(post_id=$(this).closest("tr").attr("id")).replace("post-",""),regprice=$("#post-"+post_id).find(".column-price .downloadprice-"+post_id).val();regprice!=$("#post-"+post_id+".column-price .downloadprice-"+post_id).val()?$(".regprice","#edd-download-data").val(regprice).attr("disabled",!1):$(".regprice","#edd-download-data").val(edd_vars.quick_edit_warning).attr("disabled","disabled")}),$(document.body).on("click","#bulk_edit",function(){var $price=$("#bulk-edit"),$post_ids=new Array;$price.find("#bulk-titles").children().each(function(){$post_ids.push($(this).attr("id").replace(/^(ttle)/i,""))});$price=$('#edd-download-data input[name="_edd_regprice"]').val();$.post(ajaxurl,{action:"edd_save_bulk_edit",edd_bulk_nonce:$post_ids,post_ids:$post_ids,price:$price})}),$(".edd-select-chosen").chosen({inherit_select_classes:!0,placeholder_text_single:edd_vars.one_option,placeholder_text_multiple:edd_vars.one_or_more_option}),$(".edd-select-chosen .chosen-search input").each(function(){var placeholder=$(this).parent().parent().parent().prev("select.edd-select-chosen"),placeholder=(placeholder.data("search-type"),placeholder.data("search-placeholder"));$(this).attr("placeholder",placeholder)}),$(".chosen-choices").on("click",function(){var placeholder=$(this).parent().prev().data("search-placeholder");void 0===placeholder&&(placeholder=edd_vars.type_to_search),$(this).children("li").children("input").attr("placeholder",placeholder)});$(document.body).on("keyup",".edd-select.chosen-container .chosen-search input, .edd-select.chosen-container .search-field input",function(lastKey){var val=$(this).val(),container=$(this).closest(".edd-select-chosen"),select=(container.attr("id").replace("_chosen",""),container.prev()),no_bundles=container.hasClass("no-bundles"),variations=container.hasClass("variations"),lastKey=lastKey.which,search_type="edd_download_search";if(container.prev().data("search-type")){if("no_ajax"==select.data("search-type"))return;search_type="edd_"+select.data("search-type")+"_search"}val.length<=3&&"edd_download_search"==search_type||16==lastKey||13==lastKey||91==lastKey||17==lastKey||37==lastKey||38==lastKey||39==lastKey||40==lastKey||(clearTimeout(typingTimer),typingTimer=setTimeout(function(){$.ajax({type:"GET",url:ajaxurl,data:{action:search_type,s:val,no_bundles:no_bundles,variations:variations},dataType:"json",beforeSend:function(){select.closest("ul.chosen-results").empty()},success:function(data){$("option:not(:selected)",select).remove(),$.each(data,function(key,item){$('option[value="'+item.id+'"]',select).length||select.prepend('<option value="'+item.id+'">'+item.name+"</option>")}),$(".edd-select-chosen").trigger("chosen:updated"),select.next().find("input").val(val)}}).fail(function(response){window.console&&window.console.log&&console.log(response)}).done(function(response){})},342))}),$("#post").on("click",".edd-thickbox",function(){$(".edd-select-chosen","#choose-download").css("width","100%")}),{init:function(){this.revoke_api_key(),this.regenerate_api_key(),this.create_api_key(),this.recount_stats()},revoke_api_key:function(){$(document.body).on("click",".edd-revoke-api-key",function(e){return confirm(edd_vars.revoke_api_key)})},regenerate_api_key:function(){$(document.body).on("click",".edd-regenerate-api-key",function(e){return confirm(edd_vars.regenerate_api_key)})},create_api_key:function(){$(document.body).on("submit","#api-key-generate-form",function(e){var input=$('input[type="text"][name="user_id"]');input.css("border-color","#ddd");var user_id=input.val();if(user_id.length<1||0==user_id)return input.css("border-color","#ff0000"),!1})},recount_stats:function(){$(document.body).on("change","#recount-stats-type",function(){var export_form=$("#edd-tools-recount-form"),selected_type=$("option:selected",this).data("type"),submit_button=$("#recount-stats-submit"),products=$("#tools-product-dropdown");export_form.find(".notice-wrap").remove(),submit_button.removeClass("button-disabled").attr("disabled",!1),products.hide(),$(".edd-recount-stats-descriptions span").hide(),"recount-download"===selected_type?(products.show(),products.find(".edd-select-chosen").css("width","auto")):"reset-stats"===selected_type?(export_form.append('<div class="notice-wrap"></div>'),export_form.find(".notice-wrap").html('<div class="notice notice-warning"><p><input type="checkbox" id="confirm-reset" name="confirm_reset_store" value="1" /> <label for="confirm-reset">'+edd_vars.reset_stats_warn+"</label></p></div>"),$("#recount-stats-submit").addClass("button-disabled").attr("disabled","disabled")):(products.hide(),products.val(0)),$("#"+selected_type).show()}),$(document.body).on("change","#confirm-reset",function(){$(this).is(":checked")?$("#recount-stats-submit").removeClass("button-disabled").removeAttr("disabled"):$("#recount-stats-submit").addClass("button-disabled").attr("disabled","disabled")}),$("#edd-tools-recount-form").submit(function(e){var selection=$("#recount-stats-type").val(),export_form=$(this),selected_type=$("option:selected",this).data("type");if("reset-stats"===selected_type){if($("#confirm-reset").is(":checked"))return!0;has_errors=!0}export_form.find(".notice-wrap").remove(),export_form.append('<div class="notice-wrap"></div>');var notice_wrap=export_form.find(".notice-wrap"),has_errors=!1;if(null!==selection&&0!==selection||(notice_wrap.html('<div class="updated error"><p>'+edd_vars.batch_export_no_class+"</p></div>"),has_errors=!0),"recount-download"===selected_type&&0==$('select[name="download_id"]').val()&&(notice_wrap.html('<div class="updated error"><p>'+edd_vars.batch_export_no_reqs+"</p></div>"),has_errors=!0),has_errors)return export_form.find(".button-disabled").removeClass("button-disabled"),!1})}}.init(),{init:function(){this.submit(),this.dismiss_message()},submit:function(){var self=this;$(document.body).on("submit",".edd-export-form",function(data){data.preventDefault();var submitButton=$(this).find('input[type="submit"]');submitButton.hasClass("button-disabled")||(data=$(this).serialize(),submitButton.addClass("button-disabled"),$(this).find(".notice-wrap").remove(),$(this).append('<div class="notice-wrap"><span class="spinner is-active"></span><div class="edd-progress"><div></div></div></div>'),self.process_step(1,data,self))})},process_step:function(step,data,self){$.ajax({type:"POST",url:ajaxurl,data:{form:data,action:"edd_do_ajax_export",step:step},dataType:"json",success:function(response){var export_form,notice_wrap,success_message;"done"==response.step||response.error||response.success?(notice_wrap=(export_form=$(".edd-export-form").find(".edd-progress").parent().parent()).find(".notice-wrap"),export_form.find(".button-disabled").removeClass("button-disabled"),response.error?(success_message=response.message,notice_wrap.html('<div class="updated error"><p>'+success_message+"</p></div>")):response.success?(success_message=response.message,notice_wrap.html('<div id="edd-batch-success" class="updated notice is-dismissible"><p>'+success_message+'<span class="notice-dismiss"></span></p></div>')):(notice_wrap.remove(),window.location=response.url)):($(".edd-progress div").animate({width:response.percentage+"%"},50,function(){}),self.process_step(parseInt(response.step),data,self))}}).fail(function(response){window.console&&window.console.log&&console.log(response)})},dismiss_message:function(){$(document.body).on("click","#edd-batch-success .notice-dismiss",function(){$("#edd-batch-success").parent().slideUp("fast")})}}.init();var EDD_Import={init:function(){this.submit()},submit:function(){$(".edd-import-form").ajaxForm({beforeSubmit:this.before_submit,success:this.success,complete:this.complete,dataType:"json",error:this.error})},before_submit:function(arr,notice_wrap,options){if(notice_wrap.find(".notice-wrap").remove(),notice_wrap.append('<div class="notice-wrap"><span class="spinner is-active"></span><div class="edd-progress"><div></div></div></div>'),!(window.File&&window.FileReader&&window.FileList&&window.Blob)){var import_form=$(".edd-import-form").find(".edd-progress").parent().parent(),notice_wrap=import_form.find(".notice-wrap");return import_form.find(".button-disabled").removeClass("button-disabled"),notice_wrap.html('<div class="update error"><p>'+edd_vars.unsupported_browser+"</p></div>"),!1}},success:function(responseText,statusText,xhr,$form){},complete:function(xhr){var $form,select,options,columns,response=jQuery.parseJSON(xhr.responseText);response.success?(($form=$(".edd-import-form .notice-wrap").parent()).find(".edd-import-file-wrap,.notice-wrap").remove(),$form.find(".edd-import-options").slideDown(),(select=$form.find("select.edd-import-csv-column")).parents("tr").first(),options="",columns=response.data.columns.sort(function(a,b){return a<b?-1:b<a?1:0}),$.each(columns,function(key,value){options+='<option value="'+value+'">'+value+"</option>"}),select.append(options),select.on("change",function(){var $key=$(this).val();$key&&0!=response.data.first_row[$key]?$(this).parent().next().html(response.data.first_row[$key]):$(this).parent().next().html("")}),$.each(select,function(){$(this).val($(this).attr("data-field")).change()}),$(document.body).on("click",".edd-import-proceed",function(e){e.preventDefault(),$form.append('<div class="notice-wrap"><span class="spinner is-active"></span><div class="edd-progress"><div></div></div></div>'),response.data.mapping=$form.serialize(),EDD_Import.process_step(1,response.data,self)})):EDD_Import.error(xhr)},error:function(notice_wrap){var response=jQuery.parseJSON(notice_wrap.responseText),import_form=$(".edd-import-form").find(".edd-progress").parent().parent(),notice_wrap=import_form.find(".notice-wrap");import_form.find(".button-disabled").removeClass("button-disabled"),response.data.error?notice_wrap.html('<div class="update error"><p>'+response.data.error+"</p></div>"):notice_wrap.remove()},process_step:function(step,import_data,self){$.ajax({type:"POST",url:ajaxurl,data:{form:import_data.form,nonce:import_data.nonce,class:import_data.class,upload:import_data.upload,mapping:import_data.mapping,action:"edd_do_ajax_import",step:step},dataType:"json",success:function(response){var import_form,notice_wrap;"done"==response.data.step||response.data.error?(notice_wrap=(import_form=$(".edd-import-form").find(".edd-progress").parent().parent()).find(".notice-wrap"),import_form.find(".button-disabled").removeClass("button-disabled"),response.data.error?notice_wrap.html('<div class="update error"><p>'+response.data.error+"</p></div>"):(import_form.find(".edd-import-options").hide(),$("html, body").animate({scrollTop:import_form.parent().offset().top},500),notice_wrap.html('<div class="updated"><p>'+response.data.message+"</p></div>"))):($(".edd-progress div").animate({width:response.data.percentage+"%"},50,function(){}),EDD_Import.process_step(parseInt(response.data.step),import_data,self))}}).fail(function(response){window.console&&window.console.log&&console.log(response)})}};EDD_Import.init();var EDD_Customer={vars:{customer_card_wrap_editable:$(".edd-customer-card-wrapper .editable"),customer_card_wrap_edit_item:$(".edd-customer-card-wrapper .edit-item"),user_id:$('input[name="customerinfo[user_id]"]'),state_input:$(':input[name="customerinfo[state]"]'),note:$("#customer-note")},init:function(){this.edit_customer(),this.add_email(),this.user_search(),this.remove_user(),this.cancel_edit(),this.change_country(),this.add_note(),this.delete_checked()},edit_customer:function(){$(document.body).on("click","#edit-customer",function(e){e.preventDefault(),EDD_Customer.vars.customer_card_wrap_editable.hide(),EDD_Customer.vars.customer_card_wrap_edit_item.fadeIn().css("display","block")})},add_email:function(){$(document.body).on("click","#add-customer-email",function(nonce){nonce.preventDefault();var button=$(this),wrapper=button.parent();wrapper.parent().find(".notice-container").remove(),wrapper.find(".spinner").css("visibility","visible"),button.attr("disabled",!0);var customer_id=wrapper.find('input[name="customer-id"]').val(),email=wrapper.find('input[name="additional-email"]').val(),primary=wrapper.find('input[name="make-additional-primary"]').is(":checked"),nonce=wrapper.find('input[name="add_email_nonce"]').val();$.post(ajaxurl,{edd_action:"customer-add-email",customer_id:customer_id,email:email,primary:primary,_wpnonce:nonce},function(response){!0===response.success?window.location.href=response.redirect:(button.attr("disabled",!1),wrapper.after('<div class="notice-container"><div class="notice notice-error inline"><p>'+response.message+"</p></div></div>"),wrapper.find(".spinner").css("visibility","hidden"))},"json")})},user_search:function(){$(document.body).on("click.eddSelectUser",".edd_user_search_results a",function(user_id){user_id.preventDefault();user_id=$(this).data("userid");EDD_Customer.vars.user_id.val(user_id)})},remove_user:function(){$(document.body).on("click","#disconnect-customer",function(postData){postData.preventDefault(),confirm(edd_vars.disconnect_customer)&&(postData={edd_action:"disconnect-userid",customer_id:$('input[name="customerinfo[id]"]').val(),_wpnonce:$("#edit-customer-info #_wpnonce").val()},$.post(ajaxurl,postData,function(response){window.location.href=window.location.href},"json"))})},cancel_edit:function(){$(document.body).on("click","#edd-edit-customer-cancel",function(e){e.preventDefault(),EDD_Customer.vars.customer_card_wrap_edit_item.hide(),EDD_Customer.vars.customer_card_wrap_editable.show(),$(".edd_user_search_results").html("")})},change_country:function(){$('select[name="customerinfo[country]"]').change(function(){var $this=$(this),data={action:"edd_get_shop_states",country:$this.val(),nonce:$this.data("nonce"),field_name:"customerinfo[state]"};return $.post(ajaxurl,data,function(response){"nostates"==response?EDD_Customer.vars.state_input.replaceWith('<input type="text" name="'+data.field_name+'" value="" class="edd-edit-toggles medium-text"/>'):EDD_Customer.vars.state_input.replaceWith(response)}),!1})},add_note:function(){$(document.body).on("click","#add-customer-note",function(postData){postData.preventDefault();var border_color,postData={edd_action:"add-customer-note",customer_id:$("#customer-id").val(),customer_note:EDD_Customer.vars.note.val(),add_customer_note_nonce:$("#add_customer_note_nonce").val()};postData.customer_note?$.ajax({type:"POST",data:postData,url:ajaxurl,success:function(response){$("#edd-customer-notes").prepend(response),$(".edd-no-customer-notes").hide(),EDD_Customer.vars.note.val("")}}).fail(function(data){window.console&&window.console.log&&console.log(data)}):(border_color=EDD_Customer.vars.note.css("border-color"),EDD_Customer.vars.note.css("border-color","red"),setTimeout(function(){EDD_Customer.vars.note.css("border-color",border_color)},500))})},delete_checked:function(){$("#edd-customer-delete-confirm").change(function(){var records_input=$("#edd-customer-delete-records"),submit_button=$("#edd-delete-customer");$(this).prop("checked")?(records_input.attr("disabled",!1),submit_button.attr("disabled",!1)):(records_input.attr("disabled",!0),records_input.prop("checked",!1),submit_button.attr("disabled",!0))})}};EDD_Customer.init();var EDD_Promo_Notices={init:function(){EDD_Promo_Notices.displayNotices(),EDD_Promo_Notices.dismissNotices()},displayNotices:function(){var topOfPageNoticeEl,topOfPageNotice=$(".edd-admin-notice-top-of-page");topOfPageNotice&&(topOfPageNoticeEl=topOfPageNotice.detach(),$("#wpbody-content").prepend(topOfPageNoticeEl),topOfPageNotice.delay(1e3).slideDown())},dismissNotices:function(){$(".edd-promo-notice").each(function(){var notice=$(this);notice.on("click",".edd-promo-notice-dismiss",function(e){e.preventDefault(),$.ajax({type:"POST",data:{action:"edd_dismiss_promo_notice",notice_id:notice.data("id"),nonce:notice.data("nonce"),lifespan:notice.data("lifespan")},url:ajaxurl,success:function(response){notice.slideUp()}})})})}};EDD_Promo_Notices.init(),$(".edd-ajax-user-search").keyup(function(){var user_search=$(this).val(),data="";$(this).data("exclude")&&(data=$(this).data("exclude")),$(".edd-ajax").show();data={action:"edd_search_users",user_name:user_search,exclude:data};document.body.style.cursor="wait",$.ajax({type:"POST",data:data,dataType:"json",url:ajaxurl,success:function(search_response){$(".edd-ajax").hide(),$(".edd_user_search_results").removeClass("hidden"),$(".edd_user_search_results span").html(""),$(search_response.results).appendTo(".edd_user_search_results span"),document.body.style.cursor="default"}})}),$(document.body).on("click.eddSelectUser",".edd_user_search_results span a",function(login){login.preventDefault();login=$(this).data("login");$(".edd-ajax-user-search").val(login),$(".edd_user_search_results").addClass("hidden"),$(".edd_user_search_results span").html("")}),$(document.body).on("click.eddCancelUserSearch",".edd_user_search_results a.edd-ajax-user-cancel",function(e){e.preventDefault(),$(".edd-ajax-user-search").val(""),$(".edd_user_search_results").addClass("hidden"),$(".edd_user_search_results span").html("")}),$("#edd_dashboard_sales").length&&$.ajax({type:"GET",data:{action:"edd_load_dashboard_widget"},url:ajaxurl,success:function(response){$("#edd_dashboard_sales .inside").html(response)}}),$(document.body).on("keydown",".customer-note-input",function(e){13==e.keyCode&&(e.metaKey||e.ctrlKey)&&$("#add-customer-note").click()})});var eddFormatCurrency=function(decimalPlaces){var numeric=parseFloat(decimalPlaces),storeCurrency=edd_vars.currency,decimalPlaces=edd_vars.currency_decimals;return numeric.toLocaleString(storeCurrency,{style:"currency",currency:storeCurrency,minimumFractionDigits:decimalPlaces,maximumFractionDigits:decimalPlaces})},eddFormatNumber=function(storeCurrency){var numeric=parseFloat(storeCurrency),storeCurrency=edd_vars.currency;edd_vars.currency_decimals;return numeric.toLocaleString(storeCurrency,{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0})},eddLabelFormatter=function(label,series){return'<div style="font-size:12px; text-align:center; padding:2px">'+label+"</div>"},eddLegendFormatterSales=function(item,series){var slug=item.toLowerCase().replace(/\s/g,"-"),color='<div class="edd-legend-color" style="background-color: '+series.color+'"></div>',item='<div class="edd-pie-legend-item">'+item+": "+Math.round(series.percent)+"% ("+eddFormatNumber(series.data[0][1])+")</div>",item='<div id="'+series.edd_vars.id+slug+'" class="edd-legend-item-wrapper">'+color+item+"</div>";return jQuery("#edd-pie-legend-"+series.edd_vars.id).append(item),item},eddLegendFormatterEarnings=function(item,series){var slug=item.toLowerCase().replace(/\s/g,"-"),color='<div class="edd-legend-color" style="background-color: '+series.color+'"></div>',item='<div class="edd-pie-legend-item">'+item+": "+Math.round(series.percent)+"% ("+eddFormatCurrency(series.data[0][1])+")</div>",item='<div id="'+series.edd_vars.id+slug+'" class="edd-legend-item-wrapper">'+color+item+"</div>";return jQuery("#edd-pie-legend-"+series.edd_vars.id).append(item),item};function edd_attach_tooltips(selector){selector.tooltip({content:function(){return jQuery(this).prop("title")},tooltipClass:"edd-ui-tooltip",position:{my:"center top",at:"center bottom+10",collision:"flipfit"},hide:{duration:200},show:{duration:200}})}function easy_digital_downloads_sendwp_remote_install(){jQuery.post(ajaxurl,{action:"edd_sendwp_remote_install"},function(response){response.success||!confirm(response.data.error)?easy_digital_downloads_sendwp_register_client(response.data.register_url,response.data.client_name,response.data.client_secret,response.data.client_redirect,response.data.partner_id):location.reload()})}function easy_digital_downloads_sendwp_disconnect(){jQuery.post(ajaxurl,{action:"edd_sendwp_disconnect"},function(response){location.reload()})}function easy_digital_downloads_sendwp_register_client(register_url,client_name,client_secret,client_redirect,partner_id){var form=document.createElement("form");function easy_digital_downloads_sendwp_append_form_input(name,value){var input=document.createElement("input");input.setAttribute("type","hidden"),input.setAttribute("name",name),input.setAttribute("value",value),form.appendChild(input)}form.setAttribute("method","POST"),form.setAttribute("action",register_url),easy_digital_downloads_sendwp_append_form_input("client_name",client_name),easy_digital_downloads_sendwp_append_form_input("client_secret",client_secret),easy_digital_downloads_sendwp_append_form_input("client_redirect",client_redirect),easy_digital_downloads_sendwp_append_form_input("partner_id",partner_id),document.body.appendChild(form),form.submit()}function easy_digital_downloads_recapture_remote_install(){jQuery.post(ajaxurl,{action:"edd_recapture_remote_install"},function(response){0==response.success&&confirm(response.data.error)?location.reload():window.location.href="https://recapture.io/register"})}
1
+ jQuery(document).ready(function($){edd_attach_tooltips($(".edd-help-tip"));var EDD_Download_Configuration={init:function(){this.add(),this.move(),this.remove(),this.type(),this.prices(),this.files(),this.updatePrices()},clone_repeatable:function(row){var key;highest=1;return row.parent().find(".edd_repeatable_row").each(function(){var current=$(this).data("key");parseInt(current)>highest&&(highest=current)}),key=highest+=1,clone=row.clone(),clone.removeClass("edd_add_blank"),clone.attr("data-key",key),clone.find("input, select, textarea").val("").each(function(){var name=$(this).attr("name"),id=$(this).attr("id");name&&(name=name.replace(/\[(\d+)\]/,"["+parseInt(key)+"]"),$(this).attr("name",name)),$(this).attr("data-key",key),void 0!==id&&(id=id.replace(/(\d+)/,parseInt(key)),$(this).attr("id",id))}),clone.find("select").each(function(){$(this).val(row.find('select[name="'+$(this).attr("name")+'"]').val())}),clone.find('input[type="checkbox"]').each(function(){$(this).is(":checked")&&$(this).prop("checked",!1),$(this).val(1)}),clone.find("span.edd_price_id").each(function(){$(this).text(parseInt(key))}),clone.find("span.edd_file_id").each(function(){$(this).text(parseInt(key))}),clone.find(".edd_repeatable_default_input").each(function(){$(this).val(parseInt(key)).removeAttr("checked")}),clone.find(".edd_repeatable_index").each(function(){$(this).val(parseInt(key))}),clone.find(".edd_repeatable_condition_field").each(function(){$(this).find("option:eq(0)").prop("selected","selected")}),clone.find(".search-choice").remove(),clone.find(".chosen-container").remove(),edd_attach_tooltips(clone.find(".edd-help-tip")),clone},add:function(){$(document.body).on("click",".submit .edd_add_repeatable",function(clone){clone.preventDefault();var row=$(this).parent().parent().prev(".edd_repeatable_row"),clone=EDD_Download_Configuration.clone_repeatable(row);clone.insertAfter(row).find("input, textarea, select").filter(":visible").eq(0).focus(),clone.find(".edd-select-chosen").chosen({inherit_select_classes:!0,placeholder_text_single:edd_vars.one_option,placeholder_text_multiple:edd_vars.one_or_more_option}),clone.find(".edd-select-chosen").css("width","100%"),clone.find(".edd-select-chosen .chosen-search input").attr("placeholder",edd_vars.search_placeholder)})},move:function(){$(".edd_repeatable_table .edd-repeatables-wrap").sortable({handle:".edd-draghandle-anchor",items:".edd_repeatable_row",opacity:.6,cursor:"move",axis:"y",update:function(){var count=0;$(this).find(".edd_repeatable_row").each(function(){$(this).find("input.edd_repeatable_index").each(function(){$(this).val(count)}),count++})}})},remove:function(){$(document.body).on("click",".edd-remove-row, .edd_remove_repeatable",function(firstFocusable){firstFocusable.preventDefault();var row=$(this).parents(".edd_repeatable_row"),count=row.parent().find(".edd_repeatable_row").length,type=$(this).data("type"),repeatable="div.edd_repeatable_"+type+"s",price_row_id=$(this).is(".ui-sortable .edd_repeatable_row:first-child .edd-remove-row, .ui-sortable .edd_repeatable_row:first-child .edd_remove_repeatable")?row.next(".edd_repeatable_row"):row.prev(".edd_repeatable_row"),firstFocusable=price_row_id.find("select, input, textarea, button").filter(":visible").eq(0);if("price"===type&&(price_row_id=row.data("key"),$('.edd_repeatable_condition_field option[value="'+price_row_id+'"]').remove()),1<count)$("input, select",row).val(""),row.fadeOut("fast").remove(),firstFocusable.focus();else switch(type){case"price":alert(edd_vars.one_price_min);break;case"file":$("input, select",row).val("");break;default:alert(edd_vars.one_field_min)}$(repeatable).each(function(rowIndex){$(this).find("input, select").each(function(){var name=(name=$(this).attr("name")).replace(/\[(\d+)\]/,"["+rowIndex+"]");$(this).attr("name",name).attr("id",name)})})})},type:function(){$(document.body).on("change","#_edd_product_type",function(e){var edd_products=$("#edd_products"),edd_download_files=$("#edd_download_files"),edd_download_limit_wrap=$("#edd_download_limit_wrap");"bundle"===$(this).val()?(edd_products.show(),edd_download_files.hide(),edd_download_limit_wrap.hide()):(edd_products.hide(),edd_download_files.show(),edd_download_limit_wrap.show())})},prices:function(){$(document.body).on("change","#edd_variable_pricing",function(e){var checked=$(this).is(":checked"),single=$("#edd_regular_price_field"),variable=$("#edd_variable_price_fields, .edd_repeatable_table .pricing"),bundleRow=$(".edd-bundled-product-row, .edd-repeatable-row-standard-fields");checked?(single.hide(),variable.show(),bundleRow.addClass("has-variable-pricing")):(single.show(),variable.hide(),bundleRow.removeClass("has-variable-pricing"))})},files:function(){var file_frame;window.formfield="",$(document.body).on("click",".edd_upload_file_button",function(button){button.preventDefault();button=$(this);window.formfield=$(this).closest(".edd_repeatable_upload_wrapper"),file_frame||((file_frame=wp.media.frames.file_frame=wp.media({frame:"post",state:"insert",title:button.data("uploader-title"),button:{text:button.data("uploader-button-text")},multiple:"0"!=$(this).data("multiple")})).on("menu:render:default",function(view){view.unset("library-separator"),view.unset("gallery"),view.unset("featured-image"),view.unset("embed"),view.set({})}),file_frame.on("insert",function(){file_frame.state().get("selection").each(function(attachment,clone){var row,selectedSize="image"===(attachment=attachment.toJSON()).type&&$(".attachment-display-settings .size option:selected").val(),selectedURL=attachment.url,selectedName=0<attachment.title.length?attachment.title:attachment.filename;selectedSize&&void 0!==attachment.sizes[selectedSize]&&(selectedURL=attachment.sizes[selectedSize].url),"image"===attachment.type&&(selectedName=selectedSize&&void 0!==attachment.sizes[selectedSize]?selectedName+"-"+attachment.sizes[selectedSize].width+"x"+attachment.sizes[selectedSize].height:selectedName+"-"+attachment.width+"x"+attachment.height),0===clone?(window.formfield.find(".edd_repeatable_attachment_id_field").val(attachment.id),window.formfield.find(".edd_repeatable_thumbnail_size_field").val(selectedSize),window.formfield.find(".edd_repeatable_upload_field").val(selectedURL),window.formfield.find(".edd_repeatable_name_field").val(selectedName)):(row=window.formfield,(clone=EDD_Download_Configuration.clone_repeatable(row)).find(".edd_repeatable_attachment_id_field").val(attachment.id),clone.find(".edd_repeatable_thumbnail_size_field").val(selectedSize),clone.find(".edd_repeatable_upload_field").val(selectedURL),clone.find(".edd_repeatable_name_field").val(selectedName),clone.insertAfter(row))})})),file_frame.open()}),window.formfield=""},updatePrices:function(){$("#edd_price_fields").on("keyup",".edd_variable_prices_name",function(){var key=$(this).parents(".edd_repeatable_row").data("key"),name=$(this).val(),field_option=$(".edd_repeatable_condition_field option[value="+key+"]");0<field_option.length?field_option.text(name):$(".edd_repeatable_condition_field").append($("<option></option>").attr("value",key).text(name))})}};$(document.body).on("click",".toggle-custom-price-option-section",function(header){header.preventDefault();var show=$(this).html()==edd_vars.show_advanced_settings;show?$(this).html(edd_vars.hide_advanced_settings):$(this).html(edd_vars.show_advanced_settings);header=$(this).parents(".edd-repeatable-row-header");header.siblings(".edd-custom-price-option-sections-wrap").slideToggle(),$(":input:not(input[type=button],input[type=submit],button):visible:first",show?header.siblings(".edd-custom-price-option-sections-wrap"):header.siblings(".edd-repeatable-row-standard-fields")).focus()}),EDD_Download_Configuration.init();var typingTimer,edd_datepicker=$(".edd_datepicker");0<edd_datepicker.length&&edd_datepicker.datepicker({dateFormat:"mm/dd/yy"}),{init:function(){this.edit_address(),this.remove_download(),this.add_download(),this.change_customer(),this.new_customer(),this.edit_price(),this.recalculate_total(),this.variable_prices_check(),this.add_note(),this.remove_note(),this.resend_receipt(),this.copy_download_link()},edit_address:function(){$('select[name="edd-payment-address[0][country]"]').change(function(){var data=$(this),data={action:"edd_get_shop_states",country:data.val(),nonce:data.data("nonce"),field_name:"edd-payment-address[0][state]"};return $.post(ajaxurl,data,function(response){var state_wrapper=$("#edd-order-address-state-wrap select, #edd-order-address-state-wrap input");$("#edd-order-address-state-wrap .chosen-container").remove(),"nostates"==response?state_wrapper.replaceWith('<input type="text" name="edd-payment-address[0][state]" value="" class="edd-edit-toggles medium-text"/>'):state_wrapper.replaceWith(response)}),!1})},remove_download:function(){$("#edd-purchased-files").on("click",".edd-order-remove-download",function(){var key,download_id,price_id,quantity,amount,fees,currently_removed;return 1===$(document.body).find("#edd-purchased-files > .row:not(.header)").length?alert(edd_vars.one_download_min):confirm(edd_vars.delete_payment_download)&&(key=$(this).data("key"),$(".edd-payment-id").val(),download_id=$('input[name="edd-payment-details-downloads['+key+'][id]"]').val(),price_id=$('input[name="edd-payment-details-downloads['+key+'][price_id]"]').val(),quantity=$('input[name="edd-payment-details-downloads['+key+'][quantity]"]').val(),amount=$('input[name="edd-payment-details-downloads['+key+'][amount]"]').val(),$('input[name="edd-payment-details-downloads['+key+'][tax]"]').length&&(fees=$('input[name="edd-payment-details-downloads['+key+'][tax]"]').val()),$('input[name="edd-payment-details-downloads['+key+'][fees]"]').length&&(fees=$.parseJSON($('input[name="edd-payment-details-downloads['+key+'][fees]"]').val())),currently_removed=$('input[name="edd-payment-removed"]').val(),(currently_removed=(currently_removed=$.parseJSON(currently_removed)).length<1?{}:currently_removed)[key]=[{id:download_id,price_id:price_id,quantity:quantity,amount:amount,cart_index:key}],$('input[name="edd-payment-removed"]').val(JSON.stringify(currently_removed)),$(this).parent().parent().remove(),fees&&fees.length&&$.each(fees,function(key,value){$('*li[data-fee-id="'+value+'"]').remove()}),$("#edd-payment-downloads-changed").val(1),$(".edd-order-payment-recalc-totals").show()),!1})},change_customer:function(){$("#edd-customer-details").on("click",".edd-payment-change-customer, .edd-payment-change-customer-cancel",function(cancel){cancel.preventDefault();var change_customer=$(this).hasClass("edd-payment-change-customer"),cancel=$(this).hasClass("edd-payment-change-customer-cancel");change_customer?($(".customer-info").hide(),$(".change-customer").show(),$(".edd-payment-change-customer-input").css("width","auto")):cancel&&($(".customer-info").show(),$(".change-customer").hide())})},new_customer:function(){$("#edd-customer-details").on("click",".edd-payment-new-customer, .edd-payment-new-customer-cancel",function(cancel){cancel.preventDefault();var new_customer=$(this).hasClass("edd-payment-new-customer"),cancel=$(this).hasClass("edd-payment-new-customer-cancel");new_customer?($(".customer-info").hide(),$(".new-customer").show()):cancel&&($(".customer-info").show(),$(".new-customer").hide());new_customer=$("#edd-new-customer");$(".new-customer").is(":visible")?new_customer.val(1):new_customer.val(0)})},add_download:function(){$(".edd-edit-purchase-element").on("click","#edd-order-add-download",function(download_title){download_title.preventDefault();var quantity=$("#edd_order_download_select"),item_price=$("#edd-order-download-quantity"),item_total=$("#edd-order-download-price"),price_id=$("#edd-order-download-tax"),clone=$(".edd_price_options_select option:selected"),download_id=quantity.val(),download_title=quantity.find(":selected").text(),quantity=item_price.val(),item_price=item_total.val(),item_total=price_id.val(),price_id=clone.val(),clone=clone.text();if(download_id<1)return!1;if(item_price=item_price||0,item_price=parseFloat(item_price),isNaN(item_price))return alert(edd_vars.numeric_item_price),!1;if(item_total=parseFloat(item_total),isNaN(item_total))return alert(edd_vars.numeric_item_tax),!1;if(isNaN(parseInt(quantity)))return alert(edd_vars.numeric_quantity),!1;clone&&(download_title=download_title+" - "+clone);var count=$("#edd-purchased-files div.row:not(.edd-purchased-files-header)").length;0==count&&alert(edd_vars.no_downloads_error);clone=$("#edd-purchased-files div.row:not(.edd-purchased-files-header):last").clone();clone.find(".download span").html('<a href="post.php?post='+download_id+'&action=edit"></a>'),clone.find(".download span a").text(download_title),clone.find(".edd-payment-details-download-item-price").val(item_price.toFixed(edd_vars.currency_decimals)),clone.find(".edd-payment-details-download-item-tax").val(item_total.toFixed(edd_vars.currency_decimals)),clone.find("input.edd-payment-details-download-id").val(download_id),clone.find("input.edd-payment-details-download-price-id").val(price_id);item_total=(item_total=item_price*quantity+item_total).toFixed(edd_vars.currency_decimals);clone.find("span.edd-payment-details-download-amount").text(item_total),clone.find("input.edd-payment-details-download-amount").val(item_total),clone.find("input.edd-payment-details-download-quantity").val(quantity),clone.find("input.edd-payment-details-download-has-log").val(0),clone.find(".edd-copy-download-link-wrapper").remove(),clone.find("input").each(function(){var name=(name=$(this).attr("name")).replace(/\[(\d+)\]/,"["+parseInt(count)+"]");$(this).attr("name",name).attr("id",name)}),clone.find("a.edd-order-remove-download").attr("data-key",parseInt(count)),$("#edd-payment-downloads-changed").val(1),$("#edd-purchased-files div.row .edd-purchased-download-title .deleted").length&&$("#edd-purchased-files div.row:last").remove(),$(clone).insertAfter("#edd-purchased-files div.row:last"),$(".edd-order-payment-recalc-totals").show(),$(".edd-add-download-field").val("")})},edit_price:function(){$(document.body).on("change keyup",".edd-payment-item-input",function(){var row=$(this).parents("ul.edd-purchased-files-list-wrapper");$(".edd-order-payment-recalc-totals").show();var quantity=row.find("input.edd-payment-details-download-quantity").val().replace(edd_vars.thousands_separator,""),item_price=row.find("input.edd-payment-details-download-item-price").val().replace(edd_vars.thousands_separator,""),item_total=row.find("input.edd-payment-details-download-item-tax").val().replace(edd_vars.thousands_separator,""),item_price=parseFloat(item_price);if(isNaN(item_price))return alert(edd_vars.numeric_item_price),!1;item_total=parseFloat(item_total),isNaN(item_total)&&(item_total=0);item_total=(item_total=item_price*(quantity=isNaN(parseInt(quantity))?1:quantity)+item_total).toFixed(edd_vars.currency_decimals);row.find("input.edd-payment-details-download-amount").val(item_total),row.find("span.edd-payment-details-download-amount").text(item_total)})},recalculate_total:function(){$("#edd-order-recalc-total").on("click",function(taxes){taxes.preventDefault();var total=0,tax=0,totals=$("#edd-purchased-files .row input.edd-payment-details-download-amount"),taxes=$("#edd-purchased-files .row input.edd-payment-details-download-item-tax");totals.length&&totals.each(function(){total+=parseFloat($(this).val())}),taxes.length&&taxes.each(function(){tax+=parseFloat($(this).val())}),$(".edd-payment-fees").length&&$(".edd-payment-fees span.fee-amount").each(function(){total+=parseFloat($(this).data("fee"))}),$("input[name=edd-payment-total]").val(total.toFixed(edd_vars.currency_decimals)),$("input[name=edd-payment-tax]").val(tax.toFixed(edd_vars.currency_decimals))})},variable_prices_check:function(){$(".edd-edit-purchase-element").on("change","select#edd_order_download_select",function(){var $this=$(this),download_id=$this.val();0<parseInt(download_id)&&$.ajax({type:"POST",data:{action:"edd_check_for_download_price_variations",download_id:download_id},url:ajaxurl,success:function(response){$(".edd_price_options_select").remove(),$(response).insertAfter($this.next())}}).fail(function(data){window.console&&window.console.log&&console.log(data)})})},add_note:function(){$("#edd-add-payment-note").on("click",function(postData){postData.preventDefault();var border_color,postData={action:"edd_insert_payment_note",payment_id:$(this).data("payment-id"),note:$("#edd-payment-note").val()};postData.note?$.ajax({type:"POST",data:postData,url:ajaxurl,success:function(response){$("#edd-payment-notes-inner").append(response),$(".edd-no-payment-notes").hide(),$("#edd-payment-note").val("")}}).fail(function(data){window.console&&window.console.log&&console.log(data)}):(border_color=$("#edd-payment-note").css("border-color"),$("#edd-payment-note").css("border-color","red"),setTimeout(function(){$("#edd-payment-note").css("border-color",border_color)},500))})},remove_note:function(){$(document.body).on("click",".edd-delete-payment-note",function(e){if(e.preventDefault(),confirm(edd_vars.delete_payment_note)){var postData={action:"edd_delete_payment_note",payment_id:$(this).data("payment-id"),note_id:$(this).data("note-id")};return $.ajax({type:"POST",data:postData,url:ajaxurl,success:function(response){return $("#edd-payment-note-"+postData.note_id).remove(),$(".edd-payment-note").length||$(".edd-no-payment-notes").show(),!1}}).fail(function(data){window.console&&window.console.log&&console.log(data)}),!0}})},resend_receipt:function(){var emails_wrap=$(".edd-order-resend-receipt-addresses");$(document.body).on("click","#edd-select-receipt-email",function(e){e.preventDefault(),emails_wrap.slideDown()}),$(document.body).on("change",".edd-order-resend-receipt-email",function(){var href=$("#edd-select-receipt-email").prop("href")+"&email="+$(this).val();confirm(edd_vars.resend_receipt)&&(window.location=href)}),$(document.body).on("click","#edd-resend-receipt",function(e){return confirm(edd_vars.resend_receipt)})},copy_download_link:function(){$(document.body).on("click",".edd-copy-download-link",function(postData){postData.preventDefault();postData=$(this),postData={action:"edd_get_file_download_link",payment_id:$('input[name="edd_payment_id"]').val(),download_id:postData.data("download-id"),price_id:postData.data("price-id")};$.ajax({type:"POST",data:postData,url:ajaxurl,success:function(link){return $("#edd-download-link").dialog({width:400}).html('<textarea rows="10" cols="40" id="edd-download-link-textarea">'+link+"</textarea>"),$("#edd-download-link-textarea").focus().select(),!1}}).fail(function(data){window.console&&window.console.log&&console.log(data)})})}}.init(),{init:function(){this.type_select(),this.product_requirements()},type_select:function(){$("#edd-edit-discount #edd-type, #edd-add-discount #edd-type").change(function(){var val=$(this).val();$(".edd-amount-description").hide(),$(".edd-amount-description."+val+"-discount").show()})},product_requirements:function(){$("#products").change(function(){var product_conditions=$("#edd-discount-product-conditions");$(this).val()?product_conditions.show():product_conditions.hide()})}}.init(),{init:function(){this.date_options(),this.customers_export()},date_options:function(){$("#edd-graphs-date-options").change(function(){var $this=$(this),date_range_options=$("#edd-date-range-options");"other"===$this.val()?date_range_options.show():date_range_options.hide()})},customers_export:function(){$("#edd_customer_export_download").change(function(){var price_options_select,$this=$(this),data=$("option:selected",$this).val(),customer_export_option=$("#edd_customer_export_option");"0"===$this.val()?customer_export_option.show():customer_export_option.hide(),0!=parseInt(data)?(data={action:"edd_check_for_download_price_variations",download_id:data,all_prices:!0},price_options_select=$(".edd_price_options_select"),$.post(ajaxurl,data,function(response){price_options_select.remove(),$("#edd_customer_export_download_chosen").after(response)})):price_options_select.remove()})}}.init(),{init:function(){this.general(),this.taxes(),this.emails(),this.misc()},general:function(){var file_frame,edd_settings_upload_button=$(".edd-color-picker");edd_settings_upload_button.length&&edd_settings_upload_button.wpColorPicker(),"undefined"==typeof wp||"1"!==edd_vars.new_media_ui?0<(edd_settings_upload_button=$(".edd_settings_upload_button")).length&&(window.formfield="",$(document.body).on("click",edd_settings_upload_button,function(e){e.preventDefault(),window.formfield=$(this).parent().prev(),window.tbframe_interval=setInterval(function(){jQuery("#TB_iframeContent").contents().find(".savesend .button").val(edd_vars.use_this_file).end().find("#insert-gallery, .wp-post-thumbnail").hide()},2e3),tb_show(edd_vars.add_new_download,"media-upload.php?TB_iframe=true")}),window.edd_send_to_editor=window.send_to_editor,window.send_to_editor=function(html){window.formfield?(imgurl=$("a","<div>"+html+"</div>").attr("href"),window.formfield.val(imgurl),window.clearInterval(window.tbframe_interval),tb_remove()):window.edd_send_to_editor(html),window.send_to_editor=window.edd_send_to_editor,window.formfield="",window.imagefield=!1}):(window.formfield="",$(document.body).on("click",".edd_settings_upload_button",function(button){button.preventDefault();button=$(this);window.formfield=$(this).parent().prev(),file_frame||((file_frame=wp.media.frames.file_frame=wp.media({frame:"post",state:"insert",title:button.data("uploader_title"),button:{text:button.data("uploader_button_text")},multiple:!1})).on("menu:render:default",function(view){view.unset("library-separator"),view.unset("gallery"),view.unset("featured-image"),view.unset("embed"),view.set({})}),file_frame.on("insert",function(){file_frame.state().get("selection").each(function(attachment,index){attachment=attachment.toJSON(),window.formfield.val(attachment.url)})})),file_frame.open()}),window.formfield="")},taxes:function(){var no_states=$("select.edd-no-states");no_states.length&&no_states.closest("tr").addClass("hidden"),$('select[name="edd_settings[base_country]"]').change(function(){var data=$(this),$tr=data.closest("tr"),data={action:"edd_get_shop_states",country:data.val(),nonce:data.data("nonce"),field_name:"edd_settings[base_state]"};return $.post(ajaxurl,data,function(response){"nostates"==response?$tr.next().addClass("hidden"):($tr.next().removeClass("hidden"),$tr.next().find("select").replaceWith(response))}),!1}),$(document.body).on("change","#edd_tax_rates select.edd-tax-country",function(){var $this=$(this),data={action:"edd_get_shop_states",country:$this.val(),nonce:$this.data("nonce"),field_name:$this.attr("name").replace("country","state")};return $.post(ajaxurl,data,function(response){var text_field;"nostates"==response?(text_field='<input type="text" name="'+data.field_name+'" value=""/>',$this.parent().next().find("select").replaceWith(text_field)):($this.parent().next().find("input,select").show(),$this.parent().next().find("input,select").replaceWith(response))}),!1}),$("#edd_add_tax_rate").on("click",function(){var row=$("#edd_tax_rates tr:last"),clone=row.clone(),count=row.parent().find("tr").length;return clone.find("td input").not(":input[type=checkbox]").val(""),clone.find('td [type="checkbox"]').attr("checked",!1),clone.find("input, select").each(function(){var name=(name=$(this).attr("name")).replace(/\[(\d+)\]/,"["+parseInt(count)+"]");$(this).attr("name",name).attr("id",name)}),clone.find("label").each(function(){var name=(name=$(this).attr("for")).replace(/\[(\d+)\]/,"["+parseInt(count)+"]");$(this).attr("for",name)}),clone.insertAfter(row),!1}),$(document.body).on("click","#edd_tax_rates .edd_remove_tax_rate",function(){return confirm(edd_vars.delete_tax_rate)&&(2===$("#edd_tax_rates tr:visible").length?($("#edd_tax_rates select").val(""),$('#edd_tax_rates input[type="text"]').val(""),$('#edd_tax_rates input[type="number"]').val(""),$('#edd_tax_rates input[type="checkbox"]').attr("checked",!1)):$(this).closest("tr").remove(),$("#edd_tax_rates tr").each(function(rowIndex){$(this).children().find("input, select").each(function(){var name=(name=$(this).attr("name")).replace(/\[(\d+)\]/,"["+(rowIndex-1)+"]");$(this).attr("name",name).attr("id",name)})})),!1})},emails:function(){$("#edd-recapture-connect").on("click",function(e){e.preventDefault(),$(this).html(edd_vars.wait+' <span class="edd-loading"></span>'),document.body.style.cursor="wait",easy_digital_downloads_recapture_remote_install()})},misc:function(){var downloadMethod=$('select[name="edd_settings[download_method]"]'),symlink=downloadMethod.parent().parent().next();"direct"==downloadMethod.val()&&(symlink.hide(),symlink.find("input").prop("checked",!1)),downloadMethod.on("change",function(){"direct"==$(this).val()?(symlink.hide(),symlink.find("input").prop("checked",!1)):symlink.show()})}}.init(),$(".download_page_edd-payment-history .row-actions .delete a, a.edd-delete-payment").on("click",function(){return!!confirm(edd_vars.delete_payment)}),$("body").on("click","#the-list .editinline",function(){var post_id=(post_id=$(this).closest("tr").attr("id")).replace("post-",""),regprice=$("#post-"+post_id).find(".column-price .downloadprice-"+post_id).val();regprice!=$("#post-"+post_id+".column-price .downloadprice-"+post_id).val()?$(".regprice","#edd-download-data").val(regprice).attr("disabled",!1):$(".regprice","#edd-download-data").val(edd_vars.quick_edit_warning).attr("disabled","disabled")}),$(document.body).on("click","#bulk_edit",function(){var $price=$("#bulk-edit"),$post_ids=new Array;$price.find("#bulk-titles").children().each(function(){$post_ids.push($(this).attr("id").replace(/^(ttle)/i,""))});$price=$('#edd-download-data input[name="_edd_regprice"]').val();$.post(ajaxurl,{action:"edd_save_bulk_edit",edd_bulk_nonce:$post_ids,post_ids:$post_ids,price:$price})}),$(".edd-select-chosen").chosen({inherit_select_classes:!0,placeholder_text_single:edd_vars.one_option,placeholder_text_multiple:edd_vars.one_or_more_option}),$(".edd-select-chosen .chosen-search input").each(function(){var placeholder=$(this).parent().parent().parent().prev("select.edd-select-chosen"),placeholder=(placeholder.data("search-type"),placeholder.data("search-placeholder"));$(this).attr("placeholder",placeholder)}),$(".chosen-choices").on("click",function(){var placeholder=$(this).parent().prev().data("search-placeholder");void 0===placeholder&&(placeholder=edd_vars.type_to_search),$(this).children("li").children("input").attr("placeholder",placeholder)});$(document.body).on("keyup",".edd-select.chosen-container .chosen-search input, .edd-select.chosen-container .search-field input",function(lastKey){var val=$(this).val(),container=$(this).closest(".edd-select-chosen"),select=(container.attr("id").replace("_chosen",""),container.prev()),no_bundles=container.hasClass("no-bundles"),variations=container.hasClass("variations"),lastKey=lastKey.which,search_type="edd_download_search";if(container.prev().data("search-type")){if("no_ajax"==select.data("search-type"))return;search_type="edd_"+select.data("search-type")+"_search"}val.length<=3&&"edd_download_search"==search_type||16==lastKey||13==lastKey||91==lastKey||17==lastKey||37==lastKey||38==lastKey||39==lastKey||40==lastKey||(clearTimeout(typingTimer),typingTimer=setTimeout(function(){$.ajax({type:"GET",url:ajaxurl,data:{action:search_type,s:val,no_bundles:no_bundles,variations:variations},dataType:"json",beforeSend:function(){select.closest("ul.chosen-results").empty()},success:function(data){$("option:not(:selected)",select).remove(),$.each(data,function(key,item){$('option[value="'+item.id+'"]',select).length||select.prepend('<option value="'+item.id+'">'+item.name+"</option>")}),$(".edd-select-chosen").trigger("chosen:updated"),select.next().find("input").val(val)}}).fail(function(response){window.console&&window.console.log&&console.log(response)}).done(function(response){})},342))}),$("#post").on("click",".edd-thickbox",function(){$(".edd-select-chosen","#choose-download").css("width","100%")}),{init:function(){this.revoke_api_key(),this.regenerate_api_key(),this.create_api_key(),this.recount_stats()},revoke_api_key:function(){$(document.body).on("click",".edd-revoke-api-key",function(e){return confirm(edd_vars.revoke_api_key)})},regenerate_api_key:function(){$(document.body).on("click",".edd-regenerate-api-key",function(e){return confirm(edd_vars.regenerate_api_key)})},create_api_key:function(){$(document.body).on("submit","#api-key-generate-form",function(e){var input=$('input[type="text"][name="user_id"]');input.css("border-color","#ddd");var user_id=input.val();if(user_id.length<1||0==user_id)return input.css("border-color","#ff0000"),!1})},recount_stats:function(){$(document.body).on("change","#recount-stats-type",function(){var export_form=$("#edd-tools-recount-form"),selected_type=$("option:selected",this).data("type"),submit_button=$("#recount-stats-submit"),products=$("#tools-product-dropdown");export_form.find(".notice-wrap").remove(),submit_button.removeClass("button-disabled").attr("disabled",!1),products.hide(),$(".edd-recount-stats-descriptions span").hide(),"recount-download"===selected_type?(products.show(),products.find(".edd-select-chosen").css("width","auto")):"reset-stats"===selected_type?(export_form.append('<div class="notice-wrap"></div>'),export_form.find(".notice-wrap").html('<div class="notice notice-warning"><p><input type="checkbox" id="confirm-reset" name="confirm_reset_store" value="1" /> <label for="confirm-reset">'+edd_vars.reset_stats_warn+"</label></p></div>"),$("#recount-stats-submit").addClass("button-disabled").attr("disabled","disabled")):(products.hide(),products.val(0)),$("#"+selected_type).show()}),$(document.body).on("change","#confirm-reset",function(){$(this).is(":checked")?$("#recount-stats-submit").removeClass("button-disabled").removeAttr("disabled"):$("#recount-stats-submit").addClass("button-disabled").attr("disabled","disabled")}),$("#edd-tools-recount-form").submit(function(e){var selection=$("#recount-stats-type").val(),export_form=$(this),selected_type=$("option:selected",this).data("type");if("reset-stats"===selected_type){if($("#confirm-reset").is(":checked"))return!0;has_errors=!0}export_form.find(".notice-wrap").remove(),export_form.append('<div class="notice-wrap"></div>');var notice_wrap=export_form.find(".notice-wrap"),has_errors=!1;if(null!==selection&&0!==selection||(notice_wrap.html('<div class="updated error"><p>'+edd_vars.batch_export_no_class+"</p></div>"),has_errors=!0),"recount-download"===selected_type&&0==$('select[name="download_id"]').val()&&(notice_wrap.html('<div class="updated error"><p>'+edd_vars.batch_export_no_reqs+"</p></div>"),has_errors=!0),has_errors)return export_form.find(".button-disabled").removeClass("button-disabled"),!1})}}.init(),{init:function(){this.submit(),this.dismiss_message()},submit:function(){var self=this;$(document.body).on("submit",".edd-export-form",function(data){data.preventDefault();var submitButton=$(this).find('input[type="submit"]');submitButton.hasClass("button-disabled")||(data=$(this).serialize(),submitButton.addClass("button-disabled"),$(this).find(".notice-wrap").remove(),$(this).append('<div class="notice-wrap"><span class="spinner is-active"></span><div class="edd-progress"><div></div></div></div>'),self.process_step(1,data,self))})},process_step:function(step,data,self){$.ajax({type:"POST",url:ajaxurl,data:{form:data,action:"edd_do_ajax_export",step:step},dataType:"json",success:function(response){var export_form,notice_wrap,success_message;"done"==response.step||response.error||response.success?(notice_wrap=(export_form=$(".edd-export-form").find(".edd-progress").parent().parent()).find(".notice-wrap"),export_form.find(".button-disabled").removeClass("button-disabled"),response.error?(success_message=response.message,notice_wrap.html('<div class="updated error"><p>'+success_message+"</p></div>")):response.success?(success_message=response.message,notice_wrap.html('<div id="edd-batch-success" class="updated notice is-dismissible"><p>'+success_message+'<span class="notice-dismiss"></span></p></div>')):(notice_wrap.remove(),window.location=response.url)):($(".edd-progress div").animate({width:response.percentage+"%"},50,function(){}),self.process_step(parseInt(response.step),data,self))}}).fail(function(response){window.console&&window.console.log&&console.log(response)})},dismiss_message:function(){$(document.body).on("click","#edd-batch-success .notice-dismiss",function(){$("#edd-batch-success").parent().slideUp("fast")})}}.init();var EDD_Import={init:function(){this.submit()},submit:function(){$(".edd-import-form").ajaxForm({beforeSubmit:this.before_submit,success:this.success,complete:this.complete,dataType:"json",error:this.error})},before_submit:function(arr,notice_wrap,options){if(notice_wrap.find(".notice-wrap").remove(),notice_wrap.append('<div class="notice-wrap"><span class="spinner is-active"></span><div class="edd-progress"><div></div></div></div>'),!(window.File&&window.FileReader&&window.FileList&&window.Blob)){var import_form=$(".edd-import-form").find(".edd-progress").parent().parent(),notice_wrap=import_form.find(".notice-wrap");return import_form.find(".button-disabled").removeClass("button-disabled"),notice_wrap.html('<div class="update error"><p>'+edd_vars.unsupported_browser+"</p></div>"),!1}},success:function(responseText,statusText,xhr,$form){},complete:function(xhr){var $form,select,options,columns,response=jQuery.parseJSON(xhr.responseText);response.success?(($form=$(".edd-import-form .notice-wrap").parent()).find(".edd-import-file-wrap,.notice-wrap").remove(),$form.find(".edd-import-options").slideDown(),(select=$form.find("select.edd-import-csv-column")).parents("tr").first(),options="",columns=response.data.columns.sort(function(a,b){return a<b?-1:b<a?1:0}),$.each(columns,function(key,value){options+='<option value="'+value+'">'+value+"</option>"}),select.append(options),select.on("change",function(){var $key=$(this).val();$key&&0!=response.data.first_row[$key]?$(this).parent().next().html(response.data.first_row[$key]):$(this).parent().next().html("")}),$.each(select,function(){$(this).val($(this).attr("data-field")).change()}),$(document.body).on("click",".edd-import-proceed",function(e){e.preventDefault(),$form.append('<div class="notice-wrap"><span class="spinner is-active"></span><div class="edd-progress"><div></div></div></div>'),response.data.mapping=$form.serialize(),EDD_Import.process_step(1,response.data,self)})):EDD_Import.error(xhr)},error:function(notice_wrap){var response=jQuery.parseJSON(notice_wrap.responseText),import_form=$(".edd-import-form").find(".edd-progress").parent().parent(),notice_wrap=import_form.find(".notice-wrap");import_form.find(".button-disabled").removeClass("button-disabled"),response.data.error?notice_wrap.html('<div class="update error"><p>'+response.data.error+"</p></div>"):notice_wrap.remove()},process_step:function(step,import_data,self){$.ajax({type:"POST",url:ajaxurl,data:{form:import_data.form,nonce:import_data.nonce,class:import_data.class,upload:import_data.upload,mapping:import_data.mapping,action:"edd_do_ajax_import",step:step},dataType:"json",success:function(response){var import_form,notice_wrap;"done"==response.data.step||response.data.error?(notice_wrap=(import_form=$(".edd-import-form").find(".edd-progress").parent().parent()).find(".notice-wrap"),import_form.find(".button-disabled").removeClass("button-disabled"),response.data.error?notice_wrap.html('<div class="update error"><p>'+response.data.error+"</p></div>"):(import_form.find(".edd-import-options").hide(),$("html, body").animate({scrollTop:import_form.parent().offset().top},500),notice_wrap.html('<div class="updated"><p>'+response.data.message+"</p></div>"))):($(".edd-progress div").animate({width:response.data.percentage+"%"},50,function(){}),EDD_Import.process_step(parseInt(response.data.step),import_data,self))}}).fail(function(response){window.console&&window.console.log&&console.log(response)})}};EDD_Import.init();var EDD_Customer={vars:{customer_card_wrap_editable:$(".edd-customer-card-wrapper .editable"),customer_card_wrap_edit_item:$(".edd-customer-card-wrapper .edit-item"),user_id:$('input[name="customerinfo[user_id]"]'),state_input:$(':input[name="customerinfo[state]"]'),note:$("#customer-note")},init:function(){this.edit_customer(),this.add_email(),this.user_search(),this.remove_user(),this.cancel_edit(),this.change_country(),this.add_note(),this.delete_checked()},edit_customer:function(){$(document.body).on("click","#edit-customer",function(e){e.preventDefault(),EDD_Customer.vars.customer_card_wrap_editable.hide(),EDD_Customer.vars.customer_card_wrap_edit_item.fadeIn().css("display","block")})},add_email:function(){$(document.body).on("click","#add-customer-email",function(nonce){nonce.preventDefault();var button=$(this),wrapper=button.parent();wrapper.parent().find(".notice-container").remove(),wrapper.find(".spinner").css("visibility","visible"),button.attr("disabled",!0);var customer_id=wrapper.find('input[name="customer-id"]').val(),email=wrapper.find('input[name="additional-email"]').val(),primary=wrapper.find('input[name="make-additional-primary"]').is(":checked"),nonce=wrapper.find('input[name="add_email_nonce"]').val();$.post(ajaxurl,{edd_action:"customer-add-email",customer_id:customer_id,email:email,primary:primary,_wpnonce:nonce},function(response){!0===response.success?window.location.href=response.redirect:(button.attr("disabled",!1),wrapper.after('<div class="notice-container"><div class="notice notice-error inline"><p>'+response.message+"</p></div></div>"),wrapper.find(".spinner").css("visibility","hidden"))},"json")})},user_search:function(){$(document.body).on("click.eddSelectUser",".edd_user_search_results a",function(user_id){user_id.preventDefault();user_id=$(this).data("userid");EDD_Customer.vars.user_id.val(user_id)})},remove_user:function(){$(document.body).on("click","#disconnect-customer",function(postData){postData.preventDefault(),confirm(edd_vars.disconnect_customer)&&(postData={edd_action:"disconnect-userid",customer_id:$('input[name="customerinfo[id]"]').val(),_wpnonce:$("#edit-customer-info #_wpnonce").val()},$.post(ajaxurl,postData,function(response){window.location.href=window.location.href},"json"))})},cancel_edit:function(){$(document.body).on("click","#edd-edit-customer-cancel",function(e){e.preventDefault(),EDD_Customer.vars.customer_card_wrap_edit_item.hide(),EDD_Customer.vars.customer_card_wrap_editable.show(),$(".edd_user_search_results").html("")})},change_country:function(){$('select[name="customerinfo[country]"]').change(function(){var $this=$(this),data={action:"edd_get_shop_states",country:$this.val(),nonce:$this.data("nonce"),field_name:"customerinfo[state]"};return $.post(ajaxurl,data,function(response){"nostates"==response?EDD_Customer.vars.state_input.replaceWith('<input type="text" name="'+data.field_name+'" value="" class="edd-edit-toggles medium-text"/>'):EDD_Customer.vars.state_input.replaceWith(response)}),!1})},add_note:function(){$(document.body).on("click","#add-customer-note",function(postData){postData.preventDefault();var border_color,postData={edd_action:"add-customer-note",customer_id:$("#customer-id").val(),customer_note:EDD_Customer.vars.note.val(),add_customer_note_nonce:$("#add_customer_note_nonce").val()};postData.customer_note?$.ajax({type:"POST",data:postData,url:ajaxurl,success:function(response){$("#edd-customer-notes").prepend(response),$(".edd-no-customer-notes").hide(),EDD_Customer.vars.note.val("")}}).fail(function(data){window.console&&window.console.log&&console.log(data)}):(border_color=EDD_Customer.vars.note.css("border-color"),EDD_Customer.vars.note.css("border-color","red"),setTimeout(function(){EDD_Customer.vars.note.css("border-color",border_color)},500))})},delete_checked:function(){$("#edd-customer-delete-confirm").change(function(){var records_input=$("#edd-customer-delete-records"),submit_button=$("#edd-delete-customer");$(this).prop("checked")?(records_input.attr("disabled",!1),submit_button.attr("disabled",!1)):(records_input.attr("disabled",!0),records_input.prop("checked",!1),submit_button.attr("disabled",!0))})}};EDD_Customer.init();var EDD_Promo_Notices={init:function(){EDD_Promo_Notices.displayNotices(),EDD_Promo_Notices.dismissNotices()},displayNotices:function(){var topOfPageNoticeEl,topOfPageNotice=$(".edd-admin-notice-top-of-page");topOfPageNotice&&(topOfPageNoticeEl=topOfPageNotice.detach(),$("#wpbody-content").prepend(topOfPageNoticeEl),topOfPageNotice.delay(1e3).slideDown())},dismissNotices:function(){$(".edd-promo-notice").each(function(){var notice=$(this);notice.on("click",".edd-promo-notice-dismiss",function(e){$(this).attr("href")||e.preventDefault(),$.ajax({type:"POST",data:{action:"edd_dismiss_promo_notice",notice_id:notice.data("id"),nonce:notice.data("nonce"),lifespan:notice.data("lifespan")},url:ajaxurl,success:function(response){notice.slideUp()}})})})}};EDD_Promo_Notices.init(),$(".edd-ajax-user-search").keyup(function(){var user_search=$(this).val(),data="";$(this).data("exclude")&&(data=$(this).data("exclude")),$(".edd-ajax").show();data={action:"edd_search_users",user_name:user_search,exclude:data};document.body.style.cursor="wait",$.ajax({type:"POST",data:data,dataType:"json",url:ajaxurl,success:function(search_response){$(".edd-ajax").hide(),$(".edd_user_search_results").removeClass("hidden"),$(".edd_user_search_results span").html(""),$(search_response.results).appendTo(".edd_user_search_results span"),document.body.style.cursor="default"}})}),$(document.body).on("click.eddSelectUser",".edd_user_search_results span a",function(login){login.preventDefault();login=$(this).data("login");$(".edd-ajax-user-search").val(login),$(".edd_user_search_results").addClass("hidden"),$(".edd_user_search_results span").html("")}),$(document.body).on("click.eddCancelUserSearch",".edd_user_search_results a.edd-ajax-user-cancel",function(e){e.preventDefault(),$(".edd-ajax-user-search").val(""),$(".edd_user_search_results").addClass("hidden"),$(".edd_user_search_results span").html("")}),$("#edd_dashboard_sales").length&&$.ajax({type:"GET",data:{action:"edd_load_dashboard_widget"},url:ajaxurl,success:function(response){$("#edd_dashboard_sales .edd-loading").html(response)}}),$(document.body).on("keydown",".customer-note-input",function(e){13==e.keyCode&&(e.metaKey||e.ctrlKey)&&$("#add-customer-note").click()})});var eddFormatCurrency=function(decimalPlaces){var numeric=parseFloat(decimalPlaces),storeCurrency=edd_vars.currency,decimalPlaces=edd_vars.currency_decimals;return numeric.toLocaleString(storeCurrency,{style:"currency",currency:storeCurrency,minimumFractionDigits:decimalPlaces,maximumFractionDigits:decimalPlaces})},eddFormatNumber=function(storeCurrency){var numeric=parseFloat(storeCurrency),storeCurrency=edd_vars.currency;edd_vars.currency_decimals;return numeric.toLocaleString(storeCurrency,{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0})},eddLabelFormatter=function(label,series){return'<div style="font-size:12px; text-align:center; padding:2px">'+label+"</div>"},eddLegendFormatterSales=function(item,series){var slug=item.toLowerCase().replace(/\s/g,"-"),color='<div class="edd-legend-color" style="background-color: '+series.color+'"></div>',item='<div class="edd-pie-legend-item">'+item+": "+Math.round(series.percent)+"% ("+eddFormatNumber(series.data[0][1])+")</div>",item='<div id="'+series.edd_vars.id+slug+'" class="edd-legend-item-wrapper">'+color+item+"</div>";return jQuery("#edd-pie-legend-"+series.edd_vars.id).append(item),item},eddLegendFormatterEarnings=function(item,series){var slug=item.toLowerCase().replace(/\s/g,"-"),color='<div class="edd-legend-color" style="background-color: '+series.color+'"></div>',item='<div class="edd-pie-legend-item">'+item+": "+Math.round(series.percent)+"% ("+eddFormatCurrency(series.data[0][1])+")</div>",item='<div id="'+series.edd_vars.id+slug+'" class="edd-legend-item-wrapper">'+color+item+"</div>";return jQuery("#edd-pie-legend-"+series.edd_vars.id).append(item),item};function edd_attach_tooltips(selector){selector.tooltip({content:function(){return jQuery(this).prop("title")},tooltipClass:"edd-ui-tooltip",position:{my:"center top",at:"center bottom+10",collision:"flipfit"},hide:{duration:200},show:{duration:200}})}function easy_digital_downloads_recapture_remote_install(){jQuery.post(ajaxurl,{action:"edd_recapture_remote_install"},function(response){0==response.success&&confirm(response.data.error)?location.reload():window.location.href="https://recapture.io/register"})}
assets/js/alpine.min.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ (()=>{var Fe=!1,je=!1,J=[];function wt(e){Kr(e)}function Kr(e){J.includes(e)||J.push(e),zr()}function zr(){!je&&!Fe&&(Fe=!0,queueMicrotask(Vr))}function Vr(){Fe=!1,je=!0;for(let e=0;e<J.length;e++)J[e]();J.length=0,je=!1}var v,C,V,Ke,ze=!0;function Et(e){ze=!1,e(),ze=!0}function St(e){v=e.reactive,V=e.release,C=t=>e.effect(t,{scheduler:r=>{ze?wt(r):r()}}),Ke=e.raw}function Ve(e){C=e}function At(e){let t=()=>{};return[n=>{let i=C(n);e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(i),t=()=>{i!==void 0&&(e._x_effects.delete(i),V(i))}},()=>{t()}]}var Ot=[],Tt=[],Rt=[];function Ct(e){Rt.push(e)}function Mt(e){Tt.push(e)}function Nt(e){Ot.push(e)}function kt(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function Be(e,t){!e._x_attributeCleanups||Object.entries(e._x_attributeCleanups).forEach(([r,n])=>{(t===void 0||t.includes(r))&&(n.forEach(i=>i()),delete e._x_attributeCleanups[r])})}var qe=new MutationObserver(He),Ue=!1;function We(){qe.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),Ue=!0}function Hr(){Br(),qe.disconnect(),Ue=!1}var Z=[],Ge=!1;function Br(){Z=Z.concat(qe.takeRecords()),Z.length&&!Ge&&(Ge=!0,queueMicrotask(()=>{qr(),Ge=!1}))}function qr(){He(Z),Z.length=0}function m(e){if(!Ue)return e();Hr();let t=e();return We(),t}var Ye=!1,pe=[];function Dt(){Ye=!0}function Pt(){Ye=!1,He(pe),pe=[]}function He(e){if(Ye){pe=pe.concat(e);return}let t=[],r=[],n=new Map,i=new Map;for(let o=0;o<e.length;o++)if(!e[o].target._x_ignoreMutationObserver&&(e[o].type==="childList"&&(e[o].addedNodes.forEach(s=>s.nodeType===1&&t.push(s)),e[o].removedNodes.forEach(s=>s.nodeType===1&&r.push(s))),e[o].type==="attributes")){let s=e[o].target,a=e[o].attributeName,c=e[o].oldValue,l=()=>{n.has(s)||n.set(s,[]),n.get(s).push({name:a,value:s.getAttribute(a)})},u=()=>{i.has(s)||i.set(s,[]),i.get(s).push(a)};s.hasAttribute(a)&&c===null?l():s.hasAttribute(a)?(u(),l()):u()}i.forEach((o,s)=>{Be(s,o)}),n.forEach((o,s)=>{Ot.forEach(a=>a(s,o))});for(let o of t)r.includes(o)||Rt.forEach(s=>s(o));for(let o of r)t.includes(o)||Tt.forEach(s=>s(o));t=null,r=null,n=null,i=null}function B(e,t,r){return e._x_dataStack=[t,...Q(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(n=>n!==t)}}function Je(e,t){let r=e._x_dataStack[0];Object.entries(t).forEach(([n,i])=>{r[n]=i})}function Q(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?Q(e.host):e.parentNode?Q(e.parentNode):[]}function X(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap(r=>Object.keys(r)))),has:(r,n)=>e.some(i=>i.hasOwnProperty(n)),get:(r,n)=>(e.find(i=>{if(i.hasOwnProperty(n)){let o=Object.getOwnPropertyDescriptor(i,n);if(o.get&&o.get._x_alreadyBound||o.set&&o.set._x_alreadyBound)return!0;if((o.get||o.set)&&o.enumerable){let s=o.get,a=o.set,c=o;s=s&&s.bind(t),a=a&&a.bind(t),s&&(s._x_alreadyBound=!0),a&&(a._x_alreadyBound=!0),Object.defineProperty(i,n,{...c,get:s,set:a})}return!0}return!1})||{})[n],set:(r,n,i)=>{let o=e.find(s=>s.hasOwnProperty(n));return o?o[n]=i:e[e.length-1][n]=i,!0}});return t}function It(e){let t=n=>typeof n=="object"&&!Array.isArray(n)&&n!==null,r=(n,i="")=>{Object.entries(n).forEach(([o,s])=>{let a=i===""?o:`${i}.${o}`;typeof s=="object"&&s!==null&&s._x_interceptor?n[o]=s.initialize(e,a,o):t(s)&&s!==n&&!(s instanceof Element)&&r(s,a)})};return r(e)}function me(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,o){return e(this.initialValue,()=>Ur(n,i),s=>Ze(n,i,s),i,o)}};return t(r),n=>{if(typeof n=="object"&&n!==null&&n._x_interceptor){let i=r.initialize.bind(r);r.initialize=(o,s,a)=>{let c=n.initialize(o,s,a);return r.initialValue=c,i(o,s,a)}}else r.initialValue=n;return r}}function Ur(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function Ze(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),Ze(e[t[0]],t.slice(1),r)}}var Lt={};function x(e,t){Lt[e]=t}function ee(e,t){return Object.entries(Lt).forEach(([r,n])=>{Object.defineProperty(e,`$${r}`,{get(){return n(t,{Alpine:S,interceptor:me})},enumerable:!1})}),e}function b(e,t,r={}){let n;return h(e,t)(i=>n=i,r),n}function h(...e){return $t(...e)}var $t=Qe;function Ft(e){$t=e}function Qe(e,t){let r={};ee(r,e);let n=[r,...Q(e)];if(typeof t=="function")return Wr(n,t);let i=Gr(n,t);return Yr.bind(null,e,t,i)}function Wr(e,t){return(r=()=>{},{scope:n={},params:i=[]}={})=>{let o=t.apply(X([n,...e]),i);he(r,o)}}var Xe={};function Jr(e){if(Xe[e])return Xe[e];let t=Object.getPrototypeOf(async function(){}).constructor,r=/^[\n\s]*if.*\(.*\)/.test(e)||/^(let|const)/.test(e)?`(() => { ${e} })()`:e,n=new t(["__self","scope"],`with (scope) { __self.result = ${r} }; __self.finished = true; return __self.result;`);return Xe[e]=n,n}function Gr(e,t){let r=Jr(t);return(n=()=>{},{scope:i={},params:o=[]}={})=>{r.result=void 0,r.finished=!1;let s=X([i,...e]),a=r(r,s);r.finished?he(n,r.result,s,o):a.then(c=>{he(n,c,s,o)})}}function he(e,t,r,n){if(typeof t=="function"){let i=t.apply(r,n);i instanceof Promise?i.then(o=>he(e,o,r,n)):e(i)}else e(t)}function Yr(e,t,r,...n){try{return r(...n)}catch(i){throw console.warn(`Alpine Expression Error: ${i.message}
2
+
3
+ Expression: "${t}"
4
+
5
+ `,e),i}}var et="x-";function A(e=""){return et+e}function jt(e){et=e}var Kt={};function p(e,t){Kt[e]=t}function te(e,t,r){let n={};return Array.from(t).map(zt((o,s)=>n[o]=s)).filter(Vt).map(Qr(n,r)).sort(Xr).map(o=>Zr(e,o))}function Bt(e){return Array.from(e).map(zt()).filter(t=>!Vt(t))}var tt=!1,re=new Map,Ht=Symbol();function qt(e){tt=!0;let t=Symbol();Ht=t,re.set(t,[]);let r=()=>{for(;re.get(t).length;)re.get(t).shift()();re.delete(t)},n=()=>{tt=!1,r()};e(r),n()}function Zr(e,t){let r=()=>{},n=Kt[t.type]||r,i=[],o=d=>i.push(d),[s,a]=At(e);i.push(a);let c={Alpine:S,effect:s,cleanup:o,evaluateLater:h.bind(h,e),evaluate:b.bind(b,e)},l=()=>i.forEach(d=>d());kt(e,t.original,l);let u=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,c),n=n.bind(n,e,t,c),tt?re.get(Ht).push(n):n())};return u.runCleanups=l,u}var ge=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),_e=e=>e;function zt(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=Ut.reduce((o,s)=>s(o),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var Ut=[];function H(e){Ut.push(e)}function Vt({name:e}){return Wt().test(e)}var Wt=()=>new RegExp(`^${et}([^:^.]+)\\b`);function Qr(e,t){return({name:r,value:n})=>{let i=r.match(Wt()),o=r.match(/:([a-zA-Z0-9\-:]+)/),s=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:s.map(c=>c.replace(".","")),expression:n,original:a}}}var rt="DEFAULT",ye=["ignore","ref","data","bind","init","for","model","transition","show","if",rt,"element"];function Xr(e,t){let r=ye.indexOf(e.type)===-1?rt:e.type,n=ye.indexOf(t.type)===-1?rt:t.type;return ye.indexOf(r)-ye.indexOf(n)}function $(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}var nt=[],it=!1;function q(e){nt.push(e),queueMicrotask(()=>{it||setTimeout(()=>{xe()})})}function xe(){for(it=!1;nt.length;)nt.shift()()}function Gt(){it=!0}function N(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>N(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)N(n,t,!1),n=n.nextElementSibling}function be(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}function Jt(){document.body||be("Unable to initialize. Trying to load Alpine before `<body>` is available. Did you forget to add `defer` in Alpine's `<script>` tag?"),$(document,"alpine:init"),$(document,"alpine:initializing"),We(),Ct(t=>O(t,N)),Mt(t=>q(()=>en(t))),Nt((t,r)=>{te(t,r).forEach(n=>n())});let e=t=>!k(t.parentElement,!0);Array.from(document.querySelectorAll(Yt())).filter(e).forEach(t=>{O(t)}),$(document,"alpine:initialized")}var ot=[],Zt=[];function Qt(){return ot.map(e=>e())}function Yt(){return ot.concat(Zt).map(e=>e())}function ve(e){ot.push(e)}function Xt(e){Zt.push(e)}function k(e,t=!1){if(!e)return;if((t?Yt():Qt()).some(n=>e.matches(n)))return e;if(!!e.parentElement)return k(e.parentElement,t)}function er(e){return Qt().some(t=>e.matches(t))}function O(e,t=N){qt(()=>{t(e,(r,n)=>{te(r,r.attributes).forEach(i=>i()),r._x_ignore&&n()})})}function en(e){N(e,t=>Be(t))}function ne(e,t){return Array.isArray(t)?tr(e,t.join(" ")):typeof t=="object"&&t!==null?tn(e,t):typeof t=="function"?ne(e,t()):tr(e,t)}function tr(e,t){let r=o=>o.split(" ").filter(Boolean),n=o=>o.split(" ").filter(s=>!e.classList.contains(s)).filter(Boolean),i=o=>(e.classList.add(...o),()=>{e.classList.remove(...o)});return t=t===!0?t="":t||"",i(n(t))}function tn(e,t){let r=a=>a.split(" ").filter(Boolean),n=Object.entries(t).flatMap(([a,c])=>c?r(a):!1).filter(Boolean),i=Object.entries(t).flatMap(([a,c])=>c?!1:r(a)).filter(Boolean),o=[],s=[];return i.forEach(a=>{e.classList.contains(a)&&(e.classList.remove(a),s.push(a))}),n.forEach(a=>{e.classList.contains(a)||(e.classList.add(a),o.push(a))}),()=>{s.forEach(a=>e.classList.add(a)),o.forEach(a=>e.classList.remove(a))}}function F(e,t){return typeof t=="object"&&t!==null?rn(e,t):nn(e,t)}function rn(e,t){let r={};return Object.entries(t).forEach(([n,i])=>{r[n]=e.style[n],e.style.setProperty(on(n),i)}),setTimeout(()=>{e.style.length===0&&e.removeAttribute("style")}),()=>{F(e,r)}}function nn(e,t){let r=e.getAttribute("style",t);return e.setAttribute("style",t),()=>{e.setAttribute("style",r)}}function on(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function ie(e,t=()=>{}){let r=!1;return function(){r?t.apply(this,arguments):(r=!0,e.apply(this,arguments))}}p("transition",(e,{value:t,modifiers:r,expression:n},{evaluate:i})=>{typeof n=="function"&&(n=i(n)),n?sn(e,n,t):an(e,r,t)});function sn(e,t,r){rr(e,ne,""),{enter:i=>{e._x_transition.enter.during=i},"enter-start":i=>{e._x_transition.enter.start=i},"enter-end":i=>{e._x_transition.enter.end=i},leave:i=>{e._x_transition.leave.during=i},"leave-start":i=>{e._x_transition.leave.start=i},"leave-end":i=>{e._x_transition.leave.end=i}}[r](t)}function an(e,t,r){rr(e,F);let n=!t.includes("in")&&!t.includes("out")&&!r,i=n||t.includes("in")||["enter"].includes(r),o=n||t.includes("out")||["leave"].includes(r);t.includes("in")&&!n&&(t=t.filter((_,y)=>y<t.indexOf("out"))),t.includes("out")&&!n&&(t=t.filter((_,y)=>y>t.indexOf("out")));let s=!t.includes("opacity")&&!t.includes("scale"),a=s||t.includes("opacity"),c=s||t.includes("scale"),l=a?0:1,u=c?oe(t,"scale",95)/100:1,d=oe(t,"delay",0),E=oe(t,"origin","center"),L="opacity, transform",K=oe(t,"duration",150)/1e3,fe=oe(t,"duration",75)/1e3,f="cubic-bezier(0.4, 0.0, 0.2, 1)";i&&(e._x_transition.enter.during={transformOrigin:E,transitionDelay:d,transitionProperty:L,transitionDuration:`${K}s`,transitionTimingFunction:f},e._x_transition.enter.start={opacity:l,transform:`scale(${u})`},e._x_transition.enter.end={opacity:1,transform:"scale(1)"}),o&&(e._x_transition.leave.during={transformOrigin:E,transitionDelay:d,transitionProperty:L,transitionDuration:`${fe}s`,transitionTimingFunction:f},e._x_transition.leave.start={opacity:1,transform:"scale(1)"},e._x_transition.leave.end={opacity:l,transform:`scale(${u})`})}function rr(e,t,r={}){e._x_transition||(e._x_transition={enter:{during:r,start:r,end:r},leave:{during:r,start:r,end:r},in(n=()=>{},i=()=>{}){we(e,t,{during:this.enter.during,start:this.enter.start,end:this.enter.end},n,i)},out(n=()=>{},i=()=>{}){we(e,t,{during:this.leave.during,start:this.leave.start,end:this.leave.end},n,i)}})}window.Element.prototype._x_toggleAndCascadeWithTransitions=function(e,t,r,n){let i=()=>{document.visibilityState==="visible"?requestAnimationFrame(r):setTimeout(r)};if(t){e._x_transition?e._x_transition.in(r):i();return}e._x_hidePromise=e._x_transition?new Promise((o,s)=>{e._x_transition.out(()=>{},()=>o(n)),e._x_transitioning.beforeCancel(()=>s({isFromCancelledTransition:!0}))}):Promise.resolve(n),queueMicrotask(()=>{let o=nr(e);o?(o._x_hideChildren||(o._x_hideChildren=[]),o._x_hideChildren.push(e)):queueMicrotask(()=>{let s=a=>{let c=Promise.all([a._x_hidePromise,...(a._x_hideChildren||[]).map(s)]).then(([l])=>l());return delete a._x_hidePromise,delete a._x_hideChildren,c};s(e).catch(a=>{if(!a.isFromCancelledTransition)throw a})})})};function nr(e){let t=e.parentNode;if(!!t)return t._x_hidePromise?t:nr(t)}function we(e,t,{during:r,start:n,end:i}={},o=()=>{},s=()=>{}){if(e._x_transitioning&&e._x_transitioning.cancel(),Object.keys(r).length===0&&Object.keys(n).length===0&&Object.keys(i).length===0){o(),s();return}let a,c,l;cn(e,{start(){a=t(e,n)},during(){c=t(e,r)},before:o,end(){a(),l=t(e,i)},after:s,cleanup(){c(),l()}})}function cn(e,t){let r,n,i,o=ie(()=>{m(()=>{r=!0,n||t.before(),i||(t.end(),xe()),t.after(),e.isConnected&&t.cleanup(),delete e._x_transitioning})});e._x_transitioning={beforeCancels:[],beforeCancel(s){this.beforeCancels.push(s)},cancel:ie(function(){for(;this.beforeCancels.length;)this.beforeCancels.shift()();o()}),finish:o},m(()=>{t.start(),t.during()}),Gt(),requestAnimationFrame(()=>{if(r)return;let s=Number(getComputedStyle(e).transitionDuration.replace(/,.*/,"").replace("s",""))*1e3,a=Number(getComputedStyle(e).transitionDelay.replace(/,.*/,"").replace("s",""))*1e3;s===0&&(s=Number(getComputedStyle(e).animationDuration.replace("s",""))*1e3),m(()=>{t.before()}),n=!0,requestAnimationFrame(()=>{r||(m(()=>{t.end()}),xe(),setTimeout(e._x_transitioning.finish,s+a),i=!0)})})}function oe(e,t,r){if(e.indexOf(t)===-1)return r;let n=e[e.indexOf(t)+1];if(!n||t==="scale"&&isNaN(n))return r;if(t==="duration"){let i=n.match(/([0-9]+)ms/);if(i)return i[1]}return t==="origin"&&["top","right","left","center","bottom"].includes(e[e.indexOf(t)+2])?[n,e[e.indexOf(t)+2]].join(" "):n}function Ee(e,t){var r;return function(){var n=this,i=arguments,o=function(){r=null,e.apply(n,i)};clearTimeout(r),r=setTimeout(o,t)}}function Se(e,t){let r;return function(){let n=this,i=arguments;r||(e.apply(n,i),r=!0,setTimeout(()=>r=!1,t))}}function ir(e){e(S)}var U={},or=!1;function sr(e,t){if(or||(U=v(U),or=!0),t===void 0)return U[e];U[e]=t,typeof t=="object"&&t!==null&&t.hasOwnProperty("init")&&typeof t.init=="function"&&U[e].init()}function ar(){return U}var st=!1;function W(e){return(...t)=>st||e(...t)}function cr(e,t){t._x_dataStack=e._x_dataStack,st=!0,un(()=>{ln(t)}),st=!1}function ln(e){let t=!1;O(e,(n,i)=>{N(n,(o,s)=>{if(t&&er(o))return s();t=!0,i(o,s)})})}function un(e){let t=C;Ve((r,n)=>{let i=t(r);return V(i),()=>{}}),e(),Ve(t)}var lr={};function ur(e,t){lr[e]=t}function fr(e,t){return Object.entries(lr).forEach(([r,n])=>{Object.defineProperty(e,r,{get(){return(...i)=>n.bind(t)(...i)},enumerable:!1})}),e}var fn={get reactive(){return v},get release(){return V},get effect(){return C},get raw(){return Ke},version:"3.4.2",flushAndStopDeferringMutations:Pt,disableEffectScheduling:Et,setReactivityEngine:St,addRootSelector:ve,deferMutations:Dt,mapAttributes:H,evaluateLater:h,setEvaluator:Ft,closestRoot:k,interceptor:me,transition:we,setStyles:F,mutateDom:m,directive:p,throttle:Se,debounce:Ee,evaluate:b,initTree:O,nextTick:q,prefix:jt,plugin:ir,magic:x,store:sr,start:Jt,clone:cr,data:ur},S=fn;function at(e,t){let r=Object.create(null),n=e.split(",");for(let i=0;i<n.length;i++)r[n[i]]=!0;return t?i=>!!r[i.toLowerCase()]:i=>!!r[i]}var So={[1]:"TEXT",[2]:"CLASS",[4]:"STYLE",[8]:"PROPS",[16]:"FULL_PROPS",[32]:"HYDRATE_EVENTS",[64]:"STABLE_FRAGMENT",[128]:"KEYED_FRAGMENT",[256]:"UNKEYED_FRAGMENT",[512]:"NEED_PATCH",[1024]:"DYNAMIC_SLOTS",[2048]:"DEV_ROOT_FRAGMENT",[-1]:"HOISTED",[-2]:"BAIL"},Ao={[1]:"STABLE",[2]:"DYNAMIC",[3]:"FORWARDED"};var dn="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly";var Oo=at(dn+",async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected");var dr=Object.freeze({}),To=Object.freeze([]);var ct=Object.assign;var pn=Object.prototype.hasOwnProperty,se=(e,t)=>pn.call(e,t),D=Array.isArray,G=e=>pr(e)==="[object Map]";var mn=e=>typeof e=="string",Ae=e=>typeof e=="symbol",ae=e=>e!==null&&typeof e=="object";var hn=Object.prototype.toString,pr=e=>hn.call(e),lt=e=>pr(e).slice(8,-1);var Oe=e=>mn(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e;var Te=e=>{let t=Object.create(null);return r=>t[r]||(t[r]=e(r))},gn=/-(\w)/g,Ro=Te(e=>e.replace(gn,(t,r)=>r?r.toUpperCase():"")),_n=/\B([A-Z])/g,Co=Te(e=>e.replace(_n,"-$1").toLowerCase()),ut=Te(e=>e.charAt(0).toUpperCase()+e.slice(1)),Mo=Te(e=>e?`on${ut(e)}`:""),ft=(e,t)=>e!==t&&(e===e||t===t);var dt=new WeakMap,ce=[],T,j=Symbol("iterate"),pt=Symbol("Map key iterate");function yn(e){return e&&e._isEffect===!0}function mr(e,t=dr){yn(e)&&(e=e.raw);let r=xn(e,t);return t.lazy||r(),r}function gr(e){e.active&&(hr(e),e.options.onStop&&e.options.onStop(),e.active=!1)}var bn=0;function xn(e,t){let r=function(){if(!r.active)return e();if(!ce.includes(r)){hr(r);try{return vn(),ce.push(r),T=r,e()}finally{ce.pop(),_r(),T=ce[ce.length-1]}}};return r.id=bn++,r.allowRecurse=!!t.allowRecurse,r._isEffect=!0,r.active=!0,r.raw=e,r.deps=[],r.options=t,r}function hr(e){let{deps:t}=e;if(t.length){for(let r=0;r<t.length;r++)t[r].delete(e);t.length=0}}var Y=!0,mt=[];function wn(){mt.push(Y),Y=!1}function vn(){mt.push(Y),Y=!0}function _r(){let e=mt.pop();Y=e===void 0?!0:e}function w(e,t,r){if(!Y||T===void 0)return;let n=dt.get(e);n||dt.set(e,n=new Map);let i=n.get(r);i||n.set(r,i=new Set),i.has(T)||(i.add(T),T.deps.push(i),T.options.onTrack&&T.options.onTrack({effect:T,target:e,type:t,key:r}))}function P(e,t,r,n,i,o){let s=dt.get(e);if(!s)return;let a=new Set,c=u=>{u&&u.forEach(d=>{(d!==T||d.allowRecurse)&&a.add(d)})};if(t==="clear")s.forEach(c);else if(r==="length"&&D(e))s.forEach((u,d)=>{(d==="length"||d>=n)&&c(u)});else switch(r!==void 0&&c(s.get(r)),t){case"add":D(e)?Oe(r)&&c(s.get("length")):(c(s.get(j)),G(e)&&c(s.get(pt)));break;case"delete":D(e)||(c(s.get(j)),G(e)&&c(s.get(pt)));break;case"set":G(e)&&c(s.get(j));break}let l=u=>{u.options.onTrigger&&u.options.onTrigger({effect:u,target:e,key:r,type:t,newValue:n,oldValue:i,oldTarget:o}),u.options.scheduler?u.options.scheduler(u):u()};a.forEach(l)}var En=at("__proto__,__v_isRef,__isVue"),yr=new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(Ae)),Sn=Re(),An=Re(!1,!0),On=Re(!0),Tn=Re(!0,!0),Ce={};["includes","indexOf","lastIndexOf"].forEach(e=>{let t=Array.prototype[e];Ce[e]=function(...r){let n=g(this);for(let o=0,s=this.length;o<s;o++)w(n,"get",o+"");let i=t.apply(n,r);return i===-1||i===!1?t.apply(n,r.map(g)):i}});["push","pop","shift","unshift","splice"].forEach(e=>{let t=Array.prototype[e];Ce[e]=function(...r){wn();let n=t.apply(this,r);return _r(),n}});function Re(e=!1,t=!1){return function(n,i,o){if(i==="__v_isReactive")return!e;if(i==="__v_isReadonly")return e;if(i==="__v_raw"&&o===(e?t?Cn:br:t?Rn:xr).get(n))return n;let s=D(n);if(!e&&s&&se(Ce,i))return Reflect.get(Ce,i,o);let a=Reflect.get(n,i,o);return(Ae(i)?yr.has(i):En(i))||(e||w(n,"get",i),t)?a:ht(a)?!s||!Oe(i)?a.value:a:ae(a)?e?vr(a):Me(a):a}}var Mn=wr(),Nn=wr(!0);function wr(e=!1){return function(r,n,i,o){let s=r[n];if(!e&&(i=g(i),s=g(s),!D(r)&&ht(s)&&!ht(i)))return s.value=i,!0;let a=D(r)&&Oe(n)?Number(n)<r.length:se(r,n),c=Reflect.set(r,n,i,o);return r===g(o)&&(a?ft(i,s)&&P(r,"set",n,i,s):P(r,"add",n,i)),c}}function kn(e,t){let r=se(e,t),n=e[t],i=Reflect.deleteProperty(e,t);return i&&r&&P(e,"delete",t,void 0,n),i}function Dn(e,t){let r=Reflect.has(e,t);return(!Ae(t)||!yr.has(t))&&w(e,"has",t),r}function Pn(e){return w(e,"iterate",D(e)?"length":j),Reflect.ownKeys(e)}var Er={get:Sn,set:Mn,deleteProperty:kn,has:Dn,ownKeys:Pn},Sr={get:On,set(e,t){return console.warn(`Set operation on key "${String(t)}" failed: target is readonly.`,e),!0},deleteProperty(e,t){return console.warn(`Delete operation on key "${String(t)}" failed: target is readonly.`,e),!0}},Lo=ct({},Er,{get:An,set:Nn}),$o=ct({},Sr,{get:Tn}),gt=e=>ae(e)?Me(e):e,_t=e=>ae(e)?vr(e):e,yt=e=>e,Ne=e=>Reflect.getPrototypeOf(e);function ke(e,t,r=!1,n=!1){e=e.__v_raw;let i=g(e),o=g(t);t!==o&&!r&&w(i,"get",t),!r&&w(i,"get",o);let{has:s}=Ne(i),a=n?yt:r?_t:gt;if(s.call(i,t))return a(e.get(t));if(s.call(i,o))return a(e.get(o));e!==i&&e.get(t)}function De(e,t=!1){let r=this.__v_raw,n=g(r),i=g(e);return e!==i&&!t&&w(n,"has",e),!t&&w(n,"has",i),e===i?r.has(e):r.has(e)||r.has(i)}function Pe(e,t=!1){return e=e.__v_raw,!t&&w(g(e),"iterate",j),Reflect.get(e,"size",e)}function Ar(e){e=g(e);let t=g(this);return Ne(t).has.call(t,e)||(t.add(e),P(t,"add",e,e)),this}function Tr(e,t){t=g(t);let r=g(this),{has:n,get:i}=Ne(r),o=n.call(r,e);o?Or(r,n,e):(e=g(e),o=n.call(r,e));let s=i.call(r,e);return r.set(e,t),o?ft(t,s)&&P(r,"set",e,t,s):P(r,"add",e,t),this}function Rr(e){let t=g(this),{has:r,get:n}=Ne(t),i=r.call(t,e);i?Or(t,r,e):(e=g(e),i=r.call(t,e));let o=n?n.call(t,e):void 0,s=t.delete(e);return i&&P(t,"delete",e,void 0,o),s}function Cr(){let e=g(this),t=e.size!==0,r=G(e)?new Map(e):new Set(e),n=e.clear();return t&&P(e,"clear",void 0,void 0,r),n}function Ie(e,t){return function(n,i){let o=this,s=o.__v_raw,a=g(s),c=t?yt:e?_t:gt;return!e&&w(a,"iterate",j),s.forEach((l,u)=>n.call(i,c(l),c(u),o))}}function Le(e,t,r){return function(...n){let i=this.__v_raw,o=g(i),s=G(o),a=e==="entries"||e===Symbol.iterator&&s,c=e==="keys"&&s,l=i[e](...n),u=r?yt:t?_t:gt;return!t&&w(o,"iterate",c?pt:j),{next(){let{value:d,done:E}=l.next();return E?{value:d,done:E}:{value:a?[u(d[0]),u(d[1])]:u(d),done:E}},[Symbol.iterator](){return this}}}}function I(e){return function(...t){{let r=t[0]?`on key "${t[0]}" `:"";console.warn(`${ut(e)} operation ${r}failed: target is readonly.`,g(this))}return e==="delete"?!1:this}}var Mr={get(e){return ke(this,e)},get size(){return Pe(this)},has:De,add:Ar,set:Tr,delete:Rr,clear:Cr,forEach:Ie(!1,!1)},Nr={get(e){return ke(this,e,!1,!0)},get size(){return Pe(this)},has:De,add:Ar,set:Tr,delete:Rr,clear:Cr,forEach:Ie(!1,!0)},kr={get(e){return ke(this,e,!0)},get size(){return Pe(this,!0)},has(e){return De.call(this,e,!0)},add:I("add"),set:I("set"),delete:I("delete"),clear:I("clear"),forEach:Ie(!0,!1)},Dr={get(e){return ke(this,e,!0,!0)},get size(){return Pe(this,!0)},has(e){return De.call(this,e,!0)},add:I("add"),set:I("set"),delete:I("delete"),clear:I("clear"),forEach:Ie(!0,!0)},In=["keys","values","entries",Symbol.iterator];In.forEach(e=>{Mr[e]=Le(e,!1,!1),kr[e]=Le(e,!0,!1),Nr[e]=Le(e,!1,!0),Dr[e]=Le(e,!0,!0)});function $e(e,t){let r=t?e?Dr:Nr:e?kr:Mr;return(n,i,o)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?n:Reflect.get(se(r,i)&&i in n?r:n,i,o)}var Ln={get:$e(!1,!1)},Fo={get:$e(!1,!0)},$n={get:$e(!0,!1)},jo={get:$e(!0,!0)};function Or(e,t,r){let n=g(r);if(n!==r&&t.call(e,n)){let i=lt(e);console.warn(`Reactive ${i} contains both the raw and reactive versions of the same object${i==="Map"?" as keys":""}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`)}}var xr=new WeakMap,Rn=new WeakMap,br=new WeakMap,Cn=new WeakMap;function Fn(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function jn(e){return e.__v_skip||!Object.isExtensible(e)?0:Fn(lt(e))}function Me(e){return e&&e.__v_isReadonly?e:Pr(e,!1,Er,Ln,xr)}function vr(e){return Pr(e,!0,Sr,$n,br)}function Pr(e,t,r,n,i){if(!ae(e))return console.warn(`value cannot be made reactive: ${String(e)}`),e;if(e.__v_raw&&!(t&&e.__v_isReactive))return e;let o=i.get(e);if(o)return o;let s=jn(e);if(s===0)return e;let a=new Proxy(e,s===2?n:r);return i.set(e,a),a}function g(e){return e&&g(e.__v_raw)||e}function ht(e){return Boolean(e&&e.__v_isRef===!0)}x("nextTick",()=>q);x("dispatch",e=>$.bind($,e));x("watch",e=>(t,r)=>{let n=h(e,t),i=!0,o;C(()=>n(s=>{let a=document.createElement("div");a.dataset.throwAway=s,i?o=s:queueMicrotask(()=>{r(s,o),o=s}),i=!1}))});x("store",ar);x("root",e=>k(e));x("refs",e=>(e._x_refs_proxy||(e._x_refs_proxy=X(Kn(e))),e._x_refs_proxy));function Kn(e){let t=[],r=e;for(;r;)r._x_refs&&t.push(r._x_refs),r=r.parentNode;return t}x("el",e=>e);var Ir=()=>{};Ir.inline=(e,{modifiers:t},{cleanup:r})=>{t.includes("self")?e._x_ignoreSelf=!0:e._x_ignore=!0,r(()=>{t.includes("self")?delete e._x_ignoreSelf:delete e._x_ignore})};p("ignore",Ir);p("effect",(e,{expression:t},{effect:r})=>r(h(e,t)));function le(e,t,r,n=[]){switch(e._x_bindings||(e._x_bindings=v({})),e._x_bindings[t]=r,t=n.includes("camel")?qn(t):t,t){case"value":zn(e,r);break;case"style":Bn(e,r);break;case"class":Vn(e,r);break;default:Hn(e,t,r);break}}function zn(e,t){if(e.type==="radio")e.attributes.value===void 0&&(e.value=t),window.fromModel&&(e.checked=Lr(e.value,t));else if(e.type==="checkbox")Number.isInteger(t)?e.value=t:!Number.isInteger(t)&&!Array.isArray(t)&&typeof t!="boolean"&&![null,void 0].includes(t)?e.value=String(t):Array.isArray(t)?e.checked=t.some(r=>Lr(r,e.value)):e.checked=!!t;else if(e.tagName==="SELECT")Un(e,t);else{if(e.value===t)return;e.value=t}}function Vn(e,t){e._x_undoAddedClasses&&e._x_undoAddedClasses(),e._x_undoAddedClasses=ne(e,t)}function Bn(e,t){e._x_undoAddedStyles&&e._x_undoAddedStyles(),e._x_undoAddedStyles=F(e,t)}function Hn(e,t,r){[null,void 0,!1].includes(r)&&Yn(t)?e.removeAttribute(t):(Gn(t)&&(r=t),Wn(e,t,r))}function Wn(e,t,r){e.getAttribute(t)!=r&&e.setAttribute(t,r)}function Un(e,t){let r=[].concat(t).map(n=>n+"");Array.from(e.options).forEach(n=>{n.selected=r.includes(n.value)})}function qn(e){return e.toLowerCase().replace(/-(\w)/g,(t,r)=>r.toUpperCase())}function Lr(e,t){return e==t}function Gn(e){return["disabled","checked","required","readonly","hidden","open","selected","autofocus","itemscope","multiple","novalidate","allowfullscreen","allowpaymentrequest","formnovalidate","autoplay","controls","loop","muted","playsinline","default","ismap","reversed","async","defer","nomodule"].includes(e)}function Yn(e){return!["aria-pressed","aria-checked","aria-expanded"].includes(e)}function ue(e,t,r,n){let i=e,o=c=>n(c),s={},a=(c,l)=>u=>l(c,u);if(r.includes("dot")&&(t=Jn(t)),r.includes("camel")&&(t=Zn(t)),r.includes("passive")&&(s.passive=!0),r.includes("capture")&&(s.capture=!0),r.includes("window")&&(i=window),r.includes("document")&&(i=document),r.includes("prevent")&&(o=a(o,(c,l)=>{l.preventDefault(),c(l)})),r.includes("stop")&&(o=a(o,(c,l)=>{l.stopPropagation(),c(l)})),r.includes("self")&&(o=a(o,(c,l)=>{l.target===e&&c(l)})),(r.includes("away")||r.includes("outside"))&&(i=document,o=a(o,(c,l)=>{e.contains(l.target)||e.offsetWidth<1&&e.offsetHeight<1||c(l)})),o=a(o,(c,l)=>{Qn(t)&&Xn(l,r)||c(l)}),r.includes("debounce")){let c=r[r.indexOf("debounce")+1]||"invalid-wait",l=xt(c.split("ms")[0])?Number(c.split("ms")[0]):250;o=Ee(o,l)}if(r.includes("throttle")){let c=r[r.indexOf("throttle")+1]||"invalid-wait",l=xt(c.split("ms")[0])?Number(c.split("ms")[0]):250;o=Se(o,l)}return r.includes("once")&&(o=a(o,(c,l)=>{c(l),i.removeEventListener(t,o,s)})),i.addEventListener(t,o,s),()=>{i.removeEventListener(t,o,s)}}function Jn(e){return e.replace(/-/g,".")}function Zn(e){return e.toLowerCase().replace(/-(\w)/g,(t,r)=>r.toUpperCase())}function xt(e){return!Array.isArray(e)&&!isNaN(e)}function ei(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[_\s]/,"-").toLowerCase()}function Qn(e){return["keydown","keyup"].includes(e)}function Xn(e,t){let r=t.filter(o=>!["window","document","prevent","stop","once"].includes(o));if(r.includes("debounce")){let o=r.indexOf("debounce");r.splice(o,xt((r[o+1]||"invalid-wait").split("ms")[0])?2:1)}if(r.length===0||r.length===1&&$r(e.key).includes(r[0]))return!1;let i=["ctrl","shift","alt","meta","cmd","super"].filter(o=>r.includes(o));return r=r.filter(o=>!i.includes(o)),!(i.length>0&&i.filter(s=>((s==="cmd"||s==="super")&&(s="meta"),e[`${s}Key`])).length===i.length&&$r(e.key).includes(r[0]))}function $r(e){if(!e)return[];e=ei(e);let t={ctrl:"control",slash:"/",space:"-",spacebar:"-",cmd:"meta",esc:"escape",up:"arrow-up",down:"arrow-down",left:"arrow-left",right:"arrow-right",period:".",equal:"="};return t[e]=e,Object.keys(t).map(r=>{if(t[r]===e)return r}).filter(r=>r)}p("model",(e,{modifiers:t,expression:r},{effect:n,cleanup:i})=>{let o=h(e,r),s=`${r} = rightSideOfExpression($event, ${r})`,a=h(e,s);var c=e.tagName.toLowerCase()==="select"||["checkbox","radio"].includes(e.type)||t.includes("lazy")?"change":"input";let l=ti(e,t,r),u=ue(e,c,t,d=>{a(()=>{},{scope:{$event:d,rightSideOfExpression:l}})});i(()=>u()),e._x_forceModelUpdate=()=>{o(d=>{d===void 0&&r.match(/\./)&&(d=""),window.fromModel=!0,m(()=>le(e,"value",d)),delete window.fromModel})},n(()=>{t.includes("unintrusive")&&document.activeElement.isSameNode(e)||e._x_forceModelUpdate()})});function ti(e,t,r){return e.type==="radio"&&m(()=>{e.hasAttribute("name")||e.setAttribute("name",r)}),(n,i)=>m(()=>{if(n instanceof CustomEvent&&n.detail!==void 0)return n.detail||n.target.value;if(e.type==="checkbox")if(Array.isArray(i)){let o=t.includes("number")?bt(n.target.value):n.target.value;return n.target.checked?i.concat([o]):i.filter(s=>!ri(s,o))}else return n.target.checked;else{if(e.tagName.toLowerCase()==="select"&&e.multiple)return t.includes("number")?Array.from(n.target.selectedOptions).map(o=>{let s=o.value||o.text;return bt(s)}):Array.from(n.target.selectedOptions).map(o=>o.value||o.text);{let o=n.target.value;return t.includes("number")?bt(o):t.includes("trim")?o.trim():o}}})}function bt(e){let t=e?parseFloat(e):null;return ni(t)?t:e}function ri(e,t){return e==t}function ni(e){return!Array.isArray(e)&&!isNaN(e)}p("cloak",e=>queueMicrotask(()=>m(()=>e.removeAttribute(A("cloak")))));Xt(()=>`[${A("init")}]`);p("init",W((e,{expression:t})=>typeof t=="string"?!!t.trim()&&b(e,t,{},!1):b(e,t,{},!1)));p("text",(e,{expression:t},{effect:r,evaluateLater:n})=>{let i=n(t);r(()=>{i(o=>{m(()=>{e.textContent=o})})})});p("html",(e,{expression:t},{effect:r,evaluateLater:n})=>{let i=n(t);r(()=>{i(o=>{e.innerHTML=o})})});H(ge(":",_e(A("bind:"))));p("bind",(e,{value:t,modifiers:r,expression:n,original:i},{effect:o})=>{if(!t)return ii(e,n,i,o);if(t==="key")return oi(e,n);let s=h(e,n);o(()=>s(a=>{a===void 0&&n.match(/\./)&&(a=""),m(()=>le(e,t,a,r))}))});function ii(e,t,r,n){let i=h(e,t),o=[];n(()=>{for(;o.length;)o.pop()();i(s=>{let a=Object.entries(s).map(([c,l])=>({name:c,value:l}));Bt(a).forEach(({name:c,value:l},u)=>{a[u]={name:`x-bind:${c}`,value:`"${l}"`}}),te(e,a,r).map(c=>{o.push(c.runCleanups),c()})})})}function oi(e,t){e._x_keyExpression=t}ve(()=>`[${A("data")}]`);p("data",W((e,{expression:t},{cleanup:r})=>{t=t===""?"{}":t;let n={};ee(n,e);let i={};fr(i,n);let o=b(e,t,{scope:i});ee(o,e);let s=v(o);It(s);let a=B(e,s);s.init&&b(e,s.init),r(()=>{a(),s.destroy&&b(e,s.destroy)})}));p("show",(e,{modifiers:t,expression:r},{effect:n})=>{let i=h(e,r),o=()=>m(()=>{e.style.display="none",e._x_isShown=!1}),s=()=>m(()=>{e.style.length===1&&e.style.display==="none"?e.removeAttribute("style"):e.style.removeProperty("display"),e._x_isShown=!0}),a=()=>setTimeout(s),c=ie(d=>d?s():o(),d=>{typeof e._x_toggleAndCascadeWithTransitions=="function"?e._x_toggleAndCascadeWithTransitions(e,d,s,o):d?a():o()}),l,u=!0;n(()=>i(d=>{!u&&d===l||(t.includes("immediate")&&(d?a():o()),c(d),l=d,u=!1)}))});p("for",(e,{expression:t},{effect:r,cleanup:n})=>{let i=ai(t),o=h(e,i.items),s=h(e,e._x_keyExpression||"index");e._x_prevKeys=[],e._x_lookup={},r(()=>si(e,i,o,s)),n(()=>{Object.values(e._x_lookup).forEach(a=>a.remove()),delete e._x_prevKeys,delete e._x_lookup})});function si(e,t,r,n){let i=s=>typeof s=="object"&&!Array.isArray(s),o=e;r(s=>{ci(s)&&s>=0&&(s=Array.from(Array(s).keys(),f=>f+1)),s===void 0&&(s=[]);let a=e._x_lookup,c=e._x_prevKeys,l=[],u=[];if(i(s))s=Object.entries(s).map(([f,_])=>{let y=Fr(t,_,f,s);n(R=>u.push(R),{scope:{index:f,...y}}),l.push(y)});else for(let f=0;f<s.length;f++){let _=Fr(t,s[f],f,s);n(y=>u.push(y),{scope:{index:f,..._}}),l.push(_)}let d=[],E=[],L=[],K=[];for(let f=0;f<c.length;f++){let _=c[f];u.indexOf(_)===-1&&L.push(_)}c=c.filter(f=>!L.includes(f));let fe="template";for(let f=0;f<u.length;f++){let _=u[f],y=c.indexOf(_);if(y===-1)c.splice(f,0,_),d.push([fe,f]);else if(y!==f){let R=c.splice(f,1)[0],M=c.splice(y-1,1)[0];c.splice(f,0,M),c.splice(y,0,R),E.push([R,M])}else K.push(_);fe=_}for(let f=0;f<L.length;f++){let _=L[f];a[_].remove(),a[_]=null,delete a[_]}for(let f=0;f<E.length;f++){let[_,y]=E[f],R=a[_],M=a[y],z=document.createElement("div");m(()=>{M.after(z),R.after(M),z.before(R),z.remove()}),Je(M,l[u.indexOf(y)])}for(let f=0;f<d.length;f++){let[_,y]=d[f],R=_==="template"?o:a[_],M=l[y],z=u[y],de=document.importNode(o.content,!0).firstElementChild;B(de,v(M),o),m(()=>{R.after(de),O(de)}),typeof z=="object"&&be("x-for key cannot be an object, it must be a string or an integer",o),a[z]=de}for(let f=0;f<K.length;f++)Je(a[K[f]],l[u.indexOf(K[f])]);o._x_prevKeys=u})}function ai(e){let t=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,r=/^\s*\(|\)\s*$/g,n=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,i=e.match(n);if(!i)return;let o={};o.items=i[2].trim();let s=i[1].replace(r,"").trim(),a=s.match(t);return a?(o.item=s.replace(t,"").trim(),o.index=a[1].trim(),a[2]&&(o.collection=a[2].trim())):o.item=s,o}function Fr(e,t,r,n){let i={};return/^\[.*\]$/.test(e.item)&&Array.isArray(t)?e.item.replace("[","").replace("]","").split(",").map(s=>s.trim()).forEach((s,a)=>{i[s]=t[a]}):/^\{.*\}$/.test(e.item)&&!Array.isArray(t)&&typeof t=="object"?e.item.replace("{","").replace("}","").split(",").map(s=>s.trim()).forEach(s=>{i[s]=t[s]}):i[e.item]=t,e.index&&(i[e.index]=r),e.collection&&(i[e.collection]=n),i}function ci(e){return!Array.isArray(e)&&!isNaN(e)}function jr(){}jr.inline=(e,{expression:t},{cleanup:r})=>{let n=k(e);n._x_refs||(n._x_refs={}),n._x_refs[t]=e,r(()=>delete n._x_refs[t])};p("ref",jr);p("if",(e,{expression:t},{effect:r,cleanup:n})=>{let i=h(e,t),o=()=>{if(e._x_currentIfEl)return e._x_currentIfEl;let a=e.content.cloneNode(!0).firstElementChild;return B(a,{},e),m(()=>{e.after(a),O(a)}),e._x_currentIfEl=a,e._x_undoIf=()=>{a.remove(),delete e._x_currentIfEl},a},s=()=>{!e._x_undoIf||(e._x_undoIf(),delete e._x_undoIf)};r(()=>i(a=>{a?o():s()})),n(()=>e._x_undoIf&&e._x_undoIf())});H(ge("@",_e(A("on:"))));p("on",W((e,{value:t,modifiers:r,expression:n},{cleanup:i})=>{let o=n?h(e,n):()=>{},s=ue(e,t,r,a=>{o(()=>{},{scope:{$event:a},params:[a]})});i(()=>s())}));S.setEvaluator(Qe);S.setReactivityEngine({reactive:Me,effect:mr,release:gr,raw:g});var vt=S;window.Alpine=vt;queueMicrotask(()=>{vt.start()});})();
assets/js/extension-manager.js ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* global EDDExtensionManager, ajaxurl */
2
+
3
+ ; ( function ( document, $ ) {
4
+ 'use strict';
5
+
6
+ $( '.edd-extension-manager__action' ).on( 'click', function ( e ) {
7
+ e.preventDefault();
8
+
9
+ var $btn = $( this ),
10
+ action = $btn.attr( 'data-action' ),
11
+ plugin = $btn.attr( 'data-plugin' ),
12
+ type = $btn.attr( 'data-type' ),
13
+ ajaxAction = '';
14
+
15
+ if ( $btn.attr( 'disabled' ) ) {
16
+ return;
17
+ }
18
+
19
+ switch ( action ) {
20
+ case 'activate':
21
+ ajaxAction = 'edd_activate_extension';
22
+ $btn.text( EDDExtensionManager.activating );
23
+ break;
24
+
25
+ case 'install':
26
+ ajaxAction = 'edd_install_extension';
27
+ $btn.text( EDDExtensionManager.installing );
28
+ break;
29
+
30
+ default:
31
+ return;
32
+ }
33
+
34
+ $btn.removeClass( 'button-primary' ).attr( 'disabled', true ).addClass( 'updating-message' );
35
+
36
+ var data = {
37
+ action: ajaxAction,
38
+ nonce: EDDExtensionManager.extension_manager_nonce,
39
+ plugin: plugin,
40
+ type: type,
41
+ pass: $btn.attr( 'data-pass' ),
42
+ id: $btn.attr( 'data-id' ),
43
+ product: $btn.attr( 'data-product' ),
44
+ };
45
+
46
+ $.post( ajaxurl, data )
47
+ .done( function ( res ) {
48
+ console.log( res );
49
+ var thisStep = $btn.closest( '.edd-extension-manager__step' );
50
+ if ( res.success ) {
51
+ var nextStep = thisStep.next();
52
+ if ( nextStep.length ) {
53
+ thisStep.fadeOut();
54
+ nextStep.prepend( '<div class="notice inline-notice notice-success"><p>' + res.data.message + '</p></div>' );
55
+ nextStep.fadeIn();
56
+ }
57
+ } else {
58
+ thisStep.fadeOut();
59
+ var message = res.data.message;
60
+ /**
61
+ * The install class returns an array of error messages, and res.data.message will be undefined.
62
+ * In that case, we'll use the standard failure messages.
63
+ */
64
+ if ( ! message ) {
65
+ if ( 'plugin' !== type ) {
66
+ message = EDDExtensionManager.extension_install_failed;
67
+ } else {
68
+ message = EDDExtensionManager.plugin_install_failed;
69
+ }
70
+ }
71
+ thisStep.after( '<div class="notice inline-notice notice-warning"><p>' + message + '</p></div>' );
72
+ }
73
+ } );
74
+ } );
75
+ } )( document, jQuery );
assets/js/extension-manager.min.js ADDED
@@ -0,0 +1 @@
 
1
+ !function($){"use strict";$(".edd-extension-manager__action").on("click",function(data){data.preventDefault();var $btn=$(this),action=$btn.attr("data-action"),data=$btn.attr("data-plugin"),type=$btn.attr("data-type"),ajaxAction="";if(!$btn.attr("disabled")){switch(action){case"activate":ajaxAction="edd_activate_extension",$btn.text(EDDExtensionManager.activating);break;case"install":ajaxAction="edd_install_extension",$btn.text(EDDExtensionManager.installing);break;default:return}$btn.removeClass("button-primary").attr("disabled",!0).addClass("updating-message");data={action:ajaxAction,nonce:EDDExtensionManager.extension_manager_nonce,plugin:data,type:type,pass:$btn.attr("data-pass"),id:$btn.attr("data-id"),product:$btn.attr("data-product")};$.post(ajaxurl,data).done(function(message){console.log(message);var nextStep,thisStep=$btn.closest(".edd-extension-manager__step");message.success?(nextStep=thisStep.next()).length&&(thisStep.fadeOut(),nextStep.prepend('<div class="notice inline-notice notice-success"><p>'+message.data.message+"</p></div>"),nextStep.fadeIn()):(thisStep.fadeOut(),message=(message=message.data.message)||("plugin"!==type?EDDExtensionManager.extension_install_failed:EDDExtensionManager.plugin_install_failed),thisStep.after('<div class="notice inline-notice notice-warning"><p>'+message+"</p></div>"))})}})}((document,jQuery));
easy-digital-downloads.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: The easiest way to sell digital products with WordPress.
6
  * Author: Easy Digital Downloads
7
  * Author URI: https://easydigitaldownloads.com
8
- * Version: 2.11.3.1
9
  * Text Domain: easy-digital-downloads
10
  * Domain Path: languages
11
  *
@@ -25,7 +25,7 @@
25
  * @package EDD
26
  * @category Core
27
  * @author Easy Digital Downloads
28
- * @version 2.11.3.1
29
  */
30
 
31
  // Exit if accessed directly.
@@ -121,6 +121,11 @@ final class Easy_Digital_Downloads {
121
  */
122
  public $customer_meta;
123
 
 
 
 
 
 
124
  /**
125
  * EDD Cart Object
126
  *
@@ -129,6 +134,22 @@ final class Easy_Digital_Downloads {
129
  */
130
  public $cart;
131
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  /**
133
  * Main Easy_Digital_Downloads Instance.
134
  *
@@ -152,17 +173,21 @@ final class Easy_Digital_Downloads {
152
  add_action( 'plugins_loaded', array( self::$instance, 'load_textdomain' ) );
153
 
154
  self::$instance->includes();
155
- self::$instance->roles = new EDD_Roles();
156
- self::$instance->fees = new EDD_Fees();
157
- self::$instance->api = new EDD_API();
158
- self::$instance->session = new EDD_Session();
159
- self::$instance->html = new EDD_HTML_Elements();
160
- self::$instance->emails = new EDD_Emails();
161
- self::$instance->email_tags = new EDD_Email_Template_Tags();
162
- self::$instance->customers = new EDD_DB_Customers();
163
- self::$instance->customer_meta = new EDD_DB_Customer_Meta();
164
- self::$instance->payment_stats = new EDD_Payment_Stats();
165
- self::$instance->cart = new EDD_Cart();
 
 
 
 
166
  }
167
 
168
  return self::$instance;
@@ -206,7 +231,7 @@ final class Easy_Digital_Downloads {
206
 
207
  // Plugin version.
208
  if ( ! defined( 'EDD_VERSION' ) ) {
209
- define( 'EDD_VERSION', '2.11.3.1' );
210
  }
211
 
212
  // Plugin Folder Path.
@@ -249,6 +274,7 @@ final class Easy_Digital_Downloads {
249
  }
250
  require_once EDD_PLUGIN_DIR . 'includes/ajax-functions.php';
251
  require_once EDD_PLUGIN_DIR . 'includes/api/class-edd-api.php';
 
252
  require_once EDD_PLUGIN_DIR . 'includes/template-functions.php';
253
  require_once EDD_PLUGIN_DIR . 'includes/template-actions.php';
254
  require_once EDD_PLUGIN_DIR . 'includes/checkout/template.php';
@@ -258,6 +284,7 @@ final class Easy_Digital_Downloads {
258
  require_once EDD_PLUGIN_DIR . 'includes/cart/template.php';
259
  require_once EDD_PLUGIN_DIR . 'includes/cart/actions.php';
260
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-db.php';
 
261
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-db-customers.php';
262
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-db-customer-meta.php';
263
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-customer-query.php';
@@ -277,6 +304,8 @@ final class Easy_Digital_Downloads {
277
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-stats.php';
278
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-roles.php';
279
  require_once EDD_PLUGIN_DIR . 'includes/country-functions.php';
 
 
280
  require_once EDD_PLUGIN_DIR . 'includes/formatting.php';
281
  require_once EDD_PLUGIN_DIR . 'includes/widgets.php';
282
  require_once EDD_PLUGIN_DIR . 'includes/misc-functions.php';
@@ -321,13 +350,16 @@ final class Easy_Digital_Downloads {
321
  require_once EDD_PLUGIN_DIR . 'includes/admin/tracking.php'; // Must be loaded on frontend to ensure cron runs
322
  require_once EDD_PLUGIN_DIR . 'includes/privacy-functions.php';
323
  require_once EDD_PLUGIN_DIR . 'includes/utils/class-tokenizer.php';
 
 
 
 
324
 
325
  if ( is_admin() || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
326
  require_once EDD_PLUGIN_DIR . 'includes/admin/add-ons.php';
327
  require_once EDD_PLUGIN_DIR . 'includes/admin/admin-footer.php';
328
  require_once EDD_PLUGIN_DIR . 'includes/admin/admin-actions.php';
329
  require_once EDD_PLUGIN_DIR . 'includes/admin/class-edd-notices.php';
330
- require_once EDD_PLUGIN_DIR . 'includes/admin/class-pass-manager.php';
331
  require_once EDD_PLUGIN_DIR . 'includes/admin/admin-pages.php';
332
  require_once EDD_PLUGIN_DIR . 'includes/admin/dashboard-widgets.php';
333
  require_once EDD_PLUGIN_DIR . 'includes/admin/thickbox.php';
@@ -361,6 +393,15 @@ final class Easy_Digital_Downloads {
361
  require_once EDD_PLUGIN_DIR . 'includes/admin/upgrades/upgrades.php';
362
  require_once EDD_PLUGIN_DIR . 'includes/admin/class-edd-heartbeat.php';
363
  require_once EDD_PLUGIN_DIR . 'includes/admin/tools/tools-actions.php';
 
 
 
 
 
 
 
 
 
364
 
365
  require_once EDD_PLUGIN_DIR . 'includes/libraries/class-persistent-dismissible.php';
366
  require_once EDD_PLUGIN_DIR . 'includes/admin/promos/class-promo-handler.php';
@@ -373,6 +414,33 @@ final class Easy_Digital_Downloads {
373
  require_once EDD_PLUGIN_DIR . 'includes/install.php';
374
  }
375
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
376
  /**
377
  * Loads the plugin language files.
378
  *
5
  * Description: The easiest way to sell digital products with WordPress.
6
  * Author: Easy Digital Downloads
7
  * Author URI: https://easydigitaldownloads.com
8
+ * Version: 2.11.4
9
  * Text Domain: easy-digital-downloads
10
  * Domain Path: languages
11
  *
25
  * @package EDD
26
  * @category Core
27
  * @author Easy Digital Downloads
28
+ * @version 2.11.4
29
  */
30
 
31
  // Exit if accessed directly.
121
  */
122
  public $customer_meta;
123
 
124
+ /**
125
+ * @var \EDD\Database\NotificationsDB
126
+ */
127
+ public $notifications;
128
+
129
  /**
130
  * EDD Cart Object
131
  *
134
  */
135
  public $cart;
136
 
137
+ /**
138
+ * EDD Payment Stats Object
139
+ *
140
+ * @var EDD_Payment_Stats
141
+ * @since 1.8
142
+ */
143
+ public $payment_stats;
144
+
145
+ /**
146
+ * Holds registered premium EDD extensions.
147
+ *
148
+ * @var \EDD\Extensions\ExtensionRegistry
149
+ * @since 2.11.4
150
+ */
151
+ public $extensionRegistry;
152
+
153
  /**
154
  * Main Easy_Digital_Downloads Instance.
155
  *
173
  add_action( 'plugins_loaded', array( self::$instance, 'load_textdomain' ) );
174
 
175
  self::$instance->includes();
176
+ self::$instance->roles = new EDD_Roles();
177
+ self::$instance->fees = new EDD_Fees();
178
+ self::$instance->api = new EDD_API();
179
+ self::$instance->session = new EDD_Session();
180
+ self::$instance->html = new EDD_HTML_Elements();
181
+ self::$instance->emails = new EDD_Emails();
182
+ self::$instance->email_tags = new EDD_Email_Template_Tags();
183
+ self::$instance->customers = new EDD_DB_Customers();
184
+ self::$instance->customer_meta = new EDD_DB_Customer_Meta();
185
+ self::$instance->notifications = new \EDD\Database\NotificationsDB();
186
+ self::$instance->payment_stats = new EDD_Payment_Stats();
187
+ self::$instance->cart = new EDD_Cart();
188
+ self::$instance->extensionRegistry = new \EDD\Extensions\ExtensionRegistry();
189
+
190
+ self::$instance->registerApiEndpoints();
191
  }
192
 
193
  return self::$instance;
231
 
232
  // Plugin version.
233
  if ( ! defined( 'EDD_VERSION' ) ) {
234
+ define( 'EDD_VERSION', '2.11.4' );
235
  }
236
 
237
  // Plugin Folder Path.
274
  }
275
  require_once EDD_PLUGIN_DIR . 'includes/ajax-functions.php';
276
  require_once EDD_PLUGIN_DIR . 'includes/api/class-edd-api.php';
277
+ require_once EDD_PLUGIN_DIR . 'includes/api/v3/Endpoint.php';
278
  require_once EDD_PLUGIN_DIR . 'includes/template-functions.php';
279
  require_once EDD_PLUGIN_DIR . 'includes/template-actions.php';
280
  require_once EDD_PLUGIN_DIR . 'includes/checkout/template.php';
284
  require_once EDD_PLUGIN_DIR . 'includes/cart/template.php';
285
  require_once EDD_PLUGIN_DIR . 'includes/cart/actions.php';
286
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-db.php';
287
+ require_once EDD_PLUGIN_DIR . 'includes/database/NotificationsDB.php';
288
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-db-customers.php';
289
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-db-customer-meta.php';
290
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-customer-query.php';
304
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-stats.php';
305
  require_once EDD_PLUGIN_DIR . 'includes/class-edd-roles.php';
306
  require_once EDD_PLUGIN_DIR . 'includes/country-functions.php';
307
+ require_once EDD_PLUGIN_DIR . 'includes/extensions/licensing-functions.php';
308
+ require_once EDD_PLUGIN_DIR . 'includes/extensions/ExtensionRegistry.php';
309
  require_once EDD_PLUGIN_DIR . 'includes/formatting.php';
310
  require_once EDD_PLUGIN_DIR . 'includes/widgets.php';
311
  require_once EDD_PLUGIN_DIR . 'includes/misc-functions.php';
350
  require_once EDD_PLUGIN_DIR . 'includes/admin/tracking.php'; // Must be loaded on frontend to ensure cron runs
351
  require_once EDD_PLUGIN_DIR . 'includes/privacy-functions.php';
352
  require_once EDD_PLUGIN_DIR . 'includes/utils/class-tokenizer.php';
353
+ require_once EDD_PLUGIN_DIR . 'includes/models/Notification.php';
354
+ require_once EDD_PLUGIN_DIR . 'includes/utils/EnvironmentChecker.php';
355
+ require_once EDD_PLUGIN_DIR . 'includes/utils/NotificationImporter.php';
356
+ require_once EDD_PLUGIN_DIR . 'includes/admin/class-pass-manager.php';
357
 
358
  if ( is_admin() || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
359
  require_once EDD_PLUGIN_DIR . 'includes/admin/add-ons.php';
360
  require_once EDD_PLUGIN_DIR . 'includes/admin/admin-footer.php';
361
  require_once EDD_PLUGIN_DIR . 'includes/admin/admin-actions.php';
362
  require_once EDD_PLUGIN_DIR . 'includes/admin/class-edd-notices.php';
 
363
  require_once EDD_PLUGIN_DIR . 'includes/admin/admin-pages.php';
364
  require_once EDD_PLUGIN_DIR . 'includes/admin/dashboard-widgets.php';
365
  require_once EDD_PLUGIN_DIR . 'includes/admin/thickbox.php';
393
  require_once EDD_PLUGIN_DIR . 'includes/admin/upgrades/upgrades.php';
394
  require_once EDD_PLUGIN_DIR . 'includes/admin/class-edd-heartbeat.php';
395
  require_once EDD_PLUGIN_DIR . 'includes/admin/tools/tools-actions.php';
396
+ require_once EDD_PLUGIN_DIR . 'includes/admin/extensions/class-extension-manager.php';
397
+ require_once EDD_PLUGIN_DIR . 'includes/admin/extensions/abstract-extension.php';
398
+ require_once EDD_PLUGIN_DIR . 'includes/admin/extensions/class-extension-product-data.php';
399
+ require_once EDD_PLUGIN_DIR . 'includes/admin/extensions/product-education/class-wpsmtp.php';
400
+ require_once EDD_PLUGIN_DIR . 'includes/admin/extensions/product-education/class-recurring.php';
401
+ require_once EDD_PLUGIN_DIR . 'includes/admin/extensions/product-education/class-reviews.php';
402
+ require_once EDD_PLUGIN_DIR . 'includes/admin/extensions/product-education/class-email-marketing.php';
403
+ require_once EDD_PLUGIN_DIR . 'includes/admin/extensions/product-education/class-invoices.php';
404
+ require_once EDD_PLUGIN_DIR . 'includes/admin/settings/settings-compatibility.php';
405
 
406
  require_once EDD_PLUGIN_DIR . 'includes/libraries/class-persistent-dismissible.php';
407
  require_once EDD_PLUGIN_DIR . 'includes/admin/promos/class-promo-handler.php';
414
  require_once EDD_PLUGIN_DIR . 'includes/install.php';
415
  }
416
 
417
+ /**
418
+ * Registers REST API endpoints.
419
+ *
420
+ * @todo move this somewhere better
421
+ *
422
+ * @since 2.11.4
423
+ */
424
+ private function registerApiEndpoints() {
425
+ add_action( 'rest_api_init', function() {
426
+ $endpoints = array(
427
+ '\\EDD\\API\\v3\\Notifications',
428
+ );
429
+
430
+ foreach( $endpoints as $endpointClassName ) {
431
+ $endpointNamePieces = explode( '\\', $endpointClassName );
432
+ $endpointName = end( $endpointNamePieces );
433
+
434
+ require_once EDD_PLUGIN_DIR . 'includes/api/v3/' . $endpointName . '.php';
435
+
436
+ if ( class_exists( $endpointClassName ) ) {
437
+ $endpoint = new $endpointClassName();
438
+ $endpoint->register();
439
+ }
440
+ }
441
+ } );
442
+ }
443
+
444
  /**
445
  * Loads the plugin language files.
446
  *
includes/admin/admin-pages.php CHANGED
@@ -279,6 +279,11 @@ function edd_is_admin_page( $passed_page = '', $passed_view = '', $include_non_e
279
  $found = true;
280
  }
281
  break;
 
 
 
 
 
282
  default:
283
  if ( ( 'download' == $typenow || 'download' === $post_type ) && $pagenow == 'edit.php' && 'edd-settings' === $page ) {
284
  $found = true;
279
  $found = true;
280
  }
281
  break;
282
+ case 'marketing':
283
+ if ( ( 'download' == $typenow || 'download' === $post_type ) && $pagenow == 'edit.php' && 'edd-settings' === $page && 'marketing' === $tab ) {
284
+ $found = true;
285
+ }
286
+ break;
287
  default:
288
  if ( ( 'download' == $typenow || 'download' === $post_type ) && $pagenow == 'edit.php' && 'edd-settings' === $page ) {
289
  $found = true;
includes/admin/class-edd-notices.php CHANGED
@@ -221,6 +221,9 @@ class EDD_Notices {
221
  case 'email_sent' :
222
  $notices['updated']['edd-payment-sent'] = __( 'The purchase receipt has been resent.', 'easy-digital-downloads' );
223
  break;
 
 
 
224
  case 'refreshed-reports' :
225
  $notices['updated']['edd-refreshed-reports'] = __( 'The reports have been refreshed.', 'easy-digital-downloads' );
226
  break;
@@ -248,9 +251,6 @@ class EDD_Notices {
248
  case 'api-key-revoked' :
249
  $notices['updated']['edd-api-key-revoked'] = __( 'API keys successfully revoked.', 'easy-digital-downloads' );
250
  break;
251
- case 'sendwp-connected' :
252
- $notices['updated']['edd-sendwp-connected'] = __( 'SendWP has been successfully connected!', 'easy-digital-downloads' );
253
- break;
254
  }
255
  }
256
 
221
  case 'email_sent' :
222
  $notices['updated']['edd-payment-sent'] = __( 'The purchase receipt has been resent.', 'easy-digital-downloads' );
223
  break;
224
+ case 'email_send_failed':
225
+ $notices['error']['edd-payment-sent'] = __( 'Failed to send purchase receipt.', 'easy-digital-downloads' );
226
+ break;
227
  case 'refreshed-reports' :
228
  $notices['updated']['edd-refreshed-reports'] = __( 'The reports have been refreshed.', 'easy-digital-downloads' );
229
  break;
251
  case 'api-key-revoked' :
252
  $notices['updated']['edd-api-key-revoked'] = __( 'API keys successfully revoked.', 'easy-digital-downloads' );
253
  break;
 
 
 
254
  }
255
  }
256
 
includes/admin/class-pass-manager.php CHANGED
@@ -25,7 +25,14 @@ class Pass_Manager {
25
  *
26
  * @var int|null
27
  */
28
- public $highest_pass_id;
 
 
 
 
 
 
 
29
 
30
  /**
31
  * Pass data from the database. This will be an array with
@@ -50,6 +57,13 @@ class Pass_Manager {
50
  */
51
  public $has_pass_data = false;
52
 
 
 
 
 
 
 
 
53
  /**
54
  * Hierarchy of passes. This helps us determine if one pass
55
  * is "higher" than another.
@@ -76,24 +90,28 @@ class Pass_Manager {
76
  $this->has_pass_data = true;
77
  }
78
 
79
- $this->highest_pass_id = $this->get_highest_pass_id();
 
 
 
80
  }
81
 
82
  /**
83
- * Returns the ID of the highest tier pass that's activated.
84
- *
85
- * @since 2.10.6
86
  *
87
- * @return int|null Pass ID if one is found, null if one was not found.
 
88
  */
89
- private function get_highest_pass_id() {
90
- $highest_pass_id = null;
91
 
92
  if ( ! $this->has_pass_data || ! is_array( $this->pass_data ) ) {
93
- return $highest_pass_id;
94
  }
95
 
96
- foreach ( $this->pass_data as $pass_data ) {
 
 
 
97
  /*
98
  * If this pass was last verified more than 2 months ago, we're not using it.
99
  * This ensures we never deal with a "stale" record for a pass that's no longer
@@ -112,17 +130,20 @@ class Pass_Manager {
112
 
113
  // If we don't yet have a "highest pass", then this one is it automatically.
114
  if ( empty( $highest_pass_id ) ) {
115
- $highest_pass_id = intval( $pass_data['pass_id'] );
 
116
  continue;
117
  }
118
 
119
  // Otherwise, this pass only takes over the highest pass if it's actually higher.
120
  if ( self::pass_compare( (int) $pass_data['pass_id'], $highest_pass_id, '>' ) ) {
121
- $highest_pass_id = intval( $pass_data['pass_id'] );
 
122
  }
123
  }
124
 
125
- return $highest_pass_id;
 
126
  }
127
 
128
  /**
@@ -136,6 +157,89 @@ class Pass_Manager {
136
  return ! empty( $this->highest_pass_id );
137
  }
138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  /**
140
  * Compares two passes with each other according to the supplied operator.
141
  *
25
  *
26
  * @var int|null
27
  */
28
+ public $highest_pass_id = null;
29
+
30
+ /**
31
+ * License key of the highest tier pass that's activated.
32
+ *
33
+ * @var string|null
34
+ */
35
+ public $highest_license_key = null;
36
 
37
  /**
38
  * Pass data from the database. This will be an array with
57
  */
58
  public $has_pass_data = false;
59
 
60
+ /**
61
+ * Number of license keys entered on this site.
62
+ *
63
+ * @var int
64
+ */
65
+ public $number_license_keys;
66
+
67
  /**
68
  * Hierarchy of passes. This helps us determine if one pass
69
  * is "higher" than another.
90
  $this->has_pass_data = true;
91
  }
92
 
93
+ // Set up the highest pass data.
94
+ $this->set_highest_pass_data();
95
+
96
+ $this->number_license_keys = count( \EDD\Extensions\get_licensed_extension_slugs() );
97
  }
98
 
99
  /**
100
+ * Gets the highest pass and defines its data.
 
 
101
  *
102
+ * @since 2.11.4
103
+ * @return void
104
  */
105
+ private function set_highest_pass_data() {
 
106
 
107
  if ( ! $this->has_pass_data || ! is_array( $this->pass_data ) ) {
108
+ return;
109
  }
110
 
111
+ $highest_license_key = null;
112
+ $highest_pass_id = null;
113
+
114
+ foreach ( $this->pass_data as $license_key => $pass_data ) {
115
  /*
116
  * If this pass was last verified more than 2 months ago, we're not using it.
117
  * This ensures we never deal with a "stale" record for a pass that's no longer
130
 
131
  // If we don't yet have a "highest pass", then this one is it automatically.
132
  if ( empty( $highest_pass_id ) ) {
133
+ $highest_license_key = $license_key;
134
+ $highest_pass_id = intval( $pass_data['pass_id'] );
135
  continue;
136
  }
137
 
138
  // Otherwise, this pass only takes over the highest pass if it's actually higher.
139
  if ( self::pass_compare( (int) $pass_data['pass_id'], $highest_pass_id, '>' ) ) {
140
+ $highest_license_key = $license_key;
141
+ $highest_pass_id = intval( $pass_data['pass_id'] );
142
  }
143
  }
144
 
145
+ $this->highest_license_key = $highest_license_key;
146
+ $this->highest_pass_id = $highest_pass_id;
147
  }
148
 
149
  /**
157
  return ! empty( $this->highest_pass_id );
158
  }
159
 
160
+ /**
161
+ * If this is a "free install". That means there are no à la carte or pass licenses activated.
162
+ *
163
+ * @since 2.11.4
164
+ *
165
+ * @return bool
166
+ */
167
+ public function isFree() {
168
+ return 0 === $this->number_license_keys;
169
+ }
170
+
171
+ /**
172
+ * If this site has an individual product license active (à la carte), but no pass active.
173
+ *
174
+ * @since 2.11.4
175
+ *
176
+ * @return bool
177
+ */
178
+ public function hasIndividualLicense() {
179
+ return ! $this->isFree() && ! $this->has_pass();
180
+ }
181
+
182
+ /**
183
+ * If this site has a Personal Pass active.
184
+ *
185
+ * @since 2.11.4
186
+ *
187
+ * @return bool
188
+ */
189
+ public function hasPersonalPass() {
190
+ try {
191
+ return self::pass_compare( $this->highest_pass_id, self::PERSONAL_PASS_ID, '=' );
192
+ } catch ( \Exception $e ) {
193
+ return false;
194
+ }
195
+ }
196
+
197
+ /**
198
+ * If this site has an Extended Pass active.
199
+ *
200
+ * @since 2.11.4
201
+ *
202
+ * @return bool
203
+ */
204
+ public function hasExtendedPass() {
205
+ try {
206
+ return self::pass_compare( $this->highest_pass_id, self::EXTENDED_PASS_ID, '=' );
207
+ } catch ( \Exception $e ) {
208
+ return false;
209
+ }
210
+ }
211
+
212
+ /**
213
+ * If this site has a Professional Pass active.
214
+ *
215
+ * @since 2.11.4
216
+ *
217
+ * @return bool
218
+ */
219
+ public function hasProfessionalPass() {
220
+ try {
221
+ return self::pass_compare( $this->highest_pass_id, self::PROFESSIONAL_PASS_ID, '=' );
222
+ } catch( \Exception $e ) {
223
+ return false;
224
+ }
225
+ }
226
+
227
+ /**
228
+ * If this site has an All Access Pass active.
229
+ * Note: This uses >= to account for both All Access and lifetime All Access.
230
+ *
231
+ * @since 2.11.4
232
+ *
233
+ * @return bool
234
+ */
235
+ public function hasAllAccessPass() {
236
+ try {
237
+ return self::pass_compare( $this->highest_pass_id, self::ALL_ACCESS_PASS_ID, '>=' );
238
+ } catch( \Exception $e ) {
239
+ return false;
240
+ }
241
+ }
242
+
243
  /**
244
  * Compares two passes with each other according to the supplied operator.
245
  *
includes/admin/dashboard-widgets.php CHANGED
@@ -37,8 +37,18 @@ add_action('wp_dashboard_setup', 'edd_register_dashboard_widgets', 10 );
37
  * @since 1.2.2
38
  * @return void
39
  */
40
- function edd_dashboard_sales_widget( ) {
41
- echo '<p><img src=" ' . esc_attr( set_url_scheme( EDD_PLUGIN_URL . 'assets/images/loading.gif', 'relative' ) ) . '"/></p>';
 
 
 
 
 
 
 
 
 
 
42
  }
43
 
44
  /**
37
  * @since 1.2.2
38
  * @return void
39
  */
40
+ function edd_dashboard_sales_widget() {
41
+ /**
42
+ * Action hook to add content to the dashboard widget.
43
+ * This content will not be replaced by the AJAX function:
44
+ * only the "edd-loading" content will.
45
+ *
46
+ * @since 2.11.4
47
+ */
48
+ do_action( 'edd_dashboard_sales_widget' );
49
+ ?>
50
+ <p class="edd-loading"><img src="<?php echo esc_url( EDD_PLUGIN_URL . 'assets/images/loading.gif' ); ?>"></p>
51
+ <?php
52
  }
53
 
54
  /**
includes/admin/downloads/metabox.php CHANGED
@@ -21,9 +21,7 @@ if ( ! defined( 'ABSPATH' ) ) exit;
21
  * @return void
22
  */
23
  function edd_add_download_meta_box() {
24
- $reviews_location = edd_reviews_location();
25
- $is_promo_active = edd_is_promo_active();
26
- $post_types = apply_filters( 'edd_download_metabox_post_types', array( 'download' ) );
27
 
28
  foreach ( $post_types as $post_type ) {
29
 
@@ -43,17 +41,6 @@ function edd_add_download_meta_box() {
43
  /** Product Stats */
44
  add_meta_box( 'edd_product_stats', sprintf( __( '%1$s Stats', 'easy-digital-downloads' ), edd_get_label_singular(), edd_get_label_plural() ), 'edd_render_stats_meta_box', $post_type, 'side', 'high' );
45
  }
46
-
47
- if ( ! class_exists( 'EDD_Reviews' ) ) {
48
- add_meta_box( 'edd-reviews-status', __( 'Product Reviews', 'easy-digital-downloads' ), 'edd_render_review_status_metabox', 'download', 'side', 'low' );
49
- }
50
-
51
- // If a promotion is active and Product Reviews is either activated or installed but not activated, show promo.
52
- if ( true === $is_promo_active ) {
53
- if ( class_exists( 'EDD_Reviews' ) || ( ! class_exists( 'EDD_Reviews' ) && ! empty( $reviews_location ) ) ) {
54
- add_meta_box( 'edd-promo', __( 'Black Friday & Cyber Monday sale!', 'easy-digital-downloads' ), 'edd_render_promo_metabox', 'download', 'side', 'low' );
55
- }
56
- }
57
  }
58
  }
59
  add_action( 'add_meta_boxes', 'edd_add_download_meta_box' );
@@ -1219,95 +1206,6 @@ function edd_render_stats_meta_box() {
1219
  do_action('edd_stats_meta_box');
1220
  }
1221
 
1222
- /**
1223
- * Get the path of the Product Reviews plugin
1224
- *
1225
- * @since 2.9.20
1226
- *
1227
- * @return mixed|string
1228
- */
1229
- function edd_reviews_location() {
1230
- $possible_locations = array( 'edd-reviews/edd-reviews.php', 'EDD-Reviews/edd-reviews.php' );
1231
- $reviews_location = '';
1232
-
1233
- foreach ( $possible_locations as $location ) {
1234
-
1235
- if ( 0 !== validate_plugin( $location ) ) {
1236
- continue;
1237
- }
1238
- $reviews_location = $location;
1239
- }
1240
-
1241
- return $reviews_location;
1242
- }
1243
-
1244
- /**
1245
- * Outputs a metabox for the Product Reviews extension to show or activate it.
1246
- *
1247
- * @since 2.8
1248
- * @return void
1249
- */
1250
- function edd_render_review_status_metabox() {
1251
- $reviews_location = edd_reviews_location();
1252
- $is_promo_active = edd_is_promo_active();
1253
-
1254
- ob_start();
1255
-
1256
- if ( ! empty( $reviews_location ) ) {
1257
- $review_path = '';
1258
- $base_url = wp_nonce_url( admin_url( 'plugins.php' ), 'activate-plugin_' . $reviews_location );
1259
- $args = array(
1260
- 'action' => 'activate',
1261
- 'plugin' => sanitize_text_field( $reviews_location ),
1262
- 'plugin_status' => 'all',
1263
- );
1264
- $activate_url = add_query_arg( $args, $base_url );
1265
- ?><p style="text-align: center;"><a href="<?php echo esc_url( $activate_url ); ?>" class="button-secondary"><?php _e( 'Activate Reviews', 'easy-digital-downloads' ); ?></a></p><?php
1266
-
1267
- } else {
1268
-
1269
- // Adjust UTM params based on state of promotion.
1270
- if ( true === $is_promo_active ) {
1271
- $args = array(
1272
- 'utm_source' => 'download-metabox',
1273
- 'utm_medium' => 'wp-admin',
1274
- 'utm_campaign' => 'bfcm2019',
1275
- 'utm_content' => 'product-reviews-metabox-bfcm',
1276
- );
1277
- } else {
1278
- $args = array(
1279
- 'utm_source' => 'edit-download',
1280
- 'utm_medium' => 'enable-reviews',
1281
- 'utm_campaign' => 'admin',
1282
- );
1283
- }
1284
-
1285
- $base_url = 'https://easydigitaldownloads.com/downloads/product-reviews';
1286
- $url = add_query_arg( $args, $base_url );
1287
- ?>
1288
- <p>
1289
- <?php
1290
- // Translators: The %s represents the link to the Product Reviews extension.
1291
- echo wp_kses_post( sprintf( __( 'Would you like to enable reviews for this product? Check out our <a target="_blank" href="%s">Product Reviews</a> extension.', 'easy-digital-downloads' ), esc_url( $url ) ) );
1292
- ?>
1293
- </p>
1294
- <?php
1295
- // Add an additional note if a promotion is active.
1296
- if ( true === $is_promo_active ) {
1297
- ?>
1298
- <p>
1299
- <?php echo wp_kses_post( __( 'Act now and <strong>SAVE 25%</strong> on your purchase. Sale ends <em>23:59 PM December 6th CST</em>. Use code <code>BFCM2019</code> at checkout.', 'easy-digital-downloads' ) ); ?>
1300
- </p>
1301
- <?php
1302
- }
1303
- }
1304
-
1305
- $rendered = ob_get_contents();
1306
- ob_end_clean();
1307
-
1308
- echo wp_kses_post( $rendered );
1309
- }
1310
-
1311
  /**
1312
  * Outputs a metabox for promotional content.
1313
  *
21
  * @return void
22
  */
23
  function edd_add_download_meta_box() {
24
+ $post_types = apply_filters( 'edd_download_metabox_post_types', array( 'download' ) );
 
 
25
 
26
  foreach ( $post_types as $post_type ) {
27
 
41
  /** Product Stats */
42
  add_meta_box( 'edd_product_stats', sprintf( __( '%1$s Stats', 'easy-digital-downloads' ), edd_get_label_singular(), edd_get_label_plural() ), 'edd_render_stats_meta_box', $post_type, 'side', 'high' );
43
  }
 
 
 
 
 
 
 
 
 
 
 
44
  }
45
  }
46
  add_action( 'add_meta_boxes', 'edd_add_download_meta_box' );
1206
  do_action('edd_stats_meta_box');
1207
  }
1208
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1209
  /**
1210
  * Outputs a metabox for promotional content.
1211
  *
includes/admin/extensions/abstract-extension.php ADDED
@@ -0,0 +1,344 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace EDD\Admin\Extensions;
4
+
5
+ use \EDD\Admin\Pass_Manager;
6
+
7
+ abstract class Extension {
8
+
9
+ /**
10
+ * The product ID. This only needs to be set if the extending class is
11
+ * for a single product.
12
+ *
13
+ * @since 2.11.4
14
+ * @var int
15
+ */
16
+ protected $item_id;
17
+
18
+ /**
19
+ * The settings tab where this item will show.
20
+ *
21
+ * @since 2.11.4
22
+ * @var string
23
+ */
24
+ protected $settings_tab = '';
25
+
26
+ /**
27
+ * The required AA pass level.
28
+ */
29
+ const PASS_LEVEL = Pass_Manager::PERSONAL_PASS_ID;
30
+
31
+ /**
32
+ * The Extension Manager
33
+ *
34
+ * @var \EDD\Admin\Extensions\Extension_Manager
35
+ */
36
+ protected $manager;
37
+
38
+ public function __construct() {
39
+ $this->manager = new \EDD\Admin\Extensions\Extension_Manager( static::PASS_LEVEL );
40
+ }
41
+
42
+ /**
43
+ * Whether the extension is activated.
44
+ *
45
+ * @since 2.11.4
46
+ * @return bool
47
+ */
48
+ abstract protected function is_activated();
49
+
50
+ /**
51
+ * Output the settings field (installation helper).
52
+ *
53
+ * @return void
54
+ */
55
+ public function settings_field() {
56
+ if ( $this->is_activated() ) {
57
+ return;
58
+ }
59
+ $this->do_single_extension_card();
60
+ }
61
+
62
+ /**
63
+ * Outputs a single extension card.
64
+ *
65
+ * @since 2.11.4
66
+ * @param false|int $item_id Optional: the individual extension product ID.
67
+ * @return void
68
+ */
69
+ public function do_single_extension_card( $item_id = false ) {
70
+ if ( empty( $item_id ) && empty( $this->item_id ) ) {
71
+ return;
72
+ }
73
+ $product_data = $this->get_product_data( $item_id );
74
+ if ( ! $product_data || empty( $product_data->title ) ) {
75
+ return;
76
+ }
77
+ $this->manager->do_extension_card(
78
+ $product_data,
79
+ $this->get_button_parameters( $product_data, $item_id ),
80
+ $this->get_link_parameters( $product_data ),
81
+ $this->get_configuration( $product_data )
82
+ );
83
+ }
84
+
85
+ /**
86
+ * Gets the product data for a specific extension.
87
+ *
88
+ * @param false|int $item_id
89
+ * @return bool|ProductData|array False if there is no data; product data object if there is, or possibly an array of arrays.
90
+ */
91
+ public function get_product_data( $item_id = false ) {
92
+ require_once EDD_PLUGIN_DIR . 'includes/admin/extensions/class-extensions-api.php';
93
+ $api = new ExtensionsAPI();
94
+ $body = $this->get_api_body();
95
+ $api_item_id = $item_id ?: $this->item_id;
96
+ $product_data = $api->get_product_data( $body, $api_item_id );
97
+ if ( ! $product_data ) {
98
+ return false;
99
+ }
100
+
101
+ if ( $api_item_id ) {
102
+ return $product_data;
103
+ }
104
+
105
+ if ( $item_id && ! empty( $product_data[ $item_id ] ) ) {
106
+ return $product_data[ $item_id ];
107
+ }
108
+
109
+ return $product_data;
110
+ }
111
+
112
+ /**
113
+ * Gets the custom configuration for the extension.
114
+ *
115
+ * @since 2.11.4
116
+ * @param ProductData $product_data Optionally allows the product data to be parsed in the configuration.
117
+ * @return array
118
+ */
119
+ protected function get_configuration( ProductData $product_data ) {
120
+ return array();
121
+ }
122
+
123
+ /**
124
+ * Formats a custom description array by running wpautop and converting it to a string.
125
+ *
126
+ * @since 2.11.4
127
+ * @param array $description The custom product description.
128
+ * @return string
129
+ */
130
+ protected function format_description( array $description ) {
131
+ return implode( '', array_map( 'wpautop', $description ) );
132
+ }
133
+
134
+ /**
135
+ * Whether the current screen is an EDD setings screen.
136
+ *
137
+ * @since 2.11.4
138
+ * @return bool
139
+ */
140
+ protected function is_edd_settings_screen() {
141
+ return edd_is_admin_page( 'settings', $this->settings_tab );
142
+ }
143
+
144
+ /**
145
+ * Whether the current screen is a download new/edit screen.
146
+ *
147
+ * @since 2.11.4
148
+ * @return bool
149
+ */
150
+ protected function is_download_edit_screen() {
151
+ return edd_is_admin_page( 'download', 'edit' ) || edd_is_admin_page( 'download', 'new' );
152
+ }
153
+
154
+ /**
155
+ * Whether the section for an individual product can be registered/shown.
156
+ *
157
+ * @since 2.11.4
158
+ * @return bool
159
+ */
160
+ protected function can_show_product_section() {
161
+ if ( ! $this->is_edd_settings_screen() ) {
162
+ return false;
163
+ }
164
+ if ( $this->is_activated() ) {
165
+ return false;
166
+ }
167
+ if ( ! $this->get_product_data() ) {
168
+ return false;
169
+ }
170
+
171
+ return true;
172
+ }
173
+
174
+ /**
175
+ * Gets the array for the body of the API request.
176
+ * Classes may need to override this (for example, to query a specific tag).
177
+ * Note that the first array key/value pair are used to create the option name.
178
+ *
179
+ * @return array
180
+ */
181
+ protected function get_api_body() {
182
+ return array();
183
+ }
184
+
185
+ /**
186
+ * Gets the type for the button data-type attribute.
187
+ * This is intended to sync with the Products API request.
188
+ * Default is product.
189
+ *
190
+ * Really a shim for array_key_first.
191
+ *
192
+ * @param array $array
193
+ * @return string
194
+ */
195
+ private function get_type( array $array ) {
196
+ $type = 'product';
197
+ if ( empty( $array ) ) {
198
+ return $type;
199
+ }
200
+ if ( function_exists( 'array_key_first' ) ) {
201
+ return array_key_first( $array );
202
+ }
203
+ foreach ( $array as $key => $unused ) {
204
+ return $key;
205
+ }
206
+
207
+ return $type;
208
+ }
209
+
210
+ /**
211
+ * Gets the button parameters.
212
+ * Classes should not need to replace this method.
213
+ *
214
+ * @param ProductData $product_data The extension data returned from the Products API.
215
+ * @param int|false $item_id Optional: the item ID.
216
+ * @return array
217
+ */
218
+ protected function get_button_parameters( ProductData $product_data, $item_id = false ) {
219
+ if ( empty( $item_id ) ) {
220
+ $item_id = $this->item_id;
221
+ }
222
+ $body = $this->get_api_body();
223
+ $type = $this->get_type( $body );
224
+ $id = ! empty( $body[ $type ] ) ? $body[ $type ] : $this->item_id;
225
+ $button = array(
226
+ 'type' => $type,
227
+ 'id' => $id,
228
+ 'product' => $item_id,
229
+ );
230
+ // If the extension is not installed, the button will prompt to install and activate it.
231
+ if ( ! $this->manager->is_plugin_installed( $product_data->basename ) ) {
232
+ if ( $this->manager->pass_can_download() ) {
233
+ $button = array(
234
+ /* translators: The extension name. */
235
+ 'button_text' => sprintf( __( 'Log In to Your Account to Download %s', 'easy-digital-downloads' ), $product_data->title ),
236
+ 'href' => $this->get_upgrade_url( $product_data, $item_id, true ),
237
+ 'new_tab' => true,
238
+ 'type' => $type,
239
+ );
240
+ } else {
241
+ $button = array(
242
+ /* translators: The extension name. */
243
+ 'button_text' => sprintf( __( 'Upgrade Today to Access %s!', 'easy-digital-downloads' ), $product_data->title ),
244
+ 'href' => $this->get_upgrade_url( $product_data, $item_id ),
245
+ 'new_tab' => true,
246
+ 'type' => $type,
247
+ );
248
+ }
249
+ } elseif ( ! empty( $product_data->basename ) && ! $this->manager->is_plugin_active( $product_data->basename ) ) {
250
+ // If the extension is installed, but not activated, the button will prompt to activate it.
251
+ $button['plugin'] = $product_data->basename;
252
+ $button['action'] = 'activate';
253
+ /* translators: The extension name. */
254
+ $button['button_text'] = sprintf( __( 'Activate %s', 'easy-digital-downloads' ), $product_data->title );
255
+ }
256
+
257
+ return $button;
258
+ }
259
+
260
+ /**
261
+ * Gets the upgrade URL for the button.
262
+ *
263
+ * @since 2.11.4
264
+ * @param ProductData $product_data The product data object.
265
+ * @param int $item_id The item/product ID.
266
+ * @param bool $has_access Whether the user already has access to the extension (based on pass level).
267
+ * @return string
268
+ */
269
+ private function get_upgrade_url( ProductData $product_data, $item_id, $has_access = false ) {
270
+ $url = 'https://easydigitaldownloads.com';
271
+ $tab = ! empty( $_GET['tab'] ) ? sanitize_text_field( $_GET['tab'] ) : '';
272
+ $utm_parameters = array(
273
+ 'p' => urlencode( $item_id ),
274
+ 'utm_source' => 'settings',
275
+ 'utm_medium' => urlencode( $tab ),
276
+ 'utm_campaign' => 'admin',
277
+ 'utm_term' => urlencode( $product_data->slug ),
278
+ );
279
+
280
+ if ( $has_access ) {
281
+ $url = 'https://easydigitaldownloads.com/your-account/your-downloads/';
282
+ unset( $utm_parameters['p'] );
283
+ } elseif ( ! empty( $product_data->upgrade_url ) ) {
284
+ $url = esc_url_raw( $product_data->upgrade_url );
285
+ unset( $utm_parameters['p'] );
286
+ }
287
+
288
+ return add_query_arg(
289
+ $utm_parameters,
290
+ $url
291
+ );
292
+ }
293
+
294
+ /**
295
+ * Gets the array of parameters for the link to configure the extension.
296
+ *
297
+ * @since 2.11.4
298
+ * @param ProductData $product_data The product data object.
299
+ * @return array
300
+ */
301
+ protected function get_link_parameters( ProductData $product_data ) {
302
+ $configuration = $this->get_configuration( $product_data );
303
+ $tab = ! empty( $configuration['tab'] ) ? $configuration['tab'] : $product_data->tab;
304
+ $section = ! empty( $configuration['section'] ) ? $configuration['section'] : $product_data->section;
305
+ if ( empty( $tab ) && empty( $section ) ) {
306
+ return array(
307
+ /* translators: the plural Downloads label. */
308
+ 'button_text' => sprintf( __( 'View %s', 'easy-digital-downloads' ), edd_get_label_plural() ),
309
+ 'href' => add_query_arg(
310
+ array(
311
+ 'post_type' => 'download',
312
+ ),
313
+ admin_url( 'edit.php' )
314
+ ),
315
+ );
316
+ }
317
+
318
+ return array(
319
+ /* translators: The extension name. */
320
+ 'button_text' => sprintf( __( 'Configure %s', 'easy-digital-downloads' ), $product_data->title ),
321
+ 'href' => add_query_arg(
322
+ array(
323
+ 'post_type' => 'download',
324
+ 'page' => 'edd-settings',
325
+ 'tab' => urlencode( $tab ),
326
+ 'section' => urlencode( $section ),
327
+ ),
328
+ admin_url( 'edit.php' )
329
+ ),
330
+ );
331
+ }
332
+
333
+ /**
334
+ * Optionally hides the submit button on screens where it's not needed.
335
+ *
336
+ * @since 2.11.4
337
+ * @return void
338
+ */
339
+ public function hide_submit_button() {
340
+ ?>
341
+ <style>p.submit{display:none;}</style>
342
+ <?php
343
+ }
344
+ }
includes/admin/extensions/class-extension-manager.php ADDED
@@ -0,0 +1,485 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace EDD\Admin\Extensions;
4
+
5
+ use \EDD\Admin\Pass_Manager;
6
+
7
+ class Extension_Manager {
8
+
9
+ /**
10
+ * All of the installed plugins on the site.
11
+ *
12
+ * @since 2.11.4
13
+ * @var array
14
+ */
15
+ public $all_plugins;
16
+
17
+ /**
18
+ * The minimum pass ID required to install the extension.
19
+ *
20
+ * @since 2.11.4
21
+ * @var int
22
+ */
23
+ private $required_pass_id;
24
+
25
+ /**
26
+ * Pass Manager class
27
+ *
28
+ * @var Pass_Manager
29
+ */
30
+ protected $pass_manager;
31
+
32
+ public function __construct( $required_pass_id = null ) {
33
+ if ( $required_pass_id ) {
34
+ $this->required_pass_id = $required_pass_id;
35
+ }
36
+ $this->pass_manager = new Pass_Manager();
37
+
38
+ add_action( 'wp_ajax_edd_activate_extension', array( $this, 'activate' ) );
39
+ add_action( 'wp_ajax_edd_install_extension', array( $this, 'install' ) );
40
+ add_action( 'admin_enqueue_scripts', array( $this, 'register_assets' ) );
41
+ }
42
+
43
+ /**
44
+ * Registers the extension manager script and style.
45
+ *
46
+ * @since 2.11.4
47
+ * @return void
48
+ */
49
+ public function register_assets() {
50
+ if ( wp_script_is( 'edd-extension-manager', 'registered' ) ) {
51
+ return;
52
+ }
53
+ $minify = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
54
+ wp_register_style( 'edd-extension-manager', EDD_PLUGIN_URL . "assets/css/extension-manager{$minify}.css", array(), EDD_VERSION );
55
+ wp_register_script( 'edd-extension-manager', EDD_PLUGIN_URL . "assets/js/extension-manager{$minify}.js", array( 'jquery' ), EDD_VERSION, true );
56
+ wp_localize_script(
57
+ 'edd-extension-manager',
58
+ 'EDDExtensionManager',
59
+ array(
60
+ 'activating' => __( 'Activating', 'easy-digital-downloads' ),
61
+ 'installing' => __( 'Installing', 'easy-digital-downloads' ),
62
+ 'plugin_install_failed' => __( 'Could not install the plugin. Please download and install it manually via Plugins > Add New.', 'easy-digital-downloads' ),
63
+ 'extension_install_failed' => sprintf(
64
+ /* translators: 1. opening anchor tag, do not translate; 2. closing anchor tag, do not translate */
65
+ __( 'Could not install the extension. Please %1$sdownload it from your account%2$s and install it manually.', 'easy-digital-downloads' ),
66
+ '<a href="https://easydigitaldownloads.com/your-account/" target="_blank" rel="noopener noreferrer">',
67
+ '</a>'
68
+ ),
69
+ 'extension_manager_nonce' => wp_create_nonce( 'edd_extensionmanager' ),
70
+ )
71
+ );
72
+ }
73
+
74
+ /**
75
+ * Enqueues the extension manager script/style.
76
+ *
77
+ * @since 2.11.4
78
+ * @return void
79
+ */
80
+ public function enqueue() {
81
+ wp_enqueue_style( 'edd-extension-manager' );
82
+ wp_enqueue_script( 'edd-extension-manager' );
83
+ }
84
+
85
+ /**
86
+ * Outputs a standard extension card.
87
+ *
88
+ * @since 2.11.4
89
+ * @param ProductData $product The product data object.
90
+ * @param array $inactive_parameters The array of information to build the button for an inactive/not installed plugin.
91
+ * @param array $active_parameters The array of information needed to build the link to configure an active plugin.
92
+ * @param array $configuration The optional array of data to override the product data retrieved from the API.
93
+ * @return void
94
+ */
95
+ public function do_extension_card( ProductData $product, $inactive_parameters, $active_parameters, $configuration = array() ) {
96
+ $this->enqueue();
97
+ if ( ! empty( $configuration ) ) {
98
+ $product = $product->mergeConfig( $configuration );
99
+ }
100
+ ?>
101
+ <div class="<?php echo esc_attr( implode( ' ', array_map( 'sanitize_html_class', $this->get_card_classes( $product ) ) ) ); ?>">
102
+ <h3 class="edd-extension-manager__title"><?php echo esc_html( $product->title ); ?></h3>
103
+ <div class="edd-extension-manager__body">
104
+ <?php if ( ! empty( $product->image ) ) : ?>
105
+ <div class="edd-extension-manager__image">
106
+ <img alt="" src="<?php echo esc_url( $product->image ); ?>" />
107
+ </div>
108
+ <?php endif; ?>
109
+ <?php if ( ! empty( $product->description ) ) : ?>
110
+ <div class="edd-extension-manager__description"><?php echo wp_kses_post( wpautop( $product->description ) ); ?></div>
111
+ <?php endif; ?>
112
+ <?php if ( ! empty( $product->features ) && is_array( $product->features ) ) : ?>
113
+ <div class="edd-extension-manager__features">
114
+ <ul>
115
+ <?php foreach ( $product->features as $feature ) : ?>
116
+ <li><span class="dashicons dashicons-yes"></span><?php echo esc_html( $feature ); ?></li>
117
+ <?php endforeach; ?>
118
+ </ul>
119
+ </div>
120
+ <?php endif; ?>
121
+ <div class="edd-extension-manager__group">
122
+ <?php
123
+ if ( ! empty( $product->basename ) && ! $this->is_plugin_active( $product->basename ) ) {
124
+ ?>
125
+ <div class="edd-extension-manager__step">
126
+ <?php $this->button( $inactive_parameters ); ?>
127
+ </div>
128
+ <?php
129
+ }
130
+ ?>
131
+ <div class="edd-extension-manager__step">
132
+ <?php $this->link( $active_parameters ); ?>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ </div>
137
+ <?php
138
+ }
139
+
140
+ /**
141
+ * Gets the CSS classes for the single extension card.
142
+ *
143
+ * @since 2.11.4
144
+ * @param ProductData $product The product data object.
145
+ * @return array The array of CSS classes.
146
+ */
147
+ private function get_card_classes( $product ) {
148
+ $base_class = 'edd-extension-manager__card';
149
+ $card_classes = array(
150
+ $base_class,
151
+ );
152
+ $variation = 'stacked';
153
+ if ( ! empty( $product->style ) ) {
154
+ $variation = $product->style;
155
+ }
156
+ if ( 'detailed-2col' === $variation && ( empty( $product->features ) || ! is_array( $product->features ) ) ) {
157
+ $variation = 'detailed';
158
+ }
159
+ $card_classes[] = "{$base_class}--{$variation}";
160
+
161
+ return $card_classes;
162
+ }
163
+
164
+ /**
165
+ * Outputs the button to activate/install a plugin/extension.
166
+ * If a link is passed in the args, create a button style link instead (@uses $this->link()).
167
+ *
168
+ * @since 2.11.4
169
+ * @param array $args The array of parameters for the button.
170
+ * @return void
171
+ */
172
+ public function button( $args ) {
173
+ if ( ! empty( $args['href'] ) ) {
174
+ $this->link( $args );
175
+ return;
176
+ }
177
+ $defaults = array(
178
+ 'button_class' => 'button-primary',
179
+ 'plugin' => '',
180
+ 'action' => '',
181
+ 'button_text' => '',
182
+ 'type' => 'plugin',
183
+ 'id' => '',
184
+ 'product' => '',
185
+ 'pass' => $this->required_pass_id,
186
+ );
187
+ $args = wp_parse_args( $args, $defaults );
188
+ if ( empty( $args['button_text'] ) ) {
189
+ return;
190
+ }
191
+ ?>
192
+ <button
193
+ class="button <?php echo esc_attr( $args['button_class'] ); ?> edd-extension-manager__action"
194
+ <?php
195
+ foreach ( $args as $key => $attribute ) {
196
+ if ( empty( $attribute ) || in_array( $key, array( 'button_class', 'button_text' ), true ) ) {
197
+ continue;
198
+ }
199
+ printf(
200
+ ' data-%s="%s"',
201
+ esc_attr( $key ),
202
+ esc_attr( $attribute )
203
+ );
204
+ }
205
+ ?>
206
+ >
207
+ <?php echo esc_html( $args['button_text'] ); ?>
208
+ </button>
209
+ <?php
210
+ }
211
+
212
+ /**
213
+ * Outputs the link, if it should be a link.
214
+ *
215
+ * @param array $args
216
+ * @return void
217
+ */
218
+ public function link( $args ) {
219
+ $defaults = array(
220
+ 'button_class' => 'button-primary',
221
+ 'button_text' => '',
222
+ );
223
+ $args = wp_parse_args( $args, $defaults );
224
+ if ( empty( $args['button_text'] ) ) {
225
+ return;
226
+ }
227
+ ?>
228
+ <a
229
+ class="button <?php echo esc_attr( $args['button_class'] ); ?>"
230
+ href="<?php echo esc_url( $args['href'] ); ?>"
231
+ <?php echo ! empty( $args['new_tab'] ) ? ' target="_blank" rel="noopener noreferrer"' : ''; ?>
232
+ >
233
+ <?php echo esc_html( $args['button_text'] ); ?>
234
+ </a>
235
+ <?php
236
+ }
237
+
238
+ /**
239
+ * Installs and maybe activates a plugin or extension.
240
+ *
241
+ * @since 2.11.4
242
+ */
243
+ public function install() {
244
+
245
+ // Run a security check.
246
+ check_ajax_referer( 'edd_extensionmanager', 'nonce', true );
247
+
248
+ $generic_error = esc_html__( 'There was an error while performing your request.', 'easy-digital-downloads' );
249
+ $type = ! empty( $_POST['type'] ) ? sanitize_text_field( $_POST['type'] ) : '';
250
+ $required_pass = ! empty( $_POST['pass'] ) ? sanitize_text_field( $_POST['pass'] ) : '';
251
+ $result = array(
252
+ 'message' => $generic_error,
253
+ 'is_activated' => false,
254
+ );
255
+ if ( ! $type ) {
256
+ wp_send_json_error( $result );
257
+ }
258
+
259
+ // Check if new installations are allowed.
260
+ if ( ! $this->can_install( $type, $required_pass ) ) {
261
+ wp_send_json_error( $result );
262
+ }
263
+
264
+ $result['message'] = 'plugin' === $type
265
+ ? __( 'Could not install the plugin. Please download and install it manually via Plugins > Add New.', 'easy-digital-downloads' )
266
+ : sprintf(
267
+ /* translators: 1. opening anchor tag, do not translate; 2. closing anchor tag, do not translate */
268
+ __( 'Could not install the extension. Please %1$sdownload it from your account%2$s and install it manually.', 'easy-digital-downloads' ),
269
+ '<a href="https://easydigitaldownloads.com/your-account/" target="_blank" rel="noopener noreferrer">',
270
+ '</a>'
271
+ );
272
+
273
+ $plugin = ! empty( $_POST['plugin'] ) ? sanitize_text_field( $_POST['plugin'] ) : '';
274
+ if ( empty( $plugin ) ) {
275
+ wp_send_json_error( $result );
276
+ }
277
+
278
+ // Set the current screen to avoid undefined notices.
279
+ set_current_screen( 'download_page_edd-settings' );
280
+
281
+ // Prepare variables.
282
+ $url = esc_url_raw(
283
+ add_query_arg(
284
+ array(
285
+ 'post_type' => 'download',
286
+ 'page' => 'edd-addons',
287
+ ),
288
+ admin_url( 'edit.php' )
289
+ )
290
+ );
291
+
292
+ ob_start();
293
+ $creds = request_filesystem_credentials( $url, '', false, false, null );
294
+
295
+ // Hide the filesystem credentials form.
296
+ ob_end_clean();
297
+
298
+ // Check for file system permissions.
299
+ if ( ! $creds ) {
300
+ wp_send_json_error( $result );
301
+ }
302
+
303
+ if ( ! WP_Filesystem( $creds ) ) {
304
+ wp_send_json_error( $result );
305
+ }
306
+
307
+ /*
308
+ * We do not need any extra credentials if we have gotten this far, so let's install the plugin.
309
+ */
310
+ require_once EDD_PLUGIN_DIR . 'includes/admin/installers/class-plugin-silent-upgrader.php';
311
+ require_once EDD_PLUGIN_DIR . 'includes/admin/installers/class-plugin-silent-upgrader-skin.php';
312
+ require_once EDD_PLUGIN_DIR . 'includes/admin/installers/class-install-skin.php';
313
+
314
+ // Do not allow WordPress to search/download translations, as this will break JS output.
315
+ remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
316
+
317
+ // Create the plugin upgrader with our custom skin.
318
+ $installer = new \EDD\Admin\Installers\PluginSilentUpgrader( new \EDD\Admin\Installers\Install_Skin() );
319
+
320
+ // Error check.
321
+ if ( ! method_exists( $installer, 'install' ) || empty( $plugin ) ) {
322
+ wp_send_json_error( $result );
323
+ }
324
+
325
+ $installer->install( $plugin ); // phpcs:ignore
326
+
327
+ // Flush the cache and return the newly installed plugin basename.
328
+ wp_cache_flush();
329
+
330
+ $plugin_basename = $installer->plugin_info();
331
+
332
+ // Check for permissions.
333
+ if ( ! current_user_can( 'activate_plugins' ) ) {
334
+ $result['message'] = 'plugin' === $type ? esc_html__( 'Plugin installed.', 'easy-digital-downloads' ) : esc_html__( 'Extension installed.', 'easy-digital-downloads' );
335
+
336
+ wp_send_json_error( $result );
337
+ }
338
+
339
+ $this->activate( $plugin_basename );
340
+ }
341
+
342
+ /**
343
+ * Activates an existing extension.
344
+ *
345
+ * @since 2.11.4
346
+ * @param string $plugin_basename Optional: the plugin basename.
347
+ */
348
+ public function activate( $plugin_basename = '' ) {
349
+
350
+ $result = array(
351
+ 'message' => __( 'There was an error while performing your request.', 'easy-digital-downloads' ),
352
+ 'is_activated' => false,
353
+ );
354
+
355
+ // Check for permissions.
356
+ if ( ! check_ajax_referer( 'edd_extensionmanager', 'nonce', false ) || ! current_user_can( 'activate_plugins' ) ) {
357
+ $result['message'] = __( 'Plugin activation is not available for you on this site.', 'easy-digital-downloads' );
358
+ wp_send_json_error( $result );
359
+ }
360
+
361
+ $already_installed = false;
362
+ if ( empty( $plugin_basename ) ) {
363
+ $plugin_basename = ! empty( $_POST['plugin'] ) ? sanitize_text_field( $_POST['plugin'] ) : '';
364
+ $already_installed = true;
365
+ }
366
+
367
+ $plugin_basename = sanitize_text_field( wp_unslash( $plugin_basename ) );
368
+ $type = ! empty( $_POST['type'] ) ? sanitize_text_field( $_POST['type'] ) : '';
369
+ if ( 'plugin' !== $type ) {
370
+ $type = 'extension';
371
+ }
372
+ $result = array(
373
+ /* translators: "extension" or "plugin" as defined by $type */
374
+ 'message' => sprintf( __( 'Could not activate the %s.', 'easy-digital-downloads' ), esc_html( $type ) ),
375
+ 'is_activated' => false,
376
+ );
377
+ if ( empty( $plugin_basename ) || empty( $type ) ) {
378
+ wp_send_json_error( $result );
379
+ }
380
+
381
+ $result['basename'] = $plugin_basename;
382
+
383
+ // Activate the plugin silently.
384
+ $activated = activate_plugin( $plugin_basename );
385
+
386
+ if ( ! is_wp_error( $activated ) ) {
387
+
388
+ if ( $already_installed ) {
389
+ $message = 'plugin' === $type ? esc_html__( 'Plugin activated.', 'easy-digital-downloads' ) : esc_html__( 'Extension activated.', 'easy-digital-downloads' );
390
+ } else {
391
+ $message = 'plugin' === $type ? esc_html__( 'Plugin installed & activated.', 'easy-digital-downloads' ) : esc_html__( 'Extension installed & activated.', 'easy-digital-downloads' );
392
+ }
393
+ $result['is_activated'] = true;
394
+ $result['message'] = $message;
395
+
396
+ wp_send_json_success( $result );
397
+ }
398
+
399
+ // Fallback error just in case.
400
+ wp_send_json_error( $result );
401
+ }
402
+
403
+ /**
404
+ * Determine if the plugin/extension installations are allowed.
405
+ *
406
+ * @since 2.11.4
407
+ *
408
+ * @param string $type Should be `plugin` or `extension`.
409
+ *
410
+ * @return bool
411
+ */
412
+ public function can_install( $type, $required_pass_id = false ) {
413
+
414
+ if ( ! current_user_can( 'install_plugins' ) ) {
415
+ return false;
416
+ }
417
+
418
+ // Determine whether file modifications are allowed.
419
+ if ( ! wp_is_file_mod_allowed( 'edd_can_install' ) ) {
420
+ return false;
421
+ }
422
+
423
+ // All plugin checks are done.
424
+ if ( 'plugin' === $type ) {
425
+ return true;
426
+ }
427
+
428
+ return $this->pass_can_download( $required_pass_id );
429
+ }
430
+
431
+ /**
432
+ * Checks if a user's pass can download an extension.
433
+ *
434
+ * @since 2.11.4
435
+ * @return bool Returns true if the current site has an active pass and it is greater than or equal to the extension's minimum pass.
436
+ */
437
+ public function pass_can_download( $required_pass_id = false ) {
438
+ $highest_pass_id = $this->pass_manager->highest_pass_id;
439
+ if ( ! $required_pass_id ) {
440
+ $required_pass_id = $this->required_pass_id;
441
+ }
442
+
443
+ return ! empty( $highest_pass_id ) && ! empty( $required_pass_id ) && $this->pass_manager->pass_compare( $highest_pass_id, $required_pass_id, '>=' );
444
+ }
445
+
446
+ /**
447
+ * Get all installed plugins.
448
+ *
449
+ * @since 2.11.4
450
+ * @return array
451
+ */
452
+ public function get_plugins() {
453
+ if ( $this->all_plugins ) {
454
+ return $this->all_plugins;
455
+ }
456
+
457
+ $this->all_plugins = get_plugins();
458
+
459
+ return $this->all_plugins;
460
+ }
461
+
462
+ /**
463
+ * Check if a plugin is installed.
464
+ *
465
+ * @since 2.11.4
466
+ * @param string $plugin The path to the main plugin file, eg 'my-plugin/my-plugin.php'.
467
+ * @return boolean
468
+ */
469
+ public function is_plugin_installed( $plugin ) {
470
+ return array_key_exists( $plugin, $this->get_plugins() );
471
+ }
472
+
473
+ /**
474
+ * Whether a given plugin is active or not.
475
+ *
476
+ * @since 2.11.4
477
+ * @param string|ProductData $basename_or_data The path to the main plugin file, eg 'my-plugin/my-plugin.php', or the product data object.
478
+ * @return boolean
479
+ */
480
+ public function is_plugin_active( $basename_or_data ) {
481
+ $basename = ! empty( $basename_or_data->basename ) ? $basename_or_data->basename : $basename_or_data;
482
+
483
+ return ! empty( $basename ) && is_plugin_active( $basename );
484
+ }
485
+ }
includes/admin/extensions/class-extension-product-data.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace EDD\Admin\Extensions;
4
+
5
+ class ProductData {
6
+
7
+ /**
8
+ * The product name.
9
+ *
10
+ * @since 2.11.4
11
+ * @var string
12
+ */
13
+ public $title;
14
+
15
+ /**
16
+ * The product slug.
17
+ *
18
+ * @since 2.11.4
19
+ * @var string
20
+ */
21
+ public $slug = '';
22
+
23
+ /**
24
+ * The URL for the product featured image.
25
+ *
26
+ * @since 2.11.4
27
+ * @var string
28
+ */
29
+ public $image;
30
+
31
+ /**
32
+ * The product description.
33
+ *
34
+ * @since 2.11.4
35
+ * @var string
36
+ */
37
+ public $description;
38
+
39
+ /**
40
+ * The extension basename.
41
+ *
42
+ * @since 2.11.4
43
+ * @var string
44
+ */
45
+ public $basename;
46
+
47
+ /**
48
+ * The settings tab where the extension settings will show.
49
+ *
50
+ * @since 2.11.4
51
+ * @var string
52
+ */
53
+ public $tab;
54
+
55
+ /**
56
+ * The settings section for the extension.
57
+ *
58
+ * @since 2.11.4
59
+ * @var string
60
+ */
61
+ public $section;
62
+
63
+ /**
64
+ * The product features.
65
+ *
66
+ * @since 2.11.4
67
+ * @var array
68
+ */
69
+ public $features = array();
70
+
71
+ /**
72
+ * Take array and return object.
73
+ *
74
+ * @since 2.11.4
75
+ * @param array $array
76
+ * @return ProductData
77
+ * @throws \InvalidArgumentException
78
+ */
79
+ public function fromArray( $array ) {
80
+ $expected_keys = array( 'title', 'slug', 'description', 'basename' );
81
+ $array_to_check = array_intersect_key( $array, array_flip( $expected_keys ) );
82
+
83
+ if ( empty( $array_to_check ) ) {
84
+ throw new \InvalidArgumentException(
85
+ 'Invalid ProductData object, must have the exact following keys: ' . implode( ', ', $expected_keys )
86
+ );
87
+ }
88
+
89
+ $product_data = new self();
90
+ foreach ( $array as $key => $value ) {
91
+ $product_data->$key = $value;
92
+ }
93
+
94
+ return $product_data;
95
+ }
96
+
97
+ /**
98
+ * Merge an array of data into an object.
99
+ *
100
+ * @since 2.11.4
101
+ * @param array $configuration The custom configuration data.
102
+ * @return ProductData
103
+ */
104
+ public function mergeConfig( array $configuration ) {
105
+ foreach ( $configuration as $key => $value ) {
106
+ $this->{$key} = $value;
107
+ }
108
+
109
+ return $this;
110
+ }
111
+ }
includes/admin/extensions/class-extensions-api.php ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace EDD\Admin\Extensions;
4
+
5
+ class ExtensionsAPI {
6
+
7
+ /**
8
+ * Gets the product data from the EDD Products API.
9
+ *
10
+ * @since 2.11.4
11
+ * @param array $body The body for the API request.
12
+ * @param int $item_id The product ID, if querying a single product.
13
+ * @return false|array|ProductData
14
+ */
15
+ public function get_product_data( $body = array(), $item_id = false ) {
16
+ if ( empty( $body ) ) {
17
+ if ( empty( $item_id ) ) {
18
+ return false;
19
+ }
20
+ $body = $this->get_api_body( $item_id );
21
+ }
22
+ $key = $this->array_key_first( $body );
23
+ // The option name is created from the first key/value pair of the API "body".
24
+ $option_name = sanitize_key( "edd_extension_{$key}_{$body[ $key ]}_data" );
25
+ $option = get_option( $option_name );
26
+ $is_stale = $this->option_has_expired( $option );
27
+
28
+ // The ProductData class.
29
+ $product_data = new ProductData();
30
+
31
+ // If the data is "fresh" and what we want exists, return it.
32
+ if ( $option && ! $is_stale ) {
33
+ if ( $item_id && ! empty( $option[ $item_id ] ) ) {
34
+ return $product_data->fromArray( $option[ $item_id ] );
35
+ } elseif ( ! empty( $option['timeout'] ) ) {
36
+ unset( $option['timeout'] );
37
+
38
+ return $option;
39
+ }
40
+ }
41
+
42
+ // Get all of the product data.
43
+ $all_product_data = $this->get_all_product_data();
44
+
45
+ // If no product data was retrieved, let the option sit for an hour.
46
+ if ( empty( $all_product_data ) ) {
47
+ $data = array(
48
+ 'timeout' => strtotime( '+1 hour', time() ),
49
+ );
50
+ if ( $option && $is_stale ) {
51
+ $data = array_merge( $option, $data );
52
+ }
53
+ update_option(
54
+ $option_name,
55
+ $data,
56
+ false
57
+ );
58
+
59
+ if ( $item_id && ! empty( $option[ $item_id ] ) ) {
60
+ return $product_data->fromArray( $option[ $item_id ] );
61
+ }
62
+ unset( $option['timeout'] );
63
+
64
+ return $option;
65
+ }
66
+
67
+ $value = array(
68
+ 'timeout' => strtotime( '+1 week', time() ),
69
+ );
70
+ if ( $item_id && ! empty( $all_product_data->$item_id ) ) {
71
+ $item = $all_product_data->$item_id;
72
+ $value[ $item_id ] = $this->get_item_data( $item );
73
+ } elseif ( in_array( $key, array( 'category', 'tag' ), true ) ) {
74
+ $term_id = $body[ $key ];
75
+ foreach ( $all_product_data as $item_id => $item ) {
76
+ if ( 'category' === $key && ( empty( $item->categories ) || ! in_array( $term_id, $item->categories, true ) ) ) {
77
+ continue;
78
+ } elseif ( 'tag' === $key && ( empty( $item->tags ) || ! in_array( $term_id, $item->tags, true ) ) ) {
79
+ continue;
80
+ }
81
+ $value[ $item_id ] = $this->get_item_data( $item );
82
+ }
83
+ }
84
+
85
+ update_option( $option_name, $value, false );
86
+ unset( $value['timeout'] );
87
+
88
+ return $item_id && ! empty( $value[ $item_id ] ) ? $product_data->fromArray( $value[ $item_id ] ) : $value;
89
+ }
90
+
91
+ /**
92
+ * Gets all of the product data, either from an option or an API request.
93
+ * If the option exists and has data, it will be an object.
94
+ *
95
+ * @since 2.11.4
96
+ * @return object|false
97
+ */
98
+ private function get_all_product_data() {
99
+ // Possibly all product data is in an option. If it is, return it.
100
+ $all_product_data = get_option( 'edd_all_extension_data' );
101
+ if ( $all_product_data && ! $this->option_has_expired( $all_product_data ) ) {
102
+ return ! empty( $all_product_data['products'] ) ? $all_product_data['products'] : false;
103
+ }
104
+
105
+ // Otherwise, query the API.
106
+ $url = add_query_arg(
107
+ array(
108
+ 'edd_action' => 'extension_data',
109
+ ),
110
+ $this->get_products_url()
111
+ );
112
+ $request = wp_remote_get(
113
+ $url,
114
+ array(
115
+ 'timeout' => 15,
116
+ 'sslverify' => true,
117
+ )
118
+ );
119
+
120
+ // If there was an API error, set option and return false.
121
+ if ( is_wp_error( $request ) || ( 200 !== wp_remote_retrieve_response_code( $request ) ) ) {
122
+ update_option(
123
+ 'edd_all_extension_data',
124
+ array(
125
+ 'timeout' => strtotime( '+1 hour', time() ),
126
+ ),
127
+ false
128
+ );
129
+
130
+ return false;
131
+ }
132
+
133
+ // Fresh data has been retrieved, so update the option with a four hour timeout.
134
+ $all_product_data = json_decode( wp_remote_retrieve_body( $request ) );
135
+ $data = array(
136
+ 'timeout' => strtotime( '+4 hours', time() ),
137
+ 'products' => $all_product_data,
138
+ );
139
+
140
+ update_option( 'edd_all_extension_data', $data, false );
141
+
142
+ return $all_product_data;
143
+ }
144
+
145
+ /**
146
+ * Gets the product data as needed for the extension manager.
147
+ *
148
+ * @since 2.11.4
149
+ * @param object $item
150
+ * @return array
151
+ */
152
+ private function get_item_data( $item ) {
153
+ return array(
154
+ 'title' => ! empty( $item->title ) ? $item->title : '',
155
+ 'slug' => ! empty( $item->slug ) ? $item->slug : '',
156
+ 'image' => ! empty( $item->image ) ? $item->image : '',
157
+ 'description' => ! empty( $item->excerpt ) ? $item->excerpt : '',
158
+ 'basename' => ! empty( $item->custom_meta->basename ) ? $item->custom_meta->basename : '',
159
+ 'tab' => ! empty( $item->custom_meta->settings_tab ) ? $item->custom_meta->settings_tab : '',
160
+ 'section' => ! empty( $item->custom_meta->settings_section ) ? $item->custom_meta->settings_section : '',
161
+ );
162
+ }
163
+
164
+ /**
165
+ * Gets the base url for the products remote request.
166
+ *
167
+ * @since 2.11.4
168
+ * @return string
169
+ */
170
+ private function get_products_url() {
171
+ if ( defined( 'EDD_PRODUCTS_URL' ) ) {
172
+ return EDD_PRODUCTS_URL;
173
+ }
174
+
175
+ return 'https://easydigitaldownloads.com/';
176
+ }
177
+
178
+ /**
179
+ * Gets the default array for the body of the API request.
180
+ * A class may override this by setting an array to query a tag or category.
181
+ * Note that the first array key/value pair are used to create the option name.
182
+ *
183
+ * @since 2.11.4
184
+ * @param int $item_id The product ID.
185
+ * @return array
186
+ */
187
+ private function get_api_body( $item_id ) {
188
+ return array(
189
+ 'product' => $item_id,
190
+ );
191
+ }
192
+
193
+ /**
194
+ * Gets the first key of an array.
195
+ * (Shims array_key_first for PHP < 7.3)
196
+ *
197
+ * @since 2.11.4
198
+ * @param array $array
199
+ * @return string|null
200
+ */
201
+ private function array_key_first( array $array ) {
202
+ if ( function_exists( 'array_key_first' ) ) {
203
+ return array_key_first( $array );
204
+ }
205
+ foreach ( $array as $key => $unused ) {
206
+ return $key;
207
+ }
208
+
209
+ return null;
210
+ }
211
+
212
+ /**
213
+ * Checks whether a given option has "expired".
214
+ *
215
+ * @since 2.11.4
216
+ * @param array|false $option
217
+ * @return bool
218
+ */
219
+ private function option_has_expired( $option ) {
220
+ return empty( $option['timeout'] ) || time() > $option['timeout'];
221
+ }
222
+ }
includes/admin/extensions/product-education/class-email-marketing.php ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Email Marketing
4
+ *
5
+ * Manages automatic installation/activation for email marketing extensions.
6
+ *
7
+ * @package EDD
8
+ * @subpackage EmailMarketing
9
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
10
+ * @license https://opensource.org/licenses/gpl-2.0.php GNU Public License
11
+ * @since 2.11.4
12
+ */
13
+ namespace EDD\Admin\Settings;
14
+
15
+ use \EDD\Admin\Extensions\Extension;
16
+
17
+ class EmailMarketing extends Extension {
18
+
19
+ /**
20
+ * The EDD settings tab where this extension should show.
21
+ *
22
+ * @since 2.11.4
23
+ * @var string
24
+ */
25
+ protected $settings_tab = 'marketing';
26
+
27
+ public function __construct() {
28
+ add_filter( 'edd_settings_sections_marketing', array( $this, 'add_section' ) );
29
+ add_action( 'edd_settings_tab_top_marketing_email_marketing', array( $this, 'field' ) );
30
+
31
+ parent::__construct();
32
+ }
33
+
34
+ /**
35
+ * Adds an email marketing section to the Marketing tab.
36
+ *
37
+ * @since 2.11.4
38
+ * @param array $sections
39
+ * @return array
40
+ */
41
+ public function add_section( $sections ) {
42
+ if ( ! $this->is_edd_settings_screen() ) {
43
+ return $sections;
44
+ }
45
+ $product_data = $this->get_product_data();
46
+ if ( ! $product_data || ! is_array( $product_data ) ) {
47
+ return $sections;
48
+ }
49
+ $sections['email_marketing'] = __( 'Email Marketing', 'easy-digital-downloads' );
50
+
51
+ return $sections;
52
+ }
53
+
54
+ /**
55
+ * Gets the customized configuration for the extension card.
56
+ *
57
+ * @since 2.11.4
58
+ * @param \EDD\Admin\Extensions\ProductData $product_data The product data object.
59
+ * @return array
60
+ */
61
+ protected function get_configuration( \EDD\Admin\Extensions\ProductData $product_data ) {
62
+ $configuration = array();
63
+ if ( ! empty( $product_data->title ) ) {
64
+ /* translators: the product name */
65
+ $configuration['title'] = sprintf( __( 'Get %s Today!', 'easy-digital-downloads' ), $product_data->title );
66
+ }
67
+ if ( 'mailchimp' === $product_data->slug && ! ( defined( 'EDD_MAILCHIMP_VERSION' ) && version_compare( EDD_MAILCHIMP_VERSION, '3.0.16', '>=' ) ) ) {
68
+ $configuration['tab'] = 'extensions';
69
+ }
70
+
71
+ return $configuration;
72
+ }
73
+
74
+ /**
75
+ * Adds the email marketing extensions as cards.
76
+ *
77
+ * @since 2.11.4
78
+ * @return void
79
+ */
80
+ public function field() {
81
+ $this->hide_submit_button();
82
+ if ( $this->is_activated() ) {
83
+ printf( '<p>%s</p>', esc_html__( 'Looks like you have an email marketing extension installed, but we support more providers!', 'easy-digital-downloads' ) );
84
+ }
85
+ ?>
86
+ <div class="edd-extension-manager__card-group">
87
+ <?php
88
+ foreach ( $this->get_product_data() as $item_id => $extension ) {
89
+ $this->do_single_extension_card( $item_id );
90
+ }
91
+ ?>
92
+ </div>
93
+ <?php
94
+ }
95
+
96
+ /**
97
+ * Overrides the body array sent to the Products API.
98
+ *
99
+ * @since 2.11.4
100
+ * @return array
101
+ */
102
+ protected function get_api_body() {
103
+ return array(
104
+ 'tag' => 1578,
105
+ );
106
+ }
107
+
108
+ /**
109
+ * Whether any email marketing extension is active.
110
+ *
111
+ * @since 2.11.4
112
+ *
113
+ * @return bool True if any email marketing extension is active.
114
+ */
115
+ protected function is_activated() {
116
+ foreach ( $this->get_product_data() as $extension ) {
117
+ // The data is stored in the database as an array--at this point it has not been converted to an object.
118
+ if ( ! empty( $extension['basename'] ) && $this->manager->is_plugin_active( $extension['basename'] ) ) {
119
+ return true;
120
+ }
121
+ }
122
+
123
+ return false;
124
+ }
125
+ }
126
+
127
+ new EmailMarketing();
includes/admin/extensions/product-education/class-invoices.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Invoices
4
+ *
5
+ * Manages automatic installation/activation for Invoices.
6
+ *
7
+ * @package EDD
8
+ * @subpackage Invoices
9
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
10
+ * @license https://opensource.org/licenses/gpl-2.0.php GNU Public License
11
+ * @since 2.11.4
12
+ */
13
+ namespace EDD\Admin\Settings;
14
+
15
+ use \EDD\Admin\Extensions\Extension;
16
+
17
+ class Invoices extends Extension {
18
+
19
+ /**
20
+ * The product ID on EDD.
21
+ *
22
+ * @var integer
23
+ */
24
+ protected $item_id = 375153;
25
+
26
+ /**
27
+ * The EDD settings tab where this extension should show.
28
+ *
29
+ * @since 2.11.4
30
+ * @var string
31
+ */
32
+ protected $settings_tab = 'gateways';
33
+
34
+ /**
35
+ * The pass level required to access this extension.
36
+ */
37
+ const PASS_LEVEL = \EDD\Admin\Pass_Manager::EXTENDED_PASS_ID;
38
+
39
+ public function __construct() {
40
+ add_filter( 'edd_settings_sections_gateways', array( $this, 'add_section' ) );
41
+ add_action( 'edd_settings_tab_top_gateways_invoices', array( $this, 'settings_field' ) );
42
+ add_action( 'edd_settings_tab_top_gateways_invoices', array( $this, 'hide_submit_button' ) );
43
+
44
+ parent::__construct();
45
+ }
46
+
47
+ /**
48
+ * Gets the custom configuration for Invoices.
49
+ *
50
+ * @since 2.11.4
51
+ * @param \EDD\Admin\Extensions\ProductData $product_data The product data object.
52
+ * @return array
53
+ */
54
+ protected function get_configuration( \EDD\Admin\Extensions\ProductData $product_data ) {
55
+ return array(
56
+ 'style' => 'detailed-2col',
57
+ 'title' => 'Attractive Invoices For Your Customers',
58
+ 'description' => $this->get_custom_description(),
59
+ 'features' => array(
60
+ 'Generate Attractive Invoices',
61
+ 'Build Customer Confidence',
62
+ 'PDF Download Support',
63
+ 'Include in Purchase Emails',
64
+ 'Customizable Templates',
65
+ ),
66
+ );
67
+ }
68
+
69
+ /**
70
+ * Gets a custom description for the Invoices extension card.
71
+ *
72
+ * @since 2.11.4
73
+ * @return string
74
+ */
75
+ private function get_custom_description() {
76
+ $description = array(
77
+ 'Impress customers and build customer loyalty with attractive invoices. Making it easy to locate, save, and print purchase history builds trust with customers.',
78
+ 'Provide a professional experience with customizable templates and one-click PDF downloads. ',
79
+ );
80
+
81
+ return $this->format_description( $description );
82
+ }
83
+
84
+ /**
85
+ * Adds the Invoices Payments section to the settings.
86
+ *
87
+ * @param array $sections
88
+ * @return array
89
+ */
90
+ public function add_section( $sections ) {
91
+ if ( ! $this->can_show_product_section() ) {
92
+ return $sections;
93
+ }
94
+
95
+ $sections['invoices'] = __( 'Invoices', 'easy-digital-downloads' );
96
+
97
+ return $sections;
98
+ }
99
+
100
+ /**
101
+ * Whether EDD Invoices active or not.
102
+ *
103
+ * @since 2.11.4
104
+ *
105
+ * @return bool True if Invoices is active.
106
+ */
107
+ protected function is_activated() {
108
+ if ( $this->manager->is_plugin_active( $this->get_product_data() ) ) {
109
+ return true;
110
+ }
111
+
112
+ return class_exists( 'EDDInvoices' );
113
+ }
114
+ }
115
+
116
+ new Invoices();
includes/admin/extensions/product-education/class-recurring.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Recurring Payments
4
+ *
5
+ * Manages automatic activation for Recurring Payments.
6
+ *
7
+ * @package EDD
8
+ * @subpackage Recurring
9
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
10
+ * @license https://opensource.org/licenses/gpl-2.0.php GNU Public License
11
+ * @since 2.11.4
12
+ */
13
+ namespace EDD\Admin\Settings;
14
+
15
+ use \EDD\Admin\Extensions\Extension;
16
+
17
+ class Recurring extends Extension {
18
+
19
+ /**
20
+ * The product ID on EDD.
21
+ *
22
+ * @var integer
23
+ */
24
+ protected $item_id = 28530;
25
+
26
+ /**
27
+ * The EDD settings tab where this extension should show.
28
+ *
29
+ * @since 2.11.4
30
+ * @var string
31
+ */
32
+ protected $settings_tab = 'gateways';
33
+
34
+ /**
35
+ * The pass level required to access this extension.
36
+ */
37
+ const PASS_LEVEL = \EDD\Admin\Pass_Manager::EXTENDED_PASS_ID;
38
+
39
+ public function __construct() {
40
+ add_filter( 'edd_settings_sections_gateways', array( $this, 'add_section' ) );
41
+ add_action( 'edd_settings_tab_top_gateways_recurring', array( $this, 'settings_field' ) );
42
+ add_action( 'edd_settings_tab_top_gateways_recurring', array( $this, 'hide_submit_button' ) );
43
+
44
+ parent::__construct();
45
+ }
46
+
47
+ /**
48
+ * Gets the custom configuration for Recurring.
49
+ *
50
+ * @since 2.11.4
51
+ * @param \EDD\Admin\Extensions\ProductData $product_data The product data object.
52
+ * @return array
53
+ */
54
+ protected function get_configuration( \EDD\Admin\Extensions\ProductData $product_data ) {
55
+ return array(
56
+ 'style' => 'detailed-2col',
57
+ 'title' => 'Increase Revenue By Selling Subscriptions!',
58
+ 'description' => $this->get_custom_description(),
59
+ 'features' => array(
60
+ 'Flexible Recurring Payments',
61
+ 'Custom Reminder Emails',
62
+ 'Free Trial Support',
63
+ 'Signup Fees',
64
+ 'Recurring Revenue Reports',
65
+ ),
66
+ );
67
+ }
68
+
69
+ /**
70
+ * Gets a custom description for the Recurring extension card.
71
+ *
72
+ * @since 2.11.4
73
+ * @return string
74
+ */
75
+ private function get_custom_description() {
76
+ $description = array(
77
+ 'Grow stable income by selling subscriptions and make renewals hassle free for your customers.',
78
+ 'When your customers are automatically billed, you reduce the risk of missed payments and retain more customers.',
79
+ );
80
+
81
+ return $this->format_description( $description );
82
+ }
83
+
84
+ /**
85
+ * Adds the Recurring Payments section to the settings.
86
+ *
87
+ * @param array $sections
88
+ * @return array
89
+ */
90
+ public function add_section( $sections ) {
91
+ if ( ! $this->can_show_product_section() ) {
92
+ return $sections;
93
+ }
94
+
95
+ $sections['recurring'] = __( 'Recurring Payments', 'easy-digital-downloads' );
96
+
97
+ return $sections;
98
+ }
99
+
100
+ /**
101
+ * Whether EDD Recurring active or not.
102
+ *
103
+ * @since 2.11.4
104
+ *
105
+ * @return bool True if Recurring is active.
106
+ */
107
+ protected function is_activated() {
108
+ if ( $this->manager->is_plugin_active( $this->get_product_data() ) ) {
109
+ return true;
110
+ }
111
+
112
+ return class_exists( 'EDD_Recurring' );
113
+ }
114
+ }
115
+
116
+ new Recurring();
includes/admin/extensions/product-education/class-reviews.php ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Reviews
4
+ *
5
+ * Manages automatic activation for Reviews.
6
+ *
7
+ * @package EDD
8
+ * @subpackage Reviews
9
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
10
+ * @license https://opensource.org/licenses/gpl-2.0.php GNU Public License
11
+ * @since 2.11.4
12
+ */
13
+ namespace EDD\Admin\Settings;
14
+
15
+ use \EDD\Admin\Extensions\Extension;
16
+
17
+ class Reviews extends Extension {
18
+
19
+ /**
20
+ * The product ID on EDD.
21
+ *
22
+ * @var integer
23
+ */
24
+ protected $item_id = 37976;
25
+
26
+ /**
27
+ * The EDD settings tab where this extension should show.
28
+ *
29
+ * @since 2.11.4
30
+ * @var string
31
+ */
32
+ protected $settings_tab = 'marketing';
33
+
34
+ /**
35
+ * The pass level required to access this extension.
36
+ */
37
+ const PASS_LEVEL = \EDD\Admin\Pass_Manager::EXTENDED_PASS_ID;
38
+
39
+ public function __construct() {
40
+ add_filter( 'edd_settings_sections_marketing', array( $this, 'add_section' ) );
41
+ add_action( 'edd_settings_tab_top_marketing_reviews', array( $this, 'settings_field' ) );
42
+ add_action( 'edd_settings_tab_top_marketing_reviews', array( $this, 'hide_submit_button' ) );
43
+ add_action( 'add_meta_boxes', array( $this, 'maybe_do_metabox' ) );
44
+
45
+ parent::__construct();
46
+ }
47
+
48
+ /**
49
+ * Gets the custom configuration for Reviews.
50
+ *
51
+ * @since 2.11.4
52
+ * @param \EDD\Admin\Extensions\ProductData $product_data The product data object.
53
+ * @return array
54
+ */
55
+ protected function get_configuration( \EDD\Admin\Extensions\ProductData $product_data ) {
56
+ $configuration = array(
57
+ 'title' => 'Build Trust With Real Customer Reviews',
58
+ );
59
+ $settings_configuration = array(
60
+ 'style' => 'detailed-2col',
61
+ 'description' => $this->get_custom_description(),
62
+ 'features' => array(
63
+ 'Request Reviews',
64
+ 'Incentivize Reviewers',
65
+ 'Full Schema.org Support',
66
+ 'Embed Reviews Via Blocks',
67
+ 'Limit Reviews to Customers',
68
+ 'Vendor Reviews (with Frontend Submissions)',
69
+ ),
70
+ );
71
+ return $this->is_edd_settings_screen() ? array_merge( $configuration, $settings_configuration ) : $configuration;
72
+ }
73
+
74
+ /**
75
+ * Gets a custom description for the Reviews extension card.
76
+ *
77
+ * @since 2.11.4
78
+ * @return string
79
+ */
80
+ private function get_custom_description() {
81
+ $description = array(
82
+ 'Increase sales on your site with social proof. 70% of online shoppers don\'t purchase before reading reviews.',
83
+ 'Easily collect, manage, and beautifully display reviews all from your WordPress dashboard.',
84
+ );
85
+
86
+ return $this->format_description( $description );
87
+ }
88
+
89
+ /**
90
+ * Adds the Reviews section to the settings.
91
+ *
92
+ * @param array $sections
93
+ * @return array
94
+ */
95
+ public function add_section( $sections ) {
96
+ if ( ! $this->can_show_product_section() ) {
97
+ return $sections;
98
+ }
99
+
100
+ $sections['reviews'] = __( 'Reviews', 'easy-digital-downloads' );
101
+
102
+ return $sections;
103
+ }
104
+
105
+ /**
106
+ * If Reviews is not active, registers a metabox on individual download edit screen.
107
+ *
108
+ * @since 2.11.4
109
+ * @return void
110
+ */
111
+ public function maybe_do_metabox() {
112
+ if ( ! $this->is_download_edit_screen() ) {
113
+ return;
114
+ }
115
+ if ( $this->is_activated() ) {
116
+ return;
117
+ }
118
+ add_meta_box(
119
+ 'edd-reviews-status',
120
+ __( 'Product Reviews', 'easy-digital-downloads' ),
121
+ array( $this, 'settings_field' ),
122
+ 'download',
123
+ 'side',
124
+ 'low'
125
+ );
126
+ }
127
+
128
+ /**
129
+ * Whether EDD Reviews active or not.
130
+ *
131
+ * @since 2.11.4
132
+ *
133
+ * @return bool True if Reviews is active.
134
+ */
135
+ protected function is_activated() {
136
+ if ( $this->manager->is_plugin_active( $this->get_product_data() ) ) {
137
+ return true;
138
+ }
139
+
140
+ return function_exists( 'edd_reviews' );
141
+ }
142
+ }
143
+
144
+ new Reviews();
includes/admin/extensions/product-education/class-wpsmtp.php ADDED
@@ -0,0 +1,232 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * WP Mail SMTP
4
+ *
5
+ * Manages automatic installation/activation for WP Mail SMTP.
6
+ *
7
+ * @package EDD
8
+ * @subpackage WP_SMTP
9
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
10
+ * @license https://opensource.org/licenses/gpl-2.0.php GNU Public License
11
+ * @since 2.11.4
12
+ */
13
+ namespace EDD\Admin\Settings;
14
+
15
+ class WP_SMTP {
16
+
17
+ /**
18
+ * Array of configuration data for WP Mail SMTP.
19
+ *
20
+ * @var array
21
+ */
22
+ private $config = array(
23
+ 'lite_plugin' => 'wp-mail-smtp/wp_mail_smtp.php',
24
+ 'lite_wporg_url' => 'https://wordpress.org/plugins/wp-mail-smtp/',
25
+ 'lite_download_url' => 'https://downloads.wordpress.org/plugin/wp-mail-smtp.zip',
26
+ 'pro_plugin' => 'wp-mail-smtp-pro/wp_mail_smtp.php',
27
+ 'smtp_settings' => 'admin.php?page=wp-mail-smtp',
28
+ 'smtp_wizard' => 'admin.php?page=wp-mail-smtp-setup-wizard',
29
+ );
30
+
31
+ /**
32
+ * The Extension Manager
33
+ *
34
+ * @var \EDD\Admin\Extensions\Extension_Manager
35
+ */
36
+ private $manager;
37
+
38
+ public function __construct() {
39
+ add_filter( 'edd_settings_emails', array( $this, 'register_setting' ) );
40
+ add_action( 'edd_wpsmtp', array( $this, 'settings_field' ) );
41
+
42
+ $this->manager = new \EDD\Admin\Extensions\Extension_Manager();
43
+ }
44
+
45
+ /**
46
+ * Register the setting to show the WP SMTP installer if it isn't active.
47
+ *
48
+ * @param array $settings
49
+ * @return array
50
+ */
51
+ public function register_setting( $settings ) {
52
+ if ( $this->is_smtp_configured() ) {
53
+ return $settings;
54
+ }
55
+ $settings['main']['wpsmtp'] = array(
56
+ 'id' => 'wpsmtp',
57
+ 'name' => __( 'Improve Email Deliverability', 'easy-digital-downloads' ),
58
+ 'desc' => '',
59
+ 'type' => 'hook',
60
+ );
61
+
62
+ return $settings;
63
+ }
64
+
65
+ /**
66
+ * Output the settings field (installation helper).
67
+ *
68
+ * @param array $args
69
+ * @return void
70
+ */
71
+ public function settings_field( $args ) {
72
+ $this->manager->enqueue();
73
+ ?>
74
+ <div class="edd-extension-manager__body">
75
+ <p class="edd-extension-manager__description">
76
+ <?php esc_html_e( 'WP Mail SMTP allows you to easily set up WordPress to use a trusted provider to reliably send emails, including sales notifications.', 'easy-digital-downloads' ); ?>
77
+ </p>
78
+
79
+ <div class="edd-extension-manager__group">
80
+ <div class="edd-extension-manager__step">
81
+ <?php $this->manager->button( $this->get_button_parameters() ); ?>
82
+ </div>
83
+
84
+ <?php
85
+ if ( $this->is_smtp_activated() ) {
86
+ return;
87
+ }
88
+ ?>
89
+ <div class="edd-extension-manager__step" style="display:none;">
90
+ <?php $this->manager->link( $this->get_link_parameters() ); ?>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ <?php
95
+ }
96
+
97
+ /**
98
+ * Gets the button parameters.
99
+ *
100
+ * @return array
101
+ */
102
+ private function get_button_parameters() {
103
+ $button = array();
104
+ // If neither the lite nor pro plugin is installed, the button will prompt to install and activate the lite plugin.
105
+ if ( ! $this->manager->is_plugin_installed( $this->config['lite_plugin'] ) && ! $this->manager->is_plugin_installed( $this->config['pro_plugin'] ) ) {
106
+ $button['plugin'] = $this->config['lite_download_url'];
107
+ $button['action'] = 'install';
108
+ $button['button_text'] = __( 'Install & Activate WP Mail SMTP', 'easy-digital-downloads' );
109
+ } elseif ( ! $this->is_smtp_activated() ) {
110
+ // If one of the SMTP plugins is installed, but not activated, the button will prompt to activate it.
111
+ $button['plugin'] = $this->config['lite_plugin'];
112
+ $button['action'] = 'activate';
113
+ $button['button_text'] = __( 'Activate WP Mail SMTP', 'easy-digital-downloads' );
114
+ } elseif ( ! $this->is_smtp_configured() ) {
115
+ // If the plugin is active, but not configured, the button will send them to the setup wizard.
116
+ $button = $this->get_link_parameters();
117
+ }
118
+
119
+ return $button;
120
+ }
121
+
122
+ /**
123
+ * Gets the array of parameters for the link to configure WP Mail SMTP.
124
+ *
125
+ * @since 2.11.4
126
+ * @return array
127
+ */
128
+ private function get_link_parameters() {
129
+ return $this->is_smtp_configured() ?
130
+ array(
131
+ 'button_text' => __( 'Configure WP Mail SMTP', 'easy-digital-downloads' ),
132
+ 'href' => admin_url( $this->config['smtp_settings'] ),
133
+ ) :
134
+ array(
135
+ 'button_text' => __( 'Run the WP Mail SMTP Setup Wizard', 'easy-digital-downloads' ),
136
+ 'href' => admin_url( $this->config['smtp_wizard'] ),
137
+ );
138
+ }
139
+
140
+ /**
141
+ * Whether WP Mail SMTP plugin configured or not.
142
+ *
143
+ * @since 2.11.4
144
+ *
145
+ * @return bool True if some mailer is selected and configured properly.
146
+ */
147
+ protected function is_smtp_configured() {
148
+
149
+ if ( ! $this->is_smtp_activated() || ! class_exists( '\\WPMailSMTP\\Options' ) ) {
150
+ return false;
151
+ }
152
+
153
+ $phpmailer = $this->get_phpmailer();
154
+
155
+ $mailer = \WPMailSMTP\Options::init()->get( 'mail', 'mailer' );
156
+ $is_mailer_complete = ! empty( $mailer ) && wp_mail_smtp()->get_providers()->get_mailer( $mailer, $phpmailer )->is_mailer_complete();
157
+
158
+ return 'mail' !== $mailer && $is_mailer_complete;
159
+ }
160
+
161
+ /**
162
+ * Whether WP Mail SMTP plugin active or not.
163
+ *
164
+ * @since 2.11.4
165
+ *
166
+ * @return bool True if SMTP plugin is active.
167
+ */
168
+ protected function is_smtp_activated() {
169
+ return function_exists( 'wp_mail_smtp' ) && ( is_plugin_active( $this->config['lite_plugin'] ) || is_plugin_active( $this->config['pro_plugin'] ) );
170
+ }
171
+
172
+ /**
173
+ * Get $phpmailer instance.
174
+ *
175
+ * @since 2.11.4
176
+ *
177
+ * @return \PHPMailer|\PHPMailer\PHPMailer\PHPMailer Instance of PHPMailer.
178
+ */
179
+ protected function get_phpmailer() {
180
+
181
+ if ( version_compare( get_bloginfo( 'version' ), '5.5-alpha', '<' ) ) {
182
+ $phpmailer = $this->get_phpmailer_v5();
183
+ } else {
184
+ $phpmailer = $this->get_phpmailer_v6();
185
+ }
186
+
187
+ return $phpmailer;
188
+ }
189
+
190
+ /**
191
+ * Get $phpmailer v5 instance.
192
+ *
193
+ * @since 2.11.4
194
+ *
195
+ * @return \PHPMailer Instance of PHPMailer.
196
+ */
197
+ private function get_phpmailer_v5() {
198
+
199
+ global $phpmailer;
200
+
201
+ if ( ! ( $phpmailer instanceof \PHPMailer ) ) {
202
+ require_once ABSPATH . WPINC . '/class-phpmailer.php';
203
+ require_once ABSPATH . WPINC . '/class-smtp.php';
204
+ $phpmailer = new \PHPMailer( true ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
205
+ }
206
+
207
+ return $phpmailer;
208
+ }
209
+
210
+ /**
211
+ * Get $phpmailer v6 instance.
212
+ *
213
+ * @since 2.11.4
214
+ *
215
+ * @return \PHPMailer\PHPMailer\PHPMailer Instance of PHPMailer.
216
+ */
217
+ private function get_phpmailer_v6() {
218
+
219
+ global $phpmailer;
220
+
221
+ if ( ! ( $phpmailer instanceof \PHPMailer\PHPMailer\PHPMailer ) ) {
222
+ require_once ABSPATH . WPINC . '/PHPMailer/PHPMailer.php';
223
+ require_once ABSPATH . WPINC . '/PHPMailer/SMTP.php';
224
+ require_once ABSPATH . WPINC . '/PHPMailer/Exception.php';
225
+ $phpmailer = new \PHPMailer\PHPMailer\PHPMailer( true ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
226
+ }
227
+
228
+ return $phpmailer;
229
+ }
230
+ }
231
+
232
+ new WP_SMTP();
includes/admin/installers/class-install-skin.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace EDD\Admin\Installers;
4
+
5
+ use EDD\Admin\Installers\PluginSilentUpgraderSkin;
6
+
7
+ /**
8
+ * Skin for on-the-fly addon installations.
9
+ *
10
+ * @since 1.0.0
11
+ * @since 1.5.6.1 Extend PluginSilentUpgraderSkin and clean up the class.
12
+ */
13
+ class Install_Skin extends PluginSilentUpgraderSkin {
14
+
15
+ /**
16
+ * Instead of outputting HTML for errors, json_encode the errors and send them
17
+ * back to the Ajax script for processing.
18
+ *
19
+ * @since 1.0.0
20
+ *
21
+ * @param array $errors Array of errors with the install process.
22
+ */
23
+ public function error( $errors ) {
24
+
25
+ if ( ! empty( $errors ) ) {
26
+ wp_send_json_error( $errors );
27
+ }
28
+ }
29
+ }
includes/admin/installers/class-plugin-silent-upgrader-skin.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace EDD\Admin\Installers;
4
+
5
+ /** \WP_Upgrader_Skin class */
6
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader-skin.php';
7
+
8
+ /**
9
+ * Class PluginSilentUpgraderSkin.
10
+ *
11
+ * @internal Please do not use this class outside of core WPForms development. May be removed at any time.
12
+ *
13
+ * @since 2.11.4
14
+ */
15
+ class PluginSilentUpgraderSkin extends \WP_Upgrader_Skin {
16
+
17
+ /**
18
+ * Empty out the header of its HTML content and only check to see if it has
19
+ * been performed or not.
20
+ *
21
+ * @since 2.11.4
22
+ */
23
+ public function header() {
24
+ }
25
+
26
+ /**
27
+ * Empty out the footer of its HTML contents.
28
+ *
29
+ * @since 2.11.4
30
+ */
31
+ public function footer() {
32
+ }
33
+
34
+ /**
35
+ * Instead of outputting HTML for errors, just return them.
36
+ * Ajax request will just ignore it.
37
+ *
38
+ * @since 2.11.4
39
+ *
40
+ * @param array $errors Array of errors with the install process.
41
+ *
42
+ * @return array
43
+ */
44
+ public function error( $errors ) {
45
+ return $errors;
46
+ }
47
+
48
+ /**
49
+ * Empty out JavaScript output that calls function to decrement the update counts.
50
+ *
51
+ * @since 2.11.4
52
+ *
53
+ * @param string $type Type of update count to decrement.
54
+ */
55
+ public function decrement_update_count( $type ) {
56
+ }
57
+ }
includes/admin/installers/class-plugin-silent-upgrader.php ADDED
@@ -0,0 +1,608 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace EDD\Admin\Installers;
4
+
5
+ use WP_Error;
6
+ use WP_Upgrader;
7
+ use WP_Filesystem_Base;
8
+
9
+ /** \WP_Upgrader class */
10
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
11
+
12
+ /** \Plugin_Upgrader class */
13
+ require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';
14
+
15
+ /**
16
+ * In WP 5.3 a PHP 5.6 splat operator (...$args) was added to \WP_Upgrader_Skin::feedback().
17
+ * We need to remove all calls to *Skin::feedback() method, as we can't override it in own Skins
18
+ * without breaking support for PHP 5.3-5.5.
19
+ *
20
+ * @internal Please do not use this class outside of core EDD development. May be removed at any time.
21
+ *
22
+ * @since 1.5.6.1
23
+ */
24
+ class PluginSilentUpgrader extends \Plugin_Upgrader {
25
+
26
+ /**
27
+ * Run an upgrade/installation.
28
+ *
29
+ * Attempt to download the package (if it is not a local file), unpack it, and
30
+ * install it in the destination folder.
31
+ *
32
+ * @since 1.5.6.1
33
+ *
34
+ * @param array $options {
35
+ * Array or string of arguments for upgrading/installing a package.
36
+ *
37
+ * @type string $package The full path or URI of the package to install.
38
+ * Default empty.
39
+ * @type string $destination The full path to the destination folder.
40
+ * Default empty.
41
+ * @type bool $clear_destination Whether to delete any files already in the
42
+ * destination folder. Default false.
43
+ * @type bool $clear_working Whether to delete the files form the working
44
+ * directory after copying to the destination.
45
+ * Default false.
46
+ * @type bool $abort_if_destination_exists Whether to abort the installation if the destination
47
+ * folder already exists. When true, `$clear_destination`
48
+ * should be false. Default true.
49
+ * @type bool $is_multi Whether this run is one of multiple upgrade/installation
50
+ * actions being performed in bulk. When true, the skin
51
+ * WP_Upgrader::header() and WP_Upgrader::footer()
52
+ * aren't called. Default false.
53
+ * @type array $hook_extra Extra arguments to pass to the filter hooks called by
54
+ * WP_Upgrader::run().
55
+ * }
56
+ * @return array|false|WP_error The result from self::install_package() on success, otherwise a WP_Error,
57
+ * or false if unable to connect to the filesystem.
58
+ */
59
+ public function run( $options ) {
60
+
61
+ $defaults = array(
62
+ 'package' => '', // Please always pass this.
63
+ 'destination' => '', // And this
64
+ 'clear_destination' => false,
65
+ 'abort_if_destination_exists' => true, // Abort if the Destination directory exists, Pass clear_destination as false please
66
+ 'clear_working' => true,
67
+ 'is_multi' => false,
68
+ 'hook_extra' => array(), // Pass any extra $hook_extra args here, this will be passed to any hooked filters.
69
+ );
70
+
71
+ $options = wp_parse_args( $options, $defaults );
72
+
73
+ /**
74
+ * Filter the package options before running an update.
75
+ *
76
+ * See also {@see 'upgrader_process_complete'}.
77
+ *
78
+ * @since 4.3.0
79
+ *
80
+ * @param array $options {
81
+ * Options used by the upgrader.
82
+ *
83
+ * @type string $package Package for update.
84
+ * @type string $destination Update location.
85
+ * @type bool $clear_destination Clear the destination resource.
86
+ * @type bool $clear_working Clear the working resource.
87
+ * @type bool $abort_if_destination_exists Abort if the Destination directory exists.
88
+ * @type bool $is_multi Whether the upgrader is running multiple times.
89
+ * @type array $hook_extra {
90
+ * Extra hook arguments.
91
+ *
92
+ * @type string $action Type of action. Default 'update'.
93
+ * @type string $type Type of update process. Accepts 'plugin', 'theme', or 'core'.
94
+ * @type bool $bulk Whether the update process is a bulk update. Default true.
95
+ * @type string $plugin Path to the plugin file relative to the plugins directory.
96
+ * @type string $theme The stylesheet or template name of the theme.
97
+ * @type string $language_update_type The language pack update type. Accepts 'plugin', 'theme',
98
+ * or 'core'.
99
+ * @type object $language_update The language pack update offer.
100
+ * }
101
+ * }
102
+ */
103
+ $options = apply_filters( 'upgrader_package_options', $options );
104
+
105
+ if ( ! $options['is_multi'] ) { // call $this->header separately if running multiple times
106
+ $this->skin->header();
107
+ }
108
+
109
+ // Connect to the Filesystem first.
110
+ $res = $this->fs_connect( array( WP_CONTENT_DIR, $options['destination'] ) );
111
+ // Mainly for non-connected filesystem.
112
+ if ( ! $res ) {
113
+ if ( ! $options['is_multi'] ) {
114
+ $this->skin->footer();
115
+ }
116
+ return false;
117
+ }
118
+
119
+ $this->skin->before();
120
+
121
+ if ( is_wp_error( $res ) ) {
122
+ $this->skin->error( $res );
123
+ $this->skin->after();
124
+ if ( ! $options['is_multi'] ) {
125
+ $this->skin->footer();
126
+ }
127
+ return $res;
128
+ }
129
+
130
+ /*
131
+ * Download the package (Note, This just returns the filename
132
+ * of the file if the package is a local file)
133
+ */
134
+ $download = $this->download_package( $options['package'], true );
135
+
136
+ // Allow for signature soft-fail.
137
+ // WARNING: This may be removed in the future.
138
+ if ( is_wp_error( $download ) && $download->get_error_data( 'softfail-filename' ) ) {
139
+
140
+ // Don't output the 'no signature could be found' failure message for now.
141
+ if ( (string) $download->get_error_code() !== 'signature_verification_no_signature' || WP_DEBUG ) {
142
+ // Outout the failure error as a normal feedback, and not as an error:
143
+ //$this->skin->feedback( $download->get_error_message() );
144
+
145
+ // Report this failure back to WordPress.org for debugging purposes.
146
+ wp_version_check(
147
+ array(
148
+ 'signature_failure_code' => $download->get_error_code(),
149
+ 'signature_failure_data' => $download->get_error_data(),
150
+ )
151
+ );
152
+ }
153
+
154
+ // Pretend this error didn't happen.
155
+ $download = $download->get_error_data( 'softfail-filename' );
156
+ }
157
+
158
+ if ( is_wp_error( $download ) ) {
159
+ $this->skin->error( $download );
160
+ $this->skin->after();
161
+ if ( ! $options['is_multi'] ) {
162
+ $this->skin->footer();
163
+ }
164
+ return $download;
165
+ }
166
+
167
+ $delete_package = ( (string) $download !== (string) $options['package'] ); // Do not delete a "local" file.
168
+
169
+ // Unzips the file into a temporary directory.
170
+ $working_dir = $this->unpack_package( $download, $delete_package );
171
+ if ( is_wp_error( $working_dir ) ) {
172
+ $this->skin->error( $working_dir );
173
+ $this->skin->after();
174
+ if ( ! $options['is_multi'] ) {
175
+ $this->skin->footer();
176
+ }
177
+ return $working_dir;
178
+ }
179
+
180
+ // With the given options, this installs it to the destination directory.
181
+ $result = $this->install_package(
182
+ array(
183
+ 'source' => $working_dir,
184
+ 'destination' => $options['destination'],
185
+ 'clear_destination' => $options['clear_destination'],
186
+ 'abort_if_destination_exists' => $options['abort_if_destination_exists'],
187
+ 'clear_working' => $options['clear_working'],
188
+ 'hook_extra' => $options['hook_extra'],
189
+ )
190
+ );
191
+
192
+ $this->skin->set_result( $result );
193
+ if ( is_wp_error( $result ) ) {
194
+ $this->skin->error( $result );
195
+ //$this->skin->feedback( 'process_failed' );
196
+ } else {
197
+ // Installation succeeded.
198
+ //$this->skin->feedback( 'process_success' );
199
+ }
200
+
201
+ $this->skin->after();
202
+
203
+ if ( ! $options['is_multi'] ) {
204
+
205
+ /**
206
+ * Fire when the upgrader process is complete.
207
+ *
208
+ * See also {@see 'upgrader_package_options'}.
209
+ *
210
+ * @since 3.6.0
211
+ * @since 3.7.0 Added to WP_Upgrader::run().
212
+ * @since 4.6.0 `$translations` was added as a possible argument to `$hook_extra`.
213
+ *
214
+ * @param WP_Upgrader $this WP_Upgrader instance. In other contexts, $this, might be a
215
+ * Theme_Upgrader, Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader instance.
216
+ * @param array $hook_extra {
217
+ * Array of bulk item update data.
218
+ *
219
+ * @type string $action Type of action. Default 'update'.
220
+ * @type string $type Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'.
221
+ * @type bool $bulk Whether the update process is a bulk update. Default true.
222
+ * @type array $plugins Array of the basename paths of the plugins' main files.
223
+ * @type array $themes The theme slugs.
224
+ * @type array $translations {
225
+ * Array of translations update data.
226
+ *
227
+ * @type string $language The locale the translation is for.
228
+ * @type string $type Type of translation. Accepts 'plugin', 'theme', or 'core'.
229
+ * @type string $slug Text domain the translation is for. The slug of a theme/plugin or
230
+ * 'default' for core translations.
231
+ * @type string $version The version of a theme, plugin, or core.
232
+ * }
233
+ * }
234
+ */
235
+ do_action( 'upgrader_process_complete', $this, $options['hook_extra'] );
236
+
237
+ $this->skin->footer();
238
+ }
239
+
240
+ return $result;
241
+ }
242
+
243
+ /**
244
+ * Toggle maintenance mode for the site.
245
+ *
246
+ * Create/delete the maintenance file to enable/disable maintenance mode.
247
+ *
248
+ * @since 2.8.0
249
+ *
250
+ * @global WP_Filesystem_Base $wp_filesystem Subclass
251
+ *
252
+ * @param bool $enable True to enable maintenance mode, false to disable.
253
+ */
254
+ public function maintenance_mode( $enable = false ) {
255
+ global $wp_filesystem;
256
+ $file = $wp_filesystem->abspath() . '.maintenance';
257
+ if ( $enable ) {
258
+ //$this->skin->feedback( 'maintenance_start' );
259
+ // Create maintenance file to signal that we are upgrading
260
+ $maintenance_string = '<?php $upgrading = ' . time() . '; ?>';
261
+ $wp_filesystem->delete( $file );
262
+ $wp_filesystem->put_contents( $file, $maintenance_string, FS_CHMOD_FILE );
263
+ } elseif ( ! $enable && $wp_filesystem->exists( $file ) ) {
264
+ //$this->skin->feedback( 'maintenance_end' );
265
+ $wp_filesystem->delete( $file );
266
+ }
267
+ }
268
+
269
+ /**
270
+ * Download a package.
271
+ *
272
+ * @since 2.8.0
273
+ * @since 5.5.0 Added the `$hook_extra` parameter.
274
+ *
275
+ * @param string $package The URI of the package. If this is the full path to an
276
+ * existing local file, it will be returned untouched.
277
+ * @param bool $check_signatures Whether to validate file signatures. Default false.
278
+ * @param array $hook_extra Extra arguments to pass to the filter hooks. Default empty array.
279
+ * @return string|WP_Error The full path to the downloaded package file, or a WP_Error object.
280
+ */
281
+ public function download_package( $package, $check_signatures = false, $hook_extra = array() ) {
282
+
283
+ /**
284
+ * Filters whether to return the package.
285
+ *
286
+ * @since 3.7.0
287
+ * @since 5.5.0 Added the `$hook_extra` parameter.
288
+ *
289
+ * @param bool $reply Whether to bail without returning the package.
290
+ * Default false.
291
+ * @param string $package The package file name.
292
+ * @param WP_Upgrader $this The WP_Upgrader instance.
293
+ * @param array $hook_extra Extra arguments passed to hooked filters.
294
+ */
295
+ $reply = apply_filters( 'upgrader_pre_download', false, $package, $this, $hook_extra );
296
+ if ( false !== $reply ) {
297
+ return $reply;
298
+ }
299
+
300
+ if ( ! preg_match( '!^(http|https|ftp)://!i', $package ) && file_exists( $package ) ) { // Local file or remote?
301
+ return $package; // Must be a local file.
302
+ }
303
+
304
+ if ( empty( $package ) ) {
305
+ return new WP_Error( 'no_package', $this->strings['no_package'] );
306
+ }
307
+
308
+ //$this->skin->feedback( 'downloading_package', $package );
309
+
310
+ $download_file = download_url( $package, 300, $check_signatures );
311
+
312
+ if ( is_wp_error( $download_file ) && ! $download_file->get_error_data( 'softfail-filename' ) ) {
313
+ return new WP_Error( 'download_failed', $this->strings['download_failed'], $download_file->get_error_message() );
314
+ }
315
+
316
+ return $download_file;
317
+ }
318
+
319
+ /**
320
+ * Unpack a compressed package file.
321
+ *
322
+ * @since 2.8.0
323
+ *
324
+ * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
325
+ *
326
+ * @param string $package Full path to the package file.
327
+ * @param bool $delete_package Optional. Whether to delete the package file after attempting
328
+ * to unpack it. Default true.
329
+ * @return string|WP_Error The path to the unpacked contents, or a WP_Error on failure.
330
+ */
331
+ public function unpack_package( $package, $delete_package = true ) {
332
+ global $wp_filesystem;
333
+
334
+ //$this->skin->feedback( 'unpack_package' );
335
+
336
+ $upgrade_folder = $wp_filesystem->wp_content_dir() . 'upgrade/';
337
+
338
+ //Clean up contents of upgrade directory beforehand.
339
+ $upgrade_files = $wp_filesystem->dirlist( $upgrade_folder );
340
+ if ( ! empty( $upgrade_files ) ) {
341
+ foreach ( $upgrade_files as $file ) {
342
+ $wp_filesystem->delete( $upgrade_folder . $file['name'], true );
343
+ }
344
+ }
345
+
346
+ // We need a working directory - Strip off any .tmp or .zip suffixes
347
+ $working_dir = $upgrade_folder . basename( basename( $package, '.tmp' ), '.zip' );
348
+
349
+ // Clean up working directory
350
+ if ( $wp_filesystem->is_dir( $working_dir ) ) {
351
+ $wp_filesystem->delete( $working_dir, true );
352
+ }
353
+
354
+ // Unzip package to working directory
355
+ $result = unzip_file( $package, $working_dir );
356
+
357
+ // Once extracted, delete the package if required.
358
+ if ( $delete_package ) {
359
+ unlink( $package );
360
+ }
361
+
362
+ if ( is_wp_error( $result ) ) {
363
+ $wp_filesystem->delete( $working_dir, true );
364
+ if ( $result->get_error_code() === 'incompatible_archive' ) {
365
+ return new WP_Error( 'incompatible_archive', $this->strings['incompatible_archive'], $result->get_error_data() );
366
+ }
367
+
368
+ return $result;
369
+ }
370
+
371
+ return $working_dir;
372
+ }
373
+
374
+ /**
375
+ * Install a package.
376
+ *
377
+ * Copies the contents of a package form a source directory, and installs them in
378
+ * a destination directory. Optionally removes the source. It can also optionally
379
+ * clear out the destination folder if it already exists.
380
+ *
381
+ * @since 2.8.0
382
+ *
383
+ * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
384
+ * @global array $wp_theme_directories
385
+ *
386
+ * @param array|string $args {
387
+ * Optional. Array or string of arguments for installing a package. Default empty array.
388
+ *
389
+ * @type string $source Required path to the package source. Default empty.
390
+ * @type string $destination Required path to a folder to install the package in.
391
+ * Default empty.
392
+ * @type bool $clear_destination Whether to delete any files already in the destination
393
+ * folder. Default false.
394
+ * @type bool $clear_working Whether to delete the files form the working directory
395
+ * after copying to the destination. Default false.
396
+ * @type bool $abort_if_destination_exists Whether to abort the installation if
397
+ * the destination folder already exists. Default true.
398
+ * @type array $hook_extra Extra arguments to pass to the filter hooks called by
399
+ * WP_Upgrader::install_package(). Default empty array.
400
+ * }
401
+ *
402
+ * @return array|WP_Error The result (also stored in `WP_Upgrader::$result`), or a WP_Error on failure.
403
+ */
404
+ public function install_package( $args = array() ) {
405
+ global $wp_filesystem, $wp_theme_directories;
406
+
407
+ $defaults = array(
408
+ 'source' => '', // Please always pass this
409
+ 'destination' => '', // and this
410
+ 'clear_destination' => false,
411
+ 'clear_working' => false,
412
+ 'abort_if_destination_exists' => true,
413
+ 'hook_extra' => array(),
414
+ );
415
+
416
+ $args = wp_parse_args( $args, $defaults );
417
+
418
+ // These were previously extract()'d.
419
+ $source = $args['source'];
420
+ $destination = $args['destination'];
421
+ $clear_destination = $args['clear_destination'];
422
+
423
+ // @todo does this need to be replaced?
424
+ // wpforms_set_time_limit( 300 );
425
+
426
+ if ( empty( $source ) || empty( $destination ) ) {
427
+ return new WP_Error( 'bad_request', $this->strings['bad_request'] );
428
+ }
429
+ //$this->skin->feedback( 'installing_package' );
430
+
431
+ /**
432
+ * Filter the install response before the installation has started.
433
+ *
434
+ * Returning a truthy value, or one that could be evaluated as a WP_Error
435
+ * will effectively short-circuit the installation, returning that value
436
+ * instead.
437
+ *
438
+ * @since 2.8.0
439
+ *
440
+ * @param bool|WP_Error $response Response.
441
+ * @param array $hook_extra Extra arguments passed to hooked filters.
442
+ */
443
+ $res = apply_filters( 'upgrader_pre_install', true, $args['hook_extra'] );
444
+
445
+ if ( is_wp_error( $res ) ) {
446
+ return $res;
447
+ }
448
+
449
+ // Retain the Original source and destinations.
450
+ $remote_source = $args['source'];
451
+ $local_destination = $destination;
452
+
453
+ $source_files = array_keys( $wp_filesystem->dirlist( $remote_source ) );
454
+ $remote_destination = $wp_filesystem->find_folder( $local_destination );
455
+ $count_source_files = count( $source_files );
456
+
457
+ // Locate which directory to copy to the new folder, This is based on the actual folder holding the files.
458
+ if ( $count_source_files === 1 && $wp_filesystem->is_dir( trailingslashit( $args['source'] ) . $source_files[0] . '/' ) ) { // Only one folder? Then we want its contents.
459
+ $source = trailingslashit( $args['source'] ) . trailingslashit( $source_files[0] );
460
+ } elseif ( $count_source_files === 0 ) {
461
+ return new WP_Error( 'incompatible_archive_empty', $this->strings['incompatible_archive'], $this->strings['no_files'] ); // There are no files?
462
+ } else { // It's only a single file, the upgrader will use the folder name of this file as the destination folder. Folder name is based on zip filename.
463
+ $source = trailingslashit( $args['source'] );
464
+ }
465
+
466
+ /**
467
+ * Filter the source file location for the upgrade package.
468
+ *
469
+ * @since 2.8.0
470
+ * @since 4.4.0 The $hook_extra parameter became available.
471
+ *
472
+ * @param string $source File source location.
473
+ * @param string $remote_source Remote file source location.
474
+ * @param WP_Upgrader $this WP_Upgrader instance.
475
+ * @param array $hook_extra Extra arguments passed to hooked filters.
476
+ */
477
+ $source = apply_filters( 'upgrader_source_selection', $source, $remote_source, $this, $args['hook_extra'] );
478
+
479
+ if ( is_wp_error( $source ) ) {
480
+ return $source;
481
+ }
482
+
483
+ // Has the source location changed? If so, we need a new source_files list.
484
+ if ( $source !== $remote_source ) {
485
+ $source_files = array_keys( $wp_filesystem->dirlist( $source ) );
486
+ }
487
+
488
+ /*
489
+ * Protection against deleting files in any important base directories.
490
+ * Theme_Upgrader & Plugin_Upgrader also trigger this, as they pass the
491
+ * destination directory (WP_PLUGIN_DIR / wp-content/themes) intending
492
+ * to copy the directory into the directory, whilst they pass the source
493
+ * as the actual files to copy.
494
+ */
495
+ $protected_directories = array( ABSPATH, WP_CONTENT_DIR, WP_PLUGIN_DIR, WP_CONTENT_DIR . '/themes' );
496
+
497
+ if ( is_array( $wp_theme_directories ) ) {
498
+ $protected_directories = array_merge( $protected_directories, $wp_theme_directories );
499
+ }
500
+
501
+ if ( in_array( $destination, $protected_directories ) ) {
502
+ $remote_destination = trailingslashit( $remote_destination ) . trailingslashit( basename( $source ) );
503
+ $destination = trailingslashit( $destination ) . trailingslashit( basename( $source ) );
504
+ }
505
+
506
+ if ( $clear_destination ) {
507
+ // We're going to clear the destination if there's something there.
508
+ $removed = $this->clear_destination( $remote_destination );
509
+
510
+ /**
511
+ * Filter whether the upgrader cleared the destination.
512
+ *
513
+ * @since 2.8.0
514
+ *
515
+ * @param mixed $removed Whether the destination was cleared. true on success, WP_Error on failure
516
+ * @param string $local_destination The local package destination.
517
+ * @param string $remote_destination The remote package destination.
518
+ * @param array $hook_extra Extra arguments passed to hooked filters.
519
+ */
520
+ $removed = apply_filters( 'upgrader_clear_destination', $removed, $local_destination, $remote_destination, $args['hook_extra'] );
521
+
522
+ if ( is_wp_error( $removed ) ) {
523
+ return $removed;
524
+ }
525
+ } elseif ( $args['abort_if_destination_exists'] && $wp_filesystem->exists( $remote_destination ) ) {
526
+ // If we're not clearing the destination folder and something exists there already, Bail.
527
+ // But first check to see if there are actually any files in the folder.
528
+ $_files = $wp_filesystem->dirlist( $remote_destination );
529
+
530
+ if ( ! empty( $_files ) ) {
531
+ $wp_filesystem->delete( $remote_source, true ); // Clear out the source files.
532
+
533
+ return new WP_Error( 'folder_exists', $this->strings['folder_exists'], $remote_destination );
534
+ }
535
+ }
536
+
537
+ // Create destination if needed.
538
+ if ( ! $wp_filesystem->exists( $remote_destination ) ) {
539
+ if ( ! $wp_filesystem->mkdir( $remote_destination, FS_CHMOD_DIR ) ) {
540
+ return new WP_Error( 'mkdir_failed_destination', $this->strings['mkdir_failed'], $remote_destination );
541
+ }
542
+ }
543
+
544
+ // Copy new version of item into place.
545
+ $result = copy_dir( $source, $remote_destination );
546
+
547
+ if ( is_wp_error( $result ) ) {
548
+ if ( $args['clear_working'] ) {
549
+ $wp_filesystem->delete( $remote_source, true );
550
+ }
551
+
552
+ return $result;
553
+ }
554
+
555
+ // Clear the Working folder?
556
+ if ( $args['clear_working'] ) {
557
+ $wp_filesystem->delete( $remote_source, true );
558
+ }
559
+
560
+ $destination_name = basename( str_replace( $local_destination, '', $destination ) );
561
+
562
+ if ( $destination_name === '.' ) {
563
+ $destination_name = '';
564
+ }
565
+
566
+ $this->result = compact( 'source', 'source_files', 'destination', 'destination_name', 'local_destination', 'remote_destination', 'clear_destination' );
567
+
568
+ /**
569
+ * Filter the installation response after the installation has finished.
570
+ *
571
+ * @since 2.8.0
572
+ *
573
+ * @param bool $response Installation response.
574
+ * @param array $hook_extra Extra arguments passed to hooked filters.
575
+ * @param array $result Installation result data.
576
+ */
577
+ $res = apply_filters( 'upgrader_post_install', true, $args['hook_extra'], $this->result );
578
+
579
+ if ( is_wp_error( $res ) ) {
580
+ $this->result = $res;
581
+
582
+ return $res;
583
+ }
584
+
585
+ // Bombard the calling function will all the info which we've just used.
586
+ return $this->result;
587
+ }
588
+
589
+ /**
590
+ * Install a plugin package.
591
+ *
592
+ * @since 1.6.3
593
+ *
594
+ * @param string $package The full local path or URI of the package.
595
+ * @param array $args Optional. Other arguments for installing a plugin package. Default empty array.
596
+ *
597
+ * @return bool|\WP_Error True if the installation was successful, false or a WP_Error otherwise.
598
+ */
599
+ public function install( $package, $args = array() ) {
600
+
601
+ $result = parent::install( $package, $args );
602
+ if ( true === $result ) {
603
+ do_action( 'edd_plugin_installed', $package );
604
+ }
605
+
606
+ return $result;
607
+ }
608
+ }
includes/admin/promos/class-promo-handler.php CHANGED
@@ -23,7 +23,9 @@ class PromoHandler {
23
  * @var string[]
24
  */
25
  private $notices = array(
26
- '\\EDD\\Admin\\Promos\\Notices\\License_Upgrade_Notice'
 
 
27
  );
28
 
29
  /**
@@ -59,7 +61,7 @@ class PromoHandler {
59
 
60
  add_action( $notice_class_name::DISPLAY_HOOK, function () use ( $notice_class_name ) {
61
  /** @var Notice $notice */
62
- $notice = new $notice_class_name;
63
  if ( $notice->should_display() ) {
64
  $notice->display();
65
  }
@@ -105,15 +107,24 @@ class PromoHandler {
105
  * @since 2.10.6
106
  */
107
  public function dismiss_notice() {
108
- if ( ! current_user_can( 'manage_options' ) ) {
 
 
 
 
 
109
  wp_send_json_error( __( 'You do not have permission to perform this action.', 'easy-digital-downloads' ), 403 );
110
  }
111
 
112
- if ( empty( $_POST['notice_id'] ) ) {
113
- wp_send_json_error( __( 'Missing notice ID.', 'easy-digital-downloads' ), 400 );
 
 
 
114
  }
115
 
116
- if ( empty( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'edd-dismiss-notice-' . sanitize_key( $_POST['notice_id'] ) ) ) {
 
117
  wp_send_json_error( __( 'You do not have permission to perform this action.', 'easy-digital-downloads' ), 403 );
118
  }
119
 
@@ -124,6 +135,38 @@ class PromoHandler {
124
  wp_send_json_success();
125
  }
126
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  }
128
 
129
  new PromoHandler();
23
  * @var string[]
24
  */
25
  private $notices = array(
26
+ '\\EDD\\Admin\\Promos\\Notices\\License_Upgrade_Notice',
27
+ '\\EDD\\Admin\\Promos\\Notices\\Five_Star_Review_Dashboard',
28
+ '\\EDD\\Admin\\Promos\\Notices\\Five_Star_Review_Settings',
29
  );
30
 
31
  /**
61
 
62
  add_action( $notice_class_name::DISPLAY_HOOK, function () use ( $notice_class_name ) {
63
  /** @var Notice $notice */
64
+ $notice = new $notice_class_name();
65
  if ( $notice->should_display() ) {
66
  $notice->display();
67
  }
107
  * @since 2.10.6
108
  */
109
  public function dismiss_notice() {
110
+ $notice_id = ! empty( $_POST['notice_id'] ) ? sanitize_text_field( $_POST['notice_id'] ) : false;
111
+ if ( empty( $notice_id ) ) {
112
+ wp_send_json_error( __( 'Missing notice ID.', 'easy-digital-downloads' ), 400 );
113
+ }
114
+
115
+ if ( empty( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'edd-dismiss-notice-' . sanitize_key( $_POST['notice_id'] ) ) ) {
116
  wp_send_json_error( __( 'You do not have permission to perform this action.', 'easy-digital-downloads' ), 403 );
117
  }
118
 
119
+ $notice_class_name = $this->get_notice_class_name( $notice_id );
120
+
121
+ // No matching notice class was found.
122
+ if ( ! $notice_class_name ) {
123
+ wp_send_json_error( __( 'You do not have permission to perform this action.', 'easy-digital-downloads' ), 403 );
124
  }
125
 
126
+ // Check whether the current user can dismiss the notice.
127
+ if ( ! defined( $notice_class_name . '::CAPABILITY' ) || ! current_user_can( $notice_class_name::CAPABILITY ) ) {
128
  wp_send_json_error( __( 'You do not have permission to perform this action.', 'easy-digital-downloads' ), 403 );
129
  }
130
 
135
  wp_send_json_success();
136
  }
137
 
138
+ /**
139
+ * Gets the notice class name for a given notice ID.
140
+ *
141
+ * @since 2.11.4
142
+ * @param string $notice_id The notice ID to match.
143
+ * @return bool|string The class name or false if no matching class was found.
144
+ */
145
+ private function get_notice_class_name( $notice_id ) {
146
+ $notice_class_name = false;
147
+ // Look through the registered notice classes for the one being dismissed.
148
+ foreach ( $this->notices as $notice_class_to_check ) {
149
+ if ( ! class_exists( $notice_class_to_check ) ) {
150
+ $file_name = strtolower( str_replace( '_', '-', basename( str_replace( '\\', '/', $notice_class_to_check ) ) ) );
151
+ $file_path = EDD_PLUGIN_DIR . 'includes/admin/promos/notices/class-' . $file_name . '.php';
152
+
153
+ if ( file_exists( $file_path ) ) {
154
+ require_once $file_path;
155
+ }
156
+ }
157
+
158
+ if ( ! class_exists( $notice_class_to_check ) ) {
159
+ continue;
160
+ }
161
+ $notice = new $notice_class_to_check();
162
+ if ( $notice->get_id() === $notice_id ) {
163
+ $notice_class_name = $notice_class_to_check;
164
+ break;
165
+ }
166
+ }
167
+
168
+ return $notice_class_name;
169
+ }
170
  }
171
 
172
  new PromoHandler();
includes/admin/promos/notices/abstract-notice.php CHANGED
@@ -29,6 +29,11 @@ abstract class Notice {
29
  */
30
  const DISMISSIBLE = true;
31
 
 
 
 
 
 
32
  /**
33
  * Displays the notice content.
34
  *
@@ -44,7 +49,7 @@ abstract class Notice {
44
  *
45
  * @return string
46
  */
47
- protected function get_id() {
48
  return strtolower( str_replace( '_', '-', basename( str_replace( '\\', '/', get_class( $this ) ) ) ) );
49
  }
50
 
@@ -59,7 +64,7 @@ abstract class Notice {
59
  * @return bool
60
  */
61
  public function should_display() {
62
- return ! PromoHandler::is_dismissed( $this->get_id() ) && $this->_should_display();
63
  }
64
 
65
  /**
29
  */
30
  const DISMISSIBLE = true;
31
 
32
+ /**
33
+ * The capability required to view/dismiss the notice.
34
+ */
35
+ const CAPABILITY = 'manage_options';
36
+
37
  /**
38
  * Displays the notice content.
39
  *
49
  *
50
  * @return string
51
  */
52
+ public function get_id() {
53
  return strtolower( str_replace( '_', '-', basename( str_replace( '\\', '/', get_class( $this ) ) ) ) );
54
  }
55
 
64
  * @return bool
65
  */
66
  public function should_display() {
67
+ return current_user_can( static::CAPABILITY ) && ! PromoHandler::is_dismissed( $this->get_id() ) && $this->_should_display();
68
  }
69
 
70
  /**
includes/admin/promos/notices/class-five-star-review-dashboard.php ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Dashboard Review Notice
4
+ *
5
+ * @package easy-digital-downloads
6
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
7
+ * @license GPL2+
8
+ * @since 2.11.4
9
+ */
10
+
11
+ namespace EDD\Admin\Promos\Notices;
12
+
13
+ class Five_Star_Review_Dashboard extends Notice {
14
+
15
+ /**
16
+ * Action hook for displaying the notice.
17
+ */
18
+ const DISPLAY_HOOK = 'edd_dashboard_sales_widget';
19
+
20
+ /**
21
+ * Type of promotional notice.
22
+ */
23
+ const TYPE = 'dashboard';
24
+
25
+ /**
26
+ * Capability required to view or dismiss the notice.
27
+ */
28
+ const CAPABILITY = 'manage_shop_settings';
29
+
30
+ /**
31
+ * The current screen.
32
+ *
33
+ * @var string
34
+ */
35
+ protected $screen = 'dashboard';
36
+
37
+ /**
38
+ * The ID of the notice. Defined specifically here as we intend to use it twice.
39
+ *
40
+ * @since 2.11.4
41
+ * @return string
42
+ */
43
+ public function get_id() {
44
+ return 'five-star-review';
45
+ }
46
+
47
+ /**
48
+ * Display the notice.
49
+ *
50
+ * @since 2.11.4
51
+ * @return void
52
+ */
53
+ public function display() {
54
+ ?>
55
+ <div
56
+ id="edd-admin-notice-<?php echo esc_attr( $this->get_id() ); ?>"
57
+ class="edd-admin-notice-<?php echo esc_attr( sanitize_html_class( static::TYPE ) ); ?> edd-promo-notice"
58
+ data-nonce="<?php echo esc_attr( wp_create_nonce( 'edd-dismiss-notice-' . $this->get_id() ) ); ?>"
59
+ data-id="<?php echo esc_attr( $this->get_id() ); ?>"
60
+ data-lifespan="<?php echo esc_attr( static::dismiss_duration() ); ?>"
61
+ >
62
+ <?php
63
+ $this->_display();
64
+ ?>
65
+ </div>
66
+ <?php
67
+ }
68
+
69
+ /**
70
+ * The promo notice content.
71
+ *
72
+ * @since 2.11.4
73
+ * @return void
74
+ */
75
+ public function _display() {
76
+ ?>
77
+ <div class="edd-review-step edd-review-step-1">
78
+ <p><?php esc_html_e( 'Hey, I noticed you\'ve made quite a few sales with Easy Digital Downloads! Are you enjoying Easy Digital Downloads?', 'easy-digital-downloads' ); ?></p>
79
+ <div class="edd-review-actions">
80
+ <button class="button-primary edd-review-switch-step" data-step="3"><?php esc_html_e( 'Yes', 'easy-digital-downloads' ); ?></button><br />
81
+ <button class="button-link edd-review-switch-step" data-step="2"><?php esc_html_e( 'Not Really', 'easy-digital-downloads' ); ?></button>
82
+ </div>
83
+ </div>
84
+ <div class="edd-review-step edd-review-step-2" style="display:none;">
85
+ <p><?php esc_html_e( 'We\'re sorry to hear you aren\'t enjoying Easy Digital Downloads. We would love a chance to improve. Could you take a minute and let us know what we can do better?', 'easy-digital-downloads' ); ?></p>
86
+ <div class="edd-review-actions">
87
+ <a href="<?php echo esc_url( $this->url() ); ?>" class="button button-secondary edd-promo-notice-dismiss" target="_blank"><?php esc_html_e( 'Give Feedback', 'easy-digital-downloads' ); ?></a><br>
88
+ <button class="button-link edd-promo-notice-dismiss"><?php esc_html_e( 'No thanks', 'easy-digital-downloads' ); ?></button>
89
+ </div>
90
+ </div>
91
+ <div class="edd-review-step edd-review-step-3" style="display:none;">
92
+ <p><?php esc_html_e( 'That\'s awesome! Could you please do me a BIG favor and give it a 5-star rating on WordPress to help us spread the word and boost our motivation?', 'easy-digital-downloads' ); ?></p>
93
+ <p><strong><?php echo wp_kses( __( '~ Chris Klosowski<br>President of Easy Digital Downloads', 'easy-digital-downloads' ), array( 'br' => array() ) ); ?></strong></p>
94
+ <div class="edd-review-actions">
95
+ <a href="https://wordpress.org/support/plugin/easy-digital-downloads/reviews/?filter=5#new-post" class="button button-primary edd-promo-notice-dismiss" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Ok, you deserve it!', 'easy-digital-downloads' ); ?></a><br>
96
+ <button class="button-link edd-promo-notice-dismiss"><?php esc_html_e( 'No thanks', 'easy-digital-downloads' ); ?></button>
97
+ </div>
98
+ </div>
99
+ <img alt="" class="edd-peeking" src="<?php echo esc_url( EDD_PLUGIN_URL . 'assets/images/edd-peeking.png' ); ?>" />
100
+ <script type="text/javascript">
101
+ document.addEventListener( 'DOMContentLoaded', function() {
102
+ var steps = document.querySelectorAll( '.edd-review-switch-step' );
103
+ steps.forEach( function(step) {
104
+ step.addEventListener( 'click', function ( e ) {
105
+ e.preventDefault();
106
+ var target = this.getAttribute( 'data-step' );
107
+ if ( target ) {
108
+ var notice = this.closest( '.edd-promo-notice' );
109
+ var review_step = notice.querySelector( '.edd-review-step-' + target );
110
+ if ( review_step ) {
111
+ var thisStep = this.closest( '.edd-review-step' );
112
+ eddFadeOut( thisStep );
113
+ eddFadeIn( review_step );
114
+ }
115
+ }
116
+ } )
117
+ } )
118
+
119
+ function eddFadeIn( element ) {
120
+ var op = 0;
121
+ element.style.opacity = op;
122
+ element.style.display = 'block';
123
+ var timer = setInterval( function () {
124
+ if ( op >= 1 ) {
125
+ clearInterval( timer );
126
+ }
127
+ element.style.opacity = op;
128
+ element.style.filter = 'alpha(opacity=' + op * 100 + ')';
129
+ op = op + 0.1;
130
+ }, 80 );
131
+ }
132
+
133
+ function eddFadeOut( element ) {
134
+ var op = 1;
135
+ var timer = setInterval( function () {
136
+ if ( op <= 0 ) {
137
+ element.style.display = 'none';
138
+ clearInterval( timer );
139
+ }
140
+ element.style.opacity = op;
141
+ element.style.filter = 'alpha(opacity=' + op * 100 + ')';
142
+ op = op - 0.1;
143
+ }, 80 );
144
+ }
145
+ } );
146
+ </script>
147
+ <?php
148
+ }
149
+
150
+ /**
151
+ * Whether the notice should display.
152
+ *
153
+ * @since 2.11.4
154
+ * @return bool
155
+ */
156
+ protected function _should_display() {
157
+
158
+ $activated = edd_get_activation_date();
159
+ // Do not show if EDD was activated less than 30 days ago.
160
+ if ( ! is_numeric( $activated ) || ( $activated + ( DAY_IN_SECONDS * 30 ) ) > time() ) {
161
+ return false;
162
+ }
163
+ // @todo Change this to edd_count_orders in 3.0
164
+ $payments = edd_count_payments();
165
+
166
+ return isset( $payments->publish ) && $payments->publish >= 15;
167
+ }
168
+
169
+ /**
170
+ * Builds the UTM parameters for the URLs.
171
+ *
172
+ * @since 2.11.4
173
+ *
174
+ * @return string
175
+ */
176
+ private function url() {
177
+ $args = array(
178
+ 'utm_source' => urlencode( $this->screen ),
179
+ 'utm_medium' => urlencode( static::TYPE ),
180
+ 'utm_campaign' => 'Feedback',
181
+ 'utm_content' => 'give-feedback',
182
+ );
183
+
184
+ return add_query_arg(
185
+ $args,
186
+ 'https://easydigitaldownloads.com/plugin-feedback'
187
+ );
188
+ }
189
+ }
includes/admin/promos/notices/class-five-star-review-settings.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Settings Review Notice
4
+ *
5
+ * @package easy-digital-downloads
6
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
7
+ * @license GPL2+
8
+ * @since 2.11.4
9
+ */
10
+
11
+ namespace EDD\Admin\Promos\Notices;
12
+
13
+ class Five_Star_Review_Settings extends Five_Star_Review_Dashboard {
14
+
15
+ /**
16
+ * Action hook for displaying the notice.
17
+ */
18
+ const DISPLAY_HOOK = 'admin_notices';
19
+
20
+ /**
21
+ * Type of promotional notice.
22
+ */
23
+ const TYPE = 'admin-notice';
24
+
25
+ /**
26
+ * The current screen.
27
+ *
28
+ * @var string
29
+ */
30
+ protected $screen = 'plugin-settings-page';
31
+
32
+ /**
33
+ * Display the notice.
34
+ * This extends the parent method because the container classes are different.
35
+ *
36
+ * @since 2.11.4
37
+ * @return void
38
+ */
39
+ public function display() {
40
+ ?>
41
+ <div
42
+ id="edd-admin-notice-<?php echo esc_attr( $this->get_id() ); ?>"
43
+ class="notice notice-info edd-admin-notice-<?php echo esc_attr( sanitize_html_class( static::TYPE ) ); ?> edd-promo-notice"
44
+ data-nonce="<?php echo esc_attr( wp_create_nonce( 'edd-dismiss-notice-' . $this->get_id() ) ); ?>"
45
+ data-id="<?php echo esc_attr( $this->get_id() ); ?>"
46
+ data-lifespan="<?php echo esc_attr( static::dismiss_duration() ); ?>"
47
+ >
48
+ <?php
49
+ parent::_display();
50
+ ?>
51
+ </div>
52
+ <?php
53
+ }
54
+
55
+ /**
56
+ * Whether the notice should display.
57
+ * This extends the general method as this notice should only display on EDD settings screens.
58
+ *
59
+ * @since 2.11.4
60
+ * @return bool
61
+ */
62
+ protected function _should_display() {
63
+ if ( ! edd_is_admin_page( 'settings' ) ) {
64
+ return false;
65
+ }
66
+ return parent::_should_display();
67
+ }
68
+ }
includes/admin/promos/notices/class-license-upgrade-notice.php CHANGED
@@ -61,7 +61,7 @@ class License_Upgrade_Notice extends Notice {
61
 
62
  $screen = get_current_screen();
63
 
64
- if ( ! $screen instanceof \WP_Screen || 'dashboard' === $screen->id || ! edd_is_admin_page() ) {
65
  return false;
66
  }
67
 
@@ -74,9 +74,6 @@ class License_Upgrade_Notice extends Notice {
74
  * @return bool
75
  */
76
  protected function _should_display() {
77
- if ( ! current_user_can( 'manage_options' ) ) {
78
- return false;
79
- }
80
 
81
  if ( ! $this->is_edd_admin_page() ) {
82
  return false;
61
 
62
  $screen = get_current_screen();
63
 
64
+ if ( ! $screen instanceof \WP_Screen || 'dashboard' === $screen->id || ! edd_is_admin_page( '', '', false ) ) {
65
  return false;
66
  }
67
 
74
  * @return bool
75
  */
76
  protected function _should_display() {
 
 
 
77
 
78
  if ( ! $this->is_edd_admin_page() ) {
79
  return false;
includes/admin/reporting/export/class-batch-export-customers.php CHANGED
@@ -37,15 +37,16 @@ class EDD_Batch_Customers_Export extends EDD_Batch_Export {
37
  */
38
  public function csv_cols() {
39
 
40
- $cols = array(
41
- 'id' => __( 'ID', 'easy-digital-downloads' ),
42
- 'name' => __( 'Name', 'easy-digital-downloads' ),
43
- 'email' => __( 'Email', 'easy-digital-downloads' ),
44
- 'purchases' => __( 'Number of Purchases', 'easy-digital-downloads' ),
45
- 'amount' => __( 'Customer Value', 'easy-digital-downloads' )
 
 
 
46
  );
47
-
48
- return $cols;
49
  }
50
 
51
  /**
@@ -91,11 +92,14 @@ class EDD_Batch_Customers_Export extends EDD_Batch_Export {
91
  $customer = new EDD_Customer( $customer_id );
92
 
93
  $data[] = array(
94
- 'id' => $customer->id,
95
- 'name' => $customer->name,
96
- 'email' => $customer->email,
97
- 'purchases' => $customer->purchase_count,
98
- 'amount' => edd_format_amount( $customer->purchase_value ),
 
 
 
99
  );
100
  }
101
  }
@@ -110,11 +114,16 @@ class EDD_Batch_Customers_Export extends EDD_Batch_Export {
110
 
111
  foreach ( $customers as $customer ) {
112
 
113
- $data[$i]['id'] = $customer->id;
114
- $data[$i]['name'] = $customer->name;
115
- $data[$i]['email'] = $customer->email;
116
- $data[$i]['purchases'] = $customer->purchase_count;
117
- $data[$i]['amount'] = edd_format_amount( $customer->purchase_value );
 
 
 
 
 
118
 
119
  $i++;
120
  }
37
  */
38
  public function csv_cols() {
39
 
40
+ return array(
41
+ 'id' => __( 'ID', 'easy-digital-downloads' ),
42
+ 'user_id' => __( 'User ID', 'easy-digital-downloads' ),
43
+ 'name' => __( 'Name', 'easy-digital-downloads' ),
44
+ 'email' => __( 'Email', 'easy-digital-downloads' ),
45
+ 'purchases' => __( 'Number of Purchases', 'easy-digital-downloads' ),
46
+ 'amount' => __( 'Customer Value', 'easy-digital-downloads' ),
47
+ 'payment_ids' => __( 'Payment IDs', 'easy-digital-downloads' ),
48
+ 'date_created' => __( 'Date Created', 'easy-digital-downloads' ),
49
  );
 
 
50
  }
51
 
52
  /**
92
  $customer = new EDD_Customer( $customer_id );
93
 
94
  $data[] = array(
95
+ 'id' => $customer->id,
96
+ 'user_id' => $customer->user_id,
97
+ 'name' => $customer->name,
98
+ 'email' => $customer->email,
99
+ 'purchases' => $customer->purchase_count,
100
+ 'amount' => edd_format_amount( $customer->purchase_value ),
101
+ 'payment_ids' => $customer->payment_ids,
102
+ 'date_created' => $customer->date_created,
103
  );
104
  }
105
  }
114
 
115
  foreach ( $customers as $customer ) {
116
 
117
+ $data[ $i ] = array(
118
+ 'id' => $customer->id,
119
+ 'user_id' => $customer->user_id,
120
+ 'name' => $customer->name,
121
+ 'email' => $customer->email,
122
+ 'purchases' => $customer->purchase_count,
123
+ 'amount' => edd_format_amount( $customer->purchase_value ),
124
+ 'payment_ids' => $customer->payment_ids,
125
+ 'date_created' => $customer->date_created,
126
+ );
127
 
128
  $i++;
129
  }
includes/admin/reporting/export/class-batch-export-earnings-report.php CHANGED
@@ -119,10 +119,10 @@ class EDD_Batch_Earnings_Report_Export extends EDD_Batch_Export {
119
  * @return array $cols CSV header.
120
  */
121
  public function print_csv_cols() {
122
- $cols = $this->get_csv_cols();
123
- $col_data = '';
124
-
125
- for ( $i = 0; $i < count( $cols ); $i++ ) {
126
  $col_data .= $cols[ $i ];
127
 
128
  // We don't need an extra space after the first column
@@ -131,7 +131,7 @@ class EDD_Batch_Earnings_Report_Export extends EDD_Batch_Export {
131
  continue;
132
  }
133
 
134
- if ( $i == ( count( $cols ) - 1 ) ) {
135
  $col_data .= "\r\n";
136
  } else {
137
  $col_data .= ",,";
@@ -249,21 +249,12 @@ class EDD_Batch_Earnings_Report_Export extends EDD_Batch_Export {
249
  $data = array();
250
 
251
  $start_date = date( 'Y-m-d 00:00:00', strtotime( $this->start ) );
252
-
253
- if ( $this->count() == 0 ) {
254
- $end_date = date( 'Y-m-d 23:59:59', strtotime( $this->end ) );
255
- } else {
256
- $end_date = date( 'Y-m-d 23:59:59', strtotime( 'first day of +1 month', strtotime( $start_date ) ) );
257
- }
258
 
259
  if ( $this->step > 1 ) {
260
- $start_date = date( 'Y-m-d 00:00:00', strtotime( 'first day of +' . ( $this->step - 1 ) . ' month', strtotime( $start_date ) ) );
261
-
262
- if ( date( 'Y-m', strtotime( $start_date ) ) == date( 'Y-m', strtotime( $this->end ) ) ) {
263
- $end_date = date( 'Y-m-d 23:59:59', strtotime( $this->end ) );
264
- } else {
265
- $end_date = date( 'Y-m-d 23:59:59', strtotime( 'first day of +1 month', strtotime( $start_date ) ) );
266
- }
267
  }
268
 
269
  if ( strtotime( $start_date ) > strtotime( $this->end ) ) {
@@ -278,7 +269,7 @@ class EDD_Batch_Earnings_Report_Export extends EDD_Batch_Export {
278
  WHERE posts.post_type IN ('edd_payment')
279
  AND {$wpdb->postmeta}.meta_key = '_edd_payment_total'
280
  AND posts.post_date >= %s
281
- AND posts.post_date < %s
282
  GROUP BY YEAR(posts.post_date), MONTH(posts.post_date), posts.post_status
283
  ORDER by posts.post_date ASC", $start_date, $end_date ), ARRAY_A );
284
 
119
  * @return array $cols CSV header.
120
  */
121
  public function print_csv_cols() {
122
+ $cols = $this->get_csv_cols();
123
+ $col_data = '';
124
+ $column_count = count( $cols );
125
+ for ( $i = 0; $i < $column_count; $i++ ) {
126
  $col_data .= $cols[ $i ];
127
 
128
  // We don't need an extra space after the first column
131
  continue;
132
  }
133
 
134
+ if ( $i == ( $column_count - 1 ) ) {
135
  $col_data .= "\r\n";
136
  } else {
137
  $col_data .= ",,";
249
  $data = array();
250
 
251
  $start_date = date( 'Y-m-d 00:00:00', strtotime( $this->start ) );
252
+ $end_date = date( 'Y-m-t 23:59:59', strtotime( $this->start ) );
 
 
 
 
 
253
 
254
  if ( $this->step > 1 ) {
255
+ $start_timestamp = strtotime( 'first day of +' . ( $this->step - 1 ) . ' month', strtotime( $start_date ) );
256
+ $start_date = date( 'Y-m-d 00:00:00', $start_timestamp );
257
+ $end_date = date( 'Y-m-t 23:59:59', $start_timestamp );
 
 
 
 
258
  }
259
 
260
  if ( strtotime( $start_date ) > strtotime( $this->end ) ) {
269
  WHERE posts.post_type IN ('edd_payment')
270
  AND {$wpdb->postmeta}.meta_key = '_edd_payment_total'
271
  AND posts.post_date >= %s
272
+ AND posts.post_date <= %s
273
  GROUP BY YEAR(posts.post_date), MONTH(posts.post_date), posts.post_status
274
  ORDER by posts.post_date ASC", $start_date, $end_date ), ARRAY_A );
275
 
includes/admin/settings/contextual-help.php CHANGED
@@ -10,7 +10,9 @@
10
  */
11
 
12
  // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) exit;
 
 
14
 
15
  /**
16
  * Settings contextual help.
@@ -22,8 +24,9 @@ if ( ! defined( 'ABSPATH' ) ) exit;
22
  function edd_settings_contextual_help() {
23
  $screen = get_current_screen();
24
 
25
- if ( $screen->id != 'download_page_edd-settings' )
26
  return;
 
27
 
28
  $screen->set_help_sidebar(
29
  '<p><strong>' . __( 'For more information:', 'easy-digital-downloads' ) . '</strong></p>' .
@@ -35,18 +38,19 @@ function edd_settings_contextual_help() {
35
  );
36
 
37
  $screen->add_help_tab( array(
38
- 'id' => 'edd-settings-general',
39
- 'title' => __( 'General', 'easy-digital-downloads' ),
40
- 'content' => '<p>' . __( 'This screen provides the most basic settings for configuring your store. You can set the currency, page templates, and turn <em>Test Mode</em> on and off.', 'easy-digital-downloads' ) . '</p>'
41
  ) );
42
 
43
  $screen->add_help_tab( array(
44
- 'id' => 'edd-settings-payment-gateways',
45
- 'title' => __( 'Payment Gateways', 'easy-digital-downloads' ),
46
- 'content' =>
47
- '<p>' . __( 'This screen provides ways to toggle payment gateways on or off, as well as configure gateway-specific settings. Any extra payment gateway extensions you have installed will appear on this page, and can be configured to suit your needs.', 'easy-digital-downloads' ) . '</p>' .
48
  '<p>' . __( '<strong>Test Payment</strong> - This included gateway is great for testing your store, as it requires no payment, and leads straight to product downloads. However, please remember to turn it off once your site is live!', 'easy-digital-downloads' ) . '</p>' .
49
- '<p>' . __( '<strong>PayPal</strong> - A PayPal payment gateway is included as standard with Easy Digital Downloads. To test the PayPal gateway, you need a Sandbox account for PayPal and the site must be placed in Test Mode from the General settings tab. Please remember to enter your PayPal account email address in order for payments to get processed.', 'easy-digital-downloads' ) . '</p>'
 
50
  ) );
51
 
52
  $screen->add_help_tab( array(
@@ -57,6 +61,14 @@ function edd_settings_contextual_help() {
57
  '<p>' . __( 'A set of email tags has also been provided to allow the creation of personalized emails. A tag consists of a keyword surrounded by curly braces: <code>{tag}</code>. A description of each of these tags appears below the editor.', 'easy-digital-downloads' ) . '</p>'
58
  ) );
59
 
 
 
 
 
 
 
 
 
60
  $screen->add_help_tab( array(
61
  'id' => 'edd-settings-styles',
62
  'title' => __( 'Styles', 'easy-digital-downloads' ),
@@ -86,11 +98,10 @@ function edd_settings_contextual_help() {
86
  ) );
87
 
88
  $screen->add_help_tab( array(
89
- 'id' => 'edd-settings-misc',
90
- 'title' => __( 'Miscellaneous', 'easy-digital-downloads' ),
91
- 'content' =>
92
- '<p>' . __( 'This screen provides other miscellaneous options such as disabling jQuery, allowing guest checkout, and configuring your terms of service.', 'easy-digital-downloads' ) . '</p>' .
93
- '<p>' . __( 'A description of all the options are provided beside their input boxes.', 'easy-digital-downloads' ) . '</p>'
94
  ) );
95
 
96
  do_action( 'edd_settings_contextual_help', $screen );
10
  */
11
 
12
  // Exit if accessed directly
13
+ if ( ! defined( 'ABSPATH' ) ) {
14
+ exit;
15
+ }
16
 
17
  /**
18
  * Settings contextual help.
24
  function edd_settings_contextual_help() {
25
  $screen = get_current_screen();
26
 
27
+ if ( 'download_page_edd-settings' !== $screen->id ) {
28
  return;
29
+ }
30
 
31
  $screen->set_help_sidebar(
32
  '<p><strong>' . __( 'For more information:', 'easy-digital-downloads' ) . '</strong></p>' .
38
  );
39
 
40
  $screen->add_help_tab( array(
41
+ 'id' => 'edd-settings-general',
42
+ 'title' => __( 'General', 'easy-digital-downloads' ),
43
+ 'content' => '<p>' . __( 'This screen provides the most basic settings for configuring your store. You can set the currency, page templates, and general store settings.', 'easy-digital-downloads' ) . '</p>',
44
  ) );
45
 
46
  $screen->add_help_tab( array(
47
+ 'id' => 'edd-settings-payment-gateways',
48
+ 'title' => __( 'Payments', 'easy-digital-downloads' ),
49
+ 'content' =>
50
+ '<p>' . __( 'This screen provides ways to enable Test Mode, toggle payment gateways on or off, manage accounting settings, and configure gateway-specific settings. Any extra payment gateway extensions you have installed will appear on this page, and can be configured to suit your needs.', 'easy-digital-downloads' ) . '</p>' .
51
  '<p>' . __( '<strong>Test Payment</strong> - This included gateway is great for testing your store, as it requires no payment, and leads straight to product downloads. However, please remember to turn it off once your site is live!', 'easy-digital-downloads' ) . '</p>' .
52
+ '<p>' . __( '<strong>PayPal</strong> - A PayPal payment gateway is included as standard with Easy Digital Downloads. To test the PayPal gateway, you need a Sandbox account for PayPal and the site must be placed in Test Mode from the Payments > Gateways tab. Please remember to enter your PayPal account email address in order for payments to get processed.', 'easy-digital-downloads' ) . '</p>' .
53
+ '<p>' . __( '<strong>Stripe</strong> - The Stripe payment gateway is also included with Easy Digital Downloads. To test the Stripe gateway, you must "Connect with Stripe" and the site must be placed in Test Mode from the Payments > Gateways tab.', 'easy-digital-downloads' ) . '</p>',
54
  ) );
55
 
56
  $screen->add_help_tab( array(
61
  '<p>' . __( 'A set of email tags has also been provided to allow the creation of personalized emails. A tag consists of a keyword surrounded by curly braces: <code>{tag}</code>. A description of each of these tags appears below the editor.', 'easy-digital-downloads' ) . '</p>'
62
  ) );
63
 
64
+ $screen->add_help_tab( array(
65
+ 'id' => 'edd-settings-marketing',
66
+ 'title' => __( 'Marketing', 'easy-digital-downloads' ),
67
+ 'content' =>
68
+ '<p>' . __( 'Marketing settings will help you connect with your customers.', 'easy-digital-downloads' ) . '</p>' .
69
+ '<p>' . __( 'Marketing specific extensions will add their settings here as well.', 'easy-digital-downloads' ) . '</p>',
70
+ ) );
71
+
72
  $screen->add_help_tab( array(
73
  'id' => 'edd-settings-styles',
74
  'title' => __( 'Styles', 'easy-digital-downloads' ),
98
  ) );
99
 
100
  $screen->add_help_tab( array(
101
+ 'id' => 'edd-settings-misc',
102
+ 'title' => __( 'Miscellaneous', 'easy-digital-downloads' ),
103
+ 'content' =>
104
+ '<p>' . __( 'This screen provides other miscellaneous options such as configuring your store buttons, file download functionality, and terms of service.', 'easy-digital-downloads' ) . '</p>',
 
105
  ) );
106
 
107
  do_action( 'edd_settings_contextual_help', $screen );
includes/admin/settings/display-settings.php CHANGED
@@ -21,11 +21,43 @@ function edd_admin_header() {
21
  if ( ! edd_is_admin_page( '', '', false ) ) {
22
  return;
23
  }
 
 
24
  ?>
25
  <div id="edd-header" class="edd-header">
26
- <img class="edd-header-logo" alt="" src="<?php echo esc_url( EDD_PLUGIN_URL . '/assets/images/logo-edd-dark.svg' ); ?>" />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  </div>
28
  <?php
 
 
 
29
  }
30
  add_action( 'admin_notices', 'edd_admin_header', 1 );
31
 
@@ -50,12 +82,17 @@ function edd_options_page() {
50
  $key = key( $sections );
51
  }
52
 
53
- $registered_sections = edd_get_settings_tab_sections( $active_tab );
54
- $section = isset( $_GET['section'] ) && ! empty( $registered_sections ) && array_key_exists( $_GET['section'], $registered_sections ) ? sanitize_text_field( $_GET['section'] ) : $key;
55
 
56
- // Unset 'main' if it's empty and default to the first non-empty if it's the chosen section
57
  $all_settings = edd_get_registered_settings();
58
 
 
 
 
 
 
 
 
59
  // Let's verify we have a 'main' section to show
60
  $has_main_settings = true;
61
  if ( empty( $all_settings[ $active_tab ]['main'] ) ) {
@@ -75,6 +112,7 @@ function edd_options_page() {
75
  }
76
 
77
  $override = false;
 
78
  if ( false === $has_main_settings ) {
79
  unset( $sections['main'] );
80
 
@@ -95,7 +133,7 @@ function edd_options_page() {
95
  <h1><?php esc_html_e( 'Settings', 'easy-digital-downloads' ); ?></h1>
96
  <h2 class="nav-tab-wrapper">
97
  <?php
98
- foreach ( edd_get_settings_tabs() as $tab_id => $tab_name ) {
99
  $tab_url = add_query_arg( array(
100
  'settings-updated' => false,
101
  'tab' => $tab_id,
@@ -198,7 +236,6 @@ function edd_options_page() {
198
  * @return string
199
  */
200
  function edd_options_sidebar() {
201
-
202
  // Get settings tab and section info
203
  $active_tab = isset( $_GET['tab'] ) ? sanitize_text_field( $_GET['tab'] ) : 'general';
204
  $active_tab = array_key_exists( $active_tab, edd_get_settings_tabs() ) ? $active_tab : 'general';
21
  if ( ! edd_is_admin_page( '', '', false ) ) {
22
  return;
23
  }
24
+
25
+ $numberNotifications = EDD()->notifications->countActiveNotifications();
26
  ?>
27
  <div id="edd-header" class="edd-header">
28
+ <div id="edd-header-wrapper">
29
+ <img class="edd-header-logo" alt="" src="<?php echo esc_url( EDD_PLUGIN_URL . '/assets/images/logo-edd-dark.svg' ); ?>" />
30
+
31
+ <div id="edd-header-actions">
32
+ <button
33
+ id="edd-notification-button"
34
+ class="edd-round"
35
+ x-data
36
+ x-init="$store.eddNotifications.numberActiveNotifications = <?php echo esc_js( $numberNotifications ); ?>"
37
+ @click="$store.eddNotifications.openPanel()"
38
+ >
39
+ <span
40
+ class="edd-round edd-number<?php echo 0 === $numberNotifications ? ' edd-hidden' : ''; ?>"
41
+ x-show="$store.eddNotifications.numberActiveNotifications > 0"
42
+ >
43
+ <?php echo wp_kses( sprintf(
44
+ /* Translators: %1$s number of notifications; %2$s opening span tag; %3$s closing span tag */
45
+ __( '%1$s %2$sunread notifications%3$s', 'easy-digital-downloads' ),
46
+ '<span x-text="$store.eddNotifications.numberActiveNotifications"></span>',
47
+ '<span class="screen-reader-text">',
48
+ '</span>'
49
+ ), array( 'span' => array( 'class' => true, 'x-text' => true ) ) ); ?>
50
+ </span>
51
+
52
+ <svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" class="edd-notifications-icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.8333 2.5H4.16667C3.25 2.5 2.5 3.25 2.5 4.16667V15.8333C2.5 16.75 3.24167 17.5 4.16667 17.5H15.8333C16.75 17.5 17.5 16.75 17.5 15.8333V4.16667C17.5 3.25 16.75 2.5 15.8333 2.5ZM15.8333 15.8333H4.16667V13.3333H7.13333C7.70833 14.325 8.775 15 10.0083 15C11.2417 15 12.3 14.325 12.8833 13.3333H15.8333V15.8333ZM11.675 11.6667H15.8333V4.16667H4.16667V11.6667H8.34167C8.34167 12.5833 9.09167 13.3333 10.0083 13.3333C10.925 13.3333 11.675 12.5833 11.675 11.6667Z" fill="currentColor"></path></svg>
53
+ </button>
54
+ </div>
55
+ </div>
56
  </div>
57
  <?php
58
+ add_action( 'admin_footer', function() {
59
+ require_once EDD_PLUGIN_DIR . 'includes/admin/views/notifications.php';
60
+ } );
61
  }
62
  add_action( 'admin_notices', 'edd_admin_header', 1 );
63
 
82
  $key = key( $sections );
83
  }
84
 
85
+ $section = ! empty( $_GET['section'] ) && ! empty( $sections[ $_GET['section'] ] ) ? sanitize_text_field( $_GET['section'] ) : $key;
 
86
 
 
87
  $all_settings = edd_get_registered_settings();
88
 
89
+ // Remove tabs that don't have settings fields.
90
+ foreach ( array_keys( $settings_tabs ) as $settings_tab ) {
91
+ if ( empty( $all_settings[ $settings_tab ] ) ) {
92
+ unset( $settings_tabs[ $settings_tab ] );
93
+ }
94
+ }
95
+
96
  // Let's verify we have a 'main' section to show
97
  $has_main_settings = true;
98
  if ( empty( $all_settings[ $active_tab ]['main'] ) ) {
112
  }
113
 
114
  $override = false;
115
+ // Unset 'main' if it's empty and default to the first non-empty if it's the chosen section
116
  if ( false === $has_main_settings ) {
117
  unset( $sections['main'] );
118
 
133
  <h1><?php esc_html_e( 'Settings', 'easy-digital-downloads' ); ?></h1>
134
  <h2 class="nav-tab-wrapper">
135
  <?php
136
+ foreach ( $settings_tabs as $tab_id => $tab_name ) {
137
  $tab_url = add_query_arg( array(
138
  'settings-updated' => false,
139
  'tab' => $tab_id,
236
  * @return string
237
  */
238
  function edd_options_sidebar() {
 
239
  // Get settings tab and section info
240
  $active_tab = isset( $_GET['tab'] ) ? sanitize_text_field( $_GET['tab'] ) : 'general';
241
  $active_tab = array_key_exists( $active_tab, edd_get_settings_tabs() ) ? $active_tab : 'general';
includes/admin/settings/register-settings.php CHANGED
@@ -488,6 +488,14 @@ function edd_get_registered_settings() {
488
  'desc' => __( 'Check this to force users to be redirected to the secure checkout page. You must have an SSL certificate installed to use this option.', 'easy-digital-downloads' ),
489
  'type' => 'checkbox',
490
  ),
 
 
 
 
 
 
 
 
491
  'logged_in_only' => array(
492
  'id' => 'logged_in_only',
493
  'name' => __( 'Require Login', 'easy-digital-downloads' ),
@@ -509,12 +517,6 @@ function edd_get_registered_settings() {
509
  'none' => __( 'None', 'easy-digital-downloads' ),
510
  ),
511
  ),
512
- 'allow_multiple_discounts' => array(
513
- 'id' => 'allow_multiple_discounts',
514
- 'name' => __('Multiple Discounts','easy-digital-downloads' ),
515
- 'desc' => __('Allow customers to use multiple discounts on the same purchase?','easy-digital-downloads' ),
516
- 'type' => 'checkbox',
517
- ),
518
  'enable_cart_saving' => array(
519
  'id' => 'enable_cart_saving',
520
  'name' => __( 'Enable Cart Saving', 'easy-digital-downloads' ),
@@ -568,28 +570,6 @@ function edd_get_registered_settings() {
568
  'desc' => '',
569
  'type' => 'hook',
570
  ),
571
- 'sendwp_header' => array(
572
- 'id' => 'sendwp_header',
573
- 'name' => '<strong>' . __( 'SendWP', 'easy-digital-downloads' ) . '</strong>',
574
- 'type' => 'header',
575
- ),
576
- 'sendwp' => array(
577
- 'id' => 'sendwp',
578
- 'name' => __( 'Deliverability settings', 'easy-digital-downloads' ),
579
- 'desc' => '',
580
- 'type' => 'sendwp',
581
- ),
582
- 'recapture_header' => array(
583
- 'id' => 'recapture_header',
584
- 'name' => '<strong>' . __( 'Recapture', 'easy-digital-downloads' ) . '</strong>',
585
- 'type' => 'header',
586
- ),
587
- 'recapture' => array(
588
- 'id' => 'recapture',
589
- 'name' => __( 'Abandoned cart recovery', 'easy-digital-downloads' ),
590
- 'desc' => '',
591
- 'type' => 'recapture',
592
- ),
593
  ),
594
  'purchase_receipts' => array(
595
  'purchase_receipt_email_settings' => array(
@@ -658,6 +638,25 @@ function edd_get_registered_settings() {
658
  ),
659
  )
660
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
661
  /** Styles Settings */
662
  'styles' => apply_filters('edd_settings_styles',
663
  array(
@@ -772,14 +771,6 @@ function edd_get_registered_settings() {
772
  'misc' => apply_filters('edd_settings_misc',
773
  array(
774
  'main' => array(
775
- 'redirect_on_add' => array(
776
- 'id' => 'redirect_on_add',
777
- 'name' => __( 'Redirect to Checkout', 'easy-digital-downloads' ),
778
- 'desc' => __( 'Immediately redirect to checkout after adding an item to the cart?', 'easy-digital-downloads' ),
779
- 'type' => 'checkbox',
780
- 'tooltip_title' => __( 'Redirect to Checkout', 'easy-digital-downloads' ),
781
- 'tooltip_desc' => __( 'When enabled, once an item has been added to the cart, the customer will be redirected directly to your checkout page. This is useful for stores that sell single items.', 'easy-digital-downloads' ),
782
- ),
783
  'item_quantities' => array(
784
  'id' => 'item_quantities',
785
  'name' => __('Cart Item Quantities','easy-digital-downloads' ),
@@ -1360,30 +1351,23 @@ function edd_sanitize_html_class( $class = '' ) {
1360
  * Retrieve settings tabs
1361
  *
1362
  * @since 1.8
 
1363
  * @return array $tabs
1364
  */
1365
  function edd_get_settings_tabs() {
1366
 
1367
- $settings = edd_get_registered_settings();
1368
-
1369
- $tabs = array();
1370
- $tabs['general'] = __( 'General', 'easy-digital-downloads' );
1371
- $tabs['gateways'] = __( 'Payments', 'easy-digital-downloads' );
1372
- $tabs['emails'] = __( 'Emails', 'easy-digital-downloads' );
1373
- $tabs['styles'] = __( 'Styles', 'easy-digital-downloads' );
1374
- $tabs['taxes'] = __( 'Taxes', 'easy-digital-downloads' );
1375
- $tabs['privacy'] = __( 'Privacy', 'easy-digital-downloads' );
1376
-
1377
- if( ! empty( $settings['extensions'] ) ) {
1378
- $tabs['extensions'] = __( 'Extensions', 'easy-digital-downloads' );
1379
- }
1380
- if( ! empty( $settings['licenses'] ) ) {
1381
- $tabs['licenses'] = __( 'Licenses', 'easy-digital-downloads' );
1382
- }
1383
-
1384
- $tabs['misc'] = __( 'Misc', 'easy-digital-downloads' );
1385
-
1386
- return apply_filters( 'edd_settings_tabs', $tabs );
1387
  }
1388
 
1389
  /**
@@ -1437,6 +1421,9 @@ function edd_get_registered_settings_sections() {
1437
  'purchase_receipts' => __( 'Purchase Receipts', 'easy-digital-downloads' ),
1438
  'sale_notifications' => __( 'New Sale Notifications', 'easy-digital-downloads' ),
1439
  ) ),
 
 
 
1440
  'styles' => apply_filters( 'edd_settings_sections_styles', array(
1441
  'main' => __( 'General', 'easy-digital-downloads' ),
1442
  ) ),
@@ -2160,63 +2147,6 @@ function edd_shop_states_callback($args) {
2160
  echo apply_filters( 'edd_after_setting_output', $html, $args );
2161
  }
2162
 
2163
- /**
2164
- * SendWP Callback
2165
- *
2166
- * Renders SendWP Settings
2167
- *
2168
- * @since 2.9.15
2169
- * @param array $args Arguments passed by the setting
2170
- * @return void
2171
- */
2172
- function edd_sendwp_callback($args) {
2173
-
2174
- // Connection status partial label based on the state of the SendWP email sending setting (Tools -> SendWP)
2175
- $connected = '<a href="https://app.sendwp.com/dashboard" target="_blank" rel="noopener noreferrer">';
2176
- $connected .= __( 'Access your SendWP account', 'easy-digital-downloads' );
2177
- $connected .= '</a>.';
2178
-
2179
- $disconnected = sprintf(
2180
- __( '<em><strong>Note:</strong> Email sending is currently disabled. <a href="' . admin_url( '/tools.php?page=sendwp' ) . '">Click here</a> to enable it.</em>', 'easy-digital-downloads' )
2181
- );
2182
-
2183
- // Checks if SendWP is connected
2184
- $client_connected = function_exists( 'sendwp_client_connected' ) && sendwp_client_connected() ? true : false;
2185
-
2186
- // Checks if email sending is enabled in SendWP
2187
- $forwarding_enabled = function_exists( 'sendwp_forwarding_enabled' ) && sendwp_forwarding_enabled() ? true : false;
2188
-
2189
- ob_start();
2190
-
2191
- echo $args['desc'];
2192
-
2193
- // Output the appropriate button and label based on connection status
2194
- if( $client_connected ) :
2195
- ?>
2196
- <div class="inline notice notice-success">
2197
- <p><?php _e( 'SendWP plugin activated.', 'easy-digital-downloads' ); ?> <?php echo $forwarding_enabled ? $connected : $disconnected ; ?></p>
2198
-
2199
- <p>
2200
- <button id="edd-sendwp-disconnect" class="button"><?php _e( 'Disconnect SendWP', 'easy-digital-downloads' ); ?></button>
2201
- </p>
2202
- </div>
2203
- <?php
2204
- else :
2205
- ?>
2206
- <p>
2207
- <?php _e( 'We recommend SendWP to ensure quick and reliable delivery of all emails sent from your store, such as purchase receipts, subscription renewal reminders, password resets, and more.', 'easy-digital-downloads' ); ?> <?php printf( __( '%sLearn more%s', 'easy-digital-downloads' ), '<a href="https://sendwp.com/" target="_blank" rel="noopener noreferrer">', '</a>' ); ?>
2208
- </p>
2209
- <p>
2210
- <button type="button" id="edd-sendwp-connect" class="button button-primary"><?php esc_html_e( 'Connect with SendWP', 'easy-digital-downloads' ); ?>
2211
- </button>
2212
- </p>
2213
-
2214
- <?php
2215
- endif;
2216
-
2217
- echo ob_get_clean();
2218
- }
2219
-
2220
  /**
2221
  * Recapture Callback
2222
  *
@@ -2540,9 +2470,8 @@ if ( ! function_exists( 'edd_license_key_callback' ) ) {
2540
  } elseif( $expiration > $now && $expiration - $now < ( DAY_IN_SECONDS * 30 ) ) {
2541
 
2542
  $messages[] = sprintf(
2543
- __( 'Your license key expires soon! It expires on %s. <a href="%s" target="_blank">Renew your license key</a>.', 'easy-digital-downloads' ),
2544
- date_i18n( get_option( 'date_format' ), strtotime( $license->expires, current_time( 'timestamp' ) ) ),
2545
- 'https://easydigitaldownloads.com/checkout/?edd_license_key=' . $value . '&utm_campaign=admin&utm_source=licenses&utm_medium=renew'
2546
  );
2547
 
2548
  $license_status = 'license-expires-soon-notice';
@@ -2580,7 +2509,7 @@ if ( ! function_exists( 'edd_license_key_callback' ) ) {
2580
  $size = ( isset( $args['size'] ) && ! is_null( $args['size'] ) ) ? $args['size'] : 'regular';
2581
  $html = '<input type="password" autocomplete="off" class="' . sanitize_html_class( $size ) . '-text" id="edd_settings[' . edd_sanitize_key( $args['id'] ) . ']" name="edd_settings[' . edd_sanitize_key( $args['id'] ) . ']" value="' . esc_attr( $value ) . '"/>';
2582
 
2583
- if ( ( is_object( $license ) && 'valid' == $license->license ) || 'valid' == $license ) {
2584
  $html .= '<input type="submit" class="button-secondary" name="' . $args['id'] . '_deactivate" value="' . __( 'Deactivate License', 'easy-digital-downloads' ) . '"/>';
2585
  }
2586
 
@@ -2636,28 +2565,3 @@ function edd_add_setting_tooltip( $html, $args ) {
2636
  return $html;
2637
  }
2638
  add_filter( 'edd_after_setting_output', 'edd_add_setting_tooltip', 10, 2 );
2639
-
2640
-
2641
- /**
2642
- * Gives us an area to ensure known compatibility issues with our settings organization by giving us a hook to manage
2643
- * and alter hooks and filters that are being run against our primary settings array.
2644
- *
2645
- * @since 2.11.3
2646
- */
2647
-
2648
- add_action(
2649
- 'plugins_loaded',
2650
- function() {
2651
-
2652
- /**
2653
- * Ensures compatibility with EDD 2.11.3 and Recurring payments prior to Recurring being released to move
2654
- * settings for 'checkout' from 'misc' to 'payments'.
2655
- */
2656
- if ( function_exists( 'edd_recurring_guest_checkout_description' ) && false !== has_filter( 'edd_settings_misc', 'edd_recurring_guest_checkout_description' ) ) {
2657
- remove_filter( 'edd_settings_misc', 'edd_recurring_guest_checkout_description', 10 );
2658
- add_filter( 'edd_settings_gateways', 'edd_recurring_guest_checkout_description', 10 );
2659
- }
2660
-
2661
- },
2662
- 99
2663
- );
488
  'desc' => __( 'Check this to force users to be redirected to the secure checkout page. You must have an SSL certificate installed to use this option.', 'easy-digital-downloads' ),
489
  'type' => 'checkbox',
490
  ),
491
+ 'redirect_on_add' => array(
492
+ 'id' => 'redirect_on_add',
493
+ 'name' => __( 'Redirect to Checkout', 'easy-digital-downloads' ),
494
+ 'desc' => __( 'Immediately redirect to checkout after adding an item to the cart?', 'easy-digital-downloads' ),
495
+ 'type' => 'checkbox',
496
+ 'tooltip_title' => __( 'Redirect to Checkout', 'easy-digital-downloads' ),
497
+ 'tooltip_desc' => __( 'When enabled, once an item has been added to the cart, the customer will be redirected directly to your checkout page. This is useful for stores that sell single items.', 'easy-digital-downloads' ),
498
+ ),
499
  'logged_in_only' => array(
500
  'id' => 'logged_in_only',
501
  'name' => __( 'Require Login', 'easy-digital-downloads' ),
517
  'none' => __( 'None', 'easy-digital-downloads' ),
518
  ),
519
  ),
 
 
 
 
 
 
520
  'enable_cart_saving' => array(
521
  'id' => 'enable_cart_saving',
522
  'name' => __( 'Enable Cart Saving', 'easy-digital-downloads' ),
570
  'desc' => '',
571
  'type' => 'hook',
572
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
573
  ),
574
  'purchase_receipts' => array(
575
  'purchase_receipt_email_settings' => array(
638
  ),
639
  )
640
  ),
641
+ 'marketing' => apply_filters(
642
+ 'edd_settings_marketing',
643
+ array(
644
+ 'main' => array(
645
+ 'recapture' => array(
646
+ 'id' => 'recapture',
647
+ 'name' => __( 'Abandoned Cart Recovery', 'easy-digital-downloads' ),
648
+ 'desc' => '',
649
+ 'type' => 'recapture',
650
+ ),
651
+ 'allow_multiple_discounts' => array(
652
+ 'id' => 'allow_multiple_discounts',
653
+ 'name' => __( 'Multiple Discounts', 'easy-digital-downloads' ),
654
+ 'desc' => __( 'Allow customers to use multiple discounts on the same purchase?', 'easy-digital-downloads' ),
655
+ 'type' => 'checkbox',
656
+ ),
657
+ ),
658
+ )
659
+ ),
660
  /** Styles Settings */
661
  'styles' => apply_filters('edd_settings_styles',
662
  array(
771
  'misc' => apply_filters('edd_settings_misc',
772
  array(
773
  'main' => array(
 
 
 
 
 
 
 
 
774
  'item_quantities' => array(
775
  'id' => 'item_quantities',
776
  'name' => __('Cart Item Quantities','easy-digital-downloads' ),
1351
  * Retrieve settings tabs
1352
  *
1353
  * @since 1.8
1354
+ * @since 2.11.4 Any tabs with no registered settings are filtered out in `edd_options_page`.
1355
  * @return array $tabs
1356
  */
1357
  function edd_get_settings_tabs() {
1358
 
1359
+ return apply_filters( 'edd_settings_tabs', array(
1360
+ 'general' => __( 'General', 'easy-digital-downloads' ),
1361
+ 'gateways' => __( 'Payments', 'easy-digital-downloads' ),
1362
+ 'emails' => __( 'Emails', 'easy-digital-downloads' ),
1363
+ 'marketing' => __( 'Marketing', 'easy-digital-downloads' ),
1364
+ 'styles' => __( 'Styles', 'easy-digital-downloads' ),
1365
+ 'taxes' => __( 'Taxes', 'easy-digital-downloads' ),
1366
+ 'privacy' => __( 'Privacy', 'easy-digital-downloads' ),
1367
+ 'extensions' => __( 'Extensions', 'easy-digital-downloads' ),
1368
+ 'licenses' => __( 'Licenses', 'easy-digital-downloads' ),
1369
+ 'misc' => __( 'Misc', 'easy-digital-downloads' ),
1370
+ ) );
 
 
 
 
 
 
 
 
1371
  }
1372
 
1373
  /**
1421
  'purchase_receipts' => __( 'Purchase Receipts', 'easy-digital-downloads' ),
1422
  'sale_notifications' => __( 'New Sale Notifications', 'easy-digital-downloads' ),
1423
  ) ),
1424
+ 'marketing' => apply_filters( 'edd_settings_sections_marketing', array(
1425
+ 'main' => __( 'General', 'easy-digital-downloads' ),
1426
+ ) ),
1427
  'styles' => apply_filters( 'edd_settings_sections_styles', array(
1428
  'main' => __( 'General', 'easy-digital-downloads' ),
1429
  ) ),
2147
  echo apply_filters( 'edd_after_setting_output', $html, $args );
2148
  }
2149
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2150
  /**
2151
  * Recapture Callback
2152
  *
2470
  } elseif( $expiration > $now && $expiration - $now < ( DAY_IN_SECONDS * 30 ) ) {
2471
 
2472
  $messages[] = sprintf(
2473
+ __( 'Your license key expires soon! It expires on %s.', 'easy-digital-downloads' ),
2474
+ date_i18n( get_option( 'date_format' ), strtotime( $license->expires, current_time( 'timestamp' ) ) )
 
2475
  );
2476
 
2477
  $license_status = 'license-expires-soon-notice';
2509
  $size = ( isset( $args['size'] ) && ! is_null( $args['size'] ) ) ? $args['size'] : 'regular';
2510
  $html = '<input type="password" autocomplete="off" class="' . sanitize_html_class( $size ) . '-text" id="edd_settings[' . edd_sanitize_key( $args['id'] ) . ']" name="edd_settings[' . edd_sanitize_key( $args['id'] ) . ']" value="' . esc_attr( $value ) . '"/>';
2511
 
2512
+ if ( ( is_object( $license ) && ! empty( $license->license ) && 'valid' == $license->license ) || 'valid' == $license ) {
2513
  $html .= '<input type="submit" class="button-secondary" name="' . $args['id'] . '_deactivate" value="' . __( 'Deactivate License', 'easy-digital-downloads' ) . '"/>';
2514
  }
2515
 
2565
  return $html;
2566
  }
2567
  add_filter( 'edd_after_setting_output', 'edd_add_setting_tooltip', 10, 2 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/admin/settings/settings-compatibility.php ADDED
@@ -0,0 +1,164 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Settings Compatibility Functions
4
+ *
5
+ * For managing settings compatibility in a reorganized settings structure.
6
+ *
7
+ * @package EDD
8
+ * @subpackage Settings Compatibility
9
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
10
+ * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
11
+ * @since 2.11.4
12
+ */
13
+
14
+ // Exit if accessed directly
15
+ if ( ! defined( 'ABSPATH' ) ) {
16
+ exit;
17
+ }
18
+
19
+ /**
20
+ * Gives us an area to ensure known compatibility issues with our settings organization by giving us a hook to manage
21
+ * and alter hooks and filters that are being run against our primary settings array.
22
+ *
23
+ * @since 2.11.3
24
+ */
25
+ add_action(
26
+ 'plugins_loaded',
27
+ function() {
28
+
29
+ /**
30
+ * Ensures compatibility with EDD 2.11.3 and Recurring payments prior to Recurring being released to move
31
+ * settings for 'checkout' from 'misc' to 'payments'.
32
+ */
33
+ if ( function_exists( 'edd_recurring_guest_checkout_description' ) && false !== has_filter( 'edd_settings_misc', 'edd_recurring_guest_checkout_description' ) ) {
34
+ remove_filter( 'edd_settings_misc', 'edd_recurring_guest_checkout_description', 10 );
35
+ add_filter( 'edd_settings_gateways', 'edd_recurring_guest_checkout_description', 10 );
36
+ }
37
+
38
+ /**
39
+ * Ensures compatibility with EDD 2.11.4 and Recurring payments prior to Recurring being released to move
40
+ * settings for all extension settings to 'payments'.
41
+ */
42
+ if ( function_exists( 'edd_recurring_settings_section' ) && false !== has_filter( 'edd_settings_sections_extensions', 'edd_recurring_settings_section' ) ) {
43
+ remove_filter( 'edd_settings_sections_extensions', 'edd_recurring_settings_section' );
44
+ add_filter( 'edd_settings_sections_gateways', 'edd_recurring_settings_section' );
45
+ remove_filter( 'edd_settings_extensions', 'edd_recurring_settings' );
46
+ add_filter( 'edd_settings_gateways', 'edd_recurring_settings' );
47
+ }
48
+
49
+ /**
50
+ * Ensures compatibility with EDD 2.11.4 and Reviews' settings being in the extensions section.
51
+ */
52
+ if ( function_exists( 'edd_reviews' ) ) {
53
+ $reviews = edd_reviews();
54
+ if ( false !== has_filter( 'edd_settings_sections_extensions', array( $reviews, 'register_reviews_section' ) ) ) {
55
+ remove_filter( 'edd_settings_sections_extensions', array( $reviews, 'register_reviews_section' ) );
56
+ add_filter( 'edd_settings_sections_marketing', array( $reviews, 'register_reviews_section' ) );
57
+ remove_filter( 'edd_settings_extensions', array( $reviews, 'misc_settings' ) );
58
+ add_filter( 'edd_settings_marketing', array( $reviews, 'misc_settings' ) );
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Move the Free Downloads settings to the Marketing section (EDD 2.11.4).
64
+ */
65
+ if ( false !== has_filter( 'edd_settings_sections_extensions', 'edd_free_downloads_add_settings_section' ) ) {
66
+ remove_filter( 'edd_settings_sections_extensions', 'edd_free_downloads_add_settings_section' );
67
+ add_filter( 'edd_settings_sections_marketing', 'edd_free_downloads_add_settings_section' );
68
+ remove_filter( 'edd_settings_extensions', 'edd_free_downloads_add_settings' );
69
+ add_filter( 'edd_settings_marketing', 'edd_free_downloads_add_settings' );
70
+ }
71
+
72
+ /**
73
+ * Move the ActiveCampaign settings to the Marketing section (EDD 2.11.4).
74
+ */
75
+ if ( function_exists( 'edd_activecampaign' ) ) {
76
+ $activecampaign = edd_activecampaign();
77
+ if ( false !== has_filter( 'edd_settings_sections_extensions', array( $activecampaign, 'settings_section' ) ) ) {
78
+ remove_filter( 'edd_settings_sections_extensions', array( $activecampaign, 'settings_section' ) );
79
+ add_filter( 'edd_settings_sections_marketing', array( $activecampaign, 'settings_section' ) );
80
+ remove_filter( 'edd_settings_extensions', array( $activecampaign, 'register_settings' ) );
81
+ add_filter( 'edd_settings_marketing', array( $activecampaign, 'register_settings' ) );
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Move the GetResponse settings to the Marketing section (EDD 2.11.4).
87
+ */
88
+ if ( function_exists( 'edd_getresponse_add_settings_section' ) ) {
89
+ if ( false !== has_filter( 'edd_settings_sections_extensions', 'edd_getresponse_add_settings_section' ) ) {
90
+ $getresponse = new EDD_GetResponse_Newsletter();
91
+ remove_filter( 'edd_settings_sections_extensions', 'edd_getresponse_add_settings_section' );
92
+ add_filter( 'edd_settings_sections_marketing', 'edd_getresponse_add_settings_section' );
93
+ remove_filter( 'edd_settings_extensions', 'edd_getresponse_add_settings' );
94
+ add_filter( 'edd_settings_marketing', 'edd_getresponse_add_settings' );
95
+ remove_filter( 'edd_settings_extensions_sanitize', array( $getresponse, 'save_settings' ) );
96
+ add_filter( 'edd_settings_marketing_sanitize', array( $getresponse, 'save_settings' ) );
97
+ remove_filter( 'edd_settings_extensions-getresponse_sanitize', array( $getresponse, 'save_settings' ) );
98
+ add_filter( 'edd_settings_marketing-getresponse_sanitize', array( $getresponse, 'save_settings' ) );
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Move the Campaign Monitor settings to the Marketing section (EDD 2.11.4).
104
+ */
105
+ if ( function_exists( 'eddcp_settings_section' ) && false !== has_filter( 'edd_settings_sections_extensions', 'eddcp_settings_section' ) ) {
106
+ remove_filter( 'edd_settings_sections_extensions', 'eddcp_settings_section' );
107
+ add_filter( 'edd_settings_sections_marketing', 'eddcp_settings_section' );
108
+ remove_filter( 'edd_settings_extensions', 'eddcp_add_settings' );
109
+ add_filter( 'edd_settings_marketing', 'eddcp_add_settings' );
110
+ }
111
+
112
+ /**
113
+ * Move the ConvertKit settings to the Marketing section (EDD 2.11.4).
114
+ */
115
+ if ( class_exists( 'EDD_ConvertKit' ) && method_exists( 'EDD_ConvertKit', 'instance' ) ) {
116
+ $convertkit = EDD_ConvertKit::instance();
117
+ if ( false !== has_filter( 'edd_settings_sections_extensions', array( $convertkit, 'subsection' ) ) ) {
118
+ remove_filter( 'edd_settings_sections_extensions', array( $convertkit, 'subsection' ) );
119
+ add_filter( 'edd_settings_sections_marketing', array( $convertkit, 'subsection' ) );
120
+ remove_filter( 'edd_settings_extensions_sanitize', array( $convertkit, 'save_settings' ) );
121
+ add_filter( 'edd_settings_marketing_sanitize', array( $convertkit, 'save_settings' ) );
122
+ remove_filter( 'edd_settings_extensions', array( $convertkit, 'settings' ) );
123
+ add_filter( 'edd_settings_marketing', array( $convertkit, 'settings' ) );
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Move the AWeber settings to the Marketing section (EDD 2.11.4).
129
+ */
130
+ if ( class_exists( 'EDD_Aweber' ) && method_exists( 'EDD_Aweber', 'instance' ) ) {
131
+ $aweber = EDD_Aweber::instance();
132
+ if ( false !== has_filter( 'edd_settings_sections_extensions', array( $aweber, 'subsection' ) ) ) {
133
+ remove_filter( 'edd_settings_sections_extensions', array( $aweber, 'subsection' ) );
134
+ add_filter( 'edd_settings_sections_marketing', array( $aweber, 'subsection' ) );
135
+ remove_filter( 'edd_settings_extensions', array( $aweber, 'settings' ) );
136
+ add_filter( 'edd_settings_marketing', array( $aweber, 'settings' ) );
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Move the MailPoet settings to the Marketing section (EDD 2.11.4).
142
+ */
143
+ if ( class_exists( 'EDD_MailPoet' ) && method_exists( 'EDD_MailPoet', 'instance' ) ) {
144
+ $mailpoet = EDD_MailPoet::instance();
145
+ if ( false !== has_filter( 'edd_settings_sections_extensions', array( $mailpoet, 'subsection' ) ) ) {
146
+ remove_filter( 'edd_settings_sections_extensions', array( $mailpoet, 'subsection' ) );
147
+ add_filter( 'edd_settings_sections_marketing', array( $mailpoet, 'subsection' ) );
148
+ remove_filter( 'edd_settings_extensions', array( $mailpoet, 'settings' ) );
149
+ add_filter( 'edd_settings_marketing', array( $mailpoet, 'settings' ) );
150
+ }
151
+ }
152
+
153
+ /**
154
+ * Move the Invoices settings to the Payments section (EDD 2.11.4).
155
+ */
156
+ if ( false !== has_filter( 'edd_settings_sections_extensions', 'edd_invoices_register_settings_section' ) ) {
157
+ remove_filter( 'edd_settings_sections_extensions', 'edd_invoices_register_settings_section' );
158
+ add_filter( 'edd_settings_sections_gateways', 'edd_invoices_register_settings_section', 10 );
159
+ remove_filter( 'edd_settings_extensions', 'edd_invoices_register_settings', 1 );
160
+ add_filter( 'edd_settings_gateways', 'edd_invoices_register_settings', 1 );
161
+ }
162
+ },
163
+ 99
164
+ );
includes/admin/upload-functions.php CHANGED
@@ -150,7 +150,7 @@ function edd_get_htaccess_rules( $method = false ) {
150
  case 'direct' :
151
  default :
152
  // Prevent directory browsing and direct access to all files, except images (they must be allowed for featured images / thumbnails)
153
- $allowed_filetypes = apply_filters( 'edd_protected_directory_allowed_filetypes', array( 'jpg', 'jpeg', 'png', 'gif', 'mp3', 'ogg' ) );
154
  $rules = "Options -Indexes\n";
155
  $rules .= "deny from all\n";
156
  $rules .= "<FilesMatch '\.(" . implode( '|', $allowed_filetypes ) . ")$'>\n";
150
  case 'direct' :
151
  default :
152
  // Prevent directory browsing and direct access to all files, except images (they must be allowed for featured images / thumbnails)
153
+ $allowed_filetypes = apply_filters( 'edd_protected_directory_allowed_filetypes', array( 'jpg', 'jpeg', 'png', 'gif', 'mp3', 'ogg', 'webp' ) );
154
  $rules = "Options -Indexes\n";
155
  $rules .= "deny from all\n";
156
  $rules .= "<FilesMatch '\.(" . implode( '|', $allowed_filetypes ) . ")$'>\n";
includes/admin/views/notifications.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Displays a list of notifications.
4
+ *
5
+ * @package easy-digital-downloads
6
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
7
+ * @license GPL2+
8
+ * @since 2.11.4
9
+ */
10
+ ?>
11
+ <div
12
+ id="edd-notifications"
13
+ class="edd-hidden"
14
+ x-data
15
+ x-init="function() { $el.classList.remove( 'edd-hidden' ) }"
16
+ >
17
+ <div
18
+ class="edd-overlay"
19
+ x-show="$store.eddNotifications.isPanelOpen"
20
+ x-on:click="$store.eddNotifications.closePanel()"
21
+ ></div>
22
+
23
+ <div
24
+ id="edd-notifications-panel"
25
+ x-show="$store.eddNotifications.isPanelOpen"
26
+ x-transition:enter-start="edd-slide-in"
27
+ x-transition:leave-end="edd-slide-in"
28
+ >
29
+ <div id="edd-notifications-header" tabindex="-1">
30
+ <h3>
31
+ <?php
32
+ echo wp_kses(
33
+ sprintf(
34
+ /* Translators: %s - number of notifications */
35
+ __( '(%s) New Notifications', 'easy-digital-downloads' ),
36
+ '<span x-text="$store.eddNotifications.numberActiveNotifications"></span>'
37
+ ),
38
+ array( 'span' => array( 'x-text' => true ) )
39
+ );
40
+ ?>
41
+ </h3>
42
+
43
+ <button
44
+ type="button"
45
+ class="edd-close"
46
+ x-on:click="$store.eddNotifications.closePanel()"
47
+ >
48
+ <span class="dashicons dashicons-no-alt"></span>
49
+ <span class="screen-reader-text"><?php esc_html_e( 'Close panel', 'easy-digital-downloads' ); ?></span>
50
+ </button>
51
+ </div>
52
+
53
+ <div id="edd-notifications-body">
54
+ <template x-if="$store.eddNotifications.notificationsLoaded && $store.eddNotifications.activeNotifications.length">
55
+ <template x-for="(notification, index) in $store.eddNotifications.activeNotifications" :key="notification.id">
56
+ <div class="edd-notification">
57
+ <div class="edd-notification--icon" :class="'edd-notification--icon-' + notification.type">
58
+ <span class="dashicons" :class="'dashicons-' + notification.icon_name"></span>
59
+ </div>
60
+
61
+ <div class="edd-notification--body">
62
+ <div class="edd-notification--header">
63
+ <h4 class="edd-notification--title" x-text="notification.title"></h4>
64
+
65
+ <div class="edd-notification--date" x-text="notification.relative_date"></div>
66
+ </div>
67
+
68
+ <div class="edd-notification--content" x-html="notification.content"></div>
69
+
70
+ <div class="edd-notification--actions">
71
+ <template x-for="button in notification.buttons">
72
+ <a
73
+ :href="button.url"
74
+ :class="button.type === 'primary' ? 'button button-primary' : 'button button-secondary'"
75
+ target="_blank"
76
+ x-text="button.text"
77
+ ></a>
78
+ </template>
79
+
80
+ <button
81
+ type="button"
82
+ class="edd-notification--dismiss"
83
+ x-on:click="$store.eddNotifications.dismiss( $event, index )"
84
+ >
85
+ <?php esc_html_e( 'Dismiss', 'easy-digital-downloads' ); ?>
86
+ </button>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ </template>
91
+ </template>
92
+
93
+ <template x-if="$store.eddNotifications.notificationsLoaded && ! $store.eddNotifications.activeNotifications.length">
94
+ <div id="edd-notifications-none">
95
+ <?php esc_html_e( 'You have no new notifications.', 'easy-digital-downloads' ); ?>
96
+ </div>
97
+ </template>
98
+
99
+ <template x-if="! $store.eddNotifications.notificationsLoaded">
100
+ <div>
101
+ <?php esc_html_e( 'Loading notifications...', 'easy-digital-downloads' ); ?>
102
+ </div>
103
+ </template>
104
+ </div>
105
+ </div>
106
+ </div>
includes/ajax-functions.php CHANGED
@@ -394,6 +394,13 @@ function edd_ajax_remove_discount() {
394
  'html' => edd_get_cart_discounts_html()
395
  );
396
 
 
 
 
 
 
 
 
397
  wp_send_json( $return );
398
  }
399
  edd_die();
394
  'html' => edd_get_cart_discounts_html()
395
  );
396
 
397
+ /**
398
+ * Allow for custom remove discount code handling.
399
+ *
400
+ * @since 2.11.4
401
+ */
402
+ $return = apply_filters( 'edd_ajax_remove_discount_response', $return );
403
+
404
  wp_send_json( $return );
405
  }
406
  edd_die();
includes/api/v3/Endpoint.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Endpoint for API v3
4
+ *
5
+ * @package easy-digital-downloads
6
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
7
+ * @license GPL2+
8
+ * @since 2.11.4
9
+ */
10
+
11
+ namespace EDD\API\v3;
12
+
13
+ abstract class Endpoint {
14
+
15
+ public static $namespace = 'edd/v3';
16
+
17
+ /**
18
+ * Registers the endpoint(s).
19
+ *
20
+ * @since 2.11.4
21
+ *
22
+ * @return void
23
+ */
24
+ abstract public function register();
25
+
26
+ }
includes/api/v3/Notifications.php ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Notifications API Endpoint
4
+ *
5
+ * @package easy-digital-downloads
6
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
7
+ * @license GPL2+
8
+ * @since 2.11.4
9
+ */
10
+
11
+ namespace EDD\API\v3;
12
+
13
+ use EDD\Models\Notification;
14
+
15
+ class Notifications extends Endpoint {
16
+
17
+ /**
18
+ * Registers the endpoints.
19
+ *
20
+ * @since 2.11.4
21
+ */
22
+ public function register() {
23
+ register_rest_route(
24
+ self::$namespace,
25
+ 'notifications',
26
+ array(
27
+ array(
28
+ 'methods' => \WP_REST_Server::READABLE,
29
+ 'callback' => array( $this, 'listNotifications' ),
30
+ 'permission_callback' => array( $this, 'canViewNotification' ),
31
+ )
32
+ )
33
+ );
34
+
35
+ register_rest_route(
36
+ self::$namespace,
37
+ 'notifications/(?P<id>\d+)',
38
+ array(
39
+ array(
40
+ 'methods' => \WP_REST_Server::DELETABLE,
41
+ 'callback' => array( $this, 'dismissNotification' ),
42
+ 'permission_callback' => array( $this, 'canViewNotification' ),
43
+ 'args' => array(
44
+ 'id' => array(
45
+ 'description' => __( 'ID of the notification.', 'easy-digital-downloads' ),
46
+ 'type' => 'integer',
47
+ 'required' => true,
48
+ 'validate_callback' => function ( $param, $request, $key ) {
49
+ $notification = EDD()->notifications->get( intval( $param ) );
50
+
51
+ return ! empty( $notification );
52
+ },
53
+ 'sanitize_callback' => function ( $param, $request, $key ) {
54
+ return intval( $param );
55
+ }
56
+ )
57
+ ),
58
+ )
59
+ )
60
+ );
61
+ }
62
+
63
+ /**
64
+ * Whether the current user can view (and dismiss) notifications.
65
+ *
66
+ * @since 2.11.4
67
+ *
68
+ * @return bool
69
+ */
70
+ public function canViewNotification() {
71
+ return current_user_can( 'manage_shop_settings' );
72
+ }
73
+
74
+ /**
75
+ * Returns a list of notifications.
76
+ *
77
+ * @since 2.11.4
78
+ *
79
+ * @param \WP_REST_Request $request
80
+ *
81
+ * @return \WP_REST_Response
82
+ */
83
+ public function listNotifications( \WP_REST_Request $request ) {
84
+ $active = array_map( function ( Notification $notification ) {
85
+ return $notification->toArray();
86
+ }, EDD()->notifications->getActiveNotifications() );
87
+
88
+ // @todo At a later date we may want to receive dismissed notifications too.
89
+ /*$dismissed = array_map( function ( Notification $notification ) {
90
+ return $notification->toArray();
91
+ }, EDD()->notifications->getDismissedNotifications() );*/
92
+
93
+ return new \WP_REST_Response( array(
94
+ 'active' => $active,
95
+ //'dismissed' => $dismissed,
96
+ ) );
97
+ }
98
+
99
+ /**
100
+ * Dismisses a single notification.
101
+ *
102
+ * @since 2.11.4
103
+ *
104
+ * @param \WP_REST_Request $request
105
+ *
106
+ * @return \WP_REST_Response
107
+ */
108
+ public function dismissNotification( \WP_REST_Request $request ) {
109
+ $result = EDD()->notifications->update(
110
+ $request->get_param( 'id' ),
111
+ array( 'dismissed' => 1 )
112
+ );
113
+
114
+ if ( ! $result ) {
115
+ return new \WP_REST_Response( array(
116
+ 'error' => __( 'Failed to dismiss notification.', 'easy-digital-downloads' ),
117
+ ), 500 );
118
+ }
119
+
120
+ wp_cache_delete( 'edd_active_notification_count', 'edd_notifications' );
121
+
122
+ return new \WP_REST_Response( null, 204 );
123
+ }
124
+ }
includes/class-edd-cli.php CHANGED
@@ -508,8 +508,9 @@ class EDD_CLI extends WP_CLI_Command {
508
  $error = __( 'Invalid action specified, did you mean', 'easy-digital-downloads' );
509
  }
510
 
511
- if( $error ) {
512
- foreach( $assoc_args as $key => $value ) {
 
513
  $query .= ' --' . $key . '=' . $value;
514
  }
515
 
508
  $error = __( 'Invalid action specified, did you mean', 'easy-digital-downloads' );
509
  }
510
 
511
+ if ( $error ) {
512
+ $query = '';
513
+ foreach ( $assoc_args as $key => $value ) {
514
  $query .= ' --' . $key . '=' . $value;
515
  }
516
 
includes/class-edd-license-handler.php CHANGED
@@ -18,7 +18,7 @@ if ( ! class_exists( 'EDD_License' ) ) :
18
  */
19
  class EDD_License {
20
  private $file;
21
- private $license;
22
  private $item_name;
23
  private $item_id;
24
  private $item_shortname;
@@ -156,11 +156,19 @@ class EDD_License {
156
  return;
157
  }
158
 
 
 
 
 
 
 
 
 
159
  $betas = edd_get_option( 'enabled_betas', array() );
160
 
161
  $args = array(
162
  'version' => $this->version,
163
- 'license' => $this->license,
164
  'author' => $this->author,
165
  'beta' => function_exists( 'edd_extension_has_beta_support' ) && edd_extension_has_beta_support( $this->item_shortname ),
166
  );
@@ -317,7 +325,7 @@ class EDD_License {
317
 
318
  $details = get_option( $this->item_shortname . '_license_active' );
319
 
320
- if ( is_object( $details ) && 'valid' === $details->license ) {
321
  return;
322
  }
323
 
@@ -360,7 +368,12 @@ class EDD_License {
360
  // Decode license data
361
  $license_data = json_decode( wp_remote_retrieve_body( $response ) );
362
 
363
- $this->maybe_set_pass_flag( $this->license, $license_data );
 
 
 
 
 
364
 
365
  update_option( $this->item_shortname . '_license_active', $license_data );
366
 
@@ -504,7 +517,7 @@ class EDD_License {
504
 
505
  $license = get_option( $this->item_shortname . '_license_active' );
506
 
507
- if( is_object( $license ) && 'valid' !== $license->license && empty( $showed_invalid_message ) ) {
508
 
509
  if( empty( $_GET['tab'] ) || 'licenses' !== $_GET['tab'] ) {
510
 
@@ -545,7 +558,7 @@ class EDD_License {
545
 
546
  $license = get_option( $this->item_shortname . '_license_active' );
547
 
548
- if( ( ! is_object( $license ) || 'valid' !== $license->license ) && empty( $showed_imissing_key_message[ $this->item_shortname ] ) ) {
549
 
550
  echo '&nbsp;<strong><a href="' . esc_url( admin_url( 'edit.php?post_type=download&page=edd-settings&tab=licenses' ) ) . '">' . __( 'Enter valid license key for automatic updates.', 'easy-digital-downloads' ) . '</a></strong>';
551
  $showed_imissing_key_message[ $this->item_shortname ] = true;
18
  */
19
  class EDD_License {
20
  private $file;
21
+ public $license;
22
  private $item_name;
23
  private $item_id;
24
  private $item_shortname;
156
  return;
157
  }
158
 
159
+ $license = $this->license;
160
+ // Fall back to the highest license key if one is not saved for this extension.
161
+ if ( empty( $license ) ) {
162
+ $pass_manager = new \EDD\Admin\Pass_Manager();
163
+ if ( $pass_manager->highest_license_key ) {
164
+ $license = $pass_manager->highest_license_key;
165
+ }
166
+ }
167
  $betas = edd_get_option( 'enabled_betas', array() );
168
 
169
  $args = array(
170
  'version' => $this->version,
171
+ 'license' => $license,
172
  'author' => $this->author,
173
  'beta' => function_exists( 'edd_extension_has_beta_support' ) && edd_extension_has_beta_support( $this->item_shortname ),
174
  );
325
 
326
  $details = get_option( $this->item_shortname . '_license_active' );
327
 
328
+ if ( is_object( $details ) && ! empty( $details->license ) && 'valid' === $details->license ) {
329
  return;
330
  }
331
 
368
  // Decode license data
369
  $license_data = json_decode( wp_remote_retrieve_body( $response ) );
370
 
371
+ $this->maybe_set_pass_flag( $license, $license_data );
372
+
373
+ // Clear the option for licensed extensions to force regeneration.
374
+ if ( ! empty( $api_data->license ) && 'valid' === $api_data->license ) {
375
+ delete_option( 'edd_licensed_extensions' );
376
+ }
377
 
378
  update_option( $this->item_shortname . '_license_active', $license_data );
379
 
517
 
518
  $license = get_option( $this->item_shortname . '_license_active' );
519
 
520
+ if( is_object( $license ) && ( empty( $license->license ) || 'valid' !== $license->license ) && empty( $showed_invalid_message ) ) {
521
 
522
  if( empty( $_GET['tab'] ) || 'licenses' !== $_GET['tab'] ) {
523
 
558
 
559
  $license = get_option( $this->item_shortname . '_license_active' );
560
 
561
+ if ( ( ! is_object( $license ) || empty( $license->license ) || 'valid' !== $license->license ) && empty( $showed_imissing_key_message[ $this->item_shortname ] ) ) {
562
 
563
  echo '&nbsp;<strong><a href="' . esc_url( admin_url( 'edit.php?post_type=download&page=edd-settings&tab=licenses' ) ) . '">' . __( 'Enter valid license key for automatic updates.', 'easy-digital-downloads' ) . '</a></strong>';
564
  $showed_imissing_key_message[ $this->item_shortname ] = true;
includes/database/NotificationsDB.php ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Notifications Database
4
+ *
5
+ * @package easy-digital-downloads
6
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
7
+ * @license GPL2+
8
+ * @since 2.11.4
9
+ */
10
+
11
+ namespace EDD\Database;
12
+
13
+ use EDD\Models\Notification;
14
+ use EDD\Utils\EnvironmentChecker;
15
+ use EDD\Utils\NotificationImporter;
16
+
17
+ class NotificationsDB extends \EDD_DB {
18
+
19
+ /**
20
+ * Constructor
21
+ */
22
+ public function __construct() {
23
+ global $wpdb;
24
+
25
+ $this->table_name = $wpdb->prefix . 'edd_notifications';
26
+ $this->primary_key = 'id';
27
+ $this->version = '1.0';
28
+
29
+ add_action( 'edd_daily_scheduled_events', array( $this, 'schedule_daily_notification_checks' ) );
30
+
31
+ $db_version = get_option( "{$this->table_name}_db_version" );
32
+ if ( version_compare( $db_version, $this->version, '>=' ) ) {
33
+ return;
34
+ }
35
+ $this->create_table();
36
+ }
37
+
38
+ /**
39
+ * Add a cron event to check for new notifications.
40
+ *
41
+ * @since 2.11.4
42
+ */
43
+ public static function schedule_daily_notification_checks() {
44
+ $importer = new NotificationImporter();
45
+ $importer->run();
46
+ }
47
+
48
+ /**
49
+ * Columns and their formats.
50
+ *
51
+ * @since 2.11.4
52
+ *
53
+ * @return string[]
54
+ */
55
+ public function get_columns() {
56
+ return array(
57
+ 'id' => '%d',
58
+ 'remote_id' => '%d',
59
+ 'title' => '%s',
60
+ 'content' => '%s',
61
+ 'buttons' => '%s',
62
+ 'type' => '%s',
63
+ 'conditions' => '%s',
64
+ 'start' => '%s',
65
+ 'end' => '%s',
66
+ 'dismissed' => '%d',
67
+ 'date_created' => '%s',
68
+ 'date_updated' => '%s',
69
+ );
70
+ }
71
+
72
+ /**
73
+ * Let MySQL handle most of the defaults.
74
+ * We just set the dates here to ensure they get saved in UTC.
75
+ *
76
+ * @since 2.11.4
77
+ *
78
+ * @return array
79
+ */
80
+ public function get_column_defaults() {
81
+ return array(
82
+ 'date_created' => gmdate( 'Y-m-d H:i:s' ),
83
+ 'date_updated' => gmdate( 'Y-m-d H:i:s' ),
84
+ );
85
+ }
86
+
87
+ /**
88
+ * JSON-encodes any relevant columns.
89
+ *
90
+ * @since 2.11.4
91
+ *
92
+ * @param array $data
93
+ *
94
+ * @return array
95
+ */
96
+ protected function maybeJsonEncode( $data ) {
97
+ $jsonColumns = array( 'buttons', 'conditions' );
98
+
99
+ foreach ( $jsonColumns as $column ) {
100
+ if ( ! empty( $data[ $column ] ) && is_array( $data[ $column ] ) ) {
101
+ $data[ $column ] = json_encode( $data[ $column ] );
102
+ }
103
+ }
104
+
105
+ return $data;
106
+ }
107
+
108
+ /**
109
+ * Inserts a new notification.
110
+ *
111
+ * @since 2.11.4
112
+ *
113
+ * @param array $data
114
+ * @param string $type
115
+ *
116
+ * @return int
117
+ */
118
+ public function insert( $data, $type = 'notification' ) {
119
+ $result = parent::insert( $this->maybeJsonEncode( $data ), $type );
120
+
121
+ wp_cache_delete( 'edd_active_notification_count', 'edd_notifications' );
122
+
123
+ return $result;
124
+ }
125
+
126
+ /**
127
+ * Updates an existing notification.
128
+ *
129
+ * @since 2.11.4
130
+ *
131
+ * @param int $row_id
132
+ * @param array $data
133
+ * @param string $where
134
+ *
135
+ * @return bool
136
+ */
137
+ public function update( $row_id, $data = array(), $where = '' ) {
138
+ return parent::update( $row_id, $this->maybeJsonEncode( $data ), $where );
139
+ }
140
+
141
+ /**
142
+ * Returns all notifications that have not been dismissed and should be
143
+ * displayed on this site.
144
+ *
145
+ * @since 2.11.4
146
+ *
147
+ * @param bool $conditionsOnly If set to true, then only the `conditions` column is retrieved
148
+ * for each notification.
149
+ *
150
+ * @return Notification[]
151
+ */
152
+ public function getActiveNotifications( $conditionsOnly = false ) {
153
+ global $wpdb;
154
+
155
+ $environmentChecker = new EnvironmentChecker();
156
+ $notifications = $wpdb->get_results( $this->getActiveQuery( $conditionsOnly ) );
157
+
158
+ $models = array();
159
+ if ( is_array( $notifications ) ) {
160
+ foreach ( $notifications as $notification ) {
161
+ $model = new Notification( (array) $notification );
162
+
163
+ try {
164
+ // Only add to the array if all conditions are met or if the notification has no conditions.
165
+ if (
166
+ ! $model->conditions ||
167
+ ( is_array( $model->conditions ) && $environmentChecker->meetsConditions( $model->conditions ) )
168
+ ) {
169
+ $models[] = $model;
170
+ }
171
+ } catch ( \Exception $e ) {
172
+
173
+ }
174
+ }
175
+ }
176
+
177
+ unset( $notifications );
178
+
179
+ return $models;
180
+ }
181
+
182
+ /**
183
+ * Builds the query for selecting or counting active notifications.
184
+ *
185
+ * @since 2.11.4
186
+ *
187
+ * @param bool $conditionsOnly
188
+ *
189
+ * @return string
190
+ */
191
+ private function getActiveQuery( $conditionsOnly = false ) {
192
+ global $wpdb;
193
+
194
+ $select = $conditionsOnly ? 'conditions' : '*';
195
+
196
+ return $wpdb->prepare(
197
+ "SELECT {$select} FROM {$this->table_name}
198
+ WHERE dismissed = 0
199
+ AND (start <= %s OR start IS NULL)
200
+ AND (end >= %s OR end IS NULL)
201
+ ORDER BY start DESC, id DESC",
202
+ gmdate( 'Y-m-d H:i:s' ),
203
+ gmdate( 'Y-m-d H:i:s' )
204
+ );
205
+ }
206
+
207
+ /**
208
+ * Counts the number of active notifications.
209
+ * Note: We can't actually do a real `COUNT(*)` on the database, because we want
210
+ * to double-check the conditions are met before displaying. That's why we use
211
+ * `getActiveNotifications()` which runs the conditions through the EnvironmentChecker.
212
+ *
213
+ * @since 2.11.4
214
+ *
215
+ * @return int
216
+ */
217
+ public function countActiveNotifications() {
218
+ $numberActive = wp_cache_get( 'edd_active_notification_count', 'edd_notifications' );
219
+ if ( false === $numberActive ) {
220
+ $numberActive = count( $this->getActiveNotifications( true ) );
221
+
222
+ wp_cache_set( 'edd_active_notification_count', $numberActive, 'edd_notifications' );
223
+ }
224
+
225
+ return $numberActive;
226
+ }
227
+
228
+ /**
229
+ * Creates the table.
230
+ *
231
+ * @since 2.11.4
232
+ */
233
+ public function create_table() {
234
+ require_once ABSPATH . 'wp-admin/includes/upgrade.php';
235
+
236
+ global $wpdb;
237
+
238
+ dbDelta( "CREATE TABLE {$this->table_name} (
239
+ id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
240
+ remote_id bigint(20) UNSIGNED DEFAULT NULL,
241
+ title text NOT NULL,
242
+ content longtext NOT NULL,
243
+ buttons longtext DEFAULT NULL,
244
+ type varchar(64) NOT NULL,
245
+ conditions longtext DEFAULT NULL,
246
+ start datetime DEFAULT NULL,
247
+ end datetime DEFAULT NULL,
248
+ dismissed tinyint(1) UNSIGNED NOT NULL DEFAULT 0,
249
+ date_created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP(),
250
+ date_updated datetime NOT NULL DEFAULT CURRENT_TIMESTAMP(),
251
+ PRIMARY KEY (id),
252
+ KEY dismissed_start_end (dismissed, start, end)
253
+ ) DEFAULT CHARACTER SET {$wpdb->charset} COLLATE {$wpdb->collate};" );
254
+
255
+ update_option( $this->table_name . '_db_version', $this->version );
256
+ }
257
+
258
+ }
includes/deprecated-functions.php CHANGED
@@ -993,3 +993,287 @@ function maybe_add_jilt_notice_to_abandoned_payment( $payment_id ) {
993
  <?php
994
  }
995
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
993
  <?php
994
  }
995
  }
996
+
997
+ /**
998
+ * SendWP Callback
999
+ *
1000
+ * Renders SendWP Settings
1001
+ *
1002
+ * @since 2.9.15
1003
+ * @param array $args Arguments passed by the setting
1004
+ * @return void
1005
+ */
1006
+ function edd_sendwp_callback( $args ) {
1007
+
1008
+ _edd_deprecated_function( __FUNCTION__, '2.11.4' );
1009
+
1010
+ // Connection status partial label based on the state of the SendWP email sending setting (Tools -> SendWP)
1011
+ $connected = '<a href="https://app.sendwp.com/dashboard" target="_blank" rel="noopener noreferrer">';
1012
+ $connected .= __( 'Access your SendWP account', 'easy-digital-downloads' );
1013
+ $connected .= '</a>.';
1014
+
1015
+ $disconnected = sprintf(
1016
+ __( '<em><strong>Note:</strong> Email sending is currently disabled. <a href="' . admin_url( '/tools.php?page=sendwp' ) . '">Click here</a> to enable it.</em>', 'easy-digital-downloads' )
1017
+ );
1018
+
1019
+ // Checks if SendWP is connected
1020
+ $client_connected = function_exists( 'sendwp_client_connected' ) && sendwp_client_connected() ? true : false;
1021
+
1022
+ // Checks if email sending is enabled in SendWP
1023
+ $forwarding_enabled = function_exists( 'sendwp_forwarding_enabled' ) && sendwp_forwarding_enabled() ? true : false;
1024
+
1025
+ ob_start();
1026
+
1027
+ echo $args['desc'];
1028
+
1029
+ // Output the appropriate button and label based on connection status
1030
+ if( $client_connected ) :
1031
+ ?>
1032
+ <div class="inline notice notice-success">
1033
+ <p><?php _e( 'SendWP plugin activated.', 'easy-digital-downloads' ); ?> <?php echo $forwarding_enabled ? $connected : $disconnected ; ?></p>
1034
+
1035
+ <p>
1036
+ <button id="edd-sendwp-disconnect" class="button"><?php _e( 'Disconnect SendWP', 'easy-digital-downloads' ); ?></button>
1037
+ </p>
1038
+ </div>
1039
+ <?php
1040
+ else :
1041
+ ?>
1042
+ <p>
1043
+ <?php _e( 'We recommend SendWP to ensure quick and reliable delivery of all emails sent from your store, such as purchase receipts, subscription renewal reminders, password resets, and more.', 'easy-digital-downloads' ); ?> <?php printf( __( '%sLearn more%s', 'easy-digital-downloads' ), '<a href="https://sendwp.com/" target="_blank" rel="noopener noreferrer">', '</a>' ); ?>
1044
+ </p>
1045
+ <p>
1046
+ <button type="button" id="edd-sendwp-connect" class="button button-primary"><?php esc_html_e( 'Connect with SendWP', 'easy-digital-downloads' ); ?>
1047
+ </button>
1048
+ </p>
1049
+
1050
+ <?php
1051
+ endif;
1052
+
1053
+ echo ob_get_clean();
1054
+ }
1055
+
1056
+ /**
1057
+ * Handle installation and connection for SendWP via ajax
1058
+ *
1059
+ * @since 2.9.15
1060
+ */
1061
+ function edd_sendwp_remote_install_handler () {
1062
+
1063
+ _edd_deprecated_function( __FUNCTION__, '2.11.4' );
1064
+
1065
+ if ( ! current_user_can( 'manage_shop_settings' ) ) {
1066
+ wp_send_json_error( array(
1067
+ 'error' => __( 'You do not have permission to do this.', 'easy-digital-downloads' )
1068
+ ) );
1069
+ }
1070
+
1071
+ include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
1072
+ include_once ABSPATH . 'wp-admin/includes/file.php';
1073
+ include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1074
+
1075
+ $plugins = get_plugins();
1076
+
1077
+ if( ! array_key_exists( 'sendwp/sendwp.php', $plugins ) ) {
1078
+
1079
+ /*
1080
+ * Use the WordPress Plugins API to get the plugin download link.
1081
+ */
1082
+ $api = plugins_api( 'plugin_information', array(
1083
+ 'slug' => 'sendwp',
1084
+ ) );
1085
+
1086
+ if ( is_wp_error( $api ) ) {
1087
+ wp_send_json_error( array(
1088
+ 'error' => $api->get_error_message(),
1089
+ 'debug' => $api
1090
+ ) );
1091
+ }
1092
+
1093
+ /*
1094
+ * Use the AJAX Upgrader skin to quietly install the plugin.
1095
+ */
1096
+ $upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() );
1097
+ $install = $upgrader->install( $api->download_link );
1098
+ if ( is_wp_error( $install ) ) {
1099
+ wp_send_json_error( array(
1100
+ 'error' => $install->get_error_message(),
1101
+ 'debug' => $api
1102
+ ) );
1103
+ }
1104
+
1105
+ $activated = activate_plugin( $upgrader->plugin_info() );
1106
+
1107
+ } else {
1108
+
1109
+ $activated = activate_plugin( 'sendwp/sendwp.php' );
1110
+
1111
+ }
1112
+
1113
+ /*
1114
+ * Final check to see if SendWP is available.
1115
+ */
1116
+ if( ! function_exists('sendwp_get_server_url') ) {
1117
+ wp_send_json_error( array(
1118
+ 'error' => __( 'Something went wrong. SendWP was not installed correctly.', 'easy-digital-downloads' )
1119
+ ) );
1120
+ }
1121
+
1122
+ wp_send_json_success( array(
1123
+ 'partner_id' => 81,
1124
+ 'register_url' => sendwp_get_server_url() . '_/signup',
1125
+ 'client_name' => sendwp_get_client_name(),
1126
+ 'client_secret' => sendwp_get_client_secret(),
1127
+ 'client_redirect' => admin_url( '/edit.php?post_type=download&page=edd-settings&tab=emails&edd-message=sendwp-connected' ),
1128
+ ) );
1129
+ }
1130
+ add_action( 'wp_ajax_edd_sendwp_remote_install', 'edd_sendwp_remote_install_handler' );
1131
+
1132
+ /**
1133
+ * Handle deactivation of SendWP via ajax
1134
+ *
1135
+ * @since 2.9.15
1136
+ */
1137
+ function edd_sendwp_disconnect () {
1138
+
1139
+ _edd_deprecated_function( __FUNCTION__, '2.11.4' );
1140
+
1141
+ if ( ! current_user_can( 'manage_shop_settings' ) ) {
1142
+ wp_send_json_error( array(
1143
+ 'error' => __( 'You do not have permission to do this.', 'easy-digital-downloads' )
1144
+ ) );
1145
+ }
1146
+
1147
+ sendwp_disconnect_client();
1148
+
1149
+ deactivate_plugins( 'sendwp/sendwp.php' );
1150
+
1151
+ wp_send_json_success();
1152
+ }
1153
+ add_action( 'wp_ajax_edd_sendwp_disconnect', 'edd_sendwp_disconnect' );
1154
+
1155
+ /**
1156
+ * Reverts to the original download URL validation.
1157
+ *
1158
+ * @since 2.11.4
1159
+ * @todo Remove this function in 3.0.
1160
+ *
1161
+ * @param bool $ret
1162
+ * @param string $url
1163
+ * @param array $query_args
1164
+ * @param string $original_url
1165
+ */
1166
+ add_filter( 'edd_validate_url_token', function( $ret, $url, $query_args, $original_url ) {
1167
+ // If the URL is already validated, we don't need to validate it again.
1168
+ if ( $ret ) {
1169
+ return $ret;
1170
+ }
1171
+ $allowed = edd_get_url_token_parameters();
1172
+ $remove = array();
1173
+ foreach ( $query_args as $key => $value ) {
1174
+ if ( ! in_array( $key, $allowed, true ) ) {
1175
+ $remove[] = $key;
1176
+ }
1177
+ }
1178
+
1179
+ if ( ! empty( $remove ) ) {
1180
+ $original_url = remove_query_arg( $remove, $original_url );
1181
+ }
1182
+
1183
+ return isset( $query_args['token'] ) && hash_equals( $query_args['token'], edd_get_download_token( $original_url ) );
1184
+ }, 10, 4 );
1185
+
1186
+ /**
1187
+ * Get the path of the Product Reviews plugin
1188
+ *
1189
+ * @since 2.9.20
1190
+ *
1191
+ * @return mixed|string
1192
+ */
1193
+ function edd_reviews_location() {
1194
+
1195
+ _edd_deprecated_function( __FUNCTION__, '2.11.4' );
1196
+
1197
+ $possible_locations = array( 'edd-reviews/edd-reviews.php', 'EDD-Reviews/edd-reviews.php' );
1198
+ $reviews_location = '';
1199
+
1200
+ foreach ( $possible_locations as $location ) {
1201
+
1202
+ if ( 0 !== validate_plugin( $location ) ) {
1203
+ continue;
1204
+ }
1205
+ $reviews_location = $location;
1206
+ }
1207
+
1208
+ return $reviews_location;
1209
+ }
1210
+
1211
+ /**
1212
+ * Outputs a metabox for the Product Reviews extension to show or activate it.
1213
+ *
1214
+ * @since 2.8
1215
+ * @return void
1216
+ */
1217
+ function edd_render_review_status_metabox() {
1218
+
1219
+ _edd_deprecated_function( __FUNCTION__, '2.11.4' );
1220
+
1221
+ $reviews_location = edd_reviews_location();
1222
+ $is_promo_active = edd_is_promo_active();
1223
+
1224
+ ob_start();
1225
+
1226
+ if ( ! empty( $reviews_location ) ) {
1227
+ $review_path = '';
1228
+ $base_url = wp_nonce_url( admin_url( 'plugins.php' ), 'activate-plugin_' . $reviews_location );
1229
+ $args = array(
1230
+ 'action' => 'activate',
1231
+ 'plugin' => sanitize_text_field( $reviews_location ),
1232
+ 'plugin_status' => 'all',
1233
+ );
1234
+ $activate_url = add_query_arg( $args, $base_url );
1235
+ ?><p style="text-align: center;"><a href="<?php echo esc_url( $activate_url ); ?>" class="button-secondary"><?php _e( 'Activate Reviews', 'easy-digital-downloads' ); ?></a></p><?php
1236
+
1237
+ } else {
1238
+
1239
+ // Adjust UTM params based on state of promotion.
1240
+ if ( true === $is_promo_active ) {
1241
+ $args = array(
1242
+ 'utm_source' => 'download-metabox',
1243
+ 'utm_medium' => 'wp-admin',
1244
+ 'utm_campaign' => 'bfcm2019',
1245
+ 'utm_content' => 'product-reviews-metabox-bfcm',
1246
+ );
1247
+ } else {
1248
+ $args = array(
1249
+ 'utm_source' => 'edit-download',
1250
+ 'utm_medium' => 'enable-reviews',
1251
+ 'utm_campaign' => 'admin',
1252
+ );
1253
+ }
1254
+
1255
+ $base_url = 'https://easydigitaldownloads.com/downloads/product-reviews';
1256
+ $url = add_query_arg( $args, $base_url );
1257
+ ?>
1258
+ <p>
1259
+ <?php
1260
+ // Translators: The %s represents the link to the Product Reviews extension.
1261
+ echo wp_kses_post( sprintf( __( 'Would you like to enable reviews for this product? Check out our <a target="_blank" href="%s">Product Reviews</a> extension.', 'easy-digital-downloads' ), esc_url( $url ) ) );
1262
+ ?>
1263
+ </p>
1264
+ <?php
1265
+ // Add an additional note if a promotion is active.
1266
+ if ( true === $is_promo_active ) {
1267
+ ?>
1268
+ <p>
1269
+ <?php echo wp_kses_post( __( 'Act now and <strong>SAVE 25%</strong> on your purchase. Sale ends <em>23:59 PM December 6th CST</em>. Use code <code>BFCM2019</code> at checkout.', 'easy-digital-downloads' ) ); ?>
1270
+ </p>
1271
+ <?php
1272
+ }
1273
+ }
1274
+
1275
+ $rendered = ob_get_contents();
1276
+ ob_end_clean();
1277
+
1278
+ echo wp_kses_post( $rendered );
1279
+ }
includes/download-functions.php CHANGED
@@ -1033,10 +1033,11 @@ function edd_get_download_file_url( $key, $email, $filekey, $download_id = 0, $p
1033
 
1034
  if ( ! empty( $payment->ID ) ) {
1035
 
 
 
 
1036
  // Simply the URL by concatenating required data using a colon as a delimiter.
1037
- $args = array(
1038
- 'eddfile' => rawurlencode( sprintf( '%d:%d:%d:%d', $payment->ID, $params['download_id'], $params['file'], $price_id ) )
1039
- );
1040
 
1041
  if ( isset( $params['expire'] ) ) {
1042
  $args['ttl'] = $params['expire'];
@@ -1048,12 +1049,29 @@ function edd_get_download_file_url( $key, $email, $filekey, $download_id = 0, $p
1048
  $args = apply_filters( 'edd_get_download_file_url_args', $args, $payment->ID, $params );
1049
 
1050
  $args['file'] = $params['file'];
1051
- $args['token'] = edd_get_download_token( add_query_arg( $args, untrailingslashit( site_url() ) ) );
1052
  }
1053
 
1054
- $download_url = add_query_arg( $args, site_url( 'index.php' ) );
 
1055
 
1056
- return $download_url;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1057
  }
1058
 
1059
  /**
@@ -1242,8 +1260,10 @@ function edd_get_download_token( $url = '' ) {
1242
  */
1243
  function edd_validate_url_token( $url = '' ) {
1244
 
1245
- $ret = false;
1246
- $parts = parse_url( $url );
 
 
1247
 
1248
  if ( isset( $parts['query'] ) ) {
1249
 
@@ -1257,37 +1277,34 @@ function edd_validate_url_token( $url = '' ) {
1257
  }
1258
 
1259
  // These are the only URL parameters that are allowed to affect the token validation.
1260
- $allowed = apply_filters(
1261
- 'edd_url_token_allowed_params',
1262
- array(
1263
- 'eddfile',
1264
- 'ttl',
1265
- 'file',
1266
- 'token',
1267
- )
1268
- );
1269
 
1270
  // Collect the allowed tags in proper order, remove all tags, and re-add only the allowed ones.
1271
- $allowed_args = array();
1272
 
1273
- foreach ( $allowed as $key ) {
1274
  if ( true === array_key_exists( $key, $query_args ) ) {
1275
- $allowed_args[ $key ] = $query_args[ $key ];
1276
  }
1277
  }
1278
 
1279
  // strtok allows a quick clearing of existing query string parameters, so we can re-add the allowed ones.
1280
- $url = add_query_arg( $allowed_args, strtok( $url, '?' ) );
1281
 
1282
  if ( isset( $query_args['token'] ) && hash_equals( $query_args['token'], edd_get_download_token( $url ) ) ) {
1283
-
1284
  $ret = true;
1285
-
1286
  }
1287
-
1288
  }
1289
 
1290
- return apply_filters( 'edd_validate_url_token', $ret, $url, $query_args );
 
 
 
 
 
 
 
 
1291
  }
1292
 
1293
  /**
1033
 
1034
  if ( ! empty( $payment->ID ) ) {
1035
 
1036
+ // Get the array of parameters in the same order in which they will be validated.
1037
+ $args = array_fill_keys( edd_get_url_token_parameters(), '' );
1038
+
1039
  // Simply the URL by concatenating required data using a colon as a delimiter.
1040
+ $args['eddfile'] = rawurlencode( sprintf( '%d:%d:%d:%d', $payment->ID, $params['download_id'], $params['file'], $price_id ) );
 
 
1041
 
1042
  if ( isset( $params['expire'] ) ) {
1043
  $args['ttl'] = $params['expire'];
1049
  $args = apply_filters( 'edd_get_download_file_url_args', $args, $payment->ID, $params );
1050
 
1051
  $args['file'] = $params['file'];
1052
+ $args['token'] = edd_get_download_token( add_query_arg( array_filter( $args ), untrailingslashit( site_url() ) ) );
1053
  }
1054
 
1055
+ return add_query_arg( array_filter( $args ), site_url( 'index.php' ) );
1056
+ }
1057
 
1058
+ /**
1059
+ * Gets the array of parameters to be used for the URL token generation and validation.
1060
+ * Used by `edd_get_download_file_url` and `edd_validate_url_token` so that their parameters are ordered the same.
1061
+ *
1062
+ * @since 2.11.4
1063
+ * @return array
1064
+ */
1065
+ function edd_get_url_token_parameters() {
1066
+ return apply_filters(
1067
+ 'edd_url_token_allowed_params',
1068
+ array(
1069
+ 'eddfile',
1070
+ 'ttl',
1071
+ 'file',
1072
+ 'token',
1073
+ )
1074
+ );
1075
  }
1076
 
1077
  /**
1260
  */
1261
  function edd_validate_url_token( $url = '' ) {
1262
 
1263
+ $ret = false;
1264
+ $parts = parse_url( $url );
1265
+ $query_args = array();
1266
+ $original_url = $url;
1267
 
1268
  if ( isset( $parts['query'] ) ) {
1269
 
1277
  }
1278
 
1279
  // These are the only URL parameters that are allowed to affect the token validation.
1280
+ $allowed_args = edd_get_url_token_parameters();
 
 
 
 
 
 
 
 
1281
 
1282
  // Collect the allowed tags in proper order, remove all tags, and re-add only the allowed ones.
1283
+ $validated_query_args = array();
1284
 
1285
+ foreach ( $allowed_args as $key ) {
1286
  if ( true === array_key_exists( $key, $query_args ) ) {
1287
+ $validated_query_args[ $key ] = $query_args[ $key ];
1288
  }
1289
  }
1290
 
1291
  // strtok allows a quick clearing of existing query string parameters, so we can re-add the allowed ones.
1292
+ $url = add_query_arg( $validated_query_args, strtok( $url, '?' ) );
1293
 
1294
  if ( isset( $query_args['token'] ) && hash_equals( $query_args['token'], edd_get_download_token( $url ) ) ) {
 
1295
  $ret = true;
 
1296
  }
 
1297
  }
1298
 
1299
+ /**
1300
+ * Filters the URL token validation.
1301
+ *
1302
+ * @param bool $ret Whether the URL has validated or not.
1303
+ * @param string $url The URL used for validation.
1304
+ * @param array $query_args The array of query parameters.
1305
+ * @param string $original_url The original URL (added 2.11.3).
1306
+ */
1307
+ return apply_filters( 'edd_validate_url_token', $ret, $url, $query_args, $original_url );
1308
  }
1309
 
1310
  /**
includes/emails/actions.php CHANGED
@@ -60,7 +60,7 @@ function edd_resend_purchase_receipt( $data ) {
60
  $email = $customer->email;
61
  }
62
 
63
- edd_email_purchase_receipt( $purchase_id, false, $email );
64
 
65
  // Grab all downloads of the purchase and update their file download limits, if needed
66
  // This allows admins to resend purchase receipts to grant additional file downloads
@@ -75,7 +75,15 @@ function edd_resend_purchase_receipt( $data ) {
75
  }
76
  }
77
 
78
- wp_redirect( add_query_arg( array( 'edd-message' => 'email_sent', 'edd-action' => false, 'purchase_id' => false ) ) );
 
 
 
 
 
 
 
 
79
  exit;
80
  }
81
  add_action( 'edd_email_links', 'edd_resend_purchase_receipt' );
60
  $email = $customer->email;
61
  }
62
 
63
+ $sent = edd_email_purchase_receipt( $purchase_id, false, $email );
64
 
65
  // Grab all downloads of the purchase and update their file download limits, if needed
66
  // This allows admins to resend purchase receipts to grant additional file downloads
75
  }
76
  }
77
 
78
+ wp_safe_redirect(
79
+ add_query_arg(
80
+ array(
81
+ 'edd-message' => $sent ? 'email_sent' : 'email_send_failed',
82
+ 'edd-action' => false,
83
+ 'purchase_id' => false,
84
+ )
85
+ )
86
+ );
87
  exit;
88
  }
89
  add_action( 'edd_email_links', 'edd_resend_purchase_receipt' );
includes/emails/class-edd-emails.php CHANGED
@@ -283,6 +283,8 @@ class EDD_Emails {
283
  * @param string $subject The subject line of the email to send.
284
  * @param string $message The body of the email to send.
285
  * @param string|array $attachments Attachments to the email in a format supported by wp_mail()
 
 
286
  * @since 2.1
287
  */
288
  public function send( $to, $subject, $message, $attachments = '' ) {
283
  * @param string $subject The subject line of the email to send.
284
  * @param string $message The body of the email to send.
285
  * @param string|array $attachments Attachments to the email in a format supported by wp_mail()
286
+ *
287
+ * @return bool Whether the email was sent successfully.
288
  * @since 2.1
289
  */
290
  public function send( $to, $subject, $message, $attachments = '' ) {
includes/emails/functions.php CHANGED
@@ -23,7 +23,7 @@ if ( ! defined( 'ABSPATH' ) ) exit;
23
  * @param bool $admin_notice Whether to send the admin email notification or not (default: true)
24
  * @param EDD_Payment $payment Payment object for payment ID.
25
  * @param EDD_Customer $customer Customer object for associated payment.
26
- * @return void
27
  */
28
  function edd_email_purchase_receipt( $payment_id, $admin_notice = true, $to_email = '', $payment = null, $customer = null ) {
29
  if ( is_null( $payment ) ) {
@@ -63,11 +63,13 @@ function edd_email_purchase_receipt( $payment_id, $admin_notice = true, $to_emai
63
  $headers = apply_filters( 'edd_receipt_headers', $emails->get_headers(), $payment_id, $payment_data );
64
  $emails->__set( 'headers', $headers );
65
 
66
- $emails->send( $to_email, $subject, $message, $attachments );
67
 
68
  if ( $admin_notice && ! edd_admin_notices_disabled( $payment_id ) ) {
69
  do_action( 'edd_admin_sale_notice', $payment_id, $payment_data );
70
  }
 
 
71
  }
72
 
73
  /**
@@ -282,101 +284,6 @@ function edd_get_email_names( $user_info, $payment = false ) {
282
  return $email_names;
283
  }
284
 
285
- /**
286
- * Handle installation and connection for SendWP via ajax
287
- *
288
- * @since 2.9.15
289
- */
290
- function edd_sendwp_remote_install_handler () {
291
-
292
- if ( ! current_user_can( 'manage_shop_settings' ) ) {
293
- wp_send_json_error( array(
294
- 'error' => __( 'You do not have permission to do this.', 'easy-digital-downloads' )
295
- ) );
296
- }
297
-
298
- include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
299
- include_once ABSPATH . 'wp-admin/includes/file.php';
300
- include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
301
-
302
- $plugins = get_plugins();
303
-
304
- if( ! array_key_exists( 'sendwp/sendwp.php', $plugins ) ) {
305
-
306
- /*
307
- * Use the WordPress Plugins API to get the plugin download link.
308
- */
309
- $api = plugins_api( 'plugin_information', array(
310
- 'slug' => 'sendwp',
311
- ) );
312
-
313
- if ( is_wp_error( $api ) ) {
314
- wp_send_json_error( array(
315
- 'error' => $api->get_error_message(),
316
- 'debug' => $api
317
- ) );
318
- }
319
-
320
- /*
321
- * Use the AJAX Upgrader skin to quietly install the plugin.
322
- */
323
- $upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() );
324
- $install = $upgrader->install( $api->download_link );
325
- if ( is_wp_error( $install ) ) {
326
- wp_send_json_error( array(
327
- 'error' => $install->get_error_message(),
328
- 'debug' => $api
329
- ) );
330
- }
331
-
332
- $activated = activate_plugin( $upgrader->plugin_info() );
333
-
334
- } else {
335
-
336
- $activated = activate_plugin( 'sendwp/sendwp.php' );
337
-
338
- }
339
-
340
- /*
341
- * Final check to see if SendWP is available.
342
- */
343
- if( ! function_exists('sendwp_get_server_url') ) {
344
- wp_send_json_error( array(
345
- 'error' => __( 'Something went wrong. SendWP was not installed correctly.', 'easy-digital-downloads' )
346
- ) );
347
- }
348
-
349
- wp_send_json_success( array(
350
- 'partner_id' => 81,
351
- 'register_url' => sendwp_get_server_url() . '_/signup',
352
- 'client_name' => sendwp_get_client_name(),
353
- 'client_secret' => sendwp_get_client_secret(),
354
- 'client_redirect' => admin_url( '/edit.php?post_type=download&page=edd-settings&tab=emails&edd-message=sendwp-connected' ),
355
- ) );
356
- }
357
- add_action( 'wp_ajax_edd_sendwp_remote_install', 'edd_sendwp_remote_install_handler' );
358
-
359
- /**
360
- * Handle deactivation of SendWP via ajax
361
- *
362
- * @since 2.9.15
363
- */
364
- function edd_sendwp_disconnect () {
365
-
366
- if ( ! current_user_can( 'manage_shop_settings' ) ) {
367
- wp_send_json_error( array(
368
- 'error' => __( 'You do not have permission to do this.', 'easy-digital-downloads' )
369
- ) );
370
- }
371
-
372
- sendwp_disconnect_client();
373
-
374
- deactivate_plugins( 'sendwp/sendwp.php' );
375
-
376
- wp_send_json_success();
377
- }
378
- add_action( 'wp_ajax_edd_sendwp_disconnect', 'edd_sendwp_disconnect' );
379
-
380
  /**
381
  * Handle installation and connection for Recapture via ajax
382
  *
23
  * @param bool $admin_notice Whether to send the admin email notification or not (default: true)
24
  * @param EDD_Payment $payment Payment object for payment ID.
25
  * @param EDD_Customer $customer Customer object for associated payment.
26
+ * @return bool Whether the email was sent successfully.
27
  */
28
  function edd_email_purchase_receipt( $payment_id, $admin_notice = true, $to_email = '', $payment = null, $customer = null ) {
29
  if ( is_null( $payment ) ) {
63
  $headers = apply_filters( 'edd_receipt_headers', $emails->get_headers(), $payment_id, $payment_data );
64
  $emails->__set( 'headers', $headers );
65
 
66
+ $sent = $emails->send( $to_email, $subject, $message, $attachments );
67
 
68
  if ( $admin_notice && ! edd_admin_notices_disabled( $payment_id ) ) {
69
  do_action( 'edd_admin_sale_notice', $payment_id, $payment_data );
70
  }
71
+
72
+ return $sent;
73
  }
74
 
75
  /**
284
  return $email_names;
285
  }
286
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
287
  /**
288
  * Handle installation and connection for Recapture via ajax
289
  *
includes/extensions/ExtensionRegistry.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * License Registry
4
+ *
5
+ * Responsible for holding information about premium EDD extensions in use on this site.
6
+ *
7
+ * @package easy-digital-downloads
8
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
9
+ * @license GPL2+
10
+ * @since 2.11.4
11
+ */
12
+
13
+ namespace EDD\Extensions;
14
+
15
+ class ExtensionRegistry extends \ArrayObject {
16
+
17
+ /**
18
+ * Adds an extension to the registry.
19
+ *
20
+ * @since 2.11.4
21
+ *
22
+ * @param string $pluginFile Path to the plugin's main file.
23
+ * @param string $pluginName Display name of the plugin.
24
+ * @param int $pluginId EDD product ID for the plugin.
25
+ * @param string $currentVersion Current version number.
26
+ * @param string|null $optionName Option name where the license key is stored. If omitted, automatically generated.
27
+ */
28
+ public function addExtension( $pluginFile, $pluginName, $pluginId, $currentVersion, $optionName = null ) {
29
+ if ( $this->offsetExists( $pluginId ) ) {
30
+ throw new \InvalidArgumentException( sprintf(
31
+ 'The extension %d is already registered.',
32
+ $pluginId
33
+ ) );
34
+ }
35
+
36
+ $this->offsetSet(
37
+ $pluginId,
38
+ new \EDD_License( $pluginFile, $pluginName, $currentVersion, 'Easy Digital Downloads', $optionName, null, $pluginId )
39
+ );
40
+ }
41
+
42
+ /**
43
+ * Returns all registered extensions, regardless of whether they have licenses activated.
44
+ *
45
+ * At some point we could make this public, just making it private for now so that we have
46
+ * flexibility to change exactly what it returns in the future.
47
+ *
48
+ * @since 2.11.4
49
+ *
50
+ * @return \EDD_License[]
51
+ */
52
+ private function getExtensions() {
53
+ return $this->getArrayCopy();
54
+ }
55
+
56
+ /**
57
+ * Counts the number of licensed extensions active on this site.
58
+ * Note: This only looks at extensions registered via this registry, then filters down
59
+ * to those that have a license key entered. It does not check to verify if the license
60
+ * key is actually valid / not expired.
61
+ *
62
+ * @since 2.11.4
63
+ *
64
+ * @return int
65
+ */
66
+ public function countLicensedExtensions() {
67
+ $licensedExtensions = array_filter( $this->getExtensions(), function ( \EDD_License $license ) {
68
+ return ! empty( $license->license );
69
+ } );
70
+
71
+ return count( $licensedExtensions );
72
+ }
73
+
74
+ }
includes/extensions/licensing-functions.php ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Licensing Functions
4
+ *
5
+ * Functions used for saving and/or retrieving information about EDD licensed products
6
+ * running on the site.
7
+ *
8
+ * @package easy-digital-downloads
9
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
10
+ * @license GPL2+
11
+ * @since 2.11.4
12
+ */
13
+
14
+ namespace EDD\Extensions;
15
+
16
+ /**
17
+ * Saves an option in the database with the information from the `$edd_licensed_products`
18
+ * global. This only runs in the context of WP-Admin, because that's the only place we
19
+ * can be certain that the information is accurate.
20
+ *
21
+ * @link https://github.com/awesomemotive/easy-digital-downloads/issues/8969
22
+ *
23
+ * @global $edd_licensed_products
24
+ */
25
+ add_action( 'admin_init', function () {
26
+ if ( ! is_admin() ) {
27
+ return;
28
+ }
29
+
30
+ $saved_products = get_option( 'edd_licensed_extensions', array() );
31
+
32
+ /*
33
+ * We only want to update this option once per day. If the timeout has expired
34
+ * then update it with product information.
35
+ *
36
+ * Note: We always save this option, even if `$edd_licensed_products` is empty.
37
+ * This is to help designate that the information has been checked and saved,
38
+ * even if there are no licensed products.
39
+ */
40
+ if ( empty( $saved_products['timeout'] ) || $saved_products['timeout'] < time() ) {
41
+ global $edd_licensed_products;
42
+
43
+ update_option( 'edd_licensed_extensions', json_encode( array(
44
+ 'timeout' => strtotime( '+1 day' ),
45
+ 'products' => $edd_licensed_products,
46
+ ) ) );
47
+ }
48
+ }, 200 );
49
+
50
+ /**
51
+ * Returns licensed EDD extensions that are active on this site.
52
+ * Array values are the `$item_shortname` from `\EDD_License`
53
+ *
54
+ * @see \EDD_License::$item_shortname
55
+ *
56
+ * @since 2.11.4
57
+ * @return array
58
+ */
59
+ function get_licensed_extension_slugs() {
60
+ $products = get_option( 'edd_licensed_extensions' );
61
+
62
+ /*
63
+ * If this isn't set for some reason, fall back to trying the global. There are
64
+ * probably a very limited number of cases where the option would be empty when
65
+ * the global is not, but worth a shot.
66
+ */
67
+ if ( empty( $products ) ) {
68
+ global $edd_licensed_products;
69
+
70
+ return ! empty( $edd_licensed_products ) && is_array( $edd_licensed_products )
71
+ ? $edd_licensed_products
72
+ : array();
73
+ }
74
+
75
+ $products = json_decode( $products, true );
76
+
77
+ return isset( $products['products'] ) && is_array( $products['products'] )
78
+ ? $products['products']
79
+ : array();
80
+ }
81
+
82
+ /**
83
+ * Triggers our hook for registering extensions.
84
+ * This needs to run after all plugins have definitely been loaded.
85
+ *
86
+ * @since 2.11.4
87
+ */
88
+ add_action( 'plugins_loaded', function() {
89
+ /**
90
+ * Extensions should hook in here to register themselves.
91
+ *
92
+ * @since 2.11.4
93
+ *
94
+ * @param ExtensionRegistry
95
+ */
96
+ do_action( 'edd_extension_license_init', EDD()->extensionRegistry );
97
+ }, PHP_INT_MAX );
includes/gateways/paypal-standard.php CHANGED
@@ -1104,7 +1104,7 @@ function edd_paypal_link_transaction_id( $transaction_id, $payment_id ) {
1104
 
1105
  $payment = new EDD_Payment( $payment_id );
1106
  $sandbox = 'test' === $payment->mode ? 'sandbox.' : '';
1107
- $paypal_base_url = 'https://www.' . $sandbox . 'paypal.com/activity/payment/';
1108
  $transaction_url = '<a href="' . esc_url( $paypal_base_url . $transaction_id ) . '" target="_blank">' . $transaction_id . '</a>';
1109
 
1110
  return apply_filters( 'edd_paypal_link_payment_details_transaction_id', $transaction_url );
1104
 
1105
  $payment = new EDD_Payment( $payment_id );
1106
  $sandbox = 'test' === $payment->mode ? 'sandbox.' : '';
1107
+ $paypal_base_url = 'https://' . $sandbox . 'paypal.com/activity/payment/';
1108
  $transaction_url = '<a href="' . esc_url( $paypal_base_url . $transaction_id ) . '" target="_blank">' . $transaction_id . '</a>';
1109
 
1110
  return apply_filters( 'edd_paypal_link_payment_details_transaction_id', $transaction_url );
includes/gateways/stripe/edd-stripe.php CHANGED
@@ -3,9 +3,9 @@
3
  * Plugin Name: Easy Digital Downloads - Stripe Pro Payment Gateway
4
  * Plugin URI: https://easydigitaldownloads.com/downloads/stripe-gateway/
5
  * Description: Adds a payment gateway for Stripe.com
6
- * Version: 2.8.9
7
- * Author: Sandhills Development, LLC
8
- * Author URI: https://sandhillsdev.com
9
  * Text Domain: edds
10
  * Domain Path: languages
11
  */
@@ -42,7 +42,7 @@ function edd_stripe_core_bootstrap() {
42
  }
43
 
44
  if ( ! defined( 'EDD_STRIPE_VERSION' ) ) {
45
- define( 'EDD_STRIPE_VERSION', '2.8.9' );
46
  }
47
 
48
  if ( ! defined( 'EDD_STRIPE_API_VERSION' ) ) {
3
  * Plugin Name: Easy Digital Downloads - Stripe Pro Payment Gateway
4
  * Plugin URI: https://easydigitaldownloads.com/downloads/stripe-gateway/
5
  * Description: Adds a payment gateway for Stripe.com
6
+ * Version: 2.8.10
7
+ * Author: Easy Digital Downloads
8
+ * Author URI: https://easydigitaldownloads.com
9
  * Text Domain: edds
10
  * Domain Path: languages
11
  */
42
  }
43
 
44
  if ( ! defined( 'EDD_STRIPE_VERSION' ) ) {
45
+ define( 'EDD_STRIPE_VERSION', '2.8.10' );
46
  }
47
 
48
  if ( ! defined( 'EDD_STRIPE_API_VERSION' ) ) {
includes/gateways/stripe/includes/admin/admin-actions.php CHANGED
@@ -68,6 +68,29 @@ function edds_process_preapproved_cancel() {
68
  }
69
  add_action( 'edd_cancel_stripe_preapproval', 'edds_process_preapproved_cancel' );
70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  /**
72
  * Admin Messages
73
  *
68
  }
69
  add_action( 'edd_cancel_stripe_preapproval', 'edds_process_preapproved_cancel' );
70
 
71
+ /**
72
+ * Adds a JS confirmation to check whether a preapproved payment should really be cancelled.
73
+ *
74
+ * @since 2.8.10
75
+ * @return void
76
+ */
77
+ add_action( 'admin_print_footer_scripts-download_page_edd-payment-history', function () {
78
+ ?>
79
+ <script>
80
+ document.addEventListener( 'DOMContentLoaded', function() {
81
+ var cancelLinks = document.querySelectorAll( '.row-actions .cancel-preapproval a' );
82
+ cancelLinks.forEach( function( link ) {
83
+ link.addEventListener( 'click', function( e ) {
84
+ if ( ! confirm( '<?php esc_attr_e( 'Are you sure you want to cancel this order?', 'easy-digital-downloads' ); ?>' ) ) {
85
+ e.preventDefault();
86
+ });
87
+ } );
88
+ } );
89
+ } );
90
+ </script>
91
+ <?php
92
+ } );
93
+
94
  /**
95
  * Admin Messages
96
  *
includes/gateways/stripe/includes/admin/admin-filters.php CHANGED
@@ -73,31 +73,45 @@ function edds_payments_column_data( $value, $payment_id, $column_name ) {
73
 
74
  $nonce = wp_create_nonce( 'edds-process-preapproval' );
75
 
76
- $preapproval_args = array(
77
- 'payment_id' => $payment_id,
78
- 'nonce' => $nonce,
79
- 'edd-action' => 'charge_stripe_preapproval'
 
80
  );
81
-
82
- $cancel_args = array(
83
- 'preapproval_key' => $customer_id,
84
- 'payment_id' => $payment_id,
85
- 'nonce' => $nonce,
86
- 'edd-action' => 'cancel_stripe_preapproval'
87
  );
88
 
89
- $actions = array();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
  $value .= '<p class="row-actions">';
92
-
93
- $actions[] = '<a href="' . esc_url( add_query_arg( $preapproval_args, admin_url( 'edit.php?post_type=download&page=edd-payment-history' ) ) ) . '">' . __( 'Process', 'easy-digital-downloads' ) . '</a>';
94
-
95
- if ( 'cancelled' !== $status ) {
96
- $actions[] = '<span class="delete"><a href="' . esc_url( add_query_arg( $cancel_args, admin_url( 'edit.php?post_type=download&page=edd-payment-history' ) ) ) . '">' . __( 'Cancel', 'easy-digital-downloads' ) . '</a></span>';
97
- }
98
-
99
  $value .= implode( ' | ', $actions );
100
-
101
  $value .= '</p>';
102
 
103
  return $value;
73
 
74
  $nonce = wp_create_nonce( 'edds-process-preapproval' );
75
 
76
+ $base_args = array(
77
+ 'post_type' => 'download',
78
+ 'page' => 'edd-payment-history',
79
+ 'payment_id' => urlencode( $payment_id ),
80
+ 'nonce' => urlencode( $nonce ),
81
  );
82
+ $preapproval_args = array(
83
+ 'edd-action' => 'charge_stripe_preapproval',
84
+ );
85
+ $cancel_args = array(
86
+ 'preapproval_key' => urlencode( $customer_id ),
87
+ 'edd-action' => 'cancel_stripe_preapproval',
88
  );
89
 
90
+ $actions = array(
91
+ sprintf(
92
+ '<a href="%s">%s</a>',
93
+ esc_url(
94
+ add_query_arg(
95
+ array_merge( $base_args, $preapproval_args ),
96
+ admin_url( 'edit.php' )
97
+ )
98
+ ),
99
+ esc_html__( 'Process', 'easy-digital-downloads' )
100
+ ),
101
+ sprintf(
102
+ '<span class="cancel-preapproval"><a href="%s">%s</a></span>',
103
+ esc_url(
104
+ add_query_arg(
105
+ array_merge( $base_args, $cancel_args ),
106
+ admin_url( 'edit.php' )
107
+ )
108
+ ),
109
+ esc_html__( 'Cancel', 'easy-digital-downloads' )
110
+ ),
111
+ );
112
 
113
  $value .= '<p class="row-actions">';
 
 
 
 
 
 
 
114
  $value .= implode( ' | ', $actions );
 
115
  $value .= '</p>';
116
 
117
  return $value;
includes/gateways/stripe/includes/admin/settings/stripe-connect.php CHANGED
@@ -21,19 +21,11 @@ if ( ! defined( 'ABSPATH' ) ) {
21
  * @return bool
22
  */
23
  function edds_stripe_connect_can_manage_keys() {
24
- $can_manage = false;
25
 
26
- /**
27
- * Filters the ability to override the ability to manually manage
28
- * Stripe API keys.
29
- *
30
- * @since 2.8.0
31
- *
32
- * @param bool $can_manage If the current user can manage API keys.
33
- */
34
- $can_manage = apply_filters( 'edds_stripe_connect_can_manage_keys', $can_manage );
35
 
36
- return $can_manage;
37
  }
38
 
39
  /**
21
  * @return bool
22
  */
23
  function edds_stripe_connect_can_manage_keys() {
 
24
 
25
+ $stripe_connect_account_id = edd_get_option( 'stripe_connect_account_id', false );
26
+ $secret = edd_is_test_mode() ? edd_get_option( 'test_secret_key' ) : edd_get_option( 'live_secret_key' );
 
 
 
 
 
 
 
27
 
28
+ return empty( $stripe_connect_account_id ) && $secret;
29
  }
30
 
31
  /**
includes/gateways/stripe/includes/admin/upgrade-functions.php CHANGED
@@ -1,5 +1,28 @@
1
  <?php
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  /**
4
  * Stripe Upgrade Notices
5
  *
@@ -128,4 +151,4 @@ function edd_stripe_customer_id_migration() {
128
  }
129
 
130
  }
131
- add_action( 'edd_stripe_customer_id_migration', 'edd_stripe_customer_id_migration' );
1
  <?php
2
 
3
+ /**
4
+ * Handles automatic upgrades behind the scenes.
5
+ *
6
+ * @since 2.8.10
7
+ */
8
+ add_action( 'admin_init', function() {
9
+ /*
10
+ * Move license data to new option, after product name change.
11
+ * @link https://github.com/awesomemotive/edd-stripe/issues/715
12
+ */
13
+ $license_key = edd_get_option( 'edd_stripe_payment_gateway_license_key' );
14
+ if ( $license_key ) {
15
+ edd_update_option( 'edd_stripe_pro_payment_gateway_license_key', sanitize_text_field( $license_key ) );
16
+ edd_delete_option( 'edd_stripe_payment_gateway_license_key' );
17
+
18
+ $license_status = get_option( 'edd_stripe_payment_gateway_license_active' );
19
+ if ( $license_status ) {
20
+ update_option( 'edd_stripe_pro_payment_gateway_license_active', $license_status );
21
+ delete_option( 'edd_stripe_payment_gateway_license_active' );
22
+ }
23
+ }
24
+ } );
25
+
26
  /**
27
  * Stripe Upgrade Notices
28
  *
151
  }
152
 
153
  }
154
+ add_action( 'edd_stripe_customer_id_migration', 'edd_stripe_customer_id_migration' );
includes/gateways/stripe/includes/class-edd-stripe.php CHANGED
@@ -51,16 +51,28 @@ class EDD_Stripe {
51
  self::$instance->actions();
52
  self::$instance->filters();
53
 
54
- if ( class_exists( 'EDD_License' ) && is_admin() && true === edds_is_pro() ) {
55
- new EDD_License(
56
- EDD_STRIPE_PLUGIN_FILE,
57
- 'Stripe Pro Payment Gateway',
58
- EDD_STRIPE_VERSION,
59
- 'Sandhills Development, LLC',
60
- 'stripe_license_key',
61
- null,
62
- 167
63
- );
 
 
 
 
 
 
 
 
 
 
 
 
64
  }
65
  }
66
 
51
  self::$instance->actions();
52
  self::$instance->filters();
53
 
54
+ if ( true === edds_is_pro() ) {
55
+ if ( class_exists( '\\EDD\\Extensions\\ExtensionRegistry' ) ) {
56
+ add_action( 'edd_extension_license_init', function( \EDD\Extensions\ExtensionRegistry $registry ) {
57
+ $registry->addExtension(
58
+ EDD_STRIPE_PLUGIN_FILE,
59
+ 'Stripe Pro Payment Gateway',
60
+ 167,
61
+ EDD_STRIPE_VERSION,
62
+ 'stripe_license_key'
63
+ );
64
+ } );
65
+ } elseif ( class_exists( 'EDD_License' ) ) {
66
+ new EDD_License(
67
+ EDD_STRIPE_PLUGIN_FILE,
68
+ 'Stripe Pro Payment Gateway',
69
+ EDD_STRIPE_VERSION,
70
+ 'Easy Digital Downloads',
71
+ 'stripe_license_key',
72
+ null,
73
+ 167
74
+ );
75
+ }
76
  }
77
  }
78
 
includes/gateways/stripe/includes/payment-methods/buy-now/functions.php CHANGED
@@ -46,9 +46,11 @@ function edds_shop_supports_buy_now( $supports ) {
46
  return false;
47
  }
48
 
49
- $gateways = edd_get_enabled_payment_gateways();
50
- $stripe_gateways = array( 'stripe', 'stripe-prb' );
51
- if ( empty( array_diff( array_keys( $gateways ), $stripe_gateways ) ) ) {
 
 
52
  return true;
53
  }
54
 
46
  return false;
47
  }
48
 
49
+ $gateways = edd_get_enabled_payment_gateways();
50
+ $stripe_gateways = array( 'stripe', 'stripe-prb' );
51
+ $remaining_gateways = array_diff( array_keys( $gateways ), $stripe_gateways );
52
+
53
+ if ( empty( $remaining_gateways ) ) {
54
  return true;
55
  }
56
 
includes/gateways/stripe/includes/scripts.php CHANGED
@@ -55,7 +55,7 @@ function edd_stripe_js( $force_load_scripts = false ) {
55
  true
56
  );
57
 
58
- $is_checkout = edd_is_checkout();
59
  $restrict_assets = edd_get_option( 'stripe_restrict_assets', false );
60
 
61
  if ( $is_checkout || $force_load_scripts || false === $restrict_assets ) {
55
  true
56
  );
57
 
58
+ $is_checkout = edd_is_checkout() && 0 < edd_get_cart_total();
59
  $restrict_assets = edd_get_option( 'stripe_restrict_assets', false );
60
 
61
  if ( $is_checkout || $force_load_scripts || false === $restrict_assets ) {
includes/gateways/stripe/vendor/composer/ClassLoader.php CHANGED
@@ -37,13 +37,11 @@ namespace Composer\Autoload;
37
  *
38
  * @author Fabien Potencier <fabien@symfony.com>
39
  * @author Jordi Boggiano <j.boggiano@seld.be>
40
- * @see https://www.php-fig.org/psr/psr-0/
41
- * @see https://www.php-fig.org/psr/psr-4/
42
  */
43
  class ClassLoader
44
  {
45
- private $vendorDir;
46
-
47
  // PSR-4
48
  private $prefixLengthsPsr4 = array();
49
  private $prefixDirsPsr4 = array();
@@ -59,17 +57,10 @@ class ClassLoader
59
  private $missingClasses = array();
60
  private $apcuPrefix;
61
 
62
- private static $registeredLoaders = array();
63
-
64
- public function __construct($vendorDir = null)
65
- {
66
- $this->vendorDir = $vendorDir;
67
- }
68
-
69
  public function getPrefixes()
70
  {
71
  if (!empty($this->prefixesPsr0)) {
72
- return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
73
  }
74
 
75
  return array();
@@ -309,17 +300,6 @@ class ClassLoader
309
  public function register($prepend = false)
310
  {
311
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
312
-
313
- if (null === $this->vendorDir) {
314
- return;
315
- }
316
-
317
- if ($prepend) {
318
- self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
319
- } else {
320
- unset(self::$registeredLoaders[$this->vendorDir]);
321
- self::$registeredLoaders[$this->vendorDir] = $this;
322
- }
323
  }
324
 
325
  /**
@@ -328,17 +308,13 @@ class ClassLoader
328
  public function unregister()
329
  {
330
  spl_autoload_unregister(array($this, 'loadClass'));
331
-
332
- if (null !== $this->vendorDir) {
333
- unset(self::$registeredLoaders[$this->vendorDir]);
334
- }
335
  }
336
 
337
  /**
338
  * Loads the given class or interface.
339
  *
340
  * @param string $class The name of the class
341
- * @return true|null True if loaded, null otherwise
342
  */
343
  public function loadClass($class)
344
  {
@@ -347,8 +323,6 @@ class ClassLoader
347
 
348
  return true;
349
  }
350
-
351
- return null;
352
  }
353
 
354
  /**
@@ -393,16 +367,6 @@ class ClassLoader
393
  return $file;
394
  }
395
 
396
- /**
397
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
398
- *
399
- * @return self[]
400
- */
401
- public static function getRegisteredLoaders()
402
- {
403
- return self::$registeredLoaders;
404
- }
405
-
406
  private function findFileWithExtension($class, $ext)
407
  {
408
  // PSR-4 lookup
37
  *
38
  * @author Fabien Potencier <fabien@symfony.com>
39
  * @author Jordi Boggiano <j.boggiano@seld.be>
40
+ * @see http://www.php-fig.org/psr/psr-0/
41
+ * @see http://www.php-fig.org/psr/psr-4/
42
  */
43
  class ClassLoader
44
  {
 
 
45
  // PSR-4
46
  private $prefixLengthsPsr4 = array();
47
  private $prefixDirsPsr4 = array();
57
  private $missingClasses = array();
58
  private $apcuPrefix;
59
 
 
 
 
 
 
 
 
60
  public function getPrefixes()
61
  {
62
  if (!empty($this->prefixesPsr0)) {
63
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
64
  }
65
 
66
  return array();
300
  public function register($prepend = false)
301
  {
302
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
 
 
 
 
 
 
 
 
 
 
 
303
  }
304
 
305
  /**
308
  public function unregister()
309
  {
310
  spl_autoload_unregister(array($this, 'loadClass'));
 
 
 
 
311
  }
312
 
313
  /**
314
  * Loads the given class or interface.
315
  *
316
  * @param string $class The name of the class
317
+ * @return bool|null True if loaded, null otherwise
318
  */
319
  public function loadClass($class)
320
  {
323
 
324
  return true;
325
  }
 
 
326
  }
327
 
328
  /**
367
  return $file;
368
  }
369
 
 
 
 
 
 
 
 
 
 
 
370
  private function findFileWithExtension($class, $ext)
371
  {
372
  // PSR-4 lookup
includes/gateways/stripe/vendor/composer/LICENSE CHANGED
@@ -1,4 +1,3 @@
1
-
2
  Copyright (c) Nils Adermann, Jordi Boggiano
3
 
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -18,4 +17,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
  THE SOFTWARE.
21
-
 
1
  Copyright (c) Nils Adermann, Jordi Boggiano
2
 
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
17
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
  THE SOFTWARE.
 
includes/gateways/stripe/vendor/composer/autoload_classmap.php CHANGED
@@ -6,5 +6,4 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
- 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
10
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
9
  );
includes/gateways/stripe/vendor/composer/autoload_real.php CHANGED
@@ -22,15 +22,13 @@ class ComposerAutoloaderInitce2073d68aa3da842e5b37a3b60e999a
22
  return self::$loader;
23
  }
24
 
25
- require __DIR__ . '/platform_check.php';
26
-
27
  spl_autoload_register(array('ComposerAutoloaderInitce2073d68aa3da842e5b37a3b60e999a', 'loadClassLoader'), true, true);
28
- self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
29
  spl_autoload_unregister(array('ComposerAutoloaderInitce2073d68aa3da842e5b37a3b60e999a', 'loadClassLoader'));
30
 
31
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
32
  if ($useStaticLoader) {
33
- require __DIR__ . '/autoload_static.php';
34
 
35
  call_user_func(\Composer\Autoload\ComposerStaticInitce2073d68aa3da842e5b37a3b60e999a::getInitializer($loader));
36
  } else {
22
  return self::$loader;
23
  }
24
 
 
 
25
  spl_autoload_register(array('ComposerAutoloaderInitce2073d68aa3da842e5b37a3b60e999a', 'loadClassLoader'), true, true);
26
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
  spl_autoload_unregister(array('ComposerAutoloaderInitce2073d68aa3da842e5b37a3b60e999a', 'loadClassLoader'));
28
 
29
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
30
  if ($useStaticLoader) {
31
+ require_once __DIR__ . '/autoload_static.php';
32
 
33
  call_user_func(\Composer\Autoload\ComposerStaticInitce2073d68aa3da842e5b37a3b60e999a::getInitializer($loader));
34
  } else {
includes/gateways/stripe/vendor/composer/autoload_static.php CHANGED
@@ -28,16 +28,11 @@ class ComposerStaticInitce2073d68aa3da842e5b37a3b60e999a
28
  ),
29
  );
30
 
31
- public static $classMap = array (
32
- 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
33
- );
34
-
35
  public static function getInitializer(ClassLoader $loader)
36
  {
37
  return \Closure::bind(function () use ($loader) {
38
  $loader->prefixLengthsPsr4 = ComposerStaticInitce2073d68aa3da842e5b37a3b60e999a::$prefixLengthsPsr4;
39
  $loader->prefixDirsPsr4 = ComposerStaticInitce2073d68aa3da842e5b37a3b60e999a::$prefixDirsPsr4;
40
- $loader->classMap = ComposerStaticInitce2073d68aa3da842e5b37a3b60e999a::$classMap;
41
 
42
  }, null, ClassLoader::class);
43
  }
28
  ),
29
  );
30
 
 
 
 
 
31
  public static function getInitializer(ClassLoader $loader)
32
  {
33
  return \Closure::bind(function () use ($loader) {
34
  $loader->prefixLengthsPsr4 = ComposerStaticInitce2073d68aa3da842e5b37a3b60e999a::$prefixLengthsPsr4;
35
  $loader->prefixDirsPsr4 = ComposerStaticInitce2073d68aa3da842e5b37a3b60e999a::$prefixDirsPsr4;
 
36
 
37
  }, null, ClassLoader::class);
38
  }
includes/gateways/stripe/vendor/composer/installed.json CHANGED
@@ -1,223 +1,217 @@
1
- {
2
- "packages": [
3
- {
4
- "name": "composer/installers",
5
- "version": "v1.11.0",
6
- "version_normalized": "1.11.0.0",
7
- "source": {
8
- "type": "git",
9
- "url": "https://github.com/composer/installers.git",
10
- "reference": "ae03311f45dfe194412081526be2e003960df74b"
11
- },
12
- "dist": {
13
- "type": "zip",
14
- "url": "https://api.github.com/repos/composer/installers/zipball/ae03311f45dfe194412081526be2e003960df74b",
15
- "reference": "ae03311f45dfe194412081526be2e003960df74b",
16
- "shasum": ""
17
- },
18
- "require": {
19
- "composer-plugin-api": "^1.0 || ^2.0"
20
- },
21
- "replace": {
22
- "roundcube/plugin-installer": "*",
23
- "shama/baton": "*"
24
- },
25
- "require-dev": {
26
- "composer/composer": "1.6.* || ^2.0",
27
- "composer/semver": "^1 || ^3",
28
- "phpstan/phpstan": "^0.12.55",
29
- "phpstan/phpstan-phpunit": "^0.12.16",
30
- "symfony/phpunit-bridge": "^4.2 || ^5",
31
- "symfony/process": "^2.3"
32
- },
33
- "time": "2021-04-28T06:42:17+00:00",
34
- "type": "composer-plugin",
35
- "extra": {
36
- "class": "Composer\\Installers\\Plugin",
37
- "branch-alias": {
38
- "dev-main": "1.x-dev"
39
- }
40
- },
41
- "installation-source": "dist",
42
- "autoload": {
43
- "psr-4": {
44
- "Composer\\Installers\\": "src/Composer/Installers"
45
- }
46
- },
47
- "notification-url": "https://packagist.org/downloads/",
48
- "license": [
49
- "MIT"
50
- ],
51
- "authors": [
52
- {
53
- "name": "Kyle Robinson Young",
54
- "email": "kyle@dontkry.com",
55
- "homepage": "https://github.com/shama"
56
- }
57
- ],
58
- "description": "A multi-framework Composer library installer",
59
- "homepage": "https://composer.github.io/installers/",
60
- "keywords": [
61
- "Craft",
62
- "Dolibarr",
63
- "Eliasis",
64
- "Hurad",
65
- "ImageCMS",
66
- "Kanboard",
67
- "Lan Management System",
68
- "MODX Evo",
69
- "MantisBT",
70
- "Mautic",
71
- "Maya",
72
- "OXID",
73
- "Plentymarkets",
74
- "Porto",
75
- "RadPHP",
76
- "SMF",
77
- "Starbug",
78
- "Thelia",
79
- "Whmcs",
80
- "WolfCMS",
81
- "agl",
82
- "aimeos",
83
- "annotatecms",
84
- "attogram",
85
- "bitrix",
86
- "cakephp",
87
- "chef",
88
- "cockpit",
89
- "codeigniter",
90
- "concrete5",
91
- "croogo",
92
- "dokuwiki",
93
- "drupal",
94
- "eZ Platform",
95
- "elgg",
96
- "expressionengine",
97
- "fuelphp",
98
- "grav",
99
- "installer",
100
- "itop",
101
- "joomla",
102
- "known",
103
- "kohana",
104
- "laravel",
105
- "lavalite",
106
- "lithium",
107
- "magento",
108
- "majima",
109
- "mako",
110
- "mediawiki",
111
- "miaoxing",
112
- "modulework",
113
- "modx",
114
- "moodle",
115
- "osclass",
116
- "phpbb",
117
- "piwik",
118
- "ppi",
119
- "processwire",
120
- "puppet",
121
- "pxcms",
122
- "reindex",
123
- "roundcube",
124
- "shopware",
125
- "silverstripe",
126
- "sydes",
127
- "sylius",
128
- "symfony",
129
- "tastyigniter",
130
- "typo3",
131
- "wordpress",
132
- "yawik",
133
- "zend",
134
- "zikula"
135
- ],
136
- "support": {
137
- "issues": "https://github.com/composer/installers/issues",
138
- "source": "https://github.com/composer/installers/tree/v1.11.0"
139
- },
140
- "funding": [
141
- {
142
- "url": "https://packagist.com",
143
- "type": "custom"
144
- },
145
- {
146
- "url": "https://github.com/composer",
147
- "type": "github"
148
- },
149
- {
150
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
151
- "type": "tidelift"
152
- }
153
- ],
154
- "install-path": "./installers"
155
  },
156
- {
157
- "name": "stripe/stripe-php",
158
- "version": "v7.47.0",
159
- "version_normalized": "7.47.0.0",
160
- "source": {
161
- "type": "git",
162
- "url": "https://github.com/stripe/stripe-php.git",
163
- "reference": "b51656cb398d081fcee53a76f6edb8fd5c1a5306"
164
- },
165
- "dist": {
166
- "type": "zip",
167
- "url": "https://api.github.com/repos/stripe/stripe-php/zipball/b51656cb398d081fcee53a76f6edb8fd5c1a5306",
168
- "reference": "b51656cb398d081fcee53a76f6edb8fd5c1a5306",
169
- "shasum": ""
170
- },
171
- "require": {
172
- "ext-curl": "*",
173
- "ext-json": "*",
174
- "ext-mbstring": "*",
175
- "php": ">=5.6.0"
176
- },
177
- "require-dev": {
178
- "friendsofphp/php-cs-fixer": "2.16.1",
179
- "php-coveralls/php-coveralls": "^2.1",
180
- "phpunit/phpunit": "^5.7",
181
- "squizlabs/php_codesniffer": "^3.3",
182
- "symfony/process": "~3.4"
183
- },
184
- "time": "2020-08-13T22:35:56+00:00",
185
- "type": "library",
186
- "extra": {
187
- "branch-alias": {
188
- "dev-master": "2.0-dev"
189
- }
190
- },
191
- "installation-source": "dist",
192
- "autoload": {
193
- "psr-4": {
194
- "Stripe\\": "lib/"
195
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
  },
197
- "notification-url": "https://packagist.org/downloads/",
198
- "license": [
199
- "MIT"
200
- ],
201
- "authors": [
202
- {
203
- "name": "Stripe and contributors",
204
- "homepage": "https://github.com/stripe/stripe-php/contributors"
205
- }
206
- ],
207
- "description": "Stripe PHP Library",
208
- "homepage": "https://stripe.com/",
209
- "keywords": [
210
- "api",
211
- "payment processing",
212
- "stripe"
213
- ],
214
- "support": {
215
- "issues": "https://github.com/stripe/stripe-php/issues",
216
- "source": "https://github.com/stripe/stripe-php/tree/v7.47.0"
217
  },
218
- "install-path": "../stripe/stripe-php"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
219
  }
220
- ],
221
- "dev": false,
222
- "dev-package-names": []
223
- }
1
+ [
2
+ {
3
+ "name": "composer/installers",
4
+ "version": "v1.11.0",
5
+ "version_normalized": "1.11.0.0",
6
+ "source": {
7
+ "type": "git",
8
+ "url": "https://github.com/composer/installers.git",
9
+ "reference": "ae03311f45dfe194412081526be2e003960df74b"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  },
11
+ "dist": {
12
+ "type": "zip",
13
+ "url": "https://api.github.com/repos/composer/installers/zipball/ae03311f45dfe194412081526be2e003960df74b",
14
+ "reference": "ae03311f45dfe194412081526be2e003960df74b",
15
+ "shasum": ""
16
+ },
17
+ "require": {
18
+ "composer-plugin-api": "^1.0 || ^2.0"
19
+ },
20
+ "replace": {
21
+ "roundcube/plugin-installer": "*",
22
+ "shama/baton": "*"
23
+ },
24
+ "require-dev": {
25
+ "composer/composer": "1.6.* || ^2.0",
26
+ "composer/semver": "^1 || ^3",
27
+ "phpstan/phpstan": "^0.12.55",
28
+ "phpstan/phpstan-phpunit": "^0.12.16",
29
+ "symfony/phpunit-bridge": "^4.2 || ^5",
30
+ "symfony/process": "^2.3"
31
+ },
32
+ "time": "2021-04-28T06:42:17+00:00",
33
+ "type": "composer-plugin",
34
+ "extra": {
35
+ "class": "Composer\\Installers\\Plugin",
36
+ "branch-alias": {
37
+ "dev-main": "1.x-dev"
38
+ }
39
+ },
40
+ "installation-source": "dist",
41
+ "autoload": {
42
+ "psr-4": {
43
+ "Composer\\Installers\\": "src/Composer/Installers"
44
+ }
45
+ },
46
+ "notification-url": "https://packagist.org/downloads/",
47
+ "license": [
48
+ "MIT"
49
+ ],
50
+ "authors": [
51
+ {
52
+ "name": "Kyle Robinson Young",
53
+ "email": "kyle@dontkry.com",
54
+ "homepage": "https://github.com/shama"
55
+ }
56
+ ],
57
+ "description": "A multi-framework Composer library installer",
58
+ "homepage": "https://composer.github.io/installers/",
59
+ "keywords": [
60
+ "Craft",
61
+ "Dolibarr",
62
+ "Eliasis",
63
+ "Hurad",
64
+ "ImageCMS",
65
+ "Kanboard",
66
+ "Lan Management System",
67
+ "MODX Evo",
68
+ "MantisBT",
69
+ "Mautic",
70
+ "Maya",
71
+ "OXID",
72
+ "Plentymarkets",
73
+ "Porto",
74
+ "RadPHP",
75
+ "SMF",
76
+ "Starbug",
77
+ "Thelia",
78
+ "Whmcs",
79
+ "WolfCMS",
80
+ "agl",
81
+ "aimeos",
82
+ "annotatecms",
83
+ "attogram",
84
+ "bitrix",
85
+ "cakephp",
86
+ "chef",
87
+ "cockpit",
88
+ "codeigniter",
89
+ "concrete5",
90
+ "croogo",
91
+ "dokuwiki",
92
+ "drupal",
93
+ "eZ Platform",
94
+ "elgg",
95
+ "expressionengine",
96
+ "fuelphp",
97
+ "grav",
98
+ "installer",
99
+ "itop",
100
+ "joomla",
101
+ "known",
102
+ "kohana",
103
+ "laravel",
104
+ "lavalite",
105
+ "lithium",
106
+ "magento",
107
+ "majima",
108
+ "mako",
109
+ "mediawiki",
110
+ "miaoxing",
111
+ "modulework",
112
+ "modx",
113
+ "moodle",
114
+ "osclass",
115
+ "phpbb",
116
+ "piwik",
117
+ "ppi",
118
+ "processwire",
119
+ "puppet",
120
+ "pxcms",
121
+ "reindex",
122
+ "roundcube",
123
+ "shopware",
124
+ "silverstripe",
125
+ "sydes",
126
+ "sylius",
127
+ "symfony",
128
+ "tastyigniter",
129
+ "typo3",
130
+ "wordpress",
131
+ "yawik",
132
+ "zend",
133
+ "zikula"
134
+ ],
135
+ "support": {
136
+ "issues": "https://github.com/composer/installers/issues",
137
+ "source": "https://github.com/composer/installers/tree/v1.11.0"
138
+ },
139
+ "funding": [
140
+ {
141
+ "url": "https://packagist.com",
142
+ "type": "custom"
143
  },
144
+ {
145
+ "url": "https://github.com/composer",
146
+ "type": "github"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
  },
148
+ {
149
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
150
+ "type": "tidelift"
151
+ }
152
+ ]
153
+ },
154
+ {
155
+ "name": "stripe/stripe-php",
156
+ "version": "v7.47.0",
157
+ "version_normalized": "7.47.0.0",
158
+ "source": {
159
+ "type": "git",
160
+ "url": "https://github.com/stripe/stripe-php.git",
161
+ "reference": "b51656cb398d081fcee53a76f6edb8fd5c1a5306"
162
+ },
163
+ "dist": {
164
+ "type": "zip",
165
+ "url": "https://api.github.com/repos/stripe/stripe-php/zipball/b51656cb398d081fcee53a76f6edb8fd5c1a5306",
166
+ "reference": "b51656cb398d081fcee53a76f6edb8fd5c1a5306",
167
+ "shasum": ""
168
+ },
169
+ "require": {
170
+ "ext-curl": "*",
171
+ "ext-json": "*",
172
+ "ext-mbstring": "*",
173
+ "php": ">=5.6.0"
174
+ },
175
+ "require-dev": {
176
+ "friendsofphp/php-cs-fixer": "2.16.1",
177
+ "php-coveralls/php-coveralls": "^2.1",
178
+ "phpunit/phpunit": "^5.7",
179
+ "squizlabs/php_codesniffer": "^3.3",
180
+ "symfony/process": "~3.4"
181
+ },
182
+ "time": "2020-08-13T22:35:56+00:00",
183
+ "type": "library",
184
+ "extra": {
185
+ "branch-alias": {
186
+ "dev-master": "2.0-dev"
187
+ }
188
+ },
189
+ "installation-source": "dist",
190
+ "autoload": {
191
+ "psr-4": {
192
+ "Stripe\\": "lib/"
193
+ }
194
+ },
195
+ "notification-url": "https://packagist.org/downloads/",
196
+ "license": [
197
+ "MIT"
198
+ ],
199
+ "authors": [
200
+ {
201
+ "name": "Stripe and contributors",
202
+ "homepage": "https://github.com/stripe/stripe-php/contributors"
203
+ }
204
+ ],
205
+ "description": "Stripe PHP Library",
206
+ "homepage": "https://stripe.com/",
207
+ "keywords": [
208
+ "api",
209
+ "payment processing",
210
+ "stripe"
211
+ ],
212
+ "support": {
213
+ "issues": "https://github.com/stripe/stripe-php/issues",
214
+ "source": "https://github.com/stripe/stripe-php/tree/v7.47.0"
215
  }
216
+ }
217
+ ]
 
 
includes/gateways/stripe/vendor/composer/installed.php CHANGED
@@ -5,7 +5,7 @@
5
  'type' => 'wordpress-plugin',
6
  'install_path' => __DIR__ . '/../../',
7
  'aliases' => array(),
8
- 'reference' => '9e4551f2be6b579c115ce4ebd6a8897b89f7f16a',
9
  'name' => 'easy-digital-downloads/edd-stripe',
10
  'dev' => false,
11
  ),
@@ -25,7 +25,7 @@
25
  'type' => 'wordpress-plugin',
26
  'install_path' => __DIR__ . '/../../',
27
  'aliases' => array(),
28
- 'reference' => '9e4551f2be6b579c115ce4ebd6a8897b89f7f16a',
29
  'dev_requirement' => false,
30
  ),
31
  'roundcube/plugin-installer' => array(
5
  'type' => 'wordpress-plugin',
6
  'install_path' => __DIR__ . '/../../',
7
  'aliases' => array(),
8
+ 'reference' => 'e7f98d164d4da798f7126fec7d294fce16299e5d',
9
  'name' => 'easy-digital-downloads/edd-stripe',
10
  'dev' => false,
11
  ),
25
  'type' => 'wordpress-plugin',
26
  'install_path' => __DIR__ . '/../../',
27
  'aliases' => array(),
28
+ 'reference' => 'e7f98d164d4da798f7126fec7d294fce16299e5d',
29
  'dev_requirement' => false,
30
  ),
31
  'roundcube/plugin-installer' => array(
includes/install.php CHANGED
@@ -191,6 +191,9 @@ function edd_run_install() {
191
  update_option( 'edd_settings', $merged_options );
192
  update_option( 'edd_version', EDD_VERSION );
193
 
 
 
 
194
  // Create wp-content/uploads/edd/ folder and the .htaccess file
195
  edd_create_protection_files( true );
196
 
@@ -209,6 +212,7 @@ function edd_run_install() {
209
  */
210
  @EDD()->customers->create_table();
211
  @EDD()->customer_meta->create_table();
 
212
  }
213
 
214
  // Check for PHP Session support, and enable if available
@@ -321,6 +325,10 @@ function edd_after_install() {
321
  do_action( 'edd_after_install', $edd_options );
322
  }
323
 
 
 
 
 
324
  update_option( '_edd_table_check', ( current_time( 'timestamp' ) + WEEK_IN_SECONDS ) );
325
 
326
  }
191
  update_option( 'edd_settings', $merged_options );
192
  update_option( 'edd_version', EDD_VERSION );
193
 
194
+ // Set the activation date.
195
+ edd_get_activation_date();
196
+
197
  // Create wp-content/uploads/edd/ folder and the .htaccess file
198
  edd_create_protection_files( true );
199
 
212
  */
213
  @EDD()->customers->create_table();
214
  @EDD()->customer_meta->create_table();
215
+ EDD()->notifications->create_table();
216
  }
217
 
218
  // Check for PHP Session support, and enable if available
325
  do_action( 'edd_after_install', $edd_options );
326
  }
327
 
328
+ if ( ! EDD()->notifications->installed() ) {
329
+ EDD()->notifications->create_table();
330
+ }
331
+
332
  update_option( '_edd_table_check', ( current_time( 'timestamp' ) + WEEK_IN_SECONDS ) );
333
 
334
  }
includes/misc-functions.php CHANGED
@@ -141,28 +141,14 @@ function edd_get_file_extension( $str ) {
141
  * Checks if the string (filename) provided is an image URL
142
  *
143
  * @since 1.0
144
- * @param string $str Filename
145
  * @return bool Whether or not the filename is an image
146
  */
147
- function edd_string_is_image_url( $str ) {
148
- $ext = edd_get_file_extension( $str );
 
149
 
150
- switch ( strtolower( $ext ) ) {
151
- case 'jpg';
152
- $return = true;
153
- break;
154
- case 'png';
155
- $return = true;
156
- break;
157
- case 'gif';
158
- $return = true;
159
- break;
160
- default:
161
- $return = false;
162
- break;
163
- }
164
-
165
- return (bool) apply_filters( 'edd_string_is_image', $return, $str );
166
  }
167
 
168
  /**
@@ -1051,6 +1037,40 @@ function edd_is_promo_active() {
1051
  return false;
1052
  }
1053
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1054
  /**
1055
  * Polyfills for is_countable and is_iterable
1056
  *
141
  * Checks if the string (filename) provided is an image URL
142
  *
143
  * @since 1.0
144
+ * @param string $filename Filename
145
  * @return bool Whether or not the filename is an image
146
  */
147
+ function edd_string_is_image_url( $filename ) {
148
+ $ext = edd_get_file_extension( $filename );
149
+ $images = array( 'jpg', 'jpeg', 'png', 'gif', 'webp' );
150
 
151
+ return (bool) apply_filters( 'edd_string_is_image', in_array( $ext, $images, true ), $filename );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  }
153
 
154
  /**
1037
  return false;
1038
  }
1039
 
1040
+ /**
1041
+ * Gets the date that this EDD install was activated (for new installs).
1042
+ * For existing installs, this option is added whenever the function is first used.
1043
+ *
1044
+ * @since 2.11.4
1045
+ * @return int The timestamp when EDD was marked as activated.
1046
+ */
1047
+ function edd_get_activation_date() {
1048
+ $activation_date = get_option( 'edd_activation_date', '' );
1049
+ if ( ! $activation_date ) {
1050
+ $activation_date = time();
1051
+ // Gets the first order placed in the store (any status).
1052
+ $payments = edd_get_payments(
1053
+ array(
1054
+ 'output' => 'posts',
1055
+ 'number' => 1,
1056
+ 'orderby' => 'ID',
1057
+ 'order' => 'ASC',
1058
+ 'no_found_rows' => true,
1059
+ )
1060
+ );
1061
+ if ( $payments ) {
1062
+ $first_payment = reset( $payments );
1063
+ // Use just the post date, rather than looking for the completed date (first payment may not be complete).
1064
+ if ( ! empty( $first_payment->post_date_gmt ) ) {
1065
+ $activation_date = strtotime( $first_payment->post_date_gmt );
1066
+ }
1067
+ }
1068
+ update_option( 'edd_activation_date', $activation_date );
1069
+ }
1070
+
1071
+ return $activation_date;
1072
+ }
1073
+
1074
  /**
1075
  * Polyfills for is_countable and is_iterable
1076
  *
includes/models/Notification.php ADDED
@@ -0,0 +1,192 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Notification.php
4
+ *
5
+ * @package easy-digital-downloads
6
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
7
+ * @license GPL2+
8
+ * @since 2.11.4
9
+ */
10
+
11
+ namespace EDD\Models;
12
+
13
+ class Notification {
14
+
15
+ /**
16
+ * @var int Unique internal ID.
17
+ */
18
+ public $id;
19
+
20
+ /**
21
+ * @var null|int ID from the remote feed. If `null` then this notification was added internally
22
+ * and not via the remote import.
23
+ */
24
+ public $remote_id = null;
25
+
26
+ /**
27
+ * @var string Title of the notification.
28
+ */
29
+ public $title;
30
+
31
+ /**
32
+ * @var string Notification content.
33
+ */
34
+ public $content;
35
+
36
+ /**
37
+ * @var array|null Button information, if set.
38
+ */
39
+ public $buttons;
40
+
41
+ /**
42
+ * @var string Notification type, including: `warning`, `error`, `info`, or `success`.
43
+ */
44
+ public $type;
45
+
46
+ /**
47
+ * @var array|null Conditions that must be met to display this notification. If `null`
48
+ * then there are no conditions.
49
+ */
50
+ public $conditions = null;
51
+
52
+ /**
53
+ * @var null|string Date to start displaying the notification.
54
+ */
55
+ public $start = null;
56
+
57
+ /**
58
+ * @var null|string Date to stop displaying the notification.
59
+ */
60
+ public $end = null;
61
+
62
+ /**
63
+ * @var bool Whether this notification has been dismissed by the user.
64
+ */
65
+ public $dismissed = false;
66
+
67
+ /**
68
+ * @var string Date the notification was added to the database.
69
+ */
70
+ public $date_created;
71
+
72
+ /**
73
+ * @var string Date the notification was last updated in the database.
74
+ */
75
+ public $date_updated;
76
+
77
+ /**
78
+ * @var string[]
79
+ */
80
+ protected $casts = array(
81
+ 'id' => 'int',
82
+ 'remote_id' => 'int',
83
+ 'buttons' => 'array',
84
+ 'conditions' => 'array',
85
+ 'dismissed' => 'bool',
86
+ );
87
+
88
+ /**
89
+ * Constructor
90
+ *
91
+ * @param array $data Row from the database.
92
+ */
93
+ public function __construct( $data = array() ) {
94
+ foreach ( $data as $property => $value ) {
95
+ if ( property_exists( $this, $property ) ) {
96
+ $this->{$property} = $this->castAttribute( $property, $value );
97
+ }
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Casts a property to its designated type.
103
+ *
104
+ * @todo Move to trait or base class.
105
+ *
106
+ * @since 2.11.4
107
+ *
108
+ * @param string $propertyName
109
+ * @param mixed $value
110
+ *
111
+ * @return bool|float|int|mixed|string|null
112
+ */
113
+ private function castAttribute( $propertyName, $value ) {
114
+ if ( ! array_key_exists( $propertyName, $this->casts ) ) {
115
+ return $value;
116
+ }
117
+
118
+ // Let null be null.
119
+ if ( is_null( $value ) ) {
120
+ return null;
121
+ }
122
+
123
+ switch ( $this->casts[ $propertyName ] ) {
124
+ case 'array' :
125
+ return json_decode( $value, true );
126
+ case 'bool' :
127
+ return (bool) $value;
128
+ case 'float' :
129
+ return (float) $value;
130
+ case 'int' :
131
+ return (int) $value;
132
+ case 'string' :
133
+ return (string) $value;
134
+ default :
135
+ return $value;
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Returns the icon name to use for this notification type.
141
+ *
142
+ * @since 2.11.4
143
+ *
144
+ * @return string
145
+ */
146
+ public function getIcon() {
147
+ switch ( $this->type ) {
148
+ case 'warning' :
149
+ return 'warning';
150
+ case 'error' :
151
+ return 'dismiss';
152
+ case 'info' :
153
+ return 'admin-generic';
154
+ case 'success' :
155
+ default :
156
+ return 'yes-alt';
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Converts this model to an array.
162
+ *
163
+ * @todo Move to trait.
164
+ *
165
+ * @since 2.11.4
166
+ *
167
+ * @return array
168
+ */
169
+ public function toArray() {
170
+ $data = array();
171
+
172
+ /*
173
+ * get_object_vars() returns non-public properties when used within the class
174
+ * so we're using a ReflectionClass to get the public properties only.
175
+ */
176
+ $object = new \ReflectionClass( $this );
177
+
178
+ foreach ( $object->getProperties( \ReflectionProperty::IS_PUBLIC ) as $property ) {
179
+ if ( $property instanceof \ReflectionProperty && isset( $this->{$property->name} ) ) {
180
+ $data[ $property->name ] = $this->{$property->name};
181
+ }
182
+ }
183
+
184
+ $data['icon_name'] = $this->getIcon();
185
+
186
+ /* Translators: %s - a length of time (e.g. "1 second") */
187
+ $data['relative_date'] = sprintf( __( '%s ago', 'easy-digital-downloads' ), human_time_diff( strtotime( $this->date_created ) ) );
188
+
189
+ return $data;
190
+ }
191
+
192
+ }
includes/process-download.php CHANGED
@@ -699,6 +699,7 @@ function edd_get_file_ctype( $extension ) {
699
  case 'wav' : $ctype = "audio/x-wav"; break;
700
  case 'wbmp' : $ctype = "image/vnd.wap.wbmp"; break;
701
  case 'wbmxl' : $ctype = "application/vnd.wap.wbxml"; break;
 
702
  case 'wm' : $ctype = "video/x-ms-wm"; break;
703
  case 'wml' : $ctype = "text/vnd.wap.wml"; break;
704
  case 'wmlc' : $ctype = "application/vnd.wap.wmlc"; break;
699
  case 'wav' : $ctype = "audio/x-wav"; break;
700
  case 'wbmp' : $ctype = "image/vnd.wap.wbmp"; break;
701
  case 'wbmxl' : $ctype = "application/vnd.wap.wbxml"; break;
702
+ case 'webp' : $ctype = "image/webp"; break;
703
  case 'wm' : $ctype = "video/x-ms-wm"; break;
704
  case 'wml' : $ctype = "text/vnd.wap.wml"; break;
705
  case 'wmlc' : $ctype = "application/vnd.wap.wmlc"; break;
includes/scripts.php CHANGED
@@ -237,6 +237,14 @@ function edd_load_admin_scripts( $hook ) {
237
  'wait' => __( 'Please wait &hellip;', 'easy-digital-downloads' ),
238
  ));
239
 
 
 
 
 
 
 
 
 
240
  /*
241
  * This bit of JavaScript is to facilitate #2704, in order to not break backwards compatibility with the old Variable Price Rows
242
  * while we transition to an entire new markup. They should not be relied on for long-term usage.
@@ -277,6 +285,17 @@ function edd_load_admin_scripts( $hook ) {
277
  }
278
  add_action( 'admin_enqueue_scripts', 'edd_load_admin_scripts', 100 );
279
 
 
 
 
 
 
 
 
 
 
 
 
280
  /**
281
  * Admin Downloads Icon
282
  *
237
  'wait' => __( 'Please wait &hellip;', 'easy-digital-downloads' ),
238
  ));
239
 
240
+ wp_register_script( 'alpinejs', $js_dir . 'alpine.min.js', array(), '3.4.2', false );
241
+ wp_register_script( 'edd-admin-notifications', $js_dir . 'admin-notifications.js', array( 'alpinejs' ), EDD_VERSION, false );
242
+ wp_enqueue_script( 'edd-admin-notifications' );
243
+ wp_localize_script( 'edd-admin-notifications', 'eddNotificationsVars', array(
244
+ 'restBase' => rest_url( \EDD\API\v3\Endpoint::$namespace ),
245
+ 'restNonce' => wp_create_nonce( 'wp_rest' ),
246
+ ) );
247
+
248
  /*
249
  * This bit of JavaScript is to facilitate #2704, in order to not break backwards compatibility with the old Variable Price Rows
250
  * while we transition to an entire new markup. They should not be relied on for long-term usage.
285
  }
286
  add_action( 'admin_enqueue_scripts', 'edd_load_admin_scripts', 100 );
287
 
288
+ /**
289
+ * Add `defer` to the AlpineJS script tag.
290
+ */
291
+ add_filter( 'script_loader_tag', function( $url ) {
292
+ if ( false !== strpos( $url, EDD_PLUGIN_URL . 'assets/js/alpine.min.js' ) ) {
293
+ $url = str_replace( ' src', ' defer src', $url );
294
+ }
295
+
296
+ return $url;
297
+ } );
298
+
299
  /**
300
  * Admin Downloads Icon
301
  *
includes/utils/EnvironmentChecker.php ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * EnvironmentChecker.php
4
+ *
5
+ * Checks to see if the environment matches the passed conditions.
6
+ * Supported conditions include:
7
+ *
8
+ * - EDD version number -- either specific versions or wildcards (e.g. "2.x").
9
+ * - Type of license (pass level, à la carte, free).
10
+ *
11
+ * @package easy-digital-downloads
12
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
13
+ * @license GPL2+
14
+ * @since 2.11.4
15
+ */
16
+
17
+ namespace EDD\Utils;
18
+
19
+ use EDD\Admin\Pass_Manager;
20
+
21
+ class EnvironmentChecker {
22
+
23
+ /**
24
+ * @var Pass_Manager
25
+ */
26
+ protected $passManager;
27
+
28
+ /**
29
+ * Types of license/pass conditions that we support.
30
+ * The key is the condition slug and the value is the corresponding
31
+ * method to call in the `Pass_Manager` class to check the condition.
32
+ *
33
+ * @since 2.11.4
34
+ *
35
+ * @var string[]
36
+ */
37
+ protected $validLicenseConditions = array(
38
+ 'free' => 'isFree',
39
+ 'ala-carte' => 'hasIndividualLicense',
40
+ 'pass-personal' => 'hasPersonalPass',
41
+ 'pass-extended' => 'hasExtendedPass',
42
+ 'pass-professional' => 'hasProfessionalPass',
43
+ 'pass-all-access' => 'hasAllAccessPass',
44
+ 'pass-any' => 'has_pass',
45
+ );
46
+
47
+ /**
48
+ * Constructor.
49
+ */
50
+ public function __construct() {
51
+ $this->passManager = new Pass_Manager();
52
+ }
53
+
54
+ /**
55
+ * Checks to see if this environment meets the specified condition.
56
+ *
57
+ * @since 2.11.4
58
+ *
59
+ * @param string $condition Condition to check. Can either be a type of license/pass or a version number.
60
+ *
61
+ * @return bool
62
+ * @throws \InvalidArgumentException
63
+ */
64
+ public function meetsCondition( $condition ) {
65
+ if ( array_key_exists( $condition, $this->validLicenseConditions ) ) {
66
+ return $this->hasLicenseType( $condition );
67
+ } elseif ( $this->isPaymentGateway( $condition ) ) {
68
+ return $this->paymentGatewayMatch( array_keys( edd_get_enabled_payment_gateways() ), $condition );
69
+ } elseif ( $this->isVersionNumber( $condition ) ) {
70
+ return $this->versionNumbersMatch( EDD_VERSION, $condition );
71
+ }
72
+
73
+ throw new \InvalidArgumentException( 'Invalid condition. Must either be a type of license or a version number.' );
74
+ }
75
+
76
+ /**
77
+ * Checks to see if this environment meets all the specified conditions. If any one condition
78
+ * is not met then this returns false.
79
+ *
80
+ * @since 2.11.4
81
+ *
82
+ * @param array $conditions
83
+ *
84
+ * @return bool
85
+ */
86
+ public function meetsConditions( $conditions ) {
87
+ foreach ( $conditions as $condition ) {
88
+ if ( ! $this->meetsCondition( $condition ) ) {
89
+ return false;
90
+ }
91
+ }
92
+
93
+ return true;
94
+ }
95
+
96
+ /**
97
+ * Determines if the site has the specified pass condition.
98
+ *
99
+ * @see EnvironmentChecker::$validLicenseConditions
100
+ *
101
+ * @since 2.11.4
102
+ *
103
+ * @param string $passLevel License type that we're checking to see if the system has.
104
+ *
105
+ * @return bool
106
+ * @throws \InvalidArgumentException
107
+ */
108
+ protected function hasLicenseType( $passLevel ) {
109
+ $method = isset( $this->validLicenseConditions[ $passLevel ] )
110
+ ? $this->validLicenseConditions[ $passLevel ]
111
+ : false;
112
+
113
+ if ( ! $method || ! method_exists( $this->passManager, $method ) ) {
114
+ throw new \InvalidArgumentException( sprintf( 'Method %s not found in Pass_Manager.', $method ) );
115
+ }
116
+
117
+ return call_user_func( array( $this->passManager, $method ) );
118
+ }
119
+
120
+ /**
121
+ * Determines if the provided condition is a payment gateway.
122
+ *
123
+ * @since 2.11.4
124
+ *
125
+ * @param string $condition
126
+ *
127
+ * @return bool
128
+ */
129
+ protected function isPaymentGateway( $condition ) {
130
+ return 'gateway-' === substr( $condition, 0, 8 );
131
+ }
132
+
133
+ /**
134
+ * Determines if the supplied gateway condition is applicable to this site.
135
+ * Will return `true` if the condition is the slug of a payment gateway (potentially with a `gateway-` prefix)
136
+ * that's enabled on this site.
137
+ *
138
+ * @since 2.11.4
139
+ *
140
+ * @param array $enabledGateways Gateways that are enabled on this site.
141
+ * @param string $condition Gateway we're checking to see if it's enabled.
142
+ *
143
+ * @return bool True if the gateway is enabled, false if not.
144
+ */
145
+ public function paymentGatewayMatch( $enabledGateways, $condition ) {
146
+ $gatewayToCheck = str_replace( 'gateway-', '', $condition );
147
+
148
+ return in_array( $gatewayToCheck, $enabledGateways, true );
149
+ }
150
+
151
+ /**
152
+ * Determines if the provided condition is a version number.
153
+ *
154
+ * @since 2.11.4
155
+ *
156
+ * @param string $condition
157
+ *
158
+ * @return bool
159
+ */
160
+ protected function isVersionNumber( $condition ) {
161
+ // First character should always be numeric.
162
+ if ( ! is_numeric( substr( $condition, 0, 1 ) ) ) {
163
+ return false;
164
+ }
165
+
166
+ // Must contain at least one `.` or `-`.
167
+ return false !== strpos( $condition, '.' ) || false !== strpos( $condition, '-' );
168
+ }
169
+
170
+ /**
171
+ * Determines if two version numbers match, or if the `$currentVersion` falls within the wildcard
172
+ * range specified by `$compareVersion`.
173
+ *
174
+ * @since 2.11.4
175
+ *
176
+ * @param string $currentVersion Version number currently in use. This must be a full, exact version number.
177
+ * @param string $compareVersion Version to compare with. This can either be an exact version number or a
178
+ * wildcard (e.g. `2.11.3` or `2.x`). Hyphens are also accepted in lieu of
179
+ * full stops (e.g. `2-11-3` or `2-x`).
180
+ *
181
+ * @return bool
182
+ * @throws \InvalidArgumentException
183
+ */
184
+ public function versionNumbersMatch( $currentVersion, $compareVersion ) {
185
+ $currentVersionPieces = explode( '.', $currentVersion );
186
+
187
+ if ( false !== strpos( $compareVersion, '.' ) ) {
188
+ $compareVersionPieces = explode( '.', $compareVersion );
189
+ } else if ( false !== strpos( $compareVersion, '-' ) ) {
190
+ $compareVersionPieces = explode( '-', $compareVersion );
191
+ } else {
192
+ throw new \InvalidArgumentException( sprintf(
193
+ 'Invalid version number: %s',
194
+ $compareVersion
195
+ ) );
196
+ }
197
+
198
+ $numberCurrentVersionParts = count( $currentVersionPieces );
199
+ $numberCompareVersionParts = count( $compareVersionPieces );
200
+
201
+ /*
202
+ * Normalize the two parts so that they have the same lengths and
203
+ * wildcards (`x`) are removed.
204
+ */
205
+ for ( $i = 0; $i < $numberCurrentVersionParts || $i < $numberCompareVersionParts; $i ++ ) {
206
+ if ( isset( $compareVersionPieces[ $i ] ) && 'x' === strtolower( $compareVersionPieces[ $i ] ) ) {
207
+ unset( $compareVersionPieces[ $i ] );
208
+ }
209
+
210
+ if ( ! isset( $currentVersionPieces[ $i ] ) ) {
211
+ unset( $compareVersionPieces[ $i ] );
212
+ } elseif ( ! isset( $compareVersionPieces[ $i ] ) ) {
213
+ unset( $currentVersionPieces[ $i ] );
214
+ }
215
+ }
216
+
217
+ // Now make sure all the numbers match.
218
+ foreach ( $compareVersionPieces as $index => $versionPiece ) {
219
+ if ( ! isset( $currentVersionPieces[ $index ] ) || $currentVersionPieces[ $index ] !== $versionPiece ) {
220
+ return false;
221
+ }
222
+ }
223
+
224
+ return true;
225
+ }
226
+
227
+ }
includes/utils/NotificationImporter.php ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * NotificationImporter.php
4
+ *
5
+ * @package easy-digital-downloads
6
+ * @copyright Copyright (c) 2021, Easy Digital Downloads
7
+ * @license GPL2+
8
+ * @since 2.11.4
9
+ */
10
+
11
+ namespace EDD\Utils;
12
+
13
+ class NotificationImporter {
14
+
15
+ /**
16
+ * @var EnvironmentChecker
17
+ */
18
+ protected $environmentChecker;
19
+
20
+ /**
21
+ * Constructor
22
+ */
23
+ public function __construct() {
24
+ $this->environmentChecker = new EnvironmentChecker();
25
+ }
26
+
27
+ /**
28
+ * Fetches notifications from the API and imports them locally.
29
+ *
30
+ * @since 2.11.4
31
+ */
32
+ public function run() {
33
+ edd_debug_log( 'Fetching notifications via ' . $this->getApiEndpoint() );
34
+
35
+ try {
36
+ $notifications = $this->fetchNotifications();
37
+ } catch ( \Exception $e ) {
38
+ edd_debug_log( sprintf( 'Notification fetch exception: %s', $e->getMessage() ) );
39
+
40
+ return;
41
+ }
42
+
43
+ foreach ( $notifications as $notification ) {
44
+ $notificationId = isset( $notification->id ) ? $notification->id : 'unknown';
45
+
46
+ edd_debug_log( sprintf( 'Processing notification ID %s', $notificationId ) );
47
+
48
+ try {
49
+ $this->validateNotification( $notification );
50
+
51
+ $existingId = EDD()->notifications->get_column_by( 'id', 'remote_id', $notification->id );
52
+ if ( $existingId ) {
53
+ edd_debug_log( '-- Updating existing notification.' );
54
+
55
+ $this->updateExistingNotification( $existingId, $notification );
56
+ } else {
57
+ edd_debug_log( '-- Inserting new notification.' );
58
+
59
+ $this->insertNewNotification( $notification );
60
+ }
61
+ } catch ( \Exception $e ) {
62
+ edd_debug_log( sprintf( '-- Notification processing failure for ID %s: %s', $notificationId, $e->getMessage() ) );
63
+ }
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Returns the API endpoint to query.
69
+ *
70
+ * @since 2.11.4
71
+ *
72
+ * @return string
73
+ */
74
+ protected function getApiEndpoint() {
75
+ if ( defined( 'EDD_NOTIFICATIONS_API_URL' ) ) {
76
+ return EDD_NOTIFICATIONS_API_URL;
77
+ }
78
+
79
+ return 'https://plugin.easydigitaldownloads.com/wp-content/notifications.json';
80
+ }
81
+
82
+ /**
83
+ * Retrieves notifications from the remote API endpoint.
84
+ *
85
+ * @since 2.11.4
86
+ *
87
+ * @return array
88
+ * @throws \Exception
89
+ */
90
+ public function fetchNotifications() {
91
+ $response = wp_remote_get( $this->getApiEndpoint() );
92
+
93
+ if ( is_wp_error( $response ) ) {
94
+ throw new \Exception( $response->get_error_message() );
95
+ }
96
+
97
+ $notifications = wp_remote_retrieve_body( $response );
98
+
99
+ return ! empty( $notifications ) ? json_decode( $notifications ) : array();
100
+ }
101
+
102
+ /**
103
+ * Validates the notification from the remote API to make sure we actually
104
+ * want to save it.
105
+ *
106
+ * @since 2.11.4
107
+ *
108
+ * @param object $notification
109
+ *
110
+ * @throws \Exception
111
+ */
112
+ public function validateNotification( $notification ) {
113
+ // Make sure we have all the required data.
114
+ $requiredProperties = array(
115
+ 'id',
116
+ 'title',
117
+ 'content',
118
+ );
119
+
120
+ $missing = array_diff( $requiredProperties, array_keys( get_object_vars( $notification ) ) );
121
+ if ( $missing ) {
122
+ throw new \Exception( sprintf( 'Missing required properties: %s', json_encode( array_values( $missing ) ) ) );
123
+ }
124
+
125
+ // Don't save the notification if it has expired.
126
+ if ( ! empty( $notification->end ) && time() > strtotime( $notification->end ) ) {
127
+ throw new \Exception( 'Notification has expired.' );
128
+ }
129
+
130
+ // Ignore if notification was created before EDD was installed.
131
+ if ( ! empty( $notification->start ) && edd_get_activation_date() > strtotime( $notification->start ) ) {
132
+ throw new \Exception( 'Notification created prior to EDD activation.' );
133
+ }
134
+
135
+ if (
136
+ ! empty( $notification->type ) &&
137
+ is_array( $notification->type ) &&
138
+ ! $this->environmentChecker->meetsConditions( $notification->type )
139
+ ) {
140
+ throw new \Exception( 'Condition(s) not met.' );
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Retrieves the array of notification data to insert into the database.
146
+ * Use in both inserts and updates.
147
+ *
148
+ * @since 2.11.4
149
+ *
150
+ * @param object $notification
151
+ *
152
+ * @return array
153
+ */
154
+ protected function getNotificationData( $notification ) {
155
+ return array(
156
+ 'remote_id' => $notification->id,
157
+ 'title' => $notification->title,
158
+ 'content' => $notification->content,
159
+ 'buttons' => $this->parseButtons( $notification ),
160
+ 'type' => ! empty( $notification->notification_type ) ? $notification->notification_type : 'success',
161
+ 'conditions' => ! empty( $notification->type ) ? $notification->type : null,
162
+ 'start' => ! empty( $notification->start ) ? $notification->start : null,
163
+ 'end' => ! empty( $notification->end ) ? $notification->end : null,
164
+ );
165
+ }
166
+
167
+ /**
168
+ * Parses and formats buttons from the remote notification object.
169
+ *
170
+ * @since 2.11.4
171
+ *
172
+ * @param object $notification
173
+ *
174
+ * @return array|null
175
+ */
176
+ protected function parseButtons( $notification ) {
177
+ if ( empty( $notification->btns ) ) {
178
+ return null;
179
+ }
180
+
181
+ $buttons = array();
182
+
183
+ foreach ( (array) $notification->btns as $buttonType => $buttonInfo ) {
184
+ if ( empty( $buttonInfo->url ) || empty( $buttonInfo->text ) ) {
185
+ continue;
186
+ }
187
+
188
+ $buttons[] = array(
189
+ 'type' => ( 'main' === $buttonType ) ? 'primary' : 'secondary',
190
+ 'url' => $buttonInfo->url,
191
+ 'text' => $buttonInfo->text,
192
+ );
193
+ }
194
+
195
+ return ! empty( $buttons ) ? $buttons : null;
196
+ }
197
+
198
+ /**
199
+ * Inserts a new notification into the database.
200
+ *
201
+ * @since 2.11.4
202
+ *
203
+ * @param object $notification
204
+ * @throws \Exception
205
+ */
206
+ protected function insertNewNotification( $notification ) {
207
+ $result = EDD()->notifications->insert( $this->getNotificationData( $notification ) );
208
+
209
+ if ( ! $result ) {
210
+ throw new \Exception( 'Failed to insert into database.' );
211
+ }
212
+ }
213
+
214
+ /**
215
+ * Updates an existing notification.
216
+ *
217
+ * @since 2.11.4
218
+ *
219
+ * @param int $existingId
220
+ * @param object $notification
221
+ */
222
+ protected function updateExistingNotification( $existingId, $notification ) {
223
+ EDD()->notifications->update( $existingId, wp_parse_args( $this->getNotificationData( $notification ), array(
224
+ 'date_updated' => gmdate( 'Y-m-d H:i:s' ),
225
+ ) ) );
226
+ }
227
+
228
+ }
languages/easy-digital-downloads.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the Easy Digital Downloads package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Easy Digital Downloads 2.11.3.1\n"
6
  "Report-Msgid-Bugs-To: https://easydigitaldownloads.com/\n"
7
- "POT-Creation-Date: 2021-11-01 12:59:04+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -24,7 +24,7 @@ msgstr ""
24
  "X-Textdomain-Support: yes\n"
25
  "X-Generator: grunt-wp-i18n 1.0.3\n"
26
 
27
- #: easy-digital-downloads.php:183 easy-digital-downloads.php:195
28
  msgid "Cheatin&#8217; huh?"
29
  msgstr ""
30
 
@@ -104,9 +104,9 @@ msgstr ""
104
  #: includes/api/class-edd-api.php:1980 includes/api/class-edd-api.php:1985
105
  #: includes/api/class-edd-api.php:1997 includes/api/class-edd-api.php:1999
106
  #: includes/cart/class-edd-cart.php:1433 includes/cart/class-edd-cart.php:1447
107
- #: includes/class-edd-license-handler.php:385
108
  #: includes/deprecated-functions.php:517 includes/deprecated-functions.php:532
109
- #: includes/deprecated-functions.php:542 includes/download-functions.php:1255
110
  #: includes/emails/actions.php:53 includes/emails/template.php:243
111
  #: includes/error-tracking.php:60 includes/gateways/functions.php:243
112
  #: includes/gateways/manual.php:33
@@ -114,9 +114,9 @@ msgstr ""
114
  #: includes/gateways/paypal/admin/connect.php:459
115
  #: includes/gateways/paypal/admin/connect.php:597
116
  #: includes/gateways/paypal-standard.php:172
117
- #: includes/gateways/stripe/includes/admin/upgrade-functions.php:57
118
  #: includes/gateways/stripe/includes/payment-actions.php:1408
119
- #: includes/process-download.php:303 includes/process-download.php:894
120
  #: includes/query-filters.php:48 includes/user-functions.php:895
121
  #: includes/user-functions.php:920 includes/user-functions.php:973
122
  msgid "Error"
@@ -213,7 +213,7 @@ msgid "Easy Digital Downloads Settings"
213
  msgstr ""
214
 
215
  #: includes/admin/admin-pages.php:41
216
- #: includes/admin/settings/display-settings.php:95
217
  msgid "Settings"
218
  msgstr ""
219
 
@@ -231,8 +231,8 @@ msgid "Easy Digital Downloads Extensions"
231
  msgstr ""
232
 
233
  #: includes/admin/admin-pages.php:43 includes/admin/plugins.php:57
234
- #: includes/admin/settings/contextual-help.php:84
235
- #: includes/admin/settings/register-settings.php:1378
236
  msgid "Extensions"
237
  msgstr ""
238
 
@@ -428,35 +428,35 @@ msgid "The purchase receipt has been resent."
428
  msgstr ""
429
 
430
  #: includes/admin/class-edd-notices.php:225
431
- msgid "The reports have been refreshed."
432
  msgstr ""
433
 
434
  #: includes/admin/class-edd-notices.php:228
435
- msgid "The payment note has been deleted."
436
  msgstr ""
437
 
438
- #: includes/admin/class-edd-notices.php:237
439
- msgid "The settings have been imported."
440
  msgstr ""
441
 
442
  #: includes/admin/class-edd-notices.php:240
443
- msgid "API keys successfully generated."
444
  msgstr ""
445
 
446
  #: includes/admin/class-edd-notices.php:243
447
- msgid "The specified user already has API keys."
448
  msgstr ""
449
 
450
  #: includes/admin/class-edd-notices.php:246
451
- msgid "API keys successfully regenerated."
452
  msgstr ""
453
 
454
  #: includes/admin/class-edd-notices.php:249
455
- msgid "API keys successfully revoked."
456
  msgstr ""
457
 
458
  #: includes/admin/class-edd-notices.php:252
459
- msgid "SendWP has been successfully connected!"
460
  msgstr ""
461
 
462
  #: includes/admin/class-edd-notices.php:261
@@ -519,7 +519,7 @@ msgstr ""
519
  #: includes/admin/discounts/class-discount-codes-table.php:267
520
  #: includes/admin/payments/class-payments-table.php:367
521
  #: includes/admin/payments/class-payments-table.php:435
522
- #: includes/admin/settings/register-settings.php:967
523
  #: includes/gateways/stripe/includes/template-functions.php:441
524
  #: includes/payments/functions.php:1600
525
  msgid "Delete"
@@ -536,7 +536,7 @@ msgstr ""
536
  #: includes/admin/downloads/dashboard-columns.php:31
537
  #: includes/admin/payments/view-order-details.php:693
538
  #: includes/admin/reporting/class-export-customers.php:74
539
- #: includes/admin/reporting/export/class-batch-export-customers.php:42
540
  #: includes/admin/reporting/export/class-batch-export-downloads.php:43
541
  #: includes/privacy-functions.php:589 templates/shortcode-receipt.php:123
542
  msgid "Name"
@@ -556,6 +556,7 @@ msgid "Total Spent"
556
  msgstr ""
557
 
558
  #: includes/admin/customers/class-customer-table.php:180
 
559
  #: includes/admin/reporting/export/class-batch-export-downloads.php:44
560
  #: includes/privacy-functions.php:593
561
  msgid "Date Created"
@@ -640,7 +641,7 @@ msgstr ""
640
  #: includes/admin/import/import-functions.php:113
641
  #: includes/admin/reporting/export/export-actions.php:23
642
  #: includes/api/class-edd-api.php:1980
643
- #: includes/class-edd-license-handler.php:385
644
  msgid "Nonce verification failed"
645
  msgstr ""
646
 
@@ -729,7 +730,7 @@ msgid "City"
729
  msgstr ""
730
 
731
  #: includes/admin/customers/customers.php:269
732
- #: includes/admin/settings/register-settings.php:2298
733
  #: includes/admin/tools.php:695 includes/checkout/template.php:435
734
  #: templates/shortcode-profile-editor.php:171
735
  msgid "State / Province"
@@ -753,6 +754,7 @@ msgid "Customer since %s"
753
  msgstr ""
754
 
755
  #: includes/admin/customers/customers.php:313
 
756
  #: includes/privacy-functions.php:867
757
  msgid "User ID"
758
  msgstr ""
@@ -776,7 +778,7 @@ msgstr ""
776
  #: includes/admin/payments/view-order-details.php:684
777
  #: includes/admin/payments/view-order-details.php:704
778
  #: includes/admin/thickbox.php:136 includes/class-edd-html-elements.php:796
779
- #: includes/gateways/stripe/includes/admin/admin-filters.php:96
780
  #: includes/gateways/stripe/includes/template-functions.php:597
781
  #: includes/gateways/stripe/includes/template-functions.php:637
782
  msgid "Cancel"
@@ -808,7 +810,7 @@ msgstr ""
808
  #: includes/admin/reporting/class-export-customers.php:66
809
  #: includes/admin/reporting/class-export-customers.php:77
810
  #: includes/admin/reporting/class-export-payments.php:61
811
- #: includes/admin/reporting/export/class-batch-export-customers.php:43
812
  #: includes/admin/reporting/export/class-batch-export-payments.php:41
813
  #: includes/admin/reporting/export/class-batch-export-sales.php:42
814
  #: includes/admin/tools.php:497 templates/shortcode-register.php:25
@@ -832,12 +834,12 @@ msgid "Make Primary"
832
  msgstr ""
833
 
834
  #: includes/admin/customers/customers.php:406
835
- #: includes/admin/downloads/metabox.php:452
836
- #: includes/admin/downloads/metabox.php:658
837
- #: includes/admin/downloads/metabox.php:714
838
- #: includes/admin/downloads/metabox.php:839
839
  #: includes/admin/payments/view-order-details.php:523
840
- #: includes/admin/settings/register-settings.php:2301 includes/scripts.php:227
841
  #: templates/checkout_cart.php:57 templates/checkout_cart.php:75
842
  #: templates/shortcode-profile-editor.php:123
843
  msgid "Remove"
@@ -927,6 +929,8 @@ msgid "Purchased %s"
927
  msgstr ""
928
 
929
  #: includes/admin/customers/customers.php:486
 
 
930
  msgid "View %s"
931
  msgstr ""
932
 
@@ -1024,13 +1028,13 @@ msgstr ""
1024
  msgid "Easy Digital Downloads Sales Summary"
1025
  msgstr ""
1026
 
1027
- #: includes/admin/dashboard-widgets.php:62
1028
  msgid "Current Month"
1029
  msgstr ""
1030
 
1031
- #: includes/admin/dashboard-widgets.php:67
1032
- #: includes/admin/dashboard-widgets.php:85
1033
- #: includes/admin/dashboard-widgets.php:111
1034
  #: includes/admin/downloads/dashboard-columns.php:36
1035
  #: includes/admin/reporting/class-download-reports-table.php:110
1036
  #: includes/admin/reporting/export/class-batch-export-downloads.php:58
@@ -1040,24 +1044,24 @@ msgstr ""
1040
  msgid "Earnings"
1041
  msgstr ""
1042
 
1043
- #: includes/admin/dashboard-widgets.php:72
1044
- #: includes/admin/dashboard-widgets.php:91
1045
  msgid "Sale"
1046
  msgid_plural "Sales"
1047
  msgstr[0] ""
1048
  msgstr[1] ""
1049
 
1050
- #: includes/admin/dashboard-widgets.php:80
1051
  #: includes/admin/reporting/graphing.php:676 includes/class-edd-stats.php:84
1052
  msgid "Last Month"
1053
  msgstr ""
1054
 
1055
- #: includes/admin/dashboard-widgets.php:105
1056
  #: includes/admin/reporting/graphing.php:670 includes/class-edd-stats.php:79
1057
  msgid "Today"
1058
  msgstr ""
1059
 
1060
- #: includes/admin/dashboard-widgets.php:119
1061
  #: includes/admin/downloads/dashboard-columns.php:35
1062
  #: includes/admin/reporting/class-download-reports-table.php:109
1063
  #: includes/admin/reporting/export/class-batch-export-downloads.php:57
@@ -1067,27 +1071,27 @@ msgstr ""
1067
  msgid "Sales"
1068
  msgstr ""
1069
 
1070
- #: includes/admin/dashboard-widgets.php:133
1071
  msgid "Totals"
1072
  msgstr ""
1073
 
1074
- #: includes/admin/dashboard-widgets.php:138
1075
  #: includes/admin/reporting/class-categories-reports-table.php:83
1076
  #: includes/admin/tools.php:914
1077
  msgid "Total Earnings"
1078
  msgstr ""
1079
 
1080
- #: includes/admin/dashboard-widgets.php:142
1081
  #: includes/admin/reporting/class-categories-reports-table.php:82
1082
  #: includes/admin/reporting/class-gateways-reports-table.php:91
1083
  msgid "Total Sales"
1084
  msgstr ""
1085
 
1086
- #: includes/admin/dashboard-widgets.php:164
1087
  msgid "Recent Purchases"
1088
  msgstr ""
1089
 
1090
- #: includes/admin/dashboard-widgets.php:165
1091
  msgid "View All"
1092
  msgstr ""
1093
 
@@ -1323,7 +1327,7 @@ msgstr ""
1323
  #: includes/admin/downloads/contextual-help.php:28
1324
  #: includes/admin/payments/contextual-help.php:29
1325
  #: includes/admin/reporting/contextual-help.php:29
1326
- #: includes/admin/settings/contextual-help.php:29
1327
  msgid "For more information:"
1328
  msgstr ""
1329
 
@@ -1331,7 +1335,7 @@ msgstr ""
1331
  #: includes/admin/downloads/contextual-help.php:29
1332
  #: includes/admin/payments/contextual-help.php:30
1333
  #: includes/admin/reporting/contextual-help.php:30
1334
- #: includes/admin/settings/contextual-help.php:30
1335
  msgid ""
1336
  "Visit the <a href=\"%s\">documentation</a> on the Easy Digital Downloads "
1337
  "website."
@@ -1347,12 +1351,13 @@ msgid ""
1347
  msgstr ""
1348
 
1349
  #: includes/admin/discounts/contextual-help.php:35
1350
- #: includes/admin/settings/contextual-help.php:39
1351
- #: includes/admin/settings/register-settings.php:1370
1352
- #: includes/admin/settings/register-settings.php:1436
1353
- #: includes/admin/settings/register-settings.php:1441
 
 
1354
  #: includes/admin/settings/register-settings.php:1444
1355
- #: includes/admin/settings/register-settings.php:1457
1356
  #: includes/admin/tools.php:68
1357
  msgid "General"
1358
  msgstr ""
@@ -1627,7 +1632,7 @@ msgstr ""
1627
 
1628
  #: includes/admin/downloads/dashboard-columns.php:34
1629
  #: includes/admin/downloads/dashboard-columns.php:286
1630
- #: includes/admin/downloads/metabox.php:472
1631
  #: includes/admin/payments/view-order-details.php:543
1632
  #: includes/admin/reporting/export/class-batch-export-downloads.php:51
1633
  #: templates/shortcode-receipt.php:130
@@ -1647,255 +1652,247 @@ msgstr ""
1647
  msgid "%s Configuration"
1648
  msgstr ""
1649
 
1650
- #: includes/admin/downloads/metabox.php:31
1651
  msgid "%1$s Prices"
1652
  msgstr ""
1653
 
1654
- #: includes/admin/downloads/metabox.php:34
1655
  msgid "%1$s Files"
1656
  msgstr ""
1657
 
1658
- #: includes/admin/downloads/metabox.php:37
1659
  msgid "%1$s Settings"
1660
  msgstr ""
1661
 
1662
- #: includes/admin/downloads/metabox.php:40
1663
  msgid "%1$s Notes"
1664
  msgstr ""
1665
 
1666
- #: includes/admin/downloads/metabox.php:44
1667
  msgid "%1$s Stats"
1668
  msgstr ""
1669
 
1670
- #: includes/admin/downloads/metabox.php:48
1671
- msgid "Product Reviews"
1672
- msgstr ""
1673
-
1674
- #: includes/admin/downloads/metabox.php:54
1675
- msgid "Black Friday & Cyber Monday sale!"
1676
- msgstr ""
1677
-
1678
- #: includes/admin/downloads/metabox.php:314
1679
  msgid "Pricing Options:"
1680
  msgstr ""
1681
 
1682
- #: includes/admin/downloads/metabox.php:320
1683
  msgid "Enable variable pricing"
1684
  msgstr ""
1685
 
1686
- #: includes/admin/downloads/metabox.php:350
1687
  msgid ""
1688
  "Enable multi-option purchase mode. Allows multiple price options to be "
1689
  "added to your cart at once"
1690
  msgstr ""
1691
 
1692
- #: includes/admin/downloads/metabox.php:379
1693
  msgid "Add New Price"
1694
  msgstr ""
1695
 
1696
- #: includes/admin/downloads/metabox.php:442
1697
  msgid "Click and drag to re-order price options"
1698
  msgstr ""
1699
 
1700
- #: includes/admin/downloads/metabox.php:443
1701
  msgid "Price ID: %s"
1702
  msgstr ""
1703
 
1704
- #: includes/admin/downloads/metabox.php:449 includes/scripts.php:234
1705
  msgid "Show advanced settings"
1706
  msgstr ""
1707
 
1708
- #: includes/admin/downloads/metabox.php:452
1709
  msgid "Remove price option %s"
1710
  msgstr ""
1711
 
1712
- #: includes/admin/downloads/metabox.php:462
1713
- #: includes/admin/downloads/metabox.php:466
1714
  msgid "Option Name"
1715
  msgstr ""
1716
 
1717
- #: includes/admin/downloads/metabox.php:494 includes/download-functions.php:523
1718
  #: includes/gateways/stripe/includes/template-functions.php:404
1719
  msgid "Default"
1720
  msgstr ""
1721
 
1722
- #: includes/admin/downloads/metabox.php:497
1723
  msgid "Set ID %s as default price"
1724
  msgstr ""
1725
 
1726
- #: includes/admin/downloads/metabox.php:562
1727
  msgid "Product Type Options:"
1728
  msgstr ""
1729
 
1730
- #: includes/admin/downloads/metabox.php:573
1731
  msgid "Select a product type"
1732
  msgstr ""
1733
 
1734
- #: includes/admin/downloads/metabox.php:574
1735
  msgid ""
1736
  "<strong>Product Type</strong>: Sell this item as a single product, or use "
1737
  "the Bundle type to sell a collection of products."
1738
  msgstr ""
1739
 
1740
- #: includes/admin/downloads/metabox.php:607
1741
  msgid "Bundled %s"
1742
  msgstr ""
1743
 
1744
- #: includes/admin/downloads/metabox.php:615
1745
- #: includes/admin/downloads/metabox.php:675
1746
  msgid "Click and drag to re-order bundled %s"
1747
  msgstr ""
1748
 
1749
- #: includes/admin/downloads/metabox.php:619
1750
- #: includes/admin/downloads/metabox.php:679
1751
  msgid "Select %s:"
1752
  msgstr ""
1753
 
1754
- #: includes/admin/downloads/metabox.php:633
1755
- #: includes/admin/downloads/metabox.php:692
1756
  msgid "Price assignment:"
1757
  msgstr ""
1758
 
1759
- #: includes/admin/downloads/metabox.php:658
1760
  msgid "Remove bundle option %s"
1761
  msgstr ""
1762
 
1763
- #: includes/admin/downloads/metabox.php:669
1764
  msgid "Bundled %s:"
1765
  msgstr ""
1766
 
1767
- #: includes/admin/downloads/metabox.php:714
1768
  msgid "Remove bundle option 1"
1769
  msgstr ""
1770
 
1771
- #: includes/admin/downloads/metabox.php:724
1772
- #: includes/admin/downloads/metabox.php:792
1773
  msgid "Add New File"
1774
  msgstr ""
1775
 
1776
- #: includes/admin/downloads/metabox.php:834
1777
  msgid "Click and drag to re-order files"
1778
  msgstr ""
1779
 
1780
- #: includes/admin/downloads/metabox.php:835
1781
  msgid "%1$s file ID: %2$s"
1782
  msgstr ""
1783
 
1784
- #: includes/admin/downloads/metabox.php:839
1785
  msgid "Remove file %s"
1786
  msgstr ""
1787
 
1788
- #: includes/admin/downloads/metabox.php:847
1789
- #: includes/admin/downloads/metabox.php:853
1790
  msgid "File Name"
1791
  msgstr ""
1792
 
1793
- #: includes/admin/downloads/metabox.php:859
1794
  msgid "File URL"
1795
  msgstr ""
1796
 
1797
- #: includes/admin/downloads/metabox.php:864
1798
  msgid "Upload or enter the file URL"
1799
  msgstr ""
1800
 
1801
- #: includes/admin/downloads/metabox.php:869
1802
  msgid "Insert File"
1803
  msgstr ""
1804
 
1805
- #: includes/admin/downloads/metabox.php:869
1806
  msgid "Insert"
1807
  msgstr ""
1808
 
1809
- #: includes/admin/downloads/metabox.php:869
1810
  msgid "Upload a File"
1811
  msgstr ""
1812
 
1813
- #: includes/admin/downloads/metabox.php:876
1814
  msgid "Price Assignment"
1815
  msgstr ""
1816
 
1817
- #: includes/admin/downloads/metabox.php:876
1818
  msgid ""
1819
  "<strong>Price Assignment</strong>: With variable pricing enabled, you can "
1820
  "choose to allow certain price variations access to specific files, or allow "
1821
  "all price variations to access a file."
1822
  msgstr ""
1823
 
1824
- #: includes/admin/downloads/metabox.php:921
1825
  msgid "Insert into %s"
1826
  msgstr ""
1827
 
1828
- #: includes/admin/downloads/metabox.php:947
1829
  msgid "File Download Limit:"
1830
  msgstr ""
1831
 
1832
- #: includes/admin/downloads/metabox.php:954
1833
  msgid "Leave blank for global setting or 0 for unlimited"
1834
  msgstr ""
1835
 
1836
- #: includes/admin/downloads/metabox.php:956
1837
  msgid ""
1838
  "<strong>File Download Limit</strong>: Limit the number of times a customer "
1839
  "who purchased this product can access their download links."
1840
  msgstr ""
1841
 
1842
- #: includes/admin/downloads/metabox.php:992
1843
  msgid "Ignore Tax:"
1844
  msgstr ""
1845
 
1846
- #: includes/admin/downloads/metabox.php:998
1847
  msgid "Mark this product as exclusive of tax"
1848
  msgstr ""
1849
 
1850
- #: includes/admin/downloads/metabox.php:1020
1851
  msgid "Item Quantities:"
1852
  msgstr ""
1853
 
1854
- #: includes/admin/downloads/metabox.php:1026
1855
  msgid "Disable quantity input for this product"
1856
  msgstr ""
1857
 
1858
- #: includes/admin/downloads/metabox.php:1028
1859
  msgid ""
1860
  "<strong>Item Quantities</strong>: if disabled, customers will not be "
1861
  "provided an option to change the number they wish to purchase."
1862
  msgstr ""
1863
 
1864
- #: includes/admin/downloads/metabox.php:1047
1865
- #: includes/admin/settings/register-settings.php:808
1866
  #: includes/admin/thickbox.php:59 includes/checkout/template.php:1005
1867
  #: includes/gateways/stripe/includes/payment-methods/buy-now/template.php:214
1868
  #: includes/shortcodes.php:49 includes/template-functions.php:78
1869
  msgid "Purchase"
1870
  msgstr ""
1871
 
1872
- #: includes/admin/downloads/metabox.php:1054
1873
  msgid "Purchase Shortcode:"
1874
  msgstr ""
1875
 
1876
- #: includes/admin/downloads/metabox.php:1055
1877
  msgid ""
1878
  "<strong>Purchase Shortcode</strong>: Use this shortcode to output a "
1879
  "purchase link for this product in the location of your choosing."
1880
  msgstr ""
1881
 
1882
- #: includes/admin/downloads/metabox.php:1076
1883
  msgid "Accounting Options:"
1884
  msgstr ""
1885
 
1886
- #: includes/admin/downloads/metabox.php:1084
1887
  msgid "Enter an SKU for this %s."
1888
  msgstr ""
1889
 
1890
- #: includes/admin/downloads/metabox.php:1103
1891
  msgid "Button Options:"
1892
  msgstr ""
1893
 
1894
- #: includes/admin/downloads/metabox.php:1110
1895
  msgid "Disable the automatic output of the purchase button"
1896
  msgstr ""
1897
 
1898
- #: includes/admin/downloads/metabox.php:1111
1899
  msgid ""
1900
  "<strong>Automatic Output</strong>: By default, the purchase buttons will be "
1901
  "displayed at the bottom of the download, when disabled you will need to use "
@@ -1903,24 +1900,24 @@ msgid ""
1903
  "where you prefer."
1904
  msgstr ""
1905
 
1906
- #: includes/admin/downloads/metabox.php:1121
1907
- #: includes/admin/settings/register-settings.php:822
1908
  #: includes/admin/thickbox.php:101
1909
  msgid "Add to Cart"
1910
  msgstr ""
1911
 
1912
- #: includes/admin/downloads/metabox.php:1122
1913
- #: includes/admin/settings/register-settings.php:836
1914
  #: includes/gateways/stripe/includes/payment-methods/buy-now/template.php:47
1915
  #: includes/shortcodes.php:47 includes/template-functions.php:78
1916
  msgid "Buy Now"
1917
  msgstr ""
1918
 
1919
- #: includes/admin/downloads/metabox.php:1135
1920
  msgid "Purchase button behavior"
1921
  msgstr ""
1922
 
1923
- #: includes/admin/downloads/metabox.php:1137
1924
  msgid ""
1925
  "<strong>Button Behavior</strong>: Add to Cart buttons follow a traditional "
1926
  "eCommerce flow. A Buy Now button bypasses most of the process, taking the "
@@ -1928,55 +1925,177 @@ msgid ""
1928
  "process of buying the product."
1929
  msgstr ""
1930
 
1931
- #: includes/admin/downloads/metabox.php:1139
1932
  msgid ""
1933
  "<strong>Button Behavior</strong>: Add to Cart buttons follow a traditional "
1934
  "eCommerce flow. Buy Now buttons are only available for stores that have a "
1935
  "single supported gateway active and that do not use taxes."
1936
  msgstr ""
1937
 
1938
- #: includes/admin/downloads/metabox.php:1177
1939
  msgid ""
1940
  "Special notes or instructions for this product. These notes will be added "
1941
  "to the purchase receipt."
1942
  msgstr ""
1943
 
1944
- #: includes/admin/downloads/metabox.php:1204
1945
  msgid "Sales:"
1946
  msgstr ""
1947
 
1948
- #: includes/admin/downloads/metabox.php:1209
1949
  msgid "Earnings:"
1950
  msgstr ""
1951
 
1952
- #: includes/admin/downloads/metabox.php:1216
1953
  msgid "View File Download Log"
1954
  msgstr ""
1955
 
1956
- #: includes/admin/downloads/metabox.php:1265
1957
- msgid "Activate Reviews"
 
 
 
 
 
1958
  msgstr ""
1959
 
1960
- #: includes/admin/downloads/metabox.php:1291
1961
- #. Translators: The %s represents the link to the Product Reviews extension.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1962
  msgid ""
1963
- "Would you like to enable reviews for this product? Check out our <a "
1964
- "target=\"_blank\" href=\"%s\">Product Reviews</a> extension."
1965
  msgstr ""
1966
 
1967
- #: includes/admin/downloads/metabox.php:1299
 
 
 
1968
  msgid ""
1969
- "Act now and <strong>SAVE 25%</strong> on your purchase. Sale ends <em>23:59 "
1970
- "PM December 6th CST</em>. Use code <code>BFCM2019</code> at checkout."
1971
  msgstr ""
1972
 
1973
- #: includes/admin/downloads/metabox.php:1332
1974
- #. Translators: The %s represents the link to the pricing page on the Easy
1975
- #. Digital Downloads website.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1976
  msgid ""
1977
- "Save 25&#37; on all Easy Digital Downloads purchases <strong>this "
1978
- "week</strong>, including renewals and upgrades! Sale ends 23:59 PM December "
1979
- "6th CST. <a target=\"_blank\" href=\"%s\">Don't miss out</a>!"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1980
  msgstr ""
1981
 
1982
  #: includes/admin/import/class-batch-import-downloads.php:65
@@ -2361,7 +2480,7 @@ msgstr[0] ""
2361
  msgstr[1] ""
2362
 
2363
  #: includes/admin/payments/view-order-details.php:152
2364
- #: includes/admin/settings/register-settings.php:509
2365
  msgid "None"
2366
  msgstr ""
2367
 
@@ -2565,8 +2684,13 @@ msgstr ""
2565
  msgid "General Settings"
2566
  msgstr ""
2567
 
2568
- #: includes/admin/promos/class-promo-handler.php:109
2569
- #: includes/admin/promos/class-promo-handler.php:117
 
 
 
 
 
2570
  #: includes/gateways/paypal/admin/connect.php:106
2571
  #: includes/gateways/paypal/admin/connect.php:182
2572
  #: includes/gateways/paypal/admin/connect.php:292
@@ -2579,36 +2703,77 @@ msgstr ""
2579
  msgid "You do not have permission to perform this action."
2580
  msgstr ""
2581
 
2582
- #: includes/admin/promos/class-promo-handler.php:113
2583
- msgid "Missing notice ID."
2584
  msgstr ""
2585
 
2586
- #: includes/admin/promos/notices/abstract-notice.php:108
2587
- msgid "Dismiss notice"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2588
  msgstr ""
2589
 
2590
- #: includes/admin/promos/notices/class-license-upgrade-notice.php:154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2591
  #. Translators: %1$s opening anchor tag; %2$s closing anchor tag
2592
  msgid ""
2593
  "You are using the free version of Easy Digital Downloads. %1$sPurchase a "
2594
  "pass%2$s to get email marketing tools and recurring payments."
2595
  msgstr ""
2596
 
2597
- #: includes/admin/promos/notices/class-license-upgrade-notice.php:164
2598
  #. Translators: %1$s opening anchor tag; %2$s closing anchor tag
2599
  msgid ""
2600
  "For access to additional Easy Digital Downloads extensions to grow your "
2601
  "store, consider %1$spurchasing a pass%2$s."
2602
  msgstr ""
2603
 
2604
- #: includes/admin/promos/notices/class-license-upgrade-notice.php:174
2605
  #. Translators: %1$s opening anchor tag; %2$s closing anchor tag
2606
  msgid ""
2607
  "You are using Easy Digital Downloads with a Personal Pass. Consider "
2608
  "%1$supgrading%2$s to get recurring payments and more."
2609
  msgstr ""
2610
 
2611
- #: includes/admin/promos/notices/class-license-upgrade-notice.php:184
2612
  #. Translators: %1$s opening anchor tag; %2$s closing anchor tag
2613
  msgid ""
2614
  "Grow your business and make more money with affiliate marketing. %1$sGet "
@@ -2782,7 +2947,7 @@ msgstr ""
2782
 
2783
  #: includes/admin/reporting/class-export-payments.php:68
2784
  #: includes/admin/reporting/export/class-batch-export-payments.php:49
2785
- #: includes/admin/settings/register-settings.php:2297
2786
  #: includes/admin/tools.php:713
2787
  #: includes/gateways/stripe/includes/template-functions.php:510
2788
  #: includes/gateways/stripe/includes/template-functions.php:519
@@ -2962,14 +3127,18 @@ msgstr ""
2962
  msgid "API User"
2963
  msgstr ""
2964
 
2965
- #: includes/admin/reporting/export/class-batch-export-customers.php:44
2966
  msgid "Number of Purchases"
2967
  msgstr ""
2968
 
2969
- #: includes/admin/reporting/export/class-batch-export-customers.php:45
2970
  msgid "Customer Value"
2971
  msgstr ""
2972
 
 
 
 
 
2973
  #: includes/admin/reporting/export/class-batch-export-downloads.php:42
2974
  msgid "Slug"
2975
  msgstr ""
@@ -3002,7 +3171,7 @@ msgid "Files"
3002
  msgstr ""
3003
 
3004
  #: includes/admin/reporting/export/class-batch-export-downloads.php:53
3005
- #: includes/admin/settings/register-settings.php:860
3006
  #: includes/admin/tools.php:896
3007
  msgid "File Download Limit"
3008
  msgstr ""
@@ -3051,7 +3220,7 @@ msgstr ""
3051
 
3052
  #: includes/admin/reporting/export/class-batch-export-payments.php:62
3053
  #: includes/admin/settings/register-settings.php:355
3054
- #: includes/admin/settings/register-settings.php:1427
3055
  msgid "Currency"
3056
  msgstr ""
3057
 
@@ -3183,7 +3352,7 @@ msgid "Refresh Reports"
3183
  msgstr ""
3184
 
3185
  #: includes/admin/reporting/logs.php:144
3186
- #: includes/admin/settings/register-settings.php:1453
3187
  #: includes/privacy-functions.php:544
3188
  msgid "File Downloads"
3189
  msgstr ""
@@ -3209,8 +3378,8 @@ msgid "Payment Methods"
3209
  msgstr ""
3210
 
3211
  #: includes/admin/reporting/reports.php:59
3212
- #: includes/admin/settings/contextual-help.php:68
3213
- #: includes/admin/settings/register-settings.php:1374
3214
  msgid "Taxes"
3215
  msgstr ""
3216
 
@@ -3348,61 +3517,68 @@ msgstr ""
3348
  msgid "Download a CSV of all sales."
3349
  msgstr ""
3350
 
3351
- #: includes/admin/settings/contextual-help.php:32
3352
  msgid ""
3353
  "Need more from your Easy Digital Downloads store? <a href=\"%s\">Upgrade "
3354
  "Now!</a>."
3355
  msgstr ""
3356
 
3357
- #: includes/admin/settings/contextual-help.php:40
3358
  msgid ""
3359
  "This screen provides the most basic settings for configuring your store. "
3360
- "You can set the currency, page templates, and turn <em>Test Mode</em> on "
3361
- "and off."
3362
  msgstr ""
3363
 
3364
- #: includes/admin/settings/contextual-help.php:45
3365
- #: includes/admin/settings/register-settings.php:423
3366
- msgid "Payment Gateways"
3367
  msgstr ""
3368
 
3369
- #: includes/admin/settings/contextual-help.php:47
3370
  msgid ""
3371
- "This screen provides ways to toggle payment gateways on or off, as well as "
3372
- "configure gateway-specific settings. Any extra payment gateway extensions "
3373
- "you have installed will appear on this page, and can be configured to suit "
3374
- "your needs."
3375
  msgstr ""
3376
 
3377
- #: includes/admin/settings/contextual-help.php:48
3378
  msgid ""
3379
  "<strong>Test Payment</strong> - This included gateway is great for testing "
3380
  "your store, as it requires no payment, and leads straight to product "
3381
  "downloads. However, please remember to turn it off once your site is live!"
3382
  msgstr ""
3383
 
3384
- #: includes/admin/settings/contextual-help.php:49
3385
  msgid ""
3386
  "<strong>PayPal</strong> - A PayPal payment gateway is included as standard "
3387
  "with Easy Digital Downloads. To test the PayPal gateway, you need a Sandbox "
3388
  "account for PayPal and the site must be placed in Test Mode from the "
3389
- "General settings tab. Please remember to enter your PayPal account email "
3390
  "address in order for payments to get processed."
3391
  msgstr ""
3392
 
3393
- #: includes/admin/settings/contextual-help.php:54
3394
- #: includes/admin/settings/register-settings.php:1372
 
 
 
 
 
 
 
 
3395
  msgid "Emails"
3396
  msgstr ""
3397
 
3398
- #: includes/admin/settings/contextual-help.php:56
3399
  msgid ""
3400
  "This screen allows you to customize how emails act throughout your store. "
3401
  "You can choose a premade template, set the sender's name, email address, "
3402
  "and subject."
3403
  msgstr ""
3404
 
3405
- #: includes/admin/settings/contextual-help.php:57
3406
  msgid ""
3407
  "A set of email tags has also been provided to allow the creation of "
3408
  "personalized emails. A tag consists of a keyword surrounded by curly "
@@ -3410,48 +3586,61 @@ msgid ""
3410
  "below the editor."
3411
  msgstr ""
3412
 
3413
- #: includes/admin/settings/contextual-help.php:62
3414
- #: includes/admin/settings/register-settings.php:1373
 
 
 
 
 
 
 
 
 
 
 
 
 
3415
  msgid "Styles"
3416
  msgstr ""
3417
 
3418
- #: includes/admin/settings/contextual-help.php:63
3419
  msgid ""
3420
  "This screen allows customization of your store's styles. For complete "
3421
  "control, you can completely disable all styles generated by the plugin."
3422
  msgstr ""
3423
 
3424
- #: includes/admin/settings/contextual-help.php:70
3425
  msgid "This screen allows you to configure the tax rules for your store."
3426
  msgstr ""
3427
 
3428
- #: includes/admin/settings/contextual-help.php:71
3429
  msgid ""
3430
  "If you do not wish to charge any tax on purchase, simply leave the Enable "
3431
  "Taxes option unchecked."
3432
  msgstr ""
3433
 
3434
- #: includes/admin/settings/contextual-help.php:72
3435
  msgid ""
3436
  "<strong>Default Tax Rate</strong>: The default tax rate is the tax rate "
3437
  "charged to customers located in your base country / state or province."
3438
  msgstr ""
3439
 
3440
- #: includes/admin/settings/contextual-help.php:73
3441
  msgid ""
3442
  "<strong>Base Country</strong>: This determines the country that is loaded "
3443
  "by default on the checkout screen for customers that do not have an address "
3444
  "stored in their account."
3445
  msgstr ""
3446
 
3447
- #: includes/admin/settings/contextual-help.php:74
3448
  msgid ""
3449
  "<strong>Base State / Province</strong>: This determines the state / "
3450
  "province that is loaded by default on the checkout screen for customers "
3451
  "that do not have an address stored in their account."
3452
  msgstr ""
3453
 
3454
- #: includes/admin/settings/contextual-help.php:75
3455
  msgid ""
3456
  "<strong>Prices Entered with Tax</strong>: if enabled, this means that the "
3457
  "price entered on the product edit screens is the total amount the customer "
@@ -3460,20 +3649,20 @@ msgid ""
3460
  "will be calculated automatically."
3461
  msgstr ""
3462
 
3463
- #: includes/admin/settings/contextual-help.php:76
3464
  msgid ""
3465
  "<strong>Display Tax Rate on Prices</strong>: when enabled, the amount the "
3466
  "customer is expected to pay in tax will be displayed below purchase buttons."
3467
  msgstr ""
3468
 
3469
- #: includes/admin/settings/contextual-help.php:77
3470
  msgid ""
3471
  "<strong>Display During Checkout</strong>: This determines whether prices "
3472
  "are shown with taxes or without taxes on checkout. If set to Including Tax, "
3473
  "a $10 product with a 10% tax will be shown as $11."
3474
  msgstr ""
3475
 
3476
- #: includes/admin/settings/contextual-help.php:78
3477
  msgid ""
3478
  "<strong>Calculate Tax After Discounts</strong>: If enabled, this option "
3479
  "will make it so that tax is calculated on the after-discount amount. If a "
@@ -3481,51 +3670,53 @@ msgid ""
3481
  "calculated off of $16 instead of $20."
3482
  msgstr ""
3483
 
3484
- #: includes/admin/settings/contextual-help.php:79
3485
  msgid ""
3486
  "<strong>Additional Tax Rates</strong>: This section lets you add tax rates "
3487
  "for specific countries and/or states/provinces in those countries."
3488
  msgstr ""
3489
 
3490
- #: includes/admin/settings/contextual-help.php:85
3491
  msgid ""
3492
  "This screen provides access to settings added by most Easy Digital "
3493
  "Downloads extensions."
3494
  msgstr ""
3495
 
3496
- #: includes/admin/settings/contextual-help.php:90
3497
- #: includes/admin/settings/register-settings.php:1451
3498
  msgid "Miscellaneous"
3499
  msgstr ""
3500
 
3501
- #: includes/admin/settings/contextual-help.php:92
3502
  msgid ""
3503
- "This screen provides other miscellaneous options such as disabling jQuery, "
3504
- "allowing guest checkout, and configuring your terms of service."
3505
  msgstr ""
3506
 
3507
- #: includes/admin/settings/contextual-help.php:93
3508
- msgid "A description of all the options are provided beside their input boxes."
 
 
3509
  msgstr ""
3510
 
3511
- #: includes/admin/settings/display-settings.php:226
3512
  msgid ""
3513
  "Save 25% on all Easy Digital Downloads purchases <strong>this "
3514
  "week</strong>, including renewals and upgrades!"
3515
  msgstr ""
3516
 
3517
- #: includes/admin/settings/display-settings.php:229
3518
  msgid "Use code at checkout:"
3519
  msgstr ""
3520
 
3521
- #: includes/admin/settings/display-settings.php:231
3522
  msgid ""
3523
  "Sale ends 23:59 PM December 6th CST. Save 25% on <a "
3524
  "href=\"https://sandhillsdev.com/projects/\" target=\"_blank\">our other "
3525
  "plugins</a>."
3526
  msgstr ""
3527
 
3528
- #: includes/admin/settings/display-settings.php:234
3529
  msgid "Shop Now!"
3530
  msgstr ""
3531
 
@@ -3692,7 +3883,7 @@ msgid "The symbol (usually , or .) to separate decimal points."
3692
  msgstr ""
3693
 
3694
  #: includes/admin/settings/register-settings.php:391
3695
- #: includes/admin/settings/register-settings.php:1428
3696
  msgid "API"
3697
  msgstr ""
3698
 
@@ -3734,6 +3925,10 @@ msgid ""
3734
  "are testing."
3735
  msgstr ""
3736
 
 
 
 
 
3737
  #: includes/admin/settings/register-settings.php:424
3738
  msgid "Choose the payment gateways you want to enable."
3739
  msgstr ""
@@ -3814,345 +4009,349 @@ msgstr ""
3814
 
3815
  #: includes/admin/settings/register-settings.php:493
3816
  #: includes/admin/settings/register-settings.php:496
3817
- msgid "Require Login"
3818
  msgstr ""
3819
 
3820
  #: includes/admin/settings/register-settings.php:494
3821
- msgid "Require that users be logged-in to purchase files."
3822
  msgstr ""
3823
 
3824
  #: includes/admin/settings/register-settings.php:497
3825
  msgid ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3826
  "You can require that customers create and login to user accounts prior to "
3827
  "purchasing from your store by enabling this option. When unchecked, users "
3828
  "can purchase without being logged in by using their name and email address."
3829
  msgstr ""
3830
 
3831
- #: includes/admin/settings/register-settings.php:501
3832
  msgid "Show Register / Login Form?"
3833
  msgstr ""
3834
 
3835
- #: includes/admin/settings/register-settings.php:502
3836
  msgid ""
3837
  "Display the registration and login forms on the checkout page for "
3838
  "non-logged-in users."
3839
  msgstr ""
3840
 
3841
- #: includes/admin/settings/register-settings.php:506
3842
  msgid "Registration and Login Forms"
3843
  msgstr ""
3844
 
3845
- #: includes/admin/settings/register-settings.php:507
3846
  msgid "Registration Form Only"
3847
  msgstr ""
3848
 
3849
- #: includes/admin/settings/register-settings.php:508
3850
  msgid "Login Form Only"
3851
  msgstr ""
3852
 
3853
- #: includes/admin/settings/register-settings.php:514
3854
- msgid "Multiple Discounts"
3855
- msgstr ""
3856
-
3857
- #: includes/admin/settings/register-settings.php:515
3858
- msgid "Allow customers to use multiple discounts on the same purchase?"
3859
- msgstr ""
3860
-
3861
- #: includes/admin/settings/register-settings.php:520
3862
  msgid "Enable Cart Saving"
3863
  msgstr ""
3864
 
3865
- #: includes/admin/settings/register-settings.php:521
3866
  msgid "Check this to enable cart saving on the checkout."
3867
  msgstr ""
3868
 
3869
- #: includes/admin/settings/register-settings.php:523
3870
  msgid "Cart Saving"
3871
  msgstr ""
3872
 
3873
- #: includes/admin/settings/register-settings.php:524
3874
  msgid ""
3875
  "Cart saving allows shoppers to create a temporary link to their current "
3876
  "shopping cart so they can come back to it later, or share it with someone."
3877
  msgstr ""
3878
 
3879
- #: includes/admin/settings/register-settings.php:535
3880
  msgid "Email Configuration"
3881
  msgstr ""
3882
 
3883
- #: includes/admin/settings/register-settings.php:540
3884
  msgid "Template"
3885
  msgstr ""
3886
 
3887
- #: includes/admin/settings/register-settings.php:541
3888
  msgid ""
3889
  "Choose a template. Click \"Save Changes\" then \"Preview Purchase Receipt\" "
3890
  "to see the new template."
3891
  msgstr ""
3892
 
3893
- #: includes/admin/settings/register-settings.php:547
3894
  msgid "Logo"
3895
  msgstr ""
3896
 
3897
- #: includes/admin/settings/register-settings.php:548
3898
  msgid ""
3899
  "Upload or choose a logo to be displayed at the top of the purchase receipt "
3900
  "emails. Displayed on HTML emails only."
3901
  msgstr ""
3902
 
3903
- #: includes/admin/settings/register-settings.php:553
3904
  msgid "From Name"
3905
  msgstr ""
3906
 
3907
- #: includes/admin/settings/register-settings.php:554
3908
  msgid ""
3909
  "The name purchase receipts are said to come from. This should probably be "
3910
  "your site or shop name."
3911
  msgstr ""
3912
 
3913
- #: includes/admin/settings/register-settings.php:560
3914
  msgid "From Email"
3915
  msgstr ""
3916
 
3917
- #: includes/admin/settings/register-settings.php:561
3918
  msgid ""
3919
  "Email to send purchase receipts from. This will act as the \"from\" and "
3920
  "\"reply-to\" address."
3921
  msgstr ""
3922
 
3923
- #: includes/admin/settings/register-settings.php:573
3924
- msgid "SendWP"
3925
- msgstr ""
3926
-
3927
- #: includes/admin/settings/register-settings.php:578
3928
- msgid "Deliverability settings"
3929
- msgstr ""
3930
-
3931
- #: includes/admin/settings/register-settings.php:584
3932
- msgid "Recapture"
3933
- msgstr ""
3934
-
3935
- #: includes/admin/settings/register-settings.php:589
3936
- msgid "Abandoned cart recovery"
3937
- msgstr ""
3938
-
3939
- #: includes/admin/settings/register-settings.php:603
3940
  msgid "Purchase Email Subject"
3941
  msgstr ""
3942
 
3943
- #: includes/admin/settings/register-settings.php:604
3944
  msgid "Enter the subject line for the purchase receipt email."
3945
  msgstr ""
3946
 
3947
- #: includes/admin/settings/register-settings.php:606
3948
- #: includes/admin/settings/register-settings.php:613
3949
- #: includes/admin/settings/register-settings.php:617
3950
  #: includes/emails/functions.php:45 includes/emails/functions.php:49
3951
- #: includes/emails/functions.php:87 includes/emails/functions.php:91
3952
  #: includes/emails/template.php:141
3953
  msgid "Purchase Receipt"
3954
  msgstr ""
3955
 
3956
- #: includes/admin/settings/register-settings.php:610
3957
  msgid "Purchase Email Heading"
3958
  msgstr ""
3959
 
3960
- #: includes/admin/settings/register-settings.php:611
3961
  msgid "Enter the heading for the purchase receipt email."
3962
  msgstr ""
3963
 
3964
- #: includes/admin/settings/register-settings.php:618
3965
  msgid ""
3966
  "Enter the text that is sent as purchase receipt email to users after "
3967
  "completion of a successful purchase. HTML is accepted. Available template "
3968
  "tags:"
3969
  msgstr ""
3970
 
3971
- #: includes/admin/settings/register-settings.php:620
3972
  #: includes/emails/template.php:159
3973
  msgid "Dear"
3974
  msgstr ""
3975
 
3976
- #: includes/admin/settings/register-settings.php:620
3977
  #: includes/emails/template.php:160
3978
  msgid ""
3979
  "Thank you for your purchase. Please click on the link(s) below to download "
3980
  "your files."
3981
  msgstr ""
3982
 
3983
- #: includes/admin/settings/register-settings.php:626
3984
  msgid "Sale Notification Subject"
3985
  msgstr ""
3986
 
3987
- #: includes/admin/settings/register-settings.php:627
3988
  msgid "Enter the subject line for the sale notification email."
3989
  msgstr ""
3990
 
3991
- #: includes/admin/settings/register-settings.php:633
3992
  msgid "Sale Notification Heading"
3993
  msgstr ""
3994
 
3995
- #: includes/admin/settings/register-settings.php:634
3996
  msgid "Enter the heading for the sale notification email."
3997
  msgstr ""
3998
 
3999
- #: includes/admin/settings/register-settings.php:636
4000
- #: includes/emails/functions.php:140
4001
  msgid "New Sale!"
4002
  msgstr ""
4003
 
4004
- #: includes/admin/settings/register-settings.php:640
4005
  msgid "Sale Notification"
4006
  msgstr ""
4007
 
4008
- #: includes/admin/settings/register-settings.php:641
4009
  msgid ""
4010
  "Enter the text that is sent as sale notification email after completion of "
4011
  "a purchase. HTML is accepted. Available template tags:"
4012
  msgstr ""
4013
 
4014
- #: includes/admin/settings/register-settings.php:647
4015
  msgid "Sale Notification Emails"
4016
  msgstr ""
4017
 
4018
- #: includes/admin/settings/register-settings.php:648
4019
  msgid ""
4020
  "Enter the email address(es) that should receive a notification anytime a "
4021
  "sale is made, one per line."
4022
  msgstr ""
4023
 
4024
- #: includes/admin/settings/register-settings.php:654
4025
  msgid "Disable Admin Notifications"
4026
  msgstr ""
4027
 
4028
- #: includes/admin/settings/register-settings.php:655
4029
  msgid "Check this box if you do not want to receive sales notification emails."
4030
  msgstr ""
4031
 
4032
- #: includes/admin/settings/register-settings.php:667
 
 
 
 
 
 
 
 
 
 
 
 
4033
  msgid "Disable Styles"
4034
  msgstr ""
4035
 
4036
- #: includes/admin/settings/register-settings.php:668
4037
  msgid ""
4038
  "Check this to disable all included styling of buttons, checkout fields, and "
4039
  "all other elements."
4040
  msgstr ""
4041
 
4042
- #: includes/admin/settings/register-settings.php:670
4043
  msgid "Disabling Styles"
4044
  msgstr ""
4045
 
4046
- #: includes/admin/settings/register-settings.php:671
4047
  msgid ""
4048
  "If your theme has a complete custom CSS file for Easy Digital Downloads, "
4049
  "you may wish to disable our default styles. This is not recommended unless "
4050
  "you're sure your theme has a complete custom CSS."
4051
  msgstr ""
4052
 
4053
- #: includes/admin/settings/register-settings.php:675
4054
  msgid "Buttons"
4055
  msgstr ""
4056
 
4057
- #: includes/admin/settings/register-settings.php:676
4058
  msgid "Options for add to cart and purchase buttons"
4059
  msgstr ""
4060
 
4061
- #: includes/admin/settings/register-settings.php:681
4062
  msgid "Default Button Style"
4063
  msgstr ""
4064
 
4065
- #: includes/admin/settings/register-settings.php:682
4066
  msgid "Choose the style you want to use for the buttons."
4067
  msgstr ""
4068
 
4069
- #: includes/admin/settings/register-settings.php:688
4070
  msgid "Default Button Color"
4071
  msgstr ""
4072
 
4073
- #: includes/admin/settings/register-settings.php:689
4074
  msgid "Choose the color you want to use for the buttons."
4075
  msgstr ""
4076
 
4077
- #: includes/admin/settings/register-settings.php:702
4078
  msgid "Need help?"
4079
  msgstr ""
4080
 
4081
- #: includes/admin/settings/register-settings.php:703
4082
  msgid ""
4083
  "Visit the <a href=\"%s\" target=\"_blank\">Tax setup documentation</a> for "
4084
  "further information. If you need VAT support, there are options listed on "
4085
  "the documentation page."
4086
  msgstr ""
4087
 
4088
- #: includes/admin/settings/register-settings.php:708
4089
  msgid "Enable Taxes"
4090
  msgstr ""
4091
 
4092
- #: includes/admin/settings/register-settings.php:709
4093
  msgid "Check this to enable taxes on purchases."
4094
  msgstr ""
4095
 
4096
- #: includes/admin/settings/register-settings.php:711
4097
  msgid "Enabling Taxes"
4098
  msgstr ""
4099
 
4100
- #: includes/admin/settings/register-settings.php:712
4101
  msgid ""
4102
  "With taxes enabled, Easy Digital Downloads will use the rules below to "
4103
  "charge tax to customers. With taxes enabled, customers are required to "
4104
  "input their address on checkout so that taxes can be properly calculated."
4105
  msgstr ""
4106
 
4107
- #: includes/admin/settings/register-settings.php:716
4108
  msgid "Tax Rates"
4109
  msgstr ""
4110
 
4111
- #: includes/admin/settings/register-settings.php:717
4112
  msgid ""
4113
  "Add tax rates for specific regions. Enter a percentage, such as 6.5 for "
4114
  "6.5%."
4115
  msgstr ""
4116
 
4117
- #: includes/admin/settings/register-settings.php:722
4118
- #: includes/admin/settings/register-settings.php:726
4119
  msgid "Fallback Tax Rate"
4120
  msgstr ""
4121
 
4122
- #: includes/admin/settings/register-settings.php:723
4123
  msgid ""
4124
  "Customers not in a specific rate will be charged this tax rate. Enter a "
4125
  "percentage, such as 6.5 for 6.5%. "
4126
  msgstr ""
4127
 
4128
- #: includes/admin/settings/register-settings.php:727
4129
  msgid ""
4130
  "If the customer's address fails to meet the above tax rules, you can define "
4131
  "a `default` tax rate to be applied to all other customers. Enter a "
4132
  "percentage, such as 6.5 for 6.5%."
4133
  msgstr ""
4134
 
4135
- #: includes/admin/settings/register-settings.php:731
4136
  msgid "Prices entered with tax"
4137
  msgstr ""
4138
 
4139
- #: includes/admin/settings/register-settings.php:732
4140
  msgid "This option affects how you enter prices."
4141
  msgstr ""
4142
 
4143
- #: includes/admin/settings/register-settings.php:736
4144
  msgid "Yes, I will enter prices inclusive of tax"
4145
  msgstr ""
4146
 
4147
- #: includes/admin/settings/register-settings.php:737
4148
  msgid "No, I will enter prices exclusive of tax"
4149
  msgstr ""
4150
 
4151
- #: includes/admin/settings/register-settings.php:739
4152
  msgid "Prices Inclusive of Tax"
4153
  msgstr ""
4154
 
4155
- #: includes/admin/settings/register-settings.php:740
4156
  msgid ""
4157
  "When using prices inclusive of tax, you will be entering your prices as the "
4158
  "total amount you want a customer to pay for the download, including tax. "
@@ -4160,143 +4359,127 @@ msgid ""
4160
  "for the defined total price."
4161
  msgstr ""
4162
 
4163
- #: includes/admin/settings/register-settings.php:744
4164
  msgid "Display Tax Rate on Prices"
4165
  msgstr ""
4166
 
4167
- #: includes/admin/settings/register-settings.php:745
4168
  msgid "Some countries require a notice when product prices include tax."
4169
  msgstr ""
4170
 
4171
- #: includes/admin/settings/register-settings.php:750
4172
  msgid "Display during checkout"
4173
  msgstr ""
4174
 
4175
- #: includes/admin/settings/register-settings.php:751
4176
  msgid "Should prices on the checkout page be shown with or without tax?"
4177
  msgstr ""
4178
 
4179
- #: includes/admin/settings/register-settings.php:755
4180
  msgid "Including tax"
4181
  msgstr ""
4182
 
4183
- #: includes/admin/settings/register-settings.php:756
4184
  msgid "Excluding tax"
4185
  msgstr ""
4186
 
4187
- #: includes/admin/settings/register-settings.php:758
4188
  msgid "Taxes Displayed for Products on Checkout"
4189
  msgstr ""
4190
 
4191
- #: includes/admin/settings/register-settings.php:759
4192
  msgid ""
4193
  "This option will determine whether the product price displays with or "
4194
  "without tax on checkout."
4195
  msgstr ""
4196
 
4197
- #: includes/admin/settings/register-settings.php:777
4198
- #: includes/admin/settings/register-settings.php:780
4199
- msgid "Redirect to Checkout"
4200
- msgstr ""
4201
-
4202
- #: includes/admin/settings/register-settings.php:778
4203
- msgid "Immediately redirect to checkout after adding an item to the cart?"
4204
- msgstr ""
4205
-
4206
- #: includes/admin/settings/register-settings.php:781
4207
- msgid ""
4208
- "When enabled, once an item has been added to the cart, the customer will be "
4209
- "redirected directly to your checkout page. This is useful for stores that "
4210
- "sell single items."
4211
- msgstr ""
4212
-
4213
- #: includes/admin/settings/register-settings.php:785
4214
  msgid "Cart Item Quantities"
4215
  msgstr ""
4216
 
4217
- #: includes/admin/settings/register-settings.php:786
4218
  msgid ""
4219
  "Allow quantities to be adjusted when adding %s to the cart, and while "
4220
  "viewing the checkout cart."
4221
  msgstr ""
4222
 
4223
- #: includes/admin/settings/register-settings.php:791
4224
  msgid "Debug Mode"
4225
  msgstr ""
4226
 
4227
- #: includes/admin/settings/register-settings.php:792
4228
  msgid ""
4229
  "Check this box to enable debug mode. When enabled, debug messages will be "
4230
  "logged and shown in Downloads &rarr; Tools &rarr; Debug Log."
4231
  msgstr ""
4232
 
4233
- #: includes/admin/settings/register-settings.php:797
4234
  msgid "Remove Data on Uninstall?"
4235
  msgstr ""
4236
 
4237
- #: includes/admin/settings/register-settings.php:798
4238
  msgid ""
4239
  "Check this box if you would like EDD to completely remove all of its data "
4240
  "when the plugin is deleted."
4241
  msgstr ""
4242
 
4243
- #: includes/admin/settings/register-settings.php:805
4244
  msgid "Complete Purchase Text"
4245
  msgstr ""
4246
 
4247
- #: includes/admin/settings/register-settings.php:806
4248
  msgid "The button label for completing a purchase."
4249
  msgstr ""
4250
 
4251
- #: includes/admin/settings/register-settings.php:812
4252
  msgid "Complete Free Purchase Text"
4253
  msgstr ""
4254
 
4255
- #: includes/admin/settings/register-settings.php:813
4256
  msgid "The button label for completing a free purchase."
4257
  msgstr ""
4258
 
4259
- #: includes/admin/settings/register-settings.php:815
4260
  #: includes/checkout/template.php:1008
4261
  msgid "Free Download"
4262
  msgstr ""
4263
 
4264
- #: includes/admin/settings/register-settings.php:819
4265
  msgid "Add to Cart Text"
4266
  msgstr ""
4267
 
4268
- #: includes/admin/settings/register-settings.php:820
4269
  msgid "Text shown on the Add to Cart Buttons."
4270
  msgstr ""
4271
 
4272
- #: includes/admin/settings/register-settings.php:826
4273
  msgid "Checkout Button Text"
4274
  msgstr ""
4275
 
4276
- #: includes/admin/settings/register-settings.php:827
4277
  msgid ""
4278
  "Text shown on the Add to Cart Button when the product is already in the "
4279
  "cart."
4280
  msgstr ""
4281
 
4282
- #: includes/admin/settings/register-settings.php:833
4283
  msgid "Buy Now Text"
4284
  msgstr ""
4285
 
4286
- #: includes/admin/settings/register-settings.php:834
4287
  msgid "Text shown on the Buy Now Buttons."
4288
  msgstr ""
4289
 
4290
- #: includes/admin/settings/register-settings.php:842
4291
- #: includes/admin/settings/register-settings.php:845
4292
  msgid "Download Method"
4293
  msgstr ""
4294
 
4295
- #: includes/admin/settings/register-settings.php:843
4296
  msgid "Select the file download method. Note, not all methods work on all servers."
4297
  msgstr ""
4298
 
4299
- #: includes/admin/settings/register-settings.php:846
4300
  msgid ""
4301
  "Due to its consistency in multiple platforms and better file protection, "
4302
  "'forced' is the default method. Because Easy Digital Downloads uses PHP to "
@@ -4307,35 +4490,35 @@ msgid ""
4307
  "method can help resolve this."
4308
  msgstr ""
4309
 
4310
- #: includes/admin/settings/register-settings.php:848
4311
  msgid "Forced"
4312
  msgstr ""
4313
 
4314
- #: includes/admin/settings/register-settings.php:849
4315
  msgid "Redirect"
4316
  msgstr ""
4317
 
4318
- #: includes/admin/settings/register-settings.php:854
4319
  msgid "Symlink File Downloads?"
4320
  msgstr ""
4321
 
4322
- #: includes/admin/settings/register-settings.php:855
4323
  msgid ""
4324
  "Check this if you are delivering really large files or having problems with "
4325
  "file downloads completing."
4326
  msgstr ""
4327
 
4328
- #: includes/admin/settings/register-settings.php:861
4329
  msgid ""
4330
  "The maximum number of times files can be downloaded for purchases. Can be "
4331
  "overwritten for each %s."
4332
  msgstr ""
4333
 
4334
- #: includes/admin/settings/register-settings.php:864
4335
  msgid "File Download Limits"
4336
  msgstr ""
4337
 
4338
- #: includes/admin/settings/register-settings.php:865
4339
  msgid ""
4340
  "Set the global default for the number of times a customer can download "
4341
  "items they purchase. Using a value of 0 is unlimited. This can be defined "
@@ -4343,18 +4526,18 @@ msgid ""
4343
  "individual purchase."
4344
  msgstr ""
4345
 
4346
- #: includes/admin/settings/register-settings.php:869
4347
- #: includes/admin/settings/register-settings.php:871
4348
  msgid "Download Link Expiration"
4349
  msgstr ""
4350
 
4351
- #: includes/admin/settings/register-settings.php:870
4352
  msgid ""
4353
  "How long should download links be valid for? Default is 24 hours from the "
4354
  "time they are generated. Enter a time in hours."
4355
  msgstr ""
4356
 
4357
- #: includes/admin/settings/register-settings.php:872
4358
  msgid ""
4359
  "When a customer receives a link to their downloads via email, in their "
4360
  "receipt, or in their purchase history, the link will only be valid for the "
@@ -4363,96 +4546,96 @@ msgid ""
4363
  "customer."
4364
  msgstr ""
4365
 
4366
- #: includes/admin/settings/register-settings.php:880
4367
  msgid "Disable Redownload?"
4368
  msgstr ""
4369
 
4370
- #: includes/admin/settings/register-settings.php:881
4371
  msgid ""
4372
  "Check this if you do not want to allow users to redownload items from their "
4373
  "purchase history."
4374
  msgstr ""
4375
 
4376
- #: includes/admin/settings/register-settings.php:888
4377
  msgid "Agree to Terms"
4378
  msgstr ""
4379
 
4380
- #: includes/admin/settings/register-settings.php:890
4381
  msgid ""
4382
  "Check this to show an agree to terms on checkout that users must agree to "
4383
  "before purchasing."
4384
  msgstr ""
4385
 
4386
- #: includes/admin/settings/register-settings.php:893
4387
  msgid "Need help creating a Terms of Agreement? We recommend using %sTermageddon%s."
4388
  msgstr ""
4389
 
4390
- #: includes/admin/settings/register-settings.php:902
4391
  msgid "Agree to Terms Label"
4392
  msgstr ""
4393
 
4394
- #: includes/admin/settings/register-settings.php:903
4395
  msgid "Label shown next to the agree to terms checkbox."
4396
  msgstr ""
4397
 
4398
- #: includes/admin/settings/register-settings.php:909
4399
  msgid "Agreement Text"
4400
  msgstr ""
4401
 
4402
- #: includes/admin/settings/register-settings.php:910
4403
  msgid "If Agree to Terms is checked, enter the agreement terms here."
4404
  msgstr ""
4405
 
4406
- #: includes/admin/settings/register-settings.php:921
4407
  msgid "Agree to Privacy Policy"
4408
  msgstr ""
4409
 
4410
- #: includes/admin/settings/register-settings.php:922
4411
  msgid ""
4412
  "Check this to show an agree to Privacy Policy on checkout that users must "
4413
  "agree to before purchasing."
4414
  msgstr ""
4415
 
4416
- #: includes/admin/settings/register-settings.php:927
4417
  msgid "Agree to Privacy Policy Label"
4418
  msgstr ""
4419
 
4420
- #: includes/admin/settings/register-settings.php:928
4421
  msgid "Label shown next to the agree to Privacy Policy checkbox."
4422
  msgstr ""
4423
 
4424
- #: includes/admin/settings/register-settings.php:934
4425
  msgid "Show the Privacy Policy on checkout"
4426
  msgstr ""
4427
 
4428
- #: includes/admin/settings/register-settings.php:936
4429
  msgid "Display your Privacy Policy on checkout."
4430
  msgstr ""
4431
 
4432
- #: includes/admin/settings/register-settings.php:936
4433
  msgid "Set your Privacy Policy here"
4434
  msgstr ""
4435
 
4436
- #: includes/admin/settings/register-settings.php:937
4437
  msgid "Need help creating a Privacy Policy? We recommend %sTermageddon%s."
4438
  msgstr ""
4439
 
4440
- #: includes/admin/settings/register-settings.php:950
4441
  msgid "Payment Status Actions"
4442
  msgstr ""
4443
 
4444
- #: includes/admin/settings/register-settings.php:952
4445
  msgid ""
4446
  "When a user requests to be anonymized or removed from a site, these are the "
4447
  "actions that will be taken on payments associated with their customer, by "
4448
  "status."
4449
  msgstr ""
4450
 
4451
- #: includes/admin/settings/register-settings.php:953
4452
  msgid "What settings should I use?"
4453
  msgstr ""
4454
 
4455
- #: includes/admin/settings/register-settings.php:954
4456
  msgid ""
4457
  "By default, Easy Digital Downloads sets suggested actions based on the "
4458
  "Payment Status. These are purely recommendations, and you may need to "
@@ -4460,274 +4643,241 @@ msgid ""
4460
  "leave these settings as is."
4461
  msgstr ""
4462
 
4463
- #: includes/admin/settings/register-settings.php:965
4464
  msgid "No Action"
4465
  msgstr ""
4466
 
4467
- #: includes/admin/settings/register-settings.php:966
4468
  msgid "Anonymize"
4469
  msgstr ""
4470
 
4471
- #: includes/admin/settings/register-settings.php:1006
4472
  msgid "Buy Now Disabled"
4473
  msgstr ""
4474
 
4475
- #: includes/admin/settings/register-settings.php:1007
4476
  msgid ""
4477
  "Buy Now buttons are only available for stores that have a single supported "
4478
  "gateway active and that do not use taxes."
4479
  msgstr ""
4480
 
4481
- #: includes/admin/settings/register-settings.php:1110
4482
  msgid "Settings updated."
4483
  msgstr ""
4484
 
4485
- #: includes/admin/settings/register-settings.php:1263
4486
  msgid "Error setting default gateway. No gateways are enabled."
4487
  msgstr ""
4488
 
4489
- #: includes/admin/settings/register-settings.php:1276
4490
  msgid "%s could not be set as the default gateway. It must first be enabled."
4491
  msgstr ""
4492
 
4493
- #: includes/admin/settings/register-settings.php:1371
4494
- msgid "Payments"
4495
- msgstr ""
4496
-
4497
- #: includes/admin/settings/register-settings.php:1375
4498
  msgid "Privacy"
4499
  msgstr ""
4500
 
4501
- #: includes/admin/settings/register-settings.php:1381
4502
  msgid "Licenses"
4503
  msgstr ""
4504
 
4505
- #: includes/admin/settings/register-settings.php:1384
4506
  msgid "Misc"
4507
  msgstr ""
4508
 
4509
- #: includes/admin/settings/register-settings.php:1426
4510
  msgid "Store"
4511
  msgstr ""
4512
 
4513
- #: includes/admin/settings/register-settings.php:1431
4514
  msgid "Gateways"
4515
  msgstr ""
4516
 
4517
- #: includes/admin/settings/register-settings.php:1432
4518
  #: includes/gateways/stripe/includes/payment-methods/payment-request/admin/settings.php:82
4519
  #: includes/install.php:98 templates/widget-cart-checkout.php:6
4520
  #: templates/widget-cart-empty.php:7
4521
  msgid "Checkout"
4522
  msgstr ""
4523
 
4524
- #: includes/admin/settings/register-settings.php:1433
4525
  msgid "Accounting"
4526
  msgstr ""
4527
 
4528
- #: includes/admin/settings/register-settings.php:1437
4529
  msgid "Purchase Receipts"
4530
  msgstr ""
4531
 
4532
- #: includes/admin/settings/register-settings.php:1438
4533
  msgid "New Sale Notifications"
4534
  msgstr ""
4535
 
4536
- #: includes/admin/settings/register-settings.php:1447
4537
  msgid "Main"
4538
  msgstr ""
4539
 
4540
- #: includes/admin/settings/register-settings.php:1452
4541
  msgid "Button Text"
4542
  msgstr ""
4543
 
4544
- #: includes/admin/settings/register-settings.php:1454
4545
  msgid "Terms of Agreement"
4546
  msgstr ""
4547
 
4548
- #: includes/admin/settings/register-settings.php:1458
4549
  msgid "Export & Erase"
4550
  msgstr ""
4551
 
4552
- #: includes/admin/settings/register-settings.php:1700
4553
  msgid ""
4554
  "Don't see what you need? More Payment Gateway options are available <a "
4555
  "href=\"%s\">here</a>."
4556
  msgstr ""
4557
 
4558
- #: includes/admin/settings/register-settings.php:1921
4559
  msgid "The callback function used for the %s setting is missing."
4560
  msgstr ""
4561
 
4562
- #: includes/admin/settings/register-settings.php:2083
4563
  msgid "Upload File"
4564
  msgstr ""
4565
 
4566
  #: includes/admin/settings/register-settings.php:2176
4567
- msgid "Access your SendWP account"
4568
- msgstr ""
4569
-
4570
- #: includes/admin/settings/register-settings.php:2197
4571
- msgid "SendWP plugin activated."
4572
- msgstr ""
4573
-
4574
- #: includes/admin/settings/register-settings.php:2200
4575
- msgid "Disconnect SendWP"
4576
- msgstr ""
4577
-
4578
- #: includes/admin/settings/register-settings.php:2207
4579
- msgid ""
4580
- "We recommend SendWP to ensure quick and reliable delivery of all emails "
4581
- "sent from your store, such as purchase receipts, subscription renewal "
4582
- "reminders, password resets, and more."
4583
- msgstr ""
4584
-
4585
- #: includes/admin/settings/register-settings.php:2207
4586
- msgid "%sLearn more%s"
4587
- msgstr ""
4588
-
4589
- #: includes/admin/settings/register-settings.php:2210
4590
- msgid "Connect with SendWP"
4591
- msgstr ""
4592
-
4593
- #: includes/admin/settings/register-settings.php:2246
4594
  msgid "Recapture plugin activated."
4595
  msgstr ""
4596
 
4597
- #: includes/admin/settings/register-settings.php:2247
4598
  msgid "%sAccess your Recapture account%s."
4599
  msgstr ""
4600
 
4601
- #: includes/admin/settings/register-settings.php:2252
4602
  msgid "Disconnect Recapture"
4603
  msgstr ""
4604
 
4605
- #: includes/admin/settings/register-settings.php:2256
4606
  msgid "%sComplete your connection to Recapture%s"
4607
  msgstr ""
4608
 
4609
- #: includes/admin/settings/register-settings.php:2264
4610
  msgid ""
4611
  "We recommend Recapture for recovering lost revenue by automatically sending "
4612
  "effective, targeted emails to customers who abandon their shopping cart."
4613
  msgstr ""
4614
 
4615
- #: includes/admin/settings/register-settings.php:2264
4616
  msgid "%sLearn more%s (Free trial available)"
4617
  msgstr ""
4618
 
4619
- #: includes/admin/settings/register-settings.php:2268
4620
  msgid "Connect with Recapture"
4621
  msgstr ""
4622
 
4623
- #: includes/admin/settings/register-settings.php:2299
4624
  msgid "Country Wide"
4625
  msgstr ""
4626
 
4627
- #: includes/admin/settings/register-settings.php:2300
4628
  msgid "Rate"
4629
  msgstr ""
4630
 
4631
- #: includes/admin/settings/register-settings.php:2300
4632
  msgid ""
4633
  "<strong>Regional tax rates: </strong>When a customer enters an address on "
4634
  "checkout that matches the specified region for this tax rate, the cart tax "
4635
  "will adjust automatically. Enter a percentage, such as 6.5 for 6.5%."
4636
  msgstr ""
4637
 
4638
- #: includes/admin/settings/register-settings.php:2317
4639
- #: includes/admin/settings/register-settings.php:2365
4640
  msgid "Choose a country"
4641
  msgstr ""
4642
 
4643
- #: includes/admin/settings/register-settings.php:2335
4644
  msgid "Choose a state"
4645
  msgstr ""
4646
 
4647
- #: includes/admin/settings/register-settings.php:2347
4648
- #: includes/admin/settings/register-settings.php:2378
4649
  msgid "Apply to whole country"
4650
  msgstr ""
4651
 
4652
- #: includes/admin/settings/register-settings.php:2350
4653
- #: includes/admin/settings/register-settings.php:2381
4654
  msgid "Remove Rate"
4655
  msgstr ""
4656
 
4657
- #: includes/admin/settings/register-settings.php:2386
4658
  msgid "Add Tax Rate"
4659
  msgstr ""
4660
 
4661
- #: includes/admin/settings/register-settings.php:2439
4662
  msgid ""
4663
  "Your license key expired on %s. Please <a href=\"%s\" "
4664
  "target=\"_blank\">renew your license key</a>."
4665
  msgstr ""
4666
 
4667
- #: includes/admin/settings/register-settings.php:2452
4668
  msgid ""
4669
  "Your license key has been disabled. Please <a href=\"%s\" "
4670
  "target=\"_blank\">contact support</a> for more information."
4671
  msgstr ""
4672
 
4673
- #: includes/admin/settings/register-settings.php:2464
4674
  msgid ""
4675
  "Invalid license. Please <a href=\"%s\" target=\"_blank\">visit your account "
4676
  "page</a> and verify it."
4677
  msgstr ""
4678
 
4679
- #: includes/admin/settings/register-settings.php:2477
4680
  msgid ""
4681
  "Your %s is not active for this URL. Please <a href=\"%s\" "
4682
  "target=\"_blank\">visit your account page</a> to manage your license key "
4683
  "URLs."
4684
  msgstr ""
4685
 
4686
- #: includes/admin/settings/register-settings.php:2489
4687
  msgid "This appears to be an invalid license key for %s."
4688
  msgstr ""
4689
 
4690
- #: includes/admin/settings/register-settings.php:2498
4691
  msgid ""
4692
  "Your license key has reached its activation limit. <a href=\"%s\">View "
4693
  "possible upgrades</a> now."
4694
  msgstr ""
4695
 
4696
- #: includes/admin/settings/register-settings.php:2507
4697
  msgid ""
4698
  "The key you entered belongs to a bundle, please use the product specific "
4699
  "license key."
4700
  msgstr ""
4701
 
4702
- #: includes/admin/settings/register-settings.php:2515
4703
  msgid "unknown_error"
4704
  msgstr ""
4705
 
4706
- #: includes/admin/settings/register-settings.php:2516
4707
  msgid ""
4708
  "There was an error with this license key: %s. Please <a href=\"%s\">contact "
4709
  "our support team</a>."
4710
  msgstr ""
4711
 
4712
- #: includes/admin/settings/register-settings.php:2536
4713
  msgid "License key never expires."
4714
  msgstr ""
4715
 
4716
- #: includes/admin/settings/register-settings.php:2543
4717
- msgid ""
4718
- "Your license key expires soon! It expires on %s. <a href=\"%s\" "
4719
- "target=\"_blank\">Renew your license key</a>."
4720
  msgstr ""
4721
 
4722
- #: includes/admin/settings/register-settings.php:2553
4723
  msgid "Your license key expires on %s."
4724
  msgstr ""
4725
 
4726
- #: includes/admin/settings/register-settings.php:2571
4727
  msgid "To receive updates, please enter your valid %s license key."
4728
  msgstr ""
4729
 
4730
- #: includes/admin/settings/register-settings.php:2584
4731
  msgid "Deactivate License"
4732
  msgstr ""
4733
 
@@ -5285,7 +5435,7 @@ msgstr ""
5285
  #: includes/admin/upgrades/upgrade-functions.php:899
5286
  #: includes/admin/upgrades/upgrade-functions.php:1027
5287
  #: includes/admin/upgrades/upgrade-functions.php:1112
5288
- #: includes/gateways/stripe/includes/admin/upgrade-functions.php:57
5289
  msgid "You do not have permission to do shop upgrades"
5290
  msgstr ""
5291
 
@@ -5354,6 +5504,27 @@ msgstr ""
5354
  msgid "Step %d of approximately %d running"
5355
  msgstr ""
5356
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5357
  #: includes/ajax-functions.php:143 includes/cart/actions.php:112
5358
  msgid ""
5359
  "Missing nonce when removing an item from the cart. Please read the "
@@ -5370,7 +5541,7 @@ msgid ""
5370
  "ajax-requests-in-easy-digital-downloads-2-9-4"
5371
  msgstr ""
5372
 
5373
- #: includes/ajax-functions.php:478
5374
  msgid ""
5375
  "Missing nonce when recalculating taxes. Please read the following for more "
5376
  "information: "
@@ -5378,7 +5549,7 @@ msgid ""
5378
  "ajax-requests-in-easy-digital-downloads-2-9-4"
5379
  msgstr ""
5380
 
5381
- #: includes/ajax-functions.php:528
5382
  msgid ""
5383
  "Missing nonce when retrieving state list. Please read the following for "
5384
  "more information: "
@@ -5386,16 +5557,16 @@ msgid ""
5386
  "ajax-requests-in-easy-digital-downloads-2-9-4"
5387
  msgstr ""
5388
 
5389
- #: includes/ajax-functions.php:658 includes/ajax-functions.php:710
5390
  msgid "No results found"
5391
  msgstr ""
5392
 
5393
- #: includes/ajax-functions.php:759 includes/ajax-functions.php:851
5394
  #: includes/class-edd-html-elements.php:339
5395
  msgid "No users found"
5396
  msgstr ""
5397
 
5398
- #: includes/ajax-functions.php:801
5399
  msgid "All Prices"
5400
  msgstr ""
5401
 
@@ -5489,6 +5660,14 @@ msgstr ""
5489
  msgid "You do not have permission to %s API keys for this user"
5490
  msgstr ""
5491
 
 
 
 
 
 
 
 
 
5492
  #: includes/cart/class-edd-cart.php:897
5493
  msgid "includes %s tax"
5494
  msgstr ""
@@ -6110,23 +6289,23 @@ msgstr ""
6110
  msgid "Single Use: %s"
6111
  msgstr ""
6112
 
6113
- #: includes/class-edd-cli.php:506 includes/class-edd-cli.php:764
6114
  msgid "No action specified, did you mean"
6115
  msgstr ""
6116
 
6117
- #: includes/class-edd-cli.php:508 includes/class-edd-cli.php:766
6118
  msgid "Invalid action specified, did you mean"
6119
  msgstr ""
6120
 
6121
- #: includes/class-edd-cli.php:569
6122
  msgid "Invalid status '%s', defaulting to 'complete'"
6123
  msgstr ""
6124
 
6125
- #: includes/class-edd-cli.php:607
6126
  msgid "Specified ID is not a product"
6127
  msgstr ""
6128
 
6129
- #: includes/class-edd-cli.php:742
6130
  msgid "Created %s payments"
6131
  msgstr ""
6132
 
@@ -6208,24 +6387,24 @@ msgstr ""
6208
  msgid "Enter username"
6209
  msgstr ""
6210
 
6211
- #: includes/class-edd-license-handler.php:193
6212
  msgid "%1$s"
6213
  msgstr ""
6214
 
6215
- #: includes/class-edd-license-handler.php:225
6216
  msgid ""
6217
  "Enter your extension license keys here to receive updates for purchased "
6218
  "extensions. If your license key has expired, please <a href=\"%s\" "
6219
  "target=\"_blank\">renew your license</a>."
6220
  msgstr ""
6221
 
6222
- #: includes/class-edd-license-handler.php:512
6223
  msgid ""
6224
  "You have invalid or expired license keys for Easy Digital Downloads. Please "
6225
  "go to the <a href=\"%s\">Licenses page</a> to correct this issue."
6226
  msgstr ""
6227
 
6228
- #: includes/class-edd-license-handler.php:550
6229
  msgid "Enter valid license key for automatic updates."
6230
  msgstr ""
6231
 
@@ -6637,11 +6816,11 @@ msgid ""
6637
  "of a purchase. HTML is accepted. Available template tags:"
6638
  msgstr ""
6639
 
6640
- #: includes/deprecated-functions.php:517 includes/process-download.php:894
6641
  msgid "Sorry but you have hit your download limit for this file."
6642
  msgstr ""
6643
 
6644
- #: includes/deprecated-functions.php:532 includes/download-functions.php:1255
6645
  msgid "Sorry but your download link has expired."
6646
  msgstr ""
6647
 
@@ -6667,8 +6846,8 @@ msgid "Install Jilt"
6667
  msgstr ""
6668
 
6669
  #: includes/deprecated-functions.php:813 includes/deprecated-functions.php:892
6670
- #: includes/deprecated-functions.php:921 includes/emails/functions.php:294
6671
- #: includes/emails/functions.php:368 includes/emails/functions.php:389
6672
  msgid "You do not have permission to do this."
6673
  msgstr ""
6674
 
@@ -6684,13 +6863,61 @@ msgid ""
6684
  "free%4$s."
6685
  msgstr ""
6686
 
6687
- #: includes/deprecated-functions.php:975 includes/emails/functions.php:481
6688
  #. Translators: %1$s - Opening anchor tag, %2$s - The url to dismiss the ajax
6689
  #. notice, %3$s - Complete the opening of the anchor tag, %4$s - Open span tag,
6690
  #. %4$s - Close span tag
6691
  msgid "%1$s %2$s %3$s %4$s Dismiss this notice. %5$s"
6692
  msgstr ""
6693
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6694
  #: includes/download-functions.php:524
6695
  msgid "Bundle"
6696
  msgstr ""
@@ -6730,11 +6957,11 @@ msgstr ""
6730
  msgid "No template, plain text only"
6731
  msgstr ""
6732
 
6733
- #: includes/emails/class-edd-emails.php:291
6734
  msgid "You cannot send email with EDD_Emails until init/admin_init has been reached"
6735
  msgstr ""
6736
 
6737
- #: includes/emails/class-edd-emails.php:318
6738
  msgid ""
6739
  "Email from Easy Digital Downloads failed to send.\n"
6740
  "Send time: %s\n"
@@ -6743,47 +6970,43 @@ msgid ""
6743
  "\n"
6744
  msgstr ""
6745
 
6746
- #: includes/emails/functions.php:136
6747
  msgid "New download purchase - Order #%1$s"
6748
  msgstr ""
6749
 
6750
- #: includes/emails/functions.php:200 includes/emails/template.php:212
6751
  msgid "Hello"
6752
  msgstr ""
6753
 
6754
- #: includes/emails/functions.php:200 includes/emails/template.php:212
6755
  msgid "A %s purchase has been made"
6756
  msgstr ""
6757
 
6758
- #: includes/emails/functions.php:201 includes/emails/template.php:213
6759
  msgid "%s sold:"
6760
  msgstr ""
6761
 
6762
- #: includes/emails/functions.php:203 includes/emails/template.php:215
6763
  msgid "Purchased by: "
6764
  msgstr ""
6765
 
6766
- #: includes/emails/functions.php:204 includes/emails/template.php:216
6767
  msgid "Amount: "
6768
  msgstr ""
6769
 
6770
- #: includes/emails/functions.php:205 includes/emails/template.php:217
6771
  msgid "Payment Method: "
6772
  msgstr ""
6773
 
6774
- #: includes/emails/functions.php:206 includes/emails/template.php:218
6775
  msgid "Thank you"
6776
  msgstr ""
6777
 
6778
- #: includes/emails/functions.php:345
6779
- msgid "Something went wrong. SendWP was not installed correctly."
6780
- msgstr ""
6781
-
6782
- #: includes/emails/functions.php:440
6783
  msgid "Something went wrong. Recapture for EDD was not installed correctly."
6784
  msgstr ""
6785
 
6786
- #: includes/emails/functions.php:468
6787
  #. Translators: %1$s - <strong> tag, %2$s - </strong> tag, %3$s - <a> tag, %4$s
6788
  #. - </a> tag
6789
  msgid ""
@@ -7033,7 +7256,7 @@ msgid "Sign up for PayPal"
7033
  msgstr ""
7034
 
7035
  #: includes/gateways/paypal/admin/connect.php:80
7036
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:350
7037
  msgid "Retrieving account information..."
7038
  msgstr ""
7039
 
@@ -7688,41 +7911,41 @@ msgstr ""
7688
  msgid "Preapproval cancelled"
7689
  msgstr ""
7690
 
7691
- #: includes/gateways/stripe/includes/admin/admin-actions.php:80
 
 
 
 
7692
  msgid "The preapproved payment was successfully charged."
7693
  msgstr ""
7694
 
7695
- #: includes/gateways/stripe/includes/admin/admin-actions.php:83
7696
  msgid ""
7697
  "The preapproved payment failed to be charged. View order details for "
7698
  "further details."
7699
  msgstr ""
7700
 
7701
- #: includes/gateways/stripe/includes/admin/admin-actions.php:86
7702
  msgid "The preapproved payment was successfully cancelled."
7703
  msgstr ""
7704
 
7705
- #: includes/gateways/stripe/includes/admin/admin-actions.php:91
7706
  #. translators: %1$s Stripe Connect error message. %2$s Retry URL.
7707
  msgid ""
7708
  "There was an error connecting your Stripe account. Message: %1$s. Please <a "
7709
  "href=\"%2$s\">try again</a>."
7710
  msgstr ""
7711
 
7712
- #: includes/gateways/stripe/includes/admin/admin-actions.php:122
7713
  msgid "Used Existing Card:"
7714
  msgstr ""
7715
 
7716
- #: includes/gateways/stripe/includes/admin/admin-actions.php:123
7717
- msgid "Yes"
7718
- msgstr ""
7719
-
7720
- #: includes/gateways/stripe/includes/admin/admin-actions.php:187
7721
  #: includes/gateways/stripe/includes/scripts.php:149
7722
  msgid "Refund Charge in Stripe"
7723
  msgstr ""
7724
 
7725
- #: includes/gateways/stripe/includes/admin/admin-filters.php:93
7726
  msgid "Process"
7727
  msgstr ""
7728
 
@@ -7818,7 +8041,7 @@ msgid ""
7818
  msgstr ""
7819
 
7820
  #: includes/gateways/stripe/includes/admin/notices.php:39
7821
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:640
7822
  #: includes/gateways/stripe/includes/payment-methods/payment-request/apple-pay.php:22
7823
  msgid "Unable to locate registry"
7824
  msgstr ""
@@ -7827,7 +8050,7 @@ msgstr ""
7827
  msgid "Stripe-specific reports have been removed."
7828
  msgstr ""
7829
 
7830
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:117
7831
  #. translators: %1$s Opening anchor tag, do not translate. %2$s Closing anchor
7832
  #. tag, do not translate.
7833
  msgid ""
@@ -7835,33 +8058,33 @@ msgid ""
7835
  "again%2$s. If you continue to have this problem, please contact support."
7836
  msgstr ""
7837
 
7838
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:303
7839
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:584
7840
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:646
7841
  msgid "Connect with Stripe"
7842
  msgstr ""
7843
 
7844
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:313
7845
  msgid ""
7846
  "Connect with Stripe for pay as you go pricing: 2% per-transaction fee + "
7847
  "Stripe fees."
7848
  msgstr ""
7849
 
7850
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:324
7851
  #. translators: %1$s Opening anchor tag, do not translate. %2$s Closing anchor
7852
  #. tag, do not translate.
7853
  msgid "Have questions about connecting with Stripe? See the %1$sdocumentation%2$s."
7854
  msgstr ""
7855
 
7856
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:363
7857
  msgid "Manage API keys manually"
7858
  msgstr ""
7859
 
7860
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:373
7861
  msgid "Hide API keys"
7862
  msgstr ""
7863
 
7864
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:379
7865
  msgid ""
7866
  "Although you can add your API keys manually, we recommend using Stripe "
7867
  "Connect: an easier and more secure way of connecting your Stripe account to "
@@ -7871,11 +8094,11 @@ msgid ""
7871
  "just a few clicks."
7872
  msgstr ""
7873
 
7874
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:397
7875
  msgid "Unable to retrieve account information."
7876
  msgstr ""
7877
 
7878
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:422
7879
  #. translators: %1$s Stripe payment mode. %2$s Opening anchor tag for
7880
  #. reconnecting to Stripe, do not translate. %3$s Opening anchor tag for
7881
  #. disconnecting Stripe, do not translate. %4$s Closing anchor tag, do not
@@ -7885,56 +8108,56 @@ msgid ""
7885
  "mode%4$s, or %3$sdisconnect this account%4$s."
7886
  msgstr ""
7887
 
7888
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:454
7889
  #. translators: %1$s Opening bold tag, do not translate. %2$s Closing bold tag,
7890
  #. do not translate.
7891
  msgid "Webhooks cannot be configured for recurring purchases with this account."
7892
  msgstr ""
7893
 
7894
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:472
7895
  #. translators: %1$s Opening anchor tag for disconnecting Stripe, do not
7896
  #. translate. %2$s Closing anchor tag, do not translate.
7897
  msgid "%1$sDisconnect this account%2$s."
7898
  msgstr ""
7899
 
7900
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:538
7901
  msgid "Pay as you go pricing: 2% per-transaction fee + Stripe fees."
7902
  msgstr ""
7903
 
7904
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:550
7905
  msgid "Administrator (Owner)"
7906
  msgstr ""
7907
 
7908
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:561
7909
  msgid ""
7910
  "The API keys provided do not match the Stripe Connect account associated "
7911
  "with this installation. If you have manually modified these values after "
7912
  "connecting your account, please reconnect below or update your API keys."
7913
  msgstr ""
7914
 
7915
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:587
7916
  msgid ""
7917
  "It is highly recommended to Connect with Stripe for easier setup and "
7918
  "improved security."
7919
  msgstr ""
7920
 
7921
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:600
7922
  #. translators: %1$s Stripe payment mode.
7923
  msgid "Your manually managed %1$s mode API keys are valid."
7924
  msgstr ""
7925
 
7926
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:616
7927
  #. translators: %1$s Stripe payment mode.
7928
  msgid "Your manually managed %1$s mode API keys are invalid."
7929
  msgstr ""
7930
 
7931
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:656
7932
  msgid ""
7933
  "Start accepting payments with Stripe by connecting your account. Stripe "
7934
  "Connect helps ensure easier setup and improved security."
7935
  msgstr ""
7936
 
7937
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:677
7938
  #. translators: %s Test mode status. Enabled or disabled.
7939
  msgid "\"Test Mode\" has been %s. Please verify your Stripe connection status."
7940
  msgstr ""
@@ -8138,7 +8361,7 @@ msgid ""
8138
  "recommendations%2$s."
8139
  msgstr ""
8140
 
8141
- #: includes/gateways/stripe/includes/admin/upgrade-functions.php:32
8142
  #. translators: %s Upgrade link.
8143
  msgid ""
8144
  "Easy Digital Downloads - Stripe Gateway needs to upgrade the customers "
@@ -8147,7 +8370,7 @@ msgid ""
8147
  "this upgrade</a>"
8148
  msgstr ""
8149
 
8150
- #: includes/gateways/stripe/includes/admin/upgrade-functions.php:35
8151
  msgid ""
8152
  "<strong>About this upgrade:</strong><br />This upgrade will improve the "
8153
  "reliability of associating purchase records with your existing customer "
@@ -8155,7 +8378,7 @@ msgid ""
8155
  "locally on their EDD customer record, instead of their user record."
8156
  msgstr ""
8157
 
8158
- #: includes/gateways/stripe/includes/admin/upgrade-functions.php:37
8159
  msgid ""
8160
  "<strong>Advanced User?</strong><br />This upgrade can also be run via WPCLI "
8161
  "with the following command:<br /><code>wp edd-stripe "
@@ -8218,7 +8441,7 @@ msgstr ""
8218
  msgid "Card successfully added."
8219
  msgstr ""
8220
 
8221
- #: includes/gateways/stripe/includes/class-edd-stripe.php:240
8222
  #: includes/gateways/stripe/includes/template-functions.php:125
8223
  msgid "Credit Card"
8224
  msgstr ""
@@ -8732,142 +8955,147 @@ msgstr ""
8732
  msgid "Passwords do not match"
8733
  msgstr ""
8734
 
8735
- #: includes/misc-functions.php:331 tests/tests-misc.php:75
8736
  msgid "US Dollars (&#36;)"
8737
  msgstr ""
8738
 
8739
- #: includes/misc-functions.php:332 tests/tests-misc.php:76
8740
  msgid "Euros (&euro;)"
8741
  msgstr ""
8742
 
8743
- #: includes/misc-functions.php:333 tests/tests-misc.php:77
8744
  msgid "Pound Sterling (&pound;)"
8745
  msgstr ""
8746
 
8747
- #: includes/misc-functions.php:334 tests/tests-misc.php:78
8748
  msgid "Australian Dollars (&#36;)"
8749
  msgstr ""
8750
 
8751
- #: includes/misc-functions.php:335 tests/tests-misc.php:79
8752
  msgid "Brazilian Real (R&#36;)"
8753
  msgstr ""
8754
 
8755
- #: includes/misc-functions.php:336 tests/tests-misc.php:80
8756
  msgid "Canadian Dollars (&#36;)"
8757
  msgstr ""
8758
 
8759
- #: includes/misc-functions.php:337 tests/tests-misc.php:81
8760
  msgid "Czech Koruna"
8761
  msgstr ""
8762
 
8763
- #: includes/misc-functions.php:338 tests/tests-misc.php:82
8764
  msgid "Danish Krone"
8765
  msgstr ""
8766
 
8767
- #: includes/misc-functions.php:339 tests/tests-misc.php:83
8768
  msgid "Hong Kong Dollar (&#36;)"
8769
  msgstr ""
8770
 
8771
- #: includes/misc-functions.php:340 tests/tests-misc.php:84
8772
  msgid "Hungarian Forint"
8773
  msgstr ""
8774
 
8775
- #: includes/misc-functions.php:341 tests/tests-misc.php:85
8776
  msgid "Israeli Shekel (&#8362;)"
8777
  msgstr ""
8778
 
8779
- #: includes/misc-functions.php:342 tests/tests-misc.php:86
8780
  msgid "Japanese Yen (&yen;)"
8781
  msgstr ""
8782
 
8783
- #: includes/misc-functions.php:343 tests/tests-misc.php:87
8784
  msgid "Malaysian Ringgits"
8785
  msgstr ""
8786
 
8787
- #: includes/misc-functions.php:344 tests/tests-misc.php:88
8788
  msgid "Mexican Peso (&#36;)"
8789
  msgstr ""
8790
 
8791
- #: includes/misc-functions.php:345 tests/tests-misc.php:89
8792
  msgid "New Zealand Dollar (&#36;)"
8793
  msgstr ""
8794
 
8795
- #: includes/misc-functions.php:346 tests/tests-misc.php:90
8796
  msgid "Norwegian Krone"
8797
  msgstr ""
8798
 
8799
- #: includes/misc-functions.php:347 tests/tests-misc.php:91
8800
  msgid "Philippine Pesos"
8801
  msgstr ""
8802
 
8803
- #: includes/misc-functions.php:348 tests/tests-misc.php:92
8804
  msgid "Polish Zloty"
8805
  msgstr ""
8806
 
8807
- #: includes/misc-functions.php:349 tests/tests-misc.php:93
8808
  msgid "Singapore Dollar (&#36;)"
8809
  msgstr ""
8810
 
8811
- #: includes/misc-functions.php:350 tests/tests-misc.php:94
8812
  msgid "Swedish Krona"
8813
  msgstr ""
8814
 
8815
- #: includes/misc-functions.php:351 tests/tests-misc.php:95
8816
  msgid "Swiss Franc"
8817
  msgstr ""
8818
 
8819
- #: includes/misc-functions.php:352 tests/tests-misc.php:96
8820
  msgid "Taiwan New Dollars"
8821
  msgstr ""
8822
 
8823
- #: includes/misc-functions.php:353 tests/tests-misc.php:97
8824
  msgid "Thai Baht (&#3647;)"
8825
  msgstr ""
8826
 
8827
- #: includes/misc-functions.php:354 tests/tests-misc.php:98
8828
  msgid "Indian Rupee (&#8377;)"
8829
  msgstr ""
8830
 
8831
- #: includes/misc-functions.php:355 tests/tests-misc.php:99
8832
  msgid "Turkish Lira (&#8378;)"
8833
  msgstr ""
8834
 
8835
- #: includes/misc-functions.php:356 tests/tests-misc.php:100
8836
  msgid "Iranian Rial (&#65020;)"
8837
  msgstr ""
8838
 
8839
- #: includes/misc-functions.php:357 tests/tests-misc.php:101
8840
  msgid "Russian Rubles"
8841
  msgstr ""
8842
 
8843
- #: includes/misc-functions.php:358 tests/tests-misc.php:102
8844
  msgid "Angolan Kwanza"
8845
  msgstr ""
8846
 
8847
- #: includes/misc-functions.php:547
8848
  msgid ""
8849
  "%1$s is <strong>deprecated</strong> since Easy Digital Downloads version "
8850
  "%2$s! Use %3$s instead."
8851
  msgstr ""
8852
 
8853
- #: includes/misc-functions.php:555
8854
  msgid ""
8855
  "%1$s is <strong>deprecated</strong> since Easy Digital Downloads version "
8856
  "%2$s with no alternative available."
8857
  msgstr ""
8858
 
8859
- #: includes/misc-functions.php:596
8860
  msgid ""
8861
  "The %1$s argument of %2$s is <strong>deprecated</strong> since Easy Digital "
8862
  "Downloads version %3$s! Please use %4$s instead."
8863
  msgstr ""
8864
 
8865
- #: includes/misc-functions.php:604
8866
  msgid ""
8867
  "The %1$s argument of %2$s is <strong>deprecated</strong> since Easy Digital "
8868
  "Downloads version %3$s with no alternative available."
8869
  msgstr ""
8870
 
 
 
 
 
 
8871
  #: includes/payments/actions.php:187
8872
  msgid "After payment actions processed."
8873
  msgstr ""
@@ -9425,15 +9653,15 @@ msgstr ""
9425
  msgid "Purchase Verification Failed"
9426
  msgstr ""
9427
 
9428
- #: includes/process-download.php:970
9429
  msgid "Invalid file"
9430
  msgstr ""
9431
 
9432
- #: includes/process-download.php:977
9433
  msgid "The requested file could not be found. Error 404."
9434
  msgstr ""
9435
 
9436
- #: includes/process-download.php:978
9437
  msgid "File not found"
9438
  msgstr ""
9439
 
@@ -9685,19 +9913,19 @@ msgstr ""
9685
  msgid "Please wait &hellip;"
9686
  msgstr ""
9687
 
9688
- #: includes/scripts.php:248
9689
  msgid "Purchase Limit Settings"
9690
  msgstr ""
9691
 
9692
- #: includes/scripts.php:249
9693
  msgid "Simple Shipping Settings"
9694
  msgstr ""
9695
 
9696
- #: includes/scripts.php:250
9697
  msgid "Software Licensing Settings"
9698
  msgstr ""
9699
 
9700
- #: includes/scripts.php:251
9701
  msgid "Recurring Payments Settings"
9702
  msgstr ""
9703
 
@@ -10131,7 +10359,7 @@ msgstr ""
10131
  msgid "Number of items in cart"
10132
  msgstr ""
10133
 
10134
- #: tests/bootstrap.php:40
10135
  msgid "HTTP Requests disabled for unit tests"
10136
  msgstr ""
10137
 
@@ -10254,13 +10482,13 @@ msgctxt "Date one to date two"
10254
  msgid "to"
10255
  msgstr ""
10256
 
10257
- #: includes/admin/settings/register-settings.php:829
10258
  #: includes/template-functions.php:79
10259
  msgctxt "text shown on the Add to Cart Button when the product is already in the cart"
10260
  msgid "Checkout"
10261
  msgstr ""
10262
 
10263
- #: includes/admin/settings/register-settings.php:995
10264
  msgctxt ""
10265
  "payment status labels for the privacy export & erase settings: Pending "
10266
  "Payments"
@@ -10302,22 +10530,22 @@ msgctxt "no dropdown items"
10302
  msgid "None"
10303
  msgstr ""
10304
 
10305
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:415
10306
  msgctxt "Stripe Connect mode"
10307
  msgid "test"
10308
  msgstr ""
10309
 
10310
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:416
10311
  msgctxt "Stripe Connect mode"
10312
  msgid "live"
10313
  msgstr ""
10314
 
10315
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:667
10316
  msgctxt "gateway test mode status"
10317
  msgid "enabled"
10318
  msgstr ""
10319
 
10320
- #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:668
10321
  msgctxt "gateway test mode status"
10322
  msgid "disabled"
10323
  msgstr ""
2
  # This file is distributed under the same license as the Easy Digital Downloads package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Easy Digital Downloads 2.11.4\n"
6
  "Report-Msgid-Bugs-To: https://easydigitaldownloads.com/\n"
7
+ "POT-Creation-Date: 2021-12-27 18:55:49+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
24
  "X-Textdomain-Support: yes\n"
25
  "X-Generator: grunt-wp-i18n 1.0.3\n"
26
 
27
+ #: easy-digital-downloads.php:208 easy-digital-downloads.php:220
28
  msgid "Cheatin&#8217; huh?"
29
  msgstr ""
30
 
104
  #: includes/api/class-edd-api.php:1980 includes/api/class-edd-api.php:1985
105
  #: includes/api/class-edd-api.php:1997 includes/api/class-edd-api.php:1999
106
  #: includes/cart/class-edd-cart.php:1433 includes/cart/class-edd-cart.php:1447
107
+ #: includes/class-edd-license-handler.php:398
108
  #: includes/deprecated-functions.php:517 includes/deprecated-functions.php:532
109
+ #: includes/deprecated-functions.php:542 includes/download-functions.php:1275
110
  #: includes/emails/actions.php:53 includes/emails/template.php:243
111
  #: includes/error-tracking.php:60 includes/gateways/functions.php:243
112
  #: includes/gateways/manual.php:33
114
  #: includes/gateways/paypal/admin/connect.php:459
115
  #: includes/gateways/paypal/admin/connect.php:597
116
  #: includes/gateways/paypal-standard.php:172
117
+ #: includes/gateways/stripe/includes/admin/upgrade-functions.php:80
118
  #: includes/gateways/stripe/includes/payment-actions.php:1408
119
+ #: includes/process-download.php:303 includes/process-download.php:895
120
  #: includes/query-filters.php:48 includes/user-functions.php:895
121
  #: includes/user-functions.php:920 includes/user-functions.php:973
122
  msgid "Error"
213
  msgstr ""
214
 
215
  #: includes/admin/admin-pages.php:41
216
+ #: includes/admin/settings/display-settings.php:133
217
  msgid "Settings"
218
  msgstr ""
219
 
231
  msgstr ""
232
 
233
  #: includes/admin/admin-pages.php:43 includes/admin/plugins.php:57
234
+ #: includes/admin/settings/contextual-help.php:96
235
+ #: includes/admin/settings/register-settings.php:1367
236
  msgid "Extensions"
237
  msgstr ""
238
 
428
  msgstr ""
429
 
430
  #: includes/admin/class-edd-notices.php:225
431
+ msgid "Failed to send purchase receipt."
432
  msgstr ""
433
 
434
  #: includes/admin/class-edd-notices.php:228
435
+ msgid "The reports have been refreshed."
436
  msgstr ""
437
 
438
+ #: includes/admin/class-edd-notices.php:231
439
+ msgid "The payment note has been deleted."
440
  msgstr ""
441
 
442
  #: includes/admin/class-edd-notices.php:240
443
+ msgid "The settings have been imported."
444
  msgstr ""
445
 
446
  #: includes/admin/class-edd-notices.php:243
447
+ msgid "API keys successfully generated."
448
  msgstr ""
449
 
450
  #: includes/admin/class-edd-notices.php:246
451
+ msgid "The specified user already has API keys."
452
  msgstr ""
453
 
454
  #: includes/admin/class-edd-notices.php:249
455
+ msgid "API keys successfully regenerated."
456
  msgstr ""
457
 
458
  #: includes/admin/class-edd-notices.php:252
459
+ msgid "API keys successfully revoked."
460
  msgstr ""
461
 
462
  #: includes/admin/class-edd-notices.php:261
519
  #: includes/admin/discounts/class-discount-codes-table.php:267
520
  #: includes/admin/payments/class-payments-table.php:367
521
  #: includes/admin/payments/class-payments-table.php:435
522
+ #: includes/admin/settings/register-settings.php:958
523
  #: includes/gateways/stripe/includes/template-functions.php:441
524
  #: includes/payments/functions.php:1600
525
  msgid "Delete"
536
  #: includes/admin/downloads/dashboard-columns.php:31
537
  #: includes/admin/payments/view-order-details.php:693
538
  #: includes/admin/reporting/class-export-customers.php:74
539
+ #: includes/admin/reporting/export/class-batch-export-customers.php:43
540
  #: includes/admin/reporting/export/class-batch-export-downloads.php:43
541
  #: includes/privacy-functions.php:589 templates/shortcode-receipt.php:123
542
  msgid "Name"
556
  msgstr ""
557
 
558
  #: includes/admin/customers/class-customer-table.php:180
559
+ #: includes/admin/reporting/export/class-batch-export-customers.php:48
560
  #: includes/admin/reporting/export/class-batch-export-downloads.php:44
561
  #: includes/privacy-functions.php:593
562
  msgid "Date Created"
641
  #: includes/admin/import/import-functions.php:113
642
  #: includes/admin/reporting/export/export-actions.php:23
643
  #: includes/api/class-edd-api.php:1980
644
+ #: includes/class-edd-license-handler.php:398
645
  msgid "Nonce verification failed"
646
  msgstr ""
647
 
730
  msgstr ""
731
 
732
  #: includes/admin/customers/customers.php:269
733
+ #: includes/admin/settings/register-settings.php:2228
734
  #: includes/admin/tools.php:695 includes/checkout/template.php:435
735
  #: templates/shortcode-profile-editor.php:171
736
  msgid "State / Province"
754
  msgstr ""
755
 
756
  #: includes/admin/customers/customers.php:313
757
+ #: includes/admin/reporting/export/class-batch-export-customers.php:42
758
  #: includes/privacy-functions.php:867
759
  msgid "User ID"
760
  msgstr ""
778
  #: includes/admin/payments/view-order-details.php:684
779
  #: includes/admin/payments/view-order-details.php:704
780
  #: includes/admin/thickbox.php:136 includes/class-edd-html-elements.php:796
781
+ #: includes/gateways/stripe/includes/admin/admin-filters.php:109
782
  #: includes/gateways/stripe/includes/template-functions.php:597
783
  #: includes/gateways/stripe/includes/template-functions.php:637
784
  msgid "Cancel"
810
  #: includes/admin/reporting/class-export-customers.php:66
811
  #: includes/admin/reporting/class-export-customers.php:77
812
  #: includes/admin/reporting/class-export-payments.php:61
813
+ #: includes/admin/reporting/export/class-batch-export-customers.php:44
814
  #: includes/admin/reporting/export/class-batch-export-payments.php:41
815
  #: includes/admin/reporting/export/class-batch-export-sales.php:42
816
  #: includes/admin/tools.php:497 templates/shortcode-register.php:25
834
  msgstr ""
835
 
836
  #: includes/admin/customers/customers.php:406
837
+ #: includes/admin/downloads/metabox.php:439
838
+ #: includes/admin/downloads/metabox.php:645
839
+ #: includes/admin/downloads/metabox.php:701
840
+ #: includes/admin/downloads/metabox.php:826
841
  #: includes/admin/payments/view-order-details.php:523
842
+ #: includes/admin/settings/register-settings.php:2231 includes/scripts.php:227
843
  #: templates/checkout_cart.php:57 templates/checkout_cart.php:75
844
  #: templates/shortcode-profile-editor.php:123
845
  msgid "Remove"
929
  msgstr ""
930
 
931
  #: includes/admin/customers/customers.php:486
932
+ #: includes/admin/extensions/abstract-extension.php:308
933
+ #. translators: the plural Downloads label.
934
  msgid "View %s"
935
  msgstr ""
936
 
1028
  msgid "Easy Digital Downloads Sales Summary"
1029
  msgstr ""
1030
 
1031
+ #: includes/admin/dashboard-widgets.php:72
1032
  msgid "Current Month"
1033
  msgstr ""
1034
 
1035
+ #: includes/admin/dashboard-widgets.php:77
1036
+ #: includes/admin/dashboard-widgets.php:95
1037
+ #: includes/admin/dashboard-widgets.php:121
1038
  #: includes/admin/downloads/dashboard-columns.php:36
1039
  #: includes/admin/reporting/class-download-reports-table.php:110
1040
  #: includes/admin/reporting/export/class-batch-export-downloads.php:58
1044
  msgid "Earnings"
1045
  msgstr ""
1046
 
1047
+ #: includes/admin/dashboard-widgets.php:82
1048
+ #: includes/admin/dashboard-widgets.php:101
1049
  msgid "Sale"
1050
  msgid_plural "Sales"
1051
  msgstr[0] ""
1052
  msgstr[1] ""
1053
 
1054
+ #: includes/admin/dashboard-widgets.php:90
1055
  #: includes/admin/reporting/graphing.php:676 includes/class-edd-stats.php:84
1056
  msgid "Last Month"
1057
  msgstr ""
1058
 
1059
+ #: includes/admin/dashboard-widgets.php:115
1060
  #: includes/admin/reporting/graphing.php:670 includes/class-edd-stats.php:79
1061
  msgid "Today"
1062
  msgstr ""
1063
 
1064
+ #: includes/admin/dashboard-widgets.php:129
1065
  #: includes/admin/downloads/dashboard-columns.php:35
1066
  #: includes/admin/reporting/class-download-reports-table.php:109
1067
  #: includes/admin/reporting/export/class-batch-export-downloads.php:57
1071
  msgid "Sales"
1072
  msgstr ""
1073
 
1074
+ #: includes/admin/dashboard-widgets.php:143
1075
  msgid "Totals"
1076
  msgstr ""
1077
 
1078
+ #: includes/admin/dashboard-widgets.php:148
1079
  #: includes/admin/reporting/class-categories-reports-table.php:83
1080
  #: includes/admin/tools.php:914
1081
  msgid "Total Earnings"
1082
  msgstr ""
1083
 
1084
+ #: includes/admin/dashboard-widgets.php:152
1085
  #: includes/admin/reporting/class-categories-reports-table.php:82
1086
  #: includes/admin/reporting/class-gateways-reports-table.php:91
1087
  msgid "Total Sales"
1088
  msgstr ""
1089
 
1090
+ #: includes/admin/dashboard-widgets.php:174
1091
  msgid "Recent Purchases"
1092
  msgstr ""
1093
 
1094
+ #: includes/admin/dashboard-widgets.php:175
1095
  msgid "View All"
1096
  msgstr ""
1097
 
1327
  #: includes/admin/downloads/contextual-help.php:28
1328
  #: includes/admin/payments/contextual-help.php:29
1329
  #: includes/admin/reporting/contextual-help.php:29
1330
+ #: includes/admin/settings/contextual-help.php:32
1331
  msgid "For more information:"
1332
  msgstr ""
1333
 
1335
  #: includes/admin/downloads/contextual-help.php:29
1336
  #: includes/admin/payments/contextual-help.php:30
1337
  #: includes/admin/reporting/contextual-help.php:30
1338
+ #: includes/admin/settings/contextual-help.php:33
1339
  msgid ""
1340
  "Visit the <a href=\"%s\">documentation</a> on the Easy Digital Downloads "
1341
  "website."
1351
  msgstr ""
1352
 
1353
  #: includes/admin/discounts/contextual-help.php:35
1354
+ #: includes/admin/settings/contextual-help.php:42
1355
+ #: includes/admin/settings/register-settings.php:1360
1356
+ #: includes/admin/settings/register-settings.php:1420
1357
+ #: includes/admin/settings/register-settings.php:1425
1358
+ #: includes/admin/settings/register-settings.php:1428
1359
+ #: includes/admin/settings/register-settings.php:1431
1360
  #: includes/admin/settings/register-settings.php:1444
 
1361
  #: includes/admin/tools.php:68
1362
  msgid "General"
1363
  msgstr ""
1632
 
1633
  #: includes/admin/downloads/dashboard-columns.php:34
1634
  #: includes/admin/downloads/dashboard-columns.php:286
1635
+ #: includes/admin/downloads/metabox.php:459
1636
  #: includes/admin/payments/view-order-details.php:543
1637
  #: includes/admin/reporting/export/class-batch-export-downloads.php:51
1638
  #: templates/shortcode-receipt.php:130
1652
  msgid "%s Configuration"
1653
  msgstr ""
1654
 
1655
+ #: includes/admin/downloads/metabox.php:29
1656
  msgid "%1$s Prices"
1657
  msgstr ""
1658
 
1659
+ #: includes/admin/downloads/metabox.php:32
1660
  msgid "%1$s Files"
1661
  msgstr ""
1662
 
1663
+ #: includes/admin/downloads/metabox.php:35
1664
  msgid "%1$s Settings"
1665
  msgstr ""
1666
 
1667
+ #: includes/admin/downloads/metabox.php:38
1668
  msgid "%1$s Notes"
1669
  msgstr ""
1670
 
1671
+ #: includes/admin/downloads/metabox.php:42
1672
  msgid "%1$s Stats"
1673
  msgstr ""
1674
 
1675
+ #: includes/admin/downloads/metabox.php:301
 
 
 
 
 
 
 
 
1676
  msgid "Pricing Options:"
1677
  msgstr ""
1678
 
1679
+ #: includes/admin/downloads/metabox.php:307
1680
  msgid "Enable variable pricing"
1681
  msgstr ""
1682
 
1683
+ #: includes/admin/downloads/metabox.php:337
1684
  msgid ""
1685
  "Enable multi-option purchase mode. Allows multiple price options to be "
1686
  "added to your cart at once"
1687
  msgstr ""
1688
 
1689
+ #: includes/admin/downloads/metabox.php:366
1690
  msgid "Add New Price"
1691
  msgstr ""
1692
 
1693
+ #: includes/admin/downloads/metabox.php:429
1694
  msgid "Click and drag to re-order price options"
1695
  msgstr ""
1696
 
1697
+ #: includes/admin/downloads/metabox.php:430
1698
  msgid "Price ID: %s"
1699
  msgstr ""
1700
 
1701
+ #: includes/admin/downloads/metabox.php:436 includes/scripts.php:234
1702
  msgid "Show advanced settings"
1703
  msgstr ""
1704
 
1705
+ #: includes/admin/downloads/metabox.php:439
1706
  msgid "Remove price option %s"
1707
  msgstr ""
1708
 
1709
+ #: includes/admin/downloads/metabox.php:449
1710
+ #: includes/admin/downloads/metabox.php:453
1711
  msgid "Option Name"
1712
  msgstr ""
1713
 
1714
+ #: includes/admin/downloads/metabox.php:481 includes/download-functions.php:523
1715
  #: includes/gateways/stripe/includes/template-functions.php:404
1716
  msgid "Default"
1717
  msgstr ""
1718
 
1719
+ #: includes/admin/downloads/metabox.php:484
1720
  msgid "Set ID %s as default price"
1721
  msgstr ""
1722
 
1723
+ #: includes/admin/downloads/metabox.php:549
1724
  msgid "Product Type Options:"
1725
  msgstr ""
1726
 
1727
+ #: includes/admin/downloads/metabox.php:560
1728
  msgid "Select a product type"
1729
  msgstr ""
1730
 
1731
+ #: includes/admin/downloads/metabox.php:561
1732
  msgid ""
1733
  "<strong>Product Type</strong>: Sell this item as a single product, or use "
1734
  "the Bundle type to sell a collection of products."
1735
  msgstr ""
1736
 
1737
+ #: includes/admin/downloads/metabox.php:594
1738
  msgid "Bundled %s"
1739
  msgstr ""
1740
 
1741
+ #: includes/admin/downloads/metabox.php:602
1742
+ #: includes/admin/downloads/metabox.php:662
1743
  msgid "Click and drag to re-order bundled %s"
1744
  msgstr ""
1745
 
1746
+ #: includes/admin/downloads/metabox.php:606
1747
+ #: includes/admin/downloads/metabox.php:666
1748
  msgid "Select %s:"
1749
  msgstr ""
1750
 
1751
+ #: includes/admin/downloads/metabox.php:620
1752
+ #: includes/admin/downloads/metabox.php:679
1753
  msgid "Price assignment:"
1754
  msgstr ""
1755
 
1756
+ #: includes/admin/downloads/metabox.php:645
1757
  msgid "Remove bundle option %s"
1758
  msgstr ""
1759
 
1760
+ #: includes/admin/downloads/metabox.php:656
1761
  msgid "Bundled %s:"
1762
  msgstr ""
1763
 
1764
+ #: includes/admin/downloads/metabox.php:701
1765
  msgid "Remove bundle option 1"
1766
  msgstr ""
1767
 
1768
+ #: includes/admin/downloads/metabox.php:711
1769
+ #: includes/admin/downloads/metabox.php:779
1770
  msgid "Add New File"
1771
  msgstr ""
1772
 
1773
+ #: includes/admin/downloads/metabox.php:821
1774
  msgid "Click and drag to re-order files"
1775
  msgstr ""
1776
 
1777
+ #: includes/admin/downloads/metabox.php:822
1778
  msgid "%1$s file ID: %2$s"
1779
  msgstr ""
1780
 
1781
+ #: includes/admin/downloads/metabox.php:826
1782
  msgid "Remove file %s"
1783
  msgstr ""
1784
 
1785
+ #: includes/admin/downloads/metabox.php:834
1786
+ #: includes/admin/downloads/metabox.php:840
1787
  msgid "File Name"
1788
  msgstr ""
1789
 
1790
+ #: includes/admin/downloads/metabox.php:846
1791
  msgid "File URL"
1792
  msgstr ""
1793
 
1794
+ #: includes/admin/downloads/metabox.php:851
1795
  msgid "Upload or enter the file URL"
1796
  msgstr ""
1797
 
1798
+ #: includes/admin/downloads/metabox.php:856
1799
  msgid "Insert File"
1800
  msgstr ""
1801
 
1802
+ #: includes/admin/downloads/metabox.php:856
1803
  msgid "Insert"
1804
  msgstr ""
1805
 
1806
+ #: includes/admin/downloads/metabox.php:856
1807
  msgid "Upload a File"
1808
  msgstr ""
1809
 
1810
+ #: includes/admin/downloads/metabox.php:863
1811
  msgid "Price Assignment"
1812
  msgstr ""
1813
 
1814
+ #: includes/admin/downloads/metabox.php:863
1815
  msgid ""
1816
  "<strong>Price Assignment</strong>: With variable pricing enabled, you can "
1817
  "choose to allow certain price variations access to specific files, or allow "
1818
  "all price variations to access a file."
1819
  msgstr ""
1820
 
1821
+ #: includes/admin/downloads/metabox.php:908
1822
  msgid "Insert into %s"
1823
  msgstr ""
1824
 
1825
+ #: includes/admin/downloads/metabox.php:934
1826
  msgid "File Download Limit:"
1827
  msgstr ""
1828
 
1829
+ #: includes/admin/downloads/metabox.php:941
1830
  msgid "Leave blank for global setting or 0 for unlimited"
1831
  msgstr ""
1832
 
1833
+ #: includes/admin/downloads/metabox.php:943
1834
  msgid ""
1835
  "<strong>File Download Limit</strong>: Limit the number of times a customer "
1836
  "who purchased this product can access their download links."
1837
  msgstr ""
1838
 
1839
+ #: includes/admin/downloads/metabox.php:979
1840
  msgid "Ignore Tax:"
1841
  msgstr ""
1842
 
1843
+ #: includes/admin/downloads/metabox.php:985
1844
  msgid "Mark this product as exclusive of tax"
1845
  msgstr ""
1846
 
1847
+ #: includes/admin/downloads/metabox.php:1007
1848
  msgid "Item Quantities:"
1849
  msgstr ""
1850
 
1851
+ #: includes/admin/downloads/metabox.php:1013
1852
  msgid "Disable quantity input for this product"
1853
  msgstr ""
1854
 
1855
+ #: includes/admin/downloads/metabox.php:1015
1856
  msgid ""
1857
  "<strong>Item Quantities</strong>: if disabled, customers will not be "
1858
  "provided an option to change the number they wish to purchase."
1859
  msgstr ""
1860
 
1861
+ #: includes/admin/downloads/metabox.php:1034
1862
+ #: includes/admin/settings/register-settings.php:799
1863
  #: includes/admin/thickbox.php:59 includes/checkout/template.php:1005
1864
  #: includes/gateways/stripe/includes/payment-methods/buy-now/template.php:214
1865
  #: includes/shortcodes.php:49 includes/template-functions.php:78
1866
  msgid "Purchase"
1867
  msgstr ""
1868
 
1869
+ #: includes/admin/downloads/metabox.php:1041
1870
  msgid "Purchase Shortcode:"
1871
  msgstr ""
1872
 
1873
+ #: includes/admin/downloads/metabox.php:1042
1874
  msgid ""
1875
  "<strong>Purchase Shortcode</strong>: Use this shortcode to output a "
1876
  "purchase link for this product in the location of your choosing."
1877
  msgstr ""
1878
 
1879
+ #: includes/admin/downloads/metabox.php:1063
1880
  msgid "Accounting Options:"
1881
  msgstr ""
1882
 
1883
+ #: includes/admin/downloads/metabox.php:1071
1884
  msgid "Enter an SKU for this %s."
1885
  msgstr ""
1886
 
1887
+ #: includes/admin/downloads/metabox.php:1090
1888
  msgid "Button Options:"
1889
  msgstr ""
1890
 
1891
+ #: includes/admin/downloads/metabox.php:1097
1892
  msgid "Disable the automatic output of the purchase button"
1893
  msgstr ""
1894
 
1895
+ #: includes/admin/downloads/metabox.php:1098
1896
  msgid ""
1897
  "<strong>Automatic Output</strong>: By default, the purchase buttons will be "
1898
  "displayed at the bottom of the download, when disabled you will need to use "
1900
  "where you prefer."
1901
  msgstr ""
1902
 
1903
+ #: includes/admin/downloads/metabox.php:1108
1904
+ #: includes/admin/settings/register-settings.php:813
1905
  #: includes/admin/thickbox.php:101
1906
  msgid "Add to Cart"
1907
  msgstr ""
1908
 
1909
+ #: includes/admin/downloads/metabox.php:1109
1910
+ #: includes/admin/settings/register-settings.php:827
1911
  #: includes/gateways/stripe/includes/payment-methods/buy-now/template.php:47
1912
  #: includes/shortcodes.php:47 includes/template-functions.php:78
1913
  msgid "Buy Now"
1914
  msgstr ""
1915
 
1916
+ #: includes/admin/downloads/metabox.php:1122
1917
  msgid "Purchase button behavior"
1918
  msgstr ""
1919
 
1920
+ #: includes/admin/downloads/metabox.php:1124
1921
  msgid ""
1922
  "<strong>Button Behavior</strong>: Add to Cart buttons follow a traditional "
1923
  "eCommerce flow. A Buy Now button bypasses most of the process, taking the "
1925
  "process of buying the product."
1926
  msgstr ""
1927
 
1928
+ #: includes/admin/downloads/metabox.php:1126
1929
  msgid ""
1930
  "<strong>Button Behavior</strong>: Add to Cart buttons follow a traditional "
1931
  "eCommerce flow. Buy Now buttons are only available for stores that have a "
1932
  "single supported gateway active and that do not use taxes."
1933
  msgstr ""
1934
 
1935
+ #: includes/admin/downloads/metabox.php:1164
1936
  msgid ""
1937
  "Special notes or instructions for this product. These notes will be added "
1938
  "to the purchase receipt."
1939
  msgstr ""
1940
 
1941
+ #: includes/admin/downloads/metabox.php:1191
1942
  msgid "Sales:"
1943
  msgstr ""
1944
 
1945
+ #: includes/admin/downloads/metabox.php:1196
1946
  msgid "Earnings:"
1947
  msgstr ""
1948
 
1949
+ #: includes/admin/downloads/metabox.php:1203
1950
  msgid "View File Download Log"
1951
  msgstr ""
1952
 
1953
+ #: includes/admin/downloads/metabox.php:1230
1954
+ #. Translators: The %s represents the link to the pricing page on the Easy
1955
+ #. Digital Downloads website.
1956
+ msgid ""
1957
+ "Save 25&#37; on all Easy Digital Downloads purchases <strong>this "
1958
+ "week</strong>, including renewals and upgrades! Sale ends 23:59 PM December "
1959
+ "6th CST. <a target=\"_blank\" href=\"%s\">Don't miss out</a>!"
1960
  msgstr ""
1961
 
1962
+ #: includes/admin/extensions/abstract-extension.php:235
1963
+ #. translators: The extension name.
1964
+ msgid "Log In to Your Account to Download %s"
1965
+ msgstr ""
1966
+
1967
+ #: includes/admin/extensions/abstract-extension.php:243
1968
+ #. translators: The extension name.
1969
+ msgid "Upgrade Today to Access %s!"
1970
+ msgstr ""
1971
+
1972
+ #: includes/admin/extensions/abstract-extension.php:254
1973
+ #. translators: The extension name.
1974
+ msgid "Activate %s"
1975
+ msgstr ""
1976
+
1977
+ #: includes/admin/extensions/abstract-extension.php:320
1978
+ #. translators: The extension name.
1979
+ msgid "Configure %s"
1980
+ msgstr ""
1981
+
1982
+ #: includes/admin/extensions/class-extension-manager.php:60
1983
+ msgid "Activating"
1984
+ msgstr ""
1985
+
1986
+ #: includes/admin/extensions/class-extension-manager.php:61
1987
+ msgid "Installing"
1988
+ msgstr ""
1989
+
1990
+ #: includes/admin/extensions/class-extension-manager.php:62
1991
+ #: includes/admin/extensions/class-extension-manager.php:265
1992
  msgid ""
1993
+ "Could not install the plugin. Please download and install it manually via "
1994
+ "Plugins > Add New."
1995
  msgstr ""
1996
 
1997
+ #: includes/admin/extensions/class-extension-manager.php:65
1998
+ #: includes/admin/extensions/class-extension-manager.php:268
1999
+ #. translators: 1. opening anchor tag, do not translate; 2. closing anchor tag,
2000
+ #. do not translate
2001
  msgid ""
2002
+ "Could not install the extension. Please %1$sdownload it from your "
2003
+ "account%2$s and install it manually."
2004
  msgstr ""
2005
 
2006
+ #: includes/admin/extensions/class-extension-manager.php:248
2007
+ #: includes/admin/extensions/class-extension-manager.php:351
2008
+ msgid "There was an error while performing your request."
2009
+ msgstr ""
2010
+
2011
+ #: includes/admin/extensions/class-extension-manager.php:334
2012
+ msgid "Plugin installed."
2013
+ msgstr ""
2014
+
2015
+ #: includes/admin/extensions/class-extension-manager.php:334
2016
+ msgid "Extension installed."
2017
+ msgstr ""
2018
+
2019
+ #: includes/admin/extensions/class-extension-manager.php:357
2020
+ msgid "Plugin activation is not available for you on this site."
2021
+ msgstr ""
2022
+
2023
+ #: includes/admin/extensions/class-extension-manager.php:374
2024
+ #. translators: "extension" or "plugin" as defined by $type
2025
+ msgid "Could not activate the %s."
2026
+ msgstr ""
2027
+
2028
+ #: includes/admin/extensions/class-extension-manager.php:389
2029
+ msgid "Plugin activated."
2030
+ msgstr ""
2031
+
2032
+ #: includes/admin/extensions/class-extension-manager.php:389
2033
+ msgid "Extension activated."
2034
+ msgstr ""
2035
+
2036
+ #: includes/admin/extensions/class-extension-manager.php:391
2037
+ msgid "Plugin installed & activated."
2038
+ msgstr ""
2039
+
2040
+ #: includes/admin/extensions/class-extension-manager.php:391
2041
+ msgid "Extension installed & activated."
2042
+ msgstr ""
2043
+
2044
+ #: includes/admin/extensions/product-education/class-email-marketing.php:49
2045
+ msgid "Email Marketing"
2046
+ msgstr ""
2047
+
2048
+ #: includes/admin/extensions/product-education/class-email-marketing.php:65
2049
+ #. translators: the product name
2050
+ msgid "Get %s Today!"
2051
+ msgstr ""
2052
+
2053
+ #: includes/admin/extensions/product-education/class-email-marketing.php:83
2054
  msgid ""
2055
+ "Looks like you have an email marketing extension installed, but we support "
2056
+ "more providers!"
2057
+ msgstr ""
2058
+
2059
+ #: includes/admin/extensions/product-education/class-invoices.php:95
2060
+ msgid "Invoices"
2061
+ msgstr ""
2062
+
2063
+ #: includes/admin/extensions/product-education/class-recurring.php:95
2064
+ msgid "Recurring Payments"
2065
+ msgstr ""
2066
+
2067
+ #: includes/admin/extensions/product-education/class-reviews.php:100
2068
+ msgid "Reviews"
2069
+ msgstr ""
2070
+
2071
+ #: includes/admin/extensions/product-education/class-reviews.php:120
2072
+ msgid "Product Reviews"
2073
+ msgstr ""
2074
+
2075
+ #: includes/admin/extensions/product-education/class-wpsmtp.php:57
2076
+ msgid "Improve Email Deliverability"
2077
+ msgstr ""
2078
+
2079
+ #: includes/admin/extensions/product-education/class-wpsmtp.php:76
2080
+ msgid ""
2081
+ "WP Mail SMTP allows you to easily set up WordPress to use a trusted "
2082
+ "provider to reliably send emails, including sales notifications."
2083
+ msgstr ""
2084
+
2085
+ #: includes/admin/extensions/product-education/class-wpsmtp.php:108
2086
+ msgid "Install & Activate WP Mail SMTP"
2087
+ msgstr ""
2088
+
2089
+ #: includes/admin/extensions/product-education/class-wpsmtp.php:113
2090
+ msgid "Activate WP Mail SMTP"
2091
+ msgstr ""
2092
+
2093
+ #: includes/admin/extensions/product-education/class-wpsmtp.php:131
2094
+ msgid "Configure WP Mail SMTP"
2095
+ msgstr ""
2096
+
2097
+ #: includes/admin/extensions/product-education/class-wpsmtp.php:135
2098
+ msgid "Run the WP Mail SMTP Setup Wizard"
2099
  msgstr ""
2100
 
2101
  #: includes/admin/import/class-batch-import-downloads.php:65
2480
  msgstr[1] ""
2481
 
2482
  #: includes/admin/payments/view-order-details.php:152
2483
+ #: includes/admin/settings/register-settings.php:517
2484
  msgid "None"
2485
  msgstr ""
2486
 
2684
  msgid "General Settings"
2685
  msgstr ""
2686
 
2687
+ #: includes/admin/promos/class-promo-handler.php:112
2688
+ msgid "Missing notice ID."
2689
+ msgstr ""
2690
+
2691
+ #: includes/admin/promos/class-promo-handler.php:116
2692
+ #: includes/admin/promos/class-promo-handler.php:123
2693
+ #: includes/admin/promos/class-promo-handler.php:128
2694
  #: includes/gateways/paypal/admin/connect.php:106
2695
  #: includes/gateways/paypal/admin/connect.php:182
2696
  #: includes/gateways/paypal/admin/connect.php:292
2703
  msgid "You do not have permission to perform this action."
2704
  msgstr ""
2705
 
2706
+ #: includes/admin/promos/notices/abstract-notice.php:113
2707
+ msgid "Dismiss notice"
2708
  msgstr ""
2709
 
2710
+ #: includes/admin/promos/notices/class-five-star-review-dashboard.php:78
2711
+ msgid ""
2712
+ "Hey, I noticed you've made quite a few sales with Easy Digital Downloads! "
2713
+ "Are you enjoying Easy Digital Downloads?"
2714
+ msgstr ""
2715
+
2716
+ #: includes/admin/promos/notices/class-five-star-review-dashboard.php:80
2717
+ #: includes/gateways/stripe/includes/admin/admin-actions.php:146
2718
+ msgid "Yes"
2719
+ msgstr ""
2720
+
2721
+ #: includes/admin/promos/notices/class-five-star-review-dashboard.php:81
2722
+ msgid "Not Really"
2723
+ msgstr ""
2724
+
2725
+ #: includes/admin/promos/notices/class-five-star-review-dashboard.php:85
2726
+ msgid ""
2727
+ "We're sorry to hear you aren't enjoying Easy Digital Downloads. We would "
2728
+ "love a chance to improve. Could you take a minute and let us know what we "
2729
+ "can do better?"
2730
+ msgstr ""
2731
+
2732
+ #: includes/admin/promos/notices/class-five-star-review-dashboard.php:87
2733
+ msgid "Give Feedback"
2734
+ msgstr ""
2735
+
2736
+ #: includes/admin/promos/notices/class-five-star-review-dashboard.php:88
2737
+ #: includes/admin/promos/notices/class-five-star-review-dashboard.php:96
2738
+ msgid "No thanks"
2739
  msgstr ""
2740
 
2741
+ #: includes/admin/promos/notices/class-five-star-review-dashboard.php:92
2742
+ msgid ""
2743
+ "That's awesome! Could you please do me a BIG favor and give it a 5-star "
2744
+ "rating on WordPress to help us spread the word and boost our motivation?"
2745
+ msgstr ""
2746
+
2747
+ #: includes/admin/promos/notices/class-five-star-review-dashboard.php:93
2748
+ msgid "~ Chris Klosowski<br>President of Easy Digital Downloads"
2749
+ msgstr ""
2750
+
2751
+ #: includes/admin/promos/notices/class-five-star-review-dashboard.php:95
2752
+ msgid "Ok, you deserve it!"
2753
+ msgstr ""
2754
+
2755
+ #: includes/admin/promos/notices/class-license-upgrade-notice.php:151
2756
  #. Translators: %1$s opening anchor tag; %2$s closing anchor tag
2757
  msgid ""
2758
  "You are using the free version of Easy Digital Downloads. %1$sPurchase a "
2759
  "pass%2$s to get email marketing tools and recurring payments."
2760
  msgstr ""
2761
 
2762
+ #: includes/admin/promos/notices/class-license-upgrade-notice.php:161
2763
  #. Translators: %1$s opening anchor tag; %2$s closing anchor tag
2764
  msgid ""
2765
  "For access to additional Easy Digital Downloads extensions to grow your "
2766
  "store, consider %1$spurchasing a pass%2$s."
2767
  msgstr ""
2768
 
2769
+ #: includes/admin/promos/notices/class-license-upgrade-notice.php:171
2770
  #. Translators: %1$s opening anchor tag; %2$s closing anchor tag
2771
  msgid ""
2772
  "You are using Easy Digital Downloads with a Personal Pass. Consider "
2773
  "%1$supgrading%2$s to get recurring payments and more."
2774
  msgstr ""
2775
 
2776
+ #: includes/admin/promos/notices/class-license-upgrade-notice.php:181
2777
  #. Translators: %1$s opening anchor tag; %2$s closing anchor tag
2778
  msgid ""
2779
  "Grow your business and make more money with affiliate marketing. %1$sGet "
2947
 
2948
  #: includes/admin/reporting/class-export-payments.php:68
2949
  #: includes/admin/reporting/export/class-batch-export-payments.php:49
2950
+ #: includes/admin/settings/register-settings.php:2227
2951
  #: includes/admin/tools.php:713
2952
  #: includes/gateways/stripe/includes/template-functions.php:510
2953
  #: includes/gateways/stripe/includes/template-functions.php:519
3127
  msgid "API User"
3128
  msgstr ""
3129
 
3130
+ #: includes/admin/reporting/export/class-batch-export-customers.php:45
3131
  msgid "Number of Purchases"
3132
  msgstr ""
3133
 
3134
+ #: includes/admin/reporting/export/class-batch-export-customers.php:46
3135
  msgid "Customer Value"
3136
  msgstr ""
3137
 
3138
+ #: includes/admin/reporting/export/class-batch-export-customers.php:47
3139
+ msgid "Payment IDs"
3140
+ msgstr ""
3141
+
3142
  #: includes/admin/reporting/export/class-batch-export-downloads.php:42
3143
  msgid "Slug"
3144
  msgstr ""
3171
  msgstr ""
3172
 
3173
  #: includes/admin/reporting/export/class-batch-export-downloads.php:53
3174
+ #: includes/admin/settings/register-settings.php:851
3175
  #: includes/admin/tools.php:896
3176
  msgid "File Download Limit"
3177
  msgstr ""
3220
 
3221
  #: includes/admin/reporting/export/class-batch-export-payments.php:62
3222
  #: includes/admin/settings/register-settings.php:355
3223
+ #: includes/admin/settings/register-settings.php:1411
3224
  msgid "Currency"
3225
  msgstr ""
3226
 
3352
  msgstr ""
3353
 
3354
  #: includes/admin/reporting/logs.php:144
3355
+ #: includes/admin/settings/register-settings.php:1440
3356
  #: includes/privacy-functions.php:544
3357
  msgid "File Downloads"
3358
  msgstr ""
3378
  msgstr ""
3379
 
3380
  #: includes/admin/reporting/reports.php:59
3381
+ #: includes/admin/settings/contextual-help.php:80
3382
+ #: includes/admin/settings/register-settings.php:1365
3383
  msgid "Taxes"
3384
  msgstr ""
3385
 
3517
  msgid "Download a CSV of all sales."
3518
  msgstr ""
3519
 
3520
+ #: includes/admin/settings/contextual-help.php:35
3521
  msgid ""
3522
  "Need more from your Easy Digital Downloads store? <a href=\"%s\">Upgrade "
3523
  "Now!</a>."
3524
  msgstr ""
3525
 
3526
+ #: includes/admin/settings/contextual-help.php:43
3527
  msgid ""
3528
  "This screen provides the most basic settings for configuring your store. "
3529
+ "You can set the currency, page templates, and general store settings."
 
3530
  msgstr ""
3531
 
3532
+ #: includes/admin/settings/contextual-help.php:48
3533
+ #: includes/admin/settings/register-settings.php:1361
3534
+ msgid "Payments"
3535
  msgstr ""
3536
 
3537
+ #: includes/admin/settings/contextual-help.php:50
3538
  msgid ""
3539
+ "This screen provides ways to enable Test Mode, toggle payment gateways on "
3540
+ "or off, manage accounting settings, and configure gateway-specific "
3541
+ "settings. Any extra payment gateway extensions you have installed will "
3542
+ "appear on this page, and can be configured to suit your needs."
3543
  msgstr ""
3544
 
3545
+ #: includes/admin/settings/contextual-help.php:51
3546
  msgid ""
3547
  "<strong>Test Payment</strong> - This included gateway is great for testing "
3548
  "your store, as it requires no payment, and leads straight to product "
3549
  "downloads. However, please remember to turn it off once your site is live!"
3550
  msgstr ""
3551
 
3552
+ #: includes/admin/settings/contextual-help.php:52
3553
  msgid ""
3554
  "<strong>PayPal</strong> - A PayPal payment gateway is included as standard "
3555
  "with Easy Digital Downloads. To test the PayPal gateway, you need a Sandbox "
3556
  "account for PayPal and the site must be placed in Test Mode from the "
3557
+ "Payments > Gateways tab. Please remember to enter your PayPal account email "
3558
  "address in order for payments to get processed."
3559
  msgstr ""
3560
 
3561
+ #: includes/admin/settings/contextual-help.php:53
3562
+ msgid ""
3563
+ "<strong>Stripe</strong> - The Stripe payment gateway is also included with "
3564
+ "Easy Digital Downloads. To test the Stripe gateway, you must \"Connect with "
3565
+ "Stripe\" and the site must be placed in Test Mode from the Payments > "
3566
+ "Gateways tab."
3567
+ msgstr ""
3568
+
3569
+ #: includes/admin/settings/contextual-help.php:58
3570
+ #: includes/admin/settings/register-settings.php:1362
3571
  msgid "Emails"
3572
  msgstr ""
3573
 
3574
+ #: includes/admin/settings/contextual-help.php:60
3575
  msgid ""
3576
  "This screen allows you to customize how emails act throughout your store. "
3577
  "You can choose a premade template, set the sender's name, email address, "
3578
  "and subject."
3579
  msgstr ""
3580
 
3581
+ #: includes/admin/settings/contextual-help.php:61
3582
  msgid ""
3583
  "A set of email tags has also been provided to allow the creation of "
3584
  "personalized emails. A tag consists of a keyword surrounded by curly "
3586
  "below the editor."
3587
  msgstr ""
3588
 
3589
+ #: includes/admin/settings/contextual-help.php:66
3590
+ #: includes/admin/settings/register-settings.php:1363
3591
+ msgid "Marketing"
3592
+ msgstr ""
3593
+
3594
+ #: includes/admin/settings/contextual-help.php:68
3595
+ msgid "Marketing settings will help you connect with your customers."
3596
+ msgstr ""
3597
+
3598
+ #: includes/admin/settings/contextual-help.php:69
3599
+ msgid "Marketing specific extensions will add their settings here as well."
3600
+ msgstr ""
3601
+
3602
+ #: includes/admin/settings/contextual-help.php:74
3603
+ #: includes/admin/settings/register-settings.php:1364
3604
  msgid "Styles"
3605
  msgstr ""
3606
 
3607
+ #: includes/admin/settings/contextual-help.php:75
3608
  msgid ""
3609
  "This screen allows customization of your store's styles. For complete "
3610
  "control, you can completely disable all styles generated by the plugin."
3611
  msgstr ""
3612
 
3613
+ #: includes/admin/settings/contextual-help.php:82
3614
  msgid "This screen allows you to configure the tax rules for your store."
3615
  msgstr ""
3616
 
3617
+ #: includes/admin/settings/contextual-help.php:83
3618
  msgid ""
3619
  "If you do not wish to charge any tax on purchase, simply leave the Enable "
3620
  "Taxes option unchecked."
3621
  msgstr ""
3622
 
3623
+ #: includes/admin/settings/contextual-help.php:84
3624
  msgid ""
3625
  "<strong>Default Tax Rate</strong>: The default tax rate is the tax rate "
3626
  "charged to customers located in your base country / state or province."
3627
  msgstr ""
3628
 
3629
+ #: includes/admin/settings/contextual-help.php:85
3630
  msgid ""
3631
  "<strong>Base Country</strong>: This determines the country that is loaded "
3632
  "by default on the checkout screen for customers that do not have an address "
3633
  "stored in their account."
3634
  msgstr ""
3635
 
3636
+ #: includes/admin/settings/contextual-help.php:86
3637
  msgid ""
3638
  "<strong>Base State / Province</strong>: This determines the state / "
3639
  "province that is loaded by default on the checkout screen for customers "
3640
  "that do not have an address stored in their account."
3641
  msgstr ""
3642
 
3643
+ #: includes/admin/settings/contextual-help.php:87
3644
  msgid ""
3645
  "<strong>Prices Entered with Tax</strong>: if enabled, this means that the "
3646
  "price entered on the product edit screens is the total amount the customer "
3649
  "will be calculated automatically."
3650
  msgstr ""
3651
 
3652
+ #: includes/admin/settings/contextual-help.php:88
3653
  msgid ""
3654
  "<strong>Display Tax Rate on Prices</strong>: when enabled, the amount the "
3655
  "customer is expected to pay in tax will be displayed below purchase buttons."
3656
  msgstr ""
3657
 
3658
+ #: includes/admin/settings/contextual-help.php:89
3659
  msgid ""
3660
  "<strong>Display During Checkout</strong>: This determines whether prices "
3661
  "are shown with taxes or without taxes on checkout. If set to Including Tax, "
3662
  "a $10 product with a 10% tax will be shown as $11."
3663
  msgstr ""
3664
 
3665
+ #: includes/admin/settings/contextual-help.php:90
3666
  msgid ""
3667
  "<strong>Calculate Tax After Discounts</strong>: If enabled, this option "
3668
  "will make it so that tax is calculated on the after-discount amount. If a "
3670
  "calculated off of $16 instead of $20."
3671
  msgstr ""
3672
 
3673
+ #: includes/admin/settings/contextual-help.php:91
3674
  msgid ""
3675
  "<strong>Additional Tax Rates</strong>: This section lets you add tax rates "
3676
  "for specific countries and/or states/provinces in those countries."
3677
  msgstr ""
3678
 
3679
+ #: includes/admin/settings/contextual-help.php:97
3680
  msgid ""
3681
  "This screen provides access to settings added by most Easy Digital "
3682
  "Downloads extensions."
3683
  msgstr ""
3684
 
3685
+ #: includes/admin/settings/contextual-help.php:102
3686
+ #: includes/admin/settings/register-settings.php:1438
3687
  msgid "Miscellaneous"
3688
  msgstr ""
3689
 
3690
+ #: includes/admin/settings/contextual-help.php:104
3691
  msgid ""
3692
+ "This screen provides other miscellaneous options such as configuring your "
3693
+ "store buttons, file download functionality, and terms of service."
3694
  msgstr ""
3695
 
3696
+ #: includes/admin/settings/display-settings.php:45
3697
+ #. Translators: %1$s number of notifications; %2$s opening span tag; %3$s
3698
+ #. closing span tag
3699
+ msgid "%1$s %2$sunread notifications%3$s"
3700
  msgstr ""
3701
 
3702
+ #: includes/admin/settings/display-settings.php:263
3703
  msgid ""
3704
  "Save 25% on all Easy Digital Downloads purchases <strong>this "
3705
  "week</strong>, including renewals and upgrades!"
3706
  msgstr ""
3707
 
3708
+ #: includes/admin/settings/display-settings.php:266
3709
  msgid "Use code at checkout:"
3710
  msgstr ""
3711
 
3712
+ #: includes/admin/settings/display-settings.php:268
3713
  msgid ""
3714
  "Sale ends 23:59 PM December 6th CST. Save 25% on <a "
3715
  "href=\"https://sandhillsdev.com/projects/\" target=\"_blank\">our other "
3716
  "plugins</a>."
3717
  msgstr ""
3718
 
3719
+ #: includes/admin/settings/display-settings.php:271
3720
  msgid "Shop Now!"
3721
  msgstr ""
3722
 
3883
  msgstr ""
3884
 
3885
  #: includes/admin/settings/register-settings.php:391
3886
+ #: includes/admin/settings/register-settings.php:1412
3887
  msgid "API"
3888
  msgstr ""
3889
 
3925
  "are testing."
3926
  msgstr ""
3927
 
3928
+ #: includes/admin/settings/register-settings.php:423
3929
+ msgid "Payment Gateways"
3930
+ msgstr ""
3931
+
3932
  #: includes/admin/settings/register-settings.php:424
3933
  msgid "Choose the payment gateways you want to enable."
3934
  msgstr ""
4009
 
4010
  #: includes/admin/settings/register-settings.php:493
4011
  #: includes/admin/settings/register-settings.php:496
4012
+ msgid "Redirect to Checkout"
4013
  msgstr ""
4014
 
4015
  #: includes/admin/settings/register-settings.php:494
4016
+ msgid "Immediately redirect to checkout after adding an item to the cart?"
4017
  msgstr ""
4018
 
4019
  #: includes/admin/settings/register-settings.php:497
4020
  msgid ""
4021
+ "When enabled, once an item has been added to the cart, the customer will be "
4022
+ "redirected directly to your checkout page. This is useful for stores that "
4023
+ "sell single items."
4024
+ msgstr ""
4025
+
4026
+ #: includes/admin/settings/register-settings.php:501
4027
+ #: includes/admin/settings/register-settings.php:504
4028
+ msgid "Require Login"
4029
+ msgstr ""
4030
+
4031
+ #: includes/admin/settings/register-settings.php:502
4032
+ msgid "Require that users be logged-in to purchase files."
4033
+ msgstr ""
4034
+
4035
+ #: includes/admin/settings/register-settings.php:505
4036
+ msgid ""
4037
  "You can require that customers create and login to user accounts prior to "
4038
  "purchasing from your store by enabling this option. When unchecked, users "
4039
  "can purchase without being logged in by using their name and email address."
4040
  msgstr ""
4041
 
4042
+ #: includes/admin/settings/register-settings.php:509
4043
  msgid "Show Register / Login Form?"
4044
  msgstr ""
4045
 
4046
+ #: includes/admin/settings/register-settings.php:510
4047
  msgid ""
4048
  "Display the registration and login forms on the checkout page for "
4049
  "non-logged-in users."
4050
  msgstr ""
4051
 
4052
+ #: includes/admin/settings/register-settings.php:514
4053
  msgid "Registration and Login Forms"
4054
  msgstr ""
4055
 
4056
+ #: includes/admin/settings/register-settings.php:515
4057
  msgid "Registration Form Only"
4058
  msgstr ""
4059
 
4060
+ #: includes/admin/settings/register-settings.php:516
4061
  msgid "Login Form Only"
4062
  msgstr ""
4063
 
4064
+ #: includes/admin/settings/register-settings.php:522
 
 
 
 
 
 
 
 
4065
  msgid "Enable Cart Saving"
4066
  msgstr ""
4067
 
4068
+ #: includes/admin/settings/register-settings.php:523
4069
  msgid "Check this to enable cart saving on the checkout."
4070
  msgstr ""
4071
 
4072
+ #: includes/admin/settings/register-settings.php:525
4073
  msgid "Cart Saving"
4074
  msgstr ""
4075
 
4076
+ #: includes/admin/settings/register-settings.php:526
4077
  msgid ""
4078
  "Cart saving allows shoppers to create a temporary link to their current "
4079
  "shopping cart so they can come back to it later, or share it with someone."
4080
  msgstr ""
4081
 
4082
+ #: includes/admin/settings/register-settings.php:537
4083
  msgid "Email Configuration"
4084
  msgstr ""
4085
 
4086
+ #: includes/admin/settings/register-settings.php:542
4087
  msgid "Template"
4088
  msgstr ""
4089
 
4090
+ #: includes/admin/settings/register-settings.php:543
4091
  msgid ""
4092
  "Choose a template. Click \"Save Changes\" then \"Preview Purchase Receipt\" "
4093
  "to see the new template."
4094
  msgstr ""
4095
 
4096
+ #: includes/admin/settings/register-settings.php:549
4097
  msgid "Logo"
4098
  msgstr ""
4099
 
4100
+ #: includes/admin/settings/register-settings.php:550
4101
  msgid ""
4102
  "Upload or choose a logo to be displayed at the top of the purchase receipt "
4103
  "emails. Displayed on HTML emails only."
4104
  msgstr ""
4105
 
4106
+ #: includes/admin/settings/register-settings.php:555
4107
  msgid "From Name"
4108
  msgstr ""
4109
 
4110
+ #: includes/admin/settings/register-settings.php:556
4111
  msgid ""
4112
  "The name purchase receipts are said to come from. This should probably be "
4113
  "your site or shop name."
4114
  msgstr ""
4115
 
4116
+ #: includes/admin/settings/register-settings.php:562
4117
  msgid "From Email"
4118
  msgstr ""
4119
 
4120
+ #: includes/admin/settings/register-settings.php:563
4121
  msgid ""
4122
  "Email to send purchase receipts from. This will act as the \"from\" and "
4123
  "\"reply-to\" address."
4124
  msgstr ""
4125
 
4126
+ #: includes/admin/settings/register-settings.php:583
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4127
  msgid "Purchase Email Subject"
4128
  msgstr ""
4129
 
4130
+ #: includes/admin/settings/register-settings.php:584
4131
  msgid "Enter the subject line for the purchase receipt email."
4132
  msgstr ""
4133
 
4134
+ #: includes/admin/settings/register-settings.php:586
4135
+ #: includes/admin/settings/register-settings.php:593
4136
+ #: includes/admin/settings/register-settings.php:597
4137
  #: includes/emails/functions.php:45 includes/emails/functions.php:49
4138
+ #: includes/emails/functions.php:89 includes/emails/functions.php:93
4139
  #: includes/emails/template.php:141
4140
  msgid "Purchase Receipt"
4141
  msgstr ""
4142
 
4143
+ #: includes/admin/settings/register-settings.php:590
4144
  msgid "Purchase Email Heading"
4145
  msgstr ""
4146
 
4147
+ #: includes/admin/settings/register-settings.php:591
4148
  msgid "Enter the heading for the purchase receipt email."
4149
  msgstr ""
4150
 
4151
+ #: includes/admin/settings/register-settings.php:598
4152
  msgid ""
4153
  "Enter the text that is sent as purchase receipt email to users after "
4154
  "completion of a successful purchase. HTML is accepted. Available template "
4155
  "tags:"
4156
  msgstr ""
4157
 
4158
+ #: includes/admin/settings/register-settings.php:600
4159
  #: includes/emails/template.php:159
4160
  msgid "Dear"
4161
  msgstr ""
4162
 
4163
+ #: includes/admin/settings/register-settings.php:600
4164
  #: includes/emails/template.php:160
4165
  msgid ""
4166
  "Thank you for your purchase. Please click on the link(s) below to download "
4167
  "your files."
4168
  msgstr ""
4169
 
4170
+ #: includes/admin/settings/register-settings.php:606
4171
  msgid "Sale Notification Subject"
4172
  msgstr ""
4173
 
4174
+ #: includes/admin/settings/register-settings.php:607
4175
  msgid "Enter the subject line for the sale notification email."
4176
  msgstr ""
4177
 
4178
+ #: includes/admin/settings/register-settings.php:613
4179
  msgid "Sale Notification Heading"
4180
  msgstr ""
4181
 
4182
+ #: includes/admin/settings/register-settings.php:614
4183
  msgid "Enter the heading for the sale notification email."
4184
  msgstr ""
4185
 
4186
+ #: includes/admin/settings/register-settings.php:616
4187
+ #: includes/emails/functions.php:142
4188
  msgid "New Sale!"
4189
  msgstr ""
4190
 
4191
+ #: includes/admin/settings/register-settings.php:620
4192
  msgid "Sale Notification"
4193
  msgstr ""
4194
 
4195
+ #: includes/admin/settings/register-settings.php:621
4196
  msgid ""
4197
  "Enter the text that is sent as sale notification email after completion of "
4198
  "a purchase. HTML is accepted. Available template tags:"
4199
  msgstr ""
4200
 
4201
+ #: includes/admin/settings/register-settings.php:627
4202
  msgid "Sale Notification Emails"
4203
  msgstr ""
4204
 
4205
+ #: includes/admin/settings/register-settings.php:628
4206
  msgid ""
4207
  "Enter the email address(es) that should receive a notification anytime a "
4208
  "sale is made, one per line."
4209
  msgstr ""
4210
 
4211
+ #: includes/admin/settings/register-settings.php:634
4212
  msgid "Disable Admin Notifications"
4213
  msgstr ""
4214
 
4215
+ #: includes/admin/settings/register-settings.php:635
4216
  msgid "Check this box if you do not want to receive sales notification emails."
4217
  msgstr ""
4218
 
4219
+ #: includes/admin/settings/register-settings.php:647
4220
+ msgid "Abandoned Cart Recovery"
4221
+ msgstr ""
4222
+
4223
+ #: includes/admin/settings/register-settings.php:653
4224
+ msgid "Multiple Discounts"
4225
+ msgstr ""
4226
+
4227
+ #: includes/admin/settings/register-settings.php:654
4228
+ msgid "Allow customers to use multiple discounts on the same purchase?"
4229
+ msgstr ""
4230
+
4231
+ #: includes/admin/settings/register-settings.php:666
4232
  msgid "Disable Styles"
4233
  msgstr ""
4234
 
4235
+ #: includes/admin/settings/register-settings.php:667
4236
  msgid ""
4237
  "Check this to disable all included styling of buttons, checkout fields, and "
4238
  "all other elements."
4239
  msgstr ""
4240
 
4241
+ #: includes/admin/settings/register-settings.php:669
4242
  msgid "Disabling Styles"
4243
  msgstr ""
4244
 
4245
+ #: includes/admin/settings/register-settings.php:670
4246
  msgid ""
4247
  "If your theme has a complete custom CSS file for Easy Digital Downloads, "
4248
  "you may wish to disable our default styles. This is not recommended unless "
4249
  "you're sure your theme has a complete custom CSS."
4250
  msgstr ""
4251
 
4252
+ #: includes/admin/settings/register-settings.php:674
4253
  msgid "Buttons"
4254
  msgstr ""
4255
 
4256
+ #: includes/admin/settings/register-settings.php:675
4257
  msgid "Options for add to cart and purchase buttons"
4258
  msgstr ""
4259
 
4260
+ #: includes/admin/settings/register-settings.php:680
4261
  msgid "Default Button Style"
4262
  msgstr ""
4263
 
4264
+ #: includes/admin/settings/register-settings.php:681
4265
  msgid "Choose the style you want to use for the buttons."
4266
  msgstr ""
4267
 
4268
+ #: includes/admin/settings/register-settings.php:687
4269
  msgid "Default Button Color"
4270
  msgstr ""
4271
 
4272
+ #: includes/admin/settings/register-settings.php:688
4273
  msgid "Choose the color you want to use for the buttons."
4274
  msgstr ""
4275
 
4276
+ #: includes/admin/settings/register-settings.php:701
4277
  msgid "Need help?"
4278
  msgstr ""
4279
 
4280
+ #: includes/admin/settings/register-settings.php:702
4281
  msgid ""
4282
  "Visit the <a href=\"%s\" target=\"_blank\">Tax setup documentation</a> for "
4283
  "further information. If you need VAT support, there are options listed on "
4284
  "the documentation page."
4285
  msgstr ""
4286
 
4287
+ #: includes/admin/settings/register-settings.php:707
4288
  msgid "Enable Taxes"
4289
  msgstr ""
4290
 
4291
+ #: includes/admin/settings/register-settings.php:708
4292
  msgid "Check this to enable taxes on purchases."
4293
  msgstr ""
4294
 
4295
+ #: includes/admin/settings/register-settings.php:710
4296
  msgid "Enabling Taxes"
4297
  msgstr ""
4298
 
4299
+ #: includes/admin/settings/register-settings.php:711
4300
  msgid ""
4301
  "With taxes enabled, Easy Digital Downloads will use the rules below to "
4302
  "charge tax to customers. With taxes enabled, customers are required to "
4303
  "input their address on checkout so that taxes can be properly calculated."
4304
  msgstr ""
4305
 
4306
+ #: includes/admin/settings/register-settings.php:715
4307
  msgid "Tax Rates"
4308
  msgstr ""
4309
 
4310
+ #: includes/admin/settings/register-settings.php:716
4311
  msgid ""
4312
  "Add tax rates for specific regions. Enter a percentage, such as 6.5 for "
4313
  "6.5%."
4314
  msgstr ""
4315
 
4316
+ #: includes/admin/settings/register-settings.php:721
4317
+ #: includes/admin/settings/register-settings.php:725
4318
  msgid "Fallback Tax Rate"
4319
  msgstr ""
4320
 
4321
+ #: includes/admin/settings/register-settings.php:722
4322
  msgid ""
4323
  "Customers not in a specific rate will be charged this tax rate. Enter a "
4324
  "percentage, such as 6.5 for 6.5%. "
4325
  msgstr ""
4326
 
4327
+ #: includes/admin/settings/register-settings.php:726
4328
  msgid ""
4329
  "If the customer's address fails to meet the above tax rules, you can define "
4330
  "a `default` tax rate to be applied to all other customers. Enter a "
4331
  "percentage, such as 6.5 for 6.5%."
4332
  msgstr ""
4333
 
4334
+ #: includes/admin/settings/register-settings.php:730
4335
  msgid "Prices entered with tax"
4336
  msgstr ""
4337
 
4338
+ #: includes/admin/settings/register-settings.php:731
4339
  msgid "This option affects how you enter prices."
4340
  msgstr ""
4341
 
4342
+ #: includes/admin/settings/register-settings.php:735
4343
  msgid "Yes, I will enter prices inclusive of tax"
4344
  msgstr ""
4345
 
4346
+ #: includes/admin/settings/register-settings.php:736
4347
  msgid "No, I will enter prices exclusive of tax"
4348
  msgstr ""
4349
 
4350
+ #: includes/admin/settings/register-settings.php:738
4351
  msgid "Prices Inclusive of Tax"
4352
  msgstr ""
4353
 
4354
+ #: includes/admin/settings/register-settings.php:739
4355
  msgid ""
4356
  "When using prices inclusive of tax, you will be entering your prices as the "
4357
  "total amount you want a customer to pay for the download, including tax. "
4359
  "for the defined total price."
4360
  msgstr ""
4361
 
4362
+ #: includes/admin/settings/register-settings.php:743
4363
  msgid "Display Tax Rate on Prices"
4364
  msgstr ""
4365
 
4366
+ #: includes/admin/settings/register-settings.php:744
4367
  msgid "Some countries require a notice when product prices include tax."
4368
  msgstr ""
4369
 
4370
+ #: includes/admin/settings/register-settings.php:749
4371
  msgid "Display during checkout"
4372
  msgstr ""
4373
 
4374
+ #: includes/admin/settings/register-settings.php:750
4375
  msgid "Should prices on the checkout page be shown with or without tax?"
4376
  msgstr ""
4377
 
4378
+ #: includes/admin/settings/register-settings.php:754
4379
  msgid "Including tax"
4380
  msgstr ""
4381
 
4382
+ #: includes/admin/settings/register-settings.php:755
4383
  msgid "Excluding tax"
4384
  msgstr ""
4385
 
4386
+ #: includes/admin/settings/register-settings.php:757
4387
  msgid "Taxes Displayed for Products on Checkout"
4388
  msgstr ""
4389
 
4390
+ #: includes/admin/settings/register-settings.php:758
4391
  msgid ""
4392
  "This option will determine whether the product price displays with or "
4393
  "without tax on checkout."
4394
  msgstr ""
4395
 
4396
+ #: includes/admin/settings/register-settings.php:776
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4397
  msgid "Cart Item Quantities"
4398
  msgstr ""
4399
 
4400
+ #: includes/admin/settings/register-settings.php:777
4401
  msgid ""
4402
  "Allow quantities to be adjusted when adding %s to the cart, and while "
4403
  "viewing the checkout cart."
4404
  msgstr ""
4405
 
4406
+ #: includes/admin/settings/register-settings.php:782
4407
  msgid "Debug Mode"
4408
  msgstr ""
4409
 
4410
+ #: includes/admin/settings/register-settings.php:783
4411
  msgid ""
4412
  "Check this box to enable debug mode. When enabled, debug messages will be "
4413
  "logged and shown in Downloads &rarr; Tools &rarr; Debug Log."
4414
  msgstr ""
4415
 
4416
+ #: includes/admin/settings/register-settings.php:788
4417
  msgid "Remove Data on Uninstall?"
4418
  msgstr ""
4419
 
4420
+ #: includes/admin/settings/register-settings.php:789
4421
  msgid ""
4422
  "Check this box if you would like EDD to completely remove all of its data "
4423
  "when the plugin is deleted."
4424
  msgstr ""
4425
 
4426
+ #: includes/admin/settings/register-settings.php:796
4427
  msgid "Complete Purchase Text"
4428
  msgstr ""
4429
 
4430
+ #: includes/admin/settings/register-settings.php:797
4431
  msgid "The button label for completing a purchase."
4432
  msgstr ""
4433
 
4434
+ #: includes/admin/settings/register-settings.php:803
4435
  msgid "Complete Free Purchase Text"
4436
  msgstr ""
4437
 
4438
+ #: includes/admin/settings/register-settings.php:804
4439
  msgid "The button label for completing a free purchase."
4440
  msgstr ""
4441
 
4442
+ #: includes/admin/settings/register-settings.php:806
4443
  #: includes/checkout/template.php:1008
4444
  msgid "Free Download"
4445
  msgstr ""
4446
 
4447
+ #: includes/admin/settings/register-settings.php:810
4448
  msgid "Add to Cart Text"
4449
  msgstr ""
4450
 
4451
+ #: includes/admin/settings/register-settings.php:811
4452
  msgid "Text shown on the Add to Cart Buttons."
4453
  msgstr ""
4454
 
4455
+ #: includes/admin/settings/register-settings.php:817
4456
  msgid "Checkout Button Text"
4457
  msgstr ""
4458
 
4459
+ #: includes/admin/settings/register-settings.php:818
4460
  msgid ""
4461
  "Text shown on the Add to Cart Button when the product is already in the "
4462
  "cart."
4463
  msgstr ""
4464
 
4465
+ #: includes/admin/settings/register-settings.php:824
4466
  msgid "Buy Now Text"
4467
  msgstr ""
4468
 
4469
+ #: includes/admin/settings/register-settings.php:825
4470
  msgid "Text shown on the Buy Now Buttons."
4471
  msgstr ""
4472
 
4473
+ #: includes/admin/settings/register-settings.php:833
4474
+ #: includes/admin/settings/register-settings.php:836
4475
  msgid "Download Method"
4476
  msgstr ""
4477
 
4478
+ #: includes/admin/settings/register-settings.php:834
4479
  msgid "Select the file download method. Note, not all methods work on all servers."
4480
  msgstr ""
4481
 
4482
+ #: includes/admin/settings/register-settings.php:837
4483
  msgid ""
4484
  "Due to its consistency in multiple platforms and better file protection, "
4485
  "'forced' is the default method. Because Easy Digital Downloads uses PHP to "
4490
  "method can help resolve this."
4491
  msgstr ""
4492
 
4493
+ #: includes/admin/settings/register-settings.php:839
4494
  msgid "Forced"
4495
  msgstr ""
4496
 
4497
+ #: includes/admin/settings/register-settings.php:840
4498
  msgid "Redirect"
4499
  msgstr ""
4500
 
4501
+ #: includes/admin/settings/register-settings.php:845
4502
  msgid "Symlink File Downloads?"
4503
  msgstr ""
4504
 
4505
+ #: includes/admin/settings/register-settings.php:846
4506
  msgid ""
4507
  "Check this if you are delivering really large files or having problems with "
4508
  "file downloads completing."
4509
  msgstr ""
4510
 
4511
+ #: includes/admin/settings/register-settings.php:852
4512
  msgid ""
4513
  "The maximum number of times files can be downloaded for purchases. Can be "
4514
  "overwritten for each %s."
4515
  msgstr ""
4516
 
4517
+ #: includes/admin/settings/register-settings.php:855
4518
  msgid "File Download Limits"
4519
  msgstr ""
4520
 
4521
+ #: includes/admin/settings/register-settings.php:856
4522
  msgid ""
4523
  "Set the global default for the number of times a customer can download "
4524
  "items they purchase. Using a value of 0 is unlimited. This can be defined "
4526
  "individual purchase."
4527
  msgstr ""
4528
 
4529
+ #: includes/admin/settings/register-settings.php:860
4530
+ #: includes/admin/settings/register-settings.php:862
4531
  msgid "Download Link Expiration"
4532
  msgstr ""
4533
 
4534
+ #: includes/admin/settings/register-settings.php:861
4535
  msgid ""
4536
  "How long should download links be valid for? Default is 24 hours from the "
4537
  "time they are generated. Enter a time in hours."
4538
  msgstr ""
4539
 
4540
+ #: includes/admin/settings/register-settings.php:863
4541
  msgid ""
4542
  "When a customer receives a link to their downloads via email, in their "
4543
  "receipt, or in their purchase history, the link will only be valid for the "
4546
  "customer."
4547
  msgstr ""
4548
 
4549
+ #: includes/admin/settings/register-settings.php:871
4550
  msgid "Disable Redownload?"
4551
  msgstr ""
4552
 
4553
+ #: includes/admin/settings/register-settings.php:872
4554
  msgid ""
4555
  "Check this if you do not want to allow users to redownload items from their "
4556
  "purchase history."
4557
  msgstr ""
4558
 
4559
+ #: includes/admin/settings/register-settings.php:879
4560
  msgid "Agree to Terms"
4561
  msgstr ""
4562
 
4563
+ #: includes/admin/settings/register-settings.php:881
4564
  msgid ""
4565
  "Check this to show an agree to terms on checkout that users must agree to "
4566
  "before purchasing."
4567
  msgstr ""
4568
 
4569
+ #: includes/admin/settings/register-settings.php:884
4570
  msgid "Need help creating a Terms of Agreement? We recommend using %sTermageddon%s."
4571
  msgstr ""
4572
 
4573
+ #: includes/admin/settings/register-settings.php:893
4574
  msgid "Agree to Terms Label"
4575
  msgstr ""
4576
 
4577
+ #: includes/admin/settings/register-settings.php:894
4578
  msgid "Label shown next to the agree to terms checkbox."
4579
  msgstr ""
4580
 
4581
+ #: includes/admin/settings/register-settings.php:900
4582
  msgid "Agreement Text"
4583
  msgstr ""
4584
 
4585
+ #: includes/admin/settings/register-settings.php:901
4586
  msgid "If Agree to Terms is checked, enter the agreement terms here."
4587
  msgstr ""
4588
 
4589
+ #: includes/admin/settings/register-settings.php:912
4590
  msgid "Agree to Privacy Policy"
4591
  msgstr ""
4592
 
4593
+ #: includes/admin/settings/register-settings.php:913
4594
  msgid ""
4595
  "Check this to show an agree to Privacy Policy on checkout that users must "
4596
  "agree to before purchasing."
4597
  msgstr ""
4598
 
4599
+ #: includes/admin/settings/register-settings.php:918
4600
  msgid "Agree to Privacy Policy Label"
4601
  msgstr ""
4602
 
4603
+ #: includes/admin/settings/register-settings.php:919
4604
  msgid "Label shown next to the agree to Privacy Policy checkbox."
4605
  msgstr ""
4606
 
4607
+ #: includes/admin/settings/register-settings.php:925
4608
  msgid "Show the Privacy Policy on checkout"
4609
  msgstr ""
4610
 
4611
+ #: includes/admin/settings/register-settings.php:927
4612
  msgid "Display your Privacy Policy on checkout."
4613
  msgstr ""
4614
 
4615
+ #: includes/admin/settings/register-settings.php:927
4616
  msgid "Set your Privacy Policy here"
4617
  msgstr ""
4618
 
4619
+ #: includes/admin/settings/register-settings.php:928
4620
  msgid "Need help creating a Privacy Policy? We recommend %sTermageddon%s."
4621
  msgstr ""
4622
 
4623
+ #: includes/admin/settings/register-settings.php:941
4624
  msgid "Payment Status Actions"
4625
  msgstr ""
4626
 
4627
+ #: includes/admin/settings/register-settings.php:943
4628
  msgid ""
4629
  "When a user requests to be anonymized or removed from a site, these are the "
4630
  "actions that will be taken on payments associated with their customer, by "
4631
  "status."
4632
  msgstr ""
4633
 
4634
+ #: includes/admin/settings/register-settings.php:944
4635
  msgid "What settings should I use?"
4636
  msgstr ""
4637
 
4638
+ #: includes/admin/settings/register-settings.php:945
4639
  msgid ""
4640
  "By default, Easy Digital Downloads sets suggested actions based on the "
4641
  "Payment Status. These are purely recommendations, and you may need to "
4643
  "leave these settings as is."
4644
  msgstr ""
4645
 
4646
+ #: includes/admin/settings/register-settings.php:956
4647
  msgid "No Action"
4648
  msgstr ""
4649
 
4650
+ #: includes/admin/settings/register-settings.php:957
4651
  msgid "Anonymize"
4652
  msgstr ""
4653
 
4654
+ #: includes/admin/settings/register-settings.php:997
4655
  msgid "Buy Now Disabled"
4656
  msgstr ""
4657
 
4658
+ #: includes/admin/settings/register-settings.php:998
4659
  msgid ""
4660
  "Buy Now buttons are only available for stores that have a single supported "
4661
  "gateway active and that do not use taxes."
4662
  msgstr ""
4663
 
4664
+ #: includes/admin/settings/register-settings.php:1101
4665
  msgid "Settings updated."
4666
  msgstr ""
4667
 
4668
+ #: includes/admin/settings/register-settings.php:1254
4669
  msgid "Error setting default gateway. No gateways are enabled."
4670
  msgstr ""
4671
 
4672
+ #: includes/admin/settings/register-settings.php:1267
4673
  msgid "%s could not be set as the default gateway. It must first be enabled."
4674
  msgstr ""
4675
 
4676
+ #: includes/admin/settings/register-settings.php:1366
 
 
 
 
4677
  msgid "Privacy"
4678
  msgstr ""
4679
 
4680
+ #: includes/admin/settings/register-settings.php:1368
4681
  msgid "Licenses"
4682
  msgstr ""
4683
 
4684
+ #: includes/admin/settings/register-settings.php:1369
4685
  msgid "Misc"
4686
  msgstr ""
4687
 
4688
+ #: includes/admin/settings/register-settings.php:1410
4689
  msgid "Store"
4690
  msgstr ""
4691
 
4692
+ #: includes/admin/settings/register-settings.php:1415
4693
  msgid "Gateways"
4694
  msgstr ""
4695
 
4696
+ #: includes/admin/settings/register-settings.php:1416
4697
  #: includes/gateways/stripe/includes/payment-methods/payment-request/admin/settings.php:82
4698
  #: includes/install.php:98 templates/widget-cart-checkout.php:6
4699
  #: templates/widget-cart-empty.php:7
4700
  msgid "Checkout"
4701
  msgstr ""
4702
 
4703
+ #: includes/admin/settings/register-settings.php:1417
4704
  msgid "Accounting"
4705
  msgstr ""
4706
 
4707
+ #: includes/admin/settings/register-settings.php:1421
4708
  msgid "Purchase Receipts"
4709
  msgstr ""
4710
 
4711
+ #: includes/admin/settings/register-settings.php:1422
4712
  msgid "New Sale Notifications"
4713
  msgstr ""
4714
 
4715
+ #: includes/admin/settings/register-settings.php:1434
4716
  msgid "Main"
4717
  msgstr ""
4718
 
4719
+ #: includes/admin/settings/register-settings.php:1439
4720
  msgid "Button Text"
4721
  msgstr ""
4722
 
4723
+ #: includes/admin/settings/register-settings.php:1441
4724
  msgid "Terms of Agreement"
4725
  msgstr ""
4726
 
4727
+ #: includes/admin/settings/register-settings.php:1445
4728
  msgid "Export & Erase"
4729
  msgstr ""
4730
 
4731
+ #: includes/admin/settings/register-settings.php:1687
4732
  msgid ""
4733
  "Don't see what you need? More Payment Gateway options are available <a "
4734
  "href=\"%s\">here</a>."
4735
  msgstr ""
4736
 
4737
+ #: includes/admin/settings/register-settings.php:1908
4738
  msgid "The callback function used for the %s setting is missing."
4739
  msgstr ""
4740
 
4741
+ #: includes/admin/settings/register-settings.php:2070
4742
  msgid "Upload File"
4743
  msgstr ""
4744
 
4745
  #: includes/admin/settings/register-settings.php:2176
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4746
  msgid "Recapture plugin activated."
4747
  msgstr ""
4748
 
4749
+ #: includes/admin/settings/register-settings.php:2177
4750
  msgid "%sAccess your Recapture account%s."
4751
  msgstr ""
4752
 
4753
+ #: includes/admin/settings/register-settings.php:2182
4754
  msgid "Disconnect Recapture"
4755
  msgstr ""
4756
 
4757
+ #: includes/admin/settings/register-settings.php:2186
4758
  msgid "%sComplete your connection to Recapture%s"
4759
  msgstr ""
4760
 
4761
+ #: includes/admin/settings/register-settings.php:2194
4762
  msgid ""
4763
  "We recommend Recapture for recovering lost revenue by automatically sending "
4764
  "effective, targeted emails to customers who abandon their shopping cart."
4765
  msgstr ""
4766
 
4767
+ #: includes/admin/settings/register-settings.php:2194
4768
  msgid "%sLearn more%s (Free trial available)"
4769
  msgstr ""
4770
 
4771
+ #: includes/admin/settings/register-settings.php:2198
4772
  msgid "Connect with Recapture"
4773
  msgstr ""
4774
 
4775
+ #: includes/admin/settings/register-settings.php:2229
4776
  msgid "Country Wide"
4777
  msgstr ""
4778
 
4779
+ #: includes/admin/settings/register-settings.php:2230
4780
  msgid "Rate"
4781
  msgstr ""
4782
 
4783
+ #: includes/admin/settings/register-settings.php:2230
4784
  msgid ""
4785
  "<strong>Regional tax rates: </strong>When a customer enters an address on "
4786
  "checkout that matches the specified region for this tax rate, the cart tax "
4787
  "will adjust automatically. Enter a percentage, such as 6.5 for 6.5%."
4788
  msgstr ""
4789
 
4790
+ #: includes/admin/settings/register-settings.php:2247
4791
+ #: includes/admin/settings/register-settings.php:2295
4792
  msgid "Choose a country"
4793
  msgstr ""
4794
 
4795
+ #: includes/admin/settings/register-settings.php:2265
4796
  msgid "Choose a state"
4797
  msgstr ""
4798
 
4799
+ #: includes/admin/settings/register-settings.php:2277
4800
+ #: includes/admin/settings/register-settings.php:2308
4801
  msgid "Apply to whole country"
4802
  msgstr ""
4803
 
4804
+ #: includes/admin/settings/register-settings.php:2280
4805
+ #: includes/admin/settings/register-settings.php:2311
4806
  msgid "Remove Rate"
4807
  msgstr ""
4808
 
4809
+ #: includes/admin/settings/register-settings.php:2316
4810
  msgid "Add Tax Rate"
4811
  msgstr ""
4812
 
4813
+ #: includes/admin/settings/register-settings.php:2369
4814
  msgid ""
4815
  "Your license key expired on %s. Please <a href=\"%s\" "
4816
  "target=\"_blank\">renew your license key</a>."
4817
  msgstr ""
4818
 
4819
+ #: includes/admin/settings/register-settings.php:2382
4820
  msgid ""
4821
  "Your license key has been disabled. Please <a href=\"%s\" "
4822
  "target=\"_blank\">contact support</a> for more information."
4823
  msgstr ""
4824
 
4825
+ #: includes/admin/settings/register-settings.php:2394
4826
  msgid ""
4827
  "Invalid license. Please <a href=\"%s\" target=\"_blank\">visit your account "
4828
  "page</a> and verify it."
4829
  msgstr ""
4830
 
4831
+ #: includes/admin/settings/register-settings.php:2407
4832
  msgid ""
4833
  "Your %s is not active for this URL. Please <a href=\"%s\" "
4834
  "target=\"_blank\">visit your account page</a> to manage your license key "
4835
  "URLs."
4836
  msgstr ""
4837
 
4838
+ #: includes/admin/settings/register-settings.php:2419
4839
  msgid "This appears to be an invalid license key for %s."
4840
  msgstr ""
4841
 
4842
+ #: includes/admin/settings/register-settings.php:2428
4843
  msgid ""
4844
  "Your license key has reached its activation limit. <a href=\"%s\">View "
4845
  "possible upgrades</a> now."
4846
  msgstr ""
4847
 
4848
+ #: includes/admin/settings/register-settings.php:2437
4849
  msgid ""
4850
  "The key you entered belongs to a bundle, please use the product specific "
4851
  "license key."
4852
  msgstr ""
4853
 
4854
+ #: includes/admin/settings/register-settings.php:2445
4855
  msgid "unknown_error"
4856
  msgstr ""
4857
 
4858
+ #: includes/admin/settings/register-settings.php:2446
4859
  msgid ""
4860
  "There was an error with this license key: %s. Please <a href=\"%s\">contact "
4861
  "our support team</a>."
4862
  msgstr ""
4863
 
4864
+ #: includes/admin/settings/register-settings.php:2466
4865
  msgid "License key never expires."
4866
  msgstr ""
4867
 
4868
+ #: includes/admin/settings/register-settings.php:2473
4869
+ msgid "Your license key expires soon! It expires on %s."
 
 
4870
  msgstr ""
4871
 
4872
+ #: includes/admin/settings/register-settings.php:2482
4873
  msgid "Your license key expires on %s."
4874
  msgstr ""
4875
 
4876
+ #: includes/admin/settings/register-settings.php:2500
4877
  msgid "To receive updates, please enter your valid %s license key."
4878
  msgstr ""
4879
 
4880
+ #: includes/admin/settings/register-settings.php:2513
4881
  msgid "Deactivate License"
4882
  msgstr ""
4883
 
5435
  #: includes/admin/upgrades/upgrade-functions.php:899
5436
  #: includes/admin/upgrades/upgrade-functions.php:1027
5437
  #: includes/admin/upgrades/upgrade-functions.php:1112
5438
+ #: includes/gateways/stripe/includes/admin/upgrade-functions.php:80
5439
  msgid "You do not have permission to do shop upgrades"
5440
  msgstr ""
5441
 
5504
  msgid "Step %d of approximately %d running"
5505
  msgstr ""
5506
 
5507
+ #: includes/admin/views/notifications.php:35
5508
+ #. Translators: %s - number of notifications
5509
+ msgid "(%s) New Notifications"
5510
+ msgstr ""
5511
+
5512
+ #: includes/admin/views/notifications.php:49
5513
+ msgid "Close panel"
5514
+ msgstr ""
5515
+
5516
+ #: includes/admin/views/notifications.php:85
5517
+ msgid "Dismiss"
5518
+ msgstr ""
5519
+
5520
+ #: includes/admin/views/notifications.php:95
5521
+ msgid "You have no new notifications."
5522
+ msgstr ""
5523
+
5524
+ #: includes/admin/views/notifications.php:101
5525
+ msgid "Loading notifications..."
5526
+ msgstr ""
5527
+
5528
  #: includes/ajax-functions.php:143 includes/cart/actions.php:112
5529
  msgid ""
5530
  "Missing nonce when removing an item from the cart. Please read the "
5541
  "ajax-requests-in-easy-digital-downloads-2-9-4"
5542
  msgstr ""
5543
 
5544
+ #: includes/ajax-functions.php:485
5545
  msgid ""
5546
  "Missing nonce when recalculating taxes. Please read the following for more "
5547
  "information: "
5549
  "ajax-requests-in-easy-digital-downloads-2-9-4"
5550
  msgstr ""
5551
 
5552
+ #: includes/ajax-functions.php:535
5553
  msgid ""
5554
  "Missing nonce when retrieving state list. Please read the following for "
5555
  "more information: "
5557
  "ajax-requests-in-easy-digital-downloads-2-9-4"
5558
  msgstr ""
5559
 
5560
+ #: includes/ajax-functions.php:665 includes/ajax-functions.php:717
5561
  msgid "No results found"
5562
  msgstr ""
5563
 
5564
+ #: includes/ajax-functions.php:766 includes/ajax-functions.php:858
5565
  #: includes/class-edd-html-elements.php:339
5566
  msgid "No users found"
5567
  msgstr ""
5568
 
5569
+ #: includes/ajax-functions.php:808
5570
  msgid "All Prices"
5571
  msgstr ""
5572
 
5660
  msgid "You do not have permission to %s API keys for this user"
5661
  msgstr ""
5662
 
5663
+ #: includes/api/v3/Notifications.php:45
5664
+ msgid "ID of the notification."
5665
+ msgstr ""
5666
+
5667
+ #: includes/api/v3/Notifications.php:116
5668
+ msgid "Failed to dismiss notification."
5669
+ msgstr ""
5670
+
5671
  #: includes/cart/class-edd-cart.php:897
5672
  msgid "includes %s tax"
5673
  msgstr ""
6289
  msgid "Single Use: %s"
6290
  msgstr ""
6291
 
6292
+ #: includes/class-edd-cli.php:506 includes/class-edd-cli.php:765
6293
  msgid "No action specified, did you mean"
6294
  msgstr ""
6295
 
6296
+ #: includes/class-edd-cli.php:508 includes/class-edd-cli.php:767
6297
  msgid "Invalid action specified, did you mean"
6298
  msgstr ""
6299
 
6300
+ #: includes/class-edd-cli.php:570
6301
  msgid "Invalid status '%s', defaulting to 'complete'"
6302
  msgstr ""
6303
 
6304
+ #: includes/class-edd-cli.php:608
6305
  msgid "Specified ID is not a product"
6306
  msgstr ""
6307
 
6308
+ #: includes/class-edd-cli.php:743
6309
  msgid "Created %s payments"
6310
  msgstr ""
6311
 
6387
  msgid "Enter username"
6388
  msgstr ""
6389
 
6390
+ #: includes/class-edd-license-handler.php:201
6391
  msgid "%1$s"
6392
  msgstr ""
6393
 
6394
+ #: includes/class-edd-license-handler.php:233
6395
  msgid ""
6396
  "Enter your extension license keys here to receive updates for purchased "
6397
  "extensions. If your license key has expired, please <a href=\"%s\" "
6398
  "target=\"_blank\">renew your license</a>."
6399
  msgstr ""
6400
 
6401
+ #: includes/class-edd-license-handler.php:525
6402
  msgid ""
6403
  "You have invalid or expired license keys for Easy Digital Downloads. Please "
6404
  "go to the <a href=\"%s\">Licenses page</a> to correct this issue."
6405
  msgstr ""
6406
 
6407
+ #: includes/class-edd-license-handler.php:563
6408
  msgid "Enter valid license key for automatic updates."
6409
  msgstr ""
6410
 
6816
  "of a purchase. HTML is accepted. Available template tags:"
6817
  msgstr ""
6818
 
6819
+ #: includes/deprecated-functions.php:517 includes/process-download.php:895
6820
  msgid "Sorry but you have hit your download limit for this file."
6821
  msgstr ""
6822
 
6823
+ #: includes/deprecated-functions.php:532 includes/download-functions.php:1275
6824
  msgid "Sorry but your download link has expired."
6825
  msgstr ""
6826
 
6846
  msgstr ""
6847
 
6848
  #: includes/deprecated-functions.php:813 includes/deprecated-functions.php:892
6849
+ #: includes/deprecated-functions.php:921 includes/deprecated-functions.php:1067
6850
+ #: includes/deprecated-functions.php:1143 includes/emails/functions.php:296
6851
  msgid "You do not have permission to do this."
6852
  msgstr ""
6853
 
6863
  "free%4$s."
6864
  msgstr ""
6865
 
6866
+ #: includes/deprecated-functions.php:975 includes/emails/functions.php:388
6867
  #. Translators: %1$s - Opening anchor tag, %2$s - The url to dismiss the ajax
6868
  #. notice, %3$s - Complete the opening of the anchor tag, %4$s - Open span tag,
6869
  #. %4$s - Close span tag
6870
  msgid "%1$s %2$s %3$s %4$s Dismiss this notice. %5$s"
6871
  msgstr ""
6872
 
6873
+ #: includes/deprecated-functions.php:1012
6874
+ msgid "Access your SendWP account"
6875
+ msgstr ""
6876
+
6877
+ #: includes/deprecated-functions.php:1033
6878
+ msgid "SendWP plugin activated."
6879
+ msgstr ""
6880
+
6881
+ #: includes/deprecated-functions.php:1036
6882
+ msgid "Disconnect SendWP"
6883
+ msgstr ""
6884
+
6885
+ #: includes/deprecated-functions.php:1043
6886
+ msgid ""
6887
+ "We recommend SendWP to ensure quick and reliable delivery of all emails "
6888
+ "sent from your store, such as purchase receipts, subscription renewal "
6889
+ "reminders, password resets, and more."
6890
+ msgstr ""
6891
+
6892
+ #: includes/deprecated-functions.php:1043
6893
+ msgid "%sLearn more%s"
6894
+ msgstr ""
6895
+
6896
+ #: includes/deprecated-functions.php:1046
6897
+ msgid "Connect with SendWP"
6898
+ msgstr ""
6899
+
6900
+ #: includes/deprecated-functions.php:1118
6901
+ msgid "Something went wrong. SendWP was not installed correctly."
6902
+ msgstr ""
6903
+
6904
+ #: includes/deprecated-functions.php:1235
6905
+ msgid "Activate Reviews"
6906
+ msgstr ""
6907
+
6908
+ #: includes/deprecated-functions.php:1261
6909
+ #. Translators: The %s represents the link to the Product Reviews extension.
6910
+ msgid ""
6911
+ "Would you like to enable reviews for this product? Check out our <a "
6912
+ "target=\"_blank\" href=\"%s\">Product Reviews</a> extension."
6913
+ msgstr ""
6914
+
6915
+ #: includes/deprecated-functions.php:1269
6916
+ msgid ""
6917
+ "Act now and <strong>SAVE 25%</strong> on your purchase. Sale ends <em>23:59 "
6918
+ "PM December 6th CST</em>. Use code <code>BFCM2019</code> at checkout."
6919
+ msgstr ""
6920
+
6921
  #: includes/download-functions.php:524
6922
  msgid "Bundle"
6923
  msgstr ""
6957
  msgid "No template, plain text only"
6958
  msgstr ""
6959
 
6960
+ #: includes/emails/class-edd-emails.php:293
6961
  msgid "You cannot send email with EDD_Emails until init/admin_init has been reached"
6962
  msgstr ""
6963
 
6964
+ #: includes/emails/class-edd-emails.php:320
6965
  msgid ""
6966
  "Email from Easy Digital Downloads failed to send.\n"
6967
  "Send time: %s\n"
6970
  "\n"
6971
  msgstr ""
6972
 
6973
+ #: includes/emails/functions.php:138
6974
  msgid "New download purchase - Order #%1$s"
6975
  msgstr ""
6976
 
6977
+ #: includes/emails/functions.php:202 includes/emails/template.php:212
6978
  msgid "Hello"
6979
  msgstr ""
6980
 
6981
+ #: includes/emails/functions.php:202 includes/emails/template.php:212
6982
  msgid "A %s purchase has been made"
6983
  msgstr ""
6984
 
6985
+ #: includes/emails/functions.php:203 includes/emails/template.php:213
6986
  msgid "%s sold:"
6987
  msgstr ""
6988
 
6989
+ #: includes/emails/functions.php:205 includes/emails/template.php:215
6990
  msgid "Purchased by: "
6991
  msgstr ""
6992
 
6993
+ #: includes/emails/functions.php:206 includes/emails/template.php:216
6994
  msgid "Amount: "
6995
  msgstr ""
6996
 
6997
+ #: includes/emails/functions.php:207 includes/emails/template.php:217
6998
  msgid "Payment Method: "
6999
  msgstr ""
7000
 
7001
+ #: includes/emails/functions.php:208 includes/emails/template.php:218
7002
  msgid "Thank you"
7003
  msgstr ""
7004
 
7005
+ #: includes/emails/functions.php:347
 
 
 
 
7006
  msgid "Something went wrong. Recapture for EDD was not installed correctly."
7007
  msgstr ""
7008
 
7009
+ #: includes/emails/functions.php:375
7010
  #. Translators: %1$s - <strong> tag, %2$s - </strong> tag, %3$s - <a> tag, %4$s
7011
  #. - </a> tag
7012
  msgid ""
7256
  msgstr ""
7257
 
7258
  #: includes/gateways/paypal/admin/connect.php:80
7259
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:342
7260
  msgid "Retrieving account information..."
7261
  msgstr ""
7262
 
7911
  msgid "Preapproval cancelled"
7912
  msgstr ""
7913
 
7914
+ #: includes/gateways/stripe/includes/admin/admin-actions.php:84
7915
+ msgid "Are you sure you want to cancel this order?"
7916
+ msgstr ""
7917
+
7918
+ #: includes/gateways/stripe/includes/admin/admin-actions.php:103
7919
  msgid "The preapproved payment was successfully charged."
7920
  msgstr ""
7921
 
7922
+ #: includes/gateways/stripe/includes/admin/admin-actions.php:106
7923
  msgid ""
7924
  "The preapproved payment failed to be charged. View order details for "
7925
  "further details."
7926
  msgstr ""
7927
 
7928
+ #: includes/gateways/stripe/includes/admin/admin-actions.php:109
7929
  msgid "The preapproved payment was successfully cancelled."
7930
  msgstr ""
7931
 
7932
+ #: includes/gateways/stripe/includes/admin/admin-actions.php:114
7933
  #. translators: %1$s Stripe Connect error message. %2$s Retry URL.
7934
  msgid ""
7935
  "There was an error connecting your Stripe account. Message: %1$s. Please <a "
7936
  "href=\"%2$s\">try again</a>."
7937
  msgstr ""
7938
 
7939
+ #: includes/gateways/stripe/includes/admin/admin-actions.php:145
7940
  msgid "Used Existing Card:"
7941
  msgstr ""
7942
 
7943
+ #: includes/gateways/stripe/includes/admin/admin-actions.php:210
 
 
 
 
7944
  #: includes/gateways/stripe/includes/scripts.php:149
7945
  msgid "Refund Charge in Stripe"
7946
  msgstr ""
7947
 
7948
+ #: includes/gateways/stripe/includes/admin/admin-filters.php:99
7949
  msgid "Process"
7950
  msgstr ""
7951
 
8041
  msgstr ""
8042
 
8043
  #: includes/gateways/stripe/includes/admin/notices.php:39
8044
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:632
8045
  #: includes/gateways/stripe/includes/payment-methods/payment-request/apple-pay.php:22
8046
  msgid "Unable to locate registry"
8047
  msgstr ""
8050
  msgid "Stripe-specific reports have been removed."
8051
  msgstr ""
8052
 
8053
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:109
8054
  #. translators: %1$s Opening anchor tag, do not translate. %2$s Closing anchor
8055
  #. tag, do not translate.
8056
  msgid ""
8058
  "again%2$s. If you continue to have this problem, please contact support."
8059
  msgstr ""
8060
 
8061
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:295
8062
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:576
8063
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:638
8064
  msgid "Connect with Stripe"
8065
  msgstr ""
8066
 
8067
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:305
8068
  msgid ""
8069
  "Connect with Stripe for pay as you go pricing: 2% per-transaction fee + "
8070
  "Stripe fees."
8071
  msgstr ""
8072
 
8073
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:316
8074
  #. translators: %1$s Opening anchor tag, do not translate. %2$s Closing anchor
8075
  #. tag, do not translate.
8076
  msgid "Have questions about connecting with Stripe? See the %1$sdocumentation%2$s."
8077
  msgstr ""
8078
 
8079
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:355
8080
  msgid "Manage API keys manually"
8081
  msgstr ""
8082
 
8083
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:365
8084
  msgid "Hide API keys"
8085
  msgstr ""
8086
 
8087
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:371
8088
  msgid ""
8089
  "Although you can add your API keys manually, we recommend using Stripe "
8090
  "Connect: an easier and more secure way of connecting your Stripe account to "
8094
  "just a few clicks."
8095
  msgstr ""
8096
 
8097
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:389
8098
  msgid "Unable to retrieve account information."
8099
  msgstr ""
8100
 
8101
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:414
8102
  #. translators: %1$s Stripe payment mode. %2$s Opening anchor tag for
8103
  #. reconnecting to Stripe, do not translate. %3$s Opening anchor tag for
8104
  #. disconnecting Stripe, do not translate. %4$s Closing anchor tag, do not
8108
  "mode%4$s, or %3$sdisconnect this account%4$s."
8109
  msgstr ""
8110
 
8111
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:446
8112
  #. translators: %1$s Opening bold tag, do not translate. %2$s Closing bold tag,
8113
  #. do not translate.
8114
  msgid "Webhooks cannot be configured for recurring purchases with this account."
8115
  msgstr ""
8116
 
8117
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:464
8118
  #. translators: %1$s Opening anchor tag for disconnecting Stripe, do not
8119
  #. translate. %2$s Closing anchor tag, do not translate.
8120
  msgid "%1$sDisconnect this account%2$s."
8121
  msgstr ""
8122
 
8123
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:530
8124
  msgid "Pay as you go pricing: 2% per-transaction fee + Stripe fees."
8125
  msgstr ""
8126
 
8127
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:542
8128
  msgid "Administrator (Owner)"
8129
  msgstr ""
8130
 
8131
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:553
8132
  msgid ""
8133
  "The API keys provided do not match the Stripe Connect account associated "
8134
  "with this installation. If you have manually modified these values after "
8135
  "connecting your account, please reconnect below or update your API keys."
8136
  msgstr ""
8137
 
8138
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:579
8139
  msgid ""
8140
  "It is highly recommended to Connect with Stripe for easier setup and "
8141
  "improved security."
8142
  msgstr ""
8143
 
8144
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:592
8145
  #. translators: %1$s Stripe payment mode.
8146
  msgid "Your manually managed %1$s mode API keys are valid."
8147
  msgstr ""
8148
 
8149
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:608
8150
  #. translators: %1$s Stripe payment mode.
8151
  msgid "Your manually managed %1$s mode API keys are invalid."
8152
  msgstr ""
8153
 
8154
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:648
8155
  msgid ""
8156
  "Start accepting payments with Stripe by connecting your account. Stripe "
8157
  "Connect helps ensure easier setup and improved security."
8158
  msgstr ""
8159
 
8160
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:669
8161
  #. translators: %s Test mode status. Enabled or disabled.
8162
  msgid "\"Test Mode\" has been %s. Please verify your Stripe connection status."
8163
  msgstr ""
8361
  "recommendations%2$s."
8362
  msgstr ""
8363
 
8364
+ #: includes/gateways/stripe/includes/admin/upgrade-functions.php:55
8365
  #. translators: %s Upgrade link.
8366
  msgid ""
8367
  "Easy Digital Downloads - Stripe Gateway needs to upgrade the customers "
8370
  "this upgrade</a>"
8371
  msgstr ""
8372
 
8373
+ #: includes/gateways/stripe/includes/admin/upgrade-functions.php:58
8374
  msgid ""
8375
  "<strong>About this upgrade:</strong><br />This upgrade will improve the "
8376
  "reliability of associating purchase records with your existing customer "
8378
  "locally on their EDD customer record, instead of their user record."
8379
  msgstr ""
8380
 
8381
+ #: includes/gateways/stripe/includes/admin/upgrade-functions.php:60
8382
  msgid ""
8383
  "<strong>Advanced User?</strong><br />This upgrade can also be run via WPCLI "
8384
  "with the following command:<br /><code>wp edd-stripe "
8441
  msgid "Card successfully added."
8442
  msgstr ""
8443
 
8444
+ #: includes/gateways/stripe/includes/class-edd-stripe.php:252
8445
  #: includes/gateways/stripe/includes/template-functions.php:125
8446
  msgid "Credit Card"
8447
  msgstr ""
8955
  msgid "Passwords do not match"
8956
  msgstr ""
8957
 
8958
+ #: includes/misc-functions.php:317 tests/tests-misc.php:76
8959
  msgid "US Dollars (&#36;)"
8960
  msgstr ""
8961
 
8962
+ #: includes/misc-functions.php:318 tests/tests-misc.php:77
8963
  msgid "Euros (&euro;)"
8964
  msgstr ""
8965
 
8966
+ #: includes/misc-functions.php:319 tests/tests-misc.php:78
8967
  msgid "Pound Sterling (&pound;)"
8968
  msgstr ""
8969
 
8970
+ #: includes/misc-functions.php:320 tests/tests-misc.php:79
8971
  msgid "Australian Dollars (&#36;)"
8972
  msgstr ""
8973
 
8974
+ #: includes/misc-functions.php:321 tests/tests-misc.php:80
8975
  msgid "Brazilian Real (R&#36;)"
8976
  msgstr ""
8977
 
8978
+ #: includes/misc-functions.php:322 tests/tests-misc.php:81
8979
  msgid "Canadian Dollars (&#36;)"
8980
  msgstr ""
8981
 
8982
+ #: includes/misc-functions.php:323 tests/tests-misc.php:82
8983
  msgid "Czech Koruna"
8984
  msgstr ""
8985
 
8986
+ #: includes/misc-functions.php:324 tests/tests-misc.php:83
8987
  msgid "Danish Krone"
8988
  msgstr ""
8989
 
8990
+ #: includes/misc-functions.php:325 tests/tests-misc.php:84
8991
  msgid "Hong Kong Dollar (&#36;)"
8992
  msgstr ""
8993
 
8994
+ #: includes/misc-functions.php:326 tests/tests-misc.php:85
8995
  msgid "Hungarian Forint"
8996
  msgstr ""
8997
 
8998
+ #: includes/misc-functions.php:327 tests/tests-misc.php:86
8999
  msgid "Israeli Shekel (&#8362;)"
9000
  msgstr ""
9001
 
9002
+ #: includes/misc-functions.php:328 tests/tests-misc.php:87
9003
  msgid "Japanese Yen (&yen;)"
9004
  msgstr ""
9005
 
9006
+ #: includes/misc-functions.php:329 tests/tests-misc.php:88
9007
  msgid "Malaysian Ringgits"
9008
  msgstr ""
9009
 
9010
+ #: includes/misc-functions.php:330 tests/tests-misc.php:89
9011
  msgid "Mexican Peso (&#36;)"
9012
  msgstr ""
9013
 
9014
+ #: includes/misc-functions.php:331 tests/tests-misc.php:90
9015
  msgid "New Zealand Dollar (&#36;)"
9016
  msgstr ""
9017
 
9018
+ #: includes/misc-functions.php:332 tests/tests-misc.php:91
9019
  msgid "Norwegian Krone"
9020
  msgstr ""
9021
 
9022
+ #: includes/misc-functions.php:333 tests/tests-misc.php:92
9023
  msgid "Philippine Pesos"
9024
  msgstr ""
9025
 
9026
+ #: includes/misc-functions.php:334 tests/tests-misc.php:93
9027
  msgid "Polish Zloty"
9028
  msgstr ""
9029
 
9030
+ #: includes/misc-functions.php:335 tests/tests-misc.php:94
9031
  msgid "Singapore Dollar (&#36;)"
9032
  msgstr ""
9033
 
9034
+ #: includes/misc-functions.php:336 tests/tests-misc.php:95
9035
  msgid "Swedish Krona"
9036
  msgstr ""
9037
 
9038
+ #: includes/misc-functions.php:337 tests/tests-misc.php:96
9039
  msgid "Swiss Franc"
9040
  msgstr ""
9041
 
9042
+ #: includes/misc-functions.php:338 tests/tests-misc.php:97
9043
  msgid "Taiwan New Dollars"
9044
  msgstr ""
9045
 
9046
+ #: includes/misc-functions.php:339 tests/tests-misc.php:98
9047
  msgid "Thai Baht (&#3647;)"
9048
  msgstr ""
9049
 
9050
+ #: includes/misc-functions.php:340 tests/tests-misc.php:99
9051
  msgid "Indian Rupee (&#8377;)"
9052
  msgstr ""
9053
 
9054
+ #: includes/misc-functions.php:341 tests/tests-misc.php:100
9055
  msgid "Turkish Lira (&#8378;)"
9056
  msgstr ""
9057
 
9058
+ #: includes/misc-functions.php:342 tests/tests-misc.php:101
9059
  msgid "Iranian Rial (&#65020;)"
9060
  msgstr ""
9061
 
9062
+ #: includes/misc-functions.php:343 tests/tests-misc.php:102
9063
  msgid "Russian Rubles"
9064
  msgstr ""
9065
 
9066
+ #: includes/misc-functions.php:344 tests/tests-misc.php:103
9067
  msgid "Angolan Kwanza"
9068
  msgstr ""
9069
 
9070
+ #: includes/misc-functions.php:533
9071
  msgid ""
9072
  "%1$s is <strong>deprecated</strong> since Easy Digital Downloads version "
9073
  "%2$s! Use %3$s instead."
9074
  msgstr ""
9075
 
9076
+ #: includes/misc-functions.php:541
9077
  msgid ""
9078
  "%1$s is <strong>deprecated</strong> since Easy Digital Downloads version "
9079
  "%2$s with no alternative available."
9080
  msgstr ""
9081
 
9082
+ #: includes/misc-functions.php:582
9083
  msgid ""
9084
  "The %1$s argument of %2$s is <strong>deprecated</strong> since Easy Digital "
9085
  "Downloads version %3$s! Please use %4$s instead."
9086
  msgstr ""
9087
 
9088
+ #: includes/misc-functions.php:590
9089
  msgid ""
9090
  "The %1$s argument of %2$s is <strong>deprecated</strong> since Easy Digital "
9091
  "Downloads version %3$s with no alternative available."
9092
  msgstr ""
9093
 
9094
+ #: includes/models/Notification.php:187
9095
+ #. Translators: %s - a length of time (e.g. "1 second")
9096
+ msgid "%s ago"
9097
+ msgstr ""
9098
+
9099
  #: includes/payments/actions.php:187
9100
  msgid "After payment actions processed."
9101
  msgstr ""
9653
  msgid "Purchase Verification Failed"
9654
  msgstr ""
9655
 
9656
+ #: includes/process-download.php:971
9657
  msgid "Invalid file"
9658
  msgstr ""
9659
 
9660
+ #: includes/process-download.php:978
9661
  msgid "The requested file could not be found. Error 404."
9662
  msgstr ""
9663
 
9664
+ #: includes/process-download.php:979
9665
  msgid "File not found"
9666
  msgstr ""
9667
 
9913
  msgid "Please wait &hellip;"
9914
  msgstr ""
9915
 
9916
+ #: includes/scripts.php:256
9917
  msgid "Purchase Limit Settings"
9918
  msgstr ""
9919
 
9920
+ #: includes/scripts.php:257
9921
  msgid "Simple Shipping Settings"
9922
  msgstr ""
9923
 
9924
+ #: includes/scripts.php:258
9925
  msgid "Software Licensing Settings"
9926
  msgstr ""
9927
 
9928
+ #: includes/scripts.php:259
9929
  msgid "Recurring Payments Settings"
9930
  msgstr ""
9931
 
10359
  msgid "Number of items in cart"
10360
  msgstr ""
10361
 
10362
+ #: tests/bootstrap.php:42
10363
  msgid "HTTP Requests disabled for unit tests"
10364
  msgstr ""
10365
 
10482
  msgid "to"
10483
  msgstr ""
10484
 
10485
+ #: includes/admin/settings/register-settings.php:820
10486
  #: includes/template-functions.php:79
10487
  msgctxt "text shown on the Add to Cart Button when the product is already in the cart"
10488
  msgid "Checkout"
10489
  msgstr ""
10490
 
10491
+ #: includes/admin/settings/register-settings.php:986
10492
  msgctxt ""
10493
  "payment status labels for the privacy export & erase settings: Pending "
10494
  "Payments"
10530
  msgid "None"
10531
  msgstr ""
10532
 
10533
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:407
10534
  msgctxt "Stripe Connect mode"
10535
  msgid "test"
10536
  msgstr ""
10537
 
10538
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:408
10539
  msgctxt "Stripe Connect mode"
10540
  msgid "live"
10541
  msgstr ""
10542
 
10543
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:659
10544
  msgctxt "gateway test mode status"
10545
  msgid "enabled"
10546
  msgstr ""
10547
 
10548
+ #: includes/gateways/stripe/includes/admin/settings/stripe-connect.php:660
10549
  msgctxt "gateway test mode status"
10550
  msgid "disabled"
10551
  msgstr ""
readme.txt CHANGED
@@ -5,9 +5,9 @@ Contributors: easydigitaldownloads, mordauk, sunnyratilal, chriscct7, section214
5
  Donate link: https://easydigitaldownloads.com/donate/
6
  Tags: ecommerce, e-commerce, sell, digital store, stripe
7
  Requires at least: 4.4
8
- Tested up to: 5.8.1
9
- Requires PHP: 5.3
10
- Stable Tag: 2.11.3.1
11
  License: GNU Version 2 or Any Later Version
12
 
13
  Sell your digital products the simple way. Easily build an online store complete with a cart system, checkout forms, reports, coupons, and more!
@@ -122,10 +122,6 @@ The Easy Digital Downloads API makes it possible for developers to make customiz
122
 
123
  Easy Digital Downloads is backed by top-notch technical support from our globally distributed full-time support team. We also have an [extensive documentation site available](https://docs.easydigitaldownloads.com/?utm_medium=readme&utm_source=wporg&utm_campaign=lite-plugin&utm_content=docs&utm_term=description). If you’re looking for faster support via email, we encourage you to [purchase an Easy Digital Downloads pass](https://easydigitaldownloads.com/pricing/?utm_medium=readme&utm_source=wporg&utm_campaign=lite-plugin&utm_content=upgrade&utm_term=description) or premium extension.
124
 
125
- = Meet the team =
126
-
127
- Easy Digital Downloads is built by [Sandhills Development](https://sandhillsdev.com/?utm_medium=readme&utm_source=wporg&utm_campaign=edd-plugin&utm_content=sandhills&utm_term=description). We make [popular WordPress plugins](https://sandhillsdev.com/projects/?utm_medium=readme&utm_source=wporg&utm_campaign=edd-plugin&utm_content=popular&utm_term=description) used by hundreds of thousands of people just like you. [Get to know us here](https://sandhillsdev.com/about/?utm_medium=readme&utm_source=wporg&utm_campaign=edd-plugin&utm_content=about&utm_term=description)!
128
-
129
  > EDD has been a long standing, rock-solid e-commerce solution for WordPress. The team lives and breathes WordPress, understands the platform, and is embedded in the community.
130
 
131
  > Joe Casabona - Creator Courses
@@ -221,9 +217,9 @@ Yes! EDD integrates directly with several affiliate platforms that provide compl
221
  [Check out AffiliateWP](https://affiliatewp.com?utm_source=edd_readme&utm_medium=faq_tab&utm_content=home&utm_campaign=readme)
222
 
223
  = Can I give my customers downloadable PDF Invoices? =
224
- Yes, EDD has an extension that allows for downloadable invoices to be generated for each payment.
225
 
226
- [PDF Invoices](https://easydigitaldownloads.com/downloads/pdf-invoices/?utm_source=pdf-invoices&utm_medium=faq_tab&utm_content=pdf-invoices&utm_campaign=readme)
227
 
228
  = Are recurring payments supported? =
229
 
@@ -246,6 +242,34 @@ Yes, through the use of our commercial addon called [Recurring Payments](https:/
246
  13. Pay with PayPal modal
247
 
248
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
249
  = 2.11.3.1, November 1, 2021 =
250
  * Fix: Fatal error in PHP versions lower than 7.3.
251
 
5
  Donate link: https://easydigitaldownloads.com/donate/
6
  Tags: ecommerce, e-commerce, sell, digital store, stripe
7
  Requires at least: 4.4
8
+ Tested up to: 5.8
9
+ Requires PHP: 5.4
10
+ Stable Tag: 2.11.4
11
  License: GNU Version 2 or Any Later Version
12
 
13
  Sell your digital products the simple way. Easily build an online store complete with a cart system, checkout forms, reports, coupons, and more!
122
 
123
  Easy Digital Downloads is backed by top-notch technical support from our globally distributed full-time support team. We also have an [extensive documentation site available](https://docs.easydigitaldownloads.com/?utm_medium=readme&utm_source=wporg&utm_campaign=lite-plugin&utm_content=docs&utm_term=description). If you’re looking for faster support via email, we encourage you to [purchase an Easy Digital Downloads pass](https://easydigitaldownloads.com/pricing/?utm_medium=readme&utm_source=wporg&utm_campaign=lite-plugin&utm_content=upgrade&utm_term=description) or premium extension.
124
 
 
 
 
 
125
  > EDD has been a long standing, rock-solid e-commerce solution for WordPress. The team lives and breathes WordPress, understands the platform, and is embedded in the community.
126
 
127
  > Joe Casabona - Creator Courses
217
  [Check out AffiliateWP](https://affiliatewp.com?utm_source=edd_readme&utm_medium=faq_tab&utm_content=home&utm_campaign=readme)
218
 
219
  = Can I give my customers downloadable PDF Invoices? =
220
+ Yes, with the Invoices extension, you can provide beautiful and downloadable invoices to your customers.
221
 
222
+ [Invoices](https://easydigitaldownloads.com/downloads/edd-invoices/?utm_source=edd-invoices&utm_medium=faq_tab&utm_content=pdf-invoices&utm_campaign=readme)
223
 
224
  = Are recurring payments supported? =
225
 
242
  13. Pay with PayPal modal
243
 
244
  == Changelog ==
245
+
246
+ = 2.11.4, December 27, 2021 =
247
+ * New: Set minimum PHP version to 5.4 in readme.txt.
248
+ * New: Add notifications to EDD screens.
249
+ * New: Reorganize some settings locations to make them more predictable for users.
250
+ * New: Improve user opportunities to give feedback to the EDD team.
251
+ * New: Add support for webp images.
252
+ * Improvement: Add the `edd_ajax_remove_discount_response` filter inside the AJAX remove discount function.
253
+ * Improvement: If a license key has not been entered for a specific product, but it's covered by an existing pass key, use the pass key for updates.
254
+ * Improvement: Remove a confusing link for licenses near expiration date.
255
+ * Fix: In some cases, download links were unexpectedly not allowing users to download files.
256
+ * Fix: EDD Pass Manager was not saving the license key to the pass data during activation.
257
+ * Fix: Purchase receipt emails were always assumed to be successfully sent, even if they weren't.
258
+ * Fix: Variable prices were missing the index when a product was first saved.
259
+ * Fix: Exporting earnings results with an incorrect date range generated invalid data.
260
+ * Fix: A PHP notice was generated when an invalid license key was entered.
261
+ * Fix: PayPal Standard - Transaction links were not directing to the transation.
262
+ * Fix: The Arabic translation file caused a fatal error; it has been removed in deference to the repository translation.
263
+ * Fix: Improve earnings export performance.
264
+ * Dev: CLI - Prevent PHP error when a malformed payments command is used.
265
+ * Dev: Add helper methods the to the Pass Manager class.
266
+ * Dev: Create an option for the store activation date.
267
+ * Dev: Introduce the EDD extension registry for managing licensed extensions.
268
+ * Dev: Save EDD licensed products to options for improved reliability.
269
+ * Dev: Explicitly declare the `payment_stats` property for `EDD_Payment_Stats`.
270
+ * Dev: Improve performance of `edd_get_settings_tabs`.
271
+ * Dev: FILTER_SANITIZE_STRING is deprecated in PHP 8.1.
272
+
273
  = 2.11.3.1, November 1, 2021 =
274
  * Fix: Fatal error in PHP versions lower than 7.3.
275