This commit is contained in:
emmymayo
2025-02-05 23:15:46 +01:00
commit 7269c99357
16995 changed files with 3389680 additions and 0 deletions
@@ -0,0 +1,98 @@
<% extends 'layout.html' %>
<% block content %>
<div id="mailpoet_subscribers_export" class="wrap">
<h1 class="mailpoet-h1 mailpoet-title">
<span><%= __('Export') %></span>
<a class="mailpoet-button button button-secondary button-small" href="?page=mailpoet-subscribers#/"><%= __('Back to Subscribers') %></a>
</h1>
<% if segments is empty %>
<div class="error">
<p><%= __("Yikes! Couldn't find any subscribers") %></p>
</div>
<% endif %>
<div id="mailpoet-export" class="mailpoet-tab-content">
<!-- Template data -->
</div>
</div>
<script id="mailpoet_subscribers_export_template" type="text/x-handlebars-template">
<div id="export_result_notice" class="updated mailpoet_hidden">
<!-- Result message -->
</div>
<div class="mailpoet-settings-grid">
<% if not segments is empty %>
<div class="mailpoet-settings-label">
<label for="export_lists">
<%= __('Pick one or multiple lists') %>
</label>
</div>
<div class="mailpoet-settings-inputs">
<div class="mailpoet-form-select mailpoet-form-input">
<select id="export_lists" data-placeholder="<%= _x('Select', 'Verb') %>" multiple="multiple"></select>
</div>
</div>
<% endif %>
<div class="mailpoet-settings-label">
<label for="export_columns">
<%= __('List of fields to export') %>
<p class="description">
<a href="https://kb.mailpoet.com/article/245-what-is-global-status" target="_blank">
<%= _x('Read about the Global status.', 'Link to a documentation page in the knowledge base about what is the subscriber global status') %>
</a>
</p>
</label>
</div>
<div class="mailpoet-settings-inputs">
<div class="mailpoet-form-select mailpoet-form-input">
<select id="export_columns" data-placeholder="<%= _x('Select', 'Verb') %>" multiple="multiple"></select>
</div>
</div>
<div class="mailpoet-settings-label">
<%= __('Format') %>
</div>
<div class="mailpoet-settings-inputs">
<div class="mailpoet-settings-inputs-row">
<label class="mailpoet-form-radio">
<input type="radio" name="option_format" id="export-format-csv" value="csv" checked>
<span class="mailpoet-form-radio-control"></span>
</label>
<label for="export-format-csv"><%= __('CSV file') %></label>
</div>
<div class="mailpoet-settings-inputs-row<%if not zipExtensionLoaded %> mailpoet-disabled<%endif%>">
<label class="mailpoet-form-radio">
<input type="radio" name="option_format" id="export-format-xlsx" value="xlsx"<%if not zipExtensionLoaded %> disabled<%endif%>>
<span class="mailpoet-form-radio-control"></span>
</label>
<label for="export-format-xlsx"><%= __('Excel file') %></label>
</div>
<%if not zipExtensionLoaded %>
<div class="inline notice notice-warning">
<p><%= __('ZIP extension is required to create Excel files. Please refer to the [link]official PHP ZIP installation guide[/link] or contact your hosting providers technical support for instructions on how to install and load the ZIP extension.' | replaceLinkTags('http://php.net/manual/en/zip.installation.php')) %></p>
</div>
<%endif%>
</div>
<div class="mailpoet-settings-save">
<a href="javascript:;" class="mailpoet-button mailpoet-disabled button-primary" id="mailpoet-export-button">
<%= __('Export') %>
</a>
</div>
</div>
</script>
<script type="text/javascript">
var
segments = JSON.parse("<%=segments|escape('js')%>"),
subscriberFieldsSelect2 = JSON.parse("<%=subscriberFieldsSelect2|escape('js')%>"),
exportData = {
segments: segments.length || null
};
</script>
<%= localize({
'serverError': __('Server error:'),
'exportMessage': __('%1$s subscribers were exported. Get the exported file [link]here[/link].')
}) %>
<% endblock %>
@@ -0,0 +1,131 @@
<% set csvDescription = __('This file needs to be formatted in a CSV style (comma-separated-values). Look at some [link]examples on our support site[/link].') %>
<% extends 'layout.html' %>
<% block content %>
<div id="mailpoet_subscribers_import" class="wrap">
<h1 class="mailpoet-h1 mailpoet-title">
<span><%= __('Import') %></span>
<a class="mailpoet-button button button-secondary button-small" href="?page=mailpoet-subscribers#/"><%= __('Back to Subscribers') %></a>
</h1>
<!-- STEP subscriber data manipulation -->
<% include 'subscribers/importExport/import/step_data_manipulation.html' %>
<div id="import_container" class="mailpoet-tab-content"></div>
</div>
<script type="text/javascript">
var
maxPostSize = '<%= maxPostSize %>',
roleBasedEmails = JSON.parse("<%=role_based_emails|escape('js')%>"),
maxPostSizeBytes = '<%= maxPostSizeBytes %>',
importData = {},
mailpoetColumnsSelect2 = JSON.parse("<%=subscriberFieldsSelect2|escape('js')%>"),
mailpoetColumns = JSON.parse("<%=subscriberFields|escape('js')%>"),
mailpoetSegments = JSON.parse("<%=segments|escape('js')%>");
</script>
<%= localize({
'noMailChimpLists': __('No active lists found'),
'serverError': __('Server error:'),
'select': __('Select', 'Form input type'),
'wrongFileFormat': __('Only comma-separated (CSV) file formats are supported.'),
'maxPostSizeNotice': __('Your CSV is over %s and is too big to process. Please split the file into two or more sections.')|replace({'%s': maxPostSize}),
'dataProcessingError': __("Your data could not be processed. Please make sure it is in the correct format."),
'noValidRecords': __('No valid records were found. This file needs to be formatted in a CSV style (comma-separated). Look at some [link]examples on our support site.[/link]'),
'importNoticeSkipped': __('%1$s records had issues and were skipped.'),
'importNoticeInvalid': __('%1$s emails are not valid: %2$s'),
'importNoticeRoleBased': _x('%1$s [link]role-based addresses[/link] are not permitted: %2$s', 'Error message when importing addresses like postmaster@domain.com'),
'importNoticeDuplicate': __('%1$s emails appear more than once in your file: %2$s'),
'hideDetails': __('Hide details'),
'showDetails': __('Show more details'),
'segmentSelectionRequired': __('Please select at least one list'),
'addNewList': __('Add new list'),
'addNewField': __('Add new field'),
'addNewColumuserColumnsn': __('Add new list'),
'userColumns': __('User fields'),
'selectedValueAlreadyMatched': __('The selected value is already matched to another field.'),
'confirmCorrespondingColumn': __('Confirm that this field corresponds to the selected field.'),
'columnContainInvalidElement': __('One of the fields contains an invalid email. Please fix it before continuing.'),
'january': __('January'),
'february': __('February'),
'march': __('March'),
'april': __('April'),
'may': __('May'),
'june': __('June'),
'july': __('July'),
'august': __('August'),
'september': __('September'),
'october': __('October'),
'november': __('November'),
'december': __('December'),
'noDateFieldMatch': __("Do not match as a 'date field' if most of the rows for that field return the same error."),
'emptyFirstRowDate': __('First row date cannot be empty.'),
'verifyDateMatch': __('Verify that the date in blue matches the original date.'),
'pm': __('PM'),
'am': __('AM'),
'dateMatchError': __('Error matching date'),
'columnContainsInvalidDate': __('One of the fields contains an invalid date. Please fix before continuing.'),
'listCreateError': __('Error adding a new list:'),
'columnContainsInvalidElement': __('One of the fields contains an invalid email. Please fix before continuing.'),
'customFieldCreateError': __('Custom field could not be created'),
'subscribersCreated': __('%1$s subscribers added to %2$s.'),
'subscribersUpdated': __('%1$s existing subscribers were updated and added to %2$s.'),
'importNoAction': __('No subscribers were added or updated.'),
'importNoWelcomeEmail': __('Note: Imported subscribers will not receive any Welcome Emails'),
'readSupportArticle': __('Read the support article.'),
'validationStepHeading': _x('Are you importing an existing list or contacts from your address book?', 'Question for importing subscribers into MailPoet'),
'validationStepRadio1': _x('Existing list', 'User choice to import an existing email list'),
'validationStepRadio2': _x('Contacts from my address book', 'User choice to import his address book contacts'),
'validationStepBlock1': _x('You will need to ask your contacts to join your list instead of importing them. This is a standard practice to ensure good email deliverability.', 'Paragraph explaining the user what to do when importing his contacts.'),
'validationStepBlock2': _x('If you send with MailPoet, we will detect if you import subscribers without their explicit consent and suspend your account.', 'Paragraph warning what happens if user imports his contacts and sends with MailPoet'),
'validationStepBlockButton': _x('How to ask your contacts to join your list', 'Button to visit a support article'),
'validationStepLastSentHeading': _x('When did you last send an email to this list?', 'Question for users importing their list'),
'validationStepLastSentOption1': __('Over 2 years ago'),
'validationStepLastSentOption2': __('Between 1 and 2 years ago'),
'validationStepLastSentOption3': __('Within the last year'),
'validationStepLastSentOption4': __('Within the last 3 months'),
'validationStepLastSentNext': __('Next'),
'previousStep': __('Previous step'),
'nextStep': __('Next step'),
'import': __('Import'),
'seeVideo': __(' See video guide'),
'importAgain': __('Import again'),
'viewSubscribers': __('View subscribers'),
'methodPaste': __('Paste the data into a text box'),
'pickLists': __('Pick one or more list(s)'),
'pickListsDescription': __('Pick the list that you want to import these subscribers to.'),
'select': _x('Select', ' Verb'),
'createANewList': __('Create a new list'),
'updateExistingSubscribers': __('Update existing subscribers information, like first name, last name, etc.'),
'updateExistingSubscribersYes': __('Yes'),
'updateExistingSubscribersNo': __('No'),
'addSubscribersToSegment': __(' To add subscribers to a mailing segment, [link]create a list[/link].'),
'methodUpload': __('Upload a file'),
'methodMailChimp': __('Import from Mailchimp'),
'methodMailChimpLabel': __('Enter your Mailchimp API key'),
'methodMailChimpDescription': __('Find your Mailchimp API key in our [link]documentation[/link].'),
'methodMailChimpVerify': __('Verify'),
'methodMailChimpSelectList': __('Select list(s)'),
'methodMailChimpSelectPlaceholder': _x('Select', 'Verb'),
'matchData': __('Match data'),
'showMoreDetails': __('Show more details'),
'pasteLabel': __('Copy and paste your subscribers from Excel/Spreadsheets'),
'pasteDescription': __('This file needs to be formatted in a CSV style (comma-separated-values.) Look at some [link]examples on our support site[/link].'),
'methodSelectionHead': __('How would you like to import subscribers?'),
'cleanListText1': __('We highly recommend cleaning your lists before importing them to MailPoet.'),
'cleanListText2': __('Lists can have up to 20% of invalid addresses after a year because people change jobs and stop using their addresses. If you send with MailPoet, we will pause your sending and ask you to clean your list if we detect over 10% of invalid addresses.'),
'tryListCleaning': _x('How can I clean my list?', 'CTA button label'),
'cleanedList': _x('I cleaned my list', 'Text in button'),
'listCleaningGotIt': _x('Got it, Ill proceed to import', 'Text in a link'),
'subscribed': __('Subscribed'),
'unsubscribed': __('Unsubscribed'),
'inactive': __('Inactive'),
'dontUpdate': _x('Dont update', 'This is a value in a select box for "Set new subscribers status to"'),
'newSubscribersStatus': __('Set new subscribers status to'),
'consentSubscribed': __('Choose “Subscribed” only if you have explicit consent to send them bulk or marketing emails. [link]Why is consent important?[/link]'),
'congratulationResult': __('Congratulations, youve imported your subscribers!'),
'suppressionListReminder': __('Are you importing subscribers from another marketing service provider? You may need to separately import the list of bad or previously unsubscribed addresses to avoid contacting them. [link]See how to import a suppression list.[/link]'),
'existingSubscribersStatus': __('Update existing subscribers status to'),
'assignTagsLabel': __('Assign tags'),
'assignTagsDescription': __('Pick a tag or create a new one to assign to these subscribers.'),
'addNewTag': __('Add new tag'),
}) %>
<% endblock %>
@@ -0,0 +1,38 @@
<div id="step_data_manipulation" class="mailpoet_hidden">
<div class="inside">
<!-- New segment template -->
<script id="new_segment_template" type="text/x-handlebars-template">
<p>
<label><%= __('Name') %>:</label>
<br/>
<div class="mailpoet-form-input">
<input id="new_segment_name" type="text" name="name" />
</div>
</p>
<p class="mailpoet_validation_error" data-error="segment_name_required">
<%= __('Please specify a name.') %>
</p>
<p class="mailpoet_validation_error" data-error="segment_name_not_unique">
<%= __('Another record already exists. Please specify a different "%1$s".')|format('name') %>
</p>
<p>
<label><%= __('Description') %>:</label>
<br/>
<div class="mailpoet-form-textarea">
<textarea id="new_segment_description" cols="40" rows="3" name="description"></textarea>
</div>
</p>
<p class="mailpoet_align_right">
<input type="submit" value="<%= __('Cancel') %>" id="new_segment_cancel" class="mailpoet-button button-secondary"/>
<input type="submit" value="<%= __('Done') %>" id="new_segment_process" class="mailpoet-button button-primary"/>
</p>
</form>
</script>
<!-- New custom field logic -->
<% include 'form/custom_fields_legacy.html' %>
</div>
</div>
@@ -0,0 +1 @@
<?php
@@ -0,0 +1 @@
<?php
@@ -0,0 +1,157 @@
<% extends 'layout.html' %>
<% block content %>
<div id="subscribers_container"></div>
<script type="text/javascript">
var mailpoet_listing_per_page = <%= items_per_page %>;
var mailpoet_segments = <%= json_encode(segments) %>;
var mailpoet_custom_fields = <%= json_encode(custom_fields) %>;
var mailpoet_month_names = <%= json_encode(month_names) %>;
var mailpoet_date_formats = <%= json_encode(date_formats) %>;
</script>
<%= localize({
'pageTitle': __('Subscribers'),
'searchLabel': __('Search'),
'loadingItems': __('Loading subscribers...'),
'noItemsFound': __('No subscribers were found.'),
'bouncedSubscribersHelp': __("Email addresses that are invalid or don't exist anymore are called \"bounced addresses\". It's a good practice not to send emails to bounced addresses to keep a good reputation with spam filters. Send your emails with MailPoet and we'll automatically ensure to keep a list of bounced addresses without any setup."),
'bouncedSubscribersPremiumButtonText': __('Get premium version!'),
'permanentlyDeleted': __('%d subscribers were permanently deleted.'),
'selectBulkAction': __('Select bulk action'),
'bulkActions': __('Bulk Actions'),
'apply': __('Apply'),
'filter': __('Filter'),
'emptyTrash': __('Empty Trash'),
'selectAll': __('Select All'),
'edit': __('Edit'),
'restore': __('Restore'),
'trash': __('Trash'),
'moveToTrash': __('Move to trash'),
'deletePermanently': __('Delete Permanently'),
'showMoreDetails': __('Show more details'),
'lastEngagement': __('Last engagement'),
'never': _x('never', 'when was the last time the subscriber engaged with the website?'),
'previousPage': __('Previous page'),
'firstPage': __('First page'),
'nextPage': __('Next page'),
'lastPage': __('Last page'),
'currentPage': __('Current Page'),
'pageOutOf': __('of'),
'numberOfItemsSingular': __('1 item'),
'numberOfItemsMultiple': __('%1$d items'),
'subscribersInPlanCount': _x('%1$d / %2$d', 'count / total subscribers'),
'subscribersInPlan': _x('%s subscribers in your plan', 'number of subscribers in a sending plan'),
'subscribersInPlanTooltip': __('This is the total of subscribed, unconfirmed and inactive subscribers we count when you are sending with MailPoet Sending Service. The count excludes unsubscribed and bounced (invalid) email addresses.'),
'email': __('E-mail'),
'firstname': __('First name'),
'lastname': __('Last name'),
'status': __('Status'),
'unconfirmed': __('Unconfirmed'),
'subscribed': __('Subscribed'),
'unsubscribed': __('Unsubscribed'),
'inactive': __('Inactive'),
'bounced': __('Bounced'),
'selectList': __('Select a list'),
'unsubscribedOn': __('Unsubscribed on %1$s'),
'subscriberUpdated': __('Subscriber was updated successfully!'),
'subscriberAdded': __('Subscriber was added successfully!'),
'welcomeEmailTip': __('This subscriber will receive Welcome Emails if any are active for your lists.'),
'unsubscribedNewsletter': __('Unsubscribed at %1$d, from newsletter [link].'),
'unsubscribedManage': __('Unsubscribed at %1$d, using the “Manage my Subscription” page.'),
'unsubscribedAdmin': __('Unsubscribed at %1$d, by admin "%2$d".'),
'unsubscribedMpApi': __('Unsubscribed at %1$d, via the MP API.'),
'unsubscribedUnknown': __('Unsubscribed at %1$d, for an unknown reason.'),
'subscriber': __('Subscriber'),
'status': __('Status'),
'lists': __('Lists'),
'statisticsColumn': __('Score'),
'subscribedOn': __('Subscribed on'),
'createdOn': __('Created on'),
'lastModifiedOn': __('Last modified on'),
'oneSubscriberTrashed': __('1 subscriber was moved to the trash.'),
'multipleSubscribersTrashed': __('%1$d subscribers were moved to the trash.'),
'oneSubscriberDeleted': __('1 subscriber was permanently deleted.'),
'multipleSubscribersDeleted': __('%1$d subscribers were permanently deleted.'),
'oneSubscriberRestored': __('1 subscriber has been restored from the trash.'),
'multipleSubscribersRestored': __('%1$d subscribers have been restored from the trash.'),
'moveToList': __('Move to list...'),
'multipleSubscribersMovedToList': __('%1$d subscribers were moved to list <strong>%2$s</strong>'),
'addToList': __('Add to list...'),
'multipleSubscribersAddedToList': __('%1$d subscribers were added to list <strong>%2$s</strong>.'),
'removeFromList': __('Remove from list...'),
'multipleSubscribersRemovedFromList': __('%1$d subscribers were removed from list <strong>%2$s</strong>'),
'removeFromAllLists': __('Remove from all lists'),
'unsubscribe': _x('Unsubscribe', 'This is an action on the subscribers page'),
'unsubscribeConfirm': __('This action will unsubscribe %s subscribers from all lists. This action cannot be undone. Are you sure, you want to continue?'),
'multipleSubscribersRemovedFromAllLists': __('%1$d subscribers were removed from all lists.'),
'resendConfirmationEmail': __('Resend confirmation email'),
'oneConfirmationEmailSent': __('1 confirmation email has been sent.'),
'listsToWhichSubscriberWasSubscribed': __('Lists to which the subscriber was subscribed.'),
'WPUsersSegment': __('WordPress Users'),
'WPUserEditNotice': __('This subscriber is a registered WordPress user. [link]Edit their profile[/link] to change their email.'),
'statsListingActionTitle': __('Statistics'),
'statsHeading': _x('Stats: %s', 'This is a heading for the subscribers statistics page example: "Stats: mailpoet@example.com"'),
'statsSentEmail': __('Sent email'),
'statsOpened': __('Opened'),
'statsMachineOpened': _x('Machine-opened', 'Percentage of newsletters that were opened by a machine'),
'statsMachineOpenedTooltip': __('A machine-opened email is an email opened by a computer in the background without the users explicit request or knowledge. [link]Read more[/link]'),
'statsClicked': __('Clicked'),
'statsNotClicked': __('Not opened'),
'tip': __('Tip:'),
'customFieldsTip': __('Need to add new fields, like a telephone number or street address? You can add custom fields by editing the subscription form on the Forms page.'),
'year': __('Year'),
'month': __('Month'),
'day': __('Day'),
'new': __('Add New'),
'import': __('Import'),
'export': __('Export'),
'save': __('Save'),
'backToList': __('Back'),
'premiumFeature': __('This is a Premium feature'),
'upgradeRequired': __('Upgrade required'),
'freeLimitReached': __('Congratulations, you now have [subscribersCount] subscribers! Our free version is limited to [subscribersLimit] subscribers. You need to upgrade now to be able to continue using MailPoet.'),
'planLimitReached': __('Congratulations, you now have [subscribersCount] subscribers! Your plan is limited to [subscribersLimit] subscribers. You need to upgrade now to be able to continue using MailPoet.'),
'premiumBannerCtaFree': __('Upgrade'),
'premiumBannerCtaUpgrade': __('Upgrade Now'),
'premiumFeatureDescription': __('Your current MailPoet plan includes advanced features, but they require the MailPoet Premium plugin to be installed and activated.'),
'premiumFeatureButtonDownloadPremium': __('Download MailPoet Premium plugin'),
'premiumFeatureButtonActivatePremium': __('Activate MailPoet Premium plugin'),
'premiumFeatureDescriptionSubscribersLimitReached': __('Congratulations, you now have [subscribersCount] subscribers! Your plan is limited to [subscribersLimit] subscribers. You need to upgrade now to be able to continue using MailPoet.'),
'premiumFeatureButtonUpgradePlan': __('Upgrade your plan'),
'columnAction': _x('Action', 'Table column label for subscriber actions e.g. email open, link clicked'),
'columnActionOn': _x('Action on', 'Table column label for date when subscriber action happened'),
'columnCount': _x('Count', 'Table column label for count of subscriber actions'),
'unknownBadgeName': __('Unknown'),
'unknownBadgeTooltip': __('Not enough data.'),
'tooltipUnknown': __('Fewer than 3 emails sent'),
'excellentBadgeName': __('Excellent'),
'excellentBadgeTooltip': __('Congrats!'),
'tooltipExcellent': __('Read 50% or more of sent emails'),
'goodBadgeName': __('Good'),
'goodBadgeTooltip': __('Good stuff.'),
'tooltipGood': __('Read between 20 and 50% of sent emails'),
'averageBadgeName': __('Low'),
'averageBadgeTooltip': __('Something to improve.'),
'tooltipAverage': __('Read 20% or fewer of sent emails'),
'engagementScoreDescription': __('Average percent of emails subscribers read in the last year'),
'recalculateNow': __('Recalculate now'),
'tags': __('Tags'),
'addNewTag': __('Add new tag'),
'tagAddedToMultipleSubscribers': __('Tag <strong>%1$s</strong> was added to %2$d subscribers.'),
'tagRemovedFromMultipleSubscribers': __('Tag <strong>%1$s</strong> was removed from %2$d subscribers.'),
'addTag': __('Add tag...'),
'removeTag': __('Remove tag...'),
}) %>
<% endblock %>
<% block after_translations %>
<%= do_action('mailpoet_subscribers_translations_after') %>
<% endblock %>