Email Subscribers & Newsletters - Version 4.4.5

Version Description

Download this release

Release Info

Developer Icegram
Plugin Icon 128x128 Email Subscribers & Newsletters
Version 4.4.5
Comparing to
See all releases

Code changes from version 4.4.4 to 4.4.5

Files changed (29) hide show
  1. email-subscribers.php +3 -3
  2. lite/admin/css/email-subscribers-admin.css +5 -1
  3. lite/admin/dist/main.css +1 -1
  4. lite/admin/images/es-captcha-2.png +0 -0
  5. lite/admin/images/es-smtp-label.png +0 -0
  6. lite/admin/images/smtp.png +0 -0
  7. lite/admin/js/email-subscribers-admin.js +1 -1
  8. lite/includes/class-email-subscribers.php +1 -1
  9. lite/includes/class-es-common.php +37 -3
  10. lite/includes/classes/class-es-admin-settings.php +44 -29
  11. lite/includes/classes/class-es-contact-background-process.php +135 -50
  12. lite/includes/classes/class-es-contacts-table.php +11 -4
  13. lite/includes/classes/class-es-export-subscribers.php +81 -67
  14. lite/includes/classes/class-es-forms-table.php +9 -1
  15. lite/includes/classes/class-es-ig-redirect.php +5 -3
  16. lite/includes/classes/class-es-import-subscribers.php +87 -78
  17. lite/includes/classes/class-es-lists-table.php +54 -46
  18. lite/includes/classes/class-es-post-notifications.php +9 -1
  19. lite/includes/feedback/class-ig-feedback.php +4 -4
  20. lite/includes/feedback/class-ig-tracker.php +58 -4
  21. lite/includes/notices/views/ig-es-offer.php +1 -4
  22. lite/includes/pro-features.php +188 -21
  23. lite/includes/workflows/admin/views/meta-box-trigger.php +33 -30
  24. lite/includes/workflows/class-es-workflows-table.php +19 -20
  25. lite/includes/workflows/db/class-es-db-workflows.php +9 -9
  26. lite/includes/workflows/triggers/class-es-trigger-user-deleted.php +1 -1
  27. lite/includes/workflows/triggers/class-es-trigger-user-registered.php +1 -1
  28. lite/includes/workflows/triggers/class-es-trigger-user-updated.php +1 -1
  29. readme.txt +11 -1
email-subscribers.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Email Subscribers & Newsletters
4
  * Plugin URI: https://www.icegram.com/
5
  * Description: Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.
6
- * Version: 4.4.4
7
  * Author: Icegram
8
  * Author URI: https://www.icegram.com/
9
  * Requires at least: 3.9
@@ -67,7 +67,7 @@ if ( ! version_compare( PHP_VERSION, IG_ES_MIN_PHP_VER, '>=' ) ) {
67
  * @since 4.3.0
68
  */
69
  if ( ! defined( 'IG_ES_FEEDBACK_TRACKER_VERSION' ) ) {
70
- define( 'IG_ES_FEEDBACK_TRACKER_VERSION', '1.2.1' );
71
  }
72
 
73
 
@@ -156,7 +156,7 @@ if ( $is_premium ) {
156
  /* ***************************** Initial Compatibility Work (End) ******************* */
157
 
158
  if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
159
- define( 'ES_PLUGIN_VERSION', '4.4.4' );
160
  }
161
 
162
  // Plugin Folder Path.
3
  * Plugin Name: Email Subscribers & Newsletters
4
  * Plugin URI: https://www.icegram.com/
5
  * Description: Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.
6
+ * Version: 4.4.5
7
  * Author: Icegram
8
  * Author URI: https://www.icegram.com/
9
  * Requires at least: 3.9
67
  * @since 4.3.0
68
  */
69
  if ( ! defined( 'IG_ES_FEEDBACK_TRACKER_VERSION' ) ) {
70
+ define( 'IG_ES_FEEDBACK_TRACKER_VERSION', '1.2.2' );
71
  }
72
 
73
 
156
  /* ***************************** Initial Compatibility Work (End) ******************* */
157
 
158
  if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
159
+ define( 'ES_PLUGIN_VERSION', '4.4.5' );
160
  }
161
 
162
  // Plugin Folder Path.
lite/admin/css/email-subscribers-admin.css CHANGED
@@ -3,6 +3,10 @@
3
  color: #FFFFFF;
4
  }
5
 
 
 
 
 
6
  #email_tabs_form div#es-settings-tabs {
7
  margin-top: 20px;
8
  padding: 0;
@@ -1753,4 +1757,4 @@ body.email-subscribers_page_es_workflows #post-body .postbox .inside {
1753
  li.menu-top div.wp-menu-image img {
1754
  border-style: none !important;
1755
  display: inline;
1756
- }
3
  color: #FFFFFF;
4
  }
5
 
6
+ a:focus{
7
+ box-shadow: none;
8
+ }
9
+
10
  #email_tabs_form div#es-settings-tabs {
11
  margin-top: 20px;
12
  padding: 0;
1757
  li.menu-top div.wp-menu-image img {
1758
  border-style: none !important;
1759
  display: inline;
1760
+ }
lite/admin/dist/main.css CHANGED
@@ -1 +1 @@
1
- /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none;padding:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box;border:0 solid #d2d6dc}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a0aec0}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}a{color:#1c64f2}img{border-width:0}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.form-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-input::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-input::-moz-placeholder{color:#9fa6b2;opacity:1}.form-input::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-input::placeholder{color:#9fa6b2;opacity:1}.form-input:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-textarea::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-moz-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::placeholder{color:#9fa6b2;opacity:1}.form-textarea:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-multiselect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-multiselect:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;background-repeat:no-repeat;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem 2.5rem .5rem .75rem;font-size:1rem;line-height:1.5;background-position:right .5rem center;background-size:1.5em 1.5em}.form-select::-ms-expand{color:#9fa6b2;border:none}@media not print{.form-select::-ms-expand{display:none}}@media print and (-ms-high-contrast:active),print and (-ms-high-contrast:none){.form-select{padding-right:.75rem}}.form-select:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.25rem}.form-checkbox:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-checkbox::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-checkbox:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox:checked:focus{border-color:transparent}.form-radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;border-radius:100%;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px}.form-radio:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-radio::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-radio:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-radio:checked:focus{border-color:transparent}.ig-es-primary-button,.ig-es-send-queue-emails{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;padding:.5rem 1rem;background-color:#fff;font-size:.875rem;line-height:1.25rem;font-weight:500;color:#fff;background-color:#5850ec;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-title-button,.wp-heading-inline+.page-title-action{font-size:.875rem;border-radius:.375rem;border-width:1px;border-color:#5850ec;line-height:1.25rem;font-weight:500}.wp-heading-inline+.page-title-action{color:#1c64f2;padding:.5rem;margin-left:.5rem;margin-right:.5rem}.ig-es-title-button:hover,.wp-heading-inline+.page-title-action:hover{border-color:#6875f5;background-color:#f4f5f7}.ig-es-primary-button:hover{background-color:#6875f5;color:#fff}.ig-es-primary-button:focus,.ig-es-title-button:focus,.wp-heading-inline+.page-title-action:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.ig-es-imp-button{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important;border-radius:.375rem!important;border-width:1px!important;border-color:transparent!important;background-color:#fff!important;font-size:.875rem!important;line-height:1.25rem!important;font-weight:500!important;color:#fff!important;background-color:#0e9f6e!important;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform!important;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;-webkit-transition-duration:.15s!important;transition-duration:.15s!important}.ig-es-imp-button:hover{background-color:#31c48d!important;color:#fff!important}.ig-es-imp-button:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(132,225,188,.45)!important;box-shadow:0 0 0 3px rgba(132,225,188,.45)!important}.ig-es-link-button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;background-color:#fff;font-size:.875rem;line-height:1.25rem;font-weight:500;color:#fff;background-color:#ff5a1f;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-link-button:hover{background-color:#ff8a4c;color:#fff}.ig-es-link-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(253,186,140,.45);box-shadow:0 0 0 3px rgba(253,186,140,.45)}.ig-es-action.js-open .ig-es-action__header{background-color:#5850ec;color:#fff}.form-checkbox{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E")}.form-radio{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}.form-checkbox:checked,.form-radio:checked{color:#5850ec!important}.form-select{font-size:.875rem!important;border-color:#9fa6b2!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")!important}.form-select:focus,input[type=number]:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;border-color:#a4cafe!important}.es-check-toggle:checked~.es-mail-toggle-line{background-color:#5850ec}.es-check-toggle:checked~.es-mail-toggle-dot{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-translate-x:100%}[type=radio]:checked+.es-mailer-logo{-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-scale-x:1.1;--transform-scale-y:1.1;-webkit-box-shadow:0 0 3px 3px #5a67d8;box-shadow:0 0 3px 3px #5a67d8}.bg-white{background-color:#fff}.bg-gray-100{background-color:#f4f5f7}.bg-gray-200{background-color:#e5e7eb}.bg-gray-300{background-color:#d2d6dc}.bg-green-100{background-color:#def7ec}.bg-green-600{background-color:#057a55}.bg-indigo-500{background-color:#6875f5}.bg-indigo-600{background-color:#5850ec}.bg-indigo-800{background-color:#42389d}.hover\:bg-gray-50:hover{background-color:#f9fafb}.hover\:bg-gray-100:hover{background-color:#f4f5f7}.hover\:bg-green-500:hover{background-color:#0e9f6e}.hover\:bg-indigo-500:hover{background-color:#6875f5}.focus\:bg-gray-50:focus{background-color:#f9fafb}.focus\:bg-gray-100:focus{background-color:#f4f5f7}.border-collapse{border-collapse:collapse}.border-transparent{border-color:transparent}.border-gray-100{border-color:#f4f5f7}.border-gray-200{border-color:#e5e7eb}.border-gray-300{border-color:#d2d6dc}.border-gray-400{border-color:#9fa6b2}.border-indigo-600{border-color:#5850ec}.hover\:border-gray-200:hover{border-color:#e5e7eb}.hover\:border-indigo-500:hover{border-color:#6875f5}.focus\:border-blue-300:focus{border-color:#a4cafe}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-0{border-width:0}.border-2{border-width:2px}.border{border-width:1px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.grid{display:grid}.table{display:table}.table-cell{display:table-cell}.hidden{display:none}.flex-row{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.flex-col,.flex-row{-webkit-box-direction:normal}.flex-col{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.flex-1{-webkit-box-flex:1;-ms-flex:1 1 0%;flex:1 1 0%}.flex-auto{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.flex-shrink-0{-ms-flex-negative:0;flex-shrink:0}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.h-0{height:0}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-15{height:3.75rem}.h-20{height:5rem}.h-48{height:12rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.list-disc{list-style-type:disc}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-0{margin-top:0}.mb-0{margin-bottom:0}.mt-1{margin-top:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.mr-10{margin-right:2.5rem}.mt-12{margin-top:3rem}.ml-12{margin-left:3rem}.ml-16{margin-left:4rem}.mr-1\.5{margin-right:.375rem}.-mr-1{margin-right:-.25rem}.max-h-full{max-height:100%}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.opacity-0{opacity:0}.opacity-100{opacity:1}.focus\:outline-none:focus{outline:0}.overflow-hidden{overflow:hidden}.p-2{padding:.5rem}.p-3{padding:.75rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.pt-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.pt-2{padding-top:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-5{padding-left:1.25rem}.pt-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.pl-10{padding-left:2.5rem}.pr-12{padding-right:3rem}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-y-0{top:0;bottom:0}.right-0{right:0}.left-0{left:0}.shadow-xs{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.05);box-shadow:0 0 0 1px rgba(0,0,0,.05)}.shadow-sm{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05);box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow{-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-inner{-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.focus\:shadow-outline:focus{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}.focus\:shadow-outline-blue:focus{-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.text-left{text-align:left}.text-center{text-align:center}.text-white{color:#fff}.text-black{color:#000}.text-gray-400{color:#9fa6b2}.text-gray-500{color:#6b7280}.text-gray-600{color:#4b5563}.text-gray-700{color:#374151}.text-gray-800{color:#252f3f}.text-gray-900{color:#161e2e}.text-red-600{color:#e02424}.text-orange-400{color:#ff8a4c}.text-orange-500{color:#ff5a1f}.text-yellow-400{color:#e3a008}.text-green-400{color:#31c48d}.text-green-600{color:#057a55}.text-green-800{color:#03543f}.text-blue-500{color:#3f83f8}.text-blue-700{color:#1a56db}.text-indigo-100{color:#e5edff}.text-indigo-400{color:#8da2fb}.text-indigo-500{color:#6875f5}.text-indigo-600{color:#5850ec}.hover\:text-white:hover{color:#fff}.hover\:text-gray-800:hover{color:#252f3f}.hover\:text-gray-900:hover{color:#161e2e}.hover\:text-blue-700:hover{color:#1a56db}.focus\:text-white:focus{color:#fff}.active\:text-gray-900:active,.focus\:text-gray-900:focus{color:#161e2e}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.italic{font-style:italic}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.no-underline{text-decoration:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wider{letter-spacing:.05em}.align-middle{vertical-align:middle}.whitespace-no-wrap{white-space:nowrap}.w-0{width:0}.w-4{width:1rem}.w-5{width:1.25rem}.w-10{width:2.5rem}.w-40{width:10rem}.w-56{width:14rem}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-9\/12{width:75%}.w-11\/12{width:91.666667%}.w-full{width:100%}.z-20{z-index:20}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.origin-top-right{-webkit-transform-origin:top right;transform-origin:top right}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.transition-all{-webkit-transition-property:all;transition-property:all}.transition{-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform}.ease-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{-webkit-transition-duration:75ms;transition-duration:75ms}.duration-100{-webkit-transition-duration:.1s;transition-duration:.1s}.duration-150{-webkit-transition-duration:.15s;transition-duration:.15s}.duration-300{-webkit-transition-duration:.3s;transition-duration:.3s}@media (min-width:640px){.sm\:rounded-md{border-radius:.375rem}.sm\:grid{display:grid}.sm\:justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.sm\:leading-5{line-height:1.25rem}.sm\:leading-9{line-height:2.25rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-sm{font-size:.875rem}.sm\:text-2xl{font-size:1.5rem}.sm\:text-3xl{font-size:1.875rem}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.md\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.md\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.md\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.md\:justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.md\:justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:mt-0{margin-top:0}.md\:ml-4{margin-left:1rem}.md\:py-0{padding-top:0;padding-bottom:0}.md\:pb-2{padding-bottom:.5rem}.md\:pr-4{padding-right:1rem}.md\:pt-6{padding-top:1.5rem}.md\:text-base{font-size:1rem}}@media (min-width:1024px){.lg\:bg-transparent{background-color:transparent}.lg\:border-transparent{border-color:transparent}.lg\:rounded-full{border-radius:9999px}.lg\:block{display:block}.lg\:inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.lg\:grid{display:grid}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pt-2{padding-top:.5rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:shadow-none{-webkit-box-shadow:none;box-shadow:none}.lg\:text-sm{font-size:.875rem}.lg\:text-lg{font-size:1.125rem}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1280px){.xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.xl\:pb-4{padding-bottom:1rem}}
1
+ /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none;padding:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box;border:0 solid #d2d6dc}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a0aec0}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}a{color:#1c64f2}img{border-width:0}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.form-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-input::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-input::-moz-placeholder{color:#9fa6b2;opacity:1}.form-input::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-input::placeholder{color:#9fa6b2;opacity:1}.form-input:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-textarea::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-moz-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::placeholder{color:#9fa6b2;opacity:1}.form-textarea:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-multiselect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-multiselect:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;background-repeat:no-repeat;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem 2.5rem .5rem .75rem;font-size:1rem;line-height:1.5;background-position:right .5rem center;background-size:1.5em 1.5em}.form-select::-ms-expand{color:#9fa6b2;border:none}@media not print{.form-select::-ms-expand{display:none}}@media print and (-ms-high-contrast:active),print and (-ms-high-contrast:none){.form-select{padding-right:.75rem}}.form-select:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.25rem}.form-checkbox:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-checkbox::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-checkbox:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox:checked:focus{border-color:transparent}.form-radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;border-radius:100%;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px}.form-radio:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-radio::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-radio:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-radio:checked:focus{border-color:transparent}.ig-es-primary-button,.ig-es-send-queue-emails{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;padding:.5rem 1rem;background-color:#fff;font-size:.875rem;line-height:1.25rem;font-weight:500;color:#fff;background-color:#5850ec;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-title-button,.wp-heading-inline+.page-title-action{font-size:.875rem;border-radius:.375rem;border-width:1px;border-color:#5850ec;line-height:1.25rem;font-weight:500}.wp-heading-inline+.page-title-action{color:#1c64f2;padding:.5rem;margin-left:.5rem;margin-right:.5rem}.ig-es-title-button:hover,.wp-heading-inline+.page-title-action:hover{border-color:#6875f5;background-color:#f4f5f7}.ig-es-primary-button:hover{background-color:#6875f5;color:#fff}.ig-es-primary-button:focus,.ig-es-title-button:focus,.wp-heading-inline+.page-title-action:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.ig-es-imp-button{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important;border-radius:.375rem!important;border-width:1px!important;border-color:transparent!important;background-color:#fff!important;font-size:.875rem!important;line-height:1.25rem!important;font-weight:500!important;color:#fff!important;background-color:#0e9f6e!important;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform!important;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;-webkit-transition-duration:.15s!important;transition-duration:.15s!important}.ig-es-imp-button:hover{background-color:#31c48d!important;color:#fff!important}.ig-es-imp-button:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(132,225,188,.45)!important;box-shadow:0 0 0 3px rgba(132,225,188,.45)!important}.ig-es-link-button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;background-color:#fff;font-size:.875rem;line-height:1.25rem;font-weight:500;color:#fff;background-color:#ff5a1f;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-link-button:hover{background-color:#ff8a4c;color:#fff}.ig-es-link-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(253,186,140,.45);box-shadow:0 0 0 3px rgba(253,186,140,.45)}.ig-es-action.js-open .ig-es-action__header{background-color:#5850ec;color:#fff}.form-checkbox{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E")}.form-radio{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}.form-checkbox:checked,.form-radio:checked{color:#5850ec!important}.form-select{font-size:.875rem!important;border-color:#9fa6b2!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")!important}.form-select:focus,input[type=number]:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;border-color:#a4cafe!important}.es-check-toggle:checked~.es-mail-toggle-line{background-color:#5850ec}.es-check-toggle:checked~.es-mail-toggle-dot{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-translate-x:100%}[type=radio]:checked+.es-mailer-logo{-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-scale-x:1.1;--transform-scale-y:1.1;-webkit-box-shadow:0 0 3px 3px #5a67d8;box-shadow:0 0 3px 3px #5a67d8}.bg-white{background-color:#fff}.bg-gray-100{background-color:#f4f5f7}.bg-gray-200{background-color:#e5e7eb}.bg-gray-300{background-color:#d2d6dc}.bg-green-100{background-color:#def7ec}.bg-green-600{background-color:#057a55}.bg-indigo-500{background-color:#6875f5}.bg-indigo-600{background-color:#5850ec}.bg-indigo-800{background-color:#42389d}.hover\:bg-gray-50:hover{background-color:#f9fafb}.hover\:bg-gray-100:hover{background-color:#f4f5f7}.hover\:bg-green-500:hover{background-color:#0e9f6e}.hover\:bg-indigo-500:hover{background-color:#6875f5}.focus\:bg-gray-50:focus{background-color:#f9fafb}.focus\:bg-gray-100:focus{background-color:#f4f5f7}.border-collapse{border-collapse:collapse}.border-transparent{border-color:transparent}.border-gray-100{border-color:#f4f5f7}.border-gray-200{border-color:#e5e7eb}.border-gray-300{border-color:#d2d6dc}.border-gray-400{border-color:#9fa6b2}.border-indigo-600{border-color:#5850ec}.hover\:border-gray-200:hover{border-color:#e5e7eb}.hover\:border-indigo-500:hover{border-color:#6875f5}.focus\:border-blue-300:focus{border-color:#a4cafe}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-0{border-width:0}.border-2{border-width:2px}.border{border-width:1px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.grid{display:grid}.table{display:table}.table-cell{display:table-cell}.hidden{display:none}.flex-row{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.flex-col,.flex-row{-webkit-box-direction:normal}.flex-col{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.flex-1{-webkit-box-flex:1;-ms-flex:1 1 0%;flex:1 1 0%}.flex-auto{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.flex-shrink-0{-ms-flex-negative:0;flex-shrink:0}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.h-0{height:0}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-15{height:3.75rem}.h-20{height:5rem}.h-48{height:12rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.list-disc{list-style-type:disc}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-0{margin-top:0}.mb-0{margin-bottom:0}.mt-1{margin-top:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.mr-10{margin-right:2.5rem}.mt-12{margin-top:3rem}.ml-12{margin-left:3rem}.ml-16{margin-left:4rem}.mr-1\.5{margin-right:.375rem}.-mr-1{margin-right:-.25rem}.max-h-full{max-height:100%}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.opacity-0{opacity:0}.opacity-100{opacity:1}.focus\:outline-none:focus{outline:0}.overflow-hidden{overflow:hidden}.p-2{padding:.5rem}.p-3{padding:.75rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.pt-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.pt-2{padding-top:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-5{padding-left:1.25rem}.pt-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.pl-10{padding-left:2.5rem}.pr-12{padding-right:3rem}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-y-0{top:0;bottom:0}.right-0{right:0}.left-0{left:0}.shadow-xs{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.05);box-shadow:0 0 0 1px rgba(0,0,0,.05)}.shadow-sm{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05);box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow{-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-inner{-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.hover\:shadow-md:hover{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.focus\:shadow-outline:focus{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}.focus\:shadow-outline-blue:focus{-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.focus\:shadow-outline-indigo:focus{-webkit-box-shadow:0 0 0 3px rgba(180,198,252,.45);box-shadow:0 0 0 3px rgba(180,198,252,.45)}.text-left{text-align:left}.text-center{text-align:center}.text-white{color:#fff}.text-black{color:#000}.text-gray-400{color:#9fa6b2}.text-gray-500{color:#6b7280}.text-gray-600{color:#4b5563}.text-gray-700{color:#374151}.text-gray-800{color:#252f3f}.text-gray-900{color:#161e2e}.text-red-600{color:#e02424}.text-orange-400{color:#ff8a4c}.text-orange-500{color:#ff5a1f}.text-yellow-400{color:#e3a008}.text-green-400{color:#31c48d}.text-green-600{color:#057a55}.text-green-800{color:#03543f}.text-blue-500{color:#3f83f8}.text-blue-700{color:#1a56db}.text-indigo-100{color:#e5edff}.text-indigo-400{color:#8da2fb}.text-indigo-500{color:#6875f5}.text-indigo-600{color:#5850ec}.hover\:text-white:hover{color:#fff}.hover\:text-gray-800:hover{color:#252f3f}.hover\:text-gray-900:hover{color:#161e2e}.hover\:text-blue-700:hover{color:#1a56db}.hover\:text-indigo-500:hover{color:#6875f5}.focus\:text-white:focus{color:#fff}.active\:text-gray-900:active,.focus\:text-gray-900:focus{color:#161e2e}.active\:text-indigo-600:active{color:#5850ec}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.italic{font-style:italic}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.no-underline{text-decoration:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wider{letter-spacing:.05em}.align-middle{vertical-align:middle}.whitespace-no-wrap{white-space:nowrap}.w-0{width:0}.w-4{width:1rem}.w-5{width:1.25rem}.w-8{width:2rem}.w-10{width:2.5rem}.w-40{width:10rem}.w-56{width:14rem}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-9\/12{width:75%}.w-11\/12{width:91.666667%}.w-full{width:100%}.z-20{z-index:20}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.origin-top-right{-webkit-transform-origin:top right;transform-origin:top right}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.transition-all{-webkit-transition-property:all;transition-property:all}.transition{-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform}.ease-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{-webkit-transition-duration:75ms;transition-duration:75ms}.duration-100{-webkit-transition-duration:.1s;transition-duration:.1s}.duration-150{-webkit-transition-duration:.15s;transition-duration:.15s}.duration-300{-webkit-transition-duration:.3s;transition-duration:.3s}@media (min-width:640px){.sm\:rounded-md{border-radius:.375rem}.sm\:grid{display:grid}.sm\:justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.sm\:leading-5{line-height:1.25rem}.sm\:leading-9{line-height:2.25rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-sm{font-size:.875rem}.sm\:text-2xl{font-size:1.5rem}.sm\:text-3xl{font-size:1.875rem}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.md\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.md\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.md\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.md\:justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.md\:justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:mt-0{margin-top:0}.md\:ml-4{margin-left:1rem}.md\:py-0{padding-top:0;padding-bottom:0}.md\:pb-2{padding-bottom:.5rem}.md\:pr-4{padding-right:1rem}.md\:pt-6{padding-top:1.5rem}.md\:text-base{font-size:1rem}}@media (min-width:1024px){.lg\:bg-transparent{background-color:transparent}.lg\:border-transparent{border-color:transparent}.lg\:rounded-full{border-radius:9999px}.lg\:block{display:block}.lg\:inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.lg\:grid{display:grid}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pt-2{padding-top:.5rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:shadow-none{-webkit-box-shadow:none;box-shadow:none}.lg\:text-sm{font-size:.875rem}.lg\:text-lg{font-size:1.125rem}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1280px){.xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.xl\:pb-4{padding-bottom:1rem}}
lite/admin/images/es-captcha-2.png DELETED
Binary file
lite/admin/images/es-smtp-label.png DELETED
Binary file
lite/admin/images/smtp.png ADDED
Binary file
lite/admin/js/email-subscribers-admin.js CHANGED
@@ -24,7 +24,7 @@
24
  $(this).addClass('text-white').removeClass('text-gray-700').parent('li').addClass('bg-indigo-600').siblings().find('a').addClass('text-gray-700').removeClass('text-white').parent('li').removeClass('bg-indigo-600');
