: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
/*******************************************************************************
* Copyright (c) 2019, Code Atlantic LLC
******************************************************************************/
if (window.pum_shortcode_ui_vars === undefined) {
var I10n = pum_shortcode_ui_vars.I10n || {
error_loading_shortcode_preview: '',
shortcode_ui_button_tooltip: '',
shortcodes = pum_shortcode_ui_vars.shortcodes || {},
initialize: function (options) {
* Returns cleaned attributes object.
cleanAttrs: function (attrs) {
_.each(attrs, function (v, k) {
if (null === v || '' === v) {
// Multicheck converts keys to array.
if (typeof v === 'object') {
attrs[k] = Object.keys(v);
* Renders preview from template when available.
template: function (attrs) {
var template = 'pum-shortcode-view-' + this.type,
evaluate: /<#([\s\S]+?)#>/g,
interpolate: /\{\{\{([\s\S]+?)\}\}\}/g,
escape: /\{\{([^\}]+?)\}\}(?!\})/g,
if (this.version === 1) {
options.variable = 'attr';
if (!$('#tmpl-' + template).length) {
_template = _.template($('#tmpl-' + template).html(), options);
attrs.classes = attrs.class;
attrs = this.cleanAttrs(attrs);
* Get shortcode attr values.
getShortcodeValues: function () {
if (typeof this.shortcode === 'undefined' || typeof this.shortcode.attrs === 'undefined') {
if (typeof this.shortcode.attrs.named !== 'undefined') {
values = _.extend(values, this.shortcode.attrs.named || {});
if (typeof this.shortcode.attrs.numeric !== 'undefined') {
for (var i = 0; i < this.shortcode.attrs.numeric.length; i++) {
values[this.shortcode.attrs.numeric[i]] = true;
* Get shortcode raw content.
getShortcodeContent: function () {
if (typeof this.shortcode === 'undefined') {
return this.shortcode.content || '';
* Return the preview HTML.
* If empty, fetches data.
getContent: function () {
* Format shortcode for text tab.
formatShortcode: function (values) {
var has_content = this.shortcode_args.has_content,
content = this.getShortcodeContent();
values = values || this.getShortcodeValues();
if (has_content && typeof values._inner_content !== 'undefined') {
content = values._inner_content;
delete values._inner_content;
values = this.cleanAttrs(values);
return PUM_Admin.templates.shortcode({
has_content: has_content,
* Async. Sets this.content and calls this.render.
values = self.getShortcodeValues(),
action: 'pum_do_shortcode',
post_id: $('#post_ID').val(),
shortcode: self.formatShortcode(),
nonce: pum_shortcode_ui_vars.nonce
* If shortcode has inner content, pass that to the renderer.
if (self.shortcode_args.has_content) {
values._inner_content = self.getShortcodeContent();
* Render templates immediately when available.
* Otherwise request rendering via ajax.
if (!self.shortcode_args.ajax_rendering) {
self.content = self.template(values);
.done(function (response) {
self.content = response.data;
self.content = '<span class="pum_shortcode_ui_vars_error">' + I10n.error_loading_shortcode_preview + '</span>';
edit: function (text, update) {
var values = _.extend({}, this.getShortcodeValues());
if (this.shortcode_args.has_content) {
values._inner_content = this.getShortcodeContent();
this.renderForm(values, update);
* Renders loading placeholder.
'<div class="loading-placeholder">' +
'<div class="dashicons dashicons-admin-generic"></div>' +
'<div class="wpview-loading"><ins></ins></div>' +
* Render the shortcode edit form.
renderForm: function (values, callback) {
data = $.extend(true, {}, {
id: 'pum-shortcode-editor-' + this.type,
PUM_Admin.modals.reload('#' + data.id, PUM_Admin.templates.modal({
description: data.description,
classes: 'tabbed-content pum-shortcode-editor',
save_button: undefined === values ? I10n.insert : I10n.update,
content: PUM_Admin.forms.render({
id: 'pum-shortcode-editor-' + this.type,
sections: data.sections || {},
fields: data.fields || {}
'data-shortcode_tag': this.type
$('#' + data.id + ' form').on('submit', function (event) {
raw_values = $form.pumSerializeObject(),
values = PUM_Admin.forms.parseValues($form.pumSerializeObject().attrs, PUM_Admin.forms.flattenFields(data)),
content = self.formatShortcode(values);
if (typeof callback === 'function') {
PUM_Admin.modals.closeAll();
.on('pumFormDependencyMet pumFormDependencyUnmet', '.pum-shortcode-editor .pum-field', function (event) {
var $input = $(this).find(':input');
if (event.type.toString() === 'pumFormDependencyUnmet') {
$input.prop('disabled', true);
$input.prop('disabled', false);
window.wp = window.wp || {};
window.wp.mce = window.wp.mce || {};
window.wp.mce.pum_shortcodes = window.wp.mce.pum_shortcodes || {};
_.each(shortcodes, function (args, tag) {
* Create and store a view object for each shortcode.
wp.mce.pum_shortcodes[tag] = _.extend({}, base, {
version: args.version || 1,
* For compatibility with WP prior to v4.2:
template: function (options) {
return wp.mce.pum_shortcodes[this.type].template(options);
postID: $('#post_ID').val(),
initialize: function (options) {
this.shortcode = options.shortcode;
wp.mce.pum_shortcodes[this.type].shortcode_data = this.shortcode;
var values = this.shortcode.attrs.named;
if (this.shortcode_args.has_content) {
values._inner_content = this.shortcode.content;
return this.template(values);
* Register each view with MCE.
if (typeof wp.mce.views !== 'undefined' && typeof wp.mce.views.register === 'function') {
wp.mce.views.register(tag, wp.mce.pum_shortcodes[tag]);
/*******************************************************************************
* Copyright (c) 2019, Code Atlantic LLC
******************************************************************************/
if (typeof window.pum_newsletter_initialized !== 'undefined') {
window.pum_newsletter_initialized = true;
* Checks shortcode editor provider field and hides/shows the appropriate subtab for that provider.
function check_provider() {
var $provider = $('#pum-shortcode-editor-pum_sub_form #provider'),
provider = $provider.val() !== '' && $provider.val() !== 'none' ? $provider.val() : pum_admin_vars.default_provider,
$provider_tabs = $('.pum-modal-content .tabs .tab a[href^="#pum-shortcode-editor-pum_sub_form_provider_"]'),
$provider_contents = $('[id^="pum-shortcode-editor-pum_sub_form_provider_"]'),
$selected_tab = $provider_tabs.filter('[href="#pum-shortcode-editor-pum_sub_form_provider_' + provider + '"]'),
$selected_contents = $provider_contents.filter('[id="pum-shortcode-editor-pum_sub_form_provider_' + provider + '"]');
$provider_tabs.each(function () {
$provider_contents.find(':input').attr('disable', true);
if ($selected_tab.length) {
$selected_tab.parent().show();
$selected_contents.find(':input').attr('disable', false);
.on('pum_init', '#pum-shortcode-editor-pum_sub_form', check_provider)
.on('change', '#pum-shortcode-editor-pum_sub_form #provider', check_provider);
* Here for compatibility with the MC extension prior to v1.3.0
var $list_id = $('#pum-shortcode-editor-pum_sub_form_provider_mailchimp #list_id'),
list_id = $list_id.val(),
$list_options = $('#pum-mci-list-' + list_id+',.pum-mci-list-' + list_id),
$all_options = $('.pum-mci-list-options');
$all_options.find('input[type="checkbox"]').attr('disabled', true);
if ($list_options.length) {
$list_options.find('input[type="checkbox"]').attr('disabled', false);
* Check API key when the "Check" button is clicked.
.on('pumInit pum_init', '#pum-shortcode-editor-pum_sub_form', check_list)
.on('change', '#pum-shortcode-editor-pum_sub_form_provider_mailchimp #list_id', check_list);