25
  $('.setting-content').hide();
26
  var target = $(this).attr('href');
27
- $('.setting-content' + target).toggle();
28
  return false;
29
  });
30
 
24
  $(this).addClass('text-white').removeClass('text-gray-700').parent('li').addClass('bg-indigo-600').siblings().find('a').addClass('text-gray-700').removeClass('text-white').parent('li').removeClass('bg-indigo-600');
25
  $('.setting-content').hide();
26
  var target = $(this).attr('href');
27
+ $('.setting-content' + target).show();
28
  return false;
29
  });
30
 
lite/includes/class-email-subscribers.php CHANGED
@@ -897,7 +897,7 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
897
  * @since 4.4.4
898
  */
899
  public function is_premium() {
900
- return ES()->is_pro() || ES()->is_starter();
901
  }
902
 
903
  /**
897
  * @since 4.4.4
898
  */
899
  public function is_premium() {
900
+ return ES()->is_starter() || ES()->is_pro();
901
  }
902
 
903
  /**
lite/includes/class-es-common.php CHANGED
@@ -3,7 +3,7 @@
3
  // Exit if accessed directly
4
  if ( ! defined( 'ABSPATH' ) ) {
5
  exit;
6
- }
7
 
8
  /**
9
  * Class Email_General.
@@ -339,7 +339,8 @@ Class ES_Common {
339
  $category_names = array();
340
  }
341
  $checked_selected = ! in_array( 'All', $category_names ) ? "checked='checked'" : '';
342
- $category_html = '<tr><td style="padding-top:4px;padding-bottom:4px;padding-right:10px;" ><span class="block ml-6 pr-4 text-sm font-normal text-gray-600 pb-1"><input class="es-note-category-parent form-radio text-indigo-600" type="radio" ' . $checked_selected . ' value="selected_cat" name="es_note_cat_parent">' . __( 'Select Categories', 'email-subscribers' ) . '</td></tr>';
 
343
  foreach ( $categories as $category ) {
344
 
345
  if ( in_array( $category->term_id, $category_names ) ) {
@@ -351,7 +352,8 @@ Class ES_Common {
351
  $category_html .= '<tr class="es-note-child-category"><td style="padding-top:4px;padding-bottom:4px;padding-right:10px;"><span class="block ml-6 pr-4 text-sm font-normal text-gray-600 pb-1"><input type="checkbox" class="form-checkbox" ' . $checked . ' value="' . $category->term_id . '" id="es_note_cat[]" name="es_note_cat[]">' . $category->name . '</td></tr>';
352
  }
353
  $checked_all = in_array( 'All', $category_names ) ? "checked='checked'" : '';
354
- $all_html = '<tr><td style="padding-top:4px;padding-bottom:4px;padding-right:10px;"><span class="block ml-6 pr-4 text-sm font-normal text-gray-600 pb-1"><input type="radio" class="form-radio text-indigo-600 es-note-category-parent" ' . $checked_all . ' value="{a}All{a}" name="es_note_cat_parent">' . __( 'All Categories (Also include all categories which will create later)', 'email-subscribers' ) . '</td></tr>';
 
355
 
356
  return $all_html . $category_html;
357
  }
@@ -1256,4 +1258,36 @@ Class ES_Common {
1256
 
1257
  }
1258
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1259
  }
3
  // Exit if accessed directly
4
  if ( ! defined( 'ABSPATH' ) ) {
5
  exit;
6
+ }
7
 
8
  /**
9
  * Class Email_General.
339
  $category_names = array();
340
  }
341
  $checked_selected = ! in_array( 'All', $category_names ) ? "checked='checked'" : '';
342
+ $category_html = '<tr><td style="padding-top:4px;padding-bottom:4px;padding-right:10px;" ><span class="block ml-6 pr-4 text-sm font-normal text-gray-600 pb-1"><input class="es-note-category-parent form-radio text-indigo-600" type="radio" ' . $checked_selected . ' value="selected_cat" name="es_note_cat_parent">' . __( 'Select Categories',
343
+ 'email-subscribers' ) . '</td></tr>';
344
  foreach ( $categories as $category ) {
345
 
346
  if ( in_array( $category->term_id, $category_names ) ) {
352
  $category_html .= '<tr class="es-note-child-category"><td style="padding-top:4px;padding-bottom:4px;padding-right:10px;"><span class="block ml-6 pr-4 text-sm font-normal text-gray-600 pb-1"><input type="checkbox" class="form-checkbox" ' . $checked . ' value="' . $category->term_id . '" id="es_note_cat[]" name="es_note_cat[]">' . $category->name . '</td></tr>';
353
  }
354
  $checked_all = in_array( 'All', $category_names ) ? "checked='checked'" : '';
355
+ $all_html = '<tr><td style="padding-top:4px;padding-bottom:4px;padding-right:10px;"><span class="block ml-6 pr-4 text-sm font-normal text-gray-600 pb-1"><input type="radio" class="form-radio text-indigo-600 es-note-category-parent" ' . $checked_all . ' value="{a}All{a}" name="es_note_cat_parent">' . __( 'All Categories (Also include all categories which will create later)',
356
+ 'email-subscribers' ) . '</td></tr>';
357
 
358
  return $all_html . $category_html;
359
  }
1258
 
1259
  }
1260
 
1261
+ /**
1262
+ * Get utm tracking url
1263
+ *
1264
+ * @param array $utm_args
1265
+ *
1266
+ * @return mixed|string
1267
+ *
1268
+ * @since 4.4.5
1269
+ */
1270
+ public static function get_utm_tracking_url( $utm_args = array() ) {
1271
+
1272
+ $url = ! empty( $utm_args['url'] ) ? $utm_args['url'] : 'https://icegram.com/email-subscribers-pricing/';
1273
+ $utm_source = ! empty( $utm_args['utm_source'] ) ? $utm_args['utm_source'] : 'in_app';
1274
+ $utm_medium = ! empty( $utm_args['utm_medium'] ) ? $utm_args['utm_medium'] : '';
1275
+ $utm_campaign = ! empty( $utm_args['utm_campaign'] ) ? $utm_args['utm_campaign'] : 'es_upsale';
1276
+
1277
+ if ( ! empty( $utm_source ) ) {
1278
+ $url = add_query_arg( 'utm_source', $utm_source, $url );
1279
+ }
1280
+
1281
+ if ( ! empty( $utm_medium ) ) {
1282
+ $url = add_query_arg( 'utm_medium', $utm_medium, $url );
1283
+ }
1284
+
1285
+ if ( ! empty( $utm_campaign ) ) {
1286
+ $url = add_query_arg( 'utm_campaign', $utm_campaign, $url );
1287
+ }
1288
+
1289
+ return $url;
1290
+
1291
+ }
1292
+
1293
  }
lite/includes/classes/class-es-admin-settings.php CHANGED
@@ -46,7 +46,6 @@ class ES_Admin_Settings {
46
  $options['ig_es_notify_admin'] = isset( $options['ig_es_notify_admin'] ) ? $options['ig_es_notify_admin'] : 'no';
47
  $options['ig_es_enable_cron_admin_email'] = isset( $options['ig_es_enable_cron_admin_email'] ) ? $options['ig_es_enable_cron_admin_email'] : 'no';
48
 
49
-
50
  $text_fields_to_sanitize = array(
51
  'ig_es_from_name',
52
  'ig_es_admin_emails',
@@ -520,7 +519,7 @@ class ES_Admin_Settings {
520
 
521
  'ig_es_test_send_email' => array(
522
  'type' => 'html',
523
- 'html' => '<input id="es-test-email" class="mt-3 mb-1 form-input h-9 border-gray-400"/><input type="submit" name="submit" id="es-send-test" class="ig-es-primary-button" value="Send Email"><span class="es_spinner_image_admin" id="spinner-image" style="display:none"><img src="' . ES_PLUGIN_URL . 'lite/public/images/spinner.gif' . '" alt="Loading..."/></span>',
524
  'placeholder' => '',
525
  'supplemental' => '',
526
  'default' => '',
@@ -534,14 +533,13 @@ class ES_Admin_Settings {
534
  'type' => 'html',
535
  // 'html' => ES_Admin_Settings::mailers_html(),
536
  'sub_fields' => array(
537
- 'mailer' => array(
538
  'id' => 'ig_es_mailer_settings[mailer]',
539
  'name' => __( 'Select Mailer', 'email-subscribers' ),
540
  'type' => 'html',
541
  'html' => ES_Admin_Settings::mailers_html(),
542
  'desc' => '',
543
  ),
544
-
545
  'ig_es_pepipost_api_key' => array(
546
  'type' => 'password',
547
  'options' => false,
@@ -585,6 +583,7 @@ class ES_Admin_Settings {
585
 
586
  );
587
 
 
588
  $security_settings = apply_filters( 'ig_es_registered_security_settings', $security_settings );
589
 
590
  $es_settings = array(
@@ -634,10 +633,12 @@ class ES_Admin_Settings {
634
  $id_key = ! empty( $id_key ) ? $id_key : $uid;
635
  $class = ! empty( $arguments['class'] ) ? $arguments['class'] : '';
636
  $rows = ! empty( $arguments['rows'] ) ? $arguments['rows'] : 12;
 
 
637
  // Check which type of field we want
638
  switch ( $arguments['type'] ) {
639
  case 'text': // If it is a text field
640
- $field_html = sprintf( '<input name="%1$s" id="%2$s" placeholder="%4$s" value="%5$s" %6$s class="form-input h-9 mt-2 mb-1 text-sm border-gray-400 w-3/5 %7$s"/>', $uid, $id_key, $type, $placeholder, $value, $readonly, $class );
641
  break;
642
  case 'password': // If it is a text field
643
  $field_html = sprintf( '<input name="%1$s" id="%2$s" type="%3$s" placeholder="%4$s" value="%5$s" %6$s class="form-input h-9 mt-2 mb-1 text-sm border-gray-400 w-3/5 %7$s"/>', $uid, $id_key, $type, $placeholder, $value, $readonly, $class );
@@ -648,22 +649,27 @@ class ES_Admin_Settings {
648
  break;
649
 
650
  case 'email':
651
- $field_html = sprintf( '<input name="%1$s" id="%2$s" placeholder="%4$s" value="%5$s" class="form-input w-2/3 mt-2 mb-1 h-9 text-sm border-gray-400 w-3/5 %6$s"/>', $uid, $id_key, $type, $placeholder, $value, $class );
652
  break;
653
 
654
  case 'textarea':
655
- $field_html = sprintf( '<textarea name="%1$s" id="%2$s" placeholder="%3$s" size="100" rows="%6$s" cols="58" class="form-textarea text-sm w-2/3 mt-3 mb-1 border-gray-400 w-3/5 %5$s">%4$s</textarea>', $uid, $id_key, $placeholder, $value, $class, $rows );
656
  break;
657
 
658
  case 'file':
659
- $field_html = '<input id="logo_url" name="' . $uid . '" value="' . $value . '" class="form-input w-2/3 mt-2 mb-1 h-9 border-gray-400 text-sm w-3/5' . $class . '"/> <input id="upload_logo_button" type="button" class="button" value="Upload Logo" />';
660
  break;
661
 
662
  case 'checkbox' :
663
 
664
  $field_html = '<label for="' . $id_key . '" class="mt-4 mb-1 inline-flex items-center cursor-pointer">
665
- <span class="relative">
666
- <input id="' . $id_key . '" type="checkbox" name="' . $uid . '" value="yes" ' . checked( $value, 'yes', false ) . ' class="mt-6 absolute es-check-toggle opacity-0 w-0 h-0 ' . $class . '" />' . $placeholder . '</input>
 
 
 
 
 
667
  <span class="es-mail-toggle-line block w-10 h-6 bg-gray-300 rounded-full shadow-inner "></span>
668
  <span class="es-mail-toggle-dot absolute transition-all duration-300 ease-in-out block w-4 h-4 mt-1 ml-1 bg-white rounded-full shadow inset-y-0 left-0 focus-within:shadow-outline"></span>
669
  </span>
@@ -677,7 +683,7 @@ class ES_Admin_Settings {
677
  $options_markup .= sprintf( '<option value="%s" %s>%s</option>', $key,
678
  selected( $value, $key, false ), $label );
679
  }
680
- $field_html = sprintf( '<select name="%1$s" id="%2$s" class="form-select rounded-lg w-2/5 h-9 mt-2 mb-1 border-gray-400 %4$s">%3$s</select>', $uid, $id_key, $options_markup, $class );
681
  }
682
  break;
683
 
@@ -692,7 +698,7 @@ class ES_Admin_Settings {
692
  //If there is help text
693
  if ( ! empty( $arguments['desc'] ) ) {
694
  $helper = $arguments['desc'];
695
- $field_html .= sprintf( '<p class="italic text-xs font-normal text-gray-500 mb-2 leading-snug"> %s</p>', $helper ); // Show it
696
  }
697
 
698
  return $field_html;
@@ -708,14 +714,17 @@ class ES_Admin_Settings {
708
 
709
  function render_settings_fields( $fields ) {
710
 
711
- $html = "<table class='mt-4 rounded-lg bg-white mr-4 lg:mx-5 xl:mx-7 overflow-hidden'>";
712
- $html .= "<tbody>";
713
- $button_html = '';
714
  foreach ( $fields as $key => $field ) {
715
  if ( ! empty( $field['name'] ) ) {
716
  $html .= "<tr class=' ml-4 py-4 border-b border-gray-100'><th scope='row' class='pt-7 ml-6 block pt-3 pb-8 text-left pr-4'><span class='text-sm font-semibold text-gray-600 pb-2'>";
717
  $html .= $field['name'];
718
 
 
 
 
 
719
  //If there is help text
720
  if ( ! empty( $field['info'] ) ) {
721
  $helper = $field['info'];
@@ -731,7 +740,7 @@ class ES_Admin_Settings {
731
  $option_key = '';
732
  foreach ( $field['sub_fields'] as $field_key => $sub_field ) {
733
  if ( strpos( $sub_field['id'], '[' ) ) {
734
- $parts = explode( '[', $sub_field['id'] );
735
  if ( $option_key !== $parts[0] ) {
736
  $option_value = get_option( $parts[0] );
737
  $option_key = $parts[0];
@@ -755,9 +764,8 @@ class ES_Admin_Settings {
755
  $nonce_field = wp_nonce_field( 'update-settings', 'update-settings', true, false );
756
 
757
  $html .= $button_html . "<td class='es-settings-submit-btn'>";
758
- $html .= '<input type="hidden" name="submitted" value="submitted"/>';
759
- $html .= '<input type="hidden" name="submit_action" value="ig-es-save-admin-settings"/>';
760
- //$html .= '<input type="hidden" name="update-settings" id="update-settings" value="' . $nonce . '"/>';
761
  $html .= $nonce_field;
762
  $html .= '<input type="submit" name="submit" class="cursor-pointer my-2 mx-6 ig-es-primary-button" value="' . __( 'Save Settings', 'email-subscribers' ) . '">';
763
  $html .= "</td></tr>";
@@ -799,24 +807,31 @@ class ES_Admin_Settings {
799
  $mailers = array(
800
  'wpmail' => array( 'name' => 'WP Mail', 'logo' => ES_PLUGIN_URL . 'lite/admin/images/wpmail.png' ),
801
  'phpmail' => array( 'name' => 'PHP mail', 'logo' => ES_PLUGIN_URL . 'lite/admin/images/phpmail.png' ),
802
- 'pepipost' => array( 'name' => 'Pepipost <span class="dashicons dashicons-thumbs-up"></span>', 'logo' => ES_PLUGIN_URL . 'lite/admin/images/pepipost.png', 'docblock' => $pepipost_doc_block ),
803
  );
804
 
805
- $mailers = apply_filters( 'ig_es_mailers', $mailers );
806
- $selected_mailer = ( array_key_exists( $selected_mailer, $mailers ) ) ? $selected_mailer : 'wpmail';
807
 
 
808
 
809
  foreach ( $mailers as $key => $mailer ) {
810
- $class = ( $key === 'pepipost' ) ? 'es_recommended' : '';
811
- $html .= '<label class="inline-flex items-center cursor-pointer">';
812
- $html .= '<input type="radio" class="es_mailer absolute opacity-0 w-0 h-0" name="ig_es_mailer_settings[mailer]" value="' . $key . '" ' . checked( $selected_mailer, $key, false ) . ' />
813
- <div class="mt-4 mr-4 border-solid border-2 rounded-lg border-gray-200 shadow-md es-mailer-logo ' . $class . '">
 
 
 
 
814
  <div class="es-logo-wrapper border-0">
815
  <img src="' . $mailer['logo'] . '" alt="Default (none)">
816
  </div>'
817
- . $mailer['name'] .
818
- '</div>
819
- </label>';
 
 
 
820
  }
821
 
822
  return $html;
46
  $options['ig_es_notify_admin'] = isset( $options['ig_es_notify_admin'] ) ? $options['ig_es_notify_admin'] : 'no';
47
  $options['ig_es_enable_cron_admin_email'] = isset( $options['ig_es_enable_cron_admin_email'] ) ? $options['ig_es_enable_cron_admin_email'] : 'no';
48
 
 
49
  $text_fields_to_sanitize = array(
50
  'ig_es_from_name',
51
  'ig_es_admin_emails',
519
 
520
  'ig_es_test_send_email' => array(
521
  'type' => 'html',
522
+ 'html' => '<input id="es-test-email" class="mt-3 mb-1 form-input h-9 border-gray-400"/><input type="submit" name="submit" id="es-send-test" class="ig-es-primary-button" value="Send Email"><span class="es_spinner_image_admin" id="spinner-image" style="display:none"><img src="' . ES_PLUGIN_URL . 'lite/public/images/spinner.gif' . '" alt="Loading..."/></span>',
523
  'placeholder' => '',
524
  'supplemental' => '',
525
  'default' => '',
533
  'type' => 'html',
534
  // 'html' => ES_Admin_Settings::mailers_html(),
535
  'sub_fields' => array(
536
+ 'mailer' => array(
537
  'id' => 'ig_es_mailer_settings[mailer]',
538
  'name' => __( 'Select Mailer', 'email-subscribers' ),
539
  'type' => 'html',
540
  'html' => ES_Admin_Settings::mailers_html(),
541
  'desc' => '',
542
  ),
 
543
  'ig_es_pepipost_api_key' => array(
544
  'type' => 'password',
545
  'options' => false,
583
 
584
  );
585
 
586
+
587
  $security_settings = apply_filters( 'ig_es_registered_security_settings', $security_settings );
588
 
589
  $es_settings = array(
633
  $id_key = ! empty( $id_key ) ? $id_key : $uid;
634
  $class = ! empty( $arguments['class'] ) ? $arguments['class'] : '';
635
  $rows = ! empty( $arguments['rows'] ) ? $arguments['rows'] : 12;
636
+ $disabled = ! empty( $arguments['disabled'] ) ? true : false;
637
+
638
  // Check which type of field we want
639
  switch ( $arguments['type'] ) {
640
  case 'text': // If it is a text field
641
+ $field_html = sprintf( '<input name="%1$s" id="%2$s" placeholder="%4$s" value="%5$s" %6$s class="%7$s form-input h-9 mt-2 mb-1 text-sm border-gray-400 w-3/5"/>', $uid, $id_key, $type, $placeholder, $value, $readonly, $class );
642
  break;
643
  case 'password': // If it is a text field
644
  $field_html = sprintf( '<input name="%1$s" id="%2$s" type="%3$s" placeholder="%4$s" value="%5$s" %6$s class="form-input h-9 mt-2 mb-1 text-sm border-gray-400 w-3/5 %7$s"/>', $uid, $id_key, $type, $placeholder, $value, $readonly, $class );
649
  break;
650
 
651
  case 'email':
652
+ $field_html = sprintf( '<input name="%1$s" id="%2$s" type="%3$s" placeholder="%4$s" value="%5$s" class="%6$s form-input w-2/3 mt-2 mb-1 h-9 text-sm border-gray-400 w-3/5"/>', $uid, $id_key, $type, $placeholder, $value, $class );
653
  break;
654
 
655
  case 'textarea':
656
+ $field_html = sprintf( '<textarea name="%1$s" id="%2$s" placeholder="%3$s" size="100" rows="%6$s" cols="58" class="%5$s form-textarea text-sm w-2/3 mt-3 mb-1 border-gray-400 w-3/5">%4$s</textarea>', $uid, $id_key, $placeholder, $value, $class, $rows );
657
  break;
658
 
659
  case 'file':
660
+ $field_html = '<input type="text" id="logo_url" name="' . $uid . '" value="' . $value . '" class="form-input w-2/3 mt-2 mb-1 h-9 border-gray-400 text-sm w-3/5' . $class . '"/> <input id="upload_logo_button" type="button" class="button" value="Upload Logo" />';
661
  break;
662
 
663
  case 'checkbox' :
664
 
665
  $field_html = '<label for="' . $id_key . '" class="mt-4 mb-1 inline-flex items-center cursor-pointer">
666
+ <span class="relative">';
667
+
668
+ if ( ! $disabled ) {
669
+ $field_html .= '<input id="' . $id_key . '" type="checkbox" name="' . $uid . '" value="yes" ' . checked( $value, 'yes', false ) . ' class="mt-6 absolute es-check-toggle opacity-0 w-0 h-0 ' . $class . '" />';
670
+ }
671
+
672
+ $field_html .= $placeholder . '</input>
673
  <span class="es-mail-toggle-line block w-10 h-6 bg-gray-300 rounded-full shadow-inner "></span>
674
  <span class="es-mail-toggle-dot absolute transition-all duration-300 ease-in-out block w-4 h-4 mt-1 ml-1 bg-white rounded-full shadow inset-y-0 left-0 focus-within:shadow-outline"></span>
675
  </span>
683
  $options_markup .= sprintf( '<option value="%s" %s>%s</option>', $key,
684
  selected( $value, $key, false ), $label );
685
  }
686
+ $field_html = sprintf( '<select name="%1$s" id="%2$s" class="%4$s form-select rounded-lg w-2/5 h-9 mt-2 mb-1 border-gray-400">%3$s</select>', $uid, $id_key, $options_markup, $class );
687
  }
688
  break;
689
 
698
  //If there is help text
699
  if ( ! empty( $arguments['desc'] ) ) {
700
  $helper = $arguments['desc'];
701
+ $field_html .= sprintf( '<p class="helper italic text-xs font-normal text-gray-500 mb-2 leading-snug"> %s</p>', $helper ); // Show it
702
  }
703
 
704
  return $field_html;
714
 
715
  function render_settings_fields( $fields ) {
716
 
717
+ $html = "<table class='mt-4 rounded-lg bg-white mr-4 lg:mx-5 xl:mx-7 overflow-hidden'>";
718
+ $html .= "<tbody>";
 
719
  foreach ( $fields as $key => $field ) {
720
  if ( ! empty( $field['name'] ) ) {
721
  $html .= "<tr class=' ml-4 py-4 border-b border-gray-100'><th scope='row' class='pt-7 ml-6 block pt-3 pb-8 text-left pr-4'><span class='text-sm font-semibold text-gray-600 pb-2'>";
722
  $html .= $field['name'];
723
 
724
+ if ( ! empty( $field['is_premium'] ) ) {
725
+ $html .= '<a href="' . $field['link'] . '" target="_blank"><span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">' . __( 'Premium', 'email-subscribers' ) . '</span></a>';
726
+ }
727
+
728
  //If there is help text
729
  if ( ! empty( $field['info'] ) ) {
730
  $helper = $field['info'];
740
  $option_key = '';
741
  foreach ( $field['sub_fields'] as $field_key => $sub_field ) {
742
  if ( strpos( $sub_field['id'], '[' ) ) {
743
+ $parts = explode( '[', $sub_field['id'] );
744
  if ( $option_key !== $parts[0] ) {
745
  $option_value = get_option( $parts[0] );
746
  $option_key = $parts[0];
764
  $nonce_field = wp_nonce_field( 'update-settings', 'update-settings', true, false );
765
 
766
  $html .= $button_html . "<td class='es-settings-submit-btn'>";
767
+ $html .= '<input type="hidden" name="submitted" value="submitted" />';
768
+ $html .= '<input type="hidden" name="submit_action" value="ig-es-save-admin-settings" />';
 
769
  $html .= $nonce_field;
770
  $html .= '<input type="submit" name="submit" class="cursor-pointer my-2 mx-6 ig-es-primary-button" value="' . __( 'Save Settings', 'email-subscribers' ) . '">';
771
  $html .= "</td></tr>";
807
  $mailers = array(
808
  'wpmail' => array( 'name' => 'WP Mail', 'logo' => ES_PLUGIN_URL . 'lite/admin/images/wpmail.png' ),
809
  'phpmail' => array( 'name' => 'PHP mail', 'logo' => ES_PLUGIN_URL . 'lite/admin/images/phpmail.png' ),
810
+ 'pepipost' => array( 'name' => 'Pepipost', 'logo' => ES_PLUGIN_URL . 'lite/admin/images/pepipost.png', 'docblock' => $pepipost_doc_block ),
811
  );
812
 
813
+ $mailers = apply_filters( 'ig_es_mailers', $mailers );
 
814
 
815
+ $selected_mailer = ( array_key_exists( $selected_mailer, $mailers ) ) ? $selected_mailer : 'wpmail';
816
 
817
  foreach ( $mailers as $key => $mailer ) {
818
+ $html .= '<label class="inline-flex items-center cursor-pointer">';
819
+ $html .= '<input type="radio" class="es_mailer absolute opacity-0 w-0 h-0" name="ig_es_mailer_settings[mailer]" value="' . $key . '" ' . checked( $selected_mailer, $key, false ) . '></input>';
820
+
821
+ if ( ! empty( $mailer['is_premium'] ) ) {
822
+ $html .= '<a href="' . $mailer['url'] . '" target="_blank">';
823
+ }
824
+
825
+ $html .= '<div class="mt-4 mr-4 border-solid border-2 rounded-lg border-gray-200 shadow-md es-mailer-logo">
826
  <div class="es-logo-wrapper border-0">
827
  <img src="' . $mailer['logo'] . '" alt="Default (none)">
828
  </div>'
829
+ . $mailer['name'];
830
+
831
+ if ( ! empty( $mailer['is_premium'] ) ) {
832
+ $html .= '<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">Premium</span></a>';
833
+ }
834
+ $html .= '</div></label>';
835
  }
836
 
837
  return $html;
lite/includes/classes/class-es-contact-background-process.php CHANGED
@@ -66,6 +66,7 @@ if ( ! class_exists( 'ES_Contact_Background_Process' ) ) {
66
  add_action( 'admin_notices', array( $this, 'contact_background_notice' ) );
67
  add_action( 'wp_ajax_ig_es_contact_background_progress', array( $this, 'ajax_contact_background_progress' ) );
68
  add_action( 'wp_ajax_ig_es_get_background_process_results', array( $this, 'ajax_get_background_process_results' ) );
 
69
  add_action( 'wp_ajax_ig_es_download_csv', array( $this, 'ajax_download_csv' ) );
70
  add_action( 'ig_es_add_contact_to_csv', array( $this, 'add_contact_to_csv' ) );
71
  add_action( 'ig_es_import_contacts_from_csv', array( $this, 'import_contacts_from_csv' ) );
@@ -258,7 +259,9 @@ if ( ! class_exists( 'ES_Contact_Background_Process' ) ) {
258
  ?>
259
  </p>
260
  <p>
261
- <?php echo esc_html__( 'You can continue with other work. But before bulk exporting or importing contacts, you need to wait for this process to complete.', 'email-subscribers' ); ?>
 
 
262
  </p>
263
  </div>
264
  <?php
@@ -275,6 +278,9 @@ if ( ! class_exists( 'ES_Contact_Background_Process' ) ) {
275
  // Clear interval callback function.
276
  let clear_interval_callback = null;
277
 
 
 
 
278
  jQuery(document).ready(function(){
279
  var border_color = jQuery('#ig_es_contact_background_progress').css('border-left-color');
280
  jQuery('#ig_es_contact_background_progress').css('border-top', '1px solid ' + border_color);
@@ -284,6 +290,10 @@ if ( ! class_exists( 'ES_Contact_Background_Process' ) ) {
284
  jQuery('body').on('click', '.download-csv-wrapper a', function(){
285
  jQuery('.download-csv-wrapper').hide('slow');
286
  });
 
 
 
 
287
  <?php
288
  // If background process is running then check it's progress continuously with the interval of 5 seconds.
289
  if( 'yes' === $is_process_running ) {
@@ -332,47 +342,43 @@ if ( ! class_exists( 'ES_Contact_Background_Process' ) ) {
332
 
333
  function ig_es_check_contact_background_progress() {
334
  ig_es_disable_import_form();
335
- jQuery.ajax({
336
- url: admin_ajax_url,
337
- method: 'post',
338
- dataType: 'json',
339
- data: {
340
- action: 'ig_es_contact_background_progress',
341
- security: '<?php echo esc_attr( wp_create_nonce( 'ig-es-background-contact-progress' ) ); ?>'
342
- },
343
- success: function( response ) {
344
-
345
- let percent_completion = response.percent_completion;
346
- let contact_action = response.contact_action;
347
- let action_stage = response.action_stage;
348
- let action_data = response.action_data;
349
-
350
- let progress_data = {
351
- percent_completion: response.percent_completion,
352
- contact_action: response.contact_action,
353
- action_stage: response.action_stage,
354
- action_data: response.action_data
355
- }
356
 
357
- let target_dom = jQuery('#ig_es_contact_background_progress');
 
 
 
358
 
359
- if ( response.percent_completion !== undefined && response.percent_completion !== '' ) {
360
- if( 100 == response.percent_completion) {
361
- clearInterval(clear_interval_callback);
362
- ig_es_get_background_process_results();
363
- }
364
- target_dom.show();
365
- ig_es_start_contact_background_progress_percentage( progress_data, target_dom );
 
 
 
 
 
 
366
  }
 
 
367
  }
 
368
  });
369
  }
370
 
371
  function ig_es_get_background_process_results() {
372
- // Check if results already shown then return.
373
- if( 1 === jQuery('#ig_es_contact_background_results').length ) {
374
- return;
375
- }
376
  jQuery.ajax({
377
  url: admin_ajax_url,
378
  method: 'post',
@@ -383,6 +389,12 @@ if ( ! class_exists( 'ES_Contact_Background_Process' ) ) {
383
  },
384
  success: function( response ) {
385
  if( 'undefined' !== typeof response.response_html && '' !== response.response_html ) {
 
 
 
 
 
 
386
  let result_html = jQuery.parseHTML( response.response_html );
387
  // If there is background process progress message being shown then replace it with background process result html else show background process result after page heading.
388
  if( 1 === jQuery('#ig_es_contact_background_progress').length ) {
@@ -395,6 +407,32 @@ if ( ! class_exists( 'ES_Contact_Background_Process' ) ) {
395
  }
396
  });
397
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
398
  });
399
  </script>
400
  <?php
@@ -474,6 +512,46 @@ if ( ! class_exists( 'ES_Contact_Background_Process' ) ) {
474
  }
475
  }
476
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
477
  /**
478
  * Checks if background process is running
479
  *
@@ -642,14 +720,17 @@ if ( ! class_exists( 'ES_Contact_Background_Process' ) ) {
642
 
643
  // If loop is completed or time is reached or memory limit is reached then set required options for next run and break the loop.
644
  if ( $last_subscriber_id === $subscriber_id || $this->time_exceeded( $batch_start_time ) || $this->memory_exceeded() ) {
645
- $process_data['last_contact_id'] = $subscriber_id;
646
- $process_data['total_contacts_processed'] = $total_contacts_processed;
647
- $process_data['last_processed_list_contact_id'] = $last_processed_list_contact_id;
648
- update_site_option( 'ig_es_contact_background_process_data', $process_data );
649
- if ( function_exists( 'as_schedule_single_action' ) ) {
650
- as_schedule_single_action( time(), 'ig_es_add_contact_to_csv' );
 
 
 
 
651
  }
652
- break;
653
  }
654
  }
655
 
@@ -708,7 +789,7 @@ if ( ! class_exists( 'ES_Contact_Background_Process' ) ) {
708
  $delimiter = $this->get_delimiter( $csv_file );
709
 
710
  // Get Headers
711
- $csv_header = array_map( 'trim', fgetcsv( $csv_file_handler, 0 ) );
712
 
713
  $batch_start_time = time();
714
 
@@ -819,15 +900,19 @@ if ( ! class_exists( 'ES_Contact_Background_Process' ) ) {
819
  }
820
 
821
  fclose( $csv_file_handler ); // phpcs:ignore
822
- $process_data['import_file']['file_position'] = $file_position;
823
- $process_data['total_contacts_processed'] = $total_contacts_processed;
824
- $process_data['existing_contacts_count'] = $existing_contacts_count;
825
- $process_data['invalid_emails_count'] = $invalid_emails_count;
826
- update_site_option( 'ig_es_contact_background_process_data', $process_data );
827
- if ( function_exists( 'as_schedule_single_action' ) ) {
828
- as_schedule_single_action( time(), 'ig_es_import_contacts_from_csv' );
 
 
 
 
 
829
  }
830
- break;
831
  }
832
  }
833
  }
66
  add_action( 'admin_notices', array( $this, 'contact_background_notice' ) );
67
  add_action( 'wp_ajax_ig_es_contact_background_progress', array( $this, 'ajax_contact_background_progress' ) );
68
  add_action( 'wp_ajax_ig_es_get_background_process_results', array( $this, 'ajax_get_background_process_results' ) );
69
+ add_action( 'wp_ajax_ig_es_cancel_contact_background_process', array( $this, 'ajax_cancel_contact_background_process' ) );
70
  add_action( 'wp_ajax_ig_es_download_csv', array( $this, 'ajax_download_csv' ) );
71
  add_action( 'ig_es_add_contact_to_csv', array( $this, 'add_contact_to_csv' ) );
72
  add_action( 'ig_es_import_contacts_from_csv', array( $this, 'import_contacts_from_csv' ) );
259
  ?>
260
  </p>
261
  <p>
262
+ <?php
263
+ echo __( '<a href="#" id="ig-es-cancel-contact-background-process">Click here</a> to cancel this request.', 'email-subscribers' );
264
+ ?>
265
  </p>
266
  </div>
267
  <?php
278
  // Clear interval callback function.
279
  let clear_interval_callback = null;
280
 
281
+ // Background request object.
282
+ let background_progress_request = null;
283
+
284
  jQuery(document).ready(function(){
285
  var border_color = jQuery('#ig_es_contact_background_progress').css('border-left-color');
286
  jQuery('#ig_es_contact_background_progress').css('border-top', '1px solid ' + border_color);
290
  jQuery('body').on('click', '.download-csv-wrapper a', function(){
291
  jQuery('.download-csv-wrapper').hide('slow');
292
  });
293
+ jQuery('body').on('click', '#ig-es-cancel-contact-background-process', function(e){
294
+ e.preventDefault();
295
+ ig_es_cancel_contact_background_process();
296
+ });
297
  <?php
298
  // If background process is running then check it's progress continuously with the interval of 5 seconds.
299
  if( 'yes' === $is_process_running ) {
342
 
343
  function ig_es_check_contact_background_progress() {
344
  ig_es_disable_import_form();
345
+ background_progress_request = jQuery.ajax({
346
+ url: admin_ajax_url,
347
+ method: 'post',
348
+ dataType: 'json',
349
+ data: {
350
+ action: 'ig_es_contact_background_progress',
351
+ security: '<?php echo esc_attr( wp_create_nonce( 'ig-es-background-contact-progress' ) ); ?>'
352
+ },
353
+ success: function( response ) {
 
 
 
 
 
 
 
 
 
 
 
 
354
 
355
+ let percent_completion = response.percent_completion;
356
+ let contact_action = response.contact_action;
357
+ let action_stage = response.action_stage;
358
+ let action_data = response.action_data;
359
 
360
+ let progress_data = {
361
+ percent_completion: response.percent_completion,
362
+ contact_action: response.contact_action,
363
+ action_stage: response.action_stage,
364
+ action_data: response.action_data
365
+ }
366
+
367
+ let target_dom = jQuery('#ig_es_contact_background_progress');
368
+
369
+ if ( response.percent_completion !== undefined && response.percent_completion !== '' ) {
370
+ if( 100 == response.percent_completion) {
371
+ clearInterval(clear_interval_callback);
372
+ ig_es_get_background_process_results();
373
  }
374
+ target_dom.show();
375
+ ig_es_start_contact_background_progress_percentage( progress_data, target_dom );
376
  }
377
+ }
378
  });
379
  }
380
 
381
  function ig_es_get_background_process_results() {
 
 
 
 
382
  jQuery.ajax({
383
  url: admin_ajax_url,
384
  method: 'post',
389
  },
390
  success: function( response ) {
391
  if( 'undefined' !== typeof response.response_html && '' !== response.response_html ) {
392
+
393
+ // Check if results already shown then return.
394
+ if( 1 === jQuery('#ig_es_contact_background_results').length ) {
395
+ return;
396
+ }
397
+
398
  let result_html = jQuery.parseHTML( response.response_html );
399
  // If there is background process progress message being shown then replace it with background process result html else show background process result after page heading.
400
  if( 1 === jQuery('#ig_es_contact_background_progress').length ) {
407
  }
408
  });
409
  }
410
+
411
+ function ig_es_cancel_contact_background_process() {
412
+ clearInterval(clear_interval_callback);
413
+ jQuery.ajax({
414
+ url: admin_ajax_url,
415
+ method: 'post',
416
+ dataType: 'json',
417
+ beforeSend: function() {
418
+ // Cancel previous request for checking background progress.
419
+ if( null !== background_progress_request) {
420
+ background_progress_request.abort();
421
+ }
422
+ },
423
+ data: {
424
+ action: 'ig_es_cancel_contact_background_process',
425
+ security: '<?php echo esc_attr( wp_create_nonce( 'ig-es-cancel-contact-background-process' ) ); ?>'
426
+ },
427
+ success: function( response ) {
428
+ if( 'undefined' !== typeof response.response_html && '' !== response.response_html ) {
429
+ let response_html = jQuery.parseHTML( response.response_html );
430
+ jQuery('#ig_es_contact_background_progress').replaceWith( response_html );
431
+ ig_es_enable_import_form();
432
+ }
433
+ }
434
+ });
435
+ }
436
  });
437
  </script>
438
  <?php
512
  }
513
  }
514
 
515
+ /**
516
+ * Cancel current background process
517
+ *
518
+ * @since 4.4.4.1
519
+ */
520
+ public function ajax_cancel_contact_background_process() {
521
+
522
+ check_ajax_referer( 'ig-es-cancel-contact-background-process', 'security' );
523
+ $response = array();
524
+ $background_process_process_data = get_site_option( 'ig_es_contact_background_process_data', false );
525
+ ob_start();
526
+ if ( $background_process_process_data ) {
527
+ // Delete data related to background process.
528
+ delete_site_option( 'ig_es_contact_background_process_data' );
529
+ delete_site_option( 'ig_es_contact_background_process_result' );
530
+
531
+ // Unschedule existing scheduled action schedulers.
532
+ as_unschedule_action( 'ig_es_add_contact_to_csv' );
533
+ as_unschedule_action( 'ig_es_import_contacts_from_csv' );
534
+ ?>
535
+ <div id="ig_es_contact_background_results" class="updated">
536
+ <p>
537
+ <?php
538
+ echo __( 'The background process has been canceled successfully. You can start a new process again by importing or exporting.', 'email-subscribers' );
539
+ ?>
540
+ </p>
541
+ </div>
542
+ <?php
543
+ } else {
544
+ // Till we processed this cancel request current import/export process got completed therefore show success background message instead.
545
+ $background_process_result = get_site_option( 'ig_es_contact_background_process_result', false );
546
+ if( false !== $background_process_result ) {
547
+ $this->get_background_process_results_html( $background_process_result );
548
+ }
549
+ }
550
+ $response_html = ob_get_clean();
551
+ $response['response_html'] = $response_html;
552
+ wp_send_json( $response );
553
+ }
554
+
555
  /**
556
  * Checks if background process is running
557
  *
720
 
721
  // If loop is completed or time is reached or memory limit is reached then set required options for next run and break the loop.
722
  if ( $last_subscriber_id === $subscriber_id || $this->time_exceeded( $batch_start_time ) || $this->memory_exceeded() ) {
723
+ // Update background process data only if it exists to ensure we don't start another process in this request if it was cancelled previously by user.
724
+ if( false !== get_site_option( 'ig_es_contact_background_process_data', false ) ) {
725
+ $process_data['last_contact_id'] = $subscriber_id;
726
+ $process_data['total_contacts_processed'] = $total_contacts_processed;
727
+ $process_data['last_processed_list_contact_id'] = $last_processed_list_contact_id;
728
+ update_site_option( 'ig_es_contact_background_process_data', $process_data );
729
+ if ( function_exists( 'as_schedule_single_action' ) ) {
730
+ as_schedule_single_action( time(), 'ig_es_add_contact_to_csv' );
731
+ }
732
+ break;
733
  }
 
734
  }
735
  }
736
 
789
  $delimiter = $this->get_delimiter( $csv_file );
790
 
791
  // Get Headers
792
+ $csv_header = array_map( 'trim', fgetcsv( $csv_file_handler, 0, $delimiter ) );
793
 
794
  $batch_start_time = time();
795
 
900
  }
901
 
902
  fclose( $csv_file_handler ); // phpcs:ignore
903
+
904
+ // Update background process data only if it exists to ensure we don't start another process in this request if it was cancelled previously by user.
905
+ if( false !== get_site_option( 'ig_es_contact_background_process_data', false ) ) {
906
+ $process_data['import_file']['file_position'] = $file_position;
907
+ $process_data['total_contacts_processed'] = $total_contacts_processed;
908
+ $process_data['existing_contacts_count'] = $existing_contacts_count;
909
+ $process_data['invalid_emails_count'] = $invalid_emails_count;
910
+ update_site_option( 'ig_es_contact_background_process_data', $process_data );
911
+ if ( function_exists( 'as_schedule_single_action' ) ) {
912
+ as_schedule_single_action( time(), 'ig_es_import_contacts_from_csv' );
913
+ }
914
+ break;
915
  }
 
916
  }
917
  }
918
  }
lite/includes/classes/class-es-contacts-table.php CHANGED
@@ -724,10 +724,17 @@ class ES_Contacts_Table extends WP_List_Table {
724
 
725
  <div class="flex border-b border-gray-100">
726
  <div class="ml-4 mb-4 pt-6">
727
- <input type="hidden" name="contact_data[created_at]" value="<?php echo $created; ?>"/>
728
- <input type="hidden" name="contact_data[guid]" value="<?php echo $guid; ?>"/>
729
- <input type="hidden" name="submitted" value="submitted"/>
730
- <input type="submit" name="submit" class="cursor-pointer px-4 my-2 py-2 mx-2 ig-es-primary-button" value="<?php _e( 'Save Changes', 'email-subscribers' ); ?>"/>
 
 
 
 
 
 
 
731
  </div>
732
  </div>
733
  </form>
724
 
725
  <div class="flex border-b border-gray-100">
726
  <div class="ml-4 mb-4 pt-6">
727
+ <input type="hidden" name="contact_data[created_at]" value="<?php echo $created; ?>" />
728
+ <input type="hidden" name="contact_data[guid]" value="<?php echo $guid; ?>" />
729
+ <input type="hidden" name="submitted" value="submitted" />
730
+ <input type="submit" name="submit" class="cursor-pointer px-4 my-2 py-2 mx-2 ig-es-primary-button hover:shadow-md" value="<?php if ( $is_new ) {
731
+ _e( 'Save Contact', 'email-subscribers' );
732
+ }
733
+ else{
734
+ _e( 'Save Changes', 'email-subscribers' );
735
+ }
736
+ ?>"/>
737
+ <a href="admin.php?page=es_subscribers" class="cursor-pointer rounded-md border border-indigo-600 hover:shadow-md focus:outline-none focus:shadow-outline-indigo text-sm leading-5 font-medium transition ease-in-out duration-150 px-4 my-2 py-2 mx-2 ">Cancel</a>
738
  </div>
739
  </div>
740
  </form>
lite/includes/classes/class-es-export-subscribers.php CHANGED
@@ -29,19 +29,19 @@ class Export_Subscribers {
29
 
30
  ?>
31
 
32
- <tr>
33
- <th scope="col"><?php _e( 'No.', 'email-subscribers' ); ?></th>
34
- <th scope="col"><?php _e( 'Contacts', 'email-subscribers' ); ?></th>
35
- <th scope="col"><?php _e( 'Total Contacts', 'email-subscribers' ); ?></th>
36
- <th scope="col"><?php _e( 'Export', 'email-subscribers' ); ?></th>
37
- </tr>
38
 
39
  <?php
40
  }
41
 
42
  public function prepare_body() {
43
 
44
- $list_dropdown_html = "<select name='list_id' id='ig_es_export_list_dropdown'>";
45
  $list_dropdown_html .= ES_Common::prepare_list_dropdown_options();
46
  $list_dropdown_html .= "</select>";
47
 
@@ -57,58 +57,72 @@ class Export_Subscribers {
57
 
58
  $i = 1;
59
  foreach ( $export_lists as $key => $export_list ) {
60
- $class = '';
61
  if ( $i % 2 === 0 ) {
62
  $class = 'alternate';
63
- }
64
 
65
  $url = "admin.php?page=download_report&report=users&status={$key}";
66
 
67
  ?>
68
 
69
- <tr class="<?php echo $class; ?>" id="ig_es_export_<?php echo $key; ?>">
70
- <td><?php echo $i; ?></td>
71
- <td><?php _e( $export_list, 'email-subscribers' ); ?></td>
72
- <td class="ig_es_total_contacts"><?php echo $this->count_subscribers( $key ); ?></td>
73
- <td><a href="<?php echo $url; ?>" id="ig_es_export_link_<?php echo $key; ?>"><?php _e( 'Download', 'email-subscribers' ); ?></a></td>
74
- </tr>
75
-
76
- <?php
77
- $i ++;
78
- }
79
-
80
- }
81
 
82
- public function export_subscribers_page() {
 
 
83
 
84
- $audience_tab_main_navigation = array();
85
- $active_tab = 'export';
86
- $audience_tab_main_navigation = apply_filters( 'ig_es_audience_tab_main_navigation', $active_tab, $audience_tab_main_navigation );
87
 
88
- ?>
89
- <div class="wrap">
90
- <h2 style="margin-bottom:1em;">
91
- <?php _e( 'Audience > Export Contacts', 'email-subscribers' );
92
- ES_Common::prepare_main_header_navigation( $audience_tab_main_navigation );
93
- ?>
94
- </h2>
95
- <div class="tool-box">
96
- <form name="frm_es_subscriberexport" method="post">
97
- <table width="100%" class="widefat" id="straymanage">
98
- <thead>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  <?php $this->prepare_header_footer_row(); ?>
100
- </thead>
101
- <tbody>
102
  <?php $this->prepare_body(); ?>
103
- </tbody>
104
- <tfoot>
105
  <?php $this->prepare_header_footer_row(); ?>
106
- </tfoot>
107
- </table>
108
- </form>
109
- </div>
110
- </div>
111
- <?php }
112
 
113
 
114
  /**
@@ -122,29 +136,29 @@ class Export_Subscribers {
122
 
123
  switch ( $status ) {
124
  case 'all':
125
- return ES()->lists_contacts_db->get_all_contacts_count( 0, false );
126
- break;
127
 
128
  case 'subscribed':
129
- return ES()->lists_contacts_db->get_subscribed_contacts_count( 0, false );
130
- break;
131
 
132
  case 'unsubscribed':
133
- return ES()->lists_contacts_db->get_unsubscribed_contacts_count( 0, false );
134
- break;
135
 
136
  case 'confirmed':
137
- return ES()->lists_contacts_db->get_confirmed_contacts_count( 0, false );
138
- break;
139
 
140
  case 'unconfirmed':
141
- return ES()->lists_contacts_db->get_unconfirmed_contacts_count( 0, false );
142
- break;
143
 
144
  case 'select_list':
145
  default:
146
- return '-';
147
- break;
148
  }
149
 
150
  }
@@ -175,15 +189,15 @@ class Export_Subscribers {
175
  public function download_report() {
176
  ?>
177
 
178
- <div class="wrap">
179
- <div id="icon-tools" class="icon32"></div>
180
- <h2>Download Report</h2>
181
- <p>
182
- <a href="?page=download_report&report=users"><?php _e( 'Export the Subscribers', 'email-subscribers' ); ?></a>
183
- </p>
184
 
185
- <?php
186
- }
187
 
188
  /**
189
  * Generate CSV
@@ -451,7 +465,7 @@ class Export_Subscribers {
451
  $error_message = __( 'Unable to generate CSV file. Please try again later.', 'email-subscribers' );
452
  }
453
  } else {
454
- $error_message = $created_file_info['error'];
455
  }
456
  } else {
457
  $error_message = __( 'No data available', 'email-subscribers' );
29
 
30
  ?>
31
 
32
+ <tr class="bg-gray-100 text-xs text-left leading-4 font-medium text-gray-500 uppercase tracking-wider border-b border-t border-gray-200 ">
33
+ <th class="w-1/4 pl-8 py-4" scope="col"><?php _e( 'No.', 'email-subscribers' ); ?></th>
34
+ <th class="w-1/4 py-4" scope="col"><?php _e( 'Contacts', 'email-subscribers' ); ?></th>
35
+ <th class="w-1/4 py-4" scope="col"><?php _e( 'Total Contacts', 'email-subscribers' ); ?></th>
36
+ <th class="w-1/4 pl-8 py-4" scope="col"><?php _e( 'Export', 'email-subscribers' ); ?></th>
37
+ </tr>
38
 
39
  <?php
40
  }
41
 
42
  public function prepare_body() {
43
 
44
+ $list_dropdown_html = "<select class='form-select' name='list_id' id='ig_es_export_list_dropdown'>";
45
  $list_dropdown_html .= ES_Common::prepare_list_dropdown_options();
46
  $list_dropdown_html .= "</select>";
47
 
57
 
58
  $i = 1;
59
  foreach ( $export_lists as $key => $export_list ) {
60
+ /*$class = '';
61
  if ( $i % 2 === 0 ) {
62
  $class = 'alternate';
63
+ }*/
64
 
65
  $url = "admin.php?page=download_report&report=users&status={$key}";
66
 
67
  ?>
68
 
69
+ <tr class="border-b text-sm font-normal text-gray-700 border-gray-200" id="ig_es_export_<?php echo $key; ?>">
70
+ <td class="py-2 pl-10 w-1/4 "><?php echo $i; ?></td>
71
+ <td class="py-2 w-1/4"><?php _e( $export_list, 'email-subscribers' ); ?></td>
72
+ <td class="py-2 w-1/4 font-medium ig_es_total_contacts"><?php echo $this->count_subscribers( $key ); ?></td>
73
+ <td class="py-2 w-1/4">
74
+ <div class="inline-flex pl-10"><a href="<?php echo $url; ?>" id="ig_es_export_link_<?php echo $key; ?>">
75
+ <svg fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" class="w-8 h-8 text-indigo-600 hover:text-indigo-500 active:text-indigo-600"><path d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path>
76
+ </svg>
77
+ </a>
78
+ </div>
79
+ </td>
80
+ </tr>
81
 
82
+ <?php
83
+ $i ++;
84
+ }
85
 
86
+ }
 
 
87
 
88
+ public function export_subscribers_page() {
89
+
90
+ $audience_tab_main_navigation = array();
91
+ $active_tab = 'export';
92
+ $audience_tab_main_navigation = apply_filters( 'ig_es_audience_tab_main_navigation', $active_tab, $audience_tab_main_navigation );
93
+
94
+ ?>
95
+
96
+ <div class="wrap ml-4">
97
+ <header class="wp-heading-inline">
98
+ <div class="mt-2">
99
+ <h2 class="text-xl font-medium text-gray-800 sm:leading-9 sm:truncate"><h1 class="text-xl leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate">
100
+ <span class="text-2xl font-bold leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate"> <a href="admin.php?page=es_subscribers"><?php _e( 'Audience', 'email-subscribers' ); ?> </a> </span> > <?php _e('Export Contacts', 'email-subscribers'); ?>
101
+ <?php
102
+ ES_Common::prepare_main_header_navigation( $audience_tab_main_navigation );
103
+ ?>
104
+ </div>
105
+ </h2>
106
+
107
+ </header>
108
+ <div><hr class="wp-header-end"></div>
109
+ <div class="mt-6 shadow-lg rounded-md overflow-hidden">
110
+ <form name="frm_es_subscriberexport" method="post">
111
+ <table class="min-w-full" id="straymanage">
112
+ <thead>
113
  <?php $this->prepare_header_footer_row(); ?>
114
+ </thead>
115
+ <tbody class="bg-white">
116
  <?php $this->prepare_body(); ?>
117
+ </tbody>
118
+ <tfoot>
119
  <?php $this->prepare_header_footer_row(); ?>
120
+ </tfoot>
121
+ </table>
122
+ </form>
123
+ </div>
124
+ </div>
125
+ <?php }
126
 
127
 
128
  /**
136
 
137
  switch ( $status ) {
138
  case 'all':
139
+ return ES()->lists_contacts_db->get_all_contacts_count( 0, false );
140
+ break;
141
 
142
  case 'subscribed':
143
+ return ES()->lists_contacts_db->get_subscribed_contacts_count( 0, false );
144
+ break;
145
 
146
  case 'unsubscribed':
147
+ return ES()->lists_contacts_db->get_unsubscribed_contacts_count( 0, false );
148
+ break;
149
 
150
  case 'confirmed':
151
+ return ES()->lists_contacts_db->get_confirmed_contacts_count( 0, false );
152
+ break;
153
 
154
  case 'unconfirmed':
155
+ return ES()->lists_contacts_db->get_unconfirmed_contacts_count( 0, false );
156
+ break;
157
 
158
  case 'select_list':
159
  default:
160
+ return '-';
161
+ break;
162
  }
163
 
164
  }
189
  public function download_report() {
190
  ?>
191
 
192
+ <div class="wrap">
193
+ <div id="icon-tools" class="icon32"></div>
194
+ <h2>Download Report</h2>
195
+ <p>
196
+ <a href="?page=download_report&report=users"><?php _e( 'Export the Subscribers', 'email-subscribers' ); ?></a>
197
+ </p>
198
 
199
+ <?php
200
+ }
201
 
202
  /**
203
  * Generate CSV
465
  $error_message = __( 'Unable to generate CSV file. Please try again later.', 'email-subscribers' );
466
  }
467
  } else {
468
+ $error_message = $export_file['error'];
469
  }
470
  } else {
471
  $error_message = __( 'No data available', 'email-subscribers' );
lite/includes/classes/class-es-forms-table.php CHANGED
@@ -461,7 +461,15 @@ class ES_Forms_Table extends WP_List_Table {
461
  <input type="hidden" name="form_data[af_id]" value="<?php echo $form_data['af_id']; ?>"/>
462
  <input type="hidden" name="submitted" value="submitted"/>
463
  <?php if ( count( $lists ) > 0 ) { ?>
464
- <p class="submit"><input type="submit" name="submit" id="ig_es_campaign_post_notification_submit_button" class="cursor-pointer ig-es-primary-button px-4 py-2 mx-6" value="<?php _e( 'Save Changes', 'email-subscribers' ); ?>"/></p>
 
 
 
 
 
 
 
 
465
  <?php } else {
466
  $lists_page_url = admin_url( 'admin.php?page=es_lists' );
467
  $message = __( sprintf( 'List(s) not found. Please create a first list from <a href="%s">here</a>', $lists_page_url ), 'email-subscribers' );
461
  <input type="hidden" name="form_data[af_id]" value="<?php echo $form_data['af_id']; ?>"/>
462
  <input type="hidden" name="submitted" value="submitted"/>
463
  <?php if ( count( $lists ) > 0 ) { ?>
464
+ <p class="submit"><input type="submit" name="submit" id="ig_es_campaign_post_notification_submit_button" class="cursor-pointer ig-es-primary-button px-4 py-2 ml-6 mr-2" value="<?php if ( $is_new ) {
465
+ _e( 'Save Form', 'email-subscribers' );
466
+ }
467
+ else{
468
+ _e( 'Save Changes', 'email-subscribers' );
469
+ }
470
+
471
+ ?>"/>
472
+ <a href="admin.php?page=es_forms" class="cursor-pointer rounded-md border border-indigo-600 hover:shadow-md focus:outline-none focus:shadow-outline-indigo text-sm leading-5 font-medium transition ease-in-out duration-150 px-4 my-2 py-2 mx-2 ">Cancel</a></p>
473
  <?php } else {
474
  $lists_page_url = admin_url( 'admin.php?page=es_lists' );
475
  $message = __( sprintf( 'List(s) not found. Please create a first list from <a href="%s">here</a>', $lists_page_url ), 'email-subscribers' );
lite/includes/classes/class-es-ig-redirect.php CHANGED
@@ -22,6 +22,8 @@ if ( ! class_exists( 'ES_IG_Redirect' ) ) {
22
  $action = ig_es_get_request_data( 'action' );
23
 
24
  $redirect_url = admin_url( 'post-new.php?post_type=ig_campaign' );
 
 
25
  if ( 'create_campaign' === $action ) {
26
  $redirect_url = admin_url( 'edit.php?post_type=ig_campaign' );
27
  $info = __( 'Create Onsite Campaigns Using <a href="https://wordpress.org/plugins/icegram">Icegram</a>', 'email_subscribers' );
@@ -65,12 +67,12 @@ if ( ! class_exists( 'ES_IG_Redirect' ) ) {
65
  <div id="ig-es-create-button" class="relative inline-block text-left">
66
  <div>
67
  <span class="rounded-md shadow-sm">
68
- <a href="<?php echo $ig_install_url ?>"><button type="button" class="inline-flex justify-center w-full rounded-md border border-transparent px-4 py-2 bg-white text-sm leading-5 font-medium text-white bg-indigo-600 hover:bg-indigo-500 focus:outline-none focus:shadow-outline-blue transition ease-in-out duration-150">
69
  <?php
70
  if ( in_array( $icegram_plugin, $inactive_plugins ) ) {
71
- _e( 'Activate Icegram', 'email_subscribers' );
72
  } else {
73
- _e( 'Install Icegram', 'email_subscribers' );
74
  } ?>
75
  </button></a>
76
  </span>
22
  $action = ig_es_get_request_data( 'action' );
23
 
24
  $redirect_url = admin_url( 'post-new.php?post_type=ig_campaign' );
25
+ $ig_activate_url = admin_url( 'plugins.php?plugin_status=inactive' );
26
+
27
  if ( 'create_campaign' === $action ) {
28
  $redirect_url = admin_url( 'edit.php?post_type=ig_campaign' );
29
  $info = __( 'Create Onsite Campaigns Using <a href="https://wordpress.org/plugins/icegram">Icegram</a>', 'email_subscribers' );
67
  <div id="ig-es-create-button" class="relative inline-block text-left">
68
  <div>
69
  <span class="rounded-md shadow-sm">
70
+
71
  <?php
72
  if ( in_array( $icegram_plugin, $inactive_plugins ) ) {
73
+ ?> <a href="<?php echo $ig_activate_url ?>"><button type="button" class="inline-flex justify-center w-full rounded-md border border-transparent px-4 py-2 bg-white text-sm leading-5 font-medium text-white bg-indigo-600 hover:bg-indigo-500 focus:outline-none focus:shadow-outline-blue transition ease-in-out duration-150"> <?php _e( 'Activate Icegram','email_subscribers' );
74
  } else {
75
+ ?> <a href="<?php echo $ig_install_url ?>"><button type="button" class="inline-flex justify-center w-full rounded-md border border-transparent px-4 py-2 bg-white text-sm leading-5 font-medium text-white bg-indigo-600 hover:bg-indigo-500 focus:outline-none focus:shadow-outline-blue transition ease-in-out duration-150"> <?php _e( 'Install Icegram','email_subscribers' );
76
  } ?>
77
  </button></a>
78
  </span>
lite/includes/classes/class-es-import-subscribers.php CHANGED
@@ -36,58 +36,59 @@ class ES_Import_Subscribers {
36
 
37
  ?>
38
 
39
- <div class="tool-box">
40
- <form name="form_addemail" id="form_addemail" method="post" action="#" enctype="multipart/form-data">
41
- <table class="form-table">
42
- <tbody>
43
- <tr>
44
- <th scope="row">
45
- <label for="tag-image"><?php _e( 'Select CSV file', 'email-subscribers' ); ?>
46
- <p class="description">
47
- <?php _e( 'Check CSV structure', 'email-subscribers' ); ?>
48
- <a target="_blank" href="<?php echo plugin_dir_url( __FILE__ ) . '../../admin/partials/sample.csv'; ?>"><?php _e( 'from here', 'email-subscribers' ); ?></a>
49
- </p>
50
- </label>
51
- </th>
52
- <td>
53
- <input type="file" name="file" id="file"/>
54
- </td>
55
- </tr>
56
- <tr>
57
- <th scope="row">
58
- <label for="tag-email-status">
59
- <?php _e( 'Select status', 'email-subscribers' ); ?> <p></p>
60
- </label>
61
- </th>
62
- <td>
63
- <select name="es_email_status" id="es_email_status">
64
- <?php echo ES_Common::prepare_statuses_dropdown_options(); ?>
65
- </select>
66
- </td>
67
- </tr>
68
- <tr>
69
- <th>
70
- <label for="tag-email-group">
71
- <?php _e( 'Select list', 'email-subscribers' ); ?>
72
- </label>
73
- </th>
74
- <td>
75
- <select name="list_id" id="list_id">
76
- <?php echo ES_Common::prepare_list_dropdown_options(); ?>
77
- </select>
78
- </td>
79
- </tr>
80
- </tbody>
81
- </table>
82
- <p style="padding-top:10px;">
83
- <?php wp_nonce_field( 'import-contacts', 'import_contacts' ); ?>
84
- <input type="submit" name="submit" class="button-primary" value=<?php _e( "Import", 'email-subscribers' ); ?>>
85
- </p>
86
- </form>
87
- </div>
88
-
89
- <?php
90
- }
 
91
 
92
  /**
93
  * Show import contacts
@@ -102,18 +103,26 @@ class ES_Import_Subscribers {
102
 
103
  ?>
104
 
105
- <div class="wrap">
106
- <h2> <?php _e( 'Audience > Import Contacts', 'email-subscribers' );
107
-
108
- ES_Common::prepare_main_header_navigation( $audience_tab_main_navigation );
109
- ?>
110
-
111
- </h2>
112
- <?php $this->import_callback(); ?>
113
- </div>
114
-
115
- <?php
116
- }
 
 
 
 
 
 
 
 
117
 
118
  /**
119
  * Start import process after validating sumitted data
@@ -173,20 +182,20 @@ class ES_Import_Subscribers {
173
  $uploaded_file = $_FILES['file'];
174
  $upload_overrides = array( 'test_form' => false );
175
 
176
- if ( ! function_exists( 'wp_handle_upload' ) ) {
177
- require_once( ABSPATH . 'wp-admin/includes/file.php' );
178
- }
179
 
180
- $import_file = wp_handle_upload( $uploaded_file, $upload_overrides );
181
 
182
- if ( $import_file && ! isset( $import_file['error'] ) ) {
183
 
184
- $file_pointer = file( $import_file['file'] );
185
  if ( is_array( $file_pointer ) && ! empty( $file_pointer ) ) {
186
  $total_contacts_to_process = count( $file_pointer ) - 1;
187
 
188
  if( ! empty( $total_contacts_to_process ) ) {
189
- $contact_background_process_data = array(
190
  'action' => 'import_contact',
191
  'contact_status' => $status,
192
  'list_id' => $list_id,
@@ -201,13 +210,13 @@ class ES_Import_Subscribers {
201
 
202
  as_schedule_single_action( time(), 'ig_es_import_contacts_from_csv' );
203
 
 
 
204
  $email_subscribers_import_page = admin_url( 'admin.php?page=es_subscribers&action=import' );
205
- wp_safe_redirect( $email_subscribers_import_page );
206
-
207
- ES()->init_action_scheduler_queue_runner();
208
  exit();
209
  } else {
210
- $message = __( 'There are no contacts to import in the uploaded CSV file. Please add some contacts and try again later..', 'email-subscribers' );
211
  ES_Common::show_message( $message, 'error' );
212
  }
213
 
@@ -216,10 +225,10 @@ class ES_Import_Subscribers {
216
  ES_Common::show_message( $message, 'error' );
217
  }
218
 
219
- } else {
220
- $message = $import_file['error'];
221
  ES_Common::show_message( $message, 'error' );
222
- }
223
  } else {
224
  $message = __( "Error: Please Select List", 'email-subscribers' );
225
  ES_Common::show_message( $message, 'error' );
36
 
37
  ?>
38
 
39
+ <div class="tool-box">
40
+ <div class="meta-box-sortables ui-sortable bg-white shadow-md ml-12 mr-8 mt-6 rounded-lg">
41
+ <form class="ml-5 mr-4 text-left pt-4 mt-2 item-center" method="post" name="form_addemail" id="form_addemail" action="#" enctype="multipart/form-data">
42
+ <table class="max-w-full form-table">
43
+ <tbody>
44
+
45
+ <tr class="border-b border-gray-100">
46
+ <th scope="row" class="w-3/12 pt-3 pb-8 text-left">
47
+ <label for="tag-image"><span class="block ml-6 pr-4 text-sm font-medium text-gray-600 pb-1">
48
+ <?php _e( 'Select CSV file', 'email-subscribers' ); ?></span>
49
+ <p class="italic text-xs font-normal text-gray-400 mt-2 ml-6 leading-snug"><?php _e( 'Check CSV structure', 'email-subscribers' ); ?>
50
+ <a class="font-medium" target="_blank" href="<?php echo plugin_dir_url( __FILE__ ) . '../../admin/partials/sample.csv'; ?>"><?php _e( 'from here', 'email-subscribers' ); ?></a></p></label>
51
+ </th>
52
+ <td class="w-9/12 pb-3 ">
53
+ <input class="ml-12" type="file" name="file" id="file"/>
54
+ </td>
55
+ </tr>
56
+ <tr class="border-b border-gray-100">
57
+ <th scope="row" class="w-3/12 pt-3 pb-8 text-left">
58
+ <label for="tag-email-status"><span class="block ml-6 pr-4 text-sm font-medium text-gray-600 pb-2">
59
+ <?php _e( 'Select status', 'email-subscribers' ); ?> </span><p></p>
60
+ </label>
61
+ </th>
62
+ <td class="w-9/12 pb-3">
63
+ <select class="relative form-select shadow-sm border border-gray-400 w-1/3 ml-12" name="es_email_status" id="es_email_status">
64
+ <?php echo ES_Common::prepare_statuses_dropdown_options(); ?>
65
+ </select>
66
+ </td>
67
+ </tr>
68
+ <tr class="border-b border-gray-100">
69
+ <th scope="row" class="w-3/12 pt-3 pb-8 text-left">
70
+ <label for="tag-email-group"><span class="block ml-6 pr-4 text-sm font-medium text-gray-600 pb-2">
71
+ <?php _e( 'Select list', 'email-subscribers' ); ?>
72
+ </label>
73
+ </th>
74
+ <td class="w-9/12 pb-3">
75
+ <select class="relative form-select shadow-sm border border-gray-400 w-1/3 ml-12"
76
+ <select name="list_id" id="list_id">
77
+ <?php echo ES_Common::prepare_list_dropdown_options(); ?>
78
+ </select>
79
+ </td>
80
+ </tr>
81
+ </tbody>
82
+ </table>
83
+ <p style="padding-top:10px;">
84
+ <?php wp_nonce_field( 'import-contacts', 'import_contacts' ); ?>
85
+ <input type="submit" name="submit" class="cursor-pointer ig-es-primary-button px-4 py-2 ml-6 mr-2 my-4" value="<?php _e( "Import", 'email-subscribers' ); ?>" />
86
+ </p>
87
+ </form>
88
+ </div>
89
+
90
+ <?php
91
+ }
92
 
93
  /**
94
  * Show import contacts
103
 
104
  ?>
105
 
106
+ <div class="wrap max-w-full mt-1 font-sans">
107
+ <header class="ml-12 wp-heading-inline">
108
+
109
+ <div class="mt-2">
110
+ <h2 class="text-xl font-medium text-gray-800 sm:leading-9 sm:truncate"><h1 class="text-xl leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate">
111
+ <span class="text-2xl font-bold leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate"> <a href="admin.php?page=es_subscribers"><?php _e( 'Audience', 'email-subscribers' ); ?> </a> </span> > <?php _e('Import Contacts', 'email-subscribers'); ?>
112
+ <?php
113
+ ES_Common::prepare_main_header_navigation( $audience_tab_main_navigation );
114
+ ?>
115
+ </div>
116
+ </h2>
117
+
118
+ </header>
119
+
120
+ <div class="ml-12 mr-8"><hr class="wp-header-end"></div>
121
+ <?php $this->import_callback(); ?>
122
+ </div>
123
+
124
+ <?php
125
+ }
126
 
127
  /**
128
  * Start import process after validating sumitted data
182
  $uploaded_file = $_FILES['file'];
183
  $upload_overrides = array( 'test_form' => false );
184
 
185
+ if ( ! function_exists( 'wp_handle_upload' ) ) {
186
+ require_once( ABSPATH . 'wp-admin/includes/file.php' );
187
+ }
188
 
189
+ $import_file = wp_handle_upload( $uploaded_file, $upload_overrides );
190
 
191
+ if ( $import_file && ! isset( $import_file['error'] ) ) {
192
 
193
+ $file_pointer = file( $import_file['file'] );
194
  if ( is_array( $file_pointer ) && ! empty( $file_pointer ) ) {
195
  $total_contacts_to_process = count( $file_pointer ) - 1;
196
 
197
  if( ! empty( $total_contacts_to_process ) ) {
198
+ $contact_background_process_data = array(
199
  'action' => 'import_contact',
200
  'contact_status' => $status,
201
  'list_id' => $list_id,
210
 
211
  as_schedule_single_action( time(), 'ig_es_import_contacts_from_csv' );
212
 
213
+ ES()->init_action_scheduler_queue_runner();
214
+
215
  $email_subscribers_import_page = admin_url( 'admin.php?page=es_subscribers&action=import' );
216
+ wp_safe_redirect( $email_subscribers_import_page );
 
 
217
  exit();
218
  } else {
219
+ $message = __( 'There are no contacts to import in the uploaded CSV file. Please add some contacts and try again later.', 'email-subscribers' );
220
  ES_Common::show_message( $message, 'error' );
221
  }
222
 
225
  ES_Common::show_message( $message, 'error' );
226
  }
227
 
228
+ } else {
229
+ $message = $import_file['error'];
230
  ES_Common::show_message( $message, 'error' );
231
+ }
232
  } else {
233
  $message = __( "Error: Please Select List", 'email-subscribers' );
234
  ES_Common::show_message( $message, 'error' );
lite/includes/classes/class-es-lists-table.php CHANGED
@@ -72,11 +72,11 @@ class ES_Lists_Table extends WP_List_Table {
72
  $list = ig_es_get_request_data( 'list' );
73
  echo $this->edit_list( absint( $list ) );
74
  } else { ?>
75
-
76
- <h1 class="wp-heading-inline text-xl leading-7 font-bold text-gray-900 sm:text-3xl sm:leading-9 sm:truncate">
77
- <span class="text-2xl font-bold leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate"><a href="admin.php?page=es_subscribers"><?php _e( 'Audience', 'email-subscribers' ); ?> </a>
78
- </span> > <?php _e('Lists', 'email-subscribers'); ?> <a href="admin.php?page=es_lists&action=new" class="ig-es-title-button px-1 pt-2 pb-1 mx-1 "><?php _e('Add New','email-subscribers'); ?></a></h1>
79
-
80
  <div id="poststuff">
81
  <div id="post-body" class="metabox-holder column-1">
82
  <div id="post-body-content">
@@ -250,60 +250,68 @@ class ES_Lists_Table extends WP_List_Table {
250
  <div class="md:flex md:items-center md:justify-between justify-center">
251
  <div class="flex-1 min-w-0">
252
  <h1 class="text-xl leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate">
253
- <span class="text-2xl font-bold leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate">
254
- <a href="admin.php?page=es_subscribers"><?php _e('Audience ','email-subscribers'); ?></a></span> >
255
- <a href="admin.php?page=es_lists&action=manage-lists"><?php _e(' Lists ','email-subscribers'); ?></a> >
256
- <?php
257
- if ( $is_new ) {
258
- _e( 'Add New', 'email-subscribers' );
259
- } else {
260
- _e( 'Edit List', 'email-subscribers' );
261
- }
262
-
263
- ?>
264
- </h2>
 
265
  </div>
266
- </div>
267
- </header>
268
- <div class="ml-12 mr-8"><hr class="wp-header-end"></div>
269
- <div class="rounded max-w-full ">
270
- <div id="poststuff">
271
- <div id="post-body" class="metabox-holder column-1">
272
- <div id="post-body-content">
273
- <div class="meta-box-sortables ui-sortable bg-white shadow-md ml-12 mr-8 mt-4 rounded-lg">
274
- <form class="ml-5 mr-4 text-left pt-8 flex-row mt-2 item-center " method="post" action="admin.php?page=es_lists&action=<?php echo $action; ?>&list=<?php echo $id; ?>&_wpnonce=<?php echo $nonce; ?>">
275
-
276
- <div class="flex flex-row ">
277
- <div class="flex w-1/5">
278
- <div class="ml-4 pt-6 px-3 ">
279
- <label for="name" class="block text-sm leading-5 font-medium text-gray-600"><?php _e( 'List Name', 'email-subscribers' ); ?></label>
280
  </div>
281
- </div>
282
- <div class="flex">
283
- <div class="ml-16 mb-4 h-10 mr-4 mt-4">
284
- <div class="h-10 relative">
285
 
286
- <input class="form-input block border-gray-400 w-full pl-3 pr-12 focus:bg-gray-100 sm:text-sm sm:leading-5" placeholder="Enter list name" id="name" name="list_name" value="<?php echo esc_attr( $list_name ); ?>"/>
 
287
  </div>
288
  </div>
289
  </div>
290
- </div>
291
 
292
- <input type="hidden" name="submitted" value="submitted"/>
293
- <input type="submit" name="submit" id="submit" class="cursor-pointer ig-es-primary-button px-4 py-2 my-4 mx-6" value="<?php _e( 'Save Changes', 'email-subscribers' ); ?>"/><!-- <?php submit_button(); ?> -->
294
- </form>
 
 
 
 
 
 
 
 
 
295
  </div>
296
  </div>
 
 
297
  </div>
298
 
299
- <br class="clear">
300
  </div>
301
 
302
- </div>
303
-
304
- <?php
305
 
306
- }
307
 
308
  /**
309
  * Save list
@@ -468,7 +476,7 @@ class ES_Lists_Table extends WP_List_Table {
468
  break;
469
 
470
  case 'export':
471
- return "<a href='admin.php?page=download_report&report=users&status=select_list&list_id={$item['id']}'>" . __( 'Download', 'email-subscribers' ) . '</a>';
472
  default:
473
  return '';
474
  }
72
  $list = ig_es_get_request_data( 'list' );
73
  echo $this->edit_list( absint( $list ) );
74
  } else { ?>
75
+
76
+ <h1 class=" wp-heading-inline"><span class="text-2xl font-bold leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate"><?php _e( 'Audience', 'email-subscribers' ); ?> </a>
77
+ </span> > <?php _e('Lists', 'email-subscribers'); ?> <a href="admin.php?page=es_lists&action=new" class="pt-2 ig-es-title-button px-2 py-2 mx-2"><?php _e('Add New','email-subscribers'); ?></a></h1>
78
+ <br>
79
+
80
  <div id="poststuff">
81
  <div id="post-body" class="metabox-holder column-1">
82
  <div id="post-body-content">
250
  <div class="md:flex md:items-center md:justify-between justify-center">
251
  <div class="flex-1 min-w-0">
252
  <h1 class="text-xl leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate">
253
+ <span class="text-2xl font-bold leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate">
254
+ <a href="admin.php?page=es_subscribers"><?php _e('Audience ','email-subscribers'); ?></a></span> >
255
+ <a href="admin.php?page=es_lists&action=manage-lists"><?php _e(' Lists ','email-subscribers'); ?></a> >
256
+ <?php
257
+ if ( $is_new ) {
258
+ _e( 'Add New', 'email-subscribers' );
259
+ } else {
260
+ _e( 'Edit List', 'email-subscribers' );
261
+ }
262
+
263
+ ?>
264
+ </h1>
265
+ </div>
266
  </div>
267
+ </header>
268
+ <div class="ml-12 mr-8"><hr class="wp-header-end"></div>
269
+ <div class="rounded max-w-full ">
270
+ <div id="poststuff">
271
+ <div id="post-body" class="metabox-holder column-1">
272
+ <div id="post-body-content">
273
+ <div class="meta-box-sortables ui-sortable bg-white shadow-md ml-12 mr-8 mt-4 rounded-lg">
274
+ <form class="ml-5 mr-4 text-left pt-8 flex-row mt-2 item-center " method="post" action="admin.php?page=es_lists&action=<?php echo $action; ?>&list=<?php echo $id; ?>&_wpnonce=<?php echo $nonce; ?>">
275
+
276
+ <div class="flex flex-row ">
277
+ <div class="flex w-1/5">
278
+ <div class="ml-4 pt-6 px-3 ">
279
+ <label for="name" class="block text-sm leading-5 font-medium text-gray-600"><?php _e( 'List Name', 'email-subscribers' ); ?></label>
280
+ </div>
281
  </div>
282
+ <div class="flex">
283
+ <div class="ml-16 mb-4 h-10 mr-4 mt-4">
284
+ <div class="h-10 relative">
 
285
 
286
+ <input class="form-input block border-gray-400 w-full pl-3 pr-12 focus:bg-gray-100 sm:text-sm sm:leading-5" placeholder="Enter list name" id="name" name="list_name" value="<?php echo esc_attr( $list_name ); ?>"/>
287
+ </div>
288
  </div>
289
  </div>
290
  </div>
 
291
 
292
+ <input type="hidden" name="submitted" value="submitted"/>
293
+ <input type="submit" name="submit" id="submit" class="cursor-pointer ig-es-primary-button px-4 py-2 my-4 ml-6 mr-2" value="<?php if ( $is_new ) {
294
+ _e( 'Save List', 'email-subscribers' );
295
+ }
296
+ else{
297
+ _e( 'Save Changes', 'email-subscribers' );
298
+ }
299
+
300
+ ?>"/><!-- <?php submit_button(); ?> -->
301
+ <a href="admin.php?page=es_lists&action=manage-lists" class="cursor-pointer rounded-md border border-indigo-600 hover:shadow-md focus:outline-none focus:shadow-outline-indigo text-sm leading-5 font-medium transition ease-in-out duration-150 px-4 my-2 py-2 mx-2 ">Cancel</a>
302
+ </form>
303
+ </div>
304
  </div>
305
  </div>
306
+
307
+ <br class="clear">
308
  </div>
309
 
 
310
  </div>
311
 
312
+ <?php
 
 
313
 
314
+ }
315
 
316
  /**
317
  * Save list
476
  break;
477
 
478
  case 'export':
479
+ return "<a href='admin.php?page=download_report&report=users&status=select_list&list_id={$item['id']}'><svg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24' class='w-8 h-8 text-indigo-600 hover:text-indigo-500 active:text-indigo-600'><path d='M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z'></path></svg></a>";
480
  default:
481
  return '';
482
  }
lite/includes/classes/class-es-post-notifications.php CHANGED
@@ -363,7 +363,15 @@ class ES_Post_Notifications_Table {
363
  </tbody>
364
  </table>
365
  <div>
366
- <p class="submit"><input type="submit" name="submit" id="ig_es_campaign_post_notification_submit_button" class="cursor-pointer ig-es-primary-button px-4 py-2 mx-6" value="<?php _e( 'Save Changes', 'email-subscribers' ); ?>"/></p>
 
 
 
 
 
 
 
 
367
  </div>
368
 
369
  </form>
363
  </tbody>
364
  </table>
365
  <div>
366
+ <p class="submit"><input type="submit" name="submit" id="ig_es_campaign_post_notification_submit_button" class="cursor-pointer ig-es-primary-button px-4 py-2 ml-6 mr-2" value="<?php if ( $is_new ) {
367
+ _e( 'Save Campaign', 'email-subscribers' );
368
+ }
369
+ else{
370
+ _e( 'Save Changes', 'email-subscribers' );
371
+ }
372
+
373
+ ?>"/>
374
+ <a href="admin.php?page=es_campaigns" class="cursor-pointer rounded-md border border-indigo-600 hover:shadow-md focus:outline-none focus:shadow-outline-indigo text-sm leading-5 font-medium transition ease-in-out duration-150 px-4 my-2 py-2 mx-2 ">Cancel</a></p>
375
  </div>
376
 
377
  </form>
lite/includes/feedback/class-ig-feedback.php CHANGED
@@ -4,21 +4,21 @@ if ( ! defined( 'ABSPATH' ) ) {
4
  exit; // Exit if accessed directly.
5
  }
6
 
7
- if ( ! class_exists( 'IG_Feedback_V_1_2_1' ) ) {
8
  /**
9
  * IG Feedback
10
  *
11
  * The IG Feedback class adds functionality to get quick interactive feedback from users.
12
  * There are different types of feedabck widget like Stars, Emoji, Thubms Up/ Down, Number etc.
13
  *
14
- * @class IG_Feedback_V_1_2_1
15
  * @since 1.0.0
16
  * @copyright Copyright (c) 2019, Icegram
17
  * @license https://opensource.org/licenses/gpl-license GNU Public License
18
  * @author Icegram
19
  * @package feedback
20
  */
21
- class IG_Feedback_V_1_2_1 {
22
 
23
  /**
24
  * Version of Feedback Library
@@ -27,7 +27,7 @@ if ( ! class_exists( 'IG_Feedback_V_1_2_1' ) ) {
27
  * @var string
28
  *
29
  */
30
- public $version = '1.2.1';
31
  /**
32
  * The API URL where we will send feedback data.
33
  *
4
  exit; // Exit if accessed directly.
5
  }
6
 
7
+ if ( ! class_exists( 'IG_Feedback_V_1_2_2' ) ) {
8
  /**
9
  * IG Feedback
10
  *
11
  * The IG Feedback class adds functionality to get quick interactive feedback from users.
12
  * There are different types of feedabck widget like Stars, Emoji, Thubms Up/ Down, Number etc.
13
  *
14
+ * @class IG_Feedback_V_1_2_2
15
  * @since 1.0.0
16
  * @copyright Copyright (c) 2019, Icegram
17
  * @license https://opensource.org/licenses/gpl-license GNU Public License
18
  * @author Icegram
19
  * @package feedback
20
  */
21
+ class IG_Feedback_V_1_2_2 {
22
 
23
  /**
24
  * Version of Feedback Library
27
  * @var string
28
  *
29
  */
30
+ public $version = '1.2.2';
31
  /**
32
  * The API URL where we will send feedback data.
33
  *
lite/includes/feedback/class-ig-tracker.php CHANGED
@@ -4,15 +4,15 @@ if ( ! defined( 'ABSPATH' ) ) {
4
  exit; // Exit if accessed directly.
5
  }
6
 
7
- if ( ! class_exists( 'IG_Tracker_V_1_2_1' ) ) {
8
 
9
  /**
10
- * Class IG_Tracker_V_1_2_1
11
  *
12
  * Icegram tracker handler class is responsible for sending anonymous plugin
13
  * data to Icegram servers for users that actively allowed data tracking.
14
  *
15
- * @class IG_Tracker_V_1_2_1
16
  * @since 1.0.0
17
  *
18
  * @copyright Copyright (c) 2019, Icegram
@@ -20,7 +20,7 @@ if ( ! class_exists( 'IG_Tracker_V_1_2_1' ) ) {
20
  * @author Icegram
21
  * @package feedback
22
  */
23
- class IG_Tracker_V_1_2_1 {
24
 
25
  /**
26
  * Get Active, Inactive or all plugins info
@@ -112,6 +112,60 @@ if ( ! class_exists( 'IG_Tracker_V_1_2_1' ) ) {
112
  return self::get_plugins( 'inactive', $details );
113
  }
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  /**
116
  * Get Current Theme Info
117
  *
4
  exit; // Exit if accessed directly.
5
  }
6
 
7
+ if ( ! class_exists( 'IG_Tracker_V_1_2_2' ) ) {
8
 
9
  /**
10
+ * Class IG_Tracker_V_1_2_2
11
  *
12
  * Icegram tracker handler class is responsible for sending anonymous plugin
13
  * data to Icegram servers for users that actively allowed data tracking.
14
  *
15
+ * @class IG_Tracker_V_1_2_2
16
  * @since 1.0.0
17
  *
18
  * @copyright Copyright (c) 2019, Icegram
20
  * @author Icegram
21
  * @package feedback
22
  */
23
+ class IG_Tracker_V_1_2_2 {
24
 
25
  /**
26
  * Get Active, Inactive or all plugins info
112
  return self::get_plugins( 'inactive', $details );
113
  }
114
 
115
+ /**
116
+ * Check whether plugin is active or not.
117
+ *
118
+ * @param string $plugin
119
+ *
120
+ * @return bool
121
+ *
122
+ * @since 1.2.2
123
+ */
124
+ public static function is_plugin_activated( $plugin = '' ) {
125
+ if ( empty( $plugin ) ) {
126
+ return false;
127
+ }
128
+
129
+ $active_plugins = self::get_active_plugins();
130
+
131
+ if ( count( $active_plugins ) == 0 ) {
132
+ return false;
133
+ }
134
+
135
+ if ( in_array( $plugin, $active_plugins ) ) {
136
+ return true;
137
+ }
138
+
139
+ return false;
140
+ }
141
+
142
+ /**
143
+ * Is plugin installed?
144
+ *
145
+ * @param string $plugin
146
+ *
147
+ * @return bool
148
+ *
149
+ * @since 1.2.2
150
+ */
151
+ public static function is_plugin_installed( $plugin = '' ) {
152
+ if ( empty( $plugin ) ) {
153
+ return false;
154
+ }
155
+
156
+ $all_plugins = self::get_plugins();
157
+
158
+ if ( count( $all_plugins ) == 0 ) {
159
+ return false;
160
+ }
161
+
162
+ if ( in_array( $plugin, $all_plugins ) ) {
163
+ return true;
164
+ }
165
+
166
+ return false;
167
+ }
168
+
169
  /**
170
  * Get Current Theme Info
171
  *
lite/includes/notices/views/ig-es-offer.php CHANGED
@@ -6,9 +6,6 @@
6
  padding-top: 1.2em;
7
  }
8
 
9
- .ig_es_offer img {
10
- /*width: 100%;*/
11
- }
12
  </style>
13
  <?php
14
 
@@ -17,4 +14,4 @@ if ( ( get_option( 'ig_es_offer_covid_19' ) !== 'yes' ) && ( $ig_current_date >=
17
  <a target="_blank" href="?es_dismiss_admin_notice=1&option_name=offer_covid_19"><img src="<?php echo ES_PLUGIN_URL ?>/lite/admin/images/covid-19.png"/></a>
18
  </div>
19
 
20
- <?php } ?>
6
  padding-top: 1.2em;
7
  }
8
 
 
 
 
9
  </style>
10
  <?php
11
 
14
  <a target="_blank" href="?es_dismiss_admin_notice=1&option_name=offer_covid_19"><img src="<?php echo ES_PLUGIN_URL ?>/lite/admin/images/covid-19.png"/></a>
15
  </div>
16
 
17
+ <?php } ?>
lite/includes/pro-features.php CHANGED
@@ -1,6 +1,8 @@
1
  <?php
2
 
 
3
  add_filter( 'ig_es_registered_settings', 'ig_es_add_upsale', 10, 2 );
 
4
 
5
  // Add additional tab "Comments" in Audience > Sync
6
  add_filter( 'ig_es_sync_users_tabs', 'ig_es_add_sync_users_tabs', 11, 1 );
@@ -13,32 +15,197 @@ add_action( 'ig_es_sync_users_tabs_wpforms', 'ig_es_add_wpforms_tab_settings' );
13
  add_action( 'ig_es_sync_users_tabs_ninja_forms', 'ig_es_add_ninja_forms_tab_settings' );
14
  add_action( 'ig_es_sync_users_tabs_edd', 'ig_es_add_edd_tab_settings' );
15
 
16
-
17
  add_action( 'edit_form_advanced', 'add_spam_score_utm_link' );
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  function ig_es_add_upsale( $fields ) {
20
- global $ig_es_tracker;
21
 
22
-
23
- if ( ! ES()->is_starter() ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
- // Security settings
26
- $field_security['es_upsale_security'] = array(
27
- 'id' => 'ig_es_blocked_domains',
28
- 'type' => 'html',
29
- 'name' => '',
30
- 'html' => '<div class="es-upsale-image" style=""><a target="_blank" href="https://www.icegram.com/managed-blacklists-captcha/?utm_source=in_app&utm_medium=es_security_settings&utm_campaign=es_upsale#blockspam"><img src="' . ES_PLUGIN_URL . 'lite/admin/images/es-captcha-2.png' . '"/></a></div>'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  );
32
- $fields['security_settings'] = array_merge( $fields['security_settings'], $field_security );
33
-
34
- // SMTP settings
35
- $field_smtp['es_upsale_smtp'] = array(
36
- 'id' => 'ig_es_blocked_domains',
37
- 'type' => 'html',
38
- 'name' => '<div class="es-smtp-label" style=""><a target="_blank" href="https://www.icegram.com/solid-email-delivery/?utm_source=in_app&utm_medium=es_smtp&utm_campaign=es_upsale#delivery"><img src="' . ES_PLUGIN_URL . 'lite/admin/images/es-smtp-label.png' . '"/></a></div>',
39
- 'html' => '<div class="es-upsale-image es-smtp-image" style=""><a target="_blank" href="https://www.icegram.com/email-subscribers-starter/?utm_source=in_app&utm_medium=es_smtp&utm_campaign=es_upsale"><img src="' . ES_PLUGIN_URL . 'lite/admin/images/es-smtp.png' . '"/></a></div>'
 
 
40
  );
41
- $fields['email_sending'] = array_merge( $fields['email_sending'], $field_smtp );
42
 
43
  }
44
 
@@ -106,7 +273,7 @@ function ig_es_add_sync_users_tabs( $tabs ) {
106
  'indicator_label' => 'Starter'
107
  );
108
  }
109
-
110
  // Show only if EDD is installed & activated
111
  $edd_plugin = 'easy-digital-downloads/easy-digital-downloads.php';
112
  if ( in_array( $edd_plugin, $active_plugins ) ) {
@@ -358,7 +525,7 @@ function add_spam_score_utm_link() {
358
  if ( $post->post_type !== 'es_template' ) {
359
  return;
360
  }
361
-
362
  if ( ! ES()->is_starter() ) {
363
  ?>
364
  <script>
1
  <?php
2
 
3
+ add_filter( 'ig_es_settings_tabs', 'ig_es_add_settings_tabs', 10, 1 );
4
  add_filter( 'ig_es_registered_settings', 'ig_es_add_upsale', 10, 2 );
5
+ add_filter( 'ig_es_mailers', 'ig_es_mailers_promo', 10, 1 );
6
 
7
  // Add additional tab "Comments" in Audience > Sync
8
  add_filter( 'ig_es_sync_users_tabs', 'ig_es_add_sync_users_tabs', 11, 1 );
15
  add_action( 'ig_es_sync_users_tabs_ninja_forms', 'ig_es_add_ninja_forms_tab_settings' );
16
  add_action( 'ig_es_sync_users_tabs_edd', 'ig_es_add_edd_tab_settings' );
17
 
 
18
  add_action( 'edit_form_advanced', 'add_spam_score_utm_link' );
19
 
20
+ /**
21
+ * Promote SMTP mailer for free
22
+ *
23
+ * @param $mailers
24
+ *
25
+ * @return mixed
26
+ *
27
+ * @since 4.4.5
28
+ */
29
+ function ig_es_mailers_promo( $mailers ) {
30
+
31
+ if ( ! ES()->is_premium() ) {
32
+
33
+ $mailers['smtp'] = array(
34
+ 'name' => 'SMTP',
35
+ 'logo' => ES_PLUGIN_URL . 'lite/admin/images/smtp.png',
36
+ 'is_premium' => true,
37
+ 'url' => ES_Common::get_utm_tracking_url( array( 'utm_medium' => 'smtp_mailer' )
38
+ )
39
+ );
40
+
41
+ }
42
+
43
+ return $mailers;
44
+ }
45
+
46
+ /**
47
+ * Promote User Permission Settings
48
+ *
49
+ * @return false|string
50
+ *
51
+ * @since 4.4.5
52
+ */
53
+ function render_user_permissions_settings_fields_premium() {
54
+ $wp_roles = new WP_Roles();
55
+ $roles = $wp_roles->get_names();
56
+ $user_roles = array();
57
+
58
+ $url = ES_Common::get_utm_tracking_url( array( 'utm_medium' => 'user_roles' ) );
59
+
60
+ ob_start();
61
+ ?>
62
+
63
+ <div class="text-center py-4 lg:px-4 my-8">
64
+ <div class="p-2 bg-indigo-800 items-center text-indigo-100 leading-none lg:rounded-full flex lg:inline-flex mx-4 leading-normal" role="alert">
65
+ <span class="font-semibold text-left flex-auto">
66
+ Customize user roles permissions with <a href="<?php echo $url; ?>" target="_blank" class="text-indigo-400">Email Subscribers PRO</a>
67
+ </span>
68
+ </div>
69
+ </div>
70
+
71
+
72
+ <table class="min-w-full rounded-lg">
73
+ <thead>
74
+ <tr class="bg-gray-100 text-xs leading-4 font-medium text-gray-500 uppercase tracking-wider">
75
+ <th class="px-5 py-4"><?php _e( 'Roles', 'email-subscribers' ); ?></th>
76
+ <th class="px-2 py-4 text-center"><?php _e( 'Audience', 'email-subscribers' ); ?></th>
77
+ <th class="px-2 py-4 text-center"><?php _e( 'Forms', 'email-subscribers' ); ?></th>
78
+ <th class="px-2 py-4 text-center"><?php _e( 'Campaigns', 'email-subscribers' ); ?></th>
79
+ <th class="px-2 py-4 text-center"><?php _e( 'Reports', 'email-subscribers' ); ?></th>
80
+ <th class="px-2 py-4 text-center"><?php _e( 'Sequences', 'email-subscribers' ); ?></th>
81
+ <th class="px-2 py-4 text-center"><?php _e( 'Workflows', 'email-subscribers' ); ?></th>
82
+ </tr>
83
+ </thead>
84
+ <tbody class="bg-white">
85
+ <?php foreach ( $roles as $key => $value ) {
86
+ ?>
87
+ <tr class="border-b border-gray-200">
88
+ <td class="pl-8 py-4 ">
89
+ <div class="flex items-center">
90
+ <div class="flex-shrink-0">
91
+ <span class="text-sm leading-5 font-medium text-center text-gray-800"><?php echo $value; ?></span>
92
+ </div>
93
+ </div>
94
+ </td>
95
+ <td class="whitespace-no-wrap text-center">
96
+ <input type="checkbox" name="" disabled <?php ! empty( $user_roles['audience'][ $key ] ) ? checked( 'yes', $user_roles['audience'][ $key ] ) : '' ?> value="yes" class=" form-checkbox text-indigo-600">
97
+ </td>
98
+ <td class="whitespace-no-wrap text-center">
99
+ <input type="checkbox" name="" disabled<?php ! empty( $user_roles['forms'][ $key ] ) ? checked( 'yes', $user_roles['forms'][ $key ] ) : '' ?> value="yes" class=" form-checkbox text-indigo-600">
100
+ </td>
101
+ <td class="whitespace-no-wrap text-center">
102
+ <input type="checkbox" name="" disabled <?php ! empty( $user_roles['campaigns'][ $key ] ) ? checked( 'yes', $user_roles['campaigns'][ $key ] ) : '' ?> value="yes" class=" form-checkbox text-indigo-600">
103
+ </td>
104
+ <td class="whitespace-no-wrap text-center">
105
+ <input type="checkbox" name="" disabled <?php ! empty( $user_roles['reports'][ $key ] ) ? checked( 'yes', $user_roles['reports'][ $key ] ) : '' ?> value="yes" class=" form-checkbox text-indigo-600">
106
+ </td>
107
+ <td class="whitespace-no-wrap text-center">
108
+ <input type="checkbox" name="" disabled <?php ! empty( $user_roles['sequences'][ $key ] ) ? checked( 'yes', $user_roles['sequences'][ $key ] ) : '' ?> value="yes" class=" form-checkbox text-indigo-600">
109
+ </td>
110
+ <td class="whitespace-no-wrap text-center">
111
+ <input type="checkbox" name="" disabled <?php ! empty( $user_roles['workflows'][ $key ] ) ? checked( 'yes', $user_roles['workflows'][ $key ] ) : '' ?> value="yes" class=" form-checkbox text-indigo-600">
112
+ </td>
113
+ </tr>
114
+ <?php
115
+ }
116
+ ?>
117
+ </tbody>
118
+ </table>
119
+
120
+
121
+ <?php
122
+ $html = ob_get_clean();
123
+
124
+ return $html;
125
+ }
126
+
127
+ /**
128
+ * @param $es_settings_tabs
129
+ *
130
+ * @return mixed
131
+ */
132
+ function ig_es_add_settings_tabs( $es_settings_tabs ) {
133
+
134
+ if ( ! ES()->is_premium() ) {
135
+ $es_settings_tabs['user_roles'] = array( 'icon' => 'groups', 'name' => __( 'User Roles', 'email-subscribers' ) );
136
+ }
137
+
138
+ return $es_settings_tabs;
139
+ }
140
+
141
  function ig_es_add_upsale( $fields ) {
 
142
 
143
+ if ( ! ES()->is_premium() ) {
144
+
145
+ // General Settings
146
+ $track_link_click = array(
147
+ 'ig_es_track_link_click' => array(
148
+ 'id' => 'ig_es_track_link_click_p',
149
+ 'name' => __( 'Track Clicks', 'email-subscribers' ),
150
+ 'type' => 'checkbox',
151
+ 'default' => 'no',
152
+ 'is_premium' => true,
153
+ 'link' => ES_Common::get_utm_tracking_url( array( 'utm_medium' => 'track_clicks' ) ),
154
+ 'disabled' => true
155
+ )
156
+ );
157
+
158
+ $general_fields = $fields['general'];
159
 
160
+ $general_fields = ig_es_array_insert_after( $general_fields, 'ig_es_track_email_opens', $track_link_click );
161
+
162
+ $fields['general'] = $general_fields;
163
+
164
+ // Security Settings
165
+ $fake_domains['ig_es_enable_known_attackers_domains'] = array(
166
+ 'id' => 'ig_es_enable_known_attackers_domains_p',
167
+ 'name' => __( 'Block Known Attackers', 'email-subscribers' ),
168
+ 'info' => __( 'Stop known spam bot attacker domains from signing up. Keeps this list up-to-date with Icegram servers.', 'email-subscribers' ),
169
+ 'type' => 'checkbox',
170
+ 'default' => 'no',
171
+ 'is_premium' => true,
172
+ 'link' => ES_Common::get_utm_tracking_url( array( 'utm_medium' => 'known_attackers' ) ),
173
+ 'disabled' => true,
174
+ );
175
+
176
+ $managed_blocked_domains['ig_es_enable_disposable_domains'] = array(
177
+ 'id' => 'ig_es_enable_disposable_domains_p',
178
+ 'name' => __( 'Block Temporary / Fake Emails', 'email-subscribers' ),
179
+ 'info' => __( 'Plenty of sites provide disposable / fake / temporary email addresses. People use them when they don\'t want to give you their real email. Block these to keep your list clean. Automatically updated.', 'email-subscribers' ),
180
+ 'type' => 'checkbox',
181
+ 'default' => 'no',
182
+ 'is_premium' => true,
183
+ 'link' => ES_Common::get_utm_tracking_url( array( 'utm_medium' => 'disposable_domains' ) ),
184
+ 'disabled' => true,
185
+ );
186
+
187
+ //add captcha setting
188
+ $field_captcha['enable_captcha'] = array(
189
+ 'id' => 'ig_es_enable_captcha_p',
190
+ 'name' => __( 'Enable Captcha', 'email-subscribers' ),
191
+ 'info' => __( 'Show a captcha in subscription forms to protect from bot signups.', 'email-subscribers' ),
192
+ 'type' => 'checkbox',
193
+ 'default' => 'no',
194
+ 'is_premium' => true,
195
+ 'link' => ES_Common::get_utm_tracking_url( array( 'utm_medium' => 'enable_captcha' ) ),
196
+ 'disabled' => true,
197
  );
198
+
199
+ $fields['security_settings'] = array_merge( $fields['security_settings'], $fake_domains, $managed_blocked_domains, $field_captcha );
200
+
201
+ $fields['user_roles'] = array(
202
+ 'ig_es_user_roles' => array(
203
+ 'id' => 'ig_es_user_roles',
204
+ 'name' => '',
205
+ 'type' => 'html',
206
+ 'html' => render_user_permissions_settings_fields_premium()
207
+ )
208
  );
 
209
 
210
  }
211
 
273
  'indicator_label' => 'Starter'
274
  );
275
  }
276
+
277
  // Show only if EDD is installed & activated
278
  $edd_plugin = 'easy-digital-downloads/easy-digital-downloads.php';
279
  if ( in_array( $edd_plugin, $active_plugins ) ) {
525
  if ( $post->post_type !== 'es_template' ) {
526
  return;
527
  }
528
+
529
  if ( ! ES()->is_starter() ) {
530
  ?>
531
  <script>
lite/includes/workflows/admin/views/meta-box-trigger.php CHANGED
@@ -2,8 +2,8 @@
2
  /**
3
  * Admin trigger metabox
4
  *
5
- * @author Icegram
6
  * @since 4.4.1
 
7
  * @version 1.0
8
  * @package Email Subscribers
9
  */
@@ -15,10 +15,12 @@ foreach ( ES_Workflow_Triggers::get_all() as $trigger ) {
15
  $trigger_list[ $trigger->get_group() ][ $trigger->get_name() ] = $trigger;
16
  }
17
 
18
- if ( ! ES()->is_starter() ) {
 
19
  $starter_trigger_list = array(
 
20
  'Comment' => array(
21
- 'ig_es_comment_added' => __( 'Comment added', 'email-subscribers' ),
22
  ),
23
  'Form' => array(
24
  'ig_es_cf7_submitted' => __( 'Contact Form 7 Submitted', 'email-subscribers' ),
@@ -27,46 +29,47 @@ if ( ! ES()->is_starter() ) {
27
  'ig_es_gravity_forms_submitted' => __( 'Gravity Form Submitted', 'email-subscribers' ),
28
  ),
29
  'Order' => array(
30
- 'ig_es_wc_order_completed' => __( 'WooCommerce order completed', 'email-subscribers' ),
31
- 'ig_es_edd_complete_purchase' => __( 'EDD purchase completed', 'email-subscribers' ),
32
- 'ig_es_give_donation_made' => __( 'Give donation', 'email-subscribers' ),
33
  ),
34
  );
35
- $trigger_list = array_merge( $trigger_list, $starter_trigger_list );
 
36
  }
37
  ?>
38
  <table class="ig-es-table">
39
- <tr class="ig-es-table__row" data-name="trigger_name" data-type="select"
40
- data-required="1">
41
- <td class="ig-es-table__col ig-es-table__col--label">
42
- <label><?php esc_html_e( 'Trigger', 'email-subscribers' ); ?> <span class="required">*</span></label>
43
- </td>
44
- <td class="ig-es-table__col ig-es-table__col--field">
45
- <select name="ig_es_workflow_data[trigger_name]" class="ig-es-field js-trigger-select" required>
46
- <option value=""><?php esc_html_e( '[Select]', 'email-subscribers' ); ?></option>
47
  <?php foreach ( $trigger_list as $trigger_group => $triggers ) : ?>
48
- <optgroup label="<?php echo esc_attr( $trigger_group ); ?>">
49
  <?php
50
  foreach ( $triggers as $trigger_name => $_trigger ) :
51
  if ( $_trigger instanceof ES_Workflow_Trigger ) :
52
  ?>
53
- <option value="<?php echo esc_attr( $_trigger->get_name() ); ?>" <?php echo esc_attr( $current_trigger && $current_trigger->get_name() === $trigger_name ? 'selected="selected"' : '' ); ?>><?php echo esc_html( $_trigger->get_title() ); ?></option>
54
- <?php
55
- elseif ( is_string( $_trigger ) ) :
56
- ?>
57
- <option value="<?php echo esc_attr( $trigger_name ); ?>" disabled><?php echo $_trigger; ?></option>
58
- <?php
59
- endif;
60
- endforeach;
61
  ?>
62
- </optgroup>
63
  <?php endforeach; ?>
64
- </select>
65
  <?php if ( $current_trigger && $current_trigger->get_description() ) : ?>
66
- <div class="js-trigger-description"><?php echo $current_trigger->get_description_html(); // phpcs:ignore ?></div>
67
  <?php else : ?>
68
- <div class="js-trigger-description"></div>
69
  <?php endif; ?>
70
- </td>
71
- </tr>
72
  </table>
2
  /**
3
  * Admin trigger metabox
4
  *
 
5
  * @since 4.4.1
6
+ * @author Icegram
7
  * @version 1.0
8
  * @package Email Subscribers
9
  */
15
  $trigger_list[ $trigger->get_group() ][ $trigger->get_name() ] = $trigger;
16
  }
17
 
18
+ if ( ! ES()->is_premium() ) {
19
+
20
  $starter_trigger_list = array(
21
+
22
  'Comment' => array(
23
+ 'ig_es_comment_added' => __( 'Comment Added', 'email-subscribers' ),
24
  ),
25
  'Form' => array(
26
  'ig_es_cf7_submitted' => __( 'Contact Form 7 Submitted', 'email-subscribers' ),
29
  'ig_es_gravity_forms_submitted' => __( 'Gravity Form Submitted', 'email-subscribers' ),
30
  ),
31
  'Order' => array(
32
+ 'ig_es_wc_order_completed' => __( 'WooCommerce Order Completed', 'email-subscribers' ),
33
+ 'ig_es_edd_complete_purchase' => __( 'EDD Purchase Completed', 'email-subscribers' ),
34
+ 'ig_es_give_donation_made' => __( 'Give Donation Added', 'email-subscribers' ),
35
  ),
36
  );
37
+
38
+ $trigger_list = array_merge( $trigger_list, $starter_trigger_list );
39
  }
40
  ?>
41
  <table class="ig-es-table">
42
+ <tr class="ig-es-table__row" data-name="trigger_name" data-type="select"
43
+ data-required="1">
44
+ <td class="ig-es-table__col ig-es-table__col--label">
45
+ <label><?php esc_html_e( 'Trigger', 'email-subscribers' ); ?> <span class="required">*</span></label>
46
+ </td>
47
+ <td class="ig-es-table__col ig-es-table__col--field">
48
+ <select name="ig_es_workflow_data[trigger_name]" class="ig-es-field js-trigger-select" required>
49
+ <option value=""><?php esc_html_e( '[Select]', 'email-subscribers' ); ?></option>
50
  <?php foreach ( $trigger_list as $trigger_group => $triggers ) : ?>
51
+ <optgroup label="<?php echo esc_attr( $trigger_group ); ?>">
52
  <?php
53
  foreach ( $triggers as $trigger_name => $_trigger ) :
54
  if ( $_trigger instanceof ES_Workflow_Trigger ) :
55
  ?>
56
+ <option value="<?php echo esc_attr( $_trigger->get_name() ); ?>" <?php echo esc_attr( $current_trigger && $current_trigger->get_name() === $trigger_name ? 'selected="selected"' : '' ); ?>><?php echo esc_html( $_trigger->get_title() ); ?></option>
57
+ <?php
58
+ elseif ( is_string( $_trigger ) ) :
59
+ ?>
60
+ <option value="<?php echo esc_attr( $trigger_name ); ?>" disabled><?php echo $_trigger; ?></option>
61
+ <?php
62
+ endif;
63
+ endforeach;
64
  ?>
65
+ </optgroup>
66
  <?php endforeach; ?>
67
+ </select>
68
  <?php if ( $current_trigger && $current_trigger->get_description() ) : ?>
69
+ <div class="js-trigger-description"><?php echo $current_trigger->get_description_html(); // phpcs:ignore ?></div>
70
  <?php else : ?>
71
+ <div class="js-trigger-description"></div>
72
  <?php endif; ?>
73
+ </td>
74
+ </tr>
75
  </table>
lite/includes/workflows/class-es-workflows-table.php CHANGED
@@ -147,30 +147,29 @@ class ES_Workflows_Table extends WP_List_Table {
147
  */
148
  public function load_workflow_list() {
149
  ?>
150
- <h1 class="wp-heading-inline text-xl leading-7 font-bold text-gray-900 sm:text-3xl sm:leading-9 sm:truncate">
151
- <span class="text-2xl font-bold leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate"><?php esc_html_e( 'Workflows', 'email-subscribers' ); ?>
152
  </span>
153
- <a href="admin.php?page=es_workflows&action=new"
154
- class="ig-es-title-button px-2 pt-2 pb-1 my-1 mx-1"><?php esc_html_e( 'Add New', 'email-subscribers' ); ?></a>
155
- <?php do_action( 'ig_es_after_workflow_type_buttons' ); ?>
156
- </h1>
157
- <div id="poststuff">
158
- <div id="post-body" class="metabox-holder column-1">
159
- <div id="post-body-content">
160
- <div class="meta-box-sortables ui-sortable">
161
- <form method="post">
162
- <?php
163
- $this->prepare_items();
164
- $this->display();
165
- ?>
166
- </form>
167
- </div>
168
  </div>
169
  </div>
170
- <br class="clear">
171
  </div>
172
- <?php
173
- }
 
 
174
 
175
  /**
176
  * Retrieve lists data from the database
147
  */
148
  public function load_workflow_list() {
149
  ?>
150
+ <h1 class=" wp-heading-inline"><span class="text-2xl font-bold leading-7 text-gray-900 sm:text-3xl sm:leading-9 sm:truncate"><?php esc_html_e( 'Workflows', 'email-subscribers' ); ?>
 
151
  </span>
152
+ <a href="admin.php?page=es_workflows&action=new"
153
+ class="pt-2 ig-es-title-button px-2 py-2 mx-2"><?php esc_html_e( 'Add New', 'email-subscribers' ); ?></a>
154
+ <?php do_action( 'ig_es_after_workflow_type_buttons' ); ?>
155
+ </h1>
156
+ <div id="poststuff">
157
+ <div id="post-body" class="metabox-holder column-1">
158
+ <div id="post-body-content">
159
+ <div class="meta-box-sortables ui-sortable">
160
+ <form method="post">
161
+ <?php
162
+ $this->prepare_items();
163
+ $this->display();
164
+ ?>
165
+ </form>
 
166
  </div>
167
  </div>
 
168
  </div>
169
+ <br class="clear">
170
+ </div>
171
+ <?php
172
+ }
173
 
174
  /**
175
  * Retrieve lists data from the database
lite/includes/workflows/db/class-es-db-workflows.php CHANGED
@@ -362,39 +362,39 @@ class ES_DB_Workflows extends ES_DB {
362
 
363
  $audience_sync_settings = array(
364
  'ig_es_sync_wp_users' => array(
365
- 'workflow_title' => __( 'User registered', 'email-subscribers' ),
366
  'trigger_name' => 'ig_es_user_registered',
367
  ),
368
  'ig_es_sync_comment_users' => array(
369
- 'workflow_title' => __( 'Comment added', 'email-subscribers' ),
370
  'trigger_name' => 'ig_es_comment_added',
371
  ),
372
  'ig_es_sync_woocommerce_users' => array(
373
- 'workflow_title' => __( 'WooCommerce order completed', 'email-subscribers' ),
374
  'trigger_name' => 'ig_es_wc_order_completed',
375
  ),
376
  'ig_es_sync_edd_users' => array(
377
- 'workflow_title' => __( 'EDD purchase completed', 'email-subscribers' ),
378
  'trigger_name' => 'ig_es_edd_complete_purchase',
379
  ),
380
  'ig_es_sync_cf7_users' => array(
381
- 'workflow_title' => __( 'Contact Form 7 submitted', 'email-subscribers' ),
382
  'trigger_name' => 'ig_es_cf7_submitted',
383
  ),
384
  'ig_es_sync_ninja_forms_users' => array(
385
- 'workflow_title' => __( 'Ninja Form submitted', 'email-subscribers' ),
386
  'trigger_name' => 'ig_es_ninja_forms_submitted',
387
  ),
388
  'ig_es_sync_wpforms_users' => array(
389
- 'workflow_title' => __( 'WP Form submitted', 'email-subscribers' ),
390
  'trigger_name' => 'ig_es_wpforms_submitted',
391
  ),
392
  'ig_es_sync_give_users' => array(
393
- 'workflow_title' => __( 'Give donation made', 'email-subscribers' ),
394
  'trigger_name' => 'ig_es_give_donation_made',
395
  ),
396
  'ig_es_sync_gravity_forms_users' => array(
397
- 'workflow_title' => __( 'Gravity Form submitted', 'email-subscribers' ),
398
  'trigger_name' => 'ig_es_gravity_forms_submitted',
399
  ),
400
  );
362
 
363
  $audience_sync_settings = array(
364
  'ig_es_sync_wp_users' => array(
365
+ 'workflow_title' => __( 'User Registered', 'email-subscribers' ),
366
  'trigger_name' => 'ig_es_user_registered',
367
  ),
368
  'ig_es_sync_comment_users' => array(
369
+ 'workflow_title' => __( 'Comment Added', 'email-subscribers' ),
370
  'trigger_name' => 'ig_es_comment_added',
371
  ),
372
  'ig_es_sync_woocommerce_users' => array(
373
+ 'workflow_title' => __( 'WooCommerce Order Completed', 'email-subscribers' ),
374
  'trigger_name' => 'ig_es_wc_order_completed',
375
  ),
376
  'ig_es_sync_edd_users' => array(
377
+ 'workflow_title' => __( 'EDD Purchase Completed', 'email-subscribers' ),
378
  'trigger_name' => 'ig_es_edd_complete_purchase',
379
  ),
380
  'ig_es_sync_cf7_users' => array(
381
+ 'workflow_title' => __( 'Contact Form 7 Submitted', 'email-subscribers' ),
382
  'trigger_name' => 'ig_es_cf7_submitted',
383
  ),
384
  'ig_es_sync_ninja_forms_users' => array(
385
+ 'workflow_title' => __( 'Ninja Form Submitted', 'email-subscribers' ),
386
  'trigger_name' => 'ig_es_ninja_forms_submitted',
387
  ),
388
  'ig_es_sync_wpforms_users' => array(
389
+ 'workflow_title' => __( 'WP Form Submitted', 'email-subscribers' ),
390
  'trigger_name' => 'ig_es_wpforms_submitted',
391
  ),
392
  'ig_es_sync_give_users' => array(
393
+ 'workflow_title' => __( 'Give Donation Added', 'email-subscribers' ),
394
  'trigger_name' => 'ig_es_give_donation_made',
395
  ),
396
  'ig_es_sync_gravity_forms_users' => array(
397
+ 'workflow_title' => __( 'Gravity Form Submitted', 'email-subscribers' ),
398
  'trigger_name' => 'ig_es_gravity_forms_submitted',
399
  ),
400
  );
lite/includes/workflows/triggers/class-es-trigger-user-deleted.php CHANGED
@@ -28,7 +28,7 @@ class ES_Trigger_User_Deleted extends ES_Workflow_Trigger {
28
  * Load trigger admin props.
29
  */
30
  public function load_admin_details() {
31
- $this->title = __( 'User deleted', 'email-subscribers' );
32
  $this->description = __( 'Fires when user deleted from WordPress .', 'email-subscribers' );
33
  $this->group = __( 'User', 'email-subscribers' );
34
  }
28
  * Load trigger admin props.
29
  */
30
  public function load_admin_details() {
31
+ $this->title = __( 'User Deleted', 'email-subscribers' );
32
  $this->description = __( 'Fires when user deleted from WordPress .', 'email-subscribers' );
33
  $this->group = __( 'User', 'email-subscribers' );
34
  }
lite/includes/workflows/triggers/class-es-trigger-user-registered.php CHANGED
@@ -28,7 +28,7 @@ class ES_Trigger_User_Registered extends ES_Workflow_Trigger {
28
  * Load trigger admin props.
29
  */
30
  public function load_admin_details() {
31
- $this->title = __( 'User registered', 'email-subscribers' );
32
  $this->description = __( 'Fires when someone signup.', 'email-subscribers' );
33
  $this->group = __( 'User', 'email-subscribers' );
34
  }
28
  * Load trigger admin props.
29
  */
30
  public function load_admin_details() {
31
+ $this->title = __( 'User Registered', 'email-subscribers' );
32
  $this->description = __( 'Fires when someone signup.', 'email-subscribers' );
33
  $this->group = __( 'User', 'email-subscribers' );
34
  }
lite/includes/workflows/triggers/class-es-trigger-user-updated.php CHANGED
@@ -28,7 +28,7 @@ class ES_Trigger_User_Updated extends ES_Workflow_Trigger {
28
  * Load trigger admin props.
29
  */
30
  public function load_admin_details() {
31
- $this->title = __( 'User updated', 'email-subscribers' );
32
  $this->description = __( 'Fires when a user is updated.', 'email-subscribers' );
33
  $this->group = __( 'User', 'email-subscribers' );
34
  }
28
  * Load trigger admin props.
29
  */
30
  public function load_admin_details() {
31
+ $this->title = __( 'User Updated', 'email-subscribers' );
32
  $this->description = __( 'Fires when a user is updated.', 'email-subscribers' );
33
  $this->group = __( 'User', 'email-subscribers' );
34
  }
readme.txt CHANGED
@@ -6,7 +6,7 @@ Tags: subscription, newsletter, email marketing, post notification, email newsle
6
  Requires at least: 3.9
7
  Tested up to: 5.4
8
  Requires PHP: 5.6
9
- Stable tag: 4.4.4
10
  License: GPLv3
11
  License URI: http://www.gnu.org/licenses
12
 
@@ -272,9 +272,19 @@ Refer [here](https://www.icegram.com/documentation/es-faq/).
272
 
273
  17. Subscribe Form - Allow subscriber to choose list
274
 
 
 
 
 
275
 
276
  == Changelog ==
277
 
 
 
 
 
 
 
278
  **4.4.4 (10.04.2020)**
279
 
280
  * Update: Improve Settings UI
6
  Requires at least: 3.9
7
  Tested up to: 5.4
8
  Requires PHP: 5.6
9
+ Stable tag: 4.4.5
10
  License: GPLv3
11
  License URI: http://www.gnu.org/licenses
12
 
272
 
273
  17. Subscribe Form - Allow subscriber to choose list
274
 
275
+ 18. Import Contacts
276
+
277
+ 19. Export Contacts
278
+
279
 
280
  == Changelog ==
281
 
282
+ **4.4.5 (15.04.2020)**
283
+
284
+ * Update: Improve Import & Export contacts UI
285
+ * Fix: Importing contacts progress stays at 0%
286
+ * Fix: Test email send acknowledgement was not showing
287
+
288
  **4.4.4 (10.04.2020)**
289
 
290
  * Update: Improve Settings UI